diff --git a/packages/layout-engine/pm-adapter/src/cache.test.ts b/packages/layout-engine/pm-adapter/src/cache.test.ts index 95296dbaf8..934af3f996 100644 --- a/packages/layout-engine/pm-adapter/src/cache.test.ts +++ b/packages/layout-engine/pm-adapter/src/cache.test.ts @@ -8,10 +8,7 @@ describe('shiftBlockPositions', () => { const block: ParagraphBlock = { kind: 'paragraph', id: 'p1', - runs: [ - { text: 'hello', pmStart: 10, pmEnd: 15 } as Run, - { text: 'world', pmStart: 15, pmEnd: 20 } as Run, - ], + runs: [{ text: 'hello', pmStart: 10, pmEnd: 15 } as Run, { text: 'world', pmStart: 15, pmEnd: 20 } as Run], }; const shifted = shiftBlockPositions(block, 5) as ParagraphBlock; diff --git a/packages/super-editor/src/core/presentation-editor/PresentationEditor.ts b/packages/super-editor/src/core/presentation-editor/PresentationEditor.ts index 9a2e699984..60cadfc997 100644 --- a/packages/super-editor/src/core/presentation-editor/PresentationEditor.ts +++ b/packages/super-editor/src/core/presentation-editor/PresentationEditor.ts @@ -2968,9 +2968,7 @@ export class PresentationEditor extends EventEmitter { previousMeasures, ); const incrementalLayoutEnd = perfNow(); - perfLog( - `[Perf] incrementalLayout: ${(incrementalLayoutEnd - incrementalLayoutStart).toFixed(2)}ms`, - ); + perfLog(`[Perf] incrementalLayout: ${(incrementalLayoutEnd - incrementalLayoutStart).toFixed(2)}ms`); // Type guard: validate incrementalLayout return value if (!result || typeof result !== 'object') { diff --git a/packages/superdoc/src/SuperDoc.vue b/packages/superdoc/src/SuperDoc.vue index 3c377a045a..56d0402793 100644 --- a/packages/superdoc/src/SuperDoc.vue +++ b/packages/superdoc/src/SuperDoc.vue @@ -453,6 +453,11 @@ const editorOptions = (doc) => { proxy.$superdoc.listeners?.('fonts-resolved')?.length > 0 ? proxy.$superdoc.listeners('fonts-resolved')[0] : null; const useLayoutEngine = proxy.$superdoc.config.useLayoutEngine !== false; + const ydocFragment = doc.ydoc?.getXmlFragment?.('supereditor'); + const ydocMeta = doc.ydoc?.getMap?.('meta'); + const ydocHasContent = (ydocFragment && ydocFragment.length > 0) || (ydocMeta && Boolean(ydocMeta.get('docx'))); + const isNewFile = doc.isNewFile && !ydocHasContent; + const options = { isDebug: proxy.$superdoc.config.isDebug || false, documentId: doc.id, @@ -493,7 +498,7 @@ const editorOptions = (doc) => { onTransaction: onEditorTransaction, ydoc: doc.ydoc, collaborationProvider: doc.provider || null, - isNewFile: doc.isNewFile || false, + isNewFile, handleImageUpload: proxy.$superdoc.config.handleImageUpload, externalExtensions: proxy.$superdoc.config.editorExtensions || [], suppressDefaultDocxStyles: proxy.$superdoc.config.suppressDefaultDocxStyles, @@ -537,6 +542,7 @@ const onEditorCommentLocationsUpdate = (doc, { allCommentIds: activeThreadId, al commentsStore.clearEditorCommentPositions?.(); return; } + if (!allCommentPositions || Object.keys(allCommentPositions).length === 0) return; const presentation = PresentationEditor.getInstance(doc.id); if (!presentation) { @@ -549,6 +555,7 @@ const onEditorCommentLocationsUpdate = (doc, { allCommentIds: activeThreadId, al // Note: PresentationEditor's 'commentPositions' event provides fresh positions // after every layout, so this is mainly for the initial load before layout completes. const mappedPositions = presentation.getCommentBounds(allCommentPositions, layers.value); + if (!mappedPositions || Object.keys(mappedPositions).length === 0) return; handleEditorLocationsUpdate(mappedPositions, activeThreadId); }; diff --git a/packages/superdoc/src/core/SuperDoc.js b/packages/superdoc/src/core/SuperDoc.js index 9b65b04b92..95dcaef017 100644 --- a/packages/superdoc/src/core/SuperDoc.js +++ b/packages/superdoc/src/core/SuperDoc.js @@ -378,6 +378,9 @@ export class SuperDoc extends EventEmitter { this.superdocStore.init(this.config); const commentsModuleConfig = this.config.modules.comments; this.commentsStore.init(commentsModuleConfig && commentsModuleConfig !== false ? commentsModuleConfig : {}); + if (this.isCollaborative) { + initCollaborationComments(this); + } this.#syncViewingVisibility(); } diff --git a/packages/superdoc/src/core/collaboration/collaboration.test.js b/packages/superdoc/src/core/collaboration/collaboration.test.js index 44114e94df..c21b36e039 100644 --- a/packages/superdoc/src/core/collaboration/collaboration.test.js +++ b/packages/superdoc/src/core/collaboration/collaboration.test.js @@ -2,6 +2,7 @@ import { describe, it, expect, vi, beforeAll, beforeEach, afterEach } from 'vite import * as collaborationModule from './collaboration.js'; import { initCollaborationComments, + loadCommentsFromYdoc, initSuperdocYdoc, makeDocumentsCollaborative, syncCommentsToClients, @@ -292,6 +293,58 @@ describe('collaboration helpers', () => { expect(useCommentMock).toHaveBeenCalledTimes(2); }); + it('initCollaborationComments loads existing comments from ydoc on init', () => { + commentsArray.items = [ + new MockYMap(Object.entries({ commentId: 'c1', text: 'Hello' })), + new MockYMap(Object.entries({ commentId: 'c1', text: 'Duplicate' })), + new MockYMap(Object.entries({ commentId: 'c2', text: 'Another' })), + ]; + + initCollaborationComments(superdoc); + + expect(useCommentMock).toHaveBeenCalledTimes(2); + expect(superdoc.commentsStore.commentsList).toEqual([{ normalized: 'c1' }, { normalized: 'c2' }]); + }); + + it('loadCommentsFromYdoc hydrates comments from importedId and deduplicates by stable key', () => { + commentsArray.items = [ + new MockYMap(Object.entries({ importedId: 'legacy-1', text: 'legacy without commentId' })), + new MockYMap(Object.entries({ importedId: 'legacy-1', text: 'duplicate legacy' })), + new MockYMap(Object.entries({ commentId: 'c2', text: 'normal comment' })), + new MockYMap(Object.entries({ commentId: 'c2', text: 'duplicate normal comment' })), + ]; + superdoc.provider.synced = true; + + const loaded = loadCommentsFromYdoc(superdoc); + + expect(loaded).toBe(true); + expect(useCommentMock).toHaveBeenCalledTimes(2); + expect(useCommentMock).toHaveBeenNthCalledWith( + 1, + expect.objectContaining({ importedId: 'legacy-1', commentId: 'legacy-1' }), + ); + expect(useCommentMock).toHaveBeenNthCalledWith(2, expect.objectContaining({ commentId: 'c2' })); + expect(superdoc.commentsStore.commentsList).toEqual([{ normalized: 'legacy-1' }, { normalized: 'c2' }]); + expect(superdoc.commentsStore.hasSyncedCollaborationComments).toBe(true); + }); + + it('initCollaborationComments re-hydrates store on repeated init without duplicating listeners', () => { + commentsArray.items = [new MockYMap(Object.entries({ commentId: 'c1', text: 'first' }))]; + + initCollaborationComments(superdoc); + expect(commentsArray._observers.size).toBe(1); + expect(superdoc.provider.on).toHaveBeenCalledTimes(1); + expect(superdoc.commentsStore.commentsList).toEqual([{ normalized: 'c1' }]); + + // Simulate store reset after mount; second init should re-hydrate but not add listeners again. + superdoc.commentsStore.commentsList = []; + initCollaborationComments(superdoc); + + expect(commentsArray._observers.size).toBe(1); + expect(superdoc.provider.on).toHaveBeenCalledTimes(1); + expect(superdoc.commentsStore.commentsList).toEqual([{ normalized: 'c1' }]); + }); + it('initCollaborationComments skips when module disabled', () => { superdoc.config.modules.comments = false; initCollaborationComments(superdoc); diff --git a/packages/superdoc/src/core/collaboration/helpers.js b/packages/superdoc/src/core/collaboration/helpers.js index 6f13f3ffb9..5c98bf1048 100644 --- a/packages/superdoc/src/core/collaboration/helpers.js +++ b/packages/superdoc/src/core/collaboration/helpers.js @@ -3,6 +3,35 @@ import useComment from '../../components/CommentsLayer/use-comment'; import { addYComment, updateYComment, deleteYComment } from './collaboration-comments'; +/** + * Load comments from the ydoc into the comments store. + * + * @param {Object} superdoc The SuperDoc instance + * @returns {boolean} True if comments were loaded into the store + */ +export const loadCommentsFromYdoc = (superdoc) => { + if (!superdoc?.ydoc || !superdoc?.commentsStore) return false; + const commentsArray = superdoc.ydoc.getArray('comments'); + const comments = commentsArray.toJSON(); + const seen = new Set(); + const filtered = []; + comments.forEach((c) => { + const key = c?.importedId ?? c?.commentId; + if (!key || seen.has(key)) return; + seen.add(key); + if (!c?.commentId) { + filtered.push({ ...c, commentId: key }); + return; + } + filtered.push(c); + }); + superdoc.commentsStore.commentsList = filtered.map((c) => useComment(c)); + if (superdoc.provider?.synced) { + superdoc.commentsStore.hasSyncedCollaborationComments = true; + } + return true; +}; + /** * Initialize sync for comments if the module is enabled * @@ -11,14 +40,27 @@ import { addYComment, updateYComment, deleteYComment } from './collaboration-com */ export const initCollaborationComments = (superdoc) => { if (!superdoc.config.modules.comments || !superdoc.provider) return; + if (superdoc._commentsCollabInitialized) { + loadCommentsFromYdoc(superdoc); + return; + } + superdoc._commentsCollabInitialized = true; // If we have comments and collaboration, wait for sync and then let the store know when its ready + const commentsArray = superdoc.ydoc.getArray('comments'); + const updateCommentsStore = () => loadCommentsFromYdoc(superdoc); + const onSuperDocYdocSynced = () => { + if (!updateCommentsStore()) { + setTimeout(updateCommentsStore, 0); + } // Update the editor comment locations - const parent = superdoc.commentsStore.commentsParentElement; - const ids = superdoc.commentsStore.editorCommentIds; - superdoc.commentsStore.handleEditorLocationsUpdate(parent, ids); - superdoc.commentsStore.hasSyncedCollaborationComments = true; + if (superdoc.commentsStore) { + const parent = superdoc.commentsStore.commentsParentElement; + const ids = superdoc.commentsStore.editorCommentIds; + superdoc.commentsStore.handleEditorLocationsUpdate(parent, ids); + superdoc.commentsStore.hasSyncedCollaborationComments = true; + } superdoc.provider.off('synced', onSuperDocYdocSynced); }; @@ -26,29 +68,23 @@ export const initCollaborationComments = (superdoc) => { // Listen for the synced event superdoc.provider.on('synced', onSuperDocYdocSynced); - // Get the comments map from the Y.Doc - const commentsArray = superdoc.ydoc.getArray('comments'); + // Load any existing comments immediately (in case provider synced before we subscribed) + if (!updateCommentsStore()) { + setTimeout(updateCommentsStore, 0); + } // Observe changes to the comments map commentsArray.observe((event) => { + if (!superdoc.commentsStore) return; // Ignore events if triggered by the current user const currentUser = superdoc.config.user; - const { user = {} } = event.transaction.origin; + const origin = event?.transaction?.origin; + const { user = {} } = origin || {}; if (currentUser.name === user.name && currentUser.email === user.email) return; // Update conversations - const comments = commentsArray.toJSON(); - - const seen = new Set(); - const filtered = []; - comments.forEach((c) => { - if (!seen.has(c.commentId)) { - seen.add(c.commentId); - filtered.push(c); - } - }); - superdoc.commentsStore.commentsList = filtered.map((c) => useComment(c)); + updateCommentsStore(); }); }; diff --git a/packages/superdoc/src/stores/comments-store.js b/packages/superdoc/src/stores/comments-store.js index 66d9192f1a..b4d362f855 100644 --- a/packages/superdoc/src/stores/comments-store.js +++ b/packages/superdoc/src/stores/comments-store.js @@ -635,6 +635,9 @@ export const useCommentsStore = defineStore('comments', () => { const deleteComment = ({ commentId: commentIdToDelete, superdoc }) => { const commentIndex = commentsList.value.findIndex((c) => c.commentId === commentIdToDelete); const comment = commentsList.value[commentIndex]; + if (!comment) { + return; + } const { commentId, importedId } = comment; const { fileId } = comment; @@ -821,6 +824,9 @@ export const useCommentsStore = defineStore('comments', () => { * @returns {void} */ const handleEditorLocationsUpdate = (allCommentPositions) => { + if ((!allCommentPositions || Object.keys(allCommentPositions).length === 0) && commentsList.value.length > 0) { + return; + } editorCommentPositions.value = allCommentPositions || {}; }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 19a1579a28..ba95d0e68d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -422,7 +422,7 @@ importers: version: 14.0.3 mintlify: specifier: ^4.2.295 - version: 4.2.315(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.0(react@19.2.3))(react@19.2.3))(@types/node@22.19.2)(@types/react@19.2.11)(react-dom@19.2.0(react@19.2.3))(typescript@5.9.3) + version: 4.2.315(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.0(react@19.2.3))(react@19.2.3))(@types/node@22.19.8)(@types/react@19.2.11)(react-dom@19.2.0(react@19.2.3))(typescript@5.9.3) apps/vscode-ext: dependencies: @@ -9891,14 +9891,6 @@ packages: resolution: {integrity: sha512-WHkws2ZflZe41zj6AolvvmaTrWds/VuyeYr9iPVv/oQeaIoVxMKaushfFWpOGDT+GuBrM/sVqF8KUCYQlSSTdQ==} engines: {node: '>=18'} - superdoc@1.10.0: - resolution: {integrity: sha512-3I3c5B2ja5HXEpgSesXMiRadJXoWezeYlwpwAvGr8Uh47gCT773LXbL7GrH49xTZCR0lzPvTNyrZRj0Uz+SCUw==} - peerDependencies: - '@hocuspocus/provider': ^2.13.6 - pdfjs-dist: '>=4.3.136 <=4.6.82' - y-prosemirror: ^1.3.7 - yjs: 13.6.19 - supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -12384,128 +12376,128 @@ snapshots: '@inquirer/ansi@1.0.2': {} - '@inquirer/checkbox@4.3.2(@types/node@22.19.2)': + '@inquirer/checkbox@4.3.2(@types/node@22.19.8)': dependencies: '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@22.19.2) + '@inquirer/core': 10.3.2(@types/node@22.19.8) '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@22.19.2) + '@inquirer/type': 3.0.10(@types/node@22.19.8) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 22.19.2 + '@types/node': 22.19.8 - '@inquirer/confirm@5.1.21(@types/node@22.19.2)': + '@inquirer/confirm@5.1.21(@types/node@22.19.8)': dependencies: - '@inquirer/core': 10.3.2(@types/node@22.19.2) - '@inquirer/type': 3.0.10(@types/node@22.19.2) + '@inquirer/core': 10.3.2(@types/node@22.19.8) + '@inquirer/type': 3.0.10(@types/node@22.19.8) optionalDependencies: - '@types/node': 22.19.2 + '@types/node': 22.19.8 - '@inquirer/core@10.3.2(@types/node@22.19.2)': + '@inquirer/core@10.3.2(@types/node@22.19.8)': dependencies: '@inquirer/ansi': 1.0.2 '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@22.19.2) + '@inquirer/type': 3.0.10(@types/node@22.19.8) cli-width: 4.1.0 mute-stream: 2.0.0 signal-exit: 4.1.0 wrap-ansi: 6.2.0 yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 22.19.2 + '@types/node': 22.19.8 - '@inquirer/editor@4.2.23(@types/node@22.19.2)': + '@inquirer/editor@4.2.23(@types/node@22.19.8)': dependencies: - '@inquirer/core': 10.3.2(@types/node@22.19.2) - '@inquirer/external-editor': 1.0.3(@types/node@22.19.2) - '@inquirer/type': 3.0.10(@types/node@22.19.2) + '@inquirer/core': 10.3.2(@types/node@22.19.8) + '@inquirer/external-editor': 1.0.3(@types/node@22.19.8) + '@inquirer/type': 3.0.10(@types/node@22.19.8) optionalDependencies: - '@types/node': 22.19.2 + '@types/node': 22.19.8 - '@inquirer/expand@4.0.23(@types/node@22.19.2)': + '@inquirer/expand@4.0.23(@types/node@22.19.8)': dependencies: - '@inquirer/core': 10.3.2(@types/node@22.19.2) - '@inquirer/type': 3.0.10(@types/node@22.19.2) + '@inquirer/core': 10.3.2(@types/node@22.19.8) + '@inquirer/type': 3.0.10(@types/node@22.19.8) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 22.19.2 + '@types/node': 22.19.8 - '@inquirer/external-editor@1.0.3(@types/node@22.19.2)': + '@inquirer/external-editor@1.0.3(@types/node@22.19.8)': dependencies: chardet: 2.1.1 iconv-lite: 0.7.2 optionalDependencies: - '@types/node': 22.19.2 + '@types/node': 22.19.8 '@inquirer/figures@1.0.15': {} - '@inquirer/input@4.3.1(@types/node@22.19.2)': + '@inquirer/input@4.3.1(@types/node@22.19.8)': dependencies: - '@inquirer/core': 10.3.2(@types/node@22.19.2) - '@inquirer/type': 3.0.10(@types/node@22.19.2) + '@inquirer/core': 10.3.2(@types/node@22.19.8) + '@inquirer/type': 3.0.10(@types/node@22.19.8) optionalDependencies: - '@types/node': 22.19.2 + '@types/node': 22.19.8 - '@inquirer/number@3.0.23(@types/node@22.19.2)': + '@inquirer/number@3.0.23(@types/node@22.19.8)': dependencies: - '@inquirer/core': 10.3.2(@types/node@22.19.2) - '@inquirer/type': 3.0.10(@types/node@22.19.2) + '@inquirer/core': 10.3.2(@types/node@22.19.8) + '@inquirer/type': 3.0.10(@types/node@22.19.8) optionalDependencies: - '@types/node': 22.19.2 + '@types/node': 22.19.8 - '@inquirer/password@4.0.23(@types/node@22.19.2)': + '@inquirer/password@4.0.23(@types/node@22.19.8)': dependencies: '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@22.19.2) - '@inquirer/type': 3.0.10(@types/node@22.19.2) + '@inquirer/core': 10.3.2(@types/node@22.19.8) + '@inquirer/type': 3.0.10(@types/node@22.19.8) optionalDependencies: - '@types/node': 22.19.2 + '@types/node': 22.19.8 - '@inquirer/prompts@7.9.0(@types/node@22.19.2)': - dependencies: - '@inquirer/checkbox': 4.3.2(@types/node@22.19.2) - '@inquirer/confirm': 5.1.21(@types/node@22.19.2) - '@inquirer/editor': 4.2.23(@types/node@22.19.2) - '@inquirer/expand': 4.0.23(@types/node@22.19.2) - '@inquirer/input': 4.3.1(@types/node@22.19.2) - '@inquirer/number': 3.0.23(@types/node@22.19.2) - '@inquirer/password': 4.0.23(@types/node@22.19.2) - '@inquirer/rawlist': 4.1.11(@types/node@22.19.2) - '@inquirer/search': 3.2.2(@types/node@22.19.2) - '@inquirer/select': 4.4.2(@types/node@22.19.2) + '@inquirer/prompts@7.9.0(@types/node@22.19.8)': + dependencies: + '@inquirer/checkbox': 4.3.2(@types/node@22.19.8) + '@inquirer/confirm': 5.1.21(@types/node@22.19.8) + '@inquirer/editor': 4.2.23(@types/node@22.19.8) + '@inquirer/expand': 4.0.23(@types/node@22.19.8) + '@inquirer/input': 4.3.1(@types/node@22.19.8) + '@inquirer/number': 3.0.23(@types/node@22.19.8) + '@inquirer/password': 4.0.23(@types/node@22.19.8) + '@inquirer/rawlist': 4.1.11(@types/node@22.19.8) + '@inquirer/search': 3.2.2(@types/node@22.19.8) + '@inquirer/select': 4.4.2(@types/node@22.19.8) optionalDependencies: - '@types/node': 22.19.2 + '@types/node': 22.19.8 - '@inquirer/rawlist@4.1.11(@types/node@22.19.2)': + '@inquirer/rawlist@4.1.11(@types/node@22.19.8)': dependencies: - '@inquirer/core': 10.3.2(@types/node@22.19.2) - '@inquirer/type': 3.0.10(@types/node@22.19.2) + '@inquirer/core': 10.3.2(@types/node@22.19.8) + '@inquirer/type': 3.0.10(@types/node@22.19.8) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 22.19.2 + '@types/node': 22.19.8 - '@inquirer/search@3.2.2(@types/node@22.19.2)': + '@inquirer/search@3.2.2(@types/node@22.19.8)': dependencies: - '@inquirer/core': 10.3.2(@types/node@22.19.2) + '@inquirer/core': 10.3.2(@types/node@22.19.8) '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@22.19.2) + '@inquirer/type': 3.0.10(@types/node@22.19.8) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 22.19.2 + '@types/node': 22.19.8 - '@inquirer/select@4.4.2(@types/node@22.19.2)': + '@inquirer/select@4.4.2(@types/node@22.19.8)': dependencies: '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@22.19.2) + '@inquirer/core': 10.3.2(@types/node@22.19.8) '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@22.19.2) + '@inquirer/type': 3.0.10(@types/node@22.19.8) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 22.19.2 + '@types/node': 22.19.8 - '@inquirer/type@3.0.10(@types/node@22.19.2)': + '@inquirer/type@3.0.10(@types/node@22.19.8)': optionalDependencies: - '@types/node': 22.19.2 + '@types/node': 22.19.8 '@isaacs/balanced-match@4.0.1': {} @@ -12859,9 +12851,9 @@ snapshots: '@microsoft/tsdoc@0.16.0': {} - '@mintlify/cli@4.0.919(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.0(react@19.2.3))(react@19.2.3))(@types/node@22.19.2)(@types/react@19.2.11)(react-dom@19.2.0(react@19.2.3))(typescript@5.9.3)': + '@mintlify/cli@4.0.919(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.0(react@19.2.3))(react@19.2.3))(@types/node@22.19.8)(@types/react@19.2.11)(react-dom@19.2.0(react@19.2.3))(typescript@5.9.3)': dependencies: - '@inquirer/prompts': 7.9.0(@types/node@22.19.2) + '@inquirer/prompts': 7.9.0(@types/node@22.19.8) '@mintlify/common': 1.0.698(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.0(react@19.2.3))(react@19.2.3))(@types/react@19.2.11)(react-dom@19.2.0(react@19.2.3))(react@19.2.3)(typescript@5.9.3) '@mintlify/link-rot': 3.0.857(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.0(react@19.2.3))(react@19.2.3))(@types/react@19.2.11)(react-dom@19.2.0(react@19.2.3))(react@19.2.3)(typescript@5.9.3) '@mintlify/models': 0.0.263 @@ -12875,7 +12867,7 @@ snapshots: front-matter: 4.0.2 fs-extra: 11.2.0 ink: 6.3.0(@types/react@19.2.11)(react@19.2.3) - inquirer: 12.3.0(@types/node@22.19.2) + inquirer: 12.3.0(@types/node@22.19.8) js-yaml: 4.1.0 mdast-util-mdx-jsx: 3.2.0 react: 19.2.3 @@ -18342,12 +18334,12 @@ snapshots: inline-style-parser@0.2.7: {} - inquirer@12.3.0(@types/node@22.19.2): + inquirer@12.3.0(@types/node@22.19.8): dependencies: - '@inquirer/core': 10.3.2(@types/node@22.19.2) - '@inquirer/prompts': 7.9.0(@types/node@22.19.2) - '@inquirer/type': 3.0.10(@types/node@22.19.2) - '@types/node': 22.19.2 + '@inquirer/core': 10.3.2(@types/node@22.19.8) + '@inquirer/prompts': 7.9.0(@types/node@22.19.8) + '@inquirer/type': 3.0.10(@types/node@22.19.8) + '@types/node': 22.19.8 ansi-escapes: 4.3.2 mute-stream: 2.0.0 run-async: 3.0.0 @@ -20053,9 +20045,9 @@ snapshots: minipass: 3.3.6 yallist: 4.0.0 - mintlify@4.2.315(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.0(react@19.2.3))(react@19.2.3))(@types/node@22.19.2)(@types/react@19.2.11)(react-dom@19.2.0(react@19.2.3))(typescript@5.9.3): + mintlify@4.2.315(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.0(react@19.2.3))(react@19.2.3))(@types/node@22.19.8)(@types/react@19.2.11)(react-dom@19.2.0(react@19.2.3))(typescript@5.9.3): dependencies: - '@mintlify/cli': 4.0.919(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.0(react@19.2.3))(react@19.2.3))(@types/node@22.19.2)(@types/react@19.2.11)(react-dom@19.2.0(react@19.2.3))(typescript@5.9.3) + '@mintlify/cli': 4.0.919(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.0(react@19.2.3))(react@19.2.3))(@types/node@22.19.8)(@types/react@19.2.11)(react-dom@19.2.0(react@19.2.3))(typescript@5.9.3) transitivePeerDependencies: - '@radix-ui/react-popover' - '@types/node' @@ -22299,29 +22291,6 @@ snapshots: make-asynchronous: 1.0.1 time-span: 5.1.0 - superdoc@1.10.0(@hocuspocus/provider@2.15.3(y-protocols@1.0.7(yjs@13.6.19))(yjs@13.6.19))(canvas@3.2.0)(pdfjs-dist@4.3.136)(typescript@5.9.3)(y-prosemirror@1.3.7(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.5)(y-protocols@1.0.7(yjs@13.6.19))(yjs@13.6.19))(yjs@13.6.19): - dependencies: - '@hocuspocus/provider': 2.15.3(y-protocols@1.0.7(yjs@13.6.19))(yjs@13.6.19) - buffer-crc32: 1.0.0 - eventemitter3: 5.0.4 - jsdom: 27.3.0(canvas@3.2.0) - naive-ui: 2.43.2(vue@3.5.25(typescript@5.9.3)) - pdfjs-dist: 4.3.136 - pinia: 2.3.1(typescript@5.9.3)(vue@3.5.25(typescript@5.9.3)) - rollup-plugin-copy: 3.5.0 - uuid: 9.0.1 - vue: 3.5.25(typescript@5.9.3) - y-prosemirror: 1.3.7(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.5)(y-protocols@1.0.7(yjs@13.6.19))(yjs@13.6.19) - y-websocket: 3.0.0(yjs@13.6.19) - yjs: 13.6.19 - transitivePeerDependencies: - - '@vue/composition-api' - - bufferutil - - canvas - - supports-color - - typescript - - utf-8-validate - supports-color@5.5.0: dependencies: has-flag: 3.0.0