@sitepong/fastnode 0.3.1 → 0.3.2
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.
- package/dist/actions/index.cjs +1 -0
- package/dist/actions/index.cjs.map +1 -1
- package/dist/actions/index.mjs +1 -0
- package/dist/actions/index.mjs.map +1 -1
- package/dist/{apple-session-jUzBrql5.d.cts → apple-session-D6x7Jo3D.d.cts} +1 -1
- package/dist/{apple-session-jUzBrql5.d.ts → apple-session-D6x7Jo3D.d.ts} +1 -1
- package/dist/cert/index.cjs +92 -51
- package/dist/cert/index.cjs.map +1 -1
- package/dist/cert/index.d.cts +5 -5
- package/dist/cert/index.d.ts +5 -5
- package/dist/cert/index.mjs +92 -51
- package/dist/cert/index.mjs.map +1 -1
- package/dist/{cert-ClacRx9y.d.ts → cert-C-yRB-sO.d.ts} +2 -2
- package/dist/{cert-DffLKURp.d.cts → cert-C4hhKH1n.d.cts} +2 -2
- package/dist/cli/index.cjs +40 -23
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.d.cts +3 -3
- package/dist/cli/index.d.ts +3 -3
- package/dist/cli/index.mjs +40 -23
- package/dist/cli/index.mjs.map +1 -1
- package/dist/client/index.cjs +1 -0
- package/dist/client/index.cjs.map +1 -1
- package/dist/client/index.d.cts +3 -3
- package/dist/client/index.d.ts +3 -3
- package/dist/client/index.mjs +1 -0
- package/dist/client/index.mjs.map +1 -1
- package/dist/core/index.d.cts +1 -1
- package/dist/core/index.d.ts +1 -1
- package/dist/deliver/index.d.cts +4 -4
- package/dist/deliver/index.d.ts +4 -4
- package/dist/{enums-yXNVh3UI.d.cts → enums-BlpayMTx.d.cts} +1 -1
- package/dist/{enums-yXNVh3UI.d.ts → enums-BlpayMTx.d.ts} +1 -1
- package/dist/frameit/index.d.cts +1 -1
- package/dist/frameit/index.d.ts +1 -1
- package/dist/gradle/index.d.cts +1 -1
- package/dist/gradle/index.d.ts +1 -1
- package/dist/gym/index.d.cts +2 -2
- package/dist/gym/index.d.ts +2 -2
- package/dist/{index-DnHQ2uT2.d.cts → index-258t9n7v.d.cts} +2 -2
- package/dist/{index-Ol0RtbQA.d.ts → index-6LKy36sE.d.ts} +4 -4
- package/dist/{index-O3EMrd5s.d.cts → index-B74vgav6.d.cts} +4 -4
- package/dist/{index-BoU8qt8r.d.cts → index-B7ERdhh8.d.cts} +1 -1
- package/dist/{index-BoU8qt8r.d.ts → index-B7ERdhh8.d.ts} +1 -1
- package/dist/{index-CmcFPn_G.d.cts → index-BIRpj0f2.d.cts} +2 -2
- package/dist/{index-s2PigtDM.d.ts → index-BJLHWMwL.d.ts} +3 -3
- package/dist/{index-mEEB7An6.d.ts → index-B_D_01oz.d.ts} +1 -1
- package/dist/{index-C18cijCd.d.ts → index-Ba1jHQYg.d.ts} +1 -1
- package/dist/{index-925_Ov7X.d.cts → index-BawZaGqD.d.cts} +3 -3
- package/dist/{index-8djTPW8O.d.ts → index-BmrOdmNL.d.ts} +2 -2
- package/dist/{index-C-EEYXSE.d.ts → index-C8L03MBu.d.ts} +3 -3
- package/dist/{index-Cp6cjtd-.d.cts → index-CHLDQweM.d.cts} +1 -1
- package/dist/{index-Cp6cjtd-.d.ts → index-CHLDQweM.d.ts} +1 -1
- package/dist/{index-B6-MJpO4.d.cts → index-CRFfLsEG.d.cts} +1 -1
- package/dist/{index-N6eV5yym.d.ts → index-CV6KnSy1.d.ts} +2 -2
- package/dist/index-CX2hUvvG.d.cts +287 -0
- package/dist/index-CX2hUvvG.d.ts +287 -0
- package/dist/{index-Dkf5sH1E.d.ts → index-ClhWjR7a.d.ts} +2 -2
- package/dist/{index-BGhV0gS-.d.ts → index-Cq-xo-9x.d.ts} +2 -2
- package/dist/{index-CR3BFPIz.d.cts → index-Cw7ojUY5.d.cts} +1 -1
- package/dist/{index-CR3BFPIz.d.ts → index-Cw7ojUY5.d.ts} +1 -1
- package/dist/{index-C2yG3wXA.d.cts → index-CwD7lG0y.d.cts} +1 -1
- package/dist/{index-C2yG3wXA.d.ts → index-CwD7lG0y.d.ts} +1 -1
- package/dist/{index-_24DRp3a.d.cts → index-CxrqhkVF.d.cts} +1 -1
- package/dist/{index-on573dnO.d.cts → index-D3zyYCYs.d.cts} +2 -2
- package/dist/{index-BhGaVlK1.d.cts → index-DCrSWVMb.d.cts} +3 -3
- package/dist/{index-CBM5XZKC.d.ts → index-DP2f5ZsS.d.ts} +3 -3
- package/dist/{index-BbVQzSV1.d.cts → index-DRjXV9ej.d.cts} +3 -3
- package/dist/{index-Dv-Mek07.d.ts → index-DSXBQeur.d.cts} +1 -1
- package/dist/{index-Dv-Mek07.d.cts → index-DSXBQeur.d.ts} +1 -1
- package/dist/{index-BYonklf3.d.cts → index-Dvi-3DSM.d.cts} +1 -1
- package/dist/{index-BYonklf3.d.ts → index-Dvi-3DSM.d.ts} +1 -1
- package/dist/{index-D9YQQ3FM.d.ts → index-Dy8EWOnt.d.ts} +2 -2
- package/dist/{index-CpGV1f0L.d.cts → index-HWWl6HEL.d.cts} +3 -3
- package/dist/{index-isT08RuY.d.cts → index-QYgreJV3.d.cts} +2 -2
- package/dist/{index-CemR3UI9.d.ts → index-SyCMBpNN.d.ts} +3 -3
- package/dist/{index-DFstwgGK.d.cts → index-yro2MWgt.d.cts} +2 -2
- package/dist/index.cjs +1440 -948
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +23 -23
- package/dist/index.d.ts +23 -23
- package/dist/index.mjs +1441 -949
- package/dist/index.mjs.map +1 -1
- package/dist/lane/index.cjs +1 -0
- package/dist/lane/index.cjs.map +1 -1
- package/dist/lane/index.mjs +1 -0
- package/dist/lane/index.mjs.map +1 -1
- package/dist/match/index.d.cts +6 -6
- package/dist/match/index.d.ts +6 -6
- package/dist/match/index.mjs +1 -1
- package/dist/pem/index.d.cts +4 -4
- package/dist/pem/index.d.ts +4 -4
- package/dist/pilot/index.d.cts +4 -4
- package/dist/pilot/index.d.ts +4 -4
- package/dist/playstore/index.cjs +18208 -1
- package/dist/playstore/index.cjs.map +1 -1
- package/dist/playstore/index.d.cts +1 -1
- package/dist/playstore/index.d.ts +1 -1
- package/dist/playstore/index.mjs +18196 -2
- package/dist/playstore/index.mjs.map +1 -1
- package/dist/precheck/index.d.cts +4 -4
- package/dist/precheck/index.d.ts +4 -4
- package/dist/privacy/index.cjs +32 -22
- package/dist/privacy/index.cjs.map +1 -1
- package/dist/privacy/index.d.cts +2 -2
- package/dist/privacy/index.d.ts +2 -2
- package/dist/privacy/index.mjs +32 -22
- package/dist/privacy/index.mjs.map +1 -1
- package/dist/produce/index.d.cts +4 -4
- package/dist/produce/index.d.ts +4 -4
- package/dist/review/index.cjs +32 -22
- package/dist/review/index.cjs.map +1 -1
- package/dist/review/index.d.cts +2 -2
- package/dist/review/index.d.ts +2 -2
- package/dist/review/index.mjs +32 -22
- package/dist/review/index.mjs.map +1 -1
- package/dist/sigh/index.d.cts +4 -4
- package/dist/sigh/index.d.ts +4 -4
- package/dist/snapshot/index.d.cts +1 -1
- package/dist/snapshot/index.d.ts +1 -1
- package/dist/trainer/index.d.cts +1 -1
- package/dist/trainer/index.d.ts +1 -1
- package/dist/xcode/index.d.cts +1 -1
- package/dist/xcode/index.d.ts +1 -1
- package/package.json +2 -2
- package/dist/index-CXJlvmB4.d.cts +0 -63
- package/dist/index-CXJlvmB4.d.ts +0 -63
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/client/auth.ts","../../src/client/srp.ts","../../src/client/apple-session.ts","../../src/client/request.ts","../../src/resources/certificates.ts","../../src/resources/profiles.ts","../../src/resources/bundle-ids.ts","../../src/resources/devices.ts","../../src/resources/apps.ts","../../src/resources/builds.ts","../../src/resources/beta-groups.ts","../../src/resources/capabilities.ts","../../src/resources/app-store-versions.ts","../../src/resources/app-screenshots.ts","../../src/resources/review-submissions.ts","../../src/resources/app-info.ts","../../src/resources/app-info-localizations.ts","../../src/resources/app-store-review-details.ts","../../src/resources/beta-testers.ts","../../src/resources/beta-app-review-submissions.ts","../../src/resources/beta-app-review-details.ts","../../src/resources/beta-invitations.ts","../../src/resources/beta-licenses.ts","../../src/resources/app-previews.ts","../../src/resources/app-preview-sets.ts","../../src/resources/app-prices.ts","../../src/resources/territories.ts","../../src/resources/age-rating-declarations.ts","../../src/resources/app-categories.ts","../../src/resources/app-encryption-declarations.ts","../../src/resources/idfa-declarations.ts","../../src/resources/pre-release-versions.ts","../../src/resources/review-submission-items.ts","../../src/resources/users.ts","../../src/resources/user-invitations.ts","../../src/resources/in-app-purchases.ts","../../src/resources/game-center-detail.ts","../../src/resources/xcode-metrics.ts","../../src/resources/app-asset-libraries.ts","../../src/resources/app-asset-library-assets.ts","../../src/resources/app-asset-library-placements.ts","../../src/client/session-store.ts","../../src/client/portal.ts","../../src/client/iris.ts","../../src/client/index.ts"],"names":["choice","phone","code","createHash","detail","id","OLYMPUS_SESSION"],"mappings":"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","file":"index.mjs","sourcesContent":["import { SignJWT, importPKCS8 } from \"jose\";\n\nexport interface TokenConfig {\n keyId: string;\n /** Issuer ID. When absent, the key is treated as an individual key (sub='user'). */\n issuerId?: string;\n privateKey: string;\n enterprise?: boolean;\n duration?: number;\n}\n\nconst MAX_TOKEN_DURATION = 1200;\nconst DEFAULT_TOKEN_DURATION = 500;\n\nexport class TokenManager {\n private config: TokenConfig;\n private currentToken: string | null = null;\n private expiresAt = 0;\n\n constructor(config: TokenConfig) {\n this.config = config;\n }\n\n async getToken(): Promise<string> {\n const now = Math.floor(Date.now() / 1000);\n if (this.currentToken && now < this.expiresAt - 30) {\n return this.currentToken;\n }\n return this.refresh();\n }\n\n async refresh(): Promise<string> {\n const duration = Math.min(\n this.config.duration ?? DEFAULT_TOKEN_DURATION,\n MAX_TOKEN_DURATION\n );\n const audience = this.config.enterprise\n ? \"apple-developer-enterprise-v1\"\n : \"appstoreconnect-v1\";\n\n const key = await importPKCS8(this.config.privateKey, \"ES256\");\n const now = Math.floor(Date.now() / 1000);\n\n // Mirror Fastlane's Spaceship::ConnectAPI::Token#refresh! behavior:\n // when issuerId is provided → set `iss`; otherwise treat as individual key\n // and set `sub: 'user'`.\n // https://developer.apple.com/documentation/appstoreconnectapi/generating_tokens_for_api_requests#4313913\n let jwt = new SignJWT(this.config.issuerId ? {} : { sub: \"user\" })\n .setProtectedHeader({\n alg: \"ES256\",\n kid: this.config.keyId,\n typ: \"JWT\",\n })\n .setIssuedAt(now - 60)\n .setExpirationTime(now + duration)\n .setAudience(audience);\n\n if (this.config.issuerId) {\n jwt = jwt.setIssuer(this.config.issuerId);\n }\n\n this.currentToken = await jwt.sign(key);\n\n this.expiresAt = now + duration;\n return this.currentToken;\n }\n\n invalidate(): void {\n this.currentToken = null;\n this.expiresAt = 0;\n }\n}\n","/**\n * SRP (Secure Remote Password) implementation\n * 1:1 port of the fastlane-sirp Ruby gem\n * Used for Apple ID authentication\n */\n\nimport { createHash, randomBytes, pbkdf2Sync } from \"node:crypto\";\n\n// ── RFC 5054 SRP Group Parameters ──────────────────────────────────────────\n\n// Copied exactly from fastlane-sirp parameters.rb (2048-bit group)\nconst N_2048 = BigInt(\n \"0x\" +\n \"AC6BDB41324A9A9BF166DE5E1389582FAF72B6651987EE07FC3192943DB56050\" +\n \"A37329CBB4A099ED8193E0757767A13DD52312AB4B03310DCD7F48A9DA04FD50\" +\n \"E8083969EDB767B0CF6095179A163AB3661A05FBD5FAAAE82918A9962F0B93B8\" +\n \"55F97993EC975EEAA80D740ADBF4FF747359D041D5C33EA71D281E446B14773B\" +\n \"CA97B43A23FB801676BD207A436C6481F1D2B9078717461A5B9D32E688F87748\" +\n \"544523B524B0D57D5EA77A2775D2ECFA032CFBDBF52FB3786160279004E57AE6\" +\n \"AF874E7303CE53299CCC041C7BC308D82A5698F3A8D0C38271AE35F8E9DBFBB\" +\n \"694B5C803D89F7AE435DE236D525F54759B65E372FCD68EF20FA7111F9E4AFF73\"\n);\nconst g_2048 = 2n;\n\n// ── Utility Functions ──────────────────────────────────────────────────────\n\nfunction numToHex(num: bigint): string {\n let hex = num.toString(16);\n if (hex.length % 2 !== 0) hex = \"0\" + hex;\n return hex.toLowerCase();\n}\n\nfunction hexToBytes(hex: string): Buffer {\n return Buffer.from(hex, \"hex\");\n}\n\nfunction shaHex(h: string, algorithm: string): string {\n return createHash(algorithm).update(hexToBytes(h)).digest(\"hex\");\n}\n\nfunction shaStr(s: string, algorithm: string): string {\n return createHash(algorithm).update(s).digest(\"hex\");\n}\n\nfunction modExp(base: bigint, exp: bigint, mod: bigint): bigint {\n if (mod === 1n) return 0n;\n let result = 1n;\n base = base % mod;\n while (exp > 0n) {\n if (exp % 2n === 1n) {\n result = (result * base) % mod;\n }\n exp = exp / 2n;\n base = (base * base) % mod;\n }\n return result;\n}\n\nfunction H(algorithm: string, n: bigint, ...args: (bigint | string | undefined)[]): bigint {\n const nHex = numToHex(n);\n // Must match Ruby: nlen = 2 * ((('%x' % [n]).length * 4 + 7) >> 3)\n // Use floor division (>>3), NOT ceiling\n const nlen = 2 * (((nHex.length * 4 + 7) >> 3));\n\n let hashin = \"\";\n for (const s of args) {\n if (s === undefined) continue;\n const shex = typeof s === \"string\" ? s : numToHex(s);\n if (shex.length > nlen) {\n throw new Error(\"Bit width does not match - client uses different prime\");\n }\n hashin += \"0\".repeat(nlen - shex.length) + shex;\n }\n\n const hashed = shaHex(hashin, algorithm);\n return BigInt(\"0x\" + hashed) % n;\n}\n\n// ── SRP Client ─────────────────────────────────────────────────────────────\n\nexport class SRPClient {\n private N: bigint;\n private g: bigint;\n private hashAlg: string;\n private k: bigint;\n private a: bigint;\n A: string;\n private S: string | null = null;\n private K: string | null = null;\n M: string | null = null;\n H_AMK: string | null = null;\n\n constructor(group: number = 2048) {\n if (group !== 2048) throw new Error(\"Only 2048-bit group is supported\");\n this.N = N_2048;\n this.g = g_2048;\n this.hashAlg = \"sha256\";\n this.k = H(this.hashAlg, this.N, this.N, this.g);\n // Generate random 'a'\n this.a = BigInt(\"0x\" + randomBytes(256).toString(\"hex\"));\n // Compute A = g^a mod N\n this.A = numToHex(modExp(this.g, this.a, this.N));\n }\n\n startAuthentication(): string {\n return this.A;\n }\n\n processChallenge(\n username: string,\n password: string, // hex-encoded encrypted password\n xsalt: string, // hex\n xbb: string, // hex\n isPasswordEncrypted: boolean = false\n ): string | false {\n const bb = BigInt(\"0x\" + xbb);\n\n // SRP-6a safety check\n if (bb % this.N === 0n) return false;\n\n let x: bigint;\n if (isPasswordEncrypted) {\n x = this.calcXHex(password, xsalt);\n } else {\n x = this.calcX(username, password, xsalt);\n }\n\n const u = H(this.hashAlg, this.N, this.A, xbb);\n if (u === 0n) return false;\n\n // S = (B - k * g^x) ^ (a + u*x) mod N\n const gx = modExp(this.g, x, this.N);\n let base = (bb - this.k * gx) % this.N;\n if (base < 0n) base += this.N;\n const exp = this.a + x * u;\n this.S = numToHex(modExp(base, exp, this.N));\n this.K = shaHex(this.S, this.hashAlg);\n\n // M = H(H(N) xor H(g), H(I), s, A, B, K)\n const hxor = H(this.hashAlg, this.N, this.N) ^ H(this.hashAlg, this.N, this.g);\n const buf =\n numToHex(hxor) +\n shaStr(username, this.hashAlg) +\n xsalt +\n this.A +\n xbb +\n this.K;\n const bytes = hexToBytes(buf);\n this.M = createHash(this.hashAlg).update(bytes).digest(\"hex\");\n\n // H_AMK = H(A, M, K)\n const amkBytes = hexToBytes(this.A + this.M + this.K);\n this.H_AMK = numToHex(\n BigInt(\"0x\" + createHash(this.hashAlg).update(amkBytes).digest(\"hex\"))\n );\n\n return this.M;\n }\n\n private calcX(username: string, password: string, xsalt: string): bigint {\n const spad = xsalt.length % 2 !== 0 ? \"0\" : \"\";\n const inner = shaStr(`${username}:${password}`, this.hashAlg);\n return BigInt(\"0x\" + shaHex(spad + xsalt + inner, this.hashAlg));\n }\n\n private calcXHex(xpassword: string, xsalt: string): bigint {\n // calc_x_hex: sha_hex(xsalt + sha_hex(\":\" hex + xpassword), hash)\n const colonHex = \":\".charCodeAt(0).toString(16);\n const inner = shaHex(colonHex + xpassword, this.hashAlg);\n return BigInt(\"0x\" + shaHex(xsalt + inner, this.hashAlg));\n }\n}\n\n// ── Apple PBKDF2 password derivation ───────────────────────────────────────\n\nexport function applePbkdf2(\n password: string,\n salt: Buffer,\n iterations: number,\n keyLength: number,\n protocol: string\n): Buffer {\n if (![\"s2k\", \"s2k_fo\"].includes(protocol)) {\n throw new Error(`Unsupported protocol '${protocol}' for pbkdf2`);\n }\n\n // First hash the password with SHA-256\n let passwordBytes: Buffer | string = createHash(\"sha256\").update(password).digest();\n\n if (protocol === \"s2k_fo\") {\n // Legacy: convert to hex string\n passwordBytes = passwordBytes.toString(\"hex\");\n }\n\n return pbkdf2Sync(passwordBytes, salt, iterations, keyLength, \"sha256\");\n}\n","/**\n * Apple ID Session Authentication\n * 1:1 port of Fastlane Spaceship client.rb + two_step_or_factor_client.rb\n *\n * Two flows:\n *\n * loginWithAppleId({ email, password, onPrompt })\n * - blocking, CLI-style. onPrompt is awaited to collect 2FA codes.\n *\n * beginLogin({ email, password }) → { kind: \"logged_in\" | \"needs_2fa\", ... }\n * submitTwoFactorCode({ pending, code, source, ... }) → AppleSession\n * requestSmsCode({ pending, phoneId, mode })\n * - HTTP-resumable. Used by the App Release wizard, where the 2FA\n * challenge is rendered in a browser modal and the code arrives in\n * a separate request.\n */\n\nimport { createHash } from \"node:crypto\";\nimport { createInterface } from \"node:readline\";\nimport { SRPClient, applePbkdf2 } from \"./srp.js\";\n\nconst AUTH_BASE = \"https://idmsa.apple.com/appleauth/auth\";\n\n/**\n * Apple's answer as JSON, or a readable error when it is not.\n *\n * Apple's sign-in endpoints sometimes answer with an HTML page rather than\n * JSON: a \"Service Unavailable\" or \"Access Denied\" page when it is refusing or\n * rate-limiting a server, a maintenance page, a redirect to a captcha. Parsed\n * blindly, the failure surfaced as `Unexpected token '<', \"<html> <he\"... is\n * not valid JSON`, which told the person at the dashboard nothing. This reads\n * the body as text first and, when it is not JSON, says what Apple actually\n * sent: the status, the page title, and what to do.\n */\nexport async function appleJson<T = any>(res: Response, what: string): Promise<T> {\n const text = await res.text();\n try {\n return JSON.parse(text) as T;\n } catch {\n const contentType = (res.headers.get(\"content-type\") ?? \"\").split(\";\")[0].trim();\n const title = /<title>([^<]{1,120})<\\/title>/i.exec(text)?.[1]?.trim();\n const looksHtml = /^\\s*<(!doctype|html)/i.test(text) || contentType === \"text/html\";\n const page = looksHtml ? \"an HTML page\" : contentType ? `a ${contentType} response` : \"a non-JSON response\";\n throw new Error(\n `Apple answered the ${what} with ${page} (HTTP ${res.status}${title ? `, \"${title}\"` : \"\"}) instead of JSON. ` +\n \"Apple is refusing or rate-limiting sign-ins from this server right now; wait a few minutes and try again. \" +\n \"If it keeps happening, sign in once at appleid.apple.com to clear any hold on the account.\",\n );\n }\n}\n\nconst OLYMPUS_SESSION = \"https://appstoreconnect.apple.com/olympus/v1/session\";\nconst WIDGET_KEY_URL = \"https://appstoreconnect.apple.com/olympus/v1/app/config?hostname=itunesconnect.apple.com\";\n\nexport interface AppleSessionConfig {\n email: string;\n password: string;\n onLog?: (msg: string) => void;\n onPrompt?: (msg: string) => Promise<string>;\n}\n\nexport interface ContractMessage {\n id: string;\n group: string;\n subject: string;\n message: string;\n}\n\nexport interface AppleSession {\n cookies: Record<string, string>;\n sessionId: string;\n scnt: string;\n serviceKey: string;\n userEmail: string;\n teamId?: string;\n pendingAgreements: ContractMessage[];\n}\n\n/**\n * State held between beginLogin() and submitTwoFactorCode() — captures\n * everything needed to resume an in-progress 2FA flow across HTTP requests.\n * Stored server-side keyed by an opaque session id; never sent to the\n * browser (the browser only sees the opaque id).\n */\nexport interface PendingLogin {\n cookies: Record<string, string>;\n sessionId: string;\n scnt: string;\n serviceKey: string;\n userEmail: string;\n}\n\n/**\n * Description of the 2FA challenge presented to the user.\n *\n * Modern 2FA accounts (the default for everyone) have `kind: \"device\"` —\n * Apple pushes the 6-digit code to all the user's trusted Apple devices\n * (iPhone, Mac, etc.) and the user types it into our wizard. The legacy\n * `trustedDevices` field is empty in this case; that field only ever\n * populates for old \"two-step verification\" accounts which are\n * essentially extinct.\n *\n * `kind: \"phone_only\"` is reserved for accounts that have no real Apple\n * devices (Apple's `noTrustedDevices === true` flag) — those accounts\n * must use SMS to a trusted phone number.\n *\n * Either way, the user can opt to receive the code via SMS instead by\n * picking from `trustedPhoneNumbers` and calling requestSmsCode().\n */\nexport interface TwoFactorChallenge {\n kind: \"device\" | \"phone_only\";\n codeLength: number;\n trustedPhoneNumbers: { id: number; numberWithDialCode: string; pushMode?: string }[];\n}\n\nexport type BeginLoginResult =\n | { kind: \"logged_in\"; session: AppleSession }\n | { kind: \"needs_2fa\"; pending: PendingLogin; challenge: TwoFactorChallenge };\n\n/** Thrown when an Apple Developer Program agreement needs to be accepted */\nexport class ProgramLicenseAgreementError extends Error {\n constructor(message: string, public agreements: ContractMessage[]) {\n super(message);\n this.name = \"ProgramLicenseAgreementError\";\n }\n}\n\n/**\n * Check a portal API response for agreement/license errors.\n * Throws ProgramLicenseAgreementError if detected.\n * Call this after any portal API call. Mirrors Spaceship::Client#handle_itc_response.\n */\nexport function checkPortalResponse(body: any, session?: AppleSession): void {\n if (!body || typeof body !== \"object\") return;\n\n // Result code 4100 = membership not eligible (often due to pending agreement)\n if (body.resultCode === 4100) {\n const userMsg = body.userString ?? \"The selected team does not have an eligible program membership.\";\n const agreements = session?.pendingAgreements ?? [];\n if (agreements.length > 0) {\n throw new ProgramLicenseAgreementError(\n `${userMsg}\\n\\n⚠ Pending agreement: ${agreements[0].subject}\\n` +\n `${agreements[0].message.replace(/<[^>]+>/g, \"\")}\\n\\n` +\n `Please accept the agreement at https://developer.apple.com/account before continuing.`,\n agreements\n );\n }\n throw new Error(userMsg);\n }\n\n // Explicit license agreement mention\n if ((body.userString ?? \"\").includes(\"Program License Agreement\")) {\n throw new ProgramLicenseAgreementError(\n `${body.userString} Please manually log into your Apple Developer account to review and accept the updated agreement.`,\n session?.pendingAgreements ?? []\n );\n }\n\n // Generic error with result code\n if (body.resultCode && body.resultCode !== 0) {\n const msg = body.userString || body.resultString || `Portal API error (code ${body.resultCode})`;\n throw new Error(msg);\n }\n}\n\n// ── Main Login (mirrors Spaceship::Client#send_shared_login_request) ───────\n\n/**\n * Step 1 of HTTP-resumable login: do the SIRP exchange and detect whether\n * 2FA is required. Returns either a fully-established session (no 2FA) or\n * a pending state + a description of the 2FA challenge.\n */\nexport async function beginLogin(config: {\n email: string;\n password: string;\n onLog?: (msg: string) => void;\n}): Promise<BeginLoginResult> {\n const log = config.onLog ?? (() => {});\n\n log(\"Fetching Apple service key...\");\n const serviceKey = await fetchServiceKey();\n\n const initRes = await fetch(`${AUTH_BASE}/signin?widgetKey=${serviceKey}`, {\n headers: { \"User-Agent\": \"Spaceship 2.225.0\" },\n });\n const initCookies = parseCookies(initRes.headers);\n\n const hcBits = initRes.headers.get(\"X-Apple-HC-Bits\");\n const hcChallenge = initRes.headers.get(\"X-Apple-HC-Challenge\");\n let hashcash: string | undefined;\n if (hcBits && hcChallenge) {\n log(\"Computing hashcash...\");\n hashcash = computeHashcash(parseInt(hcBits, 10), hcChallenge);\n }\n\n const cookieStr = Object.entries(initCookies)\n .map(([k, v]) => k.startsWith(\"DES\") ? `${k}=\"${v}\"` : `${k}=${v}`)\n .join(\"; \");\n\n log(\"Starting SIRP Apple ID login...\");\n const response = await doSirp(config.email, config.password, serviceKey, cookieStr, hashcash);\n\n const baseState = {\n cookies: { ...initCookies, ...response.cookies },\n sessionId: response.sessionId,\n scnt: response.scnt,\n serviceKey,\n userEmail: config.email,\n };\n\n if (response.status === 403) {\n throw new Error(`Invalid username and password combination. Used '${config.email}' as the username.`);\n }\n if (response.status === 412) {\n throw new Error(\"Need to acknowledge Apple's Apple ID and Privacy statement. Please manually log into https://appleid.apple.com.\");\n }\n\n if (response.status === 200) {\n log(\"Login successful (no 2FA).\");\n const session: AppleSession = { ...baseState, pendingAgreements: [] };\n await finalizeSession(session, log);\n return { kind: \"logged_in\", session };\n }\n\n if (response.status === 409) {\n log(\"2FA required, fetching challenge...\");\n const challenge = await fetchTwoFactorChallenge(baseState);\n return { kind: \"needs_2fa\", pending: baseState, challenge };\n }\n\n throw new Error(`Unexpected login response (${response.status}): ${JSON.stringify(response.body).slice(0, 500)}`);\n}\n\n/** Fetch the 2FA challenge (trusted phones + whether the user has Apple devices). */\nasync function fetchTwoFactorChallenge(pending: PendingLogin): Promise<TwoFactorChallenge> {\n const r = await fetch(`${AUTH_BASE}`, { headers: buildAuthHeadersFromPending(pending) });\n const body = await appleJson(r, \"two-factor challenge\");\n\n const trustedPhoneNumbers = (body.trustedPhoneNumbers ?? []).map((p: any) => ({\n id: p.id, numberWithDialCode: p.numberWithDialCode, pushMode: p.pushMode,\n }));\n // Apple sets `noTrustedDevices: true` when the user has no real Apple\n // devices to push the code to and must rely on SMS. Anything else means\n // we should default to \"enter the code from your device\".\n const phoneOnly = body.noTrustedDevices === true;\n const codeLength = body.securityCode?.length ?? 6;\n\n return {\n kind: phoneOnly ? \"phone_only\" : \"device\",\n codeLength,\n trustedPhoneNumbers,\n };\n}\n\n/**\n * Ask Apple to send an SMS / voice code to the chosen trusted phone.\n * Used by the wizard's \"Send code via text instead\" affordance.\n */\nexport async function requestSmsCode(input: {\n pending: PendingLogin;\n phoneId: number;\n mode?: \"sms\" | \"voice\";\n}): Promise<void> {\n await fetch(`${AUTH_BASE}/verify/phone`, {\n method: \"PUT\",\n headers: { ...buildAuthHeadersFromPending(input.pending), \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ phoneNumber: { id: input.phoneId }, mode: input.mode ?? \"sms\" }),\n });\n}\n\n/**\n * Step 2 of HTTP-resumable login: submit the 2FA code the user typed.\n * Returns a fully-established AppleSession on success.\n *\n * source = \"device\" → 4-digit code from a trusted Apple device\n * source = \"phone\" → 6-digit code from SMS / push to trusted phone\n */\nexport async function submitTwoFactorCode(rawInput: {\n pending: PendingLogin;\n code: string;\n source: \"device\" | \"phone\";\n phoneId?: number;\n mode?: \"sms\" | \"voice\";\n onLog?: (msg: string) => void;\n}): Promise<AppleSession> {\n // A code copied off a phone can carry a non-breaking space or a stray\n // newline; fastlane strips those too. Only the digits are the code.\n const input = { ...rawInput, code: rawInput.code.replace(/[\\s\\u00a0]+/g, \"\") };\n const log = input.onLog ?? (() => {});\n\n let path: string;\n let body: string;\n if (input.source === \"device\") {\n path = `${AUTH_BASE}/verify/trusteddevice/securitycode`;\n body = JSON.stringify({ securityCode: { code: input.code } });\n } else {\n if (input.phoneId == null) throw new Error(\"phoneId is required when source='phone'\");\n path = `${AUTH_BASE}/verify/phone/securitycode`;\n body = JSON.stringify({\n securityCode: { code: input.code },\n phoneNumber: { id: input.phoneId },\n mode: input.mode ?? \"sms\",\n });\n }\n\n log(\"Submitting 2FA code...\");\n const verifyRes = await fetch(path, {\n method: \"POST\",\n headers: { ...buildAuthHeadersFromPending(input.pending), \"Content-Type\": \"application/json\" },\n body,\n });\n if (!verifyRes.ok) {\n const err = await verifyRes.json().catch(() => ({})) as any;\n const msgs = (err?.service_errors ?? err?.serviceErrors ?? []).map((e: any) => e.message).filter(Boolean);\n throw new Error(msgs.join(\"; \") || `Verification failed (${verifyRes.status})`);\n }\n\n const session: AppleSession = {\n ...input.pending,\n cookies: { ...input.pending.cookies, ...parseCookies(verifyRes.headers) },\n pendingAgreements: [],\n };\n await trustSession(session);\n await finalizeSession(session, log);\n return session;\n}\n\n/** Fetch olympus session and pending agreements — the post-2FA finishing work. */\nasync function finalizeSession(session: AppleSession, log: (msg: string) => void): Promise<void> {\n await fetchOlympusSession(session);\n const agreements = await fetchContractMessages(session);\n if (agreements.length > 0) {\n for (const msg of agreements) {\n log(`⚠ ${msg.subject}: ${msg.message.replace(/<[^>]+>/g, \"\")}`);\n }\n }\n session.pendingAgreements = agreements;\n log(`Logged in as ${session.userEmail}`);\n}\n\n/**\n * Backward-compatible CLI-style login. Internally uses beginLogin +\n * submitTwoFactorCode but routes 2FA through the synchronous onPrompt\n * callback so existing scripts (test-login.ts, test-full-workflow.ts)\n * keep working.\n */\nexport async function loginWithAppleId(config: AppleSessionConfig): Promise<AppleSession> {\n const log = config.onLog ?? console.log;\n const promptFn = config.onPrompt ?? defaultPrompt;\n\n const result = await beginLogin({ email: config.email, password: config.password, onLog: log });\n if (result.kind === \"logged_in\") return result.session;\n\n const { pending, challenge } = result;\n const phones = challenge.trustedPhoneNumbers;\n\n if (challenge.kind === \"device\") {\n log(\"Two-factor Authentication (6 digit code) is enabled for this account\");\n log(\"(Input 'sms' to escape this prompt and select a trusted phone number to send the code as a text message)\");\n const input = await promptFn(`Please enter the ${challenge.codeLength} digit code: `);\n if (input.toLowerCase() === \"sms\") {\n log(\"Please select a trusted phone number:\");\n for (let i = 0; i < phones.length; i++) log(` ${i + 1}. ${phones[i].numberWithDialCode}`);\n const choice = await promptFn(\"Enter number: \");\n const phone = phones[Math.max(0, parseInt(choice, 10) - 1)] ?? phones[0];\n await requestSmsCode({ pending, phoneId: phone.id, mode: phone.pushMode as any });\n log(`Code sent to ${phone.numberWithDialCode}`);\n const code = await promptFn(`Please enter the ${challenge.codeLength} digit code: `);\n return submitTwoFactorCode({ pending, code, source: \"phone\", phoneId: phone.id, mode: phone.pushMode as any ?? \"sms\", onLog: log });\n }\n return submitTwoFactorCode({ pending, code: input, source: \"device\", onLog: log });\n }\n\n // phone_only — account has no trusted Apple devices, must use SMS\n log(\"Two-factor Authentication (6 digit code) is enabled for this account\");\n if (phones.length === 1) {\n const phone = phones[0];\n log(`Code automatically sent to ${phone.numberWithDialCode}`);\n const code = await promptFn(`Please enter the ${challenge.codeLength} digit code: `);\n return submitTwoFactorCode({ pending, code, source: \"phone\", phoneId: phone.id, mode: phone.pushMode as any ?? \"sms\", onLog: log });\n }\n log(\"Please select a trusted phone number:\");\n for (let i = 0; i < phones.length; i++) log(` ${i + 1}. ${phones[i].numberWithDialCode}`);\n const choice = await promptFn(\"Enter number: \");\n const phone = phones[Math.max(0, parseInt(choice, 10) - 1)] ?? phones[0];\n await requestSmsCode({ pending, phoneId: phone.id, mode: phone.pushMode as any });\n log(`Code sent to ${phone.numberWithDialCode}`);\n const code = await promptFn(`Please enter the ${challenge.codeLength} digit code: `);\n return submitTwoFactorCode({ pending, code, source: \"phone\", phoneId: phone.id, mode: phone.pushMode as any ?? \"sms\", onLog: log });\n}\n\nfunction buildAuthHeadersFromPending(pending: PendingLogin): Record<string, string> {\n const h: Record<string, string> = { \"X-Apple-Widget-Key\": pending.serviceKey, Accept: \"application/json\" };\n if (pending.sessionId) h[\"X-Apple-Id-Session-Id\"] = pending.sessionId;\n if (pending.scnt) h[\"scnt\"] = pending.scnt;\n const c = Object.entries(pending.cookies).map(([k, v]) => `${k}=${v}`).join(\"; \");\n if (c) h[\"Cookie\"] = c;\n return h;\n}\n\n// ── SIRP Auth (1:1 port of Spaceship::Client#do_sirp) ──────────────────────\n\nasync function doSirp(\n user: string, password: string, serviceKey: string, cookieStr: string, hashcash?: string\n): Promise<{ status: number; body: any; cookies: Record<string, string>; sessionId: string; scnt: string }> {\n const client = new SRPClient(2048);\n const A = client.startAuthentication();\n const aBase64 = Buffer.from(A, \"hex\").toString(\"base64\");\n\n const baseHeaders: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n \"X-Requested-With\": \"XMLHttpRequest\",\n \"X-Apple-Widget-Key\": serviceKey,\n Accept: \"application/json, text/javascript\",\n };\n if (cookieStr) baseHeaders[\"Cookie\"] = cookieStr;\n\n // Step 1: signin/init\n const initRes = await fetch(`${AUTH_BASE}/signin/init`, {\n method: \"POST\",\n headers: baseHeaders,\n body: JSON.stringify({ a: aBase64, accountName: user, protocols: [\"s2k\", \"s2k_fo\"] }),\n redirect: \"manual\",\n });\n const initBody = await appleJson(initRes, \"sign-in init\");\n if (initBody.serviceErrors) throw new Error(`Apple auth error: ${JSON.stringify(initBody.serviceErrors)}`);\n\n const { iteration: iterations, salt: saltB64, b: bB64, c, protocol } = initBody;\n // The shape fastlane's spaceship checks since its January 2026 hardening:\n // a 200 with JSON that is not the challenge (a rate-limit notice, an empty\n // object) used to fail deeper down as a Buffer of \"undefined\".\n if (!iterations || !saltB64 || !bB64 || !c || !protocol) {\n throw new Error(`Apple's sign-in init answered without a challenge (HTTP ${initRes.status}): ${JSON.stringify(initBody).slice(0, 300)}`);\n }\n const salt = Buffer.from(saltB64, \"base64\");\n const b = Buffer.from(bB64, \"base64\");\n\n // Derive password (mirrors Spaceship::Client#pbkdf2)\n const encryptedPassword = applePbkdf2(password, salt, iterations, 32, protocol);\n\n // Process SRP challenge\n const m1 = client.processChallenge(user, encryptedPassword.toString(\"hex\"), salt.toString(\"hex\"), b.toString(\"hex\"), true);\n if (m1 === false) throw new Error(\"Error processing SIRP challenge\");\n const m2 = client.H_AMK;\n\n // Step 2: signin/complete\n const completeHeaders = { ...baseHeaders };\n if (hashcash) completeHeaders[\"X-Apple-HC\"] = hashcash;\n\n const completeRes = await fetch(`${AUTH_BASE}/signin/complete?isRememberMeEnabled=false`, {\n method: \"POST\",\n headers: completeHeaders,\n body: JSON.stringify({\n accountName: user,\n c,\n m1: Buffer.from(m1, \"hex\").toString(\"base64\"),\n m2: m2 ? Buffer.from(m2, \"hex\").toString(\"base64\") : \"\",\n rememberMe: false,\n }),\n redirect: \"manual\",\n });\n\n let body: any;\n try { body = await completeRes.json(); } catch { body = \"\"; }\n\n return {\n status: completeRes.status,\n body,\n cookies: parseCookies(completeRes.headers),\n sessionId: completeRes.headers.get(\"x-apple-id-session-id\") ?? \"\",\n scnt: completeRes.headers.get(\"scnt\") ?? \"\",\n };\n}\n\n// ── Helpers ────────────────────────────────────────────────────────────────\n\nasync function trustSession(session: AppleSession): Promise<void> {\n const r = await fetch(`${AUTH_BASE}/2sv/trust`, { headers: buildAuthHeaders(session) });\n Object.assign(session.cookies, parseCookies(r.headers));\n}\n\nasync function fetchOlympusSession(session: AppleSession): Promise<void> {\n const cookieStr = Object.entries(session.cookies).map(([k, v]) => `${k}=${v}`).join(\"; \");\n const res = await fetch(OLYMPUS_SESSION, { headers: { Cookie: cookieStr, Accept: \"application/json\" } });\n if (res.ok) {\n const body = await appleJson(res, \"session lookup\");\n if (body?.user?.emailAddress) session.userEmail = body.user.emailAddress;\n if (body?.provider?.providerId) session.teamId = String(body.provider.providerId);\n }\n}\n\n// ── Contract Messages (mirrors fetch_program_license_agreement_messages) ────\n\nasync function fetchContractMessages(session: AppleSession): Promise<ContractMessage[]> {\n const cookieStr = Object.entries(session.cookies).map(([k, v]) => `${k}=${v}`).join(\"; \");\n try {\n const res = await fetch(\"https://appstoreconnect.apple.com/olympus/v1/contractMessages\", {\n headers: { Cookie: cookieStr, Accept: \"application/json\" },\n });\n if (!res.ok) return [];\n const body = await appleJson<any[]>(res, \"agreements lookup\");\n return (body ?? []).map((m: any) => ({\n id: m.id ?? \"\",\n group: m.group ?? \"\",\n subject: m.subject ?? \"\",\n message: m.message ?? \"\",\n }));\n } catch {\n return [];\n }\n}\n\n/** Where App Store Connect sends a signed-out browser: the widget key rides on that redirect. */\nconst LOGOUT_URL = \"https://appstoreconnect.apple.com/logout\";\n\n/**\n * The widget key out of the sign-out redirect, or null.\n *\n * `https://idmsa.apple.com/appleauth/signout?widgetKey=<key>&asop=…` is the\n * Location a HEAD to /logout answers with, and the key on it is the same\n * X-Apple-Widget-Key the sign-in needs.\n */\nexport function serviceKeyFromLocation(location: string | null | undefined): string | null {\n if (!location) return null;\n try {\n const key = new URL(location).searchParams.get(\"widgetKey\")?.trim();\n return key && /^[0-9a-f]{16,}$/i.test(key) ? key : null;\n } catch {\n return null;\n }\n}\n\n/**\n * The X-Apple-Widget-Key the sign-in needs.\n *\n * Read from the sign-out redirect first, the way fastlane's spaceship does\n * since September 2026 (\"Read the App Store Connect API key from where Apple\n * keeps it now\"): the olympus config endpoint this used to call answers 404\n * with an HTML page now, which surfaced at the dashboard as `Unexpected\n * token '<'`. The config endpoint is kept as the fallback, read safely.\n */\nexport async function fetchServiceKey(fetchImpl: typeof fetch = fetch): Promise<string> {\n const head = await fetchImpl(LOGOUT_URL, { method: \"HEAD\", redirect: \"manual\" });\n const fromRedirect = serviceKeyFromLocation(head.headers.get(\"location\"));\n if (fromRedirect) return fromRedirect;\n\n const res = await fetchImpl(WIDGET_KEY_URL);\n const body = await appleJson(res, \"service key request\");\n if (!body?.authServiceKey) throw new Error(\"Could not fetch Apple service key: the sign-out redirect carried no widgetKey and the config endpoint had no authServiceKey.\");\n return body.authServiceKey as string;\n}\n\nfunction buildAuthHeaders(session: AppleSession): Record<string, string> {\n const h: Record<string, string> = { \"X-Apple-Widget-Key\": session.serviceKey, Accept: \"application/json\" };\n if (session.sessionId) h[\"X-Apple-Id-Session-Id\"] = session.sessionId;\n if (session.scnt) h[\"scnt\"] = session.scnt;\n const c = Object.entries(session.cookies).map(([k, v]) => `${k}=${v}`).join(\"; \");\n if (c) h[\"Cookie\"] = c;\n return h;\n}\n\nfunction parseCookies(headers: Headers): Record<string, string> {\n const cookies: Record<string, string> = {};\n for (const raw of headers.getSetCookie?.() ?? []) {\n const m = raw.match(/^([^=]+)=([^;]*)/);\n if (m) cookies[m[1]] = m[2];\n }\n return cookies;\n}\n\nfunction computeHashcash(bits: number, challenge: string): string {\n const date = new Date().toISOString().replace(/[-:T]/g, \"\").slice(0, 12);\n let counter = 0;\n while (true) {\n const stamp = `1:${bits}:${date}:${challenge}::${counter.toString(36)}:`;\n const hash = createHash(\"sha1\").update(stamp).digest();\n let zeroBits = 0;\n for (const byte of hash) {\n if (byte === 0) { zeroBits += 8; } else { zeroBits += Math.clz32(byte) - 24; break; }\n if (zeroBits >= bits) break;\n }\n if (zeroBits >= bits) return stamp;\n counter++;\n }\n}\n\nasync function defaultPrompt(message: string): Promise<string> {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((r) => { rl.question(message, (a) => { rl.close(); r(a.trim()); }); });\n}\n","import type { TokenManager } from \"./auth.js\";\nimport { ProgramLicenseAgreementError } from \"./apple-session.js\";\nimport type {\n JsonApiErrorResponse,\n JsonApiListResponse,\n JsonApiResponse,\n ListParams,\n RequestOptions,\n} from \"./types.js\";\n\nconst PRODUCTION_BASE = \"https://api.appstoreconnect.apple.com\";\nconst ENTERPRISE_BASE = \"https://api.enterprise.developer.apple.com\";\n\nconst MAX_RETRIES = 5;\nconst INITIAL_BACKOFF_MS = 1000;\nconst MAX_BACKOFF_MS = 60_000;\n/** Fastlane's TooManyRequestsError gives up after 3600s cumulative backoff. */\nconst MAX_RATE_LIMIT_BACKOFF_MS = 3_600_000;\n\nexport class AppStoreConnectError extends Error {\n constructor(\n message: string,\n public status: number,\n public errors: JsonApiErrorResponse[\"errors\"] = []\n ) {\n super(message);\n this.name = \"AppStoreConnectError\";\n }\n}\n\nexport class RateLimitError extends AppStoreConnectError {\n constructor(public retryAfter: number) {\n super(`Rate limited. Retry after ${retryAfter}s`, 429);\n this.name = \"RateLimitError\";\n }\n}\n\nexport class RequestClient {\n private baseUrl: string;\n private tokenManager: TokenManager;\n\n constructor(tokenManager: TokenManager, enterprise = false) {\n this.tokenManager = tokenManager;\n this.baseUrl = enterprise ? ENTERPRISE_BASE : PRODUCTION_BASE;\n }\n\n async request<T>(path: string, options: RequestOptions = {}): Promise<T> {\n const { method = \"GET\", body, params, headers: extraHeaders } = options;\n\n let url = `${this.baseUrl}${path}`;\n if (params) {\n const searchParams = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined) continue;\n if (Array.isArray(value)) {\n searchParams.set(key, value.join(\",\"));\n } else {\n searchParams.set(key, String(value));\n }\n }\n const qs = searchParams.toString();\n if (qs) url += `?${qs}`;\n }\n\n let lastError: Error | null = null;\n // Soft-cumulative backoff for 429 that doubles on each hit, mirroring\n // Fastlane's Spaceship::ConnectAPI::APIClient#with_asc_retry 429 handler:\n // `Kernel.sleep(backoff); backoff *= 2`, giving up past 3600s.\n let rateLimitBackoffMs = INITIAL_BACKOFF_MS;\n\n for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {\n const token = await this.tokenManager.getToken();\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n ...extraHeaders,\n };\n\n const res = await fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (res.ok) {\n if (res.status === 204) return undefined as T;\n return (await res.json()) as T;\n }\n\n // Handle 401 — refresh token and retry once\n if (res.status === 401 && attempt === 0) {\n this.tokenManager.invalidate();\n continue;\n }\n\n // Handle 429 — rate limit. Prefer server's Retry-After header when\n // provided, otherwise fall back to Fastlane's doubling backoff.\n if (res.status === 429) {\n if (rateLimitBackoffMs > MAX_RATE_LIMIT_BACKOFF_MS) {\n throw new RateLimitError(Math.floor(rateLimitBackoffMs / 1000));\n }\n const retryAfterHeader = res.headers.get(\"Retry-After\");\n const sleepMs = retryAfterHeader\n ? parseInt(retryAfterHeader, 10) * 1000\n : rateLimitBackoffMs;\n await sleep(sleepMs);\n rateLimitBackoffMs *= 2;\n continue;\n }\n\n // Parse error body early so we can inspect it for 403/502 special cases.\n const errorBody = await res.json().catch(() => null);\n const errors = (errorBody as JsonApiErrorResponse)?.errors || [];\n\n // Handle 403 — detect missing/expired program license agreement.\n // Mirrors api_client.rb's ProgramLicenseAgreementUpdated branch.\n if (res.status === 403) {\n const firstCode = errors[0]?.code;\n if (firstCode === \"FORBIDDEN.REQUIRED_AGREEMENTS_MISSING_OR_EXPIRED\") {\n const detail =\n errors.map((e) => e.detail || e.title).join(\"; \") ||\n \"Required agreements are missing or expired.\";\n throw new ProgramLicenseAgreementError(\n `${detail} Please manually log into your Apple Developer account to review and accept the updated agreement.`,\n []\n );\n }\n }\n\n // Handle 502 — special-case \"Could not process this request\" retry.\n // Mirrors api_client.rb's BadGatewayError branch (issue fastlane#19264).\n if (res.status === 502 && attempt < MAX_RETRIES) {\n const bodyText = errorBody ? JSON.stringify(errorBody) : \"\";\n if (bodyText.includes(\"Could not process this request\")) {\n const backoff = Math.min(\n INITIAL_BACKOFF_MS * Math.pow(2, attempt),\n MAX_BACKOFF_MS\n );\n await sleep(backoff + Math.random() * 500);\n continue;\n }\n }\n\n // Handle 5xx — retry with exponential backoff\n if (res.status >= 500 && attempt < MAX_RETRIES) {\n const backoff = Math.min(\n INITIAL_BACKOFF_MS * Math.pow(2, attempt),\n MAX_BACKOFF_MS\n );\n await sleep(backoff + Math.random() * 500);\n continue;\n }\n\n const detail = errors.map((e) => e.detail || e.title).join(\"; \") || `HTTP ${res.status}`;\n\n lastError = new AppStoreConnectError(detail, res.status, errors);\n break;\n }\n\n throw lastError || new Error(\"Request failed after retries\");\n }\n\n async get<T>(path: string, params?: Record<string, string | string[] | number | undefined>): Promise<T> {\n return this.request<T>(path, { method: \"GET\", params });\n }\n\n async post<T>(path: string, body: unknown): Promise<T> {\n return this.request<T>(path, { method: \"POST\", body });\n }\n\n async patch<T>(path: string, body: unknown): Promise<T> {\n return this.request<T>(path, { method: \"PATCH\", body });\n }\n\n async delete(path: string): Promise<void> {\n await this.request(path, { method: \"DELETE\" });\n }\n\n // Build query params from ListParams\n buildListParams(params: ListParams): Record<string, string | undefined> {\n const result: Record<string, string | undefined> = {};\n\n if (params.filter) {\n for (const [key, value] of Object.entries(params.filter)) {\n result[`filter[${key}]`] = Array.isArray(value) ? value.join(\",\") : value;\n }\n }\n\n if (params.include) {\n result[\"include\"] = params.include;\n }\n\n if (params.fields) {\n for (const [key, value] of Object.entries(params.fields)) {\n result[`fields[${key}]`] = value;\n }\n }\n\n if (params.limit !== undefined) {\n result[\"limit\"] = String(params.limit);\n }\n\n if (params.sort) {\n result[\"sort\"] = params.sort;\n }\n\n if (params.cursor) {\n // ASC uses page[after] for cursor pagination\n result[\"page[after]\"] = params.cursor;\n }\n\n return result;\n }\n\n async list<T>(path: string, params: ListParams = {}): Promise<JsonApiListResponse<T>> {\n const queryParams = this.buildListParams(params);\n return this.get<JsonApiListResponse<T>>(path, queryParams);\n }\n\n async *paginate<T>(path: string, params: ListParams = {}): AsyncGenerator<T, void, undefined> {\n let cursor: string | undefined = params.cursor;\n\n while (true) {\n const response = await this.list<T>(path, { ...params, cursor });\n\n for (const item of response.data) {\n yield item;\n }\n\n // Check for next page\n const nextLink = response.links?.next;\n if (!nextLink) break;\n\n // Extract cursor from next link\n const nextUrl = new URL(nextLink);\n cursor = nextUrl.searchParams.get(\"page[after]\") || undefined;\n if (!cursor) break;\n }\n }\n\n async all<T>(path: string, params: ListParams = {}): Promise<T[]> {\n const results: T[] = [];\n for await (const item of this.paginate<T>(path, params)) {\n results.push(item);\n }\n return results;\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiListResponse, JsonApiResponse, ListParams } from \"../client/types.js\";\nimport type { Certificate } from \"../types/certificate.js\";\nimport type { CertificateType } from \"../types/enums.js\";\n\nexport class CertificatesResource {\n constructor(private http: RequestClient) {}\n\n async list(params?: {\n filter?: {\n certificateType?: CertificateType | CertificateType[];\n serialNumber?: string;\n displayName?: string;\n id?: string | string[];\n };\n fields?: string[];\n limit?: number;\n sort?: string;\n }): Promise<Certificate[]> {\n const listParams: ListParams = {\n filter: params?.filter as Record<string, string | string[]>,\n limit: params?.limit ?? 200,\n sort: params?.sort,\n };\n if (params?.fields) {\n listParams.fields = { certificates: params.fields.join(\",\") };\n }\n return this.http.all<Certificate>(\"/v1/certificates\", listParams);\n }\n\n async get(id: string): Promise<Certificate> {\n const response = await this.http.get<JsonApiResponse<Certificate>>(\n `/v1/certificates/${id}`\n );\n return response.data;\n }\n\n async create(params: {\n certificateType: CertificateType;\n csrContent: string;\n }): Promise<Certificate> {\n const response = await this.http.post<JsonApiResponse<Certificate>>(\n \"/v1/certificates\",\n {\n data: {\n type: \"certificates\",\n attributes: {\n certificateType: params.certificateType,\n csrContent: params.csrContent,\n },\n },\n }\n );\n return response.data;\n }\n\n async revoke(id: string): Promise<void> {\n await this.http.delete(`/v1/certificates/${id}`);\n }\n\n async *paginate(params?: {\n filter?: {\n certificateType?: CertificateType | CertificateType[];\n };\n limit?: number;\n }): AsyncGenerator<Certificate> {\n const listParams: ListParams = {\n filter: params?.filter as Record<string, string | string[]>,\n limit: params?.limit ?? 200,\n };\n yield* this.http.paginate<Certificate>(\"/v1/certificates\", listParams);\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResponse, ListParams } from \"../client/types.js\";\nimport type { Profile } from \"../types/profile.js\";\nimport type { Certificate } from \"../types/certificate.js\";\nimport type { Device } from \"../types/device.js\";\nimport type { BundleId } from \"../types/bundle-id.js\";\nimport type { ProfileType, ProfileState } from \"../types/enums.js\";\n\nexport class ProfilesResource {\n constructor(private http: RequestClient) {}\n\n async list(params?: {\n filter?: {\n profileType?: ProfileType | ProfileType[];\n profileState?: ProfileState;\n name?: string;\n id?: string | string[];\n };\n include?: string;\n fields?: { profiles?: string[]; certificates?: string[]; devices?: string[]; bundleIds?: string[] };\n limit?: number;\n sort?: string;\n }): Promise<Profile[]> {\n const listParams: ListParams = {\n filter: params?.filter as Record<string, string | string[]>,\n include: params?.include,\n limit: params?.limit ?? 200,\n sort: params?.sort,\n };\n if (params?.fields) {\n listParams.fields = {};\n for (const [key, value] of Object.entries(params.fields)) {\n if (value) listParams.fields[key] = value.join(\",\");\n }\n }\n return this.http.all<Profile>(\"/v1/profiles\", listParams);\n }\n\n async get(id: string, params?: { include?: string }): Promise<Profile> {\n const queryParams: Record<string, string | undefined> = {};\n if (params?.include) queryParams[\"include\"] = params.include;\n const response = await this.http.get<JsonApiResponse<Profile>>(\n `/v1/profiles/${id}`,\n queryParams\n );\n return response.data;\n }\n\n async create(params: {\n name: string;\n profileType: ProfileType;\n bundleIdId: string;\n certificateIds: string[];\n deviceIds?: string[];\n }): Promise<Profile> {\n const relationships: Record<string, unknown> = {\n bundleId: {\n data: { type: \"bundleIds\", id: params.bundleIdId },\n },\n certificates: {\n data: params.certificateIds.map((id) => ({\n type: \"certificates\",\n id,\n })),\n },\n };\n\n if (params.deviceIds && params.deviceIds.length > 0) {\n relationships.devices = {\n data: params.deviceIds.map((id) => ({\n type: \"devices\",\n id,\n })),\n };\n }\n\n const response = await this.http.post<JsonApiResponse<Profile>>(\n \"/v1/profiles\",\n {\n data: {\n type: \"profiles\",\n attributes: {\n name: params.name,\n profileType: params.profileType,\n },\n relationships,\n },\n }\n );\n return response.data;\n }\n\n async delete(id: string): Promise<void> {\n await this.http.delete(`/v1/profiles/${id}`);\n }\n\n async getCertificates(profileId: string): Promise<Certificate[]> {\n return this.http.all<Certificate>(\n `/v1/profiles/${profileId}/certificates`\n );\n }\n\n async getDevices(profileId: string): Promise<Device[]> {\n return this.http.all<Device>(`/v1/profiles/${profileId}/devices`);\n }\n\n async getBundleId(profileId: string): Promise<BundleId> {\n const response = await this.http.get<JsonApiResponse<BundleId>>(\n `/v1/profiles/${profileId}/bundleId`\n );\n return response.data;\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResponse, ListParams } from \"../client/types.js\";\nimport type { BundleId } from \"../types/bundle-id.js\";\nimport type { BundleIdCapability } from \"../types/capability.js\";\nimport type { BundleIdPlatform } from \"../types/enums.js\";\n\nexport class BundleIdsResource {\n constructor(private http: RequestClient) {}\n\n async list(params?: {\n filter?: {\n identifier?: string;\n name?: string;\n platform?: BundleIdPlatform;\n seedId?: string;\n id?: string | string[];\n };\n include?: string;\n fields?: { bundleIds?: string[]; bundleIdCapabilities?: string[] };\n limit?: number;\n sort?: string;\n }): Promise<BundleId[]> {\n const listParams: ListParams = {\n filter: params?.filter as Record<string, string | string[]>,\n include: params?.include,\n limit: params?.limit ?? 200,\n sort: params?.sort,\n };\n if (params?.fields) {\n listParams.fields = {};\n for (const [key, value] of Object.entries(params.fields)) {\n if (value) listParams.fields[key] = value.join(\",\");\n }\n }\n return this.http.all<BundleId>(\"/v1/bundleIds\", listParams);\n }\n\n async get(id: string, params?: { include?: string }): Promise<BundleId> {\n const queryParams: Record<string, string | undefined> = {};\n if (params?.include) queryParams[\"include\"] = params.include;\n const response = await this.http.get<JsonApiResponse<BundleId>>(\n `/v1/bundleIds/${id}`,\n queryParams\n );\n return response.data;\n }\n\n async create(params: {\n identifier: string;\n name: string;\n platform: BundleIdPlatform;\n seedId?: string;\n }): Promise<BundleId> {\n const attributes: Record<string, unknown> = {\n identifier: params.identifier,\n name: params.name,\n platform: params.platform,\n };\n if (params.seedId) attributes.seedId = params.seedId;\n\n const response = await this.http.post<JsonApiResponse<BundleId>>(\n \"/v1/bundleIds\",\n {\n data: {\n type: \"bundleIds\",\n attributes,\n },\n }\n );\n return response.data;\n }\n\n async find(identifier: string): Promise<BundleId | null> {\n const results = await this.list({\n filter: { identifier },\n limit: 1,\n });\n return results[0] ?? null;\n }\n\n async getCapabilities(bundleIdId: string): Promise<BundleIdCapability[]> {\n return this.http.all<BundleIdCapability>(\n `/v1/bundleIds/${bundleIdId}/bundleIdCapabilities`\n );\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResponse, ListParams } from \"../client/types.js\";\nimport type { Device } from \"../types/device.js\";\nimport type { DeviceStatus, Platform } from \"../types/enums.js\";\n\nexport class DevicesResource {\n constructor(private http: RequestClient) {}\n\n async list(params?: {\n filter?: {\n name?: string;\n platform?: Platform | Platform[];\n status?: DeviceStatus;\n udid?: string;\n id?: string | string[];\n };\n fields?: string[];\n limit?: number;\n sort?: string;\n }): Promise<Device[]> {\n const listParams: ListParams = {\n filter: params?.filter as Record<string, string | string[]>,\n limit: params?.limit ?? 200,\n sort: params?.sort,\n };\n if (params?.fields) {\n listParams.fields = { devices: params.fields.join(\",\") };\n }\n return this.http.all<Device>(\"/v1/devices\", listParams);\n }\n\n async get(id: string): Promise<Device> {\n const response = await this.http.get<JsonApiResponse<Device>>(\n `/v1/devices/${id}`\n );\n return response.data;\n }\n\n async register(params: {\n name: string;\n platform: Platform;\n udid: string;\n }): Promise<Device> {\n const response = await this.http.post<JsonApiResponse<Device>>(\n \"/v1/devices\",\n {\n data: {\n type: \"devices\",\n attributes: {\n name: params.name,\n platform: params.platform,\n udid: params.udid,\n },\n },\n }\n );\n return response.data;\n }\n\n async update(\n id: string,\n params: { name?: string; status?: DeviceStatus }\n ): Promise<Device> {\n const response = await this.http.patch<JsonApiResponse<Device>>(\n `/v1/devices/${id}`,\n {\n data: {\n type: \"devices\",\n id,\n attributes: params,\n },\n }\n );\n return response.data;\n }\n\n async findByUdid(udid: string): Promise<Device | null> {\n const results = await this.list({ filter: { udid }, limit: 1 });\n return results[0] ?? null;\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResponse, ListParams } from \"../client/types.js\";\nimport type { App } from \"../types/app.js\";\n\nexport class AppsResource {\n constructor(private http: RequestClient) {}\n\n async list(params?: {\n filter?: {\n bundleId?: string;\n name?: string;\n sku?: string;\n id?: string | string[];\n };\n include?: string;\n fields?: { apps?: string[] };\n limit?: number;\n sort?: string;\n }): Promise<App[]> {\n const listParams: ListParams = {\n filter: params?.filter as Record<string, string | string[]>,\n include: params?.include,\n limit: params?.limit ?? 200,\n sort: params?.sort,\n };\n if (params?.fields) {\n listParams.fields = {};\n for (const [key, value] of Object.entries(params.fields)) {\n if (value) listParams.fields[key] = value.join(\",\");\n }\n }\n return this.http.all<App>(\"/v1/apps\", listParams);\n }\n\n async get(id: string, params?: { include?: string }): Promise<App> {\n const queryParams: Record<string, string | undefined> = {};\n if (params?.include) queryParams[\"include\"] = params.include;\n const response = await this.http.get<JsonApiResponse<App>>(\n `/v1/apps/${id}`,\n queryParams\n );\n return response.data;\n }\n\n async findByBundleId(bundleId: string): Promise<App | null> {\n const results = await this.list({\n filter: { bundleId },\n limit: 1,\n });\n return results[0] ?? null;\n }\n\n /**\n * Create an App Store Connect **app record** (the thing that shows up\n * under \"My Apps\" and that TestFlight / App Store uploads require).\n *\n * This is distinct from registering an App ID in the Developer Portal —\n * you need BOTH. The Developer Portal App ID unlocks provisioning\n * profiles and entitlements; the App Store Connect app record unlocks\n * uploads. `upload_to_testflight` fails with \"Couldn't find app\n * 'com.foo.bar' on the account…\" when this record is missing.\n *\n * `bundleIdId` is the REST API primary key of the bundle id resource\n * (not the identifier string) — fetch it via `bundleIds.find(identifier)`\n * or from the response of `bundleIds.create()`.\n *\n * `sku` is an arbitrary unique string Apple uses to identify the app in\n * their internal records. If you don't have a meaningful one, pass the\n * bundle identifier itself or append a timestamp for uniqueness.\n */\n async create(params: {\n bundleIdentifier: string;\n bundleIdId: string;\n appName: string;\n sku: string;\n primaryLocale?: string;\n }): Promise<App> {\n const response = await this.http.post<JsonApiResponse<App>>(\"/v1/apps\", {\n data: {\n type: \"apps\",\n attributes: {\n bundleId: params.bundleIdentifier,\n name: params.appName,\n sku: params.sku,\n primaryLocale: params.primaryLocale ?? \"en-US\",\n },\n relationships: {\n bundleId: {\n data: { type: \"bundleIds\", id: params.bundleIdId },\n },\n },\n },\n });\n return response.data;\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiListResponse, JsonApiResponse, ListParams } from \"../client/types.js\";\nimport type {\n Build,\n BetaBuildLocalization,\n BuildBetaDetail,\n PreReleaseVersion,\n} from \"../types/build.js\";\n\nexport class BuildsResource {\n constructor(private http: RequestClient) {}\n\n async list(params?: {\n filter?: {\n app?: string;\n version?: string;\n processingState?: string;\n \"preReleaseVersion.version\"?: string;\n expired?: string;\n id?: string | string[];\n };\n include?: string;\n fields?: { builds?: string[] };\n limit?: number;\n sort?: string;\n }): Promise<Build[]> {\n const listParams: ListParams = {\n filter: params?.filter as Record<string, string | string[]>,\n include: params?.include,\n limit: params?.limit ?? 200,\n sort: params?.sort,\n };\n if (params?.fields) {\n listParams.fields = {};\n for (const [key, value] of Object.entries(params.fields)) {\n if (value) listParams.fields[key] = value.join(\",\");\n }\n }\n return this.http.all<Build>(\"/v1/builds\", listParams);\n }\n\n async get(id: string, params?: { include?: string }): Promise<Build> {\n const queryParams: Record<string, string | undefined> = {};\n if (params?.include) queryParams[\"include\"] = params.include;\n const response = await this.http.get<JsonApiResponse<Build>>(\n `/v1/builds/${id}`,\n queryParams\n );\n return response.data;\n }\n\n async getBetaDetail(buildId: string): Promise<BuildBetaDetail> {\n const response = await this.http.get<JsonApiResponse<BuildBetaDetail>>(\n `/v1/builds/${buildId}/buildBetaDetail`\n );\n return response.data;\n }\n\n async getLocalizations(buildId: string): Promise<BetaBuildLocalization[]> {\n return this.http.all<BetaBuildLocalization>(\n `/v1/builds/${buildId}/betaBuildLocalizations`\n );\n }\n\n async createLocalization(params: {\n buildId: string;\n locale: string;\n whatsNew: string;\n }): Promise<BetaBuildLocalization> {\n const response = await this.http.post<\n JsonApiResponse<BetaBuildLocalization>\n >(\"/v1/betaBuildLocalizations\", {\n data: {\n type: \"betaBuildLocalizations\",\n attributes: {\n locale: params.locale,\n whatsNew: params.whatsNew,\n },\n relationships: {\n build: {\n data: { type: \"builds\", id: params.buildId },\n },\n },\n },\n });\n return response.data;\n }\n\n async updateLocalization(\n localizationId: string,\n params: { whatsNew: string }\n ): Promise<BetaBuildLocalization> {\n const response = await this.http.patch<\n JsonApiResponse<BetaBuildLocalization>\n >(`/v1/betaBuildLocalizations/${localizationId}`, {\n data: {\n type: \"betaBuildLocalizations\",\n id: localizationId,\n attributes: {\n whatsNew: params.whatsNew,\n },\n },\n });\n return response.data;\n }\n\n async getPreReleaseVersion(buildId: string): Promise<PreReleaseVersion | null> {\n try {\n const response = await this.http.get<JsonApiResponse<PreReleaseVersion>>(\n `/v1/builds/${buildId}/preReleaseVersion`\n );\n return response.data;\n } catch {\n return null;\n }\n }\n\n async submitForBetaReview(buildId: string): Promise<void> {\n await this.http.post(\"/v1/betaAppReviewSubmissions\", {\n data: {\n type: \"betaAppReviewSubmissions\",\n relationships: {\n build: {\n data: { type: \"builds\", id: buildId },\n },\n },\n },\n });\n }\n\n async expireBuild(buildId: string): Promise<void> {\n await this.http.patch(`/v1/builds/${buildId}`, {\n data: {\n type: \"builds\",\n id: buildId,\n attributes: {\n expired: true,\n },\n },\n });\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResponse, ListParams } from \"../client/types.js\";\nimport type { BetaGroup } from \"../types/build.js\";\n\nexport class BetaGroupsResource {\n constructor(private http: RequestClient) {}\n\n async list(params?: {\n filter?: {\n app?: string;\n name?: string;\n isInternalGroup?: string;\n id?: string | string[];\n };\n fields?: string[];\n limit?: number;\n sort?: string;\n }): Promise<BetaGroup[]> {\n const listParams: ListParams = {\n filter: params?.filter as Record<string, string | string[]>,\n limit: params?.limit ?? 200,\n sort: params?.sort,\n };\n if (params?.fields) {\n listParams.fields = { betaGroups: params.fields.join(\",\") };\n }\n return this.http.all<BetaGroup>(\"/v1/betaGroups\", listParams);\n }\n\n async get(id: string): Promise<BetaGroup> {\n const response = await this.http.get<JsonApiResponse<BetaGroup>>(\n `/v1/betaGroups/${id}`\n );\n return response.data;\n }\n\n async listForApp(appId: string): Promise<BetaGroup[]> {\n return this.http.all<BetaGroup>(`/v1/apps/${appId}/betaGroups`);\n }\n\n async addBuilds(groupId: string, buildIds: string[]): Promise<void> {\n await this.http.post(`/v1/betaGroups/${groupId}/relationships/builds`, {\n data: buildIds.map((id) => ({ type: \"builds\", id })),\n });\n }\n\n async removeBuilds(groupId: string, buildIds: string[]): Promise<void> {\n await this.http.request(\n `/v1/betaGroups/${groupId}/relationships/builds`,\n {\n method: \"DELETE\",\n body: {\n data: buildIds.map((id) => ({ type: \"builds\", id })),\n },\n }\n );\n }\n\n async findByName(appId: string, name: string): Promise<BetaGroup | null> {\n const groups = await this.listForApp(appId);\n return groups.find((g) => g.attributes.name === name) ?? null;\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResponse } from \"../client/types.js\";\nimport type {\n BundleIdCapability,\n CapabilitySettingInput,\n} from \"../types/capability.js\";\nimport type { CapabilityType } from \"../types/enums.js\";\n\nexport class CapabilitiesResource {\n constructor(private http: RequestClient) {}\n\n async listForBundleId(bundleIdId: string): Promise<BundleIdCapability[]> {\n return this.http.all<BundleIdCapability>(\n `/v1/bundleIds/${bundleIdId}/bundleIdCapabilities`\n );\n }\n\n async enable(params: {\n bundleIdId: string;\n capabilityType: CapabilityType;\n settings?: CapabilitySettingInput[];\n }): Promise<BundleIdCapability> {\n const attributes: Record<string, unknown> = {\n capabilityType: params.capabilityType,\n };\n if (params.settings) {\n attributes.settings = params.settings;\n }\n\n const response = await this.http.post<\n JsonApiResponse<BundleIdCapability>\n >(\"/v1/bundleIdCapabilities\", {\n data: {\n type: \"bundleIdCapabilities\",\n attributes,\n relationships: {\n bundleId: {\n data: { type: \"bundleIds\", id: params.bundleIdId },\n },\n },\n },\n });\n return response.data;\n }\n\n async update(\n capabilityId: string,\n params: {\n capabilityType: CapabilityType;\n settings?: CapabilitySettingInput[];\n }\n ): Promise<BundleIdCapability> {\n const attributes: Record<string, unknown> = {\n capabilityType: params.capabilityType,\n };\n if (params.settings) {\n attributes.settings = params.settings;\n }\n\n const response = await this.http.patch<\n JsonApiResponse<BundleIdCapability>\n >(`/v1/bundleIdCapabilities/${capabilityId}`, {\n data: {\n type: \"bundleIdCapabilities\",\n id: capabilityId,\n attributes,\n },\n });\n return response.data;\n }\n\n async disable(capabilityId: string): Promise<void> {\n await this.http.delete(`/v1/bundleIdCapabilities/${capabilityId}`);\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResponse, ListParams } from \"../client/types.js\";\nimport type { AppStoreVersionState, Platform, ReleaseType } from \"../types/enums.js\";\n\nexport interface AppStoreVersion {\n id: string;\n type: \"appStoreVersions\";\n attributes: {\n platform: Platform;\n versionString: string;\n appStoreState: AppStoreVersionState;\n copyright: string | null;\n releaseType: ReleaseType | null;\n earliestReleaseDate: string | null;\n downloadable: boolean;\n createdDate: string;\n };\n relationships?: {\n app?: { data: { type: \"apps\"; id: string } };\n build?: { data: { type: \"builds\"; id: string } | null };\n appStoreVersionLocalizations?: {\n data: Array<{ type: \"appStoreVersionLocalizations\"; id: string }>;\n };\n };\n}\n\nexport interface AppStoreVersionLocalization {\n id: string;\n type: \"appStoreVersionLocalizations\";\n attributes: {\n description: string | null;\n locale: string;\n keywords: string | null;\n marketingUrl: string | null;\n promotionalText: string | null;\n supportUrl: string | null;\n whatsNew: string | null;\n };\n}\n\nexport class AppStoreVersionsResource {\n constructor(private http: RequestClient) {}\n\n async listForApp(\n appId: string,\n params?: {\n filter?: { appStoreState?: AppStoreVersionState | AppStoreVersionState[]; platform?: Platform };\n include?: string;\n limit?: number;\n }\n ): Promise<AppStoreVersion[]> {\n const listParams: ListParams = {\n filter: params?.filter as Record<string, string | string[]>,\n include: params?.include,\n limit: params?.limit ?? 200,\n };\n return this.http.all<AppStoreVersion>(\n `/v1/apps/${appId}/appStoreVersions`,\n listParams\n );\n }\n\n async get(id: string, params?: { include?: string }): Promise<AppStoreVersion> {\n const queryParams: Record<string, string | undefined> = {};\n if (params?.include) queryParams[\"include\"] = params.include;\n const response = await this.http.get<JsonApiResponse<AppStoreVersion>>(\n `/v1/appStoreVersions/${id}`,\n queryParams\n );\n return response.data;\n }\n\n async create(params: {\n appId: string;\n versionString: string;\n platform: Platform;\n releaseType?: ReleaseType;\n earliestReleaseDate?: string;\n copyright?: string;\n }): Promise<AppStoreVersion> {\n const attributes: Record<string, unknown> = {\n versionString: params.versionString,\n platform: params.platform,\n };\n if (params.releaseType) attributes.releaseType = params.releaseType;\n if (params.earliestReleaseDate) attributes.earliestReleaseDate = params.earliestReleaseDate;\n if (params.copyright) attributes.copyright = params.copyright;\n\n const response = await this.http.post<JsonApiResponse<AppStoreVersion>>(\n \"/v1/appStoreVersions\",\n {\n data: {\n type: \"appStoreVersions\",\n attributes,\n relationships: {\n app: {\n data: { type: \"apps\", id: params.appId },\n },\n },\n },\n }\n );\n return response.data;\n }\n\n async update(\n id: string,\n params: {\n versionString?: string;\n copyright?: string;\n releaseType?: ReleaseType;\n earliestReleaseDate?: string | null;\n }\n ): Promise<AppStoreVersion> {\n const response = await this.http.patch<JsonApiResponse<AppStoreVersion>>(\n `/v1/appStoreVersions/${id}`,\n {\n data: {\n type: \"appStoreVersions\",\n id,\n attributes: params,\n },\n }\n );\n return response.data;\n }\n\n async setBuild(versionId: string, buildId: string): Promise<void> {\n await this.http.patch(`/v1/appStoreVersions/${versionId}/relationships/build`, {\n data: { type: \"builds\", id: buildId },\n });\n }\n\n async getLocalizations(versionId: string): Promise<AppStoreVersionLocalization[]> {\n return this.http.all<AppStoreVersionLocalization>(\n `/v1/appStoreVersions/${versionId}/appStoreVersionLocalizations`\n );\n }\n\n async createLocalization(params: {\n versionId: string;\n locale: string;\n description?: string;\n keywords?: string;\n marketingUrl?: string;\n promotionalText?: string;\n supportUrl?: string;\n whatsNew?: string;\n }): Promise<AppStoreVersionLocalization> {\n const { versionId, ...attributes } = params;\n const response = await this.http.post<\n JsonApiResponse<AppStoreVersionLocalization>\n >(\"/v1/appStoreVersionLocalizations\", {\n data: {\n type: \"appStoreVersionLocalizations\",\n attributes,\n relationships: {\n appStoreVersion: {\n data: { type: \"appStoreVersions\", id: versionId },\n },\n },\n },\n });\n return response.data;\n }\n\n async updateLocalization(\n localizationId: string,\n params: {\n description?: string;\n keywords?: string;\n marketingUrl?: string;\n promotionalText?: string;\n supportUrl?: string;\n whatsNew?: string;\n }\n ): Promise<AppStoreVersionLocalization> {\n const response = await this.http.patch<\n JsonApiResponse<AppStoreVersionLocalization>\n >(`/v1/appStoreVersionLocalizations/${localizationId}`, {\n data: {\n type: \"appStoreVersionLocalizations\",\n id: localizationId,\n attributes: params,\n },\n });\n return response.data;\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResponse } from \"../client/types.js\";\n\nexport interface AppScreenshotSet {\n id: string;\n type: \"appScreenshotSets\";\n attributes: {\n screenshotDisplayType: string;\n };\n}\n\nexport interface AppScreenshot {\n id: string;\n type: \"appScreenshots\";\n attributes: {\n fileSize: number;\n fileName: string;\n sourceFileChecksum: string | null;\n imageAsset: {\n templateUrl: string;\n width: number;\n height: number;\n } | null;\n assetToken: string | null;\n assetType: string | null;\n uploadOperations: UploadOperation[] | null;\n assetDeliveryState: {\n state: string;\n errors: unknown[];\n } | null;\n };\n}\n\nexport interface UploadOperation {\n method: string;\n url: string;\n length: number;\n offset: number;\n requestHeaders: Array<{ name: string; value: string }>;\n}\n\nexport class AppScreenshotsResource {\n constructor(private http: RequestClient) {}\n\n async listSetsForLocalization(\n localizationId: string\n ): Promise<AppScreenshotSet[]> {\n return this.http.all<AppScreenshotSet>(\n `/v1/appStoreVersionLocalizations/${localizationId}/appScreenshotSets`\n );\n }\n\n async createSet(params: {\n localizationId: string;\n screenshotDisplayType: string;\n }): Promise<AppScreenshotSet> {\n const response = await this.http.post<\n JsonApiResponse<AppScreenshotSet>\n >(\"/v1/appScreenshotSets\", {\n data: {\n type: \"appScreenshotSets\",\n attributes: {\n screenshotDisplayType: params.screenshotDisplayType,\n },\n relationships: {\n appStoreVersionLocalization: {\n data: {\n type: \"appStoreVersionLocalizations\",\n id: params.localizationId,\n },\n },\n },\n },\n });\n return response.data;\n }\n\n async listScreenshots(setId: string): Promise<AppScreenshot[]> {\n return this.http.all<AppScreenshot>(\n `/v1/appScreenshotSets/${setId}/appScreenshots`\n );\n }\n\n async reserveScreenshot(params: {\n setId: string;\n fileName: string;\n fileSize: number;\n }): Promise<AppScreenshot> {\n const response = await this.http.post<\n JsonApiResponse<AppScreenshot>\n >(\"/v1/appScreenshots\", {\n data: {\n type: \"appScreenshots\",\n attributes: {\n fileName: params.fileName,\n fileSize: params.fileSize,\n },\n relationships: {\n appScreenshotSet: {\n data: { type: \"appScreenshotSets\", id: params.setId },\n },\n },\n },\n });\n return response.data;\n }\n\n async commitScreenshot(\n screenshotId: string,\n params: { sourceFileChecksum: string; uploaded: boolean }\n ): Promise<AppScreenshot> {\n const response = await this.http.patch<\n JsonApiResponse<AppScreenshot>\n >(`/v1/appScreenshots/${screenshotId}`, {\n data: {\n type: \"appScreenshots\",\n id: screenshotId,\n attributes: {\n sourceFileChecksum: params.sourceFileChecksum,\n uploaded: params.uploaded,\n },\n },\n });\n return response.data;\n }\n\n async deleteScreenshot(screenshotId: string): Promise<void> {\n await this.http.delete(`/v1/appScreenshots/${screenshotId}`);\n }\n\n async deleteSet(setId: string): Promise<void> {\n await this.http.delete(`/v1/appScreenshotSets/${setId}`);\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResponse } from \"../client/types.js\";\n\nexport interface ReviewSubmission {\n id: string;\n type: \"reviewSubmissions\";\n attributes: {\n state: string;\n submittedDate: string | null;\n platform: string;\n };\n}\n\nexport interface AppStoreVersionSubmission {\n id: string;\n type: \"appStoreVersionSubmissions\";\n}\n\nexport class ReviewSubmissionsResource {\n constructor(private http: RequestClient) {}\n\n async submitVersion(versionId: string): Promise<AppStoreVersionSubmission> {\n const response = await this.http.post<\n JsonApiResponse<AppStoreVersionSubmission>\n >(\"/v1/appStoreVersionSubmissions\", {\n data: {\n type: \"appStoreVersionSubmissions\",\n relationships: {\n appStoreVersion: {\n data: { type: \"appStoreVersions\", id: versionId },\n },\n },\n },\n });\n return response.data;\n }\n\n async createReviewSubmission(params: {\n appId: string;\n platform: string;\n }): Promise<ReviewSubmission> {\n const response = await this.http.post<\n JsonApiResponse<ReviewSubmission>\n >(\"/v1/reviewSubmissions\", {\n data: {\n type: \"reviewSubmissions\",\n attributes: {\n platform: params.platform,\n },\n relationships: {\n app: {\n data: { type: \"apps\", id: params.appId },\n },\n },\n },\n });\n return response.data;\n }\n\n async confirmReviewSubmission(submissionId: string): Promise<ReviewSubmission> {\n const response = await this.http.patch<\n JsonApiResponse<ReviewSubmission>\n >(`/v1/reviewSubmissions/${submissionId}`, {\n data: {\n type: \"reviewSubmissions\",\n id: submissionId,\n attributes: {\n submitted: true,\n },\n },\n });\n return response.data;\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResource, JsonApiResponse, ListParams } from \"../client/types.js\";\n\n/**\n * App Info is the metadata container that holds an app's categories, age\n * ratings, and localisations for a single submission cycle. Ported from\n * `spaceship/connect_api/models/app_info.rb`.\n */\nexport interface AppInfoAttributes {\n appStoreState?: string | null;\n state?: string | null;\n appStoreAgeRating?: string | null;\n brazilAgeRating?: string | null;\n kidsAgeBand?: string | null;\n}\n\nexport type AppInfo = JsonApiResource<\"appInfos\", AppInfoAttributes>;\n\nexport class AppInfosResource {\n constructor(private http: RequestClient) {}\n\n async listForApp(appId: string, params?: {\n include?: string;\n limit?: number;\n }): Promise<AppInfo[]> {\n const listParams: ListParams = {\n limit: params?.limit ?? 200,\n include: params?.include,\n };\n return this.http.all<AppInfo>(`/v1/apps/${appId}/appInfos`, listParams);\n }\n\n async get(id: string, params?: { include?: string }): Promise<AppInfo> {\n const queryParams: Record<string, string | undefined> = {};\n if (params?.include) queryParams[\"include\"] = params.include;\n const response = await this.http.get<JsonApiResponse<AppInfo>>(\n `/v1/appInfos/${id}`,\n queryParams\n );\n return response.data;\n }\n\n async update(\n id: string,\n relationships?: Record<string, { type: string; id: string } | null>\n ): Promise<AppInfo> {\n const response = await this.http.patch<JsonApiResponse<AppInfo>>(\n `/v1/appInfos/${id}`,\n {\n data: {\n type: \"appInfos\",\n id,\n ...(relationships\n ? {\n relationships: Object.fromEntries(\n Object.entries(relationships).map(([k, v]) => [k, { data: v }])\n ),\n }\n : {}),\n },\n }\n );\n return response.data;\n }\n\n async delete(id: string): Promise<void> {\n await this.http.delete(`/v1/appInfos/${id}`);\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResource, JsonApiResponse, ListParams } from \"../client/types.js\";\n\nexport interface AppInfoLocalizationAttributes {\n locale: string;\n name?: string | null;\n subtitle?: string | null;\n privacyPolicyUrl?: string | null;\n privacyChoicesUrl?: string | null;\n privacyPolicyText?: string | null;\n}\n\nexport type AppInfoLocalization = JsonApiResource<\n \"appInfoLocalizations\",\n AppInfoLocalizationAttributes\n>;\n\nexport class AppInfoLocalizationsResource {\n constructor(private http: RequestClient) {}\n\n async listForAppInfo(appInfoId: string, params?: {\n limit?: number;\n }): Promise<AppInfoLocalization[]> {\n const listParams: ListParams = {\n limit: params?.limit ?? 200,\n };\n return this.http.all<AppInfoLocalization>(\n `/v1/appInfos/${appInfoId}/appInfoLocalizations`,\n listParams\n );\n }\n\n async get(id: string): Promise<AppInfoLocalization> {\n const response = await this.http.get<JsonApiResponse<AppInfoLocalization>>(\n `/v1/appInfoLocalizations/${id}`\n );\n return response.data;\n }\n\n async create(params: {\n appInfoId: string;\n attributes: AppInfoLocalizationAttributes;\n }): Promise<AppInfoLocalization> {\n const response = await this.http.post<JsonApiResponse<AppInfoLocalization>>(\n \"/v1/appInfoLocalizations\",\n {\n data: {\n type: \"appInfoLocalizations\",\n attributes: params.attributes,\n relationships: {\n appInfo: { data: { type: \"appInfos\", id: params.appInfoId } },\n },\n },\n }\n );\n return response.data;\n }\n\n async update(\n id: string,\n attributes: Partial<AppInfoLocalizationAttributes>\n ): Promise<AppInfoLocalization> {\n const response = await this.http.patch<JsonApiResponse<AppInfoLocalization>>(\n `/v1/appInfoLocalizations/${id}`,\n { data: { type: \"appInfoLocalizations\", id, attributes } }\n );\n return response.data;\n }\n\n async delete(id: string): Promise<void> {\n await this.http.delete(`/v1/appInfoLocalizations/${id}`);\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResource, JsonApiResponse } from \"../client/types.js\";\n\nexport interface AppStoreReviewDetailAttributes {\n contactFirstName?: string | null;\n contactLastName?: string | null;\n contactPhone?: string | null;\n contactEmail?: string | null;\n demoAccountName?: string | null;\n demoAccountPassword?: string | null;\n demoAccountRequired?: boolean | null;\n notes?: string | null;\n}\n\nexport type AppStoreReviewDetail = JsonApiResource<\n \"appStoreReviewDetails\",\n AppStoreReviewDetailAttributes\n>;\n\nexport class AppStoreReviewDetailsResource {\n constructor(private http: RequestClient) {}\n\n async getForAppStoreVersion(\n appStoreVersionId: string\n ): Promise<AppStoreReviewDetail> {\n const response = await this.http.get<\n JsonApiResponse<AppStoreReviewDetail>\n >(`/v1/appStoreVersions/${appStoreVersionId}/appStoreReviewDetail`);\n return response.data;\n }\n\n async get(id: string): Promise<AppStoreReviewDetail> {\n const response = await this.http.get<\n JsonApiResponse<AppStoreReviewDetail>\n >(`/v1/appStoreReviewDetails/${id}`);\n return response.data;\n }\n\n async create(params: {\n appStoreVersionId: string;\n attributes: AppStoreReviewDetailAttributes;\n }): Promise<AppStoreReviewDetail> {\n const response = await this.http.post<\n JsonApiResponse<AppStoreReviewDetail>\n >(\"/v1/appStoreReviewDetails\", {\n data: {\n type: \"appStoreReviewDetails\",\n attributes: params.attributes,\n relationships: {\n appStoreVersion: {\n data: { type: \"appStoreVersions\", id: params.appStoreVersionId },\n },\n },\n },\n });\n return response.data;\n }\n\n async update(\n id: string,\n attributes: Partial<AppStoreReviewDetailAttributes>\n ): Promise<AppStoreReviewDetail> {\n const response = await this.http.patch<\n JsonApiResponse<AppStoreReviewDetail>\n >(`/v1/appStoreReviewDetails/${id}`, {\n data: { type: \"appStoreReviewDetails\", id, attributes },\n });\n return response.data;\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResource, JsonApiResponse, ListParams } from \"../client/types.js\";\n\nexport interface BetaTesterAttributes {\n firstName?: string | null;\n lastName?: string | null;\n email: string;\n inviteType?: \"EMAIL\" | \"PUBLIC_LINK\" | null;\n state?: string | null;\n}\n\nexport type BetaTester = JsonApiResource<\"betaTesters\", BetaTesterAttributes>;\n\nexport class BetaTestersResource {\n constructor(private http: RequestClient) {}\n\n async list(params?: {\n filter?: {\n email?: string;\n firstName?: string;\n lastName?: string;\n inviteType?: string;\n apps?: string | string[];\n betaGroups?: string | string[];\n };\n include?: string;\n limit?: number;\n sort?: string;\n }): Promise<BetaTester[]> {\n const listParams: ListParams = {\n filter: params?.filter as Record<string, string | string[]>,\n include: params?.include,\n limit: params?.limit ?? 200,\n sort: params?.sort,\n };\n return this.http.all<BetaTester>(\"/v1/betaTesters\", listParams);\n }\n\n async get(id: string): Promise<BetaTester> {\n const response = await this.http.get<JsonApiResponse<BetaTester>>(\n `/v1/betaTesters/${id}`\n );\n return response.data;\n }\n\n async create(params: {\n email: string;\n firstName?: string;\n lastName?: string;\n betaGroupIds?: string[];\n appIds?: string[];\n }): Promise<BetaTester> {\n const attributes: BetaTesterAttributes = {\n email: params.email,\n firstName: params.firstName,\n lastName: params.lastName,\n };\n const relationships: Record<string, { data: Array<{ type: string; id: string }> }> = {};\n if (params.betaGroupIds?.length) {\n relationships.betaGroups = {\n data: params.betaGroupIds.map((id) => ({ type: \"betaGroups\", id })),\n };\n }\n if (params.appIds?.length) {\n relationships.apps = {\n data: params.appIds.map((id) => ({ type: \"apps\", id })),\n };\n }\n const response = await this.http.post<JsonApiResponse<BetaTester>>(\n \"/v1/betaTesters\",\n {\n data: {\n type: \"betaTesters\",\n attributes,\n ...(Object.keys(relationships).length ? { relationships } : {}),\n },\n }\n );\n return response.data;\n }\n\n async delete(id: string): Promise<void> {\n await this.http.delete(`/v1/betaTesters/${id}`);\n }\n\n async findByEmail(email: string): Promise<BetaTester | null> {\n const results = await this.list({ filter: { email }, limit: 1 });\n return results[0] ?? null;\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResource, JsonApiResponse, ListParams } from \"../client/types.js\";\n\nexport interface BetaAppReviewSubmissionAttributes {\n betaReviewState?: string | null;\n submittedDate?: string | null;\n}\n\nexport type BetaAppReviewSubmission = JsonApiResource<\n \"betaAppReviewSubmissions\",\n BetaAppReviewSubmissionAttributes\n>;\n\nexport class BetaAppReviewSubmissionsResource {\n constructor(private http: RequestClient) {}\n\n async list(params?: {\n filter?: { build?: string | string[]; betaReviewState?: string };\n limit?: number;\n }): Promise<BetaAppReviewSubmission[]> {\n const listParams: ListParams = {\n filter: params?.filter as Record<string, string | string[]>,\n limit: params?.limit ?? 200,\n };\n return this.http.all<BetaAppReviewSubmission>(\n \"/v1/betaAppReviewSubmissions\",\n listParams\n );\n }\n\n async get(id: string): Promise<BetaAppReviewSubmission> {\n const response = await this.http.get<JsonApiResponse<BetaAppReviewSubmission>>(\n `/v1/betaAppReviewSubmissions/${id}`\n );\n return response.data;\n }\n\n async create(buildId: string): Promise<BetaAppReviewSubmission> {\n const response = await this.http.post<JsonApiResponse<BetaAppReviewSubmission>>(\n \"/v1/betaAppReviewSubmissions\",\n {\n data: {\n type: \"betaAppReviewSubmissions\",\n relationships: {\n build: { data: { type: \"builds\", id: buildId } },\n },\n },\n }\n );\n return response.data;\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResource, JsonApiResponse } from \"../client/types.js\";\n\nexport interface BetaAppReviewDetailAttributes {\n contactFirstName?: string | null;\n contactLastName?: string | null;\n contactPhone?: string | null;\n contactEmail?: string | null;\n demoAccountName?: string | null;\n demoAccountPassword?: string | null;\n demoAccountRequired?: boolean | null;\n notes?: string | null;\n}\n\nexport type BetaAppReviewDetail = JsonApiResource<\n \"betaAppReviewDetails\",\n BetaAppReviewDetailAttributes\n>;\n\nexport class BetaAppReviewDetailsResource {\n constructor(private http: RequestClient) {}\n\n async getForApp(appId: string): Promise<BetaAppReviewDetail> {\n const response = await this.http.get<JsonApiResponse<BetaAppReviewDetail>>(\n `/v1/apps/${appId}/betaAppReviewDetail`\n );\n return response.data;\n }\n\n async get(id: string): Promise<BetaAppReviewDetail> {\n const response = await this.http.get<JsonApiResponse<BetaAppReviewDetail>>(\n `/v1/betaAppReviewDetails/${id}`\n );\n return response.data;\n }\n\n async update(\n id: string,\n attributes: Partial<BetaAppReviewDetailAttributes>\n ): Promise<BetaAppReviewDetail> {\n const response = await this.http.patch<JsonApiResponse<BetaAppReviewDetail>>(\n `/v1/betaAppReviewDetails/${id}`,\n { data: { type: \"betaAppReviewDetails\", id, attributes } }\n );\n return response.data;\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResource, JsonApiResponse } from \"../client/types.js\";\n\nexport type InvitationType = \"EMAIL\" | \"PUBLIC_LINK\";\n\nexport interface BetaTesterInvitationAttributes {\n // Write-only resource: no stored attributes, just a creation side-effect.\n [key: string]: unknown;\n}\n\nexport type BetaTesterInvitation = JsonApiResource<\n \"betaTesterInvitations\",\n BetaTesterInvitationAttributes\n>;\n\nexport class BetaInvitationsResource {\n constructor(private http: RequestClient) {}\n\n /** Send a TestFlight invitation email for an existing tester + app. */\n async send(params: {\n appId: string;\n betaTesterId: string;\n }): Promise<BetaTesterInvitation> {\n const response = await this.http.post<JsonApiResponse<BetaTesterInvitation>>(\n \"/v1/betaTesterInvitations\",\n {\n data: {\n type: \"betaTesterInvitations\",\n relationships: {\n app: { data: { type: \"apps\", id: params.appId } },\n betaTester: { data: { type: \"betaTesters\", id: params.betaTesterId } },\n },\n },\n }\n );\n return response.data;\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResource, JsonApiResponse, ListParams } from \"../client/types.js\";\n\nexport interface BetaLicenseAgreementAttributes {\n agreementText?: string | null;\n}\n\nexport type BetaLicenseAgreement = JsonApiResource<\n \"betaLicenseAgreements\",\n BetaLicenseAgreementAttributes\n>;\n\nexport class BetaLicensesResource {\n constructor(private http: RequestClient) {}\n\n async list(params?: { limit?: number }): Promise<BetaLicenseAgreement[]> {\n const listParams: ListParams = {\n limit: params?.limit ?? 200,\n };\n return this.http.all<BetaLicenseAgreement>(\n \"/v1/betaLicenseAgreements\",\n listParams\n );\n }\n\n async get(id: string): Promise<BetaLicenseAgreement> {\n const response = await this.http.get<JsonApiResponse<BetaLicenseAgreement>>(\n `/v1/betaLicenseAgreements/${id}`\n );\n return response.data;\n }\n\n async getForApp(appId: string): Promise<BetaLicenseAgreement> {\n const response = await this.http.get<JsonApiResponse<BetaLicenseAgreement>>(\n `/v1/apps/${appId}/betaLicenseAgreement`\n );\n return response.data;\n }\n\n async update(\n id: string,\n attributes: Partial<BetaLicenseAgreementAttributes>\n ): Promise<BetaLicenseAgreement> {\n const response = await this.http.patch<\n JsonApiResponse<BetaLicenseAgreement>\n >(`/v1/betaLicenseAgreements/${id}`, {\n data: { type: \"betaLicenseAgreements\", id, attributes },\n });\n return response.data;\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResource, JsonApiResponse } from \"../client/types.js\";\n\nexport interface AppPreviewAttributes {\n fileSize?: number | null;\n fileName?: string | null;\n sourceFileChecksum?: string | null;\n previewFrameTimeCode?: string | null;\n mimeType?: string | null;\n videoUrl?: string | null;\n previewImage?: { templateUrl?: string; width?: number; height?: number } | null;\n uploadOperations?: unknown[] | null;\n assetDeliveryState?: { state?: string } | null;\n uploaded?: boolean | null;\n}\n\nexport type AppPreview = JsonApiResource<\"appPreviews\", AppPreviewAttributes>;\n\nexport class AppPreviewsResource {\n constructor(private http: RequestClient) {}\n\n async get(id: string): Promise<AppPreview> {\n const response = await this.http.get<JsonApiResponse<AppPreview>>(\n `/v1/appPreviews/${id}`\n );\n return response.data;\n }\n\n async create(params: {\n appPreviewSetId: string;\n fileSize: number;\n fileName: string;\n previewFrameTimeCode?: string;\n mimeType?: string;\n }): Promise<AppPreview> {\n const { appPreviewSetId, ...rest } = params;\n const response = await this.http.post<JsonApiResponse<AppPreview>>(\n \"/v1/appPreviews\",\n {\n data: {\n type: \"appPreviews\",\n attributes: rest,\n relationships: {\n appPreviewSet: {\n data: { type: \"appPreviewSets\", id: appPreviewSetId },\n },\n },\n },\n }\n );\n return response.data;\n }\n\n async update(\n id: string,\n attributes: { uploaded?: boolean; sourceFileChecksum?: string; previewFrameTimeCode?: string }\n ): Promise<AppPreview> {\n const response = await this.http.patch<JsonApiResponse<AppPreview>>(\n `/v1/appPreviews/${id}`,\n { data: { type: \"appPreviews\", id, attributes } }\n );\n return response.data;\n }\n\n async delete(id: string): Promise<void> {\n await this.http.delete(`/v1/appPreviews/${id}`);\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResource, JsonApiResponse, ListParams } from \"../client/types.js\";\n\nexport interface AppPreviewSetAttributes {\n previewType?: string | null;\n}\n\nexport type AppPreviewSet = JsonApiResource<\n \"appPreviewSets\",\n AppPreviewSetAttributes\n>;\n\nexport class AppPreviewSetsResource {\n constructor(private http: RequestClient) {}\n\n async listForLocalization(\n localizationId: string,\n params?: { limit?: number; include?: string }\n ): Promise<AppPreviewSet[]> {\n const listParams: ListParams = {\n limit: params?.limit ?? 200,\n include: params?.include,\n };\n return this.http.all<AppPreviewSet>(\n `/v1/appStoreVersionLocalizations/${localizationId}/appPreviewSets`,\n listParams\n );\n }\n\n async get(id: string, params?: { include?: string }): Promise<AppPreviewSet> {\n const queryParams: Record<string, string | undefined> = {};\n if (params?.include) queryParams[\"include\"] = params.include;\n const response = await this.http.get<JsonApiResponse<AppPreviewSet>>(\n `/v1/appPreviewSets/${id}`,\n queryParams\n );\n return response.data;\n }\n\n async create(params: {\n appStoreVersionLocalizationId: string;\n previewType: string;\n }): Promise<AppPreviewSet> {\n const response = await this.http.post<JsonApiResponse<AppPreviewSet>>(\n \"/v1/appPreviewSets\",\n {\n data: {\n type: \"appPreviewSets\",\n attributes: { previewType: params.previewType },\n relationships: {\n appStoreVersionLocalization: {\n data: {\n type: \"appStoreVersionLocalizations\",\n id: params.appStoreVersionLocalizationId,\n },\n },\n },\n },\n }\n );\n return response.data;\n }\n\n async delete(id: string): Promise<void> {\n await this.http.delete(`/v1/appPreviewSets/${id}`);\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResource, JsonApiResponse, ListParams } from \"../client/types.js\";\n\nexport interface AppPriceAttributes {\n startDate?: string | null;\n}\n\nexport type AppPrice = JsonApiResource<\"appPrices\", AppPriceAttributes>;\n\nexport class AppPricesResource {\n constructor(private http: RequestClient) {}\n\n async listForApp(appId: string, params?: {\n include?: string;\n limit?: number;\n }): Promise<AppPrice[]> {\n const listParams: ListParams = {\n limit: params?.limit ?? 200,\n include: params?.include,\n };\n return this.http.all<AppPrice>(`/v1/apps/${appId}/prices`, listParams);\n }\n\n async get(id: string, params?: { include?: string }): Promise<AppPrice> {\n const queryParams: Record<string, string | undefined> = {};\n if (params?.include) queryParams[\"include\"] = params.include;\n const response = await this.http.get<JsonApiResponse<AppPrice>>(\n `/v1/appPrices/${id}`,\n queryParams\n );\n return response.data;\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResource, JsonApiResponse, ListParams } from \"../client/types.js\";\n\nexport interface TerritoryAttributes {\n currency?: string | null;\n}\n\nexport type Territory = JsonApiResource<\"territories\", TerritoryAttributes>;\n\nexport class TerritoriesResource {\n constructor(private http: RequestClient) {}\n\n async list(params?: { limit?: number }): Promise<Territory[]> {\n const listParams: ListParams = {\n limit: params?.limit ?? 200,\n };\n return this.http.all<Territory>(\"/v1/territories\", listParams);\n }\n\n async get(id: string): Promise<Territory> {\n const response = await this.http.get<JsonApiResponse<Territory>>(\n `/v1/territories/${id}`\n );\n return response.data;\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResource, JsonApiResponse } from \"../client/types.js\";\n\nexport interface AgeRatingDeclarationAttributes {\n alcoholTobaccoOrDrugUseOrReferences?: string | null;\n contests?: string | null;\n gamblingSimulated?: string | null;\n medicalOrTreatmentInformation?: string | null;\n profanityOrCrudeHumor?: string | null;\n sexualContentGraphicAndNudity?: string | null;\n sexualContentOrNudity?: string | null;\n horrorOrFearThemes?: string | null;\n matureOrSuggestiveThemes?: string | null;\n unrestrictedWebAccess?: boolean | null;\n gamblingAndContests?: boolean | null;\n gambling?: string | null;\n violenceCartoonOrFantasy?: string | null;\n violenceRealistic?: string | null;\n violenceRealisticProlongedGraphicOrSadistic?: string | null;\n kidsAgeBand?: string | null;\n seventeenPlus?: boolean | null;\n}\n\nexport type AgeRatingDeclaration = JsonApiResource<\n \"ageRatingDeclarations\",\n AgeRatingDeclarationAttributes\n>;\n\nexport class AgeRatingDeclarationsResource {\n constructor(private http: RequestClient) {}\n\n async get(id: string): Promise<AgeRatingDeclaration> {\n const response = await this.http.get<JsonApiResponse<AgeRatingDeclaration>>(\n `/v1/ageRatingDeclarations/${id}`\n );\n return response.data;\n }\n\n async update(\n id: string,\n attributes: Partial<AgeRatingDeclarationAttributes>\n ): Promise<AgeRatingDeclaration> {\n const response = await this.http.patch<\n JsonApiResponse<AgeRatingDeclaration>\n >(`/v1/ageRatingDeclarations/${id}`, {\n data: { type: \"ageRatingDeclarations\", id, attributes },\n });\n return response.data;\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResource, JsonApiResponse, ListParams } from \"../client/types.js\";\n\nexport interface AppCategoryAttributes {\n platforms?: string[] | null;\n}\n\nexport type AppCategory = JsonApiResource<\"appCategories\", AppCategoryAttributes>;\n\nexport class AppCategoriesResource {\n constructor(private http: RequestClient) {}\n\n async list(params?: {\n filter?: { platforms?: string };\n include?: string;\n limit?: number;\n }): Promise<AppCategory[]> {\n const listParams: ListParams = {\n filter: params?.filter as Record<string, string | string[]>,\n include: params?.include,\n limit: params?.limit ?? 200,\n };\n return this.http.all<AppCategory>(\"/v1/appCategories\", listParams);\n }\n\n async get(id: string, params?: { include?: string }): Promise<AppCategory> {\n const queryParams: Record<string, string | undefined> = {};\n if (params?.include) queryParams[\"include\"] = params.include;\n const response = await this.http.get<JsonApiResponse<AppCategory>>(\n `/v1/appCategories/${id}`,\n queryParams\n );\n return response.data;\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResource, JsonApiResponse, ListParams } from \"../client/types.js\";\n\nexport interface AppEncryptionDeclarationAttributes {\n appEncryptionDeclarationState?: string | null;\n createdDate?: string | null;\n codeValue?: string | null;\n usesEncryption?: boolean | null;\n exempt?: boolean | null;\n containsProprietaryCryptography?: boolean | null;\n containsThirdPartyCryptography?: boolean | null;\n availableOnFrenchStore?: boolean | null;\n platform?: string | null;\n uploadedDate?: string | null;\n documentUrl?: string | null;\n documentName?: string | null;\n documentType?: string | null;\n}\n\nexport type AppEncryptionDeclaration = JsonApiResource<\n \"appEncryptionDeclarations\",\n AppEncryptionDeclarationAttributes\n>;\n\nexport class AppEncryptionDeclarationsResource {\n constructor(private http: RequestClient) {}\n\n async list(params?: {\n filter?: { app?: string; platform?: string };\n limit?: number;\n }): Promise<AppEncryptionDeclaration[]> {\n const listParams: ListParams = {\n filter: params?.filter as Record<string, string | string[]>,\n limit: params?.limit ?? 200,\n };\n return this.http.all<AppEncryptionDeclaration>(\n \"/v1/appEncryptionDeclarations\",\n listParams\n );\n }\n\n async get(id: string): Promise<AppEncryptionDeclaration> {\n const response = await this.http.get<\n JsonApiResponse<AppEncryptionDeclaration>\n >(`/v1/appEncryptionDeclarations/${id}`);\n return response.data;\n }\n\n async assignToBuild(params: {\n declarationId: string;\n buildIds: string[];\n }): Promise<void> {\n await this.http.post(\n `/v1/appEncryptionDeclarations/${params.declarationId}/relationships/builds`,\n { data: params.buildIds.map((id) => ({ type: \"builds\", id })) }\n );\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResource, JsonApiResponse } from \"../client/types.js\";\n\nexport interface IdfaDeclarationAttributes {\n honorsLimitedAdTracking?: boolean | null;\n servesAds?: boolean | null;\n attributesActionWithPreviousAd?: boolean | null;\n attributesAppInstallationToPreviousAd?: boolean | null;\n}\n\nexport type IdfaDeclaration = JsonApiResource<\n \"idfaDeclarations\",\n IdfaDeclarationAttributes\n>;\n\nexport class IdfaDeclarationsResource {\n constructor(private http: RequestClient) {}\n\n async getForAppStoreVersion(\n appStoreVersionId: string\n ): Promise<IdfaDeclaration> {\n const response = await this.http.get<JsonApiResponse<IdfaDeclaration>>(\n `/v1/appStoreVersions/${appStoreVersionId}/idfaDeclaration`\n );\n return response.data;\n }\n\n async get(id: string): Promise<IdfaDeclaration> {\n const response = await this.http.get<JsonApiResponse<IdfaDeclaration>>(\n `/v1/idfaDeclarations/${id}`\n );\n return response.data;\n }\n\n async create(params: {\n appStoreVersionId: string;\n attributes: IdfaDeclarationAttributes;\n }): Promise<IdfaDeclaration> {\n const response = await this.http.post<JsonApiResponse<IdfaDeclaration>>(\n \"/v1/idfaDeclarations\",\n {\n data: {\n type: \"idfaDeclarations\",\n attributes: params.attributes,\n relationships: {\n appStoreVersion: {\n data: { type: \"appStoreVersions\", id: params.appStoreVersionId },\n },\n },\n },\n }\n );\n return response.data;\n }\n\n async update(\n id: string,\n attributes: Partial<IdfaDeclarationAttributes>\n ): Promise<IdfaDeclaration> {\n const response = await this.http.patch<JsonApiResponse<IdfaDeclaration>>(\n `/v1/idfaDeclarations/${id}`,\n { data: { type: \"idfaDeclarations\", id, attributes } }\n );\n return response.data;\n }\n\n async delete(id: string): Promise<void> {\n await this.http.delete(`/v1/idfaDeclarations/${id}`);\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResource, JsonApiResponse, ListParams } from \"../client/types.js\";\n\nexport interface PreReleaseVersionAttributes {\n version?: string | null;\n platform?: string | null;\n}\n\nexport type PreReleaseVersion = JsonApiResource<\n \"preReleaseVersions\",\n PreReleaseVersionAttributes\n>;\n\nexport class PreReleaseVersionsResource {\n constructor(private http: RequestClient) {}\n\n async list(params?: {\n filter?: {\n app?: string;\n version?: string;\n platform?: string;\n \"builds.expired\"?: string;\n \"builds.processingState\"?: string;\n \"builds.version\"?: string;\n };\n include?: string;\n limit?: number;\n sort?: string;\n }): Promise<PreReleaseVersion[]> {\n const listParams: ListParams = {\n filter: params?.filter as Record<string, string | string[]>,\n include: params?.include,\n limit: params?.limit ?? 200,\n sort: params?.sort,\n };\n return this.http.all<PreReleaseVersion>(\n \"/v1/preReleaseVersions\",\n listParams\n );\n }\n\n async get(\n id: string,\n params?: { include?: string }\n ): Promise<PreReleaseVersion> {\n const queryParams: Record<string, string | undefined> = {};\n if (params?.include) queryParams[\"include\"] = params.include;\n const response = await this.http.get<JsonApiResponse<PreReleaseVersion>>(\n `/v1/preReleaseVersions/${id}`,\n queryParams\n );\n return response.data;\n }\n\n async findByVersion(params: {\n appId: string;\n version: string;\n platform?: string;\n }): Promise<PreReleaseVersion | null> {\n const filter: Record<string, string> = {\n app: params.appId,\n version: params.version,\n };\n if (params.platform) filter.platform = params.platform;\n const results = await this.list({ filter, limit: 1 });\n return results[0] ?? null;\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResource, JsonApiResponse, ListParams } from \"../client/types.js\";\n\nexport interface ReviewSubmissionItemAttributes {\n state?: string | null;\n removed?: boolean | null;\n ready?: boolean | null;\n}\n\nexport type ReviewSubmissionItem = JsonApiResource<\n \"reviewSubmissionItems\",\n ReviewSubmissionItemAttributes\n>;\n\n// create() param → [relationship name, resource type]\nconst ITEM_RELATIONSHIPS: Record<string, [string, string]> = {\n appStoreVersionId: [\"appStoreVersion\", \"appStoreVersions\"],\n appCustomProductPageVersionId: [\"appCustomProductPageVersion\", \"appCustomProductPageVersions\"],\n appStoreVersionExperimentId: [\"appStoreVersionExperiment\", \"appStoreVersionExperiments\"],\n appStoreVersionExperimentV2Id: [\"appStoreVersionExperimentV2\", \"appStoreVersionExperiments\"],\n appEventId: [\"appEvent\", \"appEvents\"],\n appAssetLibraryImageId: [\"appAssetLibraryImage\", \"appAssetLibraryImages\"],\n appAssetLibraryVideoId: [\"appAssetLibraryVideo\", \"appAssetLibraryVideos\"],\n backgroundAssetVersionId: [\"backgroundAssetVersion\", \"backgroundAssetVersions\"],\n inAppPurchaseVersionId: [\"inAppPurchaseVersion\", \"inAppPurchaseVersions\"],\n subscriptionVersionId: [\"subscriptionVersion\", \"subscriptionVersions\"],\n subscriptionGroupVersionId: [\"subscriptionGroupVersion\", \"subscriptionGroupVersions\"],\n};\n\nexport class ReviewSubmissionItemsResource {\n constructor(private http: RequestClient) {}\n\n async listForSubmission(\n reviewSubmissionId: string,\n params?: { include?: string; limit?: number }\n ): Promise<ReviewSubmissionItem[]> {\n const listParams: ListParams = {\n include: params?.include,\n limit: params?.limit ?? 200,\n };\n return this.http.all<ReviewSubmissionItem>(\n `/v1/reviewSubmissions/${reviewSubmissionId}/items`,\n listParams\n );\n }\n\n async get(id: string): Promise<ReviewSubmissionItem> {\n const response = await this.http.get<JsonApiResponse<ReviewSubmissionItem>>(\n `/v1/reviewSubmissionItems/${id}`\n );\n return response.data;\n }\n\n /**\n * Add one item to a review submission. Besides versions, asset library\n * images and videos can be submitted on their own (ASC API 4.5.1) so\n * creative assets are approved ahead of a campaign.\n */\n async create(params: {\n reviewSubmissionId: string;\n appStoreVersionId?: string;\n appCustomProductPageVersionId?: string;\n appStoreVersionExperimentId?: string;\n appStoreVersionExperimentV2Id?: string;\n appEventId?: string;\n appAssetLibraryImageId?: string;\n appAssetLibraryVideoId?: string;\n backgroundAssetVersionId?: string;\n inAppPurchaseVersionId?: string;\n subscriptionVersionId?: string;\n subscriptionGroupVersionId?: string;\n }): Promise<ReviewSubmissionItem> {\n const relationships: Record<string, { data: { type: string; id: string } }> = {\n reviewSubmission: {\n data: { type: \"reviewSubmissions\", id: params.reviewSubmissionId },\n },\n };\n for (const [param, [relationship, type]] of Object.entries(ITEM_RELATIONSHIPS)) {\n const id = params[param as keyof typeof params];\n if (id) relationships[relationship] = { data: { type, id } };\n }\n const response = await this.http.post<JsonApiResponse<ReviewSubmissionItem>>(\n \"/v1/reviewSubmissionItems\",\n {\n data: {\n type: \"reviewSubmissionItems\",\n relationships,\n },\n }\n );\n return response.data;\n }\n\n async update(\n id: string,\n attributes: { removed?: boolean }\n ): Promise<ReviewSubmissionItem> {\n const response = await this.http.patch<JsonApiResponse<ReviewSubmissionItem>>(\n `/v1/reviewSubmissionItems/${id}`,\n { data: { type: \"reviewSubmissionItems\", id, attributes } }\n );\n return response.data;\n }\n\n async delete(id: string): Promise<void> {\n await this.http.delete(`/v1/reviewSubmissionItems/${id}`);\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResource, JsonApiResponse, ListParams } from \"../client/types.js\";\n\nexport interface UserAttributes {\n username?: string | null;\n firstName?: string | null;\n lastName?: string | null;\n roles?: string[] | null;\n allAppsVisible?: boolean | null;\n provisioningAllowed?: boolean | null;\n}\n\nexport type User = JsonApiResource<\"users\", UserAttributes>;\n\nexport class UsersResource {\n constructor(private http: RequestClient) {}\n\n async list(params?: {\n filter?: { username?: string; roles?: string | string[] };\n include?: string;\n limit?: number;\n sort?: string;\n }): Promise<User[]> {\n const listParams: ListParams = {\n filter: params?.filter as Record<string, string | string[]>,\n include: params?.include,\n limit: params?.limit ?? 200,\n sort: params?.sort,\n };\n return this.http.all<User>(\"/v1/users\", listParams);\n }\n\n async get(id: string): Promise<User> {\n const response = await this.http.get<JsonApiResponse<User>>(`/v1/users/${id}`);\n return response.data;\n }\n\n async update(\n id: string,\n attributes: Partial<UserAttributes>,\n visibleAppIds?: string[]\n ): Promise<User> {\n const relationships = visibleAppIds\n ? {\n visibleApps: {\n data: visibleAppIds.map((id) => ({ type: \"apps\", id })),\n },\n }\n : undefined;\n const response = await this.http.patch<JsonApiResponse<User>>(\n `/v1/users/${id}`,\n {\n data: {\n type: \"users\",\n id,\n attributes,\n ...(relationships ? { relationships } : {}),\n },\n }\n );\n return response.data;\n }\n\n async delete(id: string): Promise<void> {\n await this.http.delete(`/v1/users/${id}`);\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResource, JsonApiResponse, ListParams } from \"../client/types.js\";\n\nexport interface UserInvitationAttributes {\n email: string;\n firstName?: string | null;\n lastName?: string | null;\n expirationDate?: string | null;\n roles?: string[] | null;\n allAppsVisible?: boolean | null;\n provisioningAllowed?: boolean | null;\n}\n\nexport type UserInvitation = JsonApiResource<\n \"userInvitations\",\n UserInvitationAttributes\n>;\n\nexport class UserInvitationsResource {\n constructor(private http: RequestClient) {}\n\n async list(params?: {\n filter?: { email?: string; roles?: string | string[] };\n include?: string;\n limit?: number;\n sort?: string;\n }): Promise<UserInvitation[]> {\n const listParams: ListParams = {\n filter: params?.filter as Record<string, string | string[]>,\n include: params?.include,\n limit: params?.limit ?? 200,\n sort: params?.sort,\n };\n return this.http.all<UserInvitation>(\"/v1/userInvitations\", listParams);\n }\n\n async get(id: string): Promise<UserInvitation> {\n const response = await this.http.get<JsonApiResponse<UserInvitation>>(\n `/v1/userInvitations/${id}`\n );\n return response.data;\n }\n\n async create(params: {\n attributes: UserInvitationAttributes;\n visibleAppIds?: string[];\n }): Promise<UserInvitation> {\n const relationships = params.visibleAppIds\n ? {\n visibleApps: {\n data: params.visibleAppIds.map((id) => ({ type: \"apps\", id })),\n },\n }\n : undefined;\n const response = await this.http.post<JsonApiResponse<UserInvitation>>(\n \"/v1/userInvitations\",\n {\n data: {\n type: \"userInvitations\",\n attributes: params.attributes,\n ...(relationships ? { relationships } : {}),\n },\n }\n );\n return response.data;\n }\n\n async delete(id: string): Promise<void> {\n await this.http.delete(`/v1/userInvitations/${id}`);\n }\n\n async findByEmail(email: string): Promise<UserInvitation | null> {\n const results = await this.list({ filter: { email }, limit: 1 });\n return results[0] ?? null;\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResource, JsonApiResponse, ListParams } from \"../client/types.js\";\n\nexport interface InAppPurchaseAttributes {\n name?: string | null;\n productId?: string | null;\n inAppPurchaseType?: string | null;\n state?: string | null;\n reviewNote?: string | null;\n familySharable?: boolean | null;\n}\n\nexport type InAppPurchase = JsonApiResource<\n \"inAppPurchases\" | \"inAppPurchasesV2\",\n InAppPurchaseAttributes\n>;\n\nexport class InAppPurchasesResource {\n constructor(private http: RequestClient) {}\n\n async listForApp(appId: string, params?: {\n filter?: { state?: string; inAppPurchaseType?: string };\n include?: string;\n limit?: number;\n sort?: string;\n }): Promise<InAppPurchase[]> {\n const listParams: ListParams = {\n filter: params?.filter as Record<string, string | string[]>,\n include: params?.include,\n limit: params?.limit ?? 200,\n sort: params?.sort,\n };\n return this.http.all<InAppPurchase>(\n `/v2/apps/${appId}/inAppPurchasesV2`,\n listParams\n );\n }\n\n async get(id: string, params?: { include?: string }): Promise<InAppPurchase> {\n const queryParams: Record<string, string | undefined> = {};\n if (params?.include) queryParams[\"include\"] = params.include;\n const response = await this.http.get<JsonApiResponse<InAppPurchase>>(\n `/v2/inAppPurchases/${id}`,\n queryParams\n );\n return response.data;\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResource, JsonApiResponse } from \"../client/types.js\";\n\nexport interface GameCenterDetailAttributes {\n arcadeEnabled?: boolean | null;\n challengeEnabled?: boolean | null;\n}\n\nexport type GameCenterDetail = JsonApiResource<\n \"gameCenterDetails\",\n GameCenterDetailAttributes\n>;\n\nexport class GameCenterDetailResource {\n constructor(private http: RequestClient) {}\n\n async getForApp(appId: string): Promise<GameCenterDetail> {\n const response = await this.http.get<JsonApiResponse<GameCenterDetail>>(\n `/v1/apps/${appId}/gameCenterDetail`\n );\n return response.data;\n }\n\n async get(id: string): Promise<GameCenterDetail> {\n const response = await this.http.get<JsonApiResponse<GameCenterDetail>>(\n `/v1/gameCenterDetails/${id}`\n );\n return response.data;\n }\n\n async update(\n id: string,\n attributes: Partial<GameCenterDetailAttributes>\n ): Promise<GameCenterDetail> {\n const response = await this.http.patch<JsonApiResponse<GameCenterDetail>>(\n `/v1/gameCenterDetails/${id}`,\n { data: { type: \"gameCenterDetails\", id, attributes } }\n );\n return response.data;\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResource, JsonApiResponse } from \"../client/types.js\";\n\n/**\n * TestFlight / Xcode build metrics. Exposes perf & crash stats per build.\n * Wraps `/v1/builds/{id}/perfPowerMetrics` and\n * `/v1/builds/{id}/diagnosticSignatures`.\n */\nexport interface PerfPowerMetricAttributes {\n metricCategory?: string | null;\n platform?: string | null;\n datasets?: unknown[] | null;\n}\n\nexport type PerfPowerMetric = JsonApiResource<\n \"perfPowerMetrics\",\n PerfPowerMetricAttributes\n>;\n\nexport interface DiagnosticSignatureAttributes {\n signature?: string | null;\n weight?: number | null;\n diagnosticType?: string | null;\n}\n\nexport type DiagnosticSignature = JsonApiResource<\n \"diagnosticSignatures\",\n DiagnosticSignatureAttributes\n>;\n\nexport class XcodeMetricsResource {\n constructor(private http: RequestClient) {}\n\n async getPerfPowerMetrics(buildId: string): Promise<PerfPowerMetric[]> {\n const response = await this.http.get<{ data: PerfPowerMetric[] }>(\n `/v1/builds/${buildId}/perfPowerMetrics`\n );\n return response.data;\n }\n\n async getDiagnosticSignatures(buildId: string): Promise<DiagnosticSignature[]> {\n const response = await this.http.get<{ data: DiagnosticSignature[] }>(\n `/v1/builds/${buildId}/diagnosticSignatures`\n );\n return response.data;\n }\n\n async getPerfPowerMetric(id: string): Promise<PerfPowerMetric> {\n const response = await this.http.get<JsonApiResponse<PerfPowerMetric>>(\n `/v1/perfPowerMetrics/${id}`\n );\n return response.data;\n }\n\n async getDiagnosticSignature(id: string): Promise<DiagnosticSignature> {\n const response = await this.http.get<JsonApiResponse<DiagnosticSignature>>(\n `/v1/diagnosticSignatures/${id}`\n );\n return response.data;\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResource, JsonApiResponse, ListParams } from \"../client/types.js\";\nimport type {\n AppAssetLibraryAssetCategory,\n AppAssetLibraryFeature,\n AppAssetLibraryPlacementPlatform,\n AppAssetLibraryPlacementType,\n} from \"../types/enums.js\";\nimport type { AppAssetLibraryImage, AppAssetLibraryVideo } from \"./app-asset-library-assets.js\";\n\n/**\n * The App Asset Library (ASC API 4.5.1) — one per app. Images and videos are\n * uploaded into it once, then placed on any number of App Store surfaces\n * (version, custom product page, in-app event, product page test\n * localizations). Replaces the deprecated screenshot/preview sets.\n */\nexport type AppAssetLibrary = JsonApiResource<\"appAssetLibraries\", Record<string, never>>;\n\nexport interface AppAssetLibraryDimensions {\n minWidth: number;\n maxWidth: number;\n minHeight: number;\n maxHeight: number;\n}\n\nexport interface AppAssetLibraryImageSpec {\n specId: string;\n shortName?: string;\n aspectRatio?: string;\n dimensions: AppAssetLibraryDimensions;\n compatiblePlacementTypes: AppAssetLibraryPlacementType[];\n alphaAllowed?: boolean;\n fileExtensions?: string[];\n mimeTypes?: string[];\n maxFileSize?: number;\n universalAsset?: boolean;\n}\n\nexport interface AppAssetLibraryVideoSpec extends AppAssetLibraryImageSpec {\n audioRequired?: boolean;\n duration?: { min?: string; max?: string };\n frameRates?: Array<{ minFps?: number; maxFps?: number }>;\n}\n\nexport interface AppAssetLibraryRefDatumAttributes {\n features?: Array<{\n featureId: AppAssetLibraryFeature;\n placementPolicies?: Array<{\n placementType: AppAssetLibraryPlacementType;\n groupLimits?: Array<{ groupIds: string[]; maxCount: number }>;\n }>;\n }>;\n placementProfileGroups?: Array<{\n placementProfileGroupId: string;\n platform?: AppAssetLibraryPlacementPlatform;\n displayClassId?: string;\n }>;\n imageSpecs?: AppAssetLibraryImageSpec[];\n videoSpecs?: AppAssetLibraryVideoSpec[];\n placementTypes?: Array<{\n placementTypeId: AppAssetLibraryPlacementType;\n acceptsAssetCategories?: AppAssetLibraryAssetCategory[];\n specMappings?: Array<{ placementGroupId: string; specs: string[] }>;\n }>;\n displayClasses?: Array<{\n displayClassId: string;\n deviceFamily?: string;\n screenDimensions?: string[];\n }>;\n}\n\nexport type AppAssetLibraryRefDatum = JsonApiResource<\n \"appAssetLibraryRefData\",\n AppAssetLibraryRefDatumAttributes\n>;\n\nexport class AppAssetLibrariesResource {\n constructor(private http: RequestClient) {}\n\n async getForApp(appId: string): Promise<AppAssetLibrary> {\n const response = await this.http.get<JsonApiResponse<AppAssetLibrary>>(\n `/v1/apps/${appId}/assetLibrary`\n );\n return response.data;\n }\n\n async listImages(libraryId: string, params: ListParams = {}): Promise<AppAssetLibraryImage[]> {\n return this.http.all<AppAssetLibraryImage>(`/v1/appAssetLibraries/${libraryId}/images`, params);\n }\n\n async listVideos(libraryId: string, params: ListParams = {}): Promise<AppAssetLibraryVideo[]> {\n return this.http.all<AppAssetLibraryVideo>(`/v1/appAssetLibraries/${libraryId}/videos`, params);\n }\n\n /**\n * Specs, placement groups and limits. Apple adds placement groups (new\n * devices) without an API version bump, so read them from here rather than\n * hard-coding display types.\n */\n async refData(params: {\n features?: AppAssetLibraryFeature[];\n placementTypes?: AppAssetLibraryPlacementType[];\n placementProfileGroups?: string[];\n } = {}): Promise<AppAssetLibraryRefDatumAttributes> {\n const filter: Record<string, string[]> = {};\n if (params.features?.length) filter.features = params.features;\n if (params.placementTypes?.length) filter.placementTypes = params.placementTypes;\n if (params.placementProfileGroups?.length) filter.placementProfileGroups = params.placementProfileGroups;\n const data = await this.http.all<AppAssetLibraryRefDatum>(\"/v1/appAssetLibraryRefData\", { filter });\n return mergeRefData(data.map((d) => d.attributes));\n }\n}\n\nfunction mergeRefData(parts: AppAssetLibraryRefDatumAttributes[]): AppAssetLibraryRefDatumAttributes {\n const merged: Required<AppAssetLibraryRefDatumAttributes> = {\n features: [],\n placementProfileGroups: [],\n imageSpecs: [],\n videoSpecs: [],\n placementTypes: [],\n displayClasses: [],\n };\n for (const part of parts) {\n for (const key of Object.keys(merged) as Array<keyof typeof merged>) {\n (merged[key] as unknown[]).push(...((part[key] as unknown[] | undefined) ?? []));\n }\n }\n return merged;\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResource, JsonApiResponse, ListParams } from \"../client/types.js\";\nimport type { AppAssetLibraryAssetCategory, AppAssetLibraryAssetState } from \"../types/enums.js\";\nimport type { UploadOperation } from \"./app-screenshots.js\";\nimport type { AppAssetLibraryPlacement } from \"./app-asset-library-placements.js\";\n\ninterface AssetAttributes {\n category?: AppAssetLibraryAssetCategory;\n fileName?: string;\n fileSize?: number;\n referenceName?: string | null;\n specId?: string | null;\n state?: AppAssetLibraryAssetState;\n stateDetails?: Array<{ code?: string; message?: string }> | null;\n uploadOperations?: UploadOperation[] | null;\n createdDate?: string;\n lastModifiedDate?: string;\n}\n\nexport interface AppAssetLibraryImageAttributes extends AssetAttributes {\n imageAsset?: { templateUrl: string; width: number; height: number } | null;\n}\n\nexport interface AppAssetLibraryVideoAttributes extends AssetAttributes {\n previewFrameTimeCode?: string | null;\n videoAsset?: { url?: string; width?: number; height?: number; duration?: string } | null;\n previewFrameImage?: { templateUrl: string; width: number; height: number } | null;\n}\n\nexport type AppAssetLibraryImage = JsonApiResource<\"appAssetLibraryImages\", AppAssetLibraryImageAttributes>;\nexport type AppAssetLibraryVideo = JsonApiResource<\"appAssetLibraryVideos\", AppAssetLibraryVideoAttributes>;\n\nexport interface CreateAssetParams {\n libraryId: string;\n fileName: string;\n fileSize: number;\n /** Fixed at upload. Headers, search results and event assets need CREATIVE_ASSETS. */\n category: AppAssetLibraryAssetCategory;\n referenceName?: string;\n}\n\nexport interface UpdateAssetAttributes {\n /** Commit after every upload operation has succeeded. No checksum is sent. */\n uploaded?: boolean;\n referenceName?: string;\n /** Only an APPROVED asset can be archived (409 STATE_ERROR.INVALID_ASSET_STATE otherwise). */\n archived?: boolean;\n}\n\n/**\n * Images and videos in an app's asset library share one lifecycle:\n * reserve (POST) → run uploadOperations → PATCH uploaded:true → poll state.\n */\nabstract class AssetLibraryMediaResource<\n T extends \"appAssetLibraryImages\" | \"appAssetLibraryVideos\",\n R extends JsonApiResource<T, AssetAttributes>,\n> {\n protected abstract readonly type: T;\n\n constructor(protected http: RequestClient) {}\n\n async get(id: string): Promise<R> {\n const response = await this.http.get<JsonApiResponse<R>>(`/v1/${this.type}/${id}`);\n return response.data;\n }\n\n protected async reserve(params: CreateAssetParams, extra: Record<string, unknown> = {}): Promise<R> {\n const { libraryId, ...attributes } = params;\n const response = await this.http.post<JsonApiResponse<R>>(`/v1/${this.type}`, {\n data: {\n type: this.type,\n attributes: { ...attributes, ...extra },\n relationships: {\n assetLibrary: { data: { type: \"appAssetLibraries\", id: libraryId } },\n },\n },\n });\n return response.data;\n }\n\n protected async patch(id: string, attributes: Record<string, unknown>): Promise<R> {\n const response = await this.http.patch<JsonApiResponse<R>>(`/v1/${this.type}/${id}`, {\n data: { type: this.type, id, attributes },\n });\n return response.data;\n }\n\n /** Fails with 409 STATE_ERROR.ASSET_HAS_PLACEMENTS while the asset is still placed. */\n async delete(id: string): Promise<void> {\n await this.http.delete(`/v1/${this.type}/${id}`);\n }\n\n async listPlacements(id: string, params: ListParams = {}): Promise<AppAssetLibraryPlacement[]> {\n return this.http.all<AppAssetLibraryPlacement>(`/v1/${this.type}/${id}/placements`, params);\n }\n}\n\nexport class AppAssetLibraryImagesResource extends AssetLibraryMediaResource<\n \"appAssetLibraryImages\",\n AppAssetLibraryImage\n> {\n protected readonly type = \"appAssetLibraryImages\" as const;\n\n async create(params: CreateAssetParams): Promise<AppAssetLibraryImage> {\n return this.reserve(params);\n }\n\n async update(id: string, attributes: UpdateAssetAttributes): Promise<AppAssetLibraryImage> {\n return this.patch(id, { ...attributes });\n }\n}\n\nexport class AppAssetLibraryVideosResource extends AssetLibraryMediaResource<\n \"appAssetLibraryVideos\",\n AppAssetLibraryVideo\n> {\n protected readonly type = \"appAssetLibraryVideos\" as const;\n\n async create(params: CreateAssetParams & { previewFrameTimeCode?: string }): Promise<AppAssetLibraryVideo> {\n const { previewFrameTimeCode, ...rest } = params;\n return this.reserve(rest, previewFrameTimeCode ? { previewFrameTimeCode } : {});\n }\n\n async update(\n id: string,\n attributes: UpdateAssetAttributes & { previewFrameTimeCode?: string }\n ): Promise<AppAssetLibraryVideo> {\n return this.patch(id, { ...attributes });\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResource, JsonApiResponse, ListParams } from \"../client/types.js\";\nimport type {\n AppAssetLibraryMediaType,\n AppAssetLibraryPlacementState,\n AppAssetLibraryPlacementType,\n} from \"../types/enums.js\";\n\nexport interface AppAssetLibraryPlacementAttributes {\n mediaType?: AppAssetLibraryMediaType;\n placementType?: AppAssetLibraryPlacementType;\n placementGroup?: string;\n state?: AppAssetLibraryPlacementState;\n stateDetails?: Array<{ code?: string; message?: string }> | null;\n createdDate?: string;\n lastModifiedDate?: string;\n}\n\nexport type AppAssetLibraryPlacement = JsonApiResource<\n \"appAssetLibraryPlacements\",\n AppAssetLibraryPlacementAttributes\n>;\n\n/** The localization a placement puts an asset on. */\nexport type PlacementTargetKind =\n | \"appStoreVersionLocalization\"\n | \"appCustomProductPageLocalization\"\n | \"appEventLocalization\"\n | \"appStoreVersionExperimentTreatmentLocalization\";\n\nexport interface PlacementTarget {\n kind: PlacementTargetKind;\n id: string;\n}\n\nconst TARGET_TYPES: Record<PlacementTargetKind, string> = {\n appStoreVersionLocalization: \"appStoreVersionLocalizations\",\n appCustomProductPageLocalization: \"appCustomProductPageLocalizations\",\n appEventLocalization: \"appEventLocalizations\",\n appStoreVersionExperimentTreatmentLocalization: \"appStoreVersionExperimentTreatmentLocalizations\",\n};\n\nfunction targetRelationship(target: PlacementTarget) {\n return { [target.kind]: { data: { type: TARGET_TYPES[target.kind], id: target.id } } };\n}\n\nexport class AppAssetLibraryPlacementsResource {\n constructor(private http: RequestClient) {}\n\n /**\n * Place an image or video on one localization. Placements cannot be edited —\n * delete and recreate. The parent version/page must be editable.\n */\n async create(params: {\n placementType: AppAssetLibraryPlacementType;\n placementGroup: string;\n imageId?: string;\n videoId?: string;\n target: PlacementTarget;\n }): Promise<AppAssetLibraryPlacement> {\n if (!params.imageId === !params.videoId) {\n throw new Error(\"A placement needs exactly one of imageId or videoId\");\n }\n const media = params.imageId\n ? { image: { data: { type: \"appAssetLibraryImages\", id: params.imageId } } }\n : { video: { data: { type: \"appAssetLibraryVideos\", id: params.videoId! } } };\n const response = await this.http.post<JsonApiResponse<AppAssetLibraryPlacement>>(\n \"/v1/appAssetLibraryPlacements\",\n {\n data: {\n type: \"appAssetLibraryPlacements\",\n attributes: { placementType: params.placementType, placementGroup: params.placementGroup },\n relationships: { ...media, ...targetRelationship(params.target) },\n },\n }\n );\n return response.data;\n }\n\n async get(id: string, params: { include?: string } = {}): Promise<AppAssetLibraryPlacement> {\n const response = await this.http.get<JsonApiResponse<AppAssetLibraryPlacement>>(\n `/v1/appAssetLibraryPlacements/${id}`,\n params.include ? { include: params.include } : undefined\n );\n return response.data;\n }\n\n async delete(id: string): Promise<void> {\n await this.http.delete(`/v1/appAssetLibraryPlacements/${id}`);\n }\n\n /** Placements on one localization, in display order by default. */\n async listForTarget(\n target: PlacementTarget,\n params: {\n placementType?: AppAssetLibraryPlacementType;\n placementGroup?: string;\n include?: string;\n } = {}\n ): Promise<AppAssetLibraryPlacement[]> {\n const filter: Record<string, string> = {};\n if (params.placementType) filter.placementType = params.placementType;\n if (params.placementGroup) filter.placementGroup = params.placementGroup;\n const listParams: ListParams = { filter, include: params.include, sort: \"placementGroupPosition\" };\n return this.http.all<AppAssetLibraryPlacement>(\n `/v1/${TARGET_TYPES[target.kind]}/${target.id}/placements`,\n listParams\n );\n }\n\n /** Set the display order of a placement group. In-app event localizations cannot be ordered. */\n async order(params: {\n placementGroup: string;\n placementIds: string[];\n target: PlacementTarget;\n }): Promise<void> {\n if (params.target.kind === \"appEventLocalization\") {\n throw new Error(\"In-app event placements cannot be ordered\");\n }\n await this.http.post(\"/v1/appAssetLibraryPlacementOrderingRequests\", {\n data: {\n type: \"appAssetLibraryPlacementOrderingRequests\",\n attributes: { placementGroup: params.placementGroup },\n relationships: {\n orderedPlacements: {\n data: params.placementIds.map((id) => ({ type: \"appAssetLibraryPlacements\", id })),\n },\n ...targetRelationship(params.target),\n },\n },\n });\n }\n}\n","/**\n * Keeps an Apple ID session between runs, like Spaceship's cookie in\n * ~/.fastlane/spaceship/<user>/cookie — one password + 2FA covers every\n * command (and every app on that Apple ID) until Apple expires the session.\n *\n * Files live in ~/.fastnode/sessions (or FASTNODE_SESSION_DIR), one per\n * Apple ID, directory 0700 and files 0600: they are as good as a signed-in\n * App Store Connect browser. A cached session is checked against olympus\n * before use, so an expired one just falls through to a fresh sign-in.\n */\n\nimport { createHash } from \"node:crypto\";\nimport { chmodSync, existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { AppleSession } from \"./apple-session.js\";\nimport { loginWithAppleId } from \"./apple-session.js\";\n\nconst OLYMPUS_SESSION = \"https://appstoreconnect.apple.com/olympus/v1/session\";\n\ninterface StoredSession {\n email: string;\n savedAt: string;\n session: AppleSession;\n}\n\nexport function sessionDir(): string {\n return process.env.FASTNODE_SESSION_DIR || join(homedir(), \".fastnode\", \"sessions\");\n}\n\nfunction fileFor(email: string): string {\n const key = createHash(\"sha256\").update(email.trim().toLowerCase()).digest(\"hex\").slice(0, 16);\n return join(sessionDir(), `${key}.json`);\n}\n\nfunction ensureDir(): void {\n const dir = sessionDir();\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true, mode: 0o700 });\n chmodSync(dir, 0o700);\n}\n\nexport function saveAppleSession(session: AppleSession): void {\n ensureDir();\n const stored: StoredSession = { email: session.userEmail, savedAt: new Date().toISOString(), session };\n const path = fileFor(session.userEmail);\n writeFileSync(path, JSON.stringify(stored), { mode: 0o600 });\n chmodSync(path, 0o600);\n writeFileSync(join(sessionDir(), \"last-apple-id\"), session.userEmail, { mode: 0o600 });\n}\n\nexport function clearAppleSession(email: string): void {\n const path = fileFor(email);\n if (existsSync(path)) unlinkSync(path);\n}\n\n/** The Apple ID the last session was saved for, so a re-run needs no prompt at all. */\nexport function lastAppleId(): string | null {\n try {\n return readFileSync(join(sessionDir(), \"last-apple-id\"), \"utf8\").trim() || null;\n } catch {\n return null;\n }\n}\n\n/** A saved session for this Apple ID that Apple still accepts, or null. */\nexport async function loadAppleSession(\n email: string,\n fetchImpl: typeof fetch = fetch\n): Promise<AppleSession | null> {\n const path = fileFor(email);\n if (!existsSync(path)) return null;\n let stored: StoredSession;\n try {\n stored = JSON.parse(readFileSync(path, \"utf8\")) as StoredSession;\n } catch {\n return null;\n }\n const cookie = Object.entries(stored.session.cookies).map(([k, v]) => `${k}=${v}`).join(\"; \");\n try {\n const res = await fetchImpl(OLYMPUS_SESSION, { headers: { Cookie: cookie, Accept: \"application/json\" } });\n if (!res.ok) {\n clearAppleSession(email);\n return null;\n }\n } catch {\n // Offline or Apple unreachable: let the caller sign in (which will say why).\n return null;\n }\n return stored.session;\n}\n\n/**\n * Reuse the saved session for this Apple ID, or sign in (password + 2FA) and\n * save the new one. The password is only asked for when a sign-in is needed.\n */\nexport async function signInWithAppleId(options: {\n email?: string | null;\n askEmail: () => Promise<string>;\n askPassword: (email: string) => Promise<string>;\n /** Ignore any saved session and sign in again. */\n fresh?: boolean;\n onLog?: (msg: string) => void;\n}): Promise<AppleSession> {\n const email = options.email || lastAppleId() || (await options.askEmail());\n if (!options.fresh) {\n const saved = await loadAppleSession(email);\n if (saved) {\n options.onLog?.(`Using saved Apple ID session for ${email}`);\n return saved;\n }\n }\n const password = await options.askPassword(email);\n const session = await loginWithAppleId({ email, password, onLog: options.onLog });\n saveAppleSession(session);\n return session;\n}\n","/**\n * Apple Developer Portal Client\n * 1:1 port of Fastlane Spaceship PortalClient\n *\n * Uses session cookies (from loginWithAppleId) to talk to\n * developer.apple.com/services-account/QH65B2/\n *\n * This is the web portal API — separate from the ASC REST API (JWT).\n * Fastlane uses this for: certs, profiles, devices, bundle IDs, app groups, etc.\n */\n\nimport type { AppleSession } from \"./apple-session.js\";\nimport { checkPortalResponse } from \"./apple-session.js\";\n\nconst PORTAL_BASE = \"https://developer.apple.com/services-account/QH65B2\";\n\n/**\n * Pick a key name that doesn't collide with any existing key in the\n * team. Apple rejects duplicate names with \"Another key with same name\n * exists\" (resultCode 35). On collision we append \" - 1\", \" - 2\", …\n * until we find a free slot.\n *\n * Note: Apple's auth key name validator is stricter than the profile\n * name validator — it rejects parentheses (resultCode 29106 \"Invalid\n * Auth Key name\") so the suffix is \" - N\" not \" (N)\".\n */\nfunction pickUniqueKeyName(base: string, taken: Set<string>): string {\n if (!taken.has(base)) return base;\n let n = 1;\n while (taken.has(`${base} - ${n}`)) n++;\n return `${base} - ${n}`;\n}\n\nexport class PortalClient {\n private session: AppleSession;\n private teamId: string;\n private csrf = \"\";\n private csrfTs = \"\";\n private cookieStr: string;\n\n constructor(session: AppleSession, teamId: string) {\n this.session = session;\n this.teamId = teamId;\n this.cookieStr = Object.entries(session.cookies).map(([k, v]) => `${k}=${v}`).join(\"; \");\n }\n\n /** Initialize CSRF tokens — must be called before mutations */\n async init(): Promise<void> {\n await this.post(\"account/listTeams.action\", {});\n }\n\n /**\n * JSON POST — different content type than the standard form-encoded\n * `post()`. Used by the App Store Connect API key endpoints\n * (`account/auth/key/v2/create`), which Spaceship discovered take a\n * JSON body even though every other portal mutation is form-encoded.\n *\n * Like the form-encoded `post()`, this also runs the response through\n * `checkPortalResponse` — Apple returns HTTP 200 even for errors and\n * encodes the error in `resultCode`/`userString` fields, so a raw\n * status check would silently miss real failures.\n */\n private async postJson(path: string, body: unknown): Promise<{ status: number; body: any; rawText: string }> {\n const headers: Record<string, string> = {\n Cookie: this.cookieStr,\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n };\n if (this.csrf) { headers[\"csrf\"] = this.csrf; headers[\"csrf_ts\"] = this.csrfTs; }\n\n console.log(`[portal] POST(json) ${path}`);\n const res = await fetch(`${PORTAL_BASE}/${path}`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n });\n\n if (res.headers.get(\"csrf\")) { this.csrf = res.headers.get(\"csrf\")!; this.csrfTs = res.headers.get(\"csrf_ts\") ?? \"\"; }\n for (const raw of res.headers.getSetCookie?.() ?? []) {\n const m = raw.match(/^([^=]+)=([^;]*)/);\n if (m && !this.cookieStr.includes(m[1] + \"=\")) this.cookieStr += \"; \" + m[1] + \"=\" + m[2];\n }\n\n const text = await res.text();\n let data: any = null;\n try { data = text ? JSON.parse(text) : null; } catch {}\n console.log(`[portal] POST(json) ${path} → ${res.status} ${text.slice(0, 400)}`);\n // Apple's portal returns HTTP 200 with resultCode != 0 for failures;\n // checkPortalResponse throws on those.\n checkPortalResponse(data, this.session);\n return { status: res.status, body: data, rawText: text };\n }\n\n /**\n * GET helper for the portal endpoints that take query parameters\n * (currently just `account/auth/key/download`). Returns the raw text\n * since download endpoints can return PEMs or JSON depending on Apple's\n * mood — caller decides how to parse.\n */\n private async getRaw(path: string, params: Record<string, string> = {}): Promise<{ status: number; rawText: string; contentType: string }> {\n const url = new URL(`${PORTAL_BASE}/${path}`);\n for (const [k, v] of Object.entries(params)) url.searchParams.set(k, v);\n const headers: Record<string, string> = {\n Cookie: this.cookieStr,\n Accept: \"application/json, text/plain, application/x-pem-file, */*\",\n };\n if (this.csrf) { headers[\"csrf\"] = this.csrf; headers[\"csrf_ts\"] = this.csrfTs; }\n\n console.log(`[portal] GET ${url.pathname}${url.search}`);\n const res = await fetch(url.toString(), { headers });\n for (const raw of res.headers.getSetCookie?.() ?? []) {\n const m = raw.match(/^([^=]+)=([^;]*)/);\n if (m && !this.cookieStr.includes(m[1] + \"=\")) this.cookieStr += \"; \" + m[1] + \"=\" + m[2];\n }\n const text = await res.text();\n const contentType = res.headers.get(\"content-type\") ?? \"\";\n console.log(`[portal] GET ${url.pathname} → ${res.status} ${contentType} ${text.length}b`);\n return { status: res.status, rawText: text, contentType };\n }\n\n // ── App Store Connect API Keys (.p8) ────────────────────────────────────\n\n /**\n * Create an App Store Connect API key via the developer portal's\n * `account/auth/key/v2/create` endpoint. Reverse-engineered from the\n * _current_ @expo/apple-utils npm package (v2.1.21), which is what\n * EAS CLI uses to manage Apple credentials in production.\n *\n * This differs from older published reverse-engineering guides:\n * • URL uses the `/v2/create` suffix (Apple kept it)\n * • Field is `serviceConfigurations`, shape is an object keyed by\n * service id (NOT `serviceConfigurationsRequests: [...]` array)\n * • Body REQUIRES `scope: \"team\"`\n * • Needs a scope-specific CSRF warmup via the `keys` endpoint\n * before the create call (EAS's `ensureCSRFAsync(\"keys\", …)`)\n *\n * For an App Store Connect API key (PUBLIC_API, used by altool for\n * TestFlight uploads), `serviceConfigurations` is an empty object `{}`.\n * For an APNs auth key, it's `{ \"U27F4V844T\": [] }`. For MusicKit:\n * `{ \"6A7HVUVQ3M\": [musicId] }`, etc.\n *\n * Apple's name validator rejects parentheses, brackets, and most\n * punctuation — sanitize to alphanumeric + space + dash + underscore\n * + period and collapse whitespace.\n */\n async createApiKey(\n rawName: string,\n serviceConfigurations: Record<string, unknown[]> = {}\n ): Promise<{ keyId: string; raw: any }> {\n // Sanitize: drop forbidden chars, leave headroom for a \"(N)\" suffix\n // since Apple caps key names at 50 chars and we may need to dedupe.\n const baseName = rawName\n .replace(/[^A-Za-z0-9 _\\-.]/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 45);\n if (!baseName) throw new Error(\"createApiKey: name is empty after sanitization\");\n\n // EAS-style CSRF warmup AND name-collision discovery in one trip:\n // listApiKeys refreshes the scoped CSRF for the \"keys\" area\n // (per-section tokens, the listTeams CSRF isn't valid here) and\n // hands us back the existing key names so we can dodge Apple's\n // duplicate-name rejection (\"Another key with same name exists\").\n let existingNames = new Set<string>();\n try {\n const list = await this.listApiKeys();\n existingNames = new Set(\n (list.keys ?? []).map((k: any) => String(k.keyName ?? \"\").trim())\n );\n } catch {\n // Non-fatal — the create call will surface CSRF / collision\n // errors if the warmup mattered and failed.\n }\n\n const name = pickUniqueKeyName(baseName, existingNames);\n\n // EAS's portalRequestAsync auto-injects teamId into every body.\n // Apple rejects the create call without it with resultCode 35.\n const body = {\n teamId: this.teamId,\n name,\n serviceConfigurations,\n scope: \"team\",\n };\n const result = await this.postJson(\"account/auth/key/v2/create\", body);\n // checkPortalResponse inside postJson already throws on resultCode != 0,\n // so any error like \"Invalid Auth Key name\" surfaces as an exception\n // before reaching this point.\n const created = result.body?.keys?.[0] ?? result.body?.key ?? result.body?.data ?? result.body;\n const keyId =\n created?.keyId ??\n created?.id ??\n created?.kid ??\n created?.attributes?.kid;\n if (!keyId) {\n throw new Error(`createApiKey: no key id in response. Body: ${result.rawText.slice(0, 400)}`);\n }\n return { keyId, raw: created };\n }\n\n /**\n * Fetch a single API key by id via `account/auth/key/get`. Reverse-\n * engineered from Spaceship's `get_key`. Returns the raw key record so\n * the caller can extract whatever fields it needs (e.g. issuerId).\n *\n * Form-encoded POST — same shape as every other PortalClient mutation\n * except the JSON `create` endpoint.\n */\n async getApiKey(keyId: string): Promise<any> {\n const data = await this.post(\"account/auth/key/get\", {\n teamId: this.teamId,\n keyId,\n });\n return data?.keys?.[0] ?? data?.key ?? data?.data ?? data;\n }\n\n /**\n * Revoke an existing key. Form-encoded POST per Spaceship's\n * `revoke_key!`. Used for cleaning up orphan keys created during\n * failed wizard runs.\n */\n async revokeApiKey(keyId: string): Promise<void> {\n await this.post(\"account/auth/key/revoke\", {\n teamId: this.teamId,\n keyId,\n });\n }\n\n // ── APNs Authentication Keys (.p8) ──────────────────────────────────────\n\n /** Apple's hardcoded service id for APNs auth keys (from Spaceship). */\n static readonly APNS_SERVICE_ID = \"U27F4V844T\";\n\n /**\n * Create an APNs Authentication Key (.p8) via the developer portal.\n *\n * Apple requires BOTH `serviceConfigurations` (the map) AND\n * `serviceConfigurationsRequests` (the array of full config objects)\n * in the v2/create body. Just sending the map alone results in\n * \"No value was provided for the parameter 'serviceConfigurations'\".\n *\n * The exact body comes from @expo/apple-utils v2.1.21 — both fields\n * are produced by separate functions (`d` for the map, `h` for the\n * array) and merged into the create payload.\n *\n * Apple also rejects duplicate key names (\"Another key with same\n * name exists\") — we dedupe by listing existing keys first and\n * appending \" (N)\" until we find a free slot, mirroring the\n * provisioning profile dedup.\n */\n async createApnsAuthKey(rawName: string): Promise<{ keyId: string; pem: string; raw: any }> {\n const baseName = rawName\n .replace(/[^A-Za-z0-9 _\\-.]/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 45); // headroom for a \" (N)\" suffix\n if (!baseName) throw new Error(\"createApnsAuthKey: name is empty after sanitization\");\n\n // CSRF warmup + name-collision discovery in one trip\n let existingNames = new Set<string>();\n try {\n const list = await this.listApiKeys();\n existingNames = new Set(\n (list.keys ?? []).map((k: any) => String(k.keyName ?? \"\").trim())\n );\n } catch { /* ignore */ }\n\n const name = pickUniqueKeyName(baseName, existingNames);\n\n const body = {\n teamId: this.teamId,\n name,\n serviceConfigurations: {\n [PortalClient.APNS_SERVICE_ID]: [],\n },\n serviceConfigurationsRequests: [\n {\n isNew: true,\n serviceId: PortalClient.APNS_SERVICE_ID,\n identifiers: {},\n environment: \"all\",\n scope: \"team\",\n },\n ],\n scope: \"team\",\n };\n const result = await this.postJson(\"account/auth/key/v2/create\", body);\n const created = result.body?.keys?.[0];\n if (!created?.keyId) {\n throw new Error(`createApnsAuthKey: no key id in response. Body: ${result.rawText.slice(0, 400)}`);\n }\n // Download the .p8 — Apple only allows this once\n const pem = await this.downloadApiKey(created.keyId);\n return { keyId: created.keyId, pem, raw: created };\n }\n\n /**\n * Find existing APNs auth keys in the team. Used by the wizard to\n * detect \"you already have one\" cases and offer to reuse rather than\n * proliferate keys.\n */\n async listApnsAuthKeys(): Promise<{ keyId: string; keyName: string; canDownload: boolean }[]> {\n const list = await this.listApiKeys();\n return (list.keys ?? [])\n .filter((k: any) =>\n (k.services ?? []).some((s: any) => s.id === PortalClient.APNS_SERVICE_ID || /apns/i.test(s.name ?? \"\"))\n )\n .map((k: any) => ({\n keyId: k.keyId,\n keyName: k.keyName,\n canDownload: Boolean(k.canDownload),\n }));\n }\n\n /**\n * Download an existing App Store Connect API key as PEM. Spaceship's\n * `download_key` endpoint — GET with teamId + keyId in query string.\n * Returns the raw .p8 PEM text. Apple shows the .p8 exactly once\n * (after creation), so call this immediately after createApiKey.\n */\n async downloadApiKey(keyId: string): Promise<string> {\n const { status, rawText, contentType } = await this.getRaw(\"account/auth/key/download\", {\n teamId: this.teamId,\n keyId,\n });\n if (status !== 200) {\n throw new Error(`downloadApiKey failed (${status}): ${rawText.slice(0, 200)}`);\n }\n // Plain PEM text response\n if (rawText.includes(\"BEGIN PRIVATE KEY\")) return rawText;\n // JSON wrapper variants\n if (contentType.includes(\"json\")) {\n try {\n const parsed = JSON.parse(rawText);\n const candidates = [\n parsed?.privateKey,\n parsed?.key?.privateKey,\n parsed?.keys?.[0]?.privateKey,\n parsed?.data?.attributes?.privateKey,\n parsed?.value,\n ];\n for (const c of candidates) {\n if (typeof c === \"string\" && c.includes(\"BEGIN PRIVATE KEY\")) return c;\n }\n } catch { /* fall through */ }\n }\n throw new Error(`downloadApiKey returned no PEM. Content-Type=${contentType} body=${rawText.slice(0, 300)}`);\n }\n\n /**\n * List existing API keys via the portal. Used to discover the team's\n * issuer id — every key in the team shares the same issuer id, and\n * altool needs it alongside the key id and .p8 file.\n *\n * Form-encoded POST (NOT JSON), with pagination params, per Spaceship's\n * `list_keys` method. JSON returned 415 from this endpoint.\n */\n async listApiKeys(): Promise<{ keys: any[]; issuerId?: string }> {\n const data = await this.post(\"account/auth/key/list\", {\n teamId: this.teamId,\n pageNumber: \"1\",\n pageSize: \"500\",\n sort: \"name=asc\",\n });\n const keys = data?.keys ?? [];\n // Issuer id may live on the response root, in a metadata bag, or on\n // each key — try all known paths.\n const issuerId =\n data?.issuerId ??\n data?.issuer ??\n data?.team?.issuerId ??\n keys[0]?.issuerId ??\n keys[0]?.issuer;\n return { keys, issuerId };\n }\n\n private async post(path: string, params: Record<string, string | string[]>): Promise<any> {\n // Build form body using URLSearchParams (proper encoding)\n const body = new URLSearchParams();\n for (const [k, v] of Object.entries(params)) {\n if (Array.isArray(v)) { for (const item of v) body.append(k, item); }\n else body.set(k, v);\n }\n const bodyStr = body.toString();\n\n const headers: Record<string, string> = {\n Cookie: this.cookieStr,\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n Accept: \"application/json\",\n };\n if (this.csrf) { headers[\"csrf\"] = this.csrf; headers[\"csrf_ts\"] = this.csrfTs; }\n\n if (process.env.FASTNODE_DEBUG) console.log(`[portal] POST ${path} body=${bodyStr.slice(0, 200)}`);\n const res = await fetch(`${PORTAL_BASE}/${path}`, { method: \"POST\", headers, body: bodyStr });\n\n // Update CSRF\n if (res.headers.get(\"csrf\")) { this.csrf = res.headers.get(\"csrf\")!; this.csrfTs = res.headers.get(\"csrf_ts\") ?? \"\"; }\n for (const raw of res.headers.getSetCookie?.() ?? []) {\n const m = raw.match(/^([^=]+)=([^;]*)/);\n if (m && !this.cookieStr.includes(m[1] + \"=\")) this.cookieStr += \"; \" + m[1] + \"=\" + m[2];\n }\n\n const text = await res.text();\n let data: any;\n try { data = JSON.parse(text); } catch { throw new Error(`Portal returned non-JSON: ${text.slice(0, 200)}`); }\n checkPortalResponse(data, this.session);\n return data;\n }\n\n // ── Teams ──────────────────────────────────────────────────────────────\n\n async listTeams(): Promise<any[]> {\n // Pass pagination params (matching the other list* methods) — without them\n // Apple's listTeams.action returns only a small default page, hiding teams\n // for users who belong to many.\n const data = await this.post(\"account/listTeams.action\", {\n pageSize: \"500\", pageNumber: \"1\",\n });\n return data.teams ?? [];\n }\n\n // ── App IDs / Bundle IDs ───────────────────────────────────────────────\n\n async listAppIds(): Promise<any[]> {\n const data = await this.post(\"account/ios/identifiers/listAppIds.action\", {\n teamId: this.teamId, pageSize: \"500\", pageNumber: \"1\", sort: \"name=asc\",\n });\n return data.appIds ?? [];\n }\n\n async createAppId(params: { identifier: string; name: string; enablePush?: boolean; enableIAP?: boolean }): Promise<any> {\n // Apple's App ID name validator allows only alphanumerics + spaces\n // (\"Please choose a name containing only alphanumeric characters and\n // spaces\") — sanitize so a caller can safely pass a bundle id as the\n // display name. The `identifier` is unaffected.\n const safeName =\n params.name.replace(/[^0-9A-Za-z\\s]/g, \" \").replace(/\\s+/g, \" \").trim() || \"App\";\n const reqParams: Record<string, string> = {\n teamId: this.teamId, type: \"explicit\", identifier: params.identifier, name: safeName,\n };\n if (params.enablePush) reqParams.push = \"on\";\n if (params.enableIAP !== false) reqParams.inAppPurchase = \"on\";\n const data = await this.post(\"account/ios/identifiers/addAppId.action\", reqParams);\n return data.appId;\n }\n\n async deleteAppId(appIdId: string): Promise<void> {\n await this.post(\"account/ios/identifiers/deleteAppId.action\", { teamId: this.teamId, appIdId });\n }\n\n /**\n * Toggle a capability (a.k.a. \"service\") on a bundle ID. Mirrors\n * Spaceship::Portal's `update_service` — the legacy portal endpoint\n * still works and is the only session-cookie-authenticated way to flip\n * capabilities like Push Notifications and Sign in with Apple from\n * outside the Apple Developer web UI.\n *\n * Common service codes (from Spaceship portal/portal_client.rb):\n * push → push notifications\n * APG3427HIY → Sign in with Apple\n * IAD53UNK2F → in-app purchase\n * homeKit → HomeKit\n * healthKit → HealthKit\n *\n * @param featureType Apple's internal capability key (string code or short name)\n * @param enabled true → turn on, false → turn off\n */\n async setBundleCapability(params: {\n appIdId: string;\n featureType: string;\n enabled: boolean;\n }): Promise<void> {\n await this.post(\"account/ios/identifiers/updateAppService.action\", {\n teamId: this.teamId,\n displayId: params.appIdId,\n featureType: params.featureType,\n featureValue: params.enabled ? \"on\" : \"off\",\n });\n }\n\n // ── Application Groups ──────────────────────────────────────────────────\n //\n // App Groups (e.g. `group.com.playspina.com`) are the only clean way to\n // share data — an auth token, in our case — between a host app and an\n // embedded extension (Messages / Notification Service / etc.). App Store\n // Connect API keys (.p8) genuinely cannot manage them; Apple only exposes\n // group create/associate through this legacy session-cookie portal API,\n // which is why they live on PortalClient (Apple ID session) and not on the\n // ASC REST client. Endpoint shapes ported 1:1 from Spaceship's\n // portal_client.rb (listApplicationGroups / addApplicationGroup /\n // assignApplicationGroupToAppId).\n\n /** Apple's internal feature code for the App Groups capability. */\n static readonly APP_GROUPS_FEATURE = \"APG3427HIY\";\n\n /** List all app groups in the team. */\n async listAppGroups(): Promise<any[]> {\n const data = await this.post(\"account/ios/identifiers/listApplicationGroups.action\", {\n teamId: this.teamId, pageNumber: \"1\", pageSize: \"500\", sort: \"name=asc\",\n });\n return data.applicationGroupList ?? [];\n }\n\n /**\n * Create an app group, returning the raw group record. Idempotent —\n * Apple rejects a duplicate group identifier (\"Multiple App Groups may\n * not have the same identifier\"), so we list first and reuse an existing\n * group when the identifier already exists in the team.\n *\n * Note the two ids on the returned record: `identifier` is the\n * `group.com.…` string you type, while `applicationGroup` is Apple's\n * opaque internal handle that association actually requires — do NOT pass\n * the human identifier to assignAppGroups.\n */\n async createAppGroup(params: { identifier: string; name: string }): Promise<any> {\n const existing = await this.listAppGroups();\n const hit = existing.find((g: any) => g.identifier === params.identifier);\n if (hit) return hit;\n // Apple's App Group *name* validator rejects punctuation — periods,\n // in particular (\"An invalid value … for the parameter 'name'\"). Mirror\n // Spaceship's valid_name_for: keep alphanumerics + spaces, collapse the\n // rest. The `identifier` (group.com.…) is unaffected.\n const safeName =\n params.name.replace(/[^0-9A-Za-z\\s]/g, \" \").replace(/\\s+/g, \" \").trim() || \"App Group\";\n const data = await this.post(\"account/ios/identifiers/addApplicationGroup.action\", {\n teamId: this.teamId, identifier: params.identifier, name: safeName,\n });\n return data.applicationGroup;\n }\n\n /**\n * Enable the App Groups capability on an App ID. Required before an\n * App ID can have a group associated with it — mirrors Spaceship\n * enabling `AppService::AppGroup` before `associate_groups`.\n */\n async enableAppGroups(appIdId: string): Promise<void> {\n // App Groups enables via the legacy `updateService.action` endpoint with\n // a boolean-string featureValue — NOT `updateAppService.action` (which\n // reports \"Service mapping to the requested URL is not available\" for\n // this feature). Mirrors Spaceship's AppService::AppGroup service_uri +\n // value. Must succeed before assignAppGroups, or Apple rejects the\n // association (\"Application Group feature should be enabled before …\").\n await this.post(\"account/ios/identifiers/updateService.action\", {\n teamId: this.teamId,\n displayId: appIdId,\n featureType: PortalClient.APP_GROUPS_FEATURE,\n featureValue: \"true\",\n });\n }\n\n /**\n * Associate one or more app groups with an App ID. `appGroupIds` are the\n * internal ids (Spaceship's `app_group_id`), NOT the `group.com.…`\n * identifiers. Apple wants both `appIdId` and `displayId` set to the\n * App ID's internal id, per Spaceship's associate_groups_with_app.\n */\n async assignAppGroups(params: { appIdId: string; appGroupIds: string[] }): Promise<void> {\n await this.post(\"account/ios/identifiers/assignApplicationGroupToAppId.action\", {\n teamId: this.teamId,\n appIdId: params.appIdId,\n displayId: params.appIdId,\n applicationGroups: params.appGroupIds,\n });\n }\n\n // ── Apple Pay merchants (OMCs) ─────────────────────────────────────────\n //\n // Merchant IDs are team-level identifiers (merchant.com.…) that an App ID's\n // Apple Pay capability must be LINKED to — enabling the capability alone\n // produces profiles that fail with \"doesn't support the … Merchant ID\".\n // Like App Groups, merchants are only manageable through the legacy\n // session-cookie portal API. Endpoint shapes ported 1:1 from Spaceship's\n // portal_client.rb (merchants / create_merchant! /\n // associate_merchants_with_app).\n\n /** Apple's internal feature code for the Apple Pay capability. */\n static readonly APPLE_PAY_FEATURE = \"OM633U5T5G\";\n\n /**\n * List all Apple Pay merchant IDs in the team. Each record maps\n * (per Spaceship's merchant.rb attr_mapping): `omcId` = internal id,\n * `identifier` = the human `merchant.com.…` string, `name` = display name.\n */\n async listMerchants(): Promise<any[]> {\n const data = await this.post(\"account/ios/identifiers/listOMCs.action\", {\n teamId: this.teamId, pageNumber: \"1\", pageSize: \"500\", sort: \"name=asc\",\n });\n return data.identifierList ?? [];\n }\n\n /**\n * Register (or reuse) a merchant ID, returning its INTERNAL id (`omcId`) —\n * Apple's opaque handle that association requires, NOT the human\n * `merchant.com.…` identifier. Idempotent: lists first and reuses an\n * existing merchant with the same identifier. Endpoint + params ported 1:1\n * from Spaceship's create_merchant! (addOMC.action).\n */\n async createMerchant(params: { identifier: string; name: string }): Promise<string> {\n const existing = await this.listMerchants();\n const hit = existing.find((m: any) => m.identifier === params.identifier);\n if (hit?.omcId) return String(hit.omcId);\n // Same name validator as App Groups: alphanumerics + spaces only.\n const safeName =\n params.name.replace(/[^0-9A-Za-z\\s]/g, \" \").replace(/\\s+/g, \" \").trim() || \"Merchant\";\n const data = await this.post(\"account/ios/identifiers/addOMC.action\", {\n name: safeName, identifier: params.identifier, teamId: this.teamId,\n });\n // Spaceship's create_merchant! reads parse_response(r, 'omcId'); the\n // created record may be nested under `omcId` or returned flat.\n const rec = data.omcId ?? data;\n const id = typeof rec === \"string\" ? rec : (rec?.omcId ?? rec?.merchantId);\n if (!id) {\n throw new Error(\"Apple returned no internal merchant id (omcId) for the registered merchant.\");\n }\n return String(id);\n }\n\n /**\n * Enable the Apple Pay capability on an App ID. Apple Pay is a standard\n * AppService (service_id OM633U5T5G) whose service_uri is the default\n * `updateService.action` — confirmed in Spaceship's app_service.rb.\n */\n async enableApplePay(appIdId: string): Promise<void> {\n await this.post(\"account/ios/identifiers/updateService.action\", {\n teamId: this.teamId,\n displayId: appIdId,\n featureType: PortalClient.APPLE_PAY_FEATURE,\n featureValue: \"true\",\n });\n }\n\n /**\n * Associate merchant IDs with an App ID's Apple Pay capability. `omcIds`\n * are the internal ids (each merchant record's `omcId`), NOT the\n * `merchant.com.…` identifiers. Endpoint + params ported 1:1 from\n * Spaceship's associate_merchants_with_app (assignOMCToAppId.action — note\n * the singular \"OMC\", and NO displayId param).\n */\n async assignMerchants(params: { appIdId: string; omcIds: string[] }): Promise<void> {\n await this.post(\"account/ios/identifiers/assignOMCToAppId.action\", {\n teamId: this.teamId,\n appIdId: params.appIdId,\n omcIds: params.omcIds,\n });\n }\n\n /**\n * Create an Apple Pay **Payment Processing Certificate** on a merchant ID\n * from a CSR — the certificate a PSP (e.g. Stripe) hands you as a CSR, which\n * must be uploaded to the Merchant ID in Apple Developer, then the resulting\n * `.cer` downloaded and given back to the PSP so it can decrypt payment\n * tokens. This is the one manual Apple-portal step in wiring up Apple Pay.\n *\n * Ported 1:1 from Spaceship's create_certificate! (submitCertificateRequest\n * .action): the merchant's INTERNAL id (`omcId`) is passed as BOTH `appIdId`\n * and `specialIdentifierDisplayId` — the latter is how the portal scopes a\n * cert to a merchant/special identifier rather than an App ID. The cert type\n * is APPLE_PAY (`4APLUP237T`). Returns the created certRequest (its\n * `certificateId` feeds `downloadApplePayCertificate`).\n *\n * @param omcId the merchant's internal id (from createMerchant/listMerchants)\n * @param csrContent the PEM CSR string (Stripe's \"Apple Pay CSR\")\n */\n async createApplePayCertificate(params: { omcId: string; csrContent: string }): Promise<any> {\n const data = await this.post(\"account/ios/certificate/submitCertificateRequest.action\", {\n teamId: this.teamId,\n type: PortalClient.CERT_TYPES.APPLE_PAY,\n csrContent: params.csrContent,\n appIdId: params.omcId,\n specialIdentifierDisplayId: params.omcId,\n });\n return data.certRequest;\n }\n\n /**\n * Download an Apple Pay Payment Processing Certificate's raw bytes by its\n * certificate id (from `createApplePayCertificate`). Thin wrapper over\n * `downloadCertificate` pinned to the APPLE_PAY type — the DER `.cer` you\n * upload back into Stripe.\n */\n async downloadApplePayCertificate(certificateId: string): Promise<Buffer> {\n return this.downloadCertificate(certificateId, PortalClient.CERT_TYPES.APPLE_PAY);\n }\n\n // ── Certificates ───────────────────────────────────────────────────────\n\n async listCertificates(types?: string[]): Promise<any[]> {\n // Default to all known iOS cert type codes plus Fastlane's list of\n // legacy type codes (OLDER_IOS_CERTIFICATE_TYPES). The portal may still\n // return these older codes for pre-existing certs and Fastlane's\n // `Certificate.all` includes them — see certificate.rb line 278.\n const iosTypes = types ?? [\n PortalClient.CERT_TYPES.IOS_DEVELOPMENT,\n PortalClient.CERT_TYPES.IOS_DISTRIBUTION,\n ...PortalClient.OLDER_IOS_CERTIFICATE_TYPES,\n ];\n const data = await this.post(\"account/ios/certificate/listCertRequests.action\", {\n teamId: this.teamId, pageSize: \"500\", pageNumber: \"1\",\n sort: \"certRequestStatusCode=asc\", types: iosTypes.join(\",\"),\n });\n return data.certRequests ?? [];\n }\n\n async listPushCertificates(): Promise<any[]> {\n // iOS-only push cert type codes, deduplicated. The endpoint\n // `account/ios/certificate/listCertRequests.action` rejects any code\n // that isn't an iOS code (so Mac push types, even if listed in\n // CERT_TYPES, must be excluded) and rejects duplicates in the comma\n // list. We also include the legacy push cert codes from before\n // Apple's 2017 cert restructuring — they still occasionally appear\n // for older bundles.\n //\n // The modern unified \"Apple Push Services\" cert (one cert for both\n // prod + sandbox) reuses IOS_PRODUCTION_PUSH (UPV3DW712I), so the\n // first two codes catch every modern case.\n const types = Array.from(\n new Set([\n PortalClient.CERT_TYPES.IOS_PRODUCTION_PUSH,\n PortalClient.CERT_TYPES.IOS_DEVELOPMENT_PUSH,\n // Legacy push codes from OLDER_IOS_CERTIFICATE_TYPES\n \"3BQKVH9I2X\",\n \"BKLRAVXMGM\",\n ])\n );\n const data = await this.post(\"account/ios/certificate/listCertRequests.action\", {\n teamId: this.teamId, pageSize: \"500\", pageNumber: \"1\",\n sort: \"certRequestStatusCode=asc\",\n types: types.join(\",\"),\n });\n return data.certRequests ?? [];\n }\n\n async createCertificate(params: { type: string; csrContent: string; appIdId?: string }): Promise<any> {\n const reqParams: Record<string, string> = {\n teamId: this.teamId, type: params.type, csrContent: params.csrContent,\n };\n if (params.appIdId) reqParams.appIdId = params.appIdId;\n const data = await this.post(\"account/ios/certificate/submitCertificateRequest.action\", reqParams);\n return data.certRequest;\n }\n\n async downloadCertificate(certId: string, type: string): Promise<Buffer> {\n const headers: Record<string, string> = { Cookie: this.cookieStr, Accept: \"application/json\" };\n const res = await fetch(\n `${PORTAL_BASE}/account/ios/certificate/downloadCertificateContent.action?teamId=${this.teamId}&certificateId=${certId}&type=${type}`,\n { headers }\n );\n return Buffer.from(await res.arrayBuffer());\n }\n\n async revokeCertificate(certId: string, type: string): Promise<void> {\n await this.post(\"account/ios/certificate/revokeCertificate.action\", {\n teamId: this.teamId, certificateId: certId, type,\n });\n }\n\n // ── Devices ────────────────────────────────────────────────────────────\n\n async listDevices(): Promise<any[]> {\n const data = await this.post(\"account/ios/device/listDevices.action\", {\n teamId: this.teamId, pageSize: \"500\", pageNumber: \"1\", sort: \"name=asc\", includeRemovedDevices: \"false\",\n });\n return data.devices ?? [];\n }\n\n async registerDevice(params: { name: string; udid: string; deviceClass?: string }): Promise<any> {\n const data = await this.post(\"account/ios/device/addDevices.action\", {\n teamId: this.teamId, deviceNames: params.name, deviceNumbers: params.udid,\n register: \"single\", deviceClasses: params.deviceClass ?? \"iphone\",\n });\n return (data.devices ?? [])[0];\n }\n\n // ── Provisioning Profiles ──────────────────────────────────────────────\n\n async listProfiles(): Promise<any[]> {\n const data = await this.post(\"account/ios/profile/listProvisioningProfiles.action\", {\n teamId: this.teamId, includeInactiveProfiles: \"true\",\n pageSize: \"500\", pageNumber: \"1\", sort: \"name=asc\",\n });\n return data.provisioningProfiles ?? [];\n }\n\n async createProfile(params: {\n appIdId: string;\n name: string;\n distributionType: string; // \"limited\" (dev), \"store\" (appstore), \"adhoc\"\n certificateIds: string[];\n deviceIds?: string[];\n }): Promise<any> {\n const reqParams: Record<string, string | string[]> = {\n teamId: this.teamId,\n appIdId: params.appIdId,\n distributionType: params.distributionType,\n provisioningProfileName: params.name,\n certificateIds: params.certificateIds,\n };\n if (params.deviceIds?.length) reqParams.deviceIds = params.deviceIds;\n const data = await this.post(\"account/ios/profile/createProvisioningProfile.action\", reqParams);\n return data.provisioningProfile;\n }\n\n async deleteProfile(profileId: string): Promise<void> {\n await this.post(\"account/ios/profile/deleteProvisioningProfile.action\", {\n teamId: this.teamId, provisioningProfileId: profileId,\n });\n }\n\n async downloadProfile(profileId: string): Promise<Buffer> {\n const headers: Record<string, string> = { Cookie: this.cookieStr };\n const res = await fetch(\n `${PORTAL_BASE}/account/ios/profile/downloadProfileContent?teamId=${this.teamId}&provisioningProfileId=${profileId}`,\n { headers }\n );\n return Buffer.from(await res.arrayBuffer());\n }\n\n // ── Certificate Type Constants (matching Fastlane) ─────────────────────\n\n /**\n * Apple certificate type codes — copied 1:1 from Fastlane's\n * spaceship/portal/certificate.rb IOS_CERTIFICATE_TYPE_IDS / MAC_CERTIFICATE_TYPE_IDS\n */\n static CERT_TYPES = {\n // iOS\n IOS_DEVELOPMENT: \"5QPB9NHCEI\",\n IOS_DISTRIBUTION: \"R58UK2EWSO\", // App Store Production\n IOS_IN_HOUSE: \"9RQEK7MSXA\",\n IOS_DEVELOPMENT_PUSH: \"JKG5JZ54H7\",\n IOS_PRODUCTION_PUSH: \"UPV3DW712I\",\n APPLE_PUSH_PRODUCTION: \"UPV3DW712I\", // alias\n APPLE_PUSH_SANDBOX: \"JKG5JZ54H7\", // alias\n PASSBOOK: \"Y3B2F3TYSI\",\n WEBSITE_PUSH: \"3T2ZP62QW8\",\n VOIP_PUSH: \"E5D663CMZW\",\n APPLE_PAY: \"4APLUP237T\",\n APPLE_PAY_MERCHANT_IDENTITY: \"MD8Q2VRT6A\",\n // Universal (Apple Development/Distribution)\n APPLE_DEVELOPMENT: \"83Q87W3TGH\",\n APPLE_DISTRIBUTION: \"WXV89964HE\",\n // Mac\n MAC_DEVELOPMENT: \"749Y1QAGU7\",\n MAC_APP_DISTRIBUTION: \"HXZEUKP0FP\",\n MAC_INSTALLER_DISTRIBUTION: \"2PQI8IDXNH\",\n MAC_PRODUCTION_PUSH: \"CDZ7EMXIZ1\",\n MAC_DEVELOPMENT_PUSH: \"HQ4KP3I34R\",\n DEVELOPER_ID_APPLICATION: \"DIVN2GW3XT\",\n DEVELOPER_ID_INSTALLER: \"OYVN2GW35E\",\n } as const;\n\n /**\n * Legacy iOS certificate type codes that can still appear in the portal\n * responses. Port of Fastlane's Spaceship::Portal::Certificate\n * OLDER_IOS_CERTIFICATE_TYPES list (certificate.rb lines 180-189).\n */\n static OLDER_IOS_CERTIFICATE_TYPES: readonly string[] = [\n \"3BQKVH9I2X\", // old ProductionPush\n \"BKLRAVXMGM\", // old DevelopmentPush\n // Also sent by the browser, but not sure what they represent:\n \"T44PTHVNID\",\n \"DZQUP8189Y\",\n \"FGQUP4785Z\",\n \"S5WE21TULA\",\n \"FUOY7LWJET\",\n ] as const;\n}\n","/**\n * App Store Connect \"iris\" admin API client.\n *\n * The iris API lives at `https://appstoreconnect.apple.com/iris/v1/*` and\n * is what App Store Connect's own web UI uses for everything that doesn't\n * fit the public REST API (which requires JWT). Authentication is via the\n * Olympus session cookies we already obtain after SIRP + 2FA login.\n *\n * Notable iris endpoints (reverse-engineered from the App Store Connect\n * web app — Apple does not publish this API, so the shapes below are best\n * effort and may need iteration):\n *\n * POST /iris/v1/apiKeys\n * Body: { data: { type: \"apiKeys\", attributes: {\n * nickname, allAppsVisible, roles: [\"DEVELOPER\" | \"APP_MANAGER\" | ...]\n * }}}\n * Response: { data: { id, attributes: { nickname, kid, privateKey?, ... }}}\n *\n * `kid` is the key ID used in JWT auth (e.g. \"2X9R4HXF34\"). The\n * `privateKey` field, when present, contains the PEM-encoded .p8\n * content. Apple shows this exactly ONCE at creation time — if we\n * don't capture it, the key is bricked and must be revoked.\n *\n * GET /iris/v1/apiKeys\n * List existing keys. Used to find the issuer id.\n *\n * Roles the wizard uses: \"APP_MANAGER\" is the minimum needed for\n * TestFlight uploads via altool. Higher roles work too.\n *\n * Failure modes:\n * • 403 → user lacks Account Holder / Admin role → fall back to manual\n * • 4xx with `error.detail` → surface the message to the user\n * • 200 but no `privateKey` in response → endpoint shape changed,\n * surface so we can iterate\n */\n\nimport type { AppleSession } from \"./apple-session.js\";\n\nconst IRIS_BASE = \"https://appstoreconnect.apple.com/iris/v1\";\n\nexport type ApiKeyRole =\n | \"ADMIN\"\n | \"FINANCE\"\n | \"ACCESS_TO_REPORTS\"\n | \"APP_MANAGER\"\n | \"DEVELOPER\"\n | \"MARKETING\"\n | \"SALES\"\n | \"CUSTOMER_SUPPORT\";\n\nexport interface IrisApiKey {\n id: string;\n /** Key ID used for JWT auth (the short alphanumeric string) */\n kid: string;\n nickname: string;\n /** PEM-encoded .p8 private key — only present in create response, ONCE */\n privateKey?: string;\n /** Issuer id (UUID) — needed by altool/iTMSTransporter alongside the key id */\n issuerId?: string;\n roles: ApiKeyRole[];\n allAppsVisible: boolean;\n}\n\nexport class IrisClient {\n private cookieStr: string;\n\n constructor(private session: AppleSession) {\n this.cookieStr = Object.entries(session.cookies).map(([k, v]) => `${k}=${v}`).join(\"; \");\n }\n\n private buildHeaders(): Record<string, string> {\n return {\n Cookie: this.cookieStr,\n Accept: \"application/vnd.api+json, application/json, text/plain, */*\",\n \"Content-Type\": \"application/vnd.api+json\",\n \"X-Requested-With\": \"XMLHttpRequest\",\n // Mimic the App Store Connect web UI's user agent\n \"User-Agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Safari/605.1.15\",\n };\n }\n\n /**\n * Issue a request and absorb any new cookies (Apple rotates session\n * cookies on a lot of iris calls).\n */\n private async request(\n method: \"GET\" | \"POST\" | \"DELETE\",\n path: string,\n body?: unknown\n ): Promise<{ status: number; body: any; rawText: string }> {\n const headers = this.buildHeaders();\n if (process.env.FASTNODE_DEBUG) {\n console.log(`[iris] ${method} ${path}${body ? ` body=${JSON.stringify(body).slice(0, 200)}` : \"\"}`);\n }\n const res = await fetch(`${IRIS_BASE}${path}`, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n\n // Absorb new cookies\n for (const raw of res.headers.getSetCookie?.() ?? []) {\n const m = raw.match(/^([^=]+)=([^;]*)/);\n if (m) {\n this.session.cookies[m[1]] = m[2];\n }\n }\n this.cookieStr = Object.entries(this.session.cookies)\n .map(([k, v]) => `${k}=${v}`)\n .join(\"; \");\n\n const text = await res.text();\n let parsed: any = null;\n try {\n parsed = text ? JSON.parse(text) : null;\n } catch {\n // not JSON\n }\n if (process.env.FASTNODE_DEBUG) {\n console.log(`[iris] → ${res.status} ${text.slice(0, 300)}`);\n }\n return { status: res.status, body: parsed, rawText: text };\n }\n\n /**\n * List existing API keys. Used both as a sanity check (the user has\n * permission) and to discover the team's issuer id (which is the same\n * for every key in the team and is needed by altool).\n *\n * Important: Apple's iris endpoint rejects most query parameters with\n * `PARAMETER_ERROR.INVALID`. Call with no params and let the API return\n * its default page.\n */\n async listApiKeys(): Promise<{ keys: IrisApiKey[]; issuerId?: string }> {\n const { status, body, rawText } = await this.request(\"GET\", \"/apiKeys\");\n if (status === 403) {\n throw new IrisAuthError(\n \"You don't have permission to manage App Store Connect API keys (this requires the Account Holder or Admin role).\"\n );\n }\n if (status >= 400 || !body) {\n throw new Error(`iris listApiKeys failed (${status}): ${rawText.slice(0, 200)}`);\n }\n\n const issuerId = body?.meta?.issuerId ?? body?.data?.[0]?.attributes?.issuerId;\n const keys: IrisApiKey[] = (body.data ?? []).map((d: any) => ({\n id: d.id,\n kid: d.attributes?.kid ?? d.id,\n nickname: d.attributes?.nickname ?? \"\",\n issuerId: d.attributes?.issuerId ?? issuerId,\n roles: d.attributes?.roles ?? [],\n allAppsVisible: d.attributes?.allAppsVisible ?? true,\n }));\n return { keys, issuerId };\n }\n\n /**\n * Create a new API key. Apple returns the .p8 PEM exactly once in the\n * create response — capture it immediately or the key is dead weight.\n *\n * `keyType` is required by Apple's iris API:\n * • PUBLIC_API — the standard team-wide API key (what TestFlight uploads need)\n * • MARKETING_API — for App Analytics access only\n */\n async createApiKey(input: {\n nickname: string;\n roles?: ApiKeyRole[];\n allAppsVisible?: boolean;\n keyType?: \"PUBLIC_API\" | \"MARKETING_API\";\n }): Promise<IrisApiKey> {\n const requestBody = {\n data: {\n type: \"apiKeys\",\n attributes: {\n nickname: input.nickname,\n roles: input.roles ?? [\"APP_MANAGER\"],\n allAppsVisible: input.allAppsVisible ?? true,\n keyType: input.keyType ?? \"PUBLIC_API\",\n },\n },\n };\n\n // Always log this — it's the trickiest call in the whole orchestrator\n // and we need full visibility while the iris API is being shaken out.\n console.log(\"[iris] createApiKey request:\", JSON.stringify(requestBody));\n const { status, body, rawText } = await this.request(\"POST\", \"/apiKeys\", requestBody);\n console.log(`[iris] createApiKey response: ${status} ${rawText.slice(0, 800)}`);\n\n if (status === 403) {\n throw new IrisAuthError(\n \"You don't have permission to create App Store Connect API keys (this requires the Account Holder or Admin role).\"\n );\n }\n if (status >= 400 || !body) {\n const msg =\n body?.errors?.[0]?.detail ??\n body?.errors?.[0]?.title ??\n rawText.slice(0, 300) ??\n `iris createApiKey failed (${status})`;\n throw new Error(msg);\n }\n\n const data = body.data ?? body;\n if (!data?.id) {\n throw new Error(`iris createApiKey returned no key id. Raw response: ${rawText.slice(0, 400)}`);\n }\n\n const key: IrisApiKey = {\n id: data.id,\n kid: data.attributes?.kid ?? data.id,\n nickname: data.attributes?.nickname ?? input.nickname,\n privateKey: data.attributes?.privateKey,\n issuerId: data.attributes?.issuerId,\n roles: data.attributes?.roles ?? input.roles ?? [\"APP_MANAGER\"],\n allAppsVisible: data.attributes?.allAppsVisible ?? true,\n };\n return key;\n }\n\n /**\n * Fetch the .p8 PEM AND the team's issuer id for a previously-created\n * ASC API key. Both come back in a single request via:\n *\n * GET /iris/v1/apiKeys/{id}?fields[apiKeys]=privateKey&include=provider\n *\n * Sparse fieldset requesting ONLY `privateKey` is the magic that makes\n * Apple actually include the (base64-encoded) PEM in the response —\n * the default view returns `privateKey: null`. The `include=provider`\n * pulls the team's contentProvider record into `included[]`, and its\n * `id` field IS the issuer id altool needs (a UUID like\n * `cfadaf94-44ca-4c2c-8fa6-ecc28d3c7d0d`).\n *\n * Reverse-engineered from @expo/apple-utils v2.1.21 (the package that\n * powers EAS CLI), specifically the `ApiKey.downloadAsync` method\n * combined with `ApiKey.infoAsync` reading `provider?.id`.\n *\n * Returns `{ pem, issuerId }`, or `null` if Apple won't return the\n * private key (typically because the key was already downloaded once).\n */\n async fetchApiKeyPrivateKey(keyId: string): Promise<{ pem: string; issuerId?: string } | null> {\n try {\n const url = `${IRIS_BASE}/apiKeys/${keyId}?fields%5BapiKeys%5D=privateKey&include=provider`;\n const res = await fetch(url, {\n headers: {\n ...this.buildHeaders(),\n Accept: \"application/vnd.api+json, application/json, text/plain, */*\",\n },\n });\n const text = await res.text();\n console.log(`[iris] fetchApiKeyPrivateKey → ${res.status} (${text.length} bytes)`);\n if (res.status !== 200) {\n console.log(`[iris] err: ${text.slice(0, 300)}`);\n return null;\n }\n const body = JSON.parse(text);\n const encoded = body?.data?.attributes?.privateKey;\n if (typeof encoded !== \"string\" || encoded.length === 0) {\n console.log(`[iris] no privateKey in response`);\n return null;\n }\n const pem = Buffer.from(encoded, \"base64\").toString(\"utf-8\");\n if (!pem.includes(\"BEGIN PRIVATE KEY\")) {\n console.log(`[iris] decoded body didn't contain PEM marker`);\n return null;\n }\n // Issuer id is the contentProvider in the included array\n const provider = (body?.included ?? []).find((i: any) => i.type === \"contentProviders\");\n const issuerId = provider?.id;\n console.log(`[iris] ✓ PEM ${pem.length} bytes, issuerId=${issuerId ?? \"(missing)\"}`);\n return { pem, issuerId };\n } catch (err) {\n console.log(`[iris] fetchApiKeyPrivateKey error: ${(err as Error).message}`);\n return null;\n }\n }\n\n /**\n * @deprecated Kept as a fallback probe for debugging. The real path\n * is the sparse fieldset above — everything in this brute-force list\n * returned 404 during testing. Left here so we can re-verify if Apple\n * changes anything.\n */\n async fetchApiKeyPrivateKeyBruteForce(keyId: string): Promise<string | null> {\n type Attempt =\n | { kind: \"GET\"; path: string; accept?: string }\n | { kind: \"POST\"; path: string; body?: unknown }\n | { kind: \"ABSOLUTE\"; url: string };\n\n const attempts: Attempt[] = [\n // Sparse fieldsets — JSON-API spec lets us request specific attributes.\n // Apple may exclude privateKey by default and return it only when asked.\n { kind: \"GET\", path: `/apiKeys/${keyId}?fields[apiKeys]=privateKey,kid,issuerId,nickname,roles` },\n { kind: \"GET\", path: `/apiKeys/${keyId}?include=privateKey` },\n { kind: \"GET\", path: `/apiKeys/${keyId}?fields[apiKeys]=privateKey` },\n // Custom Accept headers — maybe Apple negotiates content type\n { kind: \"GET\", path: `/apiKeys/${keyId}`, accept: \"application/x-pem-file\" },\n { kind: \"GET\", path: `/apiKeys/${keyId}`, accept: \"application/octet-stream\" },\n { kind: \"GET\", path: `/apiKeys/${keyId}/p8`, accept: \"application/x-pem-file\" },\n // POST variants — Apple sometimes uses POST to mint a download token\n { kind: \"POST\", path: `/apiKeys/${keyId}/secrets`, body: {} },\n { kind: \"POST\", path: `/apiKeys/${keyId}/regenerate`, body: {} },\n { kind: \"POST\", path: `/apiKeys/${keyId}/p8`, body: {} },\n // Bare GET (last) — confirms canonical fields, in case my parser missed any\n { kind: \"GET\", path: `/apiKeys/${keyId}` },\n // Different host — the legacy developer.apple.com user-and-access namespace\n { kind: \"ABSOLUTE\", url: `https://appstoreconnect.apple.com/api/v1/apiKeys/${keyId}/p8` },\n { kind: \"ABSOLUTE\", url: `https://appstoreconnect.apple.com/access/api/keys/${keyId}/download` },\n ];\n\n for (const attempt of attempts) {\n try {\n let result: { status: number; body: any; rawText: string };\n if (attempt.kind === \"GET\") {\n // Custom request that allows overriding Accept header.\n result = await this.requestWithHeaders(\"GET\", attempt.path, undefined, {\n ...(attempt.accept ? { Accept: attempt.accept } : {}),\n });\n console.log(`[iris] fetchApiKeyPrivateKey GET ${attempt.path}${attempt.accept ? ` accept=${attempt.accept}` : \"\"} → ${result.status} (${result.rawText.length} bytes)`);\n } else if (attempt.kind === \"POST\") {\n result = await this.request(\"POST\", attempt.path, attempt.body);\n console.log(`[iris] fetchApiKeyPrivateKey POST ${attempt.path} → ${result.status} (${result.rawText.length} bytes)`);\n } else {\n result = await this.requestAbsolute(\"GET\", attempt.url);\n console.log(`[iris] fetchApiKeyPrivateKey GET ${attempt.url} → ${result.status} (${result.rawText.length} bytes)`);\n }\n\n // For 200 responses, log the full body so we can see what Apple is returning.\n if (result.status === 200) {\n console.log(`[iris] body: ${result.rawText.slice(0, 1500)}`);\n }\n if (result.status !== 200) continue;\n\n // Plain PEM body\n if (result.rawText && result.rawText.includes(\"BEGIN PRIVATE KEY\")) {\n console.log(`[iris] ✓ found PEM (plain text response)`);\n return result.rawText;\n }\n // JSON wrapper that might contain the PEM under various attribute names\n if (result.body) {\n const candidates = [\n result.body?.data?.attributes?.privateKey,\n result.body?.data?.attributes?.p8,\n result.body?.data?.attributes?.privateKeyContent,\n result.body?.data?.attributes?.kpem,\n result.body?.data?.attributes?.secret,\n result.body?.data?.attributes?.keyContent,\n result.body?.privateKey,\n result.body?.p8,\n result.body?.value,\n result.body?.secret,\n ];\n for (const c of candidates) {\n if (typeof c === \"string\" && c.includes(\"BEGIN PRIVATE KEY\")) {\n console.log(`[iris] ✓ found PEM in JSON response`);\n return c;\n }\n }\n }\n } catch (err) {\n console.log(`[iris] fetchApiKeyPrivateKey attempt failed: ${(err as Error).message}`);\n }\n }\n console.log(`[iris] fetchApiKeyPrivateKey: no working download path for key ${keyId}`);\n return null;\n }\n\n /** Internal: like request() but lets us override headers. */\n private async requestWithHeaders(\n method: \"GET\" | \"POST\" | \"DELETE\",\n path: string,\n body?: unknown,\n extraHeaders: Record<string, string> = {}\n ): Promise<{ status: number; body: any; rawText: string }> {\n const headers = { ...this.buildHeaders(), ...extraHeaders };\n const res = await fetch(`${IRIS_BASE}${path}`, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n for (const raw of res.headers.getSetCookie?.() ?? []) {\n const m = raw.match(/^([^=]+)=([^;]*)/);\n if (m) this.session.cookies[m[1]] = m[2];\n }\n this.cookieStr = Object.entries(this.session.cookies).map(([k, v]) => `${k}=${v}`).join(\"; \");\n const text = await res.text();\n let parsed: any = null;\n try { parsed = text ? JSON.parse(text) : null; } catch {}\n return { status: res.status, body: parsed, rawText: text };\n }\n\n /** Internal: fetch an absolute URL with the session cookies. */\n private async requestAbsolute(\n method: \"GET\" | \"POST\" | \"DELETE\",\n url: string\n ): Promise<{ status: number; body: any; rawText: string }> {\n const headers = this.buildHeaders();\n const res = await fetch(url, { method, headers });\n const text = await res.text();\n let parsed: any = null;\n try { parsed = text ? JSON.parse(text) : null; } catch {}\n return { status: res.status, body: parsed, rawText: text };\n }\n\n async deleteApiKey(keyId: string): Promise<void> {\n await this.request(\"DELETE\", `/apiKeys/${keyId}`);\n }\n}\n\n/** Thrown when the user doesn't have permission to use the iris admin API. */\nexport class IrisAuthError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"IrisAuthError\";\n }\n}\n","import { TokenManager } from \"./auth.js\";\nimport { RequestClient } from \"./request.js\";\nimport type { AppStoreConnectConfig, ListParams, RequestOptions } from \"./types.js\";\nimport { CertificatesResource } from \"../resources/certificates.js\";\nimport { ProfilesResource } from \"../resources/profiles.js\";\nimport { BundleIdsResource } from \"../resources/bundle-ids.js\";\nimport { DevicesResource } from \"../resources/devices.js\";\nimport { AppsResource } from \"../resources/apps.js\";\nimport { BuildsResource } from \"../resources/builds.js\";\nimport { BetaGroupsResource } from \"../resources/beta-groups.js\";\nimport { CapabilitiesResource } from \"../resources/capabilities.js\";\nimport { AppStoreVersionsResource } from \"../resources/app-store-versions.js\";\nimport { AppScreenshotsResource } from \"../resources/app-screenshots.js\";\nimport { ReviewSubmissionsResource } from \"../resources/review-submissions.js\";\nimport { AppInfosResource } from \"../resources/app-info.js\";\nimport { AppInfoLocalizationsResource } from \"../resources/app-info-localizations.js\";\nimport { AppStoreReviewDetailsResource } from \"../resources/app-store-review-details.js\";\nimport { BetaTestersResource } from \"../resources/beta-testers.js\";\nimport { BetaAppReviewSubmissionsResource } from \"../resources/beta-app-review-submissions.js\";\nimport { BetaAppReviewDetailsResource } from \"../resources/beta-app-review-details.js\";\nimport { BetaInvitationsResource } from \"../resources/beta-invitations.js\";\nimport { BetaLicensesResource } from \"../resources/beta-licenses.js\";\nimport { AppPreviewsResource } from \"../resources/app-previews.js\";\nimport { AppPreviewSetsResource } from \"../resources/app-preview-sets.js\";\nimport { AppPricesResource } from \"../resources/app-prices.js\";\nimport { TerritoriesResource } from \"../resources/territories.js\";\nimport { AgeRatingDeclarationsResource } from \"../resources/age-rating-declarations.js\";\nimport { AppCategoriesResource } from \"../resources/app-categories.js\";\nimport { AppEncryptionDeclarationsResource } from \"../resources/app-encryption-declarations.js\";\nimport { IdfaDeclarationsResource } from \"../resources/idfa-declarations.js\";\nimport { PreReleaseVersionsResource } from \"../resources/pre-release-versions.js\";\nimport { ReviewSubmissionItemsResource } from \"../resources/review-submission-items.js\";\nimport { UsersResource } from \"../resources/users.js\";\nimport { UserInvitationsResource } from \"../resources/user-invitations.js\";\nimport { InAppPurchasesResource } from \"../resources/in-app-purchases.js\";\nimport { GameCenterDetailResource } from \"../resources/game-center-detail.js\";\nimport { XcodeMetricsResource } from \"../resources/xcode-metrics.js\";\nimport { AppAssetLibrariesResource } from \"../resources/app-asset-libraries.js\";\nimport {\n AppAssetLibraryImagesResource,\n AppAssetLibraryVideosResource,\n} from \"../resources/app-asset-library-assets.js\";\nimport { AppAssetLibraryPlacementsResource } from \"../resources/app-asset-library-placements.js\";\n\nexport type { AppStoreConnectConfig, ListParams, RequestOptions };\nexport { TokenManager } from \"./auth.js\";\nexport type { TokenConfig } from \"./auth.js\";\nexport { RequestClient, AppStoreConnectError, RateLimitError } from \"./request.js\";\nexport type * from \"./types.js\";\nexport {\n loginWithAppleId,\n beginLogin,\n submitTwoFactorCode,\n requestSmsCode,\n checkPortalResponse,\n ProgramLicenseAgreementError,\n} from \"./apple-session.js\";\nexport type {\n AppleSessionConfig,\n AppleSession,\n ContractMessage,\n PendingLogin,\n TwoFactorChallenge,\n BeginLoginResult,\n} from \"./apple-session.js\";\nexport {\n signInWithAppleId,\n loadAppleSession,\n saveAppleSession,\n clearAppleSession,\n lastAppleId,\n sessionDir,\n} from \"./session-store.js\";\nexport { PortalClient } from \"./portal.js\";\nexport { IrisClient, IrisAuthError } from \"./iris.js\";\nexport type { IrisApiKey, ApiKeyRole } from \"./iris.js\";\n\nexport class AppStoreConnectClient {\n readonly http: RequestClient;\n\n readonly certificates: CertificatesResource;\n readonly profiles: ProfilesResource;\n readonly bundleIds: BundleIdsResource;\n readonly devices: DevicesResource;\n readonly apps: AppsResource;\n readonly builds: BuildsResource;\n readonly betaGroups: BetaGroupsResource;\n readonly capabilities: CapabilitiesResource;\n readonly appStoreVersions: AppStoreVersionsResource;\n readonly appScreenshots: AppScreenshotsResource;\n readonly reviewSubmissions: ReviewSubmissionsResource;\n readonly appInfos: AppInfosResource;\n readonly appInfoLocalizations: AppInfoLocalizationsResource;\n readonly appStoreReviewDetails: AppStoreReviewDetailsResource;\n readonly betaTesters: BetaTestersResource;\n readonly betaAppReviewSubmissions: BetaAppReviewSubmissionsResource;\n readonly betaAppReviewDetails: BetaAppReviewDetailsResource;\n readonly betaInvitations: BetaInvitationsResource;\n readonly betaLicenses: BetaLicensesResource;\n readonly appPreviews: AppPreviewsResource;\n readonly appPreviewSets: AppPreviewSetsResource;\n readonly appPrices: AppPricesResource;\n readonly territories: TerritoriesResource;\n readonly ageRatingDeclarations: AgeRatingDeclarationsResource;\n readonly appCategories: AppCategoriesResource;\n readonly appEncryptionDeclarations: AppEncryptionDeclarationsResource;\n readonly idfaDeclarations: IdfaDeclarationsResource;\n readonly preReleaseVersions: PreReleaseVersionsResource;\n readonly reviewSubmissionItems: ReviewSubmissionItemsResource;\n readonly users: UsersResource;\n readonly userInvitations: UserInvitationsResource;\n readonly inAppPurchases: InAppPurchasesResource;\n readonly gameCenterDetail: GameCenterDetailResource;\n readonly xcodeMetrics: XcodeMetricsResource;\n readonly appAssetLibraries: AppAssetLibrariesResource;\n readonly appAssetLibraryImages: AppAssetLibraryImagesResource;\n readonly appAssetLibraryVideos: AppAssetLibraryVideosResource;\n readonly appAssetLibraryPlacements: AppAssetLibraryPlacementsResource;\n\n constructor(config: AppStoreConnectConfig) {\n const tokenManager = new TokenManager({\n keyId: config.keyId,\n issuerId: config.issuerId,\n privateKey: config.privateKey,\n enterprise: config.enterprise,\n duration: config.tokenDuration,\n });\n this.http = new RequestClient(tokenManager, config.enterprise);\n\n this.certificates = new CertificatesResource(this.http);\n this.profiles = new ProfilesResource(this.http);\n this.bundleIds = new BundleIdsResource(this.http);\n this.devices = new DevicesResource(this.http);\n this.apps = new AppsResource(this.http);\n this.builds = new BuildsResource(this.http);\n this.betaGroups = new BetaGroupsResource(this.http);\n this.capabilities = new CapabilitiesResource(this.http);\n this.appStoreVersions = new AppStoreVersionsResource(this.http);\n this.appScreenshots = new AppScreenshotsResource(this.http);\n this.reviewSubmissions = new ReviewSubmissionsResource(this.http);\n this.appInfos = new AppInfosResource(this.http);\n this.appInfoLocalizations = new AppInfoLocalizationsResource(this.http);\n this.appStoreReviewDetails = new AppStoreReviewDetailsResource(this.http);\n this.betaTesters = new BetaTestersResource(this.http);\n this.betaAppReviewSubmissions = new BetaAppReviewSubmissionsResource(this.http);\n this.betaAppReviewDetails = new BetaAppReviewDetailsResource(this.http);\n this.betaInvitations = new BetaInvitationsResource(this.http);\n this.betaLicenses = new BetaLicensesResource(this.http);\n this.appPreviews = new AppPreviewsResource(this.http);\n this.appPreviewSets = new AppPreviewSetsResource(this.http);\n this.appPrices = new AppPricesResource(this.http);\n this.territories = new TerritoriesResource(this.http);\n this.ageRatingDeclarations = new AgeRatingDeclarationsResource(this.http);\n this.appCategories = new AppCategoriesResource(this.http);\n this.appEncryptionDeclarations = new AppEncryptionDeclarationsResource(this.http);\n this.idfaDeclarations = new IdfaDeclarationsResource(this.http);\n this.preReleaseVersions = new PreReleaseVersionsResource(this.http);\n this.reviewSubmissionItems = new ReviewSubmissionItemsResource(this.http);\n this.users = new UsersResource(this.http);\n this.userInvitations = new UserInvitationsResource(this.http);\n this.inAppPurchases = new InAppPurchasesResource(this.http);\n this.gameCenterDetail = new GameCenterDetailResource(this.http);\n this.xcodeMetrics = new XcodeMetricsResource(this.http);\n this.appAssetLibraries = new AppAssetLibrariesResource(this.http);\n this.appAssetLibraryImages = new AppAssetLibraryImagesResource(this.http);\n this.appAssetLibraryVideos = new AppAssetLibraryVideosResource(this.http);\n this.appAssetLibraryPlacements = new AppAssetLibraryPlacementsResource(this.http);\n }\n\n async request<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.http.request<T>(path, options);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/client/auth.ts","../../src/client/srp.ts","../../src/client/apple-session.ts","../../src/client/request.ts","../../src/resources/certificates.ts","../../src/resources/profiles.ts","../../src/resources/bundle-ids.ts","../../src/resources/devices.ts","../../src/resources/apps.ts","../../src/resources/builds.ts","../../src/resources/beta-groups.ts","../../src/resources/capabilities.ts","../../src/resources/app-store-versions.ts","../../src/resources/app-screenshots.ts","../../src/resources/review-submissions.ts","../../src/resources/app-info.ts","../../src/resources/app-info-localizations.ts","../../src/resources/app-store-review-details.ts","../../src/resources/beta-testers.ts","../../src/resources/beta-app-review-submissions.ts","../../src/resources/beta-app-review-details.ts","../../src/resources/beta-invitations.ts","../../src/resources/beta-licenses.ts","../../src/resources/app-previews.ts","../../src/resources/app-preview-sets.ts","../../src/resources/app-prices.ts","../../src/resources/territories.ts","../../src/resources/age-rating-declarations.ts","../../src/resources/app-categories.ts","../../src/resources/app-encryption-declarations.ts","../../src/resources/idfa-declarations.ts","../../src/resources/pre-release-versions.ts","../../src/resources/review-submission-items.ts","../../src/resources/users.ts","../../src/resources/user-invitations.ts","../../src/resources/in-app-purchases.ts","../../src/resources/game-center-detail.ts","../../src/resources/xcode-metrics.ts","../../src/resources/app-asset-libraries.ts","../../src/resources/app-asset-library-assets.ts","../../src/resources/app-asset-library-placements.ts","../../src/client/session-store.ts","../../src/client/portal.ts","../../src/client/iris.ts","../../src/client/index.ts"],"names":["choice","phone","code","createHash","detail","id","OLYMPUS_SESSION"],"mappings":"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","file":"index.mjs","sourcesContent":["import { SignJWT, importPKCS8 } from \"jose\";\n\nexport interface TokenConfig {\n keyId: string;\n /** Issuer ID. When absent, the key is treated as an individual key (sub='user'). */\n issuerId?: string;\n privateKey: string;\n enterprise?: boolean;\n duration?: number;\n}\n\nconst MAX_TOKEN_DURATION = 1200;\nconst DEFAULT_TOKEN_DURATION = 500;\n\nexport class TokenManager {\n private config: TokenConfig;\n private currentToken: string | null = null;\n private expiresAt = 0;\n\n constructor(config: TokenConfig) {\n this.config = config;\n }\n\n async getToken(): Promise<string> {\n const now = Math.floor(Date.now() / 1000);\n if (this.currentToken && now < this.expiresAt - 30) {\n return this.currentToken;\n }\n return this.refresh();\n }\n\n async refresh(): Promise<string> {\n const duration = Math.min(\n this.config.duration ?? DEFAULT_TOKEN_DURATION,\n MAX_TOKEN_DURATION\n );\n const audience = this.config.enterprise\n ? \"apple-developer-enterprise-v1\"\n : \"appstoreconnect-v1\";\n\n const key = await importPKCS8(this.config.privateKey, \"ES256\");\n const now = Math.floor(Date.now() / 1000);\n\n // Mirror Fastlane's Spaceship::ConnectAPI::Token#refresh! behavior:\n // when issuerId is provided → set `iss`; otherwise treat as individual key\n // and set `sub: 'user'`.\n // https://developer.apple.com/documentation/appstoreconnectapi/generating_tokens_for_api_requests#4313913\n let jwt = new SignJWT(this.config.issuerId ? {} : { sub: \"user\" })\n .setProtectedHeader({\n alg: \"ES256\",\n kid: this.config.keyId,\n typ: \"JWT\",\n })\n .setIssuedAt(now - 60)\n .setExpirationTime(now + duration)\n .setAudience(audience);\n\n if (this.config.issuerId) {\n jwt = jwt.setIssuer(this.config.issuerId);\n }\n\n this.currentToken = await jwt.sign(key);\n\n this.expiresAt = now + duration;\n return this.currentToken;\n }\n\n invalidate(): void {\n this.currentToken = null;\n this.expiresAt = 0;\n }\n}\n","/**\n * SRP (Secure Remote Password) implementation\n * 1:1 port of the fastlane-sirp Ruby gem\n * Used for Apple ID authentication\n */\n\nimport { createHash, randomBytes, pbkdf2Sync } from \"node:crypto\";\n\n// ── RFC 5054 SRP Group Parameters ──────────────────────────────────────────\n\n// Copied exactly from fastlane-sirp parameters.rb (2048-bit group)\nconst N_2048 = BigInt(\n \"0x\" +\n \"AC6BDB41324A9A9BF166DE5E1389582FAF72B6651987EE07FC3192943DB56050\" +\n \"A37329CBB4A099ED8193E0757767A13DD52312AB4B03310DCD7F48A9DA04FD50\" +\n \"E8083969EDB767B0CF6095179A163AB3661A05FBD5FAAAE82918A9962F0B93B8\" +\n \"55F97993EC975EEAA80D740ADBF4FF747359D041D5C33EA71D281E446B14773B\" +\n \"CA97B43A23FB801676BD207A436C6481F1D2B9078717461A5B9D32E688F87748\" +\n \"544523B524B0D57D5EA77A2775D2ECFA032CFBDBF52FB3786160279004E57AE6\" +\n \"AF874E7303CE53299CCC041C7BC308D82A5698F3A8D0C38271AE35F8E9DBFBB\" +\n \"694B5C803D89F7AE435DE236D525F54759B65E372FCD68EF20FA7111F9E4AFF73\"\n);\nconst g_2048 = 2n;\n\n// ── Utility Functions ──────────────────────────────────────────────────────\n\nfunction numToHex(num: bigint): string {\n let hex = num.toString(16);\n if (hex.length % 2 !== 0) hex = \"0\" + hex;\n return hex.toLowerCase();\n}\n\nfunction hexToBytes(hex: string): Buffer {\n return Buffer.from(hex, \"hex\");\n}\n\nfunction shaHex(h: string, algorithm: string): string {\n return createHash(algorithm).update(hexToBytes(h)).digest(\"hex\");\n}\n\nfunction shaStr(s: string, algorithm: string): string {\n return createHash(algorithm).update(s).digest(\"hex\");\n}\n\nfunction modExp(base: bigint, exp: bigint, mod: bigint): bigint {\n if (mod === 1n) return 0n;\n let result = 1n;\n base = base % mod;\n while (exp > 0n) {\n if (exp % 2n === 1n) {\n result = (result * base) % mod;\n }\n exp = exp / 2n;\n base = (base * base) % mod;\n }\n return result;\n}\n\nfunction H(algorithm: string, n: bigint, ...args: (bigint | string | undefined)[]): bigint {\n const nHex = numToHex(n);\n // Must match Ruby: nlen = 2 * ((('%x' % [n]).length * 4 + 7) >> 3)\n // Use floor division (>>3), NOT ceiling\n const nlen = 2 * (((nHex.length * 4 + 7) >> 3));\n\n let hashin = \"\";\n for (const s of args) {\n if (s === undefined) continue;\n const shex = typeof s === \"string\" ? s : numToHex(s);\n if (shex.length > nlen) {\n throw new Error(\"Bit width does not match - client uses different prime\");\n }\n hashin += \"0\".repeat(nlen - shex.length) + shex;\n }\n\n const hashed = shaHex(hashin, algorithm);\n return BigInt(\"0x\" + hashed) % n;\n}\n\n// ── SRP Client ─────────────────────────────────────────────────────────────\n\nexport class SRPClient {\n private N: bigint;\n private g: bigint;\n private hashAlg: string;\n private k: bigint;\n private a: bigint;\n A: string;\n private S: string | null = null;\n private K: string | null = null;\n M: string | null = null;\n H_AMK: string | null = null;\n\n constructor(group: number = 2048) {\n if (group !== 2048) throw new Error(\"Only 2048-bit group is supported\");\n this.N = N_2048;\n this.g = g_2048;\n this.hashAlg = \"sha256\";\n this.k = H(this.hashAlg, this.N, this.N, this.g);\n // Generate random 'a'\n this.a = BigInt(\"0x\" + randomBytes(256).toString(\"hex\"));\n // Compute A = g^a mod N\n this.A = numToHex(modExp(this.g, this.a, this.N));\n }\n\n startAuthentication(): string {\n return this.A;\n }\n\n processChallenge(\n username: string,\n password: string, // hex-encoded encrypted password\n xsalt: string, // hex\n xbb: string, // hex\n isPasswordEncrypted: boolean = false\n ): string | false {\n const bb = BigInt(\"0x\" + xbb);\n\n // SRP-6a safety check\n if (bb % this.N === 0n) return false;\n\n let x: bigint;\n if (isPasswordEncrypted) {\n x = this.calcXHex(password, xsalt);\n } else {\n x = this.calcX(username, password, xsalt);\n }\n\n const u = H(this.hashAlg, this.N, this.A, xbb);\n if (u === 0n) return false;\n\n // S = (B - k * g^x) ^ (a + u*x) mod N\n const gx = modExp(this.g, x, this.N);\n let base = (bb - this.k * gx) % this.N;\n if (base < 0n) base += this.N;\n const exp = this.a + x * u;\n this.S = numToHex(modExp(base, exp, this.N));\n this.K = shaHex(this.S, this.hashAlg);\n\n // M = H(H(N) xor H(g), H(I), s, A, B, K)\n const hxor = H(this.hashAlg, this.N, this.N) ^ H(this.hashAlg, this.N, this.g);\n const buf =\n numToHex(hxor) +\n shaStr(username, this.hashAlg) +\n xsalt +\n this.A +\n xbb +\n this.K;\n const bytes = hexToBytes(buf);\n this.M = createHash(this.hashAlg).update(bytes).digest(\"hex\");\n\n // H_AMK = H(A, M, K)\n const amkBytes = hexToBytes(this.A + this.M + this.K);\n this.H_AMK = numToHex(\n BigInt(\"0x\" + createHash(this.hashAlg).update(amkBytes).digest(\"hex\"))\n );\n\n return this.M;\n }\n\n private calcX(username: string, password: string, xsalt: string): bigint {\n const spad = xsalt.length % 2 !== 0 ? \"0\" : \"\";\n const inner = shaStr(`${username}:${password}`, this.hashAlg);\n return BigInt(\"0x\" + shaHex(spad + xsalt + inner, this.hashAlg));\n }\n\n private calcXHex(xpassword: string, xsalt: string): bigint {\n // calc_x_hex: sha_hex(xsalt + sha_hex(\":\" hex + xpassword), hash)\n const colonHex = \":\".charCodeAt(0).toString(16);\n const inner = shaHex(colonHex + xpassword, this.hashAlg);\n return BigInt(\"0x\" + shaHex(xsalt + inner, this.hashAlg));\n }\n}\n\n// ── Apple PBKDF2 password derivation ───────────────────────────────────────\n\nexport function applePbkdf2(\n password: string,\n salt: Buffer,\n iterations: number,\n keyLength: number,\n protocol: string\n): Buffer {\n if (![\"s2k\", \"s2k_fo\"].includes(protocol)) {\n throw new Error(`Unsupported protocol '${protocol}' for pbkdf2`);\n }\n\n // First hash the password with SHA-256\n let passwordBytes: Buffer | string = createHash(\"sha256\").update(password).digest();\n\n if (protocol === \"s2k_fo\") {\n // Legacy: convert to hex string\n passwordBytes = passwordBytes.toString(\"hex\");\n }\n\n return pbkdf2Sync(passwordBytes, salt, iterations, keyLength, \"sha256\");\n}\n","/**\n * Apple ID Session Authentication\n * 1:1 port of Fastlane Spaceship client.rb + two_step_or_factor_client.rb\n *\n * Two flows:\n *\n * loginWithAppleId({ email, password, onPrompt })\n * - blocking, CLI-style. onPrompt is awaited to collect 2FA codes.\n *\n * beginLogin({ email, password }) → { kind: \"logged_in\" | \"needs_2fa\", ... }\n * submitTwoFactorCode({ pending, code, source, ... }) → AppleSession\n * requestSmsCode({ pending, phoneId, mode })\n * - HTTP-resumable. Used by the App Release wizard, where the 2FA\n * challenge is rendered in a browser modal and the code arrives in\n * a separate request.\n */\n\nimport { createHash } from \"node:crypto\";\nimport { createInterface } from \"node:readline\";\nimport { SRPClient, applePbkdf2 } from \"./srp.js\";\n\nconst AUTH_BASE = \"https://idmsa.apple.com/appleauth/auth\";\n\n/**\n * Apple's answer as JSON, or a readable error when it is not.\n *\n * Apple's sign-in endpoints sometimes answer with an HTML page rather than\n * JSON: a \"Service Unavailable\" or \"Access Denied\" page when it is refusing or\n * rate-limiting a server, a maintenance page, a redirect to a captcha. Parsed\n * blindly, the failure surfaced as `Unexpected token '<', \"<html> <he\"... is\n * not valid JSON`, which told the person at the dashboard nothing. This reads\n * the body as text first and, when it is not JSON, says what Apple actually\n * sent: the status, the page title, and what to do.\n */\nexport async function appleJson<T = any>(res: Response, what: string): Promise<T> {\n const text = await res.text();\n try {\n return JSON.parse(text) as T;\n } catch {\n const contentType = (res.headers.get(\"content-type\") ?? \"\").split(\";\")[0].trim();\n const title = /<title>([^<]{1,120})<\\/title>/i.exec(text)?.[1]?.trim();\n const looksHtml = /^\\s*<(!doctype|html)/i.test(text) || contentType === \"text/html\";\n const page = looksHtml ? \"an HTML page\" : contentType ? `a ${contentType} response` : \"a non-JSON response\";\n throw new Error(\n `Apple answered the ${what} with ${page} (HTTP ${res.status}${title ? `, \"${title}\"` : \"\"}) instead of JSON. ` +\n \"Apple is refusing or rate-limiting sign-ins from this server right now; wait a few minutes and try again. \" +\n \"If it keeps happening, sign in once at appleid.apple.com to clear any hold on the account.\",\n );\n }\n}\n\nconst OLYMPUS_SESSION = \"https://appstoreconnect.apple.com/olympus/v1/session\";\nconst WIDGET_KEY_URL = \"https://appstoreconnect.apple.com/olympus/v1/app/config?hostname=itunesconnect.apple.com\";\n\nexport interface AppleSessionConfig {\n email: string;\n password: string;\n onLog?: (msg: string) => void;\n onPrompt?: (msg: string) => Promise<string>;\n}\n\nexport interface ContractMessage {\n id: string;\n group: string;\n subject: string;\n message: string;\n}\n\nexport interface AppleSession {\n cookies: Record<string, string>;\n sessionId: string;\n scnt: string;\n serviceKey: string;\n userEmail: string;\n teamId?: string;\n pendingAgreements: ContractMessage[];\n}\n\n/**\n * State held between beginLogin() and submitTwoFactorCode() — captures\n * everything needed to resume an in-progress 2FA flow across HTTP requests.\n * Stored server-side keyed by an opaque session id; never sent to the\n * browser (the browser only sees the opaque id).\n */\nexport interface PendingLogin {\n cookies: Record<string, string>;\n sessionId: string;\n scnt: string;\n serviceKey: string;\n userEmail: string;\n}\n\n/**\n * Description of the 2FA challenge presented to the user.\n *\n * Modern 2FA accounts (the default for everyone) have `kind: \"device\"` —\n * Apple pushes the 6-digit code to all the user's trusted Apple devices\n * (iPhone, Mac, etc.) and the user types it into our wizard. The legacy\n * `trustedDevices` field is empty in this case; that field only ever\n * populates for old \"two-step verification\" accounts which are\n * essentially extinct.\n *\n * `kind: \"phone_only\"` is reserved for accounts that have no real Apple\n * devices (Apple's `noTrustedDevices === true` flag) — those accounts\n * must use SMS to a trusted phone number.\n *\n * Either way, the user can opt to receive the code via SMS instead by\n * picking from `trustedPhoneNumbers` and calling requestSmsCode().\n */\nexport interface TwoFactorChallenge {\n kind: \"device\" | \"phone_only\";\n codeLength: number;\n trustedPhoneNumbers: { id: number; numberWithDialCode: string; pushMode?: string }[];\n}\n\nexport type BeginLoginResult =\n | { kind: \"logged_in\"; session: AppleSession }\n | { kind: \"needs_2fa\"; pending: PendingLogin; challenge: TwoFactorChallenge };\n\n/** Thrown when an Apple Developer Program agreement needs to be accepted */\nexport class ProgramLicenseAgreementError extends Error {\n constructor(message: string, public agreements: ContractMessage[]) {\n super(message);\n this.name = \"ProgramLicenseAgreementError\";\n }\n}\n\n/**\n * Check a portal API response for agreement/license errors.\n * Throws ProgramLicenseAgreementError if detected.\n * Call this after any portal API call. Mirrors Spaceship::Client#handle_itc_response.\n */\nexport function checkPortalResponse(body: any, session?: AppleSession): void {\n if (!body || typeof body !== \"object\") return;\n\n // Result code 4100 = membership not eligible (often due to pending agreement)\n if (body.resultCode === 4100) {\n const userMsg = body.userString ?? \"The selected team does not have an eligible program membership.\";\n const agreements = session?.pendingAgreements ?? [];\n if (agreements.length > 0) {\n throw new ProgramLicenseAgreementError(\n `${userMsg}\\n\\n⚠ Pending agreement: ${agreements[0].subject}\\n` +\n `${agreements[0].message.replace(/<[^>]+>/g, \"\")}\\n\\n` +\n `Please accept the agreement at https://developer.apple.com/account before continuing.`,\n agreements\n );\n }\n throw new Error(userMsg);\n }\n\n // Explicit license agreement mention\n if ((body.userString ?? \"\").includes(\"Program License Agreement\")) {\n throw new ProgramLicenseAgreementError(\n `${body.userString} Please manually log into your Apple Developer account to review and accept the updated agreement.`,\n session?.pendingAgreements ?? []\n );\n }\n\n // Generic error with result code\n if (body.resultCode && body.resultCode !== 0) {\n const msg = body.userString || body.resultString || `Portal API error (code ${body.resultCode})`;\n throw new Error(msg);\n }\n}\n\n// ── Main Login (mirrors Spaceship::Client#send_shared_login_request) ───────\n\n/**\n * Step 1 of HTTP-resumable login: do the SIRP exchange and detect whether\n * 2FA is required. Returns either a fully-established session (no 2FA) or\n * a pending state + a description of the 2FA challenge.\n */\nexport async function beginLogin(config: {\n email: string;\n password: string;\n onLog?: (msg: string) => void;\n}): Promise<BeginLoginResult> {\n const log = config.onLog ?? (() => {});\n\n log(\"Fetching Apple service key...\");\n const serviceKey = await fetchServiceKey();\n\n const initRes = await fetch(`${AUTH_BASE}/signin?widgetKey=${serviceKey}`, {\n headers: { \"User-Agent\": \"Spaceship 2.225.0\" },\n });\n const initCookies = parseCookies(initRes.headers);\n\n const hcBits = initRes.headers.get(\"X-Apple-HC-Bits\");\n const hcChallenge = initRes.headers.get(\"X-Apple-HC-Challenge\");\n let hashcash: string | undefined;\n if (hcBits && hcChallenge) {\n log(\"Computing hashcash...\");\n hashcash = computeHashcash(parseInt(hcBits, 10), hcChallenge);\n }\n\n const cookieStr = Object.entries(initCookies)\n .map(([k, v]) => k.startsWith(\"DES\") ? `${k}=\"${v}\"` : `${k}=${v}`)\n .join(\"; \");\n\n log(\"Starting SIRP Apple ID login...\");\n const response = await doSirp(config.email, config.password, serviceKey, cookieStr, hashcash);\n\n const baseState = {\n cookies: { ...initCookies, ...response.cookies },\n sessionId: response.sessionId,\n scnt: response.scnt,\n serviceKey,\n userEmail: config.email,\n };\n\n if (response.status === 403) {\n throw new Error(`Invalid username and password combination. Used '${config.email}' as the username.`);\n }\n if (response.status === 412) {\n throw new Error(\"Need to acknowledge Apple's Apple ID and Privacy statement. Please manually log into https://appleid.apple.com.\");\n }\n\n if (response.status === 200) {\n log(\"Login successful (no 2FA).\");\n const session: AppleSession = { ...baseState, pendingAgreements: [] };\n await finalizeSession(session, log);\n return { kind: \"logged_in\", session };\n }\n\n if (response.status === 409) {\n log(\"2FA required, fetching challenge...\");\n const challenge = await fetchTwoFactorChallenge(baseState);\n return { kind: \"needs_2fa\", pending: baseState, challenge };\n }\n\n throw new Error(`Unexpected login response (${response.status}): ${JSON.stringify(response.body).slice(0, 500)}`);\n}\n\n/** Fetch the 2FA challenge (trusted phones + whether the user has Apple devices). */\nasync function fetchTwoFactorChallenge(pending: PendingLogin): Promise<TwoFactorChallenge> {\n const r = await fetch(`${AUTH_BASE}`, { headers: buildAuthHeadersFromPending(pending) });\n const body = await appleJson(r, \"two-factor challenge\");\n\n const trustedPhoneNumbers = (body.trustedPhoneNumbers ?? []).map((p: any) => ({\n id: p.id, numberWithDialCode: p.numberWithDialCode, pushMode: p.pushMode,\n }));\n // Apple sets `noTrustedDevices: true` when the user has no real Apple\n // devices to push the code to and must rely on SMS. Anything else means\n // we should default to \"enter the code from your device\".\n const phoneOnly = body.noTrustedDevices === true;\n const codeLength = body.securityCode?.length ?? 6;\n\n return {\n kind: phoneOnly ? \"phone_only\" : \"device\",\n codeLength,\n trustedPhoneNumbers,\n };\n}\n\n/**\n * Ask Apple to send an SMS / voice code to the chosen trusted phone.\n * Used by the wizard's \"Send code via text instead\" affordance.\n */\nexport async function requestSmsCode(input: {\n pending: PendingLogin;\n phoneId: number;\n mode?: \"sms\" | \"voice\";\n}): Promise<void> {\n await fetch(`${AUTH_BASE}/verify/phone`, {\n method: \"PUT\",\n headers: { ...buildAuthHeadersFromPending(input.pending), \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ phoneNumber: { id: input.phoneId }, mode: input.mode ?? \"sms\" }),\n });\n}\n\n/**\n * Step 2 of HTTP-resumable login: submit the 2FA code the user typed.\n * Returns a fully-established AppleSession on success.\n *\n * source = \"device\" → 4-digit code from a trusted Apple device\n * source = \"phone\" → 6-digit code from SMS / push to trusted phone\n */\nexport async function submitTwoFactorCode(rawInput: {\n pending: PendingLogin;\n code: string;\n source: \"device\" | \"phone\";\n phoneId?: number;\n mode?: \"sms\" | \"voice\";\n onLog?: (msg: string) => void;\n}): Promise<AppleSession> {\n // A code copied off a phone can carry a non-breaking space or a stray\n // newline; fastlane strips those too. Only the digits are the code.\n const input = { ...rawInput, code: rawInput.code.replace(/[\\s\\u00a0]+/g, \"\") };\n const log = input.onLog ?? (() => {});\n\n let path: string;\n let body: string;\n if (input.source === \"device\") {\n path = `${AUTH_BASE}/verify/trusteddevice/securitycode`;\n body = JSON.stringify({ securityCode: { code: input.code } });\n } else {\n if (input.phoneId == null) throw new Error(\"phoneId is required when source='phone'\");\n path = `${AUTH_BASE}/verify/phone/securitycode`;\n body = JSON.stringify({\n securityCode: { code: input.code },\n phoneNumber: { id: input.phoneId },\n mode: input.mode ?? \"sms\",\n });\n }\n\n log(\"Submitting 2FA code...\");\n const verifyRes = await fetch(path, {\n method: \"POST\",\n headers: { ...buildAuthHeadersFromPending(input.pending), \"Content-Type\": \"application/json\" },\n body,\n });\n if (!verifyRes.ok) {\n const err = await verifyRes.json().catch(() => ({})) as any;\n const msgs = (err?.service_errors ?? err?.serviceErrors ?? []).map((e: any) => e.message).filter(Boolean);\n throw new Error(msgs.join(\"; \") || `Verification failed (${verifyRes.status})`);\n }\n\n const session: AppleSession = {\n ...input.pending,\n cookies: { ...input.pending.cookies, ...parseCookies(verifyRes.headers) },\n pendingAgreements: [],\n };\n await trustSession(session);\n await finalizeSession(session, log);\n return session;\n}\n\n/** Fetch olympus session and pending agreements — the post-2FA finishing work. */\nasync function finalizeSession(session: AppleSession, log: (msg: string) => void): Promise<void> {\n await fetchOlympusSession(session);\n const agreements = await fetchContractMessages(session);\n if (agreements.length > 0) {\n for (const msg of agreements) {\n log(`⚠ ${msg.subject}: ${msg.message.replace(/<[^>]+>/g, \"\")}`);\n }\n }\n session.pendingAgreements = agreements;\n log(`Logged in as ${session.userEmail}`);\n}\n\n/**\n * Backward-compatible CLI-style login. Internally uses beginLogin +\n * submitTwoFactorCode but routes 2FA through the synchronous onPrompt\n * callback so existing scripts (test-login.ts, test-full-workflow.ts)\n * keep working.\n */\nexport async function loginWithAppleId(config: AppleSessionConfig): Promise<AppleSession> {\n const log = config.onLog ?? console.log;\n const promptFn = config.onPrompt ?? defaultPrompt;\n\n const result = await beginLogin({ email: config.email, password: config.password, onLog: log });\n if (result.kind === \"logged_in\") return result.session;\n\n const { pending, challenge } = result;\n const phones = challenge.trustedPhoneNumbers;\n\n if (challenge.kind === \"device\") {\n log(\"Two-factor Authentication (6 digit code) is enabled for this account\");\n log(\"(Input 'sms' to escape this prompt and select a trusted phone number to send the code as a text message)\");\n const input = await promptFn(`Please enter the ${challenge.codeLength} digit code: `);\n if (input.toLowerCase() === \"sms\") {\n log(\"Please select a trusted phone number:\");\n for (let i = 0; i < phones.length; i++) log(` ${i + 1}. ${phones[i].numberWithDialCode}`);\n const choice = await promptFn(\"Enter number: \");\n const phone = phones[Math.max(0, parseInt(choice, 10) - 1)] ?? phones[0];\n await requestSmsCode({ pending, phoneId: phone.id, mode: phone.pushMode as any });\n log(`Code sent to ${phone.numberWithDialCode}`);\n const code = await promptFn(`Please enter the ${challenge.codeLength} digit code: `);\n return submitTwoFactorCode({ pending, code, source: \"phone\", phoneId: phone.id, mode: phone.pushMode as any ?? \"sms\", onLog: log });\n }\n return submitTwoFactorCode({ pending, code: input, source: \"device\", onLog: log });\n }\n\n // phone_only — account has no trusted Apple devices, must use SMS\n log(\"Two-factor Authentication (6 digit code) is enabled for this account\");\n if (phones.length === 1) {\n const phone = phones[0];\n log(`Code automatically sent to ${phone.numberWithDialCode}`);\n const code = await promptFn(`Please enter the ${challenge.codeLength} digit code: `);\n return submitTwoFactorCode({ pending, code, source: \"phone\", phoneId: phone.id, mode: phone.pushMode as any ?? \"sms\", onLog: log });\n }\n log(\"Please select a trusted phone number:\");\n for (let i = 0; i < phones.length; i++) log(` ${i + 1}. ${phones[i].numberWithDialCode}`);\n const choice = await promptFn(\"Enter number: \");\n const phone = phones[Math.max(0, parseInt(choice, 10) - 1)] ?? phones[0];\n await requestSmsCode({ pending, phoneId: phone.id, mode: phone.pushMode as any });\n log(`Code sent to ${phone.numberWithDialCode}`);\n const code = await promptFn(`Please enter the ${challenge.codeLength} digit code: `);\n return submitTwoFactorCode({ pending, code, source: \"phone\", phoneId: phone.id, mode: phone.pushMode as any ?? \"sms\", onLog: log });\n}\n\nfunction buildAuthHeadersFromPending(pending: PendingLogin): Record<string, string> {\n const h: Record<string, string> = { \"X-Apple-Widget-Key\": pending.serviceKey, Accept: \"application/json\" };\n if (pending.sessionId) h[\"X-Apple-Id-Session-Id\"] = pending.sessionId;\n if (pending.scnt) h[\"scnt\"] = pending.scnt;\n const c = Object.entries(pending.cookies).map(([k, v]) => `${k}=${v}`).join(\"; \");\n if (c) h[\"Cookie\"] = c;\n return h;\n}\n\n// ── SIRP Auth (1:1 port of Spaceship::Client#do_sirp) ──────────────────────\n\nasync function doSirp(\n user: string, password: string, serviceKey: string, cookieStr: string, hashcash?: string\n): Promise<{ status: number; body: any; cookies: Record<string, string>; sessionId: string; scnt: string }> {\n const client = new SRPClient(2048);\n const A = client.startAuthentication();\n const aBase64 = Buffer.from(A, \"hex\").toString(\"base64\");\n\n const baseHeaders: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n \"X-Requested-With\": \"XMLHttpRequest\",\n \"X-Apple-Widget-Key\": serviceKey,\n Accept: \"application/json, text/javascript\",\n };\n if (cookieStr) baseHeaders[\"Cookie\"] = cookieStr;\n\n // Step 1: signin/init\n const initRes = await fetch(`${AUTH_BASE}/signin/init`, {\n method: \"POST\",\n headers: baseHeaders,\n body: JSON.stringify({ a: aBase64, accountName: user, protocols: [\"s2k\", \"s2k_fo\"] }),\n redirect: \"manual\",\n });\n const initBody = await appleJson(initRes, \"sign-in init\");\n if (initBody.serviceErrors) throw new Error(`Apple auth error: ${JSON.stringify(initBody.serviceErrors)}`);\n\n const { iteration: iterations, salt: saltB64, b: bB64, c, protocol } = initBody;\n // The shape fastlane's spaceship checks since its January 2026 hardening:\n // a 200 with JSON that is not the challenge (a rate-limit notice, an empty\n // object) used to fail deeper down as a Buffer of \"undefined\".\n if (!iterations || !saltB64 || !bB64 || !c || !protocol) {\n throw new Error(`Apple's sign-in init answered without a challenge (HTTP ${initRes.status}): ${JSON.stringify(initBody).slice(0, 300)}`);\n }\n const salt = Buffer.from(saltB64, \"base64\");\n const b = Buffer.from(bB64, \"base64\");\n\n // Derive password (mirrors Spaceship::Client#pbkdf2)\n const encryptedPassword = applePbkdf2(password, salt, iterations, 32, protocol);\n\n // Process SRP challenge\n const m1 = client.processChallenge(user, encryptedPassword.toString(\"hex\"), salt.toString(\"hex\"), b.toString(\"hex\"), true);\n if (m1 === false) throw new Error(\"Error processing SIRP challenge\");\n const m2 = client.H_AMK;\n\n // Step 2: signin/complete\n const completeHeaders = { ...baseHeaders };\n if (hashcash) completeHeaders[\"X-Apple-HC\"] = hashcash;\n\n const completeRes = await fetch(`${AUTH_BASE}/signin/complete?isRememberMeEnabled=false`, {\n method: \"POST\",\n headers: completeHeaders,\n body: JSON.stringify({\n accountName: user,\n c,\n m1: Buffer.from(m1, \"hex\").toString(\"base64\"),\n m2: m2 ? Buffer.from(m2, \"hex\").toString(\"base64\") : \"\",\n rememberMe: false,\n }),\n redirect: \"manual\",\n });\n\n let body: any;\n try { body = await completeRes.json(); } catch { body = \"\"; }\n\n return {\n status: completeRes.status,\n body,\n cookies: parseCookies(completeRes.headers),\n sessionId: completeRes.headers.get(\"x-apple-id-session-id\") ?? \"\",\n scnt: completeRes.headers.get(\"scnt\") ?? \"\",\n };\n}\n\n// ── Helpers ────────────────────────────────────────────────────────────────\n\nasync function trustSession(session: AppleSession): Promise<void> {\n const r = await fetch(`${AUTH_BASE}/2sv/trust`, { headers: buildAuthHeaders(session) });\n Object.assign(session.cookies, parseCookies(r.headers));\n}\n\nasync function fetchOlympusSession(session: AppleSession): Promise<void> {\n const cookieStr = Object.entries(session.cookies).map(([k, v]) => `${k}=${v}`).join(\"; \");\n const res = await fetch(OLYMPUS_SESSION, { headers: { Cookie: cookieStr, Accept: \"application/json\" } });\n if (res.ok) {\n const body = await appleJson(res, \"session lookup\");\n if (body?.user?.emailAddress) session.userEmail = body.user.emailAddress;\n if (body?.provider?.providerId) session.teamId = String(body.provider.providerId);\n }\n}\n\n// ── Contract Messages (mirrors fetch_program_license_agreement_messages) ────\n\nasync function fetchContractMessages(session: AppleSession): Promise<ContractMessage[]> {\n const cookieStr = Object.entries(session.cookies).map(([k, v]) => `${k}=${v}`).join(\"; \");\n try {\n const res = await fetch(\"https://appstoreconnect.apple.com/olympus/v1/contractMessages\", {\n headers: { Cookie: cookieStr, Accept: \"application/json\" },\n });\n if (!res.ok) return [];\n const body = await appleJson<any[]>(res, \"agreements lookup\");\n return (body ?? []).map((m: any) => ({\n id: m.id ?? \"\",\n group: m.group ?? \"\",\n subject: m.subject ?? \"\",\n message: m.message ?? \"\",\n }));\n } catch {\n return [];\n }\n}\n\n/** Where App Store Connect sends a signed-out browser: the widget key rides on that redirect. */\nconst LOGOUT_URL = \"https://appstoreconnect.apple.com/logout\";\n\n/**\n * The widget key out of the sign-out redirect, or null.\n *\n * `https://idmsa.apple.com/appleauth/signout?widgetKey=<key>&asop=…` is the\n * Location a HEAD to /logout answers with, and the key on it is the same\n * X-Apple-Widget-Key the sign-in needs.\n */\nexport function serviceKeyFromLocation(location: string | null | undefined): string | null {\n if (!location) return null;\n try {\n const key = new URL(location).searchParams.get(\"widgetKey\")?.trim();\n return key && /^[0-9a-f]{16,}$/i.test(key) ? key : null;\n } catch {\n return null;\n }\n}\n\n/**\n * The X-Apple-Widget-Key the sign-in needs.\n *\n * Read from the sign-out redirect first, the way fastlane's spaceship does\n * since September 2026 (\"Read the App Store Connect API key from where Apple\n * keeps it now\"): the olympus config endpoint this used to call answers 404\n * with an HTML page now, which surfaced at the dashboard as `Unexpected\n * token '<'`. The config endpoint is kept as the fallback, read safely.\n */\nexport async function fetchServiceKey(fetchImpl: typeof fetch = fetch): Promise<string> {\n const head = await fetchImpl(LOGOUT_URL, { method: \"HEAD\", redirect: \"manual\" });\n const fromRedirect = serviceKeyFromLocation(head.headers.get(\"location\"));\n if (fromRedirect) return fromRedirect;\n\n const res = await fetchImpl(WIDGET_KEY_URL);\n const body = await appleJson(res, \"service key request\");\n if (!body?.authServiceKey) throw new Error(\"Could not fetch Apple service key: the sign-out redirect carried no widgetKey and the config endpoint had no authServiceKey.\");\n return body.authServiceKey as string;\n}\n\nfunction buildAuthHeaders(session: AppleSession): Record<string, string> {\n const h: Record<string, string> = { \"X-Apple-Widget-Key\": session.serviceKey, Accept: \"application/json\" };\n if (session.sessionId) h[\"X-Apple-Id-Session-Id\"] = session.sessionId;\n if (session.scnt) h[\"scnt\"] = session.scnt;\n const c = Object.entries(session.cookies).map(([k, v]) => `${k}=${v}`).join(\"; \");\n if (c) h[\"Cookie\"] = c;\n return h;\n}\n\nfunction parseCookies(headers: Headers): Record<string, string> {\n const cookies: Record<string, string> = {};\n for (const raw of headers.getSetCookie?.() ?? []) {\n const m = raw.match(/^([^=]+)=([^;]*)/);\n if (m) cookies[m[1]] = m[2];\n }\n return cookies;\n}\n\nfunction computeHashcash(bits: number, challenge: string): string {\n const date = new Date().toISOString().replace(/[-:T]/g, \"\").slice(0, 12);\n let counter = 0;\n while (true) {\n const stamp = `1:${bits}:${date}:${challenge}::${counter.toString(36)}:`;\n const hash = createHash(\"sha1\").update(stamp).digest();\n let zeroBits = 0;\n for (const byte of hash) {\n if (byte === 0) { zeroBits += 8; } else { zeroBits += Math.clz32(byte) - 24; break; }\n if (zeroBits >= bits) break;\n }\n if (zeroBits >= bits) return stamp;\n counter++;\n }\n}\n\nasync function defaultPrompt(message: string): Promise<string> {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((r) => { rl.question(message, (a) => { rl.close(); r(a.trim()); }); });\n}\n","import type { TokenManager } from \"./auth.js\";\nimport { ProgramLicenseAgreementError } from \"./apple-session.js\";\nimport type {\n JsonApiErrorResponse,\n JsonApiListResponse,\n JsonApiResponse,\n ListParams,\n RequestOptions,\n} from \"./types.js\";\n\nconst PRODUCTION_BASE = \"https://api.appstoreconnect.apple.com\";\nconst ENTERPRISE_BASE = \"https://api.enterprise.developer.apple.com\";\n\nconst MAX_RETRIES = 5;\nconst INITIAL_BACKOFF_MS = 1000;\nconst MAX_BACKOFF_MS = 60_000;\n/** Fastlane's TooManyRequestsError gives up after 3600s cumulative backoff. */\nconst MAX_RATE_LIMIT_BACKOFF_MS = 3_600_000;\n\nexport class AppStoreConnectError extends Error {\n constructor(\n message: string,\n public status: number,\n public errors: JsonApiErrorResponse[\"errors\"] = []\n ) {\n super(message);\n this.name = \"AppStoreConnectError\";\n }\n}\n\nexport class RateLimitError extends AppStoreConnectError {\n constructor(public retryAfter: number) {\n super(`Rate limited. Retry after ${retryAfter}s`, 429);\n this.name = \"RateLimitError\";\n }\n}\n\nexport class RequestClient {\n private baseUrl: string;\n private tokenManager: TokenManager;\n\n constructor(tokenManager: TokenManager, enterprise = false) {\n this.tokenManager = tokenManager;\n this.baseUrl = enterprise ? ENTERPRISE_BASE : PRODUCTION_BASE;\n }\n\n async request<T>(path: string, options: RequestOptions = {}): Promise<T> {\n const { method = \"GET\", body, params, headers: extraHeaders } = options;\n\n let url = `${this.baseUrl}${path}`;\n if (params) {\n const searchParams = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined) continue;\n if (Array.isArray(value)) {\n searchParams.set(key, value.join(\",\"));\n } else {\n searchParams.set(key, String(value));\n }\n }\n const qs = searchParams.toString();\n if (qs) url += `?${qs}`;\n }\n\n let lastError: Error | null = null;\n // Soft-cumulative backoff for 429 that doubles on each hit, mirroring\n // Fastlane's Spaceship::ConnectAPI::APIClient#with_asc_retry 429 handler:\n // `Kernel.sleep(backoff); backoff *= 2`, giving up past 3600s.\n let rateLimitBackoffMs = INITIAL_BACKOFF_MS;\n\n for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {\n const token = await this.tokenManager.getToken();\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n ...extraHeaders,\n };\n\n const res = await fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (res.ok) {\n if (res.status === 204) return undefined as T;\n return (await res.json()) as T;\n }\n\n // Handle 401 — refresh token and retry once\n if (res.status === 401 && attempt === 0) {\n this.tokenManager.invalidate();\n continue;\n }\n\n // Handle 429 — rate limit. Prefer server's Retry-After header when\n // provided, otherwise fall back to Fastlane's doubling backoff.\n if (res.status === 429) {\n if (rateLimitBackoffMs > MAX_RATE_LIMIT_BACKOFF_MS) {\n throw new RateLimitError(Math.floor(rateLimitBackoffMs / 1000));\n }\n const retryAfterHeader = res.headers.get(\"Retry-After\");\n const sleepMs = retryAfterHeader\n ? parseInt(retryAfterHeader, 10) * 1000\n : rateLimitBackoffMs;\n await sleep(sleepMs);\n rateLimitBackoffMs *= 2;\n continue;\n }\n\n // Parse error body early so we can inspect it for 403/502 special cases.\n const errorBody = await res.json().catch(() => null);\n const errors = (errorBody as JsonApiErrorResponse)?.errors || [];\n\n // Handle 403 — detect missing/expired program license agreement.\n // Mirrors api_client.rb's ProgramLicenseAgreementUpdated branch.\n if (res.status === 403) {\n const firstCode = errors[0]?.code;\n if (firstCode === \"FORBIDDEN.REQUIRED_AGREEMENTS_MISSING_OR_EXPIRED\") {\n const detail =\n errors.map((e) => e.detail || e.title).join(\"; \") ||\n \"Required agreements are missing or expired.\";\n throw new ProgramLicenseAgreementError(\n `${detail} Please manually log into your Apple Developer account to review and accept the updated agreement.`,\n []\n );\n }\n }\n\n // Handle 502 — special-case \"Could not process this request\" retry.\n // Mirrors api_client.rb's BadGatewayError branch (issue fastlane#19264).\n if (res.status === 502 && attempt < MAX_RETRIES) {\n const bodyText = errorBody ? JSON.stringify(errorBody) : \"\";\n if (bodyText.includes(\"Could not process this request\")) {\n const backoff = Math.min(\n INITIAL_BACKOFF_MS * Math.pow(2, attempt),\n MAX_BACKOFF_MS\n );\n await sleep(backoff + Math.random() * 500);\n continue;\n }\n }\n\n // Handle 5xx — retry with exponential backoff\n if (res.status >= 500 && attempt < MAX_RETRIES) {\n const backoff = Math.min(\n INITIAL_BACKOFF_MS * Math.pow(2, attempt),\n MAX_BACKOFF_MS\n );\n await sleep(backoff + Math.random() * 500);\n continue;\n }\n\n const detail = errors.map((e) => e.detail || e.title).join(\"; \") || `HTTP ${res.status}`;\n\n lastError = new AppStoreConnectError(detail, res.status, errors);\n break;\n }\n\n throw lastError || new Error(\"Request failed after retries\");\n }\n\n async get<T>(path: string, params?: Record<string, string | string[] | number | undefined>): Promise<T> {\n return this.request<T>(path, { method: \"GET\", params });\n }\n\n async post<T>(path: string, body: unknown): Promise<T> {\n return this.request<T>(path, { method: \"POST\", body });\n }\n\n async patch<T>(path: string, body: unknown): Promise<T> {\n return this.request<T>(path, { method: \"PATCH\", body });\n }\n\n async delete(path: string): Promise<void> {\n await this.request(path, { method: \"DELETE\" });\n }\n\n // Build query params from ListParams\n buildListParams(params: ListParams): Record<string, string | undefined> {\n const result: Record<string, string | undefined> = {};\n\n if (params.filter) {\n for (const [key, value] of Object.entries(params.filter)) {\n result[`filter[${key}]`] = Array.isArray(value) ? value.join(\",\") : value;\n }\n }\n\n if (params.include) {\n result[\"include\"] = params.include;\n }\n\n if (params.fields) {\n for (const [key, value] of Object.entries(params.fields)) {\n result[`fields[${key}]`] = value;\n }\n }\n\n if (params.limit !== undefined) {\n result[\"limit\"] = String(params.limit);\n }\n\n if (params.sort) {\n result[\"sort\"] = params.sort;\n }\n\n if (params.cursor) {\n // ASC uses page[after] for cursor pagination\n result[\"page[after]\"] = params.cursor;\n }\n\n return result;\n }\n\n async list<T>(path: string, params: ListParams = {}): Promise<JsonApiListResponse<T>> {\n const queryParams = this.buildListParams(params);\n return this.get<JsonApiListResponse<T>>(path, queryParams);\n }\n\n async *paginate<T>(path: string, params: ListParams = {}): AsyncGenerator<T, void, undefined> {\n let cursor: string | undefined = params.cursor;\n\n while (true) {\n const response = await this.list<T>(path, { ...params, cursor });\n\n for (const item of response.data) {\n yield item;\n }\n\n // Check for next page\n const nextLink = response.links?.next;\n if (!nextLink) break;\n\n // Extract cursor from next link\n const nextUrl = new URL(nextLink);\n cursor = nextUrl.searchParams.get(\"page[after]\") || undefined;\n if (!cursor) break;\n }\n }\n\n async all<T>(path: string, params: ListParams = {}): Promise<T[]> {\n const results: T[] = [];\n for await (const item of this.paginate<T>(path, params)) {\n results.push(item);\n }\n return results;\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiListResponse, JsonApiResponse, ListParams } from \"../client/types.js\";\nimport type { Certificate } from \"../types/certificate.js\";\nimport type { CertificateType } from \"../types/enums.js\";\n\nexport class CertificatesResource {\n constructor(private http: RequestClient) {}\n\n async list(params?: {\n filter?: {\n certificateType?: CertificateType | CertificateType[];\n serialNumber?: string;\n displayName?: string;\n id?: string | string[];\n };\n fields?: string[];\n limit?: number;\n sort?: string;\n }): Promise<Certificate[]> {\n const listParams: ListParams = {\n filter: params?.filter as Record<string, string | string[]>,\n limit: params?.limit ?? 200,\n sort: params?.sort,\n };\n if (params?.fields) {\n listParams.fields = { certificates: params.fields.join(\",\") };\n }\n return this.http.all<Certificate>(\"/v1/certificates\", listParams);\n }\n\n async get(id: string): Promise<Certificate> {\n const response = await this.http.get<JsonApiResponse<Certificate>>(\n `/v1/certificates/${id}`\n );\n return response.data;\n }\n\n async create(params: {\n certificateType: CertificateType;\n csrContent: string;\n }): Promise<Certificate> {\n const response = await this.http.post<JsonApiResponse<Certificate>>(\n \"/v1/certificates\",\n {\n data: {\n type: \"certificates\",\n attributes: {\n certificateType: params.certificateType,\n csrContent: params.csrContent,\n },\n },\n }\n );\n return response.data;\n }\n\n async revoke(id: string): Promise<void> {\n await this.http.delete(`/v1/certificates/${id}`);\n }\n\n async *paginate(params?: {\n filter?: {\n certificateType?: CertificateType | CertificateType[];\n };\n limit?: number;\n }): AsyncGenerator<Certificate> {\n const listParams: ListParams = {\n filter: params?.filter as Record<string, string | string[]>,\n limit: params?.limit ?? 200,\n };\n yield* this.http.paginate<Certificate>(\"/v1/certificates\", listParams);\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResponse, ListParams } from \"../client/types.js\";\nimport type { Profile } from \"../types/profile.js\";\nimport type { Certificate } from \"../types/certificate.js\";\nimport type { Device } from \"../types/device.js\";\nimport type { BundleId } from \"../types/bundle-id.js\";\nimport type { ProfileType, ProfileState } from \"../types/enums.js\";\n\nexport class ProfilesResource {\n constructor(private http: RequestClient) {}\n\n async list(params?: {\n filter?: {\n profileType?: ProfileType | ProfileType[];\n profileState?: ProfileState;\n name?: string;\n id?: string | string[];\n };\n include?: string;\n fields?: { profiles?: string[]; certificates?: string[]; devices?: string[]; bundleIds?: string[] };\n limit?: number;\n sort?: string;\n }): Promise<Profile[]> {\n const listParams: ListParams = {\n filter: params?.filter as Record<string, string | string[]>,\n include: params?.include,\n limit: params?.limit ?? 200,\n sort: params?.sort,\n };\n if (params?.fields) {\n listParams.fields = {};\n for (const [key, value] of Object.entries(params.fields)) {\n if (value) listParams.fields[key] = value.join(\",\");\n }\n }\n return this.http.all<Profile>(\"/v1/profiles\", listParams);\n }\n\n async get(id: string, params?: { include?: string }): Promise<Profile> {\n const queryParams: Record<string, string | undefined> = {};\n if (params?.include) queryParams[\"include\"] = params.include;\n const response = await this.http.get<JsonApiResponse<Profile>>(\n `/v1/profiles/${id}`,\n queryParams\n );\n return response.data;\n }\n\n async create(params: {\n name: string;\n profileType: ProfileType;\n bundleIdId: string;\n certificateIds: string[];\n deviceIds?: string[];\n }): Promise<Profile> {\n const relationships: Record<string, unknown> = {\n bundleId: {\n data: { type: \"bundleIds\", id: params.bundleIdId },\n },\n certificates: {\n data: params.certificateIds.map((id) => ({\n type: \"certificates\",\n id,\n })),\n },\n };\n\n if (params.deviceIds && params.deviceIds.length > 0) {\n relationships.devices = {\n data: params.deviceIds.map((id) => ({\n type: \"devices\",\n id,\n })),\n };\n }\n\n const response = await this.http.post<JsonApiResponse<Profile>>(\n \"/v1/profiles\",\n {\n data: {\n type: \"profiles\",\n attributes: {\n name: params.name,\n profileType: params.profileType,\n },\n relationships,\n },\n }\n );\n return response.data;\n }\n\n async delete(id: string): Promise<void> {\n await this.http.delete(`/v1/profiles/${id}`);\n }\n\n async getCertificates(profileId: string): Promise<Certificate[]> {\n return this.http.all<Certificate>(\n `/v1/profiles/${profileId}/certificates`\n );\n }\n\n async getDevices(profileId: string): Promise<Device[]> {\n return this.http.all<Device>(`/v1/profiles/${profileId}/devices`);\n }\n\n async getBundleId(profileId: string): Promise<BundleId> {\n const response = await this.http.get<JsonApiResponse<BundleId>>(\n `/v1/profiles/${profileId}/bundleId`\n );\n return response.data;\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResponse, ListParams } from \"../client/types.js\";\nimport type { BundleId } from \"../types/bundle-id.js\";\nimport type { BundleIdCapability } from \"../types/capability.js\";\nimport type { BundleIdPlatform } from \"../types/enums.js\";\n\nexport class BundleIdsResource {\n constructor(private http: RequestClient) {}\n\n async list(params?: {\n filter?: {\n identifier?: string;\n name?: string;\n platform?: BundleIdPlatform;\n seedId?: string;\n id?: string | string[];\n };\n include?: string;\n fields?: { bundleIds?: string[]; bundleIdCapabilities?: string[] };\n limit?: number;\n sort?: string;\n }): Promise<BundleId[]> {\n const listParams: ListParams = {\n filter: params?.filter as Record<string, string | string[]>,\n include: params?.include,\n limit: params?.limit ?? 200,\n sort: params?.sort,\n };\n if (params?.fields) {\n listParams.fields = {};\n for (const [key, value] of Object.entries(params.fields)) {\n if (value) listParams.fields[key] = value.join(\",\");\n }\n }\n return this.http.all<BundleId>(\"/v1/bundleIds\", listParams);\n }\n\n async get(id: string, params?: { include?: string }): Promise<BundleId> {\n const queryParams: Record<string, string | undefined> = {};\n if (params?.include) queryParams[\"include\"] = params.include;\n const response = await this.http.get<JsonApiResponse<BundleId>>(\n `/v1/bundleIds/${id}`,\n queryParams\n );\n return response.data;\n }\n\n async create(params: {\n identifier: string;\n name: string;\n platform: BundleIdPlatform;\n seedId?: string;\n }): Promise<BundleId> {\n const attributes: Record<string, unknown> = {\n identifier: params.identifier,\n name: params.name,\n platform: params.platform,\n };\n if (params.seedId) attributes.seedId = params.seedId;\n\n const response = await this.http.post<JsonApiResponse<BundleId>>(\n \"/v1/bundleIds\",\n {\n data: {\n type: \"bundleIds\",\n attributes,\n },\n }\n );\n return response.data;\n }\n\n async find(identifier: string): Promise<BundleId | null> {\n const results = await this.list({\n filter: { identifier },\n limit: 1,\n });\n return results[0] ?? null;\n }\n\n async getCapabilities(bundleIdId: string): Promise<BundleIdCapability[]> {\n return this.http.all<BundleIdCapability>(\n `/v1/bundleIds/${bundleIdId}/bundleIdCapabilities`\n );\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResponse, ListParams } from \"../client/types.js\";\nimport type { Device } from \"../types/device.js\";\nimport type { DeviceStatus, Platform } from \"../types/enums.js\";\n\nexport class DevicesResource {\n constructor(private http: RequestClient) {}\n\n async list(params?: {\n filter?: {\n name?: string;\n platform?: Platform | Platform[];\n status?: DeviceStatus;\n udid?: string;\n id?: string | string[];\n };\n fields?: string[];\n limit?: number;\n sort?: string;\n }): Promise<Device[]> {\n const listParams: ListParams = {\n filter: params?.filter as Record<string, string | string[]>,\n limit: params?.limit ?? 200,\n sort: params?.sort,\n };\n if (params?.fields) {\n listParams.fields = { devices: params.fields.join(\",\") };\n }\n return this.http.all<Device>(\"/v1/devices\", listParams);\n }\n\n async get(id: string): Promise<Device> {\n const response = await this.http.get<JsonApiResponse<Device>>(\n `/v1/devices/${id}`\n );\n return response.data;\n }\n\n async register(params: {\n name: string;\n platform: Platform;\n udid: string;\n }): Promise<Device> {\n const response = await this.http.post<JsonApiResponse<Device>>(\n \"/v1/devices\",\n {\n data: {\n type: \"devices\",\n attributes: {\n name: params.name,\n platform: params.platform,\n udid: params.udid,\n },\n },\n }\n );\n return response.data;\n }\n\n async update(\n id: string,\n params: { name?: string; status?: DeviceStatus }\n ): Promise<Device> {\n const response = await this.http.patch<JsonApiResponse<Device>>(\n `/v1/devices/${id}`,\n {\n data: {\n type: \"devices\",\n id,\n attributes: params,\n },\n }\n );\n return response.data;\n }\n\n async findByUdid(udid: string): Promise<Device | null> {\n const results = await this.list({ filter: { udid }, limit: 1 });\n return results[0] ?? null;\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResponse, ListParams } from \"../client/types.js\";\nimport type { App } from \"../types/app.js\";\n\nexport class AppsResource {\n constructor(private http: RequestClient) {}\n\n async list(params?: {\n filter?: {\n bundleId?: string;\n name?: string;\n sku?: string;\n id?: string | string[];\n };\n include?: string;\n fields?: { apps?: string[] };\n limit?: number;\n sort?: string;\n }): Promise<App[]> {\n const listParams: ListParams = {\n filter: params?.filter as Record<string, string | string[]>,\n include: params?.include,\n limit: params?.limit ?? 200,\n sort: params?.sort,\n };\n if (params?.fields) {\n listParams.fields = {};\n for (const [key, value] of Object.entries(params.fields)) {\n if (value) listParams.fields[key] = value.join(\",\");\n }\n }\n return this.http.all<App>(\"/v1/apps\", listParams);\n }\n\n async get(id: string, params?: { include?: string }): Promise<App> {\n const queryParams: Record<string, string | undefined> = {};\n if (params?.include) queryParams[\"include\"] = params.include;\n const response = await this.http.get<JsonApiResponse<App>>(\n `/v1/apps/${id}`,\n queryParams\n );\n return response.data;\n }\n\n async findByBundleId(bundleId: string): Promise<App | null> {\n const results = await this.list({\n filter: { bundleId },\n limit: 1,\n });\n return results[0] ?? null;\n }\n\n /**\n * Create an App Store Connect **app record** (the thing that shows up\n * under \"My Apps\" and that TestFlight / App Store uploads require).\n *\n * This is distinct from registering an App ID in the Developer Portal —\n * you need BOTH. The Developer Portal App ID unlocks provisioning\n * profiles and entitlements; the App Store Connect app record unlocks\n * uploads. `upload_to_testflight` fails with \"Couldn't find app\n * 'com.foo.bar' on the account…\" when this record is missing.\n *\n * `bundleIdId` is the REST API primary key of the bundle id resource\n * (not the identifier string) — fetch it via `bundleIds.find(identifier)`\n * or from the response of `bundleIds.create()`.\n *\n * `sku` is an arbitrary unique string Apple uses to identify the app in\n * their internal records. If you don't have a meaningful one, pass the\n * bundle identifier itself or append a timestamp for uniqueness.\n */\n async create(params: {\n bundleIdentifier: string;\n bundleIdId: string;\n appName: string;\n sku: string;\n primaryLocale?: string;\n }): Promise<App> {\n const response = await this.http.post<JsonApiResponse<App>>(\"/v1/apps\", {\n data: {\n type: \"apps\",\n attributes: {\n bundleId: params.bundleIdentifier,\n name: params.appName,\n sku: params.sku,\n primaryLocale: params.primaryLocale ?? \"en-US\",\n },\n relationships: {\n bundleId: {\n data: { type: \"bundleIds\", id: params.bundleIdId },\n },\n },\n },\n });\n return response.data;\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiListResponse, JsonApiResponse, ListParams } from \"../client/types.js\";\nimport type {\n Build,\n BetaBuildLocalization,\n BuildBetaDetail,\n PreReleaseVersion,\n} from \"../types/build.js\";\n\nexport class BuildsResource {\n constructor(private http: RequestClient) {}\n\n async list(params?: {\n filter?: {\n app?: string;\n version?: string;\n processingState?: string;\n \"preReleaseVersion.version\"?: string;\n expired?: string;\n id?: string | string[];\n };\n include?: string;\n fields?: { builds?: string[] };\n limit?: number;\n sort?: string;\n }): Promise<Build[]> {\n const listParams: ListParams = {\n filter: params?.filter as Record<string, string | string[]>,\n include: params?.include,\n limit: params?.limit ?? 200,\n sort: params?.sort,\n };\n if (params?.fields) {\n listParams.fields = {};\n for (const [key, value] of Object.entries(params.fields)) {\n if (value) listParams.fields[key] = value.join(\",\");\n }\n }\n return this.http.all<Build>(\"/v1/builds\", listParams);\n }\n\n async get(id: string, params?: { include?: string }): Promise<Build> {\n const queryParams: Record<string, string | undefined> = {};\n if (params?.include) queryParams[\"include\"] = params.include;\n const response = await this.http.get<JsonApiResponse<Build>>(\n `/v1/builds/${id}`,\n queryParams\n );\n return response.data;\n }\n\n async getBetaDetail(buildId: string): Promise<BuildBetaDetail> {\n const response = await this.http.get<JsonApiResponse<BuildBetaDetail>>(\n `/v1/builds/${buildId}/buildBetaDetail`\n );\n return response.data;\n }\n\n async getLocalizations(buildId: string): Promise<BetaBuildLocalization[]> {\n return this.http.all<BetaBuildLocalization>(\n `/v1/builds/${buildId}/betaBuildLocalizations`\n );\n }\n\n async createLocalization(params: {\n buildId: string;\n locale: string;\n whatsNew: string;\n }): Promise<BetaBuildLocalization> {\n const response = await this.http.post<\n JsonApiResponse<BetaBuildLocalization>\n >(\"/v1/betaBuildLocalizations\", {\n data: {\n type: \"betaBuildLocalizations\",\n attributes: {\n locale: params.locale,\n whatsNew: params.whatsNew,\n },\n relationships: {\n build: {\n data: { type: \"builds\", id: params.buildId },\n },\n },\n },\n });\n return response.data;\n }\n\n async updateLocalization(\n localizationId: string,\n params: { whatsNew: string }\n ): Promise<BetaBuildLocalization> {\n const response = await this.http.patch<\n JsonApiResponse<BetaBuildLocalization>\n >(`/v1/betaBuildLocalizations/${localizationId}`, {\n data: {\n type: \"betaBuildLocalizations\",\n id: localizationId,\n attributes: {\n whatsNew: params.whatsNew,\n },\n },\n });\n return response.data;\n }\n\n async getPreReleaseVersion(buildId: string): Promise<PreReleaseVersion | null> {\n try {\n const response = await this.http.get<JsonApiResponse<PreReleaseVersion>>(\n `/v1/builds/${buildId}/preReleaseVersion`\n );\n return response.data;\n } catch {\n return null;\n }\n }\n\n async submitForBetaReview(buildId: string): Promise<void> {\n await this.http.post(\"/v1/betaAppReviewSubmissions\", {\n data: {\n type: \"betaAppReviewSubmissions\",\n relationships: {\n build: {\n data: { type: \"builds\", id: buildId },\n },\n },\n },\n });\n }\n\n async expireBuild(buildId: string): Promise<void> {\n await this.http.patch(`/v1/builds/${buildId}`, {\n data: {\n type: \"builds\",\n id: buildId,\n attributes: {\n expired: true,\n },\n },\n });\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResponse, ListParams } from \"../client/types.js\";\nimport type { BetaGroup } from \"../types/build.js\";\n\nexport class BetaGroupsResource {\n constructor(private http: RequestClient) {}\n\n async list(params?: {\n filter?: {\n app?: string;\n name?: string;\n isInternalGroup?: string;\n id?: string | string[];\n };\n fields?: string[];\n limit?: number;\n sort?: string;\n }): Promise<BetaGroup[]> {\n const listParams: ListParams = {\n filter: params?.filter as Record<string, string | string[]>,\n limit: params?.limit ?? 200,\n sort: params?.sort,\n };\n if (params?.fields) {\n listParams.fields = { betaGroups: params.fields.join(\",\") };\n }\n return this.http.all<BetaGroup>(\"/v1/betaGroups\", listParams);\n }\n\n async get(id: string): Promise<BetaGroup> {\n const response = await this.http.get<JsonApiResponse<BetaGroup>>(\n `/v1/betaGroups/${id}`\n );\n return response.data;\n }\n\n async listForApp(appId: string): Promise<BetaGroup[]> {\n return this.http.all<BetaGroup>(`/v1/apps/${appId}/betaGroups`);\n }\n\n async addBuilds(groupId: string, buildIds: string[]): Promise<void> {\n await this.http.post(`/v1/betaGroups/${groupId}/relationships/builds`, {\n data: buildIds.map((id) => ({ type: \"builds\", id })),\n });\n }\n\n async removeBuilds(groupId: string, buildIds: string[]): Promise<void> {\n await this.http.request(\n `/v1/betaGroups/${groupId}/relationships/builds`,\n {\n method: \"DELETE\",\n body: {\n data: buildIds.map((id) => ({ type: \"builds\", id })),\n },\n }\n );\n }\n\n async findByName(appId: string, name: string): Promise<BetaGroup | null> {\n const groups = await this.listForApp(appId);\n return groups.find((g) => g.attributes.name === name) ?? null;\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResponse } from \"../client/types.js\";\nimport type {\n BundleIdCapability,\n CapabilitySettingInput,\n} from \"../types/capability.js\";\nimport type { CapabilityType } from \"../types/enums.js\";\n\nexport class CapabilitiesResource {\n constructor(private http: RequestClient) {}\n\n async listForBundleId(bundleIdId: string): Promise<BundleIdCapability[]> {\n return this.http.all<BundleIdCapability>(\n `/v1/bundleIds/${bundleIdId}/bundleIdCapabilities`\n );\n }\n\n async enable(params: {\n bundleIdId: string;\n capabilityType: CapabilityType;\n settings?: CapabilitySettingInput[];\n }): Promise<BundleIdCapability> {\n const attributes: Record<string, unknown> = {\n capabilityType: params.capabilityType,\n };\n if (params.settings) {\n attributes.settings = params.settings;\n }\n\n const response = await this.http.post<\n JsonApiResponse<BundleIdCapability>\n >(\"/v1/bundleIdCapabilities\", {\n data: {\n type: \"bundleIdCapabilities\",\n attributes,\n relationships: {\n bundleId: {\n data: { type: \"bundleIds\", id: params.bundleIdId },\n },\n },\n },\n });\n return response.data;\n }\n\n async update(\n capabilityId: string,\n params: {\n capabilityType: CapabilityType;\n settings?: CapabilitySettingInput[];\n }\n ): Promise<BundleIdCapability> {\n const attributes: Record<string, unknown> = {\n capabilityType: params.capabilityType,\n };\n if (params.settings) {\n attributes.settings = params.settings;\n }\n\n const response = await this.http.patch<\n JsonApiResponse<BundleIdCapability>\n >(`/v1/bundleIdCapabilities/${capabilityId}`, {\n data: {\n type: \"bundleIdCapabilities\",\n id: capabilityId,\n attributes,\n },\n });\n return response.data;\n }\n\n async disable(capabilityId: string): Promise<void> {\n await this.http.delete(`/v1/bundleIdCapabilities/${capabilityId}`);\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResponse, ListParams } from \"../client/types.js\";\nimport type { AppStoreVersionState, Platform, ReleaseType } from \"../types/enums.js\";\n\nexport interface AppStoreVersion {\n id: string;\n type: \"appStoreVersions\";\n attributes: {\n platform: Platform;\n versionString: string;\n appStoreState: AppStoreVersionState;\n copyright: string | null;\n releaseType: ReleaseType | null;\n earliestReleaseDate: string | null;\n downloadable: boolean;\n createdDate: string;\n };\n relationships?: {\n app?: { data: { type: \"apps\"; id: string } };\n build?: { data: { type: \"builds\"; id: string } | null };\n appStoreVersionLocalizations?: {\n data: Array<{ type: \"appStoreVersionLocalizations\"; id: string }>;\n };\n };\n}\n\nexport interface AppStoreVersionLocalization {\n id: string;\n type: \"appStoreVersionLocalizations\";\n attributes: {\n description: string | null;\n locale: string;\n keywords: string | null;\n marketingUrl: string | null;\n promotionalText: string | null;\n supportUrl: string | null;\n whatsNew: string | null;\n };\n}\n\nexport class AppStoreVersionsResource {\n constructor(private http: RequestClient) {}\n\n async listForApp(\n appId: string,\n params?: {\n filter?: { appStoreState?: AppStoreVersionState | AppStoreVersionState[]; platform?: Platform };\n include?: string;\n limit?: number;\n }\n ): Promise<AppStoreVersion[]> {\n const listParams: ListParams = {\n filter: params?.filter as Record<string, string | string[]>,\n include: params?.include,\n limit: params?.limit ?? 200,\n };\n return this.http.all<AppStoreVersion>(\n `/v1/apps/${appId}/appStoreVersions`,\n listParams\n );\n }\n\n async get(id: string, params?: { include?: string }): Promise<AppStoreVersion> {\n const queryParams: Record<string, string | undefined> = {};\n if (params?.include) queryParams[\"include\"] = params.include;\n const response = await this.http.get<JsonApiResponse<AppStoreVersion>>(\n `/v1/appStoreVersions/${id}`,\n queryParams\n );\n return response.data;\n }\n\n async create(params: {\n appId: string;\n versionString: string;\n platform: Platform;\n releaseType?: ReleaseType;\n earliestReleaseDate?: string;\n copyright?: string;\n }): Promise<AppStoreVersion> {\n const attributes: Record<string, unknown> = {\n versionString: params.versionString,\n platform: params.platform,\n };\n if (params.releaseType) attributes.releaseType = params.releaseType;\n if (params.earliestReleaseDate) attributes.earliestReleaseDate = params.earliestReleaseDate;\n if (params.copyright) attributes.copyright = params.copyright;\n\n const response = await this.http.post<JsonApiResponse<AppStoreVersion>>(\n \"/v1/appStoreVersions\",\n {\n data: {\n type: \"appStoreVersions\",\n attributes,\n relationships: {\n app: {\n data: { type: \"apps\", id: params.appId },\n },\n },\n },\n }\n );\n return response.data;\n }\n\n async update(\n id: string,\n params: {\n versionString?: string;\n copyright?: string;\n releaseType?: ReleaseType;\n earliestReleaseDate?: string | null;\n }\n ): Promise<AppStoreVersion> {\n const response = await this.http.patch<JsonApiResponse<AppStoreVersion>>(\n `/v1/appStoreVersions/${id}`,\n {\n data: {\n type: \"appStoreVersions\",\n id,\n attributes: params,\n },\n }\n );\n return response.data;\n }\n\n async setBuild(versionId: string, buildId: string): Promise<void> {\n await this.http.patch(`/v1/appStoreVersions/${versionId}/relationships/build`, {\n data: { type: \"builds\", id: buildId },\n });\n }\n\n async getLocalizations(versionId: string): Promise<AppStoreVersionLocalization[]> {\n return this.http.all<AppStoreVersionLocalization>(\n `/v1/appStoreVersions/${versionId}/appStoreVersionLocalizations`\n );\n }\n\n async createLocalization(params: {\n versionId: string;\n locale: string;\n description?: string;\n keywords?: string;\n marketingUrl?: string;\n promotionalText?: string;\n supportUrl?: string;\n whatsNew?: string;\n }): Promise<AppStoreVersionLocalization> {\n const { versionId, ...attributes } = params;\n const response = await this.http.post<\n JsonApiResponse<AppStoreVersionLocalization>\n >(\"/v1/appStoreVersionLocalizations\", {\n data: {\n type: \"appStoreVersionLocalizations\",\n attributes,\n relationships: {\n appStoreVersion: {\n data: { type: \"appStoreVersions\", id: versionId },\n },\n },\n },\n });\n return response.data;\n }\n\n async updateLocalization(\n localizationId: string,\n params: {\n description?: string;\n keywords?: string;\n marketingUrl?: string;\n promotionalText?: string;\n supportUrl?: string;\n whatsNew?: string;\n }\n ): Promise<AppStoreVersionLocalization> {\n const response = await this.http.patch<\n JsonApiResponse<AppStoreVersionLocalization>\n >(`/v1/appStoreVersionLocalizations/${localizationId}`, {\n data: {\n type: \"appStoreVersionLocalizations\",\n id: localizationId,\n attributes: params,\n },\n });\n return response.data;\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResponse } from \"../client/types.js\";\n\nexport interface AppScreenshotSet {\n id: string;\n type: \"appScreenshotSets\";\n attributes: {\n screenshotDisplayType: string;\n };\n}\n\nexport interface AppScreenshot {\n id: string;\n type: \"appScreenshots\";\n attributes: {\n fileSize: number;\n fileName: string;\n sourceFileChecksum: string | null;\n imageAsset: {\n templateUrl: string;\n width: number;\n height: number;\n } | null;\n assetToken: string | null;\n assetType: string | null;\n uploadOperations: UploadOperation[] | null;\n assetDeliveryState: {\n state: string;\n errors: unknown[];\n } | null;\n };\n}\n\nexport interface UploadOperation {\n method: string;\n url: string;\n length: number;\n offset: number;\n requestHeaders: Array<{ name: string; value: string }>;\n}\n\nexport class AppScreenshotsResource {\n constructor(private http: RequestClient) {}\n\n async listSetsForLocalization(\n localizationId: string\n ): Promise<AppScreenshotSet[]> {\n return this.http.all<AppScreenshotSet>(\n `/v1/appStoreVersionLocalizations/${localizationId}/appScreenshotSets`\n );\n }\n\n async createSet(params: {\n localizationId: string;\n screenshotDisplayType: string;\n }): Promise<AppScreenshotSet> {\n const response = await this.http.post<\n JsonApiResponse<AppScreenshotSet>\n >(\"/v1/appScreenshotSets\", {\n data: {\n type: \"appScreenshotSets\",\n attributes: {\n screenshotDisplayType: params.screenshotDisplayType,\n },\n relationships: {\n appStoreVersionLocalization: {\n data: {\n type: \"appStoreVersionLocalizations\",\n id: params.localizationId,\n },\n },\n },\n },\n });\n return response.data;\n }\n\n async listScreenshots(setId: string): Promise<AppScreenshot[]> {\n return this.http.all<AppScreenshot>(\n `/v1/appScreenshotSets/${setId}/appScreenshots`\n );\n }\n\n async reserveScreenshot(params: {\n setId: string;\n fileName: string;\n fileSize: number;\n }): Promise<AppScreenshot> {\n const response = await this.http.post<\n JsonApiResponse<AppScreenshot>\n >(\"/v1/appScreenshots\", {\n data: {\n type: \"appScreenshots\",\n attributes: {\n fileName: params.fileName,\n fileSize: params.fileSize,\n },\n relationships: {\n appScreenshotSet: {\n data: { type: \"appScreenshotSets\", id: params.setId },\n },\n },\n },\n });\n return response.data;\n }\n\n async commitScreenshot(\n screenshotId: string,\n params: { sourceFileChecksum: string; uploaded: boolean }\n ): Promise<AppScreenshot> {\n const response = await this.http.patch<\n JsonApiResponse<AppScreenshot>\n >(`/v1/appScreenshots/${screenshotId}`, {\n data: {\n type: \"appScreenshots\",\n id: screenshotId,\n attributes: {\n sourceFileChecksum: params.sourceFileChecksum,\n uploaded: params.uploaded,\n },\n },\n });\n return response.data;\n }\n\n async deleteScreenshot(screenshotId: string): Promise<void> {\n await this.http.delete(`/v1/appScreenshots/${screenshotId}`);\n }\n\n async deleteSet(setId: string): Promise<void> {\n await this.http.delete(`/v1/appScreenshotSets/${setId}`);\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResponse } from \"../client/types.js\";\n\nexport interface ReviewSubmission {\n id: string;\n type: \"reviewSubmissions\";\n attributes: {\n state: string;\n submittedDate: string | null;\n platform: string;\n };\n}\n\nexport interface AppStoreVersionSubmission {\n id: string;\n type: \"appStoreVersionSubmissions\";\n}\n\nexport class ReviewSubmissionsResource {\n constructor(private http: RequestClient) {}\n\n async submitVersion(versionId: string): Promise<AppStoreVersionSubmission> {\n const response = await this.http.post<\n JsonApiResponse<AppStoreVersionSubmission>\n >(\"/v1/appStoreVersionSubmissions\", {\n data: {\n type: \"appStoreVersionSubmissions\",\n relationships: {\n appStoreVersion: {\n data: { type: \"appStoreVersions\", id: versionId },\n },\n },\n },\n });\n return response.data;\n }\n\n async createReviewSubmission(params: {\n appId: string;\n platform: string;\n }): Promise<ReviewSubmission> {\n const response = await this.http.post<\n JsonApiResponse<ReviewSubmission>\n >(\"/v1/reviewSubmissions\", {\n data: {\n type: \"reviewSubmissions\",\n attributes: {\n platform: params.platform,\n },\n relationships: {\n app: {\n data: { type: \"apps\", id: params.appId },\n },\n },\n },\n });\n return response.data;\n }\n\n async confirmReviewSubmission(submissionId: string): Promise<ReviewSubmission> {\n const response = await this.http.patch<\n JsonApiResponse<ReviewSubmission>\n >(`/v1/reviewSubmissions/${submissionId}`, {\n data: {\n type: \"reviewSubmissions\",\n id: submissionId,\n attributes: {\n submitted: true,\n },\n },\n });\n return response.data;\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResource, JsonApiResponse, ListParams } from \"../client/types.js\";\n\n/**\n * App Info is the metadata container that holds an app's categories, age\n * ratings, and localisations for a single submission cycle. Ported from\n * `spaceship/connect_api/models/app_info.rb`.\n */\nexport interface AppInfoAttributes {\n appStoreState?: string | null;\n state?: string | null;\n appStoreAgeRating?: string | null;\n brazilAgeRating?: string | null;\n kidsAgeBand?: string | null;\n}\n\nexport type AppInfo = JsonApiResource<\"appInfos\", AppInfoAttributes>;\n\nexport class AppInfosResource {\n constructor(private http: RequestClient) {}\n\n async listForApp(appId: string, params?: {\n include?: string;\n limit?: number;\n }): Promise<AppInfo[]> {\n const listParams: ListParams = {\n limit: params?.limit ?? 200,\n include: params?.include,\n };\n return this.http.all<AppInfo>(`/v1/apps/${appId}/appInfos`, listParams);\n }\n\n async get(id: string, params?: { include?: string }): Promise<AppInfo> {\n const queryParams: Record<string, string | undefined> = {};\n if (params?.include) queryParams[\"include\"] = params.include;\n const response = await this.http.get<JsonApiResponse<AppInfo>>(\n `/v1/appInfos/${id}`,\n queryParams\n );\n return response.data;\n }\n\n async update(\n id: string,\n relationships?: Record<string, { type: string; id: string } | null>\n ): Promise<AppInfo> {\n const response = await this.http.patch<JsonApiResponse<AppInfo>>(\n `/v1/appInfos/${id}`,\n {\n data: {\n type: \"appInfos\",\n id,\n ...(relationships\n ? {\n relationships: Object.fromEntries(\n Object.entries(relationships).map(([k, v]) => [k, { data: v }])\n ),\n }\n : {}),\n },\n }\n );\n return response.data;\n }\n\n async delete(id: string): Promise<void> {\n await this.http.delete(`/v1/appInfos/${id}`);\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResource, JsonApiResponse, ListParams } from \"../client/types.js\";\n\nexport interface AppInfoLocalizationAttributes {\n locale: string;\n name?: string | null;\n subtitle?: string | null;\n privacyPolicyUrl?: string | null;\n privacyChoicesUrl?: string | null;\n privacyPolicyText?: string | null;\n}\n\nexport type AppInfoLocalization = JsonApiResource<\n \"appInfoLocalizations\",\n AppInfoLocalizationAttributes\n>;\n\nexport class AppInfoLocalizationsResource {\n constructor(private http: RequestClient) {}\n\n async listForAppInfo(appInfoId: string, params?: {\n limit?: number;\n }): Promise<AppInfoLocalization[]> {\n const listParams: ListParams = {\n limit: params?.limit ?? 200,\n };\n return this.http.all<AppInfoLocalization>(\n `/v1/appInfos/${appInfoId}/appInfoLocalizations`,\n listParams\n );\n }\n\n async get(id: string): Promise<AppInfoLocalization> {\n const response = await this.http.get<JsonApiResponse<AppInfoLocalization>>(\n `/v1/appInfoLocalizations/${id}`\n );\n return response.data;\n }\n\n async create(params: {\n appInfoId: string;\n attributes: AppInfoLocalizationAttributes;\n }): Promise<AppInfoLocalization> {\n const response = await this.http.post<JsonApiResponse<AppInfoLocalization>>(\n \"/v1/appInfoLocalizations\",\n {\n data: {\n type: \"appInfoLocalizations\",\n attributes: params.attributes,\n relationships: {\n appInfo: { data: { type: \"appInfos\", id: params.appInfoId } },\n },\n },\n }\n );\n return response.data;\n }\n\n async update(\n id: string,\n attributes: Partial<AppInfoLocalizationAttributes>\n ): Promise<AppInfoLocalization> {\n const response = await this.http.patch<JsonApiResponse<AppInfoLocalization>>(\n `/v1/appInfoLocalizations/${id}`,\n { data: { type: \"appInfoLocalizations\", id, attributes } }\n );\n return response.data;\n }\n\n async delete(id: string): Promise<void> {\n await this.http.delete(`/v1/appInfoLocalizations/${id}`);\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResource, JsonApiResponse } from \"../client/types.js\";\n\nexport interface AppStoreReviewDetailAttributes {\n contactFirstName?: string | null;\n contactLastName?: string | null;\n contactPhone?: string | null;\n contactEmail?: string | null;\n demoAccountName?: string | null;\n demoAccountPassword?: string | null;\n demoAccountRequired?: boolean | null;\n notes?: string | null;\n}\n\nexport type AppStoreReviewDetail = JsonApiResource<\n \"appStoreReviewDetails\",\n AppStoreReviewDetailAttributes\n>;\n\nexport class AppStoreReviewDetailsResource {\n constructor(private http: RequestClient) {}\n\n async getForAppStoreVersion(\n appStoreVersionId: string\n ): Promise<AppStoreReviewDetail> {\n const response = await this.http.get<\n JsonApiResponse<AppStoreReviewDetail>\n >(`/v1/appStoreVersions/${appStoreVersionId}/appStoreReviewDetail`);\n return response.data;\n }\n\n async get(id: string): Promise<AppStoreReviewDetail> {\n const response = await this.http.get<\n JsonApiResponse<AppStoreReviewDetail>\n >(`/v1/appStoreReviewDetails/${id}`);\n return response.data;\n }\n\n async create(params: {\n appStoreVersionId: string;\n attributes: AppStoreReviewDetailAttributes;\n }): Promise<AppStoreReviewDetail> {\n const response = await this.http.post<\n JsonApiResponse<AppStoreReviewDetail>\n >(\"/v1/appStoreReviewDetails\", {\n data: {\n type: \"appStoreReviewDetails\",\n attributes: params.attributes,\n relationships: {\n appStoreVersion: {\n data: { type: \"appStoreVersions\", id: params.appStoreVersionId },\n },\n },\n },\n });\n return response.data;\n }\n\n async update(\n id: string,\n attributes: Partial<AppStoreReviewDetailAttributes>\n ): Promise<AppStoreReviewDetail> {\n const response = await this.http.patch<\n JsonApiResponse<AppStoreReviewDetail>\n >(`/v1/appStoreReviewDetails/${id}`, {\n data: { type: \"appStoreReviewDetails\", id, attributes },\n });\n return response.data;\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResource, JsonApiResponse, ListParams } from \"../client/types.js\";\n\nexport interface BetaTesterAttributes {\n firstName?: string | null;\n lastName?: string | null;\n email: string;\n inviteType?: \"EMAIL\" | \"PUBLIC_LINK\" | null;\n state?: string | null;\n}\n\nexport type BetaTester = JsonApiResource<\"betaTesters\", BetaTesterAttributes>;\n\nexport class BetaTestersResource {\n constructor(private http: RequestClient) {}\n\n async list(params?: {\n filter?: {\n email?: string;\n firstName?: string;\n lastName?: string;\n inviteType?: string;\n apps?: string | string[];\n betaGroups?: string | string[];\n };\n include?: string;\n limit?: number;\n sort?: string;\n }): Promise<BetaTester[]> {\n const listParams: ListParams = {\n filter: params?.filter as Record<string, string | string[]>,\n include: params?.include,\n limit: params?.limit ?? 200,\n sort: params?.sort,\n };\n return this.http.all<BetaTester>(\"/v1/betaTesters\", listParams);\n }\n\n async get(id: string): Promise<BetaTester> {\n const response = await this.http.get<JsonApiResponse<BetaTester>>(\n `/v1/betaTesters/${id}`\n );\n return response.data;\n }\n\n async create(params: {\n email: string;\n firstName?: string;\n lastName?: string;\n betaGroupIds?: string[];\n appIds?: string[];\n }): Promise<BetaTester> {\n const attributes: BetaTesterAttributes = {\n email: params.email,\n firstName: params.firstName,\n lastName: params.lastName,\n };\n const relationships: Record<string, { data: Array<{ type: string; id: string }> }> = {};\n if (params.betaGroupIds?.length) {\n relationships.betaGroups = {\n data: params.betaGroupIds.map((id) => ({ type: \"betaGroups\", id })),\n };\n }\n if (params.appIds?.length) {\n relationships.apps = {\n data: params.appIds.map((id) => ({ type: \"apps\", id })),\n };\n }\n const response = await this.http.post<JsonApiResponse<BetaTester>>(\n \"/v1/betaTesters\",\n {\n data: {\n type: \"betaTesters\",\n attributes,\n ...(Object.keys(relationships).length ? { relationships } : {}),\n },\n }\n );\n return response.data;\n }\n\n async delete(id: string): Promise<void> {\n await this.http.delete(`/v1/betaTesters/${id}`);\n }\n\n async findByEmail(email: string): Promise<BetaTester | null> {\n const results = await this.list({ filter: { email }, limit: 1 });\n return results[0] ?? null;\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResource, JsonApiResponse, ListParams } from \"../client/types.js\";\n\nexport interface BetaAppReviewSubmissionAttributes {\n betaReviewState?: string | null;\n submittedDate?: string | null;\n}\n\nexport type BetaAppReviewSubmission = JsonApiResource<\n \"betaAppReviewSubmissions\",\n BetaAppReviewSubmissionAttributes\n>;\n\nexport class BetaAppReviewSubmissionsResource {\n constructor(private http: RequestClient) {}\n\n async list(params?: {\n filter?: { build?: string | string[]; betaReviewState?: string };\n limit?: number;\n }): Promise<BetaAppReviewSubmission[]> {\n const listParams: ListParams = {\n filter: params?.filter as Record<string, string | string[]>,\n limit: params?.limit ?? 200,\n };\n return this.http.all<BetaAppReviewSubmission>(\n \"/v1/betaAppReviewSubmissions\",\n listParams\n );\n }\n\n async get(id: string): Promise<BetaAppReviewSubmission> {\n const response = await this.http.get<JsonApiResponse<BetaAppReviewSubmission>>(\n `/v1/betaAppReviewSubmissions/${id}`\n );\n return response.data;\n }\n\n async create(buildId: string): Promise<BetaAppReviewSubmission> {\n const response = await this.http.post<JsonApiResponse<BetaAppReviewSubmission>>(\n \"/v1/betaAppReviewSubmissions\",\n {\n data: {\n type: \"betaAppReviewSubmissions\",\n relationships: {\n build: { data: { type: \"builds\", id: buildId } },\n },\n },\n }\n );\n return response.data;\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResource, JsonApiResponse } from \"../client/types.js\";\n\nexport interface BetaAppReviewDetailAttributes {\n contactFirstName?: string | null;\n contactLastName?: string | null;\n contactPhone?: string | null;\n contactEmail?: string | null;\n demoAccountName?: string | null;\n demoAccountPassword?: string | null;\n demoAccountRequired?: boolean | null;\n notes?: string | null;\n}\n\nexport type BetaAppReviewDetail = JsonApiResource<\n \"betaAppReviewDetails\",\n BetaAppReviewDetailAttributes\n>;\n\nexport class BetaAppReviewDetailsResource {\n constructor(private http: RequestClient) {}\n\n async getForApp(appId: string): Promise<BetaAppReviewDetail> {\n const response = await this.http.get<JsonApiResponse<BetaAppReviewDetail>>(\n `/v1/apps/${appId}/betaAppReviewDetail`\n );\n return response.data;\n }\n\n async get(id: string): Promise<BetaAppReviewDetail> {\n const response = await this.http.get<JsonApiResponse<BetaAppReviewDetail>>(\n `/v1/betaAppReviewDetails/${id}`\n );\n return response.data;\n }\n\n async update(\n id: string,\n attributes: Partial<BetaAppReviewDetailAttributes>\n ): Promise<BetaAppReviewDetail> {\n const response = await this.http.patch<JsonApiResponse<BetaAppReviewDetail>>(\n `/v1/betaAppReviewDetails/${id}`,\n { data: { type: \"betaAppReviewDetails\", id, attributes } }\n );\n return response.data;\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResource, JsonApiResponse } from \"../client/types.js\";\n\nexport type InvitationType = \"EMAIL\" | \"PUBLIC_LINK\";\n\nexport interface BetaTesterInvitationAttributes {\n // Write-only resource: no stored attributes, just a creation side-effect.\n [key: string]: unknown;\n}\n\nexport type BetaTesterInvitation = JsonApiResource<\n \"betaTesterInvitations\",\n BetaTesterInvitationAttributes\n>;\n\nexport class BetaInvitationsResource {\n constructor(private http: RequestClient) {}\n\n /** Send a TestFlight invitation email for an existing tester + app. */\n async send(params: {\n appId: string;\n betaTesterId: string;\n }): Promise<BetaTesterInvitation> {\n const response = await this.http.post<JsonApiResponse<BetaTesterInvitation>>(\n \"/v1/betaTesterInvitations\",\n {\n data: {\n type: \"betaTesterInvitations\",\n relationships: {\n app: { data: { type: \"apps\", id: params.appId } },\n betaTester: { data: { type: \"betaTesters\", id: params.betaTesterId } },\n },\n },\n }\n );\n return response.data;\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResource, JsonApiResponse, ListParams } from \"../client/types.js\";\n\nexport interface BetaLicenseAgreementAttributes {\n agreementText?: string | null;\n}\n\nexport type BetaLicenseAgreement = JsonApiResource<\n \"betaLicenseAgreements\",\n BetaLicenseAgreementAttributes\n>;\n\nexport class BetaLicensesResource {\n constructor(private http: RequestClient) {}\n\n async list(params?: { limit?: number }): Promise<BetaLicenseAgreement[]> {\n const listParams: ListParams = {\n limit: params?.limit ?? 200,\n };\n return this.http.all<BetaLicenseAgreement>(\n \"/v1/betaLicenseAgreements\",\n listParams\n );\n }\n\n async get(id: string): Promise<BetaLicenseAgreement> {\n const response = await this.http.get<JsonApiResponse<BetaLicenseAgreement>>(\n `/v1/betaLicenseAgreements/${id}`\n );\n return response.data;\n }\n\n async getForApp(appId: string): Promise<BetaLicenseAgreement> {\n const response = await this.http.get<JsonApiResponse<BetaLicenseAgreement>>(\n `/v1/apps/${appId}/betaLicenseAgreement`\n );\n return response.data;\n }\n\n async update(\n id: string,\n attributes: Partial<BetaLicenseAgreementAttributes>\n ): Promise<BetaLicenseAgreement> {\n const response = await this.http.patch<\n JsonApiResponse<BetaLicenseAgreement>\n >(`/v1/betaLicenseAgreements/${id}`, {\n data: { type: \"betaLicenseAgreements\", id, attributes },\n });\n return response.data;\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResource, JsonApiResponse } from \"../client/types.js\";\n\nexport interface AppPreviewAttributes {\n fileSize?: number | null;\n fileName?: string | null;\n sourceFileChecksum?: string | null;\n previewFrameTimeCode?: string | null;\n mimeType?: string | null;\n videoUrl?: string | null;\n previewImage?: { templateUrl?: string; width?: number; height?: number } | null;\n uploadOperations?: unknown[] | null;\n assetDeliveryState?: { state?: string } | null;\n uploaded?: boolean | null;\n}\n\nexport type AppPreview = JsonApiResource<\"appPreviews\", AppPreviewAttributes>;\n\nexport class AppPreviewsResource {\n constructor(private http: RequestClient) {}\n\n async get(id: string): Promise<AppPreview> {\n const response = await this.http.get<JsonApiResponse<AppPreview>>(\n `/v1/appPreviews/${id}`\n );\n return response.data;\n }\n\n async create(params: {\n appPreviewSetId: string;\n fileSize: number;\n fileName: string;\n previewFrameTimeCode?: string;\n mimeType?: string;\n }): Promise<AppPreview> {\n const { appPreviewSetId, ...rest } = params;\n const response = await this.http.post<JsonApiResponse<AppPreview>>(\n \"/v1/appPreviews\",\n {\n data: {\n type: \"appPreviews\",\n attributes: rest,\n relationships: {\n appPreviewSet: {\n data: { type: \"appPreviewSets\", id: appPreviewSetId },\n },\n },\n },\n }\n );\n return response.data;\n }\n\n async update(\n id: string,\n attributes: { uploaded?: boolean; sourceFileChecksum?: string; previewFrameTimeCode?: string }\n ): Promise<AppPreview> {\n const response = await this.http.patch<JsonApiResponse<AppPreview>>(\n `/v1/appPreviews/${id}`,\n { data: { type: \"appPreviews\", id, attributes } }\n );\n return response.data;\n }\n\n async delete(id: string): Promise<void> {\n await this.http.delete(`/v1/appPreviews/${id}`);\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResource, JsonApiResponse, ListParams } from \"../client/types.js\";\n\nexport interface AppPreviewSetAttributes {\n previewType?: string | null;\n}\n\nexport type AppPreviewSet = JsonApiResource<\n \"appPreviewSets\",\n AppPreviewSetAttributes\n>;\n\nexport class AppPreviewSetsResource {\n constructor(private http: RequestClient) {}\n\n async listForLocalization(\n localizationId: string,\n params?: { limit?: number; include?: string }\n ): Promise<AppPreviewSet[]> {\n const listParams: ListParams = {\n limit: params?.limit ?? 200,\n include: params?.include,\n };\n return this.http.all<AppPreviewSet>(\n `/v1/appStoreVersionLocalizations/${localizationId}/appPreviewSets`,\n listParams\n );\n }\n\n async get(id: string, params?: { include?: string }): Promise<AppPreviewSet> {\n const queryParams: Record<string, string | undefined> = {};\n if (params?.include) queryParams[\"include\"] = params.include;\n const response = await this.http.get<JsonApiResponse<AppPreviewSet>>(\n `/v1/appPreviewSets/${id}`,\n queryParams\n );\n return response.data;\n }\n\n async create(params: {\n appStoreVersionLocalizationId: string;\n previewType: string;\n }): Promise<AppPreviewSet> {\n const response = await this.http.post<JsonApiResponse<AppPreviewSet>>(\n \"/v1/appPreviewSets\",\n {\n data: {\n type: \"appPreviewSets\",\n attributes: { previewType: params.previewType },\n relationships: {\n appStoreVersionLocalization: {\n data: {\n type: \"appStoreVersionLocalizations\",\n id: params.appStoreVersionLocalizationId,\n },\n },\n },\n },\n }\n );\n return response.data;\n }\n\n async delete(id: string): Promise<void> {\n await this.http.delete(`/v1/appPreviewSets/${id}`);\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResource, JsonApiResponse, ListParams } from \"../client/types.js\";\n\nexport interface AppPriceAttributes {\n startDate?: string | null;\n}\n\nexport type AppPrice = JsonApiResource<\"appPrices\", AppPriceAttributes>;\n\nexport class AppPricesResource {\n constructor(private http: RequestClient) {}\n\n async listForApp(appId: string, params?: {\n include?: string;\n limit?: number;\n }): Promise<AppPrice[]> {\n const listParams: ListParams = {\n limit: params?.limit ?? 200,\n include: params?.include,\n };\n return this.http.all<AppPrice>(`/v1/apps/${appId}/prices`, listParams);\n }\n\n async get(id: string, params?: { include?: string }): Promise<AppPrice> {\n const queryParams: Record<string, string | undefined> = {};\n if (params?.include) queryParams[\"include\"] = params.include;\n const response = await this.http.get<JsonApiResponse<AppPrice>>(\n `/v1/appPrices/${id}`,\n queryParams\n );\n return response.data;\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResource, JsonApiResponse, ListParams } from \"../client/types.js\";\n\nexport interface TerritoryAttributes {\n currency?: string | null;\n}\n\nexport type Territory = JsonApiResource<\"territories\", TerritoryAttributes>;\n\nexport class TerritoriesResource {\n constructor(private http: RequestClient) {}\n\n async list(params?: { limit?: number }): Promise<Territory[]> {\n const listParams: ListParams = {\n limit: params?.limit ?? 200,\n };\n return this.http.all<Territory>(\"/v1/territories\", listParams);\n }\n\n async get(id: string): Promise<Territory> {\n const response = await this.http.get<JsonApiResponse<Territory>>(\n `/v1/territories/${id}`\n );\n return response.data;\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResource, JsonApiResponse } from \"../client/types.js\";\n\nexport interface AgeRatingDeclarationAttributes {\n alcoholTobaccoOrDrugUseOrReferences?: string | null;\n contests?: string | null;\n gamblingSimulated?: string | null;\n medicalOrTreatmentInformation?: string | null;\n profanityOrCrudeHumor?: string | null;\n sexualContentGraphicAndNudity?: string | null;\n sexualContentOrNudity?: string | null;\n horrorOrFearThemes?: string | null;\n matureOrSuggestiveThemes?: string | null;\n unrestrictedWebAccess?: boolean | null;\n gamblingAndContests?: boolean | null;\n gambling?: string | null;\n violenceCartoonOrFantasy?: string | null;\n violenceRealistic?: string | null;\n violenceRealisticProlongedGraphicOrSadistic?: string | null;\n kidsAgeBand?: string | null;\n seventeenPlus?: boolean | null;\n}\n\nexport type AgeRatingDeclaration = JsonApiResource<\n \"ageRatingDeclarations\",\n AgeRatingDeclarationAttributes\n>;\n\nexport class AgeRatingDeclarationsResource {\n constructor(private http: RequestClient) {}\n\n async get(id: string): Promise<AgeRatingDeclaration> {\n const response = await this.http.get<JsonApiResponse<AgeRatingDeclaration>>(\n `/v1/ageRatingDeclarations/${id}`\n );\n return response.data;\n }\n\n async update(\n id: string,\n attributes: Partial<AgeRatingDeclarationAttributes>\n ): Promise<AgeRatingDeclaration> {\n const response = await this.http.patch<\n JsonApiResponse<AgeRatingDeclaration>\n >(`/v1/ageRatingDeclarations/${id}`, {\n data: { type: \"ageRatingDeclarations\", id, attributes },\n });\n return response.data;\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResource, JsonApiResponse, ListParams } from \"../client/types.js\";\n\nexport interface AppCategoryAttributes {\n platforms?: string[] | null;\n}\n\nexport type AppCategory = JsonApiResource<\"appCategories\", AppCategoryAttributes>;\n\nexport class AppCategoriesResource {\n constructor(private http: RequestClient) {}\n\n async list(params?: {\n filter?: { platforms?: string };\n include?: string;\n limit?: number;\n }): Promise<AppCategory[]> {\n const listParams: ListParams = {\n filter: params?.filter as Record<string, string | string[]>,\n include: params?.include,\n limit: params?.limit ?? 200,\n };\n return this.http.all<AppCategory>(\"/v1/appCategories\", listParams);\n }\n\n async get(id: string, params?: { include?: string }): Promise<AppCategory> {\n const queryParams: Record<string, string | undefined> = {};\n if (params?.include) queryParams[\"include\"] = params.include;\n const response = await this.http.get<JsonApiResponse<AppCategory>>(\n `/v1/appCategories/${id}`,\n queryParams\n );\n return response.data;\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResource, JsonApiResponse, ListParams } from \"../client/types.js\";\n\nexport interface AppEncryptionDeclarationAttributes {\n appEncryptionDeclarationState?: string | null;\n createdDate?: string | null;\n codeValue?: string | null;\n usesEncryption?: boolean | null;\n exempt?: boolean | null;\n containsProprietaryCryptography?: boolean | null;\n containsThirdPartyCryptography?: boolean | null;\n availableOnFrenchStore?: boolean | null;\n platform?: string | null;\n uploadedDate?: string | null;\n documentUrl?: string | null;\n documentName?: string | null;\n documentType?: string | null;\n}\n\nexport type AppEncryptionDeclaration = JsonApiResource<\n \"appEncryptionDeclarations\",\n AppEncryptionDeclarationAttributes\n>;\n\nexport class AppEncryptionDeclarationsResource {\n constructor(private http: RequestClient) {}\n\n async list(params?: {\n filter?: { app?: string; platform?: string };\n limit?: number;\n }): Promise<AppEncryptionDeclaration[]> {\n const listParams: ListParams = {\n filter: params?.filter as Record<string, string | string[]>,\n limit: params?.limit ?? 200,\n };\n return this.http.all<AppEncryptionDeclaration>(\n \"/v1/appEncryptionDeclarations\",\n listParams\n );\n }\n\n async get(id: string): Promise<AppEncryptionDeclaration> {\n const response = await this.http.get<\n JsonApiResponse<AppEncryptionDeclaration>\n >(`/v1/appEncryptionDeclarations/${id}`);\n return response.data;\n }\n\n async assignToBuild(params: {\n declarationId: string;\n buildIds: string[];\n }): Promise<void> {\n await this.http.post(\n `/v1/appEncryptionDeclarations/${params.declarationId}/relationships/builds`,\n { data: params.buildIds.map((id) => ({ type: \"builds\", id })) }\n );\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResource, JsonApiResponse } from \"../client/types.js\";\n\nexport interface IdfaDeclarationAttributes {\n honorsLimitedAdTracking?: boolean | null;\n servesAds?: boolean | null;\n attributesActionWithPreviousAd?: boolean | null;\n attributesAppInstallationToPreviousAd?: boolean | null;\n}\n\nexport type IdfaDeclaration = JsonApiResource<\n \"idfaDeclarations\",\n IdfaDeclarationAttributes\n>;\n\nexport class IdfaDeclarationsResource {\n constructor(private http: RequestClient) {}\n\n async getForAppStoreVersion(\n appStoreVersionId: string\n ): Promise<IdfaDeclaration> {\n const response = await this.http.get<JsonApiResponse<IdfaDeclaration>>(\n `/v1/appStoreVersions/${appStoreVersionId}/idfaDeclaration`\n );\n return response.data;\n }\n\n async get(id: string): Promise<IdfaDeclaration> {\n const response = await this.http.get<JsonApiResponse<IdfaDeclaration>>(\n `/v1/idfaDeclarations/${id}`\n );\n return response.data;\n }\n\n async create(params: {\n appStoreVersionId: string;\n attributes: IdfaDeclarationAttributes;\n }): Promise<IdfaDeclaration> {\n const response = await this.http.post<JsonApiResponse<IdfaDeclaration>>(\n \"/v1/idfaDeclarations\",\n {\n data: {\n type: \"idfaDeclarations\",\n attributes: params.attributes,\n relationships: {\n appStoreVersion: {\n data: { type: \"appStoreVersions\", id: params.appStoreVersionId },\n },\n },\n },\n }\n );\n return response.data;\n }\n\n async update(\n id: string,\n attributes: Partial<IdfaDeclarationAttributes>\n ): Promise<IdfaDeclaration> {\n const response = await this.http.patch<JsonApiResponse<IdfaDeclaration>>(\n `/v1/idfaDeclarations/${id}`,\n { data: { type: \"idfaDeclarations\", id, attributes } }\n );\n return response.data;\n }\n\n async delete(id: string): Promise<void> {\n await this.http.delete(`/v1/idfaDeclarations/${id}`);\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResource, JsonApiResponse, ListParams } from \"../client/types.js\";\n\nexport interface PreReleaseVersionAttributes {\n version?: string | null;\n platform?: string | null;\n}\n\nexport type PreReleaseVersion = JsonApiResource<\n \"preReleaseVersions\",\n PreReleaseVersionAttributes\n>;\n\nexport class PreReleaseVersionsResource {\n constructor(private http: RequestClient) {}\n\n async list(params?: {\n filter?: {\n app?: string;\n version?: string;\n platform?: string;\n \"builds.expired\"?: string;\n \"builds.processingState\"?: string;\n \"builds.version\"?: string;\n };\n include?: string;\n limit?: number;\n sort?: string;\n }): Promise<PreReleaseVersion[]> {\n const listParams: ListParams = {\n filter: params?.filter as Record<string, string | string[]>,\n include: params?.include,\n limit: params?.limit ?? 200,\n sort: params?.sort,\n };\n return this.http.all<PreReleaseVersion>(\n \"/v1/preReleaseVersions\",\n listParams\n );\n }\n\n async get(\n id: string,\n params?: { include?: string }\n ): Promise<PreReleaseVersion> {\n const queryParams: Record<string, string | undefined> = {};\n if (params?.include) queryParams[\"include\"] = params.include;\n const response = await this.http.get<JsonApiResponse<PreReleaseVersion>>(\n `/v1/preReleaseVersions/${id}`,\n queryParams\n );\n return response.data;\n }\n\n async findByVersion(params: {\n appId: string;\n version: string;\n platform?: string;\n }): Promise<PreReleaseVersion | null> {\n const filter: Record<string, string> = {\n app: params.appId,\n version: params.version,\n };\n if (params.platform) filter.platform = params.platform;\n const results = await this.list({ filter, limit: 1 });\n return results[0] ?? null;\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResource, JsonApiResponse, ListParams } from \"../client/types.js\";\n\nexport interface ReviewSubmissionItemAttributes {\n state?: string | null;\n removed?: boolean | null;\n ready?: boolean | null;\n}\n\nexport type ReviewSubmissionItem = JsonApiResource<\n \"reviewSubmissionItems\",\n ReviewSubmissionItemAttributes\n>;\n\n// create() param → [relationship name, resource type]\nconst ITEM_RELATIONSHIPS: Record<string, [string, string]> = {\n appStoreVersionId: [\"appStoreVersion\", \"appStoreVersions\"],\n appCustomProductPageVersionId: [\"appCustomProductPageVersion\", \"appCustomProductPageVersions\"],\n appStoreVersionExperimentId: [\"appStoreVersionExperiment\", \"appStoreVersionExperiments\"],\n appStoreVersionExperimentV2Id: [\"appStoreVersionExperimentV2\", \"appStoreVersionExperiments\"],\n appEventId: [\"appEvent\", \"appEvents\"],\n appAssetLibraryImageId: [\"appAssetLibraryImage\", \"appAssetLibraryImages\"],\n appAssetLibraryVideoId: [\"appAssetLibraryVideo\", \"appAssetLibraryVideos\"],\n backgroundAssetVersionId: [\"backgroundAssetVersion\", \"backgroundAssetVersions\"],\n inAppPurchaseVersionId: [\"inAppPurchaseVersion\", \"inAppPurchaseVersions\"],\n subscriptionVersionId: [\"subscriptionVersion\", \"subscriptionVersions\"],\n subscriptionGroupVersionId: [\"subscriptionGroupVersion\", \"subscriptionGroupVersions\"],\n};\n\nexport class ReviewSubmissionItemsResource {\n constructor(private http: RequestClient) {}\n\n async listForSubmission(\n reviewSubmissionId: string,\n params?: { include?: string; limit?: number }\n ): Promise<ReviewSubmissionItem[]> {\n const listParams: ListParams = {\n include: params?.include,\n limit: params?.limit ?? 200,\n };\n return this.http.all<ReviewSubmissionItem>(\n `/v1/reviewSubmissions/${reviewSubmissionId}/items`,\n listParams\n );\n }\n\n async get(id: string): Promise<ReviewSubmissionItem> {\n const response = await this.http.get<JsonApiResponse<ReviewSubmissionItem>>(\n `/v1/reviewSubmissionItems/${id}`\n );\n return response.data;\n }\n\n /**\n * Add one item to a review submission. Besides versions, asset library\n * images and videos can be submitted on their own (ASC API 4.5.1) so\n * creative assets are approved ahead of a campaign.\n */\n async create(params: {\n reviewSubmissionId: string;\n appStoreVersionId?: string;\n appCustomProductPageVersionId?: string;\n appStoreVersionExperimentId?: string;\n appStoreVersionExperimentV2Id?: string;\n appEventId?: string;\n appAssetLibraryImageId?: string;\n appAssetLibraryVideoId?: string;\n backgroundAssetVersionId?: string;\n inAppPurchaseVersionId?: string;\n subscriptionVersionId?: string;\n subscriptionGroupVersionId?: string;\n }): Promise<ReviewSubmissionItem> {\n const relationships: Record<string, { data: { type: string; id: string } }> = {\n reviewSubmission: {\n data: { type: \"reviewSubmissions\", id: params.reviewSubmissionId },\n },\n };\n for (const [param, [relationship, type]] of Object.entries(ITEM_RELATIONSHIPS)) {\n const id = params[param as keyof typeof params];\n if (id) relationships[relationship] = { data: { type, id } };\n }\n const response = await this.http.post<JsonApiResponse<ReviewSubmissionItem>>(\n \"/v1/reviewSubmissionItems\",\n {\n data: {\n type: \"reviewSubmissionItems\",\n relationships,\n },\n }\n );\n return response.data;\n }\n\n async update(\n id: string,\n attributes: { removed?: boolean }\n ): Promise<ReviewSubmissionItem> {\n const response = await this.http.patch<JsonApiResponse<ReviewSubmissionItem>>(\n `/v1/reviewSubmissionItems/${id}`,\n { data: { type: \"reviewSubmissionItems\", id, attributes } }\n );\n return response.data;\n }\n\n async delete(id: string): Promise<void> {\n await this.http.delete(`/v1/reviewSubmissionItems/${id}`);\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResource, JsonApiResponse, ListParams } from \"../client/types.js\";\n\nexport interface UserAttributes {\n username?: string | null;\n firstName?: string | null;\n lastName?: string | null;\n roles?: string[] | null;\n allAppsVisible?: boolean | null;\n provisioningAllowed?: boolean | null;\n}\n\nexport type User = JsonApiResource<\"users\", UserAttributes>;\n\nexport class UsersResource {\n constructor(private http: RequestClient) {}\n\n async list(params?: {\n filter?: { username?: string; roles?: string | string[] };\n include?: string;\n limit?: number;\n sort?: string;\n }): Promise<User[]> {\n const listParams: ListParams = {\n filter: params?.filter as Record<string, string | string[]>,\n include: params?.include,\n limit: params?.limit ?? 200,\n sort: params?.sort,\n };\n return this.http.all<User>(\"/v1/users\", listParams);\n }\n\n async get(id: string): Promise<User> {\n const response = await this.http.get<JsonApiResponse<User>>(`/v1/users/${id}`);\n return response.data;\n }\n\n async update(\n id: string,\n attributes: Partial<UserAttributes>,\n visibleAppIds?: string[]\n ): Promise<User> {\n const relationships = visibleAppIds\n ? {\n visibleApps: {\n data: visibleAppIds.map((id) => ({ type: \"apps\", id })),\n },\n }\n : undefined;\n const response = await this.http.patch<JsonApiResponse<User>>(\n `/v1/users/${id}`,\n {\n data: {\n type: \"users\",\n id,\n attributes,\n ...(relationships ? { relationships } : {}),\n },\n }\n );\n return response.data;\n }\n\n async delete(id: string): Promise<void> {\n await this.http.delete(`/v1/users/${id}`);\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResource, JsonApiResponse, ListParams } from \"../client/types.js\";\n\nexport interface UserInvitationAttributes {\n email: string;\n firstName?: string | null;\n lastName?: string | null;\n expirationDate?: string | null;\n roles?: string[] | null;\n allAppsVisible?: boolean | null;\n provisioningAllowed?: boolean | null;\n}\n\nexport type UserInvitation = JsonApiResource<\n \"userInvitations\",\n UserInvitationAttributes\n>;\n\nexport class UserInvitationsResource {\n constructor(private http: RequestClient) {}\n\n async list(params?: {\n filter?: { email?: string; roles?: string | string[] };\n include?: string;\n limit?: number;\n sort?: string;\n }): Promise<UserInvitation[]> {\n const listParams: ListParams = {\n filter: params?.filter as Record<string, string | string[]>,\n include: params?.include,\n limit: params?.limit ?? 200,\n sort: params?.sort,\n };\n return this.http.all<UserInvitation>(\"/v1/userInvitations\", listParams);\n }\n\n async get(id: string): Promise<UserInvitation> {\n const response = await this.http.get<JsonApiResponse<UserInvitation>>(\n `/v1/userInvitations/${id}`\n );\n return response.data;\n }\n\n async create(params: {\n attributes: UserInvitationAttributes;\n visibleAppIds?: string[];\n }): Promise<UserInvitation> {\n const relationships = params.visibleAppIds\n ? {\n visibleApps: {\n data: params.visibleAppIds.map((id) => ({ type: \"apps\", id })),\n },\n }\n : undefined;\n const response = await this.http.post<JsonApiResponse<UserInvitation>>(\n \"/v1/userInvitations\",\n {\n data: {\n type: \"userInvitations\",\n attributes: params.attributes,\n ...(relationships ? { relationships } : {}),\n },\n }\n );\n return response.data;\n }\n\n async delete(id: string): Promise<void> {\n await this.http.delete(`/v1/userInvitations/${id}`);\n }\n\n async findByEmail(email: string): Promise<UserInvitation | null> {\n const results = await this.list({ filter: { email }, limit: 1 });\n return results[0] ?? null;\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResource, JsonApiResponse, ListParams } from \"../client/types.js\";\n\nexport interface InAppPurchaseAttributes {\n name?: string | null;\n productId?: string | null;\n inAppPurchaseType?: string | null;\n state?: string | null;\n reviewNote?: string | null;\n familySharable?: boolean | null;\n}\n\nexport type InAppPurchase = JsonApiResource<\n \"inAppPurchases\" | \"inAppPurchasesV2\",\n InAppPurchaseAttributes\n>;\n\nexport class InAppPurchasesResource {\n constructor(private http: RequestClient) {}\n\n async listForApp(appId: string, params?: {\n filter?: { state?: string; inAppPurchaseType?: string };\n include?: string;\n limit?: number;\n sort?: string;\n }): Promise<InAppPurchase[]> {\n const listParams: ListParams = {\n filter: params?.filter as Record<string, string | string[]>,\n include: params?.include,\n limit: params?.limit ?? 200,\n sort: params?.sort,\n };\n return this.http.all<InAppPurchase>(\n `/v2/apps/${appId}/inAppPurchasesV2`,\n listParams\n );\n }\n\n async get(id: string, params?: { include?: string }): Promise<InAppPurchase> {\n const queryParams: Record<string, string | undefined> = {};\n if (params?.include) queryParams[\"include\"] = params.include;\n const response = await this.http.get<JsonApiResponse<InAppPurchase>>(\n `/v2/inAppPurchases/${id}`,\n queryParams\n );\n return response.data;\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResource, JsonApiResponse } from \"../client/types.js\";\n\nexport interface GameCenterDetailAttributes {\n arcadeEnabled?: boolean | null;\n challengeEnabled?: boolean | null;\n}\n\nexport type GameCenterDetail = JsonApiResource<\n \"gameCenterDetails\",\n GameCenterDetailAttributes\n>;\n\nexport class GameCenterDetailResource {\n constructor(private http: RequestClient) {}\n\n async getForApp(appId: string): Promise<GameCenterDetail> {\n const response = await this.http.get<JsonApiResponse<GameCenterDetail>>(\n `/v1/apps/${appId}/gameCenterDetail`\n );\n return response.data;\n }\n\n async get(id: string): Promise<GameCenterDetail> {\n const response = await this.http.get<JsonApiResponse<GameCenterDetail>>(\n `/v1/gameCenterDetails/${id}`\n );\n return response.data;\n }\n\n async update(\n id: string,\n attributes: Partial<GameCenterDetailAttributes>\n ): Promise<GameCenterDetail> {\n const response = await this.http.patch<JsonApiResponse<GameCenterDetail>>(\n `/v1/gameCenterDetails/${id}`,\n { data: { type: \"gameCenterDetails\", id, attributes } }\n );\n return response.data;\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResource, JsonApiResponse } from \"../client/types.js\";\n\n/**\n * TestFlight / Xcode build metrics. Exposes perf & crash stats per build.\n * Wraps `/v1/builds/{id}/perfPowerMetrics` and\n * `/v1/builds/{id}/diagnosticSignatures`.\n */\nexport interface PerfPowerMetricAttributes {\n metricCategory?: string | null;\n platform?: string | null;\n datasets?: unknown[] | null;\n}\n\nexport type PerfPowerMetric = JsonApiResource<\n \"perfPowerMetrics\",\n PerfPowerMetricAttributes\n>;\n\nexport interface DiagnosticSignatureAttributes {\n signature?: string | null;\n weight?: number | null;\n diagnosticType?: string | null;\n}\n\nexport type DiagnosticSignature = JsonApiResource<\n \"diagnosticSignatures\",\n DiagnosticSignatureAttributes\n>;\n\nexport class XcodeMetricsResource {\n constructor(private http: RequestClient) {}\n\n async getPerfPowerMetrics(buildId: string): Promise<PerfPowerMetric[]> {\n const response = await this.http.get<{ data: PerfPowerMetric[] }>(\n `/v1/builds/${buildId}/perfPowerMetrics`\n );\n return response.data;\n }\n\n async getDiagnosticSignatures(buildId: string): Promise<DiagnosticSignature[]> {\n const response = await this.http.get<{ data: DiagnosticSignature[] }>(\n `/v1/builds/${buildId}/diagnosticSignatures`\n );\n return response.data;\n }\n\n async getPerfPowerMetric(id: string): Promise<PerfPowerMetric> {\n const response = await this.http.get<JsonApiResponse<PerfPowerMetric>>(\n `/v1/perfPowerMetrics/${id}`\n );\n return response.data;\n }\n\n async getDiagnosticSignature(id: string): Promise<DiagnosticSignature> {\n const response = await this.http.get<JsonApiResponse<DiagnosticSignature>>(\n `/v1/diagnosticSignatures/${id}`\n );\n return response.data;\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResource, JsonApiResponse, ListParams } from \"../client/types.js\";\nimport type {\n AppAssetLibraryAssetCategory,\n AppAssetLibraryFeature,\n AppAssetLibraryPlacementPlatform,\n AppAssetLibraryPlacementType,\n} from \"../types/enums.js\";\nimport type { AppAssetLibraryImage, AppAssetLibraryVideo } from \"./app-asset-library-assets.js\";\n\n/**\n * The App Asset Library (ASC API 4.5.1) — one per app. Images and videos are\n * uploaded into it once, then placed on any number of App Store surfaces\n * (version, custom product page, in-app event, product page test\n * localizations). Replaces the deprecated screenshot/preview sets.\n */\nexport type AppAssetLibrary = JsonApiResource<\"appAssetLibraries\", Record<string, never>>;\n\nexport interface AppAssetLibraryDimensions {\n minWidth: number;\n maxWidth: number;\n minHeight: number;\n maxHeight: number;\n}\n\nexport interface AppAssetLibraryImageSpec {\n specId: string;\n shortName?: string;\n aspectRatio?: string;\n dimensions: AppAssetLibraryDimensions;\n compatiblePlacementTypes: AppAssetLibraryPlacementType[];\n alphaAllowed?: boolean;\n fileExtensions?: string[];\n mimeTypes?: string[];\n maxFileSize?: number;\n universalAsset?: boolean;\n}\n\nexport interface AppAssetLibraryVideoSpec extends AppAssetLibraryImageSpec {\n audioRequired?: boolean;\n duration?: { min?: string; max?: string };\n frameRates?: Array<{ minFps?: number; maxFps?: number }>;\n}\n\nexport interface AppAssetLibraryRefDatumAttributes {\n features?: Array<{\n featureId: AppAssetLibraryFeature;\n placementPolicies?: Array<{\n placementType: AppAssetLibraryPlacementType;\n groupLimits?: Array<{ groupIds: string[]; maxCount: number }>;\n }>;\n }>;\n placementProfileGroups?: Array<{\n placementProfileGroupId: string;\n platform?: AppAssetLibraryPlacementPlatform;\n displayClassId?: string;\n }>;\n imageSpecs?: AppAssetLibraryImageSpec[];\n videoSpecs?: AppAssetLibraryVideoSpec[];\n placementTypes?: Array<{\n placementTypeId: AppAssetLibraryPlacementType;\n acceptsAssetCategories?: AppAssetLibraryAssetCategory[];\n specMappings?: Array<{ placementGroupId: string; specs: string[] }>;\n }>;\n displayClasses?: Array<{\n displayClassId: string;\n deviceFamily?: string;\n screenDimensions?: string[];\n }>;\n}\n\nexport type AppAssetLibraryRefDatum = JsonApiResource<\n \"appAssetLibraryRefData\",\n AppAssetLibraryRefDatumAttributes\n>;\n\nexport class AppAssetLibrariesResource {\n constructor(private http: RequestClient) {}\n\n async getForApp(appId: string): Promise<AppAssetLibrary> {\n const response = await this.http.get<JsonApiResponse<AppAssetLibrary>>(\n `/v1/apps/${appId}/assetLibrary`\n );\n return response.data;\n }\n\n async listImages(libraryId: string, params: ListParams = {}): Promise<AppAssetLibraryImage[]> {\n return this.http.all<AppAssetLibraryImage>(`/v1/appAssetLibraries/${libraryId}/images`, params);\n }\n\n async listVideos(libraryId: string, params: ListParams = {}): Promise<AppAssetLibraryVideo[]> {\n return this.http.all<AppAssetLibraryVideo>(`/v1/appAssetLibraries/${libraryId}/videos`, params);\n }\n\n /**\n * Specs, placement groups and limits. Apple adds placement groups (new\n * devices) without an API version bump, so read them from here rather than\n * hard-coding display types.\n */\n async refData(params: {\n features?: AppAssetLibraryFeature[];\n placementTypes?: AppAssetLibraryPlacementType[];\n placementProfileGroups?: string[];\n } = {}): Promise<AppAssetLibraryRefDatumAttributes> {\n const filter: Record<string, string[]> = {};\n if (params.features?.length) filter.features = params.features;\n if (params.placementTypes?.length) filter.placementTypes = params.placementTypes;\n if (params.placementProfileGroups?.length) filter.placementProfileGroups = params.placementProfileGroups;\n const data = await this.http.all<AppAssetLibraryRefDatum>(\"/v1/appAssetLibraryRefData\", { filter });\n return mergeRefData(data.map((d) => d.attributes));\n }\n}\n\nfunction mergeRefData(parts: AppAssetLibraryRefDatumAttributes[]): AppAssetLibraryRefDatumAttributes {\n const merged: Required<AppAssetLibraryRefDatumAttributes> = {\n features: [],\n placementProfileGroups: [],\n imageSpecs: [],\n videoSpecs: [],\n placementTypes: [],\n displayClasses: [],\n };\n for (const part of parts) {\n for (const key of Object.keys(merged) as Array<keyof typeof merged>) {\n (merged[key] as unknown[]).push(...((part[key] as unknown[] | undefined) ?? []));\n }\n }\n return merged;\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResource, JsonApiResponse, ListParams } from \"../client/types.js\";\nimport type { AppAssetLibraryAssetCategory, AppAssetLibraryAssetState } from \"../types/enums.js\";\nimport type { UploadOperation } from \"./app-screenshots.js\";\nimport type { AppAssetLibraryPlacement } from \"./app-asset-library-placements.js\";\n\ninterface AssetAttributes {\n category?: AppAssetLibraryAssetCategory;\n fileName?: string;\n fileSize?: number;\n referenceName?: string | null;\n specId?: string | null;\n state?: AppAssetLibraryAssetState;\n stateDetails?: Array<{ code?: string; message?: string }> | null;\n uploadOperations?: UploadOperation[] | null;\n createdDate?: string;\n lastModifiedDate?: string;\n}\n\nexport interface AppAssetLibraryImageAttributes extends AssetAttributes {\n imageAsset?: { templateUrl: string; width: number; height: number } | null;\n}\n\nexport interface AppAssetLibraryVideoAttributes extends AssetAttributes {\n previewFrameTimeCode?: string | null;\n videoAsset?: { url?: string; width?: number; height?: number; duration?: string } | null;\n previewFrameImage?: { templateUrl: string; width: number; height: number } | null;\n}\n\nexport type AppAssetLibraryImage = JsonApiResource<\"appAssetLibraryImages\", AppAssetLibraryImageAttributes>;\nexport type AppAssetLibraryVideo = JsonApiResource<\"appAssetLibraryVideos\", AppAssetLibraryVideoAttributes>;\n\nexport interface CreateAssetParams {\n libraryId: string;\n fileName: string;\n fileSize: number;\n /** Fixed at upload. Headers, search results and event assets need CREATIVE_ASSETS. */\n category: AppAssetLibraryAssetCategory;\n referenceName?: string;\n}\n\nexport interface UpdateAssetAttributes {\n /** Commit after every upload operation has succeeded. No checksum is sent. */\n uploaded?: boolean;\n referenceName?: string;\n /** Only an APPROVED asset can be archived (409 STATE_ERROR.INVALID_ASSET_STATE otherwise). */\n archived?: boolean;\n}\n\n/**\n * Images and videos in an app's asset library share one lifecycle:\n * reserve (POST) → run uploadOperations → PATCH uploaded:true → poll state.\n */\nabstract class AssetLibraryMediaResource<\n T extends \"appAssetLibraryImages\" | \"appAssetLibraryVideos\",\n R extends JsonApiResource<T, AssetAttributes>,\n> {\n protected abstract readonly type: T;\n\n constructor(protected http: RequestClient) {}\n\n async get(id: string): Promise<R> {\n const response = await this.http.get<JsonApiResponse<R>>(`/v1/${this.type}/${id}`);\n return response.data;\n }\n\n protected async reserve(params: CreateAssetParams, extra: Record<string, unknown> = {}): Promise<R> {\n const { libraryId, ...attributes } = params;\n const response = await this.http.post<JsonApiResponse<R>>(`/v1/${this.type}`, {\n data: {\n type: this.type,\n attributes: { ...attributes, ...extra },\n relationships: {\n assetLibrary: { data: { type: \"appAssetLibraries\", id: libraryId } },\n },\n },\n });\n return response.data;\n }\n\n protected async patch(id: string, attributes: Record<string, unknown>): Promise<R> {\n const response = await this.http.patch<JsonApiResponse<R>>(`/v1/${this.type}/${id}`, {\n data: { type: this.type, id, attributes },\n });\n return response.data;\n }\n\n /** Fails with 409 STATE_ERROR.ASSET_HAS_PLACEMENTS while the asset is still placed. */\n async delete(id: string): Promise<void> {\n await this.http.delete(`/v1/${this.type}/${id}`);\n }\n\n async listPlacements(id: string, params: ListParams = {}): Promise<AppAssetLibraryPlacement[]> {\n return this.http.all<AppAssetLibraryPlacement>(`/v1/${this.type}/${id}/placements`, params);\n }\n}\n\nexport class AppAssetLibraryImagesResource extends AssetLibraryMediaResource<\n \"appAssetLibraryImages\",\n AppAssetLibraryImage\n> {\n protected readonly type = \"appAssetLibraryImages\" as const;\n\n async create(params: CreateAssetParams): Promise<AppAssetLibraryImage> {\n return this.reserve(params);\n }\n\n async update(id: string, attributes: UpdateAssetAttributes): Promise<AppAssetLibraryImage> {\n return this.patch(id, { ...attributes });\n }\n}\n\nexport class AppAssetLibraryVideosResource extends AssetLibraryMediaResource<\n \"appAssetLibraryVideos\",\n AppAssetLibraryVideo\n> {\n protected readonly type = \"appAssetLibraryVideos\" as const;\n\n async create(params: CreateAssetParams & { previewFrameTimeCode?: string }): Promise<AppAssetLibraryVideo> {\n const { previewFrameTimeCode, ...rest } = params;\n return this.reserve(rest, previewFrameTimeCode ? { previewFrameTimeCode } : {});\n }\n\n async update(\n id: string,\n attributes: UpdateAssetAttributes & { previewFrameTimeCode?: string }\n ): Promise<AppAssetLibraryVideo> {\n return this.patch(id, { ...attributes });\n }\n}\n","import type { RequestClient } from \"../client/request.js\";\nimport type { JsonApiResource, JsonApiResponse, ListParams } from \"../client/types.js\";\nimport type {\n AppAssetLibraryMediaType,\n AppAssetLibraryPlacementState,\n AppAssetLibraryPlacementType,\n} from \"../types/enums.js\";\n\nexport interface AppAssetLibraryPlacementAttributes {\n mediaType?: AppAssetLibraryMediaType;\n placementType?: AppAssetLibraryPlacementType;\n placementGroup?: string;\n state?: AppAssetLibraryPlacementState;\n stateDetails?: Array<{ code?: string; message?: string }> | null;\n createdDate?: string;\n lastModifiedDate?: string;\n}\n\nexport type AppAssetLibraryPlacement = JsonApiResource<\n \"appAssetLibraryPlacements\",\n AppAssetLibraryPlacementAttributes\n>;\n\n/** The localization a placement puts an asset on. */\nexport type PlacementTargetKind =\n | \"appStoreVersionLocalization\"\n | \"appCustomProductPageLocalization\"\n | \"appEventLocalization\"\n | \"appStoreVersionExperimentTreatmentLocalization\";\n\nexport interface PlacementTarget {\n kind: PlacementTargetKind;\n id: string;\n}\n\nconst TARGET_TYPES: Record<PlacementTargetKind, string> = {\n appStoreVersionLocalization: \"appStoreVersionLocalizations\",\n appCustomProductPageLocalization: \"appCustomProductPageLocalizations\",\n appEventLocalization: \"appEventLocalizations\",\n appStoreVersionExperimentTreatmentLocalization: \"appStoreVersionExperimentTreatmentLocalizations\",\n};\n\nfunction targetRelationship(target: PlacementTarget) {\n return { [target.kind]: { data: { type: TARGET_TYPES[target.kind], id: target.id } } };\n}\n\nexport class AppAssetLibraryPlacementsResource {\n constructor(private http: RequestClient) {}\n\n /**\n * Place an image or video on one localization. Placements cannot be edited —\n * delete and recreate. The parent version/page must be editable.\n */\n async create(params: {\n placementType: AppAssetLibraryPlacementType;\n placementGroup: string;\n imageId?: string;\n videoId?: string;\n target: PlacementTarget;\n }): Promise<AppAssetLibraryPlacement> {\n if (!params.imageId === !params.videoId) {\n throw new Error(\"A placement needs exactly one of imageId or videoId\");\n }\n const media = params.imageId\n ? { image: { data: { type: \"appAssetLibraryImages\", id: params.imageId } } }\n : { video: { data: { type: \"appAssetLibraryVideos\", id: params.videoId! } } };\n const response = await this.http.post<JsonApiResponse<AppAssetLibraryPlacement>>(\n \"/v1/appAssetLibraryPlacements\",\n {\n data: {\n type: \"appAssetLibraryPlacements\",\n attributes: { placementType: params.placementType, placementGroup: params.placementGroup },\n relationships: { ...media, ...targetRelationship(params.target) },\n },\n }\n );\n return response.data;\n }\n\n async get(id: string, params: { include?: string } = {}): Promise<AppAssetLibraryPlacement> {\n const response = await this.http.get<JsonApiResponse<AppAssetLibraryPlacement>>(\n `/v1/appAssetLibraryPlacements/${id}`,\n params.include ? { include: params.include } : undefined\n );\n return response.data;\n }\n\n async delete(id: string): Promise<void> {\n await this.http.delete(`/v1/appAssetLibraryPlacements/${id}`);\n }\n\n /** Placements on one localization, in display order by default. */\n async listForTarget(\n target: PlacementTarget,\n params: {\n placementType?: AppAssetLibraryPlacementType;\n placementGroup?: string;\n include?: string;\n } = {}\n ): Promise<AppAssetLibraryPlacement[]> {\n const filter: Record<string, string> = {};\n if (params.placementType) filter.placementType = params.placementType;\n if (params.placementGroup) filter.placementGroup = params.placementGroup;\n const listParams: ListParams = { filter, include: params.include, sort: \"placementGroupPosition\" };\n return this.http.all<AppAssetLibraryPlacement>(\n `/v1/${TARGET_TYPES[target.kind]}/${target.id}/placements`,\n listParams\n );\n }\n\n /** Set the display order of a placement group. In-app event localizations cannot be ordered. */\n async order(params: {\n placementGroup: string;\n placementIds: string[];\n target: PlacementTarget;\n }): Promise<void> {\n if (params.target.kind === \"appEventLocalization\") {\n throw new Error(\"In-app event placements cannot be ordered\");\n }\n await this.http.post(\"/v1/appAssetLibraryPlacementOrderingRequests\", {\n data: {\n type: \"appAssetLibraryPlacementOrderingRequests\",\n attributes: { placementGroup: params.placementGroup },\n relationships: {\n orderedPlacements: {\n data: params.placementIds.map((id) => ({ type: \"appAssetLibraryPlacements\", id })),\n },\n ...targetRelationship(params.target),\n },\n },\n });\n }\n}\n","/**\n * Keeps an Apple ID session between runs, like Spaceship's cookie in\n * ~/.fastlane/spaceship/<user>/cookie — one password + 2FA covers every\n * command (and every app on that Apple ID) until Apple expires the session.\n *\n * Files live in ~/.fastnode/sessions (or FASTNODE_SESSION_DIR), one per\n * Apple ID, directory 0700 and files 0600: they are as good as a signed-in\n * App Store Connect browser. A cached session is checked against olympus\n * before use, so an expired one just falls through to a fresh sign-in.\n */\n\nimport { createHash } from \"node:crypto\";\nimport { chmodSync, existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { AppleSession } from \"./apple-session.js\";\nimport { loginWithAppleId } from \"./apple-session.js\";\n\nconst OLYMPUS_SESSION = \"https://appstoreconnect.apple.com/olympus/v1/session\";\n\ninterface StoredSession {\n email: string;\n savedAt: string;\n session: AppleSession;\n}\n\nexport function sessionDir(): string {\n return process.env.FASTNODE_SESSION_DIR || join(homedir(), \".fastnode\", \"sessions\");\n}\n\nfunction fileFor(email: string): string {\n const key = createHash(\"sha256\").update(email.trim().toLowerCase()).digest(\"hex\").slice(0, 16);\n return join(sessionDir(), `${key}.json`);\n}\n\nfunction ensureDir(): void {\n const dir = sessionDir();\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true, mode: 0o700 });\n chmodSync(dir, 0o700);\n}\n\nexport function saveAppleSession(session: AppleSession): void {\n ensureDir();\n const stored: StoredSession = { email: session.userEmail, savedAt: new Date().toISOString(), session };\n const path = fileFor(session.userEmail);\n writeFileSync(path, JSON.stringify(stored), { mode: 0o600 });\n chmodSync(path, 0o600);\n writeFileSync(join(sessionDir(), \"last-apple-id\"), session.userEmail, { mode: 0o600 });\n}\n\nexport function clearAppleSession(email: string): void {\n const path = fileFor(email);\n if (existsSync(path)) unlinkSync(path);\n}\n\n/** The Apple ID the last session was saved for, so a re-run needs no prompt at all. */\nexport function lastAppleId(): string | null {\n try {\n return readFileSync(join(sessionDir(), \"last-apple-id\"), \"utf8\").trim() || null;\n } catch {\n return null;\n }\n}\n\n/** A saved session for this Apple ID that Apple still accepts, or null. */\nexport async function loadAppleSession(\n email: string,\n fetchImpl: typeof fetch = fetch\n): Promise<AppleSession | null> {\n const path = fileFor(email);\n if (!existsSync(path)) return null;\n let stored: StoredSession;\n try {\n stored = JSON.parse(readFileSync(path, \"utf8\")) as StoredSession;\n } catch {\n return null;\n }\n const cookie = Object.entries(stored.session.cookies).map(([k, v]) => `${k}=${v}`).join(\"; \");\n try {\n const res = await fetchImpl(OLYMPUS_SESSION, { headers: { Cookie: cookie, Accept: \"application/json\" } });\n if (!res.ok) {\n clearAppleSession(email);\n return null;\n }\n } catch {\n // Offline or Apple unreachable: let the caller sign in (which will say why).\n return null;\n }\n return stored.session;\n}\n\n/**\n * Reuse the saved session for this Apple ID, or sign in (password + 2FA) and\n * save the new one. The password is only asked for when a sign-in is needed.\n */\nexport async function signInWithAppleId(options: {\n email?: string | null;\n askEmail: () => Promise<string>;\n askPassword: (email: string) => Promise<string>;\n /** Ignore any saved session and sign in again. */\n fresh?: boolean;\n onLog?: (msg: string) => void;\n}): Promise<AppleSession> {\n const email = options.email || lastAppleId() || (await options.askEmail());\n if (!options.fresh) {\n const saved = await loadAppleSession(email);\n if (saved) {\n options.onLog?.(`Using saved Apple ID session for ${email}`);\n return saved;\n }\n }\n const password = await options.askPassword(email);\n const session = await loginWithAppleId({ email, password, onLog: options.onLog });\n saveAppleSession(session);\n return session;\n}\n","/**\n * Apple Developer Portal Client\n * 1:1 port of Fastlane Spaceship PortalClient\n *\n * Uses session cookies (from loginWithAppleId) to talk to\n * developer.apple.com/services-account/QH65B2/\n *\n * This is the web portal API — separate from the ASC REST API (JWT).\n * Fastlane uses this for: certs, profiles, devices, bundle IDs, app groups, etc.\n */\n\nimport type { AppleSession } from \"./apple-session.js\";\nimport { checkPortalResponse } from \"./apple-session.js\";\n\nconst PORTAL_BASE = \"https://developer.apple.com/services-account/QH65B2\";\n\n/**\n * Pick a key name that doesn't collide with any existing key in the\n * team. Apple rejects duplicate names with \"Another key with same name\n * exists\" (resultCode 35). On collision we append \" - 1\", \" - 2\", …\n * until we find a free slot.\n *\n * Note: Apple's auth key name validator is stricter than the profile\n * name validator — it rejects parentheses (resultCode 29106 \"Invalid\n * Auth Key name\") so the suffix is \" - N\" not \" (N)\".\n */\nfunction pickUniqueKeyName(base: string, taken: Set<string>): string {\n if (!taken.has(base)) return base;\n let n = 1;\n while (taken.has(`${base} - ${n}`)) n++;\n return `${base} - ${n}`;\n}\n\nexport class PortalClient {\n private session: AppleSession;\n private teamId: string;\n private csrf = \"\";\n private csrfTs = \"\";\n private cookieStr: string;\n\n constructor(session: AppleSession, teamId: string) {\n this.session = session;\n this.teamId = teamId;\n this.cookieStr = Object.entries(session.cookies).map(([k, v]) => `${k}=${v}`).join(\"; \");\n }\n\n /** Initialize CSRF tokens — must be called before mutations */\n async init(): Promise<void> {\n await this.post(\"account/listTeams.action\", {});\n }\n\n /**\n * JSON POST — different content type than the standard form-encoded\n * `post()`. Used by the App Store Connect API key endpoints\n * (`account/auth/key/v2/create`), which Spaceship discovered take a\n * JSON body even though every other portal mutation is form-encoded.\n *\n * Like the form-encoded `post()`, this also runs the response through\n * `checkPortalResponse` — Apple returns HTTP 200 even for errors and\n * encodes the error in `resultCode`/`userString` fields, so a raw\n * status check would silently miss real failures.\n */\n private async postJson(path: string, body: unknown): Promise<{ status: number; body: any; rawText: string }> {\n const headers: Record<string, string> = {\n Cookie: this.cookieStr,\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n };\n if (this.csrf) { headers[\"csrf\"] = this.csrf; headers[\"csrf_ts\"] = this.csrfTs; }\n\n console.log(`[portal] POST(json) ${path}`);\n const res = await fetch(`${PORTAL_BASE}/${path}`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n });\n\n if (res.headers.get(\"csrf\")) { this.csrf = res.headers.get(\"csrf\")!; this.csrfTs = res.headers.get(\"csrf_ts\") ?? \"\"; }\n for (const raw of res.headers.getSetCookie?.() ?? []) {\n const m = raw.match(/^([^=]+)=([^;]*)/);\n if (m && !this.cookieStr.includes(m[1] + \"=\")) this.cookieStr += \"; \" + m[1] + \"=\" + m[2];\n }\n\n const text = await res.text();\n let data: any = null;\n try { data = text ? JSON.parse(text) : null; } catch {}\n console.log(`[portal] POST(json) ${path} → ${res.status} ${text.slice(0, 400)}`);\n // Apple's portal returns HTTP 200 with resultCode != 0 for failures;\n // checkPortalResponse throws on those.\n checkPortalResponse(data, this.session);\n return { status: res.status, body: data, rawText: text };\n }\n\n /**\n * GET helper for the portal endpoints that take query parameters\n * (currently just `account/auth/key/download`). Returns the raw text\n * since download endpoints can return PEMs or JSON depending on Apple's\n * mood — caller decides how to parse.\n */\n private async getRaw(path: string, params: Record<string, string> = {}): Promise<{ status: number; rawText: string; contentType: string }> {\n const url = new URL(`${PORTAL_BASE}/${path}`);\n for (const [k, v] of Object.entries(params)) url.searchParams.set(k, v);\n const headers: Record<string, string> = {\n Cookie: this.cookieStr,\n Accept: \"application/json, text/plain, application/x-pem-file, */*\",\n };\n if (this.csrf) { headers[\"csrf\"] = this.csrf; headers[\"csrf_ts\"] = this.csrfTs; }\n\n console.log(`[portal] GET ${url.pathname}${url.search}`);\n const res = await fetch(url.toString(), { headers });\n for (const raw of res.headers.getSetCookie?.() ?? []) {\n const m = raw.match(/^([^=]+)=([^;]*)/);\n if (m && !this.cookieStr.includes(m[1] + \"=\")) this.cookieStr += \"; \" + m[1] + \"=\" + m[2];\n }\n const text = await res.text();\n const contentType = res.headers.get(\"content-type\") ?? \"\";\n console.log(`[portal] GET ${url.pathname} → ${res.status} ${contentType} ${text.length}b`);\n return { status: res.status, rawText: text, contentType };\n }\n\n // ── App Store Connect API Keys (.p8) ────────────────────────────────────\n\n /**\n * Create an App Store Connect API key via the developer portal's\n * `account/auth/key/v2/create` endpoint. Reverse-engineered from the\n * _current_ @expo/apple-utils npm package (v2.1.21), which is what\n * EAS CLI uses to manage Apple credentials in production.\n *\n * This differs from older published reverse-engineering guides:\n * • URL uses the `/v2/create` suffix (Apple kept it)\n * • Field is `serviceConfigurations`, shape is an object keyed by\n * service id (NOT `serviceConfigurationsRequests: [...]` array)\n * • Body REQUIRES `scope: \"team\"`\n * • Needs a scope-specific CSRF warmup via the `keys` endpoint\n * before the create call (EAS's `ensureCSRFAsync(\"keys\", …)`)\n *\n * For an App Store Connect API key (PUBLIC_API, used by altool for\n * TestFlight uploads), `serviceConfigurations` is an empty object `{}`.\n * For an APNs auth key, it's `{ \"U27F4V844T\": [] }`. For MusicKit:\n * `{ \"6A7HVUVQ3M\": [musicId] }`, etc.\n *\n * Apple's name validator rejects parentheses, brackets, and most\n * punctuation — sanitize to alphanumeric + space + dash + underscore\n * + period and collapse whitespace.\n */\n async createApiKey(\n rawName: string,\n serviceConfigurations: Record<string, unknown[]> = {}\n ): Promise<{ keyId: string; raw: any }> {\n // Sanitize: drop forbidden chars, leave headroom for a \"(N)\" suffix\n // since Apple caps key names at 50 chars and we may need to dedupe.\n const baseName = rawName\n .replace(/[^A-Za-z0-9 _\\-.]/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 45);\n if (!baseName) throw new Error(\"createApiKey: name is empty after sanitization\");\n\n // EAS-style CSRF warmup AND name-collision discovery in one trip:\n // listApiKeys refreshes the scoped CSRF for the \"keys\" area\n // (per-section tokens, the listTeams CSRF isn't valid here) and\n // hands us back the existing key names so we can dodge Apple's\n // duplicate-name rejection (\"Another key with same name exists\").\n let existingNames = new Set<string>();\n try {\n const list = await this.listApiKeys();\n existingNames = new Set(\n (list.keys ?? []).map((k: any) => String(k.keyName ?? \"\").trim())\n );\n } catch {\n // Non-fatal — the create call will surface CSRF / collision\n // errors if the warmup mattered and failed.\n }\n\n const name = pickUniqueKeyName(baseName, existingNames);\n\n // EAS's portalRequestAsync auto-injects teamId into every body.\n // Apple rejects the create call without it with resultCode 35.\n const body = {\n teamId: this.teamId,\n name,\n serviceConfigurations,\n scope: \"team\",\n };\n const result = await this.postJson(\"account/auth/key/v2/create\", body);\n // checkPortalResponse inside postJson already throws on resultCode != 0,\n // so any error like \"Invalid Auth Key name\" surfaces as an exception\n // before reaching this point.\n const created = result.body?.keys?.[0] ?? result.body?.key ?? result.body?.data ?? result.body;\n const keyId =\n created?.keyId ??\n created?.id ??\n created?.kid ??\n created?.attributes?.kid;\n if (!keyId) {\n throw new Error(`createApiKey: no key id in response. Body: ${result.rawText.slice(0, 400)}`);\n }\n return { keyId, raw: created };\n }\n\n /**\n * Fetch a single API key by id via `account/auth/key/get`. Reverse-\n * engineered from Spaceship's `get_key`. Returns the raw key record so\n * the caller can extract whatever fields it needs (e.g. issuerId).\n *\n * Form-encoded POST — same shape as every other PortalClient mutation\n * except the JSON `create` endpoint.\n */\n async getApiKey(keyId: string): Promise<any> {\n const data = await this.post(\"account/auth/key/get\", {\n teamId: this.teamId,\n keyId,\n });\n return data?.keys?.[0] ?? data?.key ?? data?.data ?? data;\n }\n\n /**\n * Revoke an existing key. Form-encoded POST per Spaceship's\n * `revoke_key!`. Used for cleaning up orphan keys created during\n * failed wizard runs.\n */\n async revokeApiKey(keyId: string): Promise<void> {\n await this.post(\"account/auth/key/revoke\", {\n teamId: this.teamId,\n keyId,\n });\n }\n\n // ── APNs Authentication Keys (.p8) ──────────────────────────────────────\n\n /** Apple's hardcoded service id for APNs auth keys (from Spaceship). */\n static readonly APNS_SERVICE_ID = \"U27F4V844T\";\n\n /**\n * Create an APNs Authentication Key (.p8) via the developer portal.\n *\n * Apple requires BOTH `serviceConfigurations` (the map) AND\n * `serviceConfigurationsRequests` (the array of full config objects)\n * in the v2/create body. Just sending the map alone results in\n * \"No value was provided for the parameter 'serviceConfigurations'\".\n *\n * The exact body comes from @expo/apple-utils v2.1.21 — both fields\n * are produced by separate functions (`d` for the map, `h` for the\n * array) and merged into the create payload.\n *\n * Apple also rejects duplicate key names (\"Another key with same\n * name exists\") — we dedupe by listing existing keys first and\n * appending \" (N)\" until we find a free slot, mirroring the\n * provisioning profile dedup.\n */\n async createApnsAuthKey(rawName: string): Promise<{ keyId: string; pem: string; raw: any }> {\n const baseName = rawName\n .replace(/[^A-Za-z0-9 _\\-.]/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 45); // headroom for a \" (N)\" suffix\n if (!baseName) throw new Error(\"createApnsAuthKey: name is empty after sanitization\");\n\n // CSRF warmup + name-collision discovery in one trip\n let existingNames = new Set<string>();\n try {\n const list = await this.listApiKeys();\n existingNames = new Set(\n (list.keys ?? []).map((k: any) => String(k.keyName ?? \"\").trim())\n );\n } catch { /* ignore */ }\n\n const name = pickUniqueKeyName(baseName, existingNames);\n\n const body = {\n teamId: this.teamId,\n name,\n serviceConfigurations: {\n [PortalClient.APNS_SERVICE_ID]: [],\n },\n serviceConfigurationsRequests: [\n {\n isNew: true,\n serviceId: PortalClient.APNS_SERVICE_ID,\n identifiers: {},\n environment: \"all\",\n scope: \"team\",\n },\n ],\n scope: \"team\",\n };\n const result = await this.postJson(\"account/auth/key/v2/create\", body);\n const created = result.body?.keys?.[0];\n if (!created?.keyId) {\n throw new Error(`createApnsAuthKey: no key id in response. Body: ${result.rawText.slice(0, 400)}`);\n }\n // Download the .p8 — Apple only allows this once\n const pem = await this.downloadApiKey(created.keyId);\n return { keyId: created.keyId, pem, raw: created };\n }\n\n /**\n * Find existing APNs auth keys in the team. Used by the wizard to\n * detect \"you already have one\" cases and offer to reuse rather than\n * proliferate keys.\n */\n async listApnsAuthKeys(): Promise<{ keyId: string; keyName: string; canDownload: boolean }[]> {\n const list = await this.listApiKeys();\n return (list.keys ?? [])\n .filter((k: any) =>\n (k.services ?? []).some((s: any) => s.id === PortalClient.APNS_SERVICE_ID || /apns/i.test(s.name ?? \"\"))\n )\n .map((k: any) => ({\n keyId: k.keyId,\n keyName: k.keyName,\n canDownload: Boolean(k.canDownload),\n }));\n }\n\n /**\n * Download an existing App Store Connect API key as PEM. Spaceship's\n * `download_key` endpoint — GET with teamId + keyId in query string.\n * Returns the raw .p8 PEM text. Apple shows the .p8 exactly once\n * (after creation), so call this immediately after createApiKey.\n */\n async downloadApiKey(keyId: string): Promise<string> {\n const { status, rawText, contentType } = await this.getRaw(\"account/auth/key/download\", {\n teamId: this.teamId,\n keyId,\n });\n if (status !== 200) {\n throw new Error(`downloadApiKey failed (${status}): ${rawText.slice(0, 200)}`);\n }\n // Plain PEM text response\n if (rawText.includes(\"BEGIN PRIVATE KEY\")) return rawText;\n // JSON wrapper variants\n if (contentType.includes(\"json\")) {\n try {\n const parsed = JSON.parse(rawText);\n const candidates = [\n parsed?.privateKey,\n parsed?.key?.privateKey,\n parsed?.keys?.[0]?.privateKey,\n parsed?.data?.attributes?.privateKey,\n parsed?.value,\n ];\n for (const c of candidates) {\n if (typeof c === \"string\" && c.includes(\"BEGIN PRIVATE KEY\")) return c;\n }\n } catch { /* fall through */ }\n }\n throw new Error(`downloadApiKey returned no PEM. Content-Type=${contentType} body=${rawText.slice(0, 300)}`);\n }\n\n /**\n * List existing API keys via the portal. Used to discover the team's\n * issuer id — every key in the team shares the same issuer id, and\n * altool needs it alongside the key id and .p8 file.\n *\n * Form-encoded POST (NOT JSON), with pagination params, per Spaceship's\n * `list_keys` method. JSON returned 415 from this endpoint.\n */\n async listApiKeys(): Promise<{ keys: any[]; issuerId?: string }> {\n const data = await this.post(\"account/auth/key/list\", {\n teamId: this.teamId,\n pageNumber: \"1\",\n pageSize: \"500\",\n sort: \"name=asc\",\n });\n const keys = data?.keys ?? [];\n // Issuer id may live on the response root, in a metadata bag, or on\n // each key — try all known paths.\n const issuerId =\n data?.issuerId ??\n data?.issuer ??\n data?.team?.issuerId ??\n keys[0]?.issuerId ??\n keys[0]?.issuer;\n return { keys, issuerId };\n }\n\n private async post(path: string, params: Record<string, string | string[]>): Promise<any> {\n // Build form body using URLSearchParams (proper encoding)\n const body = new URLSearchParams();\n for (const [k, v] of Object.entries(params)) {\n if (Array.isArray(v)) { for (const item of v) body.append(k, item); }\n else body.set(k, v);\n }\n const bodyStr = body.toString();\n\n const headers: Record<string, string> = {\n Cookie: this.cookieStr,\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n Accept: \"application/json\",\n };\n if (this.csrf) { headers[\"csrf\"] = this.csrf; headers[\"csrf_ts\"] = this.csrfTs; }\n\n if (process.env.FASTNODE_DEBUG) console.log(`[portal] POST ${path} body=${bodyStr.slice(0, 200)}`);\n const res = await fetch(`${PORTAL_BASE}/${path}`, { method: \"POST\", headers, body: bodyStr });\n\n // Update CSRF\n if (res.headers.get(\"csrf\")) { this.csrf = res.headers.get(\"csrf\")!; this.csrfTs = res.headers.get(\"csrf_ts\") ?? \"\"; }\n for (const raw of res.headers.getSetCookie?.() ?? []) {\n const m = raw.match(/^([^=]+)=([^;]*)/);\n if (m && !this.cookieStr.includes(m[1] + \"=\")) this.cookieStr += \"; \" + m[1] + \"=\" + m[2];\n }\n\n const text = await res.text();\n let data: any;\n try { data = JSON.parse(text); } catch { throw new Error(`Portal returned non-JSON: ${text.slice(0, 200)}`); }\n checkPortalResponse(data, this.session);\n return data;\n }\n\n // ── Teams ──────────────────────────────────────────────────────────────\n\n async listTeams(): Promise<any[]> {\n // Pass pagination params (matching the other list* methods) — without them\n // Apple's listTeams.action returns only a small default page, hiding teams\n // for users who belong to many.\n const data = await this.post(\"account/listTeams.action\", {\n pageSize: \"500\", pageNumber: \"1\",\n });\n return data.teams ?? [];\n }\n\n // ── App IDs / Bundle IDs ───────────────────────────────────────────────\n\n async listAppIds(): Promise<any[]> {\n const data = await this.post(\"account/ios/identifiers/listAppIds.action\", {\n teamId: this.teamId, pageSize: \"500\", pageNumber: \"1\", sort: \"name=asc\",\n });\n return data.appIds ?? [];\n }\n\n async createAppId(params: { identifier: string; name: string; enablePush?: boolean; enableIAP?: boolean }): Promise<any> {\n // Apple's App ID name validator allows only alphanumerics + spaces\n // (\"Please choose a name containing only alphanumeric characters and\n // spaces\") — sanitize so a caller can safely pass a bundle id as the\n // display name. The `identifier` is unaffected.\n const safeName =\n params.name.replace(/[^0-9A-Za-z\\s]/g, \" \").replace(/\\s+/g, \" \").trim() || \"App\";\n const reqParams: Record<string, string> = {\n teamId: this.teamId, type: \"explicit\", identifier: params.identifier, name: safeName,\n };\n if (params.enablePush) reqParams.push = \"on\";\n if (params.enableIAP !== false) reqParams.inAppPurchase = \"on\";\n const data = await this.post(\"account/ios/identifiers/addAppId.action\", reqParams);\n return data.appId;\n }\n\n async deleteAppId(appIdId: string): Promise<void> {\n await this.post(\"account/ios/identifiers/deleteAppId.action\", { teamId: this.teamId, appIdId });\n }\n\n /**\n * Toggle a capability (a.k.a. \"service\") on a bundle ID. Mirrors\n * Spaceship::Portal's `update_service` — the legacy portal endpoint\n * still works and is the only session-cookie-authenticated way to flip\n * capabilities like Push Notifications and Sign in with Apple from\n * outside the Apple Developer web UI.\n *\n * Common service codes (from Spaceship portal/portal_client.rb):\n * push → push notifications\n * APG3427HIY → Sign in with Apple\n * IAD53UNK2F → in-app purchase\n * homeKit → HomeKit\n * healthKit → HealthKit\n *\n * @param featureType Apple's internal capability key (string code or short name)\n * @param enabled true → turn on, false → turn off\n */\n async setBundleCapability(params: {\n appIdId: string;\n featureType: string;\n enabled: boolean;\n }): Promise<void> {\n await this.post(\"account/ios/identifiers/updateAppService.action\", {\n teamId: this.teamId,\n displayId: params.appIdId,\n featureType: params.featureType,\n featureValue: params.enabled ? \"on\" : \"off\",\n });\n }\n\n // ── Application Groups ──────────────────────────────────────────────────\n //\n // App Groups (e.g. `group.com.playspina.com`) are the only clean way to\n // share data — an auth token, in our case — between a host app and an\n // embedded extension (Messages / Notification Service / etc.). App Store\n // Connect API keys (.p8) genuinely cannot manage them; Apple only exposes\n // group create/associate through this legacy session-cookie portal API,\n // which is why they live on PortalClient (Apple ID session) and not on the\n // ASC REST client. Endpoint shapes ported 1:1 from Spaceship's\n // portal_client.rb (listApplicationGroups / addApplicationGroup /\n // assignApplicationGroupToAppId).\n\n /** Apple's internal feature code for the App Groups capability. */\n static readonly APP_GROUPS_FEATURE = \"APG3427HIY\";\n\n /** List all app groups in the team. */\n async listAppGroups(): Promise<any[]> {\n const data = await this.post(\"account/ios/identifiers/listApplicationGroups.action\", {\n teamId: this.teamId, pageNumber: \"1\", pageSize: \"500\", sort: \"name=asc\",\n });\n return data.applicationGroupList ?? [];\n }\n\n /**\n * Create an app group, returning the raw group record. Idempotent —\n * Apple rejects a duplicate group identifier (\"Multiple App Groups may\n * not have the same identifier\"), so we list first and reuse an existing\n * group when the identifier already exists in the team.\n *\n * Note the two ids on the returned record: `identifier` is the\n * `group.com.…` string you type, while `applicationGroup` is Apple's\n * opaque internal handle that association actually requires — do NOT pass\n * the human identifier to assignAppGroups.\n */\n async createAppGroup(params: { identifier: string; name: string }): Promise<any> {\n const existing = await this.listAppGroups();\n const hit = existing.find((g: any) => g.identifier === params.identifier);\n if (hit) return hit;\n // Apple's App Group *name* validator rejects punctuation — periods,\n // in particular (\"An invalid value … for the parameter 'name'\"). Mirror\n // Spaceship's valid_name_for: keep alphanumerics + spaces, collapse the\n // rest. The `identifier` (group.com.…) is unaffected.\n const safeName =\n params.name.replace(/[^0-9A-Za-z\\s]/g, \" \").replace(/\\s+/g, \" \").trim() || \"App Group\";\n const data = await this.post(\"account/ios/identifiers/addApplicationGroup.action\", {\n teamId: this.teamId, identifier: params.identifier, name: safeName,\n });\n return data.applicationGroup;\n }\n\n /**\n * Enable the App Groups capability on an App ID. Required before an\n * App ID can have a group associated with it — mirrors Spaceship\n * enabling `AppService::AppGroup` before `associate_groups`.\n */\n async enableAppGroups(appIdId: string): Promise<void> {\n // App Groups enables via the legacy `updateService.action` endpoint with\n // a boolean-string featureValue — NOT `updateAppService.action` (which\n // reports \"Service mapping to the requested URL is not available\" for\n // this feature). Mirrors Spaceship's AppService::AppGroup service_uri +\n // value. Must succeed before assignAppGroups, or Apple rejects the\n // association (\"Application Group feature should be enabled before …\").\n await this.post(\"account/ios/identifiers/updateService.action\", {\n teamId: this.teamId,\n displayId: appIdId,\n featureType: PortalClient.APP_GROUPS_FEATURE,\n featureValue: \"true\",\n });\n }\n\n /**\n * Associate one or more app groups with an App ID. `appGroupIds` are the\n * internal ids (Spaceship's `app_group_id`), NOT the `group.com.…`\n * identifiers. Apple wants both `appIdId` and `displayId` set to the\n * App ID's internal id, per Spaceship's associate_groups_with_app.\n */\n async assignAppGroups(params: { appIdId: string; appGroupIds: string[] }): Promise<void> {\n await this.post(\"account/ios/identifiers/assignApplicationGroupToAppId.action\", {\n teamId: this.teamId,\n appIdId: params.appIdId,\n displayId: params.appIdId,\n applicationGroups: params.appGroupIds,\n });\n }\n\n // ── Apple Pay merchants (OMCs) ─────────────────────────────────────────\n //\n // Merchant IDs are team-level identifiers (merchant.com.…) that an App ID's\n // Apple Pay capability must be LINKED to — enabling the capability alone\n // produces profiles that fail with \"doesn't support the … Merchant ID\".\n // Like App Groups, merchants are only manageable through the legacy\n // session-cookie portal API. Endpoint shapes ported 1:1 from Spaceship's\n // portal_client.rb (merchants / create_merchant! /\n // associate_merchants_with_app).\n\n /** Apple's internal feature code for the Apple Pay capability. */\n static readonly APPLE_PAY_FEATURE = \"OM633U5T5G\";\n\n /**\n * List all Apple Pay merchant IDs in the team. Each record maps\n * (per Spaceship's merchant.rb attr_mapping): `omcId` = internal id,\n * `identifier` = the human `merchant.com.…` string, `name` = display name.\n */\n async listMerchants(): Promise<any[]> {\n const data = await this.post(\"account/ios/identifiers/listOMCs.action\", {\n teamId: this.teamId, pageNumber: \"1\", pageSize: \"500\", sort: \"name=asc\",\n });\n return data.identifierList ?? [];\n }\n\n /**\n * Register (or reuse) a merchant ID, returning its INTERNAL id (`omcId`) —\n * Apple's opaque handle that association requires, NOT the human\n * `merchant.com.…` identifier. Idempotent: lists first and reuses an\n * existing merchant with the same identifier. Endpoint + params ported 1:1\n * from Spaceship's create_merchant! (addOMC.action).\n */\n async createMerchant(params: { identifier: string; name: string }): Promise<string> {\n const existing = await this.listMerchants();\n const hit = existing.find((m: any) => m.identifier === params.identifier);\n if (hit?.omcId) return String(hit.omcId);\n // Same name validator as App Groups: alphanumerics + spaces only.\n const safeName =\n params.name.replace(/[^0-9A-Za-z\\s]/g, \" \").replace(/\\s+/g, \" \").trim() || \"Merchant\";\n const data = await this.post(\"account/ios/identifiers/addOMC.action\", {\n name: safeName, identifier: params.identifier, teamId: this.teamId,\n });\n // Spaceship's create_merchant! reads parse_response(r, 'omcId'); the\n // created record may be nested under `omcId` or returned flat.\n const rec = data.omcId ?? data;\n const id = typeof rec === \"string\" ? rec : (rec?.omcId ?? rec?.merchantId);\n if (!id) {\n throw new Error(\"Apple returned no internal merchant id (omcId) for the registered merchant.\");\n }\n return String(id);\n }\n\n /**\n * Enable the Apple Pay capability on an App ID. Apple Pay is a standard\n * AppService (service_id OM633U5T5G) whose service_uri is the default\n * `updateService.action` — confirmed in Spaceship's app_service.rb.\n */\n async enableApplePay(appIdId: string): Promise<void> {\n await this.post(\"account/ios/identifiers/updateService.action\", {\n teamId: this.teamId,\n displayId: appIdId,\n featureType: PortalClient.APPLE_PAY_FEATURE,\n featureValue: \"true\",\n });\n }\n\n /**\n * Associate merchant IDs with an App ID's Apple Pay capability. `omcIds`\n * are the internal ids (each merchant record's `omcId`), NOT the\n * `merchant.com.…` identifiers. Endpoint + params ported 1:1 from\n * Spaceship's associate_merchants_with_app (assignOMCToAppId.action — note\n * the singular \"OMC\", and NO displayId param).\n */\n async assignMerchants(params: { appIdId: string; omcIds: string[] }): Promise<void> {\n await this.post(\"account/ios/identifiers/assignOMCToAppId.action\", {\n teamId: this.teamId,\n appIdId: params.appIdId,\n omcIds: params.omcIds,\n });\n }\n\n /**\n * Create an Apple Pay **Payment Processing Certificate** on a merchant ID\n * from a CSR — the certificate a PSP (e.g. Stripe) hands you as a CSR, which\n * must be uploaded to the Merchant ID in Apple Developer, then the resulting\n * `.cer` downloaded and given back to the PSP so it can decrypt payment\n * tokens. This is the one manual Apple-portal step in wiring up Apple Pay.\n *\n * Ported 1:1 from Spaceship's create_certificate! (submitCertificateRequest\n * .action): the merchant's INTERNAL id (`omcId`) is passed as BOTH `appIdId`\n * and `specialIdentifierDisplayId` — the latter is how the portal scopes a\n * cert to a merchant/special identifier rather than an App ID. The cert type\n * is APPLE_PAY (`4APLUP237T`). Returns the created certRequest (its\n * `certificateId` feeds `downloadApplePayCertificate`).\n *\n * @param omcId the merchant's internal id (from createMerchant/listMerchants)\n * @param csrContent the PEM CSR string (Stripe's \"Apple Pay CSR\")\n */\n async createApplePayCertificate(params: { omcId: string; csrContent: string }): Promise<any> {\n const data = await this.post(\"account/ios/certificate/submitCertificateRequest.action\", {\n teamId: this.teamId,\n type: PortalClient.CERT_TYPES.APPLE_PAY,\n csrContent: params.csrContent,\n appIdId: params.omcId,\n specialIdentifierDisplayId: params.omcId,\n });\n return data.certRequest;\n }\n\n /**\n * Download an Apple Pay Payment Processing Certificate's raw bytes by its\n * certificate id (from `createApplePayCertificate`). Thin wrapper over\n * `downloadCertificate` pinned to the APPLE_PAY type — the DER `.cer` you\n * upload back into Stripe.\n */\n async downloadApplePayCertificate(certificateId: string): Promise<Buffer> {\n return this.downloadCertificate(certificateId, PortalClient.CERT_TYPES.APPLE_PAY);\n }\n\n // ── Certificates ───────────────────────────────────────────────────────\n\n async listCertificates(types?: string[]): Promise<any[]> {\n // Default to all known iOS cert type codes plus Fastlane's list of\n // legacy type codes (OLDER_IOS_CERTIFICATE_TYPES). The portal may still\n // return these older codes for pre-existing certs and Fastlane's\n // `Certificate.all` includes them — see certificate.rb line 278.\n const iosTypes = types ?? [\n PortalClient.CERT_TYPES.IOS_DEVELOPMENT,\n PortalClient.CERT_TYPES.IOS_DISTRIBUTION,\n ...PortalClient.OLDER_IOS_CERTIFICATE_TYPES,\n ];\n const data = await this.post(\"account/ios/certificate/listCertRequests.action\", {\n teamId: this.teamId, pageSize: \"500\", pageNumber: \"1\",\n sort: \"certRequestStatusCode=asc\", types: iosTypes.join(\",\"),\n });\n return data.certRequests ?? [];\n }\n\n async listPushCertificates(): Promise<any[]> {\n // iOS-only push cert type codes, deduplicated. The endpoint\n // `account/ios/certificate/listCertRequests.action` rejects any code\n // that isn't an iOS code (so Mac push types, even if listed in\n // CERT_TYPES, must be excluded) and rejects duplicates in the comma\n // list. We also include the legacy push cert codes from before\n // Apple's 2017 cert restructuring — they still occasionally appear\n // for older bundles.\n //\n // The modern unified \"Apple Push Services\" cert (one cert for both\n // prod + sandbox) reuses IOS_PRODUCTION_PUSH (UPV3DW712I), so the\n // first two codes catch every modern case.\n const types = Array.from(\n new Set([\n PortalClient.CERT_TYPES.IOS_PRODUCTION_PUSH,\n PortalClient.CERT_TYPES.IOS_DEVELOPMENT_PUSH,\n // Legacy push codes from OLDER_IOS_CERTIFICATE_TYPES\n \"3BQKVH9I2X\",\n \"BKLRAVXMGM\",\n ])\n );\n const data = await this.post(\"account/ios/certificate/listCertRequests.action\", {\n teamId: this.teamId, pageSize: \"500\", pageNumber: \"1\",\n sort: \"certRequestStatusCode=asc\",\n types: types.join(\",\"),\n });\n return data.certRequests ?? [];\n }\n\n async createCertificate(params: { type: string; csrContent: string; appIdId?: string }): Promise<any> {\n const reqParams: Record<string, string> = {\n teamId: this.teamId, type: params.type, csrContent: params.csrContent,\n };\n if (params.appIdId) reqParams.appIdId = params.appIdId;\n const data = await this.post(\"account/ios/certificate/submitCertificateRequest.action\", reqParams);\n return data.certRequest;\n }\n\n async downloadCertificate(certId: string, type: string): Promise<Buffer> {\n const headers: Record<string, string> = { Cookie: this.cookieStr, Accept: \"application/json\" };\n const res = await fetch(\n `${PORTAL_BASE}/account/ios/certificate/downloadCertificateContent.action?teamId=${this.teamId}&certificateId=${certId}&type=${type}`,\n { headers }\n );\n return Buffer.from(await res.arrayBuffer());\n }\n\n async revokeCertificate(certId: string, type: string): Promise<void> {\n await this.post(\"account/ios/certificate/revokeCertificate.action\", {\n teamId: this.teamId, certificateId: certId, type,\n });\n }\n\n // ── Devices ────────────────────────────────────────────────────────────\n\n async listDevices(): Promise<any[]> {\n const data = await this.post(\"account/ios/device/listDevices.action\", {\n teamId: this.teamId, pageSize: \"500\", pageNumber: \"1\", sort: \"name=asc\", includeRemovedDevices: \"false\",\n });\n return data.devices ?? [];\n }\n\n async registerDevice(params: { name: string; udid: string; deviceClass?: string }): Promise<any> {\n const data = await this.post(\"account/ios/device/addDevices.action\", {\n teamId: this.teamId, deviceNames: params.name, deviceNumbers: params.udid,\n register: \"single\", deviceClasses: params.deviceClass ?? \"iphone\",\n });\n return (data.devices ?? [])[0];\n }\n\n // ── Provisioning Profiles ──────────────────────────────────────────────\n\n async listProfiles(): Promise<any[]> {\n const data = await this.post(\"account/ios/profile/listProvisioningProfiles.action\", {\n teamId: this.teamId, includeInactiveProfiles: \"true\",\n pageSize: \"500\", pageNumber: \"1\", sort: \"name=asc\",\n });\n return data.provisioningProfiles ?? [];\n }\n\n async createProfile(params: {\n appIdId: string;\n name: string;\n distributionType: string; // \"limited\" (dev), \"store\" (appstore), \"adhoc\"\n certificateIds: string[];\n deviceIds?: string[];\n }): Promise<any> {\n const reqParams: Record<string, string | string[]> = {\n teamId: this.teamId,\n appIdId: params.appIdId,\n distributionType: params.distributionType,\n provisioningProfileName: params.name,\n certificateIds: params.certificateIds,\n };\n if (params.deviceIds?.length) reqParams.deviceIds = params.deviceIds;\n const data = await this.post(\"account/ios/profile/createProvisioningProfile.action\", reqParams);\n return data.provisioningProfile;\n }\n\n async deleteProfile(profileId: string): Promise<void> {\n await this.post(\"account/ios/profile/deleteProvisioningProfile.action\", {\n teamId: this.teamId, provisioningProfileId: profileId,\n });\n }\n\n async downloadProfile(profileId: string): Promise<Buffer> {\n const headers: Record<string, string> = { Cookie: this.cookieStr };\n const res = await fetch(\n `${PORTAL_BASE}/account/ios/profile/downloadProfileContent?teamId=${this.teamId}&provisioningProfileId=${profileId}`,\n { headers }\n );\n return Buffer.from(await res.arrayBuffer());\n }\n\n // ── Certificate Type Constants (matching Fastlane) ─────────────────────\n\n /**\n * Apple certificate type codes — copied 1:1 from Fastlane's\n * spaceship/portal/certificate.rb IOS_CERTIFICATE_TYPE_IDS / MAC_CERTIFICATE_TYPE_IDS\n */\n static CERT_TYPES = {\n // iOS\n IOS_DEVELOPMENT: \"5QPB9NHCEI\",\n IOS_DISTRIBUTION: \"R58UK2EWSO\", // App Store Production\n IOS_IN_HOUSE: \"9RQEK7MSXA\",\n IOS_DEVELOPMENT_PUSH: \"JKG5JZ54H7\",\n IOS_PRODUCTION_PUSH: \"UPV3DW712I\",\n APPLE_PUSH_PRODUCTION: \"UPV3DW712I\", // alias\n APPLE_PUSH_SANDBOX: \"JKG5JZ54H7\", // alias\n PASSBOOK: \"Y3B2F3TYSI\",\n WEBSITE_PUSH: \"3T2ZP62QW8\",\n VOIP_PUSH: \"E5D663CMZW\",\n APPLE_PAY: \"4APLUP237T\",\n APPLE_PAY_MERCHANT_IDENTITY: \"MD8Q2VRT6A\",\n // Universal (Apple Development/Distribution)\n APPLE_DEVELOPMENT: \"83Q87W3TGH\",\n APPLE_DISTRIBUTION: \"WXV89964HE\",\n // Mac\n MAC_DEVELOPMENT: \"749Y1QAGU7\",\n MAC_APP_DISTRIBUTION: \"HXZEUKP0FP\",\n MAC_INSTALLER_DISTRIBUTION: \"2PQI8IDXNH\",\n MAC_PRODUCTION_PUSH: \"CDZ7EMXIZ1\",\n MAC_DEVELOPMENT_PUSH: \"HQ4KP3I34R\",\n DEVELOPER_ID_APPLICATION: \"DIVN2GW3XT\",\n DEVELOPER_ID_INSTALLER: \"OYVN2GW35E\",\n } as const;\n\n /**\n * Legacy iOS certificate type codes that can still appear in the portal\n * responses. Port of Fastlane's Spaceship::Portal::Certificate\n * OLDER_IOS_CERTIFICATE_TYPES list (certificate.rb lines 180-189).\n */\n static OLDER_IOS_CERTIFICATE_TYPES: readonly string[] = [\n \"3BQKVH9I2X\", // old ProductionPush\n \"BKLRAVXMGM\", // old DevelopmentPush\n // Also sent by the browser, but not sure what they represent:\n \"T44PTHVNID\",\n \"DZQUP8189Y\",\n \"FGQUP4785Z\",\n \"S5WE21TULA\",\n \"FUOY7LWJET\",\n ] as const;\n}\n","/**\n * App Store Connect \"iris\" admin API client.\n *\n * The iris API lives at `https://appstoreconnect.apple.com/iris/v1/*` and\n * is what App Store Connect's own web UI uses for everything that doesn't\n * fit the public REST API (which requires JWT). Authentication is via the\n * Olympus session cookies we already obtain after SIRP + 2FA login.\n *\n * Notable iris endpoints (reverse-engineered from the App Store Connect\n * web app — Apple does not publish this API, so the shapes below are best\n * effort and may need iteration):\n *\n * POST /iris/v1/apiKeys\n * Body: { data: { type: \"apiKeys\", attributes: {\n * nickname, allAppsVisible, roles: [\"DEVELOPER\" | \"APP_MANAGER\" | ...]\n * }}}\n * Response: { data: { id, attributes: { nickname, kid, privateKey?, ... }}}\n *\n * `kid` is the key ID used in JWT auth (e.g. \"2X9R4HXF34\"). The\n * `privateKey` field, when present, contains the PEM-encoded .p8\n * content. Apple shows this exactly ONCE at creation time — if we\n * don't capture it, the key is bricked and must be revoked.\n *\n * GET /iris/v1/apiKeys\n * List existing keys. Used to find the issuer id.\n *\n * Roles the wizard uses: \"APP_MANAGER\" is the minimum needed for\n * TestFlight uploads via altool. Higher roles work too.\n *\n * Failure modes:\n * • 403 → user lacks Account Holder / Admin role → fall back to manual\n * • 4xx with `error.detail` → surface the message to the user\n * • 200 but no `privateKey` in response → endpoint shape changed,\n * surface so we can iterate\n */\n\nimport type { AppleSession } from \"./apple-session.js\";\n\nconst IRIS_BASE = \"https://appstoreconnect.apple.com/iris/v1\";\n\nexport type ApiKeyRole =\n | \"ADMIN\"\n | \"FINANCE\"\n | \"ACCESS_TO_REPORTS\"\n | \"APP_MANAGER\"\n | \"DEVELOPER\"\n | \"MARKETING\"\n | \"SALES\"\n | \"CUSTOMER_SUPPORT\";\n\nexport interface IrisApiKey {\n id: string;\n /** Key ID used for JWT auth (the short alphanumeric string) */\n kid: string;\n nickname: string;\n /** PEM-encoded .p8 private key — only present in create response, ONCE */\n privateKey?: string;\n /** Issuer id (UUID) — needed by altool/iTMSTransporter alongside the key id */\n issuerId?: string;\n roles: ApiKeyRole[];\n allAppsVisible: boolean;\n}\n\nexport class IrisClient {\n private cookieStr: string;\n\n constructor(private session: AppleSession) {\n this.cookieStr = Object.entries(session.cookies).map(([k, v]) => `${k}=${v}`).join(\"; \");\n }\n\n private buildHeaders(): Record<string, string> {\n // Read the session's cookies every time: a provider (team) switch\n // replaces them, and a stale copy would keep working in the old team.\n this.cookieStr = Object.entries(this.session.cookies).map(([k, v]) => `${k}=${v}`).join(\"; \");\n return {\n Cookie: this.cookieStr,\n Accept: \"application/vnd.api+json, application/json, text/plain, */*\",\n \"Content-Type\": \"application/vnd.api+json\",\n \"X-Requested-With\": \"XMLHttpRequest\",\n // Mimic the App Store Connect web UI's user agent\n \"User-Agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Safari/605.1.15\",\n };\n }\n\n /**\n * Issue a request and absorb any new cookies (Apple rotates session\n * cookies on a lot of iris calls).\n */\n private async request(\n method: \"GET\" | \"POST\" | \"DELETE\",\n path: string,\n body?: unknown\n ): Promise<{ status: number; body: any; rawText: string }> {\n const headers = this.buildHeaders();\n if (process.env.FASTNODE_DEBUG) {\n console.log(`[iris] ${method} ${path}${body ? ` body=${JSON.stringify(body).slice(0, 200)}` : \"\"}`);\n }\n const res = await fetch(`${IRIS_BASE}${path}`, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n\n // Absorb new cookies\n for (const raw of res.headers.getSetCookie?.() ?? []) {\n const m = raw.match(/^([^=]+)=([^;]*)/);\n if (m) {\n this.session.cookies[m[1]] = m[2];\n }\n }\n this.cookieStr = Object.entries(this.session.cookies)\n .map(([k, v]) => `${k}=${v}`)\n .join(\"; \");\n\n const text = await res.text();\n let parsed: any = null;\n try {\n parsed = text ? JSON.parse(text) : null;\n } catch {\n // not JSON\n }\n if (process.env.FASTNODE_DEBUG) {\n console.log(`[iris] → ${res.status} ${text.slice(0, 300)}`);\n }\n return { status: res.status, body: parsed, rawText: text };\n }\n\n /**\n * List existing API keys. Used both as a sanity check (the user has\n * permission) and to discover the team's issuer id (which is the same\n * for every key in the team and is needed by altool).\n *\n * Important: Apple's iris endpoint rejects most query parameters with\n * `PARAMETER_ERROR.INVALID`. Call with no params and let the API return\n * its default page.\n */\n async listApiKeys(): Promise<{ keys: IrisApiKey[]; issuerId?: string }> {\n const { status, body, rawText } = await this.request(\"GET\", \"/apiKeys\");\n if (status === 403) {\n throw new IrisAuthError(\n \"You don't have permission to manage App Store Connect API keys (this requires the Account Holder or Admin role).\"\n );\n }\n if (status >= 400 || !body) {\n throw new Error(`iris listApiKeys failed (${status}): ${rawText.slice(0, 200)}`);\n }\n\n const issuerId = body?.meta?.issuerId ?? body?.data?.[0]?.attributes?.issuerId;\n const keys: IrisApiKey[] = (body.data ?? []).map((d: any) => ({\n id: d.id,\n kid: d.attributes?.kid ?? d.id,\n nickname: d.attributes?.nickname ?? \"\",\n issuerId: d.attributes?.issuerId ?? issuerId,\n roles: d.attributes?.roles ?? [],\n allAppsVisible: d.attributes?.allAppsVisible ?? true,\n }));\n return { keys, issuerId };\n }\n\n /**\n * Create a new API key. Apple returns the .p8 PEM exactly once in the\n * create response — capture it immediately or the key is dead weight.\n *\n * `keyType` is required by Apple's iris API:\n * • PUBLIC_API — the standard team-wide API key (what TestFlight uploads need)\n * • MARKETING_API — for App Analytics access only\n */\n async createApiKey(input: {\n nickname: string;\n roles?: ApiKeyRole[];\n allAppsVisible?: boolean;\n keyType?: \"PUBLIC_API\" | \"MARKETING_API\";\n }): Promise<IrisApiKey> {\n const requestBody = {\n data: {\n type: \"apiKeys\",\n attributes: {\n nickname: input.nickname,\n roles: input.roles ?? [\"APP_MANAGER\"],\n allAppsVisible: input.allAppsVisible ?? true,\n keyType: input.keyType ?? \"PUBLIC_API\",\n },\n },\n };\n\n // Always log this — it's the trickiest call in the whole orchestrator\n // and we need full visibility while the iris API is being shaken out.\n console.log(\"[iris] createApiKey request:\", JSON.stringify(requestBody));\n const { status, body, rawText } = await this.request(\"POST\", \"/apiKeys\", requestBody);\n console.log(`[iris] createApiKey response: ${status} ${rawText.slice(0, 800)}`);\n\n if (status === 403) {\n throw new IrisAuthError(\n \"You don't have permission to create App Store Connect API keys (this requires the Account Holder or Admin role).\"\n );\n }\n if (status >= 400 || !body) {\n const msg =\n body?.errors?.[0]?.detail ??\n body?.errors?.[0]?.title ??\n rawText.slice(0, 300) ??\n `iris createApiKey failed (${status})`;\n throw new Error(msg);\n }\n\n const data = body.data ?? body;\n if (!data?.id) {\n throw new Error(`iris createApiKey returned no key id. Raw response: ${rawText.slice(0, 400)}`);\n }\n\n const key: IrisApiKey = {\n id: data.id,\n kid: data.attributes?.kid ?? data.id,\n nickname: data.attributes?.nickname ?? input.nickname,\n privateKey: data.attributes?.privateKey,\n issuerId: data.attributes?.issuerId,\n roles: data.attributes?.roles ?? input.roles ?? [\"APP_MANAGER\"],\n allAppsVisible: data.attributes?.allAppsVisible ?? true,\n };\n return key;\n }\n\n /**\n * Fetch the .p8 PEM AND the team's issuer id for a previously-created\n * ASC API key. Both come back in a single request via:\n *\n * GET /iris/v1/apiKeys/{id}?fields[apiKeys]=privateKey&include=provider\n *\n * Sparse fieldset requesting ONLY `privateKey` is the magic that makes\n * Apple actually include the (base64-encoded) PEM in the response —\n * the default view returns `privateKey: null`. The `include=provider`\n * pulls the team's contentProvider record into `included[]`, and its\n * `id` field IS the issuer id altool needs (a UUID like\n * `cfadaf94-44ca-4c2c-8fa6-ecc28d3c7d0d`).\n *\n * Reverse-engineered from @expo/apple-utils v2.1.21 (the package that\n * powers EAS CLI), specifically the `ApiKey.downloadAsync` method\n * combined with `ApiKey.infoAsync` reading `provider?.id`.\n *\n * Returns `{ pem, issuerId }`, or `null` if Apple won't return the\n * private key (typically because the key was already downloaded once).\n */\n async fetchApiKeyPrivateKey(keyId: string): Promise<{ pem: string; issuerId?: string } | null> {\n try {\n const url = `${IRIS_BASE}/apiKeys/${keyId}?fields%5BapiKeys%5D=privateKey&include=provider`;\n const res = await fetch(url, {\n headers: {\n ...this.buildHeaders(),\n Accept: \"application/vnd.api+json, application/json, text/plain, */*\",\n },\n });\n const text = await res.text();\n console.log(`[iris] fetchApiKeyPrivateKey → ${res.status} (${text.length} bytes)`);\n if (res.status !== 200) {\n console.log(`[iris] err: ${text.slice(0, 300)}`);\n return null;\n }\n const body = JSON.parse(text);\n const encoded = body?.data?.attributes?.privateKey;\n if (typeof encoded !== \"string\" || encoded.length === 0) {\n console.log(`[iris] no privateKey in response`);\n return null;\n }\n const pem = Buffer.from(encoded, \"base64\").toString(\"utf-8\");\n if (!pem.includes(\"BEGIN PRIVATE KEY\")) {\n console.log(`[iris] decoded body didn't contain PEM marker`);\n return null;\n }\n // Issuer id is the contentProvider in the included array\n const provider = (body?.included ?? []).find((i: any) => i.type === \"contentProviders\");\n const issuerId = provider?.id;\n console.log(`[iris] ✓ PEM ${pem.length} bytes, issuerId=${issuerId ?? \"(missing)\"}`);\n return { pem, issuerId };\n } catch (err) {\n console.log(`[iris] fetchApiKeyPrivateKey error: ${(err as Error).message}`);\n return null;\n }\n }\n\n /**\n * @deprecated Kept as a fallback probe for debugging. The real path\n * is the sparse fieldset above — everything in this brute-force list\n * returned 404 during testing. Left here so we can re-verify if Apple\n * changes anything.\n */\n async fetchApiKeyPrivateKeyBruteForce(keyId: string): Promise<string | null> {\n type Attempt =\n | { kind: \"GET\"; path: string; accept?: string }\n | { kind: \"POST\"; path: string; body?: unknown }\n | { kind: \"ABSOLUTE\"; url: string };\n\n const attempts: Attempt[] = [\n // Sparse fieldsets — JSON-API spec lets us request specific attributes.\n // Apple may exclude privateKey by default and return it only when asked.\n { kind: \"GET\", path: `/apiKeys/${keyId}?fields[apiKeys]=privateKey,kid,issuerId,nickname,roles` },\n { kind: \"GET\", path: `/apiKeys/${keyId}?include=privateKey` },\n { kind: \"GET\", path: `/apiKeys/${keyId}?fields[apiKeys]=privateKey` },\n // Custom Accept headers — maybe Apple negotiates content type\n { kind: \"GET\", path: `/apiKeys/${keyId}`, accept: \"application/x-pem-file\" },\n { kind: \"GET\", path: `/apiKeys/${keyId}`, accept: \"application/octet-stream\" },\n { kind: \"GET\", path: `/apiKeys/${keyId}/p8`, accept: \"application/x-pem-file\" },\n // POST variants — Apple sometimes uses POST to mint a download token\n { kind: \"POST\", path: `/apiKeys/${keyId}/secrets`, body: {} },\n { kind: \"POST\", path: `/apiKeys/${keyId}/regenerate`, body: {} },\n { kind: \"POST\", path: `/apiKeys/${keyId}/p8`, body: {} },\n // Bare GET (last) — confirms canonical fields, in case my parser missed any\n { kind: \"GET\", path: `/apiKeys/${keyId}` },\n // Different host — the legacy developer.apple.com user-and-access namespace\n { kind: \"ABSOLUTE\", url: `https://appstoreconnect.apple.com/api/v1/apiKeys/${keyId}/p8` },\n { kind: \"ABSOLUTE\", url: `https://appstoreconnect.apple.com/access/api/keys/${keyId}/download` },\n ];\n\n for (const attempt of attempts) {\n try {\n let result: { status: number; body: any; rawText: string };\n if (attempt.kind === \"GET\") {\n // Custom request that allows overriding Accept header.\n result = await this.requestWithHeaders(\"GET\", attempt.path, undefined, {\n ...(attempt.accept ? { Accept: attempt.accept } : {}),\n });\n console.log(`[iris] fetchApiKeyPrivateKey GET ${attempt.path}${attempt.accept ? ` accept=${attempt.accept}` : \"\"} → ${result.status} (${result.rawText.length} bytes)`);\n } else if (attempt.kind === \"POST\") {\n result = await this.request(\"POST\", attempt.path, attempt.body);\n console.log(`[iris] fetchApiKeyPrivateKey POST ${attempt.path} → ${result.status} (${result.rawText.length} bytes)`);\n } else {\n result = await this.requestAbsolute(\"GET\", attempt.url);\n console.log(`[iris] fetchApiKeyPrivateKey GET ${attempt.url} → ${result.status} (${result.rawText.length} bytes)`);\n }\n\n // For 200 responses, log the full body so we can see what Apple is returning.\n if (result.status === 200) {\n console.log(`[iris] body: ${result.rawText.slice(0, 1500)}`);\n }\n if (result.status !== 200) continue;\n\n // Plain PEM body\n if (result.rawText && result.rawText.includes(\"BEGIN PRIVATE KEY\")) {\n console.log(`[iris] ✓ found PEM (plain text response)`);\n return result.rawText;\n }\n // JSON wrapper that might contain the PEM under various attribute names\n if (result.body) {\n const candidates = [\n result.body?.data?.attributes?.privateKey,\n result.body?.data?.attributes?.p8,\n result.body?.data?.attributes?.privateKeyContent,\n result.body?.data?.attributes?.kpem,\n result.body?.data?.attributes?.secret,\n result.body?.data?.attributes?.keyContent,\n result.body?.privateKey,\n result.body?.p8,\n result.body?.value,\n result.body?.secret,\n ];\n for (const c of candidates) {\n if (typeof c === \"string\" && c.includes(\"BEGIN PRIVATE KEY\")) {\n console.log(`[iris] ✓ found PEM in JSON response`);\n return c;\n }\n }\n }\n } catch (err) {\n console.log(`[iris] fetchApiKeyPrivateKey attempt failed: ${(err as Error).message}`);\n }\n }\n console.log(`[iris] fetchApiKeyPrivateKey: no working download path for key ${keyId}`);\n return null;\n }\n\n /** Internal: like request() but lets us override headers. */\n private async requestWithHeaders(\n method: \"GET\" | \"POST\" | \"DELETE\",\n path: string,\n body?: unknown,\n extraHeaders: Record<string, string> = {}\n ): Promise<{ status: number; body: any; rawText: string }> {\n const headers = { ...this.buildHeaders(), ...extraHeaders };\n const res = await fetch(`${IRIS_BASE}${path}`, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n for (const raw of res.headers.getSetCookie?.() ?? []) {\n const m = raw.match(/^([^=]+)=([^;]*)/);\n if (m) this.session.cookies[m[1]] = m[2];\n }\n this.cookieStr = Object.entries(this.session.cookies).map(([k, v]) => `${k}=${v}`).join(\"; \");\n const text = await res.text();\n let parsed: any = null;\n try { parsed = text ? JSON.parse(text) : null; } catch {}\n return { status: res.status, body: parsed, rawText: text };\n }\n\n /** Internal: fetch an absolute URL with the session cookies. */\n private async requestAbsolute(\n method: \"GET\" | \"POST\" | \"DELETE\",\n url: string\n ): Promise<{ status: number; body: any; rawText: string }> {\n const headers = this.buildHeaders();\n const res = await fetch(url, { method, headers });\n const text = await res.text();\n let parsed: any = null;\n try { parsed = text ? JSON.parse(text) : null; } catch {}\n return { status: res.status, body: parsed, rawText: text };\n }\n\n async deleteApiKey(keyId: string): Promise<void> {\n await this.request(\"DELETE\", `/apiKeys/${keyId}`);\n }\n}\n\n/** Thrown when the user doesn't have permission to use the iris admin API. */\nexport class IrisAuthError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"IrisAuthError\";\n }\n}\n","import { TokenManager } from \"./auth.js\";\nimport { RequestClient } from \"./request.js\";\nimport type { AppStoreConnectConfig, ListParams, RequestOptions } from \"./types.js\";\nimport { CertificatesResource } from \"../resources/certificates.js\";\nimport { ProfilesResource } from \"../resources/profiles.js\";\nimport { BundleIdsResource } from \"../resources/bundle-ids.js\";\nimport { DevicesResource } from \"../resources/devices.js\";\nimport { AppsResource } from \"../resources/apps.js\";\nimport { BuildsResource } from \"../resources/builds.js\";\nimport { BetaGroupsResource } from \"../resources/beta-groups.js\";\nimport { CapabilitiesResource } from \"../resources/capabilities.js\";\nimport { AppStoreVersionsResource } from \"../resources/app-store-versions.js\";\nimport { AppScreenshotsResource } from \"../resources/app-screenshots.js\";\nimport { ReviewSubmissionsResource } from \"../resources/review-submissions.js\";\nimport { AppInfosResource } from \"../resources/app-info.js\";\nimport { AppInfoLocalizationsResource } from \"../resources/app-info-localizations.js\";\nimport { AppStoreReviewDetailsResource } from \"../resources/app-store-review-details.js\";\nimport { BetaTestersResource } from \"../resources/beta-testers.js\";\nimport { BetaAppReviewSubmissionsResource } from \"../resources/beta-app-review-submissions.js\";\nimport { BetaAppReviewDetailsResource } from \"../resources/beta-app-review-details.js\";\nimport { BetaInvitationsResource } from \"../resources/beta-invitations.js\";\nimport { BetaLicensesResource } from \"../resources/beta-licenses.js\";\nimport { AppPreviewsResource } from \"../resources/app-previews.js\";\nimport { AppPreviewSetsResource } from \"../resources/app-preview-sets.js\";\nimport { AppPricesResource } from \"../resources/app-prices.js\";\nimport { TerritoriesResource } from \"../resources/territories.js\";\nimport { AgeRatingDeclarationsResource } from \"../resources/age-rating-declarations.js\";\nimport { AppCategoriesResource } from \"../resources/app-categories.js\";\nimport { AppEncryptionDeclarationsResource } from \"../resources/app-encryption-declarations.js\";\nimport { IdfaDeclarationsResource } from \"../resources/idfa-declarations.js\";\nimport { PreReleaseVersionsResource } from \"../resources/pre-release-versions.js\";\nimport { ReviewSubmissionItemsResource } from \"../resources/review-submission-items.js\";\nimport { UsersResource } from \"../resources/users.js\";\nimport { UserInvitationsResource } from \"../resources/user-invitations.js\";\nimport { InAppPurchasesResource } from \"../resources/in-app-purchases.js\";\nimport { GameCenterDetailResource } from \"../resources/game-center-detail.js\";\nimport { XcodeMetricsResource } from \"../resources/xcode-metrics.js\";\nimport { AppAssetLibrariesResource } from \"../resources/app-asset-libraries.js\";\nimport {\n AppAssetLibraryImagesResource,\n AppAssetLibraryVideosResource,\n} from \"../resources/app-asset-library-assets.js\";\nimport { AppAssetLibraryPlacementsResource } from \"../resources/app-asset-library-placements.js\";\n\nexport type { AppStoreConnectConfig, ListParams, RequestOptions };\nexport { TokenManager } from \"./auth.js\";\nexport type { TokenConfig } from \"./auth.js\";\nexport { RequestClient, AppStoreConnectError, RateLimitError } from \"./request.js\";\nexport type * from \"./types.js\";\nexport {\n loginWithAppleId,\n beginLogin,\n submitTwoFactorCode,\n requestSmsCode,\n checkPortalResponse,\n ProgramLicenseAgreementError,\n} from \"./apple-session.js\";\nexport type {\n AppleSessionConfig,\n AppleSession,\n ContractMessage,\n PendingLogin,\n TwoFactorChallenge,\n BeginLoginResult,\n} from \"./apple-session.js\";\nexport {\n signInWithAppleId,\n loadAppleSession,\n saveAppleSession,\n clearAppleSession,\n lastAppleId,\n sessionDir,\n} from \"./session-store.js\";\nexport { PortalClient } from \"./portal.js\";\nexport { IrisClient, IrisAuthError } from \"./iris.js\";\nexport type { IrisApiKey, ApiKeyRole } from \"./iris.js\";\n\nexport class AppStoreConnectClient {\n readonly http: RequestClient;\n\n readonly certificates: CertificatesResource;\n readonly profiles: ProfilesResource;\n readonly bundleIds: BundleIdsResource;\n readonly devices: DevicesResource;\n readonly apps: AppsResource;\n readonly builds: BuildsResource;\n readonly betaGroups: BetaGroupsResource;\n readonly capabilities: CapabilitiesResource;\n readonly appStoreVersions: AppStoreVersionsResource;\n readonly appScreenshots: AppScreenshotsResource;\n readonly reviewSubmissions: ReviewSubmissionsResource;\n readonly appInfos: AppInfosResource;\n readonly appInfoLocalizations: AppInfoLocalizationsResource;\n readonly appStoreReviewDetails: AppStoreReviewDetailsResource;\n readonly betaTesters: BetaTestersResource;\n readonly betaAppReviewSubmissions: BetaAppReviewSubmissionsResource;\n readonly betaAppReviewDetails: BetaAppReviewDetailsResource;\n readonly betaInvitations: BetaInvitationsResource;\n readonly betaLicenses: BetaLicensesResource;\n readonly appPreviews: AppPreviewsResource;\n readonly appPreviewSets: AppPreviewSetsResource;\n readonly appPrices: AppPricesResource;\n readonly territories: TerritoriesResource;\n readonly ageRatingDeclarations: AgeRatingDeclarationsResource;\n readonly appCategories: AppCategoriesResource;\n readonly appEncryptionDeclarations: AppEncryptionDeclarationsResource;\n readonly idfaDeclarations: IdfaDeclarationsResource;\n readonly preReleaseVersions: PreReleaseVersionsResource;\n readonly reviewSubmissionItems: ReviewSubmissionItemsResource;\n readonly users: UsersResource;\n readonly userInvitations: UserInvitationsResource;\n readonly inAppPurchases: InAppPurchasesResource;\n readonly gameCenterDetail: GameCenterDetailResource;\n readonly xcodeMetrics: XcodeMetricsResource;\n readonly appAssetLibraries: AppAssetLibrariesResource;\n readonly appAssetLibraryImages: AppAssetLibraryImagesResource;\n readonly appAssetLibraryVideos: AppAssetLibraryVideosResource;\n readonly appAssetLibraryPlacements: AppAssetLibraryPlacementsResource;\n\n constructor(config: AppStoreConnectConfig) {\n const tokenManager = new TokenManager({\n keyId: config.keyId,\n issuerId: config.issuerId,\n privateKey: config.privateKey,\n enterprise: config.enterprise,\n duration: config.tokenDuration,\n });\n this.http = new RequestClient(tokenManager, config.enterprise);\n\n this.certificates = new CertificatesResource(this.http);\n this.profiles = new ProfilesResource(this.http);\n this.bundleIds = new BundleIdsResource(this.http);\n this.devices = new DevicesResource(this.http);\n this.apps = new AppsResource(this.http);\n this.builds = new BuildsResource(this.http);\n this.betaGroups = new BetaGroupsResource(this.http);\n this.capabilities = new CapabilitiesResource(this.http);\n this.appStoreVersions = new AppStoreVersionsResource(this.http);\n this.appScreenshots = new AppScreenshotsResource(this.http);\n this.reviewSubmissions = new ReviewSubmissionsResource(this.http);\n this.appInfos = new AppInfosResource(this.http);\n this.appInfoLocalizations = new AppInfoLocalizationsResource(this.http);\n this.appStoreReviewDetails = new AppStoreReviewDetailsResource(this.http);\n this.betaTesters = new BetaTestersResource(this.http);\n this.betaAppReviewSubmissions = new BetaAppReviewSubmissionsResource(this.http);\n this.betaAppReviewDetails = new BetaAppReviewDetailsResource(this.http);\n this.betaInvitations = new BetaInvitationsResource(this.http);\n this.betaLicenses = new BetaLicensesResource(this.http);\n this.appPreviews = new AppPreviewsResource(this.http);\n this.appPreviewSets = new AppPreviewSetsResource(this.http);\n this.appPrices = new AppPricesResource(this.http);\n this.territories = new TerritoriesResource(this.http);\n this.ageRatingDeclarations = new AgeRatingDeclarationsResource(this.http);\n this.appCategories = new AppCategoriesResource(this.http);\n this.appEncryptionDeclarations = new AppEncryptionDeclarationsResource(this.http);\n this.idfaDeclarations = new IdfaDeclarationsResource(this.http);\n this.preReleaseVersions = new PreReleaseVersionsResource(this.http);\n this.reviewSubmissionItems = new ReviewSubmissionItemsResource(this.http);\n this.users = new UsersResource(this.http);\n this.userInvitations = new UserInvitationsResource(this.http);\n this.inAppPurchases = new InAppPurchasesResource(this.http);\n this.gameCenterDetail = new GameCenterDetailResource(this.http);\n this.xcodeMetrics = new XcodeMetricsResource(this.http);\n this.appAssetLibraries = new AppAssetLibrariesResource(this.http);\n this.appAssetLibraryImages = new AppAssetLibraryImagesResource(this.http);\n this.appAssetLibraryVideos = new AppAssetLibraryVideosResource(this.http);\n this.appAssetLibraryPlacements = new AppAssetLibraryPlacementsResource(this.http);\n }\n\n async request<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.http.request<T>(path, options);\n }\n}\n"]}
|