@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.
- package/CHANGELOG.md +6 -0
- package/README.md +1 -1
- package/dist/domain/IosDeploymentIntent.d.ts +5 -0
- package/dist/domain/IosDeploymentIntent.d.ts.map +1 -0
- package/dist/domain/IosDeploymentIntent.js +2 -0
- package/dist/domain/IosDeploymentIntent.js.map +1 -0
- package/dist/domain/IosDeploymentPublication.d.ts +10 -0
- package/dist/domain/IosDeploymentPublication.d.ts.map +1 -0
- package/dist/domain/IosDeploymentPublication.js +2 -0
- package/dist/domain/IosDeploymentPublication.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/project/index.d.ts +6 -0
- package/dist/project/index.d.ts.map +1 -1
- package/dist/project/index.js +3 -0
- package/dist/project/index.js.map +1 -1
- package/dist/project/ios/ProjectIosDeploymentAccess.d.ts +7 -0
- package/dist/project/ios/ProjectIosDeploymentAccess.d.ts.map +1 -0
- package/dist/project/ios/ProjectIosDeploymentAccess.js +2 -0
- package/dist/project/ios/ProjectIosDeploymentAccess.js.map +1 -0
- package/dist/project/ios/ProjectIosDeploymentExecution.d.ts +12 -0
- package/dist/project/ios/ProjectIosDeploymentExecution.d.ts.map +1 -0
- package/dist/project/ios/ProjectIosDeploymentExecution.js +2 -0
- package/dist/project/ios/ProjectIosDeploymentExecution.js.map +1 -0
- package/dist/project/ios/ProjectIosDeploymentInspection.d.ts +21 -0
- package/dist/project/ios/ProjectIosDeploymentInspection.d.ts.map +1 -0
- package/dist/project/ios/ProjectIosDeploymentInspection.js +2 -0
- package/dist/project/ios/ProjectIosDeploymentInspection.js.map +1 -0
- package/dist/project/ios/ProjectIosDeploymentRuntime.d.ts +19 -0
- package/dist/project/ios/ProjectIosDeploymentRuntime.d.ts.map +1 -0
- package/dist/project/ios/ProjectIosDeploymentRuntime.js +22 -0
- package/dist/project/ios/ProjectIosDeploymentRuntime.js.map +1 -0
- package/dist/project/ios/ProjectIosExecutionState.d.ts +12 -0
- package/dist/project/ios/ProjectIosExecutionState.d.ts.map +1 -0
- package/dist/project/ios/ProjectIosExecutionState.js +2 -0
- package/dist/project/ios/ProjectIosExecutionState.js.map +1 -0
- package/dist/project/ios/createProjectIosDeploymentPlan.d.ts +4 -0
- package/dist/project/ios/createProjectIosDeploymentPlan.d.ts.map +1 -0
- package/dist/project/ios/createProjectIosDeploymentPlan.js +13 -0
- package/dist/project/ios/createProjectIosDeploymentPlan.js.map +1 -0
- package/dist/project/ios/executeProjectIosDeployment.d.ts +12 -0
- package/dist/project/ios/executeProjectIosDeployment.d.ts.map +1 -0
- package/dist/project/ios/executeProjectIosDeployment.js +160 -0
- package/dist/project/ios/executeProjectIosDeployment.js.map +1 -0
- package/dist/project/ios/executeProjectIosStep.d.ts +15 -0
- package/dist/project/ios/executeProjectIosStep.d.ts.map +1 -0
- package/dist/project/ios/executeProjectIosStep.js +171 -0
- package/dist/project/ios/executeProjectIosStep.js.map +1 -0
- package/dist/project/ios/inspectProjectIosAppStoreConnect.d.ts +15 -0
- package/dist/project/ios/inspectProjectIosAppStoreConnect.d.ts.map +1 -0
- package/dist/project/ios/inspectProjectIosAppStoreConnect.js +55 -0
- package/dist/project/ios/inspectProjectIosAppStoreConnect.js.map +1 -0
- package/dist/project/ios/inspectProjectIosDeployment.d.ts +11 -0
- package/dist/project/ios/inspectProjectIosDeployment.d.ts.map +1 -0
- package/dist/project/ios/inspectProjectIosDeployment.js +96 -0
- package/dist/project/ios/inspectProjectIosDeployment.js.map +1 -0
- package/dist/project/ios/inspectProjectIosEasSetup.d.ts +5 -0
- package/dist/project/ios/inspectProjectIosEasSetup.d.ts.map +1 -0
- package/dist/project/ios/inspectProjectIosEasSetup.js +18 -0
- package/dist/project/ios/inspectProjectIosEasSetup.js.map +1 -0
- package/dist/project/ios/normalizeProjectIosDesired.d.ts +13 -0
- package/dist/project/ios/normalizeProjectIosDesired.d.ts.map +1 -0
- package/dist/project/ios/normalizeProjectIosDesired.js +25 -0
- package/dist/project/ios/normalizeProjectIosDesired.js.map +1 -0
- package/dist/project/ios/readCurrentProjectIosDeployment.d.ts +8 -0
- package/dist/project/ios/readCurrentProjectIosDeployment.d.ts.map +1 -0
- package/dist/project/ios/readCurrentProjectIosDeployment.js +52 -0
- package/dist/project/ios/readCurrentProjectIosDeployment.js.map +1 -0
- package/dist/project/ios/recordProjectIosDeployment.d.ts +21 -0
- package/dist/project/ios/recordProjectIosDeployment.d.ts.map +1 -0
- package/dist/project/ios/recordProjectIosDeployment.js +36 -0
- package/dist/project/ios/recordProjectIosDeployment.js.map +1 -0
- package/dist/project/ios/resolveProjectIosDeploymentAccess.d.ts +9 -0
- package/dist/project/ios/resolveProjectIosDeploymentAccess.d.ts.map +1 -0
- package/dist/project/ios/resolveProjectIosDeploymentAccess.js +7 -0
- package/dist/project/ios/resolveProjectIosDeploymentAccess.js.map +1 -0
- package/dist/project/ios/scopeProjectIosDeploymentAccess.d.ts +3 -0
- package/dist/project/ios/scopeProjectIosDeploymentAccess.d.ts.map +1 -0
- package/dist/project/ios/scopeProjectIosDeploymentAccess.js +7 -0
- package/dist/project/ios/scopeProjectIosDeploymentAccess.js.map +1 -0
- package/dist/providers/appStoreConnect/AppStoreConnectIosState.d.ts +17 -0
- package/dist/providers/appStoreConnect/AppStoreConnectIosState.d.ts.map +1 -0
- package/dist/providers/appStoreConnect/AppStoreConnectIosState.js +2 -0
- package/dist/providers/appStoreConnect/AppStoreConnectIosState.js.map +1 -0
- package/dist/providers/appStoreConnect/AppStoreConnectPublicationResult.d.ts +19 -0
- package/dist/providers/appStoreConnect/AppStoreConnectPublicationResult.d.ts.map +1 -0
- package/dist/providers/appStoreConnect/AppStoreConnectPublicationResult.js +2 -0
- package/dist/providers/appStoreConnect/AppStoreConnectPublicationResult.js.map +1 -0
- package/dist/providers/appStoreConnect/AppStoreConnectRequestTracker.d.ts +9 -0
- package/dist/providers/appStoreConnect/AppStoreConnectRequestTracker.d.ts.map +1 -0
- package/dist/providers/appStoreConnect/AppStoreConnectRequestTracker.js +13 -0
- package/dist/providers/appStoreConnect/AppStoreConnectRequestTracker.js.map +1 -0
- package/dist/providers/appStoreConnect/AppStoreConnectTokenFactory.d.ts +8 -0
- package/dist/providers/appStoreConnect/AppStoreConnectTokenFactory.d.ts.map +1 -0
- package/dist/providers/appStoreConnect/AppStoreConnectTokenFactory.js +21 -0
- package/dist/providers/appStoreConnect/AppStoreConnectTokenFactory.js.map +1 -0
- package/dist/providers/appStoreConnect/AppStoreConnectTransport.d.ts +13 -0
- package/dist/providers/appStoreConnect/AppStoreConnectTransport.d.ts.map +1 -0
- package/dist/providers/appStoreConnect/AppStoreConnectTransport.js +15 -0
- package/dist/providers/appStoreConnect/AppStoreConnectTransport.js.map +1 -0
- package/dist/providers/appStoreConnect/AppStoreUploadTransport.d.ts +17 -0
- package/dist/providers/appStoreConnect/AppStoreUploadTransport.d.ts.map +1 -0
- package/dist/providers/appStoreConnect/AppStoreUploadTransport.js +12 -0
- package/dist/providers/appStoreConnect/AppStoreUploadTransport.js.map +1 -0
- package/dist/providers/appStoreConnect/BuildUploadOperation.d.ts +13 -0
- package/dist/providers/appStoreConnect/BuildUploadOperation.d.ts.map +1 -0
- package/dist/providers/appStoreConnect/BuildUploadOperation.js +2 -0
- package/dist/providers/appStoreConnect/BuildUploadOperation.js.map +1 -0
- package/dist/providers/appStoreConnect/appStoreConnectUrls.d.ts +10 -0
- package/dist/providers/appStoreConnect/appStoreConnectUrls.d.ts.map +1 -0
- package/dist/providers/appStoreConnect/appStoreConnectUrls.js +42 -0
- package/dist/providers/appStoreConnect/appStoreConnectUrls.js.map +1 -0
- package/dist/providers/appStoreConnect/attachAppStoreVersionBuild.d.ts +8 -0
- package/dist/providers/appStoreConnect/attachAppStoreVersionBuild.d.ts.map +1 -0
- package/dist/providers/appStoreConnect/attachAppStoreVersionBuild.js +12 -0
- package/dist/providers/appStoreConnect/attachAppStoreVersionBuild.js.map +1 -0
- package/dist/providers/appStoreConnect/commitAppStoreBuildUploadFile.d.ts +7 -0
- package/dist/providers/appStoreConnect/commitAppStoreBuildUploadFile.d.ts.map +1 -0
- package/dist/providers/appStoreConnect/commitAppStoreBuildUploadFile.js +18 -0
- package/dist/providers/appStoreConnect/commitAppStoreBuildUploadFile.js.map +1 -0
- package/dist/providers/appStoreConnect/createAppStoreBuildUpload.d.ts +9 -0
- package/dist/providers/appStoreConnect/createAppStoreBuildUpload.d.ts.map +1 -0
- package/dist/providers/appStoreConnect/createAppStoreBuildUpload.js +41 -0
- package/dist/providers/appStoreConnect/createAppStoreBuildUpload.js.map +1 -0
- package/dist/providers/appStoreConnect/createAppStoreConnectSetupAdapter.d.ts +7 -0
- package/dist/providers/appStoreConnect/createAppStoreConnectSetupAdapter.d.ts.map +1 -0
- package/dist/providers/appStoreConnect/createAppStoreConnectSetupAdapter.js +33 -0
- package/dist/providers/appStoreConnect/createAppStoreConnectSetupAdapter.js.map +1 -0
- package/dist/providers/appStoreConnect/downloadIosArchive.d.ts +9 -0
- package/dist/providers/appStoreConnect/downloadIosArchive.d.ts.map +1 -0
- package/dist/providers/appStoreConnect/downloadIosArchive.js +28 -0
- package/dist/providers/appStoreConnect/downloadIosArchive.js.map +1 -0
- package/dist/providers/appStoreConnect/executeBuildUploadOperations.d.ts +8 -0
- package/dist/providers/appStoreConnect/executeBuildUploadOperations.d.ts.map +1 -0
- package/dist/providers/appStoreConnect/executeBuildUploadOperations.js +15 -0
- package/dist/providers/appStoreConnect/executeBuildUploadOperations.js.map +1 -0
- package/dist/providers/appStoreConnect/inspectAppStoreConnectIos.d.ts +27 -0
- package/dist/providers/appStoreConnect/inspectAppStoreConnectIos.d.ts.map +1 -0
- package/dist/providers/appStoreConnect/inspectAppStoreConnectIos.js +177 -0
- package/dist/providers/appStoreConnect/inspectAppStoreConnectIos.js.map +1 -0
- package/dist/providers/appStoreConnect/parseBuildUploadFileReservation.d.ts +3 -0
- package/dist/providers/appStoreConnect/parseBuildUploadFileReservation.d.ts.map +1 -0
- package/dist/providers/appStoreConnect/parseBuildUploadFileReservation.js +81 -0
- package/dist/providers/appStoreConnect/parseBuildUploadFileReservation.js.map +1 -0
- package/dist/providers/appStoreConnect/prepareAppStoreVersion.d.ts +8 -0
- package/dist/providers/appStoreConnect/prepareAppStoreVersion.d.ts.map +1 -0
- package/dist/providers/appStoreConnect/prepareAppStoreVersion.js +66 -0
- package/dist/providers/appStoreConnect/prepareAppStoreVersion.js.map +1 -0
- package/dist/providers/appStoreConnect/publishIosToAppStoreConnect.d.ts +21 -0
- package/dist/providers/appStoreConnect/publishIosToAppStoreConnect.d.ts.map +1 -0
- package/dist/providers/appStoreConnect/publishIosToAppStoreConnect.js +124 -0
- package/dist/providers/appStoreConnect/publishIosToAppStoreConnect.js.map +1 -0
- package/dist/providers/appStoreConnect/reserveAppStoreBuildUploadFile.d.ts +9 -0
- package/dist/providers/appStoreConnect/reserveAppStoreBuildUploadFile.d.ts.map +1 -0
- package/dist/providers/appStoreConnect/reserveAppStoreBuildUploadFile.js +32 -0
- package/dist/providers/appStoreConnect/reserveAppStoreBuildUploadFile.js.map +1 -0
- package/dist/providers/appStoreConnect/resolveAppStoreConnectToken.d.ts +18 -0
- package/dist/providers/appStoreConnect/resolveAppStoreConnectToken.d.ts.map +1 -0
- package/dist/providers/appStoreConnect/resolveAppStoreConnectToken.js +64 -0
- package/dist/providers/appStoreConnect/resolveAppStoreConnectToken.js.map +1 -0
- package/dist/providers/appStoreConnect/verifyAppStoreConnectPublication.d.ts +23 -0
- package/dist/providers/appStoreConnect/verifyAppStoreConnectPublication.d.ts.map +1 -0
- package/dist/providers/appStoreConnect/verifyAppStoreConnectPublication.js +60 -0
- package/dist/providers/appStoreConnect/verifyAppStoreConnectPublication.js.map +1 -0
- package/dist/providers/appStoreConnect/verifyAppStoreVersionBuild.d.ts +9 -0
- package/dist/providers/appStoreConnect/verifyAppStoreVersionBuild.d.ts.map +1 -0
- package/dist/providers/appStoreConnect/verifyAppStoreVersionBuild.js +26 -0
- package/dist/providers/appStoreConnect/verifyAppStoreVersionBuild.js.map +1 -0
- package/dist/providers/appStoreConnect/waitForAppStoreBuildUpload.d.ts +14 -0
- package/dist/providers/appStoreConnect/waitForAppStoreBuildUpload.d.ts.map +1 -0
- package/dist/providers/appStoreConnect/waitForAppStoreBuildUpload.js +69 -0
- package/dist/providers/appStoreConnect/waitForAppStoreBuildUpload.js.map +1 -0
- package/dist/providers/eas/ios/EasIosBuildArtifact.d.ts +9 -0
- package/dist/providers/eas/ios/EasIosBuildArtifact.d.ts.map +1 -0
- package/dist/providers/eas/ios/EasIosBuildArtifact.js +2 -0
- package/dist/providers/eas/ios/EasIosBuildArtifact.js.map +1 -0
- package/dist/providers/eas/ios/buildIosWithEas.d.ts +26 -0
- package/dist/providers/eas/ios/buildIosWithEas.d.ts.map +1 -0
- package/dist/providers/eas/ios/buildIosWithEas.js +60 -0
- package/dist/providers/eas/ios/buildIosWithEas.js.map +1 -0
- package/dist/providers/eas/ios/generateLocalIosFingerprint.d.ts +15 -0
- package/dist/providers/eas/ios/generateLocalIosFingerprint.d.ts.map +1 -0
- package/dist/providers/eas/ios/generateLocalIosFingerprint.js +48 -0
- package/dist/providers/eas/ios/generateLocalIosFingerprint.js.map +1 -0
- package/dist/providers/eas/ios/inspectEasIosConfig.d.ts +28 -0
- package/dist/providers/eas/ios/inspectEasIosConfig.d.ts.map +1 -0
- package/dist/providers/eas/ios/inspectEasIosConfig.js +40 -0
- package/dist/providers/eas/ios/inspectEasIosConfig.js.map +1 -0
- package/dist/providers/eas/ios/parseEasIosBuild.d.ts +3 -0
- package/dist/providers/eas/ios/parseEasIosBuild.d.ts.map +1 -0
- package/dist/providers/eas/ios/parseEasIosBuild.js +41 -0
- package/dist/providers/eas/ios/parseEasIosBuild.js.map +1 -0
- package/dist/providers/eas/ios/parseEasIosConfig.d.ts +3 -0
- package/dist/providers/eas/ios/parseEasIosConfig.d.ts.map +1 -0
- package/dist/providers/eas/ios/parseEasIosConfig.js +56 -0
- package/dist/providers/eas/ios/parseEasIosConfig.js.map +1 -0
- package/dist/targets/ios/createIosDeploymentRevision.d.ts +3 -0
- package/dist/targets/ios/createIosDeploymentRevision.d.ts.map +1 -0
- package/dist/targets/ios/createIosDeploymentRevision.js +10 -0
- package/dist/targets/ios/createIosDeploymentRevision.js.map +1 -0
- package/dist/targets/ios/createIosTargetPlanContributor.d.ts +3 -0
- package/dist/targets/ios/createIosTargetPlanContributor.d.ts.map +1 -0
- package/dist/targets/ios/createIosTargetPlanContributor.js +26 -0
- package/dist/targets/ios/createIosTargetPlanContributor.js.map +1 -0
- package/dist/targets/ios/isIosDeploymentIntentValid.d.ts +3 -0
- package/dist/targets/ios/isIosDeploymentIntentValid.d.ts.map +1 -0
- package/dist/targets/ios/isIosDeploymentIntentValid.js +4 -0
- package/dist/targets/ios/isIosDeploymentIntentValid.js.map +1 -0
- package/dist/targets/ios/normalizeIosProviders.d.ts +16 -0
- package/dist/targets/ios/normalizeIosProviders.d.ts.map +1 -0
- package/dist/targets/ios/normalizeIosProviders.js +16 -0
- package/dist/targets/ios/normalizeIosProviders.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { resolveEasProcessEnvironment } from '../resolveEasProcessEnvironment';
|
|
2
|
+
import { parseEasIosBuild } from './parseEasIosBuild';
|
|
3
|
+
export async function buildIosWithEas(options) {
|
|
4
|
+
const environment = await resolveEasProcessEnvironment({ ...options, target: 'ios' });
|
|
5
|
+
if (!environment.ok)
|
|
6
|
+
return { status: 'action-required', action: environment.action };
|
|
7
|
+
const result = await options.runProcess({
|
|
8
|
+
command: 'eas',
|
|
9
|
+
args: buildArgs(options.buildProfile),
|
|
10
|
+
cwd: options.projectRoot,
|
|
11
|
+
...(environment.env === undefined ? {} : { env: environment.env }),
|
|
12
|
+
});
|
|
13
|
+
if (result.exitCode !== 0)
|
|
14
|
+
return failedBuild(result.stderr);
|
|
15
|
+
let parsed;
|
|
16
|
+
try {
|
|
17
|
+
parsed = JSON.parse(result.stdout);
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return failure('EAS_IOS_BUILD_INVALID', 'EAS iOS build returned an invalid result.');
|
|
21
|
+
}
|
|
22
|
+
const artifact = parseEasIosBuild(parsed, options.expectedFingerprint, options.buildProfile, options.expectedVersion);
|
|
23
|
+
return artifact === null
|
|
24
|
+
? failure('EAS_IOS_BUILD_INVALID', 'EAS iOS build returned an invalid result.')
|
|
25
|
+
: { status: 'completed', artifact };
|
|
26
|
+
}
|
|
27
|
+
function buildArgs(buildProfile) {
|
|
28
|
+
return [
|
|
29
|
+
'build',
|
|
30
|
+
'--platform',
|
|
31
|
+
'ios',
|
|
32
|
+
'--profile',
|
|
33
|
+
buildProfile,
|
|
34
|
+
'--json',
|
|
35
|
+
'--non-interactive',
|
|
36
|
+
'--wait',
|
|
37
|
+
];
|
|
38
|
+
}
|
|
39
|
+
function failedBuild(stderr) {
|
|
40
|
+
const lower = stderr.toLowerCase();
|
|
41
|
+
if (lower.includes('provisioning profile') ||
|
|
42
|
+
lower.includes('distribution certificate') ||
|
|
43
|
+
lower.includes('credential')) {
|
|
44
|
+
return {
|
|
45
|
+
status: 'action-required',
|
|
46
|
+
action: {
|
|
47
|
+
type: 'manual-action',
|
|
48
|
+
target: 'ios',
|
|
49
|
+
provider: 'eas',
|
|
50
|
+
code: 'EAS_IOS_SIGNING_SETUP_REQUIRED',
|
|
51
|
+
message: 'iOS signing credentials require EAS account or project setup.',
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
return failure('EAS_IOS_BUILD_FAILED', 'EAS iOS build failed.');
|
|
56
|
+
}
|
|
57
|
+
function failure(code, message) {
|
|
58
|
+
return { status: 'failed', failure: { code, message, target: 'ios', provider: 'eas' } };
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=buildIosWithEas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildIosWithEas.js","sourceRoot":"","sources":["../../../../src/providers/eas/ios/buildIosWithEas.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,4BAA4B,EAAE,MAAM,iCAAiC,CAAC;AAE/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAOtD,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAQrC;IACC,MAAM,WAAW,GAAG,MAAM,4BAA4B,CAAC,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACtF,IAAI,CAAC,WAAW,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC;IACtF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC;QACtC,OAAO,EAAE,KAAK;QACd,IAAI,EAAE,SAAS,CAAC,OAAO,CAAC,YAAY,CAAC;QACrC,GAAG,EAAE,OAAO,CAAC,WAAW;QACxB,GAAG,CAAC,WAAW,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,WAAW,CAAC,GAAG,EAAE,CAAC;KACnE,CAAC,CAAC;IACH,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC;QAAE,OAAO,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC7D,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC,uBAAuB,EAAE,2CAA2C,CAAC,CAAC;IACvF,CAAC;IACD,MAAM,QAAQ,GAAG,gBAAgB,CAC/B,MAAM,EACN,OAAO,CAAC,mBAAmB,EAC3B,OAAO,CAAC,YAAY,EACpB,OAAO,CAAC,eAAe,CACxB,CAAC;IACF,OAAO,QAAQ,KAAK,IAAI;QACtB,CAAC,CAAC,OAAO,CAAC,uBAAuB,EAAE,2CAA2C,CAAC;QAC/E,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;AACxC,CAAC;AAED,SAAS,SAAS,CAAC,YAAoB;IACrC,OAAO;QACL,OAAO;QACP,YAAY;QACZ,KAAK;QACL,WAAW;QACX,YAAY;QACZ,QAAQ;QACR,mBAAmB;QACnB,QAAQ;KACT,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,MAAc;IACjC,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IACnC,IACE,KAAK,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QACtC,KAAK,CAAC,QAAQ,CAAC,0BAA0B,CAAC;QAC1C,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,EAC5B,CAAC;QACD,OAAO;YACL,MAAM,EAAE,iBAAiB;YACzB,MAAM,EAAE;gBACN,IAAI,EAAE,eAAe;gBACrB,MAAM,EAAE,KAAK;gBACb,QAAQ,EAAE,KAAK;gBACf,IAAI,EAAE,gCAAgC;gBACtC,OAAO,EAAE,+DAA+D;aACzE;SACF,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC,sBAAsB,EAAE,uBAAuB,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,OAAO,CAAC,IAAY,EAAE,OAAe;IAC5C,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC;AAC1F,CAAC","sourcesContent":["import type { DeploymentCredentialReference } from '../../../domain/DeploymentCredentialReference';\nimport type { DeploymentFailure } from '../../../domain/DeploymentFailure';\nimport type { DeploymentRequiredAction } from '../../../domain/DeploymentRequiredAction';\nimport type { DeploymentSecretResolver } from '../../../domain/DeploymentSecretResolver';\nimport type { DeploymentProcessRunner } from '../../../runtime/process/DeploymentProcessRunner';\nimport { resolveEasProcessEnvironment } from '../resolveEasProcessEnvironment';\nimport type { EasIosBuildArtifact } from './EasIosBuildArtifact';\nimport { parseEasIosBuild } from './parseEasIosBuild';\n\nexport type EasIosBuildResult =\n | { readonly status: 'completed'; readonly artifact: EasIosBuildArtifact }\n | { readonly status: 'action-required'; readonly action: DeploymentRequiredAction }\n | { readonly status: 'failed'; readonly failure: DeploymentFailure };\n\nexport async function buildIosWithEas(options: {\n readonly projectRoot: string;\n readonly buildProfile: string;\n readonly expectedFingerprint: string;\n readonly expectedVersion: string;\n readonly credentials: readonly DeploymentCredentialReference[];\n readonly resolveSecret: DeploymentSecretResolver;\n readonly runProcess: DeploymentProcessRunner;\n}): Promise<EasIosBuildResult> {\n const environment = await resolveEasProcessEnvironment({ ...options, target: 'ios' });\n if (!environment.ok) return { status: 'action-required', action: environment.action };\n const result = await options.runProcess({\n command: 'eas',\n args: buildArgs(options.buildProfile),\n cwd: options.projectRoot,\n ...(environment.env === undefined ? {} : { env: environment.env }),\n });\n if (result.exitCode !== 0) return failedBuild(result.stderr);\n let parsed: unknown;\n try {\n parsed = JSON.parse(result.stdout);\n } catch {\n return failure('EAS_IOS_BUILD_INVALID', 'EAS iOS build returned an invalid result.');\n }\n const artifact = parseEasIosBuild(\n parsed,\n options.expectedFingerprint,\n options.buildProfile,\n options.expectedVersion,\n );\n return artifact === null\n ? failure('EAS_IOS_BUILD_INVALID', 'EAS iOS build returned an invalid result.')\n : { status: 'completed', artifact };\n}\n\nfunction buildArgs(buildProfile: string): readonly string[] {\n return [\n 'build',\n '--platform',\n 'ios',\n '--profile',\n buildProfile,\n '--json',\n '--non-interactive',\n '--wait',\n ];\n}\n\nfunction failedBuild(stderr: string): EasIosBuildResult {\n const lower = stderr.toLowerCase();\n if (\n lower.includes('provisioning profile') ||\n lower.includes('distribution certificate') ||\n lower.includes('credential')\n ) {\n return {\n status: 'action-required',\n action: {\n type: 'manual-action',\n target: 'ios',\n provider: 'eas',\n code: 'EAS_IOS_SIGNING_SETUP_REQUIRED',\n message: 'iOS signing credentials require EAS account or project setup.',\n },\n };\n }\n return failure('EAS_IOS_BUILD_FAILED', 'EAS iOS build failed.');\n}\n\nfunction failure(code: string, message: string): EasIosBuildResult {\n return { status: 'failed', failure: { code, message, target: 'ios', provider: 'eas' } };\n}\n"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { DeploymentFailure } from '../../../domain/DeploymentFailure';
|
|
2
|
+
import type { DeploymentProcessRunner } from '../../../runtime/process/DeploymentProcessRunner';
|
|
3
|
+
export type LocalIosFingerprintResult = {
|
|
4
|
+
readonly status: 'completed';
|
|
5
|
+
readonly fingerprint: string;
|
|
6
|
+
} | {
|
|
7
|
+
readonly status: 'failed';
|
|
8
|
+
readonly failure: DeploymentFailure;
|
|
9
|
+
};
|
|
10
|
+
export declare function generateLocalIosFingerprint(options: {
|
|
11
|
+
readonly projectRoot: string;
|
|
12
|
+
readonly profileEnvironment: Readonly<Record<string, string>>;
|
|
13
|
+
readonly runProcess: DeploymentProcessRunner;
|
|
14
|
+
}): Promise<LocalIosFingerprintResult>;
|
|
15
|
+
//# sourceMappingURL=generateLocalIosFingerprint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generateLocalIosFingerprint.d.ts","sourceRoot":"","sources":["../../../../src/providers/eas/ios/generateLocalIosFingerprint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,kDAAkD,CAAC;AAEhG,MAAM,MAAM,yBAAyB,GACjC;IAAE,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAC9D;IAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAA;CAAE,CAAC;AAavE,wBAAsB,2BAA2B,CAAC,OAAO,EAAE;IACzD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,kBAAkB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC9D,QAAQ,CAAC,UAAU,EAAE,uBAAuB,CAAC;CAC9C,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAgBrC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
const FINGERPRINT_SCRIPT = `
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
import { spawnSync } from 'node:child_process';
|
|
4
|
+
import * as Fingerprint from 'expo/fingerprint';
|
|
5
|
+
const marker = 'ios/Podfile';
|
|
6
|
+
const generic = existsSync(marker) && spawnSync('git', ['check-ignore', '--quiet', marker], { cwd: process.cwd() }).status !== 0;
|
|
7
|
+
const options = { platforms: ['ios'], silent: true, ...(generic ? {} : { ignorePaths: ['android/**/*', 'ios/**/*'] }) };
|
|
8
|
+
const result = await Fingerprint.createFingerprintAsync(process.cwd(), options);
|
|
9
|
+
process.stdout.write(JSON.stringify({ hash: result.hash }));
|
|
10
|
+
`;
|
|
11
|
+
export async function generateLocalIosFingerprint(options) {
|
|
12
|
+
const result = await options.runProcess({
|
|
13
|
+
command: 'node',
|
|
14
|
+
args: ['--input-type=module', '--eval', FINGERPRINT_SCRIPT],
|
|
15
|
+
cwd: options.projectRoot,
|
|
16
|
+
env: options.profileEnvironment,
|
|
17
|
+
});
|
|
18
|
+
if (result.exitCode !== 0)
|
|
19
|
+
return failure();
|
|
20
|
+
let parsed;
|
|
21
|
+
try {
|
|
22
|
+
parsed = JSON.parse(result.stdout);
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return failure();
|
|
26
|
+
}
|
|
27
|
+
if (!isFingerprintResult(parsed))
|
|
28
|
+
return failure();
|
|
29
|
+
return { status: 'completed', fingerprint: parsed.hash };
|
|
30
|
+
}
|
|
31
|
+
function isFingerprintResult(value) {
|
|
32
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value))
|
|
33
|
+
return false;
|
|
34
|
+
const hash = value.hash;
|
|
35
|
+
return typeof hash === 'string' && /^[a-f\d]{32,128}$/i.test(hash);
|
|
36
|
+
}
|
|
37
|
+
function failure() {
|
|
38
|
+
return {
|
|
39
|
+
status: 'failed',
|
|
40
|
+
failure: {
|
|
41
|
+
code: 'IOS_FINGERPRINT_FAILED',
|
|
42
|
+
message: 'iOS project fingerprint could not be generated.',
|
|
43
|
+
target: 'ios',
|
|
44
|
+
provider: 'eas',
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=generateLocalIosFingerprint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generateLocalIosFingerprint.js","sourceRoot":"","sources":["../../../../src/providers/eas/ios/generateLocalIosFingerprint.ts"],"names":[],"mappings":"AAOA,MAAM,kBAAkB,GAAG;;;;;;;;;CAS1B,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAAC,OAIjD;IACC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC;QACtC,OAAO,EAAE,MAAM;QACf,IAAI,EAAE,CAAC,qBAAqB,EAAE,QAAQ,EAAE,kBAAkB,CAAC;QAC3D,GAAG,EAAE,OAAO,CAAC,WAAW;QACxB,GAAG,EAAE,OAAO,CAAC,kBAAkB;KAChC,CAAC,CAAC;IACH,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC;QAAE,OAAO,OAAO,EAAE,CAAC;IAC5C,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,EAAE,CAAC;IACnB,CAAC;IACD,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC;QAAE,OAAO,OAAO,EAAE,CAAC;IACnD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;AAC3D,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAc;IACzC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACtF,MAAM,IAAI,GAAI,KAAiC,CAAC,IAAI,CAAC;IACrD,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,OAAO;IACd,OAAO;QACL,MAAM,EAAE,QAAQ;QAChB,OAAO,EAAE;YACP,IAAI,EAAE,wBAAwB;YAC9B,OAAO,EAAE,iDAAiD;YAC1D,MAAM,EAAE,KAAK;YACb,QAAQ,EAAE,KAAK;SAChB;KACF,CAAC;AACJ,CAAC","sourcesContent":["import type { DeploymentFailure } from '../../../domain/DeploymentFailure';\nimport type { DeploymentProcessRunner } from '../../../runtime/process/DeploymentProcessRunner';\n\nexport type LocalIosFingerprintResult =\n | { readonly status: 'completed'; readonly fingerprint: string }\n | { readonly status: 'failed'; readonly failure: DeploymentFailure };\n\nconst FINGERPRINT_SCRIPT = `\nimport { existsSync } from 'node:fs';\nimport { spawnSync } from 'node:child_process';\nimport * as Fingerprint from 'expo/fingerprint';\nconst marker = 'ios/Podfile';\nconst generic = existsSync(marker) && spawnSync('git', ['check-ignore', '--quiet', marker], { cwd: process.cwd() }).status !== 0;\nconst options = { platforms: ['ios'], silent: true, ...(generic ? {} : { ignorePaths: ['android/**/*', 'ios/**/*'] }) };\nconst result = await Fingerprint.createFingerprintAsync(process.cwd(), options);\nprocess.stdout.write(JSON.stringify({ hash: result.hash }));\n`;\n\nexport async function generateLocalIosFingerprint(options: {\n readonly projectRoot: string;\n readonly profileEnvironment: Readonly<Record<string, string>>;\n readonly runProcess: DeploymentProcessRunner;\n}): Promise<LocalIosFingerprintResult> {\n const result = await options.runProcess({\n command: 'node',\n args: ['--input-type=module', '--eval', FINGERPRINT_SCRIPT],\n cwd: options.projectRoot,\n env: options.profileEnvironment,\n });\n if (result.exitCode !== 0) return failure();\n let parsed: unknown;\n try {\n parsed = JSON.parse(result.stdout);\n } catch {\n return failure();\n }\n if (!isFingerprintResult(parsed)) return failure();\n return { status: 'completed', fingerprint: parsed.hash };\n}\n\nfunction isFingerprintResult(value: unknown): value is { readonly hash: string } {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return false;\n const hash = (value as Record<string, unknown>).hash;\n return typeof hash === 'string' && /^[a-f\\d]{32,128}$/i.test(hash);\n}\n\nfunction failure(): LocalIosFingerprintResult {\n return {\n status: 'failed',\n failure: {\n code: 'IOS_FINGERPRINT_FAILED',\n message: 'iOS project fingerprint could not be generated.',\n target: 'ios',\n provider: 'eas',\n },\n };\n}\n"]}
|
|
@@ -0,0 +1,28 @@
|
|
|
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
|
+
export interface EasIosConfigSnapshot {
|
|
7
|
+
readonly bundleIdentifier: string;
|
|
8
|
+
readonly profileEnvironment: Readonly<Record<string, string>>;
|
|
9
|
+
}
|
|
10
|
+
export type EasIosConfigResult = {
|
|
11
|
+
readonly status: 'completed';
|
|
12
|
+
readonly config: EasIosConfigSnapshot;
|
|
13
|
+
} | {
|
|
14
|
+
readonly status: 'action-required';
|
|
15
|
+
readonly action: DeploymentRequiredAction;
|
|
16
|
+
} | {
|
|
17
|
+
readonly status: 'failed';
|
|
18
|
+
readonly failure: DeploymentFailure;
|
|
19
|
+
};
|
|
20
|
+
export declare function inspectEasIosConfig(options: {
|
|
21
|
+
readonly projectRoot: string;
|
|
22
|
+
readonly bundleIdentifier: string;
|
|
23
|
+
readonly buildProfile: string;
|
|
24
|
+
readonly credentials: readonly DeploymentCredentialReference[];
|
|
25
|
+
readonly resolveSecret: DeploymentSecretResolver;
|
|
26
|
+
readonly runProcess: DeploymentProcessRunner;
|
|
27
|
+
}): Promise<EasIosConfigResult>;
|
|
28
|
+
//# sourceMappingURL=inspectEasIosConfig.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspectEasIosConfig.d.ts","sourceRoot":"","sources":["../../../../src/providers/eas/ios/inspectEasIosConfig.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;AAIhG,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,kBAAkB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC/D;AAED,MAAM,MAAM,kBAAkB,GAC1B;IAAE,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAA;CAAE,GACvE;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,mBAAmB,CAAC,OAAO,EAAE;IACjD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,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,kBAAkB,CAAC,CA0B9B"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { resolveEasProcessEnvironment } from '../resolveEasProcessEnvironment';
|
|
2
|
+
import { parseEasIosConfig } from './parseEasIosConfig';
|
|
3
|
+
export async function inspectEasIosConfig(options) {
|
|
4
|
+
if (options.buildProfile.trim().length === 0)
|
|
5
|
+
return invalidProfile();
|
|
6
|
+
const environment = await resolveEasProcessEnvironment({ ...options, target: 'ios' });
|
|
7
|
+
if (!environment.ok)
|
|
8
|
+
return { status: 'action-required', action: environment.action };
|
|
9
|
+
const result = await options.runProcess({
|
|
10
|
+
command: 'eas',
|
|
11
|
+
args: [
|
|
12
|
+
'config',
|
|
13
|
+
'--platform',
|
|
14
|
+
'ios',
|
|
15
|
+
'--profile',
|
|
16
|
+
options.buildProfile,
|
|
17
|
+
'--json',
|
|
18
|
+
'--non-interactive',
|
|
19
|
+
],
|
|
20
|
+
cwd: options.projectRoot,
|
|
21
|
+
...(environment.env === undefined ? {} : { env: environment.env }),
|
|
22
|
+
});
|
|
23
|
+
if (result.exitCode !== 0)
|
|
24
|
+
return failure('EAS_IOS_CONFIG_FAILED');
|
|
25
|
+
let parsed;
|
|
26
|
+
try {
|
|
27
|
+
parsed = JSON.parse(result.stdout);
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return failure('EAS_IOS_CONFIG_INVALID');
|
|
31
|
+
}
|
|
32
|
+
return parseEasIosConfig(parsed, options.bundleIdentifier);
|
|
33
|
+
}
|
|
34
|
+
function invalidProfile() {
|
|
35
|
+
return failure('INVALID_IOS_BUILD_PROFILE', 'iOS build profile is invalid.');
|
|
36
|
+
}
|
|
37
|
+
function failure(code, message = 'EAS iOS project configuration could not be inspected.') {
|
|
38
|
+
return { status: 'failed', failure: { code, message, target: 'ios', provider: 'eas' } };
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=inspectEasIosConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspectEasIosConfig.js","sourceRoot":"","sources":["../../../../src/providers/eas/ios/inspectEasIosConfig.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,4BAA4B,EAAE,MAAM,iCAAiC,CAAC;AAC/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAYxD,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,OAOzC;IACC,IAAI,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,cAAc,EAAE,CAAC;IACtE,MAAM,WAAW,GAAG,MAAM,4BAA4B,CAAC,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACtF,IAAI,CAAC,WAAW,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC;IACtF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC;QACtC,OAAO,EAAE,KAAK;QACd,IAAI,EAAE;YACJ,QAAQ;YACR,YAAY;YACZ,KAAK;YACL,WAAW;YACX,OAAO,CAAC,YAAY;YACpB,QAAQ;YACR,mBAAmB;SACpB;QACD,GAAG,EAAE,OAAO,CAAC,WAAW;QACxB,GAAG,CAAC,WAAW,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,WAAW,CAAC,GAAG,EAAE,CAAC;KACnE,CAAC,CAAC;IACH,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC,uBAAuB,CAAC,CAAC;IACnE,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC,wBAAwB,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAC7D,CAAC;AAED,SAAS,cAAc;IACrB,OAAO,OAAO,CAAC,2BAA2B,EAAE,+BAA+B,CAAC,CAAC;AAC/E,CAAC;AAED,SAAS,OAAO,CACd,IAAY,EACZ,OAAO,GAAG,uDAAuD;IAEjE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC;AAC1F,CAAC","sourcesContent":["import type { DeploymentCredentialReference } from '../../../domain/DeploymentCredentialReference';\nimport type { DeploymentFailure } from '../../../domain/DeploymentFailure';\nimport type { DeploymentRequiredAction } from '../../../domain/DeploymentRequiredAction';\nimport type { DeploymentSecretResolver } from '../../../domain/DeploymentSecretResolver';\nimport type { DeploymentProcessRunner } from '../../../runtime/process/DeploymentProcessRunner';\nimport { resolveEasProcessEnvironment } from '../resolveEasProcessEnvironment';\nimport { parseEasIosConfig } from './parseEasIosConfig';\n\nexport interface EasIosConfigSnapshot {\n readonly bundleIdentifier: string;\n readonly profileEnvironment: Readonly<Record<string, string>>;\n}\n\nexport type EasIosConfigResult =\n | { readonly status: 'completed'; readonly config: EasIosConfigSnapshot }\n | { readonly status: 'action-required'; readonly action: DeploymentRequiredAction }\n | { readonly status: 'failed'; readonly failure: DeploymentFailure };\n\nexport async function inspectEasIosConfig(options: {\n readonly projectRoot: string;\n readonly bundleIdentifier: string;\n readonly buildProfile: string;\n readonly credentials: readonly DeploymentCredentialReference[];\n readonly resolveSecret: DeploymentSecretResolver;\n readonly runProcess: DeploymentProcessRunner;\n}): Promise<EasIosConfigResult> {\n if (options.buildProfile.trim().length === 0) return invalidProfile();\n const environment = await resolveEasProcessEnvironment({ ...options, target: 'ios' });\n if (!environment.ok) return { status: 'action-required', action: environment.action };\n const result = await options.runProcess({\n command: 'eas',\n args: [\n 'config',\n '--platform',\n 'ios',\n '--profile',\n options.buildProfile,\n '--json',\n '--non-interactive',\n ],\n cwd: options.projectRoot,\n ...(environment.env === undefined ? {} : { env: environment.env }),\n });\n if (result.exitCode !== 0) return failure('EAS_IOS_CONFIG_FAILED');\n let parsed: unknown;\n try {\n parsed = JSON.parse(result.stdout);\n } catch {\n return failure('EAS_IOS_CONFIG_INVALID');\n }\n return parseEasIosConfig(parsed, options.bundleIdentifier);\n}\n\nfunction invalidProfile(): EasIosConfigResult {\n return failure('INVALID_IOS_BUILD_PROFILE', 'iOS build profile is invalid.');\n}\n\nfunction failure(\n code: string,\n message = 'EAS iOS project configuration could not be inspected.',\n): EasIosConfigResult {\n return { status: 'failed', failure: { code, message, target: 'ios', provider: 'eas' } };\n}\n"]}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { EasIosBuildArtifact } from './EasIosBuildArtifact';
|
|
2
|
+
export declare function parseEasIosBuild(value: unknown, expectedFingerprint: string, expectedProfile: string, expectedVersion: string): EasIosBuildArtifact | null;
|
|
3
|
+
//# sourceMappingURL=parseEasIosBuild.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseEasIosBuild.d.ts","sourceRoot":"","sources":["../../../../src/providers/eas/ios/parseEasIosBuild.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAEjE,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,OAAO,EACd,mBAAmB,EAAE,MAAM,EAC3B,eAAe,EAAE,MAAM,EACvB,eAAe,EAAE,MAAM,GACtB,mBAAmB,GAAG,IAAI,CAgB5B"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export function parseEasIosBuild(value, expectedFingerprint, expectedProfile, expectedVersion) {
|
|
2
|
+
if (!Array.isArray(value) || value.length !== 1 || !isRecord(value[0]))
|
|
3
|
+
return null;
|
|
4
|
+
const build = value[0];
|
|
5
|
+
if (build.status !== 'FINISHED' || build.platform !== 'IOS')
|
|
6
|
+
return null;
|
|
7
|
+
if (!isNonEmptyString(build.id) || build.buildProfile !== expectedProfile)
|
|
8
|
+
return null;
|
|
9
|
+
if (!isRecord(build.fingerprint) || build.fingerprint.hash !== expectedFingerprint)
|
|
10
|
+
return null;
|
|
11
|
+
if (!isRecord(build.artifacts) || !isHttpUrl(build.artifacts.applicationArchiveUrl))
|
|
12
|
+
return null;
|
|
13
|
+
if (build.appVersion !== expectedVersion || !isNonEmptyString(build.appBuildVersion))
|
|
14
|
+
return null;
|
|
15
|
+
return {
|
|
16
|
+
buildId: build.id,
|
|
17
|
+
buildProfile: expectedProfile,
|
|
18
|
+
fingerprint: expectedFingerprint,
|
|
19
|
+
version: expectedVersion,
|
|
20
|
+
buildNumber: build.appBuildVersion,
|
|
21
|
+
archiveUrl: build.artifacts.applicationArchiveUrl,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
function isHttpUrl(value) {
|
|
25
|
+
if (!isNonEmptyString(value))
|
|
26
|
+
return false;
|
|
27
|
+
try {
|
|
28
|
+
const parsed = new URL(value);
|
|
29
|
+
return parsed.protocol === 'https:' || parsed.protocol === 'http:';
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
function isRecord(value) {
|
|
36
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
37
|
+
}
|
|
38
|
+
function isNonEmptyString(value) {
|
|
39
|
+
return typeof value === 'string' && value.trim().length > 0;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=parseEasIosBuild.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseEasIosBuild.js","sourceRoot":"","sources":["../../../../src/providers/eas/ios/parseEasIosBuild.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,gBAAgB,CAC9B,KAAc,EACd,mBAA2B,EAC3B,eAAuB,EACvB,eAAuB;IAEvB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpF,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACvB,IAAI,KAAK,CAAC,MAAM,KAAK,UAAU,IAAI,KAAK,CAAC,QAAQ,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC;IACzE,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,YAAY,KAAK,eAAe;QAAE,OAAO,IAAI,CAAC;IACvF,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,WAAW,CAAC,IAAI,KAAK,mBAAmB;QAAE,OAAO,IAAI,CAAC;IAChG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,qBAAqB,CAAC;QAAE,OAAO,IAAI,CAAC;IACjG,IAAI,KAAK,CAAC,UAAU,KAAK,eAAe,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,eAAe,CAAC;QAAE,OAAO,IAAI,CAAC;IAClG,OAAO;QACL,OAAO,EAAE,KAAK,CAAC,EAAE;QACjB,YAAY,EAAE,eAAe;QAC7B,WAAW,EAAE,mBAAmB;QAChC,OAAO,EAAE,eAAe;QACxB,WAAW,EAAE,KAAK,CAAC,eAAe;QAClC,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC,qBAAqB;KAClD,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;QAC9B,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC;IACrE,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;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 { EasIosBuildArtifact } from './EasIosBuildArtifact';\n\nexport function parseEasIosBuild(\n value: unknown,\n expectedFingerprint: string,\n expectedProfile: string,\n expectedVersion: string,\n): EasIosBuildArtifact | null {\n if (!Array.isArray(value) || value.length !== 1 || !isRecord(value[0])) return null;\n const build = value[0];\n if (build.status !== 'FINISHED' || build.platform !== 'IOS') return null;\n if (!isNonEmptyString(build.id) || build.buildProfile !== expectedProfile) return null;\n if (!isRecord(build.fingerprint) || build.fingerprint.hash !== expectedFingerprint) return null;\n if (!isRecord(build.artifacts) || !isHttpUrl(build.artifacts.applicationArchiveUrl)) return null;\n if (build.appVersion !== expectedVersion || !isNonEmptyString(build.appBuildVersion)) return null;\n return {\n buildId: build.id,\n buildProfile: expectedProfile,\n fingerprint: expectedFingerprint,\n version: expectedVersion,\n buildNumber: build.appBuildVersion,\n archiveUrl: build.artifacts.applicationArchiveUrl,\n };\n}\n\nfunction isHttpUrl(value: unknown): value is string {\n if (!isNonEmptyString(value)) return false;\n try {\n const parsed = new URL(value);\n return parsed.protocol === 'https:' || parsed.protocol === 'http:';\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\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === 'string' && value.trim().length > 0;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseEasIosConfig.d.ts","sourceRoot":"","sources":["../../../../src/providers/eas/ios/parseEasIosConfig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAwB,MAAM,uBAAuB,CAAC;AAEtF,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,OAAO,EACd,wBAAwB,EAAE,MAAM,GAC/B,kBAAkB,CAwBpB"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
export function parseEasIosConfig(value, expectedBundleIdentifier) {
|
|
2
|
+
if (!isRecord(value) || !isRecord(value.buildProfile) || !isRecord(value.appConfig)) {
|
|
3
|
+
return failure('EAS_IOS_CONFIG_INVALID');
|
|
4
|
+
}
|
|
5
|
+
const iosConfig = value.appConfig.ios;
|
|
6
|
+
if (!isRecord(iosConfig) || !isNonEmptyString(iosConfig.bundleIdentifier)) {
|
|
7
|
+
return failure('EAS_IOS_BUNDLE_IDENTIFIER_MISSING');
|
|
8
|
+
}
|
|
9
|
+
if (iosConfig.bundleIdentifier !== expectedBundleIdentifier) {
|
|
10
|
+
return failure('IOS_BUNDLE_IDENTIFIER_MISMATCH', 'EAS iOS bundle identifier does not match deployment config.');
|
|
11
|
+
}
|
|
12
|
+
if (!isStoreProfile(value.buildProfile)) {
|
|
13
|
+
return failure('EAS_IOS_PROFILE_NOT_STORE_READY', 'EAS iOS build profile is not store-ready.');
|
|
14
|
+
}
|
|
15
|
+
const environment = normalizeEnvironment(value.buildProfile.env);
|
|
16
|
+
if (environment === null)
|
|
17
|
+
return failure('EAS_IOS_CONFIG_INVALID');
|
|
18
|
+
const config = {
|
|
19
|
+
bundleIdentifier: iosConfig.bundleIdentifier,
|
|
20
|
+
profileEnvironment: environment,
|
|
21
|
+
};
|
|
22
|
+
return { status: 'completed', config };
|
|
23
|
+
}
|
|
24
|
+
function isStoreProfile(profile) {
|
|
25
|
+
if (profile.developmentClient === true || profile.distribution === 'internal')
|
|
26
|
+
return false;
|
|
27
|
+
if (profile.withoutCredentials === true)
|
|
28
|
+
return false;
|
|
29
|
+
if (profile.ios === undefined)
|
|
30
|
+
return true;
|
|
31
|
+
if (!isRecord(profile.ios))
|
|
32
|
+
return false;
|
|
33
|
+
if (profile.ios.simulator === true || profile.ios.withoutCredentials === true)
|
|
34
|
+
return false;
|
|
35
|
+
return profile.ios.distribution !== 'internal';
|
|
36
|
+
}
|
|
37
|
+
function normalizeEnvironment(value) {
|
|
38
|
+
if (value === undefined)
|
|
39
|
+
return {};
|
|
40
|
+
if (!isRecord(value))
|
|
41
|
+
return null;
|
|
42
|
+
const entries = Object.entries(value);
|
|
43
|
+
if (entries.some(([, item]) => typeof item !== 'string'))
|
|
44
|
+
return null;
|
|
45
|
+
return Object.fromEntries(entries);
|
|
46
|
+
}
|
|
47
|
+
function failure(code, message = 'EAS iOS configuration is invalid.') {
|
|
48
|
+
return { status: 'failed', failure: { code, message, target: 'ios', provider: 'eas' } };
|
|
49
|
+
}
|
|
50
|
+
function isRecord(value) {
|
|
51
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
52
|
+
}
|
|
53
|
+
function isNonEmptyString(value) {
|
|
54
|
+
return typeof value === 'string' && value.trim().length > 0;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=parseEasIosConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseEasIosConfig.js","sourceRoot":"","sources":["../../../../src/providers/eas/ios/parseEasIosConfig.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,iBAAiB,CAC/B,KAAc,EACd,wBAAgC;IAEhC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;QACpF,OAAO,OAAO,CAAC,wBAAwB,CAAC,CAAC;IAC3C,CAAC;IACD,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC;IACtC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC1E,OAAO,OAAO,CAAC,mCAAmC,CAAC,CAAC;IACtD,CAAC;IACD,IAAI,SAAS,CAAC,gBAAgB,KAAK,wBAAwB,EAAE,CAAC;QAC5D,OAAO,OAAO,CACZ,gCAAgC,EAChC,6DAA6D,CAC9D,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;QACxC,OAAO,OAAO,CAAC,iCAAiC,EAAE,2CAA2C,CAAC,CAAC;IACjG,CAAC;IACD,MAAM,WAAW,GAAG,oBAAoB,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IACjE,IAAI,WAAW,KAAK,IAAI;QAAE,OAAO,OAAO,CAAC,wBAAwB,CAAC,CAAC;IACnE,MAAM,MAAM,GAAyB;QACnC,gBAAgB,EAAE,SAAS,CAAC,gBAAgB;QAC5C,kBAAkB,EAAE,WAAW;KAChC,CAAC;IACF,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;AACzC,CAAC;AAED,SAAS,cAAc,CAAC,OAAgC;IACtD,IAAI,OAAO,CAAC,iBAAiB,KAAK,IAAI,IAAI,OAAO,CAAC,YAAY,KAAK,UAAU;QAAE,OAAO,KAAK,CAAC;IAC5F,IAAI,OAAO,CAAC,kBAAkB,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IACtD,IAAI,OAAO,CAAC,GAAG,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAC3C,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IACzC,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC5F,OAAO,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,UAAU,CAAC;AACjD,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc;IAC1C,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACnC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAClC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACtC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IACtE,OAAO,MAAM,CAAC,WAAW,CAAC,OAAO,CAAqC,CAAC;AACzE,CAAC;AAED,SAAS,OAAO,CAAC,IAAY,EAAE,OAAO,GAAG,mCAAmC;IAC1E,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC;AAC1F,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 { EasIosConfigResult, EasIosConfigSnapshot } from './inspectEasIosConfig';\n\nexport function parseEasIosConfig(\n value: unknown,\n expectedBundleIdentifier: string,\n): EasIosConfigResult {\n if (!isRecord(value) || !isRecord(value.buildProfile) || !isRecord(value.appConfig)) {\n return failure('EAS_IOS_CONFIG_INVALID');\n }\n const iosConfig = value.appConfig.ios;\n if (!isRecord(iosConfig) || !isNonEmptyString(iosConfig.bundleIdentifier)) {\n return failure('EAS_IOS_BUNDLE_IDENTIFIER_MISSING');\n }\n if (iosConfig.bundleIdentifier !== expectedBundleIdentifier) {\n return failure(\n 'IOS_BUNDLE_IDENTIFIER_MISMATCH',\n 'EAS iOS bundle identifier does not match deployment config.',\n );\n }\n if (!isStoreProfile(value.buildProfile)) {\n return failure('EAS_IOS_PROFILE_NOT_STORE_READY', 'EAS iOS build profile is not store-ready.');\n }\n const environment = normalizeEnvironment(value.buildProfile.env);\n if (environment === null) return failure('EAS_IOS_CONFIG_INVALID');\n const config: EasIosConfigSnapshot = {\n bundleIdentifier: iosConfig.bundleIdentifier,\n profileEnvironment: environment,\n };\n return { status: 'completed', config };\n}\n\nfunction isStoreProfile(profile: Record<string, unknown>): boolean {\n if (profile.developmentClient === true || profile.distribution === 'internal') return false;\n if (profile.withoutCredentials === true) return false;\n if (profile.ios === undefined) return true;\n if (!isRecord(profile.ios)) return false;\n if (profile.ios.simulator === true || profile.ios.withoutCredentials === true) return false;\n return profile.ios.distribution !== 'internal';\n}\n\nfunction normalizeEnvironment(value: unknown): Readonly<Record<string, string>> | null {\n if (value === undefined) return {};\n if (!isRecord(value)) return null;\n const entries = Object.entries(value);\n if (entries.some(([, item]) => typeof item !== 'string')) return null;\n return Object.fromEntries(entries) as Readonly<Record<string, string>>;\n}\n\nfunction failure(code: string, message = 'EAS iOS configuration is invalid.'): EasIosConfigResult {\n return { status: 'failed', failure: { code, message, target: 'ios', provider: 'eas' } };\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 @@
|
|
|
1
|
+
{"version":3,"file":"createIosDeploymentRevision.d.ts","sourceRoot":"","sources":["../../../src/targets/ios/createIosDeploymentRevision.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAE5E,wBAAgB,2BAA2B,CACzC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,mBAAmB,GAC1B,MAAM,CAOR"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
export function createIosDeploymentRevision(fingerprint, intent) {
|
|
3
|
+
const canonical = JSON.stringify({
|
|
4
|
+
fingerprint,
|
|
5
|
+
buildProfile: intent.buildProfile,
|
|
6
|
+
version: intent.version,
|
|
7
|
+
});
|
|
8
|
+
return createHash('sha256').update(canonical).digest('hex');
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=createIosDeploymentRevision.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createIosDeploymentRevision.js","sourceRoot":"","sources":["../../../src/targets/ios/createIosDeploymentRevision.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAIzC,MAAM,UAAU,2BAA2B,CACzC,WAAmB,EACnB,MAA2B;IAE3B,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAC/B,WAAW;QACX,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,OAAO,EAAE,MAAM,CAAC,OAAO;KACxB,CAAC,CAAC;IACH,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC9D,CAAC","sourcesContent":["import { createHash } from 'node:crypto';\n\nimport type { IosDeploymentIntent } from '../../domain/IosDeploymentIntent';\n\nexport function createIosDeploymentRevision(\n fingerprint: string,\n intent: IosDeploymentIntent,\n): string {\n const canonical = JSON.stringify({\n fingerprint,\n buildProfile: intent.buildProfile,\n version: intent.version,\n });\n return createHash('sha256').update(canonical).digest('hex');\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createIosTargetPlanContributor.d.ts","sourceRoot":"","sources":["../../../src/targets/ios/createIosTargetPlanContributor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,8CAA8C,CAAC;AAEpG,wBAAgB,8BAA8B,IAAI,+BAA+B,CAMhF"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export function createIosTargetPlanContributor() {
|
|
2
|
+
return {
|
|
3
|
+
target: 'ios',
|
|
4
|
+
capabilities: ['prepare', 'build', 'publish', 'verify'],
|
|
5
|
+
createSteps: createIosSteps,
|
|
6
|
+
};
|
|
7
|
+
}
|
|
8
|
+
function createIosSteps(change) {
|
|
9
|
+
if (change.target !== 'ios' || change.kind === 'none')
|
|
10
|
+
return [];
|
|
11
|
+
if (change.kind === 'remove')
|
|
12
|
+
return [removeStep(change.reason)];
|
|
13
|
+
return [
|
|
14
|
+
step('ios:prepare', 'prepare', 'run', 'eas', change.reason),
|
|
15
|
+
step('ios:build', 'build', change.kind, 'eas', change.reason),
|
|
16
|
+
step('ios:publish', 'publish', change.kind, 'app-store-connect', change.reason),
|
|
17
|
+
step('ios:verify', 'verify', 'run', 'app-store-connect', change.reason),
|
|
18
|
+
];
|
|
19
|
+
}
|
|
20
|
+
function removeStep(reason) {
|
|
21
|
+
return step('ios:remove', 'publish', 'remove', 'app-store-connect', reason);
|
|
22
|
+
}
|
|
23
|
+
function step(id, phase, operation, provider, reason) {
|
|
24
|
+
return { id, target: 'ios', phase, operation, provider, reason };
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=createIosTargetPlanContributor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createIosTargetPlanContributor.js","sourceRoot":"","sources":["../../../src/targets/ios/createIosTargetPlanContributor.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,8BAA8B;IAC5C,OAAO;QACL,MAAM,EAAE,KAAK;QACb,YAAY,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC;QACvD,WAAW,EAAE,cAAc;KAC5B,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,MAA8B;IACpD,IAAI,MAAM,CAAC,MAAM,KAAK,KAAK,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,EAAE,CAAC;IACjE,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IACjE,OAAO;QACL,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;QAC3D,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;QAC7D,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,MAAM,CAAC,IAAI,EAAE,mBAAmB,EAAE,MAAM,CAAC,MAAM,CAAC;QAC/E,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE,mBAAmB,EAAE,MAAM,CAAC,MAAM,CAAC;KACxE,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,MAAc;IAChC,OAAO,IAAI,CAAC,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,IAAI,CACX,EAAU,EACV,KAAkC,EAClC,SAA0C,EAC1C,QAAgB,EAChB,MAAc;IAEd,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AACnE,CAAC","sourcesContent":["import type { DeploymentPlanStep } from '../../domain/DeploymentPlanStep';\nimport type { DeploymentTargetChange } from '../../domain/DeploymentTargetChange';\nimport type { DeploymentTargetPlanContributor } from '../../domain/DeploymentTargetPlanContributor';\n\nexport function createIosTargetPlanContributor(): DeploymentTargetPlanContributor {\n return {\n target: 'ios',\n capabilities: ['prepare', 'build', 'publish', 'verify'],\n createSteps: createIosSteps,\n };\n}\n\nfunction createIosSteps(change: DeploymentTargetChange): readonly DeploymentPlanStep[] {\n if (change.target !== 'ios' || change.kind === 'none') return [];\n if (change.kind === 'remove') return [removeStep(change.reason)];\n return [\n step('ios:prepare', 'prepare', 'run', 'eas', change.reason),\n step('ios:build', 'build', change.kind, 'eas', change.reason),\n step('ios:publish', 'publish', change.kind, 'app-store-connect', change.reason),\n step('ios:verify', 'verify', 'run', 'app-store-connect', change.reason),\n ];\n}\n\nfunction removeStep(reason: string): DeploymentPlanStep {\n return step('ios:remove', 'publish', 'remove', 'app-store-connect', reason);\n}\n\nfunction step(\n id: string,\n phase: DeploymentPlanStep['phase'],\n operation: DeploymentPlanStep['operation'],\n provider: string,\n reason: string,\n): DeploymentPlanStep {\n return { id, target: 'ios', phase, operation, provider, reason };\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isIosDeploymentIntentValid.d.ts","sourceRoot":"","sources":["../../../src/targets/ios/isIosDeploymentIntentValid.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAE5E,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAE/E"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isIosDeploymentIntentValid.js","sourceRoot":"","sources":["../../../src/targets/ios/isIosDeploymentIntentValid.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,0BAA0B,CAAC,MAA2B;IACpE,OAAO,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;AACnF,CAAC","sourcesContent":["import type { IosDeploymentIntent } from '../../domain/IosDeploymentIntent';\n\nexport function isIosDeploymentIntentValid(intent: IosDeploymentIntent): boolean {\n return intent.buildProfile.trim().length > 0 && intent.version.trim().length > 0;\n}\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { AppDeployProviderSelection } from '@ankhorage/contracts/deploy';
|
|
2
|
+
import type { DeploymentFailure } from '../../domain/DeploymentFailure';
|
|
3
|
+
type NormalizedIosProviders = {
|
|
4
|
+
readonly build: 'eas';
|
|
5
|
+
readonly publish: 'app-store-connect';
|
|
6
|
+
};
|
|
7
|
+
type NormalizeIosProvidersResult = {
|
|
8
|
+
readonly ok: true;
|
|
9
|
+
readonly providers: NormalizedIosProviders;
|
|
10
|
+
} | {
|
|
11
|
+
readonly ok: false;
|
|
12
|
+
readonly failure: DeploymentFailure;
|
|
13
|
+
};
|
|
14
|
+
export declare function normalizeIosProviders(providers: AppDeployProviderSelection | undefined): NormalizeIosProvidersResult;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=normalizeIosProviders.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalizeIosProviders.d.ts","sourceRoot":"","sources":["../../../src/targets/ios/normalizeIosProviders.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AAE9E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAExE,KAAK,sBAAsB,GAAG;IAC5B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC;CACvC,CAAC;AAEF,KAAK,2BAA2B,GAC5B;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,sBAAsB,CAAA;CAAE,GACjE;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAA;CAAE,CAAC;AAEhE,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,0BAA0B,GAAG,SAAS,GAChD,2BAA2B,CAc7B"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export function normalizeIosProviders(providers) {
|
|
2
|
+
const build = providers?.build ?? 'eas';
|
|
3
|
+
const publish = providers?.publish ?? 'app-store-connect';
|
|
4
|
+
if (build === 'eas' && publish === 'app-store-connect') {
|
|
5
|
+
return { ok: true, providers: { build, publish } };
|
|
6
|
+
}
|
|
7
|
+
return {
|
|
8
|
+
ok: false,
|
|
9
|
+
failure: {
|
|
10
|
+
code: 'UNSUPPORTED_IOS_PROVIDER',
|
|
11
|
+
message: 'The configured iOS deployment provider is not supported.',
|
|
12
|
+
target: 'ios',
|
|
13
|
+
},
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=normalizeIosProviders.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalizeIosProviders.js","sourceRoot":"","sources":["../../../src/targets/ios/normalizeIosProviders.ts"],"names":[],"mappings":"AAaA,MAAM,UAAU,qBAAqB,CACnC,SAAiD;IAEjD,MAAM,KAAK,GAAG,SAAS,EAAE,KAAK,IAAI,KAAK,CAAC;IACxC,MAAM,OAAO,GAAG,SAAS,EAAE,OAAO,IAAI,mBAAmB,CAAC;IAC1D,IAAI,KAAK,KAAK,KAAK,IAAI,OAAO,KAAK,mBAAmB,EAAE,CAAC;QACvD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC;IACrD,CAAC;IACD,OAAO;QACL,EAAE,EAAE,KAAK;QACT,OAAO,EAAE;YACP,IAAI,EAAE,0BAA0B;YAChC,OAAO,EAAE,0DAA0D;YACnE,MAAM,EAAE,KAAK;SACd;KACF,CAAC;AACJ,CAAC","sourcesContent":["import type { AppDeployProviderSelection } from '@ankhorage/contracts/deploy';\n\nimport type { DeploymentFailure } from '../../domain/DeploymentFailure';\n\ntype NormalizedIosProviders = {\n readonly build: 'eas';\n readonly publish: 'app-store-connect';\n};\n\ntype NormalizeIosProvidersResult =\n | { readonly ok: true; readonly providers: NormalizedIosProviders }\n | { readonly ok: false; readonly failure: DeploymentFailure };\n\nexport function normalizeIosProviders(\n providers: AppDeployProviderSelection | undefined,\n): NormalizeIosProvidersResult {\n const build = providers?.build ?? 'eas';\n const publish = providers?.publish ?? 'app-store-connect';\n if (build === 'eas' && publish === 'app-store-connect') {\n return { ok: true, providers: { build, publish } };\n }\n return {\n ok: false,\n failure: {\n code: 'UNSUPPORTED_IOS_PROVIDER',\n message: 'The configured iOS deployment provider is not supported.',\n target: 'ios',\n },\n };\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ankhorage/deploy",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "Declarative deployment engine for Expo apps across web, iOS, and Android — build, provision, publish, and manage releases from one configuration.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"publishConfig": {
|