UNPKG

vite-plugin-dynamic-importmap

Version:

A Vite plugin that enables dynamic importmap loading by ensuring the importmap is fetched at runtime and gets applied before any other JavaScript runs

10 lines (9 loc) 2.36 kB
import{parseFromString as O}from"dom-parser";import x from"esbuild";function a(){let r=localStorage.getItem("importmap");if(r)return console.warn("using importmap from local storage"),JSON.parse(r)}async function s(r){return await(await fetch(r)).json()}async function c(r){let t=document.createElement("script");t.type="importmap",t.innerHTML=JSON.stringify(r),document.head.append(t)}function d(r){for(let t of r){let e=document.createElement("script");e.innerHTML=t.innerHTML;for(let[o,i]of Object.entries(t.attributes))e.setAttribute(o,i);document[t.location||"head"].append(e)}}var u=/<head[^>]*>[\s\S]*?<\/head>/i,f=/<body[^>]*>[\s\S]*?<\/body>/i,l=/<script[^>]*>[\s\S]*?<\/script>/gi;function g(r){let t=r.match(l)??[],e=r.replace(l,"");return{scripts:t,outerHtml:e}}function y(r){let t=O(r).getElementsByTagName("script")[0];return{innerHTML:t.innerHTML,attributes:Object.fromEntries(t.attributes.map(e=>[e.name,e.value]))}}function v(r){let t=r.toString();if(!/^(async\s+)?((function\b)|(\(.*\)\s*=>))/.test(t))throw new Error(`Invalid "options.importmap": must refer to a function (function expression or arrow function). It looks like you passed a method that was defined using the shorthand syntax, which is currently not supported. See more details: https://github.com/adamsondavid/vite-plugin-dynamic-importmap/issues/5`);return t}async function S(r,t){let e=r.match(u)?.[0]??"",o=r.match(f)?.[0]??"",i=g(e),m=g(o),h=[...i.scripts.map(p=>y(p)),...m.scripts.map(p=>({...y(p),location:"body"}))],n;typeof t.importmap=="string"?n=`await (${s.toString()})("${t.importmap}")`:typeof t.importmap=="function"?n=`await (${v(t.importmap)})()`:n=JSON.stringify(t.importmap);let I=` (async () => { await (${c.toString()})((${t.respectOverride} && (${a.toString()})()) || ${n}); (${d.toString()})(${JSON.stringify(h)}); })(); document.currentScript.remove();`,b=await x.transform(I,{minify:!0});return r.replace(u,i.outerHtml).replace(f,m.outerHtml.replace("</body>",`<script>${b.code}</script> </body>`))}function w(r){let t={...r,respectOverride:r.respectOverride??!0};return{name:"dynamic-importmap",transformIndexHtml:{order:"post",async handler(e){try{return await S(e,t)}catch(o){throw o instanceof Error&&(o.message=`[vite-plugin-dynamic-importmap] ${o.message}`),o}}}}}export{w as default,w as dynamicImportmap};