Loading files
import { createHash } from 'node:crypto'
import { readFileSync, writeFileSync } from 'node:fs'
const sources = [
{ name: 'jump', url: new URL('../mini_app_sample/miniapp.ts', import.meta.url) },
{ name: 'catch', url: new URL('../stackchan_catch/miniapp.ts', import.meta.url) },
]
const outputUrl = new URL('./miniapp.ts', import.meta.url)
const sourceHash = createHash('sha256')
.update(sources.map(({ url }) => readFileSync(url, 'utf8')).join('\0'))
.digest('hex')
function moduleBody(url) {
return readFileSync(url, 'utf8')
.split('\n')
.filter((line) => !line.startsWith('import '))
.join('\n')
.replace(/^export (type|interface|function|class) /gm, '$1 ')
.replace(/^export default /m, 'return ')
.trim()
}
function indent(source) {
return source
.split('\n')
.map((line) => (line ? ` ${line}` : ''))
.join('\n')
}
const sections = sources.map(({ name, url }) => {
return `const ${name}Definitions = (() => {\n${indent(moduleBody(url))}\n})()`
})
const output = `// Generated by compose.mjs from mini_app_sample and stackchan_catch.\n// Source SHA-256: ${sourceHash}\n// Run: node mods/examples/stackchan_minigames/compose.mjs\n\nimport type { MiniAppDefinition } from 'capabilities'\nimport 'piu/MC'\nimport type { Port as PiuPort, Texture as PiuTexture } from 'piu/MC'\n\n${sections.join('\n\n')}\n\nconst definitions: readonly MiniAppDefinition[] = Object.freeze([...jumpDefinitions, ...catchDefinitions])\n\nexport default definitions\n`
if (process.argv.includes('--check')) {
const current = readFileSync(outputUrl, 'utf8')
if (current !== output) throw new Error('miniapp.ts is stale; run compose.mjs')
} else {
writeFileSync(outputUrl, output)
}
e14740673This file is pinned to the selected release. Download the original to open it in your design tool.