@mpgd/cli 0.67.0 → 0.69.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -275,7 +275,8 @@ async function submitVerifiedIosBuildResolved(input, run, { marketingVersion, bu
275
275
  let membershipFailure;
276
276
  try {
277
277
  const memberships = await run(['testflight', 'groups', 'list', '--build-id', build.id, '--internal'], lookupTimeoutMs);
278
- if (findInternalGroup(memberships, input.internalGroupId)) {
278
+ if (readBuildGroupMembership(memberships, build.id).some((group) => group.id === input.internalGroupId
279
+ && group.type === 'internal')) {
279
280
  return { ...base, status: 'testflight-ready', ...uploadReference, buildId: build.id };
280
281
  }
281
282
  }
@@ -405,6 +406,24 @@ function findInternalGroup(response, groupId) {
405
406
  && value.type === 'betaGroups' && value.id === groupId
406
407
  && isRecord(value.attributes) && value.attributes.isInternalGroup === true);
407
408
  }
409
+ /**
410
+ * asc 5.5.0 prints `testflight groups list --build-id` as its own membership
411
+ * result, not as App Store Connect resources:
412
+ * `{ buildId, appId, complete, groups: [{ id, name, type, membership }] }`
413
+ * (`internal/cli/testflight/build_group_membership.go`). An incomplete lookup
414
+ * is never read as "not a member".
415
+ */
416
+ export function readBuildGroupMembership(response, buildId) {
417
+ if (!isRecord(response) || response.buildId !== buildId || !Array.isArray(response.groups)
418
+ || response.groups.some((group) => !isRecord(group) || typeof group.id !== 'string'
419
+ || group.id === '' || typeof group.type !== 'string')) {
420
+ throw new Error('asc testflight groups list --build-id returned an invalid membership result.');
421
+ }
422
+ if (response.complete !== true) {
423
+ throw new Error('asc could not read every TestFlight group of the build.');
424
+ }
425
+ return response.groups;
426
+ }
408
427
  function readDataArray(response, command) {
409
428
  if (!isRecord(response) || !Array.isArray(response.data)) {
410
429
  throw new Error(`asc ${command} returned an invalid JSON schema.`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mpgd/cli",
3
- "version": "0.67.0",
3
+ "version": "0.69.0",
4
4
  "description": "Gunshi CLI for mpgd-kit starter generation and target workflow orchestration.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -70,10 +70,10 @@
70
70
  "parse5": "7.3.0",
71
71
  "postcss": "8.5.28",
72
72
  "postcss-value-parser": "4.2.0",
73
- "@mpgd/catalog": "0.14.2",
74
- "@mpgd/phaser-assets": "0.9.1",
75
- "@mpgd/target-config": "0.24.6",
76
- "@mpgd/platform": "0.35.0"
73
+ "@mpgd/catalog": "0.15.1",
74
+ "@mpgd/target-config": "0.24.8",
75
+ "@mpgd/platform": "0.35.1",
76
+ "@mpgd/phaser-assets": "0.10.0"
77
77
  },
78
78
  "devDependencies": {
79
79
  "@types/node": "^24.0.0",
@@ -81,19 +81,19 @@
81
81
  "@types/yauzl": "3.4.0",
82
82
  "ttsc": "0.34.2",
83
83
  "typescript": "7.0.2",
84
- "@mpgd/adapter-ait": "0.21.8",
85
- "@mpgd/adapter-browser": "0.12.4",
86
- "@mpgd/adapter-capacitor": "0.19.0",
87
- "@mpgd/analytics": "0.5.8",
88
- "@mpgd/adapter-verse8": "0.7.19",
89
- "@mpgd/adapter-devvit": "0.14.10",
90
- "@mpgd/bridge": "0.18.1",
91
- "@mpgd/capacitor-storekit": "0.7.0",
92
- "@mpgd/capacitor-play-billing": "0.6.1",
93
- "@mpgd/game-runtime": "0.10.0",
94
- "@mpgd/game-services": "0.33.0",
95
- "@mpgd/i18n": "0.6.29",
96
- "@mpgd/lite-shell": "0.1.0"
84
+ "@mpgd/adapter-ait": "0.21.10",
85
+ "@mpgd/adapter-browser": "0.12.5",
86
+ "@mpgd/adapter-capacitor": "0.19.2",
87
+ "@mpgd/adapter-devvit": "0.14.12",
88
+ "@mpgd/adapter-verse8": "0.7.21",
89
+ "@mpgd/analytics": "0.5.9",
90
+ "@mpgd/bridge": "0.19.0",
91
+ "@mpgd/capacitor-play-billing": "0.6.3",
92
+ "@mpgd/capacitor-storekit": "0.7.2",
93
+ "@mpgd/lite-shell": "0.1.0",
94
+ "@mpgd/game-runtime": "0.10.2",
95
+ "@mpgd/game-services": "0.34.0",
96
+ "@mpgd/i18n": "0.6.30"
97
97
  },
98
98
  "main": "./dist/index.js",
99
99
  "types": "./dist/index.d.ts",
@@ -125,9 +125,28 @@ export function createStarterWorkerNotificationBackend(
125
125
  storage: createNotificationRuntimeStorage({ storage: platform.storage }),
126
126
  // This target's entry in the Worker's registry, or none when the Worker does not serve it.
127
127
  async loadRegistryEntry() {
128
- const { providers, targets } = await client.getProviders();
129
- const id = targets[platform.configTarget];
130
- return id === undefined ? undefined : providers.find((entry) => entry.provider === id);
128
+ const { providers, targets, unreadable = [] } = await client.getProviders();
129
+ const id = Object.hasOwn(targets, platform.configTarget) ? targets[platform.configTarget] : undefined;
130
+ if (id === undefined) {
131
+ return undefined;
132
+ }
133
+ const entry = providers.find((candidate) => candidate.provider === id);
134
+ if (entry !== undefined) {
135
+ return entry;
136
+ }
137
+ // An entry the client could not read: a failed load, which the runtime
138
+ // reports, running without the comparison until the next start. An
139
+ // unreadable entry without an id may be this one too.
140
+ const left = unreadable.find((skipped) => skipped.provider === id)
141
+ ?? unreadable.find((skipped) => skipped.provider === undefined);
142
+ if (left !== undefined) {
143
+ throw new Error(
144
+ `[notifications] the game-services registry entry for provider ${id} (${platform.configTarget}) `
145
+ + `cannot be read: ${left.issue}`,
146
+ );
147
+ }
148
+ // The registry lists no entry for the provider at all.
149
+ return undefined;
131
150
  },
132
151
  onError(error) {
133
152
  console.error('[notifications]', error);