@mp-lb/arcnet 0.0.0-stage → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (239) hide show
  1. package/README.md +48 -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 +90 -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/secrets/assertNewSource.d.ts +3 -0
  107. package/dist/secrets/assertNewSource.d.ts.map +1 -0
  108. package/dist/secrets/assertNewSource.js +32 -0
  109. package/dist/secrets/assertNewSource.js.map +1 -0
  110. package/dist/secrets/config.d.ts +37 -0
  111. package/dist/secrets/config.d.ts.map +1 -0
  112. package/dist/secrets/config.js +67 -0
  113. package/dist/secrets/config.js.map +1 -0
  114. package/dist/secrets/createSecretsCommands.d.ts +3 -0
  115. package/dist/secrets/createSecretsCommands.d.ts.map +1 -0
  116. package/dist/secrets/createSecretsCommands.js +93 -0
  117. package/dist/secrets/createSecretsCommands.js.map +1 -0
  118. package/dist/secrets/loadSecrets.d.ts +3 -0
  119. package/dist/secrets/loadSecrets.d.ts.map +1 -0
  120. package/dist/secrets/loadSecrets.js +35 -0
  121. package/dist/secrets/loadSecrets.js.map +1 -0
  122. package/dist/secrets/promptPassword.d.ts +2 -0
  123. package/dist/secrets/promptPassword.d.ts.map +1 -0
  124. package/dist/secrets/promptPassword.js +42 -0
  125. package/dist/secrets/promptPassword.js.map +1 -0
  126. package/dist/secrets/provisionSource.d.ts +25 -0
  127. package/dist/secrets/provisionSource.d.ts.map +1 -0
  128. package/dist/secrets/provisionSource.js +141 -0
  129. package/dist/secrets/provisionSource.js.map +1 -0
  130. package/dist/secrets/readRemoteSource.d.ts +7 -0
  131. package/dist/secrets/readRemoteSource.d.ts.map +1 -0
  132. package/dist/secrets/readRemoteSource.js +32 -0
  133. package/dist/secrets/readRemoteSource.js.map +1 -0
  134. package/dist/secrets/runWithSecrets.d.ts +6 -0
  135. package/dist/secrets/runWithSecrets.d.ts.map +1 -0
  136. package/dist/secrets/runWithSecrets.js +59 -0
  137. package/dist/secrets/runWithSecrets.js.map +1 -0
  138. package/dist/secrets/secretCommand.d.ts +2 -0
  139. package/dist/secrets/secretCommand.d.ts.map +1 -0
  140. package/dist/secrets/secretCommand.js +17 -0
  141. package/dist/secrets/secretCommand.js.map +1 -0
  142. package/dist/secrets/selectSecrets.d.ts +3 -0
  143. package/dist/secrets/selectSecrets.d.ts.map +1 -0
  144. package/dist/secrets/selectSecrets.js +18 -0
  145. package/dist/secrets/selectSecrets.js.map +1 -0
  146. package/dist/secrets/syncSecrets.d.ts +10 -0
  147. package/dist/secrets/syncSecrets.d.ts.map +1 -0
  148. package/dist/secrets/syncSecrets.js +43 -0
  149. package/dist/secrets/syncSecrets.js.map +1 -0
  150. package/dist/secrets/wireSecretsWorkflows.d.ts +2 -0
  151. package/dist/secrets/wireSecretsWorkflows.d.ts.map +1 -0
  152. package/dist/secrets/wireSecretsWorkflows.js +48 -0
  153. package/dist/secrets/wireSecretsWorkflows.js.map +1 -0
  154. package/dist/secrets/withDeploymentSecrets.d.ts +2 -0
  155. package/dist/secrets/withDeploymentSecrets.d.ts.map +1 -0
  156. package/dist/secrets/withDeploymentSecrets.js +58 -0
  157. package/dist/secrets/withDeploymentSecrets.js.map +1 -0
  158. package/dist/secrets/writeSecretsWorkflow.d.ts +3 -0
  159. package/dist/secrets/writeSecretsWorkflow.d.ts.map +1 -0
  160. package/dist/secrets/writeSecretsWorkflow.js +60 -0
  161. package/dist/secrets/writeSecretsWorkflow.js.map +1 -0
  162. package/dist/selectNetwork.d.ts +26 -0
  163. package/dist/selectNetwork.d.ts.map +1 -0
  164. package/dist/selectNetwork.js +48 -0
  165. package/dist/selectNetwork.js.map +1 -0
  166. package/dist/setup.d.ts +2 -0
  167. package/dist/setup.d.ts.map +1 -0
  168. package/dist/setup.js +192 -0
  169. package/dist/setup.js.map +1 -0
  170. package/dist/setupReport.d.ts +8 -0
  171. package/dist/setupReport.d.ts.map +1 -0
  172. package/dist/setupReport.js +2 -0
  173. package/dist/setupReport.js.map +1 -0
  174. package/dist/setupVercel.d.ts +9 -0
  175. package/dist/setupVercel.d.ts.map +1 -0
  176. package/dist/setupVercel.js +72 -0
  177. package/dist/setupVercel.js.map +1 -0
  178. package/dist/stageSite.d.ts +3 -0
  179. package/dist/stageSite.d.ts.map +1 -0
  180. package/dist/stageSite.js +31 -0
  181. package/dist/stageSite.js.map +1 -0
  182. package/dist/validateConfig.d.ts +3 -0
  183. package/dist/validateConfig.d.ts.map +1 -0
  184. package/dist/validateConfig.js +17 -0
  185. package/dist/validateConfig.js.map +1 -0
  186. package/docs/public/commands.md +132 -0
  187. package/docs/public/llms-full.txt +182 -0
  188. package/package.json +50 -3
  189. package/src/addDependency.ts +41 -0
  190. package/src/apiClient.ts +51 -0
  191. package/src/checkIdentity.ts +18 -0
  192. package/src/ciOutputs.ts +47 -0
  193. package/src/cli.ts +11 -0
  194. package/src/createCli.ts +128 -0
  195. package/src/createProject.ts +66 -0
  196. package/src/createSetupCommand.ts +16 -0
  197. package/src/deploy.ts +71 -0
  198. package/src/fail.ts +3 -0
  199. package/src/index.ts +2 -0
  200. package/src/inspectReferences.ts +20 -0
  201. package/src/inspectStaticTree.ts +19 -0
  202. package/src/packageInfo.ts +10 -0
  203. package/src/parseSelection.ts +22 -0
  204. package/src/parseSetupInput.ts +40 -0
  205. package/src/readSelection.ts +47 -0
  206. package/src/renderPlan.ts +27 -0
  207. package/src/renderResult.ts +18 -0
  208. package/src/resolveRepository.ts +38 -0
  209. package/src/runProcess.ts +26 -0
  210. package/src/runTerraform.ts +182 -0
  211. package/src/runVercel.ts +77 -0
  212. package/src/safePath.ts +43 -0
  213. package/src/safeTargetPath.ts +32 -0
  214. package/src/schemas.ts +126 -0
  215. package/src/secrets/assertNewSource.ts +40 -0
  216. package/src/secrets/config.ts +91 -0
  217. package/src/secrets/createSecretsCommands.ts +189 -0
  218. package/src/secrets/loadSecrets.ts +53 -0
  219. package/src/secrets/promptPassword.ts +46 -0
  220. package/src/secrets/provisionSource.ts +238 -0
  221. package/src/secrets/readRemoteSource.ts +73 -0
  222. package/src/secrets/runWithSecrets.ts +71 -0
  223. package/src/secrets/secretCommand.ts +26 -0
  224. package/src/secrets/selectSecrets.ts +33 -0
  225. package/src/secrets/syncSecrets.ts +60 -0
  226. package/src/secrets/wireSecretsWorkflows.ts +57 -0
  227. package/src/secrets/withDeploymentSecrets.ts +77 -0
  228. package/src/secrets/writeSecretsWorkflow.ts +83 -0
  229. package/src/selectNetwork.ts +73 -0
  230. package/src/setup.ts +277 -0
  231. package/src/setupReport.ts +11 -0
  232. package/src/setupVercel.ts +126 -0
  233. package/src/stageSite.ts +54 -0
  234. package/src/validateConfig.ts +22 -0
  235. package/templates/deploy-arc.yaml +73 -0
  236. package/templates/deploy-vercel.yaml +43 -0
  237. package/templates/network.yaml +105 -0
  238. package/templates/vercel-static/main.tf +128 -0
  239. package/templates/vercel-static/module.yaml +51 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safePath.js","sourceRoot":"","sources":["../src/safePath.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,IAAY,EAAE,EAAE;IACrD,IACE,OAAO,IAAI,KAAK,QAAQ;QACxB,CAAC,IAAI;QACL,UAAU,CAAC,IAAI,CAAC;QAChB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QAEnB,IAAI,CAAC,mCAAmC,CAAC,CAAC;IAE5C,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,EAChC,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAE/B,IACE,CAAC,GAAG;QACJ,GAAG,KAAK,IAAI;QACZ,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC;QACrB,GAAG;aACA,KAAK,CAAC,GAAG,CAAC;aACV,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC/D,wBAAwB,CAAC,IAAI,CAAC,GAAG,CAAC;QAElC,IAAI,CAAC,uCAAuC,IAAI,EAAE,CAAC,CAAC;IACtD,IAAI,EAAE,GAAG,IAAI,CAAC;IAEd,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QAClC,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACpB,IAAI,IAAI,CAAC;QAET,IAAI,CAAC;YACH,IAAI,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;QACvB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAK,CAA2B,CAAC,IAAI,KAAK,QAAQ;gBAAE,MAAM,CAAC,CAAC;QAC9D,CAAC;QAED,IAAI,IAAI,EAAE,cAAc,EAAE;YAAE,IAAI,CAAC,wBAAwB,IAAI,EAAE,CAAC,CAAC;IACnE,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const safeTargetPath: (root: string, name: string) => string;
2
+ //# sourceMappingURL=safeTargetPath.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safeTargetPath.d.ts","sourceRoot":"","sources":["../src/safeTargetPath.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,cAAc,GAAI,MAAM,MAAM,EAAE,MAAM,MAAM,WA2BxD,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { lstatSync } from "node:fs";
2
+ import { isAbsolute, join, relative, resolve } from "node:path";
3
+ import { fail } from "./fail.js";
4
+ export const safeTargetPath = (root, name) => {
5
+ const target = resolve(root, name);
6
+ if (!name ||
7
+ isAbsolute(name) ||
8
+ relative(root, target) === ".." ||
9
+ relative(root, target).startsWith("../"))
10
+ fail(`Path must stay within the project: ${name}`);
11
+ let at = root;
12
+ for (const part of relative(root, target).split("/")) {
13
+ at = join(at, part);
14
+ let stat;
15
+ try {
16
+ stat = lstatSync(at);
17
+ }
18
+ catch (error) {
19
+ if (error.code !== "ENOENT")
20
+ throw error;
21
+ }
22
+ if (stat?.isSymbolicLink())
23
+ fail(`Refusing symlink: ${name}`);
24
+ if (stat && at !== target && !stat.isDirectory())
25
+ fail(`Parent path is not a directory: ${name}`);
26
+ }
27
+ return target;
28
+ };
29
+ //# sourceMappingURL=safeTargetPath.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safeTargetPath.js","sourceRoot":"","sources":["../src/safeTargetPath.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,IAAY,EAAE,IAAY,EAAE,EAAE;IAC3D,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACnC,IACE,CAAC,IAAI;QACL,UAAU,CAAC,IAAI,CAAC;QAChB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,IAAI;QAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC;QAExC,IAAI,CAAC,sCAAsC,IAAI,EAAE,CAAC,CAAC;IACrD,IAAI,EAAE,GAAG,IAAI,CAAC;IAEd,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACrD,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACpB,IAAI,IAAI,CAAC;QAET,IAAI,CAAC;YACH,IAAI,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;gBAAE,MAAM,KAAK,CAAC;QACtE,CAAC;QAED,IAAI,IAAI,EAAE,cAAc,EAAE;YAAE,IAAI,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAC;QAC9D,IAAI,IAAI,IAAI,EAAE,KAAK,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YAC9C,IAAI,CAAC,mCAAmC,IAAI,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC"}
@@ -0,0 +1,106 @@
1
+ import { z } from "zod";
2
+ declare const accountSchema: z.ZodObject<{
3
+ type: z.ZodEnum<{
4
+ team: "team";
5
+ personal: "personal";
6
+ }>;
7
+ id: z.ZodString;
8
+ }, z.core.$strict>;
9
+ declare const siteSchema: z.ZodObject<{
10
+ mode: z.ZodEnum<{
11
+ existing: "existing";
12
+ new: "new";
13
+ }>;
14
+ projectId: z.ZodOptional<z.ZodString>;
15
+ projectName: z.ZodString;
16
+ creationApproved: z.ZodOptional<z.ZodBoolean>;
17
+ build: z.ZodArray<z.ZodString>;
18
+ output: z.ZodString;
19
+ outputConfig: z.ZodObject<{
20
+ version: z.ZodLiteral<3>;
21
+ routes: z.ZodOptional<z.ZodArray<z.ZodUnknown>>;
22
+ overrides: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
23
+ }, z.core.$strict>;
24
+ }, z.core.$strict>;
25
+ export declare const vercelInputSchema: z.ZodObject<{
26
+ repository: z.ZodString;
27
+ account: z.ZodObject<{
28
+ type: z.ZodEnum<{
29
+ team: "team";
30
+ personal: "personal";
31
+ }>;
32
+ id: z.ZodString;
33
+ }, z.core.$strict>;
34
+ sites: z.ZodRecord<z.ZodString, z.ZodObject<{
35
+ mode: z.ZodEnum<{
36
+ existing: "existing";
37
+ new: "new";
38
+ }>;
39
+ projectId: z.ZodOptional<z.ZodString>;
40
+ projectName: z.ZodString;
41
+ creationApproved: z.ZodOptional<z.ZodBoolean>;
42
+ build: z.ZodArray<z.ZodString>;
43
+ output: z.ZodString;
44
+ outputConfig: z.ZodObject<{
45
+ version: z.ZodLiteral<3>;
46
+ routes: z.ZodOptional<z.ZodArray<z.ZodUnknown>>;
47
+ overrides: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
48
+ }, z.core.$strict>;
49
+ }, z.core.$strict>>;
50
+ }, z.core.$strict>;
51
+ export declare const vercelConfigSchema: z.ZodObject<{
52
+ repository: z.ZodString;
53
+ account: z.ZodObject<{
54
+ type: z.ZodEnum<{
55
+ team: "team";
56
+ personal: "personal";
57
+ }>;
58
+ id: z.ZodString;
59
+ }, z.core.$strict>;
60
+ sites: z.ZodRecord<z.ZodString, z.ZodObject<{
61
+ mode: z.ZodEnum<{
62
+ existing: "existing";
63
+ new: "new";
64
+ }>;
65
+ projectId: z.ZodOptional<z.ZodString>;
66
+ projectName: z.ZodString;
67
+ creationApproved: z.ZodOptional<z.ZodBoolean>;
68
+ build: z.ZodArray<z.ZodString>;
69
+ output: z.ZodString;
70
+ outputConfig: z.ZodObject<{
71
+ version: z.ZodLiteral<3>;
72
+ routes: z.ZodOptional<z.ZodArray<z.ZodUnknown>>;
73
+ overrides: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
74
+ }, z.core.$strict>;
75
+ }, z.core.$strict>>;
76
+ version: z.ZodLiteral<1>;
77
+ mode: z.ZodLiteral<"vercel">;
78
+ slug: z.ZodString;
79
+ approved: z.ZodBoolean;
80
+ }, z.core.$strict>;
81
+ export declare const vercelResponseSchema: z.ZodObject<{
82
+ id: z.ZodOptional<z.ZodString>;
83
+ name: z.ZodOptional<z.ZodString>;
84
+ accountId: z.ZodOptional<z.ZodString>;
85
+ user: z.ZodOptional<z.ZodObject<{
86
+ id: z.ZodString;
87
+ }, z.core.$strip>>;
88
+ }, z.core.$strip>;
89
+ export type VercelConfig = z.infer<typeof vercelConfigSchema>;
90
+ export type VercelSite = z.infer<typeof siteSchema>;
91
+ export type VercelAccount = z.infer<typeof accountSchema>;
92
+ export type VercelResponse = z.infer<typeof vercelResponseSchema>;
93
+ export type VercelRequest = (method: string, path: string, account: VercelAccount, body?: unknown) => Promise<VercelResponse | null>;
94
+ export type RunProcess = (command: string, args: string[], cwd: string, env: NodeJS.ProcessEnv) => void | Promise<void>;
95
+ export declare const terraformConfigSchema: z.ZodObject<{
96
+ version: z.ZodLiteral<1>;
97
+ slug: z.ZodString;
98
+ repository: z.ZodString;
99
+ approved: z.ZodBoolean;
100
+ services: z.ZodArray<z.ZodString>;
101
+ workloadIdentityProvider: z.ZodString;
102
+ serviceAccount: z.ZodString;
103
+ }, z.core.$strip>;
104
+ export declare const envPoolSchema: z.ZodRecord<z.ZodString, z.ZodString>;
105
+ export {};
106
+ //# sourceMappingURL=schemas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAOxB,QAAA,MAAM,aAAa;;;;;;kBAYhB,CAAC;AAEJ,QAAA,MAAM,UAAU;;;;;;;;;;;;;;;kBAyCb,CAAC;AAYJ,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;kBAQnB,CAAC;AACZ,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAOpB,CAAC;AACZ,eAAO,MAAM,oBAAoB;;;;;;;iBAK/B,CAAC;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC9D,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AACpD,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAC1D,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAClE,MAAM,MAAM,aAAa,GAAG,CAC1B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,aAAa,EACtB,IAAI,CAAC,EAAE,OAAO,KACX,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;AACpC,MAAM,MAAM,UAAU,GAAG,CACvB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,CAAC,UAAU,KACnB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAC1B,eAAO,MAAM,qBAAqB;;;;;;;;iBAQhC,CAAC;AACH,eAAO,MAAM,aAAa,uCAGzB,CAAC"}
@@ -0,0 +1,85 @@
1
+ import { z } from "zod";
2
+ const projectName = z
3
+ .string()
4
+ .regex(/^[a-z0-9][a-z0-9-]{0,99}$/)
5
+ .refine((v) => !/REPLACE/i.test(v));
6
+ const accountSchema = z
7
+ .object({
8
+ type: z.enum(["team", "personal"]),
9
+ id: z
10
+ .string()
11
+ .regex(/^[A-Za-z0-9_]{3,128}$/)
12
+ .refine((v) => !/REPLACE/i.test(v)),
13
+ })
14
+ .strict()
15
+ .refine((a) => a.type !== "team" || a.id.startsWith("team_"), "Supply the exact Vercel account ID and type.");
16
+ const siteSchema = z
17
+ .object({
18
+ mode: z.enum(["existing", "new"]),
19
+ projectId: z
20
+ .string()
21
+ .regex(/^prj_[A-Za-z0-9]+$/)
22
+ .refine((v) => !/REPLACE/i.test(v))
23
+ .optional(),
24
+ projectName,
25
+ creationApproved: z.boolean().optional(),
26
+ build: z
27
+ .array(z
28
+ .string()
29
+ .min(1)
30
+ .refine((v) => !/myshop|[\n\r\0]/i.test(v), "MyShop must remain local-only."))
31
+ .min(1)
32
+ .refine((v) => v[0] === "pnpm", "Build must be an explicit pnpm argument array."),
33
+ output: z.string(),
34
+ outputConfig: z
35
+ .object({
36
+ version: z.literal(3),
37
+ routes: z.array(z.unknown()).optional(),
38
+ overrides: z.record(z.string(), z.unknown()).optional(),
39
+ })
40
+ .strict(),
41
+ })
42
+ .strict()
43
+ .refine((s) => s.mode === "existing"
44
+ ? Boolean(s.projectId) && s.creationApproved === undefined
45
+ : s.projectId === undefined && typeof s.creationApproved === "boolean", "Existing sites require projectId; new sites require creationApproved.");
46
+ const sitesSchema = z
47
+ .record(z
48
+ .string()
49
+ .regex(/^[a-z][a-z0-9-]*$/)
50
+ .refine((v) => !/myshop/i.test(v), "MyShop is local-only."), siteSchema)
51
+ .refine((v) => Object.keys(v).length > 0, "Select at least one static site.");
52
+ export const vercelInputSchema = z
53
+ .object({
54
+ repository: z
55
+ .string()
56
+ .regex(/^[A-Za-z0-9][A-Za-z0-9-]*\/[A-Za-z0-9][A-Za-z0-9._-]*$/),
57
+ account: accountSchema,
58
+ sites: sitesSchema,
59
+ })
60
+ .strict();
61
+ export const vercelConfigSchema = vercelInputSchema
62
+ .extend({
63
+ version: z.literal(1),
64
+ mode: z.literal("vercel"),
65
+ slug: z.string().regex(/^[a-z][a-z0-9-]{0,22}$/),
66
+ approved: z.boolean(),
67
+ })
68
+ .strict();
69
+ export const vercelResponseSchema = z.object({
70
+ id: z.string().optional(),
71
+ name: z.string().optional(),
72
+ accountId: z.string().optional(),
73
+ user: z.object({ id: z.string() }).optional(),
74
+ });
75
+ export const terraformConfigSchema = z.object({
76
+ version: z.literal(1),
77
+ slug: z.string(),
78
+ repository: z.string(),
79
+ approved: z.boolean(),
80
+ services: z.array(z.string()),
81
+ workloadIdentityProvider: z.string(),
82
+ serviceAccount: z.string(),
83
+ });
84
+ export const envPoolSchema = z.record(z.string().regex(/^[A-Z_][A-Z0-9_]*$/), z.string());
85
+ //# sourceMappingURL=schemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { SecretSource } from "./config.js";
2
+ export declare const assertNewSource: (source: SecretSource, root: string) => void;
3
+ //# sourceMappingURL=assertNewSource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assertNewSource.d.ts","sourceRoot":"","sources":["../../src/secrets/assertNewSource.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAIhD,eAAO,MAAM,eAAe,GAAI,QAAQ,YAAY,EAAE,MAAM,MAAM,SAkCjE,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { posix } from "node:path";
2
+ import { secretCommand } from "./secretCommand.js";
3
+ // fm's write API can overwrite without --force, so its default is not create-only.
4
+ export const assertNewSource = (source, root) => {
5
+ const listing = secretCommand("fm", [
6
+ "file",
7
+ "ls",
8
+ posix.dirname(source.path),
9
+ "--store",
10
+ source.store,
11
+ "--json",
12
+ ], root);
13
+ let names;
14
+ try {
15
+ names = listing
16
+ .trim()
17
+ .split("\n")
18
+ .filter(Boolean)
19
+ .map((line) => {
20
+ const entry = JSON.parse(line);
21
+ if (typeof entry.message !== "string")
22
+ throw new Error();
23
+ return entry.message;
24
+ });
25
+ }
26
+ catch {
27
+ throw new Error("Cannot verify that the new Forum path is unused.");
28
+ }
29
+ if (names.includes(posix.basename(source.path)))
30
+ throw new Error("Forum file already exists; use secrets add to attach it without replacing its contents.");
31
+ };
32
+ //# sourceMappingURL=assertNewSource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assertNewSource.js","sourceRoot":"","sources":["../../src/secrets/assertNewSource.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,mFAAmF;AACnF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,MAAoB,EAAE,IAAY,EAAE,EAAE;IACpE,MAAM,OAAO,GAAG,aAAa,CAC3B,IAAI,EACJ;QACE,MAAM;QACN,IAAI;QACJ,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;QAC1B,SAAS;QACT,MAAM,CAAC,KAAK;QACZ,QAAQ;KACT,EACD,IAAI,CACL,CAAC;IAEF,IAAI,KAAe,CAAC;IAEpB,IAAI,CAAC;QACH,KAAK,GAAG,OAAO;aACZ,IAAI,EAAE;aACN,KAAK,CAAC,IAAI,CAAC;aACX,MAAM,CAAC,OAAO,CAAC;aACf,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACZ,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA0B,CAAC;YACxD,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ;gBAAE,MAAM,IAAI,KAAK,EAAE,CAAC;YACzD,OAAO,KAAK,CAAC,OAAO,CAAC;QACvB,CAAC,CAAC,CAAC;IACP,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IAED,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC7C,MAAM,IAAI,KAAK,CACb,yFAAyF,CAC1F,CAAC;AACN,CAAC,CAAC"}
@@ -0,0 +1,37 @@
1
+ import { z } from "zod";
2
+ export declare const envName: z.ZodString;
3
+ export declare const sourceSchema: z.ZodObject<{
4
+ name: z.ZodString;
5
+ store: z.ZodString;
6
+ path: z.ZodString;
7
+ keyEnv: z.ZodString;
8
+ tokenEnv: z.ZodOptional<z.ZodString>;
9
+ snapshot: z.ZodOptional<z.ZodObject<{
10
+ file: z.ZodString;
11
+ fileId: z.ZodString;
12
+ revision: z.ZodNumber;
13
+ sha256: z.ZodString;
14
+ }, z.core.$strict>>;
15
+ }, z.core.$strict>;
16
+ export declare const secretsConfigSchema: z.ZodObject<{
17
+ version: z.ZodLiteral<1>;
18
+ repository: z.ZodString;
19
+ sources: z.ZodArray<z.ZodObject<{
20
+ name: z.ZodString;
21
+ store: z.ZodString;
22
+ path: z.ZodString;
23
+ keyEnv: z.ZodString;
24
+ tokenEnv: z.ZodOptional<z.ZodString>;
25
+ snapshot: z.ZodOptional<z.ZodObject<{
26
+ file: z.ZodString;
27
+ fileId: z.ZodString;
28
+ revision: z.ZodNumber;
29
+ sha256: z.ZodString;
30
+ }, z.core.$strict>>;
31
+ }, z.core.$strict>>;
32
+ consumers: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>>>>;
33
+ }, z.core.$strict>;
34
+ export type SecretsConfig = z.infer<typeof secretsConfigSchema>;
35
+ export type SecretSource = z.infer<typeof sourceSchema>;
36
+ export declare const readSecretsConfig: (root: string, file?: string) => SecretsConfig;
37
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/secrets/config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,OAAO,aAAyC,CAAC;AAC9D,eAAO,MAAM,YAAY;;;;;;;;;;;;kBA4Bd,CAAC;AACZ,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;kBAuC5B,CAAC;AACL,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAChE,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAExD,eAAO,MAAM,iBAAiB,GAC5B,MAAM,MAAM,EACZ,aAA6B,KAC5B,aAUF,CAAC"}
@@ -0,0 +1,67 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { z } from "zod";
3
+ import { safeTargetPath } from "../safeTargetPath.js";
4
+ export const envName = z.string().regex(/^[A-Z_][A-Z0-9_]*$/);
5
+ export const sourceSchema = z
6
+ .object({
7
+ name: z.string().regex(/^[a-z][a-z0-9-]*$/),
8
+ store: z.string().regex(/^[\w-]+\/[\w-]+$/),
9
+ path: z
10
+ .string()
11
+ .startsWith("/")
12
+ .endsWith(".enc")
13
+ .refine((path) => !/[\r\n\0]/.test(path) &&
14
+ path
15
+ .split("/")
16
+ .slice(1)
17
+ .every((part) => part && part !== "." && part !== "..")),
18
+ keyEnv: envName,
19
+ tokenEnv: envName.optional(),
20
+ snapshot: z
21
+ .object({
22
+ file: z.string(),
23
+ fileId: z.string().min(1),
24
+ revision: z.number().int().nonnegative(),
25
+ sha256: z.string().regex(/^[a-f0-9]{64}$/),
26
+ })
27
+ .strict()
28
+ .optional(),
29
+ })
30
+ .strict();
31
+ export const secretsConfigSchema = z
32
+ .object({
33
+ version: z.literal(1),
34
+ repository: z.string().regex(/^[\w.-]+\/[\w.-]+$/),
35
+ sources: z.array(sourceSchema).min(1),
36
+ consumers: z
37
+ .record(z.string(), z.record(z.string().min(1), z.union([envName, z.array(envName).min(1)])))
38
+ .default({}),
39
+ })
40
+ .strict()
41
+ .superRefine((config, ctx) => {
42
+ if (new Set(config.sources.map((s) => s.name)).size !== config.sources.length)
43
+ ctx.addIssue({ code: "custom", message: "Source names must be unique." });
44
+ if (new Set(config.sources.map((s) => s.keyEnv)).size !==
45
+ config.sources.length)
46
+ ctx.addIssue({
47
+ code: "custom",
48
+ message: "Each source needs its own key environment name.",
49
+ });
50
+ for (const mapping of Object.values(config.consumers))
51
+ for (const name of Object.keys(mapping))
52
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(name) &&
53
+ name !== "pnpm_config_//registry.npmjs.org/:_authToken")
54
+ ctx.addIssue({
55
+ code: "custom",
56
+ message: "Invalid output environment name.",
57
+ });
58
+ });
59
+ export const readSecretsConfig = (root, file = ".arcnet/secrets.json") => {
60
+ try {
61
+ return secretsConfigSchema.parse(JSON.parse(readFileSync(safeTargetPath(root, file), "utf8")));
62
+ }
63
+ catch {
64
+ throw new Error("Missing or invalid secrets configuration (values omitted).");
65
+ }
66
+ };
67
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/secrets/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const createSecretsCommands: (cli: Command, output: (value: unknown) => void) => void;
3
+ //# sourceMappingURL=createSecretsCommands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createSecretsCommands.d.ts","sourceRoot":"","sources":["../../src/secrets/createSecretsCommands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,eAAO,MAAM,qBAAqB,GAChC,KAAK,OAAO,EACZ,QAAQ,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,SAgLjC,CAAC"}
@@ -0,0 +1,93 @@
1
+ import { realpathSync } from "node:fs";
2
+ import { readSecretsConfig } from "./config.js";
3
+ import { loadSecrets } from "./loadSecrets.js";
4
+ import { provisionSource } from "./provisionSource.js";
5
+ import { runWithSecrets } from "./runWithSecrets.js";
6
+ import { selectSecrets } from "./selectSecrets.js";
7
+ import { syncSecrets } from "./syncSecrets.js";
8
+ import { writeSecretsWorkflow } from "./writeSecretsWorkflow.js";
9
+ export const createSecretsCommands = (cli, output) => {
10
+ const env = cli
11
+ .command("env")
12
+ .description("Load ordered encrypted Forum sources and select environment values.");
13
+ for (const action of ["check", "export", "run"]) {
14
+ const command = env
15
+ .command(action)
16
+ .description({
17
+ check: "Validate decryption and mappings; report key names only.",
18
+ export: "Write selected plaintext JSON to stdout for an explicit pipeline.",
19
+ run: "Run a command with selected keys only; withhold child output.",
20
+ }[action])
21
+ .option("--config <file>", "Secrets source configuration", ".arcnet/secrets.json")
22
+ .option("--consumer <name>", "Named mapping in the secrets configuration")
23
+ .option("--live", "Fetch current ciphertext through the installed fm CLI instead of snapshots");
24
+ if (action === "run")
25
+ command.argument("<command...>", "Executable and arguments after --");
26
+ command.action(async (...args) => {
27
+ const options = command.opts();
28
+ const root = realpathSync(cli.opts().root);
29
+ const config = readSecretsConfig(root, options.config);
30
+ if (process.env.GITHUB_ACTIONS === "true" &&
31
+ (process.env.GITHUB_REPOSITORY !== config.repository ||
32
+ process.env.GITHUB_REF !== "refs/heads/main"))
33
+ throw new Error("Secrets commands in CI require the configured repository main branch.");
34
+ if (action !== "check" && !options.consumer)
35
+ throw new Error("Choose --consumer to explicitly select output keys.");
36
+ const values = await loadSecrets(config, root, process.env, options.live);
37
+ const names = options.consumer
38
+ ? [options.consumer]
39
+ : Object.keys(config.consumers);
40
+ const selected = Object.fromEntries(names.map((name) => [name, selectSecrets(values, config, name)]));
41
+ if (action === "export")
42
+ process.stdout.write(JSON.stringify(selected[options.consumer]) + "\n");
43
+ else if (action === "run")
44
+ output(runWithSecrets(args[0], selected[options.consumer], root));
45
+ else
46
+ output({
47
+ operation: "env.check",
48
+ status: "passed",
49
+ sources: config.sources.map((source) => source.name),
50
+ consumers: Object.fromEntries(Object.entries(selected).map(([name, value]) => [
51
+ name,
52
+ Object.keys(value),
53
+ ])),
54
+ message: "Decryption, merge and required-key checks passed; provider authorization was not tested.",
55
+ });
56
+ });
57
+ }
58
+ const secrets = cli
59
+ .command("secrets")
60
+ .description("Attach Forum files, provision GitHub keys and refresh encrypted snapshots.");
61
+ for (const mode of ["add", "init"]) {
62
+ const command = secrets
63
+ .command(mode)
64
+ .description(mode === "add"
65
+ ? "Attach an existing Forum file and provision its CI key."
66
+ : "Create a Forum secrets file, prompt for your password and provision its CI key.")
67
+ .requiredOption("--name <name>", "Unique source name; sources merge in installation order")
68
+ .requiredOption("--store <workspace/store>", "Forum store")
69
+ .requiredOption("--path <path>", "Encrypted file path in Forum")
70
+ .requiredOption("--key-env <name>", "GitHub repository secret / environment variable for this file's key")
71
+ .requiredOption("--repository <owner/repo>", "GitHub repository receiving the key")
72
+ .option("--config <file>", "Secrets source configuration", ".arcnet/secrets.json");
73
+ if (mode === "add")
74
+ command.option("--existing-key", "Reuse an existing GitHub secret without creating a recipient");
75
+ else
76
+ command.option("--input <file>", "Initial plaintext JSON file; defaults to an empty object");
77
+ command.action(async () => output(await provisionSource(mode, {
78
+ ...command.opts(),
79
+ noninteractive: cli.opts().noninteractive,
80
+ }, realpathSync(cli.opts().root), command.opts().config)));
81
+ }
82
+ secrets
83
+ .command("sync")
84
+ .description("Refresh encrypted snapshots from Forum and regenerate validation CI; no decryption.")
85
+ .option("--config <file>", "Secrets source configuration", ".arcnet/secrets.json")
86
+ .action((options) => {
87
+ const root = realpathSync(cli.opts().root);
88
+ const result = syncSecrets(readSecretsConfig(root, options.config), root, options.config);
89
+ writeSecretsWorkflow(readSecretsConfig(root, options.config), root, options.config);
90
+ output(result);
91
+ });
92
+ };
93
+ //# sourceMappingURL=createSecretsCommands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createSecretsCommands.js","sourceRoot":"","sources":["../../src/secrets/createSecretsCommands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { SecretsConfig } from "./config.js";
2
+ export declare const loadSecrets: (config: SecretsConfig, root: string, environment?: NodeJS.ProcessEnv, live?: boolean) => Promise<Record<string, unknown>>;
3
+ //# sourceMappingURL=loadSecrets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadSecrets.d.ts","sourceRoot":"","sources":["../../src/secrets/loadSecrets.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD,eAAO,MAAM,WAAW,GACtB,QAAQ,aAAa,EACrB,MAAM,MAAM,EACZ,+BAAyB,EACzB,cAAY,qCAyCb,CAAC"}
@@ -0,0 +1,35 @@
1
+ import { decryptForumEncryptedFileText } from "@mp-lb/forum-secrets";
2
+ import { createHash } from "node:crypto";
3
+ import { readFileSync } from "node:fs";
4
+ import { safeTargetPath } from "../safeTargetPath.js";
5
+ import { readRemoteSource } from "./readRemoteSource.js";
6
+ export const loadSecrets = async (config, root, environment = process.env, live = false) => {
7
+ let values = {};
8
+ for (const source of config.sources) {
9
+ const key = environment[source.keyEnv];
10
+ if (!key)
11
+ throw new Error(`Missing decryption credential: ${source.keyEnv}.`);
12
+ try {
13
+ const text = !live && source.snapshot
14
+ ? readFileSync(safeTargetPath(root, source.snapshot.file), "utf8")
15
+ : readRemoteSource(source, root, environment).text;
16
+ if (!live &&
17
+ source.snapshot &&
18
+ createHash("sha256").update(text).digest("hex") !==
19
+ source.snapshot.sha256)
20
+ throw new Error("Snapshot integrity mismatch");
21
+ const decoded = JSON.parse(await decryptForumEncryptedFileText({
22
+ encryptedText: text,
23
+ recipientSecret: key,
24
+ }));
25
+ if (!decoded || Array.isArray(decoded) || typeof decoded !== "object")
26
+ throw new Error("Not an object");
27
+ values = { ...values, ...decoded };
28
+ }
29
+ catch {
30
+ throw new Error(`Source ${source.name} failed to load or decrypt; check its key and snapshot integrity (values omitted).`);
31
+ }
32
+ }
33
+ return values;
34
+ };
35
+ //# sourceMappingURL=loadSecrets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadSecrets.js","sourceRoot":"","sources":["../../src/secrets/loadSecrets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,6BAA6B,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,EAC9B,MAAqB,EACrB,IAAY,EACZ,WAAW,GAAG,OAAO,CAAC,GAAG,EACzB,IAAI,GAAG,KAAK,EACZ,EAAE;IACF,IAAI,MAAM,GAA4B,EAAE,CAAC;IAEzC,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACpC,MAAM,GAAG,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACvC,IAAI,CAAC,GAAG;YACN,MAAM,IAAI,KAAK,CAAC,kCAAkC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QAEtE,IAAI,CAAC;YACH,MAAM,IAAI,GACR,CAAC,IAAI,IAAI,MAAM,CAAC,QAAQ;gBACtB,CAAC,CAAC,YAAY,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;gBAClE,CAAC,CAAC,gBAAgB,CAAC,MAAM,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC;YAEvD,IACE,CAAC,IAAI;gBACL,MAAM,CAAC,QAAQ;gBACf,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;oBAC7C,MAAM,CAAC,QAAQ,CAAC,MAAM;gBAExB,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;YAEjD,MAAM,OAAO,GAAY,IAAI,CAAC,KAAK,CACjC,MAAM,6BAA6B,CAAC;gBAClC,aAAa,EAAE,IAAI;gBACnB,eAAe,EAAE,GAAG;aACrB,CAAC,CACH,CAAC;YAEF,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,OAAO,KAAK,QAAQ;gBACnE,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;YACnC,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC;QACrC,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CACb,UAAU,MAAM,CAAC,IAAI,oFAAoF,CAC1G,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const promptPassword: (noninteractive?: boolean) => Promise<string>;
2
+ //# sourceMappingURL=promptPassword.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promptPassword.d.ts","sourceRoot":"","sources":["../../src/secrets/promptPassword.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,GACzB,wBAAsB,KACrB,OAAO,CAAC,MAAM,CA2ChB,CAAC"}
@@ -0,0 +1,42 @@
1
+ export const promptPassword = async (noninteractive = false) => {
2
+ if (process.env.DOCTRINE_ENCRYPTION_PASSWORD)
3
+ return process.env.DOCTRINE_ENCRYPTION_PASSWORD;
4
+ if (noninteractive || !process.stdin.isTTY || !process.stderr.isTTY)
5
+ throw new Error("Run this command in your terminal to enter the Forum encryption password, or set DOCTRINE_ENCRYPTION_PASSWORD.");
6
+ return new Promise((resolve, reject) => {
7
+ let value = "";
8
+ const input = process.stdin;
9
+ const wasRaw = input.isRaw;
10
+ const finish = (cancel = false) => {
11
+ input.off("data", read);
12
+ input.setRawMode(wasRaw);
13
+ input.pause();
14
+ process.stderr.write("\n");
15
+ if (cancel || !value)
16
+ reject(new Error("Password entry cancelled."));
17
+ else
18
+ resolve(value);
19
+ };
20
+ const read = (chunk) => {
21
+ for (const character of chunk.toString("utf8")) {
22
+ if (character === "\u0003") {
23
+ finish(true);
24
+ return;
25
+ }
26
+ if (character === "\r" || character === "\n") {
27
+ finish();
28
+ return;
29
+ }
30
+ if (character === "\u007f")
31
+ value = [...value].slice(0, -1).join("");
32
+ else
33
+ value += character;
34
+ }
35
+ };
36
+ process.stderr.write("Forum encryption password: ");
37
+ input.setRawMode(true);
38
+ input.on("data", read);
39
+ input.resume();
40
+ });
41
+ };
42
+ //# sourceMappingURL=promptPassword.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promptPassword.js","sourceRoot":"","sources":["../../src/secrets/promptPassword.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EACjC,cAAc,GAAG,KAAK,EACL,EAAE;IACnB,IAAI,OAAO,CAAC,GAAG,CAAC,4BAA4B;QAC1C,OAAO,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC;IAClD,IAAI,cAAc,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK;QACjE,MAAM,IAAI,KAAK,CACb,gHAAgH,CACjH,CAAC;IACJ,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,KAAK,GAAG,EAAE,CAAC;QACf,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC5B,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC;QAE3B,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG,KAAK,EAAE,EAAE;YAChC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YACxB,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YACzB,KAAK,CAAC,KAAK,EAAE,CAAC;YACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3B,IAAI,MAAM,IAAI,CAAC,KAAK;gBAAE,MAAM,CAAC,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC,CAAC;;gBAChE,OAAO,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC,CAAC;QAEF,MAAM,IAAI,GAAG,CAAC,KAAa,EAAE,EAAE;YAC7B,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC/C,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;oBAC3B,MAAM,CAAC,IAAI,CAAC,CAAC;oBACb,OAAO;gBACT,CAAC;gBAED,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;oBAC7C,MAAM,EAAE,CAAC;oBACT,OAAO;gBACT,CAAC;gBAED,IAAI,SAAS,KAAK,QAAQ;oBAAE,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;;oBAChE,KAAK,IAAI,SAAS,CAAC;YAC1B,CAAC;QACH,CAAC,CAAC;QAEF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACpD,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACvB,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACvB,KAAK,CAAC,MAAM,EAAE,CAAC;IACjB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC"}