ref: 86a1bffad7063d1f51dfe44c2126bbdf8b7fe5c8
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) }