@ankhorage/deploy 0.13.102 → 0.14.1

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 (120) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README.md +1 -1
  3. package/dist/capabilities/index.d.ts +13 -0
  4. package/dist/capabilities/index.d.ts.map +1 -0
  5. package/dist/capabilities/index.js +12 -0
  6. package/dist/capabilities/index.js.map +1 -0
  7. package/dist/cli/createDeployCliProvider.d.ts +1 -0
  8. package/dist/cli/createDeployCliProvider.d.ts.map +1 -1
  9. package/dist/cli/createDeployCliProvider.js +3 -1
  10. package/dist/cli/createDeployCliProvider.js.map +1 -1
  11. package/dist/engine/release/resumeReleaseExecution.d.ts +6 -2
  12. package/dist/engine/release/resumeReleaseExecution.d.ts.map +1 -1
  13. package/dist/engine/release/resumeReleaseExecution.js +4 -0
  14. package/dist/engine/release/resumeReleaseExecution.js.map +1 -1
  15. package/dist/features/authoring/application/use-cases/fromDeployReleaseAuthoringValue.d.ts.map +1 -1
  16. package/dist/features/authoring/application/use-cases/fromDeployReleaseAuthoringValue.js +1 -1
  17. package/dist/features/authoring/application/use-cases/fromDeployReleaseAuthoringValue.js.map +1 -1
  18. package/dist/features/authoring/application/use-cases/toDeployReleaseAuthoringValue.d.ts.map +1 -1
  19. package/dist/features/authoring/application/use-cases/toDeployReleaseAuthoringValue.js +1 -1
  20. package/dist/features/authoring/application/use-cases/toDeployReleaseAuthoringValue.js.map +1 -1
  21. package/dist/project/android/readCurrentProjectAndroidDeployment.js +1 -1
  22. package/dist/project/android/readCurrentProjectAndroidDeployment.js.map +1 -1
  23. package/dist/project/android/recordProjectAndroidDeployment.js +1 -1
  24. package/dist/project/android/recordProjectAndroidDeployment.js.map +1 -1
  25. package/dist/project/history/parseProjectDeploymentHistoryRecord.d.ts.map +1 -1
  26. package/dist/project/history/parseProjectDeploymentHistoryRecord.js +9 -3
  27. package/dist/project/history/parseProjectDeploymentHistoryRecord.js.map +1 -1
  28. package/dist/project/history/validation/diagnostic.d.ts.map +1 -1
  29. package/dist/project/history/validation/diagnostic.js +1 -3
  30. package/dist/project/history/validation/diagnostic.js.map +1 -1
  31. package/dist/project/history/validation/execution.d.ts.map +1 -1
  32. package/dist/project/history/validation/execution.js +1 -2
  33. package/dist/project/history/validation/execution.js.map +1 -1
  34. package/dist/project/history/validation/failure.d.ts.map +1 -1
  35. package/dist/project/history/validation/failure.js +1 -3
  36. package/dist/project/history/validation/failure.js.map +1 -1
  37. package/dist/project/history/validation/observedTarget.d.ts.map +1 -1
  38. package/dist/project/history/validation/observedTarget.js +1 -3
  39. package/dist/project/history/validation/observedTarget.js.map +1 -1
  40. package/dist/project/history/validation/plan.d.ts.map +1 -1
  41. package/dist/project/history/validation/plan.js +1 -2
  42. package/dist/project/history/validation/plan.js.map +1 -1
  43. package/dist/project/history/validation/planStep.d.ts.map +1 -1
  44. package/dist/project/history/validation/planStep.js +1 -3
  45. package/dist/project/history/validation/planStep.js.map +1 -1
  46. package/dist/project/history/validation/providerSelection.d.ts.map +1 -1
  47. package/dist/project/history/validation/providerSelection.js +1 -3
  48. package/dist/project/history/validation/providerSelection.js.map +1 -1
  49. package/dist/project/history/validation/requiredAction.d.ts.map +1 -1
  50. package/dist/project/history/validation/requiredAction.js +1 -3
  51. package/dist/project/history/validation/requiredAction.js.map +1 -1
  52. package/dist/project/history/validation/shared.d.ts +4 -0
  53. package/dist/project/history/validation/shared.d.ts.map +1 -1
  54. package/dist/project/history/validation/shared.js +8 -0
  55. package/dist/project/history/validation/shared.js.map +1 -1
  56. package/dist/project/history/validation/stepOutcome.d.ts.map +1 -1
  57. package/dist/project/history/validation/stepOutcome.js +1 -2
  58. package/dist/project/history/validation/stepOutcome.js.map +1 -1
  59. package/dist/project/history/validation/targetChange.d.ts.map +1 -1
  60. package/dist/project/history/validation/targetChange.js +1 -3
  61. package/dist/project/history/validation/targetChange.js.map +1 -1
  62. package/dist/project/history/validation/verification.d.ts.map +1 -1
  63. package/dist/project/history/validation/verification.js +1 -3
  64. package/dist/project/history/validation/verification.js.map +1 -1
  65. package/dist/project/index.d.ts +3 -3
  66. package/dist/project/index.d.ts.map +1 -1
  67. package/dist/project/index.js +3 -3
  68. package/dist/project/index.js.map +1 -1
  69. package/dist/project/io/assertSafeSegment.d.ts +0 -1
  70. package/dist/project/io/assertSafeSegment.d.ts.map +1 -1
  71. package/dist/project/io/assertSafeSegment.js +1 -1
  72. package/dist/project/io/assertSafeSegment.js.map +1 -1
  73. package/dist/project/ios/readCurrentProjectIosDeployment.js +1 -1
  74. package/dist/project/ios/readCurrentProjectIosDeployment.js.map +1 -1
  75. package/dist/project/ios/recordProjectIosDeployment.js +1 -1
  76. package/dist/project/ios/recordProjectIosDeployment.js.map +1 -1
  77. package/dist/project/listProjectDeploymentHistory.d.ts +6 -0
  78. package/dist/project/listProjectDeploymentHistory.d.ts.map +1 -0
  79. package/dist/project/{history/listProjectDeploymentHistory.js → listProjectDeploymentHistory.js} +3 -2
  80. package/dist/project/listProjectDeploymentHistory.js.map +1 -0
  81. package/dist/project/readProjectDeploymentHistory.d.ts +7 -0
  82. package/dist/project/readProjectDeploymentHistory.d.ts.map +1 -0
  83. package/dist/project/{history/readProjectDeploymentHistory.js → readProjectDeploymentHistory.js} +6 -5
  84. package/dist/project/readProjectDeploymentHistory.js.map +1 -0
  85. package/dist/project/recordProjectDeploymentHistory.d.ts +7 -0
  86. package/dist/project/recordProjectDeploymentHistory.d.ts.map +1 -0
  87. package/dist/project/{history/recordProjectDeploymentHistory.js → recordProjectDeploymentHistory.js} +6 -5
  88. package/dist/project/recordProjectDeploymentHistory.js.map +1 -0
  89. package/dist/project/release/readProjectRelease.js +1 -1
  90. package/dist/project/release/readProjectRelease.js.map +1 -1
  91. package/dist/project/release/readProjectReleaseAndroidArtifact.js +1 -1
  92. package/dist/project/release/readProjectReleaseAndroidArtifact.js.map +1 -1
  93. package/dist/project/release/readProjectReleaseIosArtifact.js +1 -1
  94. package/dist/project/release/readProjectReleaseIosArtifact.js.map +1 -1
  95. package/dist/project/release/writeProjectRelease.js +1 -1
  96. package/dist/project/release/writeProjectRelease.js.map +1 -1
  97. package/dist/project/releaseHistory/parseReleaseHistoryDesired.js +1 -1
  98. package/dist/project/releaseHistory/parseReleaseHistoryDesired.js.map +1 -1
  99. package/dist/project/releaseInput/parseProjectRelease.d.ts.map +1 -0
  100. package/dist/project/releaseInput/parseProjectRelease.js.map +1 -0
  101. package/dist/project/web/readCurrentProjectWebDeployment.js +1 -1
  102. package/dist/project/web/readCurrentProjectWebDeployment.js.map +1 -1
  103. package/dist/project/web/readCurrentProjectWebProductionDeployment.js +1 -1
  104. package/dist/project/web/readCurrentProjectWebProductionDeployment.js.map +1 -1
  105. package/dist/project/web/recordProjectWebDeployment.js +1 -1
  106. package/dist/project/web/recordProjectWebDeployment.js.map +1 -1
  107. package/package.json +25 -8
  108. package/dist/project/history/listProjectDeploymentHistory.d.ts +0 -5
  109. package/dist/project/history/listProjectDeploymentHistory.d.ts.map +0 -1
  110. package/dist/project/history/listProjectDeploymentHistory.js.map +0 -1
  111. package/dist/project/history/readProjectDeploymentHistory.d.ts +0 -6
  112. package/dist/project/history/readProjectDeploymentHistory.d.ts.map +0 -1
  113. package/dist/project/history/readProjectDeploymentHistory.js.map +0 -1
  114. package/dist/project/history/recordProjectDeploymentHistory.d.ts +0 -6
  115. package/dist/project/history/recordProjectDeploymentHistory.d.ts.map +0 -1
  116. package/dist/project/history/recordProjectDeploymentHistory.js.map +0 -1
  117. package/dist/project/release/parseProjectRelease.d.ts.map +0 -1
  118. package/dist/project/release/parseProjectRelease.js.map +0 -1
  119. /package/dist/project/{release → releaseInput}/parseProjectRelease.d.ts +0 -0
  120. /package/dist/project/{release → releaseInput}/parseProjectRelease.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"readProjectReleaseAndroidArtifact.js","sourceRoot":"","sources":["../../../src/project/release/readProjectReleaseAndroidArtifact.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,4BAA4B,EAAE,MAAM,yCAAyC,CAAC;AAavF,MAAM,CAAC,KAAK,UAAU,iCAAiC,CAAC,OAIvD;IACC,MAAM,OAAO,GAAG,MAAM,4BAA4B,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IACzF,MAAM,CAAC,QAAQ,CAAC,GAAG,OAAO;SACvB,GAAG,CAAC,aAAa,CAAC;SAClB,MAAM,CAAC,CAAC,IAAI,EAA2B,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC;SACxD,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,KAAK,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC;SACjE,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;SAClF,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IAC1E,OAAO,QAAQ,KAAK,SAAS;QAC3B,CAAC,CAAC,IAAI;QACN,CAAC,CAAC;YACE,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,WAAW,EAAE,QAAQ,CAAC,WAAW;YACjC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK;SAC5B,CAAC;AACR,CAAC;AAED,SAAS,aAAa,CAAC,MAAsC;IAC3D,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,YAAY,EAAE,EAAE,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC7F,MAAM,KAAK,GAAG,gCAAgC,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IACzE,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAChC,MAAM,CAAC,EAAE,gBAAgB,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC;IAC7C,MAAM,WAAW,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAC7C,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,WAAW,IAAI,CAAC,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAClG,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,EAAE,OAAO,CAAC;IAC3F,IAAI,OAAO,EAAE,MAAM,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAC/C,OAAO;QACL,QAAQ;QACR,WAAW;QACX,WAAW,EAAE,OAAO,CAAC,OAAO;QAC5B,UAAU,EAAE,MAAM,CAAC,UAAU;KAC9B,CAAC;AACJ,CAAC","sourcesContent":["import type { ReleaseObservedAndroidState } from '@ankhorage/contracts/deploy-provider';\n\nimport type { AndroidDeploymentPublication } from '../../domain/AndroidDeploymentPublication';\nimport { listProjectDeploymentHistory } from '../history/listProjectDeploymentHistory';\nimport type { ProjectDeploymentHistoryRecord } from '../history/ProjectDeploymentHistoryRecord';\nimport type { ProjectReleaseTargets } from './ProjectReleaseTargets';\n\ntype AndroidArtifact = Pick<AndroidDeploymentPublication, 'revision' | 'versionCode' | 'track'>;\n\ninterface AndroidEvidence {\n readonly revision: string;\n readonly versionCode: number;\n readonly packageName: string;\n readonly recordedAt: string;\n}\n\nexport async function readProjectReleaseAndroidArtifact(options: {\n readonly projectRoot: string;\n readonly target: NonNullable<ProjectReleaseTargets['android']>;\n readonly observed: ReleaseObservedAndroidState;\n}): Promise<AndroidArtifact | null> {\n const history = await listProjectDeploymentHistory({ projectRoot: options.projectRoot });\n const [evidence] = history\n .map(parseEvidence)\n .filter((item): item is AndroidEvidence => item !== null)\n .filter((item) => item.packageName === options.target.packageName)\n .filter((item) => options.observed.versionCodes.includes(String(item.versionCode)))\n .sort((left, right) => right.recordedAt.localeCompare(left.recordedAt));\n return evidence === undefined\n ? null\n : {\n revision: evidence.revision,\n versionCode: evidence.versionCode,\n track: options.target.track,\n };\n}\n\nfunction parseEvidence(record: ProjectDeploymentHistoryRecord): AndroidEvidence | null {\n if (record.execution.status !== 'completed' || record.verification?.ok !== true) return null;\n const match = /^android-(\\d+)-([a-f\\d]{64})$/i.exec(record.deploymentId);\n if (match === null) return null;\n const [, versionCodeValue, revision] = match;\n const versionCode = Number(versionCodeValue);\n if (!Number.isSafeInteger(versionCode) || versionCode <= 0 || revision === undefined) return null;\n const desired = record.plan.changes.find((change) => change.target === 'android')?.desired;\n if (desired?.target !== 'android') return null;\n return {\n revision,\n versionCode,\n packageName: desired.package,\n recordedAt: record.recordedAt,\n };\n}\n"]}
1
+ {"version":3,"file":"readProjectReleaseAndroidArtifact.js","sourceRoot":"","sources":["../../../src/project/release/readProjectReleaseAndroidArtifact.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,4BAA4B,EAAE,MAAM,iCAAiC,CAAC;AAY/E,MAAM,CAAC,KAAK,UAAU,iCAAiC,CAAC,OAIvD;IACC,MAAM,OAAO,GAAG,MAAM,4BAA4B,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IACzF,MAAM,CAAC,QAAQ,CAAC,GAAG,OAAO;SACvB,GAAG,CAAC,aAAa,CAAC;SAClB,MAAM,CAAC,CAAC,IAAI,EAA2B,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC;SACxD,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,KAAK,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC;SACjE,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;SAClF,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IAC1E,OAAO,QAAQ,KAAK,SAAS;QAC3B,CAAC,CAAC,IAAI;QACN,CAAC,CAAC;YACE,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,WAAW,EAAE,QAAQ,CAAC,WAAW;YACjC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK;SAC5B,CAAC;AACR,CAAC;AAED,SAAS,aAAa,CAAC,MAAsC;IAC3D,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,YAAY,EAAE,EAAE,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC7F,MAAM,KAAK,GAAG,gCAAgC,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IACzE,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAChC,MAAM,CAAC,EAAE,gBAAgB,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC;IAC7C,MAAM,WAAW,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAC7C,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,WAAW,IAAI,CAAC,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAClG,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,EAAE,OAAO,CAAC;IAC3F,IAAI,OAAO,EAAE,MAAM,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAC/C,OAAO;QACL,QAAQ;QACR,WAAW;QACX,WAAW,EAAE,OAAO,CAAC,OAAO;QAC5B,UAAU,EAAE,MAAM,CAAC,UAAU;KAC9B,CAAC;AACJ,CAAC","sourcesContent":["import type { ReleaseObservedAndroidState } from '@ankhorage/contracts/deploy-provider';\n\nimport type { AndroidDeploymentPublication } from '../../domain/AndroidDeploymentPublication';\nimport type { ProjectDeploymentHistoryRecord } from '../history/ProjectDeploymentHistoryRecord';\nimport { listProjectDeploymentHistory } from '../listProjectDeploymentHistory';\nimport type { ProjectReleaseTargets } from './ProjectReleaseTargets';\n\ntype AndroidArtifact = Pick<AndroidDeploymentPublication, 'revision' | 'versionCode' | 'track'>;\n\ninterface AndroidEvidence {\n readonly revision: string;\n readonly versionCode: number;\n readonly packageName: string;\n readonly recordedAt: string;\n}\n\nexport async function readProjectReleaseAndroidArtifact(options: {\n readonly projectRoot: string;\n readonly target: NonNullable<ProjectReleaseTargets['android']>;\n readonly observed: ReleaseObservedAndroidState;\n}): Promise<AndroidArtifact | null> {\n const history = await listProjectDeploymentHistory({ projectRoot: options.projectRoot });\n const [evidence] = history\n .map(parseEvidence)\n .filter((item): item is AndroidEvidence => item !== null)\n .filter((item) => item.packageName === options.target.packageName)\n .filter((item) => options.observed.versionCodes.includes(String(item.versionCode)))\n .sort((left, right) => right.recordedAt.localeCompare(left.recordedAt));\n return evidence === undefined\n ? null\n : {\n revision: evidence.revision,\n versionCode: evidence.versionCode,\n track: options.target.track,\n };\n}\n\nfunction parseEvidence(record: ProjectDeploymentHistoryRecord): AndroidEvidence | null {\n if (record.execution.status !== 'completed' || record.verification?.ok !== true) return null;\n const match = /^android-(\\d+)-([a-f\\d]{64})$/i.exec(record.deploymentId);\n if (match === null) return null;\n const [, versionCodeValue, revision] = match;\n const versionCode = Number(versionCodeValue);\n if (!Number.isSafeInteger(versionCode) || versionCode <= 0 || revision === undefined) return null;\n const desired = record.plan.changes.find((change) => change.target === 'android')?.desired;\n if (desired?.target !== 'android') return null;\n return {\n revision,\n versionCode,\n packageName: desired.package,\n recordedAt: record.recordedAt,\n };\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { listProjectDeploymentHistory } from '../history/listProjectDeploymentHistory';
1
+ import { listProjectDeploymentHistory } from '../listProjectDeploymentHistory';
2
2
  export async function readProjectReleaseIosArtifact(options) {
3
3
  const { buildNumber } = options.observed;
4
4
  if (buildNumber === null)
@@ -1 +1 @@
1
- {"version":3,"file":"readProjectReleaseIosArtifact.js","sourceRoot":"","sources":["../../../src/project/release/readProjectReleaseIosArtifact.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,4BAA4B,EAAE,MAAM,yCAAyC,CAAC;AAavF,MAAM,CAAC,KAAK,UAAU,6BAA6B,CAAC,OAKnD;IACC,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC;IACzC,IAAI,WAAW,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACtC,MAAM,OAAO,GAAG,MAAM,4BAA4B,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IACzF,MAAM,CAAC,QAAQ,CAAC,GAAG,OAAO;SACvB,GAAG,CAAC,aAAa,CAAC;SAClB,MAAM,CAAC,CAAC,IAAI,EAAuB,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC;SACpD,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,gBAAgB,KAAK,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC;SAC3E,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,KAAK,WAAW,CAAC;SAClD,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IAC1E,OAAO,QAAQ,KAAK,SAAS;QAC3B,CAAC,CAAC,IAAI;QACN,CAAC,CAAC;YACE,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,WAAW,EAAE,QAAQ,CAAC,WAAW;SAClC,CAAC;AACR,CAAC;AAED,SAAS,aAAa,CAAC,MAAsC;IAC3D,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,YAAY,EAAE,EAAE,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC7F,MAAM,KAAK,GAAG,2BAA2B,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IACpE,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAChC,MAAM,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC;IACxC,IAAI,WAAW,KAAK,SAAS,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACjG,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,KAAK,CAAC,EAAE,OAAO,CAAC;IACvF,IAAI,OAAO,EAAE,MAAM,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC;IAC3C,OAAO;QACL,QAAQ;QACR,WAAW;QACX,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;QAC1C,UAAU,EAAE,MAAM,CAAC,UAAU;KAC9B,CAAC;AACJ,CAAC","sourcesContent":["import type { ReleaseObservedIosState } from '@ankhorage/contracts/deploy-provider';\n\nimport type { IosDeploymentPublication } from '../../domain/IosDeploymentPublication';\nimport { listProjectDeploymentHistory } from '../history/listProjectDeploymentHistory';\nimport type { ProjectDeploymentHistoryRecord } from '../history/ProjectDeploymentHistoryRecord';\nimport type { ProjectReleaseTargets } from './ProjectReleaseTargets';\n\ntype IosArtifact = Pick<IosDeploymentPublication, 'revision' | 'version' | 'buildNumber'>;\n\ninterface IosEvidence {\n readonly revision: string;\n readonly buildNumber: string;\n readonly bundleIdentifier: string;\n readonly recordedAt: string;\n}\n\nexport async function readProjectReleaseIosArtifact(options: {\n readonly projectRoot: string;\n readonly version: string;\n readonly target: NonNullable<ProjectReleaseTargets['ios']>;\n readonly observed: ReleaseObservedIosState;\n}): Promise<IosArtifact | null> {\n const { buildNumber } = options.observed;\n if (buildNumber === null) return null;\n const history = await listProjectDeploymentHistory({ projectRoot: options.projectRoot });\n const [evidence] = history\n .map(parseEvidence)\n .filter((item): item is IosEvidence => item !== null)\n .filter((item) => item.bundleIdentifier === options.target.bundleIdentifier)\n .filter((item) => item.buildNumber === buildNumber)\n .sort((left, right) => right.recordedAt.localeCompare(left.recordedAt));\n return evidence === undefined\n ? null\n : {\n revision: evidence.revision,\n version: options.version,\n buildNumber: evidence.buildNumber,\n };\n}\n\nfunction parseEvidence(record: ProjectDeploymentHistoryRecord): IosEvidence | null {\n if (record.execution.status !== 'completed' || record.verification?.ok !== true) return null;\n const match = /^ios-(.+)-([a-f\\d]{64})$/i.exec(record.deploymentId);\n if (match === null) return null;\n const [, buildNumber, revision] = match;\n if (buildNumber === undefined || buildNumber.length === 0 || revision === undefined) return null;\n const desired = record.plan.changes.find((change) => change.target === 'ios')?.desired;\n if (desired?.target !== 'ios') return null;\n return {\n revision,\n buildNumber,\n bundleIdentifier: desired.bundleIdentifier,\n recordedAt: record.recordedAt,\n };\n}\n"]}
1
+ {"version":3,"file":"readProjectReleaseIosArtifact.js","sourceRoot":"","sources":["../../../src/project/release/readProjectReleaseIosArtifact.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,4BAA4B,EAAE,MAAM,iCAAiC,CAAC;AAY/E,MAAM,CAAC,KAAK,UAAU,6BAA6B,CAAC,OAKnD;IACC,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC;IACzC,IAAI,WAAW,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACtC,MAAM,OAAO,GAAG,MAAM,4BAA4B,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IACzF,MAAM,CAAC,QAAQ,CAAC,GAAG,OAAO;SACvB,GAAG,CAAC,aAAa,CAAC;SAClB,MAAM,CAAC,CAAC,IAAI,EAAuB,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC;SACpD,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,gBAAgB,KAAK,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC;SAC3E,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,KAAK,WAAW,CAAC;SAClD,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IAC1E,OAAO,QAAQ,KAAK,SAAS;QAC3B,CAAC,CAAC,IAAI;QACN,CAAC,CAAC;YACE,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,WAAW,EAAE,QAAQ,CAAC,WAAW;SAClC,CAAC;AACR,CAAC;AAED,SAAS,aAAa,CAAC,MAAsC;IAC3D,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,YAAY,EAAE,EAAE,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC7F,MAAM,KAAK,GAAG,2BAA2B,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IACpE,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAChC,MAAM,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC;IACxC,IAAI,WAAW,KAAK,SAAS,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACjG,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,KAAK,CAAC,EAAE,OAAO,CAAC;IACvF,IAAI,OAAO,EAAE,MAAM,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC;IAC3C,OAAO;QACL,QAAQ;QACR,WAAW;QACX,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;QAC1C,UAAU,EAAE,MAAM,CAAC,UAAU;KAC9B,CAAC;AACJ,CAAC","sourcesContent":["import type { ReleaseObservedIosState } from '@ankhorage/contracts/deploy-provider';\n\nimport type { IosDeploymentPublication } from '../../domain/IosDeploymentPublication';\nimport type { ProjectDeploymentHistoryRecord } from '../history/ProjectDeploymentHistoryRecord';\nimport { listProjectDeploymentHistory } from '../listProjectDeploymentHistory';\nimport type { ProjectReleaseTargets } from './ProjectReleaseTargets';\n\ntype IosArtifact = Pick<IosDeploymentPublication, 'revision' | 'version' | 'buildNumber'>;\n\ninterface IosEvidence {\n readonly revision: string;\n readonly buildNumber: string;\n readonly bundleIdentifier: string;\n readonly recordedAt: string;\n}\n\nexport async function readProjectReleaseIosArtifact(options: {\n readonly projectRoot: string;\n readonly version: string;\n readonly target: NonNullable<ProjectReleaseTargets['ios']>;\n readonly observed: ReleaseObservedIosState;\n}): Promise<IosArtifact | null> {\n const { buildNumber } = options.observed;\n if (buildNumber === null) return null;\n const history = await listProjectDeploymentHistory({ projectRoot: options.projectRoot });\n const [evidence] = history\n .map(parseEvidence)\n .filter((item): item is IosEvidence => item !== null)\n .filter((item) => item.bundleIdentifier === options.target.bundleIdentifier)\n .filter((item) => item.buildNumber === buildNumber)\n .sort((left, right) => right.recordedAt.localeCompare(left.recordedAt));\n return evidence === undefined\n ? null\n : {\n revision: evidence.revision,\n version: options.version,\n buildNumber: evidence.buildNumber,\n };\n}\n\nfunction parseEvidence(record: ProjectDeploymentHistoryRecord): IosEvidence | null {\n if (record.execution.status !== 'completed' || record.verification?.ok !== true) return null;\n const match = /^ios-(.+)-([a-f\\d]{64})$/i.exec(record.deploymentId);\n if (match === null) return null;\n const [, buildNumber, revision] = match;\n if (buildNumber === undefined || buildNumber.length === 0 || revision === undefined) return null;\n const desired = record.plan.changes.find((change) => change.target === 'ios')?.desired;\n if (desired?.target !== 'ios') return null;\n return {\n revision,\n buildNumber,\n bundleIdentifier: desired.bundleIdentifier,\n recordedAt: record.recordedAt,\n };\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  import { atomicWriteJson } from '../io/atomicWriteJson';
2
+ import { parseProjectRelease } from '../releaseInput/parseProjectRelease';
2
3
  import { resolveProjectDeploymentPaths } from '../resolveProjectDeploymentPaths';
3
- import { parseProjectRelease } from './parseProjectRelease';
4
4
  import { readProjectRelease } from './readProjectRelease';
5
5
  export async function writeProjectRelease(options) {
6
6
  const release = parseProjectRelease(options.release);
@@ -1 +1 @@
1
- {"version":3,"file":"writeProjectRelease.js","sourceRoot":"","sources":["../../../src/project/release/writeProjectRelease.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,6BAA6B,EAAE,MAAM,kCAAkC,CAAC;AACjF,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,OAGzC;IACC,MAAM,OAAO,GAAG,mBAAmB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,6BAA6B,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACjE,MAAM,eAAe,CAAC;QACpB,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,QAAQ,EAAE,KAAK,CAAC,WAAW;QAC3B,KAAK,EAAE,OAAO;KACf,CAAC,CAAC;IACH,OAAO,kBAAkB,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;AAChE,CAAC","sourcesContent":["import type { ReleaseDesiredState } from '../../domain/release/ReleaseDesiredState';\nimport { atomicWriteJson } from '../io/atomicWriteJson';\nimport { resolveProjectDeploymentPaths } from '../resolveProjectDeploymentPaths';\nimport { parseProjectRelease } from './parseProjectRelease';\nimport type { ProjectReleaseInput } from './ProjectReleaseInput';\nimport { readProjectRelease } from './readProjectRelease';\n\nexport async function writeProjectRelease(options: {\n readonly projectRoot: string;\n readonly release: ProjectReleaseInput;\n}): Promise<ReleaseDesiredState> {\n const release = parseProjectRelease(options.release);\n const paths = resolveProjectDeploymentPaths(options.projectRoot);\n await atomicWriteJson({\n projectRoot: paths.projectRoot,\n filePath: paths.releasePath,\n value: release,\n });\n return readProjectRelease({ projectRoot: paths.projectRoot });\n}\n"]}
1
+ {"version":3,"file":"writeProjectRelease.js","sourceRoot":"","sources":["../../../src/project/release/writeProjectRelease.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAAE,6BAA6B,EAAE,MAAM,kCAAkC,CAAC;AAEjF,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,OAGzC;IACC,MAAM,OAAO,GAAG,mBAAmB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,6BAA6B,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACjE,MAAM,eAAe,CAAC;QACpB,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,QAAQ,EAAE,KAAK,CAAC,WAAW;QAC3B,KAAK,EAAE,OAAO;KACf,CAAC,CAAC;IACH,OAAO,kBAAkB,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;AAChE,CAAC","sourcesContent":["import type { ReleaseDesiredState } from '../../domain/release/ReleaseDesiredState';\nimport { atomicWriteJson } from '../io/atomicWriteJson';\nimport { parseProjectRelease } from '../releaseInput/parseProjectRelease';\nimport { resolveProjectDeploymentPaths } from '../resolveProjectDeploymentPaths';\nimport type { ProjectReleaseInput } from './ProjectReleaseInput';\nimport { readProjectRelease } from './readProjectRelease';\n\nexport async function writeProjectRelease(options: {\n readonly projectRoot: string;\n readonly release: ProjectReleaseInput;\n}): Promise<ReleaseDesiredState> {\n const release = parseProjectRelease(options.release);\n const paths = resolveProjectDeploymentPaths(options.projectRoot);\n await atomicWriteJson({\n projectRoot: paths.projectRoot,\n filePath: paths.releasePath,\n value: release,\n });\n return readProjectRelease({ projectRoot: paths.projectRoot });\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  import { createReleaseRevision } from '../../domain/release/createReleaseRevision';
2
2
  import { hasOnlyKeys } from '../io/hasOnlyKeys';
3
3
  import { isRecord } from '../io/isRecord';
4
- import { parseProjectRelease } from '../release/parseProjectRelease';
4
+ import { parseProjectRelease } from '../releaseInput/parseProjectRelease';
5
5
  const KEYS = new Set(['version', 'targets', 'notes', 'rollout', 'revision']);
6
6
  export function parseReleaseHistoryDesired(value) {
7
7
  if (!isRecord(value) || !hasOnlyKeys(value, KEYS))
@@ -1 +1 @@
1
- {"version":3,"file":"parseReleaseHistoryDesired.js","sourceRoot":"","sources":["../../../src/project/releaseHistory/parseReleaseHistoryDesired.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,4CAA4C,CAAC;AAEnF,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAErE,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;AAE7E,MAAM,UAAU,0BAA0B,CAAC,KAAc;IACvD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC;QAAE,MAAM,OAAO,EAAE,CAAC;IACnE,MAAM,MAAM,GAAG,mBAAmB,CAAC;QACjC,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,OAAO,EAAE,KAAK,CAAC,OAAO;KACvB,CAAC,CAAC;IACH,IAAI,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ;QAAE,MAAM,OAAO,EAAE,CAAC;IACxD,MAAM,QAAQ,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAC/C,IAAI,KAAK,CAAC,QAAQ,KAAK,QAAQ;QAAE,MAAM,OAAO,EAAE,CAAC;IACjD,OAAO,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC;AACjC,CAAC;AAED,SAAS,OAAO;IACd,OAAO,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;AACtE,CAAC","sourcesContent":["import { createReleaseRevision } from '../../domain/release/createReleaseRevision';\nimport type { ReleaseDesiredState } from '../../domain/release/ReleaseDesiredState';\nimport { hasOnlyKeys } from '../io/hasOnlyKeys';\nimport { isRecord } from '../io/isRecord';\nimport { parseProjectRelease } from '../release/parseProjectRelease';\n\nconst KEYS = new Set(['version', 'targets', 'notes', 'rollout', 'revision']);\n\nexport function parseReleaseHistoryDesired(value: unknown): ReleaseDesiredState {\n if (!isRecord(value) || !hasOnlyKeys(value, KEYS)) throw invalid();\n const parsed = parseProjectRelease({\n version: value.version,\n targets: value.targets,\n notes: value.notes,\n rollout: value.rollout,\n });\n if (typeof value.revision !== 'string') throw invalid();\n const revision = createReleaseRevision(parsed);\n if (value.revision !== revision) throw invalid();\n return { ...parsed, revision };\n}\n\nfunction invalid(): Error {\n return new Error('Release history has an invalid desired release.');\n}\n"]}
1
+ {"version":3,"file":"parseReleaseHistoryDesired.js","sourceRoot":"","sources":["../../../src/project/releaseHistory/parseReleaseHistoryDesired.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,4CAA4C,CAAC;AAEnF,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAE1E,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;AAE7E,MAAM,UAAU,0BAA0B,CAAC,KAAc;IACvD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC;QAAE,MAAM,OAAO,EAAE,CAAC;IACnE,MAAM,MAAM,GAAG,mBAAmB,CAAC;QACjC,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,OAAO,EAAE,KAAK,CAAC,OAAO;KACvB,CAAC,CAAC;IACH,IAAI,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ;QAAE,MAAM,OAAO,EAAE,CAAC;IACxD,MAAM,QAAQ,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAC/C,IAAI,KAAK,CAAC,QAAQ,KAAK,QAAQ;QAAE,MAAM,OAAO,EAAE,CAAC;IACjD,OAAO,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC;AACjC,CAAC;AAED,SAAS,OAAO;IACd,OAAO,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;AACtE,CAAC","sourcesContent":["import { createReleaseRevision } from '../../domain/release/createReleaseRevision';\nimport type { ReleaseDesiredState } from '../../domain/release/ReleaseDesiredState';\nimport { hasOnlyKeys } from '../io/hasOnlyKeys';\nimport { isRecord } from '../io/isRecord';\nimport { parseProjectRelease } from '../releaseInput/parseProjectRelease';\n\nconst KEYS = new Set(['version', 'targets', 'notes', 'rollout', 'revision']);\n\nexport function parseReleaseHistoryDesired(value: unknown): ReleaseDesiredState {\n if (!isRecord(value) || !hasOnlyKeys(value, KEYS)) throw invalid();\n const parsed = parseProjectRelease({\n version: value.version,\n targets: value.targets,\n notes: value.notes,\n rollout: value.rollout,\n });\n if (typeof value.revision !== 'string') throw invalid();\n const revision = createReleaseRevision(parsed);\n if (value.revision !== revision) throw invalid();\n return { ...parsed, revision };\n}\n\nfunction invalid(): Error {\n return new Error('Release history has an invalid desired release.');\n}\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseProjectRelease.d.ts","sourceRoot":"","sources":["../../../src/project/releaseInput/parseProjectRelease.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAWxE,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,CAAC;IAC3C,QAAQ,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;IACvC,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;CAClC;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,oBAAoB,CAQxE"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseProjectRelease.js","sourceRoot":"","sources":["../../../src/project/releaseInput/parseProjectRelease.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ReleaseNote } from '../../domain/release/ReleaseNote';\nimport type { ReleaseRollout } from '../../domain/release/ReleaseRollout';\nimport type { ReleaseTarget } from '../../domain/release/ReleaseTarget';\nimport type { ReleaseTargetRollout } from '../../domain/release/ReleaseTargetRollout';\nimport { hasOnlyKeys } from '../io/hasOnlyKeys';\nimport { isRecord } from '../io/isRecord';\n\nconst ROOT_KEYS = new Set(['version', 'targets', 'notes', 'rollout']);\nconst NOTE_KEYS = new Set(['locale', 'text']);\nconst ROLLOUT_KEYS = new Set(['web', 'android', 'ios']);\nconst TARGET_ROLLOUT_KEYS = new Set(['mode', 'initialFraction']);\nconst TARGETS = new Set<ReleaseTarget>(['web', 'android', 'ios']);\n\nexport interface ParsedProjectRelease {\n readonly version: string;\n readonly targets: readonly ReleaseTarget[];\n readonly notes: readonly ReleaseNote[];\n readonly rollout: ReleaseRollout;\n}\n\nexport function parseProjectRelease(value: unknown): ParsedProjectRelease {\n if (!isRecord(value) || !hasOnlyKeys(value, ROOT_KEYS)) throw invalid();\n return {\n version: parseVersion(value.version),\n targets: parseTargets(value.targets),\n notes: parseNotes(value.notes),\n rollout: parseRollout(value.rollout),\n };\n}\n\nfunction parseVersion(value: unknown): string {\n if (typeof value !== 'string' || !/^\\d+(\\.\\d+){0,2}$/.test(value)) throw invalid();\n return value;\n}\n\nfunction parseTargets(value: unknown): readonly ReleaseTarget[] {\n if (!Array.isArray(value) || value.length === 0) throw invalid();\n const targets = value.map(parseTarget).sort();\n if (new Set(targets).size !== targets.length) throw invalid();\n return targets;\n}\n\nfunction parseTarget(value: unknown): ReleaseTarget {\n if (typeof value !== 'string' || !TARGETS.has(value as ReleaseTarget)) throw invalid();\n return value as ReleaseTarget;\n}\n\nfunction parseNotes(value: unknown): readonly ReleaseNote[] {\n if (!Array.isArray(value)) throw invalid();\n const notes = value.map(parseNote).sort((a, b) => a.locale.localeCompare(b.locale));\n if (new Set(notes.map((note) => note.locale)).size !== notes.length) throw invalid();\n return notes;\n}\n\nfunction parseNote(value: unknown): ReleaseNote {\n if (!isRecord(value) || !hasOnlyKeys(value, NOTE_KEYS)) throw invalid();\n if (typeof value.text !== 'string' || value.text.trim().length === 0) throw invalid();\n return { locale: normalizeLocale(value.locale), text: value.text };\n}\n\nfunction parseRollout(value: unknown): ReleaseRollout {\n if (!isRecord(value) || !hasOnlyKeys(value, ROLLOUT_KEYS)) throw invalid();\n return {\n ...(value.web === undefined ? {} : { web: parseWebRollout(value.web) }),\n ...(value.android === undefined ? {} : { android: parseAndroidRollout(value.android) }),\n ...(value.ios === undefined ? {} : { ios: parseIosRollout(value.ios) }),\n };\n}\n\nfunction parseWebRollout(value: unknown): ReleaseTargetRollout {\n const rollout = parseTargetRollout(value);\n if (rollout.mode !== 'immediate' || rollout.initialFraction !== undefined) throw invalid();\n return rollout;\n}\n\nfunction parseAndroidRollout(value: unknown): ReleaseTargetRollout {\n const rollout = parseTargetRollout(value);\n if (rollout.mode === 'staged') {\n if (rollout.initialFraction === undefined) throw invalid();\n return { mode: 'staged', initialFraction: normalizeFraction(rollout.initialFraction) };\n }\n if (rollout.initialFraction !== undefined) throw invalid();\n return { mode: 'immediate' };\n}\n\nfunction parseIosRollout(value: unknown): ReleaseTargetRollout {\n const rollout = parseTargetRollout(value);\n if (rollout.initialFraction !== undefined) throw invalid();\n return { mode: rollout.mode };\n}\n\nfunction parseTargetRollout(value: unknown): ReleaseTargetRollout {\n if (!isRecord(value) || !hasOnlyKeys(value, TARGET_ROLLOUT_KEYS)) throw invalid();\n if (value.mode !== 'immediate' && value.mode !== 'staged') throw invalid();\n if (value.initialFraction !== undefined && typeof value.initialFraction !== 'string') {\n throw invalid();\n }\n return {\n mode: value.mode,\n ...(value.initialFraction === undefined ? {} : { initialFraction: value.initialFraction }),\n };\n}\n\nfunction normalizeFraction(value: string): string {\n if (!/^0\\.\\d{1,6}$/.test(value)) throw invalid();\n const digits = value.slice(2).replace(/0+$/, '');\n if (digits.length === 0) throw invalid();\n return `0.${digits}`;\n}\n\nfunction normalizeLocale(value: unknown): string {\n if (typeof value !== 'string' || value.trim().length === 0) throw invalid();\n try {\n const locales = Intl.getCanonicalLocales(value);\n if (locales.length !== 1 || locales[0] === undefined) throw invalid();\n return locales[0];\n } catch {\n throw invalid();\n }\n}\n\nfunction invalid(): Error {\n return new Error('RELEASE_INVALID');\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { listProjectDeploymentHistory } from '../history/listProjectDeploymentHistory';
1
+ import { listProjectDeploymentHistory } from '../listProjectDeploymentHistory';
2
2
  export async function readCurrentProjectWebDeployment(projectRoot) {
3
3
  const history = await listProjectDeploymentHistory({ projectRoot });
4
4
  const [record] = [...history]
@@ -1 +1 @@
1
- {"version":3,"file":"readCurrentProjectWebDeployment.js","sourceRoot":"","sources":["../../../src/project/web/readCurrentProjectWebDeployment.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,4BAA4B,EAAE,MAAM,yCAAyC,CAAC;AAGvF,MAAM,CAAC,KAAK,UAAU,+BAA+B,CACnD,WAAmB;IAEnB,MAAM,OAAO,GAAG,MAAM,4BAA4B,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;IACpE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC;SAC1B,MAAM,CAAC,qBAAqB,CAAC;SAC7B,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IAC1E,MAAM,GAAG,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACpE,OAAO,EAAE,OAAO,EAAE,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC;AAClD,CAAC;AAED,SAAS,qBAAqB,CAAC,MAAsC;IACnE,OAAO,CACL,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,MAAM,CAAC;QACtC,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,WAAW;QACvC,MAAM,CAAC,YAAY,EAAE,EAAE,KAAK,IAAI,CACjC,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CACxB,MAAsC;IAEtC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,KAAK,CAAC,EAAE,OAAO,CAAC;IACvF,IAAI,OAAO,EAAE,MAAM,KAAK,KAAK,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAC7E,OAAO;QACL,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,GAAG,CAAC,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC;KAC7E,CAAC;AACJ,CAAC","sourcesContent":["import type {\n DeploymentCurrentState,\n DeploymentObservedWebTarget,\n} from '../../domain/DeploymentCurrentState';\nimport { listProjectDeploymentHistory } from '../history/listProjectDeploymentHistory';\nimport type { ProjectDeploymentHistoryRecord } from '../history/ProjectDeploymentHistoryRecord';\n\nexport async function readCurrentProjectWebDeployment(\n projectRoot: string,\n): Promise<DeploymentCurrentState> {\n const history = await listProjectDeploymentHistory({ projectRoot });\n const [record] = [...history]\n .filter(isSuccessfulWebRecord)\n .sort((left, right) => right.recordedAt.localeCompare(left.recordedAt));\n const web = record === undefined ? null : observedWebTarget(record);\n return { targets: web === null ? {} : { web } };\n}\n\nfunction isSuccessfulWebRecord(record: ProjectDeploymentHistoryRecord): boolean {\n return (\n record.deploymentId.startsWith('web-') &&\n record.execution.status === 'completed' &&\n record.verification?.ok === true\n );\n}\n\nfunction observedWebTarget(\n record: ProjectDeploymentHistoryRecord,\n): DeploymentObservedWebTarget | null {\n const desired = record.plan.changes.find((change) => change.target === 'web')?.desired;\n if (desired?.target !== 'web' || desired.revision === undefined) return null;\n return {\n revision: desired.revision,\n ...(desired.providers === undefined ? {} : { providers: desired.providers }),\n };\n}\n"]}
1
+ {"version":3,"file":"readCurrentProjectWebDeployment.js","sourceRoot":"","sources":["../../../src/project/web/readCurrentProjectWebDeployment.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,4BAA4B,EAAE,MAAM,iCAAiC,CAAC;AAE/E,MAAM,CAAC,KAAK,UAAU,+BAA+B,CACnD,WAAmB;IAEnB,MAAM,OAAO,GAAG,MAAM,4BAA4B,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;IACpE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC;SAC1B,MAAM,CAAC,qBAAqB,CAAC;SAC7B,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IAC1E,MAAM,GAAG,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACpE,OAAO,EAAE,OAAO,EAAE,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC;AAClD,CAAC;AAED,SAAS,qBAAqB,CAAC,MAAsC;IACnE,OAAO,CACL,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,MAAM,CAAC;QACtC,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,WAAW;QACvC,MAAM,CAAC,YAAY,EAAE,EAAE,KAAK,IAAI,CACjC,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CACxB,MAAsC;IAEtC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,KAAK,CAAC,EAAE,OAAO,CAAC;IACvF,IAAI,OAAO,EAAE,MAAM,KAAK,KAAK,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAC7E,OAAO;QACL,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,GAAG,CAAC,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC;KAC7E,CAAC;AACJ,CAAC","sourcesContent":["import type {\n DeploymentCurrentState,\n DeploymentObservedWebTarget,\n} from '../../domain/DeploymentCurrentState';\nimport type { ProjectDeploymentHistoryRecord } from '../history/ProjectDeploymentHistoryRecord';\nimport { listProjectDeploymentHistory } from '../listProjectDeploymentHistory';\n\nexport async function readCurrentProjectWebDeployment(\n projectRoot: string,\n): Promise<DeploymentCurrentState> {\n const history = await listProjectDeploymentHistory({ projectRoot });\n const [record] = [...history]\n .filter(isSuccessfulWebRecord)\n .sort((left, right) => right.recordedAt.localeCompare(left.recordedAt));\n const web = record === undefined ? null : observedWebTarget(record);\n return { targets: web === null ? {} : { web } };\n}\n\nfunction isSuccessfulWebRecord(record: ProjectDeploymentHistoryRecord): boolean {\n return (\n record.deploymentId.startsWith('web-') &&\n record.execution.status === 'completed' &&\n record.verification?.ok === true\n );\n}\n\nfunction observedWebTarget(\n record: ProjectDeploymentHistoryRecord,\n): DeploymentObservedWebTarget | null {\n const desired = record.plan.changes.find((change) => change.target === 'web')?.desired;\n if (desired?.target !== 'web' || desired.revision === undefined) return null;\n return {\n revision: desired.revision,\n ...(desired.providers === undefined ? {} : { providers: desired.providers }),\n };\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { listProjectDeploymentHistory } from '../history/listProjectDeploymentHistory';
1
+ import { listProjectDeploymentHistory } from '../listProjectDeploymentHistory';
2
2
  export async function readCurrentProjectWebProductionDeployment(projectRoot) {
3
3
  const history = await listProjectDeploymentHistory({ projectRoot });
4
4
  const [record] = [...history]
@@ -1 +1 @@
1
- {"version":3,"file":"readCurrentProjectWebProductionDeployment.js","sourceRoot":"","sources":["../../../src/project/web/readCurrentProjectWebProductionDeployment.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,4BAA4B,EAAE,MAAM,yCAAyC,CAAC;AAGvF,MAAM,CAAC,KAAK,UAAU,yCAAyC,CAC7D,WAAmB;IAEnB,MAAM,OAAO,GAAG,MAAM,4BAA4B,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;IACpE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC;SAC1B,MAAM,CAAC,4BAA4B,CAAC;SACpC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IAC1E,MAAM,GAAG,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACpE,OAAO,EAAE,OAAO,EAAE,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC;AAClD,CAAC;AAED,SAAS,4BAA4B,CAAC,MAAsC;IAC1E,OAAO,CACL,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,iBAAiB,CAAC;QACjD,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,WAAW;QACvC,MAAM,CAAC,YAAY,EAAE,EAAE,KAAK,IAAI,CACjC,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CACxB,MAAsC;IAEtC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,KAAK,CAAC,EAAE,OAAO,CAAC;IACvF,IAAI,OAAO,EAAE,MAAM,KAAK,KAAK,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAC7E,OAAO;QACL,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,GAAG,CAAC,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC;KAC7E,CAAC;AACJ,CAAC","sourcesContent":["import type {\n DeploymentCurrentState,\n DeploymentObservedWebTarget,\n} from '../../domain/DeploymentCurrentState';\nimport { listProjectDeploymentHistory } from '../history/listProjectDeploymentHistory';\nimport type { ProjectDeploymentHistoryRecord } from '../history/ProjectDeploymentHistoryRecord';\n\nexport async function readCurrentProjectWebProductionDeployment(\n projectRoot: string,\n): Promise<DeploymentCurrentState> {\n const history = await listProjectDeploymentHistory({ projectRoot });\n const [record] = [...history]\n .filter(isSuccessfulProductionRecord)\n .sort((left, right) => right.recordedAt.localeCompare(left.recordedAt));\n const web = record === undefined ? null : observedWebTarget(record);\n return { targets: web === null ? {} : { web } };\n}\n\nfunction isSuccessfulProductionRecord(record: ProjectDeploymentHistoryRecord): boolean {\n return (\n record.deploymentId.startsWith('web-production-') &&\n record.execution.status === 'completed' &&\n record.verification?.ok === true\n );\n}\n\nfunction observedWebTarget(\n record: ProjectDeploymentHistoryRecord,\n): DeploymentObservedWebTarget | null {\n const desired = record.plan.changes.find((change) => change.target === 'web')?.desired;\n if (desired?.target !== 'web' || desired.revision === undefined) return null;\n return {\n revision: desired.revision,\n ...(desired.providers === undefined ? {} : { providers: desired.providers }),\n };\n}\n"]}
1
+ {"version":3,"file":"readCurrentProjectWebProductionDeployment.js","sourceRoot":"","sources":["../../../src/project/web/readCurrentProjectWebProductionDeployment.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,4BAA4B,EAAE,MAAM,iCAAiC,CAAC;AAE/E,MAAM,CAAC,KAAK,UAAU,yCAAyC,CAC7D,WAAmB;IAEnB,MAAM,OAAO,GAAG,MAAM,4BAA4B,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;IACpE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC;SAC1B,MAAM,CAAC,4BAA4B,CAAC;SACpC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IAC1E,MAAM,GAAG,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACpE,OAAO,EAAE,OAAO,EAAE,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC;AAClD,CAAC;AAED,SAAS,4BAA4B,CAAC,MAAsC;IAC1E,OAAO,CACL,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,iBAAiB,CAAC;QACjD,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,WAAW;QACvC,MAAM,CAAC,YAAY,EAAE,EAAE,KAAK,IAAI,CACjC,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CACxB,MAAsC;IAEtC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,KAAK,CAAC,EAAE,OAAO,CAAC;IACvF,IAAI,OAAO,EAAE,MAAM,KAAK,KAAK,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAC7E,OAAO;QACL,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,GAAG,CAAC,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC;KAC7E,CAAC;AACJ,CAAC","sourcesContent":["import type {\n DeploymentCurrentState,\n DeploymentObservedWebTarget,\n} from '../../domain/DeploymentCurrentState';\nimport type { ProjectDeploymentHistoryRecord } from '../history/ProjectDeploymentHistoryRecord';\nimport { listProjectDeploymentHistory } from '../listProjectDeploymentHistory';\n\nexport async function readCurrentProjectWebProductionDeployment(\n projectRoot: string,\n): Promise<DeploymentCurrentState> {\n const history = await listProjectDeploymentHistory({ projectRoot });\n const [record] = [...history]\n .filter(isSuccessfulProductionRecord)\n .sort((left, right) => right.recordedAt.localeCompare(left.recordedAt));\n const web = record === undefined ? null : observedWebTarget(record);\n return { targets: web === null ? {} : { web } };\n}\n\nfunction isSuccessfulProductionRecord(record: ProjectDeploymentHistoryRecord): boolean {\n return (\n record.deploymentId.startsWith('web-production-') &&\n record.execution.status === 'completed' &&\n record.verification?.ok === true\n );\n}\n\nfunction observedWebTarget(\n record: ProjectDeploymentHistoryRecord,\n): DeploymentObservedWebTarget | null {\n const desired = record.plan.changes.find((change) => change.target === 'web')?.desired;\n if (desired?.target !== 'web' || desired.revision === undefined) return null;\n return {\n revision: desired.revision,\n ...(desired.providers === undefined ? {} : { providers: desired.providers }),\n };\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import { PROJECT_DEPLOYMENT_HISTORY_SCHEMA_VERSION } from '../history/historySchemaVersion';
2
- import { recordProjectDeploymentHistory } from '../history/recordProjectDeploymentHistory';
2
+ import { recordProjectDeploymentHistory } from '../recordProjectDeploymentHistory';
3
3
  export async function recordProjectWebDeployment(options) {
4
4
  const revision = options.inspection.desiredRevision;
5
5
  if (revision === undefined)
@@ -1 +1 @@
1
- {"version":3,"file":"recordProjectWebDeployment.js","sourceRoot":"","sources":["../../../src/project/web/recordProjectWebDeployment.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,yCAAyC,EAAE,MAAM,iCAAiC,CAAC;AAC5F,OAAO,EAAE,8BAA8B,EAAE,MAAM,2CAA2C,CAAC;AAM3F,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,OAOhD;IACC,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC;IACpD,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,cAAc,CAAC,8BAA8B,CAAC,CAAC;IAClF,IAAI,CAAC;QACH,MAAM,8BAA8B,CAAC;YACnC,WAAW,EAAE,OAAO,CAAC,UAAU,CAAC,WAAW;YAC3C,MAAM,EAAE;gBACN,aAAa,EAAE,yCAAyC;gBACxD,YAAY,EAAE,eAAe,CAAC,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC;gBAC5D,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO;gBACnC,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,YAAY,EAAE,OAAO,CAAC,YAAY;aACnC;SACF,CAAC,CAAC;QACH,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,cAAc,CAAC,2BAA2B,CAAC,CAAC;IACrD,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,OAAO;QACL,QAAQ,EAAE,KAAK;QACf,OAAO,EAAE;YACP,IAAI;YACJ,OAAO,EAAE,+CAA+C;YACxD,MAAM,EAAE,KAAK;SACd;KACF,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,WAAqC,EAAE,QAAgB;IAC9E,MAAM,KAAK,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;IAChE,OAAO,OAAO,KAAK,IAAI,QAAQ,EAAE,CAAC;AACpC,CAAC","sourcesContent":["import type { DeploymentExecutionResult } from '../../domain/DeploymentExecutionResult';\nimport type { DeploymentFailure } from '../../domain/DeploymentFailure';\nimport type { DeploymentPlan } from '../../domain/DeploymentPlan';\nimport type { DeploymentVerificationResult } from '../../domain/DeploymentVerificationResult';\nimport type { WebDeploymentPublication } from '../../domain/WebDeploymentPublication';\nimport { PROJECT_DEPLOYMENT_HISTORY_SCHEMA_VERSION } from '../history/historySchemaVersion';\nimport { recordProjectDeploymentHistory } from '../history/recordProjectDeploymentHistory';\nimport type { ProjectWebDeploymentInspection } from './ProjectWebDeploymentInspection';\n\nexport type RecordProjectWebHistoryResult =\n { readonly recorded: true } | { readonly recorded: false; readonly failure: DeploymentFailure };\n\nexport async function recordProjectWebDeployment(options: {\n readonly inspection: ProjectWebDeploymentInspection;\n readonly plan: DeploymentPlan;\n readonly execution: DeploymentExecutionResult;\n readonly verification: DeploymentVerificationResult;\n readonly publication: WebDeploymentPublication;\n readonly recordedAt: string;\n}): Promise<RecordProjectWebHistoryResult> {\n const revision = options.inspection.desiredRevision;\n if (revision === undefined) return historyFailure('WEB_HISTORY_REVISION_MISSING');\n try {\n await recordProjectDeploymentHistory({\n projectRoot: options.inspection.projectRoot,\n record: {\n schemaVersion: PROJECT_DEPLOYMENT_HISTORY_SCHEMA_VERSION,\n deploymentId: webDeploymentId(options.publication, revision),\n recordedAt: options.recordedAt,\n desired: options.inspection.desired,\n plan: options.plan,\n execution: options.execution,\n verification: options.verification,\n },\n });\n return { recorded: true };\n } catch {\n return historyFailure('WEB_HISTORY_RECORD_FAILED');\n }\n}\n\nfunction historyFailure(code: string): RecordProjectWebHistoryResult {\n return {\n recorded: false,\n failure: {\n code,\n message: 'Web deployment history could not be recorded.',\n target: 'web',\n },\n };\n}\n\nfunction webDeploymentId(publication: WebDeploymentPublication, revision: string): string {\n const scope = publication.production ? 'production' : 'preview';\n return `web-${scope}-${revision}`;\n}\n"]}
1
+ {"version":3,"file":"recordProjectWebDeployment.js","sourceRoot":"","sources":["../../../src/project/web/recordProjectWebDeployment.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,yCAAyC,EAAE,MAAM,iCAAiC,CAAC;AAC5F,OAAO,EAAE,8BAA8B,EAAE,MAAM,mCAAmC,CAAC;AAMnF,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,OAOhD;IACC,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC;IACpD,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,cAAc,CAAC,8BAA8B,CAAC,CAAC;IAClF,IAAI,CAAC;QACH,MAAM,8BAA8B,CAAC;YACnC,WAAW,EAAE,OAAO,CAAC,UAAU,CAAC,WAAW;YAC3C,MAAM,EAAE;gBACN,aAAa,EAAE,yCAAyC;gBACxD,YAAY,EAAE,eAAe,CAAC,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC;gBAC5D,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO;gBACnC,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,YAAY,EAAE,OAAO,CAAC,YAAY;aACnC;SACF,CAAC,CAAC;QACH,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,cAAc,CAAC,2BAA2B,CAAC,CAAC;IACrD,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,OAAO;QACL,QAAQ,EAAE,KAAK;QACf,OAAO,EAAE;YACP,IAAI;YACJ,OAAO,EAAE,+CAA+C;YACxD,MAAM,EAAE,KAAK;SACd;KACF,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,WAAqC,EAAE,QAAgB;IAC9E,MAAM,KAAK,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;IAChE,OAAO,OAAO,KAAK,IAAI,QAAQ,EAAE,CAAC;AACpC,CAAC","sourcesContent":["import type { DeploymentExecutionResult } from '../../domain/DeploymentExecutionResult';\nimport type { DeploymentFailure } from '../../domain/DeploymentFailure';\nimport type { DeploymentPlan } from '../../domain/DeploymentPlan';\nimport type { DeploymentVerificationResult } from '../../domain/DeploymentVerificationResult';\nimport type { WebDeploymentPublication } from '../../domain/WebDeploymentPublication';\nimport { PROJECT_DEPLOYMENT_HISTORY_SCHEMA_VERSION } from '../history/historySchemaVersion';\nimport { recordProjectDeploymentHistory } from '../recordProjectDeploymentHistory';\nimport type { ProjectWebDeploymentInspection } from './ProjectWebDeploymentInspection';\n\nexport type RecordProjectWebHistoryResult =\n { readonly recorded: true } | { readonly recorded: false; readonly failure: DeploymentFailure };\n\nexport async function recordProjectWebDeployment(options: {\n readonly inspection: ProjectWebDeploymentInspection;\n readonly plan: DeploymentPlan;\n readonly execution: DeploymentExecutionResult;\n readonly verification: DeploymentVerificationResult;\n readonly publication: WebDeploymentPublication;\n readonly recordedAt: string;\n}): Promise<RecordProjectWebHistoryResult> {\n const revision = options.inspection.desiredRevision;\n if (revision === undefined) return historyFailure('WEB_HISTORY_REVISION_MISSING');\n try {\n await recordProjectDeploymentHistory({\n projectRoot: options.inspection.projectRoot,\n record: {\n schemaVersion: PROJECT_DEPLOYMENT_HISTORY_SCHEMA_VERSION,\n deploymentId: webDeploymentId(options.publication, revision),\n recordedAt: options.recordedAt,\n desired: options.inspection.desired,\n plan: options.plan,\n execution: options.execution,\n verification: options.verification,\n },\n });\n return { recorded: true };\n } catch {\n return historyFailure('WEB_HISTORY_RECORD_FAILED');\n }\n}\n\nfunction historyFailure(code: string): RecordProjectWebHistoryResult {\n return {\n recorded: false,\n failure: {\n code,\n message: 'Web deployment history could not be recorded.',\n target: 'web',\n },\n };\n}\n\nfunction webDeploymentId(publication: WebDeploymentPublication, revision: string): string {\n const scope = publication.production ? 'production' : 'preview';\n return `web-${scope}-${revision}`;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ankhorage/deploy",
3
- "version": "0.13.102",
3
+ "version": "0.14.1",
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": {
@@ -52,6 +52,11 @@
52
52
  "types": "./dist/cli/index.d.ts",
53
53
  "import": "./dist/cli/index.js",
54
54
  "default": "./dist/cli/index.js"
55
+ },
56
+ "./capabilities": {
57
+ "types": "./dist/capabilities/index.d.ts",
58
+ "import": "./dist/capabilities/index.js",
59
+ "default": "./dist/capabilities/index.js"
55
60
  }
56
61
  },
57
62
  "files": [
@@ -64,9 +69,21 @@
64
69
  "category": "deploy",
65
70
  "provider": "./dist/cli/index.js",
66
71
  "capabilities": [
67
- "deploy.inspect",
68
- "deploy.plan",
69
- "deploy.execute"
72
+ {
73
+ "id": "deploy.execute",
74
+ "owner": "@ankhorage/deploy",
75
+ "access": [
76
+ "invoke"
77
+ ],
78
+ "binding": {
79
+ "kind": "action",
80
+ "bindableAs": [
81
+ "target"
82
+ ]
83
+ },
84
+ "label": "Execute deployment",
85
+ "description": "Inspect, plan and execute the authored project release."
86
+ }
70
87
  ]
71
88
  },
72
89
  "scripts": {
@@ -85,15 +102,15 @@
85
102
  "knip:check": "ankhorage-knip"
86
103
  },
87
104
  "dependencies": {
88
- "@ankhorage/contracts": "^22.8.91",
105
+ "@ankhorage/ankh": "^0.12.2",
106
+ "@ankhorage/contracts": "^24.2.0",
89
107
  "@ankhorage/deploy-provider-app-store-connect": "^0.0.0",
90
108
  "@ankhorage/deploy-provider-eas": "^0.0.0",
91
109
  "@ankhorage/deploy-provider-google-play": "^0.0.0"
92
110
  },
93
111
  "devDependencies": {
94
- "@ankhorage/ankh": "^0.8.11",
95
- "@ankhorage/devtools": "^2.0.0",
96
- "@ankhorage/paradox": "^0.2.25",
112
+ "@ankhorage/devtools": "^2.2.2",
113
+ "@ankhorage/paradox": "^0.3.1",
97
114
  "@types/bun": "^1.4.2",
98
115
  "@types/node": "^26.6.4",
99
116
  "typescript": "^6.0.3"
@@ -1,5 +0,0 @@
1
- import type { ProjectDeploymentHistoryRecord } from './ProjectDeploymentHistoryRecord';
2
- export declare function listProjectDeploymentHistory(options: {
3
- readonly projectRoot: string;
4
- }): Promise<readonly ProjectDeploymentHistoryRecord[]>;
5
- //# sourceMappingURL=listProjectDeploymentHistory.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"listProjectDeploymentHistory.d.ts","sourceRoot":"","sources":["../../../src/project/history/listProjectDeploymentHistory.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,kCAAkC,CAAC;AAGvF,wBAAsB,4BAA4B,CAAC,OAAO,EAAE;IAC1D,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B,GAAG,OAAO,CAAC,SAAS,8BAA8B,EAAE,CAAC,CAcrD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"listProjectDeploymentHistory.js","sourceRoot":"","sources":["../../../src/project/history/listProjectDeploymentHistory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AAEtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAE/D,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAE9E,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAAC,OAElD;IACC,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IACjF,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IACpE,MAAM,GAAG,GAAG,OAAO;SAChB,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;SACtC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;SAC1B,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;IAEpD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,GAAG,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE,CACvB,4BAA4B,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,YAAY,EAAE,CAAC,CACjF,CACF,CAAC;IACF,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAA4C,EAAE,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC;AAC/F,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,WAAmB;IACnD,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAChE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,kBAAkB,CAAC,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QACzC,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC","sourcesContent":["import { type Dirent, promises as fs } from 'node:fs';\n\nimport { isMissingPathError } from '../io/isMissingPathError';\nimport { resolveDeployProject } from '../resolveDeployProject';\nimport type { ProjectDeploymentHistoryRecord } from './ProjectDeploymentHistoryRecord';\nimport { readProjectDeploymentHistory } from './readProjectDeploymentHistory';\n\nexport async function listProjectDeploymentHistory(options: {\n readonly projectRoot: string;\n}): Promise<readonly ProjectDeploymentHistoryRecord[]> {\n const project = await resolveDeployProject({ projectRoot: options.projectRoot });\n const entries = await readHistoryEntries(project.paths.historyRoot);\n const ids = entries\n .filter((entry) => entry.isDirectory())\n .map((entry) => entry.name)\n .sort((left, right) => left.localeCompare(right));\n\n const records = await Promise.all(\n ids.map((deploymentId) =>\n readProjectDeploymentHistory({ projectRoot: project.projectRoot, deploymentId }),\n ),\n );\n return records.filter((record): record is ProjectDeploymentHistoryRecord => record !== null);\n}\n\nasync function readHistoryEntries(historyRoot: string): Promise<readonly Dirent[]> {\n try {\n return await fs.readdir(historyRoot, { withFileTypes: true });\n } catch (error) {\n if (isMissingPathError(error)) return [];\n throw error;\n }\n}\n"]}
@@ -1,6 +0,0 @@
1
- import type { ProjectDeploymentHistoryRecord } from './ProjectDeploymentHistoryRecord';
2
- export declare function readProjectDeploymentHistory(options: {
3
- readonly projectRoot: string;
4
- readonly deploymentId: string;
5
- }): Promise<ProjectDeploymentHistoryRecord | null>;
6
- //# sourceMappingURL=readProjectDeploymentHistory.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"readProjectDeploymentHistory.d.ts","sourceRoot":"","sources":["../../../src/project/history/readProjectDeploymentHistory.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,kCAAkC,CAAC;AAEvF,wBAAsB,4BAA4B,CAAC,OAAO,EAAE;IAC1D,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B,GAAG,OAAO,CAAC,8BAA8B,GAAG,IAAI,CAAC,CAkBjD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"readProjectDeploymentHistory.js","sourceRoot":"","sources":["../../../src/project/history/readProjectDeploymentHistory.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,mCAAmC,EAAE,MAAM,uCAAuC,CAAC;AAG5F,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAAC,OAGlD;IACC,iBAAiB,CAAC,OAAO,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;IACzD,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IACjF,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,OAAO,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC;IAEjG,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,YAAY,CAAC,UAAU,EAAE,2BAA2B,CAAC,CAAC;IACvE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,kBAAkB,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAC3C,MAAM,KAAK,CAAC;IACd,CAAC;IAED,MAAM,MAAM,GAAG,mCAAmC,CAAC,MAAM,CAAC,CAAC;IAC3D,IAAI,MAAM,CAAC,YAAY,KAAK,OAAO,CAAC,YAAY,EAAE,CAAC;QACjD,MAAM,IAAI,KAAK,CAAC,uDAAuD,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IACjG,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["import path from 'node:path';\n\nimport { assertSafeSegment } from '../io/assertSafeSegment';\nimport { isMissingPathError } from '../io/isMissingPathError';\nimport { readJsonFile } from '../io/readJsonFile';\nimport { resolveDeployProject } from '../resolveDeployProject';\nimport { parseProjectDeploymentHistoryRecord } from './parseProjectDeploymentHistoryRecord';\nimport type { ProjectDeploymentHistoryRecord } from './ProjectDeploymentHistoryRecord';\n\nexport async function readProjectDeploymentHistory(options: {\n readonly projectRoot: string;\n readonly deploymentId: string;\n}): Promise<ProjectDeploymentHistoryRecord | null> {\n assertSafeSegment(options.deploymentId, 'deployment id');\n const project = await resolveDeployProject({ projectRoot: options.projectRoot });\n const recordPath = path.join(project.paths.historyRoot, options.deploymentId, 'deployment.json');\n\n let parsed: unknown;\n try {\n parsed = await readJsonFile(recordPath, 'Deployment history record');\n } catch (error) {\n if (isMissingPathError(error)) return null;\n throw error;\n }\n\n const record = parseProjectDeploymentHistoryRecord(parsed);\n if (record.deploymentId !== options.deploymentId) {\n throw new Error(`Deployment history id does not match its directory: ${options.deploymentId}`);\n }\n return record;\n}\n"]}
@@ -1,6 +0,0 @@
1
- import type { ProjectDeploymentHistoryRecord } from './ProjectDeploymentHistoryRecord';
2
- export declare function recordProjectDeploymentHistory(options: {
3
- readonly projectRoot: string;
4
- readonly record: ProjectDeploymentHistoryRecord;
5
- }): Promise<void>;
6
- //# sourceMappingURL=recordProjectDeploymentHistory.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"recordProjectDeploymentHistory.d.ts","sourceRoot":"","sources":["../../../src/project/history/recordProjectDeploymentHistory.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,kCAAkC,CAAC;AAEvF,wBAAsB,8BAA8B,CAAC,OAAO,EAAE;IAC5D,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,8BAA8B,CAAC;CACjD,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBhB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"recordProjectDeploymentHistory.js","sourceRoot":"","sources":["../../../src/project/history/recordProjectDeploymentHistory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,mCAAmC,EAAE,MAAM,uCAAuC,CAAC;AAG5F,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAAC,OAGpD;IACC,MAAM,MAAM,GAAG,mCAAmC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACnE,iBAAiB,CAAC,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;IAExD,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IACjF,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;IAC7E,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;IAC5D,MAAM,wBAAwB,CAAC,OAAO,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IAChE,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/D,MAAM,qBAAqB,CAAC,UAAU,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;IAE7D,IAAI,CAAC;QACH,MAAM,eAAe,CAAC;YACpB,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,QAAQ,EAAE,UAAU;YACpB,KAAK,EAAE,MAAM;SACd,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,EAAE,CAAC,EAAE,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,qBAAqB,CAAC,UAAkB,EAAE,YAAoB;IAC3E,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACzE,MAAM,IAAI,KAAK,CAAC,sCAAsC,YAAY,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1F,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC","sourcesContent":["import { promises as fs } from 'node:fs';\nimport path from 'node:path';\n\nimport { assertContainedWritePath } from '../io/assertContainedPath';\nimport { assertSafeSegment } from '../io/assertSafeSegment';\nimport { atomicWriteJson } from '../io/atomicWriteJson';\nimport { resolveDeployProject } from '../resolveDeployProject';\nimport { parseProjectDeploymentHistoryRecord } from './parseProjectDeploymentHistoryRecord';\nimport type { ProjectDeploymentHistoryRecord } from './ProjectDeploymentHistoryRecord';\n\nexport async function recordProjectDeploymentHistory(options: {\n readonly projectRoot: string;\n readonly record: ProjectDeploymentHistoryRecord;\n}): Promise<void> {\n const record = parseProjectDeploymentHistoryRecord(options.record);\n assertSafeSegment(record.deploymentId, 'deployment id');\n\n const project = await resolveDeployProject({ projectRoot: options.projectRoot });\n const recordRoot = path.join(project.paths.historyRoot, record.deploymentId);\n const recordPath = path.join(recordRoot, 'deployment.json');\n await assertContainedWritePath(project.projectRoot, recordPath);\n await fs.mkdir(project.paths.historyRoot, { recursive: true });\n await createRecordDirectory(recordRoot, record.deploymentId);\n\n try {\n await atomicWriteJson({\n projectRoot: project.projectRoot,\n filePath: recordPath,\n value: record,\n });\n } catch (error) {\n await fs.rm(recordRoot, { recursive: true, force: true });\n throw error;\n }\n}\n\nasync function createRecordDirectory(recordRoot: string, deploymentId: string): Promise<void> {\n try {\n await fs.mkdir(recordRoot);\n } catch (error) {\n if (error instanceof Error && 'code' in error && error.code === 'EEXIST') {\n throw new Error(`Deployment history already exists: ${deploymentId}`, { cause: error });\n }\n throw error;\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"parseProjectRelease.d.ts","sourceRoot":"","sources":["../../../src/project/release/parseProjectRelease.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAWxE,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,CAAC;IAC3C,QAAQ,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;IACvC,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;CAClC;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,oBAAoB,CAQxE"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"parseProjectRelease.js","sourceRoot":"","sources":["../../../src/project/release/parseProjectRelease.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ReleaseNote } from '../../domain/release/ReleaseNote';\nimport type { ReleaseRollout } from '../../domain/release/ReleaseRollout';\nimport type { ReleaseTarget } from '../../domain/release/ReleaseTarget';\nimport type { ReleaseTargetRollout } from '../../domain/release/ReleaseTargetRollout';\nimport { hasOnlyKeys } from '../io/hasOnlyKeys';\nimport { isRecord } from '../io/isRecord';\n\nconst ROOT_KEYS = new Set(['version', 'targets', 'notes', 'rollout']);\nconst NOTE_KEYS = new Set(['locale', 'text']);\nconst ROLLOUT_KEYS = new Set(['web', 'android', 'ios']);\nconst TARGET_ROLLOUT_KEYS = new Set(['mode', 'initialFraction']);\nconst TARGETS = new Set<ReleaseTarget>(['web', 'android', 'ios']);\n\nexport interface ParsedProjectRelease {\n readonly version: string;\n readonly targets: readonly ReleaseTarget[];\n readonly notes: readonly ReleaseNote[];\n readonly rollout: ReleaseRollout;\n}\n\nexport function parseProjectRelease(value: unknown): ParsedProjectRelease {\n if (!isRecord(value) || !hasOnlyKeys(value, ROOT_KEYS)) throw invalid();\n return {\n version: parseVersion(value.version),\n targets: parseTargets(value.targets),\n notes: parseNotes(value.notes),\n rollout: parseRollout(value.rollout),\n };\n}\n\nfunction parseVersion(value: unknown): string {\n if (typeof value !== 'string' || !/^\\d+(\\.\\d+){0,2}$/.test(value)) throw invalid();\n return value;\n}\n\nfunction parseTargets(value: unknown): readonly ReleaseTarget[] {\n if (!Array.isArray(value) || value.length === 0) throw invalid();\n const targets = value.map(parseTarget).sort();\n if (new Set(targets).size !== targets.length) throw invalid();\n return targets;\n}\n\nfunction parseTarget(value: unknown): ReleaseTarget {\n if (typeof value !== 'string' || !TARGETS.has(value as ReleaseTarget)) throw invalid();\n return value as ReleaseTarget;\n}\n\nfunction parseNotes(value: unknown): readonly ReleaseNote[] {\n if (!Array.isArray(value)) throw invalid();\n const notes = value.map(parseNote).sort((a, b) => a.locale.localeCompare(b.locale));\n if (new Set(notes.map((note) => note.locale)).size !== notes.length) throw invalid();\n return notes;\n}\n\nfunction parseNote(value: unknown): ReleaseNote {\n if (!isRecord(value) || !hasOnlyKeys(value, NOTE_KEYS)) throw invalid();\n if (typeof value.text !== 'string' || value.text.trim().length === 0) throw invalid();\n return { locale: normalizeLocale(value.locale), text: value.text };\n}\n\nfunction parseRollout(value: unknown): ReleaseRollout {\n if (!isRecord(value) || !hasOnlyKeys(value, ROLLOUT_KEYS)) throw invalid();\n return {\n ...(value.web === undefined ? {} : { web: parseWebRollout(value.web) }),\n ...(value.android === undefined ? {} : { android: parseAndroidRollout(value.android) }),\n ...(value.ios === undefined ? {} : { ios: parseIosRollout(value.ios) }),\n };\n}\n\nfunction parseWebRollout(value: unknown): ReleaseTargetRollout {\n const rollout = parseTargetRollout(value);\n if (rollout.mode !== 'immediate' || rollout.initialFraction !== undefined) throw invalid();\n return rollout;\n}\n\nfunction parseAndroidRollout(value: unknown): ReleaseTargetRollout {\n const rollout = parseTargetRollout(value);\n if (rollout.mode === 'staged') {\n if (rollout.initialFraction === undefined) throw invalid();\n return { mode: 'staged', initialFraction: normalizeFraction(rollout.initialFraction) };\n }\n if (rollout.initialFraction !== undefined) throw invalid();\n return { mode: 'immediate' };\n}\n\nfunction parseIosRollout(value: unknown): ReleaseTargetRollout {\n const rollout = parseTargetRollout(value);\n if (rollout.initialFraction !== undefined) throw invalid();\n return { mode: rollout.mode };\n}\n\nfunction parseTargetRollout(value: unknown): ReleaseTargetRollout {\n if (!isRecord(value) || !hasOnlyKeys(value, TARGET_ROLLOUT_KEYS)) throw invalid();\n if (value.mode !== 'immediate' && value.mode !== 'staged') throw invalid();\n if (value.initialFraction !== undefined && typeof value.initialFraction !== 'string') {\n throw invalid();\n }\n return {\n mode: value.mode,\n ...(value.initialFraction === undefined ? {} : { initialFraction: value.initialFraction }),\n };\n}\n\nfunction normalizeFraction(value: string): string {\n if (!/^0\\.\\d{1,6}$/.test(value)) throw invalid();\n const digits = value.slice(2).replace(/0+$/, '');\n if (digits.length === 0) throw invalid();\n return `0.${digits}`;\n}\n\nfunction normalizeLocale(value: unknown): string {\n if (typeof value !== 'string' || value.trim().length === 0) throw invalid();\n try {\n const locales = Intl.getCanonicalLocales(value);\n if (locales.length !== 1 || locales[0] === undefined) throw invalid();\n return locales[0];\n } catch {\n throw invalid();\n }\n}\n\nfunction invalid(): Error {\n return new Error('RELEASE_INVALID');\n}\n"]}