mirror of
https://github.com/multipleof4/lynchmark.git
synced 2026-01-14 16:47:55 +00:00
75 lines
2.0 KiB
JavaScript
75 lines
2.0 KiB
JavaScript
async function bundleApp(entryFile, files) {
|
|
const Babel = await import('https://esm.sh/@babel/standalone');
|
|
const modules = {};
|
|
const visited = new Set();
|
|
|
|
const resolve = (from, to) => {
|
|
if (!to.startsWith('./') && !to.startsWith('../')) return to;
|
|
const fromParts = from.split('/').slice(0, -1);
|
|
const toParts = to.split('/');
|
|
for (const p of toParts) {
|
|
if (p === '..') fromParts.pop();
|
|
else if (p !== '.') fromParts.push(p);
|
|
}
|
|
return fromParts.join('/') || toParts[toParts.length - 1];
|
|
};
|
|
|
|
const extractDeps = code => {
|
|
const deps = [];
|
|
const re = /require\s*\(\s*['"]([^'"]+)['"]\s*\)/g;
|
|
let m;
|
|
while ((m = re.exec(code))) deps.push(m[1]);
|
|
return deps;
|
|
};
|
|
|
|
const process = file => {
|
|
if (visited.has(file)) return;
|
|
visited.add(file);
|
|
if (!(file in files)) throw new Error(`Missing file: ${file}`);
|
|
const transformed = Babel.transform(files[file], {
|
|
presets: ['env'],
|
|
filename: file
|
|
}).code;
|
|
const deps = extractDeps(transformed);
|
|
const resolved = {};
|
|
for (const d of deps) {
|
|
const r = resolve(file, d);
|
|
resolved[d] = r;
|
|
process(r);
|
|
}
|
|
modules[file] = { code: transformed, deps: resolved };
|
|
};
|
|
|
|
process(entryFile);
|
|
|
|
const modulesObj = JSON.stringify(
|
|
Object.fromEntries(
|
|
Object.entries(modules).map(([k, v]) => [
|
|
k,
|
|
{ code: v.code, deps: v.deps }
|
|
])
|
|
)
|
|
);
|
|
|
|
return `(function(){
|
|
var __modules__=${modulesObj};
|
|
var __cache__={};
|
|
var __resolve__=function(f,t){
|
|
var d=__modules__[f].deps;
|
|
return d[t]||t;
|
|
};
|
|
var __require__=function(from,id){
|
|
var resolved=__resolve__(from,id);
|
|
if(__cache__[resolved])return __cache__[resolved].exports;
|
|
var mod=__modules__[resolved];
|
|
if(!mod)throw new Error("Cannot find module: "+resolved);
|
|
var module={exports:{}};
|
|
__cache__[resolved]=module;
|
|
var fn=new Function("require","module","exports",mod.code);
|
|
fn(function(id){return __require__(resolved,id);},module,module.exports);
|
|
return module.exports;
|
|
};
|
|
return __require__("","${entryFile}");
|
|
})()`;
|
|
}
|
|
export default bundleApp; |