mcp4openapi 0.2.7 → 0.2.8

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 (38) hide show
  1. package/README.md +4 -0
  2. package/dist/src/generated-schemas.d.ts +36 -0
  3. package/dist/src/generated-schemas.d.ts.map +1 -1
  4. package/dist/src/generated-schemas.js +3 -1
  5. package/dist/src/generated-schemas.js.map +1 -1
  6. package/dist/src/http-transport.d.ts.map +1 -1
  7. package/dist/src/http-transport.js +34 -11
  8. package/dist/src/http-transport.js.map +1 -1
  9. package/dist/src/index.js +25 -11
  10. package/dist/src/index.js.map +1 -1
  11. package/dist/src/interceptors.d.ts.map +1 -1
  12. package/dist/src/interceptors.js +6 -6
  13. package/dist/src/interceptors.js.map +1 -1
  14. package/dist/src/logger.d.ts +0 -12
  15. package/dist/src/logger.d.ts.map +1 -1
  16. package/dist/src/logger.js +67 -75
  17. package/dist/src/logger.js.map +1 -1
  18. package/dist/src/mcp-server.d.ts +12 -2
  19. package/dist/src/mcp-server.d.ts.map +1 -1
  20. package/dist/src/mcp-server.js +125 -10
  21. package/dist/src/mcp-server.js.map +1 -1
  22. package/dist/src/naming-warnings.js +6 -6
  23. package/dist/src/naming-warnings.js.map +1 -1
  24. package/dist/src/proxy-executor.d.ts +17 -2
  25. package/dist/src/proxy-executor.d.ts.map +1 -1
  26. package/dist/src/proxy-executor.js +298 -48
  27. package/dist/src/proxy-executor.js.map +1 -1
  28. package/dist/src/testing/listen-support.d.ts +3 -0
  29. package/dist/src/testing/listen-support.d.ts.map +1 -0
  30. package/dist/src/testing/listen-support.js +50 -0
  31. package/dist/src/testing/listen-support.js.map +1 -0
  32. package/dist/src/testing/mock-youtrack-server.d.ts.map +1 -1
  33. package/dist/src/testing/mock-youtrack-server.js +14 -0
  34. package/dist/src/testing/mock-youtrack-server.js.map +1 -1
  35. package/dist/src/types/profile.d.ts +18 -0
  36. package/dist/src/types/profile.d.ts.map +1 -1
  37. package/package.json +1 -1
  38. package/profile-schema.json +12 -0
@@ -7,6 +7,10 @@
7
7
  */
8
8
  import type { ProxyDownloadOperation } from './types/profile.js';
9
9
  import type { ResponseContext, AuthCredentials } from './interceptors.js';
10
+ export interface DebugLogger {
11
+ debug(message: string, context?: Record<string, unknown>): void;
12
+ warn?(message: string, context?: Record<string, unknown>): void;
13
+ }
10
14
  export interface HttpClient {
11
15
  request(method: string, url: string, options?: {
12
16
  headers?: Record<string, string>;
@@ -28,7 +32,8 @@ export interface ProxyDownloadResult {
28
32
  }
29
33
  export declare class ProxyDownloadExecutor {
30
34
  private httpClient;
31
- constructor(httpClient: HttpClient);
35
+ private logger;
36
+ constructor(httpClient: HttpClient, logger?: DebugLogger);
32
37
  /**
33
38
  * Execute proxy download operation
34
39
  *
@@ -51,7 +56,9 @@ export declare class ProxyDownloadExecutor {
51
56
  private extractNestedString;
52
57
  private extractNestedNumber;
53
58
  private extractNestedValue;
54
- private buildAbsoluteUrl;
59
+ private getBaseOrigin;
60
+ private resolveHttpUrl;
61
+ private enforceDownloadPolicy;
55
62
  /**
56
63
  * Check if MIME type matches whitelist (supports wildcards like 'image/*')
57
64
  */
@@ -63,6 +70,14 @@ export declare class ProxyDownloadExecutor {
63
70
  * Metadata endpoint still requires auth, only the final download is unauthenticated
64
71
  */
65
72
  private downloadWithAuth;
73
+ private buildDownloadUrlWithOptionalQueryAuth;
74
+ private isRedirectStatus;
75
+ private resolveRedirectTarget;
76
+ private enforceAllowedDownloadTarget;
77
+ private lookupAllIpAddresses;
78
+ private isAllowedHost;
79
+ private isDisallowedIPv4;
80
+ private isDisallowedIPv6;
66
81
  /**
67
82
  * Handle inline data URLs (data:mime;base64,...)
68
83
  */
@@ -1 +1 @@
1
- {"version":3,"file":"proxy-executor.d.ts","sourceRoot":"","sources":["../../src/proxy-executor.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAG1E,MAAM,WAAW,UAAU;IACzB,OAAO,CACL,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE;QACR,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACjC,IAAI,CAAC,EAAE,OAAO,CAAC;KAChB,GACA,OAAO,CAAC,eAAe,CAAC,CAAC;IAC5B,UAAU,IAAI,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IAClC,iCAAiC;IACjC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAElC,kCAAkC;IAClC,OAAO,EAAE,MAAM,CAAC;IAEhB,4BAA4B;IAC5B,QAAQ,EAAE,MAAM,CAAC;IAEjB,yBAAyB;IACzB,IAAI,EAAE,MAAM,CAAC;IAEb,qCAAqC;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAKD,qBAAa,qBAAqB;IACpB,OAAO,CAAC,UAAU;gBAAV,UAAU,EAAE,UAAU;IAE1C;;;;;;OAMG;IACG,OAAO,CACX,SAAS,EAAE,sBAAsB,EACjC,eAAe,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EACjD,eAAe,EAAE,eAAe,EAChC,qBAAqB,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GACvD,OAAO,CAAC,mBAAmB,CAAC;IAsH/B,OAAO,CAAC,cAAc;IAyBtB;;OAEG;IACH,OAAO,CAAC,UAAU;IAclB,OAAO,CAAC,mBAAmB;IAK3B,OAAO,CAAC,mBAAmB;IAK3B,OAAO,CAAC,kBAAkB;IAY1B,OAAO,CAAC,gBAAgB;IAQxB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAUzB;;;;;OAKG;YACW,gBAAgB;IA0E9B;;OAEG;IACH,OAAO,CAAC,mBAAmB;CAa5B"}
1
+ {"version":3,"file":"proxy-executor.d.ts","sourceRoot":"","sources":["../../src/proxy-executor.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAK1E,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAChE,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CACjE;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,CACL,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE;QACR,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACjC,IAAI,CAAC,EAAE,OAAO,CAAC;KAChB,GACA,OAAO,CAAC,eAAe,CAAC,CAAC;IAC5B,UAAU,IAAI,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IAClC,iCAAiC;IACjC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAElC,kCAAkC;IAClC,OAAO,EAAE,MAAM,CAAC;IAEhB,4BAA4B;IAC5B,QAAQ,EAAE,MAAM,CAAC;IAEjB,yBAAyB;IACzB,IAAI,EAAE,MAAM,CAAC;IAEb,qCAAqC;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAMD,qBAAa,qBAAqB;IAE9B,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,MAAM;gBADN,UAAU,EAAE,UAAU,EACtB,MAAM,GAAE,WAAiC;IAGnD;;;;;;OAMG;IACG,OAAO,CACX,SAAS,EAAE,sBAAsB,EACjC,eAAe,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EACjD,eAAe,EAAE,eAAe,EAChC,qBAAqB,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GACvD,OAAO,CAAC,mBAAmB,CAAC;IA6H/B,OAAO,CAAC,cAAc;IAyBtB;;OAEG;IACH,OAAO,CAAC,UAAU;IAclB,OAAO,CAAC,mBAAmB;IAK3B,OAAO,CAAC,mBAAmB;IAK3B,OAAO,CAAC,kBAAkB;IAY1B,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,cAAc;YA6CR,qBAAqB;IAuBnC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAUzB;;;;;OAKG;YACW,gBAAgB;IAqG9B,OAAO,CAAC,qCAAqC;IAiB7C,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,qBAAqB;YAef,4BAA4B;YAsE5B,oBAAoB;IAkClC,OAAO,CAAC,aAAa;IAgBrB,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,gBAAgB;IAWxB;;OAEG;IACH,OAAO,CAAC,mBAAmB;CAa5B"}
@@ -6,11 +6,15 @@
6
6
  * and returns base64-encoded result.
7
7
  */
8
8
  import { NetworkError, ValidationError } from './errors.js';
9
+ import { isIP } from 'node:net';
10
+ import { lookup } from 'node:dns/promises';
9
11
  const DEFAULT_MAX_SIZE = 10 * 1024 * 1024; // 10MB
10
12
  const DEFAULT_TIMEOUT = 30000; // 30s
13
+ const MAX_REDIRECTS = 5;
11
14
  export class ProxyDownloadExecutor {
12
- constructor(httpClient) {
15
+ constructor(httpClient, logger = { debug: () => { } }) {
13
16
  this.httpClient = httpClient;
17
+ this.logger = logger;
14
18
  }
15
19
  /**
16
20
  * Execute proxy download operation
@@ -23,6 +27,7 @@ export class ProxyDownloadExecutor {
23
27
  const maxSize = this.resolveMaxSize(operation);
24
28
  const timeout = operation.timeout_ms ?? DEFAULT_TIMEOUT;
25
29
  const urlField = operation.url_field ?? 'url';
30
+ const baseOrigin = this.getBaseOrigin();
26
31
  // Step 1: Fetch metadata
27
32
  const metadataResponse = await this.httpClient.request(metadataRequest.method, metadataRequest.path);
28
33
  const metadata = metadataResponse.body;
@@ -38,9 +43,9 @@ export class ProxyDownloadExecutor {
38
43
  'application/octet-stream';
39
44
  // Step 2A: Direct download endpoint path (preferred when configured)
40
45
  if (directDownloadRequest) {
41
- const downloadUrl = this.buildAbsoluteUrl(directDownloadRequest.path);
42
46
  const skipAuth = operation.skip_auth ?? false;
43
- const { content, size, mimeType } = await this.downloadWithAuth(downloadUrl, authCredentials, maxSize, timeout, skipAuth, directDownloadRequest.method);
47
+ const downloadUrl = this.resolveHttpUrl(directDownloadRequest.path);
48
+ const { content, size, mimeType } = await this.downloadWithAuth(downloadUrl, authCredentials, maxSize, timeout, baseOrigin, skipAuth, directDownloadRequest.method, operation);
44
49
  if (reportedSize && reportedSize > maxSize) {
45
50
  throw new ValidationError(`File size ${reportedSize} exceeds maximum ${maxSize} bytes`);
46
51
  }
@@ -86,7 +91,8 @@ export class ProxyDownloadExecutor {
86
91
  };
87
92
  }
88
93
  const skipAuth = operation.skip_auth ?? false;
89
- const { content, size, mimeType: responseMime } = await this.downloadWithAuth(url, authCredentials, maxSize, timeout, skipAuth);
94
+ const downloadUrl = this.resolveHttpUrl(url);
95
+ const { content, size, mimeType: responseMime } = await this.downloadWithAuth(downloadUrl, authCredentials, maxSize, timeout, baseOrigin, skipAuth, 'GET', operation);
90
96
  return {
91
97
  metadata,
92
98
  content,
@@ -145,12 +151,68 @@ export class ProxyDownloadExecutor {
145
151
  }
146
152
  return current;
147
153
  }
148
- buildAbsoluteUrl(path) {
149
- if (/^https?:\/\//i.test(path)) {
150
- return path;
154
+ getBaseOrigin() {
155
+ try {
156
+ return new URL(this.httpClient.getBaseUrl()).origin;
157
+ }
158
+ catch {
159
+ throw new ValidationError('Invalid API base URL - expected absolute http(s) URL');
160
+ }
161
+ }
162
+ resolveHttpUrl(input) {
163
+ // Absolute URL
164
+ let absoluteUrl;
165
+ try {
166
+ absoluteUrl = new URL(input);
167
+ }
168
+ catch (error) {
169
+ this.logger.debug('resolveHttpUrl: input is not an absolute URL, resolving relative', {
170
+ error: error instanceof Error ? error.message : String(error),
171
+ });
172
+ }
173
+ if (absoluteUrl) {
174
+ if (absoluteUrl.protocol === 'http:' || absoluteUrl.protocol === 'https:') {
175
+ return absoluteUrl.toString();
176
+ }
177
+ throw new ValidationError(`Unsupported download URL scheme: '${absoluteUrl.protocol}'`);
151
178
  }
152
179
  const baseUrl = this.httpClient.getBaseUrl();
153
- return `${baseUrl}${path}`;
180
+ let base;
181
+ try {
182
+ base = new URL(baseUrl);
183
+ }
184
+ catch {
185
+ throw new ValidationError('Invalid API base URL - expected absolute http(s) URL');
186
+ }
187
+ if (base.protocol !== 'http:' && base.protocol !== 'https:') {
188
+ throw new ValidationError(`Unsupported API base URL scheme: '${base.protocol}'`);
189
+ }
190
+ try {
191
+ if (input.startsWith('/')) {
192
+ // Preserve base URL path segments (e.g., https://host/api/v4 + /projects -> https://host/api/v4/projects)
193
+ const combined = `${baseUrl.replace(/\/$/, '')}${input}`;
194
+ return new URL(combined).toString();
195
+ }
196
+ // Relative (no leading slash) uses URL resolution semantics
197
+ const baseForRelative = baseUrl.endsWith('/') ? baseUrl : `${baseUrl}/`;
198
+ return new URL(input, baseForRelative).toString();
199
+ }
200
+ catch {
201
+ throw new ValidationError(`Invalid download URL: '${input}'`);
202
+ }
203
+ }
204
+ async enforceDownloadPolicy(downloadUrl, baseOrigin, operation, skipAuth) {
205
+ const downloadOrigin = new URL(downloadUrl).origin;
206
+ if (!skipAuth) {
207
+ if (downloadOrigin !== baseOrigin) {
208
+ throw new ValidationError(`Cross-origin download URL not allowed with authentication (base origin '${baseOrigin}', download origin '${downloadOrigin}'). Set skip_auth=true or use a same-origin download endpoint.`);
209
+ }
210
+ return;
211
+ }
212
+ // With skip_auth, allow same-origin without additional restrictions
213
+ if (downloadOrigin === baseOrigin)
214
+ return;
215
+ await this.enforceAllowedDownloadTarget(downloadUrl, operation);
154
216
  }
155
217
  /**
156
218
  * Check if MIME type matches whitelist (supports wildcards like 'image/*')
@@ -170,56 +232,244 @@ export class ProxyDownloadExecutor {
170
232
  * @param skipAuth If true, download URL is fetched without authentication headers/params
171
233
  * Metadata endpoint still requires auth, only the final download is unauthenticated
172
234
  */
173
- async downloadWithAuth(url, authCredentials, maxSize, timeout, skipAuth = false, method = 'GET') {
235
+ async downloadWithAuth(url, authCredentials, maxSize, timeout, baseOrigin, skipAuth = false, method = 'GET', operation) {
174
236
  const controller = new AbortController();
175
237
  const timeoutId = setTimeout(() => controller.abort(), timeout);
176
238
  try {
177
- // Build download URL, adding query auth param if needed (and not skipping auth)
178
- let downloadUrl = url;
179
- if (!skipAuth && authCredentials.queryParams) {
180
- const urlObj = new URL(url);
181
- const { key, value } = authCredentials.queryParams;
182
- // Only add if not already present (URL may have pre-signed token)
183
- if (!urlObj.searchParams.has(key)) {
184
- urlObj.searchParams.set(key, value);
185
- downloadUrl = urlObj.toString();
239
+ const initialUrl = this.buildDownloadUrlWithOptionalQueryAuth(url, authCredentials, skipAuth);
240
+ let currentUrl = initialUrl;
241
+ let currentMethod = method;
242
+ let currentHeaders = skipAuth ? {} : authCredentials.headers;
243
+ if (operation) {
244
+ await this.enforceDownloadPolicy(currentUrl, baseOrigin, operation, skipAuth);
245
+ }
246
+ for (let redirects = 0; redirects <= MAX_REDIRECTS; redirects++) {
247
+ const response = await fetch(currentUrl, {
248
+ method: currentMethod,
249
+ headers: currentHeaders,
250
+ signal: controller.signal,
251
+ redirect: 'manual',
252
+ });
253
+ if (this.isRedirectStatus(response.status)) {
254
+ if (redirects === MAX_REDIRECTS) {
255
+ throw new NetworkError(`Too many redirects (max ${MAX_REDIRECTS})`);
256
+ }
257
+ const location = response.headers.get('location');
258
+ if (!location) {
259
+ throw new NetworkError(`Redirect without Location header: HTTP ${response.status}`);
260
+ }
261
+ const nextUrl = this.resolveRedirectTarget(currentUrl, location);
262
+ if (operation) {
263
+ // Enforce the same policy on every redirect hop
264
+ await this.enforceDownloadPolicy(nextUrl, baseOrigin, operation, skipAuth);
265
+ }
266
+ const isCrossOrigin = new URL(nextUrl).origin !== new URL(currentUrl).origin;
267
+ if (isCrossOrigin) {
268
+ currentHeaders = {};
269
+ }
270
+ if (response.status === 303 ||
271
+ ((response.status === 301 || response.status === 302) &&
272
+ currentMethod !== 'GET' &&
273
+ currentMethod !== 'HEAD')) {
274
+ currentMethod = 'GET';
275
+ }
276
+ currentUrl = nextUrl;
277
+ continue;
278
+ }
279
+ if (!response.ok) {
280
+ throw new NetworkError(`Download failed: HTTP ${response.status}`, response.status);
281
+ }
282
+ // Check content-length header
283
+ const contentLength = response.headers.get('content-length');
284
+ if (contentLength && parseInt(contentLength, 10) > maxSize) {
285
+ throw new ValidationError(`File size ${contentLength} exceeds maximum ${maxSize} bytes`);
286
+ }
287
+ const arrayBuffer = await response.arrayBuffer();
288
+ // Final size check
289
+ if (arrayBuffer.byteLength > maxSize) {
290
+ throw new ValidationError(`Downloaded file size ${arrayBuffer.byteLength} exceeds maximum ${maxSize} bytes`);
186
291
  }
292
+ // Convert to base64
293
+ const content = Buffer.from(arrayBuffer).toString('base64');
294
+ return {
295
+ content,
296
+ size: arrayBuffer.byteLength,
297
+ mimeType: response.headers.get('content-type') || undefined,
298
+ };
187
299
  }
188
- const response = await fetch(downloadUrl, {
189
- method,
190
- headers: skipAuth ? {} : authCredentials.headers,
191
- signal: controller.signal,
192
- });
193
- if (!response.ok) {
194
- throw new NetworkError(`Download failed: HTTP ${response.status}`, response.status);
195
- }
196
- // Check content-length header
197
- const contentLength = response.headers.get('content-length');
198
- if (contentLength && parseInt(contentLength, 10) > maxSize) {
199
- throw new ValidationError(`File size ${contentLength} exceeds maximum ${maxSize} bytes`);
200
- }
201
- const arrayBuffer = await response.arrayBuffer();
202
- // Final size check
203
- if (arrayBuffer.byteLength > maxSize) {
204
- throw new ValidationError(`Downloaded file size ${arrayBuffer.byteLength} exceeds maximum ${maxSize} bytes`);
205
- }
206
- // Convert to base64
207
- const bytes = new Uint8Array(arrayBuffer);
208
- let binary = '';
209
- for (let i = 0; i < bytes.byteLength; i++) {
210
- binary += String.fromCharCode(bytes[i]);
211
- }
212
- const content = btoa(binary);
213
- return {
214
- content,
215
- size: arrayBuffer.byteLength,
216
- mimeType: response.headers.get('content-type') || undefined,
217
- };
300
+ throw new NetworkError('Download failed: unexpected redirect handling state');
218
301
  }
219
302
  finally {
220
303
  clearTimeout(timeoutId);
221
304
  }
222
305
  }
306
+ buildDownloadUrlWithOptionalQueryAuth(url, authCredentials, skipAuth) {
307
+ if (skipAuth || !authCredentials.queryParams)
308
+ return url;
309
+ const urlObj = new URL(url);
310
+ const { key, value } = authCredentials.queryParams;
311
+ // Only add if not already present (URL may have pre-signed token)
312
+ if (!urlObj.searchParams.has(key)) {
313
+ urlObj.searchParams.set(key, value);
314
+ }
315
+ return urlObj.toString();
316
+ }
317
+ isRedirectStatus(status) {
318
+ return status === 301 || status === 302 || status === 303 || status === 307 || status === 308;
319
+ }
320
+ resolveRedirectTarget(currentUrl, location) {
321
+ let resolved;
322
+ try {
323
+ resolved = new URL(location, currentUrl);
324
+ }
325
+ catch {
326
+ throw new NetworkError(`Invalid redirect URL: '${location}'`);
327
+ }
328
+ if (resolved.protocol !== 'http:' && resolved.protocol !== 'https:') {
329
+ throw new ValidationError(`Unsupported redirect URL scheme: '${resolved.protocol}'`);
330
+ }
331
+ return resolved.toString();
332
+ }
333
+ async enforceAllowedDownloadTarget(targetUrl, operation) {
334
+ const url = new URL(targetUrl);
335
+ const hostnameRaw = url.hostname.toLowerCase();
336
+ const hostname = hostnameRaw.startsWith('[') && hostnameRaw.endsWith(']')
337
+ ? hostnameRaw.slice(1, -1)
338
+ : hostnameRaw;
339
+ const allowPrivateNetwork = operation.allow_private_network ?? false;
340
+ if (operation.allowed_hosts && operation.allowed_hosts.length > 0) {
341
+ if (!this.isAllowedHost(hostname, operation.allowed_hosts)) {
342
+ this.logger.warn?.('proxy_download blocked: host not in allowlist', {
343
+ hostname,
344
+ allowed_hosts: operation.allowed_hosts,
345
+ how_to_fix: "Add hostname to allowed_hosts, or use same-origin download endpoint.",
346
+ });
347
+ throw new ValidationError(`Download host not in allowlist: '${hostname}' (allowed_hosts: ${operation.allowed_hosts.join(', ')})`);
348
+ }
349
+ }
350
+ if (allowPrivateNetwork)
351
+ return;
352
+ if (hostname === 'localhost') {
353
+ this.logger.warn?.('proxy_download blocked: localhost target', {
354
+ hostname,
355
+ how_to_fix: "If you really need localhost, set allow_private_network=true (and consider allowed_hosts).",
356
+ });
357
+ throw new ValidationError('Download hostname not allowed');
358
+ }
359
+ const ipVersion = isIP(hostname);
360
+ if (ipVersion === 4) {
361
+ if (this.isDisallowedIPv4(hostname)) {
362
+ this.logger.warn?.('proxy_download blocked: private/loopback/link-local IPv4 target', {
363
+ hostname,
364
+ how_to_fix: "If you really need private IPs, set allow_private_network=true (and consider allowed_hosts).",
365
+ });
366
+ throw new ValidationError('Download IP not allowed');
367
+ }
368
+ }
369
+ else if (ipVersion === 6) {
370
+ if (this.isDisallowedIPv6(hostname)) {
371
+ this.logger.warn?.('proxy_download blocked: private/loopback/link-local IPv6 target', {
372
+ hostname,
373
+ how_to_fix: "If you really need private IPs, set allow_private_network=true (and consider allowed_hosts).",
374
+ });
375
+ throw new ValidationError('Download IP not allowed');
376
+ }
377
+ }
378
+ else {
379
+ // Hostname: resolve to all IPs and block if any are private/loopback/link-local (SSRF defense)
380
+ const addresses = await this.lookupAllIpAddresses(hostname);
381
+ const disallowed = addresses.find(address => {
382
+ const family = isIP(address);
383
+ if (family === 4)
384
+ return this.isDisallowedIPv4(address);
385
+ if (family === 6)
386
+ return this.isDisallowedIPv6(address);
387
+ return false;
388
+ });
389
+ if (disallowed) {
390
+ this.logger.warn?.('proxy_download blocked: hostname resolves to private/loopback/link-local IP', {
391
+ hostname,
392
+ resolved_addresses: addresses,
393
+ how_to_fix: "If this hostname must be allowed, set allow_private_network=true and restrict with allowed_hosts.",
394
+ });
395
+ throw new ValidationError('Download hostname resolves to disallowed IP');
396
+ }
397
+ }
398
+ }
399
+ async lookupAllIpAddresses(hostname) {
400
+ const timeoutMs = 1000;
401
+ let results = [];
402
+ try {
403
+ results = (await Promise.race([
404
+ lookup(hostname, { all: true, verbatim: true }),
405
+ new Promise((_, reject) => setTimeout(() => reject(new Error(`DNS lookup timeout after ${timeoutMs}ms`)), timeoutMs)),
406
+ ]));
407
+ }
408
+ catch (error) {
409
+ this.logger.warn?.('proxy_download blocked: DNS lookup failed', {
410
+ hostname,
411
+ error: error instanceof Error ? error.message : String(error),
412
+ how_to_fix: "If you need to allow internal hostnames, set allow_private_network=true and restrict with allowed_hosts.",
413
+ });
414
+ throw new ValidationError(`DNS lookup failed for hostname '${hostname}'`);
415
+ }
416
+ const addresses = results.map(r => r.address).filter(Boolean);
417
+ if (addresses.length === 0) {
418
+ this.logger.warn?.('proxy_download blocked: DNS lookup returned no addresses', {
419
+ hostname,
420
+ how_to_fix: "If you need to allow internal hostnames, set allow_private_network=true and restrict with allowed_hosts.",
421
+ });
422
+ throw new ValidationError(`DNS lookup returned no addresses for hostname '${hostname}'`);
423
+ }
424
+ return addresses;
425
+ }
426
+ isAllowedHost(hostname, allowedHosts) {
427
+ const lower = hostname.toLowerCase();
428
+ return allowedHosts.some(patternRaw => {
429
+ const pattern = patternRaw.toLowerCase().trim();
430
+ if (!pattern)
431
+ return false;
432
+ if (pattern.startsWith('*.')) {
433
+ const suffix = pattern.slice(2);
434
+ if (!suffix)
435
+ return false;
436
+ return lower.endsWith(`.${suffix}`);
437
+ }
438
+ return lower === pattern;
439
+ });
440
+ }
441
+ isDisallowedIPv4(ip) {
442
+ const parts = ip.split('.').map(p => Number(p));
443
+ if (parts.length !== 4 || parts.some(p => !Number.isInteger(p) || p < 0 || p > 255))
444
+ return true;
445
+ const [a, b] = parts;
446
+ if (a === 127)
447
+ return true; // loopback
448
+ if (a === 10)
449
+ return true; // private
450
+ if (a === 172 && b >= 16 && b <= 31)
451
+ return true; // private
452
+ if (a === 192 && b === 168)
453
+ return true; // private
454
+ if (a === 169 && b === 254)
455
+ return true; // link-local
456
+ if (a === 0)
457
+ return true; // "this network"
458
+ return false;
459
+ }
460
+ isDisallowedIPv6(ip) {
461
+ const normalized = ip.toLowerCase();
462
+ if (normalized === '::1' || normalized === '0:0:0:0:0:0:0:1')
463
+ return true; // loopback
464
+ if (normalized === '::' || normalized === '0:0:0:0:0:0:0:0')
465
+ return true; // unspecified
466
+ if (normalized.startsWith('fe8') || normalized.startsWith('fe9') || normalized.startsWith('fea') || normalized.startsWith('feb')) {
467
+ return true; // link-local fe80::/10 (approx by prefix)
468
+ }
469
+ if (normalized.startsWith('fc') || normalized.startsWith('fd'))
470
+ return true; // unique local fc00::/7 (approx by prefix)
471
+ return false;
472
+ }
223
473
  /**
224
474
  * Handle inline data URLs (data:mime;base64,...)
225
475
  */
@@ -1 +1 @@
1
- {"version":3,"file":"proxy-executor.js","sourceRoot":"","sources":["../../src/proxy-executor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"proxy-executor.js","sourceRoot":"","sources":["../../src/proxy-executor.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAoC3C,MAAM,gBAAgB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO;AAClD,MAAM,eAAe,GAAG,KAAK,CAAC,CAAC,MAAM;AACrC,MAAM,aAAa,GAAG,CAAC,CAAC;AAExB,MAAM,OAAO,qBAAqB;IAChC,YACU,UAAsB,EACtB,SAAsB,EAAE,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE;QADzC,eAAU,GAAV,UAAU,CAAY;QACtB,WAAM,GAAN,MAAM,CAAmC;IAChD,CAAC;IAEJ;;;;;;OAMG;IACH,KAAK,CAAC,OAAO,CACX,SAAiC,EACjC,eAAiD,EACjD,eAAgC,EAChC,qBAAwD;QAExD,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QAC/C,MAAM,OAAO,GAAG,SAAS,CAAC,UAAU,IAAI,eAAe,CAAC;QACxD,MAAM,QAAQ,GAAG,SAAS,CAAC,SAAS,IAAI,KAAK,CAAC;QAC9C,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QAExC,yBAAyB;QACzB,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CACpD,eAAe,CAAC,MAAM,EACtB,eAAe,CAAC,IAAI,CACrB,CAAC;QACF,MAAM,QAAQ,GAAG,gBAAgB,CAAC,IAA+B,CAAC;QAElE,wBAAwB;QACxB,MAAM,QAAQ,GACZ,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,yBAAyB,CAAC;YAC5D,QAAQ,CAAC,WAAW,CAAY;YAChC,QAAQ,CAAC,UAAU,CAAY;YAC/B,QAAQ,CAAC,MAAM,CAAY,CAAC;QAC/B,MAAM,YAAY,GAChB,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,qBAAqB,CAAC;YACxD,QAAQ,CAAC,MAAM,CAAwB,CAAC;QAC3C,MAAM,YAAY,GACf,QAAQ,CAAC,UAAU,CAAwB;YAC3C,QAAQ,CAAC,cAAc,CAAwB;YAChD,0BAA0B,CAAC;QAE7B,qEAAqE;QACrE,IAAI,qBAAqB,EAAE,CAAC;YAC1B,MAAM,QAAQ,GAAG,SAAS,CAAC,SAAS,IAAI,KAAK,CAAC;YAC9C,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;YACpE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAC7D,WAAW,EACX,eAAe,EACf,OAAO,EACP,OAAO,EACP,UAAU,EACV,QAAQ,EACR,qBAAqB,CAAC,MAAM,EAC5B,SAAS,CACV,CAAC;YAEF,IAAI,YAAY,IAAI,YAAY,GAAG,OAAO,EAAE,CAAC;gBAC3C,MAAM,IAAI,eAAe,CACvB,aAAa,YAAY,oBAAoB,OAAO,QAAQ,CAC7D,CAAC;YACJ,CAAC;YAED,MAAM,aAAa,GAAG,QAAQ,IAAI,YAAY,CAAC;YAC/C,IAAI,SAAS,CAAC,kBAAkB,EAAE,CAAC;gBACjC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE,SAAS,CAAC,kBAAkB,CAAC,EAAE,CAAC;oBACzE,MAAM,IAAI,eAAe,CACvB,cAAc,aAAa,uBAAuB,SAAS,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC5F,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,OAAO;gBACL,QAAQ;gBACR,OAAO;gBACP,QAAQ,EAAE,aAAa;gBACvB,IAAI;gBACJ,QAAQ;aACT,CAAC;QACJ,CAAC;QAED,oCAAoC;QACpC,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAChD,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,eAAe,CACvB,cAAc,QAAQ,kCAAkC,CACzD,CAAC;QACJ,CAAC;QAED,iEAAiE;QACjE,MAAM,QAAQ,GAAG,YAAY,CAAC;QAC9B,IAAI,SAAS,CAAC,kBAAkB,EAAE,CAAC;YACjC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,SAAS,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBACpE,MAAM,IAAI,eAAe,CACvB,cAAc,QAAQ,uBAAuB,SAAS,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACvF,CAAC;YACJ,CAAC;QACH,CAAC;QAED,uDAAuD;QACvD,IAAI,YAAY,IAAI,YAAY,GAAG,OAAO,EAAE,CAAC;YAC3C,MAAM,IAAI,eAAe,CACvB,aAAa,YAAY,oBAAoB,OAAO,QAAQ,CAC7D,CAAC;QACJ,CAAC;QAED,mEAAmE;QACnE,IAAI,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YACzF,OAAO;gBACL,QAAQ;gBACR,OAAO;gBACP,QAAQ,EAAE,YAAY,IAAI,QAAQ;gBAClC,IAAI;gBACJ,QAAQ;aACT,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GAAG,SAAS,CAAC,SAAS,IAAI,KAAK,CAAC;QAC9C,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QAC7C,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAC3E,WAAW,EACX,eAAe,EACf,OAAO,EACP,OAAO,EACP,UAAU,EACV,QAAQ,EACR,KAAK,EACL,SAAS,CACV,CAAC;QAEF,OAAO;YACL,QAAQ;YACR,OAAO;YACP,QAAQ,EAAE,YAAY,IAAI,QAAQ;YAClC,IAAI;YACJ,QAAQ;SACT,CAAC;IACJ,CAAC;IAEO,cAAc,CAAC,SAAiC;QACtD,MAAM,OAAO,GAAG,CAAC,SAAS,CAAC,uBAAuB,EAAE,sBAAsB,CAAC,CAAC,MAAM,CAChF,OAAO,CACI,CAAC;QAEd,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAClC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAChC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;oBAC7C,MAAM,IAAI,eAAe,CACvB,6BAA6B,GAAG,qCAAqC,QAAQ,GAAG,CACjF,CAAC;gBACJ,CAAC;gBACD,OAAO,MAAM,CAAC;YAChB,CAAC;QACH,CAAC;QAED,IAAI,SAAS,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;YAC3C,OAAO,SAAS,CAAC,cAAc,CAAC;QAClC,CAAC;QAED,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED;;OAEG;IACK,UAAU,CAAC,QAAiC,EAAE,QAAgB;QACpE,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,OAAO,GAAY,QAAQ,CAAC;QAEhC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;gBACpD,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,GAAI,OAAmC,CAAC,IAAI,CAAC,CAAC;QACvD,CAAC;QAED,OAAO,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IACtD,CAAC;IAEO,mBAAmB,CAAC,QAAiC,EAAE,IAAY;QACzE,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACtD,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IACvD,CAAC;IAEO,mBAAmB,CAAC,QAAiC,EAAE,IAAY;QACzE,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACtD,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IACvD,CAAC;IAEO,kBAAkB,CAAC,QAAiC,EAAE,IAAY;QACxE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,OAAO,GAAY,QAAQ,CAAC;QAChC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;gBACpD,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,OAAO,GAAI,OAAmC,CAAC,IAAI,CAAC,CAAC;QACvD,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,aAAa;QACnB,IAAI,CAAC;YACH,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC;QACtD,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,eAAe,CAAC,sDAAsD,CAAC,CAAC;QACpF,CAAC;IACH,CAAC;IAEO,cAAc,CAAC,KAAa;QAClC,eAAe;QACf,IAAI,WAA4B,CAAC;QACjC,IAAI,CAAC;YACH,WAAW,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,kEAAkE,EAAE;gBACpF,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC,CAAC;QACL,CAAC;QAED,IAAI,WAAW,EAAE,CAAC;YAChB,IAAI,WAAW,CAAC,QAAQ,KAAK,OAAO,IAAI,WAAW,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAC1E,OAAO,WAAW,CAAC,QAAQ,EAAE,CAAC;YAChC,CAAC;YACD,MAAM,IAAI,eAAe,CAAC,qCAAqC,WAAW,CAAC,QAAQ,GAAG,CAAC,CAAC;QAC1F,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;QAC7C,IAAI,IAAS,CAAC;QACd,IAAI,CAAC;YACH,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,eAAe,CAAC,sDAAsD,CAAC,CAAC;QACpF,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC5D,MAAM,IAAI,eAAe,CAAC,qCAAqC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;QACnF,CAAC;QAED,IAAI,CAAC;YACH,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC1B,0GAA0G;gBAC1G,MAAM,QAAQ,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC;gBACzD,OAAO,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC;YACtC,CAAC;YAED,4DAA4D;YAC5D,MAAM,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,CAAC;YACxE,OAAO,IAAI,GAAG,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC,QAAQ,EAAE,CAAC;QACpD,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,eAAe,CAAC,0BAA0B,KAAK,GAAG,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,qBAAqB,CACjC,WAAmB,EACnB,UAAkB,EAClB,SAAiC,EACjC,QAAiB;QAEjB,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC;QAEnD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,IAAI,cAAc,KAAK,UAAU,EAAE,CAAC;gBAClC,MAAM,IAAI,eAAe,CACvB,2EAA2E,UAAU,uBAAuB,cAAc,gEAAgE,CAC3L,CAAC;YACJ,CAAC;YACD,OAAO;QACT,CAAC;QAED,oEAAoE;QACpE,IAAI,cAAc,KAAK,UAAU;YAAE,OAAO;QAE1C,MAAM,IAAI,CAAC,4BAA4B,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAClE,CAAC;IAED;;OAEG;IACK,iBAAiB,CAAC,QAAgB,EAAE,SAAmB;QAC7D,OAAO,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;YAC9B,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC3B,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,wBAAwB;gBAC7D,OAAO,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YACrC,CAAC;YACD,OAAO,QAAQ,KAAK,OAAO,CAAC;QAC9B,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACK,KAAK,CAAC,gBAAgB,CAC5B,GAAW,EACX,eAAgC,EAChC,OAAe,EACf,OAAe,EACf,UAAkB,EAClB,WAAoB,KAAK,EACzB,SAAiB,KAAK,EACtB,SAAkC;QAElC,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,OAAO,CAAC,CAAC;QAEhE,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,CAAC,qCAAqC,CAAC,GAAG,EAAE,eAAe,EAAE,QAAQ,CAAC,CAAC;YAC9F,IAAI,UAAU,GAAG,UAAU,CAAC;YAC5B,IAAI,aAAa,GAAG,MAAM,CAAC;YAC3B,IAAI,cAAc,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC;YAE7D,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,IAAI,CAAC,qBAAqB,CAAC,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;YAChF,CAAC;YAED,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,IAAI,aAAa,EAAE,SAAS,EAAE,EAAE,CAAC;gBAChE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,UAAU,EAAE;oBACvC,MAAM,EAAE,aAAa;oBACrB,OAAO,EAAE,cAAc;oBACvB,MAAM,EAAE,UAAU,CAAC,MAAM;oBACzB,QAAQ,EAAE,QAAQ;iBACnB,CAAC,CAAC;gBAEH,IAAI,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC3C,IAAI,SAAS,KAAK,aAAa,EAAE,CAAC;wBAChC,MAAM,IAAI,YAAY,CAAC,2BAA2B,aAAa,GAAG,CAAC,CAAC;oBACtE,CAAC;oBAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;oBAClD,IAAI,CAAC,QAAQ,EAAE,CAAC;wBACd,MAAM,IAAI,YAAY,CAAC,0CAA0C,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;oBACtF,CAAC;oBAED,MAAM,OAAO,GAAG,IAAI,CAAC,qBAAqB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;oBACjE,IAAI,SAAS,EAAE,CAAC;wBACd,gDAAgD;wBAChD,MAAM,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;oBAC7E,CAAC;oBAED,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC;oBAC7E,IAAI,aAAa,EAAE,CAAC;wBAClB,cAAc,GAAG,EAAE,CAAC;oBACtB,CAAC;oBAED,IACE,QAAQ,CAAC,MAAM,KAAK,GAAG;wBACvB,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,CAAC;4BACnD,aAAa,KAAK,KAAK;4BACvB,aAAa,KAAK,MAAM,CAAC,EAC3B,CAAC;wBACD,aAAa,GAAG,KAAK,CAAC;oBACxB,CAAC;oBAED,UAAU,GAAG,OAAO,CAAC;oBACrB,SAAS;gBACX,CAAC;gBAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;oBACjB,MAAM,IAAI,YAAY,CAAC,yBAAyB,QAAQ,CAAC,MAAM,EAAE,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACtF,CAAC;gBAED,8BAA8B;gBAC9B,MAAM,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;gBAC7D,IAAI,aAAa,IAAI,QAAQ,CAAC,aAAa,EAAE,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC;oBAC3D,MAAM,IAAI,eAAe,CAAC,aAAa,aAAa,oBAAoB,OAAO,QAAQ,CAAC,CAAC;gBAC3F,CAAC;gBAED,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC;gBAEjD,mBAAmB;gBACnB,IAAI,WAAW,CAAC,UAAU,GAAG,OAAO,EAAE,CAAC;oBACrC,MAAM,IAAI,eAAe,CACvB,wBAAwB,WAAW,CAAC,UAAU,oBAAoB,OAAO,QAAQ,CAClF,CAAC;gBACJ,CAAC;gBAED,oBAAoB;gBACpB,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBAE5D,OAAO;oBACL,OAAO;oBACP,IAAI,EAAE,WAAW,CAAC,UAAU;oBAC5B,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,SAAS;iBAC5D,CAAC;YACJ,CAAC;YAED,MAAM,IAAI,YAAY,CAAC,qDAAqD,CAAC,CAAC;QAEhF,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,SAAS,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAEO,qCAAqC,CAC3C,GAAW,EACX,eAAgC,EAChC,QAAiB;QAEjB,IAAI,QAAQ,IAAI,CAAC,eAAe,CAAC,WAAW;YAAE,OAAO,GAAG,CAAC;QAEzD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,eAAe,CAAC,WAAW,CAAC;QAEnD,kEAAkE;QAClE,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAClC,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACtC,CAAC;QACD,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC;IAC3B,CAAC;IAEO,gBAAgB,CAAC,MAAc;QACrC,OAAO,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,CAAC;IAChG,CAAC;IAEO,qBAAqB,CAAC,UAAkB,EAAE,QAAgB;QAChE,IAAI,QAAa,CAAC;QAClB,IAAI,CAAC;YACH,QAAQ,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC3C,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,YAAY,CAAC,0BAA0B,QAAQ,GAAG,CAAC,CAAC;QAChE,CAAC;QAED,IAAI,QAAQ,CAAC,QAAQ,KAAK,OAAO,IAAI,QAAQ,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACpE,MAAM,IAAI,eAAe,CAAC,qCAAqC,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvF,CAAC;QAED,OAAO,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAC7B,CAAC;IAEO,KAAK,CAAC,4BAA4B,CAAC,SAAiB,EAAE,SAAiC;QAC7F,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;QAC/B,MAAM,WAAW,GAAG,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;QAC/C,MAAM,QAAQ,GAAG,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC;YACvE,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC1B,CAAC,CAAC,WAAW,CAAC;QAChB,MAAM,mBAAmB,GAAG,SAAS,CAAC,qBAAqB,IAAI,KAAK,CAAC;QAErE,IAAI,SAAS,CAAC,aAAa,IAAI,SAAS,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClE,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,SAAS,CAAC,aAAa,CAAC,EAAE,CAAC;gBAC3D,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,+CAA+C,EAAE;oBAClE,QAAQ;oBACR,aAAa,EAAE,SAAS,CAAC,aAAa;oBACtC,UAAU,EAAE,sEAAsE;iBACnF,CAAC,CAAC;gBACH,MAAM,IAAI,eAAe,CACvB,oCAAoC,QAAQ,qBAAqB,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACvG,CAAC;YACJ,CAAC;QACH,CAAC;QAED,IAAI,mBAAmB;YAAE,OAAO;QAEhC,IAAI,QAAQ,KAAK,WAAW,EAAE,CAAC;YAC7B,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,0CAA0C,EAAE;gBAC7D,QAAQ;gBACR,UAAU,EAAE,4FAA4F;aACzG,CAAC,CAAC;YACH,MAAM,IAAI,eAAe,CAAC,+BAA+B,CAAC,CAAC;QAC7D,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;QACjC,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;YACpB,IAAI,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACpC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,iEAAiE,EAAE;oBACpF,QAAQ;oBACR,UAAU,EAAE,8FAA8F;iBAC3G,CAAC,CAAC;gBACH,MAAM,IAAI,eAAe,CAAC,yBAAyB,CAAC,CAAC;YACvD,CAAC;QACH,CAAC;aAAM,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;YAC3B,IAAI,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACpC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,iEAAiE,EAAE;oBACpF,QAAQ;oBACR,UAAU,EAAE,8FAA8F;iBAC3G,CAAC,CAAC;gBACH,MAAM,IAAI,eAAe,CAAC,yBAAyB,CAAC,CAAC;YACvD,CAAC;QACH,CAAC;aAAM,CAAC;YACN,+FAA+F;YAC/F,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;YAC5D,MAAM,UAAU,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;gBAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC7B,IAAI,MAAM,KAAK,CAAC;oBAAE,OAAO,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;gBACxD,IAAI,MAAM,KAAK,CAAC;oBAAE,OAAO,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;gBACxD,OAAO,KAAK,CAAC;YACf,CAAC,CAAC,CAAC;YAEH,IAAI,UAAU,EAAE,CAAC;gBACf,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,6EAA6E,EAAE;oBAChG,QAAQ;oBACR,kBAAkB,EAAE,SAAS;oBAC7B,UAAU,EACR,mGAAmG;iBACtG,CAAC,CAAC;gBACH,MAAM,IAAI,eAAe,CAAC,6CAA6C,CAAC,CAAC;YAC3E,CAAC;QACH,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,oBAAoB,CAAC,QAAgB;QACjD,MAAM,SAAS,GAAG,IAAI,CAAC;QAEvB,IAAI,OAAO,GAA+B,EAAE,CAAC;QAC7C,IAAI,CAAC;YACH,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC;gBAC5B,MAAM,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAwC;gBACtF,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAC/B,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,4BAA4B,SAAS,IAAI,CAAC,CAAC,EAAE,SAAS,CAAC,CAC1F;aACF,CAAC,CAA+B,CAAC;QACpC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,2CAA2C,EAAE;gBAC9D,QAAQ;gBACR,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;gBAC7D,UAAU,EACR,0GAA0G;aAC7G,CAAC,CAAC;YACH,MAAM,IAAI,eAAe,CAAC,mCAAmC,QAAQ,GAAG,CAAC,CAAC;QAC5E,CAAC;QAED,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC9D,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,0DAA0D,EAAE;gBAC7E,QAAQ;gBACR,UAAU,EACR,0GAA0G;aAC7G,CAAC,CAAC;YACH,MAAM,IAAI,eAAe,CAAC,kDAAkD,QAAQ,GAAG,CAAC,CAAC;QAC3F,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,aAAa,CAAC,QAAgB,EAAE,YAAsB;QAC5D,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;QACrC,OAAO,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;YACpC,MAAM,OAAO,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;YAChD,IAAI,CAAC,OAAO;gBAAE,OAAO,KAAK,CAAC;YAE3B,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7B,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAChC,IAAI,CAAC,MAAM;oBAAE,OAAO,KAAK,CAAC;gBAC1B,OAAO,KAAK,CAAC,QAAQ,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC;YACtC,CAAC;YAED,OAAO,KAAK,KAAK,OAAO,CAAC;QAC3B,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,gBAAgB,CAAC,EAAU;QACjC,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAChD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QACjG,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC,CAAC,WAAW;QACvC,IAAI,CAAC,KAAK,EAAE;YAAE,OAAO,IAAI,CAAC,CAAC,UAAU;QACrC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;YAAE,OAAO,IAAI,CAAC,CAAC,UAAU;QAC5D,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC,CAAC,UAAU;QACnD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC,CAAC,aAAa;QACtD,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC,CAAC,iBAAiB;QAC3C,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,gBAAgB,CAAC,EAAU;QACjC,MAAM,UAAU,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;QACpC,IAAI,UAAU,KAAK,KAAK,IAAI,UAAU,KAAK,iBAAiB;YAAE,OAAO,IAAI,CAAC,CAAC,WAAW;QACtF,IAAI,UAAU,KAAK,IAAI,IAAI,UAAU,KAAK,iBAAiB;YAAE,OAAO,IAAI,CAAC,CAAC,cAAc;QACxF,IAAI,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YACjI,OAAO,IAAI,CAAC,CAAC,0CAA0C;QACzD,CAAC;QACD,IAAI,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC,CAAC,2CAA2C;QACxH,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACK,mBAAmB,CAAC,GAAW,EAAE,OAAe;QACtD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;QACpD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,eAAe,CAAC,6BAA6B,CAAC,CAAC;QAC3D,CAAC;QACD,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,0BAA0B,CAAC;QACxD,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,MAAM,CAAC;QACtD,IAAI,IAAI,GAAG,OAAO,EAAE,CAAC;YACnB,MAAM,IAAI,eAAe,CAAC,wBAAwB,IAAI,oBAAoB,OAAO,QAAQ,CAAC,CAAC;QAC7F,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IACjD,CAAC;CACF"}
@@ -0,0 +1,3 @@
1
+ export declare const CAN_LISTEN: boolean;
2
+ export declare const describeIfListen: any;
3
+ //# sourceMappingURL=listen-support.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listen-support.d.ts","sourceRoot":"","sources":["../../../src/testing/listen-support.ts"],"names":[],"mappings":"AAsDA,eAAO,MAAM,UAAU,SAA8B,CAAC;AACtD,eAAO,MAAM,gBAAgB,EAAE,GAA2C,CAAC"}
@@ -0,0 +1,50 @@
1
+ import http from 'node:http';
2
+ import { describe } from 'vitest';
3
+ async function detectListenSupport() {
4
+ return await new Promise(resolve => {
5
+ let finished = false;
6
+ const server = http.createServer((_, res) => {
7
+ res.statusCode = 200;
8
+ res.end('ok');
9
+ });
10
+ const done = (result) => {
11
+ if (finished)
12
+ return;
13
+ finished = true;
14
+ clearTimeout(timeoutId);
15
+ try {
16
+ server.close(() => resolve(result));
17
+ }
18
+ catch {
19
+ resolve(result);
20
+ }
21
+ };
22
+ const timeoutId = setTimeout(() => done(false), 500);
23
+ server.once('error', () => done(false));
24
+ server.listen(0, '127.0.0.1', () => {
25
+ const address = server.address();
26
+ if (!address || typeof address !== 'object' || typeof address.port !== 'number') {
27
+ done(false);
28
+ return;
29
+ }
30
+ const port = address.port;
31
+ const req = http.get({
32
+ hostname: '127.0.0.1',
33
+ port,
34
+ path: '/',
35
+ timeout: 500,
36
+ }, res => {
37
+ res.resume();
38
+ res.once('end', () => done(res.statusCode === 200));
39
+ });
40
+ req.once('error', () => done(false));
41
+ req.once('timeout', () => {
42
+ req.destroy();
43
+ done(false);
44
+ });
45
+ });
46
+ });
47
+ }
48
+ export const CAN_LISTEN = await detectListenSupport();
49
+ export const describeIfListen = CAN_LISTEN ? describe : describe.skip;
50
+ //# sourceMappingURL=listen-support.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listen-support.js","sourceRoot":"","sources":["../../../src/testing/listen-support.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAElC,KAAK,UAAU,mBAAmB;IAChC,OAAO,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;QACjC,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE;YAC1C,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;YACrB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,CAAC,MAAe,EAAE,EAAE;YAC/B,IAAI,QAAQ;gBAAE,OAAO;YACrB,QAAQ,GAAG,IAAI,CAAC;YAChB,YAAY,CAAC,SAAS,CAAC,CAAC;YACxB,IAAI,CAAC;gBACH,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;YACtC,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,MAAM,CAAC,CAAC;YAClB,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC;QAErD,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE;YACjC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;YACjC,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAQ,OAAe,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACzF,IAAI,CAAC,KAAK,CAAC,CAAC;gBACZ,OAAO;YACT,CAAC;YAED,MAAM,IAAI,GAAI,OAAe,CAAC,IAAc,CAAC;YAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAClB;gBACE,QAAQ,EAAE,WAAW;gBACrB,IAAI;gBACJ,IAAI,EAAE,GAAG;gBACT,OAAO,EAAE,GAAG;aACb,EACD,GAAG,CAAC,EAAE;gBACJ,GAAG,CAAC,MAAM,EAAE,CAAC;gBACb,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,KAAK,GAAG,CAAC,CAAC,CAAC;YACtD,CAAC,CACF,CAAC;YACF,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YACrC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE;gBACvB,GAAG,CAAC,OAAO,EAAE,CAAC;gBACd,IAAI,CAAC,KAAK,CAAC,CAAC;YACd,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,mBAAmB,EAAE,CAAC;AACtD,MAAM,CAAC,MAAM,gBAAgB,GAAQ,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"mock-youtrack-server.d.ts","sourceRoot":"","sources":["../../../src/testing/mock-youtrack-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,cAAc,EAAE,MAAM,KAAK,CAAC;AAGzD,QAAA,MAAM,gBAAgB,yBAAyB,CAAC;AAEhD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;CAC1C;AAuDD,wBAAgB,sBAAsB,CACpC,OAAO,GAAE,MAAyB,EAClC,UAAU,CAAC,EAAE,eAAe,EAAE,GAC7B,cAAc,EAAE,CAwIlB;AAED,wBAAgB,wBAAwB,CAAC,OAAO,GAAE,MAAyB,EAAE,UAAU,CAAC,EAAE,eAAe,EAAE,qCAG1G;AAED,OAAO,EAAE,gBAAgB,IAAI,0BAA0B,EAAE,CAAC"}
1
+ {"version":3,"file":"mock-youtrack-server.d.ts","sourceRoot":"","sources":["../../../src/testing/mock-youtrack-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,cAAc,EAAE,MAAM,KAAK,CAAC;AAGzD,QAAA,MAAM,gBAAgB,yBAAyB,CAAC;AAEhD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;CAC1C;AAiED,wBAAgB,sBAAsB,CACpC,OAAO,GAAE,MAAyB,EAClC,UAAU,CAAC,EAAE,eAAe,EAAE,GAC7B,cAAc,EAAE,CAoJlB;AAED,wBAAgB,wBAAwB,CAAC,OAAO,GAAE,MAAyB,EAAE,UAAU,CAAC,EAAE,eAAe,EAAE,qCAG1G;AAED,OAAO,EAAE,gBAAgB,IAAI,0BAA0B,EAAE,CAAC"}
@@ -16,6 +16,16 @@ const baseArticle = {
16
16
  };
17
17
  const baseTag = { id: 'tag-1', name: 'Bug', color: '#ff0000' };
18
18
  const baseUser = { id: 'user-1', login: 'mock-user', fullName: 'Mock User', email: 'user@example.com' };
19
+ const baseProject = { id: 'PROJ', shortName: 'PROJ', name: 'Mock Project', description: 'Mock project description' };
20
+ const baseProjectCustomField = {
21
+ id: 'pcf-1',
22
+ $type: 'ProjectCustomField',
23
+ canBeEmpty: true,
24
+ emptyFieldText: '',
25
+ ordinal: 1,
26
+ isPublic: true,
27
+ field: { id: 'cf-1', name: 'Priority', fieldType: { id: 'ft-1', $type: 'FieldType' } },
28
+ };
19
29
  function queryToRecord(searchParams) {
20
30
  const entries = {};
21
31
  for (const [key, value] of searchParams.entries()) {
@@ -86,6 +96,10 @@ export function createYoutrackHandlers(baseUrl = DEFAULT_BASE_URL, requestLog) {
86
96
  })),
87
97
  http.get(withBase('/tags'), ({ request }) => HttpResponse.json([createEchoResponse(request, baseTag, requestLog)])),
88
98
  http.get(withBase('/tags/:id'), ({ request, params }) => HttpResponse.json(createEchoResponse(request, { ...baseTag, id: params.id }, requestLog))),
99
+ http.get(withBase('/admin/projects'), ({ request }) => HttpResponse.json([createEchoResponse(request, baseProject, requestLog)])),
100
+ http.get(withBase('/admin/projects/:id'), ({ request, params }) => HttpResponse.json({ ...createEchoResponse(request, { ...baseProject, id: params.id }, requestLog), customFields: [baseProjectCustomField] })),
101
+ http.get(withBase('/admin/projects/:id/customFields'), ({ request }) => HttpResponse.json([createEchoResponse(request, baseProjectCustomField, requestLog)])),
102
+ http.get(withBase('/admin/projects/:id/customFields/:projectCustomFieldId'), ({ request, params }) => HttpResponse.json(createEchoResponse(request, { ...baseProjectCustomField, id: params.projectCustomFieldId }, requestLog))),
89
103
  http.get(withBase('/savedQueries'), ({ request }) => HttpResponse.json([createEchoResponse(request, { id: 'q-1' }, requestLog)])),
90
104
  http.get(withBase('/agiles'), ({ request }) => HttpResponse.json([createEchoResponse(request, { id: 'agile-1' }, requestLog)])),
91
105
  http.get(withBase('/agiles/:id'), ({ request, params }) => HttpResponse.json(createEchoResponse(request, { id: params.id, name: 'Agile Board' }, requestLog))),