@ankhorage/deploy 0.1.0 → 0.3.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 +12 -0
- package/README.md +1 -1
- package/dist/domain/DeploymentAuthenticationState.d.ts +8 -0
- package/dist/domain/DeploymentAuthenticationState.d.ts.map +1 -0
- package/dist/domain/DeploymentAuthenticationState.js +2 -0
- package/dist/domain/DeploymentAuthenticationState.js.map +1 -0
- package/dist/domain/DeploymentCredentialReference.d.ts +6 -0
- package/dist/domain/DeploymentCredentialReference.d.ts.map +1 -0
- package/dist/domain/DeploymentCredentialReference.js +2 -0
- package/dist/domain/DeploymentCredentialReference.js.map +1 -0
- package/dist/domain/DeploymentProviderCapabilityState.d.ts +7 -0
- package/dist/domain/DeploymentProviderCapabilityState.d.ts.map +1 -0
- package/dist/domain/DeploymentProviderCapabilityState.js +2 -0
- package/dist/domain/DeploymentProviderCapabilityState.js.map +1 -0
- package/dist/domain/DeploymentProviderSetupAdapter.d.ts +7 -0
- package/dist/domain/DeploymentProviderSetupAdapter.d.ts.map +1 -0
- package/dist/domain/DeploymentProviderSetupAdapter.js +2 -0
- package/dist/domain/DeploymentProviderSetupAdapter.js.map +1 -0
- package/dist/domain/DeploymentProviderSetupContext.d.ts +9 -0
- package/dist/domain/DeploymentProviderSetupContext.d.ts.map +1 -0
- package/dist/domain/DeploymentProviderSetupContext.js +2 -0
- package/dist/domain/DeploymentProviderSetupContext.js.map +1 -0
- package/dist/domain/DeploymentProviderSetupInspection.d.ts +10 -0
- package/dist/domain/DeploymentProviderSetupInspection.d.ts.map +1 -0
- package/dist/domain/DeploymentProviderSetupInspection.js +2 -0
- package/dist/domain/DeploymentProviderSetupInspection.js.map +1 -0
- package/dist/domain/DeploymentProviderSetupInspectionResult.d.ts +10 -0
- package/dist/domain/DeploymentProviderSetupInspectionResult.d.ts.map +1 -0
- package/dist/domain/DeploymentProviderSetupInspectionResult.js +2 -0
- package/dist/domain/DeploymentProviderSetupInspectionResult.js.map +1 -0
- package/dist/domain/DeploymentProvisioningRequirement.d.ts +18 -0
- package/dist/domain/DeploymentProvisioningRequirement.d.ts.map +1 -0
- package/dist/domain/DeploymentProvisioningRequirement.js +2 -0
- package/dist/domain/DeploymentProvisioningRequirement.js.map +1 -0
- package/dist/domain/DeploymentSecretResolver.d.ts +4 -0
- package/dist/domain/DeploymentSecretResolver.d.ts.map +1 -0
- package/dist/domain/DeploymentSecretResolver.js +2 -0
- package/dist/domain/DeploymentSecretResolver.js.map +1 -0
- package/dist/engine/inspectDeploymentProviderSetup.d.ts +8 -0
- package/dist/engine/inspectDeploymentProviderSetup.d.ts.map +1 -0
- package/dist/engine/inspectDeploymentProviderSetup.js +21 -0
- package/dist/engine/inspectDeploymentProviderSetup.js.map +1 -0
- package/dist/engine/providerSetup/containsTrackedSecret.d.ts +2 -0
- package/dist/engine/providerSetup/containsTrackedSecret.d.ts.map +1 -0
- package/dist/engine/providerSetup/containsTrackedSecret.js +12 -0
- package/dist/engine/providerSetup/containsTrackedSecret.js.map +1 -0
- package/dist/engine/providerSetup/createProviderSetupContext.d.ts +4 -0
- package/dist/engine/providerSetup/createProviderSetupContext.d.ts.map +1 -0
- package/dist/engine/providerSetup/createProviderSetupContext.js +4 -0
- package/dist/engine/providerSetup/createProviderSetupContext.js.map +1 -0
- package/dist/engine/providerSetup/createProviderSetupFailure.d.ts +4 -0
- package/dist/engine/providerSetup/createProviderSetupFailure.d.ts.map +1 -0
- package/dist/engine/providerSetup/createProviderSetupFailure.js +10 -0
- package/dist/engine/providerSetup/createProviderSetupFailure.js.map +1 -0
- package/dist/engine/providerSetup/createTrackedSecretResolver.d.ts +7 -0
- package/dist/engine/providerSetup/createTrackedSecretResolver.d.ts.map +1 -0
- package/dist/engine/providerSetup/createTrackedSecretResolver.js +13 -0
- package/dist/engine/providerSetup/createTrackedSecretResolver.js.map +1 -0
- package/dist/engine/providerSetup/isAppDeployTargetId.d.ts +3 -0
- package/dist/engine/providerSetup/isAppDeployTargetId.d.ts.map +1 -0
- package/dist/engine/providerSetup/isAppDeployTargetId.js +5 -0
- package/dist/engine/providerSetup/isAppDeployTargetId.js.map +1 -0
- package/dist/engine/providerSetup/isNonEmptyString.d.ts +2 -0
- package/dist/engine/providerSetup/isNonEmptyString.d.ts.map +1 -0
- package/dist/engine/providerSetup/isNonEmptyString.js +4 -0
- package/dist/engine/providerSetup/isNonEmptyString.js.map +1 -0
- package/dist/engine/providerSetup/isRecord.d.ts +2 -0
- package/dist/engine/providerSetup/isRecord.d.ts.map +1 -0
- package/dist/engine/providerSetup/isRecord.js +4 -0
- package/dist/engine/providerSetup/isRecord.js.map +1 -0
- package/dist/engine/providerSetup/normalizeAuthenticationAction.d.ts +3 -0
- package/dist/engine/providerSetup/normalizeAuthenticationAction.d.ts.map +1 -0
- package/dist/engine/providerSetup/normalizeAuthenticationAction.js +21 -0
- package/dist/engine/providerSetup/normalizeAuthenticationAction.js.map +1 -0
- package/dist/engine/providerSetup/normalizeAuthenticationState.d.ts +3 -0
- package/dist/engine/providerSetup/normalizeAuthenticationState.d.ts.map +1 -0
- package/dist/engine/providerSetup/normalizeAuthenticationState.js +13 -0
- package/dist/engine/providerSetup/normalizeAuthenticationState.js.map +1 -0
- package/dist/engine/providerSetup/normalizeAutomatedProvisioningRequirement.d.ts +3 -0
- package/dist/engine/providerSetup/normalizeAutomatedProvisioningRequirement.d.ts.map +1 -0
- package/dist/engine/providerSetup/normalizeAutomatedProvisioningRequirement.js +23 -0
- package/dist/engine/providerSetup/normalizeAutomatedProvisioningRequirement.js.map +1 -0
- package/dist/engine/providerSetup/normalizeCredentialReferences.d.ts +3 -0
- package/dist/engine/providerSetup/normalizeCredentialReferences.d.ts.map +1 -0
- package/dist/engine/providerSetup/normalizeCredentialReferences.js +18 -0
- package/dist/engine/providerSetup/normalizeCredentialReferences.js.map +1 -0
- package/dist/engine/providerSetup/normalizeManualAction.d.ts +3 -0
- package/dist/engine/providerSetup/normalizeManualAction.d.ts.map +1 -0
- package/dist/engine/providerSetup/normalizeManualAction.js +23 -0
- package/dist/engine/providerSetup/normalizeManualAction.js.map +1 -0
- package/dist/engine/providerSetup/normalizeProviderCapabilityStates.d.ts +3 -0
- package/dist/engine/providerSetup/normalizeProviderCapabilityStates.d.ts.map +1 -0
- package/dist/engine/providerSetup/normalizeProviderCapabilityStates.js +31 -0
- package/dist/engine/providerSetup/normalizeProviderCapabilityStates.js.map +1 -0
- package/dist/engine/providerSetup/normalizeProviderSetupInspection.d.ts +10 -0
- package/dist/engine/providerSetup/normalizeProviderSetupInspection.d.ts.map +1 -0
- package/dist/engine/providerSetup/normalizeProviderSetupInspection.js +25 -0
- package/dist/engine/providerSetup/normalizeProviderSetupInspection.js.map +1 -0
- package/dist/engine/providerSetup/normalizeProvisioningRequirements.d.ts +3 -0
- package/dist/engine/providerSetup/normalizeProvisioningRequirements.d.ts.map +1 -0
- package/dist/engine/providerSetup/normalizeProvisioningRequirements.js +31 -0
- package/dist/engine/providerSetup/normalizeProvisioningRequirements.js.map +1 -0
- package/dist/engine/providerSetup/prepareProviderSetupInspection.d.ts +16 -0
- package/dist/engine/providerSetup/prepareProviderSetupInspection.d.ts.map +1 -0
- package/dist/engine/providerSetup/prepareProviderSetupInspection.js +32 -0
- package/dist/engine/providerSetup/prepareProviderSetupInspection.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -0
- package/dist/index.js.map +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":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { normalizeProjectRoot } from './io/normalizeProjectRoot';
|
|
2
|
+
import { readProjectManifest } from './io/readProjectManifest';
|
|
3
|
+
import { resolveProjectDeploymentPaths } from './resolveProjectDeploymentPaths';
|
|
4
|
+
export async function resolveDeployProject(options) {
|
|
5
|
+
const projectRoot = await normalizeProjectRoot(options.projectRoot);
|
|
6
|
+
const { manifest, manifestPath } = await readProjectManifest(projectRoot);
|
|
7
|
+
return {
|
|
8
|
+
projectRoot,
|
|
9
|
+
manifestPath,
|
|
10
|
+
manifest,
|
|
11
|
+
deploy: manifest.deploy ?? null,
|
|
12
|
+
paths: resolveProjectDeploymentPaths(projectRoot),
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=resolveDeployProject.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveDeployProject.js","sourceRoot":"","sources":["../../src/project/resolveDeployProject.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,OAAO,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAEhF,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,OAE1C;IACC,MAAM,WAAW,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACpE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,MAAM,mBAAmB,CAAC,WAAW,CAAC,CAAC;IAE1E,OAAO;QACL,WAAW;QACX,YAAY;QACZ,QAAQ;QACR,MAAM,EAAE,QAAQ,CAAC,MAAM,IAAI,IAAI;QAC/B,KAAK,EAAE,6BAA6B,CAAC,WAAW,CAAC;KAClD,CAAC;AACJ,CAAC","sourcesContent":["import { normalizeProjectRoot } from './io/normalizeProjectRoot';\nimport { readProjectManifest } from './io/readProjectManifest';\nimport type { ResolvedDeployProject } from './ResolvedDeployProject';\nimport { resolveProjectDeploymentPaths } from './resolveProjectDeploymentPaths';\n\nexport async function resolveDeployProject(options: {\n readonly projectRoot: string;\n}): Promise<ResolvedDeployProject> {\n const projectRoot = await normalizeProjectRoot(options.projectRoot);\n const { manifest, manifestPath } = await readProjectManifest(projectRoot);\n\n return {\n projectRoot,\n manifestPath,\n manifest,\n deploy: manifest.deploy ?? null,\n paths: resolveProjectDeploymentPaths(projectRoot),\n };\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveProjectDeploymentPaths.d.ts","sourceRoot":"","sources":["../../src/project/resolveProjectDeploymentPaths.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAEvE,wBAAgB,6BAA6B,CAAC,WAAW,EAAE,MAAM,GAAG,sBAAsB,CAuBzF"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
export function resolveProjectDeploymentPaths(projectRoot) {
|
|
3
|
+
const root = path.resolve(projectRoot);
|
|
4
|
+
const authoredRoot = path.join(root, 'deploy');
|
|
5
|
+
const assetsRoot = path.join(authoredRoot, 'assets');
|
|
6
|
+
const androidAssetsRoot = path.join(assetsRoot, 'android');
|
|
7
|
+
const iosAssetsRoot = path.join(assetsRoot, 'ios');
|
|
8
|
+
return {
|
|
9
|
+
projectRoot: root,
|
|
10
|
+
manifestPath: path.join(root, 'ankh.config.json'),
|
|
11
|
+
authoredRoot,
|
|
12
|
+
listingRoot: path.join(authoredRoot, 'listing'),
|
|
13
|
+
assetsRoot,
|
|
14
|
+
sharedAssetsRoot: path.join(assetsRoot, 'shared'),
|
|
15
|
+
androidAssetsRoot,
|
|
16
|
+
androidScreenshotsRoot: path.join(androidAssetsRoot, 'screenshots'),
|
|
17
|
+
iosAssetsRoot,
|
|
18
|
+
iosScreenshotsRoot: path.join(iosAssetsRoot, 'screenshots'),
|
|
19
|
+
monetizationRoot: path.join(authoredRoot, 'monetization'),
|
|
20
|
+
productsPath: path.join(authoredRoot, 'monetization', 'products.json'),
|
|
21
|
+
releasePath: path.join(authoredRoot, 'release.json'),
|
|
22
|
+
historyRoot: path.join(root, '.ankh', 'deployments'),
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=resolveProjectDeploymentPaths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveProjectDeploymentPaths.js","sourceRoot":"","sources":["../../src/project/resolveProjectDeploymentPaths.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B,MAAM,UAAU,6BAA6B,CAAC,WAAmB;IAC/D,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACvC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IACrD,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IAC3D,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAEnD,OAAO;QACL,WAAW,EAAE,IAAI;QACjB,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,kBAAkB,CAAC;QACjD,YAAY;QACZ,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC;QAC/C,UAAU;QACV,gBAAgB,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC;QACjD,iBAAiB;QACjB,sBAAsB,EAAE,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,aAAa,CAAC;QACnE,aAAa;QACb,kBAAkB,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,aAAa,CAAC;QAC3D,gBAAgB,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,cAAc,CAAC;QACzD,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,cAAc,EAAE,eAAe,CAAC;QACtE,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,cAAc,CAAC;QACpD,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,aAAa,CAAC;KACrD,CAAC;AACJ,CAAC","sourcesContent":["import path from 'node:path';\n\nimport type { ProjectDeploymentPaths } from './ProjectDeploymentPaths';\n\nexport function resolveProjectDeploymentPaths(projectRoot: string): ProjectDeploymentPaths {\n const root = path.resolve(projectRoot);\n const authoredRoot = path.join(root, 'deploy');\n const assetsRoot = path.join(authoredRoot, 'assets');\n const androidAssetsRoot = path.join(assetsRoot, 'android');\n const iosAssetsRoot = path.join(assetsRoot, 'ios');\n\n return {\n projectRoot: root,\n manifestPath: path.join(root, 'ankh.config.json'),\n authoredRoot,\n listingRoot: path.join(authoredRoot, 'listing'),\n assetsRoot,\n sharedAssetsRoot: path.join(assetsRoot, 'shared'),\n androidAssetsRoot,\n androidScreenshotsRoot: path.join(androidAssetsRoot, 'screenshots'),\n iosAssetsRoot,\n iosScreenshotsRoot: path.join(iosAssetsRoot, 'screenshots'),\n monetizationRoot: path.join(authoredRoot, 'monetization'),\n productsPath: path.join(authoredRoot, 'monetization', 'products.json'),\n releasePath: path.join(authoredRoot, 'release.json'),\n historyRoot: path.join(root, '.ankh', 'deployments'),\n };\n}\n"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type AppDeployManifest } from '@ankhorage/contracts/deploy';
|
|
2
|
+
export type ProjectDeploymentConfigUpdater = (current: AppDeployManifest | null) => AppDeployManifest | null;
|
|
3
|
+
export declare function updateProjectDeploymentConfig(options: {
|
|
4
|
+
readonly projectRoot: string;
|
|
5
|
+
readonly update: ProjectDeploymentConfigUpdater;
|
|
6
|
+
}): Promise<AppDeployManifest | null>;
|
|
7
|
+
//# sourceMappingURL=updateProjectDeploymentConfig.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updateProjectDeploymentConfig.d.ts","sourceRoot":"","sources":["../../src/project/updateProjectDeploymentConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,iBAAiB,EAAuB,MAAM,6BAA6B,CAAC;AAK1F,MAAM,MAAM,8BAA8B,GAAG,CAC3C,OAAO,EAAE,iBAAiB,GAAG,IAAI,KAC9B,iBAAiB,GAAG,IAAI,CAAC;AAE9B,wBAAsB,6BAA6B,CAAC,OAAO,EAAE;IAC3D,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,8BAA8B,CAAC;CACjD,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAoBpC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { isAppDeployManifest } from '@ankhorage/contracts/deploy';
|
|
2
|
+
import { atomicWriteJson } from './io/atomicWriteJson';
|
|
3
|
+
import { resolveDeployProject } from './resolveDeployProject';
|
|
4
|
+
export async function updateProjectDeploymentConfig(options) {
|
|
5
|
+
const project = await resolveDeployProject({ projectRoot: options.projectRoot });
|
|
6
|
+
const current = project.deploy === null ? null : structuredClone(project.deploy);
|
|
7
|
+
const next = options.update(current);
|
|
8
|
+
if (next !== null && !isAppDeployManifest(next)) {
|
|
9
|
+
throw new Error('Deployment config update returned an invalid canonical AppDeployManifest.');
|
|
10
|
+
}
|
|
11
|
+
const nextManifest = { ...project.manifest };
|
|
12
|
+
if (next === null)
|
|
13
|
+
delete nextManifest.deploy;
|
|
14
|
+
else
|
|
15
|
+
nextManifest.deploy = next;
|
|
16
|
+
await atomicWriteJson({
|
|
17
|
+
projectRoot: project.projectRoot,
|
|
18
|
+
filePath: project.manifestPath,
|
|
19
|
+
value: nextManifest,
|
|
20
|
+
});
|
|
21
|
+
return next;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=updateProjectDeploymentConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updateProjectDeploymentConfig.js","sourceRoot":"","sources":["../../src/project/updateProjectDeploymentConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAE1F,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAM9D,MAAM,CAAC,KAAK,UAAU,6BAA6B,CAAC,OAGnD;IACC,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IACjF,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACjF,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAErC,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC,CAAC;IAC/F,CAAC;IAED,MAAM,YAAY,GAAG,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAC7C,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,YAAY,CAAC,MAAM,CAAC;;QACzC,YAAY,CAAC,MAAM,GAAG,IAAI,CAAC;IAEhC,MAAM,eAAe,CAAC;QACpB,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,QAAQ,EAAE,OAAO,CAAC,YAAY;QAC9B,KAAK,EAAE,YAAY;KACpB,CAAC,CAAC;IAEH,OAAO,IAAI,CAAC;AACd,CAAC","sourcesContent":["import { type AppDeployManifest, isAppDeployManifest } from '@ankhorage/contracts/deploy';\n\nimport { atomicWriteJson } from './io/atomicWriteJson';\nimport { resolveDeployProject } from './resolveDeployProject';\n\nexport type ProjectDeploymentConfigUpdater = (\n current: AppDeployManifest | null,\n) => AppDeployManifest | null;\n\nexport async function updateProjectDeploymentConfig(options: {\n readonly projectRoot: string;\n readonly update: ProjectDeploymentConfigUpdater;\n}): Promise<AppDeployManifest | null> {\n const project = await resolveDeployProject({ projectRoot: options.projectRoot });\n const current = project.deploy === null ? null : structuredClone(project.deploy);\n const next = options.update(current);\n\n if (next !== null && !isAppDeployManifest(next)) {\n throw new Error('Deployment config update returned an invalid canonical AppDeployManifest.');\n }\n\n const nextManifest = { ...project.manifest };\n if (next === null) delete nextManifest.deploy;\n else nextManifest.deploy = next;\n\n await atomicWriteJson({\n projectRoot: project.projectRoot,\n filePath: project.manifestPath,\n value: nextManifest,\n });\n\n return next;\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ankhorage/deploy",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Declarative deployment engine for Expo apps across web, iOS, and Android — build, provision, publish, and manage releases from one configuration.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"publishConfig": {
|
|
@@ -37,6 +37,11 @@
|
|
|
37
37
|
"import": "./dist/index.js",
|
|
38
38
|
"default": "./dist/index.js"
|
|
39
39
|
},
|
|
40
|
+
"./project": {
|
|
41
|
+
"types": "./dist/project/index.d.ts",
|
|
42
|
+
"import": "./dist/project/index.js",
|
|
43
|
+
"default": "./dist/project/index.js"
|
|
44
|
+
},
|
|
40
45
|
"./package.json": "./package.json"
|
|
41
46
|
},
|
|
42
47
|
"files": [
|