shithub: scrax

ref: 86a1bffad7063d1f51dfe44c2126bbdf8b7fe5c8
dir: /hash.js/

View raw version
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)
}