alpic 0.0.0-dev.fdd9dcb → 0.0.0-dev.fe6851f

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 (57) hide show
  1. package/dist/__tests__/deploy.e2e.test.d.ts +1 -0
  2. package/dist/__tests__/deploy.e2e.test.js +260 -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 +23 -0
  8. package/dist/__tests__/mock-server.js +314 -0
  9. package/dist/__tests__/mock-server.js.map +1 -0
  10. package/dist/__tests__/utils.d.ts +36 -0
  11. package/dist/__tests__/utils.js +109 -0
  12. package/dist/__tests__/utils.js.map +1 -0
  13. package/dist/api.d.ts +4 -0
  14. package/dist/api.js +19 -0
  15. package/dist/api.js.map +1 -0
  16. package/dist/commands/deploy.d.ts +9 -0
  17. package/dist/commands/deploy.js +86 -0
  18. package/dist/commands/deploy.js.map +1 -0
  19. package/dist/commands/{hello.d.ts → telemetry/disable.d.ts} +1 -2
  20. package/dist/commands/telemetry/disable.js +14 -0
  21. package/dist/commands/telemetry/disable.js.map +1 -0
  22. package/dist/commands/telemetry/enable.d.ts +5 -0
  23. package/dist/commands/telemetry/enable.js +13 -0
  24. package/dist/commands/telemetry/enable.js.map +1 -0
  25. package/dist/commands/telemetry/status.d.ts +5 -0
  26. package/dist/commands/telemetry/status.js +19 -0
  27. package/dist/commands/telemetry/status.js.map +1 -0
  28. package/dist/lib/archive.d.ts +7 -0
  29. package/dist/lib/archive.js +55 -0
  30. package/dist/lib/archive.js.map +1 -0
  31. package/dist/lib/config.d.ts +11 -0
  32. package/dist/lib/config.js +31 -0
  33. package/dist/lib/config.js.map +1 -0
  34. package/dist/lib/deployment.d.ts +21 -0
  35. package/dist/lib/deployment.js +39 -0
  36. package/dist/lib/deployment.js.map +1 -0
  37. package/dist/lib/global-config.d.ts +9 -0
  38. package/dist/lib/global-config.js +48 -0
  39. package/dist/lib/global-config.js.map +1 -0
  40. package/dist/lib/project.d.ts +67 -0
  41. package/dist/lib/project.js +281 -0
  42. package/dist/lib/project.js.map +1 -0
  43. package/dist/lib/telemetry.d.ts +7 -0
  44. package/dist/lib/telemetry.js +66 -0
  45. package/dist/lib/telemetry.js.map +1 -0
  46. package/dist/lib/upload.d.ts +1 -0
  47. package/dist/lib/upload.js +14 -0
  48. package/dist/lib/upload.js.map +1 -0
  49. package/dist/posthog.d.ts +3 -0
  50. package/dist/posthog.js +10 -0
  51. package/dist/posthog.js.map +1 -0
  52. package/dist/types.d.ts +7 -0
  53. package/dist/types.js +2 -0
  54. package/dist/types.js.map +1 -0
  55. package/package.json +37 -5
  56. package/dist/commands/hello.js +0 -10
  57. package/dist/commands/hello.js.map +0 -1
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,260 @@
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, expectSuccessfulApiCall } 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
+ //# 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,23 @@
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 actualPort;
14
+ private mockData;
15
+ private callHistory;
16
+ constructor();
17
+ start(): Promise<string>;
18
+ private configureServer;
19
+ stop(): Promise<void>;
20
+ getCalls(method?: string, pathPattern?: string | RegExp): ApiCall[];
21
+ getLastCall(method?: string, pathPattern?: string | RegExp): ApiCall | undefined;
22
+ addProject(project: RouterOutput["projects"]["get"]["v1"]): void;
23
+ }
@@ -0,0 +1,314 @@
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
+ actualPort = null;
11
+ mockData;
12
+ callHistory = [];
13
+ constructor() {
14
+ this.port;
15
+ this.app = express();
16
+ this.mockData = {
17
+ projects: new Map(),
18
+ environments: new Map(),
19
+ deployments: new Map(),
20
+ };
21
+ }
22
+ async start() {
23
+ if (this.server) {
24
+ throw new Error("Server is already running");
25
+ }
26
+ this.configureServer();
27
+ return new Promise((resolve) => {
28
+ this.server = this.app.listen(0, "127.0.0.1", () => {
29
+ const address = this.server.address();
30
+ this.port = address.port;
31
+ const url = `http://127.0.0.1:${this.port}`;
32
+ resolve(url);
33
+ });
34
+ });
35
+ }
36
+ configureServer() {
37
+ this.app.put("/__mock__upload/:token", express.raw({ type: "*/*", limit: "50mb" }), async (req, res) => {
38
+ const apiCall = {
39
+ method: req.method,
40
+ path: req.path,
41
+ timestamp: new Date(),
42
+ input: { token: req.params.token, size: req.body.length },
43
+ responseStatus: 200,
44
+ };
45
+ this.callHistory.push(apiCall);
46
+ res.status(200).end();
47
+ });
48
+ this.app.use(express.json());
49
+ const router = {
50
+ projects: {
51
+ list: {
52
+ v1: implement(contract.projects.list.v1).handler(async () => {
53
+ return Array.from(this.mockData.projects.values()).map((project) => ({
54
+ id: project.id,
55
+ name: project.name,
56
+ teamId: project.teamId,
57
+ environments: project.environments,
58
+ productionEnvironment: project.productionEnvironment,
59
+ sourceRepository: project.sourceRepository,
60
+ runtime: project.runtime,
61
+ transport: project.transport,
62
+ rootDirectory: project.rootDirectory,
63
+ buildCommand: project.buildCommand,
64
+ buildOutputDir: project.buildOutputDir,
65
+ installCommand: project.installCommand,
66
+ startCommand: project.startCommand,
67
+ createdAt: project.createdAt,
68
+ }));
69
+ }),
70
+ },
71
+ get: {
72
+ v1: implement(contract.projects.get.v1).handler(async ({ input }) => {
73
+ const project = this.mockData.projects.get(input.projectId);
74
+ if (!project) {
75
+ throw new ORPCError("NOT_FOUND", { message: "Project not found" });
76
+ }
77
+ return project;
78
+ }),
79
+ },
80
+ create: {
81
+ v1: implement(contract.projects.create.v1).handler(async ({ input }) => {
82
+ const projectId = randomUUID();
83
+ const teamId = "mock-team-id";
84
+ const productionEnvId = randomUUID();
85
+ const productionEnvName = "production";
86
+ const project = {
87
+ id: projectId,
88
+ name: input.name,
89
+ teamId,
90
+ environments: [],
91
+ productionEnvironment: {
92
+ id: productionEnvId,
93
+ name: productionEnvName,
94
+ },
95
+ sourceRepository: input.sourceRepository ?? null,
96
+ runtime: input.runtime,
97
+ transport: input.transport ?? null,
98
+ rootDirectory: input.rootDirectory ?? null,
99
+ buildCommand: input.settings?.buildCommand ?? null,
100
+ buildOutputDir: input.settings?.buildOutputDir ?? null,
101
+ installCommand: input.settings?.installCommand ?? null,
102
+ startCommand: input.settings?.startCommand ?? null,
103
+ createdAt: new Date(),
104
+ };
105
+ const environment = {
106
+ id: productionEnvId,
107
+ name: productionEnvName,
108
+ sourceBranch: null,
109
+ mcpServerUrl: `https://mcp-${projectId}.alpic.ai`,
110
+ domains: [`https://mcp-${projectId}.alpic.ai`],
111
+ createdAt: new Date(),
112
+ projectId,
113
+ };
114
+ this.mockData.environments.set(productionEnvId, environment);
115
+ const fullProject = {
116
+ ...project,
117
+ productionEnvironment: {
118
+ id: productionEnvId,
119
+ name: productionEnvName,
120
+ mcpServerUrl: `https://mcp-${projectId}.alpic.ai`,
121
+ latestDeployment: null,
122
+ },
123
+ environments: [
124
+ {
125
+ id: productionEnvId,
126
+ name: productionEnvName,
127
+ sourceBranch: null,
128
+ mcpServerUrl: `https://mcp-${projectId}.alpic.ai`,
129
+ createdAt: new Date(),
130
+ projectId,
131
+ latestDeployment: null,
132
+ },
133
+ ],
134
+ };
135
+ this.mockData.projects.set(projectId, fullProject);
136
+ return project;
137
+ }),
138
+ },
139
+ },
140
+ environments: {
141
+ get: {
142
+ v1: implement(contract.environments.get.v1).handler(async ({ input }) => {
143
+ const environment = this.mockData.environments.get(input.environmentId);
144
+ if (!environment) {
145
+ throw new ORPCError("NOT_FOUND", { message: "Environment not found" });
146
+ }
147
+ return environment;
148
+ }),
149
+ },
150
+ deploy: {
151
+ v1: implement(contract.environments.deploy.v1).handler(async ({ input }) => {
152
+ const environment = this.mockData.environments.get(input.environmentId);
153
+ if (!environment) {
154
+ throw new ORPCError("NOT_FOUND", { message: "Environment not found" });
155
+ }
156
+ const deploymentId = randomUUID();
157
+ const deployment = {
158
+ id: deploymentId,
159
+ status: "ongoing",
160
+ sourceRef: environment.sourceBranch,
161
+ sourceCommitId: randomUUID().slice(0, 7),
162
+ sourceCommitMessage: "Mock deployment",
163
+ authorUsername: "test-user",
164
+ authorAvatarUrl: null,
165
+ startedAt: new Date(),
166
+ completedAt: null,
167
+ };
168
+ this.mockData.deployments.set(deploymentId, deployment);
169
+ return deployment;
170
+ }),
171
+ },
172
+ },
173
+ deployments: {
174
+ get: {
175
+ v1: implement(contract.deployments.get.v1).handler(async ({ input }) => {
176
+ const deployment = this.mockData.deployments.get(input.deploymentId);
177
+ if (!deployment) {
178
+ throw new ORPCError("NOT_FOUND", { message: "Deployment not found" });
179
+ }
180
+ if (deployment.status === "ongoing" && deployment.startedAt) {
181
+ const elapsed = Date.now() - deployment.startedAt.getTime();
182
+ if (elapsed > 2000) {
183
+ const updatedDeployment = {
184
+ ...deployment,
185
+ status: "deployed",
186
+ completedAt: new Date(),
187
+ };
188
+ this.mockData.deployments.set(input.deploymentId, updatedDeployment);
189
+ return updatedDeployment;
190
+ }
191
+ }
192
+ return deployment;
193
+ }),
194
+ },
195
+ uploadArtifact: {
196
+ v1: implement(contract.deployments.uploadArtifact.v1).handler(async () => {
197
+ const token = randomUUID();
198
+ const port = this.actualPort || this.port;
199
+ const baseUrl = `http://127.0.0.1:${port}`;
200
+ const uploadUrl = `${baseUrl}/__mock__upload/${token}`;
201
+ return {
202
+ uploadUrl,
203
+ token,
204
+ expiresAt: new Date(Date.now() + 3600000),
205
+ };
206
+ }),
207
+ },
208
+ },
209
+ };
210
+ const handler = new OpenAPIHandler(router);
211
+ this.app.use(async (req, res) => {
212
+ const apiCall = {
213
+ method: req.method,
214
+ path: req.path,
215
+ timestamp: new Date(),
216
+ };
217
+ if (req.body) {
218
+ apiCall.input = req.body;
219
+ }
220
+ const result = await handler.handle(req, res, {
221
+ context: {},
222
+ });
223
+ if (!result.matched) {
224
+ apiCall.responseStatus = 404;
225
+ this.callHistory.push(apiCall);
226
+ res.status(404).json({ error: "Not found" });
227
+ return;
228
+ }
229
+ apiCall.responseStatus = res.statusCode || 200;
230
+ this.callHistory.push(apiCall);
231
+ });
232
+ }
233
+ async stop() {
234
+ return new Promise((resolve, reject) => {
235
+ if (!this.server) {
236
+ return;
237
+ }
238
+ this.server.close((error) => {
239
+ if (error) {
240
+ console.error("[MOCK] Error stopping server:", error);
241
+ reject(error);
242
+ }
243
+ else {
244
+ this.server = null;
245
+ resolve();
246
+ }
247
+ });
248
+ });
249
+ }
250
+ getCalls(method, pathPattern) {
251
+ return this.callHistory.filter((call) => {
252
+ if (method && call.method !== method)
253
+ return false;
254
+ if (pathPattern) {
255
+ if (typeof pathPattern === "string") {
256
+ if (!call.path.includes(pathPattern))
257
+ return false;
258
+ }
259
+ else {
260
+ if (!pathPattern.test(call.path))
261
+ return false;
262
+ }
263
+ }
264
+ return true;
265
+ });
266
+ }
267
+ getLastCall(method, pathPattern) {
268
+ for (let i = this.callHistory.length - 1; i >= 0; i--) {
269
+ const call = this.callHistory[i];
270
+ if (method && call.method !== method)
271
+ continue;
272
+ if (pathPattern) {
273
+ if (typeof pathPattern === "string") {
274
+ if (!call.path.includes(pathPattern))
275
+ continue;
276
+ }
277
+ else {
278
+ if (!pathPattern.test(call.path))
279
+ continue;
280
+ }
281
+ }
282
+ return call;
283
+ }
284
+ return undefined;
285
+ }
286
+ addProject(project) {
287
+ this.mockData.projects.set(project.id, project);
288
+ if (project.productionEnvironment) {
289
+ const env = {
290
+ id: project.productionEnvironment.id,
291
+ name: project.productionEnvironment.name,
292
+ sourceBranch: null,
293
+ mcpServerUrl: project.productionEnvironment.mcpServerUrl,
294
+ domains: [project.productionEnvironment.mcpServerUrl],
295
+ createdAt: new Date(),
296
+ projectId: project.id,
297
+ };
298
+ this.mockData.environments.set(env.id, env);
299
+ }
300
+ for (const env of project.environments) {
301
+ const fullEnv = {
302
+ id: env.id,
303
+ name: env.name,
304
+ sourceBranch: env.sourceBranch,
305
+ mcpServerUrl: env.mcpServerUrl,
306
+ domains: [env.mcpServerUrl],
307
+ createdAt: env.createdAt,
308
+ projectId: project.id,
309
+ };
310
+ this.mockData.environments.set(env.id, fullEnv);
311
+ }
312
+ }
313
+ }
314
+ //# sourceMappingURL=mock-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-server.js","sourceRoot":"","sources":["../../src/__tests__/mock-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,OAAO,EAAE,EAA6C,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAIzC,OAAO,EAAqB,QAAQ,EAAE,MAAM,eAAe,CAAC;AAgB5D,MAAM,OAAO,aAAa;IAChB,MAAM,GAAkB,IAAI,CAAC;IAC7B,GAAG,CAAU;IACb,IAAI,GAAkB,IAAI,CAAC;IAC3B,UAAU,GAAkB,IAAI,CAAC;IACjC,QAAQ,CAAW;IACnB,WAAW,GAAc,EAAE,CAAC;IAEpC;QACE,IAAI,CAAC,IAAI,CAAC;QACV,IAAI,CAAC,GAAG,GAAG,OAAO,EAAE,CAAC;QACrB,IAAI,CAAC,QAAQ,GAAG;YACd,QAAQ,EAAE,IAAI,GAAG,EAAE;YACnB,YAAY,EAAE,IAAI,GAAG,EAAE;YACvB,WAAW,EAAE,IAAI,GAAG,EAAE;SACvB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC/C,CAAC;QAED,IAAI,CAAC,eAAe,EAAE,CAAC;QAEvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE;gBACjD,MAAM,OAAO,GAAG,IAAI,CAAC,MAAO,CAAC,OAAO,EAAiB,CAAC;gBACtD,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;gBACzB,MAAM,GAAG,GAAG,oBAAoB,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC5C,OAAO,CAAC,GAAG,CAAC,CAAC;YACf,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,eAAe;QACrB,IAAI,CAAC,GAAG,CAAC,GAAG,CACV,wBAAwB,EACxB,OAAO,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAC3C,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;YACpC,MAAM,OAAO,GAAY;gBACvB,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,SAAS,EAAE,IAAI,IAAI,EAAE;gBACrB,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAG,GAAG,CAAC,IAAe,CAAC,MAAM,EAAE;gBACrE,cAAc,EAAE,GAAG;aACpB,CAAC;YACF,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC/B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QACxB,CAAC,CACF,CAAC;QAEF,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAE7B,MAAM,MAAM,GAAG;YACb,QAAQ,EAAE;gBACR,IAAI,EAAE;oBACJ,EAAE,EAAE,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE;wBAC1D,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;4BACnE,EAAE,EAAE,OAAO,CAAC,EAAE;4BACd,IAAI,EAAE,OAAO,CAAC,IAAI;4BAClB,MAAM,EAAE,OAAO,CAAC,MAAM;4BACtB,YAAY,EAAE,OAAO,CAAC,YAAY;4BAClC,qBAAqB,EAAE,OAAO,CAAC,qBAAqB;4BACpD,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;4BAC1C,OAAO,EAAE,OAAO,CAAC,OAAO;4BACxB,SAAS,EAAE,OAAO,CAAC,SAAS;4BAC5B,aAAa,EAAE,OAAO,CAAC,aAAa;4BACpC,YAAY,EAAE,OAAO,CAAC,YAAY;4BAClC,cAAc,EAAE,OAAO,CAAC,cAAc;4BACtC,cAAc,EAAE,OAAO,CAAC,cAAc;4BACtC,YAAY,EAAE,OAAO,CAAC,YAAY;4BAClC,SAAS,EAAE,OAAO,CAAC,SAAS;yBAC7B,CAAC,CAAC,CAAC;oBACN,CAAC,CAAC;iBACH;gBACD,GAAG,EAAE;oBACH,EAAE,EAAE,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;wBAClE,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;wBAC5D,IAAI,CAAC,OAAO,EAAE,CAAC;4BACb,MAAM,IAAI,SAAS,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC,CAAC;wBACrE,CAAC;wBACD,OAAO,OAAO,CAAC;oBACjB,CAAC,CAAC;iBACH;gBACD,MAAM,EAAE;oBACN,EAAE,EAAE,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;wBACrE,MAAM,SAAS,GAAG,UAAU,EAAE,CAAC;wBAC/B,MAAM,MAAM,GAAG,cAAc,CAAC;wBAC9B,MAAM,eAAe,GAAG,UAAU,EAAE,CAAC;wBACrC,MAAM,iBAAiB,GAAG,YAAY,CAAC;wBAEvC,MAAM,OAAO,GAA6C;4BACxD,EAAE,EAAE,SAAS;4BACb,IAAI,EAAE,KAAK,CAAC,IAAI;4BAChB,MAAM;4BACN,YAAY,EAAE,EAAE;4BAChB,qBAAqB,EAAE;gCACrB,EAAE,EAAE,eAAe;gCACnB,IAAI,EAAE,iBAAiB;6BACxB;4BACD,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,IAAI,IAAI;4BAChD,OAAO,EAAE,KAAK,CAAC,OAAO;4BACtB,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,IAAI;4BAClC,aAAa,EAAE,KAAK,CAAC,aAAa,IAAI,IAAI;4BAC1C,YAAY,EAAE,KAAK,CAAC,QAAQ,EAAE,YAAY,IAAI,IAAI;4BAClD,cAAc,EAAE,KAAK,CAAC,QAAQ,EAAE,cAAc,IAAI,IAAI;4BACtD,cAAc,EAAE,KAAK,CAAC,QAAQ,EAAE,cAAc,IAAI,IAAI;4BACtD,YAAY,EAAE,KAAK,CAAC,QAAQ,EAAE,YAAY,IAAI,IAAI;4BAClD,SAAS,EAAE,IAAI,IAAI,EAAE;yBACtB,CAAC;wBAEF,MAAM,WAAW,GAA8C;4BAC7D,EAAE,EAAE,eAAe;4BACnB,IAAI,EAAE,iBAAiB;4BACvB,YAAY,EAAE,IAAI;4BAClB,YAAY,EAAE,eAAe,SAAS,WAAW;4BACjD,OAAO,EAAE,CAAC,eAAe,SAAS,WAAW,CAAC;4BAC9C,SAAS,EAAE,IAAI,IAAI,EAAE;4BACrB,SAAS;yBACV,CAAC;wBACF,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC;wBAE7D,MAAM,WAAW,GAA0C;4BACzD,GAAG,OAAO;4BACV,qBAAqB,EAAE;gCACrB,EAAE,EAAE,eAAe;gCACnB,IAAI,EAAE,iBAAiB;gCACvB,YAAY,EAAE,eAAe,SAAS,WAAW;gCACjD,gBAAgB,EAAE,IAAI;6BACvB;4BACD,YAAY,EAAE;gCACZ;oCACE,EAAE,EAAE,eAAe;oCACnB,IAAI,EAAE,iBAAiB;oCACvB,YAAY,EAAE,IAAI;oCAClB,YAAY,EAAE,eAAe,SAAS,WAAW;oCACjD,SAAS,EAAE,IAAI,IAAI,EAAE;oCACrB,SAAS;oCACT,gBAAgB,EAAE,IAAI;iCACvB;6BACF;yBACF,CAAC;wBACF,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;wBAEnD,OAAO,OAAO,CAAC;oBACjB,CAAC,CAAC;iBACH;aACF;YACD,YAAY,EAAE;gBACZ,GAAG,EAAE;oBACH,EAAE,EAAE,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;wBACtE,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;wBACxE,IAAI,CAAC,WAAW,EAAE,CAAC;4BACjB,MAAM,IAAI,SAAS,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,uBAAuB,EAAE,CAAC,CAAC;wBACzE,CAAC;wBACD,OAAO,WAAW,CAAC;oBACrB,CAAC,CAAC;iBACH;gBACD,MAAM,EAAE;oBACN,EAAE,EAAE,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;wBACzE,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;wBACxE,IAAI,CAAC,WAAW,EAAE,CAAC;4BACjB,MAAM,IAAI,SAAS,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,uBAAuB,EAAE,CAAC,CAAC;wBACzE,CAAC;wBAED,MAAM,YAAY,GAAG,UAAU,EAAE,CAAC;wBAClC,MAAM,UAAU,GAA6C;4BAC3D,EAAE,EAAE,YAAY;4BAChB,MAAM,EAAE,SAAS;4BACjB,SAAS,EAAE,WAAW,CAAC,YAAY;4BACnC,cAAc,EAAE,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;4BACxC,mBAAmB,EAAE,iBAAiB;4BACtC,cAAc,EAAE,WAAW;4BAC3B,eAAe,EAAE,IAAI;4BACrB,SAAS,EAAE,IAAI,IAAI,EAAE;4BACrB,WAAW,EAAE,IAAI;yBAClB,CAAC;wBAEF,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;wBAExD,OAAO,UAAU,CAAC;oBACpB,CAAC,CAAC;iBACH;aACF;YACD,WAAW,EAAE;gBACX,GAAG,EAAE;oBACH,EAAE,EAAE,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;wBACrE,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;wBACrE,IAAI,CAAC,UAAU,EAAE,CAAC;4BAChB,MAAM,IAAI,SAAS,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC,CAAC;wBACxE,CAAC;wBACD,IAAI,UAAU,CAAC,MAAM,KAAK,SAAS,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;4BAC5D,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;4BAC5D,IAAI,OAAO,GAAG,IAAI,EAAE,CAAC;gCACnB,MAAM,iBAAiB,GAA6C;oCAClE,GAAG,UAAU;oCACb,MAAM,EAAE,UAAU;oCAClB,WAAW,EAAE,IAAI,IAAI,EAAE;iCACxB,CAAC;gCACF,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC;gCACrE,OAAO,iBAAiB,CAAC;4BAC3B,CAAC;wBACH,CAAC;wBACD,OAAO,UAAU,CAAC;oBACpB,CAAC,CAAC;iBACH;gBACD,cAAc,EAAE;oBACd,EAAE,EAAE,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE;wBACvE,MAAM,KAAK,GAAG,UAAU,EAAE,CAAC;wBAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC;wBAC1C,MAAM,OAAO,GAAG,oBAAoB,IAAI,EAAE,CAAC;wBAC3C,MAAM,SAAS,GAAG,GAAG,OAAO,mBAAmB,KAAK,EAAE,CAAC;wBACvD,OAAO;4BACL,SAAS;4BACT,KAAK;4BACL,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;yBAC1C,CAAC;oBACJ,CAAC,CAAC;iBACH;aACF;SACF,CAAC;QAEF,MAAM,OAAO,GAAG,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;QAE3C,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;YACjD,MAAM,OAAO,GAAY;gBACvB,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,SAAS,EAAE,IAAI,IAAI,EAAE;aACtB,CAAC;YAEF,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC;YAC3B,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE;gBAC5C,OAAO,EAAE,EAAE;aACZ,CAAC,CAAC;YAEH,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,OAAO,CAAC,cAAc,GAAG,GAAG,CAAC;gBAC7B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC/B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;gBAC7C,OAAO;YACT,CAAC;YAED,OAAO,CAAC,cAAc,GAAG,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC;YAC/C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI;QACR,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACjB,OAAO;YACT,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;gBAC1B,IAAI,KAAK,EAAE,CAAC;oBACV,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;oBACtD,MAAM,CAAC,KAAK,CAAC,CAAC;gBAChB,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;oBACnB,OAAO,EAAE,CAAC;gBACZ,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,QAAQ,CAAC,MAAe,EAAE,WAA6B;QACrD,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;YACtC,IAAI,MAAM,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM;gBAAE,OAAO,KAAK,CAAC;YACnD,IAAI,WAAW,EAAE,CAAC;gBAChB,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;oBACpC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;wBAAE,OAAO,KAAK,CAAC;gBACrD,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;wBAAE,OAAO,KAAK,CAAC;gBACjD,CAAC;YACH,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC;IAED,WAAW,CAAC,MAAe,EAAE,WAA6B;QACxD,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACtD,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAE,CAAC;YAElC,IAAI,MAAM,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM;gBAAE,SAAS;YAC/C,IAAI,WAAW,EAAE,CAAC;gBAChB,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;oBACpC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;wBAAE,SAAS;gBACjD,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;wBAAE,SAAS;gBAC7C,CAAC;YACH,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,UAAU,CAAC,OAA8C;QACvD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QAChD,IAAI,OAAO,CAAC,qBAAqB,EAAE,CAAC;YAClC,MAAM,GAAG,GAA8C;gBACrD,EAAE,EAAE,OAAO,CAAC,qBAAqB,CAAC,EAAE;gBACpC,IAAI,EAAE,OAAO,CAAC,qBAAqB,CAAC,IAAI;gBACxC,YAAY,EAAE,IAAI;gBAClB,YAAY,EAAE,OAAO,CAAC,qBAAqB,CAAC,YAAY;gBACxD,OAAO,EAAE,CAAC,OAAO,CAAC,qBAAqB,CAAC,YAAY,CAAC;gBACrD,SAAS,EAAE,IAAI,IAAI,EAAE;gBACrB,SAAS,EAAE,OAAO,CAAC,EAAE;aACtB,CAAC;YACF,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QAC9C,CAAC;QACD,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;YACvC,MAAM,OAAO,GAA8C;gBACzD,EAAE,EAAE,GAAG,CAAC,EAAE;gBACV,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,YAAY,EAAE,GAAG,CAAC,YAAY;gBAC9B,YAAY,EAAE,GAAG,CAAC,YAAY;gBAC9B,OAAO,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC;gBAC3B,SAAS,EAAE,GAAG,CAAC,SAAS;gBACxB,SAAS,EAAE,OAAO,CAAC,EAAE;aACtB,CAAC;YACF,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;CACF"}