1 changed files with 82 additions and 0 deletions
@ -0,0 +1,82 @@ |
|||||
|
class Builder { |
||||
|
constructor(files) { |
||||
|
this.files = files |
||||
|
} |
||||
|
|
||||
|
buildModule(file) { |
||||
|
const script = document.createElement('script') |
||||
|
script.setAttribute('type', 'module') |
||||
|
let initAppend = "" |
||||
|
let append = "" |
||||
|
const data = file.data.replaceAll( |
||||
|
/^\s*export\s+(?:class|function|async\s+function|const)\s+(\S+)/gms, |
||||
|
(match, p1) => { |
||||
|
const path = JSON.stringify(file.name) |
||||
|
const mref = `Macchiato.modules[${path}]` |
||||
|
const pref = `[${JSON.stringify(p1)}]` |
||||
|
initAppend = `\n\n${mref} = {}` |
||||
|
const s = `${mref}${pref} = ${p1}` |
||||
|
append += "\n" + s |
||||
|
return `// append: ${s}\n${match}` |
||||
|
} |
||||
|
).replaceAll( |
||||
|
/^\s*import\s+(\{[^}]+\})\s+from\s+("[^"]+"|')/gms, |
||||
|
(match, p1, p2) => { |
||||
|
const vars = p1.replaceAll(' as ', ': ') |
||||
|
const importPath = p2.slice(1, -1) |
||||
|
const path = JSON.stringify( |
||||
|
importPath.slice( |
||||
|
importPath.indexOf('/') + 1 |
||||
|
) |
||||
|
) |
||||
|
const ref = `Macchiato.modules[${path}]` |
||||
|
return `const ${vars} = ${ref}` |
||||
|
} |
||||
|
) |
||||
|
script.textContent = ( |
||||
|
"\n" + data + initAppend + append + "\n" |
||||
|
) |
||||
|
return script.outerHTML |
||||
|
} |
||||
|
|
||||
|
build() { |
||||
|
const modules = this.files.map(file => { |
||||
|
return this.buildModule(file) |
||||
|
}) |
||||
|
return ` |
||||
|
<!doctype html> |
||||
|
<html> |
||||
|
<head> |
||||
|
<title>Editor</title> |
||||
|
<style> |
||||
|
html, body, iframe { |
||||
|
margin: 0; |
||||
|
padding: 0; |
||||
|
width: 100%; |
||||
|
height: 100%; |
||||
|
} |
||||
|
iframe { |
||||
|
border: none; |
||||
|
display: block; |
||||
|
} |
||||
|
html { |
||||
|
box-sizing: border-box; |
||||
|
} |
||||
|
*, *:before, *:after { |
||||
|
box-sizing: inherit; |
||||
|
} |
||||
|
</style> |
||||
|
</head> |
||||
|
<body> |
||||
|
${'<'}script type="module"> |
||||
|
window.Macchiato = {modules: {}} |
||||
|
${'</'}script> |
||||
|
${modules.join("\n")} |
||||
|
${'<'}script type="module"> |
||||
|
|
||||
|
${'</'}script> |
||||
|
</body> |
||||
|
</html> |
||||
|
`.trim()
|
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue