Files
stablyai--orca/config/scripts/check-feature-wall-assets.mjs
2026-07-13 13:05:33 +08:00

84 lines
2.1 KiB
JavaScript

#!/usr/bin/env node
import { readdir, stat } from 'node:fs/promises'
import path from 'node:path'
const __dirname = import.meta.dirname
const ROOT = path.join(__dirname, '..', '..')
const FEATURE_WALL_ASSET_DIR = path.join(ROOT, 'resources', 'onboarding', 'feature-wall')
const MAX_BYTES = 11 * 1024 * 1024
const MEDIA_TILE_IDS = [
'tile-01',
'tile-02',
'tile-03',
'tile-04',
'tile-05',
'tile-06',
'tile-07',
'tile-08',
'tile-09',
'tile-10',
'tile-11',
'tile-12'
]
const EXPECTED_FILES = MEDIA_TILE_IDS.flatMap((id) => [
`${id}.gif`,
`${id}.poster.jpg`,
`${id}.recorded-at.json`
])
async function collectFiles(dir) {
let entries
try {
entries = await readdir(dir, { withFileTypes: true })
} catch (error) {
if (error && error.code === 'ENOENT') {
return []
}
throw error
}
const files = []
for (const entry of entries) {
const fullPath = path.join(dir, entry.name)
if (entry.isDirectory()) {
files.push(...(await collectFiles(fullPath)))
} else if (entry.isFile()) {
files.push(fullPath)
}
}
return files
}
const files = await collectFiles(FEATURE_WALL_ASSET_DIR)
const fileNames = new Set(files.map((file) => path.relative(FEATURE_WALL_ASSET_DIR, file)))
const missingFiles = EXPECTED_FILES.filter((file) => !fileNames.has(file))
if (missingFiles.length > 0) {
// Why: a byte-budget-only check lets an empty asset directory pass, which
// ships the feature tour as text-only cards instead of the recorded media.
console.error(`Feature wall assets are missing: ${missingFiles.join(', ')}`)
process.exit(1)
}
let totalBytes = 0
for (const file of files) {
const fileStat = await stat(file)
totalBytes += fileStat.size
}
if (totalBytes > MAX_BYTES) {
const totalMb = (totalBytes / 1024 / 1024).toFixed(2)
const maxMb = (MAX_BYTES / 1024 / 1024).toFixed(2)
console.error(
`Feature wall assets are ${totalMb} MB, which exceeds the ${maxMb} MB installer budget.`
)
process.exit(1)
}
console.log(
`Feature wall assets: ${(totalBytes / 1024 / 1024).toFixed(2)} MB / ${(
MAX_BYTES /
1024 /
1024
).toFixed(2)} MB`
)