-
Notifications
You must be signed in to change notification settings - Fork 22
/
Copy pathindex.ts
100 lines (82 loc) · 3.5 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
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
//
// Original code forked from https://github.com/Quramy/ts-graphql-plugin
import { StyledTemplateLanguageService } from 'typescript-styled-plugin/lib/api';
import { decorateWithTemplateLanguageService, Logger, TemplateSettings } from 'typescript-template-language-service-decorator';
import * as ts from 'typescript/lib/tsserverlibrary';
import { getLanguageService, LanguageService as HtmlLanguageService } from 'vscode-html-languageservice';
import { pluginName } from './config';
import { Configuration } from './configuration';
import HtmlTemplateLanguageService from './html-template-language-service';
import { getSubstitutions } from './substitutions';
import { CssDocumentProvider, VirtualDocumentProvider } from './virtual-document-provider';
const litHtmlPluginMarker = Symbol('__litHtmlPluginMarker__');
class LanguageServiceLogger implements Logger {
constructor(
private readonly info: ts.server.PluginCreateInfo
) { }
public log(msg: string) {
this.info.project.projectService.logger.info(`[${pluginName}] ${msg}`);
}
}
class HtmlPlugin {
private readonly _virtualDocumentProvider = new VirtualDocumentProvider();
private _htmlLanguageService?: HtmlLanguageService;
private _config = new Configuration();
public constructor(
private readonly _typescript: typeof ts
) { }
public create(info: ts.server.PluginCreateInfo): ts.LanguageService {
if ((info.languageService as any)[litHtmlPluginMarker]) {
// Already decorated
return info.languageService;
}
const logger = new LanguageServiceLogger(info);
this._config.update(info.config);
logger.log('config: ' + JSON.stringify(this._config));
const styledLanguageService = new StyledTemplateLanguageService(
this._typescript, {} as any,
new CssDocumentProvider(this.htmlLanguageService),
logger);
const htmlTemplateLanguageService = new HtmlTemplateLanguageService(
this._typescript,
this._config,
this._virtualDocumentProvider,
this.htmlLanguageService,
styledLanguageService,
logger);
const languageService = decorateWithTemplateLanguageService(
this._typescript,
info.languageService,
info.project,
htmlTemplateLanguageService,
this.getTemplateSettings(this._config, this._virtualDocumentProvider),
{ logger });
(languageService as any)[litHtmlPluginMarker] = true;
return languageService;
}
public onConfigurationChanged(config: any) {
this._config.update(config);
}
private get htmlLanguageService(): HtmlLanguageService {
if (!this._htmlLanguageService) {
this._htmlLanguageService = getLanguageService();
}
return this._htmlLanguageService;
}
private getTemplateSettings(
config: Configuration,
provider: VirtualDocumentProvider
): TemplateSettings {
return {
get tags() { return config.tags; } ,
enableForStringWithSubstitutions: true,
getSubstitutions: (templateString, spans): string => {
return getSubstitutions(this._typescript, this.htmlLanguageService, provider, templateString, spans);
},
};
}
}
export = (mod: { typescript: typeof ts }) =>
new HtmlPlugin(mod.typescript);