Three defects on country-map/country-map, which is production -- DX Life's country pages. Found by auditing the element rather than from a report. 1. ANY profile-config change refetched all 2,106 records. The watch getter returned a NEW ARRAY literal, and Vue compares a watch value with Object.is, so a fresh array always reads as changed; both computeds read the injected cfg, so the effect re-ran on every config change and the callback then fired unconditionally. MEASURED with real Vue: flipping isDark refetched the whole endpoint and redrew the map, and so did a host adding pinHint. A joined STRING compares by value, so only a real language or country change refetches -- which must still refetch, because the API localises the names. This was latent waste until the composite re-forward made config writes routine. It is now on every upstream locale switch, so the two changes are complementary rather than independent. 2. A SLOW EARLIER RESPONSE OVERWROTE A NEWER ONE. loadPoints is async and had no sequencing at all -- 0 abort or generation tokens in the file -- so two runs could be in flight and the one that STARTED first could FINISH last. Both assigned points, so the map showed the previous country's pins with no error and nothing for the reader to notice. Every run now takes a ticket and a stale ticket writes nothing: not the points, not loadFailed, not the spinner the current run is still using. fetch is left to complete rather than aborted, because the response is cached for the next switch back. 3. `loading` WAS WRITE-ONLY: assigned in three places and read in none, zero template references. A reader on a country page waited on an empty map -- no outline, no pins, no message -- which is indistinguishable from a country that genuinely has no people groups, and this element fetches the whole list before it can draw one pin. "Loading results..." was already in the catalogue in all eleven locales, so saying so cost no new string and no parity debt. check:country-map-refetch guards all three. It drives the REAL reactive chain with real Vue and takes the watch key expression OUT OF THE SHIPPED SFC, because bug 1 is entirely a question of what Vue considers changed and is invisible to any test that fakes reactivity or re-types the watch. Mutation-tested, 5 mutations, all caught by name. The first version of the gate MISSED one: a bare /if \(!current\(\)\) return/ grep matched the guard in the catch block, so removing only the guard before the points write still passed. The assertions are positional now -- the guard must sit immediately before the assignment it protects -- and the catch guard is asserted separately. That hole existed because the behavioural half of the test reproduced the guard's shape inside the gate instead of reading the component, which is the self-consistent oracle this repo's other geometry gate explicitly warns against. Registered in scripts and gates:pre, verified by re-parsing: one key, 107 checks. Bundle rebuilt (BUNDLE=country-map), then tree, then fix:sri. |
||
|---|---|---|
| .. | ||
| dx-maps | ||
| README.md | ||
public/ — the built output
This folder is GENERATED by bun run build; do not edit it by hand. It holds exactly one thing:
dx-maps/— the output folder: 25 plugin bundles and 37 pages, self-contained. Copy this one folder to any web host (or open it from disk) and it works.dx-maps/index.html— the front page: the Plugin Studio, every plugin in one place.dx-maps/<plugin>/<plugin>.js— a plugin's bundle (a custom element; load it with a<script>tag).dx-maps/<plugin>/<page>/index.html— a ready-made page for one plugin view (embed it in an<iframe>).dx-maps/manifest.json— every plugin, page and embed snippet, machine-readable.dx-maps/assets/— the data, fonts and images the plugins fetch at runtime.
The folder's name comes from name in vite.doxa-maps-build-config.json. Sources live in
plugin-designs/, library/ and data/; rm -rf public/ && bun run build recreates all of this.