Onboarding live apps without owner questions for what the stores and the code prove: storebound onboard imports the live products and subscriptions with USD / base prices (catalog diff clean), contact values, the App Review contact and demo account (credentials.json, masked), sign-in for review from Apple's review detail and auth code, and the account deletion page from the app's site; App Store keywords count characters (live fields up to 265 bytes accepted); validate accepts the 6.5-inch iPhone set and Play's default-language graphics fallback; Play Reporting API off gives the project's enable link and apps list falls back to local apps; accounts default <profile>; store-only apps (apps add --store --app-id) shown read-only in the desktop (pitfalls 43-52)

This commit is contained in:
CRTkafa 2026-10-13 07:25:01 +08:00
parent d2ce185441
commit e5f148e534
55 changed files with 1648 additions and 158 deletions

View file

@ -60,11 +60,12 @@ describe('copy parsing', () => {
expect(Object.keys(c)).toEqual(['en-US', 'tr']);
expect(c['en-US']!.subtitle).toBe('Short hook under the name');
});
test('appstore: missing field, keyword spaces, byte limit', () => {
test('appstore: missing field, keyword spaces, character limit (pitfall 43)', () => {
const sec = (kw: string) => `## de-DE\n### subtitle\n\`\`\`\nA\n\`\`\`\n### promotionalText\n\`\`\`\nB\n\`\`\`\n### keywords\n\`\`\`\n${kw}\n\`\`\`\n### description\n\`\`\`\nD\n\`\`\`\n`;
expect(parseAppStoreListing(sec('a,b'))['de-DE']!.keywords).toBe('a,b');
expect(() => parseAppStoreListing(sec('a, b'))).toThrow('no spaces after commas');
expect(() => parseAppStoreListing(sec('ö'.repeat(60)))).toThrow('bytes > 100');
expect(parseAppStoreListing(sec('ö'.repeat(100)))['de-DE']!.keywords).toHaveLength(100);
expect(() => parseAppStoreListing(sec('ö'.repeat(101)))).toThrow('keywords is 101 > 100');
expect(() => parseAppStoreListing('## fr-FR\n### subtitle\n```\nx\n```\n')).toThrow('fr-FR: missing promotionalText');
});
});