vite-plugin-shopify-theme-islands
Version:
Vite plugin for island architecture in Shopify themes
77 lines (75 loc) • 1.99 kB
JavaScript
// src/runtime-surface.ts
var SILENT_LOGGER = {
note() {},
flush() {}
};
function addListener(target, name, handler) {
const listener = (event) => handler(event.detail);
target.addEventListener(name, listener);
return () => target.removeEventListener(name, listener);
}
function dispatch(target, name, detail) {
target.dispatchEvent(new CustomEvent(name, { detail }));
}
function createRuntimeSurface(deps) {
return {
dispatchLoad(detail) {
dispatch(deps.target, "islands:load", detail);
},
dispatchError(detail) {
dispatch(deps.target, "islands:error", detail);
},
onLoad(handler) {
return addListener(deps.target, "islands:load", handler);
},
onError(handler) {
return addListener(deps.target, "islands:error", handler);
},
createLogger(tagName, debug) {
if (!debug)
return SILENT_LOGGER;
const msgs = [];
return {
note(msg) {
msgs.push(msg);
},
flush(summary) {
if (msgs.length === 0) {
deps.console.log("[islands]", `<${tagName}> ${summary}`);
} else {
deps.console.groupCollapsed(`[islands] <${tagName}> ${summary}`);
for (const msg of msgs)
deps.console.log(msg);
deps.console.groupEnd();
}
msgs.length = 0;
}
};
},
beginReadyLog(islandCount, debug) {
if (!debug)
return () => {};
deps.console.groupCollapsed(`[islands] ready — ${islandCount} island(s)`);
return () => deps.console.groupEnd();
}
};
}
var runtimeSurface;
function getRuntimeSurface() {
runtimeSurface ??= createRuntimeSurface({
target: document,
console
});
return runtimeSurface;
}
// src/events.ts
function onIslandLoad(handler) {
return getRuntimeSurface().onLoad(handler);
}
function onIslandError(handler) {
return getRuntimeSurface().onError(handler);
}
export {
onIslandLoad,
onIslandError
};