Skip to content

Commit 0eec6ea

Browse files
committed
web: Deduplicate and optimize CodeMirror packages in Vite and Vitest
Define a central list of CodeMirror packages to deduplicate and pre-bundle. This ensures CodeMirror extension instanceof checks do not fail due to multiple active package instances across Vite and Vitest.
1 parent 620f726 commit 0eec6ea

4 files changed

Lines changed: 57 additions & 0 deletions

File tree

web/codemirror-packages.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
export const CODEMIRROR_PACKAGES = [
2+
'@codemirror/autocomplete',
3+
'@codemirror/commands',
4+
'@codemirror/lang-cpp',
5+
'@codemirror/lang-css',
6+
'@codemirror/lang-html',
7+
'@codemirror/lang-java',
8+
'@codemirror/lang-javascript',
9+
'@codemirror/lang-json',
10+
'@codemirror/lang-markdown',
11+
'@codemirror/lang-php',
12+
'@codemirror/lang-python',
13+
'@codemirror/lang-rust',
14+
'@codemirror/lang-sql',
15+
'@codemirror/lang-xml',
16+
'@codemirror/language',
17+
'@codemirror/lint',
18+
'@codemirror/merge',
19+
'@codemirror/state',
20+
'@codemirror/theme-one-dark',
21+
'@codemirror/view',
22+
] as const;
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { Compartment, EditorState } from '@codemirror/state';
2+
import { describe, expect, it } from 'vitest';
3+
4+
import { loadLanguageExtension } from '../language-loader';
5+
6+
describe('loadLanguageExtension', () => {
7+
it('loads a .svelte language extension that CodeMirror can reconfigure', async () => {
8+
const languageCompartment = new Compartment();
9+
let editorState = EditorState.create({
10+
doc: '<script lang="ts">let count = 0;</script>\n<button>{count}</button>',
11+
extensions: [languageCompartment.of([])],
12+
});
13+
14+
const extensions = await loadLanguageExtension('Counter.svelte');
15+
const transaction = editorState.update({
16+
effects: languageCompartment.reconfigure(extensions),
17+
});
18+
editorState = transaction.state;
19+
20+
expect(extensions.length).toBeGreaterThan(0);
21+
expect(editorState.doc.lines).toBe(2);
22+
});
23+
});

web/vite.config.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { sveltekit } from '@sveltejs/kit/vite';
33
import tailwindcss from '@tailwindcss/vite';
44
import { defineConfig } from 'vite';
55
import path from 'node:path';
6+
import { CODEMIRROR_PACKAGES } from './codemirror-packages';
67

78
export default defineConfig({
89
plugins: [
@@ -17,6 +18,11 @@ export default defineConfig({
1718
alias: {
1819
$shared: path.resolve(__dirname, '../common'),
1920
},
21+
// CodeMirror extensions rely on instanceof checks from @codemirror/state.
22+
dedupe: [...CODEMIRROR_PACKAGES],
23+
},
24+
optimizeDeps: {
25+
include: [...CODEMIRROR_PACKAGES],
2026
},
2127
build: {
2228
rollupOptions: {

web/vitest.config.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
import { defineConfig } from 'vitest/config';
22
import { svelte } from '@sveltejs/vite-plugin-svelte';
3+
import { CODEMIRROR_PACKAGES } from './codemirror-packages';
34

45
export default defineConfig({
56
plugins: [svelte()],
7+
optimizeDeps: {
8+
include: [...CODEMIRROR_PACKAGES],
9+
},
610
test: {
711
environment: 'happy-dom',
812
globals: true,
@@ -16,5 +20,7 @@ export default defineConfig({
1620
},
1721
resolve: {
1822
conditions: ['browser'],
23+
// CodeMirror extensions rely on instanceof checks from @codemirror/state.
24+
dedupe: [...CODEMIRROR_PACKAGES],
1925
},
2026
});

0 commit comments

Comments
 (0)