@ankhorage/deploy 0.1.0 → 0.2.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 (147) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +1 -1
  3. package/dist/project/ProjectDeploymentPaths.d.ts +17 -0
  4. package/dist/project/ProjectDeploymentPaths.d.ts.map +1 -0
  5. package/dist/project/ProjectDeploymentPaths.js +2 -0
  6. package/dist/project/ProjectDeploymentPaths.js.map +1 -0
  7. package/dist/project/ResolvedDeployProject.d.ts +11 -0
  8. package/dist/project/ResolvedDeployProject.d.ts.map +1 -0
  9. package/dist/project/ResolvedDeployProject.js +2 -0
  10. package/dist/project/ResolvedDeployProject.js.map +1 -0
  11. package/dist/project/history/ProjectDeploymentHistoryRecord.d.ts +14 -0
  12. package/dist/project/history/ProjectDeploymentHistoryRecord.d.ts.map +1 -0
  13. package/dist/project/history/ProjectDeploymentHistoryRecord.js +2 -0
  14. package/dist/project/history/ProjectDeploymentHistoryRecord.js.map +1 -0
  15. package/dist/project/history/historySchemaVersion.d.ts +2 -0
  16. package/dist/project/history/historySchemaVersion.d.ts.map +1 -0
  17. package/dist/project/history/historySchemaVersion.js +2 -0
  18. package/dist/project/history/historySchemaVersion.js.map +1 -0
  19. package/dist/project/history/listProjectDeploymentHistory.d.ts +5 -0
  20. package/dist/project/history/listProjectDeploymentHistory.d.ts.map +1 -0
  21. package/dist/project/history/listProjectDeploymentHistory.js +25 -0
  22. package/dist/project/history/listProjectDeploymentHistory.js.map +1 -0
  23. package/dist/project/history/parseProjectDeploymentHistoryRecord.d.ts +3 -0
  24. package/dist/project/history/parseProjectDeploymentHistoryRecord.d.ts.map +1 -0
  25. package/dist/project/history/parseProjectDeploymentHistoryRecord.js +40 -0
  26. package/dist/project/history/parseProjectDeploymentHistoryRecord.js.map +1 -0
  27. package/dist/project/history/readProjectDeploymentHistory.d.ts +6 -0
  28. package/dist/project/history/readProjectDeploymentHistory.d.ts.map +1 -0
  29. package/dist/project/history/readProjectDeploymentHistory.js +26 -0
  30. package/dist/project/history/readProjectDeploymentHistory.js.map +1 -0
  31. package/dist/project/history/recordProjectDeploymentHistory.d.ts +6 -0
  32. package/dist/project/history/recordProjectDeploymentHistory.d.ts.map +1 -0
  33. package/dist/project/history/recordProjectDeploymentHistory.js +40 -0
  34. package/dist/project/history/recordProjectDeploymentHistory.js.map +1 -0
  35. package/dist/project/history/validation/diagnostic.d.ts +2 -0
  36. package/dist/project/history/validation/diagnostic.d.ts.map +1 -0
  37. package/dist/project/history/validation/diagnostic.js +14 -0
  38. package/dist/project/history/validation/diagnostic.js.map +1 -0
  39. package/dist/project/history/validation/execution.d.ts +2 -0
  40. package/dist/project/history/validation/execution.d.ts.map +1 -0
  41. package/dist/project/history/validation/execution.js +40 -0
  42. package/dist/project/history/validation/execution.js.map +1 -0
  43. package/dist/project/history/validation/failure.d.ts +2 -0
  44. package/dist/project/history/validation/failure.d.ts.map +1 -0
  45. package/dist/project/history/validation/failure.js +13 -0
  46. package/dist/project/history/validation/failure.js.map +1 -0
  47. package/dist/project/history/validation/isIsoTimestamp.d.ts +2 -0
  48. package/dist/project/history/validation/isIsoTimestamp.d.ts.map +1 -0
  49. package/dist/project/history/validation/isIsoTimestamp.js +6 -0
  50. package/dist/project/history/validation/isIsoTimestamp.js.map +1 -0
  51. package/dist/project/history/validation/observedTarget.d.ts +2 -0
  52. package/dist/project/history/validation/observedTarget.d.ts.map +1 -0
  53. package/dist/project/history/validation/observedTarget.js +24 -0
  54. package/dist/project/history/validation/observedTarget.js.map +1 -0
  55. package/dist/project/history/validation/plan.d.ts +2 -0
  56. package/dist/project/history/validation/plan.d.ts.map +1 -0
  57. package/dist/project/history/validation/plan.js +18 -0
  58. package/dist/project/history/validation/plan.js.map +1 -0
  59. package/dist/project/history/validation/planStep.d.ts +2 -0
  60. package/dist/project/history/validation/planStep.d.ts.map +1 -0
  61. package/dist/project/history/validation/planStep.js +17 -0
  62. package/dist/project/history/validation/planStep.js.map +1 -0
  63. package/dist/project/history/validation/providerSelection.d.ts +2 -0
  64. package/dist/project/history/validation/providerSelection.d.ts.map +1 -0
  65. package/dist/project/history/validation/providerSelection.js +13 -0
  66. package/dist/project/history/validation/providerSelection.js.map +1 -0
  67. package/dist/project/history/validation/requiredAction.d.ts +2 -0
  68. package/dist/project/history/validation/requiredAction.d.ts.map +1 -0
  69. package/dist/project/history/validation/requiredAction.js +27 -0
  70. package/dist/project/history/validation/requiredAction.js.map +1 -0
  71. package/dist/project/history/validation/shared.d.ts +3 -0
  72. package/dist/project/history/validation/shared.d.ts.map +1 -0
  73. package/dist/project/history/validation/shared.js +8 -0
  74. package/dist/project/history/validation/shared.js.map +1 -0
  75. package/dist/project/history/validation/stepOutcome.d.ts +2 -0
  76. package/dist/project/history/validation/stepOutcome.d.ts.map +1 -0
  77. package/dist/project/history/validation/stepOutcome.js +21 -0
  78. package/dist/project/history/validation/stepOutcome.js.map +1 -0
  79. package/dist/project/history/validation/targetChange.d.ts +2 -0
  80. package/dist/project/history/validation/targetChange.d.ts.map +1 -0
  81. package/dist/project/history/validation/targetChange.js +19 -0
  82. package/dist/project/history/validation/targetChange.js.map +1 -0
  83. package/dist/project/history/validation/verification.d.ts +2 -0
  84. package/dist/project/history/validation/verification.d.ts.map +1 -0
  85. package/dist/project/history/validation/verification.js +23 -0
  86. package/dist/project/history/validation/verification.js.map +1 -0
  87. package/dist/project/index.d.ts +12 -0
  88. package/dist/project/index.d.ts.map +1 -0
  89. package/dist/project/index.js +9 -0
  90. package/dist/project/index.js.map +1 -0
  91. package/dist/project/io/assertContainedPath.d.ts +2 -0
  92. package/dist/project/io/assertContainedPath.d.ts.map +1 -0
  93. package/dist/project/io/assertContainedPath.js +33 -0
  94. package/dist/project/io/assertContainedPath.js.map +1 -0
  95. package/dist/project/io/assertSafeSegment.d.ts +3 -0
  96. package/dist/project/io/assertSafeSegment.d.ts.map +1 -0
  97. package/dist/project/io/assertSafeSegment.js +15 -0
  98. package/dist/project/io/assertSafeSegment.js.map +1 -0
  99. package/dist/project/io/atomicWriteFile.d.ts +6 -0
  100. package/dist/project/io/atomicWriteFile.d.ts.map +1 -0
  101. package/dist/project/io/atomicWriteFile.js +18 -0
  102. package/dist/project/io/atomicWriteFile.js.map +1 -0
  103. package/dist/project/io/atomicWriteJson.d.ts +6 -0
  104. package/dist/project/io/atomicWriteJson.d.ts.map +1 -0
  105. package/dist/project/io/atomicWriteJson.js +10 -0
  106. package/dist/project/io/atomicWriteJson.js.map +1 -0
  107. package/dist/project/io/hasOnlyKeys.d.ts +2 -0
  108. package/dist/project/io/hasOnlyKeys.d.ts.map +1 -0
  109. package/dist/project/io/hasOnlyKeys.js +4 -0
  110. package/dist/project/io/hasOnlyKeys.js.map +1 -0
  111. package/dist/project/io/isMissingPathError.d.ts +2 -0
  112. package/dist/project/io/isMissingPathError.d.ts.map +1 -0
  113. package/dist/project/io/isMissingPathError.js +4 -0
  114. package/dist/project/io/isMissingPathError.js.map +1 -0
  115. package/dist/project/io/isRecord.d.ts +2 -0
  116. package/dist/project/io/isRecord.d.ts.map +1 -0
  117. package/dist/project/io/isRecord.js +4 -0
  118. package/dist/project/io/isRecord.js.map +1 -0
  119. package/dist/project/io/normalizeProjectRoot.d.ts +2 -0
  120. package/dist/project/io/normalizeProjectRoot.d.ts.map +1 -0
  121. package/dist/project/io/normalizeProjectRoot.js +18 -0
  122. package/dist/project/io/normalizeProjectRoot.js.map +1 -0
  123. package/dist/project/io/readJsonFile.d.ts +2 -0
  124. package/dist/project/io/readJsonFile.d.ts.map +1 -0
  125. package/dist/project/io/readJsonFile.js +11 -0
  126. package/dist/project/io/readJsonFile.js.map +1 -0
  127. package/dist/project/io/readProjectManifest.d.ts +6 -0
  128. package/dist/project/io/readProjectManifest.d.ts.map +1 -0
  129. package/dist/project/io/readProjectManifest.js +20 -0
  130. package/dist/project/io/readProjectManifest.js.map +1 -0
  131. package/dist/project/readProjectDeploymentConfig.d.ts +5 -0
  132. package/dist/project/readProjectDeploymentConfig.d.ts.map +1 -0
  133. package/dist/project/readProjectDeploymentConfig.js +6 -0
  134. package/dist/project/readProjectDeploymentConfig.js.map +1 -0
  135. package/dist/project/resolveDeployProject.d.ts +5 -0
  136. package/dist/project/resolveDeployProject.d.ts.map +1 -0
  137. package/dist/project/resolveDeployProject.js +15 -0
  138. package/dist/project/resolveDeployProject.js.map +1 -0
  139. package/dist/project/resolveProjectDeploymentPaths.d.ts +3 -0
  140. package/dist/project/resolveProjectDeploymentPaths.d.ts.map +1 -0
  141. package/dist/project/resolveProjectDeploymentPaths.js +25 -0
  142. package/dist/project/resolveProjectDeploymentPaths.js.map +1 -0
  143. package/dist/project/updateProjectDeploymentConfig.d.ts +7 -0
  144. package/dist/project/updateProjectDeploymentConfig.d.ts.map +1 -0
  145. package/dist/project/updateProjectDeploymentConfig.js +23 -0
  146. package/dist/project/updateProjectDeploymentConfig.js.map +1 -0
  147. package/package.json +6 -1
@@ -0,0 +1,2 @@
1
+ export declare function isProviderSelection(value: unknown): boolean;
2
+ //# sourceMappingURL=providerSelection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providerSelection.d.ts","sourceRoot":"","sources":["../../../../src/project/history/validation/providerSelection.ts"],"names":[],"mappings":"AAMA,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAQ3D"}
@@ -0,0 +1,13 @@
1
+ import { hasOnlyKeys } from '../../io/hasOnlyKeys';
2
+ import { isRecord } from '../../io/isRecord';
3
+ import { isNonEmptyString } from './shared';
4
+ const PROVIDER_KEYS = new Set(['build', 'publish']);
5
+ export function isProviderSelection(value) {
6
+ if (value === undefined)
7
+ return true;
8
+ if (!isRecord(value) || !hasOnlyKeys(value, PROVIDER_KEYS))
9
+ return false;
10
+ return ((value.build === undefined || isNonEmptyString(value.build)) &&
11
+ (value.publish === undefined || isNonEmptyString(value.publish)));
12
+ }
13
+ //# sourceMappingURL=providerSelection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providerSelection.js","sourceRoot":"","sources":["../../../../src/project/history/validation/providerSelection.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,UAAU,CAAC;AAE5C,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;AAEpD,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAChD,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACrC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,aAAa,CAAC;QAAE,OAAO,KAAK,CAAC;IAEzE,OAAO,CACL,CAAC,KAAK,CAAC,KAAK,KAAK,SAAS,IAAI,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC5D,CAAC,KAAK,CAAC,OAAO,KAAK,SAAS,IAAI,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CACjE,CAAC;AACJ,CAAC","sourcesContent":["import { hasOnlyKeys } from '../../io/hasOnlyKeys';\nimport { isRecord } from '../../io/isRecord';\nimport { isNonEmptyString } from './shared';\n\nconst PROVIDER_KEYS = new Set(['build', 'publish']);\n\nexport function isProviderSelection(value: unknown): boolean {\n if (value === undefined) return true;\n if (!isRecord(value) || !hasOnlyKeys(value, PROVIDER_KEYS)) return false;\n\n return (\n (value.build === undefined || isNonEmptyString(value.build)) &&\n (value.publish === undefined || isNonEmptyString(value.publish))\n );\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export declare function isRequiredAction(value: unknown): boolean;
2
+ //# sourceMappingURL=requiredAction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requiredAction.d.ts","sourceRoot":"","sources":["../../../../src/project/history/validation/requiredAction.ts"],"names":[],"mappings":"AAOA,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAcxD"}
@@ -0,0 +1,27 @@
1
+ import { hasOnlyKeys } from '../../io/hasOnlyKeys';
2
+ import { isRecord } from '../../io/isRecord';
3
+ import { isNonEmptyString, isTargetId } from './shared';
4
+ const AUTH_KEYS = new Set(['type', 'provider', 'target', 'code', 'message']);
5
+ const MANUAL_KEYS = new Set(['type', 'target', 'provider', 'code', 'message', 'url']);
6
+ export function isRequiredAction(value) {
7
+ if (!isRecord(value))
8
+ return false;
9
+ if (value.type === 'authentication') {
10
+ return (hasOnlyKeys(value, AUTH_KEYS) &&
11
+ isNonEmptyString(value.provider) &&
12
+ (value.target === undefined || isTargetId(value.target)) &&
13
+ isNonEmptyString(value.code) &&
14
+ typeof value.message === 'string');
15
+ }
16
+ return isManualAction(value);
17
+ }
18
+ function isManualAction(value) {
19
+ return (value.type === 'manual-action' &&
20
+ hasOnlyKeys(value, MANUAL_KEYS) &&
21
+ isTargetId(value.target) &&
22
+ (value.provider === undefined || isNonEmptyString(value.provider)) &&
23
+ isNonEmptyString(value.code) &&
24
+ typeof value.message === 'string' &&
25
+ (value.url === undefined || typeof value.url === 'string'));
26
+ }
27
+ //# sourceMappingURL=requiredAction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requiredAction.js","sourceRoot":"","sources":["../../../../src/project/history/validation/requiredAction.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,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;AAC7E,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;AAEtF,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAEnC,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;QACpC,OAAO,CACL,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC;YAC7B,gBAAgB,CAAC,KAAK,CAAC,QAAQ,CAAC;YAChC,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACxD,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC;YAC5B,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,CAClC,CAAC;IACJ,CAAC;IAED,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,cAAc,CAAC,KAA8B;IACpD,OAAO,CACL,KAAK,CAAC,IAAI,KAAK,eAAe;QAC9B,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC;QAC/B,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC;QACxB,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,gBAAgB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAClE,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC;QAC5B,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ;QACjC,CAAC,KAAK,CAAC,GAAG,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ,CAAC,CAC3D,CAAC;AACJ,CAAC","sourcesContent":["import { hasOnlyKeys } from '../../io/hasOnlyKeys';\nimport { isRecord } from '../../io/isRecord';\nimport { isNonEmptyString, isTargetId } from './shared';\n\nconst AUTH_KEYS = new Set(['type', 'provider', 'target', 'code', 'message']);\nconst MANUAL_KEYS = new Set(['type', 'target', 'provider', 'code', 'message', 'url']);\n\nexport function isRequiredAction(value: unknown): boolean {\n if (!isRecord(value)) return false;\n\n if (value.type === 'authentication') {\n return (\n hasOnlyKeys(value, AUTH_KEYS) &&\n isNonEmptyString(value.provider) &&\n (value.target === undefined || isTargetId(value.target)) &&\n isNonEmptyString(value.code) &&\n typeof value.message === 'string'\n );\n }\n\n return isManualAction(value);\n}\n\nfunction isManualAction(value: Record<string, unknown>): boolean {\n return (\n value.type === 'manual-action' &&\n hasOnlyKeys(value, MANUAL_KEYS) &&\n isTargetId(value.target) &&\n (value.provider === undefined || isNonEmptyString(value.provider)) &&\n isNonEmptyString(value.code) &&\n typeof value.message === 'string' &&\n (value.url === undefined || typeof value.url === 'string')\n );\n}\n"]}
@@ -0,0 +1,3 @@
1
+ export declare function isNonEmptyString(value: unknown): value is string;
2
+ export declare function isTargetId(value: unknown): value is 'web' | 'android' | 'ios';
3
+ //# sourceMappingURL=shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../../src/project/history/validation/shared.ts"],"names":[],"mappings":"AAEA,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAEhE;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,KAAK,GAAG,SAAS,GAAG,KAAK,CAE7E"}
@@ -0,0 +1,8 @@
1
+ import { APP_DEPLOY_TARGET_IDS } from '@ankhorage/contracts/deploy';
2
+ export function isNonEmptyString(value) {
3
+ return typeof value === 'string' && value.trim().length > 0;
4
+ }
5
+ export function isTargetId(value) {
6
+ return APP_DEPLOY_TARGET_IDS.some((target) => target === value);
7
+ }
8
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../../src/project/history/validation/shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAEpE,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,OAAO,qBAAqB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC;AAClE,CAAC","sourcesContent":["import { APP_DEPLOY_TARGET_IDS } from '@ankhorage/contracts/deploy';\n\nexport function isNonEmptyString(value: unknown): value is string {\n return typeof value === 'string' && value.trim().length > 0;\n}\n\nexport function isTargetId(value: unknown): value is 'web' | 'android' | 'ios' {\n return APP_DEPLOY_TARGET_IDS.some((target) => target === value);\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export declare function isStepOutcome(value: unknown): boolean;
2
+ //# sourceMappingURL=stepOutcome.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stepOutcome.d.ts","sourceRoot":"","sources":["../../../../src/project/history/validation/stepOutcome.ts"],"names":[],"mappings":"AAKA,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAerD"}
@@ -0,0 +1,21 @@
1
+ import { hasOnlyKeys } from '../../io/hasOnlyKeys';
2
+ import { isRecord } from '../../io/isRecord';
3
+ import { isDeploymentFailure } from './failure';
4
+ import { isRequiredAction } from './requiredAction';
5
+ export function isStepOutcome(value) {
6
+ if (!isRecord(value))
7
+ return false;
8
+ switch (value.status) {
9
+ case 'completed':
10
+ return hasOnlyKeys(value, new Set(['status']));
11
+ case 'skipped':
12
+ return hasOnlyKeys(value, new Set(['status', 'reason'])) && typeof value.reason === 'string';
13
+ case 'action-required':
14
+ return hasOnlyKeys(value, new Set(['status', 'action'])) && isRequiredAction(value.action);
15
+ case 'failed':
16
+ return hasOnlyKeys(value, new Set(['status', 'error'])) && isDeploymentFailure(value.error);
17
+ default:
18
+ return false;
19
+ }
20
+ }
21
+ //# sourceMappingURL=stepOutcome.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stepOutcome.js","sourceRoot":"","sources":["../../../../src/project/history/validation/stepOutcome.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,WAAW,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAEnC,QAAQ,KAAK,CAAC,MAAM,EAAE,CAAC;QACrB,KAAK,WAAW;YACd,OAAO,WAAW,CAAC,KAAK,EAAE,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACjD,KAAK,SAAS;YACZ,OAAO,WAAW,CAAC,KAAK,EAAE,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC;QAC/F,KAAK,iBAAiB;YACpB,OAAO,WAAW,CAAC,KAAK,EAAE,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,gBAAgB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC7F,KAAK,QAAQ;YACX,OAAO,WAAW,CAAC,KAAK,EAAE,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,mBAAmB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC9F;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC","sourcesContent":["import { hasOnlyKeys } from '../../io/hasOnlyKeys';\nimport { isRecord } from '../../io/isRecord';\nimport { isDeploymentFailure } from './failure';\nimport { isRequiredAction } from './requiredAction';\n\nexport function isStepOutcome(value: unknown): boolean {\n if (!isRecord(value)) return false;\n\n switch (value.status) {\n case 'completed':\n return hasOnlyKeys(value, new Set(['status']));\n case 'skipped':\n return hasOnlyKeys(value, new Set(['status', 'reason'])) && typeof value.reason === 'string';\n case 'action-required':\n return hasOnlyKeys(value, new Set(['status', 'action'])) && isRequiredAction(value.action);\n case 'failed':\n return hasOnlyKeys(value, new Set(['status', 'error'])) && isDeploymentFailure(value.error);\n default:\n return false;\n }\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export declare function isTargetChange(value: unknown): boolean;
2
+ //# sourceMappingURL=targetChange.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"targetChange.d.ts","sourceRoot":"","sources":["../../../../src/project/history/validation/targetChange.ts"],"names":[],"mappings":"AAWA,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAUtD"}
@@ -0,0 +1,19 @@
1
+ import { DEPLOYMENT_CHANGE_KINDS, DEPLOYMENT_CHANGE_REASONS, } from '../../../domain/DeploymentTargetChange';
2
+ import { hasOnlyKeys } from '../../io/hasOnlyKeys';
3
+ import { isRecord } from '../../io/isRecord';
4
+ import { isObservedTarget } from './observedTarget';
5
+ import { isTargetId } from './shared';
6
+ const CHANGE_KEYS = new Set(['target', 'kind', 'desired', 'current', 'reason']);
7
+ export function isTargetChange(value) {
8
+ return (isRecord(value) &&
9
+ hasOnlyKeys(value, CHANGE_KEYS) &&
10
+ isTargetId(value.target) &&
11
+ DEPLOYMENT_CHANGE_KINDS.some((kind) => kind === value.kind) &&
12
+ isNullableObservedTarget(value.desired) &&
13
+ isNullableObservedTarget(value.current) &&
14
+ DEPLOYMENT_CHANGE_REASONS.some((reason) => reason === value.reason));
15
+ }
16
+ function isNullableObservedTarget(value) {
17
+ return value === null || isObservedTarget(value);
18
+ }
19
+ //# sourceMappingURL=targetChange.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"targetChange.js","sourceRoot":"","sources":["../../../../src/project/history/validation/targetChange.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,yBAAyB,GAC1B,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;AAEhF,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,OAAO,CACL,QAAQ,CAAC,KAAK,CAAC;QACf,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC;QAC/B,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC;QACxB,uBAAuB,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC;QAC3D,wBAAwB,CAAC,KAAK,CAAC,OAAO,CAAC;QACvC,wBAAwB,CAAC,KAAK,CAAC,OAAO,CAAC;QACvC,yBAAyB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,CAAC,CACpE,CAAC;AACJ,CAAC;AAED,SAAS,wBAAwB,CAAC,KAAc;IAC9C,OAAO,KAAK,KAAK,IAAI,IAAI,gBAAgB,CAAC,KAAK,CAAC,CAAC;AACnD,CAAC","sourcesContent":["import {\n DEPLOYMENT_CHANGE_KINDS,\n DEPLOYMENT_CHANGE_REASONS,\n} from '../../../domain/DeploymentTargetChange';\nimport { hasOnlyKeys } from '../../io/hasOnlyKeys';\nimport { isRecord } from '../../io/isRecord';\nimport { isObservedTarget } from './observedTarget';\nimport { isTargetId } from './shared';\n\nconst CHANGE_KEYS = new Set(['target', 'kind', 'desired', 'current', 'reason']);\n\nexport function isTargetChange(value: unknown): boolean {\n return (\n isRecord(value) &&\n hasOnlyKeys(value, CHANGE_KEYS) &&\n isTargetId(value.target) &&\n DEPLOYMENT_CHANGE_KINDS.some((kind) => kind === value.kind) &&\n isNullableObservedTarget(value.desired) &&\n isNullableObservedTarget(value.current) &&\n DEPLOYMENT_CHANGE_REASONS.some((reason) => reason === value.reason)\n );\n}\n\nfunction isNullableObservedTarget(value: unknown): boolean {\n return value === null || isObservedTarget(value);\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export declare function isDeploymentVerification(value: unknown): boolean;
2
+ //# sourceMappingURL=verification.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verification.d.ts","sourceRoot":"","sources":["../../../../src/project/history/validation/verification.ts"],"names":[],"mappings":"AAMA,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAUhE"}
@@ -0,0 +1,23 @@
1
+ import { hasOnlyKeys } from '../../io/hasOnlyKeys';
2
+ import { isRecord } from '../../io/isRecord';
3
+ import { isNonEmptyString, isTargetId } from './shared';
4
+ const ISSUE_KEYS = new Set(['code', 'message', 'target', 'provider']);
5
+ export function isDeploymentVerification(value) {
6
+ if (!isRecord(value))
7
+ return false;
8
+ if (value.ok === true)
9
+ return hasOnlyKeys(value, new Set(['ok']));
10
+ return (value.ok === false &&
11
+ hasOnlyKeys(value, new Set(['ok', 'issues'])) &&
12
+ Array.isArray(value.issues) &&
13
+ value.issues.every(isVerificationIssue));
14
+ }
15
+ function isVerificationIssue(value) {
16
+ return (isRecord(value) &&
17
+ hasOnlyKeys(value, ISSUE_KEYS) &&
18
+ isNonEmptyString(value.code) &&
19
+ typeof value.message === 'string' &&
20
+ (value.target === undefined || isTargetId(value.target)) &&
21
+ (value.provider === undefined || isNonEmptyString(value.provider)));
22
+ }
23
+ //# sourceMappingURL=verification.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verification.js","sourceRoot":"","sources":["../../../../src/project/history/validation/verification.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,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;AAEtE,MAAM,UAAU,wBAAwB,CAAC,KAAc;IACrD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACnC,IAAI,KAAK,CAAC,EAAE,KAAK,IAAI;QAAE,OAAO,WAAW,CAAC,KAAK,EAAE,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAElE,OAAO,CACL,KAAK,CAAC,EAAE,KAAK,KAAK;QAClB,WAAW,CAAC,KAAK,EAAE,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC7C,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;QAC3B,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,CACxC,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAc;IACzC,OAAO,CACL,QAAQ,CAAC,KAAK,CAAC;QACf,WAAW,CAAC,KAAK,EAAE,UAAU,CAAC;QAC9B,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 ISSUE_KEYS = new Set(['code', 'message', 'target', 'provider']);\n\nexport function isDeploymentVerification(value: unknown): boolean {\n if (!isRecord(value)) return false;\n if (value.ok === true) return hasOnlyKeys(value, new Set(['ok']));\n\n return (\n value.ok === false &&\n hasOnlyKeys(value, new Set(['ok', 'issues'])) &&\n Array.isArray(value.issues) &&\n value.issues.every(isVerificationIssue)\n );\n}\n\nfunction isVerificationIssue(value: unknown): boolean {\n return (\n isRecord(value) &&\n hasOnlyKeys(value, ISSUE_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"]}
@@ -0,0 +1,12 @@
1
+ export { PROJECT_DEPLOYMENT_HISTORY_SCHEMA_VERSION } from './history/historySchemaVersion';
2
+ export { listProjectDeploymentHistory } from './history/listProjectDeploymentHistory';
3
+ export type { ProjectDeploymentHistoryRecord } from './history/ProjectDeploymentHistoryRecord';
4
+ export { readProjectDeploymentHistory } from './history/readProjectDeploymentHistory';
5
+ export { recordProjectDeploymentHistory } from './history/recordProjectDeploymentHistory';
6
+ export type { ProjectDeploymentPaths } from './ProjectDeploymentPaths';
7
+ export { readProjectDeploymentConfig } from './readProjectDeploymentConfig';
8
+ export type { ResolvedDeployProject } from './ResolvedDeployProject';
9
+ export { resolveDeployProject } from './resolveDeployProject';
10
+ export { resolveProjectDeploymentPaths } from './resolveProjectDeploymentPaths';
11
+ export { type ProjectDeploymentConfigUpdater, updateProjectDeploymentConfig, } from './updateProjectDeploymentConfig';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/project/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yCAAyC,EAAE,MAAM,gCAAgC,CAAC;AAC3F,OAAO,EAAE,4BAA4B,EAAE,MAAM,wCAAwC,CAAC;AACtF,YAAY,EAAE,8BAA8B,EAAE,MAAM,0CAA0C,CAAC;AAC/F,OAAO,EAAE,4BAA4B,EAAE,MAAM,wCAAwC,CAAC;AACtF,OAAO,EAAE,8BAA8B,EAAE,MAAM,0CAA0C,CAAC;AAC1F,YAAY,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAC5E,YAAY,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAChF,OAAO,EACL,KAAK,8BAA8B,EACnC,6BAA6B,GAC9B,MAAM,iCAAiC,CAAC"}
@@ -0,0 +1,9 @@
1
+ export { PROJECT_DEPLOYMENT_HISTORY_SCHEMA_VERSION } from './history/historySchemaVersion';
2
+ export { listProjectDeploymentHistory } from './history/listProjectDeploymentHistory';
3
+ export { readProjectDeploymentHistory } from './history/readProjectDeploymentHistory';
4
+ export { recordProjectDeploymentHistory } from './history/recordProjectDeploymentHistory';
5
+ export { readProjectDeploymentConfig } from './readProjectDeploymentConfig';
6
+ export { resolveDeployProject } from './resolveDeployProject';
7
+ export { resolveProjectDeploymentPaths } from './resolveProjectDeploymentPaths';
8
+ export { updateProjectDeploymentConfig, } from './updateProjectDeploymentConfig';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/project/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yCAAyC,EAAE,MAAM,gCAAgC,CAAC;AAC3F,OAAO,EAAE,4BAA4B,EAAE,MAAM,wCAAwC,CAAC;AAEtF,OAAO,EAAE,4BAA4B,EAAE,MAAM,wCAAwC,CAAC;AACtF,OAAO,EAAE,8BAA8B,EAAE,MAAM,0CAA0C,CAAC;AAE1F,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAE5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAChF,OAAO,EAEL,6BAA6B,GAC9B,MAAM,iCAAiC,CAAC","sourcesContent":["export { PROJECT_DEPLOYMENT_HISTORY_SCHEMA_VERSION } from './history/historySchemaVersion';\nexport { listProjectDeploymentHistory } from './history/listProjectDeploymentHistory';\nexport type { ProjectDeploymentHistoryRecord } from './history/ProjectDeploymentHistoryRecord';\nexport { readProjectDeploymentHistory } from './history/readProjectDeploymentHistory';\nexport { recordProjectDeploymentHistory } from './history/recordProjectDeploymentHistory';\nexport type { ProjectDeploymentPaths } from './ProjectDeploymentPaths';\nexport { readProjectDeploymentConfig } from './readProjectDeploymentConfig';\nexport type { ResolvedDeployProject } from './ResolvedDeployProject';\nexport { resolveDeployProject } from './resolveDeployProject';\nexport { resolveProjectDeploymentPaths } from './resolveProjectDeploymentPaths';\nexport {\n type ProjectDeploymentConfigUpdater,\n updateProjectDeploymentConfig,\n} from './updateProjectDeploymentConfig';\n"]}
@@ -0,0 +1,2 @@
1
+ export declare function assertContainedWritePath(projectRoot: string, targetPath: string): Promise<void>;
2
+ //# sourceMappingURL=assertContainedPath.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assertContainedPath.d.ts","sourceRoot":"","sources":["../../../src/project/io/assertContainedPath.ts"],"names":[],"mappings":"AAGA,wBAAsB,wBAAwB,CAC5C,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAYf"}
@@ -0,0 +1,33 @@
1
+ import { promises as fs } from 'node:fs';
2
+ import path from 'node:path';
3
+ export async function assertContainedWritePath(projectRoot, targetPath) {
4
+ const root = await fs.realpath(projectRoot);
5
+ const resolvedTarget = path.resolve(targetPath);
6
+ if (!isContained(root, resolvedTarget)) {
7
+ throw new Error(`Deploy project path escapes project root: ${targetPath}`);
8
+ }
9
+ const existingParent = await findExistingParent(path.dirname(resolvedTarget));
10
+ const realParent = await fs.realpath(existingParent);
11
+ if (!isContained(root, realParent)) {
12
+ throw new Error(`Deploy project path resolves outside project root: ${targetPath}`);
13
+ }
14
+ }
15
+ function isContained(root, candidate) {
16
+ return candidate === root || candidate.startsWith(`${root}${path.sep}`);
17
+ }
18
+ async function findExistingParent(startPath) {
19
+ let current = startPath;
20
+ for (;;) {
21
+ try {
22
+ await fs.access(current);
23
+ return current;
24
+ }
25
+ catch {
26
+ const parent = path.dirname(current);
27
+ if (parent === current)
28
+ throw new Error(`No existing parent for path: ${startPath}`);
29
+ current = parent;
30
+ }
31
+ }
32
+ }
33
+ //# sourceMappingURL=assertContainedPath.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assertContainedPath.js","sourceRoot":"","sources":["../../../src/project/io/assertContainedPath.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,WAAmB,EACnB,UAAkB;IAElB,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC5C,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAChD,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,6CAA6C,UAAU,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC;IAC9E,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IACrD,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,sDAAsD,UAAU,EAAE,CAAC,CAAC;IACtF,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,IAAY,EAAE,SAAiB;IAClD,OAAO,SAAS,KAAK,IAAI,IAAI,SAAS,CAAC,UAAU,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;AAC1E,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,SAAiB;IACjD,IAAI,OAAO,GAAG,SAAS,CAAC;IAExB,SAAS,CAAC;QACR,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACzB,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACrC,IAAI,MAAM,KAAK,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,SAAS,EAAE,CAAC,CAAC;YACrF,OAAO,GAAG,MAAM,CAAC;QACnB,CAAC;IACH,CAAC;AACH,CAAC","sourcesContent":["import { promises as fs } from 'node:fs';\nimport path from 'node:path';\n\nexport async function assertContainedWritePath(\n projectRoot: string,\n targetPath: string,\n): Promise<void> {\n const root = await fs.realpath(projectRoot);\n const resolvedTarget = path.resolve(targetPath);\n if (!isContained(root, resolvedTarget)) {\n throw new Error(`Deploy project path escapes project root: ${targetPath}`);\n }\n\n const existingParent = await findExistingParent(path.dirname(resolvedTarget));\n const realParent = await fs.realpath(existingParent);\n if (!isContained(root, realParent)) {\n throw new Error(`Deploy project path resolves outside project root: ${targetPath}`);\n }\n}\n\nfunction isContained(root: string, candidate: string): boolean {\n return candidate === root || candidate.startsWith(`${root}${path.sep}`);\n}\n\nasync function findExistingParent(startPath: string): Promise<string> {\n let current = startPath;\n\n for (;;) {\n try {\n await fs.access(current);\n return current;\n } catch {\n const parent = path.dirname(current);\n if (parent === current) throw new Error(`No existing parent for path: ${startPath}`);\n current = parent;\n }\n }\n}\n"]}
@@ -0,0 +1,3 @@
1
+ export declare function isSafeSegment(value: string): boolean;
2
+ export declare function assertSafeSegment(value: string, label: string): void;
3
+ //# sourceMappingURL=assertSafeSegment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assertSafeSegment.d.ts","sourceRoot":"","sources":["../../../src/project/io/assertSafeSegment.ts"],"names":[],"mappings":"AAEA,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CASpD;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAIpE"}
@@ -0,0 +1,15 @@
1
+ import path from 'node:path';
2
+ export function isSafeSegment(value) {
3
+ return (value.trim().length > 0 &&
4
+ value !== '.' &&
5
+ value !== '..' &&
6
+ !path.isAbsolute(value) &&
7
+ !value.includes('/') &&
8
+ !value.includes('\\'));
9
+ }
10
+ export function assertSafeSegment(value, label) {
11
+ if (!isSafeSegment(value)) {
12
+ throw new Error(`Invalid ${label}: expected one safe path segment.`);
13
+ }
14
+ }
15
+ //# sourceMappingURL=assertSafeSegment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assertSafeSegment.js","sourceRoot":"","sources":["../../../src/project/io/assertSafeSegment.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,OAAO,CACL,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;QACvB,KAAK,KAAK,GAAG;QACb,KAAK,KAAK,IAAI;QACd,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;QACvB,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;QACpB,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CACtB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAa,EAAE,KAAa;IAC5D,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,WAAW,KAAK,mCAAmC,CAAC,CAAC;IACvE,CAAC;AACH,CAAC","sourcesContent":["import path from 'node:path';\n\nexport function isSafeSegment(value: string): boolean {\n return (\n value.trim().length > 0 &&\n value !== '.' &&\n value !== '..' &&\n !path.isAbsolute(value) &&\n !value.includes('/') &&\n !value.includes('\\\\')\n );\n}\n\nexport function assertSafeSegment(value: string, label: string): void {\n if (!isSafeSegment(value)) {\n throw new Error(`Invalid ${label}: expected one safe path segment.`);\n }\n}\n"]}
@@ -0,0 +1,6 @@
1
+ export declare function atomicWriteFile(options: {
2
+ readonly projectRoot: string;
3
+ readonly filePath: string;
4
+ readonly data: string | Uint8Array;
5
+ }): Promise<void>;
6
+ //# sourceMappingURL=atomicWriteFile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"atomicWriteFile.d.ts","sourceRoot":"","sources":["../../../src/project/io/atomicWriteFile.ts"],"names":[],"mappings":"AAOA,wBAAsB,eAAe,CAAC,OAAO,EAAE;IAC7C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC;CACpC,GAAG,OAAO,CAAC,IAAI,CAAC,CAYhB"}
@@ -0,0 +1,18 @@
1
+ import { promises as fs } from 'node:fs';
2
+ import path from 'node:path';
3
+ import { assertContainedWritePath } from './assertContainedPath';
4
+ let writeSequence = 0;
5
+ export async function atomicWriteFile(options) {
6
+ await assertContainedWritePath(options.projectRoot, options.filePath);
7
+ await fs.mkdir(path.dirname(options.filePath), { recursive: true });
8
+ const tempPath = `${options.filePath}.tmp-${process.pid}-${writeSequence++}`;
9
+ try {
10
+ await fs.writeFile(tempPath, options.data, { flag: 'wx' });
11
+ await fs.rename(tempPath, options.filePath);
12
+ }
13
+ catch (error) {
14
+ await fs.rm(tempPath, { force: true });
15
+ throw error;
16
+ }
17
+ }
18
+ //# sourceMappingURL=atomicWriteFile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"atomicWriteFile.js","sourceRoot":"","sources":["../../../src/project/io/atomicWriteFile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAEjE,IAAI,aAAa,GAAG,CAAC,CAAC;AAEtB,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAIrC;IACC,MAAM,wBAAwB,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IACtE,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEpE,MAAM,QAAQ,GAAG,GAAG,OAAO,CAAC,QAAQ,QAAQ,OAAO,CAAC,GAAG,IAAI,aAAa,EAAE,EAAE,CAAC;IAC7E,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3D,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACvC,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC","sourcesContent":["import { promises as fs } from 'node:fs';\nimport path from 'node:path';\n\nimport { assertContainedWritePath } from './assertContainedPath';\n\nlet writeSequence = 0;\n\nexport async function atomicWriteFile(options: {\n readonly projectRoot: string;\n readonly filePath: string;\n readonly data: string | Uint8Array;\n}): Promise<void> {\n await assertContainedWritePath(options.projectRoot, options.filePath);\n await fs.mkdir(path.dirname(options.filePath), { recursive: true });\n\n const tempPath = `${options.filePath}.tmp-${process.pid}-${writeSequence++}`;\n try {\n await fs.writeFile(tempPath, options.data, { flag: 'wx' });\n await fs.rename(tempPath, options.filePath);\n } catch (error) {\n await fs.rm(tempPath, { force: true });\n throw error;\n }\n}\n"]}
@@ -0,0 +1,6 @@
1
+ export declare function atomicWriteJson(options: {
2
+ readonly projectRoot: string;
3
+ readonly filePath: string;
4
+ readonly value: unknown;
5
+ }): Promise<void>;
6
+ //# sourceMappingURL=atomicWriteJson.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"atomicWriteJson.d.ts","sourceRoot":"","sources":["../../../src/project/io/atomicWriteJson.ts"],"names":[],"mappings":"AAEA,wBAAsB,eAAe,CAAC,OAAO,EAAE;IAC7C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB,GAAG,OAAO,CAAC,IAAI,CAAC,CAOhB"}
@@ -0,0 +1,10 @@
1
+ import { atomicWriteFile } from './atomicWriteFile';
2
+ export async function atomicWriteJson(options) {
3
+ const data = `${JSON.stringify(options.value, null, 2)}\n`;
4
+ await atomicWriteFile({
5
+ projectRoot: options.projectRoot,
6
+ filePath: options.filePath,
7
+ data,
8
+ });
9
+ }
10
+ //# sourceMappingURL=atomicWriteJson.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"atomicWriteJson.js","sourceRoot":"","sources":["../../../src/project/io/atomicWriteJson.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAIrC;IACC,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;IAC3D,MAAM,eAAe,CAAC;QACpB,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,IAAI;KACL,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { atomicWriteFile } from './atomicWriteFile';\n\nexport async function atomicWriteJson(options: {\n readonly projectRoot: string;\n readonly filePath: string;\n readonly value: unknown;\n}): Promise<void> {\n const data = `${JSON.stringify(options.value, null, 2)}\\n`;\n await atomicWriteFile({\n projectRoot: options.projectRoot,\n filePath: options.filePath,\n data,\n });\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export declare function hasOnlyKeys(value: Record<string, unknown>, allowed: ReadonlySet<string>): boolean;
2
+ //# sourceMappingURL=hasOnlyKeys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hasOnlyKeys.d.ts","sourceRoot":"","sources":["../../../src/project/io/hasOnlyKeys.ts"],"names":[],"mappings":"AAAA,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,OAAO,CAEjG"}
@@ -0,0 +1,4 @@
1
+ export function hasOnlyKeys(value, allowed) {
2
+ return Object.keys(value).every((key) => allowed.has(key));
3
+ }
4
+ //# sourceMappingURL=hasOnlyKeys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hasOnlyKeys.js","sourceRoot":"","sources":["../../../src/project/io/hasOnlyKeys.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,WAAW,CAAC,KAA8B,EAAE,OAA4B;IACtF,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AAC7D,CAAC","sourcesContent":["export function hasOnlyKeys(value: Record<string, unknown>, allowed: ReadonlySet<string>): boolean {\n return Object.keys(value).every((key) => allowed.has(key));\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export declare function isMissingPathError(error: unknown): boolean;
2
+ //# sourceMappingURL=isMissingPathError.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isMissingPathError.d.ts","sourceRoot":"","sources":["../../../src/project/io/isMissingPathError.ts"],"names":[],"mappings":"AAAA,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAE1D"}
@@ -0,0 +1,4 @@
1
+ export function isMissingPathError(error) {
2
+ return error instanceof Error && 'code' in error && error.code === 'ENOENT';
3
+ }
4
+ //# sourceMappingURL=isMissingPathError.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isMissingPathError.js","sourceRoot":"","sources":["../../../src/project/io/isMissingPathError.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,OAAO,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC;AAC9E,CAAC","sourcesContent":["export function isMissingPathError(error: unknown): boolean {\n return error instanceof Error && 'code' in error && error.code === 'ENOENT';\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export declare function isRecord(value: unknown): value is Record<string, unknown>;
2
+ //# sourceMappingURL=isRecord.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isRecord.d.ts","sourceRoot":"","sources":["../../../src/project/io/isRecord.ts"],"names":[],"mappings":"AAAA,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE"}
@@ -0,0 +1,4 @@
1
+ export function isRecord(value) {
2
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
3
+ }
4
+ //# sourceMappingURL=isRecord.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isRecord.js","sourceRoot":"","sources":["../../../src/project/io/isRecord.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC","sourcesContent":["export function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export declare function normalizeProjectRoot(projectRoot: string): Promise<string>;
2
+ //# sourceMappingURL=normalizeProjectRoot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalizeProjectRoot.d.ts","sourceRoot":"","sources":["../../../src/project/io/normalizeProjectRoot.ts"],"names":[],"mappings":"AAGA,wBAAsB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgB/E"}
@@ -0,0 +1,18 @@
1
+ import { promises as fs } from 'node:fs';
2
+ import path from 'node:path';
3
+ export async function normalizeProjectRoot(projectRoot) {
4
+ const requestedRoot = path.resolve(projectRoot);
5
+ let resolvedRoot;
6
+ try {
7
+ resolvedRoot = await fs.realpath(requestedRoot);
8
+ }
9
+ catch (error) {
10
+ throw new Error(`Deploy project root does not exist: ${requestedRoot}`, { cause: error });
11
+ }
12
+ const stat = await fs.stat(resolvedRoot);
13
+ if (!stat.isDirectory()) {
14
+ throw new Error(`Deploy project root is not a directory: ${resolvedRoot}`);
15
+ }
16
+ return resolvedRoot;
17
+ }
18
+ //# sourceMappingURL=normalizeProjectRoot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalizeProjectRoot.js","sourceRoot":"","sources":["../../../src/project/io/normalizeProjectRoot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,WAAmB;IAC5D,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAChD,IAAI,YAAoB,CAAC;IAEzB,IAAI,CAAC;QACH,YAAY,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IAClD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,uCAAuC,aAAa,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACzC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,2CAA2C,YAAY,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC","sourcesContent":["import { promises as fs } from 'node:fs';\nimport path from 'node:path';\n\nexport async function normalizeProjectRoot(projectRoot: string): Promise<string> {\n const requestedRoot = path.resolve(projectRoot);\n let resolvedRoot: string;\n\n try {\n resolvedRoot = await fs.realpath(requestedRoot);\n } catch (error) {\n throw new Error(`Deploy project root does not exist: ${requestedRoot}`, { cause: error });\n }\n\n const stat = await fs.stat(resolvedRoot);\n if (!stat.isDirectory()) {\n throw new Error(`Deploy project root is not a directory: ${resolvedRoot}`);\n }\n\n return resolvedRoot;\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export declare function readJsonFile(filePath: string, label: string): Promise<unknown>;
2
+ //# sourceMappingURL=readJsonFile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readJsonFile.d.ts","sourceRoot":"","sources":["../../../src/project/io/readJsonFile.ts"],"names":[],"mappings":"AAEA,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQpF"}
@@ -0,0 +1,11 @@
1
+ import { promises as fs } from 'node:fs';
2
+ export async function readJsonFile(filePath, label) {
3
+ const raw = await fs.readFile(filePath, 'utf8');
4
+ try {
5
+ return JSON.parse(raw);
6
+ }
7
+ catch (error) {
8
+ throw new Error(`${label} is not valid JSON: ${filePath}`, { cause: error });
9
+ }
10
+ }
11
+ //# sourceMappingURL=readJsonFile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readJsonFile.js","sourceRoot":"","sources":["../../../src/project/io/readJsonFile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AAEzC,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAgB,EAAE,KAAa;IAChE,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAEhD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAY,CAAC;IACpC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,uBAAuB,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/E,CAAC;AACH,CAAC","sourcesContent":["import { promises as fs } from 'node:fs';\n\nexport async function readJsonFile(filePath: string, label: string): Promise<unknown> {\n const raw = await fs.readFile(filePath, 'utf8');\n\n try {\n return JSON.parse(raw) as unknown;\n } catch (error) {\n throw new Error(`${label} is not valid JSON: ${filePath}`, { cause: error });\n }\n}\n"]}
@@ -0,0 +1,6 @@
1
+ import { type AppManifest } from '@ankhorage/contracts';
2
+ export declare function readProjectManifest(projectRoot: string): Promise<{
3
+ readonly manifest: AppManifest;
4
+ readonly manifestPath: string;
5
+ }>;
6
+ //# sourceMappingURL=readProjectManifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readProjectManifest.d.ts","sourceRoot":"","sources":["../../../src/project/io/readProjectManifest.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,WAAW,EAAoB,MAAM,sBAAsB,CAAC;AAI1E,wBAAsB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;IACtE,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B,CAAC,CAgBD"}
@@ -0,0 +1,20 @@
1
+ import { promises as fs } from 'node:fs';
2
+ import path from 'node:path';
3
+ import { parseAppManifest } from '@ankhorage/contracts';
4
+ import { readJsonFile } from './readJsonFile';
5
+ export async function readProjectManifest(projectRoot) {
6
+ const manifestPath = path.join(projectRoot, 'ankh.config.json');
7
+ try {
8
+ await fs.access(manifestPath);
9
+ }
10
+ catch (error) {
11
+ throw new Error(`Deploy project manifest does not exist: ${manifestPath}`, { cause: error });
12
+ }
13
+ const parsed = await readJsonFile(manifestPath, 'Deploy project manifest');
14
+ const result = parseAppManifest(parsed);
15
+ if (!result.ok) {
16
+ throw new Error(`Deploy project manifest has an invalid canonical shape: ${manifestPath}`);
17
+ }
18
+ return { manifest: result.manifest, manifestPath };
19
+ }
20
+ //# sourceMappingURL=readProjectManifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readProjectManifest.js","sourceRoot":"","sources":["../../../src/project/io/readProjectManifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAoB,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE1E,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,WAAmB;IAI3D,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;IAEhE,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAChC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,2CAA2C,YAAY,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/F,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,YAAY,EAAE,yBAAyB,CAAC,CAAC;IAC3E,MAAM,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACxC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,2DAA2D,YAAY,EAAE,CAAC,CAAC;IAC7F,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,YAAY,EAAE,CAAC;AACrD,CAAC","sourcesContent":["import { promises as fs } from 'node:fs';\nimport path from 'node:path';\n\nimport { type AppManifest, parseAppManifest } from '@ankhorage/contracts';\n\nimport { readJsonFile } from './readJsonFile';\n\nexport async function readProjectManifest(projectRoot: string): Promise<{\n readonly manifest: AppManifest;\n readonly manifestPath: string;\n}> {\n const manifestPath = path.join(projectRoot, 'ankh.config.json');\n\n try {\n await fs.access(manifestPath);\n } catch (error) {\n throw new Error(`Deploy project manifest does not exist: ${manifestPath}`, { cause: error });\n }\n\n const parsed = await readJsonFile(manifestPath, 'Deploy project manifest');\n const result = parseAppManifest(parsed);\n if (!result.ok) {\n throw new Error(`Deploy project manifest has an invalid canonical shape: ${manifestPath}`);\n }\n\n return { manifest: result.manifest, manifestPath };\n}\n"]}
@@ -0,0 +1,5 @@
1
+ import type { AppDeployManifest } from '@ankhorage/contracts/deploy';
2
+ export declare function readProjectDeploymentConfig(options: {
3
+ readonly projectRoot: string;
4
+ }): Promise<AppDeployManifest | null>;
5
+ //# sourceMappingURL=readProjectDeploymentConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readProjectDeploymentConfig.d.ts","sourceRoot":"","sources":["../../src/project/readProjectDeploymentConfig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAIrE,wBAAsB,2BAA2B,CAAC,OAAO,EAAE;IACzD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAGpC"}
@@ -0,0 +1,6 @@
1
+ import { resolveDeployProject } from './resolveDeployProject';
2
+ export async function readProjectDeploymentConfig(options) {
3
+ const project = await resolveDeployProject(options);
4
+ return project.deploy;
5
+ }
6
+ //# sourceMappingURL=readProjectDeploymentConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readProjectDeploymentConfig.js","sourceRoot":"","sources":["../../src/project/readProjectDeploymentConfig.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAAC,OAEjD;IACC,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,CAAC;IACpD,OAAO,OAAO,CAAC,MAAM,CAAC;AACxB,CAAC","sourcesContent":["import type { AppDeployManifest } from '@ankhorage/contracts/deploy';\n\nimport { resolveDeployProject } from './resolveDeployProject';\n\nexport async function readProjectDeploymentConfig(options: {\n readonly projectRoot: string;\n}): Promise<AppDeployManifest | null> {\n const project = await resolveDeployProject(options);\n return project.deploy;\n}\n"]}
@@ -0,0 +1,5 @@
1
+ import type { ResolvedDeployProject } from './ResolvedDeployProject';
2
+ export declare function resolveDeployProject(options: {
3
+ readonly projectRoot: string;
4
+ }): Promise<ResolvedDeployProject>;
5
+ //# sourceMappingURL=resolveDeployProject.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveDeployProject.d.ts","sourceRoot":"","sources":["../../src/project/resolveDeployProject.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAGrE,wBAAsB,oBAAoB,CAAC,OAAO,EAAE;IAClD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAWjC"}