A window key holding a closure pins the whole app after unmount -- the component, its shadow root, and everything they reference, measured at roughly 10 MB per mount. The three test handles here each close over live state (the search index, the map, the selection), so each one is a full retention path. SIX GLOBALS, NOT THREE. The check names the three it can see, but each named handle has a paired per-instance registry -- __UPG_SEARCH__/__UPG_SEARCHES__, __UPG_MAP__/__UPG_MAPS__, __UPG_SELECT__/__UPG_SELECTS__. Releasing only the named half leaves the registry holding the same closure, so the leak survives in the copy nobody was looking at. The two halves need opposite handling, which is why this is not one loop. A named handle is a single slot that the last mount overwrites, so deleting it blindly would strip a LIVE sibling's handle -- it is cleared only if it is still the object this instance published, captured at assignment so it cannot drift from what went out. A registry entry is keyed by instance, so my key is always mine to delete, and deleting the whole registry would strip the siblings. Verified against the two-instance case rather than the single-mount one: A mounts, B mounts and takes the named slot, A unmounts -- B keeps its handle and its registry entry, and after both unmount nothing is retained. One delete per line, deliberately: the check reads these statements, so a loop over a key list would release correctly and still be reported as a leak. The whole block is wrapped because a frozen or cross-origin window must never break teardown. |
||
|---|---|---|
| .. | ||
| 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: 24 plugin bundles and 36 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.