@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,214 @@
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.MANIFEST_FILENAME = void 0;
37
+ exports.manifestFilePath = manifestFilePath;
38
+ exports.parseManifest = parseManifest;
39
+ const fs = __importStar(require("fs"));
40
+ const path = __importStar(require("path"));
41
+ const yaml_1 = require("yaml");
42
+ const environments_1 = require("../environments");
43
+ exports.MANIFEST_FILENAME = "manifest.yml";
44
+ function manifestFilePath(deploymentDir) {
45
+ return path.join(deploymentDir, exports.MANIFEST_FILENAME);
46
+ }
47
+ // ─── Field parsers (each tolerates malformed input by ignoring it) ──────────
48
+ function asStringArray(value) {
49
+ if (!Array.isArray(value))
50
+ return [];
51
+ return value.filter((v) => typeof v === "string");
52
+ }
53
+ function isRecord(value) {
54
+ return value !== null && typeof value === "object" && !Array.isArray(value);
55
+ }
56
+ function parseVariableSource(spec) {
57
+ if (!isRecord(spec))
58
+ return undefined;
59
+ const { value, generate } = spec;
60
+ if (typeof value === "string" ||
61
+ typeof value === "number" ||
62
+ typeof value === "boolean")
63
+ return { kind: "value", value: String(value) };
64
+ if (generate === true)
65
+ return { kind: "generate" };
66
+ return undefined;
67
+ }
68
+ function parseVariables(raw) {
69
+ if (!isRecord(raw))
70
+ return [];
71
+ const out = [];
72
+ for (const [name, spec] of Object.entries(raw)) {
73
+ const source = parseVariableSource(spec);
74
+ if (source)
75
+ out.push({ name, source });
76
+ }
77
+ return out;
78
+ }
79
+ function parseStringMap(raw) {
80
+ if (!isRecord(raw))
81
+ return {};
82
+ const out = {};
83
+ for (const [key, value] of Object.entries(raw)) {
84
+ if (typeof value === "string")
85
+ out[key] = value;
86
+ }
87
+ return out;
88
+ }
89
+ function parseServices(raw) {
90
+ if (!Array.isArray(raw))
91
+ return [];
92
+ const out = [];
93
+ for (const item of raw) {
94
+ if (!isRecord(item) || typeof item.provider !== "string")
95
+ continue;
96
+ const service = { provider: item.provider };
97
+ if ("environments" in item)
98
+ service.environments = asStringArray(item.environments);
99
+ if ("variables" in item)
100
+ service.variables = parseStringMap(item.variables);
101
+ out.push(service);
102
+ }
103
+ return out;
104
+ }
105
+ function parseDeployments(raw) {
106
+ if (!Array.isArray(raw))
107
+ return [];
108
+ const out = [];
109
+ for (const item of raw) {
110
+ if (!isRecord(item) || typeof item.provider !== "string")
111
+ continue;
112
+ const targets = {};
113
+ if (isRecord(item.targets)) {
114
+ for (const [env, target] of Object.entries(item.targets)) {
115
+ if (typeof target === "string")
116
+ targets[env] = target;
117
+ }
118
+ }
119
+ out.push({ provider: item.provider, targets });
120
+ }
121
+ return out;
122
+ }
123
+ function parseVariableGroups(raw) {
124
+ if (!Array.isArray(raw))
125
+ return [];
126
+ const out = [];
127
+ for (const item of raw) {
128
+ if (!isRecord(item) || typeof item.name !== "string")
129
+ continue;
130
+ const variables = parseVariables(item.variables);
131
+ out.push("environments" in item
132
+ ? {
133
+ name: item.name,
134
+ environments: asStringArray(item.environments),
135
+ variables,
136
+ }
137
+ : { name: item.name, variables });
138
+ }
139
+ return out;
140
+ }
141
+ // Per-environment overlay files hold only literal `value` overrides. They share
142
+ // the legacy per-env file format (flat or nested `variables:`), so they parse
143
+ // through the existing reader.
144
+ function readOverlays(deploymentDir, environments) {
145
+ const base = path.resolve(deploymentDir);
146
+ const overlays = {};
147
+ for (const env of environments) {
148
+ if (path.dirname(path.resolve(deploymentDir, `${env}.yml`)) !== base) {
149
+ continue;
150
+ }
151
+ const values = (0, environments_1.parseDeploymentEnv)(deploymentDir, env);
152
+ if (Object.keys(values).length > 0)
153
+ overlays[env] = values;
154
+ }
155
+ return overlays;
156
+ }
157
+ // ─── Entry point ───────────────────────────────────────────────────────────
158
+ /**
159
+ * Parse a project's deployment configuration into the resolved model. Reads
160
+ * `deployment/manifest.yml` when present; otherwise falls back to the legacy
161
+ * flat format (`environments.yml` + per-env value files) mapped onto the same
162
+ * model, so existing projects parse unchanged.
163
+ */
164
+ function parseManifest(deploymentDir) {
165
+ const file = manifestFilePath(deploymentDir);
166
+ return fs.existsSync(file)
167
+ ? parseManifestFile(deploymentDir, file)
168
+ : parseLegacy(deploymentDir);
169
+ }
170
+ function parseManifestFile(deploymentDir, file) {
171
+ const content = fs.readFileSync(file, "utf-8");
172
+ const parsed = content.trim() === "" ? {} : (0, yaml_1.parse)(content);
173
+ const raw = (isRecord(parsed) ? parsed : {});
174
+ // When the manifest has no `environments` key (e.g. created by `env add
175
+ // --target` which writes only a `deployments` block), fall back to
176
+ // environments.yml so the hybrid state returns the correct env list.
177
+ const environments = raw.environments !== undefined
178
+ ? asStringArray(raw.environments)
179
+ : fs.existsSync(path.join(deploymentDir, "environments.yml"))
180
+ ? (0, environments_1.listActiveEnvs)(deploymentDir)
181
+ : [];
182
+ return {
183
+ environments,
184
+ deployments: parseDeployments(raw.deployments),
185
+ services: parseServices(raw.services),
186
+ variables: parseVariables(raw.variables),
187
+ variableGroups: parseVariableGroups(raw.variableGroups),
188
+ overlays: readOverlays(deploymentDir, environments),
189
+ };
190
+ }
191
+ // Back-compat: no manifest.yml. Map the legacy `environments.yml` (active list)
192
+ // and flat per-env value files onto the model — each env name defaulted through
193
+ // vercelTarget() under a single implicit vercel deployment, and every per-env
194
+ // var treated as a literal `value` overlay. Legacy config has no place to
195
+ // declare services, top-level variables, or groups, so those stay empty.
196
+ function parseLegacy(deploymentDir) {
197
+ // listActiveEnvs reads environments.yml directly (it does not guard the file's
198
+ // existence), so a project with no config at all degrades to an empty model.
199
+ const environments = fs.existsSync(path.join(deploymentDir, "environments.yml"))
200
+ ? (0, environments_1.listActiveEnvs)(deploymentDir)
201
+ : [];
202
+ const targets = {};
203
+ for (const env of environments)
204
+ targets[env] = (0, environments_1.vercelTarget)(env);
205
+ return {
206
+ environments,
207
+ deployments: environments.length > 0 ? [{ provider: "vercel", targets }] : [],
208
+ services: [],
209
+ variables: [],
210
+ variableGroups: [],
211
+ overlays: readOverlays(deploymentDir, environments),
212
+ };
213
+ }
214
+ //# sourceMappingURL=parse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.js","sourceRoot":"","sources":["../../../src/lib/manifest/parse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { ResolvedManifest } from "./types";
2
+ /**
3
+ * The effective literal value of a variable in an environment: a per-env
4
+ * overlay override wins over the declared base `value`. Returns `undefined`
5
+ * when the variable has no literal value there — unknown, or a non-literal
6
+ * source (`generate`/service) that carries no value in git.
7
+ */
8
+ export declare function effectiveValue(manifest: ResolvedManifest, env: string, name: string): string | undefined;
9
+ //# sourceMappingURL=resolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../../src/lib/manifest/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAgB,MAAM,SAAS,CAAC;AAmB9D;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,gBAAgB,EAC1B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,GACX,MAAM,GAAG,SAAS,CAMpB"}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.effectiveValue = effectiveValue;
4
+ // Find a variable's declaration visible in an environment: a top-level
5
+ // (all-env) variable, else a group variable whose group is scoped to the env.
6
+ function findDeclaration(manifest, env, name) {
7
+ const top = manifest.variables.find((v) => v.name === name);
8
+ if (top)
9
+ return top;
10
+ for (const group of manifest.variableGroups) {
11
+ if (group.environments && !group.environments.includes(env))
12
+ continue;
13
+ const found = group.variables.find((v) => v.name === name);
14
+ if (found)
15
+ return found;
16
+ }
17
+ return undefined;
18
+ }
19
+ /**
20
+ * The effective literal value of a variable in an environment: a per-env
21
+ * overlay override wins over the declared base `value`. Returns `undefined`
22
+ * when the variable has no literal value there — unknown, or a non-literal
23
+ * source (`generate`/service) that carries no value in git.
24
+ */
25
+ function effectiveValue(manifest, env, name) {
26
+ const decl = findDeclaration(manifest, env, name);
27
+ if (decl !== undefined && decl.source.kind !== "value")
28
+ return undefined;
29
+ const overlay = manifest.overlays[env]?.[name];
30
+ if (overlay !== undefined)
31
+ return overlay;
32
+ return decl?.source.kind === "value" ? decl.source.value : undefined;
33
+ }
34
+ //# sourceMappingURL=resolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../../src/lib/manifest/resolve.ts"],"names":[],"mappings":";;AAyBA,wCAUC;AAjCD,uEAAuE;AACvE,8EAA8E;AAC9E,SAAS,eAAe,CACtB,QAA0B,EAC1B,GAAW,EACX,IAAY;IAEZ,MAAM,GAAG,GAAG,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IAC5D,IAAI,GAAG;QAAE,OAAO,GAAG,CAAC;IACpB,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,cAAc,EAAE,CAAC;QAC5C,IAAI,KAAK,CAAC,YAAY,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,SAAS;QACtE,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QAC3D,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC;IAC1B,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;GAKG;AACH,SAAgB,cAAc,CAC5B,QAA0B,EAC1B,GAAW,EACX,IAAY;IAEZ,MAAM,IAAI,GAAG,eAAe,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;IAClD,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,SAAS,CAAC;IACzE,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;IAC/C,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,OAAO,CAAC;IAC1C,OAAO,IAAI,EAAE,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACvE,CAAC"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Where a variable's value comes from. Visibility is *derived* from the source
3
+ * (see {@link variableVisibility}) rather than tracked as a separate flag: a
4
+ * literal `value` lives in git and is public; everything else is a secret.
5
+ */
6
+ export type VariableSource = {
7
+ readonly kind: "value";
8
+ readonly value: string;
9
+ } | {
10
+ readonly kind: "generate";
11
+ };
12
+ export interface VariableDecl {
13
+ readonly name: string;
14
+ readonly source: VariableSource;
15
+ }
16
+ /** A provider-typed source of secret variables + rotation (firebase, sentry). */
17
+ export interface ServiceDecl {
18
+ readonly provider: string;
19
+ /** Environments this service is scoped to; `undefined` ⇒ every environment. */
20
+ readonly environments?: readonly string[];
21
+ /**
22
+ * Maps each provider credential *field* to the exact env var name the app
23
+ * reads (#98), e.g. `{ privateKey: "FB_PRIVATE_KEY" }`. Fields left out fall
24
+ * back to the provider's default name; an empty/absent map ⇒ all defaults.
25
+ */
26
+ readonly variables?: Readonly<Record<string, string>>;
27
+ }
28
+ /** A provider-typed deployment sink (vercel, …) with its env→target mapping. */
29
+ export interface DeploymentDecl {
30
+ readonly provider: string;
31
+ /** deploy-environment name → provider infrastructure target. */
32
+ readonly targets: Readonly<Record<string, string>>;
33
+ }
34
+ /** A scoped bundle of project-owned variables. */
35
+ export interface VariableGroup {
36
+ readonly name: string;
37
+ /** Environments this group applies to; `undefined` ⇒ every environment. */
38
+ readonly environments?: readonly string[];
39
+ readonly variables: readonly VariableDecl[];
40
+ }
41
+ export interface ResolvedManifest {
42
+ readonly environments: readonly string[];
43
+ readonly deployments: readonly DeploymentDecl[];
44
+ readonly services: readonly ServiceDecl[];
45
+ /** Top-level (ungrouped) variables — apply to every environment. */
46
+ readonly variables: readonly VariableDecl[];
47
+ readonly variableGroups: readonly VariableGroup[];
48
+ /**
49
+ * Literal value overrides from per-environment overlay files:
50
+ * env name → { variable name → literal value }.
51
+ */
52
+ readonly overlays: Readonly<Record<string, Readonly<Record<string, string>>>>;
53
+ }
54
+ export type Visibility = "public" | "secret";
55
+ /** A literal `value` is public; every other source is a secret. */
56
+ export declare function variableVisibility(source: VariableSource): Visibility;
57
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/manifest/types.ts"],"names":[],"mappings":"AAKA;;;;GAIG;AACH,MAAM,MAAM,cAAc,GACtB;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAClD;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC;AAElC,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;CACjC;AAED,iFAAiF;AACjF,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,+EAA+E;IAC/E,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C;;;;OAIG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACvD;AAED,gFAAgF;AAChF,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,gEAAgE;IAChE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACpD;AAED,kDAAkD;AAClD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,2EAA2E;IAC3E,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,QAAQ,CAAC,SAAS,EAAE,SAAS,YAAY,EAAE,CAAC;CAC7C;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,WAAW,EAAE,SAAS,cAAc,EAAE,CAAC;IAChD,QAAQ,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,CAAC;IAC1C,oEAAoE;IACpE,QAAQ,CAAC,SAAS,EAAE,SAAS,YAAY,EAAE,CAAC;IAC5C,QAAQ,CAAC,cAAc,EAAE,SAAS,aAAa,EAAE,CAAC;IAClD;;;OAGG;IACH,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;CAC/E;AAED,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE7C,mEAAmE;AACnE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,cAAc,GAAG,UAAU,CAErE"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ // The resolved deployment-manifest model. A single `manifest.yml` declares
3
+ // STRUCTURE, SOURCES, and SCOPES env-agnostically; per-environment overlay
4
+ // files carry only literal value overrides. This is the typed foundation the
5
+ // config-manifest epic (#84) builds on — no command reads it yet.
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.variableVisibility = variableVisibility;
8
+ /** A literal `value` is public; every other source is a secret. */
9
+ function variableVisibility(source) {
10
+ return source.kind === "value" ? "public" : "secret";
11
+ }
12
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lib/manifest/types.ts"],"names":[],"mappings":";AAAA,2EAA2E;AAC3E,2EAA2E;AAC3E,6EAA6E;AAC7E,kEAAkE;;AA6DlE,gDAEC;AAHD,mEAAmE;AACnE,SAAgB,kBAAkB,CAAC,MAAsB;IACvD,OAAO,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;AACvD,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function setManifestEnvironments(deploymentDir: string, environments: string[]): void;
2
+ export declare function setManifestTarget(deploymentDir: string, envName: string, target: string): void;
3
+ //# sourceMappingURL=write.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../../src/lib/manifest/write.ts"],"names":[],"mappings":"AAsBA,wBAAgB,uBAAuB,CACrC,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,EAAE,GACrB,IAAI,CA4BN;AAQD,wBAAgB,iBAAiB,CAC/B,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,IAAI,CAsBN"}
@@ -0,0 +1,110 @@
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.setManifestEnvironments = setManifestEnvironments;
37
+ exports.setManifestTarget = setManifestTarget;
38
+ const fs = __importStar(require("fs"));
39
+ const yaml_1 = require("yaml");
40
+ const parse_1 = require("./parse");
41
+ function loadOrCreate(file) {
42
+ if (!fs.existsSync(file))
43
+ return new yaml_1.Document({});
44
+ const text = fs.readFileSync(file, "utf-8");
45
+ return text.trim() === "" ? new yaml_1.Document({}) : (0, yaml_1.parseDocument)(text);
46
+ }
47
+ // Update the `environments:` list in manifest.yml, preserving comments and key
48
+ // ordering in an existing file. Uses the `yaml` Document API — the comment-safe
49
+ // replacement for the legacy js-yaml load→mutate→dump writeActiveEnvs().
50
+ //
51
+ // The sequence is rebuilt in the requested order by REUSING each surviving
52
+ // entry's node rather than replacing the whole `environments` node — so an
53
+ // inline comment on an entry (`- production # primary`) travels with it (#104).
54
+ // New names get fresh nodes; dropped names fall away. When the file does not
55
+ // exist (or is blank), a new manifest carrying only the environments list is
56
+ // created.
57
+ function setManifestEnvironments(deploymentDir, environments) {
58
+ const file = (0, parse_1.manifestFilePath)(deploymentDir);
59
+ const doc = loadOrCreate(file);
60
+ // Index the surviving entries by scalar value so their nodes — and the inline
61
+ // comments attached to them — can be reused in the rebuilt sequence.
62
+ const current = doc.get("environments", true);
63
+ const reusable = new Map();
64
+ if ((0, yaml_1.isSeq)(current)) {
65
+ for (const item of current.items) {
66
+ const value = (0, yaml_1.isScalar)(item) ? item.value : item;
67
+ if (typeof value === "string" && !reusable.has(value))
68
+ reusable.set(value, item);
69
+ }
70
+ }
71
+ const seq = new yaml_1.YAMLSeq();
72
+ for (const env of environments) {
73
+ if (reusable.has(env)) {
74
+ seq.items.push(reusable.get(env));
75
+ reusable.delete(env); // never reuse the same node twice
76
+ }
77
+ else {
78
+ seq.items.push(doc.createNode(env));
79
+ }
80
+ }
81
+ doc.set("environments", seq);
82
+ fs.writeFileSync(file, doc.toString());
83
+ }
84
+ // Persist an environment's provider target into the manifest's authoritative
85
+ // `deployments[].targets` map (#87) — the write behind `env add --target`. The
86
+ // vercel deployment entry (and its `targets` map) is created if absent;
87
+ // otherwise the single target is upserted in place, preserving comments and
88
+ // every other key. Only the target is recorded here — the active-env list stays
89
+ // in environments.yml.
90
+ function setManifestTarget(deploymentDir, envName, target) {
91
+ const file = (0, parse_1.manifestFilePath)(deploymentDir);
92
+ const doc = loadOrCreate(file);
93
+ const deployments = doc.get("deployments", true);
94
+ const idx = (0, yaml_1.isSeq)(deployments)
95
+ ? deployments.items.findIndex((item) => (0, yaml_1.isMap)(item) && item.get("provider") === "vercel")
96
+ : -1;
97
+ if (idx !== -1) {
98
+ doc.setIn(["deployments", idx, "targets", envName], target);
99
+ }
100
+ else if ((0, yaml_1.isSeq)(deployments)) {
101
+ deployments.add({ provider: "vercel", targets: { [envName]: target } });
102
+ }
103
+ else {
104
+ doc.set("deployments", [
105
+ { provider: "vercel", targets: { [envName]: target } },
106
+ ]);
107
+ }
108
+ fs.writeFileSync(file, doc.toString());
109
+ }
110
+ //# sourceMappingURL=write.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write.js","sourceRoot":"","sources":["../../../src/lib/manifest/write.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export interface ProjectConfig {
2
+ projectId: string;
3
+ teamId?: string;
4
+ }
5
+ export declare function detectProject(workingDir?: string): ProjectConfig;
6
+ //# sourceMappingURL=project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/lib/project.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,aAAa,CAC3B,UAAU,GAAE,MAAsB,GACjC,aAAa,CAuBf"}
@@ -0,0 +1,56 @@
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.detectProject = detectProject;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const logger_1 = require("./logger");
40
+ function detectProject(workingDir = process.cwd()) {
41
+ const projectId = process.env.VERCEL_PROJECT_ID;
42
+ const teamId = process.env.VERCEL_TEAM_ID ?? undefined;
43
+ const projectJsonPath = path.join(workingDir, ".vercel", "project.json");
44
+ if (fs.existsSync(projectJsonPath)) {
45
+ const data = JSON.parse(fs.readFileSync(projectJsonPath, "utf-8"));
46
+ return {
47
+ projectId: projectId ?? data.projectId ?? "",
48
+ teamId: teamId ?? data.orgId ?? undefined,
49
+ };
50
+ }
51
+ if (!projectId) {
52
+ return (0, logger_1.err)("Could not detect Vercel project ID. Set VERCEL_PROJECT_ID or run from a Vercel project directory.");
53
+ }
54
+ return { projectId, teamId };
55
+ }
56
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/lib/project.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAUA,sCAyBC;AAnCD,uCAAyB;AACzB,2CAA6B;AAE7B,qCAA+B;AAO/B,SAAgB,aAAa,CAC3B,aAAqB,OAAO,CAAC,GAAG,EAAE;IAElC,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAChD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,SAAS,CAAC;IAEvD,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;IACzE,IAAI,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAGhE,CAAC;QACF,OAAO;YACL,SAAS,EAAE,SAAS,IAAI,IAAI,CAAC,SAAS,IAAI,EAAE;YAC5C,MAAM,EAAE,MAAM,IAAI,IAAI,CAAC,KAAK,IAAI,SAAS;SAC1C,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,IAAA,YAAG,EACR,mGAAmG,CACpG,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { type VercelEnvVar, type VercelEnvVarList } from "../vercel-api";
2
+ type EnvVarType = "plain" | "encrypted";
3
+ export interface DeploymentProvider {
4
+ readonly provider: string;
5
+ readonly projectId: string;
6
+ readonly teamId: string | undefined;
7
+ listEnvVars(): Promise<VercelEnvVarList>;
8
+ getEnvVarValue(id: string): Promise<string>;
9
+ findEnvVar(envs: VercelEnvVar[], key: string, target: string): VercelEnvVar | undefined;
10
+ createEnvVar(key: string, value: string, target: string, type?: EnvVarType): Promise<VercelEnvVar>;
11
+ updateEnvVar(existing: VercelEnvVar, value: string): Promise<void>;
12
+ setEnvForTarget(key: string, value: string, target: string, envs: VercelEnvVar[], type?: EnvVarType): Promise<string>;
13
+ removeEnvVarFromTarget(id: string, existingTargets: string[], vercelEnv: string): Promise<void>;
14
+ triggerAndWaitRedeployments(targetEnv: string): Promise<void>;
15
+ refreshPreviewDeployments(): Promise<void>;
16
+ }
17
+ export declare function createVercelDeploymentProvider(workingDir: string): DeploymentProvider;
18
+ export {};
19
+ //# sourceMappingURL=deployment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deployment.d.ts","sourceRoot":"","sources":["../../../src/lib/providers/deployment.ts"],"names":[],"mappings":"AAOA,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACtB,MAAM,eAAe,CAAC;AAEvB,KAAK,UAAU,GAAG,OAAO,GAAG,WAAW,CAAC;AAOxC,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,WAAW,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACzC,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5C,UAAU,CACR,IAAI,EAAE,YAAY,EAAE,EACpB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,GACb,YAAY,GAAG,SAAS,CAAC;IAC5B,YAAY,CACV,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,UAAU,GAChB,OAAO,CAAC,YAAY,CAAC,CAAC;IACzB,YAAY,CAAC,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnE,eAAe,CACb,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,YAAY,EAAE,EACpB,IAAI,CAAC,EAAE,UAAU,GAChB,OAAO,CAAC,MAAM,CAAC,CAAC;IACnB,sBAAsB,CACpB,EAAE,EAAE,MAAM,EACV,eAAe,EAAE,MAAM,EAAE,EACzB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,2BAA2B,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D,yBAAyB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5C;AA4ED,wBAAgB,8BAA8B,CAC5C,UAAU,EAAE,MAAM,GACjB,kBAAkB,CAEpB"}
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createVercelDeploymentProvider = createVercelDeploymentProvider;
4
+ const auth_1 = require("../auth");
5
+ const deployments_1 = require("../deployments");
6
+ const logger_1 = require("../logger");
7
+ const project_1 = require("../project");
8
+ const vercel_api_1 = require("../vercel-api");
9
+ // The Vercel deployment provider — wraps VercelClient + deployments.ts, with
10
+ // identity resolved from VERCEL_* env vars / .vercel/project.json. Delegation
11
+ // keeps VercelClient's behavior (and its prototype, which the tests spy on)
12
+ // unchanged.
13
+ class VercelDeploymentProvider {
14
+ provider = "vercel";
15
+ projectId;
16
+ teamId;
17
+ client;
18
+ constructor(workingDir) {
19
+ const token = (0, auth_1.resolveVercelToken)();
20
+ if (!token)
21
+ throw new logger_1.FatalError("No Vercel token found. Set VERCEL_TOKEN or run 'vercel login' to authenticate.");
22
+ const project = (0, project_1.detectProject)(workingDir);
23
+ this.projectId = project.projectId;
24
+ this.teamId = project.teamId;
25
+ this.client = new vercel_api_1.VercelClient(token, project.projectId, project.teamId);
26
+ }
27
+ listEnvVars() {
28
+ return this.client.listEnvVars();
29
+ }
30
+ getEnvVarValue(id) {
31
+ return this.client.getEnvVarValue(id);
32
+ }
33
+ findEnvVar(envs, key, target) {
34
+ return this.client.findEnvVar(envs, key, target);
35
+ }
36
+ createEnvVar(key, value, target, type = "plain") {
37
+ return this.client.createEnvVar(key, value, target, type);
38
+ }
39
+ updateEnvVar(existing, value) {
40
+ return this.client.updateEnvVar(existing, value);
41
+ }
42
+ setEnvForTarget(key, value, target, envs, type) {
43
+ // Forward `type` only when the caller set it, so the underlying client's
44
+ // own default applies and the delegated call keeps its original arity.
45
+ return type === undefined
46
+ ? this.client.setEnvForTarget(key, value, target, envs)
47
+ : this.client.setEnvForTarget(key, value, target, envs, type);
48
+ }
49
+ removeEnvVarFromTarget(id, existingTargets, vercelEnv) {
50
+ return this.client.removeEnvVarFromTarget(id, existingTargets, vercelEnv);
51
+ }
52
+ triggerAndWaitRedeployments(targetEnv) {
53
+ return (0, deployments_1.triggerAndWaitRedeployments)(targetEnv, this.client);
54
+ }
55
+ refreshPreviewDeployments() {
56
+ return (0, deployments_1.refreshPreviewDeployments)(this.client);
57
+ }
58
+ }
59
+ function createVercelDeploymentProvider(workingDir) {
60
+ return new VercelDeploymentProvider(workingDir);
61
+ }
62
+ //# sourceMappingURL=deployment.js.map