jamdesk 1.1.89 → 1.1.91

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 (85) hide show
  1. package/dist/__tests__/integration/validate.integration.test.js +2 -1
  2. package/dist/__tests__/integration/validate.integration.test.js.map +1 -1
  3. package/dist/__tests__/unit/dev-workspace-symlinks.test.d.ts +2 -0
  4. package/dist/__tests__/unit/dev-workspace-symlinks.test.d.ts.map +1 -0
  5. package/dist/__tests__/unit/dev-workspace-symlinks.test.js +112 -0
  6. package/dist/__tests__/unit/dev-workspace-symlinks.test.js.map +1 -0
  7. package/dist/__tests__/unit/docs-config-discovery.test.d.ts +2 -0
  8. package/dist/__tests__/unit/docs-config-discovery.test.d.ts.map +1 -0
  9. package/dist/__tests__/unit/docs-config-discovery.test.js +190 -0
  10. package/dist/__tests__/unit/docs-config-discovery.test.js.map +1 -0
  11. package/dist/__tests__/unit/docs-config.test.js +2 -1
  12. package/dist/__tests__/unit/docs-config.test.js.map +1 -1
  13. package/dist/__tests__/unit/language-filter.test.d.ts +2 -0
  14. package/dist/__tests__/unit/language-filter.test.d.ts.map +1 -0
  15. package/dist/__tests__/unit/language-filter.test.js +166 -0
  16. package/dist/__tests__/unit/language-filter.test.js.map +1 -0
  17. package/dist/__tests__/unit/output.test.d.ts +2 -0
  18. package/dist/__tests__/unit/output.test.d.ts.map +1 -0
  19. package/dist/__tests__/unit/output.test.js +61 -0
  20. package/dist/__tests__/unit/output.test.js.map +1 -0
  21. package/dist/commands/dev.d.ts.map +1 -1
  22. package/dist/commands/dev.js +4 -1
  23. package/dist/commands/dev.js.map +1 -1
  24. package/dist/commands/doctor.d.ts.map +1 -1
  25. package/dist/commands/doctor.js +14 -12
  26. package/dist/commands/doctor.js.map +1 -1
  27. package/dist/commands/validate.d.ts.map +1 -1
  28. package/dist/commands/validate.js +14 -2
  29. package/dist/commands/validate.js.map +1 -1
  30. package/dist/lib/docs-config.d.ts +54 -3
  31. package/dist/lib/docs-config.d.ts.map +1 -1
  32. package/dist/lib/docs-config.js +126 -8
  33. package/dist/lib/docs-config.js.map +1 -1
  34. package/dist/lib/language-filter.d.ts +31 -0
  35. package/dist/lib/language-filter.d.ts.map +1 -0
  36. package/dist/lib/language-filter.js +14 -0
  37. package/dist/lib/language-filter.js.map +1 -0
  38. package/package.json +1 -1
  39. package/vendored/app/api/r2/[project]/[...path]/route.ts +14 -9
  40. package/vendored/app/layout.tsx +2 -2
  41. package/vendored/components/HtmlLangSync.tsx +3 -2
  42. package/vendored/components/mdx/Accordion.tsx +1 -1
  43. package/vendored/components/mdx/Card.tsx +1 -1
  44. package/vendored/components/mdx/CodeGroup.tsx +18 -23
  45. package/vendored/components/mdx/Color.tsx +0 -1
  46. package/vendored/components/mdx/Icon.tsx +1 -1
  47. package/vendored/components/mdx/MDXComponents.tsx +92 -66
  48. package/vendored/components/mdx/OpenApiEndpoint.tsx +0 -1
  49. package/vendored/components/mdx/ParamField.tsx +0 -1
  50. package/vendored/components/mdx/RequestExample.tsx +0 -1
  51. package/vendored/components/mdx/ResponseExample.tsx +0 -1
  52. package/vendored/components/mdx/Steps.tsx +12 -3
  53. package/vendored/components/mdx/Table.tsx +8 -2
  54. package/vendored/components/mdx/Tabs.tsx +1 -1
  55. package/vendored/components/mdx/Tree.tsx +6 -4
  56. package/vendored/components/navigation/Header.tsx +7 -5
  57. package/vendored/components/navigation/LanguageSelector.tsx +32 -7
  58. package/vendored/components/navigation/TableOfContents.tsx +1 -1
  59. package/vendored/components/navigation/TabsNav.tsx +17 -5
  60. package/vendored/components/search/SearchModal.tsx +41 -36
  61. package/vendored/components/ui/CodePanel.tsx +2 -2
  62. package/vendored/hooks/useChat.ts +1 -1
  63. package/vendored/hooks/useShikiHighlight.ts +7 -1
  64. package/vendored/lib/build/error-parser.ts +38 -12
  65. package/vendored/lib/code-utils.ts +6 -2
  66. package/vendored/lib/health-checks.ts +2 -2
  67. package/vendored/lib/language-utils.ts +53 -2
  68. package/vendored/lib/layout-helpers.tsx +2 -1
  69. package/vendored/lib/mdx-inline-components.ts +1 -1
  70. package/vendored/lib/navigation-resolver.ts +0 -69
  71. package/vendored/lib/normalize-config.ts +1 -1
  72. package/vendored/lib/openapi/generator.ts +3 -3
  73. package/vendored/lib/openapi/parser.ts +14 -6
  74. package/vendored/lib/openapi/validator.ts +2 -2
  75. package/vendored/lib/openapi-isr.ts +4 -1
  76. package/vendored/lib/public-paths-resolver.ts +7 -6
  77. package/vendored/lib/redis.ts +2 -2
  78. package/vendored/lib/rehype-code-meta.ts +2 -2
  79. package/vendored/lib/render-doc-page.tsx +2 -2
  80. package/vendored/lib/seo.ts +21 -6
  81. package/vendored/lib/shiki-highlighter.ts +1 -1
  82. package/vendored/lib/snippet-loader-isr.ts +1 -1
  83. package/vendored/lib/validate-config.ts +136 -8
  84. package/vendored/shared/status-reporter.ts +12 -0
  85. package/vendored/workspace-package-lock.json +16 -16
@@ -8,9 +8,14 @@
8
8
  */
9
9
 
10
10
  import type { Metadata } from 'next';
11
- import type { DocsConfig, Logo, LogoConfig, Favicon, FaviconConfig, LanguageConfig, LanguageCode } from './docs-types';
11
+ import type { DocsConfig, Logo, LogoConfig, Favicon, LanguageConfig, LanguageCode } from './docs-types';
12
12
  import { transformConfigImagePath } from './docs-types';
13
- import { transformLanguagePath, extractLanguageFromPath, isValidLanguageCode } from './language-utils';
13
+ import { findHreflangAliasCollisions, transformLanguagePath, toHreflang } from './language-utils';
14
+ import { logger } from '../shared/logger';
15
+
16
+ // Dedupe per-process: same docs.json shape produces the same collision
17
+ // signature on every page render, so we'd otherwise spam logs.
18
+ const warnedCollisionSignatures = new Set<string>();
14
19
 
15
20
  const HAS_DOCS_SUFFIX = /\b(?:Documentation|Docs)\s*$/i;
16
21
 
@@ -197,14 +202,12 @@ function buildHreflangAlternates(
197
202
  const defaultLang = languages.find((l) => l.default)?.language || languages[0]?.language || 'en';
198
203
 
199
204
  // Detect current language from path
200
- const currentLang = extractLanguageFromPath(pagePath) || defaultLang;
201
-
202
205
  // Keep only languages whose navigation declares this page — capturing the
203
206
  // language-relative path so the build loop and x-default branch don't have
204
207
  // to recompute it via transformLanguagePath.
205
208
  const supported: Array<{ lang: LanguageCode; cleanPath: string }> = [];
206
209
  for (const langConfig of languages) {
207
- const langPath = transformLanguagePath(pagePath, currentLang, langConfig.language, defaultLang);
210
+ const langPath = transformLanguagePath(pagePath, langConfig.language, defaultLang);
208
211
  const cleanPath = langPath.replace(/^\//, '');
209
212
  if (getLanguagePagePaths(langConfig).has(cleanPath)) {
210
213
  supported.push({ lang: langConfig.language, cleanPath });
@@ -217,9 +220,21 @@ function buildHreflangAlternates(
217
220
  return undefined;
218
221
  }
219
222
 
223
+ const collisions = findHreflangAliasCollisions(supported.map((s) => s.lang));
224
+ for (const { tag, codes } of collisions) {
225
+ const signature = `${tag}:${codes.join(',')}`;
226
+ if (warnedCollisionSignatures.has(signature)) continue;
227
+ warnedCollisionSignatures.add(signature);
228
+ logger.warn('hreflang alias collision — last entry wins, earlier translations dropped', {
229
+ bcp47Tag: tag,
230
+ internalCodes: codes,
231
+ remedy: 'Remove one of the duplicate entries from navigation.languages in docs.json',
232
+ });
233
+ }
234
+
220
235
  const alternates: Record<string, string> = {};
221
236
  for (const { lang, cleanPath } of supported) {
222
- alternates[lang] = cleanPath ? `${baseUrl}/${cleanPath}` : baseUrl;
237
+ alternates[toHreflang(lang)] = cleanPath ? `${baseUrl}/${cleanPath}` : baseUrl;
223
238
  }
224
239
 
225
240
  // x-default points to the default language only when it has the page; absence
@@ -8,7 +8,7 @@ import { PRELOADED_LANGUAGES, SUPPORTED_THEMES, type SupportedTheme } from './sh
8
8
 
9
9
  // Extend globalThis type for highlighter caching
10
10
  declare global {
11
- // eslint-disable-next-line no-var
11
+
12
12
  var __shikiHighlighterPromise: Promise<Highlighter> | undefined;
13
13
  }
14
14
 
@@ -322,7 +322,7 @@ async function compileSnippet(
322
322
  try {
323
323
  // Create function that returns the component
324
324
  // NOTE: new Function() is intentionally used here to compile user-provided snippets
325
- // eslint-disable-next-line @typescript-eslint/no-implied-eval
325
+
326
326
  const createComponent = new Function(
327
327
  'React',
328
328
  '_jsx',
@@ -12,6 +12,7 @@
12
12
  import AjvModule, { ErrorObject } from 'ajv';
13
13
  import addFormatsModule from 'ajv-formats';
14
14
  // ESM compatibility - ajv-formats exports differently under NodeNext resolution
15
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- ajv-formats ESM/CJS interop default-export shape varies by bundler
15
16
  const addFormats = (addFormatsModule as any).default || addFormatsModule;
16
17
  // ESM compatibility - Ajv exports differently in Node.js ESM
17
18
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -60,6 +61,10 @@ export interface ValidationResult {
60
61
  error?: string;
61
62
  errorType?: 'config_error';
62
63
  errorSuggestion?: string;
64
+ /** Populated only on missing-file failures when `repoRoot` was supplied. */
65
+ discovery?: DocsJsonDiscovery;
66
+ /** Prose remediation derived from discovery (e.g., "Did you mean docsPath=apps/docs?"). */
67
+ discoveryHint?: string;
63
68
  }
64
69
 
65
70
  type Schema = Record<string, unknown>;
@@ -297,12 +302,121 @@ export function formatValidationErrors(errors: ErrorObject[] | null | undefined)
297
302
  return messages.join('. ');
298
303
  }
299
304
 
305
+ /** Limits keep worst-case repos (huge monorepos, generated dirs) cheap on failure. */
306
+ const DISCOVER_MAX_DEPTH = 3;
307
+ const DISCOVER_MAX_ENTRIES = 500;
308
+ const DISCOVER_SKIP_DIRS = new Set([
309
+ 'node_modules', '.git', '.next', '.turbo', '.cache',
310
+ 'dist', 'build', 'out', '.vercel', 'coverage',
311
+ ]);
312
+
313
+ export interface DocsJsonDiscovery {
314
+ /** Repo-relative paths (POSIX separators), sorted, to docs.json files. */
315
+ foundAt: string[];
316
+ /** First-level entries at the repo root, sorted. */
317
+ rootEntries: string[];
318
+ /** True if the walk hit DISCOVER_MAX_ENTRIES before finishing. */
319
+ truncated: boolean;
320
+ }
321
+
322
+ /**
323
+ * Walk `repoRoot` looking for any `docs.json`. Used only on the failure path —
324
+ * gives ops a snapshot of what was cloned and lets us suggest the right docsPath.
325
+ *
326
+ * Documented behavior (covered by tests):
327
+ * - Case-sensitive filename match (`docs.json` only, not `Docs.json`). Matches Linux
328
+ * prod semantics — macOS dev might see different fs.existsSync behavior but discovery
329
+ * is consistent across platforms.
330
+ * - Skips directories whose name starts with `.` (so `.config/docs.json` is invisible).
331
+ * - Skips symlinks unconditionally (cycle defense; Windows junctions covered by the
332
+ * entry+depth caps as a backstop).
333
+ * - Output paths use POSIX separators on all platforms.
334
+ * - `rootEntries` is the raw, sorted listing of the repo's top-level entries — it is
335
+ * captured once at depth 0 and is NOT bounded by DISCOVER_MAX_ENTRIES. Persistence
336
+ * layers (Firestore writes, structured logs) slice it to a fixed cap on their side.
337
+ *
338
+ * Limits: DISCOVER_MAX_DEPTH=3, DISCOVER_MAX_ENTRIES=500.
339
+ */
340
+ export async function discoverDocsJson(repoRoot: string): Promise<DocsJsonDiscovery> {
341
+ const foundAt: string[] = [];
342
+ let rootEntries: string[] = [];
343
+ let seen = 0;
344
+ let truncated = false;
345
+
346
+ async function walk(absDir: string, relDir: string, depth: number): Promise<void> {
347
+ if (truncated || depth > DISCOVER_MAX_DEPTH) return;
348
+ let entries: fs.Dirent[];
349
+ try {
350
+ entries = await fs.promises.readdir(absDir, { withFileTypes: true });
351
+ } catch {
352
+ return;
353
+ }
354
+ if (depth === 0) {
355
+ rootEntries = entries.map(e => e.name).sort();
356
+ }
357
+ for (const entry of entries) {
358
+ if (entry.isSymbolicLink()) continue;
359
+ if (entry.isDirectory() && (DISCOVER_SKIP_DIRS.has(entry.name) || entry.name.startsWith('.'))) continue;
360
+ if (++seen > DISCOVER_MAX_ENTRIES) {
361
+ truncated = true;
362
+ return;
363
+ }
364
+ const rel = relDir ? `${relDir}/${entry.name}` : entry.name;
365
+ if (entry.isDirectory()) {
366
+ await walk(path.join(absDir, entry.name), rel, depth + 1);
367
+ } else if (entry.isFile() && entry.name === 'docs.json') {
368
+ foundAt.push(rel);
369
+ }
370
+ }
371
+ }
372
+
373
+ await walk(repoRoot, '', 0);
374
+ foundAt.sort();
375
+ return { foundAt, rootEntries, truncated };
376
+ }
377
+
378
+ /**
379
+ * Build the prose remediation hint from a discovery snapshot. Pure function —
380
+ * separated from validateConfig so it can be unit-tested directly and so the
381
+ * hint phrasings live in one named place.
382
+ */
383
+ export function synthesizeDiscoveryHint(
384
+ foundAt: string[],
385
+ expectedRel: string,
386
+ docsPath?: string,
387
+ ): string {
388
+ const elsewhere = foundAt.filter(p => p !== expectedRel);
389
+ if (elsewhere.length === 1) {
390
+ // path.posix.dirname returns '.' for files at the root (e.g. 'docs.json' → '.').
391
+ const dir = path.posix.dirname(elsewhere[0]);
392
+ if (dir === '.') {
393
+ return docsPath
394
+ ? 'We found docs.json at the repository root. You can clear the docs path setting to use it.'
395
+ : 'We found docs.json at the repository root.';
396
+ }
397
+ return `We found docs.json at '${elsewhere[0]}'. Did you mean to set the docs path to '${dir}'?`;
398
+ }
399
+ if (elsewhere.length > 1) {
400
+ const list = elsewhere.slice(0, 3).map(p => `'${p}'`).join(', ');
401
+ const more = elsewhere.length > 3 ? ` and ${elsewhere.length - 3} more` : '';
402
+ return `We found docs.json at: ${list}${more}. Update the docs path setting to point at one of these.`;
403
+ }
404
+ return 'We could not find a docs.json file anywhere in this commit. '
405
+ + 'Check that you pushed the right branch and that docs.json is committed.';
406
+ }
407
+
300
408
  /**
301
- * Validate docs.json configuration
409
+ * Validate docs.json configuration.
302
410
  * @param configPath - Full path to docs.json
303
- * @param docsPath - Optional monorepo path for better error messages (e.g., "jamdesk")
411
+ * @param docsPath - Optional monorepo path for better error messages (e.g., "jamdesk")
412
+ * @param repoRoot - Optional repo root; when supplied, missing-file errors include
413
+ * a discovery snapshot and a remediation hint.
304
414
  */
305
- export async function validateConfig(configPath: string, docsPath?: string): Promise<ValidationResult> {
415
+ export async function validateConfig(
416
+ configPath: string,
417
+ docsPath?: string,
418
+ repoRoot?: string,
419
+ ): Promise<ValidationResult> {
306
420
  // Check file exists
307
421
  if (!fs.existsSync(configPath)) {
308
422
  // If `mint.json` sits where docs.json should be, the project is mid-migration
@@ -311,13 +425,27 @@ export async function validateConfig(configPath: string, docsPath?: string): Pro
311
425
  if (fs.existsSync(mintPath)) {
312
426
  return mintlifyMigrationError('Found `mint.json` but no `docs.json`.');
313
427
  }
314
- const pathHint = docsPath
428
+
429
+ const baseError = docsPath
315
430
  ? `Missing docs.json at '${docsPath}/docs.json'. Check that your monorepo path is correct.`
316
431
  : 'Missing docs.json configuration file. Your repository must have a docs.json file in the root directory.';
317
- return {
318
- valid: false,
319
- error: pathHint,
320
- };
432
+
433
+ if (!repoRoot) {
434
+ return { valid: false, error: baseError };
435
+ }
436
+
437
+ const discovery = await discoverDocsJson(repoRoot);
438
+
439
+ const normalizedDocsPath = docsPath
440
+ ? path.posix.normalize(docsPath.replace(/\\/g, '/').replace(/^\.\//, '')).replace(/\/$/, '')
441
+ : '';
442
+ const expectedRel = normalizedDocsPath
443
+ ? path.posix.join(normalizedDocsPath, 'docs.json')
444
+ : 'docs.json';
445
+
446
+ const discoveryHint = synthesizeDiscoveryHint(discovery.foundAt, expectedRel, docsPath);
447
+
448
+ return { valid: false, error: baseError, discovery, discoveryHint };
321
449
  }
322
450
 
323
451
  // Read and parse file
@@ -66,8 +66,20 @@ export interface FailureUpdate {
66
66
  failedPhase: string;
67
67
  timing: TimingSummary | null;
68
68
  memory?: MemoryStats;
69
+ /** docs.json discovery snapshot — populated only on missing-file validate failures. */
70
+ discovery?: {
71
+ foundAt: string[];
72
+ rootEntries: string[];
73
+ truncated: boolean;
74
+ };
69
75
  }
70
76
 
77
+ /**
78
+ * Cap applied when persisting `FailureUpdate.discovery.rootEntries` to keep
79
+ * Firestore docs and Cloud Run log payloads bounded on wide repos.
80
+ */
81
+ export const DISCOVERY_ROOT_ENTRIES_PERSIST_CAP = 30;
82
+
71
83
  export interface ErrorLogData {
72
84
  rawOutput: string;
73
85
  stderr: string;
@@ -1921,12 +1921,12 @@
1921
1921
  }
1922
1922
  },
1923
1923
  "node_modules/@types/node": {
1924
- "version": "25.7.0",
1925
- "resolved": "https://registry.npmjs.org/@types/node/-/node-25.7.0.tgz",
1926
- "integrity": "sha512-z+pdZyxE+RTQE9AcboAZCb4otwcrvgHD+GlBpPgn0emDVt0ohrTMhAwlr2Wd9nZ+nihhYFxO2pThz3C5qSu2Eg==",
1924
+ "version": "25.8.0",
1925
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-25.8.0.tgz",
1926
+ "integrity": "sha512-TCFSk8IZh+iLX1xtksoBVtdmgL+1IX0fC9BeU4QqFSuNdN/K+HUlhqOzEmSYYpZUVsLYcPqc9KX+60iDuninSQ==",
1927
1927
  "license": "MIT",
1928
1928
  "dependencies": {
1929
- "undici-types": "~7.21.0"
1929
+ "undici-types": ">=7.24.0 <7.24.7"
1930
1930
  }
1931
1931
  },
1932
1932
  "node_modules/@types/react": {
@@ -2913,9 +2913,9 @@
2913
2913
  }
2914
2914
  },
2915
2915
  "node_modules/dompurify": {
2916
- "version": "3.4.2",
2917
- "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.2.tgz",
2918
- "integrity": "sha512-lHeS9SA/IKeIFFyYciHBr2n0v1VMPlSj843HdLOwjb2OxNwdq9Xykxqhk+FE42MzAdHvInbAolSE4mhahPpjXA==",
2916
+ "version": "3.4.3",
2917
+ "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.3.tgz",
2918
+ "integrity": "sha512-VVwJidIJcp1hpg2OMXML3ZVRPYSZiq4aX7qBh83BSIpOaRDqI+qxhXjjIWnpzkOXhmp0L81lnoME1mnCc9H48A==",
2919
2919
  "license": "(MPL-2.0 OR Apache-2.0)",
2920
2920
  "optionalDependencies": {
2921
2921
  "@types/trusted-types": "^2.0.7"
@@ -2928,9 +2928,9 @@
2928
2928
  "license": "MIT"
2929
2929
  },
2930
2930
  "node_modules/electron-to-chromium": {
2931
- "version": "1.5.353",
2932
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.353.tgz",
2933
- "integrity": "sha512-kOrWphBi8TOZyiJZqsgqIle0lw+tzmnQK83pV9dZUd01Nm2POECSyFQMAuarzZdYqQW7FH9RaYOuaRo3h+bQ3w==",
2931
+ "version": "1.5.355",
2932
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.355.tgz",
2933
+ "integrity": "sha512-LUPZhKzZPYSPme1jEYohpkA+ybYCJztr1quAdBd7E7h3+VOBVcKkwwtBJu41nrjawrRzfb8mtMfzWozoaK0ZIQ==",
2934
2934
  "license": "ISC"
2935
2935
  },
2936
2936
  "node_modules/enhanced-resolve": {
@@ -3739,9 +3739,9 @@
3739
3739
  }
3740
3740
  },
3741
3741
  "node_modules/katex": {
3742
- "version": "0.16.45",
3743
- "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.45.tgz",
3744
- "integrity": "sha512-pQpZbdBu7wCTmQUh7ufPmLr0pFoObnGUoL/yhtwJDgmmQpbkg/0HSVti25Fu4rmd1oCR6NGWe9vqTWuWv3GcNA==",
3742
+ "version": "0.16.46",
3743
+ "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.46.tgz",
3744
+ "integrity": "sha512-WHy4Coo+bGZyH7NwJKHkS04YFsFcarWbAEOAC3EMndzdN6VSZqklLLIgfxzyaW9jDoeGYJX9SWbJPKpecox0Uw==",
3745
3745
  "funding": [
3746
3746
  "https://opencollective.com/katex",
3747
3747
  "https://github.com/sponsors/katex"
@@ -6279,9 +6279,9 @@
6279
6279
  "license": "MIT"
6280
6280
  },
6281
6281
  "node_modules/undici-types": {
6282
- "version": "7.21.0",
6283
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.21.0.tgz",
6284
- "integrity": "sha512-w9IMgQrz4O0YN1LtB7K5P63vhlIOvC7opSmouCJ+ZywlPAlO9gIkJ+otk6LvGpAs2wg4econaCz3TvQ9xPoyuQ==",
6282
+ "version": "7.24.6",
6283
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz",
6284
+ "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==",
6285
6285
  "license": "MIT"
6286
6286
  },
6287
6287
  "node_modules/unified": {