@rmartz/envctl 3.1.1
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 +79 -0
- package/dist/envctl.d.ts +3 -0
- package/dist/envctl.d.ts.map +1 -0
- package/dist/envctl.js +36 -0
- package/dist/envctl.js.map +1 -0
- package/dist/lib/auth.d.ts +21 -0
- package/dist/lib/auth.d.ts.map +1 -0
- package/dist/lib/auth.js +148 -0
- package/dist/lib/auth.js.map +1 -0
- package/dist/lib/check-firebase.d.ts +6 -0
- package/dist/lib/check-firebase.d.ts.map +1 -0
- package/dist/lib/check-firebase.js +81 -0
- package/dist/lib/check-firebase.js.map +1 -0
- package/dist/lib/check-live.d.ts +3 -0
- package/dist/lib/check-live.d.ts.map +1 -0
- package/dist/lib/check-live.js +50 -0
- package/dist/lib/check-live.js.map +1 -0
- package/dist/lib/check.d.ts +9 -0
- package/dist/lib/check.d.ts.map +1 -0
- package/dist/lib/check.js +165 -0
- package/dist/lib/check.js.map +1 -0
- package/dist/lib/cli/help.d.ts +4 -0
- package/dist/lib/cli/help.d.ts.map +1 -0
- package/dist/lib/cli/help.js +52 -0
- package/dist/lib/cli/help.js.map +1 -0
- package/dist/lib/cli/registry.d.ts +19 -0
- package/dist/lib/cli/registry.d.ts.map +1 -0
- package/dist/lib/cli/registry.js +111 -0
- package/dist/lib/cli/registry.js.map +1 -0
- package/dist/lib/cli/router.d.ts +22 -0
- package/dist/lib/cli/router.d.ts.map +1 -0
- package/dist/lib/cli/router.js +98 -0
- package/dist/lib/cli/router.js.map +1 -0
- package/dist/lib/cli/version.d.ts +2 -0
- package/dist/lib/cli/version.d.ts.map +1 -0
- package/dist/lib/cli/version.js +58 -0
- package/dist/lib/cli/version.js.map +1 -0
- package/dist/lib/commands/auth.d.ts +2 -0
- package/dist/lib/commands/auth.d.ts.map +1 -0
- package/dist/lib/commands/auth.js +33 -0
- package/dist/lib/commands/auth.js.map +1 -0
- package/dist/lib/commands/bootstrap-args.d.ts +11 -0
- package/dist/lib/commands/bootstrap-args.d.ts.map +1 -0
- package/dist/lib/commands/bootstrap-args.js +111 -0
- package/dist/lib/commands/bootstrap-args.js.map +1 -0
- package/dist/lib/commands/bootstrap.d.ts +5 -0
- package/dist/lib/commands/bootstrap.d.ts.map +1 -0
- package/dist/lib/commands/bootstrap.js +166 -0
- package/dist/lib/commands/bootstrap.js.map +1 -0
- package/dist/lib/commands/check.d.ts +3 -0
- package/dist/lib/commands/check.d.ts.map +1 -0
- package/dist/lib/commands/check.js +47 -0
- package/dist/lib/commands/check.js.map +1 -0
- package/dist/lib/commands/config-pull.d.ts +12 -0
- package/dist/lib/commands/config-pull.d.ts.map +1 -0
- package/dist/lib/commands/config-pull.js +161 -0
- package/dist/lib/commands/config-pull.js.map +1 -0
- package/dist/lib/commands/config-push-args.d.ts +9 -0
- package/dist/lib/commands/config-push-args.d.ts.map +1 -0
- package/dist/lib/commands/config-push-args.js +108 -0
- package/dist/lib/commands/config-push-args.js.map +1 -0
- package/dist/lib/commands/config-push.d.ts +6 -0
- package/dist/lib/commands/config-push.d.ts.map +1 -0
- package/dist/lib/commands/config-push.js +166 -0
- package/dist/lib/commands/config-push.js.map +1 -0
- package/dist/lib/commands/deployment-config.d.ts +9 -0
- package/dist/lib/commands/deployment-config.d.ts.map +1 -0
- package/dist/lib/commands/deployment-config.js +73 -0
- package/dist/lib/commands/deployment-config.js.map +1 -0
- package/dist/lib/commands/env-plan.d.ts +4 -0
- package/dist/lib/commands/env-plan.d.ts.map +1 -0
- package/dist/lib/commands/env-plan.js +85 -0
- package/dist/lib/commands/env-plan.js.map +1 -0
- package/dist/lib/commands/env.d.ts +4 -0
- package/dist/lib/commands/env.d.ts.map +1 -0
- package/dist/lib/commands/env.js +122 -0
- package/dist/lib/commands/env.js.map +1 -0
- package/dist/lib/commands/init.d.ts +3 -0
- package/dist/lib/commands/init.d.ts.map +1 -0
- package/dist/lib/commands/init.js +59 -0
- package/dist/lib/commands/init.js.map +1 -0
- package/dist/lib/commands/secrets-args.d.ts +13 -0
- package/dist/lib/commands/secrets-args.d.ts.map +1 -0
- package/dist/lib/commands/secrets-args.js +136 -0
- package/dist/lib/commands/secrets-args.js.map +1 -0
- package/dist/lib/commands/secrets-plan.d.ts +9 -0
- package/dist/lib/commands/secrets-plan.d.ts.map +1 -0
- package/dist/lib/commands/secrets-plan.js +109 -0
- package/dist/lib/commands/secrets-plan.js.map +1 -0
- package/dist/lib/commands/secrets.d.ts +7 -0
- package/dist/lib/commands/secrets.d.ts.map +1 -0
- package/dist/lib/commands/secrets.js +191 -0
- package/dist/lib/commands/secrets.js.map +1 -0
- package/dist/lib/deployments.d.ts +4 -0
- package/dist/lib/deployments.d.ts.map +1 -0
- package/dist/lib/deployments.js +83 -0
- package/dist/lib/deployments.js.map +1 -0
- package/dist/lib/environments.d.ts +4 -0
- package/dist/lib/environments.d.ts.map +1 -0
- package/dist/lib/environments.js +97 -0
- package/dist/lib/environments.js.map +1 -0
- package/dist/lib/firebase-credential.d.ts +28 -0
- package/dist/lib/firebase-credential.d.ts.map +1 -0
- package/dist/lib/firebase-credential.js +50 -0
- package/dist/lib/firebase-credential.js.map +1 -0
- package/dist/lib/firebase-invalidate.d.ts +4 -0
- package/dist/lib/firebase-invalidate.d.ts.map +1 -0
- package/dist/lib/firebase-invalidate.js +61 -0
- package/dist/lib/firebase-invalidate.js.map +1 -0
- package/dist/lib/firebase-vars.d.ts +14 -0
- package/dist/lib/firebase-vars.d.ts.map +1 -0
- package/dist/lib/firebase-vars.js +40 -0
- package/dist/lib/firebase-vars.js.map +1 -0
- package/dist/lib/firebase.d.ts +20 -0
- package/dist/lib/firebase.d.ts.map +1 -0
- package/dist/lib/firebase.js +189 -0
- package/dist/lib/firebase.js.map +1 -0
- package/dist/lib/gcp.d.ts +4 -0
- package/dist/lib/gcp.d.ts.map +1 -0
- package/dist/lib/gcp.js +53 -0
- package/dist/lib/gcp.js.map +1 -0
- package/dist/lib/generated-secrets.d.ts +16 -0
- package/dist/lib/generated-secrets.d.ts.map +1 -0
- package/dist/lib/generated-secrets.js +68 -0
- package/dist/lib/generated-secrets.js.map +1 -0
- package/dist/lib/logger.d.ts +7 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +60 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/manifest/index.d.ts +6 -0
- package/dist/lib/manifest/index.d.ts.map +1 -0
- package/dist/lib/manifest/index.js +15 -0
- package/dist/lib/manifest/index.js.map +1 -0
- package/dist/lib/manifest/parse.d.ts +11 -0
- package/dist/lib/manifest/parse.d.ts.map +1 -0
- package/dist/lib/manifest/parse.js +214 -0
- package/dist/lib/manifest/parse.js.map +1 -0
- package/dist/lib/manifest/resolve.d.ts +9 -0
- package/dist/lib/manifest/resolve.d.ts.map +1 -0
- package/dist/lib/manifest/resolve.js +34 -0
- package/dist/lib/manifest/resolve.js.map +1 -0
- package/dist/lib/manifest/types.d.ts +57 -0
- package/dist/lib/manifest/types.d.ts.map +1 -0
- package/dist/lib/manifest/types.js +12 -0
- package/dist/lib/manifest/types.js.map +1 -0
- package/dist/lib/manifest/write.d.ts +3 -0
- package/dist/lib/manifest/write.d.ts.map +1 -0
- package/dist/lib/manifest/write.js +110 -0
- package/dist/lib/manifest/write.js.map +1 -0
- package/dist/lib/project.d.ts +6 -0
- package/dist/lib/project.d.ts.map +1 -0
- package/dist/lib/project.js +56 -0
- package/dist/lib/project.js.map +1 -0
- package/dist/lib/providers/deployment.d.ts +19 -0
- package/dist/lib/providers/deployment.d.ts.map +1 -0
- package/dist/lib/providers/deployment.js +62 -0
- package/dist/lib/providers/deployment.js.map +1 -0
- package/dist/lib/providers/registry.d.ts +5 -0
- package/dist/lib/providers/registry.d.ts.map +1 -0
- package/dist/lib/providers/registry.js +31 -0
- package/dist/lib/providers/registry.js.map +1 -0
- package/dist/lib/providers/service.d.ts +35 -0
- package/dist/lib/providers/service.d.ts.map +1 -0
- package/dist/lib/providers/service.js +81 -0
- package/dist/lib/providers/service.js.map +1 -0
- package/dist/lib/rotation-preflight.d.ts +11 -0
- package/dist/lib/rotation-preflight.d.ts.map +1 -0
- package/dist/lib/rotation-preflight.js +47 -0
- package/dist/lib/rotation-preflight.js.map +1 -0
- package/dist/lib/rotation.d.ts +33 -0
- package/dist/lib/rotation.d.ts.map +1 -0
- package/dist/lib/rotation.js +168 -0
- package/dist/lib/rotation.js.map +1 -0
- package/dist/lib/sentry.d.ts +5 -0
- package/dist/lib/sentry.d.ts.map +1 -0
- package/dist/lib/sentry.js +132 -0
- package/dist/lib/sentry.js.map +1 -0
- package/dist/lib/subprocess.d.ts +8 -0
- package/dist/lib/subprocess.d.ts.map +1 -0
- package/dist/lib/subprocess.js +30 -0
- package/dist/lib/subprocess.js.map +1 -0
- package/dist/lib/targets.d.ts +3 -0
- package/dist/lib/targets.d.ts.map +1 -0
- package/dist/lib/targets.js +25 -0
- package/dist/lib/targets.js.map +1 -0
- package/dist/lib/vercel-api.d.ts +50 -0
- package/dist/lib/vercel-api.d.ts.map +1 -0
- package/dist/lib/vercel-api.js +176 -0
- package/dist/lib/vercel-api.js.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.runInit = runInit;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const logger_1 = require("../logger");
|
|
39
|
+
const deployment_config_1 = require("./deployment-config");
|
|
40
|
+
// `envctl init` — scaffold the in-repo deployment/ config with a starter
|
|
41
|
+
// environments.yml and a sample environment file. No-op (with a warning) when
|
|
42
|
+
// a config already exists, so it never clobbers hand-edited config.
|
|
43
|
+
function runInit(ctx) {
|
|
44
|
+
const envsFile = (0, deployment_config_1.environmentsFile)(ctx.workingDir);
|
|
45
|
+
if (fs.existsSync(envsFile)) {
|
|
46
|
+
(0, logger_1.warn)(`Deployment config already exists at ${envsFile} — leaving it as is.`);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
fs.mkdirSync((0, deployment_config_1.deploymentDir)(ctx.workingDir), { recursive: true });
|
|
50
|
+
(0, deployment_config_1.writeActiveEnvs)(ctx.workingDir, ["production"]);
|
|
51
|
+
if (!fs.existsSync((0, deployment_config_1.envFile)(ctx.workingDir, "production"))) {
|
|
52
|
+
(0, deployment_config_1.writeEnvFile)(ctx.workingDir, "production", {
|
|
53
|
+
NEXT_PUBLIC_EXAMPLE: "replace-me",
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
(0, logger_1.log)(`Scaffolded ${envsFile} with a sample 'production' environment.`);
|
|
57
|
+
(0, logger_1.log)("Add more with: envctl env add <name> --target <production|preview|development>");
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/lib/commands/init.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAeA,0BAmBC;AAlCD,uCAAyB;AAGzB,sCAAsC;AACtC,2DAM6B;AAE7B,yEAAyE;AACzE,8EAA8E;AAC9E,oEAAoE;AACpE,SAAgB,OAAO,CAAC,GAAmB;IACzC,MAAM,QAAQ,GAAG,IAAA,oCAAgB,EAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAClD,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,IAAA,aAAI,EAAC,uCAAuC,QAAQ,sBAAsB,CAAC,CAAC;QAC5E,OAAO;IACT,CAAC;IAED,EAAE,CAAC,SAAS,CAAC,IAAA,iCAAa,EAAC,GAAG,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACjE,IAAA,mCAAe,EAAC,GAAG,CAAC,UAAU,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAChD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAA,2BAAO,EAAC,GAAG,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC;QAC1D,IAAA,gCAAY,EAAC,GAAG,CAAC,UAAU,EAAE,YAAY,EAAE;YACzC,mBAAmB,EAAE,YAAY;SAClC,CAAC,CAAC;IACL,CAAC;IAED,IAAA,YAAG,EAAC,cAAc,QAAQ,0CAA0C,CAAC,CAAC;IACtE,IAAA,YAAG,EACD,gFAAgF,CACjF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface SecretsOptions {
|
|
2
|
+
targetEnv: string;
|
|
3
|
+
workingDir: string;
|
|
4
|
+
deploymentDir: string;
|
|
5
|
+
invalidateKeys: boolean;
|
|
6
|
+
refreshPreviews: boolean;
|
|
7
|
+
init?: "all" | "auto" | "firebase" | "sentry";
|
|
8
|
+
provider?: "firebase" | "sentry";
|
|
9
|
+
}
|
|
10
|
+
export declare const ROTATE_USAGE = "Usage: envctl secrets rotate [firebase|sentry] [OPTIONS]\n\nAtomically rotate provider secrets: mint the new credential, redeploy, verify\nit, then invalidate the old one \u2014 so the project is never left without a working\ncredential. Rotates Firebase service-account keys (per environment) and the\nSentry auth token (once, project-wide), for whichever are present in the Vercel\nproject. Auth for every provider to be rotated is checked up front, so an\nunauthenticated provider fails fast instead of leaving a partial rotation.\n\nARGUMENTS:\n firebase | sentry Restrict the rotation to a single provider\n (default: every provider present in the project)\n\nOPTIONS:\n --env <name> Environment to rotate (a name from environments.yml,\n 'development', or 'all') (default: all)\n --deployment-dir <path> Path to the deployment config directory, resolved\n against the project root (default: deployment)\n --no-invalidate Keep the old keys after the redeploy\n --refresh-previews Redeploy active PR previews after rotation\n -h, --help Show this help";
|
|
11
|
+
export declare const INIT_USAGE = "Usage: envctl secrets init [firebase|sentry] [OPTIONS]\n\nBootstrap provider secrets for a fresh project (implies a rotation). Omit the\nservice to auto-detect which to initialize from the deployment config. Fails if\nthe target secrets already exist in the Vercel project.\n\nARGUMENTS:\n firebase | sentry Service to initialize (default: auto-detect)\n\nOPTIONS:\n --env <name> Environment to initialize (default: all)\n --deployment-dir <path> Path to the deployment config directory, resolved\n against the project root (default: deployment)\n --no-invalidate Keep the old keys after the redeploy\n --refresh-previews Redeploy active PR previews after initialization\n -h, --help Show this help";
|
|
12
|
+
export declare function parseSecretsArgs(args: string[], workingDir: string, isInit: boolean): SecretsOptions;
|
|
13
|
+
//# sourceMappingURL=secrets-args.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets-args.d.ts","sourceRoot":"","sources":["../../../src/lib/commands/secrets-args.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,cAAc;IAG7B,SAAS,EAAE,MAAM,CAAC;IAElB,UAAU,EAAE,MAAM,CAAC;IAEnB,aAAa,EAAE,MAAM,CAAC;IAEtB,cAAc,EAAE,OAAO,CAAC;IAGxB,eAAe,EAAE,OAAO,CAAC;IAGzB,IAAI,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,UAAU,GAAG,QAAQ,CAAC;IAG9C,QAAQ,CAAC,EAAE,UAAU,GAAG,QAAQ,CAAC;CAClC;AAED,eAAO,MAAM,YAAY,yqCAoBiB,CAAC;AAE3C,eAAO,MAAM,UAAU,gxBAemB,CAAC;AAM3C,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EAAE,EACd,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,OAAO,GACd,cAAc,CA8ChB"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.INIT_USAGE = exports.ROTATE_USAGE = void 0;
|
|
37
|
+
exports.parseSecretsArgs = parseSecretsArgs;
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const logger_1 = require("../logger");
|
|
40
|
+
exports.ROTATE_USAGE = `Usage: envctl secrets rotate [firebase|sentry] [OPTIONS]
|
|
41
|
+
|
|
42
|
+
Atomically rotate provider secrets: mint the new credential, redeploy, verify
|
|
43
|
+
it, then invalidate the old one — so the project is never left without a working
|
|
44
|
+
credential. Rotates Firebase service-account keys (per environment) and the
|
|
45
|
+
Sentry auth token (once, project-wide), for whichever are present in the Vercel
|
|
46
|
+
project. Auth for every provider to be rotated is checked up front, so an
|
|
47
|
+
unauthenticated provider fails fast instead of leaving a partial rotation.
|
|
48
|
+
|
|
49
|
+
ARGUMENTS:
|
|
50
|
+
firebase | sentry Restrict the rotation to a single provider
|
|
51
|
+
(default: every provider present in the project)
|
|
52
|
+
|
|
53
|
+
OPTIONS:
|
|
54
|
+
--env <name> Environment to rotate (a name from environments.yml,
|
|
55
|
+
'development', or 'all') (default: all)
|
|
56
|
+
--deployment-dir <path> Path to the deployment config directory, resolved
|
|
57
|
+
against the project root (default: deployment)
|
|
58
|
+
--no-invalidate Keep the old keys after the redeploy
|
|
59
|
+
--refresh-previews Redeploy active PR previews after rotation
|
|
60
|
+
-h, --help Show this help`;
|
|
61
|
+
exports.INIT_USAGE = `Usage: envctl secrets init [firebase|sentry] [OPTIONS]
|
|
62
|
+
|
|
63
|
+
Bootstrap provider secrets for a fresh project (implies a rotation). Omit the
|
|
64
|
+
service to auto-detect which to initialize from the deployment config. Fails if
|
|
65
|
+
the target secrets already exist in the Vercel project.
|
|
66
|
+
|
|
67
|
+
ARGUMENTS:
|
|
68
|
+
firebase | sentry Service to initialize (default: auto-detect)
|
|
69
|
+
|
|
70
|
+
OPTIONS:
|
|
71
|
+
--env <name> Environment to initialize (default: all)
|
|
72
|
+
--deployment-dir <path> Path to the deployment config directory, resolved
|
|
73
|
+
against the project root (default: deployment)
|
|
74
|
+
--no-invalidate Keep the old keys after the redeploy
|
|
75
|
+
--refresh-previews Redeploy active PR previews after initialization
|
|
76
|
+
-h, --help Show this help`;
|
|
77
|
+
// Parses `secrets rotate` / `secrets init` args (the global -C/--working-dir
|
|
78
|
+
// flag is already stripped by the router). `isInit` selects init mode: it seeds
|
|
79
|
+
// `init` to "auto" and accepts a leading firebase|sentry positional. Prints
|
|
80
|
+
// usage and exits 0 on -h/--help.
|
|
81
|
+
function parseSecretsArgs(args, workingDir, isInit) {
|
|
82
|
+
let targetEnv = "all";
|
|
83
|
+
let deploymentDir = "deployment";
|
|
84
|
+
let invalidateKeys = true;
|
|
85
|
+
let refreshPreviews = false;
|
|
86
|
+
let init = isInit ? "auto" : undefined;
|
|
87
|
+
let provider;
|
|
88
|
+
let providerTargetSet = false;
|
|
89
|
+
for (let i = 0; i < args.length; i++) {
|
|
90
|
+
const arg = args[i];
|
|
91
|
+
if (arg === "--env") {
|
|
92
|
+
targetEnv =
|
|
93
|
+
args[++i] ?? (0, logger_1.err)('--env requires an environment name or "all"');
|
|
94
|
+
if (!targetEnv)
|
|
95
|
+
(0, logger_1.err)('--env requires an environment name or "all"');
|
|
96
|
+
}
|
|
97
|
+
else if (arg === "--deployment-dir") {
|
|
98
|
+
deploymentDir = args[++i] ?? (0, logger_1.err)("--deployment-dir requires a path");
|
|
99
|
+
if (!deploymentDir)
|
|
100
|
+
(0, logger_1.err)("--deployment-dir requires a path");
|
|
101
|
+
}
|
|
102
|
+
else if (arg === "--no-invalidate") {
|
|
103
|
+
invalidateKeys = false;
|
|
104
|
+
}
|
|
105
|
+
else if (arg === "--refresh-previews") {
|
|
106
|
+
refreshPreviews = true;
|
|
107
|
+
}
|
|
108
|
+
else if (arg === "-h" || arg === "--help") {
|
|
109
|
+
console.log(isInit ? exports.INIT_USAGE : exports.ROTATE_USAGE);
|
|
110
|
+
process.exit(0);
|
|
111
|
+
}
|
|
112
|
+
else if (!providerTargetSet && (arg === "firebase" || arg === "sentry")) {
|
|
113
|
+
// A leading firebase|sentry positional selects the init target in init
|
|
114
|
+
// mode, or scopes the rotation to that provider in rotate mode.
|
|
115
|
+
if (isInit)
|
|
116
|
+
init = arg;
|
|
117
|
+
else
|
|
118
|
+
provider = arg;
|
|
119
|
+
providerTargetSet = true;
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
const cmd = isInit ? "secrets init" : "secrets rotate";
|
|
123
|
+
(0, logger_1.err)(`Unknown option: ${arg}. Run 'envctl ${cmd} --help' for usage.`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return {
|
|
127
|
+
targetEnv,
|
|
128
|
+
workingDir,
|
|
129
|
+
deploymentDir: path.resolve(workingDir, deploymentDir),
|
|
130
|
+
invalidateKeys,
|
|
131
|
+
refreshPreviews,
|
|
132
|
+
init,
|
|
133
|
+
provider,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=secrets-args.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets-args.js","sourceRoot":"","sources":["../../../src/lib/commands/secrets-args.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwEA,4CAkDC;AA1HD,2CAA6B;AAE7B,sCAAgC;AA2BnB,QAAA,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;0CAoBc,CAAC;AAE9B,QAAA,UAAU,GAAG;;;;;;;;;;;;;;;0CAegB,CAAC;AAE3C,6EAA6E;AAC7E,gFAAgF;AAChF,4EAA4E;AAC5E,kCAAkC;AAClC,SAAgB,gBAAgB,CAC9B,IAAc,EACd,UAAkB,EAClB,MAAe;IAEf,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,aAAa,GAAG,YAAY,CAAC;IACjC,IAAI,cAAc,GAAG,IAAI,CAAC;IAC1B,IAAI,eAAe,GAAG,KAAK,CAAC;IAC5B,IAAI,IAAI,GAA2B,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/D,IAAI,QAAoC,CAAC;IACzC,IAAI,iBAAiB,GAAG,KAAK,CAAC;IAE9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;YACpB,SAAS;gBACP,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,IAAA,YAAG,EAAC,6CAA6C,CAAC,CAAC;YAClE,IAAI,CAAC,SAAS;gBAAE,IAAA,YAAG,EAAC,6CAA6C,CAAC,CAAC;QACrE,CAAC;aAAM,IAAI,GAAG,KAAK,kBAAkB,EAAE,CAAC;YACtC,aAAa,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,IAAA,YAAG,EAAC,kCAAkC,CAAC,CAAC;YACrE,IAAI,CAAC,aAAa;gBAAE,IAAA,YAAG,EAAC,kCAAkC,CAAC,CAAC;QAC9D,CAAC;aAAM,IAAI,GAAG,KAAK,iBAAiB,EAAE,CAAC;YACrC,cAAc,GAAG,KAAK,CAAC;QACzB,CAAC;aAAM,IAAI,GAAG,KAAK,oBAAoB,EAAE,CAAC;YACxC,eAAe,GAAG,IAAI,CAAC;QACzB,CAAC;aAAM,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC5C,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,kBAAU,CAAC,CAAC,CAAC,oBAAY,CAAC,CAAC;YAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;aAAM,IAAI,CAAC,iBAAiB,IAAI,CAAC,GAAG,KAAK,UAAU,IAAI,GAAG,KAAK,QAAQ,CAAC,EAAE,CAAC;YAC1E,uEAAuE;YACvE,gEAAgE;YAChE,IAAI,MAAM;gBAAE,IAAI,GAAG,GAAG,CAAC;;gBAClB,QAAQ,GAAG,GAAG,CAAC;YACpB,iBAAiB,GAAG,IAAI,CAAC;QAC3B,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,gBAAgB,CAAC;YACvD,IAAA,YAAG,EAAC,mBAAmB,GAAG,iBAAiB,GAAG,qBAAqB,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IAED,OAAO;QACL,SAAS;QACT,UAAU;QACV,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,aAAa,CAAC;QACtD,cAAc;QACd,eAAe;QACf,IAAI;QACJ,QAAQ;KACT,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
declare function sentrySourceEnv(targetEnv: string, envList: string[], devSource: string | undefined): string | undefined;
|
|
2
|
+
export declare function detectConfiguredServices(deploymentDir: string, targetEnv: string, envList: string[], devSource: string | undefined): {
|
|
3
|
+
firebase: boolean;
|
|
4
|
+
sentry: boolean;
|
|
5
|
+
};
|
|
6
|
+
export declare function resolveAutoInit(deploymentDir: string, targetEnv: string, envList: string[], devSource: string | undefined): "all" | "firebase" | "sentry";
|
|
7
|
+
export declare function validateInitConfig(init: "all" | "firebase" | "sentry", deploymentDir: string, targetEnv: string, envList: string[], devSource: string | undefined): void;
|
|
8
|
+
export { sentrySourceEnv };
|
|
9
|
+
//# sourceMappingURL=secrets-plan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets-plan.d.ts","sourceRoot":"","sources":["../../../src/lib/commands/secrets-plan.ts"],"names":[],"mappings":"AAWA,iBAAS,eAAe,CACtB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EAAE,EACjB,SAAS,EAAE,MAAM,GAAG,SAAS,GAC5B,MAAM,GAAG,SAAS,CAKpB;AAID,wBAAgB,wBAAwB,CACtC,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EAAE,EACjB,SAAS,EAAE,MAAM,GAAG,SAAS,GAC5B;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAyBxC;AAID,wBAAgB,eAAe,CAC7B,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EAAE,EACjB,SAAS,EAAE,MAAM,GAAG,SAAS,GAC5B,KAAK,GAAG,UAAU,GAAG,QAAQ,CA4B/B;AA2BD,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,KAAK,GAAG,UAAU,GAAG,QAAQ,EACnC,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EAAE,EACjB,SAAS,EAAE,MAAM,GAAG,SAAS,GAC5B,IAAI,CAyCN;AAED,OAAO,EAAE,eAAe,EAAE,CAAC"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.detectConfiguredServices = detectConfiguredServices;
|
|
4
|
+
exports.resolveAutoInit = resolveAutoInit;
|
|
5
|
+
exports.validateInitConfig = validateInitConfig;
|
|
6
|
+
exports.sentrySourceEnv = sentrySourceEnv;
|
|
7
|
+
const environments_1 = require("../environments");
|
|
8
|
+
const logger_1 = require("../logger");
|
|
9
|
+
// Init-mode planning: resolve `--init auto` to a concrete service from the
|
|
10
|
+
// deployment config, and validate that the config required to initialize the
|
|
11
|
+
// chosen service(s) is present. Ported from the predecessor's sync-env
|
|
12
|
+
// orchestration; rotation itself lives in the shared engine.
|
|
13
|
+
// The Sentry secret is project-wide, so it is sourced from a single active
|
|
14
|
+
// environment: the first non-development one, falling back to development's
|
|
15
|
+
// source (staging) or the first env in the list.
|
|
16
|
+
function sentrySourceEnv(targetEnv, envList, devSource) {
|
|
17
|
+
if (targetEnv === "all")
|
|
18
|
+
return envList.find((e) => e !== "development") ?? envList[0];
|
|
19
|
+
if (targetEnv === "development")
|
|
20
|
+
return devSource;
|
|
21
|
+
return targetEnv;
|
|
22
|
+
}
|
|
23
|
+
// Scans the deployment config's public vars to determine which secret-backed
|
|
24
|
+
// services a project uses. Shared by `--init auto` resolution and `bootstrap`.
|
|
25
|
+
function detectConfiguredServices(deploymentDir, targetEnv, envList, devSource) {
|
|
26
|
+
// development has no own YAML — scan its source (staging) instead.
|
|
27
|
+
const scanEnvs = targetEnv === "development"
|
|
28
|
+
? devSource
|
|
29
|
+
? [devSource]
|
|
30
|
+
: []
|
|
31
|
+
: targetEnv === "all"
|
|
32
|
+
? envList
|
|
33
|
+
: [targetEnv];
|
|
34
|
+
const keys = scanEnvs.flatMap((envName) => Object.keys((0, environments_1.parseDeploymentEnv)(deploymentDir, envName)));
|
|
35
|
+
return {
|
|
36
|
+
firebase: keys.some((k) => [
|
|
37
|
+
"FIREBASE_PROJECT_ID",
|
|
38
|
+
"FIREBASE_SA_EMAIL",
|
|
39
|
+
"NEXT_PUBLIC_FIREBASE_PROJECT_ID",
|
|
40
|
+
].includes(k)),
|
|
41
|
+
sentry: keys.some((k) => ["SENTRY_ORG", "SENTRY_PROJECT"].includes(k)),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
// Resolves `--init auto` by scanning the deployment config for public vars that
|
|
45
|
+
// indicate which services are in use. Errors if neither is configured.
|
|
46
|
+
function resolveAutoInit(deploymentDir, targetEnv, envList, devSource) {
|
|
47
|
+
const { firebase: hasFirebase, sentry: hasSentry } = detectConfiguredServices(deploymentDir, targetEnv, envList, devSource);
|
|
48
|
+
(0, logger_1.log)("Auto-detecting secrets to initialize:");
|
|
49
|
+
(0, logger_1.log)(hasFirebase
|
|
50
|
+
? " Firebase: initialize (Firebase public vars found)"
|
|
51
|
+
: " Firebase: skip (no Firebase public vars)");
|
|
52
|
+
(0, logger_1.log)(hasSentry
|
|
53
|
+
? " Sentry: initialize (Sentry public vars found)"
|
|
54
|
+
: " Sentry: skip (no Sentry public vars)");
|
|
55
|
+
if (!hasFirebase && !hasSentry)
|
|
56
|
+
(0, logger_1.err)("secrets init: nothing to initialize — no Firebase or Sentry public config vars found in the deployment config");
|
|
57
|
+
if (hasFirebase && hasSentry)
|
|
58
|
+
return "all";
|
|
59
|
+
if (hasFirebase)
|
|
60
|
+
return "firebase";
|
|
61
|
+
return "sentry";
|
|
62
|
+
}
|
|
63
|
+
function firebaseConfigMissing(deploymentDir, envName, label) {
|
|
64
|
+
const envVars = (0, environments_1.parseDeploymentEnv)(deploymentDir, envName);
|
|
65
|
+
const missing = [];
|
|
66
|
+
// Both identity vars are statically required (#143): #127 made init resolve the
|
|
67
|
+
// service account strictly from the target's own declared FIREBASE_SA_EMAIL —
|
|
68
|
+
// never a sibling credential — so its absence must be reported up front here,
|
|
69
|
+
// alongside FIREBASE_PROJECT_ID, rather than surfacing as a mid-run error.
|
|
70
|
+
// (Automatic SA discovery that would retire this input is gated on #70.)
|
|
71
|
+
if (!envVars.FIREBASE_SA_EMAIL && !process.env.FIREBASE_SA_EMAIL)
|
|
72
|
+
missing.push(`FIREBASE_SA_EMAIL [${label}]: add to ${envName}.yml or export in shell`);
|
|
73
|
+
if (!envVars.FIREBASE_PROJECT_ID && !process.env.GCLOUD_PROJECT)
|
|
74
|
+
missing.push(`FIREBASE_PROJECT_ID [${label}]: add to ${envName}.yml or export GCLOUD_PROJECT in shell`);
|
|
75
|
+
return missing;
|
|
76
|
+
}
|
|
77
|
+
// Validates that the config needed to initialize the chosen service(s) is
|
|
78
|
+
// present (in the deployment YAML or shell env), erroring with every gap at once.
|
|
79
|
+
function validateInitConfig(init, deploymentDir, targetEnv, envList, devSource) {
|
|
80
|
+
const missing = [];
|
|
81
|
+
if (init === "firebase" || init === "all") {
|
|
82
|
+
const activeTargets = targetEnv === "all" || targetEnv === "development"
|
|
83
|
+
? envList
|
|
84
|
+
: [targetEnv];
|
|
85
|
+
for (const envName of activeTargets)
|
|
86
|
+
missing.push(...firebaseConfigMissing(deploymentDir, envName, envName));
|
|
87
|
+
const includesDev = targetEnv === "all" || targetEnv === "development";
|
|
88
|
+
if (includesDev && devSource)
|
|
89
|
+
missing.push(...firebaseConfigMissing(deploymentDir, devSource, "development"));
|
|
90
|
+
}
|
|
91
|
+
if (init === "sentry" || init === "all") {
|
|
92
|
+
const source = sentrySourceEnv(targetEnv, envList, devSource);
|
|
93
|
+
if (!source) {
|
|
94
|
+
missing.push("Sentry: no preview/staging environment found — add staging to environments.yml");
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
const envVars = (0, environments_1.parseDeploymentEnv)(deploymentDir, source);
|
|
98
|
+
if (!envVars.SENTRY_ORG && !process.env.SENTRY_ORG)
|
|
99
|
+
missing.push(`SENTRY_ORG [${source}]: add to deployment YAML or shell`);
|
|
100
|
+
if (!envVars.SENTRY_PROJECT && !process.env.SENTRY_PROJECT)
|
|
101
|
+
missing.push(`SENTRY_PROJECT [${source}]: add to deployment YAML or shell`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
if (missing.length > 0)
|
|
105
|
+
(0, logger_1.err)(`secrets init ${init}: missing required configuration:\n${missing
|
|
106
|
+
.map((m) => ` · ${m}`)
|
|
107
|
+
.join("\n")}`);
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=secrets-plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets-plan.js","sourceRoot":"","sources":["../../../src/lib/commands/secrets-plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { CommandContext } from "../cli/registry";
|
|
2
|
+
import { type SecretsOptions } from "./secrets-args";
|
|
3
|
+
export type { SecretsOptions };
|
|
4
|
+
export declare function runSecrets(opts: SecretsOptions): Promise<void>;
|
|
5
|
+
export declare function runSecretsRotate(ctx: CommandContext, args: string[]): Promise<void>;
|
|
6
|
+
export declare function runSecretsInit(ctx: CommandContext, args: string[]): Promise<void>;
|
|
7
|
+
//# sourceMappingURL=secrets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../../../src/lib/commands/secrets.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AA0BtD,OAAO,EAAoB,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAQvE,YAAY,EAAE,cAAc,EAAE,CAAC;AAoJ/B,wBAAsB,UAAU,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAiFpE;AAID,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE,MAAM,EAAE,GACb,OAAO,CAAC,IAAI,CAAC,CAEf;AAED,wBAAsB,cAAc,CAClC,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE,MAAM,EAAE,GACb,OAAO,CAAC,IAAI,CAAC,CAEf"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runSecrets = runSecrets;
|
|
4
|
+
exports.runSecretsRotate = runSecretsRotate;
|
|
5
|
+
exports.runSecretsInit = runSecretsInit;
|
|
6
|
+
const auth_1 = require("../auth");
|
|
7
|
+
const deployments_1 = require("../deployments");
|
|
8
|
+
const firebase_credential_1 = require("../firebase-credential");
|
|
9
|
+
const generated_secrets_1 = require("../generated-secrets");
|
|
10
|
+
const manifest_1 = require("../manifest");
|
|
11
|
+
const environments_1 = require("../environments");
|
|
12
|
+
const logger_1 = require("../logger");
|
|
13
|
+
const registry_1 = require("../providers/registry");
|
|
14
|
+
const service_1 = require("../providers/service");
|
|
15
|
+
const project_1 = require("../project");
|
|
16
|
+
const rotation_1 = require("../rotation");
|
|
17
|
+
const targets_1 = require("../targets");
|
|
18
|
+
const vercel_api_1 = require("../vercel-api");
|
|
19
|
+
const env_plan_1 = require("./env-plan");
|
|
20
|
+
const secrets_args_1 = require("./secrets-args");
|
|
21
|
+
const secrets_plan_1 = require("./secrets-plan");
|
|
22
|
+
// Dispatches the rotation engine, mirroring the predecessor's key-rotation
|
|
23
|
+
// orchestration: on `init --env all`, Sentry is initialized once (project-wide)
|
|
24
|
+
// while Firebase is initialized per Vercel target (each gets its own key, with
|
|
25
|
+
// development sourced from staging); otherwise a single engine call handles the
|
|
26
|
+
// requested environment (rotation auto-detects services from existing keys).
|
|
27
|
+
async function dispatchRotation(opts, init, envList, devSource, firebaseCredential) {
|
|
28
|
+
const { deploymentDir, invalidateKeys, workingDir, targetEnv } = opts;
|
|
29
|
+
const resolveTarget = (0, targets_1.envTargetResolver)(deploymentDir);
|
|
30
|
+
if (init && targetEnv === "all") {
|
|
31
|
+
if (init === "sentry" || init === "all") {
|
|
32
|
+
const source = (0, secrets_plan_1.sentrySourceEnv)("all", envList, devSource);
|
|
33
|
+
const vars = source ? (0, environments_1.parseDeploymentEnv)(deploymentDir, source) : {};
|
|
34
|
+
await (0, rotation_1.run)({
|
|
35
|
+
targetEnv: "all",
|
|
36
|
+
invalidateKeys,
|
|
37
|
+
workingDir,
|
|
38
|
+
init: "sentry",
|
|
39
|
+
sentryOrg: vars.SENTRY_ORG || undefined,
|
|
40
|
+
sentryProject: vars.SENTRY_PROJECT || undefined,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
if (init === "firebase" || init === "all") {
|
|
44
|
+
const seenTargets = new Set();
|
|
45
|
+
for (const envName of envList) {
|
|
46
|
+
const target = resolveTarget(envName);
|
|
47
|
+
if (seenTargets.has(target))
|
|
48
|
+
continue;
|
|
49
|
+
seenTargets.add(target);
|
|
50
|
+
const vars = (0, environments_1.parseDeploymentEnv)(deploymentDir, envName);
|
|
51
|
+
await (0, rotation_1.run)({
|
|
52
|
+
targetEnv: target,
|
|
53
|
+
invalidateKeys,
|
|
54
|
+
workingDir,
|
|
55
|
+
init: "firebase",
|
|
56
|
+
firebaseSaEmail: vars.FIREBASE_SA_EMAIL || undefined,
|
|
57
|
+
gcpProject: vars.FIREBASE_PROJECT_ID || undefined,
|
|
58
|
+
firebaseCredential,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
// development shares staging's Firebase project but gets its own key.
|
|
62
|
+
if (devSource) {
|
|
63
|
+
const vars = (0, environments_1.parseDeploymentEnv)(deploymentDir, devSource);
|
|
64
|
+
await (0, rotation_1.run)({
|
|
65
|
+
targetEnv: "development",
|
|
66
|
+
invalidateKeys,
|
|
67
|
+
workingDir,
|
|
68
|
+
init: "firebase",
|
|
69
|
+
firebaseSaEmail: vars.FIREBASE_SA_EMAIL || undefined,
|
|
70
|
+
gcpProject: vars.FIREBASE_PROJECT_ID || undefined,
|
|
71
|
+
firebaseCredential,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
const source = targetEnv === "development"
|
|
78
|
+
? devSource
|
|
79
|
+
: targetEnv === "all"
|
|
80
|
+
? envList[0]
|
|
81
|
+
: targetEnv;
|
|
82
|
+
const vars = source ? (0, environments_1.parseDeploymentEnv)(deploymentDir, source) : {};
|
|
83
|
+
await (0, rotation_1.run)({
|
|
84
|
+
targetEnv: targetEnv === "all" ? "all" : resolveTarget(targetEnv),
|
|
85
|
+
invalidateKeys,
|
|
86
|
+
workingDir,
|
|
87
|
+
init,
|
|
88
|
+
// provider scopes rotate mode only; it is inert when init is set.
|
|
89
|
+
provider: init ? undefined : opts.provider,
|
|
90
|
+
firebaseSaEmail: vars.FIREBASE_SA_EMAIL || undefined,
|
|
91
|
+
gcpProject: vars.FIREBASE_PROJECT_ID || undefined,
|
|
92
|
+
firebaseCredential,
|
|
93
|
+
sentryOrg: vars.SENTRY_ORG || undefined,
|
|
94
|
+
sentryProject: vars.SENTRY_PROJECT || undefined,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
// Whether any secret-source provider is provisioned in Vercel — the rotate-mode
|
|
98
|
+
// signal for whether the provider dispatch has work to do (so a project with
|
|
99
|
+
// only generated secrets doesn't hit the engine's "nothing to rotate" guard).
|
|
100
|
+
async function anyServicePresent(deployment, firebaseCredential) {
|
|
101
|
+
const keys = new Set((await deployment.listEnvVars()).envs.map((e) => e.key));
|
|
102
|
+
const ctx = {
|
|
103
|
+
targetEnv: "all",
|
|
104
|
+
deployment,
|
|
105
|
+
tempDir: "",
|
|
106
|
+
firebaseCredential,
|
|
107
|
+
};
|
|
108
|
+
return (0, service_1.serviceProviders)().some((p) => p.presenceKeys(ctx).some((k) => keys.has(k)));
|
|
109
|
+
}
|
|
110
|
+
// Drive a run that includes project-owned generated secrets (#88). Generated
|
|
111
|
+
// values are minted and pushed first (no redeploy), then the provider dispatch
|
|
112
|
+
// runs when there is provider work — its redeploy proves the generated values
|
|
113
|
+
// live too, so they share one redeploy. When only generated secrets exist (no
|
|
114
|
+
// provider work), a redeploy is triggered here instead.
|
|
115
|
+
async function runWithGeneratedSecrets(opts, init, isInit, envList, devSource, firebaseCredential, generated) {
|
|
116
|
+
const deployment = (0, registry_1.resolveProjectDeployment)(opts.deploymentDir, opts.workingDir);
|
|
117
|
+
const runTarget = opts.targetEnv === "all"
|
|
118
|
+
? "all"
|
|
119
|
+
: (0, targets_1.envTargetResolver)(opts.deploymentDir)(opts.targetEnv);
|
|
120
|
+
const wrote = await (0, generated_secrets_1.pushGeneratedSecrets)(deployment, generated, {
|
|
121
|
+
overwrite: !isInit,
|
|
122
|
+
targetEnv: runTarget,
|
|
123
|
+
});
|
|
124
|
+
const providerWork = isInit
|
|
125
|
+
? init !== undefined
|
|
126
|
+
: await anyServicePresent(deployment, firebaseCredential);
|
|
127
|
+
if (providerWork) {
|
|
128
|
+
await dispatchRotation(opts, init, envList, devSource, firebaseCredential);
|
|
129
|
+
}
|
|
130
|
+
else if (wrote) {
|
|
131
|
+
await deployment.triggerAndWaitRedeployments(runTarget);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// Orchestrates `secrets rotate` / `secrets init` from fully-resolved options:
|
|
135
|
+
// validates prerequisites, resolves the environment plan (and, for init, the
|
|
136
|
+
// concrete service + its required config), drives the rotation engine, and
|
|
137
|
+
// optionally refreshes active PR previews.
|
|
138
|
+
async function runSecrets(opts) {
|
|
139
|
+
const token = (0, auth_1.resolveVercelToken)();
|
|
140
|
+
(0, env_plan_1.assertDeploymentPrereqs)(opts.deploymentDir, token);
|
|
141
|
+
const activeEnvs = (0, environments_1.listActiveEnvs)(opts.deploymentDir);
|
|
142
|
+
if (activeEnvs.length === 0)
|
|
143
|
+
(0, logger_1.err)(`No active environments found in ${opts.deploymentDir}/environments.yml`);
|
|
144
|
+
const devSource = (0, env_plan_1.findDevSource)(opts.deploymentDir, activeEnvs);
|
|
145
|
+
const envList = (0, env_plan_1.resolveEnvList)(activeEnvs, opts.targetEnv, devSource);
|
|
146
|
+
const generated = (0, generated_secrets_1.resolveGeneratedSecrets)(opts.deploymentDir);
|
|
147
|
+
const isInit = opts.init !== undefined;
|
|
148
|
+
let init = opts.init;
|
|
149
|
+
if (init === "auto") {
|
|
150
|
+
// Auto-detect the provider(s) to initialize. A project with only generated
|
|
151
|
+
// secrets (no Firebase/Sentry config) has no provider to init but is not an
|
|
152
|
+
// error — it proceeds to mint its generated secrets.
|
|
153
|
+
const configured = (0, secrets_plan_1.detectConfiguredServices)(opts.deploymentDir, opts.targetEnv, envList, devSource);
|
|
154
|
+
if (!configured.firebase && !configured.sentry) {
|
|
155
|
+
if (generated.length === 0)
|
|
156
|
+
(0, logger_1.err)("secrets init: nothing to initialize — no Firebase or Sentry public config vars found in the deployment config");
|
|
157
|
+
init = undefined;
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
init = (0, secrets_plan_1.resolveAutoInit)(opts.deploymentDir, opts.targetEnv, envList, devSource);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
if (init)
|
|
164
|
+
(0, secrets_plan_1.validateInitConfig)(init, opts.deploymentDir, opts.targetEnv, envList, devSource);
|
|
165
|
+
// Resolve the Firebase credential contract from the manifest (the resolved
|
|
166
|
+
// var names). With no manifest / no firebase service declared, this is the
|
|
167
|
+
// default names.
|
|
168
|
+
const firebaseService = (0, manifest_1.parseManifest)(opts.deploymentDir).services.find((s) => s.provider === "firebase");
|
|
169
|
+
const firebaseCredential = (0, firebase_credential_1.resolveFirebaseCredential)(firebaseService);
|
|
170
|
+
(0, logger_1.log)(`Target: ${opts.targetEnv} | ${isInit ? `Initializing${init ? ` ${init}` : ""}` : `Rotating (invalidate old: ${opts.invalidateKeys})`}`);
|
|
171
|
+
if (generated.length === 0) {
|
|
172
|
+
await dispatchRotation(opts, init, envList, devSource, firebaseCredential);
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
await runWithGeneratedSecrets(opts, init, isInit, envList, devSource, firebaseCredential, generated);
|
|
176
|
+
}
|
|
177
|
+
if (opts.refreshPreviews) {
|
|
178
|
+
const project = (0, project_1.detectProject)(opts.workingDir);
|
|
179
|
+
const client = new vercel_api_1.VercelClient(token, project.projectId, project.teamId);
|
|
180
|
+
await (0, deployments_1.refreshPreviewDeployments)(client);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
// Command adapters: parse args (the global -C is already stripped by the
|
|
184
|
+
// router) and dispatch to the shared orchestrator.
|
|
185
|
+
async function runSecretsRotate(ctx, args) {
|
|
186
|
+
await runSecrets((0, secrets_args_1.parseSecretsArgs)(args, ctx.workingDir, false));
|
|
187
|
+
}
|
|
188
|
+
async function runSecretsInit(ctx, args) {
|
|
189
|
+
await runSecrets((0, secrets_args_1.parseSecretsArgs)(args, ctx.workingDir, true));
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=secrets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../../src/lib/commands/secrets.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { VercelClient } from "./vercel-api";
|
|
2
|
+
export declare function triggerAndWaitRedeployments(targetEnv: string, client: VercelClient): Promise<void>;
|
|
3
|
+
export declare function refreshPreviewDeployments(client: VercelClient): Promise<void>;
|
|
4
|
+
//# sourceMappingURL=deployments.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deployments.d.ts","sourceRoot":"","sources":["../../src/lib/deployments.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAiCjD,wBAAsB,2BAA2B,CAC/C,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,IAAI,CAAC,CAoCf;AAED,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,IAAI,CAAC,CA0Bf"}
|