@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.
- package/README.md +48 -2
- package/dist/addDependency.d.ts +3 -0
- package/dist/addDependency.d.ts.map +1 -0
- package/dist/addDependency.js +29 -0
- package/dist/addDependency.js.map +1 -0
- package/dist/apiClient.d.ts +3 -0
- package/dist/apiClient.d.ts.map +1 -0
- package/dist/apiClient.js +39 -0
- package/dist/apiClient.js.map +1 -0
- package/dist/checkIdentity.d.ts +3 -0
- package/dist/checkIdentity.d.ts.map +1 -0
- package/dist/checkIdentity.js +9 -0
- package/dist/checkIdentity.js.map +1 -0
- package/dist/ciOutputs.d.ts +2 -0
- package/dist/ciOutputs.d.ts.map +1 -0
- package/dist/ciOutputs.js +31 -0
- package/dist/ciOutputs.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +9 -0
- package/dist/cli.js.map +1 -0
- package/dist/createCli.d.ts +3 -0
- package/dist/createCli.d.ts.map +1 -0
- package/dist/createCli.js +90 -0
- package/dist/createCli.js.map +1 -0
- package/dist/createProject.d.ts +26 -0
- package/dist/createProject.d.ts.map +1 -0
- package/dist/createProject.js +35 -0
- package/dist/createProject.js.map +1 -0
- package/dist/createSetupCommand.d.ts +3 -0
- package/dist/createSetupCommand.d.ts.map +1 -0
- package/dist/createSetupCommand.js +11 -0
- package/dist/createSetupCommand.js.map +1 -0
- package/dist/deploy.d.ts +3 -0
- package/dist/deploy.d.ts.map +1 -0
- package/dist/deploy.js +47 -0
- package/dist/deploy.js.map +1 -0
- package/dist/fail.d.ts +2 -0
- package/dist/fail.d.ts.map +1 -0
- package/dist/fail.js +4 -0
- package/dist/fail.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/inspectReferences.d.ts +3 -0
- package/dist/inspectReferences.d.ts.map +1 -0
- package/dist/inspectReferences.js +10 -0
- package/dist/inspectReferences.js.map +1 -0
- package/dist/inspectStaticTree.d.ts +2 -0
- package/dist/inspectStaticTree.d.ts.map +1 -0
- package/dist/inspectStaticTree.js +17 -0
- package/dist/inspectStaticTree.js.map +1 -0
- package/dist/packageInfo.d.ts +3 -0
- package/dist/packageInfo.d.ts.map +1 -0
- package/dist/packageInfo.js +9 -0
- package/dist/packageInfo.js.map +1 -0
- package/dist/parseSelection.d.ts +3 -0
- package/dist/parseSelection.d.ts.map +1 -0
- package/dist/parseSelection.js +13 -0
- package/dist/parseSelection.js.map +1 -0
- package/dist/parseSetupInput.d.ts +16 -0
- package/dist/parseSetupInput.d.ts.map +1 -0
- package/dist/parseSetupInput.js +34 -0
- package/dist/parseSetupInput.js.map +1 -0
- package/dist/readSelection.d.ts +15 -0
- package/dist/readSelection.d.ts.map +1 -0
- package/dist/readSelection.js +36 -0
- package/dist/readSelection.js.map +1 -0
- package/dist/renderPlan.d.ts +27 -0
- package/dist/renderPlan.d.ts.map +1 -0
- package/dist/renderPlan.js +25 -0
- package/dist/renderPlan.js.map +1 -0
- package/dist/renderResult.d.ts +5 -0
- package/dist/renderResult.d.ts.map +1 -0
- package/dist/renderResult.js +15 -0
- package/dist/renderResult.js.map +1 -0
- package/dist/resolveRepository.d.ts +2 -0
- package/dist/resolveRepository.d.ts.map +1 -0
- package/dist/resolveRepository.js +24 -0
- package/dist/resolveRepository.js.map +1 -0
- package/dist/runProcess.d.ts +2 -0
- package/dist/runProcess.d.ts.map +1 -0
- package/dist/runProcess.js +16 -0
- package/dist/runProcess.js.map +1 -0
- package/dist/runTerraform.d.ts +8 -0
- package/dist/runTerraform.d.ts.map +1 -0
- package/dist/runTerraform.js +111 -0
- package/dist/runTerraform.js.map +1 -0
- package/dist/runVercel.d.ts +34 -0
- package/dist/runVercel.d.ts.map +1 -0
- package/dist/runVercel.js +52 -0
- package/dist/runVercel.js.map +1 -0
- package/dist/safePath.d.ts +2 -0
- package/dist/safePath.d.ts.map +1 -0
- package/dist/safePath.js +35 -0
- package/dist/safePath.js.map +1 -0
- package/dist/safeTargetPath.d.ts +2 -0
- package/dist/safeTargetPath.d.ts.map +1 -0
- package/dist/safeTargetPath.js +29 -0
- package/dist/safeTargetPath.js.map +1 -0
- package/dist/schemas.d.ts +106 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +85 -0
- package/dist/schemas.js.map +1 -0
- package/dist/secrets/assertNewSource.d.ts +3 -0
- package/dist/secrets/assertNewSource.d.ts.map +1 -0
- package/dist/secrets/assertNewSource.js +32 -0
- package/dist/secrets/assertNewSource.js.map +1 -0
- package/dist/secrets/config.d.ts +37 -0
- package/dist/secrets/config.d.ts.map +1 -0
- package/dist/secrets/config.js +67 -0
- package/dist/secrets/config.js.map +1 -0
- package/dist/secrets/createSecretsCommands.d.ts +3 -0
- package/dist/secrets/createSecretsCommands.d.ts.map +1 -0
- package/dist/secrets/createSecretsCommands.js +93 -0
- package/dist/secrets/createSecretsCommands.js.map +1 -0
- package/dist/secrets/loadSecrets.d.ts +3 -0
- package/dist/secrets/loadSecrets.d.ts.map +1 -0
- package/dist/secrets/loadSecrets.js +35 -0
- package/dist/secrets/loadSecrets.js.map +1 -0
- package/dist/secrets/promptPassword.d.ts +2 -0
- package/dist/secrets/promptPassword.d.ts.map +1 -0
- package/dist/secrets/promptPassword.js +42 -0
- package/dist/secrets/promptPassword.js.map +1 -0
- package/dist/secrets/provisionSource.d.ts +25 -0
- package/dist/secrets/provisionSource.d.ts.map +1 -0
- package/dist/secrets/provisionSource.js +141 -0
- package/dist/secrets/provisionSource.js.map +1 -0
- package/dist/secrets/readRemoteSource.d.ts +7 -0
- package/dist/secrets/readRemoteSource.d.ts.map +1 -0
- package/dist/secrets/readRemoteSource.js +32 -0
- package/dist/secrets/readRemoteSource.js.map +1 -0
- package/dist/secrets/runWithSecrets.d.ts +6 -0
- package/dist/secrets/runWithSecrets.d.ts.map +1 -0
- package/dist/secrets/runWithSecrets.js +59 -0
- package/dist/secrets/runWithSecrets.js.map +1 -0
- package/dist/secrets/secretCommand.d.ts +2 -0
- package/dist/secrets/secretCommand.d.ts.map +1 -0
- package/dist/secrets/secretCommand.js +17 -0
- package/dist/secrets/secretCommand.js.map +1 -0
- package/dist/secrets/selectSecrets.d.ts +3 -0
- package/dist/secrets/selectSecrets.d.ts.map +1 -0
- package/dist/secrets/selectSecrets.js +18 -0
- package/dist/secrets/selectSecrets.js.map +1 -0
- package/dist/secrets/syncSecrets.d.ts +10 -0
- package/dist/secrets/syncSecrets.d.ts.map +1 -0
- package/dist/secrets/syncSecrets.js +43 -0
- package/dist/secrets/syncSecrets.js.map +1 -0
- package/dist/secrets/wireSecretsWorkflows.d.ts +2 -0
- package/dist/secrets/wireSecretsWorkflows.d.ts.map +1 -0
- package/dist/secrets/wireSecretsWorkflows.js +48 -0
- package/dist/secrets/wireSecretsWorkflows.js.map +1 -0
- package/dist/secrets/withDeploymentSecrets.d.ts +2 -0
- package/dist/secrets/withDeploymentSecrets.d.ts.map +1 -0
- package/dist/secrets/withDeploymentSecrets.js +58 -0
- package/dist/secrets/withDeploymentSecrets.js.map +1 -0
- package/dist/secrets/writeSecretsWorkflow.d.ts +3 -0
- package/dist/secrets/writeSecretsWorkflow.d.ts.map +1 -0
- package/dist/secrets/writeSecretsWorkflow.js +60 -0
- package/dist/secrets/writeSecretsWorkflow.js.map +1 -0
- package/dist/selectNetwork.d.ts +26 -0
- package/dist/selectNetwork.d.ts.map +1 -0
- package/dist/selectNetwork.js +48 -0
- package/dist/selectNetwork.js.map +1 -0
- package/dist/setup.d.ts +2 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +192 -0
- package/dist/setup.js.map +1 -0
- package/dist/setupReport.d.ts +8 -0
- package/dist/setupReport.d.ts.map +1 -0
- package/dist/setupReport.js +2 -0
- package/dist/setupReport.js.map +1 -0
- package/dist/setupVercel.d.ts +9 -0
- package/dist/setupVercel.d.ts.map +1 -0
- package/dist/setupVercel.js +72 -0
- package/dist/setupVercel.js.map +1 -0
- package/dist/stageSite.d.ts +3 -0
- package/dist/stageSite.d.ts.map +1 -0
- package/dist/stageSite.js +31 -0
- package/dist/stageSite.js.map +1 -0
- package/dist/validateConfig.d.ts +3 -0
- package/dist/validateConfig.d.ts.map +1 -0
- package/dist/validateConfig.js +17 -0
- package/dist/validateConfig.js.map +1 -0
- package/docs/public/commands.md +132 -0
- package/docs/public/llms-full.txt +182 -0
- package/package.json +50 -3
- package/src/addDependency.ts +41 -0
- package/src/apiClient.ts +51 -0
- package/src/checkIdentity.ts +18 -0
- package/src/ciOutputs.ts +47 -0
- package/src/cli.ts +11 -0
- package/src/createCli.ts +128 -0
- package/src/createProject.ts +66 -0
- package/src/createSetupCommand.ts +16 -0
- package/src/deploy.ts +71 -0
- package/src/fail.ts +3 -0
- package/src/index.ts +2 -0
- package/src/inspectReferences.ts +20 -0
- package/src/inspectStaticTree.ts +19 -0
- package/src/packageInfo.ts +10 -0
- package/src/parseSelection.ts +22 -0
- package/src/parseSetupInput.ts +40 -0
- package/src/readSelection.ts +47 -0
- package/src/renderPlan.ts +27 -0
- package/src/renderResult.ts +18 -0
- package/src/resolveRepository.ts +38 -0
- package/src/runProcess.ts +26 -0
- package/src/runTerraform.ts +182 -0
- package/src/runVercel.ts +77 -0
- package/src/safePath.ts +43 -0
- package/src/safeTargetPath.ts +32 -0
- package/src/schemas.ts +126 -0
- package/src/secrets/assertNewSource.ts +40 -0
- package/src/secrets/config.ts +91 -0
- package/src/secrets/createSecretsCommands.ts +189 -0
- package/src/secrets/loadSecrets.ts +53 -0
- package/src/secrets/promptPassword.ts +46 -0
- package/src/secrets/provisionSource.ts +238 -0
- package/src/secrets/readRemoteSource.ts +73 -0
- package/src/secrets/runWithSecrets.ts +71 -0
- package/src/secrets/secretCommand.ts +26 -0
- package/src/secrets/selectSecrets.ts +33 -0
- package/src/secrets/syncSecrets.ts +60 -0
- package/src/secrets/wireSecretsWorkflows.ts +57 -0
- package/src/secrets/withDeploymentSecrets.ts +77 -0
- package/src/secrets/writeSecretsWorkflow.ts +83 -0
- package/src/selectNetwork.ts +73 -0
- package/src/setup.ts +277 -0
- package/src/setupReport.ts +11 -0
- package/src/setupVercel.ts +126 -0
- package/src/stageSite.ts +54 -0
- package/src/validateConfig.ts +22 -0
- package/templates/deploy-arc.yaml +73 -0
- package/templates/deploy-vercel.yaml +43 -0
- package/templates/network.yaml +105 -0
- package/templates/vercel-static/main.tf +128 -0
- 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 @@
|
|
|
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"}
|
package/dist/schemas.js
ADDED
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|