ref: 81d1e4e01d7001e6a0107792e6167136787295d6
dir: /hash.js/
import fs from "node:fs/promises"
import {MD5} from "./md5.js"
import {spawn} from "node:child_process"
import {Writable} from "node:stream"
let packages = ["scratch-l10n@6.0.38", "path-data-polyfill@1.0.10"]
let names0 = ["index.html", "about.html", "icon.svg"]
let names = ["areas", "compile", "core", "external", "index", "md5", "model", "music", "paint", "pen", "scratch", "stage", "syntax", "translation", "view", "zip", "worklet"]
await fs.rm("hash", {recursive: true, force: true})
await fs.mkdir("hash/assets", {recursive: true})
for (let arg of await fs.readdir("assets")) {
if (!arg.endsWith(".mp3") && !arg.endsWith(".png")) continue
let name = "assets/" + arg
await fs.copyFile(name, `hash/${name}`)
}
let imports = {}
for (let spec of packages) {
let [name, version] = spec.split("@")
await fs.mkdir(`hash/packages/${name}`, {recursive: true})
let response = await fetch(`https://registry.npmjs.org/${name}/-/${name}-${version}.tgz`)
if (!response.ok) throw new Error("response not ok")
let process = spawn("tar", ["--strip-components=1", "-xf", "-"], {cwd: `hash/packages/${name}`})
response.body.pipeTo(Writable.toWeb(process.stdin))
await new Promise(resolve => process.on("close", resolve))
imports[name + "/"] = `./packages/${name}/`
}
for (let name of await fs.readdir("hash/packages", {recursive: true})) {
name = `hash/packages/${name}`
if (name.endsWith(".mjs")) await fs.rename(name, `${name.slice(0, -4)}.js`)
}
for (let name of names) {
let file = await fs.readFile(`${name}.js`)
let md5 = MD5(file).slice(0, 8)
imports[`./${name}.js`] = `./${name}-${md5}.js`
await fs.writeFile(`hash/${name}-${md5}.js`, file)
}
let importMap = JSON.stringify({imports})
for (let name of names0) {
let file = await fs.readFile(name, "utf-8")
if (name.endsWith(".html")) file = file.replace(/(<script type="importmap">).*?(<\/script>)/mg, `$1${importMap}$2`)
await fs.writeFile(`hash/${name}`, file)
}