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,162 @@
1
+ import { existsSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
4
+ import { LOOPBACK_HOST, LOOPBACK_PORT } from "../lib/auth/oauth/constants.js";
5
+ import { MockApiServer } from "./mock-server.js";
6
+ import { cliSession, createOAuthEnv, setupTestDirectory } from "./utils.js";
7
+ describe("alpic login, logout, whoami (E2E)", () => {
8
+ let mockServer;
9
+ let serverUrl;
10
+ let cwd;
11
+ let binPath;
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
+ describe("whoami", () => {
31
+ it("shows not logged in when no API key and no OAuth credentials", async () => {
32
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "whoami"], {
33
+ cwd,
34
+ env: {
35
+ ALPIC_API_BASE_URL: serverUrl,
36
+ },
37
+ }, async (cli) => {
38
+ await cli.expect("Not logged in");
39
+ await cli.expect("alpic login");
40
+ });
41
+ expect(exitCode).toBe(0);
42
+ expect(output).toContain("Not logged in. Run `alpic login` or set ALPIC_API_KEY.");
43
+ });
44
+ it("shows team when authenticated via API key", async () => {
45
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "whoami"], {
46
+ cwd,
47
+ env: {
48
+ ALPIC_API_BASE_URL: serverUrl,
49
+ ALPIC_API_KEY: "test-api-key",
50
+ },
51
+ }, async (cli) => {
52
+ await cli.expect("API key");
53
+ await cli.expect("Team:");
54
+ await cli.expect("Mock Team");
55
+ });
56
+ expect(exitCode).toBe(0);
57
+ expect(output).toContain("Authenticated via API key");
58
+ expect(output).toContain("Mock Team");
59
+ });
60
+ it("shows user email and name when authenticated via OAuth", async () => {
61
+ const oauthEnv = createOAuthEnv(cwd, serverUrl);
62
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "whoami"], {
63
+ cwd,
64
+ env: oauthEnv,
65
+ }, async (cli) => {
66
+ await cli.expect("Authenticated as");
67
+ await cli.expect("test@example.com");
68
+ await cli.expect("Test User");
69
+ });
70
+ expect(exitCode).toBe(0);
71
+ expect(output).toContain("Authenticated as");
72
+ expect(output).toContain("Test User");
73
+ expect(output).toContain("test@example.com");
74
+ });
75
+ it("deletes credentials file when it is not readable (e.g. corrupt)", async () => {
76
+ const alpicConfigDir = join(cwd, ".config", "alpic");
77
+ const credentialsPath = join(alpicConfigDir, "credentials.json");
78
+ mkdirSync(alpicConfigDir, { recursive: true });
79
+ writeFileSync(credentialsPath, "not valid json", "utf-8");
80
+ expect(existsSync(credentialsPath)).toBe(true);
81
+ const env = {
82
+ ALPIC_GLOBAL_CONFIG_DIR: alpicConfigDir,
83
+ ALPIC_COGNITO_URL: serverUrl,
84
+ ALPIC_API_BASE_URL: serverUrl,
85
+ };
86
+ const { exitCode } = await cliSession(process.execPath, [binPath, "whoami"], { cwd, env }, async (cli) => {
87
+ await cli.expect("Not logged in");
88
+ });
89
+ expect(exitCode).toBe(0);
90
+ expect(existsSync(credentialsPath)).toBe(false);
91
+ });
92
+ });
93
+ describe("logout", () => {
94
+ it("says not logged in when no credentials", async () => {
95
+ const alpicConfigDir = join(cwd, ".config", "alpic");
96
+ const credentialsPath = join(alpicConfigDir, "credentials.json");
97
+ mkdirSync(alpicConfigDir, { recursive: true });
98
+ const oauthEnv = {
99
+ ALPIC_GLOBAL_CONFIG_DIR: alpicConfigDir,
100
+ ALPIC_COGNITO_URL: serverUrl,
101
+ ALPIC_API_BASE_URL: serverUrl,
102
+ };
103
+ expect(existsSync(credentialsPath)).toBe(false);
104
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "logout"], {
105
+ cwd,
106
+ env: {
107
+ ...oauthEnv,
108
+ ALPIC_API_BASE_URL: serverUrl,
109
+ },
110
+ }, async (cli) => {
111
+ await cli.expect("not logged in");
112
+ });
113
+ expect(exitCode).toBe(0);
114
+ expect(output).toContain("You are not logged in");
115
+ });
116
+ it("clears OAuth credentials and shows logged out", async () => {
117
+ const oauthEnv = createOAuthEnv(cwd, serverUrl);
118
+ const credentialsPath = join(cwd, ".config", "alpic", "credentials.json");
119
+ expect(existsSync(credentialsPath)).toBe(true);
120
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "logout"], {
121
+ cwd,
122
+ env: oauthEnv,
123
+ }, async (cli) => {
124
+ await cli.expect("logged out");
125
+ await cli.expect("authentication cleared");
126
+ });
127
+ expect(exitCode).toBe(0);
128
+ expect(output).toContain("You are logged out");
129
+ expect(output).toContain("User authentication cleared");
130
+ expect(existsSync(credentialsPath)).toBe(false);
131
+ });
132
+ });
133
+ describe("login", () => {
134
+ it("displays the login URL in the terminal for manual copy", async () => {
135
+ const alpicConfigDir = join(cwd, ".config", "alpic");
136
+ const { output } = await cliSession(process.execPath, [binPath, "login"], {
137
+ cwd,
138
+ env: {
139
+ ALPIC_GLOBAL_CONFIG_DIR: alpicConfigDir,
140
+ ALPIC_COGNITO_URL: serverUrl,
141
+ ALPIC_API_BASE_URL: serverUrl,
142
+ },
143
+ }, async (cli) => {
144
+ await cli.expect(`http://${LOOPBACK_HOST}:${LOOPBACK_PORT}/login`);
145
+ cli.stop();
146
+ });
147
+ expect(output).toContain(`http://${LOOPBACK_HOST}:${LOOPBACK_PORT}/login`);
148
+ });
149
+ it("says already logged in when OAuth credentials exist", async () => {
150
+ const oauthEnv = createOAuthEnv(cwd, serverUrl);
151
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "login"], {
152
+ cwd,
153
+ env: oauthEnv,
154
+ }, async (cli) => {
155
+ await cli.expect("Already logged in");
156
+ });
157
+ expect(exitCode).toBe(0);
158
+ expect(output).toContain("Already logged in");
159
+ });
160
+ });
161
+ });
162
+ //# sourceMappingURL=auth.e2e.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.e2e.test.js","sourceRoot":"","sources":["../../src/__tests__/auth.e2e.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,228 @@
1
+ import { mkdirSync, realpathSync, rmSync, writeFileSync } from "node:fs";
2
+ import { join, resolve } 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, verifyConfigFile, verifyDeploymentFlow, } from "./utils.js";
6
+ describe("alpic deploy (E2E, flags only)", () => {
7
+ let mockServer;
8
+ let serverUrl;
9
+ let cwd;
10
+ let binPath;
11
+ beforeAll(async () => {
12
+ mockServer = new MockApiServer();
13
+ serverUrl = await mockServer.start();
14
+ });
15
+ afterAll(async () => {
16
+ await mockServer.stop();
17
+ });
18
+ beforeEach(async () => {
19
+ mockServer.reset();
20
+ const setup = await setupTestDirectory();
21
+ cwd = setup.cwd;
22
+ binPath = setup.binPath;
23
+ });
24
+ afterEach(() => {
25
+ if (cwd) {
26
+ rmSync(cwd, { recursive: true, force: true });
27
+ }
28
+ });
29
+ it("creates config and completes deployment with --non-interactive --project-name --runtime --root-dir", async () => {
30
+ mkdirSync(join(cwd, "app"), { recursive: true });
31
+ writeFileSync(join(cwd, "app", "package.json"), "{}");
32
+ const { exitCode } = await cliSession(process.execPath, [binPath, "deploy", "--non-interactive", "--project-name", "demo", "--runtime", "node24", "--root-dir", "app"], {
33
+ cwd,
34
+ env: {
35
+ ALPIC_API_BASE_URL: serverUrl,
36
+ ALPIC_API_KEY: "test-api-key",
37
+ },
38
+ }, async (cli) => {
39
+ await cli.expect("Project created.");
40
+ await verifyDeploymentFlow(cli, mockServer);
41
+ });
42
+ expect(exitCode).toBe(0);
43
+ const createProjectCall = mockServer.getLastCall("POST", "/v1/projects");
44
+ expectSuccessfulApiCall(createProjectCall, (call) => {
45
+ expect(call.input).toMatchObject({
46
+ name: "demo",
47
+ runtime: "node24",
48
+ rootDirectory: "app",
49
+ teamId: "mock-team-id",
50
+ });
51
+ });
52
+ await verifyConfigFile(cwd, {
53
+ projectName: "demo",
54
+ teamName: "Mock Team",
55
+ environmentName: "production",
56
+ });
57
+ });
58
+ it("deploys with existing config file", async () => {
59
+ const existingProjectId = "existing-project-id";
60
+ const existingTeamId = "mock-team-id";
61
+ const existingEnvId = "existing-env-id";
62
+ const existingEnvName = "production";
63
+ mockServer.addProject(buildMockProject({
64
+ projectId: existingProjectId,
65
+ teamId: existingTeamId,
66
+ projectName: "existing-project",
67
+ environmentId: existingEnvId,
68
+ environmentName: existingEnvName,
69
+ }));
70
+ createConfigFile(cwd, existingProjectId, existingTeamId, "existing-project", existingEnvId, existingEnvName);
71
+ const { exitCode } = await cliSession(process.execPath, [binPath, "deploy", "--non-interactive"], {
72
+ cwd,
73
+ env: {
74
+ ALPIC_API_BASE_URL: serverUrl,
75
+ ALPIC_API_KEY: "test-api-key",
76
+ },
77
+ }, async (cli) => {
78
+ await verifyDeploymentFlow(cli, mockServer);
79
+ });
80
+ expect(exitCode).toBe(0);
81
+ await verifyDeploymentApiCalls(mockServer);
82
+ });
83
+ it("shows the resolved full path when --root-dir does not exist", async () => {
84
+ const missingDir = "missing-root-dir";
85
+ const expectedFullPath = resolve(realpathSync(cwd), missingDir);
86
+ const { output } = await cliSession(process.execPath, [
87
+ binPath,
88
+ "deploy",
89
+ "--non-interactive",
90
+ "--project-name",
91
+ "demo",
92
+ "--runtime",
93
+ "node24",
94
+ "--root-dir",
95
+ missingDir,
96
+ ], {
97
+ cwd,
98
+ env: {
99
+ ALPIC_API_BASE_URL: serverUrl,
100
+ ALPIC_API_KEY: "test-api-key",
101
+ },
102
+ });
103
+ expect(output).toContain(`Directory does not exist: ${expectedFullPath}`);
104
+ expect(output).not.toContain(`Directory does not exist: ${missingDir}`);
105
+ expect(mockServer.getCalls("POST", "/v1/projects")).toHaveLength(0);
106
+ });
107
+ it("deploys directly with --project-id and --environment-id flags", async () => {
108
+ const existingProjectId = "existing-project-id";
109
+ const existingTeamId = "mock-team-id";
110
+ const existingEnvId = "existing-env-id";
111
+ const existingEnvName = "production";
112
+ mockServer.addProject(buildMockProject({
113
+ projectId: existingProjectId,
114
+ teamId: existingTeamId,
115
+ projectName: "existing-project",
116
+ environmentId: existingEnvId,
117
+ environmentName: existingEnvName,
118
+ }));
119
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "deploy", "--project-id", existingProjectId, "--environment-id", existingEnvId], {
120
+ cwd,
121
+ env: {
122
+ ALPIC_API_BASE_URL: serverUrl,
123
+ ALPIC_API_KEY: "test-api-key",
124
+ },
125
+ }, async (cli) => {
126
+ await verifyDeploymentFlow(cli, mockServer);
127
+ });
128
+ expect(exitCode).toBe(0);
129
+ expect(output).not.toContain("Use the current directory?");
130
+ expect(output).not.toContain("Choose a team");
131
+ expect(output).toContain("Deployment summary:");
132
+ expect(output).toContain("alpic deployment logs --deployment-id");
133
+ await verifyConfigFile(cwd, {
134
+ projectName: "existing-project",
135
+ projectId: existingProjectId,
136
+ teamId: existingTeamId,
137
+ teamName: "Mock Team",
138
+ environmentId: existingEnvId,
139
+ environmentName: existingEnvName,
140
+ });
141
+ });
142
+ it("creates config with --team-id flag in non-interactive mode", async () => {
143
+ mockServer.setTeams([
144
+ { id: "team-alpha", name: "Team Alpha" },
145
+ { id: "team-beta", name: "Team Beta" },
146
+ ]);
147
+ const { exitCode } = await cliSession(process.execPath, [
148
+ binPath,
149
+ "deploy",
150
+ "--non-interactive",
151
+ "--team-id",
152
+ "team-alpha",
153
+ "--project-name",
154
+ "demo",
155
+ "--runtime",
156
+ "node24",
157
+ ], {
158
+ cwd,
159
+ env: {
160
+ ALPIC_API_BASE_URL: serverUrl,
161
+ ALPIC_API_KEY: "test-api-key",
162
+ },
163
+ }, async (cli) => {
164
+ await cli.expect("Project created.");
165
+ await verifyDeploymentFlow(cli, mockServer);
166
+ });
167
+ expect(exitCode).toBe(0);
168
+ const createProjectCall = mockServer.getLastCall("POST", "/v1/projects");
169
+ expectSuccessfulApiCall(createProjectCall, (call) => {
170
+ expect(call.input).toMatchObject({
171
+ name: "demo",
172
+ runtime: "node24",
173
+ teamId: "team-alpha",
174
+ });
175
+ });
176
+ const uploadCall = mockServer.getLastCall("POST", "/v1/deployments/upload");
177
+ expectSuccessfulApiCall(uploadCall, (call) => {
178
+ expect(call.input).toMatchObject({ teamId: "team-alpha" });
179
+ });
180
+ await verifyConfigFile(cwd, {
181
+ projectName: "demo",
182
+ teamId: "team-alpha",
183
+ teamName: "Team Alpha",
184
+ environmentName: "production",
185
+ });
186
+ });
187
+ it("passes the project teamId to uploadArtifact when deploying to a non-default team via --project-id", async () => {
188
+ const nonDefaultTeamId = "non-default-team-id";
189
+ const existingProjectId = "existing-project-id";
190
+ const existingEnvId = "existing-env-id";
191
+ mockServer.setTeams([
192
+ { id: "mock-team-id", name: "Mock Team" },
193
+ { id: nonDefaultTeamId, name: "Non Default Team" },
194
+ ]);
195
+ mockServer.addProject(buildMockProject({
196
+ projectId: existingProjectId,
197
+ teamId: nonDefaultTeamId,
198
+ projectName: "existing-project",
199
+ environmentId: existingEnvId,
200
+ environmentName: "production",
201
+ }));
202
+ const { exitCode } = await cliSession(process.execPath, [binPath, "deploy", "--project-id", existingProjectId, "--environment-id", existingEnvId], {
203
+ cwd,
204
+ env: {
205
+ ALPIC_API_BASE_URL: serverUrl,
206
+ ALPIC_API_KEY: "test-api-key",
207
+ },
208
+ }, async (cli) => {
209
+ await verifyDeploymentFlow(cli, mockServer);
210
+ });
211
+ expect(exitCode).toBe(0);
212
+ const uploadCall = mockServer.getLastCall("POST", "/v1/deployments/upload");
213
+ expectSuccessfulApiCall(uploadCall, (call) => {
214
+ expect(call.input).toMatchObject({ teamId: nonDefaultTeamId });
215
+ });
216
+ });
217
+ }, 15_000);
218
+ async function verifyDeploymentApiCalls(mockServer) {
219
+ const uploadCall = mockServer.getLastCall("POST", "/v1/deployments/upload");
220
+ expectSuccessfulApiCall(uploadCall);
221
+ const deployCall = mockServer.getLastCall("POST", /\/v1\/environments\/.*\/deploy/);
222
+ expectSuccessfulApiCall(deployCall);
223
+ const deploymentStatusCalls = mockServer.getCalls("GET", /\/v1\/deployments\/.*/);
224
+ expect(deploymentStatusCalls.length).toBeGreaterThan(0);
225
+ const envCall = mockServer.getLastCall("GET", /\/v1\/environments\/.*/);
226
+ expectSuccessfulApiCall(envCall);
227
+ }
228
+ //# sourceMappingURL=deploy-flags.e2e.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy-flags.e2e.test.js","sourceRoot":"","sources":["../../src/__tests__/deploy-flags.e2e.test.ts"],"names":[],"mappings":"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"}
@@ -1,24 +1,26 @@
1
1
  import { rmSync } from "node:fs";
2
- import { readFile } from "node:fs/promises";
3
- import { join } from "node:path";
4
- import { afterEach, beforeEach, describe, expect, it } from "vitest";
5
- import { MockApiServer } from "./mock-server";
6
- import { buildMockProject, createConfigFile, expectSuccessfulApiCall, setupTestDirectory } from "./utils";
7
- import { cliSession } from "./utils";
2
+ import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
3
+ import { MockApiServer } from "./mock-server.js";
4
+ import { buildMockProject, cliSession, createConfigFile, createOAuthEnv, expectSuccessfulApiCall, setupTestDirectory, verifyConfigFile, verifyDeploymentFlow, } from "./utils.js";
8
5
  describe("alpic deploy (E2E)", () => {
9
6
  let mockServer;
10
7
  let serverUrl;
11
8
  let cwd;
12
9
  let binPath;
13
- beforeEach(async () => {
10
+ beforeAll(async () => {
14
11
  mockServer = new MockApiServer();
15
12
  serverUrl = await mockServer.start();
13
+ });
14
+ afterAll(async () => {
15
+ await mockServer.stop();
16
+ });
17
+ beforeEach(async () => {
18
+ mockServer.reset();
16
19
  const setup = await setupTestDirectory();
17
20
  cwd = setup.cwd;
18
21
  binPath = setup.binPath;
19
22
  });
20
- afterEach(async () => {
21
- await mockServer.stop();
23
+ afterEach(() => {
22
24
  if (cwd) {
23
25
  rmSync(cwd, { recursive: true, force: true });
24
26
  }
@@ -28,11 +30,12 @@ describe("alpic deploy (E2E)", () => {
28
30
  cwd,
29
31
  env: {
30
32
  ALPIC_API_BASE_URL: serverUrl,
31
- ALPIC_FRONTEND_BASE_URL: "http://mocked.frontend.url",
32
33
  ALPIC_API_KEY: "test-api-key",
33
34
  },
34
35
  }, async (cli) => {
35
- await cli.expect("Deploy the directory?");
36
+ await cli.expect("Use the current directory?");
37
+ await cli.send("");
38
+ await cli.expect("Choose a team");
36
39
  await cli.send("");
37
40
  await cli.expect("Link to existing project?");
38
41
  await cli.send("n");
@@ -48,13 +51,17 @@ describe("alpic deploy (E2E)", () => {
48
51
  expect(call.input).toMatchObject({
49
52
  name: "demo",
50
53
  runtime: "node24",
54
+ teamId: "mock-team-id",
51
55
  });
52
56
  });
53
57
  await verifyDeploymentFlow(cli, mockServer);
54
58
  });
55
59
  expect(exitCode).toBe(0);
56
- await verifyConfigFile(cwd, output, {
60
+ expect(output).toContain("Deployment summary:");
61
+ expect(output).toContain("alpic deployment logs --deployment-id");
62
+ await verifyConfigFile(cwd, {
57
63
  projectName: "demo",
64
+ teamName: "Mock Team",
58
65
  environmentName: "production",
59
66
  });
60
67
  });
@@ -74,11 +81,12 @@ describe("alpic deploy (E2E)", () => {
74
81
  cwd,
75
82
  env: {
76
83
  ALPIC_API_BASE_URL: serverUrl,
77
- ALPIC_FRONTEND_BASE_URL: "http://mocked.frontend.url",
78
84
  ALPIC_API_KEY: "test-api-key",
79
85
  },
80
86
  }, async (cli) => {
81
- await cli.expect("Deploy the directory?");
87
+ await cli.expect("Use the current directory?");
88
+ await cli.send("");
89
+ await cli.expect("Choose a team");
82
90
  await cli.send("");
83
91
  await cli.expect("Link to existing project?");
84
92
  await cli.send("y");
@@ -89,10 +97,12 @@ describe("alpic deploy (E2E)", () => {
89
97
  await verifyDeploymentFlow(cli, mockServer);
90
98
  });
91
99
  expect(exitCode).toBe(0);
92
- await verifyConfigFile(cwd, output, {
100
+ expect(output).toContain("Deployment summary:");
101
+ await verifyConfigFile(cwd, {
93
102
  projectName: "existing-project",
94
103
  projectId: existingProjectId,
95
104
  teamId: existingTeamId,
105
+ teamName: "Mock Team",
96
106
  environmentId: existingEnvId,
97
107
  environmentName: existingEnvName,
98
108
  });
@@ -116,18 +126,54 @@ describe("alpic deploy (E2E)", () => {
116
126
  cwd,
117
127
  env: {
118
128
  ALPIC_API_BASE_URL: serverUrl,
119
- ALPIC_FRONTEND_BASE_URL: "http://mocked.frontend.url",
120
129
  ALPIC_API_KEY: "test-api-key",
121
130
  },
122
131
  }, async (cli) => {
123
- await cli.expect("Deploy the directory?");
132
+ await cli.expect("Use the current directory?");
133
+ await cli.send("");
134
+ await cli.expect(`Use project "existing-project" to environment "production"?`);
135
+ await cli.send("");
136
+ await verifyDeploymentFlow(cli, mockServer);
137
+ });
138
+ expect(exitCode).toBe(0);
139
+ expect(output).toContain("Deployment summary:");
140
+ await verifyConfigFile(cwd, {
141
+ projectName: "existing-project",
142
+ projectId: existingProjectId,
143
+ teamId: existingTeamId,
144
+ environmentId: existingEnvId,
145
+ environmentName: existingEnvName,
146
+ });
147
+ });
148
+ it("deploys with existing config using OAuth auth (no API key)", async () => {
149
+ const existingProjectId = "existing-project-id";
150
+ const existingTeamId = "mock-team-id";
151
+ const existingEnvId = "existing-env-id";
152
+ const existingEnvName = "production";
153
+ mockServer.addProject(buildMockProject({
154
+ projectId: existingProjectId,
155
+ teamId: existingTeamId,
156
+ projectName: "existing-project",
157
+ environmentId: existingEnvId,
158
+ environmentName: existingEnvName,
159
+ }));
160
+ createConfigFile(cwd, existingProjectId, existingTeamId, "existing-project", existingEnvId, existingEnvName);
161
+ const oauthEnv = createOAuthEnv(cwd, serverUrl);
162
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "deploy"], {
163
+ cwd,
164
+ env: {
165
+ ...oauthEnv,
166
+ },
167
+ }, async (cli) => {
168
+ await cli.expect("Use the current directory?");
124
169
  await cli.send("");
125
- await cli.expect(`Deploy project "existing-project" to environment "production"?`);
170
+ await cli.expect(`Use project "existing-project" to environment "production"?`);
126
171
  await cli.send("");
127
172
  await verifyDeploymentFlow(cli, mockServer);
128
173
  });
129
174
  expect(exitCode).toBe(0);
130
- await verifyConfigFile(cwd, output, {
175
+ expect(output).toContain("Deployment summary:");
176
+ await verifyConfigFile(cwd, {
131
177
  projectName: "existing-project",
132
178
  projectId: existingProjectId,
133
179
  teamId: existingTeamId,
@@ -135,51 +181,5 @@ describe("alpic deploy (E2E)", () => {
135
181
  environmentName: existingEnvName,
136
182
  });
137
183
  });
138
- }, 15_000);
139
- async function verifyConfigFile(cwd, output, expected) {
140
- const cfgPath = join(cwd, ".alpic", "project.json");
141
- const cfg = await readFile(cfgPath, "utf8");
142
- const config = JSON.parse(cfg);
143
- expect(config.projectName).toBe(expected.projectName);
144
- if (expected.projectId !== undefined) {
145
- expect(config.projectId).toBe(expected.projectId);
146
- }
147
- else {
148
- expect(config.projectId).toBeDefined();
149
- }
150
- if (expected.teamId !== undefined) {
151
- expect(config.teamId).toBe(expected.teamId);
152
- }
153
- else {
154
- expect(config.teamId).toBeDefined();
155
- }
156
- if (expected.environmentId !== undefined) {
157
- expect(config.environmentId).toBe(expected.environmentId);
158
- }
159
- else {
160
- expect(config.environmentId).toBeDefined();
161
- }
162
- if (expected.environmentName !== undefined) {
163
- expect(config.environmentName).toBe(expected.environmentName);
164
- }
165
- else {
166
- expect(config.environmentName).toBeDefined();
167
- }
168
- expect(output).toMatch(/Deployment completed|Deployment summary/);
169
- }
170
- async function verifyDeploymentFlow(cli, mockServer) {
171
- await cli.expect(/Collected \d+ file/);
172
- await cli.expect("Upload complete");
173
- const uploadCall = mockServer.getLastCall("POST", "/v1/deployments/upload");
174
- expectSuccessfulApiCall(uploadCall);
175
- await cli.expect("Deployment started");
176
- const deployCall = mockServer.getLastCall("POST", /\/v1\/environments\/.*\/deploy/);
177
- expectSuccessfulApiCall(deployCall);
178
- await cli.expect("View deployment details:");
179
- await cli.expect("Deployment summary:");
180
- const deploymentStatusCalls = mockServer.getCalls("GET", /\/v1\/deployments\/.*/);
181
- expect(deploymentStatusCalls.length).toBeGreaterThan(0);
182
- const envCall = mockServer.getLastCall("GET", /\/v1\/environments\/.*/);
183
- expectSuccessfulApiCall(envCall);
184
- }
184
+ });
185
185
  //# sourceMappingURL=deploy.e2e.test.js.map