const loaderMap = window['inline-module-loaders']; const currentScript = document.currentScript || document.querySelector('script'); // https://github.com/WICG/import-maps const map = {imports: {}, scopes: {}}; const installed = new Set(); function toBase64(str) { return btoa(unescape(encodeURIComponent(str))); } function loadContent(url) { const request = new XMLHttpRequest(); request.open('GET', url, false); // `false` makes the request synchronous request.send(null); if(request.status === 200) { return request.responseText; } throw new Error(request.statusText); } // replace code function replaceImport(code, map) { const importExp = /^(\s*import\s+[\s\S]*?from\s*['"`])([\s\S]*?)(['"`])/img; return code.replace(importExp, (a, b, c, d) => { const url = map[c]; if(url) { return `${b}${url}${d}`; } return `${b}${c}${d}`; }); } function getBlobURL(module, replaceImportURL = false, map = {}) { let jsCode = module.textContent; if(module.hasAttribute('src')) { const url = module.getAttribute('src'); jsCode = loadContent(url); module.textContent = jsCode; } if(replaceImportURL) { jsCode = replaceImport(jsCode, map); } let loaders = module.getAttribute('loader'); if(loaders) { loaders = loaders.split(/\s*>\s*/); jsCode = loaders.reduce((code, loader) => { const {transform, imports} = loaderMap[loader]; const {code: resolved, map: sourceMap} = transform(code, {sourceMap: true, filename: module.getAttribute('name') || module.id || 'anonymous'}); if(sourceMap) code = `${resolved}\n\n//# sourceMappingURL=data:application/json;base64,${toBase64(JSON.stringify(sourceMap))}`; else code = resolved; Object.assign(map.imports, imports); return code; }, jsCode); } return createBlob(jsCode, 'text/javascript'); } function createBlob(code, type = 'text/plain') { const blob = new Blob([code], {type}); const blobURL = URL.createObjectURL(blob); return blobURL; } function setup() { const modules = document.querySelectorAll('script[type="inline-module"]'); const importMap = {}; const loadModules = []; const importMapEl = document.querySelector('script[type="importmap"]'); if(importMapEl) { console.warn('Cannot update importmap after