@frontmcp/testing 0.12.1 → 1.0.0-beta.1
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/assertions/mcp-assertions.d.ts +1 -1
- package/assertions/mcp-assertions.d.ts.map +1 -1
- package/client/mcp-test-client.builder.d.ts +1 -1
- package/client/mcp-test-client.d.ts.map +1 -1
- package/client/mcp-test-client.types.d.ts +3 -3
- package/client/mcp-test-client.types.d.ts.map +1 -1
- package/errors/index.d.ts.map +1 -1
- package/esm/fixtures/index.mjs +239 -36
- package/esm/index.mjs +267 -112
- package/esm/matchers/index.mjs +8 -32
- package/esm/package.json +5 -5
- package/esm/perf/index.mjs +239 -36
- package/esm/setup.mjs +8 -32
- package/example-tools/index.d.ts +1 -1
- package/example-tools/index.d.ts.map +1 -1
- package/example-tools/tool-configs.d.ts +4 -10
- package/example-tools/tool-configs.d.ts.map +1 -1
- package/fixtures/index.js +232 -36
- package/index.d.ts +2 -1
- package/index.d.ts.map +1 -1
- package/index.js +264 -114
- package/matchers/index.js +8 -32
- package/package.json +5 -5
- package/perf/index.js +232 -36
- package/platform/platform-client-info.d.ts +2 -1
- package/platform/platform-client-info.d.ts.map +1 -1
- package/platform/platform-types.d.ts +11 -16
- package/platform/platform-types.d.ts.map +1 -1
- package/playwright/index.d.ts +1 -1
- package/raw-client/index.d.ts +7 -0
- package/raw-client/index.d.ts.map +1 -0
- package/server/index.d.ts +1 -1
- package/server/index.d.ts.map +1 -1
- package/server/port-registry.d.ts +24 -6
- package/server/port-registry.d.ts.map +1 -1
- package/server/test-server.d.ts +1 -1
- package/server/test-server.d.ts.map +1 -1
- package/setup.js +8 -32
- package/ui/ui-assertions.d.ts +3 -4
- package/ui/ui-assertions.d.ts.map +1 -1
- package/ui/ui-matchers.d.ts +1 -2
- package/ui/ui-matchers.d.ts.map +1 -1
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* @description MCP-specific test assertions
|
|
4
4
|
*/
|
|
5
5
|
import type { McpResponse, ToolResultWrapper, ResourceContentWrapper, McpErrorInfo } from '../client';
|
|
6
|
-
import type { Tool, Resource, ResourceTemplate, Prompt, CallToolResult, ReadResourceResult } from '@
|
|
6
|
+
import type { Tool, Resource, ResourceTemplate, Prompt, CallToolResult, ReadResourceResult } from '@frontmcp/protocol';
|
|
7
7
|
/**
|
|
8
8
|
* MCP-specific assertion helpers
|
|
9
9
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-assertions.d.ts","sourceRoot":"","sources":["../../src/assertions/mcp-assertions.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACtG,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"mcp-assertions.d.ts","sourceRoot":"","sources":["../../src/assertions/mcp-assertions.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACtG,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAMvH;;GAEG;AACH,eAAO,MAAM,aAAa;IACxB;;;OAGG;kBACW,CAAC,YAAY,WAAW,CAAC,CAAC,CAAC,YAAY,MAAM,GAAG,CAAC;IAW/D;;;OAGG;gBACS,CAAC,YAAY,WAAW,CAAC,CAAC,CAAC,iBAAiB,MAAM,GAAG,YAAY;IAa7E;;OAEG;8BACuB,iBAAiB,GAAG,WAAW,CAAC,cAAc,CAAC,GAAG,IAAI;IAiBhF;;OAEG;8BAEO,iBAAiB,GAAG,WAAW,CAAC,cAAc,CAAC,QACjD,MAAM,GAAG,OAAO,GAAG,UAAU,GAClC,IAAI;IAkBP;;OAEG;iCAC0B,sBAAsB,GAAG,WAAW,CAAC,kBAAkB,CAAC,GAAG,MAAM;IAwB9F;;OAEG;8BACuB,IAAI,EAAE,QAAQ,MAAM,GAAG,IAAI;IASrD;;OAEG;sCAC+B,QAAQ,EAAE,OAAO,MAAM,GAAG,QAAQ;IASpE;;OAEG;8CACuC,gBAAgB,EAAE,eAAe,MAAM,GAAG,gBAAgB;IASpG;;OAEG;kCAC2B,MAAM,EAAE,QAAQ,MAAM,GAAG,MAAM;CAQ9D,CAAC;AAMF;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAEjE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAE5E;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,gBAAgB,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAEpG;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAEvE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,iBAAiB,GAAG,sBAAsB,GAAG,OAAO,CAExF;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,iBAAiB,GAAG,sBAAsB,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAM1G;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAEjE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,sBAAsB,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAErF"}
|
|
@@ -96,7 +96,7 @@ export declare class McpTestClientBuilder {
|
|
|
96
96
|
* .withCapabilities({
|
|
97
97
|
* sampling: {},
|
|
98
98
|
* experimental: {
|
|
99
|
-
* 'io.modelcontextprotocol/ui': { mimeTypes: ['text/html
|
|
99
|
+
* 'io.modelcontextprotocol/ui': { mimeTypes: ['text/html;profile=mcp-app'] }
|
|
100
100
|
* }
|
|
101
101
|
* })
|
|
102
102
|
* .buildAndConnect();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-test-client.d.ts","sourceRoot":"","sources":["../../src/client/mcp-test-client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,mBAAmB,EAEnB,iBAAiB,EAEjB,iBAAiB,EACjB,sBAAsB,EACtB,mBAAmB,EACnB,QAAQ,EACR,YAAY,EACZ,iBAAiB,EACjB,cAAc,EACd,WAAW,EACX,SAAS,EAET,gBAAgB,EAQhB,IAAI,EACJ,QAAQ,EACR,gBAAgB,EAChB,MAAM,EACN,eAAe,EACf,kBAAkB,EACnB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAGjE,OAAO,KAAK,EAEV,cAAc,EACd,UAAU,EACV,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,gBAAgB,CAAC;AAkBxB,qBAAa,aAAa;IAExB,OAAO,CAAC,QAAQ,CAAC,MAAM,CACkD;IACzE,OAAO,CAAC,SAAS,CAA6B;IAC9C,OAAO,CAAC,UAAU,CAAiC;IACnD,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,cAAc,CAAsB;IAC5C,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,UAAU,CAAgD;IAGlE,OAAO,CAAC,KAAK,CAAkB;IAC/B,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,cAAc,CAA2B;IACjD,OAAO,CAAC,gBAAgB,CAAwB;IAGhD,OAAO,CAAC,aAAa,CAAmB;IAGxC,OAAO,CAAC,mBAAmB,CAAC,CAAqB;gBAMrC,MAAM,EAAE,mBAAmB;IA+BvC;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,mBAAmB,GAAG,oBAAoB;IAQhE;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"mcp-test-client.d.ts","sourceRoot":"","sources":["../../src/client/mcp-test-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* @file mcp-test-client.types.ts
|
|
3
3
|
* @description Type definitions for the MCP Test Client
|
|
4
4
|
*/
|
|
5
|
-
import type { InitializeResult, ListToolsResult, CallToolResult, ListResourcesResult, ReadResourceResult, ListResourceTemplatesResult, ListPromptsResult, GetPromptResult, Tool, Resource, ResourceTemplate, Prompt, Implementation } from '@
|
|
5
|
+
import type { InitializeResult, ListToolsResult, CallToolResult, ListResourcesResult, ReadResourceResult, ListResourceTemplatesResult, ListPromptsResult, GetPromptResult, Tool, Resource, ResourceTemplate, Prompt, Implementation } from '@frontmcp/protocol';
|
|
6
6
|
import type { TestPlatformType } from '../platform/platform-types';
|
|
7
7
|
/**
|
|
8
8
|
* Simplified JSON-RPC request type for testing
|
|
@@ -51,7 +51,7 @@ export declare const MCP_APPS_EXTENSION_KEY: "io.modelcontextprotocol/ui";
|
|
|
51
51
|
* MCP Apps extension capability configuration.
|
|
52
52
|
*/
|
|
53
53
|
export interface McpAppsExtension {
|
|
54
|
-
/** Supported MIME types (e.g., ['text/html
|
|
54
|
+
/** Supported MIME types (e.g., ['text/html;profile=mcp-app']) */
|
|
55
55
|
mimeTypes?: string[];
|
|
56
56
|
}
|
|
57
57
|
/**
|
|
@@ -122,7 +122,7 @@ export interface McpTestClientConfig {
|
|
|
122
122
|
* ```typescript
|
|
123
123
|
* capabilities: {
|
|
124
124
|
* experimental: {
|
|
125
|
-
* 'io.modelcontextprotocol/ui': { mimeTypes: ['text/html
|
|
125
|
+
* 'io.modelcontextprotocol/ui': { mimeTypes: ['text/html;profile=mcp-app'] }
|
|
126
126
|
* }
|
|
127
127
|
* }
|
|
128
128
|
* ```
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-test-client.types.d.ts","sourceRoot":"","sources":["../../src/client/mcp-test-client.types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,EACf,cAAc,EACd,mBAAmB,EACnB,kBAAkB,EAClB,2BAA2B,EAC3B,iBAAiB,EACjB,eAAe,EACf,IAAI,EACJ,QAAQ,EACR,gBAAgB,EAChB,MAAM,EACN,cAAc,EACf,MAAM,
|
|
1
|
+
{"version":3,"file":"mcp-test-client.types.d.ts","sourceRoot":"","sources":["../../src/client/mcp-test-client.types.ts"],"names":[],"mappings":"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"}
|
package/errors/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,qBAAa,eAAgB,SAAQ,KAAK;gBAC5B,OAAO,EAAE,MAAM;CAM5B;AAED;;GAEG;AACH,qBAAa,eAAgB,SAAQ,eAAe;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,qBAAa,eAAgB,SAAQ,KAAK;gBAC5B,OAAO,EAAE,MAAM;CAM5B;AAED;;GAEG;AACH,qBAAa,eAAgB,SAAQ,eAAe;aAGvB,KAAK,CAAC,EAAE,KAAK;gBADtC,OAAO,EAAE,MAAM,EACU,KAAK,CAAC,EAAE,KAAK,YAAA;CAMzC;AAED;;GAEG;AACH,qBAAa,YAAa,SAAQ,eAAe;aAG7B,SAAS,EAAE,MAAM;gBADjC,OAAO,EAAE,MAAM,EACC,SAAS,EAAE,MAAM;CAMpC;AAED;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,eAAe;aAGjC,IAAI,EAAE,MAAM;aACZ,IAAI,CAAC,EAAE,OAAO;gBAF9B,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,OAAO,YAAA;CAMjC;AAED;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,eAAe;aAGxB,KAAK,CAAC,EAAE,KAAK;gBADtC,OAAO,EAAE,MAAM,EACU,KAAK,CAAC,EAAE,KAAK,YAAA;CAMzC;AAED;;GAEG;AACH,qBAAa,cAAe,SAAQ,eAAe;gBACrC,OAAO,EAAE,MAAM;CAK5B"}
|
package/esm/fixtures/index.mjs
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
2
|
+
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
3
|
+
}) : x)(function(x) {
|
|
4
|
+
if (typeof require !== "undefined") return require.apply(this, arguments);
|
|
5
|
+
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
6
|
+
});
|
|
7
|
+
|
|
1
8
|
// libs/testing/src/platform/platform-client-info.ts
|
|
2
9
|
var MCP_APPS_EXTENSION_KEY = "io.modelcontextprotocol/ui";
|
|
3
10
|
function getPlatformClientInfo(platform) {
|
|
@@ -64,7 +71,7 @@ function getPlatformCapabilities(platform) {
|
|
|
64
71
|
...baseCapabilities,
|
|
65
72
|
experimental: {
|
|
66
73
|
[MCP_APPS_EXTENSION_KEY]: {
|
|
67
|
-
mimeTypes: ["text/html
|
|
74
|
+
mimeTypes: ["text/html;profile=mcp-app"]
|
|
68
75
|
}
|
|
69
76
|
}
|
|
70
77
|
};
|
|
@@ -185,7 +192,7 @@ var McpTestClientBuilder = class {
|
|
|
185
192
|
* .withCapabilities({
|
|
186
193
|
* sampling: {},
|
|
187
194
|
* experimental: {
|
|
188
|
-
* 'io.modelcontextprotocol/ui': { mimeTypes: ['text/html
|
|
195
|
+
* 'io.modelcontextprotocol/ui': { mimeTypes: ['text/html;profile=mcp-app'] }
|
|
189
196
|
* }
|
|
190
197
|
* })
|
|
191
198
|
* .buildAndConnect();
|
|
@@ -1167,11 +1174,24 @@ var McpTestClient = class {
|
|
|
1167
1174
|
this.log("debug", `Connecting to ${this.config.baseUrl}...`);
|
|
1168
1175
|
this.transport = this.createTransport();
|
|
1169
1176
|
await this.transport.connect();
|
|
1170
|
-
const
|
|
1171
|
-
|
|
1172
|
-
|
|
1177
|
+
const maxRetries = 3;
|
|
1178
|
+
const retryDelayMs = 500;
|
|
1179
|
+
let lastError;
|
|
1180
|
+
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
|
1181
|
+
const initResponse = await this.initialize();
|
|
1182
|
+
if (initResponse.success && initResponse.data) {
|
|
1183
|
+
this.initResult = initResponse.data;
|
|
1184
|
+
break;
|
|
1185
|
+
}
|
|
1186
|
+
lastError = initResponse.error?.message ?? "Unknown error";
|
|
1187
|
+
if (attempt < maxRetries) {
|
|
1188
|
+
this.log("debug", `MCP init attempt ${attempt} failed (${lastError}), retrying in ${retryDelayMs}ms...`);
|
|
1189
|
+
await new Promise((resolve) => setTimeout(resolve, retryDelayMs));
|
|
1190
|
+
}
|
|
1191
|
+
}
|
|
1192
|
+
if (!this.initResult) {
|
|
1193
|
+
throw new Error(`Failed to initialize MCP connection after ${maxRetries} attempts: ${lastError}`);
|
|
1173
1194
|
}
|
|
1174
|
-
this.initResult = initResponse.data;
|
|
1175
1195
|
this._sessionId = this.transport.getSessionId();
|
|
1176
1196
|
this._sessionInfo = {
|
|
1177
1197
|
id: this._sessionId ?? `session-${Date.now()}`,
|
|
@@ -1862,7 +1882,7 @@ var McpTestClient = class {
|
|
|
1862
1882
|
const raw = response.data ?? { content: [] };
|
|
1863
1883
|
const isError = !response.success || raw.isError === true;
|
|
1864
1884
|
const meta = raw._meta;
|
|
1865
|
-
const hasUI = meta?.["ui/html"] !== void 0 || meta?.["ui/component"] !== void 0
|
|
1885
|
+
const hasUI = meta?.["ui/html"] !== void 0 || meta?.["ui/component"] !== void 0;
|
|
1866
1886
|
const structuredContent = raw["structuredContent"];
|
|
1867
1887
|
return {
|
|
1868
1888
|
raw,
|
|
@@ -2214,6 +2234,7 @@ var TestTokenFactory = class {
|
|
|
2214
2234
|
|
|
2215
2235
|
// libs/testing/src/server/test-server.ts
|
|
2216
2236
|
import { spawn } from "child_process";
|
|
2237
|
+
import { sha256Hex } from "@frontmcp/utils";
|
|
2217
2238
|
|
|
2218
2239
|
// libs/testing/src/errors/index.ts
|
|
2219
2240
|
var TestClientError = class extends Error {
|
|
@@ -2261,9 +2282,16 @@ var E2E_PORT_RANGES = {
|
|
|
2261
2282
|
"demo-e2e-agents": { start: 50270, size: 10 },
|
|
2262
2283
|
"demo-e2e-transport-recreation": { start: 50280, size: 10 },
|
|
2263
2284
|
"demo-e2e-jobs": { start: 50290, size: 10 },
|
|
2264
|
-
// Infrastructure E2E tests (50300-
|
|
2285
|
+
// Infrastructure E2E tests (50300-50409)
|
|
2265
2286
|
"demo-e2e-redis": { start: 50300, size: 10 },
|
|
2266
2287
|
"demo-e2e-serverless": { start: 50310, size: 10 },
|
|
2288
|
+
"demo-e2e-uipack": { start: 50320, size: 10 },
|
|
2289
|
+
"demo-e2e-agent-adapters": { start: 50330, size: 10 },
|
|
2290
|
+
"demo-e2e-guard": { start: 50340, size: 10 },
|
|
2291
|
+
// ESM E2E tests (50400-50449)
|
|
2292
|
+
"esm-package-server": { start: 50400, size: 10 },
|
|
2293
|
+
"esm-package-server-hot-reload": { start: 50410, size: 10 },
|
|
2294
|
+
"esm-package-server-cli": { start: 50420, size: 10 },
|
|
2267
2295
|
// Mock servers and utilities (50900-50999)
|
|
2268
2296
|
"mock-oauth": { start: 50900, size: 10 },
|
|
2269
2297
|
"mock-api": { start: 50910, size: 10 },
|
|
@@ -2335,7 +2363,7 @@ async function tryReservePort(port, project) {
|
|
|
2335
2363
|
server.once("error", () => {
|
|
2336
2364
|
resolve(false);
|
|
2337
2365
|
});
|
|
2338
|
-
server.listen(port,
|
|
2366
|
+
server.listen(port, () => {
|
|
2339
2367
|
reservedPorts.set(port, {
|
|
2340
2368
|
port,
|
|
2341
2369
|
project,
|
|
@@ -2376,7 +2404,7 @@ async function isPortAvailable(port) {
|
|
|
2376
2404
|
server.once("error", () => {
|
|
2377
2405
|
resolve(false);
|
|
2378
2406
|
});
|
|
2379
|
-
server.listen(port,
|
|
2407
|
+
server.listen(port, () => {
|
|
2380
2408
|
server.close(() => {
|
|
2381
2409
|
resolve(true);
|
|
2382
2410
|
});
|
|
@@ -2414,15 +2442,37 @@ var TestServer = class _TestServer {
|
|
|
2414
2442
|
*/
|
|
2415
2443
|
static async start(options) {
|
|
2416
2444
|
const project = options.project ?? "default";
|
|
2417
|
-
const
|
|
2418
|
-
|
|
2419
|
-
|
|
2420
|
-
|
|
2421
|
-
|
|
2422
|
-
|
|
2423
|
-
|
|
2445
|
+
const maxAttempts = 3;
|
|
2446
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
2447
|
+
const { port, release } = await reservePort(project, options.port);
|
|
2448
|
+
const server = new _TestServer(options, port, release);
|
|
2449
|
+
try {
|
|
2450
|
+
await server.startProcess();
|
|
2451
|
+
return server;
|
|
2452
|
+
} catch (error) {
|
|
2453
|
+
try {
|
|
2454
|
+
await server.stop();
|
|
2455
|
+
} catch (cleanupError) {
|
|
2456
|
+
if (options.debug || DEBUG_SERVER) {
|
|
2457
|
+
const msg = cleanupError instanceof Error ? cleanupError.message : String(cleanupError);
|
|
2458
|
+
console.warn(`[TestServer] Cleanup failed after startup error: ${msg}`);
|
|
2459
|
+
}
|
|
2460
|
+
}
|
|
2461
|
+
const isEADDRINUSE = error instanceof Error && (error.message.includes("EADDRINUSE") || server.getLogs().some((l) => l.includes("EADDRINUSE")));
|
|
2462
|
+
if (isEADDRINUSE && attempt < maxAttempts) {
|
|
2463
|
+
const delayMs = attempt * 500;
|
|
2464
|
+
if (options.debug || DEBUG_SERVER) {
|
|
2465
|
+
console.warn(
|
|
2466
|
+
`[TestServer] EADDRINUSE on port ${port}, retrying in ${delayMs}ms (attempt ${attempt}/${maxAttempts})`
|
|
2467
|
+
);
|
|
2468
|
+
}
|
|
2469
|
+
await sleep2(delayMs);
|
|
2470
|
+
continue;
|
|
2471
|
+
}
|
|
2472
|
+
throw error;
|
|
2473
|
+
}
|
|
2424
2474
|
}
|
|
2425
|
-
|
|
2475
|
+
throw new Error(`[TestServer] Failed to start after ${maxAttempts} attempts`);
|
|
2426
2476
|
}
|
|
2427
2477
|
/**
|
|
2428
2478
|
* Start an Nx project as test server
|
|
@@ -2433,22 +2483,44 @@ var TestServer = class _TestServer {
|
|
|
2433
2483
|
`Invalid project name: ${project}. Must contain only alphanumeric, underscore, and hyphen characters.`
|
|
2434
2484
|
);
|
|
2435
2485
|
}
|
|
2436
|
-
const
|
|
2437
|
-
|
|
2438
|
-
|
|
2439
|
-
|
|
2440
|
-
|
|
2441
|
-
|
|
2442
|
-
|
|
2443
|
-
|
|
2444
|
-
|
|
2445
|
-
|
|
2446
|
-
|
|
2447
|
-
|
|
2448
|
-
|
|
2449
|
-
|
|
2486
|
+
const maxAttempts = 3;
|
|
2487
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
2488
|
+
const { port, release } = await reservePort(project, options.port);
|
|
2489
|
+
const serverOptions = {
|
|
2490
|
+
...options,
|
|
2491
|
+
port,
|
|
2492
|
+
project,
|
|
2493
|
+
command: `npx nx serve ${project} --port ${port}`,
|
|
2494
|
+
cwd: options.cwd ?? process.cwd()
|
|
2495
|
+
};
|
|
2496
|
+
const server = new _TestServer(serverOptions, port, release);
|
|
2497
|
+
try {
|
|
2498
|
+
await server.startProcess();
|
|
2499
|
+
return server;
|
|
2500
|
+
} catch (error) {
|
|
2501
|
+
try {
|
|
2502
|
+
await server.stop();
|
|
2503
|
+
} catch (cleanupError) {
|
|
2504
|
+
if (options.debug || DEBUG_SERVER) {
|
|
2505
|
+
const msg = cleanupError instanceof Error ? cleanupError.message : String(cleanupError);
|
|
2506
|
+
console.warn(`[TestServer] Cleanup failed after startup error: ${msg}`);
|
|
2507
|
+
}
|
|
2508
|
+
}
|
|
2509
|
+
const isEADDRINUSE = error instanceof Error && (error.message.includes("EADDRINUSE") || server.getLogs().some((l) => l.includes("EADDRINUSE")));
|
|
2510
|
+
if (isEADDRINUSE && attempt < maxAttempts) {
|
|
2511
|
+
const delayMs = attempt * 500;
|
|
2512
|
+
if (options.debug || DEBUG_SERVER) {
|
|
2513
|
+
console.warn(
|
|
2514
|
+
`[TestServer] EADDRINUSE on port ${port}, retrying in ${delayMs}ms (attempt ${attempt}/${maxAttempts})`
|
|
2515
|
+
);
|
|
2516
|
+
}
|
|
2517
|
+
await sleep2(delayMs);
|
|
2518
|
+
continue;
|
|
2519
|
+
}
|
|
2520
|
+
throw error;
|
|
2521
|
+
}
|
|
2450
2522
|
}
|
|
2451
|
-
|
|
2523
|
+
throw new Error(`[TestServer] Failed to start after ${maxAttempts} attempts`);
|
|
2452
2524
|
}
|
|
2453
2525
|
/**
|
|
2454
2526
|
* Create a test server connected to an already running server
|
|
@@ -2485,7 +2557,21 @@ var TestServer = class _TestServer {
|
|
|
2485
2557
|
}
|
|
2486
2558
|
if (this.process) {
|
|
2487
2559
|
this.log("Stopping server...");
|
|
2488
|
-
this.process.
|
|
2560
|
+
if (this.process.exitCode !== null || this.process.signalCode !== null) {
|
|
2561
|
+
this.log(`Server already exited (code: ${this.process.exitCode}, signal: ${this.process.signalCode})`);
|
|
2562
|
+
this.process = null;
|
|
2563
|
+
return;
|
|
2564
|
+
}
|
|
2565
|
+
const pid = this.process.pid;
|
|
2566
|
+
try {
|
|
2567
|
+
if (pid !== void 0) {
|
|
2568
|
+
process.kill(-pid, "SIGTERM");
|
|
2569
|
+
} else {
|
|
2570
|
+
this.process.kill("SIGTERM");
|
|
2571
|
+
}
|
|
2572
|
+
} catch {
|
|
2573
|
+
this.process.kill("SIGTERM");
|
|
2574
|
+
}
|
|
2489
2575
|
const exitPromise = new Promise((resolve) => {
|
|
2490
2576
|
if (this.process) {
|
|
2491
2577
|
this.process.once("exit", () => resolve());
|
|
@@ -2496,7 +2582,16 @@ var TestServer = class _TestServer {
|
|
|
2496
2582
|
const killTimeout = setTimeout(() => {
|
|
2497
2583
|
if (this.process) {
|
|
2498
2584
|
this.log("Force killing server after timeout...");
|
|
2499
|
-
this.process.
|
|
2585
|
+
const killPid = this.process.pid;
|
|
2586
|
+
try {
|
|
2587
|
+
if (killPid !== void 0) {
|
|
2588
|
+
process.kill(-killPid, "SIGKILL");
|
|
2589
|
+
} else {
|
|
2590
|
+
this.process.kill("SIGKILL");
|
|
2591
|
+
}
|
|
2592
|
+
} catch {
|
|
2593
|
+
this.process.kill("SIGKILL");
|
|
2594
|
+
}
|
|
2500
2595
|
}
|
|
2501
2596
|
}, 5e3);
|
|
2502
2597
|
await exitPromise;
|
|
@@ -2561,14 +2656,17 @@ var TestServer = class _TestServer {
|
|
|
2561
2656
|
...this.options.env,
|
|
2562
2657
|
PORT: String(this.options.port)
|
|
2563
2658
|
};
|
|
2659
|
+
const runtimeEnv = withWorkspaceProtocolFallback(env, this.options.cwd);
|
|
2564
2660
|
if (this.portRelease) {
|
|
2565
2661
|
await this.portRelease();
|
|
2566
2662
|
this.portRelease = null;
|
|
2663
|
+
await sleep2(300);
|
|
2567
2664
|
}
|
|
2568
2665
|
this.process = spawn(this.options.command, [], {
|
|
2569
2666
|
cwd: this.options.cwd,
|
|
2570
|
-
env,
|
|
2667
|
+
env: runtimeEnv,
|
|
2571
2668
|
shell: true,
|
|
2669
|
+
detached: true,
|
|
2572
2670
|
stdio: ["pipe", "pipe", "pipe"]
|
|
2573
2671
|
});
|
|
2574
2672
|
if (this.process.pid !== void 0) {
|
|
@@ -2720,6 +2818,111 @@ TIP: Set DEBUG_SERVER=1 or DEBUG=1 environment variable for verbose output`
|
|
|
2720
2818
|
function sleep2(ms) {
|
|
2721
2819
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
2722
2820
|
}
|
|
2821
|
+
function withWorkspaceProtocolFallback(env, cwd) {
|
|
2822
|
+
if (findInstalledProtocolPackageDir(cwd)) {
|
|
2823
|
+
return env;
|
|
2824
|
+
}
|
|
2825
|
+
try {
|
|
2826
|
+
const workspacePackageDir = findWorkspaceProtocolDir(cwd);
|
|
2827
|
+
if (!workspacePackageDir) {
|
|
2828
|
+
return env;
|
|
2829
|
+
}
|
|
2830
|
+
ensureWorkspaceProtocolLink(cwd, workspacePackageDir);
|
|
2831
|
+
if (findInstalledProtocolPackageDir(cwd)) {
|
|
2832
|
+
return env;
|
|
2833
|
+
}
|
|
2834
|
+
return withProtocolNodePathAlias(env, cwd, workspacePackageDir);
|
|
2835
|
+
} catch (err) {
|
|
2836
|
+
if (DEBUG_SERVER) {
|
|
2837
|
+
console.error(
|
|
2838
|
+
`[TestServer] Workspace protocol fallback failed: ${err instanceof Error ? err.message : String(err)}`
|
|
2839
|
+
);
|
|
2840
|
+
}
|
|
2841
|
+
return env;
|
|
2842
|
+
}
|
|
2843
|
+
}
|
|
2844
|
+
function ensureWorkspaceProtocolLink(cwd, workspacePackageDir) {
|
|
2845
|
+
const fs = __require("node:fs");
|
|
2846
|
+
const path = __require("node:path");
|
|
2847
|
+
const nodeModulesDir = findWorkspaceNodeModulesDir(cwd);
|
|
2848
|
+
if (!nodeModulesDir) {
|
|
2849
|
+
return;
|
|
2850
|
+
}
|
|
2851
|
+
const scopeDir = path.join(nodeModulesDir, "@frontmcp");
|
|
2852
|
+
const aliasPackageDir = path.join(scopeDir, "protocol");
|
|
2853
|
+
if (fs.existsSync(aliasPackageDir)) {
|
|
2854
|
+
return;
|
|
2855
|
+
}
|
|
2856
|
+
fs.mkdirSync(scopeDir, { recursive: true });
|
|
2857
|
+
try {
|
|
2858
|
+
fs.symlinkSync(workspacePackageDir, aliasPackageDir, process.platform === "win32" ? "junction" : "dir");
|
|
2859
|
+
} catch (error) {
|
|
2860
|
+
const err = error;
|
|
2861
|
+
if (err.code !== "EEXIST") {
|
|
2862
|
+
throw error;
|
|
2863
|
+
}
|
|
2864
|
+
}
|
|
2865
|
+
}
|
|
2866
|
+
function withProtocolNodePathAlias(env, cwd, workspacePackageDir) {
|
|
2867
|
+
const fs = __require("node:fs");
|
|
2868
|
+
const os = __require("node:os");
|
|
2869
|
+
const path = __require("node:path");
|
|
2870
|
+
const aliasRoot = path.join(os.tmpdir(), "frontmcp-test-node-path", sha256Hex(cwd).slice(0, 12));
|
|
2871
|
+
const scopeDir = path.join(aliasRoot, "@frontmcp");
|
|
2872
|
+
const aliasPackageDir = path.join(scopeDir, "protocol");
|
|
2873
|
+
fs.mkdirSync(scopeDir, { recursive: true });
|
|
2874
|
+
try {
|
|
2875
|
+
if (!fs.existsSync(aliasPackageDir)) {
|
|
2876
|
+
fs.symlinkSync(workspacePackageDir, aliasPackageDir, process.platform === "win32" ? "junction" : "dir");
|
|
2877
|
+
}
|
|
2878
|
+
} catch (error) {
|
|
2879
|
+
const err = error;
|
|
2880
|
+
if (err.code !== "EEXIST") throw error;
|
|
2881
|
+
}
|
|
2882
|
+
const existingNodePath = env["NODE_PATH"];
|
|
2883
|
+
const nodePathEntries = [aliasRoot, ...existingNodePath ? existingNodePath.split(path.delimiter) : []].filter(
|
|
2884
|
+
Boolean
|
|
2885
|
+
);
|
|
2886
|
+
return {
|
|
2887
|
+
...env,
|
|
2888
|
+
NODE_PATH: [...new Set(nodePathEntries)].join(path.delimiter)
|
|
2889
|
+
};
|
|
2890
|
+
}
|
|
2891
|
+
function findUp(startDir, testFn) {
|
|
2892
|
+
const path = __require("node:path");
|
|
2893
|
+
let currentDir = startDir;
|
|
2894
|
+
while (true) {
|
|
2895
|
+
const result = testFn(currentDir);
|
|
2896
|
+
if (result !== void 0) return result;
|
|
2897
|
+
const parentDir = path.dirname(currentDir);
|
|
2898
|
+
if (parentDir === currentDir) return void 0;
|
|
2899
|
+
currentDir = parentDir;
|
|
2900
|
+
}
|
|
2901
|
+
}
|
|
2902
|
+
function findWorkspaceProtocolDir(startDir) {
|
|
2903
|
+
const fs = __require("node:fs");
|
|
2904
|
+
const path = __require("node:path");
|
|
2905
|
+
return findUp(startDir, (dir) => {
|
|
2906
|
+
const candidate = path.join(dir, "libs", "protocol");
|
|
2907
|
+
return fs.existsSync(path.join(candidate, "dist", "index.js")) ? candidate : void 0;
|
|
2908
|
+
});
|
|
2909
|
+
}
|
|
2910
|
+
function findInstalledProtocolPackageDir(startDir) {
|
|
2911
|
+
const fs = __require("node:fs");
|
|
2912
|
+
const path = __require("node:path");
|
|
2913
|
+
return findUp(startDir, (dir) => {
|
|
2914
|
+
const candidate = path.join(dir, "node_modules", "@frontmcp", "protocol");
|
|
2915
|
+
return fs.existsSync(path.join(candidate, "package.json")) ? candidate : void 0;
|
|
2916
|
+
});
|
|
2917
|
+
}
|
|
2918
|
+
function findWorkspaceNodeModulesDir(startDir) {
|
|
2919
|
+
const fs = __require("node:fs");
|
|
2920
|
+
const path = __require("node:path");
|
|
2921
|
+
return findUp(startDir, (dir) => {
|
|
2922
|
+
const candidate = path.join(dir, "node_modules");
|
|
2923
|
+
return fs.existsSync(candidate) ? candidate : void 0;
|
|
2924
|
+
});
|
|
2925
|
+
}
|
|
2723
2926
|
|
|
2724
2927
|
// libs/testing/src/fixtures/test-fixture.ts
|
|
2725
2928
|
var currentConfig = {};
|