alpic 0.0.0-dev.ecc62dd → 0.0.0-dev.eccf57b
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/deploy.e2e.test.d.ts +1 -0
- package/dist/__tests__/deploy.e2e.test.js +185 -0
- package/dist/__tests__/deploy.e2e.test.js.map +1 -0
- package/dist/__tests__/fixtures/demo-project/index.d.ts +1 -0
- package/dist/__tests__/fixtures/demo-project/index.js +4 -0
- package/dist/__tests__/fixtures/demo-project/index.js.map +1 -0
- package/dist/__tests__/git.e2e.test.d.ts +1 -0
- package/dist/__tests__/git.e2e.test.js +182 -0
- package/dist/__tests__/git.e2e.test.js.map +1 -0
- package/dist/__tests__/mock-server.d.ts +22 -0
- package/dist/__tests__/mock-server.js +366 -0
- package/dist/__tests__/mock-server.js.map +1 -0
- package/dist/__tests__/utils.d.ts +55 -0
- package/dist/__tests__/utils.js +173 -0
- package/dist/__tests__/utils.js.map +1 -0
- package/dist/api.d.ts +4 -13
- package/dist/api.js +14 -48
- package/dist/api.js.map +1 -1
- package/dist/commands/deploy.d.ts +2 -2
- package/dist/commands/deploy.js +28 -11
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/git/connect.d.ts +9 -0
- package/dist/commands/git/connect.js +65 -0
- package/dist/commands/git/connect.js.map +1 -0
- package/dist/commands/git/disconnect.d.ts +9 -0
- package/dist/commands/git/disconnect.js +55 -0
- package/dist/commands/git/disconnect.js.map +1 -0
- package/dist/commands/git.d.ts +6 -0
- package/dist/commands/git.js +17 -0
- package/dist/commands/git.js.map +1 -0
- package/dist/commands/telemetry/disable.d.ts +5 -0
- package/dist/commands/telemetry/disable.js +14 -0
- package/dist/commands/telemetry/disable.js.map +1 -0
- package/dist/commands/telemetry/enable.d.ts +5 -0
- package/dist/commands/telemetry/enable.js +13 -0
- package/dist/commands/telemetry/enable.js.map +1 -0
- package/dist/commands/telemetry/status.d.ts +5 -0
- package/dist/commands/telemetry/status.js +19 -0
- package/dist/commands/telemetry/status.js.map +1 -0
- package/dist/lib/alpic-command.d.ts +4 -0
- package/dist/lib/alpic-command.js +20 -0
- package/dist/lib/alpic-command.js.map +1 -0
- package/dist/lib/auth.d.ts +1 -0
- package/dist/lib/auth.js +10 -0
- package/dist/lib/auth.js.map +1 -0
- package/dist/lib/deployment.d.ts +21 -0
- package/dist/lib/deployment.js +38 -0
- package/dist/lib/deployment.js.map +1 -0
- package/dist/lib/git.d.ts +14 -0
- package/dist/lib/git.js +106 -0
- package/dist/lib/git.js.map +1 -0
- package/dist/lib/global-config.d.ts +9 -0
- package/dist/lib/global-config.js +48 -0
- package/dist/lib/global-config.js.map +1 -0
- package/dist/lib/project.d.ts +62 -5
- package/dist/lib/project.js +155 -15
- package/dist/lib/project.js.map +1 -1
- package/dist/lib/telemetry.d.ts +7 -0
- package/dist/lib/telemetry.js +66 -0
- package/dist/lib/telemetry.js.map +1 -0
- package/dist/posthog.d.ts +3 -0
- package/dist/posthog.js +10 -0
- package/dist/posthog.js.map +1 -0
- package/dist/types.d.ts +0 -34
- package/package.json +21 -6
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,185 @@
|
|
|
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";
|
|
8
|
+
describe("alpic deploy (E2E)", () => {
|
|
9
|
+
let mockServer;
|
|
10
|
+
let serverUrl;
|
|
11
|
+
let cwd;
|
|
12
|
+
let binPath;
|
|
13
|
+
beforeEach(async () => {
|
|
14
|
+
mockServer = new MockApiServer();
|
|
15
|
+
serverUrl = await mockServer.start();
|
|
16
|
+
const setup = await setupTestDirectory();
|
|
17
|
+
cwd = setup.cwd;
|
|
18
|
+
binPath = setup.binPath;
|
|
19
|
+
});
|
|
20
|
+
afterEach(async () => {
|
|
21
|
+
await mockServer.stop();
|
|
22
|
+
if (cwd) {
|
|
23
|
+
rmSync(cwd, { recursive: true, force: true });
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
it("creates config from prompt flow and completes deployment", async () => {
|
|
27
|
+
const { exitCode, output } = await cliSession(process.execPath, [binPath, "deploy"], {
|
|
28
|
+
cwd,
|
|
29
|
+
env: {
|
|
30
|
+
ALPIC_API_BASE_URL: serverUrl,
|
|
31
|
+
ALPIC_FRONTEND_BASE_URL: "http://mocked.frontend.url",
|
|
32
|
+
ALPIC_API_KEY: "test-api-key",
|
|
33
|
+
},
|
|
34
|
+
}, async (cli) => {
|
|
35
|
+
await cli.expect("Deploy the directory?");
|
|
36
|
+
await cli.send("");
|
|
37
|
+
await cli.expect("Link to existing project?");
|
|
38
|
+
await cli.send("n");
|
|
39
|
+
await cli.expect("Project name");
|
|
40
|
+
await cli.send("demo");
|
|
41
|
+
await cli.expect("Runtime");
|
|
42
|
+
await cli.send("");
|
|
43
|
+
await cli.expect("Root directory");
|
|
44
|
+
await cli.send("");
|
|
45
|
+
await cli.expect("Project created.");
|
|
46
|
+
const createProjectCall = mockServer.getLastCall("POST", "/v1/projects");
|
|
47
|
+
expectSuccessfulApiCall(createProjectCall, (call) => {
|
|
48
|
+
expect(call.input).toMatchObject({
|
|
49
|
+
name: "demo",
|
|
50
|
+
runtime: "node24",
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
await verifyDeploymentFlow(cli, mockServer);
|
|
54
|
+
});
|
|
55
|
+
expect(exitCode).toBe(0);
|
|
56
|
+
await verifyConfigFile(cwd, output, {
|
|
57
|
+
projectName: "demo",
|
|
58
|
+
environmentName: "production",
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
it("links to existing project and completes deployment", async () => {
|
|
62
|
+
const existingProjectId = "existing-project-id";
|
|
63
|
+
const existingTeamId = "mock-team-id";
|
|
64
|
+
const existingEnvId = "existing-env-id";
|
|
65
|
+
const existingEnvName = "production";
|
|
66
|
+
mockServer.addProject(buildMockProject({
|
|
67
|
+
projectId: existingProjectId,
|
|
68
|
+
teamId: existingTeamId,
|
|
69
|
+
projectName: "existing-project",
|
|
70
|
+
environmentId: existingEnvId,
|
|
71
|
+
environmentName: existingEnvName,
|
|
72
|
+
}));
|
|
73
|
+
const { exitCode, output } = await cliSession(process.execPath, [binPath, "deploy"], {
|
|
74
|
+
cwd,
|
|
75
|
+
env: {
|
|
76
|
+
ALPIC_API_BASE_URL: serverUrl,
|
|
77
|
+
ALPIC_FRONTEND_BASE_URL: "http://mocked.frontend.url",
|
|
78
|
+
ALPIC_API_KEY: "test-api-key",
|
|
79
|
+
},
|
|
80
|
+
}, async (cli) => {
|
|
81
|
+
await cli.expect("Deploy the directory?");
|
|
82
|
+
await cli.send("");
|
|
83
|
+
await cli.expect("Link to existing project?");
|
|
84
|
+
await cli.send("y");
|
|
85
|
+
await cli.expect("Choose a project");
|
|
86
|
+
await cli.send("");
|
|
87
|
+
await cli.expect("Choose an environment to deploy to");
|
|
88
|
+
await cli.send("");
|
|
89
|
+
await verifyDeploymentFlow(cli, mockServer);
|
|
90
|
+
});
|
|
91
|
+
expect(exitCode).toBe(0);
|
|
92
|
+
await verifyConfigFile(cwd, output, {
|
|
93
|
+
projectName: "existing-project",
|
|
94
|
+
projectId: existingProjectId,
|
|
95
|
+
teamId: existingTeamId,
|
|
96
|
+
environmentId: existingEnvId,
|
|
97
|
+
environmentName: existingEnvName,
|
|
98
|
+
});
|
|
99
|
+
const listProjectsCall = mockServer.getLastCall("GET", "/v1/projects");
|
|
100
|
+
expectSuccessfulApiCall(listProjectsCall);
|
|
101
|
+
});
|
|
102
|
+
it("deploys with existing config file", async () => {
|
|
103
|
+
const existingProjectId = "existing-project-id";
|
|
104
|
+
const existingTeamId = "mock-team-id";
|
|
105
|
+
const existingEnvId = "existing-env-id";
|
|
106
|
+
const existingEnvName = "production";
|
|
107
|
+
mockServer.addProject(buildMockProject({
|
|
108
|
+
projectId: existingProjectId,
|
|
109
|
+
teamId: existingTeamId,
|
|
110
|
+
projectName: "existing-project",
|
|
111
|
+
environmentId: existingEnvId,
|
|
112
|
+
environmentName: existingEnvName,
|
|
113
|
+
}));
|
|
114
|
+
createConfigFile(cwd, existingProjectId, existingTeamId, "existing-project", existingEnvId, existingEnvName);
|
|
115
|
+
const { exitCode, output } = await cliSession(process.execPath, [binPath, "deploy"], {
|
|
116
|
+
cwd,
|
|
117
|
+
env: {
|
|
118
|
+
ALPIC_API_BASE_URL: serverUrl,
|
|
119
|
+
ALPIC_FRONTEND_BASE_URL: "http://mocked.frontend.url",
|
|
120
|
+
ALPIC_API_KEY: "test-api-key",
|
|
121
|
+
},
|
|
122
|
+
}, async (cli) => {
|
|
123
|
+
await cli.expect("Deploy the directory?");
|
|
124
|
+
await cli.send("");
|
|
125
|
+
await cli.expect(`Deploy project "existing-project" to environment "production"?`);
|
|
126
|
+
await cli.send("");
|
|
127
|
+
await verifyDeploymentFlow(cli, mockServer);
|
|
128
|
+
});
|
|
129
|
+
expect(exitCode).toBe(0);
|
|
130
|
+
await verifyConfigFile(cwd, output, {
|
|
131
|
+
projectName: "existing-project",
|
|
132
|
+
projectId: existingProjectId,
|
|
133
|
+
teamId: existingTeamId,
|
|
134
|
+
environmentId: existingEnvId,
|
|
135
|
+
environmentName: existingEnvName,
|
|
136
|
+
});
|
|
137
|
+
});
|
|
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
|
+
}
|
|
185
|
+
//# sourceMappingURL=deploy.e2e.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy.e2e.test.js","sourceRoot":"","sources":["../../src/__tests__/deploy.e2e.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAErE,OAAO,EAAgB,aAAa,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAC1G,OAAO,EAAsB,UAAU,EAAE,MAAM,SAAS,CAAC;AAEzD,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,IAAI,UAAyB,CAAC;IAC9B,IAAI,SAAiB,CAAC;IACtB,IAAI,GAAW,CAAC;IAChB,IAAI,OAAe,CAAC;IAEpB,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,UAAU,GAAG,IAAI,aAAa,EAAE,CAAC;QACjC,SAAS,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,MAAM,kBAAkB,EAAE,CAAC;QACzC,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;QAChB,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC;QACxB,IAAI,GAAG,EAAE,CAAC;YACR,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,UAAU,CAC3C,OAAO,CAAC,QAAQ,EAChB,CAAC,OAAO,EAAE,QAAQ,CAAC,EACnB;YACE,GAAG;YACH,GAAG,EAAE;gBACH,kBAAkB,EAAE,SAAS;gBAC7B,uBAAuB,EAAE,4BAA4B;gBACrD,aAAa,EAAE,cAAc;aAC9B;SACF,EACD,KAAK,EAAE,GAAG,EAAE,EAAE;YACZ,MAAM,GAAG,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC;YAC1C,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAEnB,MAAM,GAAG,CAAC,MAAM,CAAC,2BAA2B,CAAC,CAAC;YAC9C,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAEpB,MAAM,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;YACjC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAEvB,MAAM,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC5B,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAEnB,MAAM,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;YACnC,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAEnB,MAAM,GAAG,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;YAErC,MAAM,iBAAiB,GAAG,UAAU,CAAC,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;YACzE,uBAAuB,CAAC,iBAAiB,EAAE,CAAC,IAAI,EAAE,EAAE;gBAClD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,aAAa,CAAC;oBAC/B,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,QAAQ;iBAClB,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,MAAM,oBAAoB,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QAC9C,CAAC,CACF,CAAC;QAEF,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAEzB,MAAM,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE;YAClC,WAAW,EAAE,MAAM;YACnB,eAAe,EAAE,YAAY;SAC9B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,iBAAiB,GAAG,qBAAqB,CAAC;QAChD,MAAM,cAAc,GAAG,cAAc,CAAC;QACtC,MAAM,aAAa,GAAG,iBAAiB,CAAC;QACxC,MAAM,eAAe,GAAG,YAAY,CAAC;QAErC,UAAU,CAAC,UAAU,CACnB,gBAAgB,CAAC;YACf,SAAS,EAAE,iBAAiB;YAC5B,MAAM,EAAE,cAAc;YACtB,WAAW,EAAE,kBAAkB;YAC/B,aAAa,EAAE,aAAa;YAC5B,eAAe,EAAE,eAAe;SACjC,CAAC,CACH,CAAC;QAEF,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,UAAU,CAC3C,OAAO,CAAC,QAAQ,EAChB,CAAC,OAAO,EAAE,QAAQ,CAAC,EACnB;YACE,GAAG;YACH,GAAG,EAAE;gBACH,kBAAkB,EAAE,SAAS;gBAC7B,uBAAuB,EAAE,4BAA4B;gBACrD,aAAa,EAAE,cAAc;aAC9B;SACF,EACD,KAAK,EAAE,GAAG,EAAE,EAAE;YACZ,MAAM,GAAG,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC;YAC1C,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAEnB,MAAM,GAAG,CAAC,MAAM,CAAC,2BAA2B,CAAC,CAAC;YAC9C,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAEpB,MAAM,GAAG,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;YACrC,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAEnB,MAAM,GAAG,CAAC,MAAM,CAAC,oCAAoC,CAAC,CAAC;YACvD,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAEnB,MAAM,oBAAoB,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QAC9C,CAAC,CACF,CAAC;QAEF,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAEzB,MAAM,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE;YAClC,WAAW,EAAE,kBAAkB;YAC/B,SAAS,EAAE,iBAAiB;YAC5B,MAAM,EAAE,cAAc;YACtB,aAAa,EAAE,aAAa;YAC5B,eAAe,EAAE,eAAe;SACjC,CAAC,CAAC;QAEH,MAAM,gBAAgB,GAAG,UAAU,CAAC,WAAW,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;QACvE,uBAAuB,CAAC,gBAAgB,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,iBAAiB,GAAG,qBAAqB,CAAC;QAChD,MAAM,cAAc,GAAG,cAAc,CAAC;QACtC,MAAM,aAAa,GAAG,iBAAiB,CAAC;QACxC,MAAM,eAAe,GAAG,YAAY,CAAC;QAErC,UAAU,CAAC,UAAU,CACnB,gBAAgB,CAAC;YACf,SAAS,EAAE,iBAAiB;YAC5B,MAAM,EAAE,cAAc;YACtB,WAAW,EAAE,kBAAkB;YAC/B,aAAa,EAAE,aAAa;YAC5B,eAAe,EAAE,eAAe;SACjC,CAAC,CACH,CAAC;QAEF,gBAAgB,CAAC,GAAG,EAAE,iBAAiB,EAAE,cAAc,EAAE,kBAAkB,EAAE,aAAa,EAAE,eAAe,CAAC,CAAC;QAE7G,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,UAAU,CAC3C,OAAO,CAAC,QAAQ,EAChB,CAAC,OAAO,EAAE,QAAQ,CAAC,EACnB;YACE,GAAG;YACH,GAAG,EAAE;gBACH,kBAAkB,EAAE,SAAS;gBAC7B,uBAAuB,EAAE,4BAA4B;gBACrD,aAAa,EAAE,cAAc;aAC9B;SACF,EACD,KAAK,EAAE,GAAG,EAAE,EAAE;YACZ,MAAM,GAAG,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC;YAC1C,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAEnB,MAAM,GAAG,CAAC,MAAM,CAAC,gEAAgE,CAAC,CAAC;YACnF,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAEnB,MAAM,oBAAoB,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QAC9C,CAAC,CACF,CAAC;QAEF,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAEzB,MAAM,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE;YAClC,WAAW,EAAE,kBAAkB;YAC/B,SAAS,EAAE,iBAAiB;YAC5B,MAAM,EAAE,cAAc;YACtB,aAAa,EAAE,aAAa;YAC5B,eAAe,EAAE,eAAe;SACjC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,EAAE,MAAM,CAAC,CAAC;AAEX,KAAK,UAAU,gBAAgB,CAC7B,GAAW,EACX,MAAc,EACd,QAMC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;IACpD,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACtD,IAAI,QAAQ,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;IACzC,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC9C,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;IACtC,CAAC;IACD,IAAI,QAAQ,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IAC5D,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,WAAW,EAAE,CAAC;IAC7C,CAAC;IACD,IAAI,QAAQ,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;QAC3C,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;IAChE,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,WAAW,EAAE,CAAC;IAC/C,CAAC;IACD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,yCAAyC,CAAC,CAAC;AACpE,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,GAAkB,EAAE,UAAyB;IAC/E,MAAM,GAAG,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAEvC,MAAM,GAAG,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAEpC,MAAM,UAAU,GAAG,UAAU,CAAC,WAAW,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC;IAC5E,uBAAuB,CAAC,UAAU,CAAC,CAAC;IAEpC,MAAM,GAAG,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAEvC,MAAM,UAAU,GAAG,UAAU,CAAC,WAAW,CAAC,MAAM,EAAE,gCAAgC,CAAC,CAAC;IACpF,uBAAuB,CAAC,UAAU,CAAC,CAAC;IAEpC,MAAM,GAAG,CAAC,MAAM,CAAC,0BAA0B,CAAC,CAAC;IAE7C,MAAM,GAAG,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;IAExC,MAAM,qBAAqB,GAAG,UAAU,CAAC,QAAQ,CAAC,KAAK,EAAE,uBAAuB,CAAC,CAAC;IAClF,MAAM,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAExD,MAAM,OAAO,GAAG,UAAU,CAAC,WAAW,CAAC,KAAK,EAAE,wBAAwB,CAAC,CAAC;IACxE,uBAAuB,CAAC,OAAO,CAAC,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/__tests__/fixtures/demo-project/index.js"],"names":[],"mappings":"AAAA,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;AACjC,MAAM,CAAC,OAAO,GAAG,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { rmSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { afterEach, beforeEach, describe, expect, it } from "vitest";
|
|
4
|
+
import { MockApiServer } from "./mock-server";
|
|
5
|
+
import { buildMockProject, cliSession, createConfigFile, expectSuccessfulApiCall, runGit, setupTestDirectory, } from "./utils";
|
|
6
|
+
describe("alpic git connect/disconnect (E2E)", () => {
|
|
7
|
+
let mockServer;
|
|
8
|
+
let serverUrl;
|
|
9
|
+
let cwd;
|
|
10
|
+
let binPath;
|
|
11
|
+
const projectId = "project-id";
|
|
12
|
+
const teamId = "team-id";
|
|
13
|
+
const environmentId = "env-id";
|
|
14
|
+
function setupProject(overrides) {
|
|
15
|
+
mockServer.addProject(buildMockProject({
|
|
16
|
+
projectId,
|
|
17
|
+
teamId,
|
|
18
|
+
projectName: "demo",
|
|
19
|
+
environmentId,
|
|
20
|
+
environmentName: "production",
|
|
21
|
+
sourceRepository: null,
|
|
22
|
+
sourceBranch: "main",
|
|
23
|
+
...overrides,
|
|
24
|
+
}));
|
|
25
|
+
createConfigFile(cwd, projectId, teamId, "demo", environmentId, "production");
|
|
26
|
+
}
|
|
27
|
+
beforeEach(async () => {
|
|
28
|
+
mockServer = new MockApiServer();
|
|
29
|
+
serverUrl = await mockServer.start();
|
|
30
|
+
const setup = await setupTestDirectory({ prefix: "alpic-cli-e2e-git", initGit: true });
|
|
31
|
+
cwd = setup.cwd;
|
|
32
|
+
binPath = setup.binPath;
|
|
33
|
+
});
|
|
34
|
+
afterEach(async () => {
|
|
35
|
+
await mockServer.stop();
|
|
36
|
+
if (cwd) {
|
|
37
|
+
rmSync(cwd, { recursive: true, force: true });
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
it("connects using selected remote source when multiple remotes are available", async () => {
|
|
41
|
+
setupProject();
|
|
42
|
+
const { exitCode, output } = await cliSession(process.execPath, [binPath, "git", "connect"], {
|
|
43
|
+
cwd,
|
|
44
|
+
env: {
|
|
45
|
+
ALPIC_API_BASE_URL: serverUrl,
|
|
46
|
+
ALPIC_FRONTEND_BASE_URL: "http://mocked.frontend.url",
|
|
47
|
+
ALPIC_API_KEY: "test-api-key",
|
|
48
|
+
},
|
|
49
|
+
}, async (cli) => {
|
|
50
|
+
await cli.expect("Choose the remote source to connect");
|
|
51
|
+
await cli.send("\u001B[B"); // Move down one option
|
|
52
|
+
await cli.send("");
|
|
53
|
+
await cli.expect("Connected");
|
|
54
|
+
await cli.expect("every push");
|
|
55
|
+
});
|
|
56
|
+
expect(exitCode).toBe(0);
|
|
57
|
+
expect(output).toMatch(/Connected .*acme\/backend.* to project .*demo.*\./);
|
|
58
|
+
expect(output).toContain("make sure to install the Alpic GitHub App on this repository.");
|
|
59
|
+
const updateCall = mockServer.getLastCall("PATCH", "/v1/projects/");
|
|
60
|
+
expectSuccessfulApiCall(updateCall, (call) => {
|
|
61
|
+
expect(call.input).toMatchObject({
|
|
62
|
+
projectId,
|
|
63
|
+
sourceRepository: "acme/backend",
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
it("requires linked Alpic project config", async () => {
|
|
68
|
+
rmSync(join(cwd, ".alpic"), { recursive: true, force: true });
|
|
69
|
+
const { output } = await cliSession(process.execPath, [binPath, "git", "connect"], {
|
|
70
|
+
cwd,
|
|
71
|
+
env: {
|
|
72
|
+
ALPIC_API_BASE_URL: serverUrl,
|
|
73
|
+
ALPIC_FRONTEND_BASE_URL: "http://mocked.frontend.url",
|
|
74
|
+
ALPIC_API_KEY: "test-api-key",
|
|
75
|
+
},
|
|
76
|
+
}, async (cli) => {
|
|
77
|
+
await cli.expect("This directory is not linked to an Alpic project. Link it first using `alpic deploy`.");
|
|
78
|
+
});
|
|
79
|
+
expect(output).toContain("This directory is not linked to an Alpic project. Link it first using `alpic deploy`.");
|
|
80
|
+
});
|
|
81
|
+
it("shows git setup instructions when directory is not a git repository", async () => {
|
|
82
|
+
setupProject();
|
|
83
|
+
rmSync(join(cwd, ".git"), { recursive: true, force: true });
|
|
84
|
+
const { output } = await cliSession(process.execPath, [binPath, "git", "connect"], {
|
|
85
|
+
cwd,
|
|
86
|
+
env: {
|
|
87
|
+
ALPIC_API_BASE_URL: serverUrl,
|
|
88
|
+
ALPIC_FRONTEND_BASE_URL: "http://mocked.frontend.url",
|
|
89
|
+
ALPIC_API_KEY: "test-api-key",
|
|
90
|
+
},
|
|
91
|
+
}, async (cli) => {
|
|
92
|
+
await cli.expect("This directory is not a git repository.");
|
|
93
|
+
await cli.expect("To set up a git repository");
|
|
94
|
+
await cli.expect("git init");
|
|
95
|
+
});
|
|
96
|
+
expect(output).toContain("This directory is not a git repository.");
|
|
97
|
+
expect(output).toContain("To set up a git repository");
|
|
98
|
+
expect(output).toContain("git init");
|
|
99
|
+
});
|
|
100
|
+
it("shows git setup instructions when repository has no remotes", async () => {
|
|
101
|
+
setupProject();
|
|
102
|
+
runGit(["remote", "remove", "origin"], cwd);
|
|
103
|
+
runGit(["remote", "remove", "upstream"], cwd);
|
|
104
|
+
const { output } = await cliSession(process.execPath, [binPath, "git", "connect"], {
|
|
105
|
+
cwd,
|
|
106
|
+
env: {
|
|
107
|
+
ALPIC_API_BASE_URL: serverUrl,
|
|
108
|
+
ALPIC_FRONTEND_BASE_URL: "http://mocked.frontend.url",
|
|
109
|
+
ALPIC_API_KEY: "test-api-key",
|
|
110
|
+
},
|
|
111
|
+
}, async (cli) => {
|
|
112
|
+
await cli.expect("This git repository has no remotes configured.");
|
|
113
|
+
await cli.expect("To set up a git repository");
|
|
114
|
+
await cli.expect("git init");
|
|
115
|
+
});
|
|
116
|
+
expect(output).toContain("This git repository has no remotes configured.");
|
|
117
|
+
expect(output).toContain("To set up a git repository");
|
|
118
|
+
expect(output).toContain("git init");
|
|
119
|
+
});
|
|
120
|
+
it("when project is already connected, prompts to link another and exits if user declines", async () => {
|
|
121
|
+
setupProject({ sourceRepository: "acme/backend" });
|
|
122
|
+
const { exitCode, output } = await cliSession(process.execPath, [binPath, "git", "connect"], {
|
|
123
|
+
cwd,
|
|
124
|
+
env: {
|
|
125
|
+
ALPIC_API_BASE_URL: serverUrl,
|
|
126
|
+
ALPIC_FRONTEND_BASE_URL: "http://mocked.frontend.url",
|
|
127
|
+
ALPIC_API_KEY: "test-api-key",
|
|
128
|
+
},
|
|
129
|
+
}, async (cli) => {
|
|
130
|
+
await cli.expect(/Project .*demo.* is already connected to .*acme\/backend.*\./);
|
|
131
|
+
await cli.expect("Do you want to link another repository?");
|
|
132
|
+
await cli.send(""); // accept default (No)
|
|
133
|
+
await cli.expect("Git connect cancelled");
|
|
134
|
+
});
|
|
135
|
+
expect(exitCode).toBe(1);
|
|
136
|
+
expect(output).toMatch(/Project .*demo.* is already connected to .*acme\/backend.*\./);
|
|
137
|
+
expect(output).toContain("Git connect cancelled");
|
|
138
|
+
expect(mockServer.getCalls("PATCH", "/v1/projects/")).toHaveLength(0);
|
|
139
|
+
});
|
|
140
|
+
it("disconnect fails with clear message when project is not connected", async () => {
|
|
141
|
+
setupProject(); // sourceRepository is null by default
|
|
142
|
+
const { exitCode, output } = await cliSession(process.execPath, [binPath, "git", "disconnect"], {
|
|
143
|
+
cwd,
|
|
144
|
+
env: {
|
|
145
|
+
ALPIC_API_BASE_URL: serverUrl,
|
|
146
|
+
ALPIC_FRONTEND_BASE_URL: "http://mocked.frontend.url",
|
|
147
|
+
ALPIC_API_KEY: "test-api-key",
|
|
148
|
+
},
|
|
149
|
+
}, async (cli) => {
|
|
150
|
+
await cli.expect(/Project .*demo.* is not connected to any repository\./);
|
|
151
|
+
});
|
|
152
|
+
expect(exitCode).toBe(1);
|
|
153
|
+
expect(output).toMatch(/Project .*demo.* is not connected to any repository\./);
|
|
154
|
+
expect(mockServer.getCalls("PATCH", "/v1/projects/")).toHaveLength(0);
|
|
155
|
+
});
|
|
156
|
+
it("disconnects an already connected project repository", async () => {
|
|
157
|
+
setupProject({ sourceRepository: "acme/frontend" });
|
|
158
|
+
const { exitCode, output } = await cliSession(process.execPath, [binPath, "git", "disconnect"], {
|
|
159
|
+
cwd,
|
|
160
|
+
env: {
|
|
161
|
+
ALPIC_API_BASE_URL: serverUrl,
|
|
162
|
+
ALPIC_FRONTEND_BASE_URL: "http://mocked.frontend.url",
|
|
163
|
+
ALPIC_API_KEY: "test-api-key",
|
|
164
|
+
},
|
|
165
|
+
}, async (cli) => {
|
|
166
|
+
await cli.expect(/Are you sure you want to disconnect .*acme\/frontend.* from project .*demo.*\?/);
|
|
167
|
+
await cli.send("\u001B[A"); // arrow up to select Yes
|
|
168
|
+
await cli.send("");
|
|
169
|
+
await cli.expect(/Disconnected .*acme\/frontend.* from project .*demo.*\./);
|
|
170
|
+
});
|
|
171
|
+
expect(exitCode).toBe(0);
|
|
172
|
+
expect(output).toMatch(/Disconnected .*acme\/frontend.* from project .*demo.*\./);
|
|
173
|
+
const updateCall = mockServer.getLastCall("PATCH", "/v1/projects/");
|
|
174
|
+
expectSuccessfulApiCall(updateCall, (call) => {
|
|
175
|
+
expect(call.input).toMatchObject({
|
|
176
|
+
projectId,
|
|
177
|
+
sourceRepository: null,
|
|
178
|
+
});
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
}, 20_000);
|
|
182
|
+
//# sourceMappingURL=git.e2e.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.e2e.test.js","sourceRoot":"","sources":["../../src/__tests__/git.e2e.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAErE,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EACL,gBAAgB,EAChB,UAAU,EACV,gBAAgB,EAChB,uBAAuB,EACvB,MAAM,EACN,kBAAkB,GACnB,MAAM,SAAS,CAAC;AAEjB,QAAQ,CAAC,oCAAoC,EAAE,GAAG,EAAE;IAClD,IAAI,UAAyB,CAAC;IAC9B,IAAI,SAAiB,CAAC;IACtB,IAAI,GAAW,CAAC;IAChB,IAAI,OAAe,CAAC;IAEpB,MAAM,SAAS,GAAG,YAAY,CAAC;IAC/B,MAAM,MAAM,GAAG,SAAS,CAAC;IACzB,MAAM,aAAa,GAAG,QAAQ,CAAC;IAE/B,SAAS,YAAY,CAAC,SAA8E;QAClG,UAAU,CAAC,UAAU,CACnB,gBAAgB,CAAC;YACf,SAAS;YACT,MAAM;YACN,WAAW,EAAE,MAAM;YACnB,aAAa;YACb,eAAe,EAAE,YAAY;YAC7B,gBAAgB,EAAE,IAAI;YACtB,YAAY,EAAE,MAAM;YACpB,GAAG,SAAS;SACb,CAAC,CACH,CAAC;QACF,gBAAgB,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,YAAY,CAAC,CAAC;IAChF,CAAC;IAED,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,UAAU,GAAG,IAAI,aAAa,EAAE,CAAC;QACjC,SAAS,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC,EAAE,MAAM,EAAE,mBAAmB,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACvF,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;QAChB,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC;QACxB,IAAI,GAAG,EAAE,CAAC;YACR,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2EAA2E,EAAE,KAAK,IAAI,EAAE;QACzF,YAAY,EAAE,CAAC;QAEf,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,UAAU,CAC3C,OAAO,CAAC,QAAQ,EAChB,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,EAC3B;YACE,GAAG;YACH,GAAG,EAAE;gBACH,kBAAkB,EAAE,SAAS;gBAC7B,uBAAuB,EAAE,4BAA4B;gBACrD,aAAa,EAAE,cAAc;aAC9B;SACF,EACD,KAAK,EAAE,GAAG,EAAE,EAAE;YACZ,MAAM,GAAG,CAAC,MAAM,CAAC,qCAAqC,CAAC,CAAC;YACxD,MAAM,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,uBAAuB;YACnD,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACnB,MAAM,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YAC9B,MAAM,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QACjC,CAAC,CACF,CAAC;QAEF,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzB,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,mDAAmD,CAAC,CAAC;QAC5E,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,+DAA+D,CAAC,CAAC;QAE1F,MAAM,UAAU,GAAG,UAAU,CAAC,WAAW,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;QACpE,uBAAuB,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE;YAC3C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,aAAa,CAAC;gBAC/B,SAAS;gBACT,gBAAgB,EAAE,cAAc;aACjC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAE9D,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,UAAU,CACjC,OAAO,CAAC,QAAQ,EAChB,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,EAC3B;YACE,GAAG;YACH,GAAG,EAAE;gBACH,kBAAkB,EAAE,SAAS;gBAC7B,uBAAuB,EAAE,4BAA4B;gBACrD,aAAa,EAAE,cAAc;aAC9B;SACF,EACD,KAAK,EAAE,GAAG,EAAE,EAAE;YACZ,MAAM,GAAG,CAAC,MAAM,CAAC,uFAAuF,CAAC,CAAC;QAC5G,CAAC,CACF,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,uFAAuF,CAAC,CAAC;IACpH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;QACnF,YAAY,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAE5D,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,UAAU,CACjC,OAAO,CAAC,QAAQ,EAChB,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,EAC3B;YACE,GAAG;YACH,GAAG,EAAE;gBACH,kBAAkB,EAAE,SAAS;gBAC7B,uBAAuB,EAAE,4BAA4B;gBACrD,aAAa,EAAE,cAAc;aAC9B;SACF,EACD,KAAK,EAAE,GAAG,EAAE,EAAE;YACZ,MAAM,GAAG,CAAC,MAAM,CAAC,yCAAyC,CAAC,CAAC;YAC5D,MAAM,GAAG,CAAC,MAAM,CAAC,4BAA4B,CAAC,CAAC;YAC/C,MAAM,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC/B,CAAC,CACF,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,yCAAyC,CAAC,CAAC;QACpE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;QACvD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC3E,YAAY,EAAE,CAAC;QACf,MAAM,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,GAAG,CAAC,CAAC;QAC5C,MAAM,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE,GAAG,CAAC,CAAC;QAE9C,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,UAAU,CACjC,OAAO,CAAC,QAAQ,EAChB,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,EAC3B;YACE,GAAG;YACH,GAAG,EAAE;gBACH,kBAAkB,EAAE,SAAS;gBAC7B,uBAAuB,EAAE,4BAA4B;gBACrD,aAAa,EAAE,cAAc;aAC9B;SACF,EACD,KAAK,EAAE,GAAG,EAAE,EAAE;YACZ,MAAM,GAAG,CAAC,MAAM,CAAC,gDAAgD,CAAC,CAAC;YACnE,MAAM,GAAG,CAAC,MAAM,CAAC,4BAA4B,CAAC,CAAC;YAC/C,MAAM,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC/B,CAAC,CACF,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,gDAAgD,CAAC,CAAC;QAC3E,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;QACvD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uFAAuF,EAAE,KAAK,IAAI,EAAE;QACrG,YAAY,CAAC,EAAE,gBAAgB,EAAE,cAAc,EAAE,CAAC,CAAC;QAEnD,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,UAAU,CAC3C,OAAO,CAAC,QAAQ,EAChB,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,EAC3B;YACE,GAAG;YACH,GAAG,EAAE;gBACH,kBAAkB,EAAE,SAAS;gBAC7B,uBAAuB,EAAE,4BAA4B;gBACrD,aAAa,EAAE,cAAc;aAC9B;SACF,EACD,KAAK,EAAE,GAAG,EAAE,EAAE;YACZ,MAAM,GAAG,CAAC,MAAM,CAAC,8DAA8D,CAAC,CAAC;YACjF,MAAM,GAAG,CAAC,MAAM,CAAC,yCAAyC,CAAC,CAAC;YAC5D,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,sBAAsB;YAC1C,MAAM,GAAG,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC;QAC5C,CAAC,CACF,CAAC;QAEF,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzB,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,8DAA8D,CAAC,CAAC;QACvF,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;QAClD,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;QACjF,YAAY,EAAE,CAAC,CAAC,sCAAsC;QAEtD,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,UAAU,CAC3C,OAAO,CAAC,QAAQ,EAChB,CAAC,OAAO,EAAE,KAAK,EAAE,YAAY,CAAC,EAC9B;YACE,GAAG;YACH,GAAG,EAAE;gBACH,kBAAkB,EAAE,SAAS;gBAC7B,uBAAuB,EAAE,4BAA4B;gBACrD,aAAa,EAAE,cAAc;aAC9B;SACF,EACD,KAAK,EAAE,GAAG,EAAE,EAAE;YACZ,MAAM,GAAG,CAAC,MAAM,CAAC,uDAAuD,CAAC,CAAC;QAC5E,CAAC,CACF,CAAC;QAEF,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzB,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,uDAAuD,CAAC,CAAC;QAChF,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,YAAY,CAAC,EAAE,gBAAgB,EAAE,eAAe,EAAE,CAAC,CAAC;QAEpD,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,UAAU,CAC3C,OAAO,CAAC,QAAQ,EAChB,CAAC,OAAO,EAAE,KAAK,EAAE,YAAY,CAAC,EAC9B;YACE,GAAG;YACH,GAAG,EAAE;gBACH,kBAAkB,EAAE,SAAS;gBAC7B,uBAAuB,EAAE,4BAA4B;gBACrD,aAAa,EAAE,cAAc;aAC9B;SACF,EACD,KAAK,EAAE,GAAG,EAAE,EAAE;YACZ,MAAM,GAAG,CAAC,MAAM,CAAC,gFAAgF,CAAC,CAAC;YACnG,MAAM,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,yBAAyB;YACrD,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACnB,MAAM,GAAG,CAAC,MAAM,CAAC,yDAAyD,CAAC,CAAC;QAC9E,CAAC,CACF,CAAC;QAEF,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzB,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,yDAAyD,CAAC,CAAC;QAElF,MAAM,UAAU,GAAG,UAAU,CAAC,WAAW,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;QACpE,uBAAuB,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE;YAC3C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,aAAa,CAAC;gBAC/B,SAAS;gBACT,gBAAgB,EAAE,IAAI;aACvB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,EAAE,MAAM,CAAC,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type RouterOutput } from "@alpic-ai/api";
|
|
2
|
+
export type ApiCall = {
|
|
3
|
+
method: string;
|
|
4
|
+
path: string;
|
|
5
|
+
timestamp: Date;
|
|
6
|
+
input?: unknown;
|
|
7
|
+
responseStatus?: number;
|
|
8
|
+
};
|
|
9
|
+
export declare class MockApiServer {
|
|
10
|
+
private server;
|
|
11
|
+
private app;
|
|
12
|
+
private port;
|
|
13
|
+
private mockData;
|
|
14
|
+
private callHistory;
|
|
15
|
+
constructor();
|
|
16
|
+
start(): Promise<string>;
|
|
17
|
+
private configureServer;
|
|
18
|
+
stop(): Promise<void>;
|
|
19
|
+
getCalls(method?: string, pathPattern?: string | RegExp): ApiCall[];
|
|
20
|
+
getLastCall(method?: string, pathPattern?: string | RegExp): ApiCall | undefined;
|
|
21
|
+
addProject(project: RouterOutput["projects"]["get"]["v1"]): void;
|
|
22
|
+
}
|