Skip to content

Commit 0aa0a24

Browse files
committed
fix: f@ck
1 parent e1e80b9 commit 0aa0a24

File tree

10 files changed

+588
-468
lines changed

10 files changed

+588
-468
lines changed

src/monaco/Monaco.vue

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@
22
import { setupMonacoEnv } from './env';
33
setupMonacoEnv();
44
import './monaco.contribution'
5+
56
</script>
67
<script lang="ts" setup>
78
import { onMounted, onBeforeUnmount, ref, shallowRef, nextTick, watchEffect } from 'vue';
89
import { loadGrammars } from './grammars';
910
import * as monaco from 'monaco-editor-core';
11+
import { prepareServiceVirtualFiles } from './prepare';
1012
import { setupThemePromise, getOrCreateModel } from './utils';
11-
// import { setupLs, setupValidate } from './ls';
1213
1314
const props = withDefaults(defineProps<{
1415
value?: string
@@ -36,9 +37,7 @@ const currentModel = shallowRef<monaco.editor.ITextModel>(
3637
)
3738
)
3839
39-
// const documentModelMap = shallowRef(new Map([[
40-
// currentModel.value.uri.fsPath, currentModel.value
41-
// ]]))
40+
prepareServiceVirtualFiles()
4241
4342
watchEffect(() => {
4443
if (currentModel.value.getValue() !== props.value) {
@@ -81,10 +80,6 @@ onMounted(async () => {
8180
editorInstance.onDidChangeModelContent(() => {
8281
emits('change', editorInstance.getValue());
8382
});
84-
85-
86-
87-
// setupValidate(editorInstance, ls);
8883
});
8984
9085
onBeforeUnmount(() => {

src/monaco/editor.worker.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11

22
declare module 'monaco-editor-core/esm/vs/editor/editor.worker' {
33
export function initialize(callback: (ctx: any, createData: any) => any): void;
4-
}
4+
}

src/monaco/monaco.contribution.ts

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import type * as mode from './vueMode';
2-
import { Emitter, type IEvent, languages } from 'monaco-editor-core';
2+
import { Emitter, type IEvent, languages, Uri } from 'monaco-editor-core';
3+
import { debounce } from '../utils';
34

45
export interface ModeConfiguration {
56
hovers?: boolean
@@ -8,14 +9,20 @@ export interface ModeConfiguration {
89
export interface LanguageServiceDefaults {
910
readonly languageId: string;
1011
readonly onDidChange: IEvent<LanguageServiceDefaults>;
12+
readonly onExtraLibChange: IEvent<LanguageServiceDefaults>;
1113
readonly modeConfiguration: ModeConfiguration;
14+
addExtraLib(uri: string, content: string): void
15+
getExtraLibs(): Record<string, string>;
1216
}
1317

1418
class LanguageServiceDefaultsImpl implements LanguageServiceDefaults {
1519
private _onDidChange = new Emitter<LanguageServiceDefaults>();
20+
private _onExtraLibChange = new Emitter<LanguageServiceDefaults>();
1621
private _modeConfiguration!: ModeConfiguration;
1722
private _languageId: string;
1823

24+
private _extraLibs: Record<string, string> = {};
25+
1926
constructor(
2027
languageId: string,
2128
modeConfiguration: ModeConfiguration
@@ -28,6 +35,10 @@ class LanguageServiceDefaultsImpl implements LanguageServiceDefaults {
2835
return this._onDidChange.event;
2936
}
3037

38+
get onExtraLibChange(): IEvent<LanguageServiceDefaults> {
39+
return this._onExtraLibChange.event;
40+
}
41+
3142
get languageId(): string {
3243
return this._languageId;
3344
}
@@ -40,6 +51,20 @@ class LanguageServiceDefaultsImpl implements LanguageServiceDefaults {
4051
this._modeConfiguration = modeConfiguration || Object.create(null);
4152
this._onDidChange.fire(this);
4253
}
54+
55+
addExtraLib(uri: string, content: string) {
56+
this._extraLibs[uri] = content;
57+
this.fireExtraLibChangeSoon();
58+
}
59+
60+
getExtraLibs() {
61+
return this._extraLibs;
62+
}
63+
64+
private fireExtraLibChangeSoon = debounce(() => {
65+
this._onExtraLibChange.fire(this);
66+
console.log('fire')
67+
}, 300)
4368
}
4469

4570
const modeConfigurationDefault: Required<ModeConfiguration> = {
@@ -51,7 +76,13 @@ export const vueDefaults: LanguageServiceDefaults = new LanguageServiceDefaultsI
5176
modeConfigurationDefault
5277
);
5378

54-
(<any>languages).vue = { vueDefaults };
79+
declare module "monaco-editor-core" {
80+
export namespace languages {
81+
export let vue: { vueDefaults: LanguageServiceDefaults };
82+
}
83+
}
84+
85+
languages.vue = { vueDefaults };
5586

5687
function getMode(): Promise<typeof mode> {
5788
return import('./vueMode');

src/monaco/prepare.ts

Lines changed: 21 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Uri, editor, languages } from 'monaco-editor-core';
1+
import { Uri, languages } from 'monaco-editor-core';
22

33
import libEs5Content from 'typescript/lib/lib.es5.d.ts?raw';
44
import libDomContent from 'typescript/lib/lib.dom.d.ts?raw';
@@ -17,43 +17,31 @@ export function prepareServiceVirtualFiles() {
1717
const libDtsUrl = Uri.parse('file:///lib.d.ts');
1818
const libPromiseUrl = Uri.parse('file:///lib.es2015.promise.d.ts');
1919

20-
const libEs5Model = getOrCreateModel(libEs5Url, 'typescript', libEs5Content);
21-
const libDomModel = getOrCreateModel(libDomUrl, 'typescript', libDomContent);
22-
const libDtsModel = getOrCreateModel(libDtsUrl, 'typescript', libDtsContent);
23-
const libPromiseModel = getOrCreateModel(libPromiseUrl, 'typescript', libPromiseContent);
20+
const libEs5Model = getOrCreateModel(libEs5Url, undefined, libEs5Content);
21+
const libDomModel = getOrCreateModel(libDomUrl, undefined, libDomContent);
22+
const libDtsModel = getOrCreateModel(libDtsUrl, undefined, libDtsContent);
23+
const libPromiseModel = getOrCreateModel(libPromiseUrl, undefined, libPromiseContent);
2424

2525
const vueUrl = Uri.parse('file:///node_modules/vue/index.d.ts');
2626
const vueRuntimeDomUrl = Uri.parse('file:///node_modules/%40vue/runtime-dom/index.d.ts');
2727
const vueRuntimeCoreUrl = Uri.parse('file:///node_modules/%40vue/runtime-core/index.d.ts');
2828
const vueSharedUrl = Uri.parse('file:///node_modules/%40vue/shared/index.d.ts');
2929
const vueReactivityUrl = Uri.parse('file:///node_modules/%40vue/reactivity/index.d.ts');
3030

31-
const vueModel = getOrCreateModel(vueUrl, 'typescript', vueContent);
32-
const vueRuntimeDomModel = getOrCreateModel(vueRuntimeDomUrl, 'typescript', vueRuntimeDomContent);
33-
const vueRuntimeCoreModel = getOrCreateModel(vueRuntimeCoreUrl, 'typescript', vueRuntimeCoreContent);
34-
const vueSharedModel = getOrCreateModel(vueSharedUrl, 'typescript', vueSharedContent);
35-
const vueReactivityModel = getOrCreateModel(vueReactivityUrl, 'typescript', vueReactivityContent);
36-
37-
const localMap = new Map<string, editor.ITextModel>();
38-
localMap.set(libEs5Url.fsPath, libEs5Model);
39-
localMap.set(libDomUrl.fsPath, libDomModel);
40-
localMap.set(libPromiseUrl.fsPath, libPromiseModel);
41-
localMap.set(libDtsUrl.fsPath, libDtsModel);
42-
43-
const nodeModulesMap = new Map<string, editor.ITextModel>();
44-
nodeModulesMap.set(vueUrl.fsPath, vueModel);
45-
nodeModulesMap.set(vueRuntimeDomUrl.fsPath, vueRuntimeDomModel);
46-
nodeModulesMap.set(vueRuntimeCoreUrl.fsPath, vueRuntimeCoreModel);
47-
nodeModulesMap.set(vueSharedUrl.fsPath, vueSharedModel);
48-
nodeModulesMap.set(vueReactivityUrl.fsPath, vueReactivityModel);
49-
50-
languages.typescript.typescriptDefaults.addExtraLib(libEs5Model.getValue(), libEs5Url.toString());
51-
languages.typescript.typescriptDefaults.addExtraLib(libDomModel.getValue(), libDomUrl.toString());
52-
languages.typescript.typescriptDefaults.addExtraLib(libPromiseModel.getValue(), libPromiseUrl.toString());
53-
languages.typescript.typescriptDefaults.addExtraLib(libDtsModel.getValue(), libDtsUrl.toString());
54-
55-
return {
56-
localMap,
57-
nodeModulesMap
58-
}
31+
const vueModel = getOrCreateModel(vueUrl, undefined, vueContent);
32+
const vueRuntimeDomModel = getOrCreateModel(vueRuntimeDomUrl, undefined, vueRuntimeDomContent);
33+
const vueRuntimeCoreModel = getOrCreateModel(vueRuntimeCoreUrl, undefined, vueRuntimeCoreContent);
34+
const vueSharedModel = getOrCreateModel(vueSharedUrl, undefined, vueSharedContent);
35+
const vueReactivityModel = getOrCreateModel(vueReactivityUrl, undefined, vueReactivityContent);
36+
37+
languages.vue.vueDefaults.addExtraLib(libEs5Model.uri.fsPath, libEs5Model.getValue());
38+
languages.vue.vueDefaults.addExtraLib(libDomModel.uri.fsPath, libDomModel.getValue());
39+
languages.vue.vueDefaults.addExtraLib(libPromiseModel.uri.fsPath, libPromiseModel.getValue());
40+
languages.vue.vueDefaults.addExtraLib(libDtsModel.uri.fsPath, libDtsModel.getValue());
41+
42+
languages.vue.vueDefaults.addExtraLib(vueModel.uri.fsPath, vueModel.getValue());
43+
languages.vue.vueDefaults.addExtraLib(vueRuntimeDomModel.uri.fsPath, vueRuntimeDomModel.getValue());
44+
languages.vue.vueDefaults.addExtraLib(vueRuntimeCoreModel.uri.fsPath, vueRuntimeCoreModel.getValue());
45+
languages.vue.vueDefaults.addExtraLib(vueSharedModel.uri.fsPath, vueSharedModel.getValue());
46+
languages.vue.vueDefaults.addExtraLib(vueReactivityModel.uri.fsPath, vueReactivityModel.getValue());
5947
}

src/monaco/services.ts

Lines changed: 36 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { worker } from 'monaco-editor-core';
1+
import type { worker } from 'monaco-editor-core';
22
// import { prepareServiceVirtualFiles } from './prepare';
33
import * as ts from 'typescript/lib/tsserverlibrary';
44
import {
@@ -11,42 +11,64 @@ import {
1111
} from '@volar/vue-language-service';
1212

1313
export function getLanguageServiceAndDocumentsService(
14-
getModelsMap: () => Map<string, worker.IMirrorModel>
14+
getModels: () => worker.IMirrorModel[],
15+
getExtraLibs: () => Record<string, string>
1516
) {
1617
const scriptSnapshots = new Map<string, ts.IScriptSnapshot>();
1718

19+
const findInModels = (fileName: string) => {
20+
return getModels().find(x => {
21+
return x.uri.toString() === fileName || x.uri.fsPath === fileName
22+
});
23+
}
24+
25+
const findInExtraLibs = (fileName: string): string | undefined => {
26+
return getExtraLibs()[fileName];
27+
}
28+
1829
const host: LanguageServiceHost = {
1930
readFile(fileName) {
20-
const modelsMap = getModelsMap();
21-
return modelsMap.get(fileName)?.getValue()
31+
const model = findInModels(fileName);
32+
if (model) {
33+
return model.getValue()
34+
}
35+
36+
const extraLibs = findInExtraLibs(fileName);
37+
return extraLibs
2238
},
2339
fileExists(fileName) {
24-
const modelsMap = getModelsMap();
25-
return modelsMap.has(fileName)
40+
return !!(findInModels(fileName) || findInExtraLibs(fileName))
2641
},
2742
getCompilationSettings(): ts.CompilerOptions {
28-
console.log('getCompilationSettings');
29-
const modelsMap = getModelsMap();
3043
return {
3144
...ts.getDefaultCompilerOptions(),
3245
allowJs: true,
3346
jsx: ts.JsxEmit.Preserve,
3447
module: ts.ModuleKind.ESNext,
3548
moduleResolution: ts.ModuleResolutionKind.NodeJs,
36-
lib: [...modelsMap.keys()],
3749
};
3850
},
3951
getVueCompilationSettings() {
4052
return {};
4153
},
4254
getScriptFileNames(): string[] {
43-
console.log('getScriptFileNames');
44-
const modelsMap = getModelsMap();
45-
return [...Array.from(modelsMap.keys())];
55+
const modelNames = getModels().map(x => x.uri.fsPath);
56+
const extraLibNames = Object.keys(getExtraLibs());
57+
const fileNames = [...modelNames, ...extraLibNames];
58+
return fileNames;
4659
},
4760
getScriptVersion(fileName: string): string {
48-
const modelsMap = getModelsMap();
49-
return modelsMap.get(fileName)?.version?.toString() ?? 'unknown version';
61+
const model = findInModels(fileName);
62+
if (model) {
63+
return `${model.version}`
64+
}
65+
66+
const extraLibs = findInExtraLibs(fileName);
67+
if (extraLibs) {
68+
return '1'
69+
}
70+
71+
return 'unknown version';
5072
},
5173
getScriptSnapshot(fileName: string): ts.IScriptSnapshot | undefined {
5274
console.log('getScriptSnapshot', fileName);

src/monaco/utils.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { loadWASM } from 'onigasm';
33
import { theme } from './themes/converted';
44
import onigasm from 'onigasm/lib/onigasm.wasm?url'
55

6-
export function getOrCreateModel(uri: Uri, lang: string, value: string) {
6+
export function getOrCreateModel(uri: Uri, lang: string | undefined, value: string) {
77
const model = editor.getModel(uri);
88
if (model) {
99
model.setValue(value);

0 commit comments

Comments
 (0)