mirror of
https://github.com/multipleof4/lynchmark.git
synced 2026-01-14 16:47:55 +00:00
32 lines
1.5 KiB
JavaScript
32 lines
1.5 KiB
JavaScript
const bundleApp=async(entry,files)=>{
|
|
const {transform}=(await import('https://esm.sh/@babel/standalone@7.23.9')).default
|
|
const mods=new Map
|
|
const norm=(from,to)=>{
|
|
if(!to.startsWith('.'))return to
|
|
const parts=from.split('/')
|
|
parts.pop()
|
|
to.split('/').forEach(part=>{
|
|
if(!part||part=='.')return
|
|
part=='..'?parts.pop():parts.push(part)
|
|
})
|
|
return parts.join('/')
|
|
}
|
|
const walk=file=>{
|
|
if(mods.has(file))return
|
|
const src=files[file]
|
|
if(src==null)throw new Error(`Missing file: ${file}`)
|
|
const {code}=transform(src,{presets:[['env',{modules:'commonjs'}]],sourceType:'module'})
|
|
const deps={}
|
|
for(const m of code.matchAll(/require\((['"])(.+?)\1\)/g)){
|
|
const spec=m[2]
|
|
deps[spec]=norm(file,spec)
|
|
}
|
|
mods.set(file,{code,deps})
|
|
Object.values(deps).forEach(walk)
|
|
}
|
|
walk(entry)
|
|
const esc=s=>s.replace(/\\/g,'\\\\').replace(/`/g,'\\`').replace(/\$\{/g,'\\${')
|
|
const body=[...mods].map(([id,{code,deps}])=>`"${id}":[function(require,module,exports){${esc(code)}},${JSON.stringify(deps)}]`).join(',')
|
|
return `(()=>{var m={${body}},c={},p=(f,s)=>{if(!s.startsWith('.'))return s;var a=f.split('/');a.pop();s.split('/').forEach(b=>{if(!b||b=='.')return;b=='..'?a.pop():a.push(b)});return a.join('/')},r=f=>{if(!m[f])throw new Error("Missing module "+f);if(c[f])return c[f].exports;var d=m[f],mod={exports:{}};c[f]=mod;d[0](g=>{var t=d[1][g];return r(t?t:p(f,g))},mod,mod.exports);return mod.exports};return r("${entry}")})()`
|
|
}
|
|
export default bundleApp; |