@limrun/ui 0.14.0-rc.4 → 0.14.0-rc.5

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.
Files changed (31) hide show
  1. package/dist/app-store-relay/index.cjs +3 -3
  2. package/dist/app-store-relay/index.d.ts +108 -4
  3. package/dist/app-store-relay/index.js +353 -160
  4. package/dist/app-store-relay/react.cjs +1 -1
  5. package/dist/app-store-relay/react.js +1 -1
  6. package/dist/apple-credentials/index.cjs +1 -1
  7. package/dist/apple-credentials/index.d.ts +59 -8
  8. package/dist/apple-credentials/index.js +197 -133
  9. package/dist/client-C9z_sgOf.js +1 -0
  10. package/dist/{client-DSuNtWDv.mjs → client-CFDB4mX5.mjs} +37 -30
  11. package/dist/core/device-install/apple/provisioning.d.ts +25 -0
  12. package/dist/core/device-install/apple/relay.d.ts +13 -0
  13. package/dist/core/device-install/storage/secret-store.d.ts +24 -1
  14. package/dist/device-build/index.cjs +1 -1
  15. package/dist/device-build/index.js +1 -1
  16. package/dist/device-install/index.cjs +1 -1
  17. package/dist/device-install/index.js +175 -172
  18. package/dist/{provisioning-B_DefBEp.mjs → provisioning-CDPvxd1h.mjs} +63 -32
  19. package/dist/provisioning-CbC4h--7.js +1 -0
  20. package/package.json +1 -1
  21. package/src/app-store-relay/index.ts +358 -23
  22. package/src/apple-credentials/index.test.ts +22 -0
  23. package/src/apple-credentials/index.ts +161 -14
  24. package/src/core/device-install/apple/client.ts +13 -6
  25. package/src/core/device-install/apple/provisioning.test.ts +30 -0
  26. package/src/core/device-install/apple/provisioning.ts +39 -0
  27. package/src/core/device-install/apple/relay.ts +20 -0
  28. package/src/core/device-install/operations/operations.ts +6 -1
  29. package/src/core/device-install/storage/secret-store.ts +36 -2
  30. package/dist/client-D1drDXxE.js +0 -1
  31. package/dist/provisioning-BlQMccX_.js +0 -1
@@ -1,9 +1,9 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("../client-D1drDXxE.js"),u=require("../index-ChhtuQ7e.js"),P=require("../gsa-srp-CCIfUz7Y.js"),p=require("../provisioning-BlQMccX_.js"),I={name:"RSASSA-PKCS1-v1_5",modulusLength:2048,publicExponent:new Uint8Array([1,0,1]),hash:"SHA-256"};async function S(e){if(!crypto.subtle)throw new Error("WebCrypto is not available in this browser.");const t=await crypto.subtle.generateKey(I,!0,["sign","verify"]),r=new Uint8Array(await crypto.subtle.exportKey("spki",t.publicKey)),n=d(R(0),h(e),r,C(0,new Uint8Array)),i=new Uint8Array(await crypto.subtle.sign("RSASSA-PKCS1-v1_5",t.privateKey,L(n))),o=d(n,d(b("1.2.840.113549.1.1.11"),T()),x(i)),l=new Uint8Array(await crypto.subtle.exportKey("pkcs8",t.privateKey));return{privateKey:t.privateKey,privateKeyPKCS8Base64:y(l),publicKeySPKIBase64:y(r),csrPEM:k("CERTIFICATE REQUEST",o),csrBase64:y(o)}}function q(e){if(!e.certificateBase64&&!e.certificatePEM)throw new Error("certificateBase64 or certificatePEM is required.");const t=u.forge.pki.privateKeyFromPem(F("PRIVATE KEY",e.privateKeyPKCS8Base64)),r=e.certificatePEM?u.forge.pki.certificateFromPem(e.certificatePEM):u.forge.pki.certificateFromAsn1(u.forge.asn1.fromDer(u.forge.util.createBuffer(N(e.certificateBase64)))),n=u.forge.pkcs12.toPkcs12Asn1(t,[r],e.password,{algorithm:"3des",friendlyName:e.friendlyName}),i=u.forge.asn1.toDer(n).getBytes();return O(i)}function h(e){const t=[v("2.5.4.3",K(e.commonName))];return e.emailAddress&&t.push(v("1.2.840.113549.1.9.1",E(e.emailAddress))),d(...t)}function v(e,t){return B(d(b(e),t))}function d(...e){return c(48,A(...e))}function B(...e){return c(49,A(...e))}function C(e,t){return c(160+e,t)}function R(e){return c(2,new Uint8Array([e]))}function T(){return new Uint8Array([5,0])}function K(e){return c(12,new TextEncoder().encode(e))}function E(e){return c(22,new TextEncoder().encode(e))}function x(e){return c(3,A(new Uint8Array([0]),e))}function b(e){const t=e.split(".").map(n=>parseInt(n,10));if(t.length<2||t.some(n=>!Number.isFinite(n)))throw new Error(`Invalid OID: ${e}`);const r=[t[0]*40+t[1]];for(const n of t.slice(2)){const i=[n&127];let o=n>>7;for(;o>0;)i.unshift(o&127|128),o>>=7;r.push(...i)}return c(6,new Uint8Array(r))}function c(e,t){return A(new Uint8Array([e]),U(t.byteLength),t)}function U(e){if(e<128)return new Uint8Array([e]);const t=[];let r=e;for(;r>0;)t.unshift(r&255),r>>=8;return new Uint8Array([128|t.length,...t])}function A(...e){const t=e.reduce((i,o)=>i+o.byteLength,0),r=new Uint8Array(t);let n=0;for(const i of e)r.set(i,n),n+=i.byteLength;return r}function k(e,t){const n=y(t).match(/.{1,64}/g)??[];return`-----BEGIN ${e}-----
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("../client-C9z_sgOf.js"),f=require("../index-ChhtuQ7e.js"),B=require("../gsa-srp-CCIfUz7Y.js"),a=require("../provisioning-CbC4h--7.js"),T={name:"RSASSA-PKCS1-v1_5",modulusLength:2048,publicExponent:new Uint8Array([1,0,1]),hash:"SHA-256"};async function K(e){if(!crypto.subtle)throw new Error("WebCrypto is not available in this browser.");const t=await crypto.subtle.generateKey(T,!0,["sign","verify"]),r=new Uint8Array(await crypto.subtle.exportKey("spki",t.publicKey)),n=A(U(0),$(e),r,x(0,new Uint8Array)),o=new Uint8Array(await crypto.subtle.sign("RSASSA-PKCS1-v1_5",t.privateKey,M(n))),i=A(n,A(C("1.2.840.113549.1.1.11"),L()),N(o)),p=new Uint8Array(await crypto.subtle.exportKey("pkcs8",t.privateKey));return{privateKey:t.privateKey,privateKeyPKCS8Base64:w(p),publicKeySPKIBase64:w(r),csrPEM:V("CERTIFICATE REQUEST",i),csrBase64:w(i)}}function E(e){if(!e.certificateBase64&&!e.certificatePEM)throw new Error("certificateBase64 or certificatePEM is required.");const t=f.forge.pki.privateKeyFromPem(H("PRIVATE KEY",e.privateKeyPKCS8Base64)),r=e.certificatePEM?f.forge.pki.certificateFromPem(e.certificatePEM):f.forge.pki.certificateFromAsn1(f.forge.asn1.fromDer(f.forge.util.createBuffer(G(e.certificateBase64)))),n=f.forge.pkcs12.toPkcs12Asn1(t,[r],e.password,{algorithm:"3des",friendlyName:e.friendlyName}),o=f.forge.asn1.toDer(n).getBytes();return W(o)}function $(e){const t=[D("2.5.4.3",O(e.commonName))];return e.emailAddress&&t.push(D("1.2.840.113549.1.9.1",F(e.emailAddress))),A(...t)}function D(e,t){return k(A(C(e),t))}function A(...e){return u(48,b(...e))}function k(...e){return u(49,b(...e))}function x(e,t){return u(160+e,t)}function U(e){return u(2,new Uint8Array([e]))}function L(){return new Uint8Array([5,0])}function O(e){return u(12,new TextEncoder().encode(e))}function F(e){return u(22,new TextEncoder().encode(e))}function N(e){return u(3,b(new Uint8Array([0]),e))}function C(e){const t=e.split(".").map(n=>parseInt(n,10));if(t.length<2||t.some(n=>!Number.isFinite(n)))throw new Error(`Invalid OID: ${e}`);const r=[t[0]*40+t[1]];for(const n of t.slice(2)){const o=[n&127];let i=n>>7;for(;i>0;)o.unshift(i&127|128),i>>=7;r.push(...o)}return u(6,new Uint8Array(r))}function u(e,t){return b(new Uint8Array([e]),z(t.byteLength),t)}function z(e){if(e<128)return new Uint8Array([e]);const t=[];let r=e;for(;r>0;)t.unshift(r&255),r>>=8;return new Uint8Array([128|t.length,...t])}function b(...e){const t=e.reduce((o,i)=>o+i.byteLength,0),r=new Uint8Array(t);let n=0;for(const o of e)r.set(o,n),n+=o.byteLength;return r}function V(e,t){const n=w(t).match(/.{1,64}/g)??[];return`-----BEGIN ${e}-----
2
2
  ${n.join(`
3
3
  `)}
4
4
  -----END ${e}-----
5
- `}function F(e,t){const r=t.match(/.{1,64}/g)??[];return`-----BEGIN ${e}-----
5
+ `}function H(e,t){const r=t.match(/.{1,64}/g)??[];return`-----BEGIN ${e}-----
6
6
  ${r.join(`
7
7
  `)}
8
8
  -----END ${e}-----
9
- `}function y(e){let t="";for(const r of e)t+=String.fromCharCode(r);return btoa(t)}function O(e){return btoa(e)}function N(e){return atob(e)}function L(e){const t=new Uint8Array(e.byteLength);return t.set(e),t.buffer}async function a({relay:e,request:t,label:r="Apple Developer Portal request",validatePortalResponse:n=!0,mapBody:i}){const o=await s.proxyProvisioningRequest(e,t);return n&&g(o.body,r),i?i(o.body,o):o}async function $(e){return a({...e,request:p.listTeamsRequest(),label:"Apple Developer team list",mapBody:t=>ne([...t?.teams??[],...t?.availableProviders??[],...t?.provider?[t.provider]:[]])})}async function W({certificateKind:e="development",teamId:t="",...r}){return a({...r,request:e==="distribution"?p.findDistributionCertificatesRequest(t):p.findDevelopmentCertificatesRequest(t),label:"Apple Developer certificate list",mapBody:n=>n?.certRequests??[]})}async function G({certificateKind:e="development",teamId:t="",csrPEM:r,...n}){return a({...n,request:e==="distribution"?p.submitDistributionCSRRequest({csrPEM:r,teamID:t}):p.submitDevelopmentCSRRequest({csrPEM:r,teamID:t}),label:e==="distribution"?"Apple Distribution certificate creation":"Apple Development certificate creation",mapBody:i=>i?.certRequest})}async function H({certificateKind:e="development",certificateId:t,teamId:r="",...n}){return a({...n,request:e==="distribution"?p.downloadDistributionCertificateRequest(t,r):p.downloadCertificateRequest(t,r),label:"Apple certificate download",validatePortalResponse:!1,mapBody:(i,o)=>o})}async function M({certificateKind:e="development",certificateId:t,teamId:r="",...n}){return a({...n,request:{method:"POST",path:"/account/ios/certificate/revokeCertificate.action",payload:{teamId:r,certificateId:t,type:e==="distribution"?"WXV89964HE":"83Q87W3TGH"}},label:"Apple certificate deletion",mapBody:i=>i})}async function _({teamId:e="",search:t="",...r}){const n=t.trim().toLowerCase();return a({...r,request:p.findBundleIDRequest({bundleID:t,teamID:e}),label:"Apple bundle ID list",mapBody:i=>{const o=i?.appIds??[];return n?o.filter(l=>[l.identifier,l.bundleId,l.name].some(f=>typeof f=="string"&&f.toLowerCase().includes(n))):o}})}async function j({teamId:e="",bundleId:t,name:r,...n}){return a({...n,request:p.createBundleIDRequest({bundleID:t,teamID:e,name:r}),label:"Apple bundle ID creation",mapBody:i=>i?.appId})}async function V({teamId:e="",appIdId:t,bundleId:r,name:n,...i}){return a({...i,request:{method:"POST",path:"/account/ios/identifiers/updateAppId.action",payload:{teamId:e,appIdId:t,...r?{identifier:r}:{},...n?{name:n}:{}}},label:"Apple bundle ID update",mapBody:o=>o?.appId})}async function Q({teamId:e="",appIdId:t,...r}){return a({...r,request:{method:"POST",path:"/account/ios/identifiers/deleteAppId.action",payload:{teamId:e,appIdId:t}},label:"Apple bundle ID deletion",mapBody:n=>n})}async function z({teamId:e="",deviceUDID:t="",...r}){const n=D(t);return a({...r,request:p.findDeviceRequest({deviceUDID:t,teamID:e}),label:"Apple device list",mapBody:i=>{const o=i?.devices??[];return n?o.filter(l=>D(l.deviceNumber)===n):o}})}function D(e){return(e??"").replace(/-/g,"").replace(/[^a-fA-F0-9]/g,"").toUpperCase()}async function J({teamId:e="",deviceUDID:t,name:r,...n}){return a({...n,request:p.registerDeviceRequest({deviceUDID:t,teamID:e,name:r}),label:"Apple device registration",mapBody:i=>i?.device})}async function X({teamId:e="",deviceId:t,name:r,...n}){return a({...n,request:{method:"POST",path:"/account/ios/device/updateDevice.action",payload:{teamId:e,deviceId:t,...r?{name:r}:{}}},label:"Apple device update",mapBody:i=>i?.device})}async function Y({teamId:e="",deviceId:t,...r}){return a({...r,request:{method:"POST",path:"/account/ios/device/deleteDevice.action",payload:{teamId:e,deviceId:t}},label:"Apple device deletion",mapBody:n=>n})}async function Z({profileKind:e="development",teamId:t="",bundleId:r="",...n}){return a({...n,request:e==="adhoc"?p.findAdHocProfilesRequest({bundleID:r,teamID:t}):p.findDevelopmentProfilesRequest({bundleID:r,teamID:t}),label:"Apple provisioning profile list",mapBody:i=>i?.provisioningProfiles??[]})}async function ee({profileKind:e="development",teamId:t="",bundleId:r,appIdId:n,certificateIds:i,deviceIds:o,name:l,...f}){const[m]=i;if(!m)throw new Error("At least one certificate ID is required to create an Apple provisioning profile.");return a({...f,request:e==="adhoc"?p.createAdHocProfileRequest({bundleID:r,teamID:t,appIDID:n,certificateID:m,deviceIDs:o,name:l}):p.createDevelopmentProfileRequest({bundleID:r,teamID:t,appIDID:n,certificateID:m,deviceIDs:o,name:l}),label:"Apple provisioning profile creation",mapBody:w=>w?.provisioningProfile})}async function te({teamId:e="",profileId:t,...r}){return a({...r,request:p.downloadProfileRequest(t,e),label:"Apple provisioning profile download",validatePortalResponse:!1,mapBody:(n,i)=>i})}async function re({teamId:e="",profileId:t,...r}){return a({...r,request:{method:"POST",path:"/account/ios/profile/deleteProvisioningProfile.action",payload:{teamId:e,provisioningProfileId:t}},label:"Apple provisioning profile deletion",mapBody:n=>n})}function g(e,t){if(!e)throw new Error(`${t} returned an empty response.`);if(e.resultCode!==void 0&&e.resultCode!==0)throw new Error(`${t} failed: ${e.userString??e.resultString??e.resultCode}`)}function ne(e){const t=new Set,r=[];for(const n of e){const i=String(n.teamId??n.providerId??n.publicProviderId??n.name??JSON.stringify(n));t.has(i)||(t.add(i),r.push(n))}return r}exports.AppleRelayWebSocketClient=s.AppleRelayWebSocketClient;exports.fetchAppleAccountSession=s.fetchAppleAccountSession;exports.openAppleRelayWebSocket=s.openAppleRelayWebSocket;exports.proxyPhoneTwoFactorCode=s.proxyPhoneTwoFactorCode;exports.proxySrpComplete=s.proxySrpComplete;exports.proxySrpInit=s.proxySrpInit;exports.proxyTwoFactorCode=s.proxyTwoFactorCode;exports.startBrowserOwnedAppleIDLogin=s.startBrowserOwnedAppleIDLogin;exports.triggerPhoneTwoFactor=s.triggerPhoneTwoFactor;exports.triggerTrustedDeviceTwoFactor=s.triggerTrustedDeviceTwoFactor;exports.AppleGsaSrpClient=P.AppleGsaSrpClient;exports.assertAppleDeveloperPortalResponseOK=g;exports.createAppleBundleID=j;exports.createAppleCertificate=G;exports.createAppleProfile=ee;exports.deleteAppleBundleID=Q;exports.deleteAppleCertificate=M;exports.deleteAppleDevice=Y;exports.deleteAppleProfile=re;exports.downloadAppleCertificate=H;exports.downloadAppleProfile=te;exports.exportAppleCertificateP12=q;exports.generateAppleSigningKeyAndCSR=S;exports.listAppleBundleIDs=_;exports.listAppleCertificates=W;exports.listAppleDevices=z;exports.listAppleProfiles=Z;exports.listAppleTeams=$;exports.registerAppleDevice=J;exports.requestAppleProvisioning=a;exports.updateAppleBundleID=V;exports.updateAppleDevice=X;
9
+ `}function w(e){let t="";for(const r of e)t+=String.fromCharCode(r);return btoa(t)}function W(e){return btoa(e)}function G(e){return atob(e)}function M(e){const t=new Uint8Array(e.byteLength);return t.set(e),t.buffer}async function c({relay:e,request:t,label:r="Apple Developer Portal request",validatePortalResponse:n=!0,mapBody:o}){const i=await s.proxyProvisioningRequest(e,t);return n&&q(i.body,r),o?o(i.body,i):i}async function _(e){return c({...e,request:a.listTeamsRequest(),label:"Apple Developer team list",mapBody:t=>Ae([...t?.teams??[],...t?.availableProviders??[],...t?.provider?[t.provider]:[]])})}async function j({certificateKind:e="development",teamId:t="",...r}){return c({...r,request:e==="distribution"?a.findDistributionCertificatesRequest(t):a.findDevelopmentCertificatesRequest(t),label:"Apple Developer certificate list",mapBody:n=>n?.certRequests??[]})}async function Q({certificateKind:e="development",teamId:t="",csrPEM:r,...n}){return c({...n,request:e==="distribution"?a.submitDistributionCSRRequest({csrPEM:r,teamID:t}):a.submitDevelopmentCSRRequest({csrPEM:r,teamID:t}),label:e==="distribution"?"Apple Distribution certificate creation":"Apple Development certificate creation",mapBody:o=>o?.certRequest})}async function J({certificateKind:e="development",certificateId:t,teamId:r="",...n}){return c({...n,request:e==="distribution"?a.downloadDistributionCertificateRequest(t,r):a.downloadCertificateRequest(t,r),label:"Apple certificate download",validatePortalResponse:!1,mapBody:(o,i)=>i})}async function X({certificateKind:e="development",certificateId:t,teamId:r="",...n}){return c({...n,request:{method:"POST",path:"/account/ios/certificate/revokeCertificate.action",payload:{teamId:r,certificateId:t,type:e==="distribution"?"WXV89964HE":"83Q87W3TGH"}},label:"Apple certificate deletion",mapBody:o=>o})}async function Y({teamId:e="",search:t="",...r}){const n=t.trim().toLowerCase();return c({...r,request:a.findBundleIDRequest({bundleID:t,teamID:e}),label:"Apple bundle ID list",mapBody:o=>{const i=o?.appIds??[];return n?i.filter(p=>[p.identifier,p.bundleId,p.name].some(l=>typeof l=="string"&&l.toLowerCase().includes(n))):i}})}async function Z({teamId:e="",bundleId:t,name:r,...n}){return c({...n,request:a.createBundleIDRequest({bundleID:t,teamID:e,name:r}),label:"Apple bundle ID creation",mapBody:o=>o?.appId})}async function ee({teamId:e="",appIdId:t,bundleId:r,name:n,...o}){return c({...o,request:{method:"POST",path:"/account/ios/identifiers/updateAppId.action",payload:{teamId:e,appIdId:t,...r?{identifier:r}:{},...n?{name:n}:{}}},label:"Apple bundle ID update",mapBody:i=>i?.appId})}async function te({teamId:e="",appIdId:t,...r}){return c({...r,request:{method:"POST",path:"/account/ios/identifiers/deleteAppId.action",payload:{teamId:e,appIdId:t}},label:"Apple bundle ID deletion",mapBody:n=>n})}async function re({teamId:e="",deviceUDID:t="",...r}){const n=I(t);return c({...r,request:a.findDeviceRequest({deviceUDID:t,teamID:e}),label:"Apple device list",mapBody:o=>{const i=o?.devices??[];return n?i.filter(p=>I(p.deviceNumber)===n):i}})}function I(e){return(e??"").replace(/-/g,"").replace(/[^a-fA-F0-9]/g,"").toUpperCase()}async function ne({teamId:e="",deviceUDID:t,name:r,...n}){return c({...n,request:a.registerDeviceRequest({deviceUDID:t,teamID:e,name:r}),label:"Apple device registration",mapBody:o=>o?.device})}async function oe({teamId:e="",deviceId:t,name:r,...n}){return c({...n,request:{method:"POST",path:"/account/ios/device/updateDevice.action",payload:{teamId:e,deviceId:t,...r?{name:r}:{}}},label:"Apple device update",mapBody:o=>o?.device})}async function ie({teamId:e="",deviceId:t,...r}){return c({...r,request:{method:"POST",path:"/account/ios/device/deleteDevice.action",payload:{teamId:e,deviceId:t}},label:"Apple device deletion",mapBody:n=>n})}async function pe({profileKind:e="development",teamId:t="",bundleId:r="",...n}){return c({...n,request:e==="adhoc"?a.findAdHocProfilesRequest({bundleID:r,teamID:t}):e==="appstore"?a.findAppStoreProfilesRequest({bundleID:r,teamID:t}):a.findDevelopmentProfilesRequest({bundleID:r,teamID:t}),label:"Apple provisioning profile list",mapBody:o=>o?.provisioningProfiles??[]})}async function ae({profileKind:e="development",teamId:t="",bundleId:r,appIdId:n,certificateIds:o,deviceIds:i=[],name:p,...l}){const[d]=o;if(!d)throw new Error("At least one certificate ID is required to create an Apple provisioning profile.");let v;if(e==="appstore"){if(!p)throw new Error("An explicit name is required to create an App Store provisioning profile.");v=a.createAppStoreProfileRequest({teamID:t,appIDID:n,certificateID:d,name:p})}else e==="adhoc"?v=a.createAdHocProfileRequest({bundleID:r,teamID:t,appIDID:n,certificateID:d,deviceIDs:i,name:p}):v=a.createDevelopmentProfileRequest({bundleID:r,teamID:t,appIDID:n,certificateID:d,deviceIDs:i,name:p});return c({...l,request:v,label:"Apple provisioning profile creation",mapBody:R=>R?.provisioningProfile})}async function se({teamId:e="",profileId:t,...r}){return c({...r,request:a.downloadProfileRequest(t,e),label:"Apple provisioning profile download",validatePortalResponse:!1,mapBody:(n,o)=>o})}async function ce({teamId:e="",profileId:t,...r}){return c({...r,request:{method:"POST",path:"/account/ios/profile/deleteProvisioningProfile.action",payload:{teamId:e,provisioningProfileId:t}},label:"Apple provisioning profile deletion",mapBody:n=>n})}async function le({relay:e,providerId:t}){const r=Number(t),n=await s.proxyAppStoreConnectRequest(e,{method:"POST",path:"/olympus/v1/session",payload:{provider:{providerId:Number.isNaN(r)?t:r}}});if(n.status<200||n.status>=300)throw new Error(`App Store Connect provider switch failed: HTTP ${n.status} ${n.rawBody??""}`.trim());return n}async function ue({relay:e}){const t=await s.proxyAppStoreConnectRequest(e,{path:"/iris/v1/apiKeys"});return y(t,"App Store Connect API key list"),h(t.body?.data)}async function de({relay:e,nickname:t,roles:r=["APP_MANAGER"],allAppsVisible:n=!0}){if(!t)throw new Error("A nickname is required to create an App Store Connect API key.");const o=await s.proxyAppStoreConnectRequest(e,{method:"POST",path:"/iris/v1/apiKeys",payload:{data:{type:"apiKeys",attributes:{nickname:t,allAppsVisible:n,keyType:"PUBLIC_API",roles:r}}}});y(o,"App Store Connect API key creation");const i=m(o.body?.data);if(!i?.id)throw new Error("App Store Connect API key creation did not return a key ID.");return i}async function fe({relay:e,keyId:t}){const r=await s.proxyAppStoreConnectRequest(e,{path:`/iris/v1/apiKeys/${encodeURIComponent(t)}`,query:{"fields[apiKeys]":"privateKey",include:"provider"}});y(r,"App Store Connect API key download");const n=m(r.body?.data),o=S(n?.attributes,"privateKey");if(!o)throw new Error(`App Store Connect API key ${t} returned no private key. Apple serves it only once; revoke the key and create a new one.`);const i=(r.body?.included??[]).find(l=>l.type==="providers"),p=S(i?.attributes,"publicProviderId")??S(n?.attributes,"issuerId")??i?.id;return{privateKeyPem:o,issuerId:p}}async function P({relay:e,bundleId:t}){const r=await s.proxyAppStoreConnectRequest(e,{path:"/iris/v1/apps",query:{"filter[bundleId]":t}});return y(r,"App Store Connect app lookup"),h(r.body?.data).find(n=>S(n.attributes,"bundleId")===t)}async function g({relay:e,bundleId:t,name:r,sku:n,primaryLocale:o="en-US",versionString:i="1.0"}){if(!r)throw new Error("An app name is required to create an App Store Connect app record.");const p="IOS",l=await s.proxyAppStoreConnectRequest(e,{method:"POST",path:"/iris/v1/apps",payload:{data:{type:"apps",attributes:{sku:n||t,primaryLocale:o,bundleId:t},relationships:{appStoreVersions:{data:[{type:"appStoreVersions",id:`\${store-version-${p}}`}]},appInfos:{data:[{type:"appInfos",id:"${new-appInfo-id}"}]}}},included:[{type:"appInfos",id:"${new-appInfo-id}",relationships:{appInfoLocalizations:{data:[{type:"appInfoLocalizations",id:"${new-appInfoLocalization-id}"}]}}},{type:"appInfoLocalizations",id:"${new-appInfoLocalization-id}",attributes:{locale:o,name:r}},{type:"appStoreVersions",id:`\${store-version-${p}}`,attributes:{platform:p,versionString:i},relationships:{appStoreVersionLocalizations:{data:[{type:"appStoreVersionLocalizations",id:`\${new-${p}VersionLocalization-id}`}]}}},{type:"appStoreVersionLocalizations",id:`\${new-${p}VersionLocalization-id}`,attributes:{locale:o}}]}});y(l,"App Store Connect app creation");const d=m(l.body?.data);if(!d?.id)throw new Error("App Store Connect app creation did not return an app ID.");return d}async function ye(e){const t=await P({relay:e.relay,bundleId:e.bundleId});return t?{app:t,created:!1}:{app:await g(e),created:!0}}function y(e,t){const r=e.body?.errors;if(r&&r.length>0){const n=r.map(o=>o.detail??o.title??o.code??o.status).filter(Boolean).join("; ");throw new Error(`${t} failed: ${n||`HTTP ${e.status}`}`)}if(e.status<200||e.status>=300)throw new Error(`${t} failed: HTTP ${e.status} ${e.rawBody??""}`.trim())}function h(e){return e?Array.isArray(e)?e:[e]:[]}function m(e){if(e)return Array.isArray(e)?e[0]:e}function S(e,t){const r=e?.[t];return typeof r=="string"&&r!==""?r:void 0}function q(e,t){if(!e)throw new Error(`${t} returned an empty response.`);if(e.resultCode!==void 0&&e.resultCode!==0)throw new Error(`${t} failed: ${e.userString??e.resultString??e.resultCode}`)}function Ae(e){const t=new Set,r=[];for(const n of e){const o=String(n.teamId??n.providerId??n.publicProviderId??n.name??JSON.stringify(n));t.has(o)||(t.add(o),r.push(n))}return r}exports.AppleRelayWebSocketClient=s.AppleRelayWebSocketClient;exports.fetchAppleAccountSession=s.fetchAppleAccountSession;exports.openAppleRelayWebSocket=s.openAppleRelayWebSocket;exports.proxyAppStoreConnectRequest=s.proxyAppStoreConnectRequest;exports.proxyPhoneTwoFactorCode=s.proxyPhoneTwoFactorCode;exports.proxySrpComplete=s.proxySrpComplete;exports.proxySrpInit=s.proxySrpInit;exports.proxyTwoFactorCode=s.proxyTwoFactorCode;exports.startBrowserOwnedAppleIDLogin=s.startBrowserOwnedAppleIDLogin;exports.triggerPhoneTwoFactor=s.triggerPhoneTwoFactor;exports.triggerTrustedDeviceTwoFactor=s.triggerTrustedDeviceTwoFactor;exports.AppleGsaSrpClient=B.AppleGsaSrpClient;exports.assertAppStoreConnectResponseOK=y;exports.assertAppleDeveloperPortalResponseOK=q;exports.createAppStoreConnectApiKey=de;exports.createAppStoreConnectApp=g;exports.createAppleBundleID=Z;exports.createAppleCertificate=Q;exports.createAppleProfile=ae;exports.deleteAppleBundleID=te;exports.deleteAppleCertificate=X;exports.deleteAppleDevice=ie;exports.deleteAppleProfile=ce;exports.downloadAppStoreConnectApiKeyPrivateKey=fe;exports.downloadAppleCertificate=J;exports.downloadAppleProfile=se;exports.ensureAppStoreConnectApp=ye;exports.exportAppleCertificateP12=E;exports.findAppStoreConnectApp=P;exports.generateAppleSigningKeyAndCSR=K;exports.listAppStoreConnectApiKeys=ue;exports.listAppleBundleIDs=Y;exports.listAppleCertificates=j;exports.listAppleDevices=re;exports.listAppleProfiles=pe;exports.listAppleTeams=_;exports.registerAppleDevice=ne;exports.requestAppleProvisioning=c;exports.switchAppStoreConnectProvider=le;exports.updateAppleBundleID=ee;exports.updateAppleDevice=oe;
@@ -2,8 +2,8 @@ import { AppleDeveloperPortalAppID, AppleDeveloperPortalDevice, AppleDeveloperPo
2
2
  export * from '../core/device-install/apple/client';
3
3
  export * from '../core/device-install/apple/crypto';
4
4
  export * from '../core/device-install/apple/gsa-srp';
5
- export type { AppleDeveloperPortalAppID, AppleDeveloperPortalDevice, AppleDeveloperPortalResponse, AppleDeveloperPortalTeam, AppleProvisioningRequest, AppleRelayResponse, } from '../core/device-install/apple';
6
- export { AppleRelayWebSocketClient, fetchAppleAccountSession, openAppleRelayWebSocket, proxyPhoneTwoFactorCode, proxySrpComplete, proxySrpInit, proxyTwoFactorCode, triggerPhoneTwoFactor, triggerTrustedDeviceTwoFactor, } from '../core/device-install/apple';
5
+ export type { AppleDeveloperPortalAppID, AppleDeveloperPortalDevice, AppleDeveloperPortalResponse, AppleDeveloperPortalTeam, AppleProvisioningRequest, AppleRelayResponse, AppStoreConnectRequest, } from '../core/device-install/apple';
6
+ export { AppleRelayWebSocketClient, fetchAppleAccountSession, openAppleRelayWebSocket, proxyAppStoreConnectRequest, proxyPhoneTwoFactorCode, proxySrpComplete, proxySrpInit, proxyTwoFactorCode, triggerPhoneTwoFactor, triggerTrustedDeviceTwoFactor, } from '../core/device-install/apple';
7
7
  export type AppleRelayClientOptions = {
8
8
  relay: AppleRelayWebSocketClient;
9
9
  };
@@ -11,7 +11,7 @@ export type AppleTeamScopedOptions = AppleRelayClientOptions & {
11
11
  teamId?: string;
12
12
  };
13
13
  export type AppleCertificateKind = 'development' | 'distribution';
14
- export type AppleProfileKind = 'development' | 'adhoc';
14
+ export type AppleProfileKind = 'development' | 'adhoc' | 'appstore';
15
15
  export type RequestAppleProvisioningOptions<T = unknown> = AppleRelayClientOptions & {
16
16
  request: AppleProvisioningRequest;
17
17
  label?: string;
@@ -71,7 +71,9 @@ export type CreateAppleProfileOptions = AppleTeamScopedOptions & {
71
71
  bundleId: string;
72
72
  appIdId: string;
73
73
  certificateIds: string[];
74
- deviceIds: string[];
74
+ /** Devices the profile binds. Ignored for App Store profiles, which bind none. */
75
+ deviceIds?: string[];
76
+ /** Profile name. Required for App Store profiles; there is no default. */
75
77
  name?: string;
76
78
  };
77
79
  export type DownloadAppleProfileOptions = AppleTeamScopedOptions & {
@@ -97,4 +99,106 @@ export declare function listAppleProfiles({ profileKind, teamId, bundleId, ...op
97
99
  export declare function createAppleProfile({ profileKind, teamId, bundleId, appIdId, certificateIds, deviceIds, name, ...options }: CreateAppleProfileOptions): Promise<Record<string, unknown> | undefined>;
98
100
  export declare function downloadAppleProfile({ teamId, profileId, ...options }: DownloadAppleProfileOptions): Promise<AppleRelayResponse>;
99
101
  export declare function deleteAppleProfile({ teamId, profileId, ...options }: DeleteAppleProfileOptions): Promise<AppleDeveloperPortalResponse | undefined>;
102
+ /**
103
+ * A JSON:API resource returned by the session-authenticated App Store
104
+ * Connect API. Kept loose on purpose: the endpoint is not a public contract
105
+ * and Apple adds attributes freely.
106
+ */
107
+ export type AppStoreConnectResource = {
108
+ type?: string;
109
+ id?: string;
110
+ attributes?: Record<string, unknown>;
111
+ relationships?: Record<string, unknown>;
112
+ };
113
+ type AppStoreConnectEnvelope = {
114
+ data?: AppStoreConnectResource | AppStoreConnectResource[];
115
+ included?: AppStoreConnectResource[];
116
+ errors?: Array<{
117
+ status?: string;
118
+ code?: string;
119
+ title?: string;
120
+ detail?: string;
121
+ }>;
122
+ };
123
+ export type SwitchAppStoreConnectProviderOptions = AppleRelayClientOptions & {
124
+ /** The numeric provider ID of the team, from the team list's providerId. */
125
+ providerId: string | number;
126
+ };
127
+ /**
128
+ * Points the App Store Connect session at the given team (provider). Must
129
+ * run before any other App Store Connect call when the account belongs to
130
+ * multiple teams, because the session carries an active provider.
131
+ */
132
+ export declare function switchAppStoreConnectProvider({ relay, providerId, }: SwitchAppStoreConnectProviderOptions): Promise<AppleRelayResponse<Record<string, unknown>>>;
133
+ /**
134
+ * Roles Apple accepts on App Store Connect API keys. APP_MANAGER is enough
135
+ * to upload builds and manage TestFlight, which is why it is the default
136
+ * for keys minted by ensureAppStoreConnectApiKeySecret.
137
+ */
138
+ export type AppStoreConnectApiKeyRole = 'ADMIN' | 'APP_MANAGER' | 'CUSTOMER_SUPPORT' | 'DEVELOPER' | 'FINANCE' | 'MARKETING' | 'SALES';
139
+ export type ListAppStoreConnectApiKeysOptions = AppleRelayClientOptions;
140
+ /** Lists the team's App Store Connect API keys. Requires an Admin session. */
141
+ export declare function listAppStoreConnectApiKeys({ relay }: ListAppStoreConnectApiKeysOptions): Promise<AppStoreConnectResource[]>;
142
+ export type CreateAppStoreConnectApiKeyOptions = AppleRelayClientOptions & {
143
+ /** Display name of the key. Required; implementors brand keys themselves. */
144
+ nickname: string;
145
+ roles?: AppStoreConnectApiKeyRole[];
146
+ allAppsVisible?: boolean;
147
+ };
148
+ /**
149
+ * Creates a team App Store Connect API key through the logged-in session,
150
+ * the same way the App Store Connect website does. The session user must
151
+ * be a team Admin. The private key is NOT part of the response; download
152
+ * it once with downloadAppStoreConnectApiKeyPrivateKey.
153
+ */
154
+ export declare function createAppStoreConnectApiKey({ relay, nickname, roles, allAppsVisible, }: CreateAppStoreConnectApiKeyOptions): Promise<AppStoreConnectResource>;
155
+ export type DownloadAppStoreConnectApiKeyOptions = AppleRelayClientOptions & {
156
+ keyId: string;
157
+ };
158
+ export type DownloadedAppStoreConnectApiKey = {
159
+ /** PEM contents of the .p8 private key. */
160
+ privateKeyPem: string;
161
+ /** Issuer ID for JWTs signed with this key, when Apple returned it. */
162
+ issuerId?: string;
163
+ };
164
+ /**
165
+ * Downloads the private half of an App Store Connect API key. Apple serves
166
+ * it exactly once per key; afterwards the sparse fieldset comes back empty
167
+ * and the key must be revoked and re-minted.
168
+ */
169
+ export declare function downloadAppStoreConnectApiKeyPrivateKey({ relay, keyId, }: DownloadAppStoreConnectApiKeyOptions): Promise<DownloadedAppStoreConnectApiKey>;
170
+ export type FindAppStoreConnectAppOptions = AppleRelayClientOptions & {
171
+ bundleId: string;
172
+ };
173
+ /** Looks up the App Store Connect app record for a bundle ID, if any. */
174
+ export declare function findAppStoreConnectApp({ relay, bundleId }: FindAppStoreConnectAppOptions): Promise<AppStoreConnectResource | undefined>;
175
+ export type CreateAppStoreConnectAppOptions = AppleRelayClientOptions & {
176
+ bundleId: string;
177
+ /** App name shown on the App Store. Required; there is no default. */
178
+ name: string;
179
+ /** Unique internal identifier. Defaults to the bundle ID. */
180
+ sku?: string;
181
+ /** Primary App Store locale. Defaults to en-US. */
182
+ primaryLocale?: string;
183
+ /** Version string of the first App Store version. Defaults to 1.0. */
184
+ versionString?: string;
185
+ };
186
+ /**
187
+ * Creates the App Store Connect app record for a bundle ID. Only the
188
+ * session-authenticated API can create app records (the key-authenticated
189
+ * public API cannot), which is why this goes through the relay. The body
190
+ * mirrors what the App Store Connect website and fastlane's produce send.
191
+ */
192
+ export declare function createAppStoreConnectApp({ relay, bundleId, name, sku, primaryLocale, versionString, }: CreateAppStoreConnectAppOptions): Promise<AppStoreConnectResource>;
193
+ export type EnsureAppStoreConnectAppOptions = CreateAppStoreConnectAppOptions;
194
+ /**
195
+ * Returns the App Store Connect app record for the bundle ID, creating it
196
+ * when it does not exist yet. A first-time IPA upload fails without an app
197
+ * record, so run this before the first publish of a new bundle ID.
198
+ */
199
+ export declare function ensureAppStoreConnectApp(options: EnsureAppStoreConnectAppOptions): Promise<{
200
+ app: AppStoreConnectResource;
201
+ created: boolean;
202
+ }>;
203
+ export declare function assertAppStoreConnectResponseOK(response: AppleRelayResponse<AppStoreConnectEnvelope>, label: string): void;
100
204
  export declare function assertAppleDeveloperPortalResponseOK(response: AppleDeveloperPortalResponse | undefined, label: string): void;