The goal is interoperable web-components which can share resources even if they come from different component libraries by different authors.
This zero-dependency, tiny (~30kb source) library is component-agnostic - any web component can use it.
Component Interop
ui:Component / ui:Link — live in sol-components ≥2.7.0 shapes/menu.shacl, loaded into the same shapes graph); the broker itself reads them as plain JSON, zero dependencies as everComponentInterop.manifest.meta)npm test # node unit suite (jsdom + vm) + JSON-LD manifest validation
npm run test:browsers # real-browser regression test in Chromium, Firefox & WebKit (needs Playwright)
npm run test:jsonld # JSON-LD only: expand + toRDF every manifest in safe mode
The browser test guards the import-map timing: ci must inject its importmap synchronously, before any module load, or the browser rejects it. Of the three engines only Firefox is strict enough to fail on a regression (Chromium and WebKit are lenient), so it’s the tripwire — but all three run to prove the loader works everywhere. It needs Playwright + its browser binaries (a dev-only dependency — the library itself stays zero-dependency):
npm i -D playwright && npx playwright install
If Playwright isn’t installed, the tests skip rather than fail.
Component Interop shares capabilities within a single document. When a component
provides a value — e.g. an authenticatedFetch — it is dispatched on a same-document
CustomEvent and passed as a live JavaScript reference; nothing is serialized or sent
to another frame (there is no postMessage / iframe channel here). Two consequences
follow, and they are by design:
data-manifest URL decides which module
URLs the page executes, so treat a manifest like any other script you include. Keys
from a manifest that would poison a prototype (__proto__, constructor, prototype)
are skipped during merge.Nothing crosses an iframe boundary, so a capability is never leaked to a frame; the boundary that matters is which components the page author chooses to load.
Portions created using Claude Opus 4.8.
MIT © Jeff Zucker, 2026