@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.
Files changed (255) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +1 -1
  3. package/dist/domain/DeploymentAuthenticationState.d.ts +8 -0
  4. package/dist/domain/DeploymentAuthenticationState.d.ts.map +1 -0
  5. package/dist/domain/DeploymentAuthenticationState.js +2 -0
  6. package/dist/domain/DeploymentAuthenticationState.js.map +1 -0
  7. package/dist/domain/DeploymentCredentialReference.d.ts +6 -0
  8. package/dist/domain/DeploymentCredentialReference.d.ts.map +1 -0
  9. package/dist/domain/DeploymentCredentialReference.js +2 -0
  10. package/dist/domain/DeploymentCredentialReference.js.map +1 -0
  11. package/dist/domain/DeploymentProviderCapabilityState.d.ts +7 -0
  12. package/dist/domain/DeploymentProviderCapabilityState.d.ts.map +1 -0
  13. package/dist/domain/DeploymentProviderCapabilityState.js +2 -0
  14. package/dist/domain/DeploymentProviderCapabilityState.js.map +1 -0
  15. package/dist/domain/DeploymentProviderSetupAdapter.d.ts +7 -0
  16. package/dist/domain/DeploymentProviderSetupAdapter.d.ts.map +1 -0
  17. package/dist/domain/DeploymentProviderSetupAdapter.js +2 -0
  18. package/dist/domain/DeploymentProviderSetupAdapter.js.map +1 -0
  19. package/dist/domain/DeploymentProviderSetupContext.d.ts +9 -0
  20. package/dist/domain/DeploymentProviderSetupContext.d.ts.map +1 -0
  21. package/dist/domain/DeploymentProviderSetupContext.js +2 -0
  22. package/dist/domain/DeploymentProviderSetupContext.js.map +1 -0
  23. package/dist/domain/DeploymentProviderSetupInspection.d.ts +10 -0
  24. package/dist/domain/DeploymentProviderSetupInspection.d.ts.map +1 -0
  25. package/dist/domain/DeploymentProviderSetupInspection.js +2 -0
  26. package/dist/domain/DeploymentProviderSetupInspection.js.map +1 -0
  27. package/dist/domain/DeploymentProviderSetupInspectionResult.d.ts +10 -0
  28. package/dist/domain/DeploymentProviderSetupInspectionResult.d.ts.map +1 -0
  29. package/dist/domain/DeploymentProviderSetupInspectionResult.js +2 -0
  30. package/dist/domain/DeploymentProviderSetupInspectionResult.js.map +1 -0
  31. package/dist/domain/DeploymentProvisioningRequirement.d.ts +18 -0
  32. package/dist/domain/DeploymentProvisioningRequirement.d.ts.map +1 -0
  33. package/dist/domain/DeploymentProvisioningRequirement.js +2 -0
  34. package/dist/domain/DeploymentProvisioningRequirement.js.map +1 -0
  35. package/dist/domain/DeploymentSecretResolver.d.ts +4 -0
  36. package/dist/domain/DeploymentSecretResolver.d.ts.map +1 -0
  37. package/dist/domain/DeploymentSecretResolver.js +2 -0
  38. package/dist/domain/DeploymentSecretResolver.js.map +1 -0
  39. package/dist/engine/inspectDeploymentProviderSetup.d.ts +8 -0
  40. package/dist/engine/inspectDeploymentProviderSetup.d.ts.map +1 -0
  41. package/dist/engine/inspectDeploymentProviderSetup.js +21 -0
  42. package/dist/engine/inspectDeploymentProviderSetup.js.map +1 -0
  43. package/dist/engine/providerSetup/containsTrackedSecret.d.ts +2 -0
  44. package/dist/engine/providerSetup/containsTrackedSecret.d.ts.map +1 -0
  45. package/dist/engine/providerSetup/containsTrackedSecret.js +12 -0
  46. package/dist/engine/providerSetup/containsTrackedSecret.js.map +1 -0
  47. package/dist/engine/providerSetup/createProviderSetupContext.d.ts +4 -0
  48. package/dist/engine/providerSetup/createProviderSetupContext.d.ts.map +1 -0
  49. package/dist/engine/providerSetup/createProviderSetupContext.js +4 -0
  50. package/dist/engine/providerSetup/createProviderSetupContext.js.map +1 -0
  51. package/dist/engine/providerSetup/createProviderSetupFailure.d.ts +4 -0
  52. package/dist/engine/providerSetup/createProviderSetupFailure.d.ts.map +1 -0
  53. package/dist/engine/providerSetup/createProviderSetupFailure.js +10 -0
  54. package/dist/engine/providerSetup/createProviderSetupFailure.js.map +1 -0
  55. package/dist/engine/providerSetup/createTrackedSecretResolver.d.ts +7 -0
  56. package/dist/engine/providerSetup/createTrackedSecretResolver.d.ts.map +1 -0
  57. package/dist/engine/providerSetup/createTrackedSecretResolver.js +13 -0
  58. package/dist/engine/providerSetup/createTrackedSecretResolver.js.map +1 -0
  59. package/dist/engine/providerSetup/isAppDeployTargetId.d.ts +3 -0
  60. package/dist/engine/providerSetup/isAppDeployTargetId.d.ts.map +1 -0
  61. package/dist/engine/providerSetup/isAppDeployTargetId.js +5 -0
  62. package/dist/engine/providerSetup/isAppDeployTargetId.js.map +1 -0
  63. package/dist/engine/providerSetup/isNonEmptyString.d.ts +2 -0
  64. package/dist/engine/providerSetup/isNonEmptyString.d.ts.map +1 -0
  65. package/dist/engine/providerSetup/isNonEmptyString.js +4 -0
  66. package/dist/engine/providerSetup/isNonEmptyString.js.map +1 -0
  67. package/dist/engine/providerSetup/isRecord.d.ts +2 -0
  68. package/dist/engine/providerSetup/isRecord.d.ts.map +1 -0
  69. package/dist/engine/providerSetup/isRecord.js +4 -0
  70. package/dist/engine/providerSetup/isRecord.js.map +1 -0
  71. package/dist/engine/providerSetup/normalizeAuthenticationAction.d.ts +3 -0
  72. package/dist/engine/providerSetup/normalizeAuthenticationAction.d.ts.map +1 -0
  73. package/dist/engine/providerSetup/normalizeAuthenticationAction.js +21 -0
  74. package/dist/engine/providerSetup/normalizeAuthenticationAction.js.map +1 -0
  75. package/dist/engine/providerSetup/normalizeAuthenticationState.d.ts +3 -0
  76. package/dist/engine/providerSetup/normalizeAuthenticationState.d.ts.map +1 -0
  77. package/dist/engine/providerSetup/normalizeAuthenticationState.js +13 -0
  78. package/dist/engine/providerSetup/normalizeAuthenticationState.js.map +1 -0
  79. package/dist/engine/providerSetup/normalizeAutomatedProvisioningRequirement.d.ts +3 -0
  80. package/dist/engine/providerSetup/normalizeAutomatedProvisioningRequirement.d.ts.map +1 -0
  81. package/dist/engine/providerSetup/normalizeAutomatedProvisioningRequirement.js +23 -0
  82. package/dist/engine/providerSetup/normalizeAutomatedProvisioningRequirement.js.map +1 -0
  83. package/dist/engine/providerSetup/normalizeCredentialReferences.d.ts +3 -0
  84. package/dist/engine/providerSetup/normalizeCredentialReferences.d.ts.map +1 -0
  85. package/dist/engine/providerSetup/normalizeCredentialReferences.js +18 -0
  86. package/dist/engine/providerSetup/normalizeCredentialReferences.js.map +1 -0
  87. package/dist/engine/providerSetup/normalizeManualAction.d.ts +3 -0
  88. package/dist/engine/providerSetup/normalizeManualAction.d.ts.map +1 -0
  89. package/dist/engine/providerSetup/normalizeManualAction.js +23 -0
  90. package/dist/engine/providerSetup/normalizeManualAction.js.map +1 -0
  91. package/dist/engine/providerSetup/normalizeProviderCapabilityStates.d.ts +3 -0
  92. package/dist/engine/providerSetup/normalizeProviderCapabilityStates.d.ts.map +1 -0
  93. package/dist/engine/providerSetup/normalizeProviderCapabilityStates.js +31 -0
  94. package/dist/engine/providerSetup/normalizeProviderCapabilityStates.js.map +1 -0
  95. package/dist/engine/providerSetup/normalizeProviderSetupInspection.d.ts +10 -0
  96. package/dist/engine/providerSetup/normalizeProviderSetupInspection.d.ts.map +1 -0
  97. package/dist/engine/providerSetup/normalizeProviderSetupInspection.js +25 -0
  98. package/dist/engine/providerSetup/normalizeProviderSetupInspection.js.map +1 -0
  99. package/dist/engine/providerSetup/normalizeProvisioningRequirements.d.ts +3 -0
  100. package/dist/engine/providerSetup/normalizeProvisioningRequirements.d.ts.map +1 -0
  101. package/dist/engine/providerSetup/normalizeProvisioningRequirements.js +31 -0
  102. package/dist/engine/providerSetup/normalizeProvisioningRequirements.js.map +1 -0
  103. package/dist/engine/providerSetup/prepareProviderSetupInspection.d.ts +16 -0
  104. package/dist/engine/providerSetup/prepareProviderSetupInspection.d.ts.map +1 -0
  105. package/dist/engine/providerSetup/prepareProviderSetupInspection.js +32 -0
  106. package/dist/engine/providerSetup/prepareProviderSetupInspection.js.map +1 -0
  107. package/dist/index.d.ts +10 -0
  108. package/dist/index.d.ts.map +1 -1
  109. package/dist/index.js +10 -0
  110. package/dist/index.js.map +1 -1
  111. package/dist/project/ProjectDeploymentPaths.d.ts +17 -0
  112. package/dist/project/ProjectDeploymentPaths.d.ts.map +1 -0
  113. package/dist/project/ProjectDeploymentPaths.js +2 -0
  114. package/dist/project/ProjectDeploymentPaths.js.map +1 -0
  115. package/dist/project/ResolvedDeployProject.d.ts +11 -0
  116. package/dist/project/ResolvedDeployProject.d.ts.map +1 -0
  117. package/dist/project/ResolvedDeployProject.js +2 -0
  118. package/dist/project/ResolvedDeployProject.js.map +1 -0
  119. package/dist/project/history/ProjectDeploymentHistoryRecord.d.ts +14 -0
  120. package/dist/project/history/ProjectDeploymentHistoryRecord.d.ts.map +1 -0
  121. package/dist/project/history/ProjectDeploymentHistoryRecord.js +2 -0
  122. package/dist/project/history/ProjectDeploymentHistoryRecord.js.map +1 -0
  123. package/dist/project/history/historySchemaVersion.d.ts +2 -0
  124. package/dist/project/history/historySchemaVersion.d.ts.map +1 -0
  125. package/dist/project/history/historySchemaVersion.js +2 -0
  126. package/dist/project/history/historySchemaVersion.js.map +1 -0
  127. package/dist/project/history/listProjectDeploymentHistory.d.ts +5 -0
  128. package/dist/project/history/listProjectDeploymentHistory.d.ts.map +1 -0
  129. package/dist/project/history/listProjectDeploymentHistory.js +25 -0
  130. package/dist/project/history/listProjectDeploymentHistory.js.map +1 -0
  131. package/dist/project/history/parseProjectDeploymentHistoryRecord.d.ts +3 -0
  132. package/dist/project/history/parseProjectDeploymentHistoryRecord.d.ts.map +1 -0
  133. package/dist/project/history/parseProjectDeploymentHistoryRecord.js +40 -0
  134. package/dist/project/history/parseProjectDeploymentHistoryRecord.js.map +1 -0
  135. package/dist/project/history/readProjectDeploymentHistory.d.ts +6 -0
  136. package/dist/project/history/readProjectDeploymentHistory.d.ts.map +1 -0
  137. package/dist/project/history/readProjectDeploymentHistory.js +26 -0
  138. package/dist/project/history/readProjectDeploymentHistory.js.map +1 -0
  139. package/dist/project/history/recordProjectDeploymentHistory.d.ts +6 -0
  140. package/dist/project/history/recordProjectDeploymentHistory.d.ts.map +1 -0
  141. package/dist/project/history/recordProjectDeploymentHistory.js +40 -0
  142. package/dist/project/history/recordProjectDeploymentHistory.js.map +1 -0
  143. package/dist/project/history/validation/diagnostic.d.ts +2 -0
  144. package/dist/project/history/validation/diagnostic.d.ts.map +1 -0
  145. package/dist/project/history/validation/diagnostic.js +14 -0
  146. package/dist/project/history/validation/diagnostic.js.map +1 -0
  147. package/dist/project/history/validation/execution.d.ts +2 -0
  148. package/dist/project/history/validation/execution.d.ts.map +1 -0
  149. package/dist/project/history/validation/execution.js +40 -0
  150. package/dist/project/history/validation/execution.js.map +1 -0
  151. package/dist/project/history/validation/failure.d.ts +2 -0
  152. package/dist/project/history/validation/failure.d.ts.map +1 -0
  153. package/dist/project/history/validation/failure.js +13 -0
  154. package/dist/project/history/validation/failure.js.map +1 -0
  155. package/dist/project/history/validation/isIsoTimestamp.d.ts +2 -0
  156. package/dist/project/history/validation/isIsoTimestamp.d.ts.map +1 -0
  157. package/dist/project/history/validation/isIsoTimestamp.js +6 -0
  158. package/dist/project/history/validation/isIsoTimestamp.js.map +1 -0
  159. package/dist/project/history/validation/observedTarget.d.ts +2 -0
  160. package/dist/project/history/validation/observedTarget.d.ts.map +1 -0
  161. package/dist/project/history/validation/observedTarget.js +24 -0
  162. package/dist/project/history/validation/observedTarget.js.map +1 -0
  163. package/dist/project/history/validation/plan.d.ts +2 -0
  164. package/dist/project/history/validation/plan.d.ts.map +1 -0
  165. package/dist/project/history/validation/plan.js +18 -0
  166. package/dist/project/history/validation/plan.js.map +1 -0
  167. package/dist/project/history/validation/planStep.d.ts +2 -0
  168. package/dist/project/history/validation/planStep.d.ts.map +1 -0
  169. package/dist/project/history/validation/planStep.js +17 -0
  170. package/dist/project/history/validation/planStep.js.map +1 -0
  171. package/dist/project/history/validation/providerSelection.d.ts +2 -0
  172. package/dist/project/history/validation/providerSelection.d.ts.map +1 -0
  173. package/dist/project/history/validation/providerSelection.js +13 -0
  174. package/dist/project/history/validation/providerSelection.js.map +1 -0
  175. package/dist/project/history/validation/requiredAction.d.ts +2 -0
  176. package/dist/project/history/validation/requiredAction.d.ts.map +1 -0
  177. package/dist/project/history/validation/requiredAction.js +27 -0
  178. package/dist/project/history/validation/requiredAction.js.map +1 -0
  179. package/dist/project/history/validation/shared.d.ts +3 -0
  180. package/dist/project/history/validation/shared.d.ts.map +1 -0
  181. package/dist/project/history/validation/shared.js +8 -0
  182. package/dist/project/history/validation/shared.js.map +1 -0
  183. package/dist/project/history/validation/stepOutcome.d.ts +2 -0
  184. package/dist/project/history/validation/stepOutcome.d.ts.map +1 -0
  185. package/dist/project/history/validation/stepOutcome.js +21 -0
  186. package/dist/project/history/validation/stepOutcome.js.map +1 -0
  187. package/dist/project/history/validation/targetChange.d.ts +2 -0
  188. package/dist/project/history/validation/targetChange.d.ts.map +1 -0
  189. package/dist/project/history/validation/targetChange.js +19 -0
  190. package/dist/project/history/validation/targetChange.js.map +1 -0
  191. package/dist/project/history/validation/verification.d.ts +2 -0
  192. package/dist/project/history/validation/verification.d.ts.map +1 -0
  193. package/dist/project/history/validation/verification.js +23 -0
  194. package/dist/project/history/validation/verification.js.map +1 -0
  195. package/dist/project/index.d.ts +12 -0
  196. package/dist/project/index.d.ts.map +1 -0
  197. package/dist/project/index.js +9 -0
  198. package/dist/project/index.js.map +1 -0
  199. package/dist/project/io/assertContainedPath.d.ts +2 -0
  200. package/dist/project/io/assertContainedPath.d.ts.map +1 -0
  201. package/dist/project/io/assertContainedPath.js +33 -0
  202. package/dist/project/io/assertContainedPath.js.map +1 -0
  203. package/dist/project/io/assertSafeSegment.d.ts +3 -0
  204. package/dist/project/io/assertSafeSegment.d.ts.map +1 -0
  205. package/dist/project/io/assertSafeSegment.js +15 -0
  206. package/dist/project/io/assertSafeSegment.js.map +1 -0
  207. package/dist/project/io/atomicWriteFile.d.ts +6 -0
  208. package/dist/project/io/atomicWriteFile.d.ts.map +1 -0
  209. package/dist/project/io/atomicWriteFile.js +18 -0
  210. package/dist/project/io/atomicWriteFile.js.map +1 -0
  211. package/dist/project/io/atomicWriteJson.d.ts +6 -0
  212. package/dist/project/io/atomicWriteJson.d.ts.map +1 -0
  213. package/dist/project/io/atomicWriteJson.js +10 -0
  214. package/dist/project/io/atomicWriteJson.js.map +1 -0
  215. package/dist/project/io/hasOnlyKeys.d.ts +2 -0
  216. package/dist/project/io/hasOnlyKeys.d.ts.map +1 -0
  217. package/dist/project/io/hasOnlyKeys.js +4 -0
  218. package/dist/project/io/hasOnlyKeys.js.map +1 -0
  219. package/dist/project/io/isMissingPathError.d.ts +2 -0
  220. package/dist/project/io/isMissingPathError.d.ts.map +1 -0
  221. package/dist/project/io/isMissingPathError.js +4 -0
  222. package/dist/project/io/isMissingPathError.js.map +1 -0
  223. package/dist/project/io/isRecord.d.ts +2 -0
  224. package/dist/project/io/isRecord.d.ts.map +1 -0
  225. package/dist/project/io/isRecord.js +4 -0
  226. package/dist/project/io/isRecord.js.map +1 -0
  227. package/dist/project/io/normalizeProjectRoot.d.ts +2 -0
  228. package/dist/project/io/normalizeProjectRoot.d.ts.map +1 -0
  229. package/dist/project/io/normalizeProjectRoot.js +18 -0
  230. package/dist/project/io/normalizeProjectRoot.js.map +1 -0
  231. package/dist/project/io/readJsonFile.d.ts +2 -0
  232. package/dist/project/io/readJsonFile.d.ts.map +1 -0
  233. package/dist/project/io/readJsonFile.js +11 -0
  234. package/dist/project/io/readJsonFile.js.map +1 -0
  235. package/dist/project/io/readProjectManifest.d.ts +6 -0
  236. package/dist/project/io/readProjectManifest.d.ts.map +1 -0
  237. package/dist/project/io/readProjectManifest.js +20 -0
  238. package/dist/project/io/readProjectManifest.js.map +1 -0
  239. package/dist/project/readProjectDeploymentConfig.d.ts +5 -0
  240. package/dist/project/readProjectDeploymentConfig.d.ts.map +1 -0
  241. package/dist/project/readProjectDeploymentConfig.js +6 -0
  242. package/dist/project/readProjectDeploymentConfig.js.map +1 -0
  243. package/dist/project/resolveDeployProject.d.ts +5 -0
  244. package/dist/project/resolveDeployProject.d.ts.map +1 -0
  245. package/dist/project/resolveDeployProject.js +15 -0
  246. package/dist/project/resolveDeployProject.js.map +1 -0
  247. package/dist/project/resolveProjectDeploymentPaths.d.ts +3 -0
  248. package/dist/project/resolveProjectDeploymentPaths.d.ts.map +1 -0
  249. package/dist/project/resolveProjectDeploymentPaths.js +25 -0
  250. package/dist/project/resolveProjectDeploymentPaths.js.map +1 -0
  251. package/dist/project/updateProjectDeploymentConfig.d.ts +7 -0
  252. package/dist/project/updateProjectDeploymentConfig.d.ts.map +1 -0
  253. package/dist/project/updateProjectDeploymentConfig.js +23 -0
  254. package/dist/project/updateProjectDeploymentConfig.js.map +1 -0
  255. 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,2 @@
1
+ export declare function assertContainedWritePath(projectRoot: string, targetPath: string): Promise<void>;
2
+ //# sourceMappingURL=assertContainedPath.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assertContainedPath.d.ts","sourceRoot":"","sources":["../../../src/project/io/assertContainedPath.ts"],"names":[],"mappings":"AAGA,wBAAsB,wBAAwB,CAC5C,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAYf"}
@@ -0,0 +1,33 @@
1
+ import { promises as fs } from 'node:fs';
2
+ import path from 'node:path';
3
+ export async function assertContainedWritePath(projectRoot, targetPath) {
4
+ const root = await fs.realpath(projectRoot);
5
+ const resolvedTarget = path.resolve(targetPath);
6
+ if (!isContained(root, resolvedTarget)) {
7
+ throw new Error(`Deploy project path escapes project root: ${targetPath}`);
8
+ }
9
+ const existingParent = await findExistingParent(path.dirname(resolvedTarget));
10
+ const realParent = await fs.realpath(existingParent);
11
+ if (!isContained(root, realParent)) {
12
+ throw new Error(`Deploy project path resolves outside project root: ${targetPath}`);
13
+ }
14
+ }
15
+ function isContained(root, candidate) {
16
+ return candidate === root || candidate.startsWith(`${root}${path.sep}`);
17
+ }
18
+ async function findExistingParent(startPath) {
19
+ let current = startPath;
20
+ for (;;) {
21
+ try {
22
+ await fs.access(current);
23
+ return current;
24
+ }
25
+ catch {
26
+ const parent = path.dirname(current);
27
+ if (parent === current)
28
+ throw new Error(`No existing parent for path: ${startPath}`);
29
+ current = parent;
30
+ }
31
+ }
32
+ }
33
+ //# sourceMappingURL=assertContainedPath.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assertContainedPath.js","sourceRoot":"","sources":["../../../src/project/io/assertContainedPath.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,WAAmB,EACnB,UAAkB;IAElB,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC5C,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAChD,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,6CAA6C,UAAU,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC;IAC9E,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IACrD,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,sDAAsD,UAAU,EAAE,CAAC,CAAC;IACtF,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,IAAY,EAAE,SAAiB;IAClD,OAAO,SAAS,KAAK,IAAI,IAAI,SAAS,CAAC,UAAU,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;AAC1E,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,SAAiB;IACjD,IAAI,OAAO,GAAG,SAAS,CAAC;IAExB,SAAS,CAAC;QACR,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACzB,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACrC,IAAI,MAAM,KAAK,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,SAAS,EAAE,CAAC,CAAC;YACrF,OAAO,GAAG,MAAM,CAAC;QACnB,CAAC;IACH,CAAC;AACH,CAAC","sourcesContent":["import { promises as fs } from 'node:fs';\nimport path from 'node:path';\n\nexport async function assertContainedWritePath(\n projectRoot: string,\n targetPath: string,\n): Promise<void> {\n const root = await fs.realpath(projectRoot);\n const resolvedTarget = path.resolve(targetPath);\n if (!isContained(root, resolvedTarget)) {\n throw new Error(`Deploy project path escapes project root: ${targetPath}`);\n }\n\n const existingParent = await findExistingParent(path.dirname(resolvedTarget));\n const realParent = await fs.realpath(existingParent);\n if (!isContained(root, realParent)) {\n throw new Error(`Deploy project path resolves outside project root: ${targetPath}`);\n }\n}\n\nfunction isContained(root: string, candidate: string): boolean {\n return candidate === root || candidate.startsWith(`${root}${path.sep}`);\n}\n\nasync function findExistingParent(startPath: string): Promise<string> {\n let current = startPath;\n\n for (;;) {\n try {\n await fs.access(current);\n return current;\n } catch {\n const parent = path.dirname(current);\n if (parent === current) throw new Error(`No existing parent for path: ${startPath}`);\n current = parent;\n }\n }\n}\n"]}
@@ -0,0 +1,3 @@
1
+ export declare function isSafeSegment(value: string): boolean;
2
+ export declare function assertSafeSegment(value: string, label: string): void;
3
+ //# sourceMappingURL=assertSafeSegment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assertSafeSegment.d.ts","sourceRoot":"","sources":["../../../src/project/io/assertSafeSegment.ts"],"names":[],"mappings":"AAEA,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CASpD;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAIpE"}
@@ -0,0 +1,15 @@
1
+ import path from 'node:path';
2
+ export function isSafeSegment(value) {
3
+ return (value.trim().length > 0 &&
4
+ value !== '.' &&
5
+ value !== '..' &&
6
+ !path.isAbsolute(value) &&
7
+ !value.includes('/') &&
8
+ !value.includes('\\'));
9
+ }
10
+ export function assertSafeSegment(value, label) {
11
+ if (!isSafeSegment(value)) {
12
+ throw new Error(`Invalid ${label}: expected one safe path segment.`);
13
+ }
14
+ }
15
+ //# sourceMappingURL=assertSafeSegment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assertSafeSegment.js","sourceRoot":"","sources":["../../../src/project/io/assertSafeSegment.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,OAAO,CACL,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;QACvB,KAAK,KAAK,GAAG;QACb,KAAK,KAAK,IAAI;QACd,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;QACvB,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;QACpB,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CACtB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAa,EAAE,KAAa;IAC5D,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,WAAW,KAAK,mCAAmC,CAAC,CAAC;IACvE,CAAC;AACH,CAAC","sourcesContent":["import path from 'node:path';\n\nexport function isSafeSegment(value: string): boolean {\n return (\n value.trim().length > 0 &&\n value !== '.' &&\n value !== '..' &&\n !path.isAbsolute(value) &&\n !value.includes('/') &&\n !value.includes('\\\\')\n );\n}\n\nexport function assertSafeSegment(value: string, label: string): void {\n if (!isSafeSegment(value)) {\n throw new Error(`Invalid ${label}: expected one safe path segment.`);\n }\n}\n"]}
@@ -0,0 +1,6 @@
1
+ export declare function atomicWriteFile(options: {
2
+ readonly projectRoot: string;
3
+ readonly filePath: string;
4
+ readonly data: string | Uint8Array;
5
+ }): Promise<void>;
6
+ //# sourceMappingURL=atomicWriteFile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"atomicWriteFile.d.ts","sourceRoot":"","sources":["../../../src/project/io/atomicWriteFile.ts"],"names":[],"mappings":"AAOA,wBAAsB,eAAe,CAAC,OAAO,EAAE;IAC7C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC;CACpC,GAAG,OAAO,CAAC,IAAI,CAAC,CAYhB"}
@@ -0,0 +1,18 @@
1
+ import { promises as fs } from 'node:fs';
2
+ import path from 'node:path';
3
+ import { assertContainedWritePath } from './assertContainedPath';
4
+ let writeSequence = 0;
5
+ export async function atomicWriteFile(options) {
6
+ await assertContainedWritePath(options.projectRoot, options.filePath);
7
+ await fs.mkdir(path.dirname(options.filePath), { recursive: true });
8
+ const tempPath = `${options.filePath}.tmp-${process.pid}-${writeSequence++}`;
9
+ try {
10
+ await fs.writeFile(tempPath, options.data, { flag: 'wx' });
11
+ await fs.rename(tempPath, options.filePath);
12
+ }
13
+ catch (error) {
14
+ await fs.rm(tempPath, { force: true });
15
+ throw error;
16
+ }
17
+ }
18
+ //# sourceMappingURL=atomicWriteFile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"atomicWriteFile.js","sourceRoot":"","sources":["../../../src/project/io/atomicWriteFile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAEjE,IAAI,aAAa,GAAG,CAAC,CAAC;AAEtB,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAIrC;IACC,MAAM,wBAAwB,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IACtE,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEpE,MAAM,QAAQ,GAAG,GAAG,OAAO,CAAC,QAAQ,QAAQ,OAAO,CAAC,GAAG,IAAI,aAAa,EAAE,EAAE,CAAC;IAC7E,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3D,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACvC,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC","sourcesContent":["import { promises as fs } from 'node:fs';\nimport path from 'node:path';\n\nimport { assertContainedWritePath } from './assertContainedPath';\n\nlet writeSequence = 0;\n\nexport async function atomicWriteFile(options: {\n readonly projectRoot: string;\n readonly filePath: string;\n readonly data: string | Uint8Array;\n}): Promise<void> {\n await assertContainedWritePath(options.projectRoot, options.filePath);\n await fs.mkdir(path.dirname(options.filePath), { recursive: true });\n\n const tempPath = `${options.filePath}.tmp-${process.pid}-${writeSequence++}`;\n try {\n await fs.writeFile(tempPath, options.data, { flag: 'wx' });\n await fs.rename(tempPath, options.filePath);\n } catch (error) {\n await fs.rm(tempPath, { force: true });\n throw error;\n }\n}\n"]}
@@ -0,0 +1,6 @@
1
+ export declare function atomicWriteJson(options: {
2
+ readonly projectRoot: string;
3
+ readonly filePath: string;
4
+ readonly value: unknown;
5
+ }): Promise<void>;
6
+ //# sourceMappingURL=atomicWriteJson.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"atomicWriteJson.d.ts","sourceRoot":"","sources":["../../../src/project/io/atomicWriteJson.ts"],"names":[],"mappings":"AAEA,wBAAsB,eAAe,CAAC,OAAO,EAAE;IAC7C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB,GAAG,OAAO,CAAC,IAAI,CAAC,CAOhB"}
@@ -0,0 +1,10 @@
1
+ import { atomicWriteFile } from './atomicWriteFile';
2
+ export async function atomicWriteJson(options) {
3
+ const data = `${JSON.stringify(options.value, null, 2)}\n`;
4
+ await atomicWriteFile({
5
+ projectRoot: options.projectRoot,
6
+ filePath: options.filePath,
7
+ data,
8
+ });
9
+ }
10
+ //# sourceMappingURL=atomicWriteJson.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"atomicWriteJson.js","sourceRoot":"","sources":["../../../src/project/io/atomicWriteJson.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAIrC;IACC,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;IAC3D,MAAM,eAAe,CAAC;QACpB,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,IAAI;KACL,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { atomicWriteFile } from './atomicWriteFile';\n\nexport async function atomicWriteJson(options: {\n readonly projectRoot: string;\n readonly filePath: string;\n readonly value: unknown;\n}): Promise<void> {\n const data = `${JSON.stringify(options.value, null, 2)}\\n`;\n await atomicWriteFile({\n projectRoot: options.projectRoot,\n filePath: options.filePath,\n data,\n });\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export declare function hasOnlyKeys(value: Record<string, unknown>, allowed: ReadonlySet<string>): boolean;
2
+ //# sourceMappingURL=hasOnlyKeys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hasOnlyKeys.d.ts","sourceRoot":"","sources":["../../../src/project/io/hasOnlyKeys.ts"],"names":[],"mappings":"AAAA,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,OAAO,CAEjG"}
@@ -0,0 +1,4 @@
1
+ export function hasOnlyKeys(value, allowed) {
2
+ return Object.keys(value).every((key) => allowed.has(key));
3
+ }
4
+ //# sourceMappingURL=hasOnlyKeys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hasOnlyKeys.js","sourceRoot":"","sources":["../../../src/project/io/hasOnlyKeys.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,WAAW,CAAC,KAA8B,EAAE,OAA4B;IACtF,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AAC7D,CAAC","sourcesContent":["export function hasOnlyKeys(value: Record<string, unknown>, allowed: ReadonlySet<string>): boolean {\n return Object.keys(value).every((key) => allowed.has(key));\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export declare function isMissingPathError(error: unknown): boolean;
2
+ //# sourceMappingURL=isMissingPathError.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isMissingPathError.d.ts","sourceRoot":"","sources":["../../../src/project/io/isMissingPathError.ts"],"names":[],"mappings":"AAAA,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAE1D"}
@@ -0,0 +1,4 @@
1
+ export function isMissingPathError(error) {
2
+ return error instanceof Error && 'code' in error && error.code === 'ENOENT';
3
+ }
4
+ //# sourceMappingURL=isMissingPathError.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isMissingPathError.js","sourceRoot":"","sources":["../../../src/project/io/isMissingPathError.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,OAAO,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC;AAC9E,CAAC","sourcesContent":["export function isMissingPathError(error: unknown): boolean {\n return error instanceof Error && 'code' in error && error.code === 'ENOENT';\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export declare function isRecord(value: unknown): value is Record<string, unknown>;
2
+ //# sourceMappingURL=isRecord.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isRecord.d.ts","sourceRoot":"","sources":["../../../src/project/io/isRecord.ts"],"names":[],"mappings":"AAAA,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE"}
@@ -0,0 +1,4 @@
1
+ export function isRecord(value) {
2
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
3
+ }
4
+ //# sourceMappingURL=isRecord.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isRecord.js","sourceRoot":"","sources":["../../../src/project/io/isRecord.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC","sourcesContent":["export function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export declare function normalizeProjectRoot(projectRoot: string): Promise<string>;
2
+ //# sourceMappingURL=normalizeProjectRoot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalizeProjectRoot.d.ts","sourceRoot":"","sources":["../../../src/project/io/normalizeProjectRoot.ts"],"names":[],"mappings":"AAGA,wBAAsB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgB/E"}
@@ -0,0 +1,18 @@
1
+ import { promises as fs } from 'node:fs';
2
+ import path from 'node:path';
3
+ export async function normalizeProjectRoot(projectRoot) {
4
+ const requestedRoot = path.resolve(projectRoot);
5
+ let resolvedRoot;
6
+ try {
7
+ resolvedRoot = await fs.realpath(requestedRoot);
8
+ }
9
+ catch (error) {
10
+ throw new Error(`Deploy project root does not exist: ${requestedRoot}`, { cause: error });
11
+ }
12
+ const stat = await fs.stat(resolvedRoot);
13
+ if (!stat.isDirectory()) {
14
+ throw new Error(`Deploy project root is not a directory: ${resolvedRoot}`);
15
+ }
16
+ return resolvedRoot;
17
+ }
18
+ //# sourceMappingURL=normalizeProjectRoot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalizeProjectRoot.js","sourceRoot":"","sources":["../../../src/project/io/normalizeProjectRoot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,WAAmB;IAC5D,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAChD,IAAI,YAAoB,CAAC;IAEzB,IAAI,CAAC;QACH,YAAY,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IAClD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,uCAAuC,aAAa,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACzC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,2CAA2C,YAAY,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC","sourcesContent":["import { promises as fs } from 'node:fs';\nimport path from 'node:path';\n\nexport async function normalizeProjectRoot(projectRoot: string): Promise<string> {\n const requestedRoot = path.resolve(projectRoot);\n let resolvedRoot: string;\n\n try {\n resolvedRoot = await fs.realpath(requestedRoot);\n } catch (error) {\n throw new Error(`Deploy project root does not exist: ${requestedRoot}`, { cause: error });\n }\n\n const stat = await fs.stat(resolvedRoot);\n if (!stat.isDirectory()) {\n throw new Error(`Deploy project root is not a directory: ${resolvedRoot}`);\n }\n\n return resolvedRoot;\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export declare function readJsonFile(filePath: string, label: string): Promise<unknown>;
2
+ //# sourceMappingURL=readJsonFile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readJsonFile.d.ts","sourceRoot":"","sources":["../../../src/project/io/readJsonFile.ts"],"names":[],"mappings":"AAEA,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQpF"}
@@ -0,0 +1,11 @@
1
+ import { promises as fs } from 'node:fs';
2
+ export async function readJsonFile(filePath, label) {
3
+ const raw = await fs.readFile(filePath, 'utf8');
4
+ try {
5
+ return JSON.parse(raw);
6
+ }
7
+ catch (error) {
8
+ throw new Error(`${label} is not valid JSON: ${filePath}`, { cause: error });
9
+ }
10
+ }
11
+ //# sourceMappingURL=readJsonFile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readJsonFile.js","sourceRoot":"","sources":["../../../src/project/io/readJsonFile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AAEzC,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAgB,EAAE,KAAa;IAChE,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAEhD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAY,CAAC;IACpC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,uBAAuB,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/E,CAAC;AACH,CAAC","sourcesContent":["import { promises as fs } from 'node:fs';\n\nexport async function readJsonFile(filePath: string, label: string): Promise<unknown> {\n const raw = await fs.readFile(filePath, 'utf8');\n\n try {\n return JSON.parse(raw) as unknown;\n } catch (error) {\n throw new Error(`${label} is not valid JSON: ${filePath}`, { cause: error });\n }\n}\n"]}
@@ -0,0 +1,6 @@
1
+ import { type AppManifest } from '@ankhorage/contracts';
2
+ export declare function readProjectManifest(projectRoot: string): Promise<{
3
+ readonly manifest: AppManifest;
4
+ readonly manifestPath: string;
5
+ }>;
6
+ //# sourceMappingURL=readProjectManifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readProjectManifest.d.ts","sourceRoot":"","sources":["../../../src/project/io/readProjectManifest.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,WAAW,EAAoB,MAAM,sBAAsB,CAAC;AAI1E,wBAAsB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;IACtE,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B,CAAC,CAgBD"}
@@ -0,0 +1,20 @@
1
+ import { promises as fs } from 'node:fs';
2
+ import path from 'node:path';
3
+ import { parseAppManifest } from '@ankhorage/contracts';
4
+ import { readJsonFile } from './readJsonFile';
5
+ export async function readProjectManifest(projectRoot) {
6
+ const manifestPath = path.join(projectRoot, 'ankh.config.json');
7
+ try {
8
+ await fs.access(manifestPath);
9
+ }
10
+ catch (error) {
11
+ throw new Error(`Deploy project manifest does not exist: ${manifestPath}`, { cause: error });
12
+ }
13
+ const parsed = await readJsonFile(manifestPath, 'Deploy project manifest');
14
+ const result = parseAppManifest(parsed);
15
+ if (!result.ok) {
16
+ throw new Error(`Deploy project manifest has an invalid canonical shape: ${manifestPath}`);
17
+ }
18
+ return { manifest: result.manifest, manifestPath };
19
+ }
20
+ //# sourceMappingURL=readProjectManifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readProjectManifest.js","sourceRoot":"","sources":["../../../src/project/io/readProjectManifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAoB,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE1E,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,WAAmB;IAI3D,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;IAEhE,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAChC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,2CAA2C,YAAY,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/F,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,YAAY,EAAE,yBAAyB,CAAC,CAAC;IAC3E,MAAM,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACxC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,2DAA2D,YAAY,EAAE,CAAC,CAAC;IAC7F,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,YAAY,EAAE,CAAC;AACrD,CAAC","sourcesContent":["import { promises as fs } from 'node:fs';\nimport path from 'node:path';\n\nimport { type AppManifest, parseAppManifest } from '@ankhorage/contracts';\n\nimport { readJsonFile } from './readJsonFile';\n\nexport async function readProjectManifest(projectRoot: string): Promise<{\n readonly manifest: AppManifest;\n readonly manifestPath: string;\n}> {\n const manifestPath = path.join(projectRoot, 'ankh.config.json');\n\n try {\n await fs.access(manifestPath);\n } catch (error) {\n throw new Error(`Deploy project manifest does not exist: ${manifestPath}`, { cause: error });\n }\n\n const parsed = await readJsonFile(manifestPath, 'Deploy project manifest');\n const result = parseAppManifest(parsed);\n if (!result.ok) {\n throw new Error(`Deploy project manifest has an invalid canonical shape: ${manifestPath}`);\n }\n\n return { manifest: result.manifest, manifestPath };\n}\n"]}
@@ -0,0 +1,5 @@
1
+ import type { AppDeployManifest } from '@ankhorage/contracts/deploy';
2
+ export declare function readProjectDeploymentConfig(options: {
3
+ readonly projectRoot: string;
4
+ }): Promise<AppDeployManifest | null>;
5
+ //# sourceMappingURL=readProjectDeploymentConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readProjectDeploymentConfig.d.ts","sourceRoot":"","sources":["../../src/project/readProjectDeploymentConfig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAIrE,wBAAsB,2BAA2B,CAAC,OAAO,EAAE;IACzD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAGpC"}
@@ -0,0 +1,6 @@
1
+ import { resolveDeployProject } from './resolveDeployProject';
2
+ export async function readProjectDeploymentConfig(options) {
3
+ const project = await resolveDeployProject(options);
4
+ return project.deploy;
5
+ }
6
+ //# sourceMappingURL=readProjectDeploymentConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readProjectDeploymentConfig.js","sourceRoot":"","sources":["../../src/project/readProjectDeploymentConfig.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAAC,OAEjD;IACC,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,CAAC;IACpD,OAAO,OAAO,CAAC,MAAM,CAAC;AACxB,CAAC","sourcesContent":["import type { AppDeployManifest } from '@ankhorage/contracts/deploy';\n\nimport { resolveDeployProject } from './resolveDeployProject';\n\nexport async function readProjectDeploymentConfig(options: {\n readonly projectRoot: string;\n}): Promise<AppDeployManifest | null> {\n const project = await resolveDeployProject(options);\n return project.deploy;\n}\n"]}
@@ -0,0 +1,5 @@
1
+ import type { ResolvedDeployProject } from './ResolvedDeployProject';
2
+ export declare function resolveDeployProject(options: {
3
+ readonly projectRoot: string;
4
+ }): Promise<ResolvedDeployProject>;
5
+ //# sourceMappingURL=resolveDeployProject.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveDeployProject.d.ts","sourceRoot":"","sources":["../../src/project/resolveDeployProject.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAGrE,wBAAsB,oBAAoB,CAAC,OAAO,EAAE;IAClD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAWjC"}
@@ -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,3 @@
1
+ import type { ProjectDeploymentPaths } from './ProjectDeploymentPaths';
2
+ export declare function resolveProjectDeploymentPaths(projectRoot: string): ProjectDeploymentPaths;
3
+ //# sourceMappingURL=resolveProjectDeploymentPaths.d.ts.map
@@ -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.1.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": [