@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,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 @@
|
|
|
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
|
+
}
|