store-only apps edit their listing on the store (storebound listing live / set: old -> new per field with the checks, a PATCH of only the edited fields; serve listing.set is the one store-only write, its token bound to the store ids; policy.rs STORE_ONLY_WRITES, write_with_confirm for store targets); screenshot captions per language and scene edited as a text edit of the shots copy JSON (JSON files keep their layout); Play content rating, target audience and App content answers in App info; docs/console-parity.md after the editors (73 rows: 55 complete, 18 with the reason) and tests/console-parity.test.ts keeping it honest

This commit is contained in:
CRTkafa 2026-10-14 00:53:38 +08:00
parent 3cea2af4e1
commit 7ac028421a
33 changed files with 852 additions and 157 deletions

View file

@ -58,12 +58,16 @@ export function editableValues(l: Loaded): EditableResult {
apple.push({ lang: lang.apple, language: lang.id, status: s?.status ?? null, exists: !!s, values: s?.values ?? {} });
}
}
const files = [path, ...(playFile ? [playFile] : []), ...(appleFile ? [appleFile] : [])];
let shotsCopy: EditableResult['shotsCopy'] = null;
const copyFile = config.shots?.copy ? resolve(config.shots.copy) : null;
try { if (copyFile && existsSync(copyFile)) shotsCopy = JSON.parse(readFileSync(copyFile, 'utf8')) as EditableResult['shotsCopy']; } catch { /* broken JSON: shots check names it */ }
const files = [path, ...(copyFile ? [copyFile] : []), ...(playFile ? [playFile] : []), ...(appleFile ? [appleFile] : [])];
const { signing: _s, build: _b, adhoc: _a, ...appleRest } = config.apple ?? ({} as NonNullable<typeof config.apple>);
const { build: _pb, ...playRest } = config.play ?? ({} as NonNullable<typeof config.play>);
return {
root,
files: { config: rel(path), play: playFile ? rel(playFile) : null, apple: appleFile ? rel(appleFile) : null, contact: rel(contactFile) },
files: { config: rel(path), play: playFile ? rel(playFile) : null, apple: appleFile ? rel(appleFile) : null, contact: rel(contactFile), shotsCopy: copyFile ? rel(copyFile) : null },
shotsCopy,
format: path.endsWith('.json') ? 'json' : path.endsWith('.js') ? 'js' : 'ts',
git: gitState(root, files),
appName: config.app.name,
@ -74,6 +78,7 @@ export function editableValues(l: Loaded): EditableResult {
config: JSON.parse(JSON.stringify({
app: config.app, apple: config.apple ? appleRest : null, play: config.play ? playRest : null, products: config.products ?? [], subscriptions: config.subscriptions ?? [],
dataSafety: config.dataSafety ?? null, appPrivacy: config.appPrivacy ?? null, reviewAccess: config.reviewAccess ?? null, accounts: config.accounts ?? null, social: config.social ?? null,
console: config.console ?? null,
shots: config.shots ? { scenes: config.shots.scenes, feature: config.shots.feature ?? null } : null,
})) as EditableResult['config'],
contact,