Skip to content

Commit 2a0dfc0

Browse files
committed
feat: pass vue dts module version from store
1 parent f538199 commit 2a0dfc0

File tree

5 files changed

+77
-19
lines changed

5 files changed

+77
-19
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@
4444
"@types/codemirror": "^5.60.2",
4545
"@types/node": "^16.11.12",
4646
"@vitejs/plugin-vue": "^3.0.0",
47-
"@volar/monaco": "1.3.0-alpha.3",
47+
"@volar/monaco": "1.3.0-alpha.3-patch.2",
4848
"@volar/vue-language-service": "1.2.2-alpha.0",
4949
"codemirror": "^5.62.3",
5050
"fflate": "^0.7.3",

pnpm-lock.yaml

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/monaco/Monaco.vue

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<script lang="ts">
22
import { loadMonacoEnv, loadWasm } from './env';
3-
loadMonacoEnv();
4-
loadWasm();
3+
4+
let init = false;
55
</script>
66

77
<script lang="ts" setup>
@@ -20,14 +20,19 @@ const props = withDefaults(defineProps<{
2020
2121
const emits = defineEmits<{
2222
(e: 'change', value: string): void,
23-
(e: 'save', value: string): void
2423
}>()
2524
2625
const containerRef = ref<HTMLDivElement | null>();
2726
const ready = ref(false);
2827
const editor = shallowRef<monaco.editor.IStandaloneCodeEditor | undefined>(undefined);
2928
const store = inject('store') as Store;
3029
30+
if (!init) {
31+
init = true;
32+
loadMonacoEnv(store);
33+
loadWasm();
34+
}
35+
3136
watchEffect(() => {
3237
// create a model for each file in the store
3338
for (const filename in store.state.files) {
@@ -87,6 +92,10 @@ onMounted(async () => {
8792
8893
await loadGrammars(editorInstance);
8994
95+
editorInstance.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyS, () => {
96+
// ignore save event
97+
});
98+
9099
editorInstance.onDidChangeModelContent(() => {
91100
emits('change', editorInstance.getValue());
92101
});

src/monaco/env.ts

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
11
import editorWorker from 'monaco-editor-core/esm/vs/editor/editor.worker?worker';
2-
import vueWorker from 'monaco-volar/vue.worker?worker';
2+
import vueWorker from './vue.worker?worker';
33
import * as onigasm from "onigasm";
44
import onigasmWasm from "onigasm/lib/onigasm.wasm?url";
5-
import { editor, languages } from 'monaco-editor-core';
5+
import { editor, languages, Uri } from 'monaco-editor-core';
66
import * as volar from '@volar/monaco';
7+
import { Store } from '../store';
8+
import * as VolarWorker from '@volar/monaco/worker';
9+
import { getOrCreateModel } from './utils';
710

811
export function loadWasm() {
912
return onigasm.loadWASM(onigasmWasm);
1013
}
1114

12-
export function loadMonacoEnv() {
15+
export function loadMonacoEnv(store: Store) {
1316
(self as any).MonacoEnvironment = {
1417
async getWorker(_: any, label: string) {
1518
if (label === 'vue') {
@@ -23,12 +26,24 @@ export function loadMonacoEnv() {
2326
const worker = editor.createWebWorker<any>({
2427
moduleId: 'vs/language/vue/vueWorker',
2528
label: 'vue',
26-
createData: {},
27-
})
28-
const languageId = ['vue']
29-
const getSyncUris = () => editor.getModels().map(m => m.uri);
30-
volar.editor.activateMarkers(worker, languageId, 'vue', getSyncUris, editor)
31-
volar.editor.activateAutoInsertion(worker, languageId, getSyncUris, editor)
32-
volar.languages.registerProvides(worker, languageId, getSyncUris, languages)
29+
host: VolarWorker.createDtsHost('https://unpkg.com/', !store.vueVersion ? {} : {
30+
'vue': store.vueVersion,
31+
'@vue/compiler-core': store.vueVersion,
32+
'@vue/compiler-dom': store.vueVersion,
33+
'@vue/compiler-sfc': store.vueVersion,
34+
'@vue/compiler-ssr': store.vueVersion,
35+
'@vue/reactivity': store.vueVersion,
36+
'@vue/runtime-core': store.vueVersion,
37+
'@vue/runtime-dom': store.vueVersion,
38+
'@vue/shared': store.vueVersion,
39+
}, (filename, text) => {
40+
getOrCreateModel(Uri.file(filename), undefined, text);
41+
}),
42+
});
43+
const languageId = ['vue'];
44+
const getSyncUris = () => Object.keys(store.state.files).map(filename => Uri.parse(`file:///${filename}`));
45+
volar.editor.activateMarkers(worker, languageId, 'vue', getSyncUris, editor);
46+
volar.editor.activateAutoInsertion(worker, languageId, getSyncUris, editor);
47+
volar.languages.registerProvides(worker, languageId, getSyncUris, languages);
3348
})
34-
}
49+
}

src/monaco/vue.worker.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// @ts-ignore
2+
import * as worker from 'monaco-editor-core/esm/vs/editor/editor.worker';
3+
import type * as monaco from 'monaco-editor-core';
4+
import * as ts from 'typescript';
5+
import { resolveConfig } from '@volar/vue-language-service';
6+
import * as VolarWorker from '@volar/monaco/worker';
7+
8+
self.onmessage = () => {
9+
worker.initialize((ctx: monaco.worker.IWorkerContext) => {
10+
11+
const compilerOptions: ts.CompilerOptions = {
12+
...ts.getDefaultCompilerOptions(),
13+
allowJs: true,
14+
jsx: ts.JsxEmit.Preserve,
15+
module: ts.ModuleKind.ESNext,
16+
moduleResolution: ts.ModuleResolutionKind.NodeJs,
17+
};
18+
19+
return VolarWorker.createLanguageService({
20+
workerContext: ctx,
21+
config: resolveConfig(
22+
{ plugins: { /* volar.config.js plugins */ } },
23+
ts as any,
24+
compilerOptions,
25+
{ plugins: [/* tsconfig vueCompilerOptions plugins */] }
26+
),
27+
typescript: {
28+
module: ts as any,
29+
compilerOptions,
30+
},
31+
dtsHost: ctx.host,
32+
});
33+
});
34+
};

0 commit comments

Comments
 (0)