diff --git a/packages/render/package.json b/packages/render/package.json index df5ccbfeeb..d319a34925 100644 --- a/packages/render/package.json +++ b/packages/render/package.json @@ -124,6 +124,7 @@ "devDependencies": { "@edge-runtime/vm": "5.0.0", "@types/html-to-text": "9.0.4", + "@types/node": "^25.0.3", "@types/react": "npm:types-react@19.0.0-rc.1", "@types/react-dom": "npm:types-react-dom@19.0.0", "jsdom": "26.1.0", diff --git a/packages/render/src/browser/render.tsx b/packages/render/src/browser/render.tsx index a2cfd765f4..8f6ea6608f 100644 --- a/packages/render/src/browser/render.tsx +++ b/packages/render/src/browser/render.tsx @@ -1,7 +1,7 @@ import { Suspense } from 'react'; import { pretty, toPlainText } from '../node'; import type { Options } from '../shared/options'; -import { readStream } from '../shared/read-stream.browser'; +import { renderToReadableStream } from '../shared/render-to-readable-stream'; export const render = async (node: React.ReactNode, options?: Options) => { const suspendedElement = {node}; @@ -12,18 +12,7 @@ export const render = async (node: React.ReactNode, options?: Options) => { return m; }); - const html = await new Promise((resolve, reject) => { - reactDOMServer - .renderToReadableStream(suspendedElement, { - onError(error: unknown) { - reject(error); - }, - progressiveChunkSize: Number.POSITIVE_INFINITY, - }) - .then(readStream) - .then(resolve) - .catch(reject); - }); + const html = await renderToReadableStream(suspendedElement, reactDOMServer); if (options?.plainText) { return toPlainText(html, options.htmlToTextOptions); diff --git a/packages/render/src/edge/render.tsx b/packages/render/src/edge/render.tsx index 121cae7578..3c811e971b 100644 --- a/packages/render/src/edge/render.tsx +++ b/packages/render/src/edge/render.tsx @@ -1,7 +1,7 @@ import { Suspense } from 'react'; import { pretty } from '../node'; import type { Options } from '../shared/options'; -import { readStream } from '../shared/read-stream.browser'; +import { renderToReadableStream } from '../shared/render-to-readable-stream'; import { toPlainText } from '../shared/utils/to-plain-text'; import { importReactDom } from './import-react-dom'; @@ -18,18 +18,7 @@ export const render = async ( return m; }); - const html = await new Promise((resolve, reject) => { - reactDOMServer - .renderToReadableStream(suspendedElement, { - onError(error: unknown) { - reject(error); - }, - progressiveChunkSize: Number.POSITIVE_INFINITY, - }) - .then(readStream) - .then(resolve) - .catch(reject); - }); + const html = await renderToReadableStream(suspendedElement, reactDOMServer); if (options?.plainText) { return toPlainText(html, options.htmlToTextOptions); diff --git a/packages/render/src/node/read-stream.spec.ts b/packages/render/src/node/read-stream.spec.ts index a61867886c..3adb269313 100644 --- a/packages/render/src/node/read-stream.spec.ts +++ b/packages/render/src/node/read-stream.spec.ts @@ -3,189 +3,154 @@ import { describe, expect, it } from 'vitest'; import { readStream } from './read-stream'; describe('readStream', () => { - describe('multi-byte character handling', () => { - it('correctly decodes Japanese characters split across chunks', async () => { - // Create a string with Japanese text that will be split across chunks - const japaneseText = 'これはテストです。スケジュール確認をお願いします。'; - const buffer = Buffer.from(japaneseText, 'utf-8'); - - // Split the buffer at a position that would break a multi-byte character - // "ス" in UTF-8 is E3 82 B9, let's split after E3 82 - const splitPosition = buffer.indexOf(Buffer.from('スケジュール')) + 2; - - // Create chunks that split the character - const chunk1 = buffer.slice(0, splitPosition); - const chunk2 = buffer.slice(splitPosition); - - // Create a mock PipeableStream that emits our chunks - const mockStream = new Readable({ - read() { - if (this.chunkIndex === 0) { - this.push(chunk1); - this.chunkIndex++; - } else if (this.chunkIndex === 1) { - this.push(chunk2); - this.chunkIndex++; - } else { - this.push(null); // End the stream - } - }, - }); - mockStream.chunkIndex = 0; - - // Add pipe method to match PipeableStream interface - const pipeableStream = { - pipe: (writable: any) => mockStream.pipe(writable), - }; - - const result = await readStream(pipeableStream as any); - - // The result should match the original text without corruption - expect(result).toBe(japaneseText); - expect(result).not.toContain('\0'); // No null characters - expect(result).toContain('スケジュール'); // Full word intact + it('correctly decodes Japanese characters split across chunks', async () => { + // Create a string with Japanese text that will be split across chunks + const japaneseText = 'これはテストです。スケジュール確認をお願いします。'; + const buffer = Buffer.from(japaneseText, 'utf-8'); + + // Split the buffer at a position that would break a multi-byte character + // "ス" in UTF-8 is E3 82 B9, let's split after E3 82 + const splitPosition = buffer.indexOf(Buffer.from('スケジュール')) + 2; + + // Create chunks that split the character + const chunk1 = buffer.subarray(0, splitPosition); + const chunk2 = buffer.subarray(splitPosition); + + // Create a mock stream that emits our chunks + let chunkIndex = 0; + const mockStream = new Readable({ + read() { + if (chunkIndex === 0) { + this.push(chunk1); + chunkIndex++; + } else if (chunkIndex === 1) { + this.push(chunk2); + chunkIndex++; + } else { + this.push(null); // End the stream + } + }, }); - it('handles Chinese characters split across chunks', async () => { - const chineseText = '这是一个测试。请确认您的日程安排。'; - const buffer = Buffer.from(chineseText, 'utf-8'); - - // Split in the middle of a Chinese character - const splitPosition = buffer.indexOf(Buffer.from('日程')) + 1; - - const chunk1 = buffer.slice(0, splitPosition); - const chunk2 = buffer.slice(splitPosition); - - const mockStream = new Readable({ - read() { - if (this.chunkIndex === 0) { - this.push(chunk1); - this.chunkIndex++; - } else if (this.chunkIndex === 1) { - this.push(chunk2); - this.chunkIndex++; - } else { - this.push(null); - } - }, - }); - mockStream.chunkIndex = 0; - - const pipeableStream = { - pipe: (writable: any) => mockStream.pipe(writable), - }; - - const result = await readStream(pipeableStream as any); - - expect(result).toBe(chineseText); - expect(result).not.toContain('\0'); - expect(result).toContain('日程'); - }); + // Add pipe method to match stream interface + const pipeableStream = { + pipe: (writable: any) => mockStream.pipe(writable), + }; - it('handles emoji characters split across chunks', async () => { - const emojiText = 'Hello 👋 World 🌍 Test 🚀'; - const buffer = Buffer.from(emojiText, 'utf-8'); - - // Emojis are 4-byte UTF-8 sequences, split one - const rocketEmoji = Buffer.from('🚀'); - const splitPosition = buffer.indexOf(rocketEmoji) + 2; // Split in middle of rocket emoji - - const chunk1 = buffer.slice(0, splitPosition); - const chunk2 = buffer.slice(splitPosition); - - const mockStream = new Readable({ - read() { - if (this.chunkIndex === 0) { - this.push(chunk1); - this.chunkIndex++; - } else if (this.chunkIndex === 1) { - this.push(chunk2); - this.chunkIndex++; - } else { - this.push(null); - } - }, - }); - mockStream.chunkIndex = 0; - - const pipeableStream = { - pipe: (writable: any) => mockStream.pipe(writable), - }; - - const result = await readStream(pipeableStream as any); - - expect(result).toBe(emojiText); - expect(result).not.toContain('\0'); - expect(result).toContain('🚀'); - }); + const result = await readStream(pipeableStream as any); - it('handles many small chunks with multi-byte characters', async () => { - const mixedText = 'Test テスト 测试 Тест מבחן'; - const buffer = Buffer.from(mixedText, 'utf-8'); - - // Create many small chunks (3 bytes each) - const chunks: Buffer[] = []; - for (let i = 0; i < buffer.length; i += 3) { - chunks.push(buffer.slice(i, Math.min(i + 3, buffer.length))); - } - - let currentChunk = 0; - const mockStream = new Readable({ - read() { - if (currentChunk < chunks.length) { - this.push(chunks[currentChunk]); - currentChunk++; - } else { - this.push(null); - } - }, - }); - - const pipeableStream = { - pipe: (writable: any) => mockStream.pipe(writable), - }; - - const result = await readStream(pipeableStream as any); - - expect(result).toBe(mixedText); - expect(result).not.toContain('\0'); - expect(result).toContain('テスト'); - expect(result).toContain('测试'); - expect(result).toContain('Тест'); - expect(result).toContain('מבחן'); - }); + // The result should match the original text without corruption + expect(result).toBe(japaneseText); + expect(result).not.toContain('\0'); // No null characters + expect(result).toContain('スケジュール'); // Full word intact }); - describe('ReadableStream (pipeTo) path', () => { - it('handles multi-byte characters with ReadableStream', async () => { - const japaneseText = 'バクラクのメールテンプレートでスケジュール確認'; - const buffer = Buffer.from(japaneseText, 'utf-8'); + it('handles Chinese characters split across chunks', async () => { + const chineseText = '这是一个测试。请确认您的日程安排。'; + const buffer = Buffer.from(chineseText, 'utf-8'); + + // Split in the middle of a Chinese character + const splitPosition = buffer.indexOf(Buffer.from('日程')) + 1; + + const chunk1 = buffer.subarray(0, splitPosition); + const chunk2 = buffer.subarray(splitPosition); + + let chunkIndex = 0; + const mockStream = new Readable({ + read() { + if (chunkIndex === 0) { + this.push(chunk1); + chunkIndex++; + } else if (chunkIndex === 1) { + this.push(chunk2); + chunkIndex++; + } else { + this.push(null); + } + }, + }); - // Split at a position that breaks a character - const splitPosition = buffer.indexOf(Buffer.from('スケジュール')) + 2; - const chunk1 = buffer.slice(0, splitPosition); - const chunk2 = buffer.slice(splitPosition); + const pipeableStream = { + pipe: (writable: any) => mockStream.pipe(writable), + }; - // Mock a ReactDOMServerReadableStream - const chunks = [chunk1, chunk2]; + const result = await readStream(pipeableStream as any); - const mockReadableStream = { - pipeTo: async (writable: WritableStream) => { - const writer = writable.getWriter(); + expect(result).toBe(chineseText); + expect(result).not.toContain('\0'); + expect(result).toContain('日程'); + }); - for (const chunk of chunks) { - await writer.write(chunk); - } + it('handles emoji characters split across chunks', async () => { + const emojiText = 'Hello 👋 World 🌍 Test 🚀'; + const buffer = Buffer.from(emojiText, 'utf-8'); + + // Emojis are 4-byte UTF-8 sequences, split one + const rocketEmoji = Buffer.from('🚀'); + const splitPosition = buffer.indexOf(rocketEmoji) + 2; // Split in middle of rocket emoji + + const chunk1 = buffer.subarray(0, splitPosition); + const chunk2 = buffer.subarray(splitPosition); + + let chunkIndex = 0; + const mockStream = new Readable({ + read() { + if (chunkIndex === 0) { + this.push(chunk1); + chunkIndex++; + } else if (chunkIndex === 1) { + this.push(chunk2); + chunkIndex++; + } else { + this.push(null); + } + }, + }); - await writer.close(); - }, - }; + const pipeableStream = { + pipe: (writable: any) => mockStream.pipe(writable), + }; - const result = await readStream(mockReadableStream as any); + const result = await readStream(pipeableStream as any); - expect(result).toBe(japaneseText); - expect(result).not.toContain('\0'); - expect(result).toContain('スケジュール'); + expect(result).toBe(emojiText); + expect(result).not.toContain('\0'); + expect(result).toContain('🚀'); + }); + + it('handles many small chunks with multi-byte characters', async () => { + const mixedText = 'Test テスト 测试 Тест מבחן'; + const buffer = Buffer.from(mixedText, 'utf-8'); + + // Create many small chunks (3 bytes each) + const chunks: Buffer[] = []; + for (let i = 0; i < buffer.length; i += 3) { + chunks.push(buffer.subarray(i, Math.min(i + 3, buffer.length))); + } + + let currentChunk = 0; + const mockStream = new Readable({ + read() { + if (currentChunk < chunks.length) { + this.push(chunks[currentChunk]); + currentChunk++; + } else { + this.push(null); + } + }, }); + + const pipeableStream = { + pipe: (writable: any) => mockStream.pipe(writable), + }; + + const result = await readStream(pipeableStream as any); + + expect(result).toBe(mixedText); + expect(result).not.toContain('\0'); + expect(result).toContain('テスト'); + expect(result).toContain('测试'); + expect(result).toContain('Тест'); + expect(result).toContain('מבחן'); }); }); diff --git a/packages/render/src/node/read-stream.ts b/packages/render/src/node/read-stream.ts index e4226b6549..c9cf15baa2 100644 --- a/packages/render/src/node/read-stream.ts +++ b/packages/render/src/node/read-stream.ts @@ -1,53 +1,37 @@ import { Writable } from 'node:stream'; -import type { - PipeableStream, - ReactDOMServerReadableStream, -} from 'react-dom/server.browser'; +import type { PipeableStream } from 'react-dom/server.browser'; -export const readStream = async ( - stream: PipeableStream | ReactDOMServerReadableStream, -) => { +export const readStream = async (stream: PipeableStream) => { let result = ''; // Create a single TextDecoder instance to handle streaming properly - // This fixes issues with multi-byte characters (e.g., CJK) being split across chunks + // This fixes issues with multi-byte characters (e.g., CJK characters) being split across chunks const decoder = new TextDecoder('utf-8'); - if ('pipeTo' in stream) { - // means it's a readable stream - const writableStream = new WritableStream({ - write(chunk: BufferSource) { - // Use stream: true to handle multi-byte characters split across chunks - result += decoder.decode(chunk, { stream: true }); - }, - close() { - // Flush any remaining bytes - result += decoder.decode(); - }, - }); - await stream.pipeTo(writableStream); - } else { - const writable = new Writable({ - write(chunk: BufferSource, _encoding, callback) { - // Use stream: true to handle multi-byte characters split across chunks - result += decoder.decode(chunk, { stream: true }); + const writable = new Writable({ + write( + chunk: BufferSource, + _encoding: BufferEncoding, + callback: (error?: Error | null) => void, + ) { + // Use stream: true to handle multi-byte characters split across chunks + result += decoder.decode(chunk, { stream: true }); - callback(); - }, - final(callback) { - // Flush any remaining bytes - result += decoder.decode(); - callback(); - }, - }); - stream.pipe(writable); + callback(); + }, + final(callback: (error?: Error | null) => void) { + // Flush any remaining bytes + result += decoder.decode(); + callback(); + }, + }); + stream.pipe(writable); - await new Promise((resolve, reject) => { - writable.on('error', reject); - writable.on('close', () => { - resolve(); - }); + await new Promise((resolve, reject) => { + writable.on('error', reject); + writable.on('close', () => { + resolve(); }); - } + }); return result; }; diff --git a/packages/render/src/node/render.tsx b/packages/render/src/node/render.tsx index 642d14e131..cff88220b1 100644 --- a/packages/render/src/node/render.tsx +++ b/packages/render/src/node/render.tsx @@ -1,5 +1,6 @@ import { Suspense } from 'react'; import type { Options } from '../shared/options'; +import { renderToReadableStream } from '../shared/render-to-readable-stream'; import { pretty } from '../shared/utils/pretty'; import { toPlainText } from '../shared/utils/to-plain-text'; import { readStream } from './read-stream'; @@ -18,11 +19,7 @@ export const render = async (node: React.ReactNode, options?: Options) => { Object.hasOwn(reactDOMServer, 'renderToReadableStream') && typeof WritableStream !== 'undefined' ) { - html = await readStream( - await reactDOMServer.renderToReadableStream(suspendedElement, { - progressiveChunkSize: Number.POSITIVE_INFINITY, - }), - ); + html = await renderToReadableStream(suspendedElement, reactDOMServer); } else { await new Promise((resolve, reject) => { const stream = reactDOMServer.renderToPipeableStream(suspendedElement, { @@ -30,6 +27,9 @@ export const render = async (node: React.ReactNode, options?: Options) => { html = await readStream(stream); resolve(); }, + onShellError(error) { + reject(error as Error); + }, onError(error) { reject(error as Error); }, diff --git a/packages/render/src/shared/read-stream.browser.spec.ts b/packages/render/src/shared/read-stream.browser.spec.ts new file mode 100644 index 0000000000..7ce2a433f4 --- /dev/null +++ b/packages/render/src/shared/read-stream.browser.spec.ts @@ -0,0 +1,34 @@ +import { readStream } from './read-stream.browser'; + +describe('readStream() for the browser', () => { + it('handles multi-byte characters with ReadableStream', async () => { + const japaneseText = 'バクラクのメールテンプレートでスケジュール確認'; + const buffer = Buffer.from(japaneseText, 'utf-8'); + + // Split at a position that breaks a character + const splitPosition = buffer.indexOf(Buffer.from('スケジュール')) + 2; + const chunk1 = buffer.subarray(0, splitPosition); + const chunk2 = buffer.subarray(splitPosition); + + // Mock a ReactDOMServerReadableStream + const chunks = [chunk1, chunk2]; + + const mockReadableStream = { + pipeTo: async (writable: WritableStream) => { + const writer = writable.getWriter(); + + for (const chunk of chunks) { + await writer.write(chunk); + } + + await writer.close(); + }, + }; + + const result = await readStream(mockReadableStream as any); + + expect(result).toBe(japaneseText); + expect(result).not.toContain('\0'); + expect(result).toContain('スケジュール'); + }); +}); diff --git a/packages/render/src/shared/read-stream.browser.ts b/packages/render/src/shared/read-stream.browser.ts index 0a619f88d2..4582e85c96 100644 --- a/packages/render/src/shared/read-stream.browser.ts +++ b/packages/render/src/shared/read-stream.browser.ts @@ -1,34 +1,22 @@ import type { ReactDOMServerReadableStream } from 'react-dom/server.browser'; -const decoder = new TextDecoder('utf-8'); - export const readStream = async (stream: ReactDOMServerReadableStream) => { - const chunks: Uint8Array[] = []; + let result = ''; + // Create a single TextDecoder instance to handle streaming properly + // This fixes issues with multi-byte characters (e.g., CJK) being split across chunks + const decoder = new TextDecoder('utf-8'); const writableStream = new WritableStream({ - write(chunk: Uint8Array) { - chunks.push(chunk); + write(chunk: BufferSource) { + // Use stream: true to handle multi-byte characters split across chunks + result += decoder.decode(chunk, { stream: true }); }, - abort(reason) { - throw new Error('Stream aborted', { - cause: { - reason, - }, - }); + close() { + // Flush any remaining bytes + result += decoder.decode(); }, }); await stream.pipeTo(writableStream); - let length = 0; - chunks.forEach((item) => { - length += item.length; - }); - const mergedChunks = new Uint8Array(length); - let offset = 0; - chunks.forEach((item) => { - mergedChunks.set(item, offset); - offset += item.length; - }); - - return decoder.decode(mergedChunks); + return result; }; diff --git a/packages/render/src/shared/render-to-readable-stream.ts b/packages/render/src/shared/render-to-readable-stream.ts new file mode 100644 index 0000000000..7090924922 --- /dev/null +++ b/packages/render/src/shared/render-to-readable-stream.ts @@ -0,0 +1,19 @@ +import { readStream } from './read-stream.browser'; + +export function renderToReadableStream( + node: React.ReactNode, + reactDomServer: typeof import('react-dom/server'), +) { + return new Promise((resolve, reject) => { + return reactDomServer + .renderToReadableStream(node, { + onError(error: unknown) { + reject(error); + }, + progressiveChunkSize: Number.POSITIVE_INFINITY, + }) + .then(readStream) + .then(resolve) + .catch(reject); + }); +} diff --git a/packages/render/tsconfig.json b/packages/render/tsconfig.json index cd6c94d6e8..19fb0c9adf 100644 --- a/packages/render/tsconfig.json +++ b/packages/render/tsconfig.json @@ -1,5 +1,8 @@ { "extends": "tsconfig/react-library.json", + "compilerOptions": { + "types": ["node", "vitest/globals"] + }, "include": ["."], "exclude": ["dist", "build", "node_modules"] } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 04673343d3..6008bab073 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -89,7 +89,7 @@ importers: dependencies: mintlify: specifier: 4.2.218 - version: 4.2.218(@radix-ui/react-popover@1.1.15(@types/react-dom@19.0.1)(@types/react@19.2.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/node@24.9.1)(@types/react@19.2.6)(acorn@8.11.2)(react-dom@19.0.0(react@19.0.0))(typescript@5.9.3) + version: 4.2.218(@radix-ui/react-popover@1.1.15(@types/react-dom@19.0.1)(@types/react@19.2.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/node@22.14.1)(@types/react@19.2.6)(acorn@8.15.0)(react-dom@19.0.0(react@19.0.0))(typescript@5.9.3) zod: specifier: 3.24.3 version: 3.24.3 @@ -934,6 +934,9 @@ importers: '@types/html-to-text': specifier: 9.0.4 version: 9.0.4 + '@types/node': + specifier: ^25.0.3 + version: 25.0.3 '@types/react': specifier: ^19.0.1 version: 19.0.1 @@ -1044,7 +1047,7 @@ importers: version: 0.8.15 '@vitejs/plugin-react': specifier: 4.4.1 - version: 4.4.1(vite@6.4.1(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.6.1)) + version: 4.4.1(vite@6.4.1(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.6.1)) css-tree: specifier: 3.1.0 version: 3.1.0 @@ -1062,7 +1065,7 @@ importers: version: 5.8.3 vite: specifier: 6.4.1 - version: 6.4.1(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.6.1) + version: 6.4.1(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.6.1) yalc: specifier: 1.0.0-pre.53 version: 1.0.0-pre.53 @@ -4530,8 +4533,8 @@ packages: '@types/node@22.14.1': resolution: {integrity: sha512-u0HuPQwe/dHrItgHHpmw3N2fYCR6x4ivMNbPHRkBVP4CvN+kiRrKHWk3i8tXiO/joPwXLMYvF9TTF0eqgHIuOw==} - '@types/node@24.9.1': - resolution: {integrity: sha512-QoiaXANRkSXK6p0Duvt56W208du4P9Uye9hWLWgGMDTEoKPhuenzNcC4vGUmrNkiOKTlIrBoyNQYNpSwfEZXSg==} + '@types/node@25.0.3': + resolution: {integrity: sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA==} '@types/normalize-path@3.0.2': resolution: {integrity: sha512-DO++toKYPaFn0Z8hQ7Tx+3iT9t77IJo/nDiqTXilgEP+kPNIYdpS9kh3fXuc53ugqwp9pxC1PVjCpV1tQDyqMA==} @@ -10788,51 +10791,51 @@ snapshots: '@inquirer/ansi@1.0.2': {} - '@inquirer/checkbox@4.3.1(@types/node@24.9.1)': + '@inquirer/checkbox@4.3.1(@types/node@22.14.1)': dependencies: '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.1(@types/node@24.9.1) + '@inquirer/core': 10.3.1(@types/node@22.14.1) '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@24.9.1) + '@inquirer/type': 3.0.10(@types/node@22.14.1) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 24.9.1 + '@types/node': 22.14.1 - '@inquirer/confirm@5.1.20(@types/node@24.9.1)': + '@inquirer/confirm@5.1.20(@types/node@22.14.1)': dependencies: - '@inquirer/core': 10.3.1(@types/node@24.9.1) - '@inquirer/type': 3.0.10(@types/node@24.9.1) + '@inquirer/core': 10.3.1(@types/node@22.14.1) + '@inquirer/type': 3.0.10(@types/node@22.14.1) optionalDependencies: - '@types/node': 24.9.1 + '@types/node': 22.14.1 - '@inquirer/core@10.3.1(@types/node@24.9.1)': + '@inquirer/core@10.3.1(@types/node@22.14.1)': dependencies: '@inquirer/ansi': 1.0.2 '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@24.9.1) + '@inquirer/type': 3.0.10(@types/node@22.14.1) cli-width: 4.1.0 mute-stream: 3.0.0 signal-exit: 4.1.0 wrap-ansi: 6.2.0 yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 24.9.1 + '@types/node': 22.14.1 - '@inquirer/editor@4.2.22(@types/node@24.9.1)': + '@inquirer/editor@4.2.22(@types/node@22.14.1)': dependencies: - '@inquirer/core': 10.3.1(@types/node@24.9.1) - '@inquirer/external-editor': 1.0.3(@types/node@24.9.1) - '@inquirer/type': 3.0.10(@types/node@24.9.1) + '@inquirer/core': 10.3.1(@types/node@22.14.1) + '@inquirer/external-editor': 1.0.3(@types/node@22.14.1) + '@inquirer/type': 3.0.10(@types/node@22.14.1) optionalDependencies: - '@types/node': 24.9.1 + '@types/node': 22.14.1 - '@inquirer/expand@4.0.22(@types/node@24.9.1)': + '@inquirer/expand@4.0.22(@types/node@22.14.1)': dependencies: - '@inquirer/core': 10.3.1(@types/node@24.9.1) - '@inquirer/type': 3.0.10(@types/node@24.9.1) + '@inquirer/core': 10.3.1(@types/node@22.14.1) + '@inquirer/type': 3.0.10(@types/node@22.14.1) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 24.9.1 + '@types/node': 22.14.1 '@inquirer/external-editor@1.0.3(@types/node@22.14.1)': dependencies: @@ -10841,97 +10844,90 @@ snapshots: optionalDependencies: '@types/node': 22.14.1 - '@inquirer/external-editor@1.0.3(@types/node@24.9.1)': - dependencies: - chardet: 2.1.1 - iconv-lite: 0.7.0 - optionalDependencies: - '@types/node': 24.9.1 - '@inquirer/figures@1.0.15': {} - '@inquirer/input@4.3.0(@types/node@24.9.1)': + '@inquirer/input@4.3.0(@types/node@22.14.1)': dependencies: - '@inquirer/core': 10.3.1(@types/node@24.9.1) - '@inquirer/type': 3.0.10(@types/node@24.9.1) + '@inquirer/core': 10.3.1(@types/node@22.14.1) + '@inquirer/type': 3.0.10(@types/node@22.14.1) optionalDependencies: - '@types/node': 24.9.1 + '@types/node': 22.14.1 - '@inquirer/number@3.0.22(@types/node@24.9.1)': + '@inquirer/number@3.0.22(@types/node@22.14.1)': dependencies: - '@inquirer/core': 10.3.1(@types/node@24.9.1) - '@inquirer/type': 3.0.10(@types/node@24.9.1) + '@inquirer/core': 10.3.1(@types/node@22.14.1) + '@inquirer/type': 3.0.10(@types/node@22.14.1) optionalDependencies: - '@types/node': 24.9.1 + '@types/node': 22.14.1 - '@inquirer/password@4.0.22(@types/node@24.9.1)': + '@inquirer/password@4.0.22(@types/node@22.14.1)': dependencies: '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.1(@types/node@24.9.1) - '@inquirer/type': 3.0.10(@types/node@24.9.1) + '@inquirer/core': 10.3.1(@types/node@22.14.1) + '@inquirer/type': 3.0.10(@types/node@22.14.1) optionalDependencies: - '@types/node': 24.9.1 - - '@inquirer/prompts@7.10.0(@types/node@24.9.1)': - dependencies: - '@inquirer/checkbox': 4.3.1(@types/node@24.9.1) - '@inquirer/confirm': 5.1.20(@types/node@24.9.1) - '@inquirer/editor': 4.2.22(@types/node@24.9.1) - '@inquirer/expand': 4.0.22(@types/node@24.9.1) - '@inquirer/input': 4.3.0(@types/node@24.9.1) - '@inquirer/number': 3.0.22(@types/node@24.9.1) - '@inquirer/password': 4.0.22(@types/node@24.9.1) - '@inquirer/rawlist': 4.1.10(@types/node@24.9.1) - '@inquirer/search': 3.2.1(@types/node@24.9.1) - '@inquirer/select': 4.4.1(@types/node@24.9.1) + '@types/node': 22.14.1 + + '@inquirer/prompts@7.10.0(@types/node@22.14.1)': + dependencies: + '@inquirer/checkbox': 4.3.1(@types/node@22.14.1) + '@inquirer/confirm': 5.1.20(@types/node@22.14.1) + '@inquirer/editor': 4.2.22(@types/node@22.14.1) + '@inquirer/expand': 4.0.22(@types/node@22.14.1) + '@inquirer/input': 4.3.0(@types/node@22.14.1) + '@inquirer/number': 3.0.22(@types/node@22.14.1) + '@inquirer/password': 4.0.22(@types/node@22.14.1) + '@inquirer/rawlist': 4.1.10(@types/node@22.14.1) + '@inquirer/search': 3.2.1(@types/node@22.14.1) + '@inquirer/select': 4.4.1(@types/node@22.14.1) optionalDependencies: - '@types/node': 24.9.1 - - '@inquirer/prompts@7.9.0(@types/node@24.9.1)': - dependencies: - '@inquirer/checkbox': 4.3.1(@types/node@24.9.1) - '@inquirer/confirm': 5.1.20(@types/node@24.9.1) - '@inquirer/editor': 4.2.22(@types/node@24.9.1) - '@inquirer/expand': 4.0.22(@types/node@24.9.1) - '@inquirer/input': 4.3.0(@types/node@24.9.1) - '@inquirer/number': 3.0.22(@types/node@24.9.1) - '@inquirer/password': 4.0.22(@types/node@24.9.1) - '@inquirer/rawlist': 4.1.10(@types/node@24.9.1) - '@inquirer/search': 3.2.1(@types/node@24.9.1) - '@inquirer/select': 4.4.1(@types/node@24.9.1) + '@types/node': 22.14.1 + + '@inquirer/prompts@7.9.0(@types/node@22.14.1)': + dependencies: + '@inquirer/checkbox': 4.3.1(@types/node@22.14.1) + '@inquirer/confirm': 5.1.20(@types/node@22.14.1) + '@inquirer/editor': 4.2.22(@types/node@22.14.1) + '@inquirer/expand': 4.0.22(@types/node@22.14.1) + '@inquirer/input': 4.3.0(@types/node@22.14.1) + '@inquirer/number': 3.0.22(@types/node@22.14.1) + '@inquirer/password': 4.0.22(@types/node@22.14.1) + '@inquirer/rawlist': 4.1.10(@types/node@22.14.1) + '@inquirer/search': 3.2.1(@types/node@22.14.1) + '@inquirer/select': 4.4.1(@types/node@22.14.1) optionalDependencies: - '@types/node': 24.9.1 + '@types/node': 22.14.1 - '@inquirer/rawlist@4.1.10(@types/node@24.9.1)': + '@inquirer/rawlist@4.1.10(@types/node@22.14.1)': dependencies: - '@inquirer/core': 10.3.1(@types/node@24.9.1) - '@inquirer/type': 3.0.10(@types/node@24.9.1) + '@inquirer/core': 10.3.1(@types/node@22.14.1) + '@inquirer/type': 3.0.10(@types/node@22.14.1) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 24.9.1 + '@types/node': 22.14.1 - '@inquirer/search@3.2.1(@types/node@24.9.1)': + '@inquirer/search@3.2.1(@types/node@22.14.1)': dependencies: - '@inquirer/core': 10.3.1(@types/node@24.9.1) + '@inquirer/core': 10.3.1(@types/node@22.14.1) '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@24.9.1) + '@inquirer/type': 3.0.10(@types/node@22.14.1) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 24.9.1 + '@types/node': 22.14.1 - '@inquirer/select@4.4.1(@types/node@24.9.1)': + '@inquirer/select@4.4.1(@types/node@22.14.1)': dependencies: '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.1(@types/node@24.9.1) + '@inquirer/core': 10.3.1(@types/node@22.14.1) '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@24.9.1) + '@inquirer/type': 3.0.10(@types/node@22.14.1) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 24.9.1 + '@types/node': 22.14.1 - '@inquirer/type@3.0.10(@types/node@24.9.1)': + '@inquirer/type@3.0.10(@types/node@22.14.1)': optionalDependencies: - '@types/node': 24.9.1 + '@types/node': 22.14.1 '@isaacs/balanced-match@4.0.1': {} @@ -11061,6 +11057,36 @@ snapshots: - acorn - supports-color + '@mdx-js/mdx@3.1.0(acorn@8.15.0)': + dependencies: + '@types/estree': 1.0.8 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdx': 2.0.13 + collapse-white-space: 2.1.0 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-util-scope: 1.0.0 + estree-walker: 3.0.3 + hast-util-to-jsx-runtime: 2.3.3 + markdown-extensions: 2.0.0 + recma-build-jsx: 1.0.0 + recma-jsx: 1.0.0(acorn@8.15.0) + recma-stringify: 1.0.0 + rehype-recma: 1.0.0 + remark-mdx: 3.1.0 + remark-parse: 11.0.0 + remark-rehype: 11.1.1 + source-map: 0.7.4 + unified: 11.0.5 + unist-util-position-from-estree: 2.0.0 + unist-util-stringify-position: 4.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + transitivePeerDependencies: + - acorn + - supports-color + '@mdx-js/react@3.1.0(@types/react@19.2.6)(react@19.0.0)': dependencies: '@types/mdx': 2.0.13 @@ -11069,15 +11095,15 @@ snapshots: '@mediapipe/tasks-vision@0.10.17': {} - '@mintlify/cli@4.0.822(@radix-ui/react-popover@1.1.15(@types/react-dom@19.0.1)(@types/react@19.2.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/node@24.9.1)(@types/react@19.2.6)(acorn@8.11.2)(react-dom@19.0.0(react@19.0.0))(typescript@5.9.3)': + '@mintlify/cli@4.0.822(@radix-ui/react-popover@1.1.15(@types/react-dom@19.0.1)(@types/react@19.2.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/node@22.14.1)(@types/react@19.2.6)(acorn@8.15.0)(react-dom@19.0.0(react@19.0.0))(typescript@5.9.3)': dependencies: - '@inquirer/prompts': 7.9.0(@types/node@24.9.1) + '@inquirer/prompts': 7.9.0(@types/node@22.14.1) '@mintlify/common': 1.0.619(@radix-ui/react-popover@1.1.15(@types/react-dom@19.0.1)(@types/react@19.2.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.2.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.9.3) - '@mintlify/link-rot': 3.0.762(@radix-ui/react-popover@1.1.15(@types/react-dom@19.0.1)(@types/react@19.2.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.2.6)(acorn@8.11.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.9.3) + '@mintlify/link-rot': 3.0.762(@radix-ui/react-popover@1.1.15(@types/react-dom@19.0.1)(@types/react@19.2.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.2.6)(acorn@8.15.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.9.3) '@mintlify/models': 0.0.243 - '@mintlify/prebuild': 1.0.748(@radix-ui/react-popover@1.1.15(@types/react-dom@19.0.1)(@types/react@19.2.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.2.6)(acorn@8.11.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.9.3) - '@mintlify/previewing': 4.0.798(@radix-ui/react-popover@1.1.15(@types/react-dom@19.0.1)(@types/react@19.2.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.2.6)(acorn@8.11.2)(react-dom@19.0.0(react@19.0.0))(typescript@5.9.3) - '@mintlify/validation': 0.1.529(@radix-ui/react-popover@1.1.15(@types/react-dom@19.0.1)(@types/react@19.2.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.2.6)(acorn@8.11.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.9.3) + '@mintlify/prebuild': 1.0.748(@radix-ui/react-popover@1.1.15(@types/react-dom@19.0.1)(@types/react@19.2.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.2.6)(acorn@8.15.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.9.3) + '@mintlify/previewing': 4.0.798(@radix-ui/react-popover@1.1.15(@types/react-dom@19.0.1)(@types/react@19.2.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.2.6)(acorn@8.15.0)(react-dom@19.0.0(react@19.0.0))(typescript@5.9.3) + '@mintlify/validation': 0.1.529(@radix-ui/react-popover@1.1.15(@types/react-dom@19.0.1)(@types/react@19.2.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.2.6)(acorn@8.15.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.9.3) adm-zip: 0.5.16 chalk: 5.2.0 color: 4.2.3 @@ -11085,7 +11111,7 @@ snapshots: fs-extra: 11.2.0 gray-matter: 4.0.3 ink: 6.3.0(@types/react@19.2.6)(react@19.0.0) - inquirer: 12.3.0(@types/node@24.9.1) + inquirer: 12.3.0(@types/node@22.14.1) js-yaml: 4.1.0 mdast-util-mdx-jsx: 3.2.0 react: 19.0.0 @@ -11164,12 +11190,12 @@ snapshots: - ts-node - typescript - '@mintlify/link-rot@3.0.762(@radix-ui/react-popover@1.1.15(@types/react-dom@19.0.1)(@types/react@19.2.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.2.6)(acorn@8.11.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.9.3)': + '@mintlify/link-rot@3.0.762(@radix-ui/react-popover@1.1.15(@types/react-dom@19.0.1)(@types/react@19.2.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.2.6)(acorn@8.15.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.9.3)': dependencies: '@mintlify/common': 1.0.619(@radix-ui/react-popover@1.1.15(@types/react-dom@19.0.1)(@types/react@19.2.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.2.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.9.3) - '@mintlify/prebuild': 1.0.748(@radix-ui/react-popover@1.1.15(@types/react-dom@19.0.1)(@types/react@19.2.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.2.6)(acorn@8.11.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.9.3) - '@mintlify/previewing': 4.0.798(@radix-ui/react-popover@1.1.15(@types/react-dom@19.0.1)(@types/react@19.2.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.2.6)(acorn@8.11.2)(react-dom@19.0.0(react@19.0.0))(typescript@5.9.3) - '@mintlify/validation': 0.1.529(@radix-ui/react-popover@1.1.15(@types/react-dom@19.0.1)(@types/react@19.2.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.2.6)(acorn@8.11.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.9.3) + '@mintlify/prebuild': 1.0.748(@radix-ui/react-popover@1.1.15(@types/react-dom@19.0.1)(@types/react@19.2.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.2.6)(acorn@8.15.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.9.3) + '@mintlify/previewing': 4.0.798(@radix-ui/react-popover@1.1.15(@types/react-dom@19.0.1)(@types/react@19.2.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.2.6)(acorn@8.15.0)(react-dom@19.0.0(react@19.0.0))(typescript@5.9.3) + '@mintlify/validation': 0.1.529(@radix-ui/react-popover@1.1.15(@types/react-dom@19.0.1)(@types/react@19.2.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.2.6)(acorn@8.15.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.9.3) fs-extra: 11.1.0 unist-util-visit: 4.1.2 transitivePeerDependencies: @@ -11215,6 +11241,33 @@ snapshots: - supports-color - typescript + '@mintlify/mdx@3.0.4(@radix-ui/react-popover@1.1.15(@types/react-dom@19.0.1)(@types/react@19.2.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.2.6)(acorn@8.15.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.9.3)': + dependencies: + '@radix-ui/react-popover': 1.1.15(@types/react-dom@19.0.1)(@types/react@19.2.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@shikijs/transformers': 3.15.0 + '@shikijs/twoslash': 3.15.0(typescript@5.9.3) + arktype: 2.1.26 + hast-util-to-string: 3.0.1 + mdast-util-from-markdown: 2.0.2 + mdast-util-gfm: 3.1.0 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-to-hast: 13.2.0 + next-mdx-remote-client: 1.0.7(@types/react@19.2.6)(acorn@8.15.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + rehype-katex: 7.0.1 + remark-gfm: 4.0.1 + remark-math: 6.0.0 + remark-smartypants: 3.0.2 + shiki: 3.15.0 + unified: 11.0.5 + unist-util-visit: 5.0.0 + transitivePeerDependencies: + - '@types/react' + - acorn + - supports-color + - typescript + '@mintlify/models@0.0.243': dependencies: axios: 1.10.0 @@ -11231,12 +11284,12 @@ snapshots: leven: 4.0.0 yaml: 2.6.1 - '@mintlify/prebuild@1.0.748(@radix-ui/react-popover@1.1.15(@types/react-dom@19.0.1)(@types/react@19.2.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.2.6)(acorn@8.11.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.9.3)': + '@mintlify/prebuild@1.0.748(@radix-ui/react-popover@1.1.15(@types/react-dom@19.0.1)(@types/react@19.2.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.2.6)(acorn@8.15.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.9.3)': dependencies: '@mintlify/common': 1.0.619(@radix-ui/react-popover@1.1.15(@types/react-dom@19.0.1)(@types/react@19.2.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.2.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.9.3) '@mintlify/openapi-parser': 0.0.8 '@mintlify/scraping': 4.0.479(@radix-ui/react-popover@1.1.15(@types/react-dom@19.0.1)(@types/react@19.2.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.2.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.9.3) - '@mintlify/validation': 0.1.529(@radix-ui/react-popover@1.1.15(@types/react-dom@19.0.1)(@types/react@19.2.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.2.6)(acorn@8.11.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.9.3) + '@mintlify/validation': 0.1.529(@radix-ui/react-popover@1.1.15(@types/react-dom@19.0.1)(@types/react@19.2.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.2.6)(acorn@8.15.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.9.3) chalk: 5.3.0 favicons: 7.2.0 fs-extra: 11.1.0 @@ -11262,11 +11315,11 @@ snapshots: - typescript - utf-8-validate - '@mintlify/previewing@4.0.798(@radix-ui/react-popover@1.1.15(@types/react-dom@19.0.1)(@types/react@19.2.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.2.6)(acorn@8.11.2)(react-dom@19.0.0(react@19.0.0))(typescript@5.9.3)': + '@mintlify/previewing@4.0.798(@radix-ui/react-popover@1.1.15(@types/react-dom@19.0.1)(@types/react@19.2.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.2.6)(acorn@8.15.0)(react-dom@19.0.0(react@19.0.0))(typescript@5.9.3)': dependencies: '@mintlify/common': 1.0.619(@radix-ui/react-popover@1.1.15(@types/react-dom@19.0.1)(@types/react@19.2.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.2.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.9.3) - '@mintlify/prebuild': 1.0.748(@radix-ui/react-popover@1.1.15(@types/react-dom@19.0.1)(@types/react@19.2.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.2.6)(acorn@8.11.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.9.3) - '@mintlify/validation': 0.1.529(@radix-ui/react-popover@1.1.15(@types/react-dom@19.0.1)(@types/react@19.2.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.2.6)(acorn@8.11.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.9.3) + '@mintlify/prebuild': 1.0.748(@radix-ui/react-popover@1.1.15(@types/react-dom@19.0.1)(@types/react@19.2.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.2.6)(acorn@8.15.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.9.3) + '@mintlify/validation': 0.1.529(@radix-ui/react-popover@1.1.15(@types/react-dom@19.0.1)(@types/react@19.2.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.2.6)(acorn@8.15.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.9.3) better-opn: 3.0.2 chalk: 5.2.0 chokidar: 3.5.3 @@ -11355,6 +11408,29 @@ snapshots: - supports-color - typescript + '@mintlify/validation@0.1.529(@radix-ui/react-popover@1.1.15(@types/react-dom@19.0.1)(@types/react@19.2.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.2.6)(acorn@8.15.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.9.3)': + dependencies: + '@mintlify/mdx': 3.0.4(@radix-ui/react-popover@1.1.15(@types/react-dom@19.0.1)(@types/react@19.2.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.2.6)(acorn@8.15.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.9.3) + '@mintlify/models': 0.0.243 + arktype: 2.1.27 + js-yaml: 4.1.0 + lcm: 0.0.3 + lodash: 4.17.21 + object-hash: 3.0.0 + openapi-types: 12.1.3 + uuid: 11.1.0 + zod: 3.21.4 + zod-to-json-schema: 3.20.4(zod@3.21.4) + transitivePeerDependencies: + - '@radix-ui/react-popover' + - '@types/react' + - acorn + - debug + - react + - react-dom + - supports-color + - typescript + '@monogrid/gainmap-js@3.1.0(three@0.170.0)': dependencies: promise-worker-transferable: 1.0.4 @@ -13297,7 +13373,7 @@ snapshots: dependencies: undici-types: 6.21.0 - '@types/node@24.9.1': + '@types/node@25.0.3': dependencies: undici-types: 7.16.0 @@ -13413,14 +13489,14 @@ snapshots: next: 16.0.10(@babel/core@7.26.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: 19.0.0 - '@vitejs/plugin-react@4.4.1(vite@6.4.1(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.6.1))': + '@vitejs/plugin-react@4.4.1(vite@6.4.1(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.6.1))': dependencies: '@babel/core': 7.26.10 '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.10) '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.10) '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 6.4.1(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.6.1) + vite: 6.4.1(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.6.1) transitivePeerDependencies: - supports-color @@ -15652,12 +15728,12 @@ snapshots: inline-style-parser@0.2.4: {} - inquirer@12.3.0(@types/node@24.9.1): + inquirer@12.3.0(@types/node@22.14.1): dependencies: - '@inquirer/core': 10.3.1(@types/node@24.9.1) - '@inquirer/prompts': 7.10.0(@types/node@24.9.1) - '@inquirer/type': 3.0.10(@types/node@24.9.1) - '@types/node': 24.9.1 + '@inquirer/core': 10.3.1(@types/node@22.14.1) + '@inquirer/prompts': 7.10.0(@types/node@22.14.1) + '@inquirer/type': 3.0.10(@types/node@22.14.1) + '@types/node': 22.14.1 ansi-escapes: 4.3.2 mute-stream: 2.0.0 run-async: 3.0.0 @@ -16709,9 +16785,9 @@ snapshots: minipass: 3.3.6 yallist: 4.0.0 - mintlify@4.2.218(@radix-ui/react-popover@1.1.15(@types/react-dom@19.0.1)(@types/react@19.2.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/node@24.9.1)(@types/react@19.2.6)(acorn@8.11.2)(react-dom@19.0.0(react@19.0.0))(typescript@5.9.3): + mintlify@4.2.218(@radix-ui/react-popover@1.1.15(@types/react-dom@19.0.1)(@types/react@19.2.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/node@22.14.1)(@types/react@19.2.6)(acorn@8.15.0)(react-dom@19.0.0(react@19.0.0))(typescript@5.9.3): dependencies: - '@mintlify/cli': 4.0.822(@radix-ui/react-popover@1.1.15(@types/react-dom@19.0.1)(@types/react@19.2.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/node@24.9.1)(@types/react@19.2.6)(acorn@8.11.2)(react-dom@19.0.0(react@19.0.0))(typescript@5.9.3) + '@mintlify/cli': 4.0.822(@radix-ui/react-popover@1.1.15(@types/react-dom@19.0.1)(@types/react@19.2.6)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/node@22.14.1)(@types/react@19.2.6)(acorn@8.15.0)(react-dom@19.0.0(react@19.0.0))(typescript@5.9.3) transitivePeerDependencies: - '@radix-ui/react-popover' - '@types/node' @@ -16789,6 +16865,22 @@ snapshots: - acorn - supports-color + next-mdx-remote-client@1.0.7(@types/react@19.2.6)(acorn@8.15.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + dependencies: + '@babel/code-frame': 7.27.1 + '@mdx-js/mdx': 3.1.0(acorn@8.15.0) + '@mdx-js/react': 3.1.0(@types/react@19.2.6)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + remark-mdx-remove-esm: 1.1.0 + serialize-error: 12.0.0 + vfile: 6.0.3 + vfile-matter: 5.0.0 + transitivePeerDependencies: + - '@types/react' + - acorn + - supports-color + next-safe-action@8.0.11(next@16.0.10(@babel/core@7.26.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: next: 16.0.10(@babel/core@7.26.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) @@ -17632,6 +17724,16 @@ snapshots: transitivePeerDependencies: - acorn + recma-jsx@1.0.0(acorn@8.15.0): + dependencies: + acorn-jsx: 5.3.2(acorn@8.15.0) + estree-util-to-js: 2.0.0 + recma-parse: 1.0.0 + recma-stringify: 1.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - acorn + recma-parse@1.0.0: dependencies: '@types/estree': 1.0.8 @@ -19223,7 +19325,7 @@ snapshots: tsx: 4.21.0 yaml: 2.6.1 - vite@6.4.1(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.6.1): + vite@6.4.1(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.6.1): dependencies: esbuild: 0.25.10 fdir: 6.5.0(picomatch@4.0.3) @@ -19232,7 +19334,7 @@ snapshots: rollup: 4.52.2 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 24.9.1 + '@types/node': 25.0.3 fsevents: 2.3.3 jiti: 2.6.1 lightningcss: 1.30.2