/
index.ts
145 lines (140 loc) · 6.32 KB
/
index.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
export * from '@volar/language-service';
export * from '@vue/language-core';
export * from './lib/ideFeatures/nameCasing';
export * from './lib/types';
import type { ServiceContext, ServiceEnvironment, LanguageServicePlugin } from '@volar/language-service';
import type { VueCompilerOptions } from './lib/types';
import { create as createEmmetPlugin } from 'volar-service-emmet';
import { create as createJsonPlugin } from 'volar-service-json';
import { create as createPugFormatPlugin } from 'volar-service-pug-beautify';
import { create as createTypeScriptPlugins } from 'volar-service-typescript';
import { create as createTypeScriptTwoslashQueriesPlugin } from 'volar-service-typescript-twoslash-queries';
import { create as createTypeScriptDocCommentTemplatePlugin } from 'volar-service-typescript/lib/plugins/docCommentTemplate';
import { create as createTypeScriptSyntacticPlugin } from 'volar-service-typescript/lib/plugins/syntactic';
import { create as createCssPlugin } from './lib/plugins/css';
import { create as createVueAutoDotValuePlugin } from './lib/plugins/vue-autoinsert-dotvalue';
import { create as createVueAutoWrapParenthesesPlugin } from './lib/plugins/vue-autoinsert-parentheses';
import { create as createVueAutoAddSpacePlugin } from './lib/plugins/vue-autoinsert-space';
import { create as createVueReferencesCodeLensPlugin } from './lib/plugins/vue-codelens-references';
import { create as createVueDirectiveCommentsPlugin } from './lib/plugins/vue-directive-comments';
import { create as createVueDocumentDropPlugin } from './lib/plugins/vue-document-drop';
import { create as createVueExtractFilePlugin } from './lib/plugins/vue-extract-file';
import { create as createVueSfcPlugin } from './lib/plugins/vue-sfc';
import { create as createVueTemplatePlugin } from './lib/plugins/vue-template';
import { create as createVueToggleVBindPlugin } from './lib/plugins/vue-toggle-v-bind-codeaction';
import { create as createVueTwoslashQueriesPlugin } from './lib/plugins/vue-twoslash-queries';
import { create as createVueVisualizeHiddenCallbackParamPlugin } from './lib/plugins/vue-visualize-hidden-callback-param';
import { decorateLanguageServiceForVue } from '@vue/typescript-plugin/lib/common';
import { collectExtractProps } from '@vue/typescript-plugin/lib/requests/collectExtractProps';
import { getComponentEvents, getComponentNames, getComponentProps, getElementAttrs, getTemplateContextProps } from '@vue/typescript-plugin/lib/requests/componentInfos';
import { getImportPathForFile } from '@vue/typescript-plugin/lib/requests/getImportPathForFile';
import { getPropertiesAtLocation } from '@vue/typescript-plugin/lib/requests/getPropertiesAtLocation';
import { getQuickInfoAtPosition } from '@vue/typescript-plugin/lib/requests/getQuickInfoAtPosition';
export function createVueServicePlugins(
ts: typeof import('typescript'),
getVueOptions: (env: ServiceEnvironment) => VueCompilerOptions,
getTsPluginClient = createDefaultGetTsPluginClient(ts, getVueOptions),
hybridMode = false,
): LanguageServicePlugin[] {
const plugins: LanguageServicePlugin[] = [];
if (!hybridMode) {
plugins.push(...createTypeScriptPlugins(ts));
for (let i = 0; i < plugins.length; i++) {
const plugin = plugins[i];
if (plugin.name === 'typescript-semantic') {
plugins[i] = {
...plugin,
create(context) {
const created = plugin.create(context);
if (!context.language.typescript) {
return created;
}
const languageService = (created.provide as import('volar-service-typescript').Provide)['typescript/languageService']();
const vueOptions = getVueOptions(context.env);
decorateLanguageServiceForVue(context.language, languageService, vueOptions, ts, false);
return created;
},
};
break;
}
}
}
else {
plugins.push(
createTypeScriptSyntacticPlugin(ts),
createTypeScriptDocCommentTemplatePlugin(ts),
);
}
plugins.push(
createTypeScriptTwoslashQueriesPlugin(ts),
createCssPlugin(),
createPugFormatPlugin(),
createJsonPlugin(),
createVueTemplatePlugin('html', ts, getVueOptions, getTsPluginClient),
createVueTemplatePlugin('pug', ts, getVueOptions, getTsPluginClient),
createVueSfcPlugin(),
createVueTwoslashQueriesPlugin(ts, getTsPluginClient),
createVueReferencesCodeLensPlugin(),
createVueDocumentDropPlugin(ts),
createVueAutoDotValuePlugin(ts, getTsPluginClient),
createVueAutoWrapParenthesesPlugin(ts),
createVueAutoAddSpacePlugin(),
createVueVisualizeHiddenCallbackParamPlugin(),
createVueDirectiveCommentsPlugin(),
createVueExtractFilePlugin(ts, getTsPluginClient),
createVueToggleVBindPlugin(ts),
createEmmetPlugin(),
);
return plugins;
}
export function createDefaultGetTsPluginClient(
ts: typeof import('typescript'),
getVueOptions: (env: ServiceEnvironment) => VueCompilerOptions,
): (context: ServiceContext) => typeof import('@vue/typescript-plugin/lib/client') | undefined {
return context => {
if (!context.language.typescript) {
return;
}
const languageService = context.inject<(import('volar-service-typescript').Provide), 'typescript/languageService'>('typescript/languageService');
if (!languageService) {
return;
}
const requestContext = {
typescript: ts,
language: context.language,
languageService,
vueOptions: getVueOptions(context.env),
isTsPlugin: false,
getFileId: context.env.typescript!.fileNameToUri,
};
return {
async collectExtractProps(...args) {
return await collectExtractProps.apply(requestContext, args);
},
async getPropertiesAtLocation(...args) {
return await getPropertiesAtLocation.apply(requestContext, args);
},
async getImportPathForFile(...args) {
return await getImportPathForFile.apply(requestContext, args);
},
async getComponentEvents(...args) {
return await getComponentEvents.apply(requestContext, args);
},
async getComponentNames(...args) {
return await getComponentNames.apply(requestContext, args);
},
async getComponentProps(...args) {
return await getComponentProps.apply(requestContext, args);
},
async getElementAttrs(...args) {
return await getElementAttrs.apply(requestContext, args);
},
async getTemplateContextProps(...args) {
return await getTemplateContextProps.apply(requestContext, args);
},
async getQuickInfoAtPosition(...args) {
return await getQuickInfoAtPosition.apply(requestContext, args);
},
};
};
}