alpic 0.0.0-dev.f19a8ca → 0.0.0-dev.f1adf05

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 (203) hide show
  1. package/README.md +40 -0
  2. package/bin/run.js +5 -0
  3. package/dist/__tests__/audit.e2e.test.d.ts +1 -0
  4. package/dist/__tests__/audit.e2e.test.js +562 -0
  5. package/dist/__tests__/audit.e2e.test.js.map +1 -0
  6. package/dist/__tests__/auth.e2e.test.d.ts +1 -0
  7. package/dist/__tests__/auth.e2e.test.js +162 -0
  8. package/dist/__tests__/auth.e2e.test.js.map +1 -0
  9. package/dist/__tests__/deploy-flags.e2e.test.d.ts +1 -0
  10. package/dist/__tests__/deploy-flags.e2e.test.js +228 -0
  11. package/dist/__tests__/deploy-flags.e2e.test.js.map +1 -0
  12. package/dist/__tests__/deploy.e2e.test.js +66 -66
  13. package/dist/__tests__/deploy.e2e.test.js.map +1 -1
  14. package/dist/__tests__/deployment-inspect.e2e.test.d.ts +1 -0
  15. package/dist/__tests__/deployment-inspect.e2e.test.js +119 -0
  16. package/dist/__tests__/deployment-inspect.e2e.test.js.map +1 -0
  17. package/dist/__tests__/deployment-list.e2e.test.d.ts +1 -0
  18. package/dist/__tests__/deployment-list.e2e.test.js +121 -0
  19. package/dist/__tests__/deployment-list.e2e.test.js.map +1 -0
  20. package/dist/__tests__/deployment-logs.e2e.test.d.ts +1 -0
  21. package/dist/__tests__/deployment-logs.e2e.test.js +260 -0
  22. package/dist/__tests__/deployment-logs.e2e.test.js.map +1 -0
  23. package/dist/__tests__/environment-variable/environment-variable-add.e2e.test.d.ts +1 -0
  24. package/dist/__tests__/environment-variable/environment-variable-add.e2e.test.js +264 -0
  25. package/dist/__tests__/environment-variable/environment-variable-add.e2e.test.js.map +1 -0
  26. package/dist/__tests__/environment-variable/environment-variable-list.e2e.test.d.ts +1 -0
  27. package/dist/__tests__/environment-variable/environment-variable-list.e2e.test.js +144 -0
  28. package/dist/__tests__/environment-variable/environment-variable-list.e2e.test.js.map +1 -0
  29. package/dist/__tests__/environment-variable/environment-variable-remove.e2e.test.d.ts +1 -0
  30. package/dist/__tests__/environment-variable/environment-variable-remove.e2e.test.js +155 -0
  31. package/dist/__tests__/environment-variable/environment-variable-remove.e2e.test.js.map +1 -0
  32. package/dist/__tests__/environment-variable/environment-variable-update.e2e.test.d.ts +1 -0
  33. package/dist/__tests__/environment-variable/environment-variable-update.e2e.test.js +347 -0
  34. package/dist/__tests__/environment-variable/environment-variable-update.e2e.test.js.map +1 -0
  35. package/dist/__tests__/environment-variable/environment-variable-validation.test.d.ts +1 -0
  36. package/dist/__tests__/environment-variable/environment-variable-validation.test.js +20 -0
  37. package/dist/__tests__/environment-variable/environment-variable-validation.test.js.map +1 -0
  38. package/dist/__tests__/fixtures/demo-project/index.js +1 -1
  39. package/dist/__tests__/fixtures/demo-project/index.js.map +1 -1
  40. package/dist/__tests__/git-flags.e2e.test.d.ts +1 -0
  41. package/dist/__tests__/git-flags.e2e.test.js +129 -0
  42. package/dist/__tests__/git-flags.e2e.test.js.map +1 -0
  43. package/dist/__tests__/git.e2e.test.js +67 -21
  44. package/dist/__tests__/git.e2e.test.js.map +1 -1
  45. package/dist/__tests__/link.e2e.test.d.ts +1 -0
  46. package/dist/__tests__/link.e2e.test.js +284 -0
  47. package/dist/__tests__/link.e2e.test.js.map +1 -0
  48. package/dist/__tests__/logs.e2e.test.d.ts +1 -0
  49. package/dist/__tests__/logs.e2e.test.js +231 -0
  50. package/dist/__tests__/logs.e2e.test.js.map +1 -0
  51. package/dist/__tests__/mock-server.d.ts +23 -0
  52. package/dist/__tests__/mock-server.js +377 -21
  53. package/dist/__tests__/mock-server.js.map +1 -1
  54. package/dist/__tests__/publish.e2e.test.d.ts +1 -0
  55. package/dist/__tests__/publish.e2e.test.js +510 -0
  56. package/dist/__tests__/publish.e2e.test.js.map +1 -0
  57. package/dist/__tests__/tunnel.e2e.test.d.ts +1 -0
  58. package/dist/__tests__/tunnel.e2e.test.js +66 -0
  59. package/dist/__tests__/tunnel.e2e.test.js.map +1 -0
  60. package/dist/__tests__/utils.d.ts +23 -5
  61. package/dist/__tests__/utils.js +138 -21
  62. package/dist/__tests__/utils.js.map +1 -1
  63. package/dist/api.d.ts +1 -2
  64. package/dist/api.js +13 -10
  65. package/dist/api.js.map +1 -1
  66. package/dist/commands/audit.d.ts +14 -0
  67. package/dist/commands/audit.js +49 -0
  68. package/dist/commands/audit.js.map +1 -0
  69. package/dist/commands/deploy.d.ts +8 -2
  70. package/dist/commands/deploy.js +64 -29
  71. package/dist/commands/deploy.js.map +1 -1
  72. package/dist/commands/deployment/inspect.d.ts +11 -0
  73. package/dist/commands/deployment/inspect.js +91 -0
  74. package/dist/commands/deployment/inspect.js.map +1 -0
  75. package/dist/commands/deployment/list.d.ts +11 -0
  76. package/dist/commands/deployment/list.js +97 -0
  77. package/dist/commands/deployment/list.js.map +1 -0
  78. package/dist/commands/deployment/logs.d.ts +12 -0
  79. package/dist/commands/deployment/logs.js +50 -0
  80. package/dist/commands/deployment/logs.js.map +1 -0
  81. package/dist/commands/environment-variable/add.d.ts +14 -0
  82. package/dist/commands/environment-variable/add.js +47 -0
  83. package/dist/commands/environment-variable/add.js.map +1 -0
  84. package/dist/commands/environment-variable/list.d.ts +9 -0
  85. package/dist/commands/environment-variable/list.js +45 -0
  86. package/dist/commands/environment-variable/list.js.map +1 -0
  87. package/dist/commands/environment-variable/remove.d.ts +11 -0
  88. package/dist/commands/environment-variable/remove.js +33 -0
  89. package/dist/commands/environment-variable/remove.js.map +1 -0
  90. package/dist/commands/environment-variable/update.d.ts +13 -0
  91. package/dist/commands/environment-variable/update.js +41 -0
  92. package/dist/commands/environment-variable/update.js.map +1 -0
  93. package/dist/commands/git/connect.d.ts +3 -2
  94. package/dist/commands/git/connect.js +29 -34
  95. package/dist/commands/git/connect.js.map +1 -1
  96. package/dist/commands/git/disconnect.d.ts +2 -2
  97. package/dist/commands/git/disconnect.js +20 -30
  98. package/dist/commands/git/disconnect.js.map +1 -1
  99. package/dist/commands/git.js +3 -3
  100. package/dist/commands/git.js.map +1 -1
  101. package/dist/commands/link.d.ts +17 -0
  102. package/dist/commands/link.js +101 -0
  103. package/dist/commands/link.js.map +1 -0
  104. package/dist/commands/login.d.ts +6 -0
  105. package/dist/commands/login.js +21 -0
  106. package/dist/commands/login.js.map +1 -0
  107. package/dist/commands/logout.d.ts +6 -0
  108. package/dist/commands/logout.js +20 -0
  109. package/dist/commands/logout.js.map +1 -0
  110. package/dist/commands/logs.d.ts +16 -0
  111. package/dist/commands/logs.js +96 -0
  112. package/dist/commands/logs.js.map +1 -0
  113. package/dist/commands/publish.d.ts +15 -0
  114. package/dist/commands/publish.js +51 -0
  115. package/dist/commands/publish.js.map +1 -0
  116. package/dist/commands/tunnel.d.ts +10 -0
  117. package/dist/commands/tunnel.js +132 -0
  118. package/dist/commands/tunnel.js.map +1 -0
  119. package/dist/commands/whoami.d.ts +6 -0
  120. package/dist/commands/whoami.js +13 -0
  121. package/dist/commands/whoami.js.map +1 -0
  122. package/dist/env.d.ts +4 -0
  123. package/dist/env.js +10 -0
  124. package/dist/env.js.map +1 -0
  125. package/dist/lib/alpic-command.d.ts +2 -0
  126. package/dist/lib/alpic-command.js +12 -7
  127. package/dist/lib/alpic-command.js.map +1 -1
  128. package/dist/lib/archive.d.ts +3 -3
  129. package/dist/lib/archive.js +21 -19
  130. package/dist/lib/archive.js.map +1 -1
  131. package/dist/lib/audit.d.ts +16 -0
  132. package/dist/lib/audit.js +245 -0
  133. package/dist/lib/audit.js.map +1 -0
  134. package/dist/lib/auth/auth.d.ts +5 -0
  135. package/dist/lib/auth/auth.js +44 -0
  136. package/dist/lib/auth/auth.js.map +1 -0
  137. package/dist/lib/auth/oauth/client.d.ts +28 -0
  138. package/dist/lib/auth/oauth/client.js +110 -0
  139. package/dist/lib/auth/oauth/client.js.map +1 -0
  140. package/dist/lib/auth/oauth/constants.d.ts +2 -0
  141. package/dist/lib/auth/oauth/constants.js +3 -0
  142. package/dist/lib/auth/oauth/constants.js.map +1 -0
  143. package/dist/lib/auth/oauth/server/assets/alpic-mountain.png +0 -0
  144. package/dist/lib/auth/oauth/server/assets/authorize.html +195 -0
  145. package/dist/lib/auth/oauth/server/assets/callback.html +88 -0
  146. package/dist/lib/auth/oauth/server/index.d.ts +9 -0
  147. package/dist/lib/auth/oauth/server/index.js +128 -0
  148. package/dist/lib/auth/oauth/server/index.js.map +1 -0
  149. package/dist/lib/auth/whoami.d.ts +1 -0
  150. package/dist/lib/auth/whoami.js +45 -0
  151. package/dist/lib/auth/whoami.js.map +1 -0
  152. package/dist/lib/base-workflow.d.ts +10 -0
  153. package/dist/lib/base-workflow.js +22 -0
  154. package/dist/lib/base-workflow.js.map +1 -0
  155. package/dist/lib/config.d.ts +3 -2
  156. package/dist/lib/config.js +8 -7
  157. package/dist/lib/config.js.map +1 -1
  158. package/dist/lib/deployment.d.ts +71 -4
  159. package/dist/lib/deployment.js +122 -9
  160. package/dist/lib/deployment.js.map +1 -1
  161. package/dist/lib/environment-variable.d.ts +37 -0
  162. package/dist/lib/environment-variable.js +299 -0
  163. package/dist/lib/environment-variable.js.map +1 -0
  164. package/dist/lib/git.d.ts +12 -4
  165. package/dist/lib/git.js +52 -27
  166. package/dist/lib/git.js.map +1 -1
  167. package/dist/lib/global-store.d.ts +28 -0
  168. package/dist/lib/global-store.js +76 -0
  169. package/dist/lib/global-store.js.map +1 -0
  170. package/dist/lib/link.d.ts +83 -0
  171. package/dist/lib/link.js +387 -0
  172. package/dist/lib/link.js.map +1 -0
  173. package/dist/lib/logs.d.ts +20 -0
  174. package/dist/lib/logs.js +87 -0
  175. package/dist/lib/logs.js.map +1 -0
  176. package/dist/lib/publish.d.ts +22 -0
  177. package/dist/lib/publish.js +185 -0
  178. package/dist/lib/publish.js.map +1 -0
  179. package/dist/lib/resolve.d.ts +6 -0
  180. package/dist/lib/resolve.js +26 -0
  181. package/dist/lib/resolve.js.map +1 -0
  182. package/dist/lib/table.d.ts +8 -0
  183. package/dist/lib/table.js +27 -0
  184. package/dist/lib/table.js.map +1 -0
  185. package/dist/lib/telemetry.js +7 -7
  186. package/dist/lib/telemetry.js.map +1 -1
  187. package/dist/lib/utils.d.ts +5 -0
  188. package/dist/lib/utils.js +53 -0
  189. package/dist/lib/utils.js.map +1 -0
  190. package/dist/lib/utils.test.d.ts +1 -0
  191. package/dist/lib/utils.test.js +27 -0
  192. package/dist/lib/utils.test.js.map +1 -0
  193. package/dist/types.d.ts +1 -0
  194. package/package.json +35 -21
  195. package/dist/lib/auth.d.ts +0 -1
  196. package/dist/lib/auth.js +0 -10
  197. package/dist/lib/auth.js.map +0 -1
  198. package/dist/lib/global-config.d.ts +0 -9
  199. package/dist/lib/global-config.js +0 -48
  200. package/dist/lib/global-config.js.map +0 -1
  201. package/dist/lib/project.d.ts +0 -67
  202. package/dist/lib/project.js +0 -285
  203. package/dist/lib/project.js.map +0 -1
@@ -0,0 +1,264 @@
1
+ import { rmSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
4
+ import { MockApiServer } from "../mock-server.js";
5
+ import { buildMockProject, cliSession, createConfigFile, expectSuccessfulApiCall, setupTestDirectory, } from "../utils.js";
6
+ describe("alpic environment-variable add (E2E)", () => {
7
+ let mockServer;
8
+ let serverUrl;
9
+ let cwd;
10
+ let binPath;
11
+ const projectId = "test-project-id";
12
+ const teamId = "mock-team-id";
13
+ const environmentId = "test-env-id";
14
+ const environmentName = "production";
15
+ beforeAll(async () => {
16
+ mockServer = new MockApiServer();
17
+ serverUrl = await mockServer.start();
18
+ });
19
+ afterAll(async () => {
20
+ await mockServer.stop();
21
+ });
22
+ beforeEach(async () => {
23
+ mockServer.reset();
24
+ const setup = await setupTestDirectory();
25
+ cwd = setup.cwd;
26
+ binPath = setup.binPath;
27
+ mockServer.addProject(buildMockProject({
28
+ projectId,
29
+ teamId,
30
+ projectName: "test-project",
31
+ environmentId,
32
+ environmentName,
33
+ }));
34
+ });
35
+ afterEach(() => {
36
+ if (cwd) {
37
+ rmSync(cwd, { recursive: true, force: true });
38
+ }
39
+ });
40
+ it("adds a single variable in non-interactive mode", async () => {
41
+ const { exitCode, output } = await cliSession(process.execPath, [
42
+ binPath,
43
+ "environment-variable",
44
+ "add",
45
+ "--environment-id",
46
+ environmentId,
47
+ "--key",
48
+ "DATABASE_URL",
49
+ "--value",
50
+ "postgres://localhost/db",
51
+ "--non-interactive",
52
+ ], {
53
+ cwd,
54
+ env: {
55
+ ALPIC_API_BASE_URL: serverUrl,
56
+ ALPIC_API_KEY: "test-api-key",
57
+ },
58
+ }, async (cli) => {
59
+ await cli.expect("Successfully added 1 environment variable.");
60
+ });
61
+ expect(exitCode).toBe(0);
62
+ expect(output).toContain("Successfully added 1 environment variable.");
63
+ const call = mockServer.getLastCall("POST", `/v1/environments/${environmentId}/environment-variables`);
64
+ expectSuccessfulApiCall(call);
65
+ expect(call?.input).toMatchObject({
66
+ environmentVariables: [
67
+ {
68
+ key: "DATABASE_URL",
69
+ value: "postgres://localhost/db",
70
+ isSecret: true,
71
+ },
72
+ ],
73
+ });
74
+ });
75
+ it("adds a non-secret variable with --no-secret", async () => {
76
+ const { exitCode } = await cliSession(process.execPath, [
77
+ binPath,
78
+ "environment-variable",
79
+ "add",
80
+ "--environment-id",
81
+ environmentId,
82
+ "--key",
83
+ "PORT",
84
+ "--value",
85
+ "3000",
86
+ "--no-secret",
87
+ "--non-interactive",
88
+ ], {
89
+ cwd,
90
+ env: {
91
+ ALPIC_API_BASE_URL: serverUrl,
92
+ ALPIC_API_KEY: "test-api-key",
93
+ },
94
+ }, async (cli) => {
95
+ await cli.expect("Successfully added 1 environment variable.");
96
+ });
97
+ expect(exitCode).toBe(0);
98
+ const call = mockServer.getLastCall("POST", `/v1/environments/${environmentId}/environment-variables`);
99
+ expectSuccessfulApiCall(call);
100
+ expect(call?.input).toMatchObject({
101
+ environmentVariables: [{ key: "PORT", value: "3000", isSecret: false }],
102
+ });
103
+ });
104
+ it("adds multiple variables from a .env file", async () => {
105
+ const envFilePath = join(cwd, ".env");
106
+ writeFileSync(envFilePath, "DATABASE_URL=postgres://localhost/db\nAPI_KEY=supersecret\nPORT=3000\n");
107
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "environment-variable", "add", "--environment-id", environmentId, "--env-file", envFilePath], {
108
+ cwd,
109
+ env: {
110
+ ALPIC_API_BASE_URL: serverUrl,
111
+ ALPIC_API_KEY: "test-api-key",
112
+ },
113
+ }, async (cli) => {
114
+ await cli.expect("Successfully added 3 environment variables.");
115
+ });
116
+ expect(exitCode).toBe(0);
117
+ expect(output).toContain("Successfully added 3 environment variables.");
118
+ const call = mockServer.getLastCall("POST", `/v1/environments/${environmentId}/environment-variables`);
119
+ expectSuccessfulApiCall(call);
120
+ expect(call?.input).toMatchObject({
121
+ environmentVariables: [
122
+ {
123
+ key: "DATABASE_URL",
124
+ value: "postgres://localhost/db",
125
+ isSecret: true,
126
+ },
127
+ { key: "API_KEY", value: "supersecret", isSecret: true },
128
+ { key: "PORT", value: "3000", isSecret: true },
129
+ ],
130
+ });
131
+ });
132
+ it("adds variables from a .env file with --no-secret", async () => {
133
+ const envFilePath = join(cwd, ".env");
134
+ writeFileSync(envFilePath, "PORT=3000\n");
135
+ const { exitCode } = await cliSession(process.execPath, [
136
+ binPath,
137
+ "environment-variable",
138
+ "add",
139
+ "--environment-id",
140
+ environmentId,
141
+ "--env-file",
142
+ envFilePath,
143
+ "--no-secret",
144
+ ], {
145
+ cwd,
146
+ env: {
147
+ ALPIC_API_BASE_URL: serverUrl,
148
+ ALPIC_API_KEY: "test-api-key",
149
+ },
150
+ }, async (cli) => {
151
+ await cli.expect("Successfully added 1 environment variable.");
152
+ });
153
+ expect(exitCode).toBe(0);
154
+ const call = mockServer.getLastCall("POST", `/v1/environments/${environmentId}/environment-variables`);
155
+ expectSuccessfulApiCall(call);
156
+ expect(call?.input).toMatchObject({
157
+ environmentVariables: [{ key: "PORT", value: "3000", isSecret: false }],
158
+ });
159
+ });
160
+ it("uses environment-id from config file", async () => {
161
+ createConfigFile(cwd, projectId, teamId, "test-project", environmentId, environmentName);
162
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "environment-variable", "add", "--key", "FOO", "--value", "bar", "--non-interactive"], {
163
+ cwd,
164
+ env: {
165
+ ALPIC_API_BASE_URL: serverUrl,
166
+ ALPIC_API_KEY: "test-api-key",
167
+ },
168
+ }, async (cli) => {
169
+ await cli.expect("Successfully added 1 environment variable.");
170
+ });
171
+ expect(exitCode).toBe(0);
172
+ expect(output).toContain(`Using environment id from .alpic config: ${environmentId}`);
173
+ });
174
+ it("errors when --env-file and --key are both provided", async () => {
175
+ const envFilePath = join(cwd, ".env");
176
+ writeFileSync(envFilePath, "FOO=bar\n");
177
+ const { exitCode, output } = await cliSession(process.execPath, [
178
+ binPath,
179
+ "environment-variable",
180
+ "add",
181
+ "--environment-id",
182
+ environmentId,
183
+ "--env-file",
184
+ envFilePath,
185
+ "--key",
186
+ "FOO",
187
+ "--non-interactive",
188
+ ], {
189
+ cwd,
190
+ env: {
191
+ ALPIC_API_BASE_URL: serverUrl,
192
+ ALPIC_API_KEY: "test-api-key",
193
+ },
194
+ });
195
+ expect(exitCode).toBe(1);
196
+ expect(output).toContain("--env-file cannot be used together with --key or --value.");
197
+ });
198
+ it("errors when --value is empty in non-interactive mode", async () => {
199
+ const { exitCode, output } = await cliSession(process.execPath, [
200
+ binPath,
201
+ "environment-variable",
202
+ "add",
203
+ "--environment-id",
204
+ environmentId,
205
+ "--key",
206
+ "FOO",
207
+ "--value",
208
+ "",
209
+ "--non-interactive",
210
+ ], {
211
+ cwd,
212
+ env: {
213
+ ALPIC_API_BASE_URL: serverUrl,
214
+ ALPIC_API_KEY: "test-api-key",
215
+ },
216
+ });
217
+ expect(exitCode).toBe(1);
218
+ expect(output).toContain("Value cannot be empty.");
219
+ });
220
+ it("errors when --key and --value are missing in non-interactive mode", async () => {
221
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "environment-variable", "add", "--environment-id", environmentId, "--non-interactive"], {
222
+ cwd,
223
+ env: {
224
+ ALPIC_API_BASE_URL: serverUrl,
225
+ ALPIC_API_KEY: "test-api-key",
226
+ },
227
+ });
228
+ expect(exitCode).toBe(1);
229
+ expect(output).toContain("--key and --value are required in non-interactive mode.");
230
+ });
231
+ it("exits with error when not authenticated", async () => {
232
+ const { exitCode, output } = await cliSession(process.execPath, [
233
+ binPath,
234
+ "environment-variable",
235
+ "add",
236
+ "--environment-id",
237
+ environmentId,
238
+ "--key",
239
+ "FOO",
240
+ "--value",
241
+ "bar",
242
+ "--non-interactive",
243
+ ], {
244
+ cwd,
245
+ env: {
246
+ ALPIC_API_BASE_URL: serverUrl,
247
+ },
248
+ });
249
+ expect(exitCode).toBe(1);
250
+ expect(output).toContain("Not authenticated. Run `alpic login` or set ALPIC_API_KEY. Get an API key from Team settings in the Alpic dashboard.");
251
+ });
252
+ it("exits with error when no environment-id is provided and no config file exists", async () => {
253
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "environment-variable", "add", "--key", "FOO", "--value", "bar", "--non-interactive"], {
254
+ cwd,
255
+ env: {
256
+ ALPIC_API_BASE_URL: serverUrl,
257
+ ALPIC_API_KEY: "test-api-key",
258
+ },
259
+ });
260
+ expect(exitCode).toBe(1);
261
+ expect(output).toContain("No environment specified");
262
+ });
263
+ });
264
+ //# sourceMappingURL=environment-variable-add.e2e.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment-variable-add.e2e.test.js","sourceRoot":"","sources":["../../../src/__tests__/environment-variable/environment-variable-add.e2e.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,144 @@
1
+ import { rmSync } from "node:fs";
2
+ import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
3
+ import { MockApiServer } from "../mock-server.js";
4
+ import { buildMockProject, cliSession, createConfigFile, expectSuccessfulApiCall, setupTestDirectory, } from "../utils.js";
5
+ describe("alpic environment-variable list (E2E)", () => {
6
+ let mockServer;
7
+ let serverUrl;
8
+ let cwd;
9
+ let binPath;
10
+ const projectId = "test-project-id";
11
+ const teamId = "mock-team-id";
12
+ const environmentId = "test-env-id";
13
+ const environmentName = "production";
14
+ beforeAll(async () => {
15
+ mockServer = new MockApiServer();
16
+ serverUrl = await mockServer.start();
17
+ });
18
+ afterAll(async () => {
19
+ await mockServer.stop();
20
+ });
21
+ beforeEach(async () => {
22
+ mockServer.reset();
23
+ const setup = await setupTestDirectory();
24
+ cwd = setup.cwd;
25
+ binPath = setup.binPath;
26
+ mockServer.addProject(buildMockProject({
27
+ projectId,
28
+ teamId,
29
+ projectName: "test-project",
30
+ environmentId,
31
+ environmentName,
32
+ }));
33
+ });
34
+ afterEach(() => {
35
+ if (cwd) {
36
+ rmSync(cwd, { recursive: true, force: true });
37
+ }
38
+ });
39
+ it("shows 'no environment variables' message when list is empty", async () => {
40
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "environment-variable", "list", "--environment-id", environmentId], {
41
+ cwd,
42
+ env: {
43
+ ALPIC_API_BASE_URL: serverUrl,
44
+ ALPIC_API_KEY: "test-api-key",
45
+ },
46
+ }, async (cli) => {
47
+ await cli.expect("No environment variables defined.");
48
+ });
49
+ expect(exitCode).toBe(0);
50
+ expect(output).toContain("Found 0 environment variables");
51
+ expect(output).toContain("No environment variables defined.");
52
+ const listCall = mockServer.getLastCall("GET", `/v1/environments/${environmentId}/environment-variables`);
53
+ expectSuccessfulApiCall(listCall);
54
+ });
55
+ it("shows a nicely formatted table with environment variables", async () => {
56
+ const oneHourAgo = new Date(Date.now() - 1 * 60 * 60 * 1000);
57
+ mockServer.addEnvironmentVariables(environmentId, [
58
+ {
59
+ id: "var-1",
60
+ key: "DATABASE_URL",
61
+ value: "postgres://localhost/db",
62
+ isSecret: false,
63
+ createdAt: oneHourAgo,
64
+ },
65
+ {
66
+ id: "var-2",
67
+ key: "API_KEY",
68
+ value: "supersecret",
69
+ isSecret: true,
70
+ createdAt: oneHourAgo,
71
+ },
72
+ {
73
+ id: "var-3",
74
+ key: "PORT",
75
+ value: "3000",
76
+ isSecret: false,
77
+ createdAt: oneHourAgo,
78
+ },
79
+ ]);
80
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "environment-variable", "list", "--environment-id", environmentId], {
81
+ cwd,
82
+ env: {
83
+ ALPIC_API_BASE_URL: serverUrl,
84
+ ALPIC_API_KEY: "test-api-key",
85
+ },
86
+ }, async (cli) => {
87
+ await cli.expect("Found 3 environment variables");
88
+ });
89
+ expect(exitCode).toBe(0);
90
+ const normalizedOutput = output.replace(/^.*Fetching environment variables\.\.\.\r?\n?/gm, "");
91
+ expect(normalizedOutput).toMatchSnapshot();
92
+ expect(output).not.toContain("supersecret");
93
+ });
94
+ it("shows info message when environment-id is taken from config file", async () => {
95
+ createConfigFile(cwd, projectId, teamId, "test-project", environmentId, environmentName);
96
+ const { exitCode } = await cliSession(process.execPath, [binPath, "environment-variable", "list"], {
97
+ cwd,
98
+ env: {
99
+ ALPIC_API_BASE_URL: serverUrl,
100
+ ALPIC_API_KEY: "test-api-key",
101
+ },
102
+ }, async (cli) => {
103
+ await cli.expect(`Using environment id from .alpic config: ${environmentId}`);
104
+ await cli.expect("Found 0 environment variables");
105
+ });
106
+ expect(exitCode).toBe(0);
107
+ });
108
+ it("does not show info message when environment-id is provided via flag", async () => {
109
+ createConfigFile(cwd, projectId, teamId, "test-project", environmentId, environmentName);
110
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "environment-variable", "list", "--environment-id", environmentId], {
111
+ cwd,
112
+ env: {
113
+ ALPIC_API_BASE_URL: serverUrl,
114
+ ALPIC_API_KEY: "test-api-key",
115
+ },
116
+ }, async (cli) => {
117
+ await cli.expect("Found 0 environment variables");
118
+ });
119
+ expect(exitCode).toBe(0);
120
+ expect(output).not.toContain("Using environment id from .alpic config");
121
+ });
122
+ it("exits with error when not authenticated", async () => {
123
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "environment-variable", "list", "--environment-id", environmentId], {
124
+ cwd,
125
+ env: {
126
+ ALPIC_API_BASE_URL: serverUrl,
127
+ },
128
+ });
129
+ expect(exitCode).toBe(1);
130
+ expect(output).toContain("Not authenticated. Run `alpic login` or set ALPIC_API_KEY. Get an API key from Team settings in the Alpic dashboard.");
131
+ });
132
+ it("exits with error when no environment-id is provided and no config file exists", async () => {
133
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "environment-variable", "list"], {
134
+ cwd,
135
+ env: {
136
+ ALPIC_API_BASE_URL: serverUrl,
137
+ ALPIC_API_KEY: "test-api-key",
138
+ },
139
+ });
140
+ expect(exitCode).toBe(1);
141
+ expect(output).toContain("No environment specified");
142
+ });
143
+ });
144
+ //# sourceMappingURL=environment-variable-list.e2e.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment-variable-list.e2e.test.js","sourceRoot":"","sources":["../../../src/__tests__/environment-variable/environment-variable-list.e2e.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,155 @@
1
+ import { rmSync } from "node:fs";
2
+ import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
3
+ import { MockApiServer } from "../mock-server.js";
4
+ import { buildMockProject, cliSession, createConfigFile, expectSuccessfulApiCall, setupTestDirectory, } from "../utils.js";
5
+ describe("alpic environment-variable remove (E2E)", () => {
6
+ let mockServer;
7
+ let serverUrl;
8
+ let cwd;
9
+ let binPath;
10
+ const projectId = "test-project-id";
11
+ const teamId = "mock-team-id";
12
+ const environmentId = "test-env-id";
13
+ const environmentName = "production";
14
+ beforeAll(async () => {
15
+ mockServer = new MockApiServer();
16
+ serverUrl = await mockServer.start();
17
+ });
18
+ afterAll(async () => {
19
+ await mockServer.stop();
20
+ });
21
+ beforeEach(async () => {
22
+ mockServer.reset();
23
+ const setup = await setupTestDirectory();
24
+ cwd = setup.cwd;
25
+ binPath = setup.binPath;
26
+ mockServer.addProject(buildMockProject({
27
+ projectId,
28
+ teamId,
29
+ projectName: "test-project",
30
+ environmentId,
31
+ environmentName,
32
+ }));
33
+ mockServer.addEnvironmentVariables(environmentId, [
34
+ {
35
+ id: "var-1",
36
+ key: "DATABASE_URL",
37
+ value: "postgres://localhost/db",
38
+ isSecret: false,
39
+ createdAt: new Date(),
40
+ },
41
+ {
42
+ id: "var-2",
43
+ key: "API_KEY",
44
+ value: "supersecret",
45
+ isSecret: true,
46
+ createdAt: new Date(),
47
+ },
48
+ ]);
49
+ });
50
+ afterEach(() => {
51
+ if (cwd) {
52
+ rmSync(cwd, { recursive: true, force: true });
53
+ }
54
+ });
55
+ it("removes a variable in non-interactive mode", async () => {
56
+ const { exitCode, output } = await cliSession(process.execPath, [
57
+ binPath,
58
+ "environment-variable",
59
+ "remove",
60
+ "--environment-id",
61
+ environmentId,
62
+ "--key",
63
+ "DATABASE_URL",
64
+ "--non-interactive",
65
+ ], {
66
+ cwd,
67
+ env: {
68
+ ALPIC_API_BASE_URL: serverUrl,
69
+ ALPIC_API_KEY: "test-api-key",
70
+ },
71
+ }, async (cli) => {
72
+ await cli.expect("Successfully removed DATABASE_URL.");
73
+ });
74
+ expect(exitCode).toBe(0);
75
+ expect(output).toContain("Successfully removed DATABASE_URL.");
76
+ const call = mockServer.getLastCall("DELETE", "/v1/environment-variables/var-1");
77
+ expectSuccessfulApiCall(call);
78
+ });
79
+ it("uses environment-id from config file", async () => {
80
+ createConfigFile(cwd, projectId, teamId, "test-project", environmentId, environmentName);
81
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "environment-variable", "remove", "--key", "DATABASE_URL", "--non-interactive"], {
82
+ cwd,
83
+ env: {
84
+ ALPIC_API_BASE_URL: serverUrl,
85
+ ALPIC_API_KEY: "test-api-key",
86
+ },
87
+ }, async (cli) => {
88
+ await cli.expect("Successfully removed DATABASE_URL.");
89
+ });
90
+ expect(exitCode).toBe(0);
91
+ expect(output).toContain(`Using environment id from .alpic config: ${environmentId}`);
92
+ });
93
+ it("errors when key does not exist", async () => {
94
+ const { exitCode, output } = await cliSession(process.execPath, [
95
+ binPath,
96
+ "environment-variable",
97
+ "remove",
98
+ "--environment-id",
99
+ environmentId,
100
+ "--key",
101
+ "NONEXISTENT",
102
+ "--non-interactive",
103
+ ], {
104
+ cwd,
105
+ env: {
106
+ ALPIC_API_BASE_URL: serverUrl,
107
+ ALPIC_API_KEY: "test-api-key",
108
+ },
109
+ });
110
+ expect(exitCode).toBe(1);
111
+ expect(output).toContain('Environment variable "NONEXISTENT" not found.');
112
+ });
113
+ it("errors when --key is missing in non-interactive mode", async () => {
114
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "environment-variable", "remove", "--environment-id", environmentId, "--non-interactive"], {
115
+ cwd,
116
+ env: {
117
+ ALPIC_API_BASE_URL: serverUrl,
118
+ ALPIC_API_KEY: "test-api-key",
119
+ },
120
+ });
121
+ expect(exitCode).toBe(1);
122
+ expect(output).toContain("--key is required in non-interactive mode.");
123
+ });
124
+ it("exits with error when not authenticated", async () => {
125
+ const { exitCode, output } = await cliSession(process.execPath, [
126
+ binPath,
127
+ "environment-variable",
128
+ "remove",
129
+ "--environment-id",
130
+ environmentId,
131
+ "--key",
132
+ "DATABASE_URL",
133
+ "--non-interactive",
134
+ ], {
135
+ cwd,
136
+ env: {
137
+ ALPIC_API_BASE_URL: serverUrl,
138
+ },
139
+ });
140
+ expect(exitCode).toBe(1);
141
+ expect(output).toContain("Not authenticated. Run `alpic login` or set ALPIC_API_KEY. Get an API key from Team settings in the Alpic dashboard.");
142
+ });
143
+ it("exits with error when no environment-id is provided and no config file exists", async () => {
144
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "environment-variable", "remove", "--key", "DATABASE_URL", "--non-interactive"], {
145
+ cwd,
146
+ env: {
147
+ ALPIC_API_BASE_URL: serverUrl,
148
+ ALPIC_API_KEY: "test-api-key",
149
+ },
150
+ });
151
+ expect(exitCode).toBe(1);
152
+ expect(output).toContain("No environment specified");
153
+ });
154
+ });
155
+ //# sourceMappingURL=environment-variable-remove.e2e.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment-variable-remove.e2e.test.js","sourceRoot":"","sources":["../../../src/__tests__/environment-variable/environment-variable-remove.e2e.test.ts"],"names":[],"mappings":"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"}