67 lines
1.6 KiB
JavaScript
67 lines
1.6 KiB
JavaScript
import { mkdir, readdir, rm, copyFile, stat, writeFile } from 'node:fs/promises'
|
|
import { join, resolve } from 'node:path'
|
|
|
|
function parseArgs(argv) {
|
|
const args = {}
|
|
for (const raw of argv.slice(2)) {
|
|
if (!raw.startsWith('--')) continue
|
|
const [k, v] = raw.slice(2).split('=')
|
|
args[k] = v ?? true
|
|
}
|
|
return args
|
|
}
|
|
|
|
async function exists(p) {
|
|
try {
|
|
await stat(p)
|
|
return true
|
|
} catch {
|
|
return false
|
|
}
|
|
}
|
|
|
|
async function main() {
|
|
const args = parseArgs(process.argv)
|
|
const platform = typeof args.platform === 'string' ? args.platform : 'unknown'
|
|
|
|
const repoRoot = resolve(process.cwd())
|
|
const fromDir = join(repoRoot, 'release')
|
|
const toDir = join(repoRoot, 'artifacts', 'releases', platform)
|
|
|
|
if (!(await exists(fromDir))) {
|
|
throw new Error(`Missing release/ directory at: ${fromDir}`)
|
|
}
|
|
|
|
await mkdir(toDir, { recursive: true })
|
|
|
|
const entries = await readdir(fromDir)
|
|
const copied = []
|
|
|
|
for (const name of entries) {
|
|
const src = join(fromDir, name)
|
|
const st = await stat(src)
|
|
if (!st.isFile()) continue
|
|
|
|
const dst = join(toDir, name)
|
|
await copyFile(src, dst)
|
|
copied.push({ name, size: st.size })
|
|
}
|
|
|
|
const manifest = {
|
|
platform,
|
|
sourceDir: 'release',
|
|
destDir: `artifacts/releases/${platform}`,
|
|
files: copied.sort((a, b) => a.name.localeCompare(b.name)),
|
|
createdAt: new Date().toISOString(),
|
|
}
|
|
|
|
await writeFile(join(toDir, 'manifest.json'), JSON.stringify(manifest, null, 2), 'utf8')
|
|
await rm(fromDir, { recursive: true, force: true })
|
|
}
|
|
|
|
main().catch((err) => {
|
|
console.error(err)
|
|
process.exit(1)
|
|
})
|
|
|