@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.
Files changed (190) hide show
  1. package/README.md +79 -0
  2. package/dist/envctl.d.ts +3 -0
  3. package/dist/envctl.d.ts.map +1 -0
  4. package/dist/envctl.js +36 -0
  5. package/dist/envctl.js.map +1 -0
  6. package/dist/lib/auth.d.ts +21 -0
  7. package/dist/lib/auth.d.ts.map +1 -0
  8. package/dist/lib/auth.js +148 -0
  9. package/dist/lib/auth.js.map +1 -0
  10. package/dist/lib/check-firebase.d.ts +6 -0
  11. package/dist/lib/check-firebase.d.ts.map +1 -0
  12. package/dist/lib/check-firebase.js +81 -0
  13. package/dist/lib/check-firebase.js.map +1 -0
  14. package/dist/lib/check-live.d.ts +3 -0
  15. package/dist/lib/check-live.d.ts.map +1 -0
  16. package/dist/lib/check-live.js +50 -0
  17. package/dist/lib/check-live.js.map +1 -0
  18. package/dist/lib/check.d.ts +9 -0
  19. package/dist/lib/check.d.ts.map +1 -0
  20. package/dist/lib/check.js +165 -0
  21. package/dist/lib/check.js.map +1 -0
  22. package/dist/lib/cli/help.d.ts +4 -0
  23. package/dist/lib/cli/help.d.ts.map +1 -0
  24. package/dist/lib/cli/help.js +52 -0
  25. package/dist/lib/cli/help.js.map +1 -0
  26. package/dist/lib/cli/registry.d.ts +19 -0
  27. package/dist/lib/cli/registry.d.ts.map +1 -0
  28. package/dist/lib/cli/registry.js +111 -0
  29. package/dist/lib/cli/registry.js.map +1 -0
  30. package/dist/lib/cli/router.d.ts +22 -0
  31. package/dist/lib/cli/router.d.ts.map +1 -0
  32. package/dist/lib/cli/router.js +98 -0
  33. package/dist/lib/cli/router.js.map +1 -0
  34. package/dist/lib/cli/version.d.ts +2 -0
  35. package/dist/lib/cli/version.d.ts.map +1 -0
  36. package/dist/lib/cli/version.js +58 -0
  37. package/dist/lib/cli/version.js.map +1 -0
  38. package/dist/lib/commands/auth.d.ts +2 -0
  39. package/dist/lib/commands/auth.d.ts.map +1 -0
  40. package/dist/lib/commands/auth.js +33 -0
  41. package/dist/lib/commands/auth.js.map +1 -0
  42. package/dist/lib/commands/bootstrap-args.d.ts +11 -0
  43. package/dist/lib/commands/bootstrap-args.d.ts.map +1 -0
  44. package/dist/lib/commands/bootstrap-args.js +111 -0
  45. package/dist/lib/commands/bootstrap-args.js.map +1 -0
  46. package/dist/lib/commands/bootstrap.d.ts +5 -0
  47. package/dist/lib/commands/bootstrap.d.ts.map +1 -0
  48. package/dist/lib/commands/bootstrap.js +166 -0
  49. package/dist/lib/commands/bootstrap.js.map +1 -0
  50. package/dist/lib/commands/check.d.ts +3 -0
  51. package/dist/lib/commands/check.d.ts.map +1 -0
  52. package/dist/lib/commands/check.js +47 -0
  53. package/dist/lib/commands/check.js.map +1 -0
  54. package/dist/lib/commands/config-pull.d.ts +12 -0
  55. package/dist/lib/commands/config-pull.d.ts.map +1 -0
  56. package/dist/lib/commands/config-pull.js +161 -0
  57. package/dist/lib/commands/config-pull.js.map +1 -0
  58. package/dist/lib/commands/config-push-args.d.ts +9 -0
  59. package/dist/lib/commands/config-push-args.d.ts.map +1 -0
  60. package/dist/lib/commands/config-push-args.js +108 -0
  61. package/dist/lib/commands/config-push-args.js.map +1 -0
  62. package/dist/lib/commands/config-push.d.ts +6 -0
  63. package/dist/lib/commands/config-push.d.ts.map +1 -0
  64. package/dist/lib/commands/config-push.js +166 -0
  65. package/dist/lib/commands/config-push.js.map +1 -0
  66. package/dist/lib/commands/deployment-config.d.ts +9 -0
  67. package/dist/lib/commands/deployment-config.d.ts.map +1 -0
  68. package/dist/lib/commands/deployment-config.js +73 -0
  69. package/dist/lib/commands/deployment-config.js.map +1 -0
  70. package/dist/lib/commands/env-plan.d.ts +4 -0
  71. package/dist/lib/commands/env-plan.d.ts.map +1 -0
  72. package/dist/lib/commands/env-plan.js +85 -0
  73. package/dist/lib/commands/env-plan.js.map +1 -0
  74. package/dist/lib/commands/env.d.ts +4 -0
  75. package/dist/lib/commands/env.d.ts.map +1 -0
  76. package/dist/lib/commands/env.js +122 -0
  77. package/dist/lib/commands/env.js.map +1 -0
  78. package/dist/lib/commands/init.d.ts +3 -0
  79. package/dist/lib/commands/init.d.ts.map +1 -0
  80. package/dist/lib/commands/init.js +59 -0
  81. package/dist/lib/commands/init.js.map +1 -0
  82. package/dist/lib/commands/secrets-args.d.ts +13 -0
  83. package/dist/lib/commands/secrets-args.d.ts.map +1 -0
  84. package/dist/lib/commands/secrets-args.js +136 -0
  85. package/dist/lib/commands/secrets-args.js.map +1 -0
  86. package/dist/lib/commands/secrets-plan.d.ts +9 -0
  87. package/dist/lib/commands/secrets-plan.d.ts.map +1 -0
  88. package/dist/lib/commands/secrets-plan.js +109 -0
  89. package/dist/lib/commands/secrets-plan.js.map +1 -0
  90. package/dist/lib/commands/secrets.d.ts +7 -0
  91. package/dist/lib/commands/secrets.d.ts.map +1 -0
  92. package/dist/lib/commands/secrets.js +191 -0
  93. package/dist/lib/commands/secrets.js.map +1 -0
  94. package/dist/lib/deployments.d.ts +4 -0
  95. package/dist/lib/deployments.d.ts.map +1 -0
  96. package/dist/lib/deployments.js +83 -0
  97. package/dist/lib/deployments.js.map +1 -0
  98. package/dist/lib/environments.d.ts +4 -0
  99. package/dist/lib/environments.d.ts.map +1 -0
  100. package/dist/lib/environments.js +97 -0
  101. package/dist/lib/environments.js.map +1 -0
  102. package/dist/lib/firebase-credential.d.ts +28 -0
  103. package/dist/lib/firebase-credential.d.ts.map +1 -0
  104. package/dist/lib/firebase-credential.js +50 -0
  105. package/dist/lib/firebase-credential.js.map +1 -0
  106. package/dist/lib/firebase-invalidate.d.ts +4 -0
  107. package/dist/lib/firebase-invalidate.d.ts.map +1 -0
  108. package/dist/lib/firebase-invalidate.js +61 -0
  109. package/dist/lib/firebase-invalidate.js.map +1 -0
  110. package/dist/lib/firebase-vars.d.ts +14 -0
  111. package/dist/lib/firebase-vars.d.ts.map +1 -0
  112. package/dist/lib/firebase-vars.js +40 -0
  113. package/dist/lib/firebase-vars.js.map +1 -0
  114. package/dist/lib/firebase.d.ts +20 -0
  115. package/dist/lib/firebase.d.ts.map +1 -0
  116. package/dist/lib/firebase.js +189 -0
  117. package/dist/lib/firebase.js.map +1 -0
  118. package/dist/lib/gcp.d.ts +4 -0
  119. package/dist/lib/gcp.d.ts.map +1 -0
  120. package/dist/lib/gcp.js +53 -0
  121. package/dist/lib/gcp.js.map +1 -0
  122. package/dist/lib/generated-secrets.d.ts +16 -0
  123. package/dist/lib/generated-secrets.d.ts.map +1 -0
  124. package/dist/lib/generated-secrets.js +68 -0
  125. package/dist/lib/generated-secrets.js.map +1 -0
  126. package/dist/lib/logger.d.ts +7 -0
  127. package/dist/lib/logger.d.ts.map +1 -0
  128. package/dist/lib/logger.js +60 -0
  129. package/dist/lib/logger.js.map +1 -0
  130. package/dist/lib/manifest/index.d.ts +6 -0
  131. package/dist/lib/manifest/index.d.ts.map +1 -0
  132. package/dist/lib/manifest/index.js +15 -0
  133. package/dist/lib/manifest/index.js.map +1 -0
  134. package/dist/lib/manifest/parse.d.ts +11 -0
  135. package/dist/lib/manifest/parse.d.ts.map +1 -0
  136. package/dist/lib/manifest/parse.js +214 -0
  137. package/dist/lib/manifest/parse.js.map +1 -0
  138. package/dist/lib/manifest/resolve.d.ts +9 -0
  139. package/dist/lib/manifest/resolve.d.ts.map +1 -0
  140. package/dist/lib/manifest/resolve.js +34 -0
  141. package/dist/lib/manifest/resolve.js.map +1 -0
  142. package/dist/lib/manifest/types.d.ts +57 -0
  143. package/dist/lib/manifest/types.d.ts.map +1 -0
  144. package/dist/lib/manifest/types.js +12 -0
  145. package/dist/lib/manifest/types.js.map +1 -0
  146. package/dist/lib/manifest/write.d.ts +3 -0
  147. package/dist/lib/manifest/write.d.ts.map +1 -0
  148. package/dist/lib/manifest/write.js +110 -0
  149. package/dist/lib/manifest/write.js.map +1 -0
  150. package/dist/lib/project.d.ts +6 -0
  151. package/dist/lib/project.d.ts.map +1 -0
  152. package/dist/lib/project.js +56 -0
  153. package/dist/lib/project.js.map +1 -0
  154. package/dist/lib/providers/deployment.d.ts +19 -0
  155. package/dist/lib/providers/deployment.d.ts.map +1 -0
  156. package/dist/lib/providers/deployment.js +62 -0
  157. package/dist/lib/providers/deployment.js.map +1 -0
  158. package/dist/lib/providers/registry.d.ts +5 -0
  159. package/dist/lib/providers/registry.d.ts.map +1 -0
  160. package/dist/lib/providers/registry.js +31 -0
  161. package/dist/lib/providers/registry.js.map +1 -0
  162. package/dist/lib/providers/service.d.ts +35 -0
  163. package/dist/lib/providers/service.d.ts.map +1 -0
  164. package/dist/lib/providers/service.js +81 -0
  165. package/dist/lib/providers/service.js.map +1 -0
  166. package/dist/lib/rotation-preflight.d.ts +11 -0
  167. package/dist/lib/rotation-preflight.d.ts.map +1 -0
  168. package/dist/lib/rotation-preflight.js +47 -0
  169. package/dist/lib/rotation-preflight.js.map +1 -0
  170. package/dist/lib/rotation.d.ts +33 -0
  171. package/dist/lib/rotation.d.ts.map +1 -0
  172. package/dist/lib/rotation.js +168 -0
  173. package/dist/lib/rotation.js.map +1 -0
  174. package/dist/lib/sentry.d.ts +5 -0
  175. package/dist/lib/sentry.d.ts.map +1 -0
  176. package/dist/lib/sentry.js +132 -0
  177. package/dist/lib/sentry.js.map +1 -0
  178. package/dist/lib/subprocess.d.ts +8 -0
  179. package/dist/lib/subprocess.d.ts.map +1 -0
  180. package/dist/lib/subprocess.js +30 -0
  181. package/dist/lib/subprocess.js.map +1 -0
  182. package/dist/lib/targets.d.ts +3 -0
  183. package/dist/lib/targets.d.ts.map +1 -0
  184. package/dist/lib/targets.js +25 -0
  185. package/dist/lib/targets.js.map +1 -0
  186. package/dist/lib/vercel-api.d.ts +50 -0
  187. package/dist/lib/vercel-api.d.ts.map +1 -0
  188. package/dist/lib/vercel-api.js +176 -0
  189. package/dist/lib/vercel-api.js.map +1 -0
  190. 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"}