alpic 0.0.0-staging.2b7ec8b → 0.0.0-staging.2ba052d

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 (265) hide show
  1. package/README.md +40 -0
  2. package/bin/run.js +5 -0
  3. package/dist/__tests__/alpic-command.test.d.ts +1 -0
  4. package/dist/__tests__/alpic-command.test.js +41 -0
  5. package/dist/__tests__/alpic-command.test.js.map +1 -0
  6. package/dist/__tests__/audit.e2e.test.d.ts +1 -0
  7. package/dist/__tests__/audit.e2e.test.js +561 -0
  8. package/dist/__tests__/audit.e2e.test.js.map +1 -0
  9. package/dist/__tests__/auth.e2e.test.js +33 -15
  10. package/dist/__tests__/auth.e2e.test.js.map +1 -1
  11. package/dist/__tests__/deploy-flags.e2e.test.js +153 -12
  12. package/dist/__tests__/deploy-flags.e2e.test.js.map +1 -1
  13. package/dist/__tests__/deploy.e2e.test.js +33 -17
  14. package/dist/__tests__/deploy.e2e.test.js.map +1 -1
  15. package/dist/__tests__/deployment-inspect.e2e.test.d.ts +1 -0
  16. package/dist/__tests__/deployment-inspect.e2e.test.js +119 -0
  17. package/dist/__tests__/deployment-inspect.e2e.test.js.map +1 -0
  18. package/dist/__tests__/deployment-list.e2e.test.d.ts +1 -0
  19. package/dist/__tests__/deployment-list.e2e.test.js +121 -0
  20. package/dist/__tests__/deployment-list.e2e.test.js.map +1 -0
  21. package/dist/__tests__/deployment-logs.e2e.test.d.ts +1 -0
  22. package/dist/__tests__/deployment-logs.e2e.test.js +262 -0
  23. package/dist/__tests__/deployment-logs.e2e.test.js.map +1 -0
  24. package/dist/__tests__/environment-inspect.e2e.test.d.ts +1 -0
  25. package/dist/__tests__/environment-inspect.e2e.test.js +78 -0
  26. package/dist/__tests__/environment-inspect.e2e.test.js.map +1 -0
  27. package/dist/__tests__/environment-list.e2e.test.d.ts +1 -0
  28. package/dist/__tests__/environment-list.e2e.test.js +63 -0
  29. package/dist/__tests__/environment-list.e2e.test.js.map +1 -0
  30. package/dist/__tests__/environment-variable/environment-variable-add.e2e.test.d.ts +1 -0
  31. package/dist/__tests__/environment-variable/environment-variable-add.e2e.test.js +277 -0
  32. package/dist/__tests__/environment-variable/environment-variable-add.e2e.test.js.map +1 -0
  33. package/dist/__tests__/environment-variable/environment-variable-list.e2e.test.d.ts +1 -0
  34. package/dist/__tests__/environment-variable/environment-variable-list.e2e.test.js +146 -0
  35. package/dist/__tests__/environment-variable/environment-variable-list.e2e.test.js.map +1 -0
  36. package/dist/__tests__/environment-variable/environment-variable-remove.e2e.test.d.ts +1 -0
  37. package/dist/__tests__/environment-variable/environment-variable-remove.e2e.test.js +148 -0
  38. package/dist/__tests__/environment-variable/environment-variable-remove.e2e.test.js.map +1 -0
  39. package/dist/__tests__/environment-variable/environment-variable-update.e2e.test.d.ts +1 -0
  40. package/dist/__tests__/environment-variable/environment-variable-update.e2e.test.js +348 -0
  41. package/dist/__tests__/environment-variable/environment-variable-update.e2e.test.js.map +1 -0
  42. package/dist/__tests__/environment-variable/environment-variable-validation.test.d.ts +1 -0
  43. package/dist/__tests__/environment-variable/environment-variable-validation.test.js +20 -0
  44. package/dist/__tests__/environment-variable/environment-variable-validation.test.js.map +1 -0
  45. package/dist/__tests__/fixtures/demo-project/index.js +1 -1
  46. package/dist/__tests__/fixtures/demo-project/index.js.map +1 -1
  47. package/dist/__tests__/git-flags.e2e.test.js +20 -13
  48. package/dist/__tests__/git-flags.e2e.test.js.map +1 -1
  49. package/dist/__tests__/git.e2e.test.js +14 -9
  50. package/dist/__tests__/git.e2e.test.js.map +1 -1
  51. package/dist/__tests__/link.e2e.test.d.ts +1 -0
  52. package/dist/__tests__/link.e2e.test.js +282 -0
  53. package/dist/__tests__/link.e2e.test.js.map +1 -0
  54. package/dist/__tests__/logs.e2e.test.d.ts +1 -0
  55. package/dist/__tests__/logs.e2e.test.js +230 -0
  56. package/dist/__tests__/logs.e2e.test.js.map +1 -0
  57. package/dist/__tests__/mock-server.d.ts +25 -0
  58. package/dist/__tests__/mock-server.js +386 -23
  59. package/dist/__tests__/mock-server.js.map +1 -1
  60. package/dist/__tests__/playground/playground-configure.e2e.test.d.ts +1 -0
  61. package/dist/__tests__/playground/playground-configure.e2e.test.js +135 -0
  62. package/dist/__tests__/playground/playground-configure.e2e.test.js.map +1 -0
  63. package/dist/__tests__/playground/playground-enable-disable.e2e.test.d.ts +1 -0
  64. package/dist/__tests__/playground/playground-enable-disable.e2e.test.js +104 -0
  65. package/dist/__tests__/playground/playground-enable-disable.e2e.test.js.map +1 -0
  66. package/dist/__tests__/playground/playground-example-prompt.e2e.test.d.ts +1 -0
  67. package/dist/__tests__/playground/playground-example-prompt.e2e.test.js +282 -0
  68. package/dist/__tests__/playground/playground-example-prompt.e2e.test.js.map +1 -0
  69. package/dist/__tests__/playground/playground-headers.e2e.test.d.ts +1 -0
  70. package/dist/__tests__/playground/playground-headers.e2e.test.js +324 -0
  71. package/dist/__tests__/playground/playground-headers.e2e.test.js.map +1 -0
  72. package/dist/__tests__/playground/playground-status.e2e.test.d.ts +1 -0
  73. package/dist/__tests__/playground/playground-status.e2e.test.js +88 -0
  74. package/dist/__tests__/playground/playground-status.e2e.test.js.map +1 -0
  75. package/dist/__tests__/project-inspect.e2e.test.d.ts +1 -0
  76. package/dist/__tests__/project-inspect.e2e.test.js +83 -0
  77. package/dist/__tests__/project-inspect.e2e.test.js.map +1 -0
  78. package/dist/__tests__/project-list.e2e.test.d.ts +1 -0
  79. package/dist/__tests__/project-list.e2e.test.js +95 -0
  80. package/dist/__tests__/project-list.e2e.test.js.map +1 -0
  81. package/dist/__tests__/publish.e2e.test.d.ts +1 -0
  82. package/dist/__tests__/publish.e2e.test.js +575 -0
  83. package/dist/__tests__/publish.e2e.test.js.map +1 -0
  84. package/dist/__tests__/team-inspect.e2e.test.d.ts +1 -0
  85. package/dist/__tests__/team-inspect.e2e.test.js +86 -0
  86. package/dist/__tests__/team-inspect.e2e.test.js.map +1 -0
  87. package/dist/__tests__/team-list.e2e.test.d.ts +1 -0
  88. package/dist/__tests__/team-list.e2e.test.js +58 -0
  89. package/dist/__tests__/team-list.e2e.test.js.map +1 -0
  90. package/dist/__tests__/tunnel.e2e.test.d.ts +1 -0
  91. package/dist/__tests__/tunnel.e2e.test.js +66 -0
  92. package/dist/__tests__/tunnel.e2e.test.js.map +1 -0
  93. package/dist/__tests__/utils.d.ts +9 -3
  94. package/dist/__tests__/utils.js +73 -25
  95. package/dist/__tests__/utils.js.map +1 -1
  96. package/dist/api.d.ts +1 -1
  97. package/dist/api.js +10 -3
  98. package/dist/api.js.map +1 -1
  99. package/dist/commands/audit.d.ts +13 -0
  100. package/dist/commands/audit.js +45 -0
  101. package/dist/commands/audit.js.map +1 -0
  102. package/dist/commands/deploy.d.ts +3 -4
  103. package/dist/commands/deploy.js +52 -38
  104. package/dist/commands/deploy.js.map +1 -1
  105. package/dist/commands/deployment/inspect.d.ts +11 -0
  106. package/dist/commands/deployment/inspect.js +91 -0
  107. package/dist/commands/deployment/inspect.js.map +1 -0
  108. package/dist/commands/deployment/list.d.ts +11 -0
  109. package/dist/commands/deployment/list.js +97 -0
  110. package/dist/commands/deployment/list.js.map +1 -0
  111. package/dist/commands/deployment/logs.d.ts +12 -0
  112. package/dist/commands/deployment/logs.js +50 -0
  113. package/dist/commands/deployment/logs.js.map +1 -0
  114. package/dist/commands/environment/inspect.d.ts +10 -0
  115. package/dist/commands/environment/inspect.js +94 -0
  116. package/dist/commands/environment/inspect.js.map +1 -0
  117. package/dist/commands/environment/list.d.ts +10 -0
  118. package/dist/commands/environment/list.js +79 -0
  119. package/dist/commands/environment/list.js.map +1 -0
  120. package/dist/commands/environment-variable/add.d.ts +13 -0
  121. package/dist/commands/environment-variable/add.js +43 -0
  122. package/dist/commands/environment-variable/add.js.map +1 -0
  123. package/dist/commands/environment-variable/list.d.ts +9 -0
  124. package/dist/commands/environment-variable/list.js +45 -0
  125. package/dist/commands/environment-variable/list.js.map +1 -0
  126. package/dist/commands/environment-variable/remove.d.ts +10 -0
  127. package/dist/commands/environment-variable/remove.js +29 -0
  128. package/dist/commands/environment-variable/remove.js.map +1 -0
  129. package/dist/commands/environment-variable/update.d.ts +12 -0
  130. package/dist/commands/environment-variable/update.js +37 -0
  131. package/dist/commands/environment-variable/update.js.map +1 -0
  132. package/dist/commands/git/connect.d.ts +0 -4
  133. package/dist/commands/git/connect.js +16 -30
  134. package/dist/commands/git/connect.js.map +1 -1
  135. package/dist/commands/git/disconnect.d.ts +0 -6
  136. package/dist/commands/git/disconnect.js +11 -32
  137. package/dist/commands/git/disconnect.js.map +1 -1
  138. package/dist/commands/git.js +2 -2
  139. package/dist/commands/git.js.map +1 -1
  140. package/dist/commands/link.d.ts +16 -0
  141. package/dist/commands/link.js +97 -0
  142. package/dist/commands/link.js.map +1 -0
  143. package/dist/commands/login.js +6 -24
  144. package/dist/commands/login.js.map +1 -1
  145. package/dist/commands/logs.d.ts +16 -0
  146. package/dist/commands/logs.js +96 -0
  147. package/dist/commands/logs.js.map +1 -0
  148. package/dist/commands/playground/configure.d.ts +12 -0
  149. package/dist/commands/playground/configure.js +39 -0
  150. package/dist/commands/playground/configure.js.map +1 -0
  151. package/dist/commands/playground/disable.d.ts +9 -0
  152. package/dist/commands/playground/disable.js +24 -0
  153. package/dist/commands/playground/disable.js.map +1 -0
  154. package/dist/commands/playground/enable.d.ts +9 -0
  155. package/dist/commands/playground/enable.js +24 -0
  156. package/dist/commands/playground/enable.js.map +1 -0
  157. package/dist/commands/playground/example-prompt/add.d.ts +12 -0
  158. package/dist/commands/playground/example-prompt/add.js +39 -0
  159. package/dist/commands/playground/example-prompt/add.js.map +1 -0
  160. package/dist/commands/playground/example-prompt/list.d.ts +9 -0
  161. package/dist/commands/playground/example-prompt/list.js +24 -0
  162. package/dist/commands/playground/example-prompt/list.js.map +1 -0
  163. package/dist/commands/playground/example-prompt/remove.d.ts +11 -0
  164. package/dist/commands/playground/example-prompt/remove.js +34 -0
  165. package/dist/commands/playground/example-prompt/remove.js.map +1 -0
  166. package/dist/commands/playground/headers/add.d.ts +14 -0
  167. package/dist/commands/playground/headers/add.js +49 -0
  168. package/dist/commands/playground/headers/add.js.map +1 -0
  169. package/dist/commands/playground/headers/list.d.ts +9 -0
  170. package/dist/commands/playground/headers/list.js +24 -0
  171. package/dist/commands/playground/headers/list.js.map +1 -0
  172. package/dist/commands/playground/headers/remove.d.ts +11 -0
  173. package/dist/commands/playground/headers/remove.js +34 -0
  174. package/dist/commands/playground/headers/remove.js.map +1 -0
  175. package/dist/commands/playground/status.d.ts +9 -0
  176. package/dist/commands/playground/status.js +24 -0
  177. package/dist/commands/playground/status.js.map +1 -0
  178. package/dist/commands/project/inspect.d.ts +10 -0
  179. package/dist/commands/project/inspect.js +97 -0
  180. package/dist/commands/project/inspect.js.map +1 -0
  181. package/dist/commands/project/list.d.ts +10 -0
  182. package/dist/commands/project/list.js +50 -0
  183. package/dist/commands/project/list.js.map +1 -0
  184. package/dist/commands/publish.d.ts +14 -0
  185. package/dist/commands/publish.js +47 -0
  186. package/dist/commands/publish.js.map +1 -0
  187. package/dist/commands/team/inspect.d.ts +10 -0
  188. package/dist/commands/team/inspect.js +97 -0
  189. package/dist/commands/team/inspect.js.map +1 -0
  190. package/dist/commands/team/list.d.ts +9 -0
  191. package/dist/commands/team/list.js +40 -0
  192. package/dist/commands/team/list.js.map +1 -0
  193. package/dist/commands/tunnel.d.ts +10 -0
  194. package/dist/commands/tunnel.js +132 -0
  195. package/dist/commands/tunnel.js.map +1 -0
  196. package/dist/commands/whoami.js +2 -14
  197. package/dist/commands/whoami.js.map +1 -1
  198. package/dist/lib/alpic-command.d.ts +7 -2
  199. package/dist/lib/alpic-command.js +14 -6
  200. package/dist/lib/alpic-command.js.map +1 -1
  201. package/dist/lib/archive.d.ts +3 -3
  202. package/dist/lib/archive.js +21 -19
  203. package/dist/lib/archive.js.map +1 -1
  204. package/dist/lib/audit.d.ts +16 -0
  205. package/dist/lib/audit.js +258 -0
  206. package/dist/lib/audit.js.map +1 -0
  207. package/dist/lib/auth/auth.d.ts +3 -0
  208. package/dist/lib/auth/auth.js +26 -3
  209. package/dist/lib/auth/auth.js.map +1 -1
  210. package/dist/lib/auth/oauth/client.d.ts +1 -1
  211. package/dist/lib/auth/oauth/client.js +7 -1
  212. package/dist/lib/auth/oauth/client.js.map +1 -1
  213. package/dist/lib/auth/oauth/server/index.d.ts +2 -1
  214. package/dist/lib/auth/oauth/server/index.js +36 -10
  215. package/dist/lib/auth/oauth/server/index.js.map +1 -1
  216. package/dist/lib/auth/whoami.d.ts +1 -28
  217. package/dist/lib/auth/whoami.js +29 -19
  218. package/dist/lib/auth/whoami.js.map +1 -1
  219. package/dist/lib/base-workflow.d.ts +1 -1
  220. package/dist/lib/base-workflow.js +1 -1
  221. package/dist/lib/base-workflow.js.map +1 -1
  222. package/dist/lib/config.d.ts +3 -2
  223. package/dist/lib/config.js +8 -7
  224. package/dist/lib/config.js.map +1 -1
  225. package/dist/lib/deployment.d.ts +69 -2
  226. package/dist/lib/deployment.js +113 -16
  227. package/dist/lib/deployment.js.map +1 -1
  228. package/dist/lib/environment-variable.d.ts +37 -0
  229. package/dist/lib/environment-variable.js +305 -0
  230. package/dist/lib/environment-variable.js.map +1 -0
  231. package/dist/lib/git.d.ts +5 -5
  232. package/dist/lib/git.js +10 -13
  233. package/dist/lib/git.js.map +1 -1
  234. package/dist/lib/global-store.d.ts +1 -1
  235. package/dist/lib/global-store.js +4 -3
  236. package/dist/lib/global-store.js.map +1 -1
  237. package/dist/lib/{project.d.ts → link.d.ts} +31 -14
  238. package/dist/lib/{project.js → link.js} +186 -98
  239. package/dist/lib/link.js.map +1 -0
  240. package/dist/lib/logs.d.ts +20 -0
  241. package/dist/lib/logs.js +87 -0
  242. package/dist/lib/logs.js.map +1 -0
  243. package/dist/lib/playground.d.ts +53 -0
  244. package/dist/lib/playground.js +288 -0
  245. package/dist/lib/playground.js.map +1 -0
  246. package/dist/lib/publish.d.ts +22 -0
  247. package/dist/lib/publish.js +201 -0
  248. package/dist/lib/publish.js.map +1 -0
  249. package/dist/lib/resolve.d.ts +6 -0
  250. package/dist/lib/resolve.js +26 -0
  251. package/dist/lib/resolve.js.map +1 -0
  252. package/dist/lib/table.d.ts +8 -0
  253. package/dist/lib/table.js +27 -0
  254. package/dist/lib/table.js.map +1 -0
  255. package/dist/lib/telemetry.js +1 -1
  256. package/dist/lib/telemetry.js.map +1 -1
  257. package/dist/lib/utils.d.ts +6 -0
  258. package/dist/lib/utils.js +54 -0
  259. package/dist/lib/utils.js.map +1 -0
  260. package/dist/lib/utils.test.d.ts +1 -0
  261. package/dist/lib/utils.test.js +27 -0
  262. package/dist/lib/utils.test.js.map +1 -0
  263. package/dist/types.d.ts +1 -0
  264. package/package.json +28 -21
  265. package/dist/lib/project.js.map +0 -1
@@ -0,0 +1,63 @@
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, expectSuccessfulApiCall, setupTestDirectory } from "./utils.js";
5
+ describe("alpic environment list (E2E)", () => {
6
+ let mockServer;
7
+ let serverUrl;
8
+ let cwd;
9
+ let binPath;
10
+ const projectId = "prj-env-list";
11
+ const teamId = "team-1";
12
+ beforeAll(async () => {
13
+ mockServer = new MockApiServer();
14
+ serverUrl = await mockServer.start();
15
+ });
16
+ afterAll(async () => {
17
+ await mockServer.stop();
18
+ });
19
+ beforeEach(async () => {
20
+ mockServer.reset();
21
+ const setup = await setupTestDirectory();
22
+ cwd = setup.cwd;
23
+ binPath = setup.binPath;
24
+ });
25
+ afterEach(() => {
26
+ if (cwd) {
27
+ rmSync(cwd, { recursive: true, force: true });
28
+ }
29
+ });
30
+ it("lists environments for a project with --project-id", async () => {
31
+ const project = buildMockProject({
32
+ projectId,
33
+ teamId,
34
+ projectName: "My Project",
35
+ environmentId: "env-prod",
36
+ environmentName: "production",
37
+ });
38
+ const stagingEnv = {
39
+ id: "env-staging",
40
+ name: "staging",
41
+ sourceBranch: "develop",
42
+ mcpServerUrl: `https://mcp-staging.alpic.ai`,
43
+ createdAt: new Date(),
44
+ projectId,
45
+ latestDeployment: null,
46
+ };
47
+ project.environments.push(stagingEnv);
48
+ mockServer.addProject(project);
49
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "environment", "list", "--project-id", projectId], {
50
+ cwd,
51
+ env: { ALPIC_API_BASE_URL: serverUrl, ALPIC_API_KEY: "test-api-key" },
52
+ }, async (cli) => {
53
+ await cli.expect("Found 2 environments");
54
+ });
55
+ expect(exitCode).toBe(0);
56
+ const startIdx = output.indexOf("Found 2 environments");
57
+ expect(startIdx).toBeGreaterThanOrEqual(0);
58
+ expect(output.slice(startIdx)).toMatchSnapshot();
59
+ const getCall = mockServer.getLastCall("GET", `/v1/projects/${projectId}`);
60
+ expectSuccessfulApiCall(getCall);
61
+ });
62
+ });
63
+ //# sourceMappingURL=environment-list.e2e.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment-list.e2e.test.js","sourceRoot":"","sources":["../../src/__tests__/environment-list.e2e.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,277 @@
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 cannot be empty.");
230
+ });
231
+ it("errors when --key is empty in non-interactive mode", async () => {
232
+ const { exitCode, output } = await cliSession(process.execPath, [
233
+ binPath,
234
+ "environment-variable",
235
+ "add",
236
+ "--environment-id",
237
+ environmentId,
238
+ "--key",
239
+ "",
240
+ "--value",
241
+ "bar",
242
+ "--non-interactive",
243
+ ], {
244
+ cwd,
245
+ env: {
246
+ ALPIC_API_BASE_URL: serverUrl,
247
+ ALPIC_API_KEY: "test-api-key",
248
+ },
249
+ });
250
+ expect(exitCode).toBe(1);
251
+ expect(output).toContain("--key cannot be empty.");
252
+ });
253
+ it("triggers login flow when not authenticated", async () => {
254
+ const { output } = await cliSession(process.execPath, [binPath, "environment-variable", "add", "--environment-id", environmentId, "--key", "FOO", "--value", "bar"], {
255
+ cwd,
256
+ env: {
257
+ ALPIC_API_BASE_URL: serverUrl,
258
+ },
259
+ }, async (cli) => {
260
+ await cli.expect("Not authenticated. Starting login");
261
+ cli.stop();
262
+ });
263
+ expect(output).toContain("Not authenticated. Starting login");
264
+ });
265
+ it("exits with error when no environment-id is provided and no config file exists", async () => {
266
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "environment-variable", "add", "--key", "FOO", "--value", "bar", "--non-interactive"], {
267
+ cwd,
268
+ env: {
269
+ ALPIC_API_BASE_URL: serverUrl,
270
+ ALPIC_API_KEY: "test-api-key",
271
+ },
272
+ });
273
+ expect(exitCode).toBe(1);
274
+ expect(output).toContain("No environment specified");
275
+ });
276
+ });
277
+ //# 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,146 @@
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("triggers login flow when not authenticated", async () => {
123
+ const { output } = await cliSession(process.execPath, [binPath, "environment-variable", "list", "--environment-id", environmentId], {
124
+ cwd,
125
+ env: {
126
+ ALPIC_API_BASE_URL: serverUrl,
127
+ },
128
+ }, async (cli) => {
129
+ await cli.expect("Not authenticated. Starting login");
130
+ cli.stop();
131
+ });
132
+ expect(output).toContain("Not authenticated. Starting login");
133
+ });
134
+ it("exits with error when no environment-id is provided and no config file exists", async () => {
135
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "environment-variable", "list"], {
136
+ cwd,
137
+ env: {
138
+ ALPIC_API_BASE_URL: serverUrl,
139
+ ALPIC_API_KEY: "test-api-key",
140
+ },
141
+ });
142
+ expect(exitCode).toBe(1);
143
+ expect(output).toContain("No environment specified");
144
+ });
145
+ });
146
+ //# 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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"}