UNPKG

vite-plugin-single-spa

Version:

Vite plugin to convert Vite-based projects to single-spa root or micro-frontend applications.

102 lines 3.14 kB
/// <reference types="vite/client" /> import { createLinkElement, defaultFactoryOptions, processCssPromises, setLogger, wireCssLinkElement } from "./css-helpers.js"; let observer; let vpssLinkEls; let autoLinkEls = []; const projectId = '{vpss:PROJECT_ID}'; const cssInjectedDictionary = '{vpss:CSS_MAP}'; const cssMap = JSON.parse(cssInjectedDictionary); let base = import.meta.env.BASE_URL; base += base.endsWith('/') ? '' : '/'; let bootstrappedElements; function isLinkElement(el) { return el.nodeName === 'LINK'; } function observeHead() { const observer = new MutationObserver(mutations => { mutations.forEach(m => { if (m.addedNodes.length > 0) { m.addedNodes.forEach(an => { if (isLinkElement(an) && an.rel === 'stylesheet' && an.href.includes(`vpss(${projectId})`)) { (an.getAttribute('data-vpss') ? vpssLinkEls : autoLinkEls).push(an); } }); } }); }); observer.observe(globalThis?.document?.head, { childList: true }); return observer; } function cleanHeadElement(els) { els?.forEach(el => globalThis.document.head.removeChild(el)); } function bootstrap(cssFiles) { observer?.disconnect(); observer = observeHead(); cleanHeadElement(vpssLinkEls); cleanHeadElement(autoLinkEls); vpssLinkEls = []; autoLinkEls = []; bootstrappedElements = []; if (cssFiles.length === 0) { return Promise.resolve(); } for (let css of cssFiles) { const el = createLinkElement(base + css); bootstrappedElements.push(el); } return Promise.resolve(); } async function mount(cssFiles, options) { const loadPromises = []; let fileIndex = 0; if (bootstrappedElements) { for (let el of bootstrappedElements) { globalThis.document.head.appendChild(el); const promise = wireCssLinkElement(el, cssFiles[fileIndex++], projectId, options.loadTimeout); loadPromises.push(promise); } bootstrappedElements = undefined; } else { loadPromises.push(Promise.resolve({ status: 'ok' })); } if (cssFiles.length > 0) { for (let el of vpssLinkEls) { el.disabled = false; } } for (let el of autoLinkEls) { el.disabled = false; } await processCssPromises(loadPromises, options); return Promise.resolve(); } function unmount(cssFiles) { if (cssFiles.length > 0) { for (let el of vpssLinkEls) { el.disabled = true; } } for (let el of autoLinkEls) { el.disabled = true; } return Promise.resolve(); } export function cssLifecycleFactory(entryPoint, options) { const opts = { ...defaultFactoryOptions, ...options }; setLogger(opts.logger); const cssFiles = cssMap[entryPoint] ?? []; return { bootstrap: bootstrap.bind(null, cssFiles), mount: mount.bind(null, cssFiles, opts), unmount: unmount.bind(null, cssFiles) }; } ; //# sourceMappingURL=singleMife-css.js.map