@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,8 @@
1
+ import type { SpawnSyncOptions } from "child_process";
2
+ export declare function run(cmd: string, args: string[], opts?: SpawnSyncOptions): string;
3
+ export declare function commandExists(cmd: string): boolean;
4
+ export declare function runStatus(cmd: string, args: string[], opts?: SpawnSyncOptions): {
5
+ status: number | null;
6
+ stdout: string;
7
+ };
8
+ //# sourceMappingURL=subprocess.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subprocess.d.ts","sourceRoot":"","sources":["../../src/lib/subprocess.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAGtD,wBAAgB,GAAG,CACjB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,CAAC,EAAE,gBAAgB,GACtB,MAAM,CAUR;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAGlD;AAMD,wBAAgB,SAAS,CACvB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,CAAC,EAAE,gBAAgB,GACtB;IAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAK3C"}
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.run = run;
4
+ exports.commandExists = commandExists;
5
+ exports.runStatus = runStatus;
6
+ const child_process_1 = require("child_process");
7
+ function run(cmd, args, opts) {
8
+ const result = (0, child_process_1.spawnSync)(cmd, args, { encoding: "utf-8", ...opts });
9
+ if (result.error)
10
+ throw new Error(`Failed to run ${cmd}: ${result.error.message}`);
11
+ if (result.status !== 0) {
12
+ throw new Error(`${cmd} exited with code ${String(result.status)}: ${String(result.stderr)}`);
13
+ }
14
+ return String(result.stdout);
15
+ }
16
+ function commandExists(cmd) {
17
+ const result = (0, child_process_1.spawnSync)("which", [cmd]);
18
+ return result.status === 0;
19
+ }
20
+ // Like `run`, but returns the exit status instead of throwing on a non-zero
21
+ // exit — for callers that treat the code itself as data (e.g. `git check-ignore`,
22
+ // where 0 = ignored, 1 = not ignored, 128 = not a repo). A failure to spawn the
23
+ // process at all still throws; guard with `commandExists` when that matters.
24
+ function runStatus(cmd, args, opts) {
25
+ const result = (0, child_process_1.spawnSync)(cmd, args, { encoding: "utf-8", ...opts });
26
+ if (result.error)
27
+ throw new Error(`Failed to run ${cmd}: ${result.error.message}`);
28
+ return { status: result.status, stdout: String(result.stdout ?? "") };
29
+ }
30
+ //# sourceMappingURL=subprocess.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subprocess.js","sourceRoot":"","sources":["../../src/lib/subprocess.ts"],"names":[],"mappings":";;AAGA,kBAcC;AAED,sCAGC;AAMD,8BASC;AApCD,iDAA0C;AAE1C,SAAgB,GAAG,CACjB,GAAW,EACX,IAAc,EACd,IAAuB;IAEvB,MAAM,MAAM,GAAG,IAAA,yBAAS,EAAC,GAAG,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;IACpE,IAAI,MAAM,CAAC,KAAK;QACd,MAAM,IAAI,KAAK,CAAC,iBAAiB,GAAG,KAAK,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACnE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CACb,GAAG,GAAG,qBAAqB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAC7E,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC;AAED,SAAgB,aAAa,CAAC,GAAW;IACvC,MAAM,MAAM,GAAG,IAAA,yBAAS,EAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACzC,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;AAC7B,CAAC;AAED,4EAA4E;AAC5E,kFAAkF;AAClF,gFAAgF;AAChF,6EAA6E;AAC7E,SAAgB,SAAS,CACvB,GAAW,EACX,IAAc,EACd,IAAuB;IAEvB,MAAM,MAAM,GAAG,IAAA,yBAAS,EAAC,GAAG,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;IACpE,IAAI,MAAM,CAAC,KAAK;QACd,MAAM,IAAI,KAAK,CAAC,iBAAiB,GAAG,KAAK,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACnE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,CAAC;AACxE,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function envTargetResolver(deploymentDir: string): (envName: string) => string;
2
+ export declare function resolveEnvTarget(deploymentDir: string, envName: string): string;
3
+ //# sourceMappingURL=targets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"targets.d.ts","sourceRoot":"","sources":["../../src/lib/targets.ts"],"names":[],"mappings":"AAYA,wBAAgB,iBAAiB,CAC/B,aAAa,EAAE,MAAM,GACpB,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAK7B;AAGD,wBAAgB,gBAAgB,CAC9B,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,GACd,MAAM,CAER"}
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.envTargetResolver = envTargetResolver;
4
+ exports.resolveEnvTarget = resolveEnvTarget;
5
+ const environments_1 = require("./environments");
6
+ const manifest_1 = require("./manifest");
7
+ // Env → provider infrastructure-target resolution (#87). The manifest's
8
+ // `deployments[].targets` map is authoritative; the name convention
9
+ // (vercelTarget / TARGET_MAP) is only the fallback for an env the manifest does
10
+ // not declare — a legacy config with no `targets:` block, or an env omitted from
11
+ // the map — so existing repos resolve exactly as before.
12
+ // Build a resolver bound to one deployment dir, parsing the manifest once. Use
13
+ // this when resolving several environments (config push, the dev-source scan,
14
+ // `env list`); {@link resolveEnvTarget} is the single-env convenience.
15
+ function envTargetResolver(deploymentDir) {
16
+ const manifest = (0, manifest_1.parseManifest)(deploymentDir);
17
+ const vercel = manifest.deployments.find((d) => d.provider === "vercel");
18
+ const targets = vercel?.targets ?? {};
19
+ return (envName) => targets[envName] ?? (0, environments_1.vercelTarget)(envName);
20
+ }
21
+ // The provider target for a single environment.
22
+ function resolveEnvTarget(deploymentDir, envName) {
23
+ return envTargetResolver(deploymentDir)(envName);
24
+ }
25
+ //# sourceMappingURL=targets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"targets.js","sourceRoot":"","sources":["../../src/lib/targets.ts"],"names":[],"mappings":";;AAYA,8CAOC;AAGD,4CAKC;AA3BD,iDAA8C;AAC9C,yCAA2C;AAE3C,wEAAwE;AACxE,oEAAoE;AACpE,gFAAgF;AAChF,iFAAiF;AACjF,yDAAyD;AAEzD,+EAA+E;AAC/E,8EAA8E;AAC9E,uEAAuE;AACvE,SAAgB,iBAAiB,CAC/B,aAAqB;IAErB,MAAM,QAAQ,GAAG,IAAA,wBAAa,EAAC,aAAa,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;IACzE,MAAM,OAAO,GAAG,MAAM,EAAE,OAAO,IAAI,EAAE,CAAC;IACtC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,IAAA,2BAAY,EAAC,OAAO,CAAC,CAAC;AAChE,CAAC;AAED,gDAAgD;AAChD,SAAgB,gBAAgB,CAC9B,aAAqB,EACrB,OAAe;IAEf,OAAO,iBAAiB,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC;AACnD,CAAC"}
@@ -0,0 +1,50 @@
1
+ export interface VercelEnvVar {
2
+ id: string;
3
+ key: string;
4
+ value: string;
5
+ target: string[];
6
+ type: "plain" | "encrypted" | "secret";
7
+ createdAt?: number;
8
+ updatedAt?: number;
9
+ }
10
+ export interface VercelEnvVarList {
11
+ envs: VercelEnvVar[];
12
+ pagination?: {
13
+ next?: number;
14
+ };
15
+ }
16
+ export interface VercelDeployment {
17
+ uid: string;
18
+ url: string;
19
+ name: string;
20
+ readyState?: string;
21
+ status?: string;
22
+ }
23
+ export declare class VercelClient {
24
+ private token;
25
+ private projectId;
26
+ private teamId?;
27
+ private baseUrl;
28
+ constructor(token: string, projectId: string, teamId?: string | undefined);
29
+ private buildUrl;
30
+ request<T>(path: string, method?: string, body?: unknown): Promise<T>;
31
+ listEnvVars(): Promise<VercelEnvVarList>;
32
+ getEnvVarValue(envId: string): Promise<string>;
33
+ createEnvVar(key: string, value: string, target: string, type?: "plain" | "encrypted"): Promise<VercelEnvVar>;
34
+ updateEnvVar(existing: VercelEnvVar, value: string): Promise<void>;
35
+ deleteEnvVar(envId: string): Promise<void>;
36
+ /**
37
+ * Remove one Vercel target from an env-var record. If the record covers only
38
+ * that target, the record is deleted outright; otherwise it is patched to
39
+ * remove just that target so the credential is preserved for the remaining
40
+ * environments.
41
+ */
42
+ removeEnvVarFromTarget(envId: string, existingTargets: string[], vercelEnv: string): Promise<void>;
43
+ findEnvVar(envs: VercelEnvVar[], key: string, target: string): VercelEnvVar | undefined;
44
+ setEnvForTarget(key: string, value: string, target: string, allEnvs: VercelEnvVar[], type?: "plain" | "encrypted"): Promise<string>;
45
+ getLatestDeployment(target: "production" | "staging"): Promise<VercelDeployment | null>;
46
+ triggerRedeployment(deploymentId: string, name: string, target?: string): Promise<string>;
47
+ listPreviewDeployments(): Promise<VercelDeployment[]>;
48
+ pollDeploymentStatus(deploymentId: string, maxAttempts?: number, intervalMs?: number): Promise<"ready" | "canceled">;
49
+ }
50
+ //# sourceMappingURL=vercel-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vercel-api.d.ts","sourceRoot":"","sources":["../../src/lib/vercel-api.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,EAAE,OAAO,GAAG,WAAW,GAAG,QAAQ,CAAC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,YAAY,EAAE,CAAC;IACrB,UAAU,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAChC;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,YAAY;IAIrB,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,MAAM,CAAC;IALjB,OAAO,CAAC,OAAO,CAA4B;gBAGjC,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,MAAM,YAAA;IAGzB,OAAO,CAAC,QAAQ;IAMV,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,SAAQ,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAoBpE,WAAW,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAgBxC,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAO9C,YAAY,CAChB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,OAAO,GAAG,WAAqB,GACpC,OAAO,CAAC,YAAY,CAAC;IAkBlB,YAAY,CAAC,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAalE,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhD;;;;;OAKG;IACG,sBAAsB,CAC1B,KAAK,EAAE,MAAM,EACb,eAAe,EAAE,MAAM,EAAE,EACzB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC;IAahB,UAAU,CACR,IAAI,EAAE,YAAY,EAAE,EACpB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,GACb,YAAY,GAAG,SAAS;IAIrB,eAAe,CACnB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,YAAY,EAAE,EACvB,IAAI,GAAE,OAAO,GAAG,WAAyB,GACxC,OAAO,CAAC,MAAM,CAAC;IAmBZ,mBAAmB,CACvB,MAAM,EAAE,YAAY,GAAG,SAAS,GAC/B,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAmB7B,mBAAmB,CACvB,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC;IAWZ,sBAAsB,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAwBrD,oBAAoB,CACxB,YAAY,EAAE,MAAM,EACpB,WAAW,SAAK,EAChB,UAAU,SAAS,GAClB,OAAO,CAAC,OAAO,GAAG,UAAU,CAAC;CAkBjC"}
@@ -0,0 +1,176 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VercelClient = void 0;
4
+ const logger_1 = require("./logger");
5
+ class VercelClient {
6
+ token;
7
+ projectId;
8
+ teamId;
9
+ baseUrl = "https://api.vercel.com";
10
+ constructor(token, projectId, teamId) {
11
+ this.token = token;
12
+ this.projectId = projectId;
13
+ this.teamId = teamId;
14
+ }
15
+ buildUrl(path) {
16
+ const url = new URL(`${this.baseUrl}${path}`);
17
+ if (this.teamId)
18
+ url.searchParams.set("teamId", this.teamId);
19
+ return url.toString();
20
+ }
21
+ async request(path, method = "GET", body) {
22
+ const url = this.buildUrl(path);
23
+ const res = await fetch(url, {
24
+ method,
25
+ headers: {
26
+ Authorization: `Bearer ${this.token}`,
27
+ "Content-Type": "application/json",
28
+ },
29
+ body: body !== undefined ? JSON.stringify(body) : undefined,
30
+ });
31
+ if (!res.ok) {
32
+ const text = await res.text();
33
+ throw new logger_1.FatalError(`Vercel API ${method} ${path} failed (${res.status}): ${text}`);
34
+ }
35
+ if (res.status === 204 || method === "DELETE")
36
+ return undefined;
37
+ return res.json();
38
+ }
39
+ async listEnvVars() {
40
+ let result = await this.request(`/v9/projects/${this.projectId}/env?limit=100`);
41
+ while (result.pagination?.next) {
42
+ const page = await this.request(`/v9/projects/${this.projectId}/env?limit=100&since=${result.pagination.next}`);
43
+ result = {
44
+ envs: [...result.envs, ...page.envs],
45
+ pagination: page.pagination,
46
+ };
47
+ }
48
+ return result;
49
+ }
50
+ async getEnvVarValue(envId) {
51
+ const record = await this.request(`/v1/projects/${this.projectId}/env/${envId}`);
52
+ return record.value;
53
+ }
54
+ async createEnvVar(key, value, target, type = "plain") {
55
+ return this.request(`/v10/projects/${this.projectId}/env`, "POST", {
56
+ key,
57
+ value,
58
+ target: [target],
59
+ type,
60
+ });
61
+ }
62
+ // Edit an existing env var in place. Vercel's PATCH silently ignores a
63
+ // value-only body (leaving the var stale — #124); the reliable edit request
64
+ // carries the record's full descriptor, so we resend key/type/target from the
65
+ // existing record alongside the new value. Preserving `target` also keeps a
66
+ // multi-target record's other environments intact.
67
+ async updateEnvVar(existing, value) {
68
+ await this.request(`/v9/projects/${this.projectId}/env/${existing.id}`, "PATCH", {
69
+ key: existing.key,
70
+ type: existing.type,
71
+ target: existing.target,
72
+ value,
73
+ });
74
+ }
75
+ async deleteEnvVar(envId) {
76
+ await this.request(`/v9/projects/${this.projectId}/env/${envId}`, "DELETE");
77
+ }
78
+ /**
79
+ * Remove one Vercel target from an env-var record. If the record covers only
80
+ * that target, the record is deleted outright; otherwise it is patched to
81
+ * remove just that target so the credential is preserved for the remaining
82
+ * environments.
83
+ */
84
+ async removeEnvVarFromTarget(envId, existingTargets, vercelEnv) {
85
+ const remaining = existingTargets.filter((t) => t !== vercelEnv);
86
+ if (remaining.length === 0) {
87
+ await this.deleteEnvVar(envId);
88
+ }
89
+ else {
90
+ await this.request(`/v9/projects/${this.projectId}/env/${envId}`, "PATCH", { target: remaining });
91
+ }
92
+ }
93
+ findEnvVar(envs, key, target) {
94
+ return envs.find((e) => e.key === key && e.target.includes(target));
95
+ }
96
+ async setEnvForTarget(key, value, target, allEnvs, type = "encrypted") {
97
+ const existing = this.findEnvVar(allEnvs, key, target);
98
+ if (existing) {
99
+ await this.deleteEnvVar(existing.id);
100
+ }
101
+ const created = await this.createEnvVar(key, value, target, type);
102
+ if (!created.id) {
103
+ const refetched = await this.listEnvVars();
104
+ const confirmed = this.findEnvVar(refetched.envs, key, target);
105
+ if (!confirmed?.id) {
106
+ throw new Error(`Failed to confirm ${key} was saved for ${target} after write`);
107
+ }
108
+ return confirmed.id;
109
+ }
110
+ return created.id;
111
+ }
112
+ async getLatestDeployment(target) {
113
+ const url = new URL(`${this.baseUrl}/v6/deployments`);
114
+ url.searchParams.set("projectId", this.projectId);
115
+ url.searchParams.set("target", target);
116
+ url.searchParams.set("limit", "1");
117
+ url.searchParams.set("state", "READY");
118
+ if (this.teamId)
119
+ url.searchParams.set("teamId", this.teamId);
120
+ const res = await fetch(url.toString(), {
121
+ headers: { Authorization: `Bearer ${this.token}` },
122
+ });
123
+ if (!res.ok)
124
+ return null;
125
+ const text = await res.text();
126
+ // eslint-disable-next-line no-control-regex
127
+ const cleaned = text.replace(/[\x00-\x08\x0b\x0c\x0e-\x1f]/g, "");
128
+ const data = JSON.parse(cleaned);
129
+ return data.deployments[0] ?? null;
130
+ }
131
+ async triggerRedeployment(deploymentId, name, target) {
132
+ const body = { deploymentId, name };
133
+ if (target !== undefined)
134
+ body.target = target;
135
+ const result = await this.request("/v13/deployments", "POST", body);
136
+ return result.id;
137
+ }
138
+ async listPreviewDeployments() {
139
+ const url = new URL(`${this.baseUrl}/v6/deployments`);
140
+ url.searchParams.set("projectId", this.projectId);
141
+ url.searchParams.set("state", "READY");
142
+ url.searchParams.set("limit", "50");
143
+ if (this.teamId)
144
+ url.searchParams.set("teamId", this.teamId);
145
+ const res = await fetch(url.toString(), {
146
+ headers: { Authorization: `Bearer ${this.token}` },
147
+ });
148
+ if (!res.ok)
149
+ return [];
150
+ const data = (await res.json());
151
+ // PR preview deployments have target === null; production and aliased
152
+ // preview (staging) deployments have an explicit target string.
153
+ return data.deployments.filter((d) => d.target === null);
154
+ }
155
+ // Poll until the deployment reaches a terminal state. `READY` → "ready";
156
+ // `CANCELED` → "canceled" (a benign auto-cancel — Vercel supersedes a redeploy
157
+ // with a newer build, or the project auto-cancels redundant ones — so the
158
+ // caller warns rather than fails, #125). Only a genuine `ERROR` (or a timeout)
159
+ // throws.
160
+ async pollDeploymentStatus(deploymentId, maxAttempts = 60, intervalMs = 10_000) {
161
+ for (let attempt = 0; attempt < maxAttempts; attempt++) {
162
+ const result = await this.request(`/v13/deployments/${deploymentId}`);
163
+ if (result.status === "READY")
164
+ return "ready";
165
+ if (result.status === "CANCELED")
166
+ return "canceled";
167
+ if (result.status === "ERROR") {
168
+ throw new Error(`Deployment ${deploymentId} ended with status: ${result.status}`);
169
+ }
170
+ await new Promise((r) => setTimeout(r, intervalMs));
171
+ }
172
+ throw new Error(`Deployment ${deploymentId} timed out after ${maxAttempts} attempts`);
173
+ }
174
+ }
175
+ exports.VercelClient = VercelClient;
176
+ //# sourceMappingURL=vercel-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vercel-api.js","sourceRoot":"","sources":["../../src/lib/vercel-api.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "@rmartz/envctl",
3
+ "version": "3.1.1",
4
+ "description": "Personal gh-style CLI for managing deploy configuration and atomically rotating provider secrets.",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/rmartz/envctl.git"
9
+ },
10
+ "publishConfig": {
11
+ "registry": "https://registry.npmjs.org/",
12
+ "@rmartz:registry": "https://registry.npmjs.org/",
13
+ "access": "public"
14
+ },
15
+ "files": [
16
+ "dist"
17
+ ],
18
+ "packageManager": "pnpm@10.30.3",
19
+ "bin": {
20
+ "envctl": "dist/envctl.js"
21
+ },
22
+ "engines": {
23
+ "node": ">=18",
24
+ "pnpm": ">=9"
25
+ },
26
+ "scripts": {
27
+ "build": "tsc && chmod +x dist/envctl.js",
28
+ "typecheck": "tsc --noEmit",
29
+ "lint": "eslint --max-warnings 0 .",
30
+ "format": "prettier --write .",
31
+ "format:check": "prettier --check .",
32
+ "test:ts": "vitest run",
33
+ "check:file-length": "node scripts/check-file-length.mjs"
34
+ },
35
+ "dependencies": {
36
+ "js-yaml": "^5.4.1",
37
+ "yaml": "^2.9.1"
38
+ },
39
+ "devDependencies": {
40
+ "@eslint/js": "^10.0.1",
41
+ "@types/js-yaml": "^4.0.9",
42
+ "@types/node": "^26.5.1",
43
+ "@vitest/coverage-v8": "^5.0.0",
44
+ "conventional-changelog-conventionalcommits": "^8.0.0",
45
+ "eslint": "^10.10.0",
46
+ "globals": "^17.12.0",
47
+ "prettier": "^3.9.6",
48
+ "semantic-release": "^25.0.9",
49
+ "typescript": "^6.0.3",
50
+ "typescript-eslint": "^8.70.0",
51
+ "vitest": "^5.0.0"
52
+ }
53
+ }