From aabbd3a334c219d15d39bc61b97f814718c4eadb Mon Sep 17 00:00:00 2001 From: Nick the Sick Date: Wed, 27 May 2026 18:59:37 +0200 Subject: [PATCH 1/3] chore: remove unused dependencies and bundle react-icons @blocknote/core: - Remove unused @tiptap/extension-horizontal-rule (custom divider block) - Remove unused @tiptap/extension-paragraph (custom paragraph block) - Remove lib0; replace lib0/random uuidv4 with crypto.randomUUID() - Update YjsThreadStore test mock accordingly @blocknote/react: - Remove unused lodash.merge and @types/lodash.merge - Remove unused @floating-ui/utils (transitive dep only) - Move @types/use-sync-external-store to optionalDependencies - Bundle react-icons into dist output (tree-shaken) instead of externalizing it, so consumers no longer need to install it - Define local IconType to avoid leaking react-icons in .d.ts output --- packages/core/package.json | 3 -- .../threadstore/yjs/YjsThreadStore.test.ts | 10 ++-- .../threadstore/yjs/YjsThreadStore.ts | 8 +-- .../src/extensions/Placeholder/Placeholder.ts | 4 +- .../tiptap-extensions/UniqueID/UniqueID.ts | 4 +- packages/react/package.json | 9 ++-- .../DefaultButtons/BasicTextStyleButton.tsx | 2 +- .../DefaultButtons/TextAlignButton.tsx | 2 +- .../DefaultSelects/BlockTypeSelect.tsx | 2 +- .../getDefaultReactSlashMenuItems.tsx | 2 +- packages/react/src/icons.ts | 12 +++++ packages/react/src/index.ts | 2 + packages/react/vite.config.ts | 10 ++++ pnpm-lock.yaml | 54 ++++--------------- 14 files changed, 54 insertions(+), 70 deletions(-) create mode 100644 packages/react/src/icons.ts diff --git a/packages/core/package.json b/packages/core/package.json index 9713075085..05f41057d1 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -97,9 +97,7 @@ "@tiptap/core": "^3.13.0", "@tiptap/extension-bold": "^3.13.0", "@tiptap/extension-code": "^3.13.0", - "@tiptap/extension-horizontal-rule": "^3.13.0", "@tiptap/extension-italic": "^3.13.0", - "@tiptap/extension-paragraph": "^3.13.0", "@tiptap/extension-strike": "^3.13.0", "@tiptap/extension-text": "^3.13.0", "@tiptap/extension-underline": "^3.13.0", @@ -107,7 +105,6 @@ "@tiptap/pm": "^3.13.0", "emoji-mart": "^5.6.0", "fast-deep-equal": "^3.1.3", - "lib0": "^0.2.99", "prosemirror-highlight": "^0.15.1", "prosemirror-model": "^1.25.4", "prosemirror-state": "^1.4.4", diff --git a/packages/core/src/comments/threadstore/yjs/YjsThreadStore.test.ts b/packages/core/src/comments/threadstore/yjs/YjsThreadStore.test.ts index b73b7c1ec8..63140c397b 100644 --- a/packages/core/src/comments/threadstore/yjs/YjsThreadStore.test.ts +++ b/packages/core/src/comments/threadstore/yjs/YjsThreadStore.test.ts @@ -4,12 +4,12 @@ import { CommentBody } from "../../types.js"; import { DefaultThreadStoreAuth } from "../DefaultThreadStoreAuth.js"; import { YjsThreadStore } from "./YjsThreadStore.js"; -// Mock UUID to generate sequential IDs +// Mock crypto.randomUUID to generate sequential IDs let mockUuidCounter = 0; -vi.mock("lib0/random", async (importOriginal) => ({ - ...(await importOriginal()), - uuidv4: () => `mocked-uuid-${++mockUuidCounter}`, -})); +const originalRandomUUID = crypto.randomUUID.bind(crypto); +vi.spyOn(crypto, "randomUUID").mockImplementation( + () => `mocked-uuid-${++mockUuidCounter}` as ReturnType, +); describe("YjsThreadStore", () => { let store: YjsThreadStore; diff --git a/packages/core/src/comments/threadstore/yjs/YjsThreadStore.ts b/packages/core/src/comments/threadstore/yjs/YjsThreadStore.ts index f9754c6063..d27f9d0829 100644 --- a/packages/core/src/comments/threadstore/yjs/YjsThreadStore.ts +++ b/packages/core/src/comments/threadstore/yjs/YjsThreadStore.ts @@ -1,4 +1,4 @@ -import { uuidv4 } from "lib0/random"; + import * as Y from "yjs"; import { CommentBody, CommentData, ThreadData } from "../../types.js"; import { ThreadStoreAuth } from "../ThreadStoreAuth.js"; @@ -57,7 +57,7 @@ export class YjsThreadStore extends YjsThreadStoreBase { const comment: CommentData = { type: "comment", - id: uuidv4(), + id: crypto.randomUUID(), userId: this.userId, createdAt: date, updatedAt: date, @@ -68,7 +68,7 @@ export class YjsThreadStore extends YjsThreadStoreBase { const thread: ThreadData = { type: "thread", - id: uuidv4(), + id: crypto.randomUUID(), createdAt: date, updatedAt: date, comments: [comment], @@ -105,7 +105,7 @@ export class YjsThreadStore extends YjsThreadStoreBase { const date = new Date(); const comment: CommentData = { type: "comment", - id: uuidv4(), + id: crypto.randomUUID(), userId: this.userId, createdAt: date, updatedAt: date, diff --git a/packages/core/src/extensions/Placeholder/Placeholder.ts b/packages/core/src/extensions/Placeholder/Placeholder.ts index b8ff2e14ed..37556e5ecd 100644 --- a/packages/core/src/extensions/Placeholder/Placeholder.ts +++ b/packages/core/src/extensions/Placeholder/Placeholder.ts @@ -1,6 +1,6 @@ import { Plugin, PluginKey } from "prosemirror-state"; import { Decoration, DecorationSet } from "prosemirror-view"; -import { uuidv4 } from "lib0/random"; + import { createExtension, ExtensionOptions, @@ -23,7 +23,7 @@ export const PlaceholderExtension = createExtension( new Plugin({ key: PLUGIN_KEY, view: (view) => { - const uniqueEditorSelector = `placeholder-selector-${uuidv4()}`; + const uniqueEditorSelector = `placeholder-selector-${crypto.randomUUID()}`; view.dom.classList.add(uniqueEditorSelector); const styleEl = document.createElement("style"); diff --git a/packages/core/src/extensions/tiptap-extensions/UniqueID/UniqueID.ts b/packages/core/src/extensions/tiptap-extensions/UniqueID/UniqueID.ts index a3ce6f3828..2088870098 100644 --- a/packages/core/src/extensions/tiptap-extensions/UniqueID/UniqueID.ts +++ b/packages/core/src/extensions/tiptap-extensions/UniqueID/UniqueID.ts @@ -6,7 +6,7 @@ import { } from "@tiptap/core"; import { Fragment, Slice } from "prosemirror-model"; import { Plugin, PluginKey } from "prosemirror-state"; -import { uuidv4 } from "lib0/random"; + /** * Code from Tiptap UniqueID extension (https://tiptap.dev/api/extensions/unique-id) @@ -65,7 +65,7 @@ const UniqueID = Extension.create({ return testOptions.mockID.toString() as string; } - return uuidv4(); + return crypto.randomUUID(); }, filterTransaction: null, }; diff --git a/packages/react/package.json b/packages/react/package.json index 2903e18c55..53fb808a96 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -61,22 +61,18 @@ "@blocknote/core": "0.51.3", "@emoji-mart/data": "^1.2.1", "@floating-ui/react": "^0.27.18", - "@floating-ui/utils": "^0.2.10", "@tanstack/react-store": "0.7.7", "@tiptap/core": "^3.13.0", "@tiptap/pm": "^3.13.0", "@tiptap/react": "^3.13.0", - "@types/use-sync-external-store": "1.5.0", "emoji-mart": "^5.6.0", "fast-deep-equal": "^3.1.3", - "lodash.merge": "^4.6.2", - "react-icons": "^5.5.0", "use-sync-external-store": "1.6.0" }, "devDependencies": { "@types/lodash.foreach": "^4.5.9", "@types/lodash.groupby": "^4.6.9", - "@types/lodash.merge": "^4.6.9", + "react-icons": "^5.5.0", "@types/react": "^19.2.3", "@types/react-dom": "^19.2.3", "@vitejs/plugin-react": "^6.0.1", @@ -91,6 +87,9 @@ "vite-plugin-externalize-deps": "^0.10.0", "vitest": "^4.1.2" }, + "optionalDependencies": { + "@types/use-sync-external-store": "1.5.0" + }, "peerDependencies": { "react": "^18.0 || ^19.0 || >= 19.0.0-rc", "react-dom": "^18.0 || ^19.0 || >= 19.0.0-rc" diff --git a/packages/react/src/components/FormattingToolbar/DefaultButtons/BasicTextStyleButton.tsx b/packages/react/src/components/FormattingToolbar/DefaultButtons/BasicTextStyleButton.tsx index f2ae1e9ac6..66de89fe49 100644 --- a/packages/react/src/components/FormattingToolbar/DefaultButtons/BasicTextStyleButton.tsx +++ b/packages/react/src/components/FormattingToolbar/DefaultButtons/BasicTextStyleButton.tsx @@ -6,7 +6,7 @@ import { formatKeyboardShortcut, } from "@blocknote/core"; import { useCallback } from "react"; -import { IconType } from "react-icons"; +import type { IconType } from "../../../icons.js"; import { RiBold, RiCodeFill, diff --git a/packages/react/src/components/FormattingToolbar/DefaultButtons/TextAlignButton.tsx b/packages/react/src/components/FormattingToolbar/DefaultButtons/TextAlignButton.tsx index a21f1006cb..dde40e4d9c 100644 --- a/packages/react/src/components/FormattingToolbar/DefaultButtons/TextAlignButton.tsx +++ b/packages/react/src/components/FormattingToolbar/DefaultButtons/TextAlignButton.tsx @@ -11,7 +11,7 @@ import { } from "@blocknote/core"; import { TableHandlesExtension } from "@blocknote/core/extensions"; import { useCallback } from "react"; -import { IconType } from "react-icons"; +import type { IconType } from "../../../icons.js"; import { RiAlignCenter, RiAlignJustify, diff --git a/packages/react/src/components/FormattingToolbar/DefaultSelects/BlockTypeSelect.tsx b/packages/react/src/components/FormattingToolbar/DefaultSelects/BlockTypeSelect.tsx index d9bb12a00a..77a929271d 100644 --- a/packages/react/src/components/FormattingToolbar/DefaultSelects/BlockTypeSelect.tsx +++ b/packages/react/src/components/FormattingToolbar/DefaultSelects/BlockTypeSelect.tsx @@ -6,7 +6,7 @@ import { StyleSchema, } from "@blocknote/core"; import { useMemo } from "react"; -import type { IconType } from "react-icons"; +import type { IconType } from "../../../icons.js"; import { RiH1, RiH2, diff --git a/packages/react/src/components/SuggestionMenu/getDefaultReactSlashMenuItems.tsx b/packages/react/src/components/SuggestionMenu/getDefaultReactSlashMenuItems.tsx index 0c62e30f23..722edcb613 100644 --- a/packages/react/src/components/SuggestionMenu/getDefaultReactSlashMenuItems.tsx +++ b/packages/react/src/components/SuggestionMenu/getDefaultReactSlashMenuItems.tsx @@ -28,7 +28,7 @@ import { RiVolumeUpFill, } from "react-icons/ri"; -import { IconType } from "react-icons"; +import type { IconType } from "../../icons.js"; import { DefaultReactSuggestionItem } from "./types.js"; const icons: Record = { diff --git a/packages/react/src/icons.ts b/packages/react/src/icons.ts new file mode 100644 index 0000000000..b7a3e8daff --- /dev/null +++ b/packages/react/src/icons.ts @@ -0,0 +1,12 @@ +/** + * Compatible replacement for `IconType` from react-icons. + * Defined locally so consumers don't need react-icons installed for + * type-checking. + */ +export type IconType = React.ComponentType< + React.SVGAttributes & { + size?: string | number; + color?: string; + title?: string; + } +>; diff --git a/packages/react/src/index.ts b/packages/react/src/index.ts index 6ed745a789..6beb5a7082 100644 --- a/packages/react/src/index.ts +++ b/packages/react/src/index.ts @@ -133,6 +133,8 @@ export * from "./schema/ReactBlockSpec.js"; export * from "./schema/ReactInlineContentSpec.js"; export * from "./schema/ReactStyleSpec.js"; +export * from "./icons.js"; + export * from "./util/elementOverflow.js"; export * from "./util/mergeRefs.js"; diff --git a/packages/react/vite.config.ts b/packages/react/vite.config.ts index dde82555a5..abbbfb3dc9 100644 --- a/packages/react/vite.config.ts +++ b/packages/react/vite.config.ts @@ -44,6 +44,16 @@ export default defineConfig((conf) => ({ // make sure to externalize deps that shouldn't be bundled // into your library external: (source) => { + // Bundle react-icons into the output (tree-shaken) so consumers + // don't need to install it as a peer/runtime dependency. + const bundledDeps = ["react-icons"]; + if ( + bundledDeps.some( + (dep) => source === dep || source.startsWith(dep + "/") + ) + ) { + return false; + } if ( Object.keys({ ...pkg.dependencies, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dfc4d65cde..cb3028796a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4636,15 +4636,9 @@ importers: '@tiptap/extension-code': specifier: ^3.13.0 version: 3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4)) - '@tiptap/extension-horizontal-rule': - specifier: ^3.13.0 - version: 3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4) '@tiptap/extension-italic': specifier: ^3.13.0 version: 3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4)) - '@tiptap/extension-paragraph': - specifier: ^3.13.0 - version: 3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4)) '@tiptap/extension-strike': specifier: ^3.13.0 version: 3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4)) @@ -4666,9 +4660,6 @@ importers: fast-deep-equal: specifier: ^3.1.3 version: 3.1.3 - lib0: - specifier: ^0.2.99 - version: 0.2.117 prosemirror-highlight: specifier: ^0.15.1 version: 0.15.1(@shikijs/types@4.0.2)(@types/hast@3.0.4)(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-transform@1.12.0)(prosemirror-view@1.41.8) @@ -4822,9 +4813,6 @@ importers: '@floating-ui/react': specifier: ^0.27.18 version: 0.27.19(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@floating-ui/utils': - specifier: ^0.2.10 - version: 0.2.11 '@tanstack/react-store': specifier: 0.7.7 version: 0.7.7(react-dom@19.2.5(react@19.2.5))(react@19.2.5) @@ -4837,21 +4825,12 @@ importers: '@tiptap/react': specifier: ^3.13.0 version: 3.22.4(@floating-ui/dom@1.7.6)(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@types/use-sync-external-store': - specifier: 1.5.0 - version: 1.5.0 emoji-mart: specifier: ^5.6.0 version: 5.6.0 fast-deep-equal: specifier: ^3.1.3 version: 3.1.3 - lodash.merge: - specifier: ^4.6.2 - version: 4.6.2 - react-icons: - specifier: ^5.5.0 - version: 5.6.0(react@19.2.5) use-sync-external-store: specifier: 1.6.0 version: 1.6.0(react@19.2.5) @@ -4862,9 +4841,6 @@ importers: '@types/lodash.groupby': specifier: ^4.6.9 version: 4.6.9 - '@types/lodash.merge': - specifier: ^4.6.9 - version: 4.6.9 '@types/react': specifier: ^19.2.3 version: 19.2.14 @@ -4883,6 +4859,9 @@ importers: react-dom: specifier: ^19.2.5 version: 19.2.5(react@19.2.5) + react-icons: + specifier: ^5.5.0 + version: 5.6.0(react@19.2.5) rimraf: specifier: ^5.0.10 version: 5.0.10 @@ -4904,6 +4883,10 @@ importers: vitest: specifier: 4.1.2 version: 4.1.2(@opentelemetry/api@1.9.1)(@types/node@25.9.0)(jsdom@29.0.2(@noble/hashes@2.0.1)(canvas@3.1.0))(msw@2.11.5(@types/node@25.9.0)(typescript@5.9.3))(vite@8.0.8(@types/node@25.9.0)(esbuild@0.27.5)(jiti@2.6.1)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.3)) + optionalDependencies: + '@types/use-sync-external-store': + specifier: 1.5.0 + version: 1.5.0 packages/server-util: dependencies: @@ -10401,22 +10384,11 @@ packages: '@tiptap/core': ^3.0.0 '@tiptap/pm': ^3.0.0 - '@tiptap/extension-horizontal-rule@3.22.4': - resolution: {integrity: sha512-cCI1HekGQwhY/MbgaKQ0R/7HcH5ZM1oFAyI/J72QGLC0XnF403S/OXoHMuBWr1mCu8hNiQWCzeNRJUty0iytNw==} - peerDependencies: - '@tiptap/core': ^3.0.0 - '@tiptap/pm': ^3.0.0 - '@tiptap/extension-italic@3.22.4': resolution: {integrity: sha512-fVSDx5AYXgDI3v2zZIqb7V8EewthwM2NJ/ZCX+XaxRsqNEpnjVhgHs7UlvDqK1wj2OJ6zmUNjPtVlAFRxwT+HQ==} peerDependencies: '@tiptap/core': ^3.0.0 - '@tiptap/extension-paragraph@3.22.4': - resolution: {integrity: sha512-de6dFkIhigiENESY6rNJ3yTVS/337ybfP30dNPudTwGe9oAu9ZCS+04j6QCvXSjhlI3ULiv7wiSHqrP26Gd+Hw==} - peerDependencies: - '@tiptap/core': ^3.0.0 - '@tiptap/extension-strike@3.22.4': resolution: {integrity: sha512-aRHWQj42HiailXSC9LkKYM3jWMcSeGwOjbqM4PiuxQZmHVDRFmeHkfJItOdn2cSHaO0vuEVK+TvrWUWsBFi3pg==} peerDependencies: @@ -21664,19 +21636,10 @@ snapshots: '@tiptap/pm': 3.22.4 optional: true - '@tiptap/extension-horizontal-rule@3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))(@tiptap/pm@3.22.4)': - dependencies: - '@tiptap/core': 3.22.4(@tiptap/pm@3.22.4) - '@tiptap/pm': 3.22.4 - '@tiptap/extension-italic@3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))': dependencies: '@tiptap/core': 3.22.4(@tiptap/pm@3.22.4) - '@tiptap/extension-paragraph@3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))': - dependencies: - '@tiptap/core': 3.22.4(@tiptap/pm@3.22.4) - '@tiptap/extension-strike@3.22.4(@tiptap/core@3.22.4(@tiptap/pm@3.22.4))': dependencies: '@tiptap/core': 3.22.4(@tiptap/pm@3.22.4) @@ -21998,7 +21961,8 @@ snapshots: '@types/use-sync-external-store@0.0.6': {} - '@types/use-sync-external-store@1.5.0': {} + '@types/use-sync-external-store@1.5.0': + optional: true '@types/ws@8.18.1': dependencies: From 628d5e2bcbe8de7706fc90c106d8769b0831861d Mon Sep 17 00:00:00 2001 From: Nick the Sick Date: Wed, 27 May 2026 19:19:34 +0200 Subject: [PATCH 2/3] chore: trim unused deps across 9 more packages - code-block: move @blocknote/core and @shikijs/types to devDeps (type-only imports) - mantine: bundle react-icons into build output - shadcn: remove unused autoprefixer - xl-ai: remove unused @blocknote/mantine, @tiptap/core, react-dom; bundle react-icons - server-util: remove unused @tiptap/core; move yjs/y-prosemirror/y-protocols to devDeps - xl-email-exporter: remove unused @blocknote/react, buffer, react, react-dom; move react-email to devDeps - xl-multi-column: remove unused prosemirror-tables, prosemirror-transform; bundle react-icons - xl-odt-exporter: remove unused buffer - xl-pdf-exporter: remove unused @blocknote/react, buffer, docx - Fix IconType to use function signature matching react-icons' original type --- packages/code-block/package.json | 6 +- packages/mantine/package.json | 4 +- packages/mantine/vite.config.ts | 10 +++ packages/react/src/icons.ts | 6 +- packages/server-util/package.json | 9 +- packages/shadcn/package.json | 1 - packages/xl-ai/package.json | 6 +- packages/xl-ai/vite.config.ts | 10 +++ packages/xl-email-exporter/package.json | 8 +- packages/xl-multi-column/package.json | 6 +- packages/xl-multi-column/vite.config.ts | 10 +++ packages/xl-odt-exporter/package.json | 1 - packages/xl-pdf-exporter/package.json | 5 +- pnpm-lock.yaml | 110 ++++++++---------------- 14 files changed, 86 insertions(+), 106 deletions(-) diff --git a/packages/code-block/package.json b/packages/code-block/package.json index 9b4301ffa4..aa20dd9695 100644 --- a/packages/code-block/package.json +++ b/packages/code-block/package.json @@ -49,14 +49,14 @@ "test-watch": "vitest watch" }, "dependencies": { - "@blocknote/core": "0.51.3", "@shikijs/core": "^4", "@shikijs/engine-javascript": "^4", "@shikijs/langs-precompiled": "^4", - "@shikijs/themes": "^4", - "@shikijs/types": "^4" + "@shikijs/themes": "^4" }, "devDependencies": { + "@blocknote/core": "0.51.3", + "@shikijs/types": "^4", "eslint": "^8.57.1", "rollup-plugin-webpack-stats": "^0.2.6", "typescript": "^5.9.3", diff --git a/packages/mantine/package.json b/packages/mantine/package.json index db7dbdce23..7f10fa38f3 100644 --- a/packages/mantine/package.json +++ b/packages/mantine/package.json @@ -62,10 +62,10 @@ }, "dependencies": { "@blocknote/core": "0.51.3", - "@blocknote/react": "0.51.3", - "react-icons": "^5.5.0" + "@blocknote/react": "0.51.3" }, "devDependencies": { + "react-icons": "^5.5.0", "@types/react": "^19.2.3", "@types/react-dom": "^19.2.3", "@vitejs/plugin-react": "^6.0.1", diff --git a/packages/mantine/vite.config.ts b/packages/mantine/vite.config.ts index db1342b975..6a44bf5424 100644 --- a/packages/mantine/vite.config.ts +++ b/packages/mantine/vite.config.ts @@ -45,6 +45,16 @@ export default defineConfig((conf) => ({ // make sure to externalize deps that shouldn't be bundled // into your library external: (source) => { + // Bundle react-icons into the output (tree-shaken) so consumers + // don't need to install it as a peer/runtime dependency. + const bundledDeps = ["react-icons"]; + if ( + bundledDeps.some( + (dep) => source === dep || source.startsWith(dep + "/") + ) + ) { + return false; + } if ( Object.keys({ ...pkg.dependencies, diff --git a/packages/react/src/icons.ts b/packages/react/src/icons.ts index b7a3e8daff..055f23a560 100644 --- a/packages/react/src/icons.ts +++ b/packages/react/src/icons.ts @@ -3,10 +3,10 @@ * Defined locally so consumers don't need react-icons installed for * type-checking. */ -export type IconType = React.ComponentType< - React.SVGAttributes & { +export type IconType = ( + props: React.SVGAttributes & { size?: string | number; color?: string; title?: string; } ->; +) => React.ReactNode; diff --git a/packages/server-util/package.json b/packages/server-util/package.json index 11c03e1e8b..92aab26c44 100644 --- a/packages/server-util/package.json +++ b/packages/server-util/package.json @@ -58,15 +58,14 @@ "dependencies": { "@blocknote/core": "0.51.3", "@blocknote/react": "0.51.3", - "@tiptap/core": "^3.13.0", "@tiptap/pm": "^3.13.0", - "jsdom": "^25.0.1", - "y-prosemirror": "^1.3.7", - "y-protocols": "^1.0.6", - "yjs": "^13.6.27" + "jsdom": "^25.0.1" }, "devDependencies": { "@types/jsdom": "^21.1.7", + "y-prosemirror": "^1.3.7", + "y-protocols": "^1.0.6", + "yjs": "^13.6.27", "@types/react": "^19.2.3", "@types/react-dom": "^19.2.3", "eslint": "^8.57.1", diff --git a/packages/shadcn/package.json b/packages/shadcn/package.json index 557c261ec4..8623e331e4 100644 --- a/packages/shadcn/package.json +++ b/packages/shadcn/package.json @@ -67,7 +67,6 @@ "@radix-ui/react-tabs": "^1.1.13", "@radix-ui/react-toggle": "^1.1.10", "@radix-ui/react-tooltip": "^1.2.8", - "autoprefixer": "^10.4.21", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "lucide-react": "^0.525.0", diff --git a/packages/xl-ai/package.json b/packages/xl-ai/package.json index 12bd5dea77..6794a1da75 100644 --- a/packages/xl-ai/package.json +++ b/packages/xl-ai/package.json @@ -73,11 +73,9 @@ "@ai-sdk/provider-utils": "^4.0.2", "@ai-sdk/react": "^3.0.5", "@blocknote/core": "0.51.3", - "@blocknote/mantine": "0.51.3", "@blocknote/react": "0.51.3", "@floating-ui/react": "^0.27.18", "@handlewithcare/prosemirror-suggest-changes": "^0.1.8", - "@tiptap/core": "^3.13.0", "ai": "^6.0.5", "lodash.isequal": "^4.5.0", "lodash.merge": "^4.6.2", @@ -87,12 +85,10 @@ "prosemirror-tables": "^1.8.3", "prosemirror-transform": "^1.11.0", "prosemirror-view": "^1.41.4", - "react": "^19.2.5", - "react-dom": "^19.2.5", - "react-icons": "^5.5.0", "y-prosemirror": "^1.3.7" }, "devDependencies": { + "react-icons": "^5.5.0", "@ai-sdk/anthropic": "^3.0.2", "@ai-sdk/google": "^3.0.2", "@ai-sdk/groq": "^3.0.2", diff --git a/packages/xl-ai/vite.config.ts b/packages/xl-ai/vite.config.ts index 2c56391772..d8b37eb6fb 100644 --- a/packages/xl-ai/vite.config.ts +++ b/packages/xl-ai/vite.config.ts @@ -51,6 +51,16 @@ export default defineConfig((conf) => ({ // make sure to externalize deps that shouldn't be bundled // into your library external: (source) => { + // Bundle react-icons into the output (tree-shaken) so consumers + // don't need to install it as a peer/runtime dependency. + const bundledDeps = ["react-icons"]; + if ( + bundledDeps.some( + (dep) => source === dep || source.startsWith(dep + "/") + ) + ) { + return false; + } if ( Object.keys({ ...pkg.dependencies, diff --git a/packages/xl-email-exporter/package.json b/packages/xl-email-exporter/package.json index eca57501c1..3d7dfb6770 100644 --- a/packages/xl-email-exporter/package.json +++ b/packages/xl-email-exporter/package.json @@ -55,17 +55,15 @@ }, "dependencies": { "@blocknote/core": "0.51.3", - "@blocknote/react": "0.51.3", "@react-email/components": "^1.0.5", "@react-email/render": "^2.0.4", - "buffer": "^6.0.3", - "react": "^19.2.5", - "react-dom": "^19.2.5", - "react-email": "^5.2.5", "web-streams-polyfill": "^4.2.0" }, "devDependencies": { "@types/jsdom": "^21.1.7", + "react": "^19.2.5", + "react-dom": "^19.2.5", + "react-email": "^5.2.5", "@types/react": "^19.2.3", "@types/react-dom": "^19.2.3", "eslint": "^8.57.1", diff --git a/packages/xl-multi-column/package.json b/packages/xl-multi-column/package.json index ae8784430f..02bd1f51f2 100644 --- a/packages/xl-multi-column/package.json +++ b/packages/xl-multi-column/package.json @@ -56,12 +56,10 @@ "@tiptap/core": "^3.13.0", "prosemirror-model": "^1.25.4", "prosemirror-state": "^1.4.4", - "prosemirror-tables": "^1.8.3", - "prosemirror-transform": "^1.11.0", - "prosemirror-view": "^1.41.4", - "react-icons": "^5.5.0" + "prosemirror-view": "^1.41.4" }, "devDependencies": { + "react-icons": "^5.5.0", "@types/react": "^19.2.3", "@types/react-dom": "^19.2.3", "eslint": "^8.57.1", diff --git a/packages/xl-multi-column/vite.config.ts b/packages/xl-multi-column/vite.config.ts index 67d5f30b4d..645c3d60c6 100644 --- a/packages/xl-multi-column/vite.config.ts +++ b/packages/xl-multi-column/vite.config.ts @@ -38,6 +38,16 @@ export default defineConfig((conf) => ({ // make sure to externalize deps that shouldn't be bundled // into your library external: (source) => { + // Bundle react-icons into the output (tree-shaken) so consumers + // don't need to install it as a peer/runtime dependency. + const bundledDeps = ["react-icons"]; + if ( + bundledDeps.some( + (dep) => source === dep || source.startsWith(dep + "/") + ) + ) { + return false; + } if ( Object.keys({ ...pkg.dependencies, diff --git a/packages/xl-odt-exporter/package.json b/packages/xl-odt-exporter/package.json index 6e47dd09ef..c1f104e27d 100644 --- a/packages/xl-odt-exporter/package.json +++ b/packages/xl-odt-exporter/package.json @@ -60,7 +60,6 @@ "@blocknote/core": "0.51.3", "@blocknote/xl-multi-column": "0.51.3", "@zip.js/zip.js": "^2.8.8", - "buffer": "^6.0.3", "image-meta": "^0.2.2" }, "devDependencies": { diff --git a/packages/xl-pdf-exporter/package.json b/packages/xl-pdf-exporter/package.json index f46320cdc9..182fbc15e5 100644 --- a/packages/xl-pdf-exporter/package.json +++ b/packages/xl-pdf-exporter/package.json @@ -57,11 +57,8 @@ }, "dependencies": { "@blocknote/core": "0.51.3", - "@blocknote/react": "0.51.3", "@blocknote/xl-multi-column": "0.51.3", - "@react-pdf/renderer": "^4.3.0", - "buffer": "^6.0.3", - "docx": "^9.5.1" + "@react-pdf/renderer": "^4.3.0" }, "devDependencies": { "@testing-library/react": "^16.3.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cb3028796a..96350aeed7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4575,9 +4575,6 @@ importers: packages/code-block: dependencies: - '@blocknote/core': - specifier: 0.51.3 - version: link:../core '@shikijs/core': specifier: ^4 version: 4.0.2 @@ -4590,10 +4587,13 @@ importers: '@shikijs/themes': specifier: ^4 version: 4.0.2 + devDependencies: + '@blocknote/core': + specifier: 0.51.3 + version: link:../core '@shikijs/types': specifier: ^4 version: 4.0.2 - devDependencies: eslint: specifier: ^8.57.1 version: 8.57.1 @@ -4761,9 +4761,6 @@ importers: '@mantine/hooks': specifier: ^8.3.11 || ^9.0.2 version: 9.1.1(react@19.2.5) - react-icons: - specifier: ^5.5.0 - version: 5.6.0(react@19.2.5) devDependencies: '@types/react': specifier: ^19.2.3 @@ -4783,6 +4780,9 @@ importers: react-dom: specifier: ^19.2.5 version: 19.2.5(react@19.2.5) + react-icons: + specifier: ^5.5.0 + version: 5.6.0(react@19.2.5) rimraf: specifier: ^5.0.10 version: 5.0.10 @@ -4896,24 +4896,12 @@ importers: '@blocknote/react': specifier: 0.51.3 version: link:../react - '@tiptap/core': - specifier: ^3.0.0 - version: 3.22.4(@tiptap/pm@3.22.4) '@tiptap/pm': specifier: ^3.0.0 version: 3.22.4 jsdom: specifier: ^25.0.1 version: 25.0.1(canvas@2.11.2) - y-prosemirror: - specifier: ^1.3.7 - version: 1.3.7(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.8)(y-protocols@1.0.7(yjs@13.6.30))(yjs@13.6.30) - y-protocols: - specifier: ^1.0.6 - version: 1.0.7(yjs@13.6.30) - yjs: - specifier: ^13.6.27 - version: 13.6.30 devDependencies: '@types/jsdom': specifier: ^21.1.7 @@ -4948,6 +4936,15 @@ importers: vitest: specifier: 4.1.2 version: 4.1.2(@opentelemetry/api@1.9.1)(@types/node@25.9.0)(jsdom@25.0.1(canvas@2.11.2))(msw@2.11.5(@types/node@25.9.0)(typescript@5.9.3))(vite@8.0.8(@types/node@25.9.0)(esbuild@0.27.5)(jiti@2.6.1)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.3)) + y-prosemirror: + specifier: ^1.3.7 + version: 1.3.7(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.8)(y-protocols@1.0.7(yjs@13.6.30))(yjs@13.6.30) + y-protocols: + specifier: ^1.0.6 + version: 1.0.7(yjs@13.6.30) + yjs: + specifier: ^13.6.27 + version: 13.6.30 packages/shadcn: dependencies: @@ -4984,9 +4981,6 @@ importers: '@radix-ui/react-tooltip': specifier: ^1.2.8 version: 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - autoprefixer: - specifier: ^10.4.21 - version: 10.4.21(postcss@8.5.14) class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -5060,9 +5054,6 @@ importers: '@blocknote/core': specifier: 0.51.3 version: link:../core - '@blocknote/mantine': - specifier: 0.51.3 - version: link:../mantine '@blocknote/react': specifier: 0.51.3 version: link:../react @@ -5072,9 +5063,6 @@ importers: '@handlewithcare/prosemirror-suggest-changes': specifier: ^0.1.8 version: 0.1.8(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-transform@1.12.0)(prosemirror-view@1.41.8) - '@tiptap/core': - specifier: ^3.0.0 - version: 3.22.4(@tiptap/pm@3.22.4) ai: specifier: ^6.0.5 version: 6.0.5(zod@4.3.6) @@ -5103,14 +5091,11 @@ importers: specifier: ^1.41.4 version: 1.41.8 react: - specifier: ^19.2.5 + specifier: ^18.0 || ^19.0 || >= 19.0.0-rc version: 19.2.5 react-dom: - specifier: ^19.2.5 + specifier: ^18.0 || ^19.0 || >= 19.0.0-rc version: 19.2.5(react@19.2.5) - react-icons: - specifier: ^5.5.0 - version: 5.6.0(react@19.2.5) y-prosemirror: specifier: ^1.3.7 version: 1.3.7(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.8)(y-protocols@1.0.7(yjs@13.6.30))(yjs@13.6.30) @@ -5181,6 +5166,9 @@ importers: msw-snapshot: specifier: ^5.3.0 version: 5.3.0(msw@2.11.5(@types/node@25.9.0)(typescript@5.9.3)) + react-icons: + specifier: ^5.5.0 + version: 5.6.0(react@19.2.5) rimraf: specifier: ^5.0.10 version: 5.0.10 @@ -5330,30 +5318,15 @@ importers: '@blocknote/core': specifier: 0.51.3 version: link:../core - '@blocknote/react': - specifier: 0.51.3 - version: link:../react '@react-email/components': specifier: ^1.0.5 version: 1.0.11(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@react-email/render': specifier: ^2.0.4 version: 2.0.5(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - buffer: - specifier: ^6.0.3 - version: 6.0.3 - react: - specifier: ^19.2.5 - version: 19.2.5 - react-dom: - specifier: ^19.2.5 - version: 19.2.5(react@19.2.5) - react-email: - specifier: ^5.2.5 - version: 5.2.10 web-streams-polyfill: specifier: ^4.2.0 - version: 4.2.0 + version: 4.3.0 devDependencies: '@types/jsdom': specifier: ^21.1.7 @@ -5367,6 +5340,15 @@ importers: eslint: specifier: ^8.57.1 version: 8.57.1 + react: + specifier: ^19.2.5 + version: 19.2.5 + react-dom: + specifier: ^19.2.5 + version: 19.2.5(react@19.2.5) + react-email: + specifier: ^5.2.5 + version: 5.2.10 rollup-plugin-webpack-stats: specifier: ^0.2.6 version: 0.2.6(rollup@4.60.1) @@ -5400,18 +5382,9 @@ importers: prosemirror-state: specifier: ^1.4.4 version: 1.4.4 - prosemirror-tables: - specifier: ^1.8.3 - version: 1.8.5 - prosemirror-transform: - specifier: ^1.11.0 - version: 1.12.0 prosemirror-view: specifier: ^1.41.4 version: 1.41.8 - react-icons: - specifier: ^5.5.0 - version: 5.6.0(react@19.2.5) devDependencies: '@types/react': specifier: ^19.2.3 @@ -5431,6 +5404,9 @@ importers: react-dom: specifier: ^19.2.5 version: 19.2.5(react@19.2.5) + react-icons: + specifier: ^5.5.0 + version: 5.6.0(react@19.2.5) rimraf: specifier: ^5.0.10 version: 5.0.10 @@ -5461,9 +5437,6 @@ importers: '@zip.js/zip.js': specifier: ^2.8.8 version: 2.8.26 - buffer: - specifier: ^6.0.3 - version: 6.0.3 image-meta: specifier: ^0.2.2 version: 0.2.2 @@ -5510,21 +5483,12 @@ importers: '@blocknote/core': specifier: 0.51.3 version: link:../core - '@blocknote/react': - specifier: 0.51.3 - version: link:../react '@blocknote/xl-multi-column': specifier: 0.51.3 version: link:../xl-multi-column '@react-pdf/renderer': specifier: ^4.3.0 version: 4.3.2(react@19.2.5) - buffer: - specifier: ^6.0.3 - version: 6.0.3 - docx: - specifier: ^9.5.1 - version: 9.5.1 devDependencies: '@testing-library/react': specifier: ^16.3.0 @@ -16215,8 +16179,8 @@ packages: wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} - web-streams-polyfill@4.2.0: - resolution: {integrity: sha512-0rYDzGOh9EZpig92umN5g5D/9A1Kff7k0/mzPSSCY8jEQeYkgRMoY7LhbXtUCWzLCMX0TUE9aoHkjFNB7D9pfA==} + web-streams-polyfill@4.3.0: + resolution: {integrity: sha512-/Gnggvj9oSrEvJbDyyPtAnxBt5fGQM2iWOKQNu7ie1OxDgK40iZpyV3TKaRiEzVj1oA1UxKnEy9XPXh6PW3eVw==} engines: {node: '>= 8'} webidl-conversions@3.0.1: @@ -28689,7 +28653,7 @@ snapshots: dependencies: defaults: 1.0.4 - web-streams-polyfill@4.2.0: {} + web-streams-polyfill@4.3.0: {} webidl-conversions@3.0.1: {} From 1def215d356b68cc82f9f0642d74afb88415d8d1 Mon Sep 17 00:00:00 2001 From: Nick the Sick Date: Wed, 27 May 2026 22:30:42 +0200 Subject: [PATCH 3/3] fix: address PR review comments - Remove leading blank line in YjsThreadStore.ts (nperez0111) - Restore crypto.randomUUID spy in afterAll in test (coderabbitai) - Move @blocknote/core out of devDeps in code-block (already peerDep) - Move @shikijs/types to optionalDependencies in code-block (nperez0111) - Move yjs back to dependencies in server-util (public API types) --- packages/code-block/package.json | 5 +++-- .../threadstore/yjs/YjsThreadStore.test.ts | 11 +++++++---- .../threadstore/yjs/YjsThreadStore.ts | 1 - packages/server-util/package.json | 4 ++-- pnpm-lock.yaml | 19 ++++++++++--------- 5 files changed, 22 insertions(+), 18 deletions(-) diff --git a/packages/code-block/package.json b/packages/code-block/package.json index aa20dd9695..ef4f712466 100644 --- a/packages/code-block/package.json +++ b/packages/code-block/package.json @@ -54,9 +54,10 @@ "@shikijs/langs-precompiled": "^4", "@shikijs/themes": "^4" }, + "optionalDependencies": { + "@shikijs/types": "^4" + }, "devDependencies": { - "@blocknote/core": "0.51.3", - "@shikijs/types": "^4", "eslint": "^8.57.1", "rollup-plugin-webpack-stats": "^0.2.6", "typescript": "^5.9.3", diff --git a/packages/core/src/comments/threadstore/yjs/YjsThreadStore.test.ts b/packages/core/src/comments/threadstore/yjs/YjsThreadStore.test.ts index 63140c397b..c7be2f203c 100644 --- a/packages/core/src/comments/threadstore/yjs/YjsThreadStore.test.ts +++ b/packages/core/src/comments/threadstore/yjs/YjsThreadStore.test.ts @@ -1,4 +1,4 @@ -import { beforeEach, describe, expect, it, vi } from "vitest"; +import { afterAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as Y from "yjs"; import { CommentBody } from "../../types.js"; import { DefaultThreadStoreAuth } from "../DefaultThreadStoreAuth.js"; @@ -6,11 +6,14 @@ import { YjsThreadStore } from "./YjsThreadStore.js"; // Mock crypto.randomUUID to generate sequential IDs let mockUuidCounter = 0; -const originalRandomUUID = crypto.randomUUID.bind(crypto); -vi.spyOn(crypto, "randomUUID").mockImplementation( - () => `mocked-uuid-${++mockUuidCounter}` as ReturnType, +const randomUUIDSpy = vi.spyOn(crypto, "randomUUID").mockImplementation( + () => `mocked-uuid-${++mockUuidCounter}` as `${string}-${string}-${string}-${string}-${string}`, ); +afterAll(() => { + randomUUIDSpy.mockRestore(); +}); + describe("YjsThreadStore", () => { let store: YjsThreadStore; let doc: Y.Doc; diff --git a/packages/core/src/comments/threadstore/yjs/YjsThreadStore.ts b/packages/core/src/comments/threadstore/yjs/YjsThreadStore.ts index d27f9d0829..6d7a18fd1f 100644 --- a/packages/core/src/comments/threadstore/yjs/YjsThreadStore.ts +++ b/packages/core/src/comments/threadstore/yjs/YjsThreadStore.ts @@ -1,4 +1,3 @@ - import * as Y from "yjs"; import { CommentBody, CommentData, ThreadData } from "../../types.js"; import { ThreadStoreAuth } from "../ThreadStoreAuth.js"; diff --git a/packages/server-util/package.json b/packages/server-util/package.json index 92aab26c44..ee3435f3e2 100644 --- a/packages/server-util/package.json +++ b/packages/server-util/package.json @@ -59,13 +59,13 @@ "@blocknote/core": "0.51.3", "@blocknote/react": "0.51.3", "@tiptap/pm": "^3.13.0", - "jsdom": "^25.0.1" + "jsdom": "^25.0.1", + "yjs": "^13.6.27" }, "devDependencies": { "@types/jsdom": "^21.1.7", "y-prosemirror": "^1.3.7", "y-protocols": "^1.0.6", - "yjs": "^13.6.27", "@types/react": "^19.2.3", "@types/react-dom": "^19.2.3", "eslint": "^8.57.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 96350aeed7..120771f0a2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4575,6 +4575,9 @@ importers: packages/code-block: dependencies: + '@blocknote/core': + specifier: 0.51.3 + version: link:../core '@shikijs/core': specifier: ^4 version: 4.0.2 @@ -4588,12 +4591,6 @@ importers: specifier: ^4 version: 4.0.2 devDependencies: - '@blocknote/core': - specifier: 0.51.3 - version: link:../core - '@shikijs/types': - specifier: ^4 - version: 4.0.2 eslint: specifier: ^8.57.1 version: 8.57.1 @@ -4612,6 +4609,10 @@ importers: vitest: specifier: 4.1.2 version: 4.1.2(@opentelemetry/api@1.9.1)(@types/node@25.9.0)(jsdom@29.0.2(@noble/hashes@2.0.1)(canvas@3.1.0))(msw@2.11.5(@types/node@25.9.0)(typescript@5.9.3))(vite@8.0.8(@types/node@25.9.0)(esbuild@0.27.5)(jiti@2.6.1)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.3)) + optionalDependencies: + '@shikijs/types': + specifier: ^4 + version: 4.0.2 packages/core: dependencies: @@ -4902,6 +4903,9 @@ importers: jsdom: specifier: ^25.0.1 version: 25.0.1(canvas@2.11.2) + yjs: + specifier: ^13.6.27 + version: 13.6.30 devDependencies: '@types/jsdom': specifier: ^21.1.7 @@ -4942,9 +4946,6 @@ importers: y-protocols: specifier: ^1.0.6 version: 1.0.7(yjs@13.6.30) - yjs: - specifier: ^13.6.27 - version: 13.6.30 packages/shadcn: dependencies: