@ankhorage/deploy 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (214) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +1 -1
  3. package/dist/domain/IosDeploymentIntent.d.ts +5 -0
  4. package/dist/domain/IosDeploymentIntent.d.ts.map +1 -0
  5. package/dist/domain/IosDeploymentIntent.js +2 -0
  6. package/dist/domain/IosDeploymentIntent.js.map +1 -0
  7. package/dist/domain/IosDeploymentPublication.d.ts +10 -0
  8. package/dist/domain/IosDeploymentPublication.d.ts.map +1 -0
  9. package/dist/domain/IosDeploymentPublication.js +2 -0
  10. package/dist/domain/IosDeploymentPublication.js.map +1 -0
  11. package/dist/index.d.ts +2 -0
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js.map +1 -1
  14. package/dist/project/index.d.ts +6 -0
  15. package/dist/project/index.d.ts.map +1 -1
  16. package/dist/project/index.js +3 -0
  17. package/dist/project/index.js.map +1 -1
  18. package/dist/project/ios/ProjectIosDeploymentAccess.d.ts +7 -0
  19. package/dist/project/ios/ProjectIosDeploymentAccess.d.ts.map +1 -0
  20. package/dist/project/ios/ProjectIosDeploymentAccess.js +2 -0
  21. package/dist/project/ios/ProjectIosDeploymentAccess.js.map +1 -0
  22. package/dist/project/ios/ProjectIosDeploymentExecution.d.ts +12 -0
  23. package/dist/project/ios/ProjectIosDeploymentExecution.d.ts.map +1 -0
  24. package/dist/project/ios/ProjectIosDeploymentExecution.js +2 -0
  25. package/dist/project/ios/ProjectIosDeploymentExecution.js.map +1 -0
  26. package/dist/project/ios/ProjectIosDeploymentInspection.d.ts +21 -0
  27. package/dist/project/ios/ProjectIosDeploymentInspection.d.ts.map +1 -0
  28. package/dist/project/ios/ProjectIosDeploymentInspection.js +2 -0
  29. package/dist/project/ios/ProjectIosDeploymentInspection.js.map +1 -0
  30. package/dist/project/ios/ProjectIosDeploymentRuntime.d.ts +19 -0
  31. package/dist/project/ios/ProjectIosDeploymentRuntime.d.ts.map +1 -0
  32. package/dist/project/ios/ProjectIosDeploymentRuntime.js +22 -0
  33. package/dist/project/ios/ProjectIosDeploymentRuntime.js.map +1 -0
  34. package/dist/project/ios/ProjectIosExecutionState.d.ts +12 -0
  35. package/dist/project/ios/ProjectIosExecutionState.d.ts.map +1 -0
  36. package/dist/project/ios/ProjectIosExecutionState.js +2 -0
  37. package/dist/project/ios/ProjectIosExecutionState.js.map +1 -0
  38. package/dist/project/ios/createProjectIosDeploymentPlan.d.ts +4 -0
  39. package/dist/project/ios/createProjectIosDeploymentPlan.d.ts.map +1 -0
  40. package/dist/project/ios/createProjectIosDeploymentPlan.js +13 -0
  41. package/dist/project/ios/createProjectIosDeploymentPlan.js.map +1 -0
  42. package/dist/project/ios/executeProjectIosDeployment.d.ts +12 -0
  43. package/dist/project/ios/executeProjectIosDeployment.d.ts.map +1 -0
  44. package/dist/project/ios/executeProjectIosDeployment.js +160 -0
  45. package/dist/project/ios/executeProjectIosDeployment.js.map +1 -0
  46. package/dist/project/ios/executeProjectIosStep.d.ts +15 -0
  47. package/dist/project/ios/executeProjectIosStep.d.ts.map +1 -0
  48. package/dist/project/ios/executeProjectIosStep.js +171 -0
  49. package/dist/project/ios/executeProjectIosStep.js.map +1 -0
  50. package/dist/project/ios/inspectProjectIosAppStoreConnect.d.ts +15 -0
  51. package/dist/project/ios/inspectProjectIosAppStoreConnect.d.ts.map +1 -0
  52. package/dist/project/ios/inspectProjectIosAppStoreConnect.js +55 -0
  53. package/dist/project/ios/inspectProjectIosAppStoreConnect.js.map +1 -0
  54. package/dist/project/ios/inspectProjectIosDeployment.d.ts +11 -0
  55. package/dist/project/ios/inspectProjectIosDeployment.d.ts.map +1 -0
  56. package/dist/project/ios/inspectProjectIosDeployment.js +96 -0
  57. package/dist/project/ios/inspectProjectIosDeployment.js.map +1 -0
  58. package/dist/project/ios/inspectProjectIosEasSetup.d.ts +5 -0
  59. package/dist/project/ios/inspectProjectIosEasSetup.d.ts.map +1 -0
  60. package/dist/project/ios/inspectProjectIosEasSetup.js +18 -0
  61. package/dist/project/ios/inspectProjectIosEasSetup.js.map +1 -0
  62. package/dist/project/ios/normalizeProjectIosDesired.d.ts +13 -0
  63. package/dist/project/ios/normalizeProjectIosDesired.d.ts.map +1 -0
  64. package/dist/project/ios/normalizeProjectIosDesired.js +25 -0
  65. package/dist/project/ios/normalizeProjectIosDesired.js.map +1 -0
  66. package/dist/project/ios/readCurrentProjectIosDeployment.d.ts +8 -0
  67. package/dist/project/ios/readCurrentProjectIosDeployment.d.ts.map +1 -0
  68. package/dist/project/ios/readCurrentProjectIosDeployment.js +52 -0
  69. package/dist/project/ios/readCurrentProjectIosDeployment.js.map +1 -0
  70. package/dist/project/ios/recordProjectIosDeployment.d.ts +21 -0
  71. package/dist/project/ios/recordProjectIosDeployment.d.ts.map +1 -0
  72. package/dist/project/ios/recordProjectIosDeployment.js +36 -0
  73. package/dist/project/ios/recordProjectIosDeployment.js.map +1 -0
  74. package/dist/project/ios/resolveProjectIosDeploymentAccess.d.ts +9 -0
  75. package/dist/project/ios/resolveProjectIosDeploymentAccess.d.ts.map +1 -0
  76. package/dist/project/ios/resolveProjectIosDeploymentAccess.js +7 -0
  77. package/dist/project/ios/resolveProjectIosDeploymentAccess.js.map +1 -0
  78. package/dist/project/ios/scopeProjectIosDeploymentAccess.d.ts +3 -0
  79. package/dist/project/ios/scopeProjectIosDeploymentAccess.d.ts.map +1 -0
  80. package/dist/project/ios/scopeProjectIosDeploymentAccess.js +7 -0
  81. package/dist/project/ios/scopeProjectIosDeploymentAccess.js.map +1 -0
  82. package/dist/providers/appStoreConnect/AppStoreConnectIosState.d.ts +17 -0
  83. package/dist/providers/appStoreConnect/AppStoreConnectIosState.d.ts.map +1 -0
  84. package/dist/providers/appStoreConnect/AppStoreConnectIosState.js +2 -0
  85. package/dist/providers/appStoreConnect/AppStoreConnectIosState.js.map +1 -0
  86. package/dist/providers/appStoreConnect/AppStoreConnectPublicationResult.d.ts +19 -0
  87. package/dist/providers/appStoreConnect/AppStoreConnectPublicationResult.d.ts.map +1 -0
  88. package/dist/providers/appStoreConnect/AppStoreConnectPublicationResult.js +2 -0
  89. package/dist/providers/appStoreConnect/AppStoreConnectPublicationResult.js.map +1 -0
  90. package/dist/providers/appStoreConnect/AppStoreConnectRequestTracker.d.ts +9 -0
  91. package/dist/providers/appStoreConnect/AppStoreConnectRequestTracker.d.ts.map +1 -0
  92. package/dist/providers/appStoreConnect/AppStoreConnectRequestTracker.js +13 -0
  93. package/dist/providers/appStoreConnect/AppStoreConnectRequestTracker.js.map +1 -0
  94. package/dist/providers/appStoreConnect/AppStoreConnectTokenFactory.d.ts +8 -0
  95. package/dist/providers/appStoreConnect/AppStoreConnectTokenFactory.d.ts.map +1 -0
  96. package/dist/providers/appStoreConnect/AppStoreConnectTokenFactory.js +21 -0
  97. package/dist/providers/appStoreConnect/AppStoreConnectTokenFactory.js.map +1 -0
  98. package/dist/providers/appStoreConnect/AppStoreConnectTransport.d.ts +13 -0
  99. package/dist/providers/appStoreConnect/AppStoreConnectTransport.d.ts.map +1 -0
  100. package/dist/providers/appStoreConnect/AppStoreConnectTransport.js +15 -0
  101. package/dist/providers/appStoreConnect/AppStoreConnectTransport.js.map +1 -0
  102. package/dist/providers/appStoreConnect/AppStoreUploadTransport.d.ts +17 -0
  103. package/dist/providers/appStoreConnect/AppStoreUploadTransport.d.ts.map +1 -0
  104. package/dist/providers/appStoreConnect/AppStoreUploadTransport.js +12 -0
  105. package/dist/providers/appStoreConnect/AppStoreUploadTransport.js.map +1 -0
  106. package/dist/providers/appStoreConnect/BuildUploadOperation.d.ts +13 -0
  107. package/dist/providers/appStoreConnect/BuildUploadOperation.d.ts.map +1 -0
  108. package/dist/providers/appStoreConnect/BuildUploadOperation.js +2 -0
  109. package/dist/providers/appStoreConnect/BuildUploadOperation.js.map +1 -0
  110. package/dist/providers/appStoreConnect/appStoreConnectUrls.d.ts +10 -0
  111. package/dist/providers/appStoreConnect/appStoreConnectUrls.d.ts.map +1 -0
  112. package/dist/providers/appStoreConnect/appStoreConnectUrls.js +42 -0
  113. package/dist/providers/appStoreConnect/appStoreConnectUrls.js.map +1 -0
  114. package/dist/providers/appStoreConnect/attachAppStoreVersionBuild.d.ts +8 -0
  115. package/dist/providers/appStoreConnect/attachAppStoreVersionBuild.d.ts.map +1 -0
  116. package/dist/providers/appStoreConnect/attachAppStoreVersionBuild.js +12 -0
  117. package/dist/providers/appStoreConnect/attachAppStoreVersionBuild.js.map +1 -0
  118. package/dist/providers/appStoreConnect/commitAppStoreBuildUploadFile.d.ts +7 -0
  119. package/dist/providers/appStoreConnect/commitAppStoreBuildUploadFile.d.ts.map +1 -0
  120. package/dist/providers/appStoreConnect/commitAppStoreBuildUploadFile.js +18 -0
  121. package/dist/providers/appStoreConnect/commitAppStoreBuildUploadFile.js.map +1 -0
  122. package/dist/providers/appStoreConnect/createAppStoreBuildUpload.d.ts +9 -0
  123. package/dist/providers/appStoreConnect/createAppStoreBuildUpload.d.ts.map +1 -0
  124. package/dist/providers/appStoreConnect/createAppStoreBuildUpload.js +41 -0
  125. package/dist/providers/appStoreConnect/createAppStoreBuildUpload.js.map +1 -0
  126. package/dist/providers/appStoreConnect/createAppStoreConnectSetupAdapter.d.ts +7 -0
  127. package/dist/providers/appStoreConnect/createAppStoreConnectSetupAdapter.d.ts.map +1 -0
  128. package/dist/providers/appStoreConnect/createAppStoreConnectSetupAdapter.js +33 -0
  129. package/dist/providers/appStoreConnect/createAppStoreConnectSetupAdapter.js.map +1 -0
  130. package/dist/providers/appStoreConnect/downloadIosArchive.d.ts +9 -0
  131. package/dist/providers/appStoreConnect/downloadIosArchive.d.ts.map +1 -0
  132. package/dist/providers/appStoreConnect/downloadIosArchive.js +28 -0
  133. package/dist/providers/appStoreConnect/downloadIosArchive.js.map +1 -0
  134. package/dist/providers/appStoreConnect/executeBuildUploadOperations.d.ts +8 -0
  135. package/dist/providers/appStoreConnect/executeBuildUploadOperations.d.ts.map +1 -0
  136. package/dist/providers/appStoreConnect/executeBuildUploadOperations.js +15 -0
  137. package/dist/providers/appStoreConnect/executeBuildUploadOperations.js.map +1 -0
  138. package/dist/providers/appStoreConnect/inspectAppStoreConnectIos.d.ts +27 -0
  139. package/dist/providers/appStoreConnect/inspectAppStoreConnectIos.d.ts.map +1 -0
  140. package/dist/providers/appStoreConnect/inspectAppStoreConnectIos.js +177 -0
  141. package/dist/providers/appStoreConnect/inspectAppStoreConnectIos.js.map +1 -0
  142. package/dist/providers/appStoreConnect/parseBuildUploadFileReservation.d.ts +3 -0
  143. package/dist/providers/appStoreConnect/parseBuildUploadFileReservation.d.ts.map +1 -0
  144. package/dist/providers/appStoreConnect/parseBuildUploadFileReservation.js +81 -0
  145. package/dist/providers/appStoreConnect/parseBuildUploadFileReservation.js.map +1 -0
  146. package/dist/providers/appStoreConnect/prepareAppStoreVersion.d.ts +8 -0
  147. package/dist/providers/appStoreConnect/prepareAppStoreVersion.d.ts.map +1 -0
  148. package/dist/providers/appStoreConnect/prepareAppStoreVersion.js +66 -0
  149. package/dist/providers/appStoreConnect/prepareAppStoreVersion.js.map +1 -0
  150. package/dist/providers/appStoreConnect/publishIosToAppStoreConnect.d.ts +21 -0
  151. package/dist/providers/appStoreConnect/publishIosToAppStoreConnect.d.ts.map +1 -0
  152. package/dist/providers/appStoreConnect/publishIosToAppStoreConnect.js +124 -0
  153. package/dist/providers/appStoreConnect/publishIosToAppStoreConnect.js.map +1 -0
  154. package/dist/providers/appStoreConnect/reserveAppStoreBuildUploadFile.d.ts +9 -0
  155. package/dist/providers/appStoreConnect/reserveAppStoreBuildUploadFile.d.ts.map +1 -0
  156. package/dist/providers/appStoreConnect/reserveAppStoreBuildUploadFile.js +32 -0
  157. package/dist/providers/appStoreConnect/reserveAppStoreBuildUploadFile.js.map +1 -0
  158. package/dist/providers/appStoreConnect/resolveAppStoreConnectToken.d.ts +18 -0
  159. package/dist/providers/appStoreConnect/resolveAppStoreConnectToken.d.ts.map +1 -0
  160. package/dist/providers/appStoreConnect/resolveAppStoreConnectToken.js +64 -0
  161. package/dist/providers/appStoreConnect/resolveAppStoreConnectToken.js.map +1 -0
  162. package/dist/providers/appStoreConnect/verifyAppStoreConnectPublication.d.ts +23 -0
  163. package/dist/providers/appStoreConnect/verifyAppStoreConnectPublication.d.ts.map +1 -0
  164. package/dist/providers/appStoreConnect/verifyAppStoreConnectPublication.js +60 -0
  165. package/dist/providers/appStoreConnect/verifyAppStoreConnectPublication.js.map +1 -0
  166. package/dist/providers/appStoreConnect/verifyAppStoreVersionBuild.d.ts +9 -0
  167. package/dist/providers/appStoreConnect/verifyAppStoreVersionBuild.d.ts.map +1 -0
  168. package/dist/providers/appStoreConnect/verifyAppStoreVersionBuild.js +26 -0
  169. package/dist/providers/appStoreConnect/verifyAppStoreVersionBuild.js.map +1 -0
  170. package/dist/providers/appStoreConnect/waitForAppStoreBuildUpload.d.ts +14 -0
  171. package/dist/providers/appStoreConnect/waitForAppStoreBuildUpload.d.ts.map +1 -0
  172. package/dist/providers/appStoreConnect/waitForAppStoreBuildUpload.js +69 -0
  173. package/dist/providers/appStoreConnect/waitForAppStoreBuildUpload.js.map +1 -0
  174. package/dist/providers/eas/ios/EasIosBuildArtifact.d.ts +9 -0
  175. package/dist/providers/eas/ios/EasIosBuildArtifact.d.ts.map +1 -0
  176. package/dist/providers/eas/ios/EasIosBuildArtifact.js +2 -0
  177. package/dist/providers/eas/ios/EasIosBuildArtifact.js.map +1 -0
  178. package/dist/providers/eas/ios/buildIosWithEas.d.ts +26 -0
  179. package/dist/providers/eas/ios/buildIosWithEas.d.ts.map +1 -0
  180. package/dist/providers/eas/ios/buildIosWithEas.js +60 -0
  181. package/dist/providers/eas/ios/buildIosWithEas.js.map +1 -0
  182. package/dist/providers/eas/ios/generateLocalIosFingerprint.d.ts +15 -0
  183. package/dist/providers/eas/ios/generateLocalIosFingerprint.d.ts.map +1 -0
  184. package/dist/providers/eas/ios/generateLocalIosFingerprint.js +48 -0
  185. package/dist/providers/eas/ios/generateLocalIosFingerprint.js.map +1 -0
  186. package/dist/providers/eas/ios/inspectEasIosConfig.d.ts +28 -0
  187. package/dist/providers/eas/ios/inspectEasIosConfig.d.ts.map +1 -0
  188. package/dist/providers/eas/ios/inspectEasIosConfig.js +40 -0
  189. package/dist/providers/eas/ios/inspectEasIosConfig.js.map +1 -0
  190. package/dist/providers/eas/ios/parseEasIosBuild.d.ts +3 -0
  191. package/dist/providers/eas/ios/parseEasIosBuild.d.ts.map +1 -0
  192. package/dist/providers/eas/ios/parseEasIosBuild.js +41 -0
  193. package/dist/providers/eas/ios/parseEasIosBuild.js.map +1 -0
  194. package/dist/providers/eas/ios/parseEasIosConfig.d.ts +3 -0
  195. package/dist/providers/eas/ios/parseEasIosConfig.d.ts.map +1 -0
  196. package/dist/providers/eas/ios/parseEasIosConfig.js +56 -0
  197. package/dist/providers/eas/ios/parseEasIosConfig.js.map +1 -0
  198. package/dist/targets/ios/createIosDeploymentRevision.d.ts +3 -0
  199. package/dist/targets/ios/createIosDeploymentRevision.d.ts.map +1 -0
  200. package/dist/targets/ios/createIosDeploymentRevision.js +10 -0
  201. package/dist/targets/ios/createIosDeploymentRevision.js.map +1 -0
  202. package/dist/targets/ios/createIosTargetPlanContributor.d.ts +3 -0
  203. package/dist/targets/ios/createIosTargetPlanContributor.d.ts.map +1 -0
  204. package/dist/targets/ios/createIosTargetPlanContributor.js +26 -0
  205. package/dist/targets/ios/createIosTargetPlanContributor.js.map +1 -0
  206. package/dist/targets/ios/isIosDeploymentIntentValid.d.ts +3 -0
  207. package/dist/targets/ios/isIosDeploymentIntentValid.d.ts.map +1 -0
  208. package/dist/targets/ios/isIosDeploymentIntentValid.js +4 -0
  209. package/dist/targets/ios/isIosDeploymentIntentValid.js.map +1 -0
  210. package/dist/targets/ios/normalizeIosProviders.d.ts +16 -0
  211. package/dist/targets/ios/normalizeIosProviders.d.ts.map +1 -0
  212. package/dist/targets/ios/normalizeIosProviders.js +16 -0
  213. package/dist/targets/ios/normalizeIosProviders.js.map +1 -0
  214. package/package.json +1 -1
@@ -0,0 +1,124 @@
1
+ import { trackAppStoreConnectRequests } from './AppStoreConnectRequestTracker';
2
+ import { attachAppStoreVersionBuild } from './attachAppStoreVersionBuild';
3
+ import { commitAppStoreBuildUploadFile } from './commitAppStoreBuildUploadFile';
4
+ import { createAppStoreBuildUpload } from './createAppStoreBuildUpload';
5
+ import { executeBuildUploadOperations } from './executeBuildUploadOperations';
6
+ import { prepareAppStoreVersion } from './prepareAppStoreVersion';
7
+ import { reserveAppStoreBuildUploadFile } from './reserveAppStoreBuildUploadFile';
8
+ import { resolveAppStoreConnectToken } from './resolveAppStoreConnectToken';
9
+ import { waitForAppStoreBuildUpload } from './waitForAppStoreBuildUpload';
10
+ export async function publishIosToAppStoreConnect(options) {
11
+ const access = await resolveAppStoreConnectToken(options);
12
+ if (!access.ok)
13
+ return { status: 'action-required', action: access.action };
14
+ const tracked = trackAppStoreConnectRequests(options.request);
15
+ const buildUploadId = await createAppStoreBuildUpload({
16
+ ...options,
17
+ token: access.token,
18
+ request: tracked.request,
19
+ });
20
+ if (buildUploadId === null)
21
+ return providerFailure(tracked.blockingStatus(), 'APP_STORE_BUILD_UPLOAD_CREATE_FAILED');
22
+ const reservation = await reserveAppStoreBuildUploadFile({
23
+ buildUploadId,
24
+ fileSize: options.file.length,
25
+ token: access.token,
26
+ request: tracked.request,
27
+ });
28
+ if (reservation === null)
29
+ return providerFailure(tracked.blockingStatus(), 'APP_STORE_BUILD_UPLOAD_FILE_FAILED');
30
+ const uploaded = await executeBuildUploadOperations({
31
+ file: options.file,
32
+ operations: reservation.operations,
33
+ upload: options.upload,
34
+ });
35
+ if (!uploaded)
36
+ return failure('APP_STORE_BUILD_UPLOAD_TRANSFER_FAILED');
37
+ const committed = await commitAppStoreBuildUploadFile({
38
+ fileId: reservation.fileId,
39
+ token: access.token,
40
+ request: tracked.request,
41
+ });
42
+ if (!committed)
43
+ return providerFailure(tracked.blockingStatus(), 'APP_STORE_BUILD_UPLOAD_COMMIT_FAILED');
44
+ return finishPublication(options, access.token, buildUploadId, tracked);
45
+ }
46
+ async function finishPublication(options, token, buildUploadId, tracked) {
47
+ const build = await waitForAppStoreBuildUpload({
48
+ buildUploadId,
49
+ expectedBuildNumber: options.buildNumber,
50
+ token,
51
+ request: tracked.request,
52
+ wait: options.wait,
53
+ maxAttempts: options.maxAttempts,
54
+ });
55
+ if (build === null)
56
+ return providerFailure(tracked.blockingStatus(), 'APP_STORE_BUILD_PROCESSING_FAILED');
57
+ const versionId = await prepareAppStoreVersion({
58
+ ...options,
59
+ token,
60
+ request: tracked.request,
61
+ });
62
+ if (versionId === null)
63
+ return providerFailure(tracked.blockingStatus(), 'APP_STORE_VERSION_PREPARATION_FAILED');
64
+ const attached = await attachAppStoreVersionBuild({
65
+ versionId,
66
+ buildId: build.buildId,
67
+ token,
68
+ request: tracked.request,
69
+ });
70
+ if (!attached)
71
+ return providerFailure(tracked.blockingStatus(), 'APP_STORE_VERSION_BUILD_ATTACH_FAILED');
72
+ return {
73
+ status: 'completed',
74
+ publication: {
75
+ buildId: build.buildId,
76
+ versionId,
77
+ buildNumber: options.buildNumber,
78
+ version: options.version,
79
+ },
80
+ };
81
+ }
82
+ function providerFailure(status, code) {
83
+ if (status === 401)
84
+ return authenticationRequired();
85
+ if (status === 403)
86
+ return permissionRequired();
87
+ return failure(code);
88
+ }
89
+ function authenticationRequired() {
90
+ return {
91
+ status: 'action-required',
92
+ action: {
93
+ type: 'authentication',
94
+ provider: 'app-store-connect',
95
+ target: 'ios',
96
+ code: 'APP_STORE_CONNECT_AUTHENTICATION_REQUIRED',
97
+ message: 'App Store Connect API-key authentication is required for iOS deployment.',
98
+ },
99
+ };
100
+ }
101
+ function permissionRequired() {
102
+ return {
103
+ status: 'action-required',
104
+ action: {
105
+ type: 'manual-action',
106
+ target: 'ios',
107
+ provider: 'app-store-connect',
108
+ code: 'APP_STORE_CONNECT_PERMISSION_REQUIRED',
109
+ message: 'The App Store Connect team API key needs permission for iOS deployment.',
110
+ },
111
+ };
112
+ }
113
+ function failure(code) {
114
+ return {
115
+ status: 'failed',
116
+ failure: {
117
+ code,
118
+ message: 'App Store Connect iOS publication failed.',
119
+ target: 'ios',
120
+ provider: 'app-store-connect',
121
+ },
122
+ };
123
+ }
124
+ //# sourceMappingURL=publishIosToAppStoreConnect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publishIosToAppStoreConnect.js","sourceRoot":"","sources":["../../../src/providers/appStoreConnect/publishIosToAppStoreConnect.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,4BAA4B,EAAE,MAAM,iCAAiC,CAAC;AAI/E,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAChF,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAC9E,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,8BAA8B,EAAE,MAAM,kCAAkC,CAAC;AAClF,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAE1E,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAAC,OAajD;IACC,MAAM,MAAM,GAAG,MAAM,2BAA2B,CAAC,OAAO,CAAC,CAAC;IAC1D,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IAC5E,MAAM,OAAO,GAAG,4BAA4B,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9D,MAAM,aAAa,GAAG,MAAM,yBAAyB,CAAC;QACpD,GAAG,OAAO;QACV,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC,CAAC;IACH,IAAI,aAAa,KAAK,IAAI;QACxB,OAAO,eAAe,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,sCAAsC,CAAC,CAAC;IAC3F,MAAM,WAAW,GAAG,MAAM,8BAA8B,CAAC;QACvD,aAAa;QACb,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM;QAC7B,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC,CAAC;IACH,IAAI,WAAW,KAAK,IAAI;QACtB,OAAO,eAAe,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,oCAAoC,CAAC,CAAC;IACzF,MAAM,QAAQ,GAAG,MAAM,4BAA4B,CAAC;QAClD,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,UAAU,EAAE,WAAW,CAAC,UAAU;QAClC,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IACH,IAAI,CAAC,QAAQ;QAAE,OAAO,OAAO,CAAC,wCAAwC,CAAC,CAAC;IACxE,MAAM,SAAS,GAAG,MAAM,6BAA6B,CAAC;QACpD,MAAM,EAAE,WAAW,CAAC,MAAM;QAC1B,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC,CAAC;IACH,IAAI,CAAC,SAAS;QACZ,OAAO,eAAe,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,sCAAsC,CAAC,CAAC;IAC3F,OAAO,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;AAC1E,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,OAA0D,EAC1D,KAAa,EACb,aAAqB,EACrB,OAAwD;IAExD,MAAM,KAAK,GAAG,MAAM,0BAA0B,CAAC;QAC7C,aAAa;QACb,mBAAmB,EAAE,OAAO,CAAC,WAAW;QACxC,KAAK;QACL,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,WAAW,EAAE,OAAO,CAAC,WAAW;KACjC,CAAC,CAAC;IACH,IAAI,KAAK,KAAK,IAAI;QAChB,OAAO,eAAe,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,mCAAmC,CAAC,CAAC;IACxF,MAAM,SAAS,GAAG,MAAM,sBAAsB,CAAC;QAC7C,GAAG,OAAO;QACV,KAAK;QACL,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC,CAAC;IACH,IAAI,SAAS,KAAK,IAAI;QACpB,OAAO,eAAe,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,sCAAsC,CAAC,CAAC;IAC3F,MAAM,QAAQ,GAAG,MAAM,0BAA0B,CAAC;QAChD,SAAS;QACT,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,KAAK;QACL,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC,CAAC;IACH,IAAI,CAAC,QAAQ;QACX,OAAO,eAAe,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,uCAAuC,CAAC,CAAC;IAC5F,OAAO;QACL,MAAM,EAAE,WAAW;QACnB,WAAW,EAAE;YACX,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,SAAS;YACT,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB;KACF,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CACtB,MAAqF,EACrF,IAAY;IAEZ,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,sBAAsB,EAAE,CAAC;IACpD,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,kBAAkB,EAAE,CAAC;IAChD,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;AACvB,CAAC;AAED,SAAS,sBAAsB;IAC7B,OAAO;QACL,MAAM,EAAE,iBAAiB;QACzB,MAAM,EAAE;YACN,IAAI,EAAE,gBAAgB;YACtB,QAAQ,EAAE,mBAAmB;YAC7B,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,2CAA2C;YACjD,OAAO,EAAE,0EAA0E;SACpF;KACF,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB;IACzB,OAAO;QACL,MAAM,EAAE,iBAAiB;QACzB,MAAM,EAAE;YACN,IAAI,EAAE,eAAe;YACrB,MAAM,EAAE,KAAK;YACb,QAAQ,EAAE,mBAAmB;YAC7B,IAAI,EAAE,uCAAuC;YAC7C,OAAO,EAAE,yEAAyE;SACnF;KACF,CAAC;AACJ,CAAC;AAED,SAAS,OAAO,CAAC,IAAY;IAC3B,OAAO;QACL,MAAM,EAAE,QAAQ;QAChB,OAAO,EAAE;YACP,IAAI;YACJ,OAAO,EAAE,2CAA2C;YACpD,MAAM,EAAE,KAAK;YACb,QAAQ,EAAE,mBAAmB;SAC9B;KACF,CAAC;AACJ,CAAC","sourcesContent":["import type { DeploymentCredentialReference } from '../../domain/DeploymentCredentialReference';\nimport type { DeploymentSecretResolver } from '../../domain/DeploymentSecretResolver';\nimport type { AppStoreConnectPublicationResult } from './AppStoreConnectPublicationResult';\nimport { trackAppStoreConnectRequests } from './AppStoreConnectRequestTracker';\nimport type { AppStoreConnectTokenFactory } from './AppStoreConnectTokenFactory';\nimport type { AppStoreConnectTransport } from './AppStoreConnectTransport';\nimport type { AppStoreUploadTransport } from './AppStoreUploadTransport';\nimport { attachAppStoreVersionBuild } from './attachAppStoreVersionBuild';\nimport { commitAppStoreBuildUploadFile } from './commitAppStoreBuildUploadFile';\nimport { createAppStoreBuildUpload } from './createAppStoreBuildUpload';\nimport { executeBuildUploadOperations } from './executeBuildUploadOperations';\nimport { prepareAppStoreVersion } from './prepareAppStoreVersion';\nimport { reserveAppStoreBuildUploadFile } from './reserveAppStoreBuildUploadFile';\nimport { resolveAppStoreConnectToken } from './resolveAppStoreConnectToken';\nimport { waitForAppStoreBuildUpload } from './waitForAppStoreBuildUpload';\n\nexport async function publishIosToAppStoreConnect(options: {\n readonly appId: string;\n readonly version: string;\n readonly buildNumber: string;\n readonly file: Buffer;\n readonly credentials: readonly DeploymentCredentialReference[];\n readonly resolveSecret: DeploymentSecretResolver;\n readonly createToken: AppStoreConnectTokenFactory;\n readonly request: AppStoreConnectTransport;\n readonly upload: AppStoreUploadTransport;\n readonly wait: () => Promise<void>;\n readonly maxAttempts: number;\n readonly now: Date;\n}): Promise<AppStoreConnectPublicationResult> {\n const access = await resolveAppStoreConnectToken(options);\n if (!access.ok) return { status: 'action-required', action: access.action };\n const tracked = trackAppStoreConnectRequests(options.request);\n const buildUploadId = await createAppStoreBuildUpload({\n ...options,\n token: access.token,\n request: tracked.request,\n });\n if (buildUploadId === null)\n return providerFailure(tracked.blockingStatus(), 'APP_STORE_BUILD_UPLOAD_CREATE_FAILED');\n const reservation = await reserveAppStoreBuildUploadFile({\n buildUploadId,\n fileSize: options.file.length,\n token: access.token,\n request: tracked.request,\n });\n if (reservation === null)\n return providerFailure(tracked.blockingStatus(), 'APP_STORE_BUILD_UPLOAD_FILE_FAILED');\n const uploaded = await executeBuildUploadOperations({\n file: options.file,\n operations: reservation.operations,\n upload: options.upload,\n });\n if (!uploaded) return failure('APP_STORE_BUILD_UPLOAD_TRANSFER_FAILED');\n const committed = await commitAppStoreBuildUploadFile({\n fileId: reservation.fileId,\n token: access.token,\n request: tracked.request,\n });\n if (!committed)\n return providerFailure(tracked.blockingStatus(), 'APP_STORE_BUILD_UPLOAD_COMMIT_FAILED');\n return finishPublication(options, access.token, buildUploadId, tracked);\n}\n\nasync function finishPublication(\n options: Parameters<typeof publishIosToAppStoreConnect>[0],\n token: string,\n buildUploadId: string,\n tracked: ReturnType<typeof trackAppStoreConnectRequests>,\n): Promise<AppStoreConnectPublicationResult> {\n const build = await waitForAppStoreBuildUpload({\n buildUploadId,\n expectedBuildNumber: options.buildNumber,\n token,\n request: tracked.request,\n wait: options.wait,\n maxAttempts: options.maxAttempts,\n });\n if (build === null)\n return providerFailure(tracked.blockingStatus(), 'APP_STORE_BUILD_PROCESSING_FAILED');\n const versionId = await prepareAppStoreVersion({\n ...options,\n token,\n request: tracked.request,\n });\n if (versionId === null)\n return providerFailure(tracked.blockingStatus(), 'APP_STORE_VERSION_PREPARATION_FAILED');\n const attached = await attachAppStoreVersionBuild({\n versionId,\n buildId: build.buildId,\n token,\n request: tracked.request,\n });\n if (!attached)\n return providerFailure(tracked.blockingStatus(), 'APP_STORE_VERSION_BUILD_ATTACH_FAILED');\n return {\n status: 'completed',\n publication: {\n buildId: build.buildId,\n versionId,\n buildNumber: options.buildNumber,\n version: options.version,\n },\n };\n}\n\nfunction providerFailure(\n status: ReturnType<ReturnType<typeof trackAppStoreConnectRequests>['blockingStatus']>,\n code: string,\n): AppStoreConnectPublicationResult {\n if (status === 401) return authenticationRequired();\n if (status === 403) return permissionRequired();\n return failure(code);\n}\n\nfunction authenticationRequired(): AppStoreConnectPublicationResult {\n return {\n status: 'action-required',\n action: {\n type: 'authentication',\n provider: 'app-store-connect',\n target: 'ios',\n code: 'APP_STORE_CONNECT_AUTHENTICATION_REQUIRED',\n message: 'App Store Connect API-key authentication is required for iOS deployment.',\n },\n };\n}\n\nfunction permissionRequired(): AppStoreConnectPublicationResult {\n return {\n status: 'action-required',\n action: {\n type: 'manual-action',\n target: 'ios',\n provider: 'app-store-connect',\n code: 'APP_STORE_CONNECT_PERMISSION_REQUIRED',\n message: 'The App Store Connect team API key needs permission for iOS deployment.',\n },\n };\n}\n\nfunction failure(code: string): AppStoreConnectPublicationResult {\n return {\n status: 'failed',\n failure: {\n code,\n message: 'App Store Connect iOS publication failed.',\n target: 'ios',\n provider: 'app-store-connect',\n },\n };\n}\n"]}
@@ -0,0 +1,9 @@
1
+ import type { AppStoreConnectTransport } from './AppStoreConnectTransport';
2
+ import type { BuildUploadFileReservation } from './BuildUploadOperation';
3
+ export declare function reserveAppStoreBuildUploadFile(options: {
4
+ readonly buildUploadId: string;
5
+ readonly fileSize: number;
6
+ readonly token: string;
7
+ readonly request: AppStoreConnectTransport;
8
+ }): Promise<BuildUploadFileReservation | null>;
9
+ //# sourceMappingURL=reserveAppStoreBuildUploadFile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reserveAppStoreBuildUploadFile.d.ts","sourceRoot":"","sources":["../../../src/providers/appStoreConnect/reserveAppStoreBuildUploadFile.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAE3E,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AAGzE,wBAAsB,8BAA8B,CAAC,OAAO,EAAE;IAC5D,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,wBAAwB,CAAC;CAC5C,GAAG,OAAO,CAAC,0BAA0B,GAAG,IAAI,CAAC,CA0B7C"}
@@ -0,0 +1,32 @@
1
+ import { appStoreConnectBuildUploadFilesUrl } from './appStoreConnectUrls';
2
+ import { parseBuildUploadFileReservation } from './parseBuildUploadFileReservation';
3
+ export async function reserveAppStoreBuildUploadFile(options) {
4
+ const body = JSON.stringify({
5
+ data: {
6
+ type: 'buildUploadFiles',
7
+ attributes: {
8
+ assetType: 'ASSET',
9
+ fileName: 'application.ipa',
10
+ fileSize: options.fileSize,
11
+ },
12
+ relationships: {
13
+ buildUpload: { data: { type: 'buildUploads', id: options.buildUploadId } },
14
+ },
15
+ },
16
+ });
17
+ const response = await options.request({
18
+ method: 'POST',
19
+ url: appStoreConnectBuildUploadFilesUrl(),
20
+ token: options.token,
21
+ body,
22
+ });
23
+ if (response.status !== 201)
24
+ return null;
25
+ try {
26
+ return parseBuildUploadFileReservation(JSON.parse(response.body), options.fileSize);
27
+ }
28
+ catch {
29
+ return null;
30
+ }
31
+ }
32
+ //# sourceMappingURL=reserveAppStoreBuildUploadFile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reserveAppStoreBuildUploadFile.js","sourceRoot":"","sources":["../../../src/providers/appStoreConnect/reserveAppStoreBuildUploadFile.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kCAAkC,EAAE,MAAM,uBAAuB,CAAC;AAE3E,OAAO,EAAE,+BAA+B,EAAE,MAAM,mCAAmC,CAAC;AAEpF,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAAC,OAKpD;IACC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;QAC1B,IAAI,EAAE;YACJ,IAAI,EAAE,kBAAkB;YACxB,UAAU,EAAE;gBACV,SAAS,EAAE,OAAO;gBAClB,QAAQ,EAAE,iBAAiB;gBAC3B,QAAQ,EAAE,OAAO,CAAC,QAAQ;aAC3B;YACD,aAAa,EAAE;gBACb,WAAW,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE,OAAO,CAAC,aAAa,EAAE,EAAE;aAC3E;SACF;KACF,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC;QACrC,MAAM,EAAE,MAAM;QACd,GAAG,EAAE,kCAAkC,EAAE;QACzC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,IAAI;KACL,CAAC,CAAC;IACH,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IACzC,IAAI,CAAC;QACH,OAAO,+BAA+B,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAY,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjG,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC","sourcesContent":["import type { AppStoreConnectTransport } from './AppStoreConnectTransport';\nimport { appStoreConnectBuildUploadFilesUrl } from './appStoreConnectUrls';\nimport type { BuildUploadFileReservation } from './BuildUploadOperation';\nimport { parseBuildUploadFileReservation } from './parseBuildUploadFileReservation';\n\nexport async function reserveAppStoreBuildUploadFile(options: {\n readonly buildUploadId: string;\n readonly fileSize: number;\n readonly token: string;\n readonly request: AppStoreConnectTransport;\n}): Promise<BuildUploadFileReservation | null> {\n const body = JSON.stringify({\n data: {\n type: 'buildUploadFiles',\n attributes: {\n assetType: 'ASSET',\n fileName: 'application.ipa',\n fileSize: options.fileSize,\n },\n relationships: {\n buildUpload: { data: { type: 'buildUploads', id: options.buildUploadId } },\n },\n },\n });\n const response = await options.request({\n method: 'POST',\n url: appStoreConnectBuildUploadFilesUrl(),\n token: options.token,\n body,\n });\n if (response.status !== 201) return null;\n try {\n return parseBuildUploadFileReservation(JSON.parse(response.body) as unknown, options.fileSize);\n } catch {\n return null;\n }\n}\n"]}
@@ -0,0 +1,18 @@
1
+ import type { DeploymentCredentialReference } from '../../domain/DeploymentCredentialReference';
2
+ import type { DeploymentAuthenticationRequiredAction } from '../../domain/DeploymentRequiredAction';
3
+ import type { DeploymentSecretResolver } from '../../domain/DeploymentSecretResolver';
4
+ import type { AppStoreConnectTokenFactory } from './AppStoreConnectTokenFactory';
5
+ export type AppStoreConnectTokenResult = {
6
+ readonly ok: true;
7
+ readonly token: string;
8
+ } | {
9
+ readonly ok: false;
10
+ readonly action: DeploymentAuthenticationRequiredAction;
11
+ };
12
+ export declare function resolveAppStoreConnectToken(options: {
13
+ readonly credentials: readonly DeploymentCredentialReference[];
14
+ readonly resolveSecret: DeploymentSecretResolver;
15
+ readonly createToken: AppStoreConnectTokenFactory;
16
+ readonly now: Date;
17
+ }): Promise<AppStoreConnectTokenResult>;
18
+ //# sourceMappingURL=resolveAppStoreConnectToken.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveAppStoreConnectToken.d.ts","sourceRoot":"","sources":["../../../src/providers/appStoreConnect/resolveAppStoreConnectToken.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,4CAA4C,CAAC;AAChG,OAAO,KAAK,EAAE,sCAAsC,EAAE,MAAM,uCAAuC,CAAC;AACpG,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,uCAAuC,CAAC;AACtF,OAAO,KAAK,EAEV,2BAA2B,EAC5B,MAAM,+BAA+B,CAAC;AAEvC,MAAM,MAAM,0BAA0B,GAClC;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC7C;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,sCAAsC,CAAA;CAAE,CAAC;AAEpF,wBAAsB,2BAA2B,CAAC,OAAO,EAAE;IACzD,QAAQ,CAAC,WAAW,EAAE,SAAS,6BAA6B,EAAE,CAAC;IAC/D,QAAQ,CAAC,aAAa,EAAE,wBAAwB,CAAC;IACjD,QAAQ,CAAC,WAAW,EAAE,2BAA2B,CAAC;IAClD,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC;CACpB,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAUtC"}
@@ -0,0 +1,64 @@
1
+ export async function resolveAppStoreConnectToken(options) {
2
+ const reference = options.credentials.find((credential) => credential.provider === 'app-store-connect' && credential.kind === 'api-key');
3
+ if (reference === undefined)
4
+ return requiredAction();
5
+ const secret = await safelyResolve(options.resolveSecret, reference);
6
+ const parsed = parseApiKey(secret);
7
+ if (parsed === null)
8
+ return requiredAction();
9
+ const token = await safelyCreateToken(options.createToken, parsed, options.now);
10
+ return token === null ? requiredAction() : { ok: true, token };
11
+ }
12
+ function parseApiKey(value) {
13
+ if (value === null)
14
+ return null;
15
+ let parsed;
16
+ try {
17
+ parsed = JSON.parse(value);
18
+ }
19
+ catch {
20
+ return null;
21
+ }
22
+ if (!isRecord(parsed))
23
+ return null;
24
+ if (!isNonEmptyString(parsed.keyId) || !isNonEmptyString(parsed.issuerId))
25
+ return null;
26
+ if (!isNonEmptyString(parsed.privateKey))
27
+ return null;
28
+ return { keyId: parsed.keyId, issuerId: parsed.issuerId, privateKey: parsed.privateKey };
29
+ }
30
+ async function safelyResolve(resolveSecret, reference) {
31
+ try {
32
+ return await resolveSecret(reference);
33
+ }
34
+ catch {
35
+ return null;
36
+ }
37
+ }
38
+ async function safelyCreateToken(createToken, credentials, now) {
39
+ try {
40
+ return await createToken(credentials, now);
41
+ }
42
+ catch {
43
+ return null;
44
+ }
45
+ }
46
+ function requiredAction() {
47
+ return {
48
+ ok: false,
49
+ action: {
50
+ type: 'authentication',
51
+ provider: 'app-store-connect',
52
+ target: 'ios',
53
+ code: 'APP_STORE_CONNECT_AUTHENTICATION_REQUIRED',
54
+ message: 'App Store Connect API-key authentication is required for iOS deployment.',
55
+ },
56
+ };
57
+ }
58
+ function isRecord(value) {
59
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
60
+ }
61
+ function isNonEmptyString(value) {
62
+ return typeof value === 'string' && value.trim().length > 0;
63
+ }
64
+ //# sourceMappingURL=resolveAppStoreConnectToken.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveAppStoreConnectToken.js","sourceRoot":"","sources":["../../../src/providers/appStoreConnect/resolveAppStoreConnectToken.ts"],"names":[],"mappings":"AAYA,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAAC,OAKjD;IACC,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CACxC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,KAAK,mBAAmB,IAAI,UAAU,CAAC,IAAI,KAAK,SAAS,CAC7F,CAAC;IACF,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,cAAc,EAAE,CAAC;IACrD,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IACrE,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IACnC,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,cAAc,EAAE,CAAC;IAC7C,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IAChF,OAAO,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AACjE,CAAC;AAED,SAAS,WAAW,CAAC,KAAoB;IACvC,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAChC,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IACvF,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IACtD,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC;AAC3F,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,aAAuC,EACvC,SAAwC;IAExC,IAAI,CAAC;QACH,OAAO,MAAM,aAAa,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,WAAwC,EACxC,WAA6C,EAC7C,GAAS;IAET,IAAI,CAAC;QACH,OAAO,MAAM,WAAW,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,cAAc;IACrB,OAAO;QACL,EAAE,EAAE,KAAK;QACT,MAAM,EAAE;YACN,IAAI,EAAE,gBAAgB;YACtB,QAAQ,EAAE,mBAAmB;YAC7B,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,2CAA2C;YACjD,OAAO,EAAE,0EAA0E;SACpF;KACF,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;AAC9D,CAAC","sourcesContent":["import type { DeploymentCredentialReference } from '../../domain/DeploymentCredentialReference';\nimport type { DeploymentAuthenticationRequiredAction } from '../../domain/DeploymentRequiredAction';\nimport type { DeploymentSecretResolver } from '../../domain/DeploymentSecretResolver';\nimport type {\n AppStoreConnectApiKeyCredentials,\n AppStoreConnectTokenFactory,\n} from './AppStoreConnectTokenFactory';\n\nexport type AppStoreConnectTokenResult =\n | { readonly ok: true; readonly token: string }\n | { readonly ok: false; readonly action: DeploymentAuthenticationRequiredAction };\n\nexport async function resolveAppStoreConnectToken(options: {\n readonly credentials: readonly DeploymentCredentialReference[];\n readonly resolveSecret: DeploymentSecretResolver;\n readonly createToken: AppStoreConnectTokenFactory;\n readonly now: Date;\n}): Promise<AppStoreConnectTokenResult> {\n const reference = options.credentials.find(\n (credential) => credential.provider === 'app-store-connect' && credential.kind === 'api-key',\n );\n if (reference === undefined) return requiredAction();\n const secret = await safelyResolve(options.resolveSecret, reference);\n const parsed = parseApiKey(secret);\n if (parsed === null) return requiredAction();\n const token = await safelyCreateToken(options.createToken, parsed, options.now);\n return token === null ? requiredAction() : { ok: true, token };\n}\n\nfunction parseApiKey(value: string | null): AppStoreConnectApiKeyCredentials | null {\n if (value === null) return null;\n let parsed: unknown;\n try {\n parsed = JSON.parse(value);\n } catch {\n return null;\n }\n if (!isRecord(parsed)) return null;\n if (!isNonEmptyString(parsed.keyId) || !isNonEmptyString(parsed.issuerId)) return null;\n if (!isNonEmptyString(parsed.privateKey)) return null;\n return { keyId: parsed.keyId, issuerId: parsed.issuerId, privateKey: parsed.privateKey };\n}\n\nasync function safelyResolve(\n resolveSecret: DeploymentSecretResolver,\n reference: DeploymentCredentialReference,\n): Promise<string | null> {\n try {\n return await resolveSecret(reference);\n } catch {\n return null;\n }\n}\n\nasync function safelyCreateToken(\n createToken: AppStoreConnectTokenFactory,\n credentials: AppStoreConnectApiKeyCredentials,\n now: Date,\n): Promise<string | null> {\n try {\n return await createToken(credentials, now);\n } catch {\n return null;\n }\n}\n\nfunction requiredAction(): AppStoreConnectTokenResult {\n return {\n ok: false,\n action: {\n type: 'authentication',\n provider: 'app-store-connect',\n target: 'ios',\n code: 'APP_STORE_CONNECT_AUTHENTICATION_REQUIRED',\n message: 'App Store Connect API-key authentication is required for iOS deployment.',\n },\n };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === 'string' && value.trim().length > 0;\n}\n"]}
@@ -0,0 +1,23 @@
1
+ import type { DeploymentCredentialReference } from '../../domain/DeploymentCredentialReference';
2
+ import type { DeploymentRequiredAction } from '../../domain/DeploymentRequiredAction';
3
+ import type { DeploymentSecretResolver } from '../../domain/DeploymentSecretResolver';
4
+ import type { DeploymentVerificationResult } from '../../domain/DeploymentVerificationResult';
5
+ import type { AppStoreConnectPublication } from './AppStoreConnectPublicationResult';
6
+ import type { AppStoreConnectTokenFactory } from './AppStoreConnectTokenFactory';
7
+ import type { AppStoreConnectTransport } from './AppStoreConnectTransport';
8
+ export type AppStoreConnectVerificationResult = {
9
+ readonly status: 'completed';
10
+ readonly verification: DeploymentVerificationResult;
11
+ } | {
12
+ readonly status: 'action-required';
13
+ readonly action: DeploymentRequiredAction;
14
+ };
15
+ export declare function verifyAppStoreConnectPublication(options: {
16
+ readonly publication: AppStoreConnectPublication;
17
+ readonly credentials: readonly DeploymentCredentialReference[];
18
+ readonly resolveSecret: DeploymentSecretResolver;
19
+ readonly createToken: AppStoreConnectTokenFactory;
20
+ readonly request: AppStoreConnectTransport;
21
+ readonly now: Date;
22
+ }): Promise<AppStoreConnectVerificationResult>;
23
+ //# sourceMappingURL=verifyAppStoreConnectPublication.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifyAppStoreConnectPublication.d.ts","sourceRoot":"","sources":["../../../src/providers/appStoreConnect/verifyAppStoreConnectPublication.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,4CAA4C,CAAC;AAChG,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,uCAAuC,CAAC;AACtF,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,uCAAuC,CAAC;AACtF,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,2CAA2C,CAAC;AAC9F,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAErF,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AACjF,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAI3E,MAAM,MAAM,iCAAiC,GACzC;IAAE,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,YAAY,EAAE,4BAA4B,CAAA;CAAE,GACrF;IAAE,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,wBAAwB,CAAA;CAAE,CAAC;AAEtF,wBAAsB,gCAAgC,CAAC,OAAO,EAAE;IAC9D,QAAQ,CAAC,WAAW,EAAE,0BAA0B,CAAC;IACjD,QAAQ,CAAC,WAAW,EAAE,SAAS,6BAA6B,EAAE,CAAC;IAC/D,QAAQ,CAAC,aAAa,EAAE,wBAAwB,CAAC;IACjD,QAAQ,CAAC,WAAW,EAAE,2BAA2B,CAAC;IAClD,QAAQ,CAAC,OAAO,EAAE,wBAAwB,CAAC;IAC3C,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC;CACpB,GAAG,OAAO,CAAC,iCAAiC,CAAC,CAe7C"}
@@ -0,0 +1,60 @@
1
+ import { trackAppStoreConnectRequests } from './AppStoreConnectRequestTracker';
2
+ import { resolveAppStoreConnectToken } from './resolveAppStoreConnectToken';
3
+ import { verifyAppStoreVersionBuild } from './verifyAppStoreVersionBuild';
4
+ export async function verifyAppStoreConnectPublication(options) {
5
+ const access = await resolveAppStoreConnectToken(options);
6
+ if (!access.ok)
7
+ return { status: 'action-required', action: access.action };
8
+ const tracked = trackAppStoreConnectRequests(options.request);
9
+ const verified = await verifyAppStoreVersionBuild({
10
+ versionId: options.publication.versionId,
11
+ buildId: options.publication.buildId,
12
+ buildNumber: options.publication.buildNumber,
13
+ token: access.token,
14
+ request: tracked.request,
15
+ });
16
+ const status = tracked.blockingStatus();
17
+ if (status === 401)
18
+ return authenticationRequired();
19
+ if (status === 403)
20
+ return permissionRequired();
21
+ return { status: 'completed', verification: verified ? { ok: true } : failed() };
22
+ }
23
+ function authenticationRequired() {
24
+ return {
25
+ status: 'action-required',
26
+ action: {
27
+ type: 'authentication',
28
+ provider: 'app-store-connect',
29
+ target: 'ios',
30
+ code: 'APP_STORE_CONNECT_AUTHENTICATION_REQUIRED',
31
+ message: 'App Store Connect API-key authentication is required for iOS deployment.',
32
+ },
33
+ };
34
+ }
35
+ function permissionRequired() {
36
+ return {
37
+ status: 'action-required',
38
+ action: {
39
+ type: 'manual-action',
40
+ target: 'ios',
41
+ provider: 'app-store-connect',
42
+ code: 'APP_STORE_CONNECT_PERMISSION_REQUIRED',
43
+ message: 'The App Store Connect team API key needs permission for iOS deployment.',
44
+ },
45
+ };
46
+ }
47
+ function failed() {
48
+ return {
49
+ ok: false,
50
+ issues: [
51
+ {
52
+ code: 'APP_STORE_VERSION_BUILD_NOT_ATTACHED',
53
+ message: 'The processed iOS build is not attached to the expected App Store version.',
54
+ target: 'ios',
55
+ provider: 'app-store-connect',
56
+ },
57
+ ],
58
+ };
59
+ }
60
+ //# sourceMappingURL=verifyAppStoreConnectPublication.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifyAppStoreConnectPublication.js","sourceRoot":"","sources":["../../../src/providers/appStoreConnect/verifyAppStoreConnectPublication.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,4BAA4B,EAAE,MAAM,iCAAiC,CAAC;AAG/E,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAM1E,MAAM,CAAC,KAAK,UAAU,gCAAgC,CAAC,OAOtD;IACC,MAAM,MAAM,GAAG,MAAM,2BAA2B,CAAC,OAAO,CAAC,CAAC;IAC1D,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IAC5E,MAAM,OAAO,GAAG,4BAA4B,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9D,MAAM,QAAQ,GAAG,MAAM,0BAA0B,CAAC;QAChD,SAAS,EAAE,OAAO,CAAC,WAAW,CAAC,SAAS;QACxC,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,OAAO;QACpC,WAAW,EAAE,OAAO,CAAC,WAAW,CAAC,WAAW;QAC5C,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IACxC,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,sBAAsB,EAAE,CAAC;IACpD,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,kBAAkB,EAAE,CAAC;IAChD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;AACnF,CAAC;AAED,SAAS,sBAAsB;IAC7B,OAAO;QACL,MAAM,EAAE,iBAAiB;QACzB,MAAM,EAAE;YACN,IAAI,EAAE,gBAAgB;YACtB,QAAQ,EAAE,mBAAmB;YAC7B,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,2CAA2C;YACjD,OAAO,EAAE,0EAA0E;SACpF;KACF,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB;IACzB,OAAO;QACL,MAAM,EAAE,iBAAiB;QACzB,MAAM,EAAE;YACN,IAAI,EAAE,eAAe;YACrB,MAAM,EAAE,KAAK;YACb,QAAQ,EAAE,mBAAmB;YAC7B,IAAI,EAAE,uCAAuC;YAC7C,OAAO,EAAE,yEAAyE;SACnF;KACF,CAAC;AACJ,CAAC;AAED,SAAS,MAAM;IACb,OAAO;QACL,EAAE,EAAE,KAAK;QACT,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,sCAAsC;gBAC5C,OAAO,EAAE,4EAA4E;gBACrF,MAAM,EAAE,KAAK;gBACb,QAAQ,EAAE,mBAAmB;aAC9B;SACF;KACF,CAAC;AACJ,CAAC","sourcesContent":["import type { DeploymentCredentialReference } from '../../domain/DeploymentCredentialReference';\nimport type { DeploymentRequiredAction } from '../../domain/DeploymentRequiredAction';\nimport type { DeploymentSecretResolver } from '../../domain/DeploymentSecretResolver';\nimport type { DeploymentVerificationResult } from '../../domain/DeploymentVerificationResult';\nimport type { AppStoreConnectPublication } from './AppStoreConnectPublicationResult';\nimport { trackAppStoreConnectRequests } from './AppStoreConnectRequestTracker';\nimport type { AppStoreConnectTokenFactory } from './AppStoreConnectTokenFactory';\nimport type { AppStoreConnectTransport } from './AppStoreConnectTransport';\nimport { resolveAppStoreConnectToken } from './resolveAppStoreConnectToken';\nimport { verifyAppStoreVersionBuild } from './verifyAppStoreVersionBuild';\n\nexport type AppStoreConnectVerificationResult =\n | { readonly status: 'completed'; readonly verification: DeploymentVerificationResult }\n | { readonly status: 'action-required'; readonly action: DeploymentRequiredAction };\n\nexport async function verifyAppStoreConnectPublication(options: {\n readonly publication: AppStoreConnectPublication;\n readonly credentials: readonly DeploymentCredentialReference[];\n readonly resolveSecret: DeploymentSecretResolver;\n readonly createToken: AppStoreConnectTokenFactory;\n readonly request: AppStoreConnectTransport;\n readonly now: Date;\n}): Promise<AppStoreConnectVerificationResult> {\n const access = await resolveAppStoreConnectToken(options);\n if (!access.ok) return { status: 'action-required', action: access.action };\n const tracked = trackAppStoreConnectRequests(options.request);\n const verified = await verifyAppStoreVersionBuild({\n versionId: options.publication.versionId,\n buildId: options.publication.buildId,\n buildNumber: options.publication.buildNumber,\n token: access.token,\n request: tracked.request,\n });\n const status = tracked.blockingStatus();\n if (status === 401) return authenticationRequired();\n if (status === 403) return permissionRequired();\n return { status: 'completed', verification: verified ? { ok: true } : failed() };\n}\n\nfunction authenticationRequired(): AppStoreConnectVerificationResult {\n return {\n status: 'action-required',\n action: {\n type: 'authentication',\n provider: 'app-store-connect',\n target: 'ios',\n code: 'APP_STORE_CONNECT_AUTHENTICATION_REQUIRED',\n message: 'App Store Connect API-key authentication is required for iOS deployment.',\n },\n };\n}\n\nfunction permissionRequired(): AppStoreConnectVerificationResult {\n return {\n status: 'action-required',\n action: {\n type: 'manual-action',\n target: 'ios',\n provider: 'app-store-connect',\n code: 'APP_STORE_CONNECT_PERMISSION_REQUIRED',\n message: 'The App Store Connect team API key needs permission for iOS deployment.',\n },\n };\n}\n\nfunction failed(): DeploymentVerificationResult {\n return {\n ok: false,\n issues: [\n {\n code: 'APP_STORE_VERSION_BUILD_NOT_ATTACHED',\n message: 'The processed iOS build is not attached to the expected App Store version.',\n target: 'ios',\n provider: 'app-store-connect',\n },\n ],\n };\n}\n"]}
@@ -0,0 +1,9 @@
1
+ import type { AppStoreConnectTransport } from './AppStoreConnectTransport';
2
+ export declare function verifyAppStoreVersionBuild(options: {
3
+ readonly versionId: string;
4
+ readonly buildId: string;
5
+ readonly buildNumber: string;
6
+ readonly token: string;
7
+ readonly request: AppStoreConnectTransport;
8
+ }): Promise<boolean>;
9
+ //# sourceMappingURL=verifyAppStoreVersionBuild.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifyAppStoreVersionBuild.d.ts","sourceRoot":"","sources":["../../../src/providers/appStoreConnect/verifyAppStoreVersionBuild.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAG3E,wBAAsB,0BAA0B,CAAC,OAAO,EAAE;IACxD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,wBAAwB,CAAC;CAC5C,GAAG,OAAO,CAAC,OAAO,CAAC,CAmBnB"}
@@ -0,0 +1,26 @@
1
+ import { appStoreConnectVersionBuildUrl } from './appStoreConnectUrls';
2
+ export async function verifyAppStoreVersionBuild(options) {
3
+ const response = await options.request({
4
+ method: 'GET',
5
+ url: appStoreConnectVersionBuildUrl(options.versionId),
6
+ token: options.token,
7
+ });
8
+ if (response.status < 200 || response.status >= 300)
9
+ return false;
10
+ try {
11
+ const value = JSON.parse(response.body);
12
+ if (!isRecord(value) || !isRecord(value.data) || !isRecord(value.data.attributes))
13
+ return false;
14
+ return (value.data.type === 'builds' &&
15
+ value.data.id === options.buildId &&
16
+ value.data.attributes.version === options.buildNumber &&
17
+ value.data.attributes.processingState === 'VALID');
18
+ }
19
+ catch {
20
+ return false;
21
+ }
22
+ }
23
+ function isRecord(value) {
24
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
25
+ }
26
+ //# sourceMappingURL=verifyAppStoreVersionBuild.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifyAppStoreVersionBuild.js","sourceRoot":"","sources":["../../../src/providers/appStoreConnect/verifyAppStoreVersionBuild.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,8BAA8B,EAAE,MAAM,uBAAuB,CAAC;AAEvE,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,OAMhD;IACC,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC;QACrC,MAAM,EAAE,KAAK;QACb,GAAG,EAAE,8BAA8B,CAAC,OAAO,CAAC,SAAS,CAAC;QACtD,KAAK,EAAE,OAAO,CAAC,KAAK;KACrB,CAAC,CAAC;IACH,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG;QAAE,OAAO,KAAK,CAAC;IAClE,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAY,CAAC;QACnD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;YAAE,OAAO,KAAK,CAAC;QAChG,OAAO,CACL,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ;YAC5B,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,OAAO,CAAC,OAAO;YACjC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,KAAK,OAAO,CAAC,WAAW;YACrD,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,eAAe,KAAK,OAAO,CAClD,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC","sourcesContent":["import type { AppStoreConnectTransport } from './AppStoreConnectTransport';\nimport { appStoreConnectVersionBuildUrl } from './appStoreConnectUrls';\n\nexport async function verifyAppStoreVersionBuild(options: {\n readonly versionId: string;\n readonly buildId: string;\n readonly buildNumber: string;\n readonly token: string;\n readonly request: AppStoreConnectTransport;\n}): Promise<boolean> {\n const response = await options.request({\n method: 'GET',\n url: appStoreConnectVersionBuildUrl(options.versionId),\n token: options.token,\n });\n if (response.status < 200 || response.status >= 300) return false;\n try {\n const value = JSON.parse(response.body) as unknown;\n if (!isRecord(value) || !isRecord(value.data) || !isRecord(value.data.attributes)) return false;\n return (\n value.data.type === 'builds' &&\n value.data.id === options.buildId &&\n value.data.attributes.version === options.buildNumber &&\n value.data.attributes.processingState === 'VALID'\n );\n } catch {\n return false;\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n"]}
@@ -0,0 +1,14 @@
1
+ import type { AppStoreConnectTransport } from './AppStoreConnectTransport';
2
+ export interface ProcessedAppStoreBuild {
3
+ readonly buildId: string;
4
+ readonly buildNumber: string;
5
+ }
6
+ export declare function waitForAppStoreBuildUpload(options: {
7
+ readonly buildUploadId: string;
8
+ readonly expectedBuildNumber: string;
9
+ readonly token: string;
10
+ readonly request: AppStoreConnectTransport;
11
+ readonly wait: () => Promise<void>;
12
+ readonly maxAttempts: number;
13
+ }): Promise<ProcessedAppStoreBuild | null>;
14
+ //# sourceMappingURL=waitForAppStoreBuildUpload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"waitForAppStoreBuildUpload.d.ts","sourceRoot":"","sources":["../../../src/providers/appStoreConnect/waitForAppStoreBuildUpload.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAG3E,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,wBAAsB,0BAA0B,CAAC,OAAO,EAAE;IACxD,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,wBAAwB,CAAC;IAC3C,QAAQ,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B,GAAG,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC,CAQzC"}
@@ -0,0 +1,69 @@
1
+ import { appStoreConnectBuildUploadUrl } from './appStoreConnectUrls';
2
+ export async function waitForAppStoreBuildUpload(options) {
3
+ for (let attempt = 0; attempt < options.maxAttempts; attempt += 1) {
4
+ const result = await readBuildUpload(options);
5
+ if (result.status === 'complete')
6
+ return result.build;
7
+ if (result.status === 'failed')
8
+ return null;
9
+ if (attempt + 1 < options.maxAttempts)
10
+ await options.wait();
11
+ }
12
+ return null;
13
+ }
14
+ async function readBuildUpload(options) {
15
+ const response = await options.request({
16
+ method: 'GET',
17
+ url: appStoreConnectBuildUploadUrl(options.buildUploadId),
18
+ token: options.token,
19
+ });
20
+ if (response.status < 200 || response.status >= 300)
21
+ return { status: 'failed' };
22
+ try {
23
+ return parseBuildUpload(JSON.parse(response.body), options.expectedBuildNumber);
24
+ }
25
+ catch {
26
+ return { status: 'failed' };
27
+ }
28
+ }
29
+ function parseBuildUpload(value, expectedBuildNumber) {
30
+ if (!isRecord(value) || !isRecord(value.data) || !isRecord(value.data.attributes)) {
31
+ return { status: 'failed' };
32
+ }
33
+ const state = parseState(value.data.attributes.state);
34
+ if (state === 'FAILED')
35
+ return { status: 'failed' };
36
+ if (state !== 'COMPLETE')
37
+ return { status: 'pending' };
38
+ const build = findBuild(value.included, expectedBuildNumber);
39
+ return build === null ? { status: 'failed' } : { status: 'complete', build };
40
+ }
41
+ function parseState(value) {
42
+ if (typeof value === 'string')
43
+ return value;
44
+ return isRecord(value) && typeof value.state === 'string' ? value.state : null;
45
+ }
46
+ function findBuild(value, expectedBuildNumber) {
47
+ if (!Array.isArray(value))
48
+ return null;
49
+ for (const candidate of value) {
50
+ const build = parseBuild(candidate, expectedBuildNumber);
51
+ if (build !== null)
52
+ return build;
53
+ }
54
+ return null;
55
+ }
56
+ function parseBuild(value, expectedBuildNumber) {
57
+ if (!isRecord(value) || value.type !== 'builds' || !isRecord(value.attributes))
58
+ return null;
59
+ if (value.attributes.version !== expectedBuildNumber || !isNonEmptyString(value.id))
60
+ return null;
61
+ return { buildId: value.id, buildNumber: expectedBuildNumber };
62
+ }
63
+ function isRecord(value) {
64
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
65
+ }
66
+ function isNonEmptyString(value) {
67
+ return typeof value === 'string' && value.trim().length > 0;
68
+ }
69
+ //# sourceMappingURL=waitForAppStoreBuildUpload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"waitForAppStoreBuildUpload.js","sourceRoot":"","sources":["../../../src/providers/appStoreConnect/waitForAppStoreBuildUpload.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AppStoreConnectTransport } from './AppStoreConnectTransport';\nimport { appStoreConnectBuildUploadUrl } from './appStoreConnectUrls';\n\nexport interface ProcessedAppStoreBuild {\n readonly buildId: string;\n readonly buildNumber: string;\n}\n\nexport async function waitForAppStoreBuildUpload(options: {\n readonly buildUploadId: string;\n readonly expectedBuildNumber: string;\n readonly token: string;\n readonly request: AppStoreConnectTransport;\n readonly wait: () => Promise<void>;\n readonly maxAttempts: number;\n}): Promise<ProcessedAppStoreBuild | null> {\n for (let attempt = 0; attempt < options.maxAttempts; attempt += 1) {\n const result = await readBuildUpload(options);\n if (result.status === 'complete') return result.build;\n if (result.status === 'failed') return null;\n if (attempt + 1 < options.maxAttempts) await options.wait();\n }\n return null;\n}\n\ntype BuildUploadRead =\n | { readonly status: 'pending' }\n | { readonly status: 'failed' }\n | { readonly status: 'complete'; readonly build: ProcessedAppStoreBuild };\n\nasync function readBuildUpload(options: {\n readonly buildUploadId: string;\n readonly expectedBuildNumber: string;\n readonly token: string;\n readonly request: AppStoreConnectTransport;\n}): Promise<BuildUploadRead> {\n const response = await options.request({\n method: 'GET',\n url: appStoreConnectBuildUploadUrl(options.buildUploadId),\n token: options.token,\n });\n if (response.status < 200 || response.status >= 300) return { status: 'failed' };\n try {\n return parseBuildUpload(JSON.parse(response.body) as unknown, options.expectedBuildNumber);\n } catch {\n return { status: 'failed' };\n }\n}\n\nfunction parseBuildUpload(value: unknown, expectedBuildNumber: string): BuildUploadRead {\n if (!isRecord(value) || !isRecord(value.data) || !isRecord(value.data.attributes)) {\n return { status: 'failed' };\n }\n const state = parseState(value.data.attributes.state);\n if (state === 'FAILED') return { status: 'failed' };\n if (state !== 'COMPLETE') return { status: 'pending' };\n const build = findBuild(value.included, expectedBuildNumber);\n return build === null ? { status: 'failed' } : { status: 'complete', build };\n}\n\nfunction parseState(value: unknown): string | null {\n if (typeof value === 'string') return value;\n return isRecord(value) && typeof value.state === 'string' ? value.state : null;\n}\n\nfunction findBuild(value: unknown, expectedBuildNumber: string): ProcessedAppStoreBuild | null {\n if (!Array.isArray(value)) return null;\n for (const candidate of value as unknown[]) {\n const build = parseBuild(candidate, expectedBuildNumber);\n if (build !== null) return build;\n }\n return null;\n}\n\nfunction parseBuild(value: unknown, expectedBuildNumber: string): ProcessedAppStoreBuild | null {\n if (!isRecord(value) || value.type !== 'builds' || !isRecord(value.attributes)) return null;\n if (value.attributes.version !== expectedBuildNumber || !isNonEmptyString(value.id)) return null;\n return { buildId: value.id, buildNumber: expectedBuildNumber };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === 'string' && value.trim().length > 0;\n}\n"]}
@@ -0,0 +1,9 @@
1
+ export interface EasIosBuildArtifact {
2
+ readonly buildId: string;
3
+ readonly buildProfile: string;
4
+ readonly fingerprint: string;
5
+ readonly version: string;
6
+ readonly buildNumber: string;
7
+ readonly archiveUrl: string;
8
+ }
9
+ //# sourceMappingURL=EasIosBuildArtifact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EasIosBuildArtifact.d.ts","sourceRoot":"","sources":["../../../../src/providers/eas/ios/EasIosBuildArtifact.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=EasIosBuildArtifact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EasIosBuildArtifact.js","sourceRoot":"","sources":["../../../../src/providers/eas/ios/EasIosBuildArtifact.ts"],"names":[],"mappings":"","sourcesContent":["export interface EasIosBuildArtifact {\n readonly buildId: string;\n readonly buildProfile: string;\n readonly fingerprint: string;\n readonly version: string;\n readonly buildNumber: string;\n readonly archiveUrl: string;\n}\n"]}
@@ -0,0 +1,26 @@
1
+ import type { DeploymentCredentialReference } from '../../../domain/DeploymentCredentialReference';
2
+ import type { DeploymentFailure } from '../../../domain/DeploymentFailure';
3
+ import type { DeploymentRequiredAction } from '../../../domain/DeploymentRequiredAction';
4
+ import type { DeploymentSecretResolver } from '../../../domain/DeploymentSecretResolver';
5
+ import type { DeploymentProcessRunner } from '../../../runtime/process/DeploymentProcessRunner';
6
+ import type { EasIosBuildArtifact } from './EasIosBuildArtifact';
7
+ export type EasIosBuildResult = {
8
+ readonly status: 'completed';
9
+ readonly artifact: EasIosBuildArtifact;
10
+ } | {
11
+ readonly status: 'action-required';
12
+ readonly action: DeploymentRequiredAction;
13
+ } | {
14
+ readonly status: 'failed';
15
+ readonly failure: DeploymentFailure;
16
+ };
17
+ export declare function buildIosWithEas(options: {
18
+ readonly projectRoot: string;
19
+ readonly buildProfile: string;
20
+ readonly expectedFingerprint: string;
21
+ readonly expectedVersion: string;
22
+ readonly credentials: readonly DeploymentCredentialReference[];
23
+ readonly resolveSecret: DeploymentSecretResolver;
24
+ readonly runProcess: DeploymentProcessRunner;
25
+ }): Promise<EasIosBuildResult>;
26
+ //# sourceMappingURL=buildIosWithEas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildIosWithEas.d.ts","sourceRoot":"","sources":["../../../../src/providers/eas/ios/buildIosWithEas.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,+CAA+C,CAAC;AACnG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,0CAA0C,CAAC;AACzF,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,0CAA0C,CAAC;AACzF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,kDAAkD,CAAC;AAEhG,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAGjE,MAAM,MAAM,iBAAiB,GACzB;IAAE,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,CAAA;CAAE,GACxE;IAAE,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,wBAAwB,CAAA;CAAE,GACjF;IAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAA;CAAE,CAAC;AAEvE,wBAAsB,eAAe,CAAC,OAAO,EAAE;IAC7C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,WAAW,EAAE,SAAS,6BAA6B,EAAE,CAAC;IAC/D,QAAQ,CAAC,aAAa,EAAE,wBAAwB,CAAC;IACjD,QAAQ,CAAC,UAAU,EAAE,uBAAuB,CAAC;CAC9C,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAyB7B"}