Play edits under a machine-wide per-package lock (parallel reads of one app no longer delete each other's edits; a read whose edit was deleted is redone once, writes are not); a store that failed to read is 'Couldn't read Google Play' and keeps its last good releases with 'couldn't refresh'; stores on different versions: neutral 'Current · Play x · App Store y' header and each lane its own state, 'Not on this store' only without a record; Play status decided from the public store page's live version (Live / In review / In review (live: x) / managed publishing / Rolling out / Halted / Draft; only a network failure says 'Couldn't check the store page', with the last known answer and its time); tests/play-edit-lock.test.ts, recorded page fixture, boot check auto-read cases (pitfall 58)
This commit is contained in:
parent
e59f439101
commit
714352ec18
24 changed files with 570 additions and 103 deletions
|
|
@ -71,7 +71,7 @@ const STORE_APPS: Record<string, StoreApp[]> = {
|
|||
droid('com.example.nightnotes.free', 'Nightnotes Free', G.night), droid('com.example.moodgrid', 'Mood Grid', G.mood),
|
||||
],
|
||||
[A1]: [
|
||||
ios('6400000001', 'com.example.prismpuddle', 'Prism Puddle', null, ['2.4.0', 'WAITING_FOR_REVIEW']), ios('6400000011', 'com.example.orbithop', 'Orbit Hop', G.orbit, ['3.1.0', 'READY_FOR_SALE']),
|
||||
ios('6400000001', 'com.example.prismpuddle', 'Prism Puddle', null, ['2.4.0', 'WAITING_FOR_REVIEW']), ios('6400000011', 'com.example.orbithop', 'Orbit Hop', G.orbit, ['3.0.4', 'READY_FOR_SALE']),
|
||||
ios('6400000012', 'com.example.blockgarden.ios', 'Block Garden', G.block, ['1.2.0', 'IN_REVIEW']), ios('6400000013', 'com.example.wordlantern', 'Word Lantern', G.lantern, ['2.0.1', 'READY_FOR_SALE']),
|
||||
ios('6400000014', 'com.example.oldracer', 'Old Racer', G.racer, ['1.9.3', 'REMOVED_FROM_SALE']),
|
||||
],
|
||||
|
|
@ -166,7 +166,8 @@ function status(id: string, live: boolean): AppStatus {
|
|||
}
|
||||
/** Store-only app releases (fixture), by bundle id / package name. */
|
||||
const STORE_RELEASES: Record<string, StoreRelease[]> = {
|
||||
'com.example.orbithop': [rel('ios', '3.1.0', 'live', { build: '88', state: 'READY_FOR_SALE', date: iso(60 * 24 * 6) }), rel('android', '3.1.0', 'rollout', { build: '310', state: 'inProgress', fraction: 0.5 })],
|
||||
// the stores do not always move together: Play is on 3.1.0, the App Store still on 3.0.4
|
||||
'com.example.orbithop': [rel('ios', '3.0.4', 'live', { build: '88', state: 'READY_FOR_SALE', date: iso(60 * 24 * 6) }), rel('android', '3.1.0', 'rollout', { build: '310', state: 'inProgress', fraction: 0.5 })],
|
||||
'com.example.blockgarden.ios': [rel('ios', '1.2.0', 'review', { build: '17', state: 'IN_REVIEW', date: iso(60 * 5) }), rel('ios', '1.1.2', 'live', { build: '15', state: 'READY_FOR_SALE', date: iso(60 * 24 * 40) })],
|
||||
'com.example.blockgarden': [rel('android', '1.2.0', 'live', { build: '120', state: 'completed' })],
|
||||
'com.example.wordlantern': [rel('ios', '2.0.1', 'live', { build: '41', state: 'READY_FOR_SALE', date: iso(60 * 24 * 18) })],
|
||||
|
|
|
|||
|
|
@ -106,7 +106,7 @@ export const PLAY_STATUS = {
|
|||
|
||||
// A first release in the shapes the stores really answered (pitfall: App Store "1.0" in review while Google Play's
|
||||
// production release of "1.0.0" reads "completed" but the app is not public yet). `play status --json` adds the public
|
||||
// store page check (publicPage): 404 = not public yet, 200 = published.
|
||||
// store page check (publicPage): 404 = not public yet, 200 = published with the page's live version.
|
||||
export const APPLE_STATUS_FIRST_REVIEW = {
|
||||
app: { id: '1000000002', attributes: { name: 'Prism Puddle', bundleId: 'com.example.prismpuddle' } },
|
||||
versions: [version('ver-10', '1.0', 'WAITING_FOR_REVIEW', 'b-3')],
|
||||
|
|
@ -119,7 +119,7 @@ const playFirst = (state: 'public' | 'notPublic') => ({
|
|||
{ track: 'production', releases: [{ name: '1.0.0', versionCodes: ['3'], status: 'completed', userFraction: 1 }] },
|
||||
{ track: 'internal', releases: [{ name: '1.0.0', versionCodes: ['3'], status: 'completed' }] },
|
||||
],
|
||||
publicPage: { state, http: state === 'public' ? 200 : 404, versionName: null, checkedAt: '2026-10-13T08:00:00Z', url: 'https://play.google.com/store/apps/details?id=com.example.prismpuddle&hl=en' },
|
||||
publicPage: { state, http: state === 'public' ? 200 : 404, versionName: state === 'public' ? '1.0.0' : null, checkedAt: '2026-10-13T08:00:00Z', url: 'https://play.google.com/store/apps/details?id=com.example.prismpuddle&hl=en' },
|
||||
});
|
||||
export const PLAY_STATUS_FIRST_404 = playFirst('notPublic');
|
||||
export const PLAY_STATUS_FIRST_200 = playFirst('public');
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue