@mp-lb/arcnet 0.0.0-stage → 0.1.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 (169) hide show
  1. package/README.md +19 -2
  2. package/dist/addDependency.d.ts +3 -0
  3. package/dist/addDependency.d.ts.map +1 -0
  4. package/dist/addDependency.js +29 -0
  5. package/dist/addDependency.js.map +1 -0
  6. package/dist/apiClient.d.ts +3 -0
  7. package/dist/apiClient.d.ts.map +1 -0
  8. package/dist/apiClient.js +39 -0
  9. package/dist/apiClient.js.map +1 -0
  10. package/dist/checkIdentity.d.ts +3 -0
  11. package/dist/checkIdentity.d.ts.map +1 -0
  12. package/dist/checkIdentity.js +9 -0
  13. package/dist/checkIdentity.js.map +1 -0
  14. package/dist/ciOutputs.d.ts +2 -0
  15. package/dist/ciOutputs.d.ts.map +1 -0
  16. package/dist/ciOutputs.js +31 -0
  17. package/dist/ciOutputs.js.map +1 -0
  18. package/dist/cli.d.ts +3 -0
  19. package/dist/cli.d.ts.map +1 -0
  20. package/dist/cli.js +9 -0
  21. package/dist/cli.js.map +1 -0
  22. package/dist/createCli.d.ts +3 -0
  23. package/dist/createCli.d.ts.map +1 -0
  24. package/dist/createCli.js +83 -0
  25. package/dist/createCli.js.map +1 -0
  26. package/dist/createProject.d.ts +26 -0
  27. package/dist/createProject.d.ts.map +1 -0
  28. package/dist/createProject.js +35 -0
  29. package/dist/createProject.js.map +1 -0
  30. package/dist/createSetupCommand.d.ts +3 -0
  31. package/dist/createSetupCommand.d.ts.map +1 -0
  32. package/dist/createSetupCommand.js +11 -0
  33. package/dist/createSetupCommand.js.map +1 -0
  34. package/dist/deploy.d.ts +3 -0
  35. package/dist/deploy.d.ts.map +1 -0
  36. package/dist/deploy.js +47 -0
  37. package/dist/deploy.js.map +1 -0
  38. package/dist/fail.d.ts +2 -0
  39. package/dist/fail.d.ts.map +1 -0
  40. package/dist/fail.js +4 -0
  41. package/dist/fail.js.map +1 -0
  42. package/dist/index.d.ts +3 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +3 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/inspectReferences.d.ts +3 -0
  47. package/dist/inspectReferences.d.ts.map +1 -0
  48. package/dist/inspectReferences.js +10 -0
  49. package/dist/inspectReferences.js.map +1 -0
  50. package/dist/inspectStaticTree.d.ts +2 -0
  51. package/dist/inspectStaticTree.d.ts.map +1 -0
  52. package/dist/inspectStaticTree.js +17 -0
  53. package/dist/inspectStaticTree.js.map +1 -0
  54. package/dist/packageInfo.d.ts +3 -0
  55. package/dist/packageInfo.d.ts.map +1 -0
  56. package/dist/packageInfo.js +9 -0
  57. package/dist/packageInfo.js.map +1 -0
  58. package/dist/parseSelection.d.ts +3 -0
  59. package/dist/parseSelection.d.ts.map +1 -0
  60. package/dist/parseSelection.js +13 -0
  61. package/dist/parseSelection.js.map +1 -0
  62. package/dist/parseSetupInput.d.ts +16 -0
  63. package/dist/parseSetupInput.d.ts.map +1 -0
  64. package/dist/parseSetupInput.js +34 -0
  65. package/dist/parseSetupInput.js.map +1 -0
  66. package/dist/readSelection.d.ts +15 -0
  67. package/dist/readSelection.d.ts.map +1 -0
  68. package/dist/readSelection.js +36 -0
  69. package/dist/readSelection.js.map +1 -0
  70. package/dist/renderPlan.d.ts +27 -0
  71. package/dist/renderPlan.d.ts.map +1 -0
  72. package/dist/renderPlan.js +25 -0
  73. package/dist/renderPlan.js.map +1 -0
  74. package/dist/renderResult.d.ts +5 -0
  75. package/dist/renderResult.d.ts.map +1 -0
  76. package/dist/renderResult.js +15 -0
  77. package/dist/renderResult.js.map +1 -0
  78. package/dist/resolveRepository.d.ts +2 -0
  79. package/dist/resolveRepository.d.ts.map +1 -0
  80. package/dist/resolveRepository.js +24 -0
  81. package/dist/resolveRepository.js.map +1 -0
  82. package/dist/runProcess.d.ts +2 -0
  83. package/dist/runProcess.d.ts.map +1 -0
  84. package/dist/runProcess.js +16 -0
  85. package/dist/runProcess.js.map +1 -0
  86. package/dist/runTerraform.d.ts +8 -0
  87. package/dist/runTerraform.d.ts.map +1 -0
  88. package/dist/runTerraform.js +111 -0
  89. package/dist/runTerraform.js.map +1 -0
  90. package/dist/runVercel.d.ts +34 -0
  91. package/dist/runVercel.d.ts.map +1 -0
  92. package/dist/runVercel.js +52 -0
  93. package/dist/runVercel.js.map +1 -0
  94. package/dist/safePath.d.ts +2 -0
  95. package/dist/safePath.d.ts.map +1 -0
  96. package/dist/safePath.js +35 -0
  97. package/dist/safePath.js.map +1 -0
  98. package/dist/safeTargetPath.d.ts +2 -0
  99. package/dist/safeTargetPath.d.ts.map +1 -0
  100. package/dist/safeTargetPath.js +29 -0
  101. package/dist/safeTargetPath.js.map +1 -0
  102. package/dist/schemas.d.ts +106 -0
  103. package/dist/schemas.d.ts.map +1 -0
  104. package/dist/schemas.js +85 -0
  105. package/dist/schemas.js.map +1 -0
  106. package/dist/selectNetwork.d.ts +26 -0
  107. package/dist/selectNetwork.d.ts.map +1 -0
  108. package/dist/selectNetwork.js +48 -0
  109. package/dist/selectNetwork.js.map +1 -0
  110. package/dist/setup.d.ts +2 -0
  111. package/dist/setup.d.ts.map +1 -0
  112. package/dist/setup.js +192 -0
  113. package/dist/setup.js.map +1 -0
  114. package/dist/setupReport.d.ts +8 -0
  115. package/dist/setupReport.d.ts.map +1 -0
  116. package/dist/setupReport.js +2 -0
  117. package/dist/setupReport.js.map +1 -0
  118. package/dist/setupVercel.d.ts +9 -0
  119. package/dist/setupVercel.d.ts.map +1 -0
  120. package/dist/setupVercel.js +72 -0
  121. package/dist/setupVercel.js.map +1 -0
  122. package/dist/stageSite.d.ts +3 -0
  123. package/dist/stageSite.d.ts.map +1 -0
  124. package/dist/stageSite.js +31 -0
  125. package/dist/stageSite.js.map +1 -0
  126. package/dist/validateConfig.d.ts +3 -0
  127. package/dist/validateConfig.d.ts.map +1 -0
  128. package/dist/validateConfig.js +17 -0
  129. package/dist/validateConfig.js.map +1 -0
  130. package/docs/public/commands.md +58 -0
  131. package/docs/public/llms-full.txt +79 -0
  132. package/package.json +49 -3
  133. package/src/addDependency.ts +41 -0
  134. package/src/apiClient.ts +51 -0
  135. package/src/checkIdentity.ts +18 -0
  136. package/src/ciOutputs.ts +47 -0
  137. package/src/cli.ts +11 -0
  138. package/src/createCli.ts +118 -0
  139. package/src/createProject.ts +66 -0
  140. package/src/createSetupCommand.ts +16 -0
  141. package/src/deploy.ts +71 -0
  142. package/src/fail.ts +3 -0
  143. package/src/index.ts +2 -0
  144. package/src/inspectReferences.ts +20 -0
  145. package/src/inspectStaticTree.ts +19 -0
  146. package/src/packageInfo.ts +10 -0
  147. package/src/parseSelection.ts +22 -0
  148. package/src/parseSetupInput.ts +40 -0
  149. package/src/readSelection.ts +47 -0
  150. package/src/renderPlan.ts +27 -0
  151. package/src/renderResult.ts +18 -0
  152. package/src/resolveRepository.ts +38 -0
  153. package/src/runProcess.ts +26 -0
  154. package/src/runTerraform.ts +182 -0
  155. package/src/runVercel.ts +77 -0
  156. package/src/safePath.ts +43 -0
  157. package/src/safeTargetPath.ts +32 -0
  158. package/src/schemas.ts +126 -0
  159. package/src/selectNetwork.ts +73 -0
  160. package/src/setup.ts +277 -0
  161. package/src/setupReport.ts +11 -0
  162. package/src/setupVercel.ts +126 -0
  163. package/src/stageSite.ts +54 -0
  164. package/src/validateConfig.ts +22 -0
  165. package/templates/deploy-arc.yaml +73 -0
  166. package/templates/deploy-vercel.yaml +43 -0
  167. package/templates/network.yaml +105 -0
  168. package/templates/vercel-static/main.tf +128 -0
  169. package/templates/vercel-static/module.yaml +51 -0
package/README.md CHANGED
@@ -1,3 +1,20 @@
1
- # Temporary Holding Version
1
+ # @mp-lb/arcnet
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ ArcNet's TypeScript CLI for installing deployment configuration and deploying projects. The package owns shared runners, validation, workflow templates and the Vercel Terraform module; projects keep configuration and application-specific Dockerfiles.
4
+
5
+ **Release status:** implementation and checks are complete; the first npm publication is blocked by registry authentication. The commands below target the pending `0.1.0` release.
6
+
7
+ From an existing project with Zap, GitHub, and pinned pnpm:
8
+
9
+ ```sh
10
+ pnpm dlx @mp-lb/arcnet@0.1.0 setup hello-world --dry-run
11
+ pnpm dlx @mp-lb/arcnet@0.1.0 setup hello-world
12
+ pnpm install
13
+ pnpm exec arcnet check
14
+ ```
15
+
16
+ Setup pins this package in the existing root manifest. Commit the resulting lockfile. Deployment starts disabled, and setup never provisions cloud resources. Upgrades use the project's normal dependency workflow.
17
+
18
+ [Project setup](https://github.com/mp-lb/stackforge/blob/main/arcnet/SETUP.md) · [Environment setup](https://github.com/mp-lb/stackforge/blob/main/arcnet/environment/setup.md) · [Audit](https://github.com/mp-lb/stackforge/blob/main/arcnet/AUDIT.md) · [Command reference](docs/public/commands.md)
19
+
20
+ Zap Arc remains the pinned Terraform engine dependency. Environment bootstrap, health checks and teardown are not implemented by this package yet. The static Vercel adapter retains its existing static-only and explicit-project-reference limitations.
@@ -0,0 +1,3 @@
1
+ export declare const addDependency: (path: string) => string;
2
+ export declare const hasDependency: (root: string) => boolean;
3
+ //# sourceMappingURL=addDependency.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addDependency.d.ts","sourceRoot":"","sources":["../src/addDependency.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,WAiBzC,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,YASzC,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { z } from "zod";
4
+ import { packageVersion } from "./packageInfo.js";
5
+ const manifestSchema = z
6
+ .object({
7
+ dependencies: z.record(z.string(), z.string()).optional(),
8
+ devDependencies: z.record(z.string(), z.string()).optional(),
9
+ })
10
+ .passthrough();
11
+ export const addDependency = (path) => {
12
+ const manifest = manifestSchema.parse(JSON.parse(readFileSync(path, "utf8")));
13
+ const existing = manifest.dependencies?.["@mp-lb/arcnet"] ??
14
+ manifest.devDependencies?.["@mp-lb/arcnet"];
15
+ if (existing && existing !== packageVersion)
16
+ throw new Error("Existing ArcNet dependency differs; review its version before setup.");
17
+ if (!manifest.dependencies?.["@mp-lb/arcnet"])
18
+ manifest.devDependencies = {
19
+ ...manifest.devDependencies,
20
+ "@mp-lb/arcnet": packageVersion,
21
+ };
22
+ return JSON.stringify(manifest, null, 2) + "\n";
23
+ };
24
+ export const hasDependency = (root) => {
25
+ const manifest = manifestSchema.parse(JSON.parse(readFileSync(join(root, "package.json"), "utf8")));
26
+ return Boolean(manifest.dependencies?.["@mp-lb/arcnet"] ??
27
+ manifest.devDependencies?.["@mp-lb/arcnet"]);
28
+ };
29
+ //# sourceMappingURL=addDependency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addDependency.js","sourceRoot":"","sources":["../src/addDependency.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,MAAM,cAAc,GAAG,CAAC;KACrB,MAAM,CAAC;IACN,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACzD,eAAe,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;CAC7D,CAAC;KACD,WAAW,EAAE,CAAC;AAEjB,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAY,EAAE,EAAE;IAC5C,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAE9E,MAAM,QAAQ,GACZ,QAAQ,CAAC,YAAY,EAAE,CAAC,eAAe,CAAC;QACxC,QAAQ,CAAC,eAAe,EAAE,CAAC,eAAe,CAAC,CAAC;IAE9C,IAAI,QAAQ,IAAI,QAAQ,KAAK,cAAc;QACzC,MAAM,IAAI,KAAK,CACb,sEAAsE,CACvE,CAAC;IACJ,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC,eAAe,CAAC;QAC3C,QAAQ,CAAC,eAAe,GAAG;YACzB,GAAG,QAAQ,CAAC,eAAe;YAC3B,eAAe,EAAE,cAAc;SAChC,CAAC;IACJ,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;AAClD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAY,EAAE,EAAE;IAC5C,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CACnC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC,CAC7D,CAAC;IAEF,OAAO,OAAO,CACZ,QAAQ,CAAC,YAAY,EAAE,CAAC,eAAe,CAAC;QACxC,QAAQ,CAAC,eAAe,EAAE,CAAC,eAAe,CAAC,CAC5C,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { VercelRequest } from "./schemas.js";
2
+ export declare const apiClient: (token: string | undefined, fetcher?: typeof fetch) => VercelRequest;
3
+ //# sourceMappingURL=apiClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiClient.d.ts","sourceRoot":"","sources":["../src/apiClient.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAGlD,eAAO,MAAM,SAAS,GACpB,OAAO,MAAM,GAAG,SAAS,EACzB,UAAS,OAAO,KAAa,KAC5B,aA2CF,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { fail } from "./fail.js";
2
+ import { vercelResponseSchema } from "./schemas.js";
3
+ export const apiClient = (token, fetcher = fetch) => {
4
+ if (!token)
5
+ fail("VERCEL_TOKEN is required for remote operations; check and plan remain offline.");
6
+ return async (method, path, account, body) => {
7
+ const url = new URL(path, "https://api.vercel.com");
8
+ if (account.type === "team")
9
+ url.searchParams.set("teamId", account.id);
10
+ let response;
11
+ try {
12
+ response = await fetcher(url, {
13
+ method,
14
+ headers: {
15
+ Authorization: `Bearer ${token}`,
16
+ "Content-Type": "application/json",
17
+ },
18
+ body: body === undefined ? undefined : JSON.stringify(body),
19
+ signal: AbortSignal.timeout(30000),
20
+ });
21
+ }
22
+ catch {
23
+ fail(method === "POST"
24
+ ? "Creation outcome uncertain. Inspect the named project before retrying; no automatic retry was attempted."
25
+ : "Vercel read failed; no changes attempted.");
26
+ }
27
+ if (response.status === 404 && method === "GET")
28
+ return null;
29
+ if (!response.ok)
30
+ fail(`Vercel ${method} failed (HTTP ${response.status}). Check scope/access; response content omitted.`);
31
+ try {
32
+ return vercelResponseSchema.parse(await response.json());
33
+ }
34
+ catch {
35
+ fail("Vercel returned an invalid response; inspect the project before retrying.");
36
+ }
37
+ };
38
+ };
39
+ //# sourceMappingURL=apiClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiClient.js","sourceRoot":"","sources":["../src/apiClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEpD,MAAM,CAAC,MAAM,SAAS,GAAG,CACvB,KAAyB,EACzB,UAAwB,KAAK,EACd,EAAE;IACjB,IAAI,CAAC,KAAK;QACR,IAAI,CACF,gFAAgF,CACjF,CAAC;IAEJ,OAAO,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;QAC3C,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,wBAAwB,CAAC,CAAC;QACpD,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM;YAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;QACxE,IAAI,QAAQ,CAAC;QAEb,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE;gBAC5B,MAAM;gBACN,OAAO,EAAE;oBACP,aAAa,EAAE,UAAU,KAAK,EAAE;oBAChC,cAAc,EAAE,kBAAkB;iBACnC;gBACD,IAAI,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;gBAC3D,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;aACnC,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CACF,MAAM,KAAK,MAAM;gBACf,CAAC,CAAC,0GAA0G;gBAC5G,CAAC,CAAC,2CAA2C,CAChD,CAAC;QACJ,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,KAAK;YAAE,OAAO,IAAI,CAAC;QAC7D,IAAI,CAAC,QAAQ,CAAC,EAAE;YACd,IAAI,CACF,UAAU,MAAM,iBAAiB,QAAQ,CAAC,MAAM,kDAAkD,CACnG,CAAC;QAEJ,IAAI,CAAC;YACH,OAAO,oBAAoB,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3D,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CACF,2EAA2E,CAC5E,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { VercelAccount, VercelResponse, VercelSite } from "./schemas.js";
2
+ export declare const checkIdentity: (project: VercelResponse | null, site: VercelSite, account: VercelAccount) => void;
3
+ //# sourceMappingURL=checkIdentity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkIdentity.d.ts","sourceRoot":"","sources":["../src/checkIdentity.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE9E,eAAO,MAAM,aAAa,GACxB,SAAS,cAAc,GAAG,IAAI,EAC9B,MAAM,UAAU,EAChB,SAAS,aAAa,SAWvB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { fail } from "./fail.js";
2
+ export const checkIdentity = (project, site, account) => {
3
+ if (!project ||
4
+ project.id !== site.projectId ||
5
+ project.name !== site.projectName ||
6
+ project.accountId !== account.id)
7
+ fail(`Project identity/scope mismatch for ${site.projectName}. No deployment attempted.`);
8
+ };
9
+ //# sourceMappingURL=checkIdentity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkIdentity.js","sourceRoot":"","sources":["../src/checkIdentity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,OAA8B,EAC9B,IAAgB,EAChB,OAAsB,EACtB,EAAE;IACF,IACE,CAAC,OAAO;QACR,OAAO,CAAC,EAAE,KAAK,IAAI,CAAC,SAAS;QAC7B,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW;QACjC,OAAO,CAAC,SAAS,KAAK,OAAO,CAAC,EAAE;QAEhC,IAAI,CACF,uCAAuC,IAAI,CAAC,WAAW,4BAA4B,CACpF,CAAC;AACN,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const ciOutputs: (root: string) => Record<string, string>;
2
+ //# sourceMappingURL=ciOutputs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ciOutputs.d.ts","sourceRoot":"","sources":["../src/ciOutputs.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,SAAS,GAAI,MAAM,MAAM,KAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAuC7D,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { parse } from "yaml";
4
+ import { z } from "zod";
5
+ import { terraformConfigSchema } from "./schemas.js";
6
+ import { validateConfig } from "./validateConfig.js";
7
+ export const ciOutputs = (root) => {
8
+ const input = JSON.parse(readFileSync(join(root, ".arcnet/project.json"), "utf8"));
9
+ if (z.object({ mode: z.string().optional() }).parse(input).mode === "vercel") {
10
+ const c = validateConfig(input, root);
11
+ return {
12
+ approved: String(c.approved &&
13
+ Object.values(c.sites).every((s) => s.mode === "existing")),
14
+ };
15
+ }
16
+ const c = terraformConfigSchema.parse(input);
17
+ const n = z
18
+ .object({ region: z.string().regex(/^[a-z]+-[a-z]+[0-9]$/) })
19
+ .parse(parse(readFileSync(join(root, ".arcnet/network.yaml"), "utf8")));
20
+ if (c.approved &&
21
+ (!/^projects\/\d+\/locations\/global\/workloadIdentityPools\/github\/providers\/github-actions$/.test(c.workloadIdentityProvider) ||
22
+ !/^arc-deploy@[a-z][a-z0-9-]+\.iam\.gserviceaccount\.com$/.test(c.serviceAccount)))
23
+ throw new Error("Complete WIF configuration before approval.");
24
+ return {
25
+ approved: String(c.approved),
26
+ provider: c.approved ? c.workloadIdentityProvider : "",
27
+ account: c.approved ? c.serviceAccount : "",
28
+ registry: `${n.region}-docker.pkg.dev`,
29
+ };
30
+ };
31
+ //# sourceMappingURL=ciOutputs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ciOutputs.js","sourceRoot":"","sources":["../src/ciOutputs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,IAAY,EAA0B,EAAE;IAChE,MAAM,KAAK,GAAY,IAAI,CAAC,KAAK,CAC/B,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,sBAAsB,CAAC,EAAE,MAAM,CAAC,CACzD,CAAC;IAEF,IACE,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,QAAQ,EACxE,CAAC;QACD,MAAM,CAAC,GAAG,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACtC,OAAO;YACL,QAAQ,EAAE,MAAM,CACd,CAAC,CAAC,QAAQ;gBACR,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAC7D;SACF,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,GAAG,qBAAqB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAE7C,MAAM,CAAC,GAAG,CAAC;SACR,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,sBAAsB,CAAC,EAAE,CAAC;SAC5D,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,sBAAsB,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAE1E,IACE,CAAC,CAAC,QAAQ;QACV,CAAC,CAAC,8FAA8F,CAAC,IAAI,CACnG,CAAC,CAAC,wBAAwB,CAC3B;YACC,CAAC,yDAAyD,CAAC,IAAI,CAC7D,CAAC,CAAC,cAAc,CACjB,CAAC;QAEJ,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,OAAO;QACL,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC5B,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAAE;QACtD,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE;QAC3C,QAAQ,EAAE,GAAG,CAAC,CAAC,MAAM,iBAAiB;KACvC,CAAC;AACJ,CAAC,CAAC"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ import { createCli } from "./createCli.js";
3
+ await createCli()
4
+ .parseAsync()
5
+ .catch((error) => {
6
+ process.stderr.write(`ArcNet: ${error instanceof Error ? error.message : "Command failed"}\n`);
7
+ process.exitCode = 1;
8
+ });
9
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,MAAM,SAAS,EAAE;KACd,UAAU,EAAE;KACZ,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IACxB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,WAAW,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,IAAI,CACzE,CAAC;IAEF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const createCli: () => Command;
3
+ //# sourceMappingURL=createCli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createCli.d.ts","sourceRoot":"","sources":["../src/createCli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,eAAO,MAAM,SAAS,eAyGrB,CAAC"}
@@ -0,0 +1,83 @@
1
+ import { Command } from "commander";
2
+ import { appendFileSync, readFileSync, realpathSync } from "node:fs";
3
+ import { join } from "node:path";
4
+ import { z } from "zod";
5
+ import { ciOutputs } from "./ciOutputs.js";
6
+ import { createSetupCommand } from "./createSetupCommand.js";
7
+ import { packageVersion } from "./packageInfo.js";
8
+ import { renderResult } from "./renderResult.js";
9
+ import { runTerraform } from "./runTerraform.js";
10
+ import { runVercel } from "./runVercel.js";
11
+ import { setup } from "./setup.js";
12
+ export const createCli = () => {
13
+ const cli = new Command("arcnet")
14
+ .description("Install and deploy ArcNet projects.")
15
+ .version(packageVersion)
16
+ .option("--root <directory>", "Target project root", process.cwd())
17
+ .option("--json", "Render one JSON result")
18
+ .option("--jsonl", "Render structured completion events")
19
+ .option("--noninteractive", "Run without prompts (all commands are noninteractive)");
20
+ cli.hook("preAction", () => {
21
+ if (cli.opts().json && cli.opts().jsonl)
22
+ throw new Error("Choose either --json or --jsonl.");
23
+ });
24
+ const output = (result) => {
25
+ process.stdout.write(renderResult(result, cli.opts()) + "\n");
26
+ };
27
+ cli
28
+ .command("version")
29
+ .description("Show the installed package version.")
30
+ .action(() => output({ version: packageVersion }));
31
+ const install = createSetupCommand();
32
+ install.action(() => output({
33
+ ...setup(install.args.concat(install.options.flatMap((option) => {
34
+ const key = option.attributeName();
35
+ if (install.getOptionValueSource(key) !== "cli")
36
+ return [];
37
+ const value = install.opts()[key];
38
+ return value === true
39
+ ? [option.long]
40
+ : [option.long, String(value)];
41
+ })), realpathSync(cli.opts().root)),
42
+ }));
43
+ cli.addCommand(install);
44
+ for (const [name, description] of Object.entries({
45
+ check: "Validate project configuration offline.",
46
+ plan: "Plan deployment (Terraform contacts providers; static Vercel stays offline).",
47
+ deploy: "Deploy the approved project.",
48
+ preview: "Deploy static Vercel sites to preview.",
49
+ inspect: "Verify static Vercel project identities remotely.",
50
+ create: "Create one explicitly approved Vercel project.",
51
+ })) {
52
+ const command = cli.command(name).description(description);
53
+ if (name === "create")
54
+ command.argument("<site>", "Configured site name");
55
+ command.action(async (site) => {
56
+ const root = realpathSync(cli.opts().root);
57
+ const mode = z
58
+ .object({ mode: z.string().optional() })
59
+ .parse(JSON.parse(readFileSync(join(root, ".arcnet/project.json"), "utf8"))).mode;
60
+ const machine = Boolean(cli.opts().json || cli.opts().jsonl);
61
+ if (mode === "vercel")
62
+ output(await runVercel(name, root, typeof site === "string" ? site : undefined, machine));
63
+ else if (name === "check" || name === "plan" || name === "deploy")
64
+ output(runTerraform(name, root, machine));
65
+ else
66
+ throw new Error(`${name} is only supported for static Vercel references.`);
67
+ });
68
+ }
69
+ cli
70
+ .command("ci")
71
+ .description("Validate deployment identity and write GitHub Actions outputs.")
72
+ .action(() => {
73
+ const outputs = ciOutputs(realpathSync(cli.opts().root));
74
+ if (!process.env.GITHUB_OUTPUT)
75
+ throw new Error("GITHUB_OUTPUT is required for the ci command.");
76
+ appendFileSync(process.env.GITHUB_OUTPUT, Object.entries(outputs)
77
+ .map(([key, value]) => `${key}=${value}\n`)
78
+ .join(""));
79
+ output(outputs);
80
+ });
81
+ return cli;
82
+ };
83
+ //# sourceMappingURL=createCli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createCli.js","sourceRoot":"","sources":["../src/createCli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { VercelConfig, VercelRequest } from "./schemas.js";
2
+ export declare const createProject: (config: VercelConfig, name: string, request: VercelRequest) => Promise<{
3
+ repository: string;
4
+ account: {
5
+ type: "team" | "personal";
6
+ id: string;
7
+ };
8
+ sites: Record<string, {
9
+ mode: "existing" | "new";
10
+ projectName: string;
11
+ build: string[];
12
+ output: string;
13
+ outputConfig: {
14
+ version: 3;
15
+ routes?: unknown[] | undefined;
16
+ overrides?: Record<string, unknown> | undefined;
17
+ };
18
+ projectId?: string | undefined;
19
+ creationApproved?: boolean | undefined;
20
+ }>;
21
+ version: 1;
22
+ mode: "vercel";
23
+ slug: string;
24
+ approved: boolean;
25
+ }>;
26
+ //# sourceMappingURL=createProject.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createProject.d.ts","sourceRoot":"","sources":["../src/createProject.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAEhE,eAAO,MAAM,aAAa,GACxB,QAAQ,YAAY,EACpB,MAAM,MAAM,EACZ,SAAS,aAAa;;;;;;;;;;;;;;;;;;;;;;;EA0DvB,CAAC"}
@@ -0,0 +1,35 @@
1
+ import { checkIdentity } from "./checkIdentity.js";
2
+ import { fail } from "./fail.js";
3
+ export const createProject = async (config, name, request) => {
4
+ const site = config.sites[name];
5
+ if (!site)
6
+ fail("Choose a configured site.");
7
+ if (site.mode === "existing") {
8
+ checkIdentity(await request("GET", `/v9/projects/${site.projectId}`, config.account), site, config.account);
9
+ return config;
10
+ }
11
+ if (site.creationApproved !== true)
12
+ fail("Project creation disabled. Obtain explicit target/cost approval and set creationApproved=true for this site.");
13
+ if (config.account.type === "personal") {
14
+ const who = await request("GET", "/v2/user", config.account);
15
+ if (who?.user?.id !== config.account.id)
16
+ fail("Token personal account does not match configured account; no project created.");
17
+ }
18
+ if (await request("GET", `/v9/projects/${encodeURIComponent(site.projectName)}`, config.account))
19
+ fail(`Project name ${site.projectName} already exists. Set an explicit existing reference after verifying its ID; no duplicate project was created.`);
20
+ const created = await request("POST", "/v11/projects", config.account, {
21
+ name: site.projectName,
22
+ framework: null,
23
+ });
24
+ if (!created ||
25
+ !/^prj_[A-Za-z0-9]+$/.test(created.id ?? "") ||
26
+ created.accountId !== config.account.id ||
27
+ created.name !== site.projectName)
28
+ fail("Creation response identity mismatch. Inspect the account before retrying.");
29
+ const next = structuredClone(config);
30
+ next.approved = false;
31
+ next.sites[name] = { ...site, mode: "existing", projectId: created.id };
32
+ delete next.sites[name].creationApproved;
33
+ return next;
34
+ };
35
+ //# sourceMappingURL=createProject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createProject.js","sourceRoot":"","sources":["../src/createProject.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAChC,MAAoB,EACpB,IAAY,EACZ,OAAsB,EACtB,EAAE;IACF,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,CAAC,IAAI;QAAE,IAAI,CAAC,2BAA2B,CAAC,CAAC;IAE7C,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC7B,aAAa,CACX,MAAM,OAAO,CAAC,KAAK,EAAE,gBAAgB,IAAI,CAAC,SAAS,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,EACtE,IAAI,EACJ,MAAM,CAAC,OAAO,CACf,CAAC;QAEF,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,IAAI,CAAC,gBAAgB,KAAK,IAAI;QAChC,IAAI,CACF,8GAA8G,CAC/G,CAAC;IAEJ,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QACvC,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QAC7D,IAAI,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,MAAM,CAAC,OAAO,CAAC,EAAE;YACrC,IAAI,CACF,+EAA+E,CAChF,CAAC;IACN,CAAC;IAED,IACE,MAAM,OAAO,CACX,KAAK,EACL,gBAAgB,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,EACtD,MAAM,CAAC,OAAO,CACf;QAED,IAAI,CACF,gBAAgB,IAAI,CAAC,WAAW,+GAA+G,CAChJ,CAAC;IAEJ,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,eAAe,EAAE,MAAM,CAAC,OAAO,EAAE;QACrE,IAAI,EAAE,IAAI,CAAC,WAAW;QACtB,SAAS,EAAE,IAAI;KAChB,CAAC,CAAC;IAEH,IACE,CAAC,OAAO;QACR,CAAC,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC;QAC5C,OAAO,CAAC,SAAS,KAAK,MAAM,CAAC,OAAO,CAAC,EAAE;QACvC,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW;QAEjC,IAAI,CACF,2EAA2E,CAC5E,CAAC;IACJ,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IACrC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;IACtB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,EAAG,EAAE,CAAC;IACzE,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAE,CAAC,gBAAgB,CAAC;IAC1C,OAAO,IAAI,CAAC;AACd,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const createSetupCommand: () => Command;
3
+ //# sourceMappingURL=createSetupCommand.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createSetupCommand.d.ts","sourceRoot":"","sources":["../src/createSetupCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,eAAO,MAAM,kBAAkB,eAcgC,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { Command } from "commander";
2
+ export const createSetupCommand = () => new Command("setup")
3
+ .description("Add ArcNet configuration and workflow; pin the CLI in the project manifest.")
4
+ .argument("<slug>", "Project slug matching zap.yaml")
5
+ .option("--dry-run", "Report generated files without writing")
6
+ .option("--service <name>", "Default container service", "backend")
7
+ .option("--dockerfile <path>", "Container Dockerfile", ".arcnet/Dockerfile")
8
+ .option("--repository <owner/repo>", "GitHub repository (defaults to origin)")
9
+ .option("--services <path>", "Explicit service selection JSON")
10
+ .option("--vercel <path>", "Static Vercel references JSON");
11
+ //# sourceMappingURL=createSetupCommand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createSetupCommand.js","sourceRoot":"","sources":["../src/createSetupCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,EAAE,CACrC,IAAI,OAAO,CAAC,OAAO,CAAC;KACjB,WAAW,CACV,6EAA6E,CAC9E;KACA,QAAQ,CAAC,QAAQ,EAAE,gCAAgC,CAAC;KACpD,MAAM,CAAC,WAAW,EAAE,wCAAwC,CAAC;KAC7D,MAAM,CAAC,kBAAkB,EAAE,2BAA2B,EAAE,SAAS,CAAC;KAClE,MAAM,CAAC,qBAAqB,EAAE,sBAAsB,EAAE,oBAAoB,CAAC;KAC3E,MAAM,CACL,2BAA2B,EAC3B,wCAAwC,CACzC;KACA,MAAM,CAAC,mBAAmB,EAAE,iCAAiC,CAAC;KAC9D,MAAM,CAAC,iBAAiB,EAAE,+BAA+B,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { RunProcess, VercelConfig, VercelRequest } from "./schemas.js";
2
+ export declare const deploy: (config: VercelConfig, root: string, request: VercelRequest, run: RunProcess, environment: NodeJS.ProcessEnv, target?: string) => Promise<void>;
3
+ //# sourceMappingURL=deploy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../src/deploy.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,UAAU,EACV,YAAY,EACZ,aAAa,EAEd,MAAM,cAAc,CAAC;AAItB,eAAO,MAAM,MAAM,GACjB,QAAQ,YAAY,EACpB,MAAM,MAAM,EACZ,SAAS,aAAa,EACtB,KAAK,UAAU,EACf,aAAa,MAAM,CAAC,UAAU,EAC9B,eAAqB,kBAoDtB,CAAC"}
package/dist/deploy.js ADDED
@@ -0,0 +1,47 @@
1
+ import { rmSync } from "node:fs";
2
+ import { fail } from "./fail.js";
3
+ import { inspectReferences } from "./inspectReferences.js";
4
+ import { stageSite } from "./stageSite.js";
5
+ import { validateConfig } from "./validateConfig.js";
6
+ export const deploy = async (config, root, request, run, environment, target = "production") => {
7
+ validateConfig(config, root);
8
+ if (config.approved !== true)
9
+ fail("Deployment disabled. Review account, project references, routing and production-trigger ownership before setting approved=true.");
10
+ if (!["production", "preview"].includes(target))
11
+ fail("Target must be production or preview.");
12
+ if (environment.GITHUB_ACTIONS === "true" &&
13
+ (environment.GITHUB_REPOSITORY !== config.repository ||
14
+ environment.GITHUB_REF !== "refs/heads/main"))
15
+ fail("CI deployment is restricted to the configured repository main branch.");
16
+ await inspectReferences(config, request); // Check every identity before building or uploading any site.
17
+ const stages = [];
18
+ try {
19
+ for (const site of Object.values(config.sites)) {
20
+ const buildEnv = Object.fromEntries(Object.entries(environment).filter(([k]) => !k.startsWith("VERCEL_")));
21
+ await run(site.build[0], site.build.slice(1), root, buildEnv);
22
+ stages.push([site, stageSite(root, site, config.account)]);
23
+ }
24
+ for (const [site, stage] of stages) {
25
+ const args = [
26
+ "--yes",
27
+ "vercel@63.1.2",
28
+ "deploy",
29
+ "--prebuilt",
30
+ "--yes",
31
+ ...(target === "production" ? ["--prod"] : []),
32
+ "--token",
33
+ environment.VERCEL_TOKEN,
34
+ ];
35
+ await run("npx", args, stage, {
36
+ ...environment,
37
+ VERCEL_PROJECT_ID: site.projectId,
38
+ VERCEL_ORG_ID: config.account.id,
39
+ });
40
+ }
41
+ }
42
+ finally {
43
+ for (const [, stage] of stages)
44
+ rmSync(stage, { recursive: true, force: true });
45
+ }
46
+ };
47
+ //# sourceMappingURL=deploy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../src/deploy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAO3D,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,MAAM,CAAC,MAAM,MAAM,GAAG,KAAK,EACzB,MAAoB,EACpB,IAAY,EACZ,OAAsB,EACtB,GAAe,EACf,WAA8B,EAC9B,MAAM,GAAG,YAAY,EACrB,EAAE;IACF,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC7B,IAAI,MAAM,CAAC,QAAQ,KAAK,IAAI;QAC1B,IAAI,CACF,iIAAiI,CAClI,CAAC;IACJ,IAAI,CAAC,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC7C,IAAI,CAAC,uCAAuC,CAAC,CAAC;IAChD,IACE,WAAW,CAAC,cAAc,KAAK,MAAM;QACrC,CAAC,WAAW,CAAC,iBAAiB,KAAK,MAAM,CAAC,UAAU;YAClD,WAAW,CAAC,UAAU,KAAK,iBAAiB,CAAC;QAE/C,IAAI,CACF,uEAAuE,CACxE,CAAC;IACJ,MAAM,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,8DAA8D;IACxG,MAAM,MAAM,GAAgC,EAAE,CAAC;IAE/C,IAAI,CAAC;QACH,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/C,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CACjC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CACtE,CAAC;YAEF,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;YAC/D,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC7D,CAAC;QAED,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;YACnC,MAAM,IAAI,GAAG;gBACX,OAAO;gBACP,eAAe;gBACf,QAAQ;gBACR,YAAY;gBACZ,OAAO;gBACP,GAAG,CAAC,MAAM,KAAK,YAAY,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC9C,SAAS;gBACT,WAAW,CAAC,YAAa;aAC1B,CAAC;YAEF,MAAM,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE;gBAC5B,GAAG,WAAW;gBACd,iBAAiB,EAAE,IAAI,CAAC,SAAS;gBACjC,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE;aACjC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;YAAS,CAAC;QACT,KAAK,MAAM,CAAC,EAAE,KAAK,CAAC,IAAI,MAAM;YAC5B,MAAM,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,CAAC;AACH,CAAC,CAAC"}
package/dist/fail.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export declare const fail: (message: string) => never;
2
+ //# sourceMappingURL=fail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fail.d.ts","sourceRoot":"","sources":["../src/fail.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,KAEvC,CAAC"}
package/dist/fail.js ADDED
@@ -0,0 +1,4 @@
1
+ export const fail = (message) => {
2
+ throw new Error(message);
3
+ };
4
+ //# sourceMappingURL=fail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fail.js","sourceRoot":"","sources":["../src/fail.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,IAAI,GAA+B,CAAC,OAAO,EAAE,EAAE;IAC1D,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;AAC3B,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { createCli } from "./createCli.js";
2
+ export { setup } from "./setup.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export { createCli } from "./createCli.js";
2
+ export { setup } from "./setup.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { VercelConfig, VercelRequest } from "./schemas.js";
2
+ export declare const inspectReferences: (config: VercelConfig, request: VercelRequest) => Promise<void>;
3
+ //# sourceMappingURL=inspectReferences.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspectReferences.d.ts","sourceRoot":"","sources":["../src/inspectReferences.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAEhE,eAAO,MAAM,iBAAiB,GAC5B,QAAQ,YAAY,EACpB,SAAS,aAAa,kBAavB,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { checkIdentity } from "./checkIdentity.js";
2
+ import { fail } from "./fail.js";
3
+ export const inspectReferences = async (config, request) => {
4
+ for (const site of Object.values(config.sites)) {
5
+ if (site.mode !== "existing")
6
+ fail(`Project ${site.projectName} is new. Create it explicitly, review and commit the returned reference before deployment.`);
7
+ checkIdentity(await request("GET", `/v9/projects/${site.projectId}`, config.account), site, config.account);
8
+ }
9
+ };
10
+ //# sourceMappingURL=inspectReferences.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspectReferences.js","sourceRoot":"","sources":["../src/inspectReferences.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EACpC,MAAoB,EACpB,OAAsB,EACtB,EAAE;IACF,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/C,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU;YAC1B,IAAI,CACF,WAAW,IAAI,CAAC,WAAW,4FAA4F,CACxH,CAAC;QACJ,aAAa,CACX,MAAM,OAAO,CAAC,KAAK,EAAE,gBAAgB,IAAI,CAAC,SAAS,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,EACtE,IAAI,EACJ,MAAM,CAAC,OAAO,CACf,CAAC;IACJ,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const inspectStaticTree: (path: string) => void;
2
+ //# sourceMappingURL=inspectStaticTree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspectStaticTree.d.ts","sourceRoot":"","sources":["../src/inspectStaticTree.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,iBAAiB,GAAI,MAAM,MAAM,SAc7C,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { lstatSync, readdirSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { fail } from "./fail.js";
4
+ export const inspectStaticTree = (path) => {
5
+ for (const name of readdirSync(path)) {
6
+ const p = join(path, name), stat = lstatSync(p);
7
+ if (stat.isSymbolicLink() ||
8
+ [".git", ".env", "node_modules"].includes(name) ||
9
+ name.startsWith(".env."))
10
+ fail(`Refusing unsafe static artifact entry: ${name}`);
11
+ if (stat.isDirectory())
12
+ inspectStaticTree(p);
13
+ else if (!stat.isFile())
14
+ fail("Static output contains a non-regular file.");
15
+ }
16
+ };
17
+ //# sourceMappingURL=inspectStaticTree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspectStaticTree.js","sourceRoot":"","sources":["../src/inspectStaticTree.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,IAAY,EAAE,EAAE;IAChD,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EACxB,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QAEtB,IACE,IAAI,CAAC,cAAc,EAAE;YACrB,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;YAC/C,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;YAExB,IAAI,CAAC,0CAA0C,IAAI,EAAE,CAAC,CAAC;QACzD,IAAI,IAAI,CAAC,WAAW,EAAE;YAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC;aACxC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAAE,IAAI,CAAC,4CAA4C,CAAC,CAAC;IAC9E,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare const packageRoot: string;
2
+ export declare const packageVersion: string;
3
+ //# sourceMappingURL=packageInfo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packageInfo.d.ts","sourceRoot":"","sources":["../src/packageInfo.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,WAAW,QAAmD,CAAC;AAC5E,eAAO,MAAM,cAAc,QAIhB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { z } from "zod";
5
+ export const packageRoot = dirname(dirname(fileURLToPath(import.meta.url)));
6
+ export const packageVersion = z
7
+ .object({ version: z.string() })
8
+ .parse(JSON.parse(readFileSync(join(packageRoot, "package.json"), "utf8"))).version;
9
+ //# sourceMappingURL=packageInfo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packageInfo.js","sourceRoot":"","sources":["../src/packageInfo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAC5E,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC;KAC5B,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;KAC/B,KAAK,CACJ,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC,CACpE,CAAC,OAAO,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type ServiceDeploy } from "@mp-lb/zapper/dist/arc/schemas.js";
2
+ export declare const parseSelection: (input: unknown) => Record<string, ServiceDeploy>;
3
+ //# sourceMappingURL=parseSelection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseSelection.d.ts","sourceRoot":"","sources":["../src/parseSelection.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,mCAAmC,CAAC;AAE3C,eAAO,MAAM,cAAc,GACzB,OAAO,OAAO,KACb,MAAM,CAAC,MAAM,EAAE,aAAa,CAc9B,CAAC"}