@codingame/monaco-vscode-standalone-html-language-features 23.1.1 → 23.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,141 @@
1
+ import { WorkerManager } from './workerManager.js';
2
+ import { HoverAdapter, DocumentHighlightAdapter, DocumentLinkAdapter, FoldingRangeAdapter, DocumentSymbolAdapter, SelectionRangeAdapter, RenameAdapter, DocumentFormattingEditProvider, DocumentRangeFormattingEditProvider, CompletionAdapter } from '../common/lspLanguageFeatures.js';
3
+ export { DefinitionAdapter, DiagnosticsAdapter, DocumentColorAdapter, ReferenceAdapter, fromPosition, fromRange, toRange, toTextEdit } from '../common/lspLanguageFeatures.js';
4
+ import { languages } from 'monaco-editor';
5
+
6
+ class HTMLCompletionAdapter extends CompletionAdapter {
7
+ constructor(worker) {
8
+ super(worker, [".", ":", "<", '"', "=", "/"]);
9
+ }
10
+ }
11
+ function setupMode1(defaults) {
12
+ const client = new WorkerManager(defaults);
13
+ const worker = (...uris) => {
14
+ return client.getLanguageServiceWorker(...uris);
15
+ };
16
+ let languageId = defaults.languageId;
17
+ languages.registerCompletionItemProvider(languageId, new HTMLCompletionAdapter(worker));
18
+ languages.registerHoverProvider(languageId, new HoverAdapter(worker));
19
+ languages.registerDocumentHighlightProvider(
20
+ languageId,
21
+ new DocumentHighlightAdapter(worker)
22
+ );
23
+ languages.registerLinkProvider(languageId, new DocumentLinkAdapter(worker));
24
+ languages.registerFoldingRangeProvider(
25
+ languageId,
26
+ new FoldingRangeAdapter(worker)
27
+ );
28
+ languages.registerDocumentSymbolProvider(
29
+ languageId,
30
+ new DocumentSymbolAdapter(worker)
31
+ );
32
+ languages.registerSelectionRangeProvider(
33
+ languageId,
34
+ new SelectionRangeAdapter(worker)
35
+ );
36
+ languages.registerRenameProvider(languageId, new RenameAdapter(worker));
37
+ if (languageId === "html") {
38
+ languages.registerDocumentFormattingEditProvider(
39
+ languageId,
40
+ new DocumentFormattingEditProvider(worker)
41
+ );
42
+ languages.registerDocumentRangeFormattingEditProvider(
43
+ languageId,
44
+ new DocumentRangeFormattingEditProvider(worker)
45
+ );
46
+ }
47
+ }
48
+ function setupMode(defaults) {
49
+ const disposables = [];
50
+ const providers = [];
51
+ const client = new WorkerManager(defaults);
52
+ disposables.push(client);
53
+ const worker = (...uris) => {
54
+ return client.getLanguageServiceWorker(...uris);
55
+ };
56
+ function registerProviders() {
57
+ const { languageId, modeConfiguration } = defaults;
58
+ disposeAll(providers);
59
+ if (modeConfiguration.completionItems) {
60
+ providers.push(
61
+ languages.registerCompletionItemProvider(languageId, new HTMLCompletionAdapter(worker))
62
+ );
63
+ }
64
+ if (modeConfiguration.hovers) {
65
+ providers.push(
66
+ languages.registerHoverProvider(languageId, new HoverAdapter(worker))
67
+ );
68
+ }
69
+ if (modeConfiguration.documentHighlights) {
70
+ providers.push(
71
+ languages.registerDocumentHighlightProvider(
72
+ languageId,
73
+ new DocumentHighlightAdapter(worker)
74
+ )
75
+ );
76
+ }
77
+ if (modeConfiguration.links) {
78
+ providers.push(
79
+ languages.registerLinkProvider(languageId, new DocumentLinkAdapter(worker))
80
+ );
81
+ }
82
+ if (modeConfiguration.documentSymbols) {
83
+ providers.push(
84
+ languages.registerDocumentSymbolProvider(
85
+ languageId,
86
+ new DocumentSymbolAdapter(worker)
87
+ )
88
+ );
89
+ }
90
+ if (modeConfiguration.rename) {
91
+ providers.push(
92
+ languages.registerRenameProvider(languageId, new RenameAdapter(worker))
93
+ );
94
+ }
95
+ if (modeConfiguration.foldingRanges) {
96
+ providers.push(
97
+ languages.registerFoldingRangeProvider(
98
+ languageId,
99
+ new FoldingRangeAdapter(worker)
100
+ )
101
+ );
102
+ }
103
+ if (modeConfiguration.selectionRanges) {
104
+ providers.push(
105
+ languages.registerSelectionRangeProvider(
106
+ languageId,
107
+ new SelectionRangeAdapter(worker)
108
+ )
109
+ );
110
+ }
111
+ if (modeConfiguration.documentFormattingEdits) {
112
+ providers.push(
113
+ languages.registerDocumentFormattingEditProvider(
114
+ languageId,
115
+ new DocumentFormattingEditProvider(worker)
116
+ )
117
+ );
118
+ }
119
+ if (modeConfiguration.documentRangeFormattingEdits) {
120
+ providers.push(
121
+ languages.registerDocumentRangeFormattingEditProvider(
122
+ languageId,
123
+ new DocumentRangeFormattingEditProvider(worker)
124
+ )
125
+ );
126
+ }
127
+ }
128
+ registerProviders();
129
+ disposables.push(asDisposable(providers));
130
+ return asDisposable(disposables);
131
+ }
132
+ function asDisposable(disposables) {
133
+ return { dispose: () => disposeAll(disposables) };
134
+ }
135
+ function disposeAll(disposables) {
136
+ while (disposables.length) {
137
+ disposables.pop().dispose();
138
+ }
139
+ }
140
+
141
+ export { CompletionAdapter, DocumentFormattingEditProvider, DocumentHighlightAdapter, DocumentLinkAdapter, DocumentRangeFormattingEditProvider, DocumentSymbolAdapter, FoldingRangeAdapter, HoverAdapter, RenameAdapter, SelectionRangeAdapter, WorkerManager, setupMode, setupMode1 };
@@ -0,0 +1,126 @@
1
+ import { newHTMLDataProvider, getLanguageService } from 'vscode-html-languageservice';
2
+ import { TextDocument } from 'vscode-languageserver-textdocument';
3
+
4
+ class HTMLWorker {
5
+ constructor(ctx, createData) {
6
+ this._ctx = ctx;
7
+ this._languageSettings = createData.languageSettings;
8
+ this._languageId = createData.languageId;
9
+ const data = this._languageSettings.data;
10
+ const useDefaultDataProvider = data?.useDefaultDataProvider;
11
+ const customDataProviders = [];
12
+ if (data?.dataProviders) {
13
+ for (const id in data.dataProviders) {
14
+ customDataProviders.push(newHTMLDataProvider(id, data.dataProviders[id]));
15
+ }
16
+ }
17
+ this._languageService = getLanguageService({
18
+ useDefaultDataProvider,
19
+ customDataProviders
20
+ });
21
+ }
22
+ async doComplete(uri, position) {
23
+ let document = this._getTextDocument(uri);
24
+ if (!document) {
25
+ return null;
26
+ }
27
+ let htmlDocument = this._languageService.parseHTMLDocument(document);
28
+ return Promise.resolve(
29
+ this._languageService.doComplete(
30
+ document,
31
+ position,
32
+ htmlDocument,
33
+ this._languageSettings && this._languageSettings.suggest
34
+ )
35
+ );
36
+ }
37
+ async format(uri, range, options) {
38
+ let document = this._getTextDocument(uri);
39
+ if (!document) {
40
+ return [];
41
+ }
42
+ let formattingOptions = { ...this._languageSettings.format, ...options };
43
+ let textEdits = this._languageService.format(document, range, formattingOptions);
44
+ return Promise.resolve(textEdits);
45
+ }
46
+ async doHover(uri, position) {
47
+ let document = this._getTextDocument(uri);
48
+ if (!document) {
49
+ return null;
50
+ }
51
+ let htmlDocument = this._languageService.parseHTMLDocument(document);
52
+ let hover = this._languageService.doHover(document, position, htmlDocument);
53
+ return Promise.resolve(hover);
54
+ }
55
+ async findDocumentHighlights(uri, position) {
56
+ let document = this._getTextDocument(uri);
57
+ if (!document) {
58
+ return [];
59
+ }
60
+ let htmlDocument = this._languageService.parseHTMLDocument(document);
61
+ let highlights = this._languageService.findDocumentHighlights(document, position, htmlDocument);
62
+ return Promise.resolve(highlights);
63
+ }
64
+ async findDocumentLinks(uri) {
65
+ let document = this._getTextDocument(uri);
66
+ if (!document) {
67
+ return [];
68
+ }
69
+ let links = this._languageService.findDocumentLinks(
70
+ document,
71
+ null
72
+ /*TODO@aeschli*/
73
+ );
74
+ return Promise.resolve(links);
75
+ }
76
+ async findDocumentSymbols(uri) {
77
+ let document = this._getTextDocument(uri);
78
+ if (!document) {
79
+ return [];
80
+ }
81
+ let htmlDocument = this._languageService.parseHTMLDocument(document);
82
+ let symbols = this._languageService.findDocumentSymbols(document, htmlDocument);
83
+ return Promise.resolve(symbols);
84
+ }
85
+ async getFoldingRanges(uri, context) {
86
+ let document = this._getTextDocument(uri);
87
+ if (!document) {
88
+ return [];
89
+ }
90
+ let ranges = this._languageService.getFoldingRanges(document, context);
91
+ return Promise.resolve(ranges);
92
+ }
93
+ async getSelectionRanges(uri, positions) {
94
+ let document = this._getTextDocument(uri);
95
+ if (!document) {
96
+ return [];
97
+ }
98
+ let ranges = this._languageService.getSelectionRanges(document, positions);
99
+ return Promise.resolve(ranges);
100
+ }
101
+ async doRename(uri, position, newName) {
102
+ let document = this._getTextDocument(uri);
103
+ if (!document) {
104
+ return null;
105
+ }
106
+ let htmlDocument = this._languageService.parseHTMLDocument(document);
107
+ let renames = this._languageService.doRename(document, position, newName, htmlDocument);
108
+ return Promise.resolve(renames);
109
+ }
110
+ _getTextDocument(uri) {
111
+ let models = this._ctx.getMirrorModels();
112
+ for (let model of models) {
113
+ if (model.uri.toString() === uri) {
114
+ return TextDocument.create(
115
+ uri,
116
+ this._languageId,
117
+ model.version,
118
+ model.getValue()
119
+ );
120
+ }
121
+ }
122
+ return null;
123
+ }
124
+ }
125
+
126
+ export { HTMLWorker };
@@ -0,0 +1,64 @@
1
+ import { createWebWorker } from '../../common/workers.js';
2
+
3
+ const STOP_WHEN_IDLE_FOR = 2 * 60 * 1e3;
4
+ class WorkerManager {
5
+ constructor(defaults) {
6
+ this._defaults = defaults;
7
+ this._worker = null;
8
+ this._client = null;
9
+ this._idleCheckInterval = window.setInterval(() => this._checkIfIdle(), 30 * 1e3);
10
+ this._lastUsedTime = 0;
11
+ this._configChangeListener = this._defaults.onDidChange(() => this._stopWorker());
12
+ }
13
+ _stopWorker() {
14
+ if (this._worker) {
15
+ this._worker.dispose();
16
+ this._worker = null;
17
+ }
18
+ this._client = null;
19
+ }
20
+ dispose() {
21
+ clearInterval(this._idleCheckInterval);
22
+ this._configChangeListener.dispose();
23
+ this._stopWorker();
24
+ }
25
+ _checkIfIdle() {
26
+ if (!this._worker) {
27
+ return;
28
+ }
29
+ let timePassedSinceLastUsed = Date.now() - this._lastUsedTime;
30
+ if (timePassedSinceLastUsed > STOP_WHEN_IDLE_FOR) {
31
+ this._stopWorker();
32
+ }
33
+ }
34
+ _getClient() {
35
+ this._lastUsedTime = Date.now();
36
+ if (!this._client) {
37
+ this._worker = createWebWorker({
38
+ // module that exports the create() method and returns a `HTMLWorker` instance
39
+ moduleId: "vs/language/html/htmlWorker",
40
+ createWorker: () => new Worker(new URL(new URL('../../html.worker.js', import.meta.url).href, import.meta.url), { type: "module" }),
41
+ // passed in to the create() method
42
+ createData: {
43
+ languageSettings: this._defaults.options,
44
+ languageId: this._defaults.languageId
45
+ },
46
+ label: this._defaults.languageId
47
+ });
48
+ this._client = this._worker.getProxy();
49
+ }
50
+ return this._client;
51
+ }
52
+ getLanguageServiceWorker(...resources) {
53
+ let _client;
54
+ return this._getClient().then((client) => {
55
+ _client = client;
56
+ }).then((_) => {
57
+ if (this._worker) {
58
+ return this._worker.withSyncedResources(resources);
59
+ }
60
+ }).then((_) => _client);
61
+ }
62
+ }
63
+
64
+ export { WorkerManager };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@codingame/monaco-vscode-standalone-html-language-features",
3
- "version": "23.1.1",
3
+ "version": "23.2.0",
4
4
  "keywords": [],
5
5
  "author": {
6
6
  "name": "CodinGame",
@@ -25,6 +25,9 @@
25
25
  "main": "index.js",
26
26
  "module": "index.js",
27
27
  "dependencies": {
28
- "monaco-editor": "npm:@codingame/monaco-vscode-editor-api@23.1.1"
28
+ "monaco-editor": "npm:@codingame/monaco-vscode-editor-api@23.2.0",
29
+ "vscode-html-languageservice": "5.2.0",
30
+ "vscode-languageserver-textdocument": "1.0.12",
31
+ "vscode-languageserver-types": "3.17.5"
29
32
  }
30
33
  }