Skip to content

Commit 5435b69

Browse files
yoen-veltclaude
andcommitted
fix: resolve duplicate package issues in CRDT demos
- blocknote-demo: Add webpack alias for y-prosemirror to fix undoCommand/redoCommand import error, add missing @veltdev/react dep - codemirror-crdt-demo: Add webpack aliases for @codemirror/state, @codemirror/view, yjs, y-codemirror.next, lib0 to prevent duplicates - tiptap-crdt-demo: Add webpack aliases for yjs, y-prosemirror, lib0 to prevent duplicate Yjs instance errors 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent b20d9b0 commit 5435b69

File tree

5 files changed

+287
-28
lines changed

5 files changed

+287
-28
lines changed
Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,14 @@
11
/** @type {import('next').NextConfig} */
2-
const nextConfig = {}
2+
const nextConfig = {
3+
transpilePackages: ['@blocknote/core', '@blocknote/react', '@blocknote/mantine', 'y-prosemirror'],
4+
webpack: (config) => {
5+
// Ensure y-prosemirror is properly resolved to avoid duplicate instances
6+
config.resolve.alias = {
7+
...config.resolve.alias,
8+
'y-prosemirror': require.resolve('y-prosemirror'),
9+
}
10+
return config
11+
},
12+
}
313

414
module.exports = nextConfig

apps/react/crdt/text-editors/blocknote/blocknote-demo/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
"@tiptap/extension-text-style": "^2.26.4",
2323
"@tiptap/pm": "^2.26.4",
2424
"@veltdev/blocknote-crdt-react": "4.5.0-beta.3",
25+
"@veltdev/react": "^4.6.10",
2526
"clsx": "^2.1.1",
2627
"next": "^15.5.7",
2728
"react": "^19.2.0",

apps/react/crdt/text-editors/codemirror/codemirror-crdt-demo/next.config.js

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,24 @@
11
/** @type {import('next').NextConfig} */
22
const path = require('path');
33

4+
// Helper to get package directory from main entry
5+
const getPackageDir = (packageName) => {
6+
try {
7+
// Try resolving the main entry and get its directory
8+
const resolved = require.resolve(packageName);
9+
// Walk up to find the package root (contains node_modules or is in node_modules)
10+
let dir = path.dirname(resolved);
11+
while (dir !== '/' && !dir.endsWith(`node_modules/${packageName}`) && !dir.endsWith(`node_modules\\${packageName}`)) {
12+
const parent = path.dirname(dir);
13+
if (parent === dir) break;
14+
dir = parent;
15+
}
16+
return dir;
17+
} catch {
18+
return packageName;
19+
}
20+
};
21+
422
// List of domains allowed to embed this app in an iframe
523
const allowList = [
624
"'self'",
@@ -14,12 +32,17 @@ const EMBED_CSP = `frame-ancestors ${allowList}`;
1432
const nextConfig = {
1533
transpilePackages: ['@veltdev/react', '@veltdev/codemirror-crdt-react', '@veltdev/codemirror-crdt'],
1634
webpack: (config) => {
17-
// Resolve @veltdev/react for peer dependencies when using npm
18-
// Get the package directory, not just the entry file
19-
const veltReactPath = path.dirname(require.resolve('@veltdev/react/package.json'));
35+
// Resolve packages to single instances to prevent duplicate package issues
36+
const veltReactPath = getPackageDir('@veltdev/react');
2037
config.resolve.alias = {
2138
...config.resolve.alias,
2239
'@veltdev/react': veltReactPath,
40+
// Ensure single instances of CodeMirror and Yjs packages
41+
'@codemirror/state': getPackageDir('@codemirror/state'),
42+
'@codemirror/view': getPackageDir('@codemirror/view'),
43+
'yjs': getPackageDir('yjs'),
44+
'y-codemirror.next': getPackageDir('y-codemirror.next'),
45+
'lib0': getPackageDir('lib0'),
2346
};
2447
return config;
2548
},
Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,37 @@
11
/** @type {import('next').NextConfig} */
2-
const nextConfig = {}
2+
const path = require('path');
3+
4+
// Helper to get package directory from main entry
5+
const getPackageDir = (packageName) => {
6+
try {
7+
// Try resolving the main entry and get its directory
8+
const resolved = require.resolve(packageName);
9+
// Walk up to find the package root (contains node_modules or is in node_modules)
10+
let dir = path.dirname(resolved);
11+
while (dir !== '/' && !dir.endsWith(`node_modules/${packageName}`) && !dir.endsWith(`node_modules\\${packageName}`)) {
12+
const parent = path.dirname(dir);
13+
if (parent === dir) break;
14+
dir = parent;
15+
}
16+
return dir;
17+
} catch {
18+
return packageName;
19+
}
20+
};
21+
22+
const nextConfig = {
23+
transpilePackages: ['@veltdev/react', '@veltdev/tiptap-crdt-react', '@veltdev/tiptap-crdt'],
24+
webpack: (config) => {
25+
// Resolve packages to single instances to prevent duplicate package issues
26+
config.resolve.alias = {
27+
...config.resolve.alias,
28+
// Ensure single instances of Yjs packages
29+
'yjs': getPackageDir('yjs'),
30+
'y-prosemirror': getPackageDir('y-prosemirror'),
31+
'lib0': getPackageDir('lib0'),
32+
};
33+
return config;
34+
},
35+
}
336

437
module.exports = nextConfig

0 commit comments

Comments
 (0)