Files
DIYgod 2131cec389 chore(store-assets): add the store screenshot and listing pipeline
Store copy for 12 listing locales, plus the tooling that captures the apps
with a demo account and renders the App Store, Google Play and Microsoft
Store screenshots and the README banner. Raw captures and rendered images
stay out of the repository (store-assets/.gitignore).

store-assets is a private workspace package, so playwright, sharp, pathe and
the other script dependencies are declared instead of resolved through
hoisting, and turbo typechecks it. The lockfile only gains its importer.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 14:34:42 +08:00

39 lines
1.3 KiB
TypeScript

// Lists the app captures each UI locale still needs for the decks:
// tsx store-assets/scripts/check-captures.ts
import { existsSync } from "node:fs"
import { join } from "pathe"
import { decks } from "../src/decks"
import { appUiLocales } from "../src/locales"
const root = join(import.meta.dirname, "..")
let incomplete = 0
for (const locale of appUiLocales) {
const missing = new Set<string>()
for (const deck of decks) {
for (const slide of deck.slides) {
const shots: [string, string][] = [
...slide.shots.map((shot): [string, string] => [deck.captureDevice, shot]),
...(slide.companion
? [[slide.companion.device, slide.companion.shot] as [string, string]]
: []),
...(slide.callouts ?? []).map((c): [string, string] => [deck.captureDevice, c.shot]),
]
for (const [device, shot] of shots) {
if (!existsSync(join(root, "captures", locale, device, `${shot}.png`))) {
missing.add(`${device}/${shot}`)
}
}
}
}
// The Google Play feature graphic shows the Android timeline.
if (!existsSync(join(root, "captures", locale, "android", "timeline.png"))) {
missing.add("android/timeline")
}
if (missing.size > 0) incomplete++
console.log(`${locale}: ${[...missing].sort().join(", ") || "complete"}`)
}
process.exitCode = incomplete > 0 ? 1 : 0