UNPKG

@fchc8/vite-plugin-multi-page

Version:

A powerful Vite plugin for building multi-page applications with smart file routing and multi-strategy builds

120 lines (118 loc) 18.2 kB
import{mergeConfig as ae}from"vite";import*as C from"path";import*as j from"fs";import{glob as q}from"glob";import*as P from"path";function _(t,e,s,i){let n=[],o=new Map,c=e.replace(/\/\*.*$/,"");(!c||c===e)&&(c=P.dirname(e.split("*")[0]));let l=[];for(let r of t){if(s.includes(r))continue;let a=r.replace(/\\/g,"/"),g=c.replace(/\\/g,"/"),f=P.posix.relative(g,a).split("/");if(f.length===1){let u=f[0],m=P.posix.basename(u,P.posix.extname(u));l.push({name:m,file:r,priority:1})}else if(f.length>=2){let u=P.posix.basename(a,P.posix.extname(a)),m=f[0];u==="main"&&l.push({name:m,file:r,priority:2})}}for(let r of l){let a=o.get(r.name);a?r.priority>a.priority&&o.set(r.name,{file:r.file,priority:r.priority}):o.set(r.name,{file:r.file,priority:r.priority})}for(let[r,{file:a}]of o.entries())n.push({name:r,file:a});return n}function W(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function R(t){return(...e)=>{t&&console.log("[vite-plugin-multi-page]",...e)}}function $(t,e,s){if(!t)return null;if(typeof t=="function")return t(e);for(let[i,n]of Object.entries(t)){if(i===e.pageName)return s(`\u7CBE\u786E\u5339\u914D\u9875\u9762 ${e.pageName}:`,n),n;if(n.match&&(Array.isArray(n.match)?n.match:[n.match]).some(l=>D(l,e.pageName)||D(l,e.relativePath)||D(l,e.filePath)))return s(`\u6A21\u5F0F\u5339\u914D\u9875\u9762 ${e.pageName} (\u6A21\u5F0F: ${n.match}):`,n),{...n,match:void 0};if(D(i,e.pageName))return s(`Glob\u5339\u914D\u9875\u9762 ${e.pageName} (\u6A21\u5F0F: ${i}):`,n),n}return null}function D(t,e){let s=t.replace(/\*\*/g,"__DOUBLE_STAR__").replace(/\*/g,"[^/]*").replace(/__DOUBLE_STAR__/g,".*");return new RegExp(`^${s}$`).test(e)}function Q(t,e,s){try{let i=q.sync(e.entry,{cwd:process.cwd()}),n=_(i,e.entry,e.exclude,s);if(n.length===0){s("\u8B66\u544A: \u672A\u627E\u5230\u5339\u914D\u7684\u5165\u53E3\u6587\u4EF6");return}let o=e.devStrategy||t.config.__cliStrategy||t.config.strategy;o&&(s(`\u5F00\u53D1\u670D\u52A1\u5668\u4F7F\u7528\u6307\u5B9A\u7684\u7B56\u7565: ${o}`),n=n.filter(c=>{let l={pageName:c.name,filePath:c.file,relativePath:C.relative(process.cwd(),c.file),strategy:void 0,isMatched:!1},r=$(e.pageConfigs,l,s),a=(r==null?void 0:r.strategy)||"default";return o==="default"?a==="default":a===o}),s(`\u7B56\u7565 "${o}" \u4E0B\u53EF\u7528\u7684\u9875\u9762: ${n.map(c=>c.name).join(", ")||"\u65E0"}`)),s("\u5F00\u53D1\u670D\u52A1\u5668\u5E94\u7528\u7684\u5165\u53E3\u6587\u4EF6:",n),t.middlewares.use(async(c,l,r)=>{try{let g=(c.url||"").split("?")[0];if(g==="/"){let u=X(n,e,s);l.statusCode=200,l.setHeader("Content-Type","text/html"),l.end(u);return}if(g.match(/\.(js|css|png|jpg|jpeg|gif|svg|ico|woff|woff2|ttf|eot|map)$/)&&!g.endsWith(".html")||g.startsWith("/@")||g.includes("__vite")||g.startsWith("/node_modules"))return r();let p="";if(g.endsWith(".html"))p=C.basename(g,".html");else if(g.startsWith("/")){let u=g.substring(1);if(n.find(m=>m.name===u))p=u;else{let m=u.split("/");if(m.length>1){let E=m[0];n.find(d=>d.name===E)&&(p=E,s(`History \u8DEF\u7531\u5339\u914D: ${g} -> ${E}`))}}}if(!p)return r();let f=n.find(u=>u.name===p);return f?K(l,f,e,s):r()}catch(a){s(`\u5F00\u53D1\u670D\u52A1\u5668\u5904\u7406\u8BF7\u6C42\u5931\u8D25: ${a}`),r(a)}}),s("\u5F00\u53D1\u670D\u52A1\u5668\u914D\u7F6E\u5B8C\u6210")}catch(i){throw s(`\u914D\u7F6E\u5F00\u53D1\u670D\u52A1\u5668\u5931\u8D25: ${i}`),i}}function K(t,e,s,i){var g;let n={pageName:e.name,filePath:e.file,relativePath:C.relative(process.cwd(),e.file),strategy:void 0,isMatched:!1},o=$(s.pageConfigs,n,i);if(o!=null&&o.strategy)n.strategy=o.strategy;else if((g=s.appliedStrategies)!=null&&g.has(e.name)){let p=s.appliedStrategies.get(e.name);p&&(n.strategy=p)}let c="",l=C.resolve(process.cwd(),`${e.name}.html`);if(j.existsSync(l)?c=l:o!=null&&o.template?c=C.resolve(process.cwd(),o.template):c=C.resolve(process.cwd(),s.template),!j.existsSync(c)){t.statusCode=404,t.end("Template not found");return}let r=j.readFileSync(c,"utf-8");if(r.includes(s.placeholder)){let p=r;if(r=r.split(s.placeholder).join(`/${e.file}`),r===p){let f=W(s.placeholder),u=new RegExp(f,"g");r=p.replace(u,`/${e.file}`),r===p&&(r=p.replace(/\{\{ENTRY_FILE\}\}/g,`/${e.file}`))}}if(o!=null&&o.define){let p=Object.entries(o.define).map(([f,u])=>{let m=typeof u=="string"?`"${u}"`:JSON.stringify(u);return`window.${f} = ${m};`}).join(` `);p&&(r=r.replace(/<\/head>/i,`<script type="text/javascript"> ${p} </script> </head>`))}t.statusCode=200,t.setHeader("Content-Type","text/html"),t.end(r)}var Y=Q;function X(t,e,s){try{let i=t.map(n=>{var a;let o={pageName:n.name,filePath:n.file,relativePath:C.relative(process.cwd(),n.file),strategy:void 0,isMatched:!1},c=$(e.pageConfigs,o,s),l="default";if(c!=null&&c.strategy)l=c.strategy;else if((a=e.appliedStrategies)!=null&&a.has(n.name)){let g=e.appliedStrategies.get(n.name);g&&(l=g)}let r=l!=="default"?`<span class="badge">${l}</span>`:"";return` <div class="page-item"> <a href="${n.name}.html" class="page-link"> ${n.name}${r} </a> <div class="page-path">${n.file}</div> </div>`}).join("");return` <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>\u591A\u9875\u9762\u5E94\u7528\u7D22\u5F15</title> <style> body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; line-height: 1.6; color: #333; max-width: 1200px; margin: 0 auto; padding: 20px; background-color: #f5f5f7; } h1 { font-size: 24px; margin-bottom: 20px; color: #111; } .page-list { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 16px; } .page-item { background-color: white; border-radius: 8px; padding: 16px; box-shadow: 0 1px 3px rgba(0,0,0,0.1); transition: transform 0.2s, box-shadow 0.2s; } .page-item:hover { transform: translateY(-2px); box-shadow: 0 4px 8px rgba(0,0,0,0.1); } .page-link { display: flex; align-items: center; justify-content: space-between; font-size: 18px; font-weight: 500; color: #0066cc; text-decoration: none; margin-bottom: 8px; } .page-path { font-size: 14px; color: #666; word-break: break-all; } .badge { display: inline-block; font-size: 12px; padding: 2px 8px; border-radius: 12px; background-color: #e6f2ff; color: #0066cc; margin-left: 8px; } .stats { margin-bottom: 20px; font-size: 14px; color: #666; } </style> </head> <body> <h1>\u591A\u9875\u9762\u5E94\u7528\u7D22\u5F15</h1> <div class="stats"> \u627E\u5230 ${t.length} \u4E2A\u9875\u9762 </div> <div class="page-list"> ${i} </div> </body> </html> `}catch(i){return s(`\u751F\u6210\u7D22\u5F15\u9875\u5931\u8D25: ${i}`),` <!DOCTYPE html> <html> <head> <title>\u9519\u8BEF</title> </head> <body> <h1>\u751F\u6210\u7D22\u5F15\u9875\u65F6\u53D1\u751F\u9519\u8BEF</h1> <p>${i}</p> </body> </html> `}}import{mergeConfig as Z}from"vite";import{glob as H}from"glob";import*as h from"path";import*as b from"fs";function B(t){var g;let{entry:e="src/pages/*/main.{ts,js}",exclude:s=[],template:i="index.html",placeholder:n="<!--VITE_MULTI_PAGE_ENTRY-->",strategies:o={},pageConfigs:c={},forceBuildStrategy:l}=t,r=R(!0),a={};try{let p=H.sync(e,{cwd:process.cwd()}),f=_(p,e,s,r);if(f.length===0)return r("\u8B66\u544A: \u672A\u627E\u5230\u5339\u914D\u7684\u5165\u53E3\u6587\u4EF6"),{};let u=new Map,m=new Map;for(let d of f){let y={pageName:d.name,filePath:d.file,relativePath:h.relative(process.cwd(),d.file)},x=$(c,y,r),v=(x==null?void 0:x.strategy)||"default";u.set(d.name,v),m.has(v)||m.set(v,[]),(g=m.get(v))==null||g.push(d.name)}if(r(`\u{1F4C4} \u53D1\u73B0 ${f.length} \u4E2A\u9875\u9762: ${f.map(d=>d.name).join(", ")}`),l){let d=m.get(l)||[];if(d.length===0)return r(`\u8B66\u544A: \u7B56\u7565 "${l}" \u4E0B\u6CA1\u6709\u9875\u9762`),{};r(`\u5F3A\u5236\u6784\u5EFA\u7B56\u7565: ${l}, \u9875\u9762: ${d.join(", ")}`);let y=k(l,d,f,o[l],c,i,n,r);return a[l]=y,a}for(let[d,y]of m){if(y.length===0)continue;let x=o[d]||{},v=k(d,y,f,x,c,i,n,r);a[d]=v}if(Object.keys(a).length===0){r("\u8B66\u544A: \u672A\u751F\u6210\u4EFB\u4F55\u6784\u5EFA\u914D\u7F6E\uFF0C\u521B\u5EFA\u9ED8\u8BA4\u914D\u7F6E");let d=f.map(x=>x.name),y=k("default",d,f,{},c,i,n,r);a.default=y}let E=Object.keys(a);return r(`\u{1F4E6} \u6784\u5EFA\u7B56\u7565: ${E.join(", ")}`),a}catch(p){throw r("\u751F\u6210\u6784\u5EFA\u914D\u7F6E\u5931\u8D25:",p),p}}function k(t,e,s,i,n,o,c,l){let r={},a=[],g={};for(let u of e){let m=s.find(A=>A.name===u);if(!m)continue;let E={pageName:u,filePath:m.file,relativePath:h.relative(process.cwd(),m.file),strategy:t},d=$(n,E,l);d!=null&&d.define&&Object.assign(g,d.define);let y=o,x=`${u}.html`;b.existsSync(h.resolve(process.cwd(),x))?y=x:d!=null&&d.template&&(y=d.template);let v=h.resolve(process.cwd(),y);if(!b.existsSync(v)){l(`\u8B66\u544A: \u6A21\u677F\u6587\u4EF6\u4E0D\u5B58\u5728: ${y}`);continue}let M=b.readFileSync(v,"utf-8");if(M.includes(c)){let A=`./${m.file}`;M=M.replace(new RegExp(c.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),"g"),A)}let L=h.resolve(process.cwd(),`.temp.mp.${u}.html`);b.writeFileSync(L,M),a.push(L),r[u]=L}let p={base:"./",build:{outDir:`dist/${t}`,rollupOptions:{input:r,output:{entryFileNames:"assets/[name]-[hash].js",chunkFileNames:"assets/[name]-[hash].js",assetFileNames:"assets/[name]-[hash][extname]"}},emptyOutDir:!1},define:{}},f=p;return i&&(f=Z(p,i)),Object.keys(g).length>0&&(f.define={...f.define,...g}),f.build||(f.build={}),f.build.rollupOptions||(f.build.rollupOptions={}),f.build.rollupOptions.input=r,f.build.emptyOutDir=!1,l(`\u7B56\u7565 "${t}" - ${e.length} \u4E2A\u9875\u9762`),f}function z(t=[]){let e=t.findIndex(i=>i==="--outDir");if(e!==-1&&e+1<t.length){let i=t[e+1];return h.resolve(process.cwd(),i)}let s=t.find(i=>i.startsWith("--outDir="));if(s){let i=s.split("=")[1];return h.resolve(process.cwd(),i)}return h.resolve(process.cwd(),"dist")}function ee(t=[]){let e=z(t),s=R(!0);try{b.existsSync(e)&&(b.rmSync(e,{recursive:!0,force:!0}),s(`\u{1F9F9} \u6E05\u7406\u8F93\u51FA\u76EE\u5F55: ${h.relative(process.cwd(),e)}`))}catch(i){s(`\u26A0\uFE0F \u6E05\u7406\u8F93\u51FA\u76EE\u5F55\u5931\u8D25: ${e}`,i)}}function te(t){let{entry:e="src/pages/*/main.{ts,js}",exclude:s=[],pageConfigs:i={}}=t,n=R(!1),o=new Set,c=H.sync(e,{cwd:process.cwd()}),l=_(c,e,s,n);if(l.length===0)throw new Error(`\u672A\u627E\u5230\u5339\u914D\u7684\u5165\u53E3\u6587\u4EF6: ${e}`);try{for(let r of l){let a={pageName:r.name,filePath:r.file,relativePath:h.relative(process.cwd(),r.file)},g=$(i,a,n),p=(g==null?void 0:g.strategy)||"default";o.add(p)}return Array.from(o).sort()}catch(r){return n("\u83B7\u53D6\u53EF\u7528\u7B56\u7565\u5931\u8D25:",r),["default"]}}import*as T from"fs";import*as O from"path";import{pathToFileURL as ne}from"url";import{Module as I}from"module";var J=["multipage.config.js","multipage.config.mjs","multipage.config.ts"];function V(){for(let t of J){let e=O.resolve(process.cwd(),t);if(T.existsSync(e))return!0}return!1}async function G(t){let e=await ie();if(e){let s=e(t);return s||{}}return null}async function re(t){if(t.endsWith(".ts"))try{let e=await T.promises.readFile(t,"utf-8"),s;try{s=await import("esbuild")}catch{throw console.error(` \u274C \u65E0\u6CD5\u52A0\u8F7D TypeScript \u914D\u7F6E\u6587\u4EF6\uFF0C\u56E0\u4E3A\u627E\u4E0D\u5230 esbuild \u4F9D\u8D56\u3002`),console.error(` \u{1F4A1} \u8BF7\u9009\u62E9\u4EE5\u4E0B\u89E3\u51B3\u65B9\u6848\u4E4B\u4E00\uFF1A`),console.error(' 1. \u5B89\u88C5 esbuild (peerDependency)\uFF1Anpm install esbuild@">=0.19.3" --save-dev'),console.error(" 2. \u6216\u8005\u5982\u679C\u4F7F\u7528 Vite \u9879\u76EE\uFF0Cesbuild \u901A\u5E38\u5DF2\u5B89\u88C5\uFF0C\u8BF7\u68C0\u67E5\u7248\u672C\u662F\u5426 >=0.19.3"),console.error(" 3. \u4F7F\u7528 JavaScript \u914D\u7F6E\u6587\u4EF6\uFF1A\u5C06 multipage.config.ts \u91CD\u547D\u540D\u4E3A multipage.config.js"),console.error(` 4. \u4F7F\u7528 ESM \u914D\u7F6E\u6587\u4EF6\uFF1A\u5C06 multipage.config.ts \u91CD\u547D\u540D\u4E3A multipage.config.mjs `),new Error(`\u9700\u8981 esbuild \u4F9D\u8D56\u6765\u5904\u7406 TypeScript \u914D\u7F6E\u6587\u4EF6: ${O.basename(t)}`)}let i=await s.transform(e,{loader:"ts",format:"cjs",target:"node16",sourcemap:!1}),n=new I(t);return n.filename=t,n.paths=I._nodeModulePaths(O.dirname(t)),n._compile(i.code,t),n.exports}catch(e){if(e instanceof Error&&e.message.includes("\u9700\u8981 esbuild \u4F9D\u8D56"))throw e;console.warn("esbuild \u8F6C\u8BD1\u5931\u8D25\uFF0C\u5C1D\u8BD5\u7B80\u5355\u8F6C\u6362:",e);let i=(await T.promises.readFile(t,"utf-8")).replace(/export\s+default\s+/,"module.exports = ").replace(/import\s+.*?from\s+['"][^'"]*['"];?\s*/g,"").replace(/:\s*[^=,})\]]+/g,""),n=new I(t);return n.filename=t,n.paths=I._nodeModulePaths(O.dirname(t)),n._compile(i,t),n.exports}if(t.endsWith(".js")||t.endsWith(".mjs"))return import(`${ne(t).href}?t=${Date.now()}`);throw new Error(`\u4E0D\u652F\u6301\u7684\u914D\u7F6E\u6587\u4EF6\u7C7B\u578B: ${t}`)}async function ie(){let t=process.cwd();for(let e of J){let s=O.resolve(t,e);if(T.existsSync(s))try{let i=await re(s),n=i.default||i;if(typeof n=="function")return n;console.warn(`\u914D\u7F6E\u6587\u4EF6 ${e} \u5FC5\u987B\u9ED8\u8BA4\u5BFC\u51FA\u4E00\u4E2A\u51FD\u6570`)}catch(i){e.endsWith(".ts")?(console.error(`\u52A0\u8F7DTypeScript\u914D\u7F6E\u6587\u4EF6 ${e} \u5931\u8D25:`,i),console.log("\u63D0\u793A\uFF1A\u786E\u4FDD\u4F60\u7684\u9879\u76EE\u652F\u6301TypeScript\uFF0C\u6216\u8005\u4F7F\u7528 .js/.mjs \u914D\u7F6E\u6587\u4EF6")):console.error(`\u52A0\u8F7D\u914D\u7F6E\u6587\u4EF6 ${e} \u5931\u8D25:`,i)}}return null}var F={entry:"src/pages/**/*.{ts,js}",exclude:[],template:"index.html",placeholder:"{{ENTRY_FILE}}",debug:!1,strategies:{default:{}},pageConfigs:{}};function N(t){if(!t)return{...F};let e=t.strategies??t.buildStrategies??F.strategies;return{entry:t.entry??F.entry,exclude:t.exclude??F.exclude,template:t.template??F.template,placeholder:t.placeholder??F.placeholder,debug:t.debug??F.debug,strategies:e,pageConfigs:t.pageConfigs??F.pageConfigs,__forceBuildStrategy:t.__forceBuildStrategy}}import*as U from"fs";function se(t){return typeof t=="function"?t:()=>t}function oe(t){return t}function le(t){let e,s=[],i=()=>{};return{name:"vite-multi-page",async configResolved(n){let o=null;V()&&(o=await G({mode:n.command==="serve"?"development":"production",command:n.command,isCLI:!1}));let c=N(o);e=t?t(c,{mode:n.command==="serve"?"development":"production",command:n.command,isCLI:!1}):c,i=e.debug??!1?console.log.bind(console,"[vite-multi-page]"):()=>{},i("Vite\u914D\u7F6E\u5DF2\u89E3\u6790, \u4F7F\u7528\u914D\u7F6E:",{strategies:Object.keys(e.strategies||{}),entry:e.entry})},async config(n,{command:o}){var c;if(o==="serve"){let l=process.argv,r=l.find(a=>a.startsWith("--strategy="));if(r){let a=r.split("=")[1];a&&(process.env.VITE_MULTI_PAGE_STRATEGY=a)}else{let a=l.findIndex(g=>g==="--strategy");if(a!==-1&&a+1<l.length){let g=l[a+1];process.env.VITE_MULTI_PAGE_STRATEGY=g}}process.env.VITE_MULTI_PAGE_STRATEGY||(process.env.VITE_MULTI_PAGE_STRATEGY="default")}if(o==="build"){if(!e){let g=null;V()&&(g=await G({mode:"production",command:"build",isCLI:!1}));let p=N(g);e=t?t(p,{mode:"production",command:"build",isCLI:!1}):p,i=e.debug??!1?console.log.bind(console,"[vite-multi-page]"):()=>{}}i("\u914D\u7F6E\u6784\u5EFA\u6A21\u5F0F");let l=process.env.VITE_MULTI_PAGE_STRATEGY,r=B({entry:e.entry||"src/pages/**/*.{ts,js}",exclude:e.exclude||[],template:e.template||"index.html",placeholder:e.placeholder||"{{ENTRY_FILE}}",strategies:e.strategies||{},pageConfigs:e.pageConfigs||{},forceBuildStrategy:l}),a=Object.keys(r)[0];if(a&&r[a]){i(`\u5E94\u7528\u6784\u5EFA\u7B56\u7565: ${a}`);let g=r[a],p=ae(n,g);Object.assign(n,p),i(`\u5DF2\u5E94\u7528\u7B56\u7565 "${a}" \u7684\u914D\u7F6E:`,{build:!!g.build,define:!!g.define,plugins:((c=g.plugins)==null?void 0:c.length)||0})}else throw i("\u672A\u627E\u5230\u53EF\u7528\u7684\u6784\u5EFA\u7B56\u7565\uFF0C\u4F7F\u7528\u9ED8\u8BA4\u914D\u7F6E"),new Error(`\u274C \u6784\u5EFA\u5931\u8D25: \u672A\u627E\u5230\u4EFB\u4F55\u6784\u5EFA\u7B56\u7565 \u53EF\u80FD\u7684\u539F\u56E0\uFF1A 1. \u914D\u7F6E\u6587\u4EF6\u8FD4\u56DE\u7A7A\u5BF9\u8C61 {} 2. \u672A\u627E\u5230\u5339\u914D\u7684\u5165\u53E3\u6587\u4EF6 3. \u6A21\u677F\u6587\u4EF6\u4E0D\u5B58\u5728 4. \u672A\u914D\u7F6E strategies \u5BF9\u8C61 \u6700\u5C0F\u914D\u7F6E\u793A\u4F8B\uFF1A export default () => ({ entry: "src/pages/**/*.{ts,js}", template: "index.html", strategies: { default: {} } });`)}},configureServer(n){if(n.config.command==="serve"){i("\u914D\u7F6E\u5F00\u53D1\u670D\u52A1\u5668");let o=process.env.VITE_MULTI_PAGE_STRATEGY||"default";i(`\u5F00\u53D1\u6A21\u5F0F\u7B56\u7565: ${o}`),Y(n,{entry:e.entry||"src/pages/**/*.{ts,js}",exclude:e.exclude||[],template:e.template||"index.html",placeholder:e.placeholder||"{{ENTRY_FILE}}",strategies:e.strategies||{},pageConfigs:e.pageConfigs||{},devStrategy:o},i)}},writeBundle(){},buildEnd(){s.length>0&&(i(`\u6E05\u7406 ${s.length} \u4E2A\u4E34\u65F6\u6587\u4EF6`),s.forEach(n=>{try{U.existsSync(n)&&(U.unlinkSync(n),i(`\u5220\u9664\u4E34\u65F6\u6587\u4EF6: ${n}`))}catch(o){i(`\u5220\u9664\u4E34\u65F6\u6587\u4EF6\u5931\u8D25: ${n}`,o)}}),s.length=0)}}}var Be=le;export{ee as cleanViteOutputDirectory,Be as default,se as defineConfig,oe as defineConfigTransform,B as generateBuildConfig,te as getAvailableStrategies,z as getViteOutputDirectory,N as mergeWithDefaults,le as viteMultiPage}; //# sourceMappingURL=index.mjs.map