@ankhorage/deploy 0.13.101 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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
package/CHANGELOG.md CHANGED
@@ -1,5 +1,30 @@
1
1
  # @ankhorage/deploy
2
2
 
3
+ ## 0.14.0
4
+
5
+ ### Minor Changes
6
+
7
+ - f1cd078: Publish Deploy's canonical capability descriptor and use it consistently across package metadata and the Ankh provider.
8
+
9
+ ### Patch Changes
10
+
11
+ - 32d6d72: Update dependencies: `@ankhorage/ankh`, `@ankhorage/devtools`.
12
+ - a29ded5: Update dependencies: `@ankhorage/contracts`, `@ankhorage/paradox`.
13
+ - 14a5c81: Update dependencies: `@ankhorage/contracts`.
14
+ - 0e0bf14: Update dependencies: `@ankhorage/contracts`.
15
+ - bf91676: Update dependencies: `@ankhorage/contracts`.
16
+ - dd3e979: Update dependencies: `@ankhorage/contracts`.
17
+ - cdcea39: Update dependencies: `@ankhorage/contracts`.
18
+ - 8c94269: Update dependencies: `@ankhorage/contracts`.
19
+ - 40f1e49: Update dependencies: `@ankhorage/contracts`.
20
+ - f1cd078: Update dependencies: `@ankhorage/ankh`, `@ankhorage/devtools`.
21
+
22
+ ## 0.13.102
23
+
24
+ ### Patch Changes
25
+
26
+ - 87c4ce9: Update dependencies: `@ankhorage/contracts`.
27
+
3
28
  ## 0.13.101
4
29
 
5
30
  ### Patch Changes
package/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
 
4
4
  # @ankhorage/deploy
5
5
 
6
- ![license: MIT](././paradox/badges/license.svg) ![npm: v0.12.6](././paradox/badges/npm.svg) ![runtime: bun](././paradox/badges/runtime.svg) ![typescript: strict](././paradox/badges/typescript.svg) ![eslint: checked](././paradox/badges/eslint.svg) ![prettier: checked](././paradox/badges/prettier.svg) ![build: checked](././paradox/badges/build.svg) ![tests: checked](././paradox/badges/tests.svg) ![docs: paradox](././paradox/badges/docs.svg)
6
+ ![license: MIT](././paradox/badges/license.svg) ![npm: v0.14.0](././paradox/badges/npm.svg) ![runtime: bun](././paradox/badges/runtime.svg) ![typescript: strict](././paradox/badges/typescript.svg) ![eslint: checked](././paradox/badges/eslint.svg) ![prettier: checked](././paradox/badges/prettier.svg) ![build: checked](././paradox/badges/build.svg) ![tests: checked](././paradox/badges/tests.svg) ![paradox: warnings](././paradox/badges/docs.svg)
7
7
 
8
8
  Declarative deployment engine for Expo apps across web, iOS, and Android.
9
9
 
@@ -0,0 +1,13 @@
1
+ /*** Publish Deploy's canonical executable capability for Ankh discovery and bindings. */
2
+ export declare const CAPABILITIES: readonly [{
3
+ readonly id: "deploy.execute";
4
+ readonly owner: "@ankhorage/deploy";
5
+ readonly access: readonly ["invoke"];
6
+ readonly binding: {
7
+ readonly kind: "action";
8
+ readonly bindableAs: readonly ["target"];
9
+ };
10
+ readonly label: "Execute deployment";
11
+ readonly description: "Inspect, plan and execute the authored project release.";
12
+ }];
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/capabilities/index.ts"],"names":[],"mappings":"AAEA,yFAAyF;AACzF,eAAO,MAAM,YAAY;;;;;;;;;;EASiB,CAAC"}
@@ -0,0 +1,12 @@
1
+ /*** Publish Deploy's canonical executable capability for Ankh discovery and bindings. */
2
+ export const CAPABILITIES = [
3
+ {
4
+ id: 'deploy.execute',
5
+ owner: '@ankhorage/deploy',
6
+ access: ['invoke'],
7
+ binding: { kind: 'action', bindableAs: ['target'] },
8
+ label: 'Execute deployment',
9
+ description: 'Inspect, plan and execute the authored project release.',
10
+ },
11
+ ];
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/capabilities/index.ts"],"names":[],"mappings":"AAEA,yFAAyF;AACzF,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B;QACE,EAAE,EAAE,gBAAgB;QACpB,KAAK,EAAE,mBAAmB;QAC1B,MAAM,EAAE,CAAC,QAAQ,CAAC;QAClB,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,QAAQ,CAAC,EAAE;QACnD,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EAAE,yDAAyD;KACvE;CACuC,CAAC","sourcesContent":["import type { Capability } from '@ankhorage/contracts/capabilities';\n\n/*** Publish Deploy's canonical executable capability for Ankh discovery and bindings. */\nexport const CAPABILITIES = [\n {\n id: 'deploy.execute',\n owner: '@ankhorage/deploy',\n access: ['invoke'],\n binding: { kind: 'action', bindableAs: ['target'] },\n label: 'Execute deployment',\n description: 'Inspect, plan and execute the authored project release.',\n },\n] as const satisfies readonly Capability[];\n"]}
@@ -1,4 +1,5 @@
1
1
  import type { AnkhRuntimeCommandProvider } from '@ankhorage/ankh';
2
2
  import type { DeployCliRuntime } from './DeployCliRuntime.js';
3
+ /*** Create the Deploy Ankh provider from the supplied package runtime. */
3
4
  export declare function createDeployCliProvider(runtime: DeployCliRuntime): AnkhRuntimeCommandProvider;
4
5
  //# sourceMappingURL=createDeployCliProvider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"createDeployCliProvider.d.ts","sourceRoot":"","sources":["../../src/cli/createDeployCliProvider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAGlE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAI9D,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,gBAAgB,GAAG,0BAA0B,CAiC7F"}
1
+ {"version":3,"file":"createDeployCliProvider.d.ts","sourceRoot":"","sources":["../../src/cli/createDeployCliProvider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAKlE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAI9D,0EAA0E;AAC1E,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,gBAAgB,GAAG,0BAA0B,CAiC7F"}
@@ -1,6 +1,8 @@
1
1
  import packageJson from '../../package.json';
2
+ import { CAPABILITIES } from '../capabilities/index.js';
2
3
  import { handleDeployCliCommand } from './handleDeployCliCommand.js';
3
4
  import { handleDeployCliPlan } from './handleDeployCliPlan.js';
5
+ /*** Create the Deploy Ankh provider from the supplied package runtime. */
4
6
  export function createDeployCliProvider(runtime) {
5
7
  const command = {
6
8
  path: [],
@@ -16,7 +18,7 @@ export function createDeployCliProvider(runtime) {
16
18
  id: packageJson.name,
17
19
  category: 'deploy',
18
20
  version: packageJson.version,
19
- capabilities: ['deploy.inspect', 'deploy.plan', 'deploy.execute'],
21
+ capabilities: CAPABILITIES,
20
22
  commands: [command],
21
23
  handlers: [
22
24
  {
@@ -1 +1 @@
1
- {"version":3,"file":"createDeployCliProvider.js","sourceRoot":"","sources":["../../src/cli/createDeployCliProvider.ts"],"names":[],"mappings":"AAEA,OAAO,WAAW,MAAM,oBAAoB,CAAC;AAE7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,MAAM,UAAU,uBAAuB,CAAC,OAAyB;IAC/D,MAAM,OAAO,GAAG;QACd,IAAI,EAAE,EAAE;QACR,UAAU,EAAE,gBAAgB;QAC5B,OAAO,EAAE,wDAAwD;QACjE,QAAQ,EAAE;YACR,aAAa;YACb,uBAAuB;YACvB,8CAA8C;SAC/C;KACO,CAAC;IAEX,OAAO;QACL,EAAE,EAAE,WAAW,CAAC,IAAI;QACpB,QAAQ,EAAE,QAAQ;QAClB,OAAO,EAAE,WAAW,CAAC,OAAO;QAC5B,YAAY,EAAE,CAAC,gBAAgB,EAAE,aAAa,EAAE,gBAAgB,CAAC;QACjE,QAAQ,EAAE,CAAC,OAAO,CAAC;QACnB,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,EAAE;gBACR,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CACnB,sBAAsB,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC;aACpF;SACF;QACD,gBAAgB,EAAE;YAChB;gBACE,IAAI,EAAE,EAAE;gBACR,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CACnB,mBAAmB,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC;aACjF;SACF;KACF,CAAC;AACJ,CAAC","sourcesContent":["import type { AnkhRuntimeCommandProvider } from '@ankhorage/ankh';\n\nimport packageJson from '../../package.json';\nimport type { DeployCliRuntime } from './DeployCliRuntime.js';\nimport { handleDeployCliCommand } from './handleDeployCliCommand.js';\nimport { handleDeployCliPlan } from './handleDeployCliPlan.js';\n\nexport function createDeployCliProvider(runtime: DeployCliRuntime): AnkhRuntimeCommandProvider {\n const command = {\n path: [],\n capability: 'deploy.execute',\n summary: 'Inspect, plan and execute the authored project release',\n examples: [\n 'ankh deploy',\n 'ankh deploy --dry-run',\n 'ankh deploy --yes --android-track production',\n ],\n } as const;\n\n return {\n id: packageJson.name,\n category: 'deploy',\n version: packageJson.version,\n capabilities: ['deploy.inspect', 'deploy.plan', 'deploy.execute'],\n commands: [command],\n handlers: [\n {\n path: [],\n handler: (request) =>\n handleDeployCliCommand({ argv: request.argv, context: request.context }, runtime),\n },\n ],\n planningHandlers: [\n {\n path: [],\n handler: (request) =>\n handleDeployCliPlan({ argv: request.argv, context: request.context }, runtime),\n },\n ],\n };\n}\n"]}
1
+ {"version":3,"file":"createDeployCliProvider.js","sourceRoot":"","sources":["../../src/cli/createDeployCliProvider.ts"],"names":[],"mappings":"AAGA,OAAO,WAAW,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,0EAA0E;AAC1E,MAAM,UAAU,uBAAuB,CAAC,OAAyB;IAC/D,MAAM,OAAO,GAAG;QACd,IAAI,EAAE,EAAE;QACR,UAAU,EAAE,gBAA2C;QACvD,OAAO,EAAE,wDAAwD;QACjE,QAAQ,EAAE;YACR,aAAa;YACb,uBAAuB;YACvB,8CAA8C;SAC/C;KACO,CAAC;IAEX,OAAO;QACL,EAAE,EAAE,WAAW,CAAC,IAAI;QACpB,QAAQ,EAAE,QAAQ;QAClB,OAAO,EAAE,WAAW,CAAC,OAAO;QAC5B,YAAY,EAAE,YAAY;QAC1B,QAAQ,EAAE,CAAC,OAAO,CAAC;QACnB,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,EAAE;gBACR,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CACnB,sBAAsB,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC;aACpF;SACF;QACD,gBAAgB,EAAE;YAChB;gBACE,IAAI,EAAE,EAAE;gBACR,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CACnB,mBAAmB,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC;aACjF;SACF;KACF,CAAC;AACJ,CAAC","sourcesContent":["import type { AnkhRuntimeCommandProvider } from '@ankhorage/ankh';\nimport type { Capability } from '@ankhorage/contracts/capabilities';\n\nimport packageJson from '../../package.json';\nimport { CAPABILITIES } from '../capabilities/index.js';\nimport type { DeployCliRuntime } from './DeployCliRuntime.js';\nimport { handleDeployCliCommand } from './handleDeployCliCommand.js';\nimport { handleDeployCliPlan } from './handleDeployCliPlan.js';\n\n/*** Create the Deploy Ankh provider from the supplied package runtime. */\nexport function createDeployCliProvider(runtime: DeployCliRuntime): AnkhRuntimeCommandProvider {\n const command = {\n path: [],\n capability: 'deploy.execute' satisfies Capability['id'],\n summary: 'Inspect, plan and execute the authored project release',\n examples: [\n 'ankh deploy',\n 'ankh deploy --dry-run',\n 'ankh deploy --yes --android-track production',\n ],\n } as const;\n\n return {\n id: packageJson.name,\n category: 'deploy',\n version: packageJson.version,\n capabilities: CAPABILITIES,\n commands: [command],\n handlers: [\n {\n path: [],\n handler: (request) =>\n handleDeployCliCommand({ argv: request.argv, context: request.context }, runtime),\n },\n ],\n planningHandlers: [\n {\n path: [],\n handler: (request) =>\n handleDeployCliPlan({ argv: request.argv, context: request.context }, runtime),\n },\n ],\n };\n}\n"]}
@@ -2,13 +2,17 @@ import type { ReleaseDesiredState } from '../../domain/release/ReleaseDesiredSta
2
2
  import type { ReleaseObservedState } from '../../domain/release/ReleaseObservedState';
3
3
  import type { ReleasePlanStep } from '../../domain/release/ReleasePlanStep';
4
4
  import type { ReleaseReconcileResult } from '../../domain/release/ReleaseReconcileResult';
5
- import type { ProjectReleaseHistoryRecord } from '../../project/releaseHistory/ProjectReleaseHistoryRecord';
6
5
  import type { ReleaseMutationResult } from './ReleaseMutationResult';
7
6
  type InspectRelease = () => Promise<ReleaseObservedState | null>;
8
7
  type MutateRelease = (step: ReleasePlanStep, current: ReleaseObservedState) => Promise<ReleaseMutationResult>;
8
+ interface PreviousReleaseExecution {
9
+ readonly desired: ReleaseDesiredState;
10
+ readonly result: ReleaseReconcileResult;
11
+ }
12
+ /*** Resume a release from the exact prior engine state required for safe reconciliation. */
9
13
  export declare function resumeReleaseExecution(options: {
10
14
  readonly desired: ReleaseDesiredState;
11
- readonly previous: ProjectReleaseHistoryRecord;
15
+ readonly previous: PreviousReleaseExecution;
12
16
  readonly inspect: InspectRelease;
13
17
  readonly mutate: MutateRelease;
14
18
  }): Promise<ReleaseReconcileResult>;
@@ -1 +1 @@
1
- {"version":3,"file":"resumeReleaseExecution.d.ts","sourceRoot":"","sources":["../../../src/engine/release/resumeReleaseExecution.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAC;AACpF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACtF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,6CAA6C,CAAC;AAC1F,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,0DAA0D,CAAC;AAE5G,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAErE,KAAK,cAAc,GAAG,MAAM,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAAC;AACjE,KAAK,aAAa,GAAG,CACnB,IAAI,EAAE,eAAe,EACrB,OAAO,EAAE,oBAAoB,KAC1B,OAAO,CAAC,qBAAqB,CAAC,CAAC;AAEpC,wBAAsB,sBAAsB,CAAC,OAAO,EAAE;IACpD,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,2BAA2B,CAAC;IAC/C,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;CAChC,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAgBlC"}
1
+ {"version":3,"file":"resumeReleaseExecution.d.ts","sourceRoot":"","sources":["../../../src/engine/release/resumeReleaseExecution.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAC;AACpF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACtF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,6CAA6C,CAAC;AAE1F,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAErE,KAAK,cAAc,GAAG,MAAM,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAAC;AACjE,KAAK,aAAa,GAAG,CACnB,IAAI,EAAE,eAAe,EACrB,OAAO,EAAE,oBAAoB,KAC1B,OAAO,CAAC,qBAAqB,CAAC,CAAC;AAEpC,UAAU,wBAAwB;IAChC,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC;IACtC,QAAQ,CAAC,MAAM,EAAE,sBAAsB,CAAC;CACzC;AAED,4FAA4F;AAC5F,wBAAsB,sBAAsB,CAAC,OAAO,EAAE;IACpD,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,wBAAwB,CAAC;IAC5C,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;CAChC,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAgBlC"}
@@ -1,5 +1,6 @@
1
1
  import { createReleasePlan } from '../../domain/release/createReleasePlan';
2
2
  import { executeReleasePlan } from './executeReleasePlan';
3
+ /*** Resume a release from the exact prior engine state required for safe reconciliation. */
3
4
  export async function resumeReleaseExecution(options) {
4
5
  const current = await options.inspect();
5
6
  if (current === null)
@@ -18,6 +19,7 @@ export async function resumeReleaseExecution(options) {
18
19
  mutate: options.mutate,
19
20
  });
20
21
  }
22
+ /*** Detect an unresolved never-retry step from the previous engine result. */
21
23
  function hasUnsafeNeverRetry(previous, currentSteps) {
22
24
  const attempted = previous.result.attemptedStepId;
23
25
  if (attempted === undefined)
@@ -27,6 +29,7 @@ function hasUnsafeNeverRetry(previous, currentSteps) {
27
29
  return false;
28
30
  return currentSteps.some((step) => step.id === attempted);
29
31
  }
32
+ /*** Return a stable blocked reconciliation result without mutation. */
30
33
  function blocked(plan, code) {
31
34
  return {
32
35
  status: 'blocked',
@@ -36,6 +39,7 @@ function blocked(plan, code) {
36
39
  code,
37
40
  };
38
41
  }
42
+ /*** Preserve the previous plan when fresh inspection cannot establish current state. */
39
43
  function inspectionFailed(previous) {
40
44
  return {
41
45
  status: 'failed',
@@ -1 +1 @@
1
- {"version":3,"file":"resumeReleaseExecution.js","sourceRoot":"","sources":["../../../src/engine/release/resumeReleaseExecution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAM3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAS1D,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,OAK5C;IACC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IACxC,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,gBAAgB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAChE,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACzD,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QACnE,OAAO,OAAO,CAAC,IAAI,EAAE,kCAAkC,CAAC,CAAC;IAC3D,CAAC;IACD,IAAI,mBAAmB,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACtD,OAAO,OAAO,CAAC,IAAI,EAAE,4BAA4B,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,kBAAkB,CAAC;QACxB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,IAAI;QACJ,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;AACL,CAAC;AAED,SAAS,mBAAmB,CAC1B,QAAqC,EACrC,YAAwC;IAExC,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,eAAe,CAAC;IAClD,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAC1C,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;IAC/E,IAAI,KAAK,EAAE,KAAK,KAAK,OAAO;QAAE,OAAO,KAAK,CAAC;IAC3C,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,OAAO,CAAC,IAA0C,EAAE,IAAY;IACvE,OAAO;QACL,MAAM,EAAE,SAAS;QACjB,IAAI;QACJ,eAAe,EAAE,IAAI,CAAC,eAAe;QACrC,eAAe,EAAE,EAAE;QACnB,IAAI;KACL,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAqC;IAC7D,OAAO;QACL,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI;QAC1B,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC,eAAe;QAChD,eAAe,EAAE,EAAE;QACnB,IAAI,EAAE,2BAA2B;KAClC,CAAC;AACJ,CAAC","sourcesContent":["import { createReleasePlan } from '../../domain/release/createReleasePlan';\nimport type { ReleaseDesiredState } from '../../domain/release/ReleaseDesiredState';\nimport type { ReleaseObservedState } from '../../domain/release/ReleaseObservedState';\nimport type { ReleasePlanStep } from '../../domain/release/ReleasePlanStep';\nimport type { ReleaseReconcileResult } from '../../domain/release/ReleaseReconcileResult';\nimport type { ProjectReleaseHistoryRecord } from '../../project/releaseHistory/ProjectReleaseHistoryRecord';\nimport { executeReleasePlan } from './executeReleasePlan';\nimport type { ReleaseMutationResult } from './ReleaseMutationResult';\n\ntype InspectRelease = () => Promise<ReleaseObservedState | null>;\ntype MutateRelease = (\n step: ReleasePlanStep,\n current: ReleaseObservedState,\n) => Promise<ReleaseMutationResult>;\n\nexport async function resumeReleaseExecution(options: {\n readonly desired: ReleaseDesiredState;\n readonly previous: ProjectReleaseHistoryRecord;\n readonly inspect: InspectRelease;\n readonly mutate: MutateRelease;\n}): Promise<ReleaseReconcileResult> {\n const current = await options.inspect();\n if (current === null) return inspectionFailed(options.previous);\n const plan = createReleasePlan(options.desired, current);\n if (options.previous.desired.revision !== options.desired.revision) {\n return blocked(plan, 'RELEASE_RESUME_REVISION_MISMATCH');\n }\n if (hasUnsafeNeverRetry(options.previous, plan.steps)) {\n return blocked(plan, 'RELEASE_STEP_NON_RESUMABLE');\n }\n return executeReleasePlan({\n desired: options.desired,\n plan,\n inspect: options.inspect,\n mutate: options.mutate,\n });\n}\n\nfunction hasUnsafeNeverRetry(\n previous: ProjectReleaseHistoryRecord,\n currentSteps: readonly ReleasePlanStep[],\n): boolean {\n const attempted = previous.result.attemptedStepId;\n if (attempted === undefined) return false;\n const prior = previous.result.plan.steps.find((step) => step.id === attempted);\n if (prior?.retry !== 'never') return false;\n return currentSteps.some((step) => step.id === attempted);\n}\n\nfunction blocked(plan: ReturnType<typeof createReleasePlan>, code: string): ReleaseReconcileResult {\n return {\n status: 'blocked',\n plan,\n currentRevision: plan.currentRevision,\n executedStepIds: [],\n code,\n };\n}\n\nfunction inspectionFailed(previous: ProjectReleaseHistoryRecord): ReleaseReconcileResult {\n return {\n status: 'failed',\n plan: previous.result.plan,\n currentRevision: previous.result.currentRevision,\n executedStepIds: [],\n code: 'RELEASE_INSPECTION_FAILED',\n };\n}\n"]}
1
+ {"version":3,"file":"resumeReleaseExecution.js","sourceRoot":"","sources":["../../../src/engine/release/resumeReleaseExecution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAK3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAc1D,4FAA4F;AAC5F,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,OAK5C;IACC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IACxC,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,gBAAgB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAChE,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACzD,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QACnE,OAAO,OAAO,CAAC,IAAI,EAAE,kCAAkC,CAAC,CAAC;IAC3D,CAAC;IACD,IAAI,mBAAmB,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACtD,OAAO,OAAO,CAAC,IAAI,EAAE,4BAA4B,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,kBAAkB,CAAC;QACxB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,IAAI;QACJ,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;AACL,CAAC;AAED,8EAA8E;AAC9E,SAAS,mBAAmB,CAC1B,QAAkC,EAClC,YAAwC;IAExC,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,eAAe,CAAC;IAClD,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAC1C,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;IAC/E,IAAI,KAAK,EAAE,KAAK,KAAK,OAAO;QAAE,OAAO,KAAK,CAAC;IAC3C,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;AAC5D,CAAC;AAED,uEAAuE;AACvE,SAAS,OAAO,CAAC,IAA0C,EAAE,IAAY;IACvE,OAAO;QACL,MAAM,EAAE,SAAS;QACjB,IAAI;QACJ,eAAe,EAAE,IAAI,CAAC,eAAe;QACrC,eAAe,EAAE,EAAE;QACnB,IAAI;KACL,CAAC;AACJ,CAAC;AAED,wFAAwF;AACxF,SAAS,gBAAgB,CAAC,QAAkC;IAC1D,OAAO;QACL,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI;QAC1B,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC,eAAe;QAChD,eAAe,EAAE,EAAE;QACnB,IAAI,EAAE,2BAA2B;KAClC,CAAC;AACJ,CAAC","sourcesContent":["import { createReleasePlan } from '../../domain/release/createReleasePlan';\nimport type { ReleaseDesiredState } from '../../domain/release/ReleaseDesiredState';\nimport type { ReleaseObservedState } from '../../domain/release/ReleaseObservedState';\nimport type { ReleasePlanStep } from '../../domain/release/ReleasePlanStep';\nimport type { ReleaseReconcileResult } from '../../domain/release/ReleaseReconcileResult';\nimport { executeReleasePlan } from './executeReleasePlan';\nimport type { ReleaseMutationResult } from './ReleaseMutationResult';\n\ntype InspectRelease = () => Promise<ReleaseObservedState | null>;\ntype MutateRelease = (\n step: ReleasePlanStep,\n current: ReleaseObservedState,\n) => Promise<ReleaseMutationResult>;\n\ninterface PreviousReleaseExecution {\n readonly desired: ReleaseDesiredState;\n readonly result: ReleaseReconcileResult;\n}\n\n/*** Resume a release from the exact prior engine state required for safe reconciliation. */\nexport async function resumeReleaseExecution(options: {\n readonly desired: ReleaseDesiredState;\n readonly previous: PreviousReleaseExecution;\n readonly inspect: InspectRelease;\n readonly mutate: MutateRelease;\n}): Promise<ReleaseReconcileResult> {\n const current = await options.inspect();\n if (current === null) return inspectionFailed(options.previous);\n const plan = createReleasePlan(options.desired, current);\n if (options.previous.desired.revision !== options.desired.revision) {\n return blocked(plan, 'RELEASE_RESUME_REVISION_MISMATCH');\n }\n if (hasUnsafeNeverRetry(options.previous, plan.steps)) {\n return blocked(plan, 'RELEASE_STEP_NON_RESUMABLE');\n }\n return executeReleasePlan({\n desired: options.desired,\n plan,\n inspect: options.inspect,\n mutate: options.mutate,\n });\n}\n\n/*** Detect an unresolved never-retry step from the previous engine result. */\nfunction hasUnsafeNeverRetry(\n previous: PreviousReleaseExecution,\n currentSteps: readonly ReleasePlanStep[],\n): boolean {\n const attempted = previous.result.attemptedStepId;\n if (attempted === undefined) return false;\n const prior = previous.result.plan.steps.find((step) => step.id === attempted);\n if (prior?.retry !== 'never') return false;\n return currentSteps.some((step) => step.id === attempted);\n}\n\n/*** Return a stable blocked reconciliation result without mutation. */\nfunction blocked(plan: ReturnType<typeof createReleasePlan>, code: string): ReleaseReconcileResult {\n return {\n status: 'blocked',\n plan,\n currentRevision: plan.currentRevision,\n executedStepIds: [],\n code,\n };\n}\n\n/*** Preserve the previous plan when fresh inspection cannot establish current state. */\nfunction inspectionFailed(previous: PreviousReleaseExecution): ReleaseReconcileResult {\n return {\n status: 'failed',\n plan: previous.result.plan,\n currentRevision: previous.result.currentRevision,\n executedStepIds: [],\n code: 'RELEASE_INSPECTION_FAILED',\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"fromDeployReleaseAuthoringValue.d.ts","sourceRoot":"","sources":["../../../../../src/features/authoring/application/use-cases/fromDeployReleaseAuthoringValue.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iDAAiD,CAAC;AAC3F,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,mCAAmC,CAAC;AAGrF,2GAA2G;AAC3G,wBAAgB,+BAA+B,CAC7C,KAAK,EAAE,2BAA2B,GACjC,mBAAmB,CASrB"}
1
+ {"version":3,"file":"fromDeployReleaseAuthoringValue.d.ts","sourceRoot":"","sources":["../../../../../src/features/authoring/application/use-cases/fromDeployReleaseAuthoringValue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iDAAiD,CAAC;AAE3F,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,mCAAmC,CAAC;AAGrF,2GAA2G;AAC3G,wBAAgB,+BAA+B,CAC7C,KAAK,EAAE,2BAA2B,GACjC,mBAAmB,CASrB"}
@@ -1,4 +1,4 @@
1
- import { parseProjectRelease } from '../../../../project/release/parseProjectRelease';
1
+ import { parseProjectRelease } from '../../../../project/releaseInput/parseProjectRelease';
2
2
  import { readDeployAuthoringRegistryValues } from '../../utils/readDeployAuthoringRegistryValues';
3
3
  /*** Convert authored set/registry values back through Deploy's canonical release parser and validation. */
4
4
  export function fromDeployReleaseAuthoringValue(value) {
@@ -1 +1 @@
1
- {"version":3,"file":"fromDeployReleaseAuthoringValue.js","sourceRoot":"","sources":["../../../../../src/features/authoring/application/use-cases/fromDeployReleaseAuthoringValue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,iDAAiD,CAAC;AAGtF,OAAO,EAAE,iCAAiC,EAAE,MAAM,+CAA+C,CAAC;AAElG,2GAA2G;AAC3G,MAAM,UAAU,+BAA+B,CAC7C,KAAkC;IAElC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,iCAAiC,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpF,OAAO,mBAAmB,CAAC;QACzB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,OAAO;QACP,KAAK;QACL,OAAO,EAAE,KAAK,CAAC,OAAO;KACvB,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { parseProjectRelease } from '../../../../project/release/parseProjectRelease';\nimport type { ProjectReleaseInput } from '../../../../project/release/ProjectReleaseInput';\nimport type { DeployReleaseAuthoringValue } from '../../../../types/deployAuthoring';\nimport { readDeployAuthoringRegistryValues } from '../../utils/readDeployAuthoringRegistryValues';\n\n/*** Convert authored set/registry values back through Deploy's canonical release parser and validation. */\nexport function fromDeployReleaseAuthoringValue(\n value: DeployReleaseAuthoringValue,\n): ProjectReleaseInput {\n const targets = Object.keys(value.targets);\n const notes = readDeployAuthoringRegistryValues(value.notes, (note) => note.locale);\n return parseProjectRelease({\n version: value.version,\n targets,\n notes,\n rollout: value.rollout,\n });\n}\n"]}
1
+ {"version":3,"file":"fromDeployReleaseAuthoringValue.js","sourceRoot":"","sources":["../../../../../src/features/authoring/application/use-cases/fromDeployReleaseAuthoringValue.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,sDAAsD,CAAC;AAE3F,OAAO,EAAE,iCAAiC,EAAE,MAAM,+CAA+C,CAAC;AAElG,2GAA2G;AAC3G,MAAM,UAAU,+BAA+B,CAC7C,KAAkC;IAElC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,iCAAiC,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpF,OAAO,mBAAmB,CAAC;QACzB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,OAAO;QACP,KAAK;QACL,OAAO,EAAE,KAAK,CAAC,OAAO;KACvB,CAAC,CAAC;AACL,CAAC","sourcesContent":["import type { ProjectReleaseInput } from '../../../../project/release/ProjectReleaseInput';\nimport { parseProjectRelease } from '../../../../project/releaseInput/parseProjectRelease';\nimport type { DeployReleaseAuthoringValue } from '../../../../types/deployAuthoring';\nimport { readDeployAuthoringRegistryValues } from '../../utils/readDeployAuthoringRegistryValues';\n\n/*** Convert authored set/registry values back through Deploy's canonical release parser and validation. */\nexport function fromDeployReleaseAuthoringValue(\n value: DeployReleaseAuthoringValue,\n): ProjectReleaseInput {\n const targets = Object.keys(value.targets);\n const notes = readDeployAuthoringRegistryValues(value.notes, (note) => note.locale);\n return parseProjectRelease({\n version: value.version,\n targets,\n notes,\n rollout: value.rollout,\n });\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"toDeployReleaseAuthoringValue.d.ts","sourceRoot":"","sources":["../../../../../src/features/authoring/application/use-cases/toDeployReleaseAuthoringValue.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iDAAiD,CAAC;AAC3F,OAAO,KAAK,EAEV,2BAA2B,EAC5B,MAAM,mCAAmC,CAAC;AAG3C,2GAA2G;AAC3G,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,mBAAmB,GAC3B,2BAA2B,CAU7B"}
1
+ {"version":3,"file":"toDeployReleaseAuthoringValue.d.ts","sourceRoot":"","sources":["../../../../../src/features/authoring/application/use-cases/toDeployReleaseAuthoringValue.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iDAAiD,CAAC;AAE3F,OAAO,KAAK,EAEV,2BAA2B,EAC5B,MAAM,mCAAmC,CAAC;AAG3C,2GAA2G;AAC3G,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,mBAAmB,GAC3B,2BAA2B,CAU7B"}
@@ -1,4 +1,4 @@
1
- import { parseProjectRelease } from '../../../../project/release/parseProjectRelease';
1
+ import { parseProjectRelease } from '../../../../project/releaseInput/parseProjectRelease';
2
2
  import { createDeployAuthoringRegistry } from '../../utils/createDeployAuthoringRegistry';
3
3
  /*** Project canonical release input into set membership and stable release-note identity for authoring. */
4
4
  export function toDeployReleaseAuthoringValue(release) {
@@ -1 +1 @@
1
- {"version":3,"file":"toDeployReleaseAuthoringValue.js","sourceRoot":"","sources":["../../../../../src/features/authoring/application/use-cases/toDeployReleaseAuthoringValue.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,iDAAiD,CAAC;AAMtF,OAAO,EAAE,6BAA6B,EAAE,MAAM,2CAA2C,CAAC;AAE1F,2GAA2G;AAC3G,MAAM,UAAU,6BAA6B,CAC3C,OAA4B;IAE5B,MAAM,SAAS,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC/C,OAAO;QACL,OAAO,EAAE,SAAS,CAAC,OAAO;QAC1B,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,CAAU,CAAC,CAAC;QACvF,KAAK,EAAE,6BAA6B,CAClC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAU,CAAC,CAC5D;QACD,OAAO,EAAE,kBAAkB,CAAC,SAAS,CAAC,OAAO,CAAC;KAC/C,CAAC;AACJ,CAAC;AAED,qGAAqG;AACrG,SAAS,kBAAkB,CAAC,OAAuB;IACjD,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAC5B,MAAM,gBAAgB,GACpB,OAAO,EAAE,IAAI,KAAK,QAAQ;QACxB,CAAC,CAAC,oBAAoB,CAAC,OAAO,CAAC,eAAe,CAAC;QAC/C,CAAC,CAAC,OAAO,KAAK,SAAS;YACrB,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,EAAE,IAAI,EAAE,WAAoB,EAAE,CAAC;IAEvC,OAAO;QACL,GAAG,CAAC,OAAO,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,WAAoB,EAAE,EAAE,CAAC;QAC7E,GAAG,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC;QACxE,GAAG,CAAC,OAAO,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;KAC1E,CAAC;AACJ,CAAC;AAED,gGAAgG;AAChG,SAAS,oBAAoB,CAC3B,eAAmC;IAEnC,IAAI,eAAe,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACrF,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC;AAC7C,CAAC","sourcesContent":["import type { ReleaseRollout } from '../../../../domain/release/ReleaseRollout';\nimport { parseProjectRelease } from '../../../../project/release/parseProjectRelease';\nimport type { ProjectReleaseInput } from '../../../../project/release/ProjectReleaseInput';\nimport type {\n DeployReleaseAuthoringRollout,\n DeployReleaseAuthoringValue,\n} from '../../../../types/deployAuthoring';\nimport { createDeployAuthoringRegistry } from '../../utils/createDeployAuthoringRegistry';\n\n/*** Project canonical release input into set membership and stable release-note identity for authoring. */\nexport function toDeployReleaseAuthoringValue(\n release: ProjectReleaseInput,\n): DeployReleaseAuthoringValue {\n const canonical = parseProjectRelease(release);\n return {\n version: canonical.version,\n targets: Object.fromEntries(canonical.targets.map((target) => [target, true] as const)),\n notes: createDeployAuthoringRegistry(\n canonical.notes.map((note) => [note.locale, note] as const),\n ),\n rollout: toAuthoringRollout(canonical.rollout),\n };\n}\n\n/*** Project parser-validated per-target rollout constraints into the narrower authoring contract. */\nfunction toAuthoringRollout(rollout: ReleaseRollout): DeployReleaseAuthoringRollout {\n const { android } = rollout;\n const androidAuthoring =\n android?.mode === 'staged'\n ? stagedAndroidRollout(android.initialFraction)\n : android === undefined\n ? undefined\n : { mode: 'immediate' as const };\n\n return {\n ...(rollout.web === undefined ? {} : { web: { mode: 'immediate' as const } }),\n ...(androidAuthoring === undefined ? {} : { android: androidAuthoring }),\n ...(rollout.ios === undefined ? {} : { ios: { mode: rollout.ios.mode } }),\n };\n}\n\n/*** Require the initial fraction guaranteed by canonical parsing for staged Android rollout. */\nfunction stagedAndroidRollout(\n initialFraction: string | undefined,\n): Extract<NonNullable<DeployReleaseAuthoringRollout['android']>, { readonly mode: 'staged' }> {\n if (initialFraction === undefined) throw new Error('DEPLOY_AUTHORING_VALUE_INVALID');\n return { mode: 'staged', initialFraction };\n}\n"]}
1
+ {"version":3,"file":"toDeployReleaseAuthoringValue.js","sourceRoot":"","sources":["../../../../../src/features/authoring/application/use-cases/toDeployReleaseAuthoringValue.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,sDAAsD,CAAC;AAK3F,OAAO,EAAE,6BAA6B,EAAE,MAAM,2CAA2C,CAAC;AAE1F,2GAA2G;AAC3G,MAAM,UAAU,6BAA6B,CAC3C,OAA4B;IAE5B,MAAM,SAAS,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC/C,OAAO;QACL,OAAO,EAAE,SAAS,CAAC,OAAO;QAC1B,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,CAAU,CAAC,CAAC;QACvF,KAAK,EAAE,6BAA6B,CAClC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAU,CAAC,CAC5D;QACD,OAAO,EAAE,kBAAkB,CAAC,SAAS,CAAC,OAAO,CAAC;KAC/C,CAAC;AACJ,CAAC;AAED,qGAAqG;AACrG,SAAS,kBAAkB,CAAC,OAAuB;IACjD,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAC5B,MAAM,gBAAgB,GACpB,OAAO,EAAE,IAAI,KAAK,QAAQ;QACxB,CAAC,CAAC,oBAAoB,CAAC,OAAO,CAAC,eAAe,CAAC;QAC/C,CAAC,CAAC,OAAO,KAAK,SAAS;YACrB,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,EAAE,IAAI,EAAE,WAAoB,EAAE,CAAC;IAEvC,OAAO;QACL,GAAG,CAAC,OAAO,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,WAAoB,EAAE,EAAE,CAAC;QAC7E,GAAG,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC;QACxE,GAAG,CAAC,OAAO,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;KAC1E,CAAC;AACJ,CAAC;AAED,gGAAgG;AAChG,SAAS,oBAAoB,CAC3B,eAAmC;IAEnC,IAAI,eAAe,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACrF,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC;AAC7C,CAAC","sourcesContent":["import type { ReleaseRollout } from '../../../../domain/release/ReleaseRollout';\nimport type { ProjectReleaseInput } from '../../../../project/release/ProjectReleaseInput';\nimport { parseProjectRelease } from '../../../../project/releaseInput/parseProjectRelease';\nimport type {\n DeployReleaseAuthoringRollout,\n DeployReleaseAuthoringValue,\n} from '../../../../types/deployAuthoring';\nimport { createDeployAuthoringRegistry } from '../../utils/createDeployAuthoringRegistry';\n\n/*** Project canonical release input into set membership and stable release-note identity for authoring. */\nexport function toDeployReleaseAuthoringValue(\n release: ProjectReleaseInput,\n): DeployReleaseAuthoringValue {\n const canonical = parseProjectRelease(release);\n return {\n version: canonical.version,\n targets: Object.fromEntries(canonical.targets.map((target) => [target, true] as const)),\n notes: createDeployAuthoringRegistry(\n canonical.notes.map((note) => [note.locale, note] as const),\n ),\n rollout: toAuthoringRollout(canonical.rollout),\n };\n}\n\n/*** Project parser-validated per-target rollout constraints into the narrower authoring contract. */\nfunction toAuthoringRollout(rollout: ReleaseRollout): DeployReleaseAuthoringRollout {\n const { android } = rollout;\n const androidAuthoring =\n android?.mode === 'staged'\n ? stagedAndroidRollout(android.initialFraction)\n : android === undefined\n ? undefined\n : { mode: 'immediate' as const };\n\n return {\n ...(rollout.web === undefined ? {} : { web: { mode: 'immediate' as const } }),\n ...(androidAuthoring === undefined ? {} : { android: androidAuthoring }),\n ...(rollout.ios === undefined ? {} : { ios: { mode: rollout.ios.mode } }),\n };\n}\n\n/*** Require the initial fraction guaranteed by canonical parsing for staged Android rollout. */\nfunction stagedAndroidRollout(\n initialFraction: string | undefined,\n): Extract<NonNullable<DeployReleaseAuthoringRollout['android']>, { readonly mode: 'staged' }> {\n if (initialFraction === undefined) throw new Error('DEPLOY_AUTHORING_VALUE_INVALID');\n return { mode: 'staged', initialFraction };\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { listProjectDeploymentHistory } from '../history/listProjectDeploymentHistory';
1
+ import { listProjectDeploymentHistory } from '../listProjectDeploymentHistory';
2
2
  export async function readCurrentProjectAndroidDeployment(options) {
3
3
  const history = await listProjectDeploymentHistory({ projectRoot: options.projectRoot });
4
4
  const evidence = history
@@ -1 +1 @@
1
- {"version":3,"file":"readCurrentProjectAndroidDeployment.js","sourceRoot":"","sources":["../../../src/project/android/readCurrentProjectAndroidDeployment.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AppDeployProviderSelection } from '@ankhorage/contracts/deploy';\nimport type { AndroidPublishInspection } from '@ankhorage/contracts/deploy-provider';\n\nimport type {\n DeploymentCurrentState,\n DeploymentObservedAndroidTarget,\n} from '../../domain/DeploymentCurrentState';\nimport type { ProjectDeploymentHistoryRecord } from '../history/ProjectDeploymentHistoryRecord';\nimport { listProjectDeploymentHistory } from '../history/listProjectDeploymentHistory';\n\ninterface AndroidHistoryEvidence {\n readonly revision: string;\n readonly versionCode: number;\n readonly packageName: string;\n readonly recordedAt: string;\n}\n\nexport async function readCurrentProjectAndroidDeployment(options: {\n readonly projectRoot: string;\n readonly packageName?: string;\n readonly providers?: AppDeployProviderSelection;\n readonly publishInspection?: AndroidPublishInspection | null;\n}): Promise<DeploymentCurrentState> {\n const history = await listProjectDeploymentHistory({ projectRoot: options.projectRoot });\n const evidence = history\n .map(parseEvidence)\n .filter((item): item is AndroidHistoryEvidence => item !== null)\n .filter((item) => matchesRequestedPackage(item, options.packageName))\n .filter((item) => matchesRemotePublication(item, options.publishInspection))\n .sort((left, right) => right.recordedAt.localeCompare(left.recordedAt))[0];\n return evidence === undefined\n ? { targets: {} }\n : { targets: { android: observed(evidence, options.providers) } };\n}\n\nfunction parseEvidence(record: ProjectDeploymentHistoryRecord): AndroidHistoryEvidence | 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 versionCode = Number(match[1]);\n const revision = match[2];\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 { revision, versionCode, packageName: desired.package, recordedAt: record.recordedAt };\n}\n\nfunction matchesRequestedPackage(item: AndroidHistoryEvidence, packageName: string | undefined) {\n return packageName === undefined || item.packageName === packageName;\n}\n\nfunction matchesRemotePublication(\n item: AndroidHistoryEvidence,\n inspection: AndroidPublishInspection | null | undefined,\n) {\n if (inspection === undefined) return true;\n if (inspection === null) return false;\n return inspection.activeVersionCodes.includes(item.versionCode);\n}\n\nfunction observed(\n item: AndroidHistoryEvidence,\n providers: AppDeployProviderSelection | undefined,\n): DeploymentObservedAndroidTarget {\n return {\n package: item.packageName,\n ...(providers === undefined ? {} : { providers }),\n revision: item.revision,\n };\n}\n"]}
1
+ {"version":3,"file":"readCurrentProjectAndroidDeployment.js","sourceRoot":"","sources":["../../../src/project/android/readCurrentProjectAndroidDeployment.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AppDeployProviderSelection } from '@ankhorage/contracts/deploy';\nimport type { AndroidPublishInspection } from '@ankhorage/contracts/deploy-provider';\n\nimport type {\n DeploymentCurrentState,\n DeploymentObservedAndroidTarget,\n} from '../../domain/DeploymentCurrentState';\nimport type { ProjectDeploymentHistoryRecord } from '../history/ProjectDeploymentHistoryRecord';\nimport { listProjectDeploymentHistory } from '../listProjectDeploymentHistory';\n\ninterface AndroidHistoryEvidence {\n readonly revision: string;\n readonly versionCode: number;\n readonly packageName: string;\n readonly recordedAt: string;\n}\n\nexport async function readCurrentProjectAndroidDeployment(options: {\n readonly projectRoot: string;\n readonly packageName?: string;\n readonly providers?: AppDeployProviderSelection;\n readonly publishInspection?: AndroidPublishInspection | null;\n}): Promise<DeploymentCurrentState> {\n const history = await listProjectDeploymentHistory({ projectRoot: options.projectRoot });\n const evidence = history\n .map(parseEvidence)\n .filter((item): item is AndroidHistoryEvidence => item !== null)\n .filter((item) => matchesRequestedPackage(item, options.packageName))\n .filter((item) => matchesRemotePublication(item, options.publishInspection))\n .sort((left, right) => right.recordedAt.localeCompare(left.recordedAt))[0];\n return evidence === undefined\n ? { targets: {} }\n : { targets: { android: observed(evidence, options.providers) } };\n}\n\nfunction parseEvidence(record: ProjectDeploymentHistoryRecord): AndroidHistoryEvidence | 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 versionCode = Number(match[1]);\n const revision = match[2];\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 { revision, versionCode, packageName: desired.package, recordedAt: record.recordedAt };\n}\n\nfunction matchesRequestedPackage(item: AndroidHistoryEvidence, packageName: string | undefined) {\n return packageName === undefined || item.packageName === packageName;\n}\n\nfunction matchesRemotePublication(\n item: AndroidHistoryEvidence,\n inspection: AndroidPublishInspection | null | undefined,\n) {\n if (inspection === undefined) return true;\n if (inspection === null) return false;\n return inspection.activeVersionCodes.includes(item.versionCode);\n}\n\nfunction observed(\n item: AndroidHistoryEvidence,\n providers: AppDeployProviderSelection | undefined,\n): DeploymentObservedAndroidTarget {\n return {\n package: item.packageName,\n ...(providers === undefined ? {} : { providers }),\n revision: item.revision,\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 recordProjectAndroidDeployment(options) {
4
4
  const revision = options.inspection.desiredRevision;
5
5
  if (revision === undefined)
@@ -1 +1 @@
1
- {"version":3,"file":"recordProjectAndroidDeployment.js","sourceRoot":"","sources":["../../../src/project/android/recordProjectAndroidDeployment.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,yCAAyC,EAAE,MAAM,iCAAiC,CAAC;AAC5F,OAAO,EAAE,8BAA8B,EAAE,MAAM,2CAA2C,CAAC;AAM3F,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAAC,OAOpD;IACC,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC;IACpD,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,cAAc,CAAC,kCAAkC,CAAC,CAAC;IACtF,IAAI,CAAC;QACH,MAAM,8BAA8B,CAAC;YACnC,WAAW,EAAE,OAAO,CAAC,UAAU,CAAC,WAAW;YAC3C,MAAM,EAAE;gBACN,aAAa,EAAE,yCAAyC;gBACxD,YAAY,EAAE,WAAW,OAAO,CAAC,WAAW,CAAC,WAAW,IAAI,QAAQ,EAAE;gBACtE,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,+BAA+B,CAAC,CAAC;IACzD,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,OAAO;QACL,QAAQ,EAAE,KAAK;QACf,OAAO,EAAE;YACP,IAAI;YACJ,OAAO,EAAE,mDAAmD;YAC5D,MAAM,EAAE,SAAS;SAClB;KACF,CAAC;AACJ,CAAC","sourcesContent":["import type { AndroidDeploymentPublication } from '@ankhorage/contracts/deploy-provider';\n\nimport type { DeploymentExecutionResult } from '../../domain/DeploymentExecutionResult';\nimport type { DeploymentFailure } from '../../domain/DeploymentFailure';\nimport type { DeploymentPlan } from '../../domain/DeploymentPlan';\nimport type { DeploymentVerificationResult } from '../../domain/DeploymentVerificationResult';\nimport { PROJECT_DEPLOYMENT_HISTORY_SCHEMA_VERSION } from '../history/historySchemaVersion';\nimport { recordProjectDeploymentHistory } from '../history/recordProjectDeploymentHistory';\nimport type { ProjectAndroidDeploymentInspection } from './ProjectAndroidDeploymentInspection';\n\nexport type RecordProjectAndroidHistoryResult =\n { readonly recorded: true } | { readonly recorded: false; readonly failure: DeploymentFailure };\n\nexport async function recordProjectAndroidDeployment(options: {\n readonly inspection: ProjectAndroidDeploymentInspection;\n readonly publication: AndroidDeploymentPublication;\n readonly plan: DeploymentPlan;\n readonly execution: DeploymentExecutionResult;\n readonly verification: DeploymentVerificationResult;\n readonly recordedAt: string;\n}): Promise<RecordProjectAndroidHistoryResult> {\n const revision = options.inspection.desiredRevision;\n if (revision === undefined) return historyFailure('ANDROID_HISTORY_REVISION_MISSING');\n try {\n await recordProjectDeploymentHistory({\n projectRoot: options.inspection.projectRoot,\n record: {\n schemaVersion: PROJECT_DEPLOYMENT_HISTORY_SCHEMA_VERSION,\n deploymentId: `android-${options.publication.versionCode}-${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('ANDROID_HISTORY_RECORD_FAILED');\n }\n}\n\nfunction historyFailure(code: string): RecordProjectAndroidHistoryResult {\n return {\n recorded: false,\n failure: {\n code,\n message: 'Android deployment history could not be recorded.',\n target: 'android',\n },\n };\n}\n"]}
1
+ {"version":3,"file":"recordProjectAndroidDeployment.js","sourceRoot":"","sources":["../../../src/project/android/recordProjectAndroidDeployment.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,yCAAyC,EAAE,MAAM,iCAAiC,CAAC;AAC5F,OAAO,EAAE,8BAA8B,EAAE,MAAM,mCAAmC,CAAC;AAMnF,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAAC,OAOpD;IACC,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC;IACpD,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,cAAc,CAAC,kCAAkC,CAAC,CAAC;IACtF,IAAI,CAAC;QACH,MAAM,8BAA8B,CAAC;YACnC,WAAW,EAAE,OAAO,CAAC,UAAU,CAAC,WAAW;YAC3C,MAAM,EAAE;gBACN,aAAa,EAAE,yCAAyC;gBACxD,YAAY,EAAE,WAAW,OAAO,CAAC,WAAW,CAAC,WAAW,IAAI,QAAQ,EAAE;gBACtE,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,+BAA+B,CAAC,CAAC;IACzD,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,OAAO;QACL,QAAQ,EAAE,KAAK;QACf,OAAO,EAAE;YACP,IAAI;YACJ,OAAO,EAAE,mDAAmD;YAC5D,MAAM,EAAE,SAAS;SAClB;KACF,CAAC;AACJ,CAAC","sourcesContent":["import type { AndroidDeploymentPublication } from '@ankhorage/contracts/deploy-provider';\n\nimport type { DeploymentExecutionResult } from '../../domain/DeploymentExecutionResult';\nimport type { DeploymentFailure } from '../../domain/DeploymentFailure';\nimport type { DeploymentPlan } from '../../domain/DeploymentPlan';\nimport type { DeploymentVerificationResult } from '../../domain/DeploymentVerificationResult';\nimport { PROJECT_DEPLOYMENT_HISTORY_SCHEMA_VERSION } from '../history/historySchemaVersion';\nimport { recordProjectDeploymentHistory } from '../recordProjectDeploymentHistory';\nimport type { ProjectAndroidDeploymentInspection } from './ProjectAndroidDeploymentInspection';\n\nexport type RecordProjectAndroidHistoryResult =\n { readonly recorded: true } | { readonly recorded: false; readonly failure: DeploymentFailure };\n\nexport async function recordProjectAndroidDeployment(options: {\n readonly inspection: ProjectAndroidDeploymentInspection;\n readonly publication: AndroidDeploymentPublication;\n readonly plan: DeploymentPlan;\n readonly execution: DeploymentExecutionResult;\n readonly verification: DeploymentVerificationResult;\n readonly recordedAt: string;\n}): Promise<RecordProjectAndroidHistoryResult> {\n const revision = options.inspection.desiredRevision;\n if (revision === undefined) return historyFailure('ANDROID_HISTORY_REVISION_MISSING');\n try {\n await recordProjectDeploymentHistory({\n projectRoot: options.inspection.projectRoot,\n record: {\n schemaVersion: PROJECT_DEPLOYMENT_HISTORY_SCHEMA_VERSION,\n deploymentId: `android-${options.publication.versionCode}-${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('ANDROID_HISTORY_RECORD_FAILED');\n }\n}\n\nfunction historyFailure(code: string): RecordProjectAndroidHistoryResult {\n return {\n recorded: false,\n failure: {\n code,\n message: 'Android deployment history could not be recorded.',\n target: 'android',\n },\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"parseProjectDeploymentHistoryRecord.d.ts","sourceRoot":"","sources":["../../../src/project/history/parseProjectDeploymentHistoryRecord.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,kCAAkC,CAAC;AAgBvF,wBAAgB,mCAAmC,CACjD,KAAK,EAAE,OAAO,GACb,8BAA8B,CAUhC"}
1
+ {"version":3,"file":"parseProjectDeploymentHistoryRecord.d.ts","sourceRoot":"","sources":["../../../src/project/history/parseProjectDeploymentHistoryRecord.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,kCAAkC,CAAC;AAiBvF,wBAAgB,mCAAmC,CACjD,KAAK,EAAE,OAAO,GACb,8BAA8B,CAUhC"}
@@ -1,11 +1,9 @@
1
1
  import { isAppDeployManifest } from '@ankhorage/contracts/deploy';
2
- import { isSafeSegment } from '../io/assertSafeSegment';
3
- import { hasOnlyKeys } from '../io/hasOnlyKeys';
4
- import { isRecord } from '../io/isRecord';
5
2
  import { PROJECT_DEPLOYMENT_HISTORY_SCHEMA_VERSION } from './historySchemaVersion';
6
3
  import { isDeploymentExecution } from './validation/execution';
7
4
  import { isIsoTimestamp } from './validation/isIsoTimestamp';
8
5
  import { isDeploymentPlan } from './validation/plan';
6
+ import { hasOnlyKeys, isRecord } from './validation/shared';
9
7
  import { isDeploymentVerification } from './validation/verification';
10
8
  const HISTORY_KEYS = new Set([
11
9
  'schemaVersion',
@@ -37,4 +35,12 @@ function isHistoryRecord(value) {
37
35
  isDeploymentExecution(value.execution) &&
38
36
  (value.verification === undefined || isDeploymentVerification(value.verification)));
39
37
  }
38
+ /*** Recognize one safe deployment-history path segment without consulting project I/O. */
39
+ function isSafeSegment(value) {
40
+ return (value.trim().length > 0 &&
41
+ value !== '.' &&
42
+ value !== '..' &&
43
+ !value.includes('/') &&
44
+ !value.includes('\\'));
45
+ }
40
46
  //# sourceMappingURL=parseProjectDeploymentHistoryRecord.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"parseProjectDeploymentHistoryRecord.js","sourceRoot":"","sources":["../../../src/project/history/parseProjectDeploymentHistoryRecord.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAElE,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,yCAAyC,EAAE,MAAM,wBAAwB,CAAC;AAEnF,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAErE,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC;IAC3B,eAAe;IACf,cAAc;IACd,YAAY;IACZ,SAAS;IACT,MAAM;IACN,WAAW;IACX,cAAc;CACf,CAAC,CAAC;AAEH,MAAM,UAAU,mCAAmC,CACjD,KAAc;IAEd,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,aAAa,KAAK,yCAAyC,EAAE,CAAC;QACzF,MAAM,IAAI,KAAK,CACb,kDAAkD,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAChF,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,OAAO,CACL,QAAQ,CAAC,KAAK,CAAC;QACf,WAAW,CAAC,KAAK,EAAE,YAAY,CAAC;QAChC,KAAK,CAAC,aAAa,KAAK,yCAAyC;QACjE,OAAO,KAAK,CAAC,YAAY,KAAK,QAAQ;QACtC,aAAa,CAAC,KAAK,CAAC,YAAY,CAAC;QACjC,cAAc,CAAC,KAAK,CAAC,UAAU,CAAC;QAChC,CAAC,KAAK,CAAC,OAAO,KAAK,IAAI,IAAI,mBAAmB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC9D,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC;QAC5B,qBAAqB,CAAC,KAAK,CAAC,SAAS,CAAC;QACtC,CAAC,KAAK,CAAC,YAAY,KAAK,SAAS,IAAI,wBAAwB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CACnF,CAAC;AACJ,CAAC","sourcesContent":["import { isAppDeployManifest } from '@ankhorage/contracts/deploy';\n\nimport { isSafeSegment } from '../io/assertSafeSegment';\nimport { hasOnlyKeys } from '../io/hasOnlyKeys';\nimport { isRecord } from '../io/isRecord';\nimport { PROJECT_DEPLOYMENT_HISTORY_SCHEMA_VERSION } from './historySchemaVersion';\nimport type { ProjectDeploymentHistoryRecord } from './ProjectDeploymentHistoryRecord';\nimport { isDeploymentExecution } from './validation/execution';\nimport { isIsoTimestamp } from './validation/isIsoTimestamp';\nimport { isDeploymentPlan } from './validation/plan';\nimport { isDeploymentVerification } from './validation/verification';\n\nconst HISTORY_KEYS = new Set([\n 'schemaVersion',\n 'deploymentId',\n 'recordedAt',\n 'desired',\n 'plan',\n 'execution',\n 'verification',\n]);\n\nexport function parseProjectDeploymentHistoryRecord(\n value: unknown,\n): ProjectDeploymentHistoryRecord {\n if (isRecord(value) && value.schemaVersion !== PROJECT_DEPLOYMENT_HISTORY_SCHEMA_VERSION) {\n throw new Error(\n `Unsupported deployment history schema version: ${String(value.schemaVersion)}`,\n );\n }\n if (!isHistoryRecord(value)) {\n throw new Error('Deployment history record has an invalid canonical shape.');\n }\n return value;\n}\n\nfunction isHistoryRecord(value: unknown): value is ProjectDeploymentHistoryRecord {\n return (\n isRecord(value) &&\n hasOnlyKeys(value, HISTORY_KEYS) &&\n value.schemaVersion === PROJECT_DEPLOYMENT_HISTORY_SCHEMA_VERSION &&\n typeof value.deploymentId === 'string' &&\n isSafeSegment(value.deploymentId) &&\n isIsoTimestamp(value.recordedAt) &&\n (value.desired === null || isAppDeployManifest(value.desired)) &&\n isDeploymentPlan(value.plan) &&\n isDeploymentExecution(value.execution) &&\n (value.verification === undefined || isDeploymentVerification(value.verification))\n );\n}\n"]}
1
+ {"version":3,"file":"parseProjectDeploymentHistoryRecord.js","sourceRoot":"","sources":["../../../src/project/history/parseProjectDeploymentHistoryRecord.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAElE,OAAO,EAAE,yCAAyC,EAAE,MAAM,wBAAwB,CAAC;AAEnF,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAErE,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC;IAC3B,eAAe;IACf,cAAc;IACd,YAAY;IACZ,SAAS;IACT,MAAM;IACN,WAAW;IACX,cAAc;CACf,CAAC,CAAC;AAEH,MAAM,UAAU,mCAAmC,CACjD,KAAc;IAEd,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,aAAa,KAAK,yCAAyC,EAAE,CAAC;QACzF,MAAM,IAAI,KAAK,CACb,kDAAkD,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAChF,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,OAAO,CACL,QAAQ,CAAC,KAAK,CAAC;QACf,WAAW,CAAC,KAAK,EAAE,YAAY,CAAC;QAChC,KAAK,CAAC,aAAa,KAAK,yCAAyC;QACjE,OAAO,KAAK,CAAC,YAAY,KAAK,QAAQ;QACtC,aAAa,CAAC,KAAK,CAAC,YAAY,CAAC;QACjC,cAAc,CAAC,KAAK,CAAC,UAAU,CAAC;QAChC,CAAC,KAAK,CAAC,OAAO,KAAK,IAAI,IAAI,mBAAmB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC9D,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC;QAC5B,qBAAqB,CAAC,KAAK,CAAC,SAAS,CAAC;QACtC,CAAC,KAAK,CAAC,YAAY,KAAK,SAAS,IAAI,wBAAwB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CACnF,CAAC;AACJ,CAAC;AAED,0FAA0F;AAC1F,SAAS,aAAa,CAAC,KAAa;IAClC,OAAO,CACL,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;QACvB,KAAK,KAAK,GAAG;QACb,KAAK,KAAK,IAAI;QACd,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;QACpB,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CACtB,CAAC;AACJ,CAAC","sourcesContent":["import { isAppDeployManifest } from '@ankhorage/contracts/deploy';\n\nimport { PROJECT_DEPLOYMENT_HISTORY_SCHEMA_VERSION } from './historySchemaVersion';\nimport type { ProjectDeploymentHistoryRecord } from './ProjectDeploymentHistoryRecord';\nimport { isDeploymentExecution } from './validation/execution';\nimport { isIsoTimestamp } from './validation/isIsoTimestamp';\nimport { isDeploymentPlan } from './validation/plan';\nimport { hasOnlyKeys, isRecord } from './validation/shared';\nimport { isDeploymentVerification } from './validation/verification';\n\nconst HISTORY_KEYS = new Set([\n 'schemaVersion',\n 'deploymentId',\n 'recordedAt',\n 'desired',\n 'plan',\n 'execution',\n 'verification',\n]);\n\nexport function parseProjectDeploymentHistoryRecord(\n value: unknown,\n): ProjectDeploymentHistoryRecord {\n if (isRecord(value) && value.schemaVersion !== PROJECT_DEPLOYMENT_HISTORY_SCHEMA_VERSION) {\n throw new Error(\n `Unsupported deployment history schema version: ${String(value.schemaVersion)}`,\n );\n }\n if (!isHistoryRecord(value)) {\n throw new Error('Deployment history record has an invalid canonical shape.');\n }\n return value;\n}\n\nfunction isHistoryRecord(value: unknown): value is ProjectDeploymentHistoryRecord {\n return (\n isRecord(value) &&\n hasOnlyKeys(value, HISTORY_KEYS) &&\n value.schemaVersion === PROJECT_DEPLOYMENT_HISTORY_SCHEMA_VERSION &&\n typeof value.deploymentId === 'string' &&\n isSafeSegment(value.deploymentId) &&\n isIsoTimestamp(value.recordedAt) &&\n (value.desired === null || isAppDeployManifest(value.desired)) &&\n isDeploymentPlan(value.plan) &&\n isDeploymentExecution(value.execution) &&\n (value.verification === undefined || isDeploymentVerification(value.verification))\n );\n}\n\n/*** Recognize one safe deployment-history path segment without consulting project I/O. */\nfunction isSafeSegment(value: string): boolean {\n return (\n value.trim().length > 0 &&\n value !== '.' &&\n value !== '..' &&\n !value.includes('/') &&\n !value.includes('\\\\')\n );\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"diagnostic.d.ts","sourceRoot":"","sources":["../../../../src/project/history/validation/diagnostic.ts"],"names":[],"mappings":"AAOA,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CASxD"}
1
+ {"version":3,"file":"diagnostic.d.ts","sourceRoot":"","sources":["../../../../src/project/history/validation/diagnostic.ts"],"names":[],"mappings":"AAKA,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CASxD"}
@@ -1,7 +1,5 @@
1
1
  import { DEPLOYMENT_PLAN_DIAGNOSTIC_CODES } from '../../../domain/DeploymentPlanDiagnostic';
2
- import { hasOnlyKeys } from '../../io/hasOnlyKeys';
3
- import { isRecord } from '../../io/isRecord';
4
- import { isTargetId } from './shared';
2
+ import { hasOnlyKeys, isRecord, isTargetId } from './shared';
5
3
  const DIAGNOSTIC_KEYS = new Set(['code', 'target', 'message', 'stepId']);
6
4
  export function isPlanDiagnostic(value) {
7
5
  return (isRecord(value) &&
@@ -1 +1 @@
1
- {"version":3,"file":"diagnostic.js","sourceRoot":"","sources":["../../../../src/project/history/validation/diagnostic.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gCAAgC,EAAE,MAAM,0CAA0C,CAAC;AAC5F,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtC,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;AAEzE,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,OAAO,CACL,QAAQ,CAAC,KAAK,CAAC;QACf,WAAW,CAAC,KAAK,EAAE,eAAe,CAAC;QACnC,gCAAgC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC;QACpE,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC;QACxB,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ;QACjC,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,CACjE,CAAC;AACJ,CAAC","sourcesContent":["import { DEPLOYMENT_PLAN_DIAGNOSTIC_CODES } from '../../../domain/DeploymentPlanDiagnostic';\nimport { hasOnlyKeys } from '../../io/hasOnlyKeys';\nimport { isRecord } from '../../io/isRecord';\nimport { isTargetId } from './shared';\n\nconst DIAGNOSTIC_KEYS = new Set(['code', 'target', 'message', 'stepId']);\n\nexport function isPlanDiagnostic(value: unknown): boolean {\n return (\n isRecord(value) &&\n hasOnlyKeys(value, DIAGNOSTIC_KEYS) &&\n DEPLOYMENT_PLAN_DIAGNOSTIC_CODES.some((code) => code === value.code) &&\n isTargetId(value.target) &&\n typeof value.message === 'string' &&\n (value.stepId === undefined || typeof value.stepId === 'string')\n );\n}\n"]}
1
+ {"version":3,"file":"diagnostic.js","sourceRoot":"","sources":["../../../../src/project/history/validation/diagnostic.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gCAAgC,EAAE,MAAM,0CAA0C,CAAC;AAC5F,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE7D,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;AAEzE,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,OAAO,CACL,QAAQ,CAAC,KAAK,CAAC;QACf,WAAW,CAAC,KAAK,EAAE,eAAe,CAAC;QACnC,gCAAgC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC;QACpE,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC;QACxB,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ;QACjC,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,CACjE,CAAC;AACJ,CAAC","sourcesContent":["import { DEPLOYMENT_PLAN_DIAGNOSTIC_CODES } from '../../../domain/DeploymentPlanDiagnostic';\nimport { hasOnlyKeys, isRecord, isTargetId } from './shared';\n\nconst DIAGNOSTIC_KEYS = new Set(['code', 'target', 'message', 'stepId']);\n\nexport function isPlanDiagnostic(value: unknown): boolean {\n return (\n isRecord(value) &&\n hasOnlyKeys(value, DIAGNOSTIC_KEYS) &&\n DEPLOYMENT_PLAN_DIAGNOSTIC_CODES.some((code) => code === value.code) &&\n isTargetId(value.target) &&\n typeof value.message === 'string' &&\n (value.stepId === undefined || typeof value.stepId === 'string')\n );\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"execution.d.ts","sourceRoot":"","sources":["../../../../src/project/history/validation/execution.ts"],"names":[],"mappings":"AAcA,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAa7D"}
1
+ {"version":3,"file":"execution.d.ts","sourceRoot":"","sources":["../../../../src/project/history/validation/execution.ts"],"names":[],"mappings":"AAaA,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAa7D"}
@@ -1,9 +1,8 @@
1
- import { hasOnlyKeys } from '../../io/hasOnlyKeys';
2
- import { isRecord } from '../../io/isRecord';
3
1
  import { isPlanDiagnostic } from './diagnostic';
4
2
  import { isDeploymentFailure } from './failure';
5
3
  import { isPlanStep } from './planStep';
6
4
  import { isRequiredAction } from './requiredAction';
5
+ import { hasOnlyKeys, isRecord } from './shared';
7
6
  import { isStepOutcome } from './stepOutcome';
8
7
  const RECORD_KEYS = new Set(['step', 'outcome']);
9
8
  const BLOCKED_KEYS = new Set(['status', 'diagnostics', 'records']);
@@ -1 +1 @@
1
- {"version":3,"file":"execution.js","sourceRoot":"","sources":["../../../../src/project/history/validation/execution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;AACjD,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC,CAAC;AACnE,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;AACtD,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;AAC7D,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;AAE9D,MAAM,UAAU,qBAAqB,CAAC,KAAc;IAClD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IACpE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1D,IAAI,KAAK,CAAC,MAAM,KAAK,WAAW;QAAE,OAAO,WAAW,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;IAC5E,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;IACxD,IAAI,KAAK,CAAC,MAAM,KAAK,iBAAiB,EAAE,CAAC;QACvC,OAAO,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,gBAAgB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,CACL,KAAK,CAAC,MAAM,KAAK,QAAQ;QACzB,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC;QAC/B,mBAAmB,CAAC,KAAK,CAAC,OAAO,CAAC,CACnC,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAc;IACvC,OAAO,CACL,QAAQ,CAAC,KAAK,CAAC;QACf,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC;QAC/B,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC;QACtB,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAC7B,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,KAA8B;IAC/C,OAAO,CACL,WAAW,CAAC,KAAK,EAAE,YAAY,CAAC;QAChC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC;QAChC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAC1C,CAAC;AACJ,CAAC","sourcesContent":["import { hasOnlyKeys } from '../../io/hasOnlyKeys';\nimport { isRecord } from '../../io/isRecord';\nimport { isPlanDiagnostic } from './diagnostic';\nimport { isDeploymentFailure } from './failure';\nimport { isPlanStep } from './planStep';\nimport { isRequiredAction } from './requiredAction';\nimport { isStepOutcome } from './stepOutcome';\n\nconst RECORD_KEYS = new Set(['step', 'outcome']);\nconst BLOCKED_KEYS = new Set(['status', 'diagnostics', 'records']);\nconst COMPLETED_KEYS = new Set(['status', 'records']);\nconst ACTION_KEYS = new Set(['status', 'action', 'records']);\nconst FAILED_KEYS = new Set(['status', 'failure', 'records']);\n\nexport function isDeploymentExecution(value: unknown): boolean {\n if (!isRecord(value) || !Array.isArray(value.records)) return false;\n if (!value.records.every(isExecutionRecord)) return false;\n if (value.status === 'completed') return hasOnlyKeys(value, COMPLETED_KEYS);\n if (value.status === 'blocked') return isBlocked(value);\n if (value.status === 'action-required') {\n return hasOnlyKeys(value, ACTION_KEYS) && isRequiredAction(value.action);\n }\n return (\n value.status === 'failed' &&\n hasOnlyKeys(value, FAILED_KEYS) &&\n isDeploymentFailure(value.failure)\n );\n}\n\nfunction isExecutionRecord(value: unknown): boolean {\n return (\n isRecord(value) &&\n hasOnlyKeys(value, RECORD_KEYS) &&\n isPlanStep(value.step) &&\n isStepOutcome(value.outcome)\n );\n}\n\nfunction isBlocked(value: Record<string, unknown>): boolean {\n return (\n hasOnlyKeys(value, BLOCKED_KEYS) &&\n Array.isArray(value.diagnostics) &&\n value.diagnostics.every(isPlanDiagnostic)\n );\n}\n"]}
1
+ {"version":3,"file":"execution.js","sourceRoot":"","sources":["../../../../src/project/history/validation/execution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;AACjD,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC,CAAC;AACnE,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;AACtD,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;AAC7D,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;AAE9D,MAAM,UAAU,qBAAqB,CAAC,KAAc;IAClD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IACpE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1D,IAAI,KAAK,CAAC,MAAM,KAAK,WAAW;QAAE,OAAO,WAAW,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;IAC5E,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;IACxD,IAAI,KAAK,CAAC,MAAM,KAAK,iBAAiB,EAAE,CAAC;QACvC,OAAO,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,gBAAgB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,CACL,KAAK,CAAC,MAAM,KAAK,QAAQ;QACzB,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC;QAC/B,mBAAmB,CAAC,KAAK,CAAC,OAAO,CAAC,CACnC,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAc;IACvC,OAAO,CACL,QAAQ,CAAC,KAAK,CAAC;QACf,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC;QAC/B,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC;QACtB,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAC7B,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,KAA8B;IAC/C,OAAO,CACL,WAAW,CAAC,KAAK,EAAE,YAAY,CAAC;QAChC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC;QAChC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAC1C,CAAC;AACJ,CAAC","sourcesContent":["import { isPlanDiagnostic } from './diagnostic';\nimport { isDeploymentFailure } from './failure';\nimport { isPlanStep } from './planStep';\nimport { isRequiredAction } from './requiredAction';\nimport { hasOnlyKeys, isRecord } from './shared';\nimport { isStepOutcome } from './stepOutcome';\n\nconst RECORD_KEYS = new Set(['step', 'outcome']);\nconst BLOCKED_KEYS = new Set(['status', 'diagnostics', 'records']);\nconst COMPLETED_KEYS = new Set(['status', 'records']);\nconst ACTION_KEYS = new Set(['status', 'action', 'records']);\nconst FAILED_KEYS = new Set(['status', 'failure', 'records']);\n\nexport function isDeploymentExecution(value: unknown): boolean {\n if (!isRecord(value) || !Array.isArray(value.records)) return false;\n if (!value.records.every(isExecutionRecord)) return false;\n if (value.status === 'completed') return hasOnlyKeys(value, COMPLETED_KEYS);\n if (value.status === 'blocked') return isBlocked(value);\n if (value.status === 'action-required') {\n return hasOnlyKeys(value, ACTION_KEYS) && isRequiredAction(value.action);\n }\n return (\n value.status === 'failed' &&\n hasOnlyKeys(value, FAILED_KEYS) &&\n isDeploymentFailure(value.failure)\n );\n}\n\nfunction isExecutionRecord(value: unknown): boolean {\n return (\n isRecord(value) &&\n hasOnlyKeys(value, RECORD_KEYS) &&\n isPlanStep(value.step) &&\n isStepOutcome(value.outcome)\n );\n}\n\nfunction isBlocked(value: Record<string, unknown>): boolean {\n return (\n hasOnlyKeys(value, BLOCKED_KEYS) &&\n Array.isArray(value.diagnostics) &&\n value.diagnostics.every(isPlanDiagnostic)\n );\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"failure.d.ts","sourceRoot":"","sources":["../../../../src/project/history/validation/failure.ts"],"names":[],"mappings":"AAMA,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAS3D"}
1
+ {"version":3,"file":"failure.d.ts","sourceRoot":"","sources":["../../../../src/project/history/validation/failure.ts"],"names":[],"mappings":"AAIA,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAS3D"}
@@ -1,6 +1,4 @@
1
- import { hasOnlyKeys } from '../../io/hasOnlyKeys';
2
- import { isRecord } from '../../io/isRecord';
3
- import { isNonEmptyString, isTargetId } from './shared';
1
+ import { hasOnlyKeys, isNonEmptyString, isRecord, isTargetId } from './shared';
4
2
  const FAILURE_KEYS = new Set(['code', 'message', 'target', 'provider']);
5
3
  export function isDeploymentFailure(value) {
6
4
  return (isRecord(value) &&
@@ -1 +1 @@
1
- {"version":3,"file":"failure.js","sourceRoot":"","sources":["../../../../src/project/history/validation/failure.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAExD,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;AAExE,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAChD,OAAO,CACL,QAAQ,CAAC,KAAK,CAAC;QACf,WAAW,CAAC,KAAK,EAAE,YAAY,CAAC;QAChC,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC;QAC5B,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ;QACjC,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACxD,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,gBAAgB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CACnE,CAAC;AACJ,CAAC","sourcesContent":["import { hasOnlyKeys } from '../../io/hasOnlyKeys';\nimport { isRecord } from '../../io/isRecord';\nimport { isNonEmptyString, isTargetId } from './shared';\n\nconst FAILURE_KEYS = new Set(['code', 'message', 'target', 'provider']);\n\nexport function isDeploymentFailure(value: unknown): boolean {\n return (\n isRecord(value) &&\n hasOnlyKeys(value, FAILURE_KEYS) &&\n isNonEmptyString(value.code) &&\n typeof value.message === 'string' &&\n (value.target === undefined || isTargetId(value.target)) &&\n (value.provider === undefined || isNonEmptyString(value.provider))\n );\n}\n"]}
1
+ {"version":3,"file":"failure.js","sourceRoot":"","sources":["../../../../src/project/history/validation/failure.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE/E,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;AAExE,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAChD,OAAO,CACL,QAAQ,CAAC,KAAK,CAAC;QACf,WAAW,CAAC,KAAK,EAAE,YAAY,CAAC;QAChC,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC;QAC5B,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ;QACjC,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACxD,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,gBAAgB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CACnE,CAAC;AACJ,CAAC","sourcesContent":["import { hasOnlyKeys, isNonEmptyString, isRecord, isTargetId } from './shared';\n\nconst FAILURE_KEYS = new Set(['code', 'message', 'target', 'provider']);\n\nexport function isDeploymentFailure(value: unknown): boolean {\n return (\n isRecord(value) &&\n hasOnlyKeys(value, FAILURE_KEYS) &&\n isNonEmptyString(value.code) &&\n typeof value.message === 'string' &&\n (value.target === undefined || isTargetId(value.target)) &&\n (value.provider === undefined || isNonEmptyString(value.provider))\n );\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"observedTarget.d.ts","sourceRoot":"","sources":["../../../../src/project/history/validation/observedTarget.ts"],"names":[],"mappings":"AASA,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CA2BxD"}
1
+ {"version":3,"file":"observedTarget.d.ts","sourceRoot":"","sources":["../../../../src/project/history/validation/observedTarget.ts"],"names":[],"mappings":"AAOA,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CA2BxD"}
@@ -1,7 +1,5 @@
1
- import { hasOnlyKeys } from '../../io/hasOnlyKeys';
2
- import { isRecord } from '../../io/isRecord';
3
1
  import { isProviderSelection } from './providerSelection';
4
- import { isNonEmptyString } from './shared';
2
+ import { hasOnlyKeys, isNonEmptyString, isRecord } from './shared';
5
3
  const WEB_KEYS = new Set(['target', 'providers', 'revision']);
6
4
  const ANDROID_KEYS = new Set(['target', 'package', 'providers', 'revision']);
7
5
  const IOS_KEYS = new Set(['target', 'bundleIdentifier', 'providers', 'revision']);
@@ -1 +1 @@
1
- {"version":3,"file":"observedTarget.js","sourceRoot":"","sources":["../../../../src/project/history/validation/observedTarget.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE5C,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC;AAC9D,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC;AAC7E,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,kBAAkB,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC;AAElF,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAEnC,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;QAC3B,OAAO,CACL,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC;YAC5B,mBAAmB,CAAC,KAAK,CAAC,SAAS,CAAC;YACpC,kBAAkB,CAAC,KAAK,CAAC,QAAQ,CAAC,CACnC,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,CACL,WAAW,CAAC,KAAK,EAAE,YAAY,CAAC;YAChC,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC;YAC/B,mBAAmB,CAAC,KAAK,CAAC,SAAS,CAAC;YACpC,kBAAkB,CAAC,KAAK,CAAC,QAAQ,CAAC,CACnC,CAAC;IACJ,CAAC;IAED,OAAO,CACL,KAAK,CAAC,MAAM,KAAK,KAAK;QACtB,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC;QAC5B,gBAAgB,CAAC,KAAK,CAAC,gBAAgB,CAAC;QACxC,mBAAmB,CAAC,KAAK,CAAC,SAAS,CAAC;QACpC,kBAAkB,CAAC,KAAK,CAAC,QAAQ,CAAC,CACnC,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAc;IACxC,OAAO,KAAK,KAAK,SAAS,IAAI,gBAAgB,CAAC,KAAK,CAAC,CAAC;AACxD,CAAC","sourcesContent":["import { hasOnlyKeys } from '../../io/hasOnlyKeys';\nimport { isRecord } from '../../io/isRecord';\nimport { isProviderSelection } from './providerSelection';\nimport { isNonEmptyString } from './shared';\n\nconst WEB_KEYS = new Set(['target', 'providers', 'revision']);\nconst ANDROID_KEYS = new Set(['target', 'package', 'providers', 'revision']);\nconst IOS_KEYS = new Set(['target', 'bundleIdentifier', 'providers', 'revision']);\n\nexport function isObservedTarget(value: unknown): boolean {\n if (!isRecord(value)) return false;\n\n if (value.target === 'web') {\n return (\n hasOnlyKeys(value, WEB_KEYS) &&\n isProviderSelection(value.providers) &&\n isOptionalRevision(value.revision)\n );\n }\n\n if (value.target === 'android') {\n return (\n hasOnlyKeys(value, ANDROID_KEYS) &&\n isNonEmptyString(value.package) &&\n isProviderSelection(value.providers) &&\n isOptionalRevision(value.revision)\n );\n }\n\n return (\n value.target === 'ios' &&\n hasOnlyKeys(value, IOS_KEYS) &&\n isNonEmptyString(value.bundleIdentifier) &&\n isProviderSelection(value.providers) &&\n isOptionalRevision(value.revision)\n );\n}\n\nfunction isOptionalRevision(value: unknown): boolean {\n return value === undefined || isNonEmptyString(value);\n}\n"]}
1
+ {"version":3,"file":"observedTarget.js","sourceRoot":"","sources":["../../../../src/project/history/validation/observedTarget.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEnE,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC;AAC9D,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC;AAC7E,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,kBAAkB,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC;AAElF,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAEnC,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;QAC3B,OAAO,CACL,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC;YAC5B,mBAAmB,CAAC,KAAK,CAAC,SAAS,CAAC;YACpC,kBAAkB,CAAC,KAAK,CAAC,QAAQ,CAAC,CACnC,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,CACL,WAAW,CAAC,KAAK,EAAE,YAAY,CAAC;YAChC,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC;YAC/B,mBAAmB,CAAC,KAAK,CAAC,SAAS,CAAC;YACpC,kBAAkB,CAAC,KAAK,CAAC,QAAQ,CAAC,CACnC,CAAC;IACJ,CAAC;IAED,OAAO,CACL,KAAK,CAAC,MAAM,KAAK,KAAK;QACtB,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC;QAC5B,gBAAgB,CAAC,KAAK,CAAC,gBAAgB,CAAC;QACxC,mBAAmB,CAAC,KAAK,CAAC,SAAS,CAAC;QACpC,kBAAkB,CAAC,KAAK,CAAC,QAAQ,CAAC,CACnC,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAc;IACxC,OAAO,KAAK,KAAK,SAAS,IAAI,gBAAgB,CAAC,KAAK,CAAC,CAAC;AACxD,CAAC","sourcesContent":["import { isProviderSelection } from './providerSelection';\nimport { hasOnlyKeys, isNonEmptyString, isRecord } from './shared';\n\nconst WEB_KEYS = new Set(['target', 'providers', 'revision']);\nconst ANDROID_KEYS = new Set(['target', 'package', 'providers', 'revision']);\nconst IOS_KEYS = new Set(['target', 'bundleIdentifier', 'providers', 'revision']);\n\nexport function isObservedTarget(value: unknown): boolean {\n if (!isRecord(value)) return false;\n\n if (value.target === 'web') {\n return (\n hasOnlyKeys(value, WEB_KEYS) &&\n isProviderSelection(value.providers) &&\n isOptionalRevision(value.revision)\n );\n }\n\n if (value.target === 'android') {\n return (\n hasOnlyKeys(value, ANDROID_KEYS) &&\n isNonEmptyString(value.package) &&\n isProviderSelection(value.providers) &&\n isOptionalRevision(value.revision)\n );\n }\n\n return (\n value.target === 'ios' &&\n hasOnlyKeys(value, IOS_KEYS) &&\n isNonEmptyString(value.bundleIdentifier) &&\n isProviderSelection(value.providers) &&\n isOptionalRevision(value.revision)\n );\n}\n\nfunction isOptionalRevision(value: unknown): boolean {\n return value === undefined || isNonEmptyString(value);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../../../src/project/history/validation/plan.ts"],"names":[],"mappings":"AAQA,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAYxD"}
1
+ {"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../../../src/project/history/validation/plan.ts"],"names":[],"mappings":"AAOA,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAYxD"}
@@ -1,7 +1,6 @@
1
- import { hasOnlyKeys } from '../../io/hasOnlyKeys';
2
- import { isRecord } from '../../io/isRecord';
3
1
  import { isPlanDiagnostic } from './diagnostic';
4
2
  import { isPlanStep } from './planStep';
3
+ import { hasOnlyKeys, isRecord } from './shared';
5
4
  import { isTargetChange } from './targetChange';
6
5
  const PLAN_KEYS = new Set(['changes', 'steps', 'diagnostics', 'executable']);
7
6
  export function isDeploymentPlan(value) {
@@ -1 +1 @@
1
- {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../../../src/project/history/validation/plan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,aAAa,EAAE,YAAY,CAAC,CAAC,CAAC;AAE7E,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,OAAO,CACL,QAAQ,CAAC,KAAK,CAAC;QACf,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC;QAC7B,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;QAC5B,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC;QACnC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;QAC1B,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC;QAC7B,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC;QAChC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,gBAAgB,CAAC;QACzC,OAAO,KAAK,CAAC,UAAU,KAAK,SAAS,CACtC,CAAC;AACJ,CAAC","sourcesContent":["import { hasOnlyKeys } from '../../io/hasOnlyKeys';\nimport { isRecord } from '../../io/isRecord';\nimport { isPlanDiagnostic } from './diagnostic';\nimport { isPlanStep } from './planStep';\nimport { isTargetChange } from './targetChange';\n\nconst PLAN_KEYS = new Set(['changes', 'steps', 'diagnostics', 'executable']);\n\nexport function isDeploymentPlan(value: unknown): boolean {\n return (\n isRecord(value) &&\n hasOnlyKeys(value, PLAN_KEYS) &&\n Array.isArray(value.changes) &&\n value.changes.every(isTargetChange) &&\n Array.isArray(value.steps) &&\n value.steps.every(isPlanStep) &&\n Array.isArray(value.diagnostics) &&\n value.diagnostics.every(isPlanDiagnostic) &&\n typeof value.executable === 'boolean'\n );\n}\n"]}
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../../../src/project/history/validation/plan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,aAAa,EAAE,YAAY,CAAC,CAAC,CAAC;AAE7E,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,OAAO,CACL,QAAQ,CAAC,KAAK,CAAC;QACf,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC;QAC7B,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;QAC5B,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC;QACnC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;QAC1B,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC;QAC7B,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC;QAChC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,gBAAgB,CAAC;QACzC,OAAO,KAAK,CAAC,UAAU,KAAK,SAAS,CACtC,CAAC;AACJ,CAAC","sourcesContent":["import { isPlanDiagnostic } from './diagnostic';\nimport { isPlanStep } from './planStep';\nimport { hasOnlyKeys, isRecord } from './shared';\nimport { isTargetChange } from './targetChange';\n\nconst PLAN_KEYS = new Set(['changes', 'steps', 'diagnostics', 'executable']);\n\nexport function isDeploymentPlan(value: unknown): boolean {\n return (\n isRecord(value) &&\n hasOnlyKeys(value, PLAN_KEYS) &&\n Array.isArray(value.changes) &&\n value.changes.every(isTargetChange) &&\n Array.isArray(value.steps) &&\n value.steps.every(isPlanStep) &&\n Array.isArray(value.diagnostics) &&\n value.diagnostics.every(isPlanDiagnostic) &&\n typeof value.executable === 'boolean'\n );\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"planStep.d.ts","sourceRoot":"","sources":["../../../../src/project/history/validation/planStep.ts"],"names":[],"mappings":"AAQA,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAWlD"}
1
+ {"version":3,"file":"planStep.d.ts","sourceRoot":"","sources":["../../../../src/project/history/validation/planStep.ts"],"names":[],"mappings":"AAMA,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAWlD"}
@@ -1,8 +1,6 @@
1
1
  import { DEPLOYMENT_CAPABILITIES } from '../../../domain/DeploymentCapability';
2
2
  import { DEPLOYMENT_STEP_OPERATIONS } from '../../../domain/DeploymentPlanStep';
3
- import { hasOnlyKeys } from '../../io/hasOnlyKeys';
4
- import { isRecord } from '../../io/isRecord';
5
- import { isNonEmptyString, isTargetId } from './shared';
3
+ import { hasOnlyKeys, isNonEmptyString, isRecord, isTargetId } from './shared';
6
4
  const STEP_KEYS = new Set(['id', 'target', 'phase', 'operation', 'provider', 'reason']);
7
5
  export function isPlanStep(value) {
8
6
  return (isRecord(value) &&
@@ -1 +1 @@
1
- {"version":3,"file":"planStep.js","sourceRoot":"","sources":["../../../../src/project/history/validation/planStep.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAC/E,OAAO,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAChF,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAExD,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;AAExF,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,OAAO,CACL,QAAQ,CAAC,KAAK,CAAC;QACf,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC;QAC7B,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC;QACxB,uBAAuB,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,CAAC;QAC9D,0BAA0B,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,CAAC;QAC7E,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,gBAAgB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAClE,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,CACjC,CAAC;AACJ,CAAC","sourcesContent":["import { DEPLOYMENT_CAPABILITIES } from '../../../domain/DeploymentCapability';\nimport { DEPLOYMENT_STEP_OPERATIONS } from '../../../domain/DeploymentPlanStep';\nimport { hasOnlyKeys } from '../../io/hasOnlyKeys';\nimport { isRecord } from '../../io/isRecord';\nimport { isNonEmptyString, isTargetId } from './shared';\n\nconst STEP_KEYS = new Set(['id', 'target', 'phase', 'operation', 'provider', 'reason']);\n\nexport function isPlanStep(value: unknown): boolean {\n return (\n isRecord(value) &&\n hasOnlyKeys(value, STEP_KEYS) &&\n isNonEmptyString(value.id) &&\n isTargetId(value.target) &&\n DEPLOYMENT_CAPABILITIES.some((phase) => phase === value.phase) &&\n DEPLOYMENT_STEP_OPERATIONS.some((operation) => operation === value.operation) &&\n (value.provider === undefined || isNonEmptyString(value.provider)) &&\n typeof value.reason === 'string'\n );\n}\n"]}
1
+ {"version":3,"file":"planStep.js","sourceRoot":"","sources":["../../../../src/project/history/validation/planStep.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAC/E,OAAO,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAChF,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE/E,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;AAExF,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,OAAO,CACL,QAAQ,CAAC,KAAK,CAAC;QACf,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC;QAC7B,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC;QACxB,uBAAuB,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,CAAC;QAC9D,0BAA0B,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,CAAC;QAC7E,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,gBAAgB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAClE,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,CACjC,CAAC;AACJ,CAAC","sourcesContent":["import { DEPLOYMENT_CAPABILITIES } from '../../../domain/DeploymentCapability';\nimport { DEPLOYMENT_STEP_OPERATIONS } from '../../../domain/DeploymentPlanStep';\nimport { hasOnlyKeys, isNonEmptyString, isRecord, isTargetId } from './shared';\n\nconst STEP_KEYS = new Set(['id', 'target', 'phase', 'operation', 'provider', 'reason']);\n\nexport function isPlanStep(value: unknown): boolean {\n return (\n isRecord(value) &&\n hasOnlyKeys(value, STEP_KEYS) &&\n isNonEmptyString(value.id) &&\n isTargetId(value.target) &&\n DEPLOYMENT_CAPABILITIES.some((phase) => phase === value.phase) &&\n DEPLOYMENT_STEP_OPERATIONS.some((operation) => operation === value.operation) &&\n (value.provider === undefined || isNonEmptyString(value.provider)) &&\n typeof value.reason === 'string'\n );\n}\n"]}