alpic 0.0.0-dev.f233893 → 0.0.0-dev.f2f58a6

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 (43) hide show
  1. package/dist/__tests__/deploy.e2e.test.d.ts +1 -0
  2. package/dist/__tests__/deploy.e2e.test.js +267 -0
  3. package/dist/__tests__/deploy.e2e.test.js.map +1 -0
  4. package/dist/__tests__/fixtures/demo-project/index.d.ts +1 -0
  5. package/dist/__tests__/fixtures/demo-project/index.js +4 -0
  6. package/dist/__tests__/fixtures/demo-project/index.js.map +1 -0
  7. package/dist/__tests__/mock-server.d.ts +22 -0
  8. package/dist/__tests__/mock-server.js +313 -0
  9. package/dist/__tests__/mock-server.js.map +1 -0
  10. package/dist/__tests__/utils.d.ts +29 -0
  11. package/dist/__tests__/utils.js +88 -0
  12. package/dist/__tests__/utils.js.map +1 -0
  13. package/dist/api.d.ts +3 -15
  14. package/dist/api.js +11 -54
  15. package/dist/api.js.map +1 -1
  16. package/dist/commands/deploy.js +8 -8
  17. package/dist/commands/deploy.js.map +1 -1
  18. package/dist/commands/telemetry/disable.d.ts +5 -0
  19. package/dist/commands/telemetry/disable.js +14 -0
  20. package/dist/commands/telemetry/disable.js.map +1 -0
  21. package/dist/commands/telemetry/enable.d.ts +5 -0
  22. package/dist/commands/telemetry/enable.js +13 -0
  23. package/dist/commands/telemetry/enable.js.map +1 -0
  24. package/dist/commands/telemetry/status.d.ts +5 -0
  25. package/dist/commands/telemetry/status.js +19 -0
  26. package/dist/commands/telemetry/status.js.map +1 -0
  27. package/dist/lib/deployment.d.ts +13 -3
  28. package/dist/lib/deployment.js +3 -2
  29. package/dist/lib/deployment.js.map +1 -1
  30. package/dist/lib/global-config.d.ts +9 -0
  31. package/dist/lib/global-config.js +48 -0
  32. package/dist/lib/global-config.js.map +1 -0
  33. package/dist/lib/project.d.ts +61 -5
  34. package/dist/lib/project.js +135 -15
  35. package/dist/lib/project.js.map +1 -1
  36. package/dist/lib/telemetry.d.ts +7 -0
  37. package/dist/lib/telemetry.js +66 -0
  38. package/dist/lib/telemetry.js.map +1 -0
  39. package/dist/posthog.d.ts +3 -0
  40. package/dist/posthog.js +10 -0
  41. package/dist/posthog.js.map +1 -0
  42. package/dist/types.d.ts +0 -35
  43. package/package.json +27 -3
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,267 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { mkdirSync, rmSync, writeFileSync } from "node:fs";
3
+ import { cp, mkdtemp, readFile } from "node:fs/promises";
4
+ import { tmpdir } from "node:os";
5
+ import { dirname, join } from "node:path";
6
+ import { fileURLToPath } from "node:url";
7
+ import { afterEach, beforeEach, describe, expect, it } from "vitest";
8
+ import { MockApiServer } from "./mock-server";
9
+ import { cliSession } from "./utils";
10
+ const __dirname = dirname(fileURLToPath(import.meta.url));
11
+ describe("alpic deploy (E2E)", () => {
12
+ let mockServer;
13
+ let serverUrl;
14
+ let cwd;
15
+ let binPath;
16
+ beforeEach(async () => {
17
+ mockServer = new MockApiServer();
18
+ serverUrl = await mockServer.start();
19
+ const setup = await setupTestDirectory();
20
+ cwd = setup.cwd;
21
+ binPath = setup.binPath;
22
+ });
23
+ afterEach(async () => {
24
+ await mockServer.stop();
25
+ if (cwd) {
26
+ rmSync(cwd, { recursive: true, force: true });
27
+ }
28
+ });
29
+ it("creates config from prompt flow and completes deployment", async () => {
30
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "deploy"], {
31
+ cwd,
32
+ env: {
33
+ ALPIC_API_BASE_URL: serverUrl,
34
+ ALPIC_FRONTEND_BASE_URL: "http://mocked.frontend.url",
35
+ ALPIC_API_KEY: "test-api-key",
36
+ ALPIC_POLL_INTERVAL: "1000",
37
+ },
38
+ }, async (cli) => {
39
+ await cli.expect("Deploy the directory?");
40
+ await cli.send("");
41
+ await cli.expect("Link to existing project?");
42
+ await cli.send("n");
43
+ await cli.expect("Project name");
44
+ await cli.send("demo");
45
+ await cli.expect("Runtime");
46
+ await cli.send("");
47
+ await cli.expect("Root directory");
48
+ await cli.send("");
49
+ await cli.expect("Project created.");
50
+ const createProjectCall = mockServer.getLastCall("POST", "/v1/projects");
51
+ expectSuccessfulApiCall(createProjectCall, (call) => {
52
+ expect(call.input).toMatchObject({
53
+ name: "demo",
54
+ runtime: "node24",
55
+ });
56
+ });
57
+ await verifyDeploymentFlow(cli, mockServer);
58
+ });
59
+ expect(exitCode).toBe(0);
60
+ await verifyConfigFile(cwd, output, {
61
+ projectName: "demo",
62
+ environmentName: "production",
63
+ });
64
+ });
65
+ it("links to existing project and completes deployment", async () => {
66
+ const existingProjectId = "existing-project-id";
67
+ const existingTeamId = "mock-team-id";
68
+ const existingEnvId = "existing-env-id";
69
+ const existingEnvName = "production";
70
+ mockServer.addProject({
71
+ id: existingProjectId,
72
+ name: "existing-project",
73
+ teamId: existingTeamId,
74
+ environments: [
75
+ {
76
+ id: existingEnvId,
77
+ name: existingEnvName,
78
+ sourceBranch: null,
79
+ mcpServerUrl: `https://mcp-${existingProjectId}.alpic.ai`,
80
+ createdAt: new Date(),
81
+ projectId: existingProjectId,
82
+ latestDeployment: null,
83
+ },
84
+ ],
85
+ productionEnvironment: {
86
+ id: existingEnvId,
87
+ name: existingEnvName,
88
+ mcpServerUrl: `https://mcp-${existingProjectId}.alpic.ai`,
89
+ latestDeployment: null,
90
+ },
91
+ sourceRepository: null,
92
+ runtime: "node24",
93
+ transport: null,
94
+ rootDirectory: null,
95
+ buildCommand: null,
96
+ buildOutputDir: null,
97
+ installCommand: null,
98
+ startCommand: null,
99
+ createdAt: new Date(),
100
+ });
101
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "deploy"], {
102
+ cwd,
103
+ env: {
104
+ ALPIC_API_BASE_URL: serverUrl,
105
+ ALPIC_FRONTEND_BASE_URL: "http://mocked.frontend.url",
106
+ ALPIC_API_KEY: "test-api-key",
107
+ ALPIC_POLL_INTERVAL: "1000",
108
+ },
109
+ }, async (cli) => {
110
+ await cli.expect("Deploy the directory?");
111
+ await cli.send("");
112
+ await cli.expect("Link to existing project?");
113
+ await cli.send("y");
114
+ await cli.expect("Choose a project");
115
+ await cli.send("");
116
+ await cli.expect("Choose an environment to deploy to");
117
+ await cli.send("");
118
+ await verifyDeploymentFlow(cli, mockServer);
119
+ });
120
+ expect(exitCode).toBe(0);
121
+ await verifyConfigFile(cwd, output, {
122
+ projectName: "existing-project",
123
+ projectId: existingProjectId,
124
+ teamId: existingTeamId,
125
+ environmentId: existingEnvId,
126
+ environmentName: existingEnvName,
127
+ });
128
+ const listProjectsCall = mockServer.getLastCall("GET", "/v1/projects");
129
+ expectSuccessfulApiCall(listProjectsCall);
130
+ });
131
+ it("deploys with existing config file", async () => {
132
+ const existingProjectId = "existing-project-id";
133
+ const existingTeamId = "mock-team-id";
134
+ const existingEnvId = "existing-env-id";
135
+ const existingEnvName = "production";
136
+ mockServer.addProject({
137
+ id: existingProjectId,
138
+ name: "existing-project",
139
+ teamId: existingTeamId,
140
+ environments: [
141
+ {
142
+ id: existingEnvId,
143
+ name: existingEnvName,
144
+ sourceBranch: null,
145
+ mcpServerUrl: `https://mcp-${existingProjectId}.alpic.ai`,
146
+ createdAt: new Date(),
147
+ projectId: existingProjectId,
148
+ latestDeployment: null,
149
+ },
150
+ ],
151
+ productionEnvironment: {
152
+ id: existingEnvId,
153
+ name: existingEnvName,
154
+ mcpServerUrl: `https://mcp-${existingProjectId}.alpic.ai`,
155
+ latestDeployment: null,
156
+ },
157
+ sourceRepository: null,
158
+ runtime: "node24",
159
+ transport: null,
160
+ rootDirectory: null,
161
+ buildCommand: null,
162
+ buildOutputDir: null,
163
+ installCommand: null,
164
+ startCommand: null,
165
+ createdAt: new Date(),
166
+ });
167
+ createConfigFile(cwd, existingProjectId, existingTeamId, "existing-project", existingEnvId, existingEnvName);
168
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "deploy"], {
169
+ cwd,
170
+ env: {
171
+ ALPIC_API_BASE_URL: serverUrl,
172
+ ALPIC_FRONTEND_BASE_URL: "http://mocked.frontend.url",
173
+ ALPIC_API_KEY: "test-api-key",
174
+ ALPIC_POLL_INTERVAL: "1000",
175
+ NO_COLOR: "1",
176
+ },
177
+ }, async (cli) => {
178
+ await cli.expect("Deploy the directory?");
179
+ await cli.send("");
180
+ await cli.expect(`Deploy project "existing-project" to environment "production"?`);
181
+ await cli.send("");
182
+ await verifyDeploymentFlow(cli, mockServer);
183
+ });
184
+ expect(exitCode).toBe(0);
185
+ await verifyConfigFile(cwd, output, {
186
+ projectName: "existing-project",
187
+ projectId: existingProjectId,
188
+ teamId: existingTeamId,
189
+ environmentId: existingEnvId,
190
+ environmentName: existingEnvName,
191
+ });
192
+ });
193
+ });
194
+ async function setupTestDirectory() {
195
+ const uniqueId = randomUUID();
196
+ const cwd = await mkdtemp(join(tmpdir(), `alpic-cli-e2e-${uniqueId}-`));
197
+ const fixturePath = join(__dirname, "fixtures", "demo-project");
198
+ await cp(fixturePath, cwd, { recursive: true });
199
+ const binPath = join(process.cwd(), "bin", "dev.js");
200
+ return { cwd, binPath };
201
+ }
202
+ function createConfigFile(cwd, projectId, teamId, projectName, environmentId, environmentName) {
203
+ const configDir = join(cwd, ".alpic");
204
+ mkdirSync(configDir, { recursive: true });
205
+ const configPath = join(configDir, "project.json");
206
+ writeFileSync(configPath, JSON.stringify({
207
+ projectId,
208
+ teamId,
209
+ projectName,
210
+ environmentId,
211
+ environmentName,
212
+ }));
213
+ }
214
+ async function verifyConfigFile(cwd, output, expected) {
215
+ const cfgPath = join(cwd, ".alpic", "project.json");
216
+ const cfg = await readFile(cfgPath, "utf8");
217
+ const config = JSON.parse(cfg);
218
+ expect(config.projectName).toBe(expected.projectName);
219
+ if (expected.projectId !== undefined) {
220
+ expect(config.projectId).toBe(expected.projectId);
221
+ }
222
+ else {
223
+ expect(config.projectId).toBeDefined();
224
+ }
225
+ if (expected.teamId !== undefined) {
226
+ expect(config.teamId).toBe(expected.teamId);
227
+ }
228
+ else {
229
+ expect(config.teamId).toBeDefined();
230
+ }
231
+ if (expected.environmentId !== undefined) {
232
+ expect(config.environmentId).toBe(expected.environmentId);
233
+ }
234
+ else {
235
+ expect(config.environmentId).toBeDefined();
236
+ }
237
+ if (expected.environmentName !== undefined) {
238
+ expect(config.environmentName).toBe(expected.environmentName);
239
+ }
240
+ else {
241
+ expect(config.environmentName).toBeDefined();
242
+ }
243
+ expect(output).toMatch(/Deployment completed|Deployment summary/);
244
+ }
245
+ async function verifyDeploymentFlow(cli, mockServer) {
246
+ await cli.expect(/Collected \d+ file/);
247
+ await cli.expect("Upload complete");
248
+ const uploadCall = mockServer.getLastCall("POST", "/v1/deployments/upload");
249
+ expectSuccessfulApiCall(uploadCall);
250
+ await cli.expect("Deployment started");
251
+ const deployCall = mockServer.getLastCall("POST", /\/v1\/environments\/.*\/deploy/);
252
+ expectSuccessfulApiCall(deployCall);
253
+ await cli.expect("View deployment details:");
254
+ await cli.expect(/Deployment completed|Deployment summary/);
255
+ const deploymentStatusCalls = mockServer.getCalls("GET", /\/v1\/deployments\/.*/);
256
+ expect(deploymentStatusCalls.length).toBeGreaterThan(0);
257
+ const envCall = mockServer.getLastCall("GET", /\/v1\/environments\/.*/);
258
+ expectSuccessfulApiCall(envCall);
259
+ }
260
+ function expectSuccessfulApiCall(call, customAssertions) {
261
+ expect(call).toBeDefined();
262
+ expect(call?.responseStatus).toBe(200);
263
+ if (customAssertions && call) {
264
+ customAssertions(call);
265
+ }
266
+ }
267
+ //# 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":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,4 @@
1
+ console.log("Hello from Alpic!");
2
+ module.exports = {};
3
+ export {};
4
+ //# sourceMappingURL=index.js.map
@@ -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,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
+ }
@@ -0,0 +1,313 @@
1
+ import { OpenAPIHandler } from "@orpc/openapi/node";
2
+ import { ORPCError, implement } from "@orpc/server";
3
+ import express, {} from "express";
4
+ import { randomUUID } from "node:crypto";
5
+ import { contract } from "@alpic-ai/api";
6
+ export class MockApiServer {
7
+ server = null;
8
+ app;
9
+ port = null;
10
+ mockData;
11
+ callHistory = [];
12
+ constructor() {
13
+ this.port;
14
+ this.app = express();
15
+ this.mockData = {
16
+ projects: new Map(),
17
+ environments: new Map(),
18
+ deployments: new Map(),
19
+ };
20
+ }
21
+ async start() {
22
+ if (this.server) {
23
+ throw new Error("Server is already running");
24
+ }
25
+ this.configureServer();
26
+ return new Promise((resolve) => {
27
+ this.server = this.app.listen(0, "127.0.0.1", () => {
28
+ const address = this.server.address();
29
+ this.port = address.port;
30
+ const url = `http://127.0.0.1:${this.port}`;
31
+ resolve(url);
32
+ });
33
+ });
34
+ }
35
+ configureServer() {
36
+ this.app.put("/__mock__upload/:token", express.raw({ type: "*/*", limit: "50mb" }), async (req, res) => {
37
+ const apiCall = {
38
+ method: req.method,
39
+ path: req.path,
40
+ timestamp: new Date(),
41
+ input: { token: req.params.token, size: req.body.length },
42
+ responseStatus: 200,
43
+ };
44
+ this.callHistory.push(apiCall);
45
+ res.status(200).end();
46
+ });
47
+ this.app.use(express.json());
48
+ const router = {
49
+ projects: {
50
+ list: {
51
+ v1: implement(contract.projects.list.v1).handler(async () => {
52
+ return Array.from(this.mockData.projects.values()).map((project) => ({
53
+ id: project.id,
54
+ name: project.name,
55
+ teamId: project.teamId,
56
+ environments: project.environments,
57
+ productionEnvironment: project.productionEnvironment,
58
+ sourceRepository: project.sourceRepository,
59
+ runtime: project.runtime,
60
+ transport: project.transport,
61
+ rootDirectory: project.rootDirectory,
62
+ buildCommand: project.buildCommand,
63
+ buildOutputDir: project.buildOutputDir,
64
+ installCommand: project.installCommand,
65
+ startCommand: project.startCommand,
66
+ createdAt: project.createdAt,
67
+ }));
68
+ }),
69
+ },
70
+ get: {
71
+ v1: implement(contract.projects.get.v1).handler(async ({ input }) => {
72
+ const project = this.mockData.projects.get(input.projectId);
73
+ if (!project) {
74
+ throw new ORPCError("NOT_FOUND", { message: "Project not found" });
75
+ }
76
+ return project;
77
+ }),
78
+ },
79
+ create: {
80
+ v1: implement(contract.projects.create.v1).handler(async ({ input }) => {
81
+ const projectId = randomUUID();
82
+ const teamId = "mock-team-id";
83
+ const productionEnvId = randomUUID();
84
+ const productionEnvName = "production";
85
+ const project = {
86
+ id: projectId,
87
+ name: input.name,
88
+ teamId,
89
+ environments: [],
90
+ productionEnvironment: {
91
+ id: productionEnvId,
92
+ name: productionEnvName,
93
+ },
94
+ sourceRepository: input.sourceRepository ?? null,
95
+ runtime: input.runtime,
96
+ transport: input.transport ?? null,
97
+ rootDirectory: input.rootDirectory ?? null,
98
+ buildCommand: input.settings?.buildCommand ?? null,
99
+ buildOutputDir: input.settings?.buildOutputDir ?? null,
100
+ installCommand: input.settings?.installCommand ?? null,
101
+ startCommand: input.settings?.startCommand ?? null,
102
+ createdAt: new Date(),
103
+ };
104
+ const environment = {
105
+ id: productionEnvId,
106
+ name: productionEnvName,
107
+ sourceBranch: null,
108
+ mcpServerUrl: `https://mcp-${projectId}.alpic.ai`,
109
+ domains: [`https://mcp-${projectId}.alpic.ai`],
110
+ createdAt: new Date(),
111
+ projectId,
112
+ };
113
+ this.mockData.environments.set(productionEnvId, environment);
114
+ const fullProject = {
115
+ ...project,
116
+ productionEnvironment: {
117
+ id: productionEnvId,
118
+ name: productionEnvName,
119
+ mcpServerUrl: `https://mcp-${projectId}.alpic.ai`,
120
+ latestDeployment: null,
121
+ },
122
+ environments: [
123
+ {
124
+ id: productionEnvId,
125
+ name: productionEnvName,
126
+ sourceBranch: null,
127
+ mcpServerUrl: `https://mcp-${projectId}.alpic.ai`,
128
+ createdAt: new Date(),
129
+ projectId,
130
+ latestDeployment: null,
131
+ },
132
+ ],
133
+ };
134
+ this.mockData.projects.set(projectId, fullProject);
135
+ return project;
136
+ }),
137
+ },
138
+ },
139
+ environments: {
140
+ get: {
141
+ v1: implement(contract.environments.get.v1).handler(async ({ input }) => {
142
+ const environment = this.mockData.environments.get(input.environmentId);
143
+ if (!environment) {
144
+ throw new ORPCError("NOT_FOUND", { message: "Environment not found" });
145
+ }
146
+ return environment;
147
+ }),
148
+ },
149
+ deploy: {
150
+ v1: implement(contract.environments.deploy.v1).handler(async ({ input }) => {
151
+ const environment = this.mockData.environments.get(input.environmentId);
152
+ if (!environment) {
153
+ throw new ORPCError("NOT_FOUND", { message: "Environment not found" });
154
+ }
155
+ const deploymentId = randomUUID();
156
+ const deployment = {
157
+ id: deploymentId,
158
+ status: "ongoing",
159
+ sourceRef: environment.sourceBranch,
160
+ sourceCommitId: randomUUID().slice(0, 7),
161
+ sourceCommitMessage: "Mock deployment",
162
+ authorUsername: "test-user",
163
+ authorAvatarUrl: null,
164
+ startedAt: new Date(),
165
+ completedAt: null,
166
+ };
167
+ this.mockData.deployments.set(deploymentId, deployment);
168
+ return deployment;
169
+ }),
170
+ },
171
+ },
172
+ deployments: {
173
+ get: {
174
+ v1: implement(contract.deployments.get.v1).handler(async ({ input }) => {
175
+ const deployment = this.mockData.deployments.get(input.deploymentId);
176
+ if (!deployment) {
177
+ throw new ORPCError("NOT_FOUND", { message: "Deployment not found" });
178
+ }
179
+ if (deployment.status === "ongoing" && deployment.startedAt) {
180
+ const elapsed = Date.now() - deployment.startedAt.getTime();
181
+ if (elapsed > 2000) {
182
+ const updatedDeployment = {
183
+ ...deployment,
184
+ status: "deployed",
185
+ completedAt: new Date(),
186
+ };
187
+ this.mockData.deployments.set(input.deploymentId, updatedDeployment);
188
+ return updatedDeployment;
189
+ }
190
+ }
191
+ return deployment;
192
+ }),
193
+ },
194
+ uploadArtifact: {
195
+ v1: implement(contract.deployments.uploadArtifact.v1).handler(async () => {
196
+ const token = randomUUID();
197
+ const baseUrl = `http://127.0.0.1:${this.port}`;
198
+ const uploadUrl = `${baseUrl}/__mock__upload/${token}`;
199
+ return {
200
+ uploadUrl,
201
+ token,
202
+ expiresAt: new Date(Date.now() + 3600000),
203
+ };
204
+ }),
205
+ },
206
+ },
207
+ };
208
+ const handler = new OpenAPIHandler(router);
209
+ this.app.use(async (req, res) => {
210
+ const apiCall = {
211
+ method: req.method,
212
+ path: req.path,
213
+ timestamp: new Date(),
214
+ };
215
+ if (req.body) {
216
+ apiCall.input = req.body;
217
+ }
218
+ const result = await handler.handle(req, res, {
219
+ context: {},
220
+ });
221
+ if (!result.matched) {
222
+ apiCall.responseStatus = 404;
223
+ this.callHistory.push(apiCall);
224
+ res.status(404).json({ error: "Not found" });
225
+ return;
226
+ }
227
+ apiCall.responseStatus = res.statusCode || 200;
228
+ this.callHistory.push(apiCall);
229
+ });
230
+ }
231
+ async stop() {
232
+ return new Promise((resolve, reject) => {
233
+ if (!this.server) {
234
+ resolve();
235
+ return;
236
+ }
237
+ this.server.close((error) => {
238
+ if (error) {
239
+ console.error("[MOCK] Error stopping server:", error);
240
+ reject(error);
241
+ }
242
+ else {
243
+ this.server = null;
244
+ resolve();
245
+ }
246
+ });
247
+ });
248
+ }
249
+ getCalls(method, pathPattern) {
250
+ return this.callHistory.filter((call) => {
251
+ if (method && call.method !== method)
252
+ return false;
253
+ if (pathPattern) {
254
+ if (typeof pathPattern === "string") {
255
+ if (!call.path.includes(pathPattern))
256
+ return false;
257
+ }
258
+ else {
259
+ if (!pathPattern.test(call.path))
260
+ return false;
261
+ }
262
+ }
263
+ return true;
264
+ });
265
+ }
266
+ getLastCall(method, pathPattern) {
267
+ for (let i = this.callHistory.length - 1; i >= 0; i--) {
268
+ const call = this.callHistory[i];
269
+ if (method && call.method !== method)
270
+ continue;
271
+ if (pathPattern) {
272
+ if (typeof pathPattern === "string") {
273
+ if (!call.path.includes(pathPattern))
274
+ continue;
275
+ }
276
+ else {
277
+ if (!pathPattern.test(call.path))
278
+ continue;
279
+ }
280
+ }
281
+ return call;
282
+ }
283
+ return undefined;
284
+ }
285
+ addProject(project) {
286
+ this.mockData.projects.set(project.id, project);
287
+ if (project.productionEnvironment) {
288
+ const env = {
289
+ id: project.productionEnvironment.id,
290
+ name: project.productionEnvironment.name,
291
+ sourceBranch: null,
292
+ mcpServerUrl: project.productionEnvironment.mcpServerUrl,
293
+ domains: [project.productionEnvironment.mcpServerUrl],
294
+ createdAt: new Date(),
295
+ projectId: project.id,
296
+ };
297
+ this.mockData.environments.set(env.id, env);
298
+ }
299
+ for (const env of project.environments) {
300
+ const fullEnv = {
301
+ id: env.id,
302
+ name: env.name,
303
+ sourceBranch: env.sourceBranch,
304
+ mcpServerUrl: env.mcpServerUrl,
305
+ domains: [env.mcpServerUrl],
306
+ createdAt: env.createdAt,
307
+ projectId: project.id,
308
+ };
309
+ this.mockData.environments.set(env.id, fullEnv);
310
+ }
311
+ }
312
+ }
313
+ //# sourceMappingURL=mock-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-server.js","sourceRoot":"","sources":["../../src/__tests__/mock-server.ts"],"names":[],"mappings":"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"}