@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.
- package/CHANGELOG.md +6 -0
- package/README.md +1 -1
- package/dist/project/ProjectDeploymentPaths.d.ts +17 -0
- package/dist/project/ProjectDeploymentPaths.d.ts.map +1 -0
- package/dist/project/ProjectDeploymentPaths.js +2 -0
- package/dist/project/ProjectDeploymentPaths.js.map +1 -0
- package/dist/project/ResolvedDeployProject.d.ts +11 -0
- package/dist/project/ResolvedDeployProject.d.ts.map +1 -0
- package/dist/project/ResolvedDeployProject.js +2 -0
- package/dist/project/ResolvedDeployProject.js.map +1 -0
- package/dist/project/history/ProjectDeploymentHistoryRecord.d.ts +14 -0
- package/dist/project/history/ProjectDeploymentHistoryRecord.d.ts.map +1 -0
- package/dist/project/history/ProjectDeploymentHistoryRecord.js +2 -0
- package/dist/project/history/ProjectDeploymentHistoryRecord.js.map +1 -0
- package/dist/project/history/historySchemaVersion.d.ts +2 -0
- package/dist/project/history/historySchemaVersion.d.ts.map +1 -0
- package/dist/project/history/historySchemaVersion.js +2 -0
- package/dist/project/history/historySchemaVersion.js.map +1 -0
- package/dist/project/history/listProjectDeploymentHistory.d.ts +5 -0
- package/dist/project/history/listProjectDeploymentHistory.d.ts.map +1 -0
- package/dist/project/history/listProjectDeploymentHistory.js +25 -0
- package/dist/project/history/listProjectDeploymentHistory.js.map +1 -0
- package/dist/project/history/parseProjectDeploymentHistoryRecord.d.ts +3 -0
- package/dist/project/history/parseProjectDeploymentHistoryRecord.d.ts.map +1 -0
- package/dist/project/history/parseProjectDeploymentHistoryRecord.js +40 -0
- package/dist/project/history/parseProjectDeploymentHistoryRecord.js.map +1 -0
- package/dist/project/history/readProjectDeploymentHistory.d.ts +6 -0
- package/dist/project/history/readProjectDeploymentHistory.d.ts.map +1 -0
- package/dist/project/history/readProjectDeploymentHistory.js +26 -0
- package/dist/project/history/readProjectDeploymentHistory.js.map +1 -0
- package/dist/project/history/recordProjectDeploymentHistory.d.ts +6 -0
- package/dist/project/history/recordProjectDeploymentHistory.d.ts.map +1 -0
- package/dist/project/history/recordProjectDeploymentHistory.js +40 -0
- package/dist/project/history/recordProjectDeploymentHistory.js.map +1 -0
- package/dist/project/history/validation/diagnostic.d.ts +2 -0
- package/dist/project/history/validation/diagnostic.d.ts.map +1 -0
- package/dist/project/history/validation/diagnostic.js +14 -0
- package/dist/project/history/validation/diagnostic.js.map +1 -0
- package/dist/project/history/validation/execution.d.ts +2 -0
- package/dist/project/history/validation/execution.d.ts.map +1 -0
- package/dist/project/history/validation/execution.js +40 -0
- package/dist/project/history/validation/execution.js.map +1 -0
- package/dist/project/history/validation/failure.d.ts +2 -0
- package/dist/project/history/validation/failure.d.ts.map +1 -0
- package/dist/project/history/validation/failure.js +13 -0
- package/dist/project/history/validation/failure.js.map +1 -0
- package/dist/project/history/validation/isIsoTimestamp.d.ts +2 -0
- package/dist/project/history/validation/isIsoTimestamp.d.ts.map +1 -0
- package/dist/project/history/validation/isIsoTimestamp.js +6 -0
- package/dist/project/history/validation/isIsoTimestamp.js.map +1 -0
- package/dist/project/history/validation/observedTarget.d.ts +2 -0
- package/dist/project/history/validation/observedTarget.d.ts.map +1 -0
- package/dist/project/history/validation/observedTarget.js +24 -0
- package/dist/project/history/validation/observedTarget.js.map +1 -0
- package/dist/project/history/validation/plan.d.ts +2 -0
- package/dist/project/history/validation/plan.d.ts.map +1 -0
- package/dist/project/history/validation/plan.js +18 -0
- package/dist/project/history/validation/plan.js.map +1 -0
- package/dist/project/history/validation/planStep.d.ts +2 -0
- package/dist/project/history/validation/planStep.d.ts.map +1 -0
- package/dist/project/history/validation/planStep.js +17 -0
- package/dist/project/history/validation/planStep.js.map +1 -0
- package/dist/project/history/validation/providerSelection.d.ts +2 -0
- package/dist/project/history/validation/providerSelection.d.ts.map +1 -0
- package/dist/project/history/validation/providerSelection.js +13 -0
- package/dist/project/history/validation/providerSelection.js.map +1 -0
- package/dist/project/history/validation/requiredAction.d.ts +2 -0
- package/dist/project/history/validation/requiredAction.d.ts.map +1 -0
- package/dist/project/history/validation/requiredAction.js +27 -0
- package/dist/project/history/validation/requiredAction.js.map +1 -0
- package/dist/project/history/validation/shared.d.ts +3 -0
- package/dist/project/history/validation/shared.d.ts.map +1 -0
- package/dist/project/history/validation/shared.js +8 -0
- package/dist/project/history/validation/shared.js.map +1 -0
- package/dist/project/history/validation/stepOutcome.d.ts +2 -0
- package/dist/project/history/validation/stepOutcome.d.ts.map +1 -0
- package/dist/project/history/validation/stepOutcome.js +21 -0
- package/dist/project/history/validation/stepOutcome.js.map +1 -0
- package/dist/project/history/validation/targetChange.d.ts +2 -0
- package/dist/project/history/validation/targetChange.d.ts.map +1 -0
- package/dist/project/history/validation/targetChange.js +19 -0
- package/dist/project/history/validation/targetChange.js.map +1 -0
- package/dist/project/history/validation/verification.d.ts +2 -0
- package/dist/project/history/validation/verification.d.ts.map +1 -0
- package/dist/project/history/validation/verification.js +23 -0
- package/dist/project/history/validation/verification.js.map +1 -0
- package/dist/project/index.d.ts +12 -0
- package/dist/project/index.d.ts.map +1 -0
- package/dist/project/index.js +9 -0
- package/dist/project/index.js.map +1 -0
- package/dist/project/io/assertContainedPath.d.ts +2 -0
- package/dist/project/io/assertContainedPath.d.ts.map +1 -0
- package/dist/project/io/assertContainedPath.js +33 -0
- package/dist/project/io/assertContainedPath.js.map +1 -0
- package/dist/project/io/assertSafeSegment.d.ts +3 -0
- package/dist/project/io/assertSafeSegment.d.ts.map +1 -0
- package/dist/project/io/assertSafeSegment.js +15 -0
- package/dist/project/io/assertSafeSegment.js.map +1 -0
- package/dist/project/io/atomicWriteFile.d.ts +6 -0
- package/dist/project/io/atomicWriteFile.d.ts.map +1 -0
- package/dist/project/io/atomicWriteFile.js +18 -0
- package/dist/project/io/atomicWriteFile.js.map +1 -0
- package/dist/project/io/atomicWriteJson.d.ts +6 -0
- package/dist/project/io/atomicWriteJson.d.ts.map +1 -0
- package/dist/project/io/atomicWriteJson.js +10 -0
- package/dist/project/io/atomicWriteJson.js.map +1 -0
- package/dist/project/io/hasOnlyKeys.d.ts +2 -0
- package/dist/project/io/hasOnlyKeys.d.ts.map +1 -0
- package/dist/project/io/hasOnlyKeys.js +4 -0
- package/dist/project/io/hasOnlyKeys.js.map +1 -0
- package/dist/project/io/isMissingPathError.d.ts +2 -0
- package/dist/project/io/isMissingPathError.d.ts.map +1 -0
- package/dist/project/io/isMissingPathError.js +4 -0
- package/dist/project/io/isMissingPathError.js.map +1 -0
- package/dist/project/io/isRecord.d.ts +2 -0
- package/dist/project/io/isRecord.d.ts.map +1 -0
- package/dist/project/io/isRecord.js +4 -0
- package/dist/project/io/isRecord.js.map +1 -0
- package/dist/project/io/normalizeProjectRoot.d.ts +2 -0
- package/dist/project/io/normalizeProjectRoot.d.ts.map +1 -0
- package/dist/project/io/normalizeProjectRoot.js +18 -0
- package/dist/project/io/normalizeProjectRoot.js.map +1 -0
- package/dist/project/io/readJsonFile.d.ts +2 -0
- package/dist/project/io/readJsonFile.d.ts.map +1 -0
- package/dist/project/io/readJsonFile.js +11 -0
- package/dist/project/io/readJsonFile.js.map +1 -0
- package/dist/project/io/readProjectManifest.d.ts +6 -0
- package/dist/project/io/readProjectManifest.d.ts.map +1 -0
- package/dist/project/io/readProjectManifest.js +20 -0
- package/dist/project/io/readProjectManifest.js.map +1 -0
- package/dist/project/readProjectDeploymentConfig.d.ts +5 -0
- package/dist/project/readProjectDeploymentConfig.d.ts.map +1 -0
- package/dist/project/readProjectDeploymentConfig.js +6 -0
- package/dist/project/readProjectDeploymentConfig.js.map +1 -0
- package/dist/project/resolveDeployProject.d.ts +5 -0
- package/dist/project/resolveDeployProject.d.ts.map +1 -0
- package/dist/project/resolveDeployProject.js +15 -0
- package/dist/project/resolveDeployProject.js.map +1 -0
- package/dist/project/resolveProjectDeploymentPaths.d.ts +3 -0
- package/dist/project/resolveProjectDeploymentPaths.d.ts.map +1 -0
- package/dist/project/resolveProjectDeploymentPaths.js +25 -0
- package/dist/project/resolveProjectDeploymentPaths.js.map +1 -0
- package/dist/project/updateProjectDeploymentConfig.d.ts +7 -0
- package/dist/project/updateProjectDeploymentConfig.d.ts.map +1 -0
- package/dist/project/updateProjectDeploymentConfig.js +23 -0
- package/dist/project/updateProjectDeploymentConfig.js.map +1 -0
- package/package.json +6 -1
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|