@volar/monaco 1.6.4 → 1.6.5
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.
- package/out/worker.d.ts +13 -11
- package/out/worker.js +120 -43
- package/package.json +3 -3
package/out/worker.d.ts
CHANGED
|
@@ -3,29 +3,31 @@ import type * as monaco from 'monaco-editor-core';
|
|
|
3
3
|
import type * as ts from 'typescript/lib/tsserverlibrary';
|
|
4
4
|
export declare function createLanguageService(options: {
|
|
5
5
|
workerContext: monaco.worker.IWorkerContext<any>;
|
|
6
|
-
dtsHost?:
|
|
6
|
+
dtsHost?: DtsHost;
|
|
7
7
|
config: Config;
|
|
8
8
|
typescript?: {
|
|
9
9
|
module: typeof import('typescript/lib/tsserverlibrary');
|
|
10
10
|
compilerOptions: ts.CompilerOptions;
|
|
11
11
|
};
|
|
12
12
|
}): {};
|
|
13
|
-
export declare function
|
|
14
|
-
declare
|
|
13
|
+
export declare function createBaseDtsHost(cdn: string, versions?: Record<string, string>, flat?: (pkg: string, version: string | undefined) => Promise<string[]>, onFetch?: (fileName: string, text: string) => void): CdnDtsHost;
|
|
14
|
+
export declare function createJsDelivrDtsHost(versions?: Record<string, string>, onFetch?: (fileName: string, text: string) => void): CdnDtsHost;
|
|
15
|
+
export interface DtsHost {
|
|
16
|
+
readFile(fileName: string): Thenable<string | undefined>;
|
|
17
|
+
getVersion(): Thenable<number>;
|
|
18
|
+
}
|
|
19
|
+
declare class CdnDtsHost implements DtsHost {
|
|
15
20
|
cdn: string;
|
|
16
21
|
versions: Record<string, string>;
|
|
22
|
+
flat?: ((pkg: string, version: string | undefined) => Promise<string[]>) | undefined;
|
|
17
23
|
onFetch?: ((fileName: string, text: string) => void) | undefined;
|
|
18
|
-
files: Map<string,
|
|
24
|
+
files: Map<string, Promise<string | undefined>>;
|
|
25
|
+
flatResult: Map<string, Promise<string[]>>;
|
|
19
26
|
lastUpdateFilesSize: number;
|
|
20
|
-
constructor(cdn: string, versions?: Record<string, string>, onFetch?: ((fileName: string, text: string) => void) | undefined);
|
|
27
|
+
constructor(cdn: string, versions?: Record<string, string>, flat?: ((pkg: string, version: string | undefined) => Promise<string[]>) | undefined, onFetch?: ((fileName: string, text: string) => void) | undefined);
|
|
21
28
|
getVersion(): Promise<number>;
|
|
22
|
-
readFile(fileName: string):
|
|
29
|
+
readFile(fileName: string): Promise<string | undefined>;
|
|
23
30
|
fetchFile(fileName: string): Promise<string | undefined>;
|
|
24
31
|
resolveRequestFileName(fileName: string): string;
|
|
25
|
-
/**
|
|
26
|
-
* save / load with json
|
|
27
|
-
*/
|
|
28
|
-
toJson(): Promise<Record<string, string | null>>;
|
|
29
|
-
fromJson(json: Record<string, string | null>): void;
|
|
30
32
|
}
|
|
31
33
|
export {};
|
package/out/worker.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.createJsDelivrDtsHost = exports.createBaseDtsHost = exports.createLanguageService = void 0;
|
|
4
4
|
const language_service_1 = require("@volar/language-service");
|
|
5
5
|
const vscode_uri_1 = require("vscode-uri");
|
|
6
6
|
function createLanguageService(options) {
|
|
@@ -15,6 +15,8 @@ function createLanguageService(options) {
|
|
|
15
15
|
rootUri: vscode_uri_1.URI.file('/'),
|
|
16
16
|
}, config, host);
|
|
17
17
|
let dtsVersion = 0;
|
|
18
|
+
let runningApis = 0;
|
|
19
|
+
const toClear = new Set();
|
|
18
20
|
class InnocentRabbit {
|
|
19
21
|
}
|
|
20
22
|
;
|
|
@@ -29,22 +31,35 @@ function createLanguageService(options) {
|
|
|
29
31
|
if (!options.dtsHost) {
|
|
30
32
|
return languageService[api](...args);
|
|
31
33
|
}
|
|
32
|
-
let
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
34
|
+
let result;
|
|
35
|
+
try {
|
|
36
|
+
runningApis++;
|
|
37
|
+
let oldVersion = await options.dtsHost.getVersion();
|
|
38
|
+
result = await languageService[api](...args);
|
|
39
|
+
let newVersion = await options.dtsHost.getVersion();
|
|
40
|
+
while (newVersion !== oldVersion) {
|
|
41
|
+
oldVersion = newVersion;
|
|
42
|
+
if (newVersion !== dtsVersion) {
|
|
43
|
+
dtsVersion = newVersion;
|
|
44
|
+
toClear.add(languageService);
|
|
45
|
+
languageService = (0, language_service_1.createLanguageService)({ typescript: ts }, {
|
|
46
|
+
rootUri: vscode_uri_1.URI.file('/'),
|
|
47
|
+
uriToFileName: (uri) => vscode_uri_1.URI.parse(uri).fsPath.replace(/\\/g, '/'),
|
|
48
|
+
fileNameToUri: (fileName) => vscode_uri_1.URI.file(fileName).toString(),
|
|
49
|
+
}, config, host);
|
|
50
|
+
}
|
|
51
|
+
result = await languageService[api](...args);
|
|
52
|
+
newVersion = await options.dtsHost.getVersion();
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
finally {
|
|
56
|
+
runningApis--;
|
|
57
|
+
}
|
|
58
|
+
if (runningApis === 0 && toClear.size > 0) {
|
|
59
|
+
for (const languageService of toClear) {
|
|
39
60
|
languageService.dispose();
|
|
40
|
-
languageService = (0, language_service_1.createLanguageService)({ typescript: ts }, {
|
|
41
|
-
rootUri: vscode_uri_1.URI.file('/'),
|
|
42
|
-
uriToFileName: (uri) => vscode_uri_1.URI.parse(uri).fsPath.replace(/\\/g, '/'),
|
|
43
|
-
fileNameToUri: (fileName) => vscode_uri_1.URI.file(fileName).toString(),
|
|
44
|
-
}, config, host);
|
|
45
61
|
}
|
|
46
|
-
|
|
47
|
-
newVersion = await options.dtsHost.getVersion();
|
|
62
|
+
toClear.clear();
|
|
48
63
|
}
|
|
49
64
|
return result;
|
|
50
65
|
};
|
|
@@ -121,7 +136,7 @@ function createLanguageService(options) {
|
|
|
121
136
|
},
|
|
122
137
|
getDefaultLibFileName(options) {
|
|
123
138
|
if (ts) {
|
|
124
|
-
return `/node_modules/typescript
|
|
139
|
+
return `/node_modules/typescript/lib/${ts.getDefaultLibFileName(options)}`;
|
|
125
140
|
}
|
|
126
141
|
return '';
|
|
127
142
|
},
|
|
@@ -155,48 +170,103 @@ function createLanguageService(options) {
|
|
|
155
170
|
}
|
|
156
171
|
}
|
|
157
172
|
exports.createLanguageService = createLanguageService;
|
|
158
|
-
function
|
|
159
|
-
return new CdnDtsHost(cdn, versions, onFetch);
|
|
173
|
+
function createBaseDtsHost(cdn, versions = {}, flat, onFetch) {
|
|
174
|
+
return new CdnDtsHost(cdn, versions, flat, onFetch);
|
|
160
175
|
}
|
|
161
|
-
exports.
|
|
176
|
+
exports.createBaseDtsHost = createBaseDtsHost;
|
|
177
|
+
function createJsDelivrDtsHost(versions = {}, onFetch) {
|
|
178
|
+
return new CdnDtsHost('https://cdn.jsdelivr.net/npm/', versions, async (pkg, version) => {
|
|
179
|
+
if (!version) {
|
|
180
|
+
const data = await fetchJson(`https://data.jsdelivr.com/v1/package/resolve/npm/${pkg}@latest`);
|
|
181
|
+
if (data?.version) {
|
|
182
|
+
version = data.version;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
if (!version) {
|
|
186
|
+
return [];
|
|
187
|
+
}
|
|
188
|
+
const flat = await fetchJson(`https://data.jsdelivr.com/v1/package/npm/${pkg}@${version}/flat`);
|
|
189
|
+
if (!flat) {
|
|
190
|
+
return [];
|
|
191
|
+
}
|
|
192
|
+
return flat.files.map(file => file.name);
|
|
193
|
+
}, onFetch);
|
|
194
|
+
}
|
|
195
|
+
exports.createJsDelivrDtsHost = createJsDelivrDtsHost;
|
|
162
196
|
class CdnDtsHost {
|
|
163
|
-
constructor(cdn, versions = {}, onFetch) {
|
|
197
|
+
constructor(cdn, versions = {}, flat, onFetch) {
|
|
164
198
|
this.cdn = cdn;
|
|
165
199
|
this.versions = versions;
|
|
200
|
+
this.flat = flat;
|
|
166
201
|
this.onFetch = onFetch;
|
|
167
202
|
this.files = new Map();
|
|
203
|
+
this.flatResult = new Map();
|
|
168
204
|
this.lastUpdateFilesSize = 0;
|
|
169
205
|
}
|
|
170
206
|
async getVersion() {
|
|
171
207
|
while (this.files.size !== this.lastUpdateFilesSize) {
|
|
172
|
-
|
|
208
|
+
const newFileSize = this.files.size;
|
|
173
209
|
await Promise.all(this.files.values());
|
|
210
|
+
if (newFileSize > this.lastUpdateFilesSize) {
|
|
211
|
+
this.lastUpdateFilesSize = newFileSize;
|
|
212
|
+
}
|
|
174
213
|
}
|
|
175
214
|
return this.files.size;
|
|
176
215
|
}
|
|
177
|
-
readFile(fileName) {
|
|
216
|
+
async readFile(fileName) {
|
|
178
217
|
if (fileName.startsWith('/node_modules/')
|
|
179
218
|
// ignore .js because it's no help for intellisense
|
|
180
219
|
&& (fileName.endsWith('.d.ts') || fileName.endsWith('/package.json'))) {
|
|
181
220
|
if (!this.files.has(fileName)) {
|
|
182
|
-
this.files.set(fileName, undefined);
|
|
183
221
|
this.files.set(fileName, this.fetchFile(fileName));
|
|
184
222
|
}
|
|
185
|
-
return this.files.get(fileName);
|
|
223
|
+
return await this.files.get(fileName);
|
|
186
224
|
}
|
|
187
225
|
return undefined;
|
|
188
226
|
}
|
|
189
227
|
async fetchFile(fileName) {
|
|
228
|
+
if (this.flat) {
|
|
229
|
+
let pkgName = fileName.split('/')[2];
|
|
230
|
+
if (pkgName.startsWith('@')) {
|
|
231
|
+
pkgName += '/' + fileName.split('/')[3];
|
|
232
|
+
}
|
|
233
|
+
if (pkgName.endsWith('.d.ts') || pkgName.endsWith('/node_modules')) {
|
|
234
|
+
return undefined;
|
|
235
|
+
}
|
|
236
|
+
// hard code for known invalid package
|
|
237
|
+
if (pkgName.startsWith('@typescript/') || pkgName.startsWith('@types/typescript__')) {
|
|
238
|
+
return undefined;
|
|
239
|
+
}
|
|
240
|
+
// don't check @types the original package already having types
|
|
241
|
+
if (pkgName.startsWith('@types/')) {
|
|
242
|
+
let originalPkgName = pkgName.slice('@types/'.length);
|
|
243
|
+
if (originalPkgName.indexOf('__') >= 0) {
|
|
244
|
+
originalPkgName = '@' + originalPkgName.replace('__', '/');
|
|
245
|
+
}
|
|
246
|
+
const packageJson = await this.readFile(`/node_modules/${originalPkgName}/package.json`);
|
|
247
|
+
if (packageJson) {
|
|
248
|
+
const packageJsonObj = JSON.parse(packageJson);
|
|
249
|
+
if (packageJsonObj.types || packageJsonObj.typings) {
|
|
250
|
+
return undefined;
|
|
251
|
+
}
|
|
252
|
+
const indexDts = await this.readFile(`/node_modules/${originalPkgName}/index.d.ts`);
|
|
253
|
+
if (indexDts) {
|
|
254
|
+
return undefined;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
if (!this.flatResult.has(pkgName)) {
|
|
259
|
+
this.flatResult.set(pkgName, this.flat(pkgName, this.versions[pkgName]));
|
|
260
|
+
}
|
|
261
|
+
const flat = await this.flatResult.get(pkgName);
|
|
262
|
+
const include = flat.includes(fileName.slice(`/node_modules/${pkgName}`.length));
|
|
263
|
+
if (!include) {
|
|
264
|
+
return undefined;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
190
267
|
const requestFileName = this.resolveRequestFileName(fileName);
|
|
191
268
|
const url = this.cdn + requestFileName.slice('/node_modules/'.length);
|
|
192
|
-
|
|
193
|
-
const text = await (await fetch(url)).text();
|
|
194
|
-
this.onFetch?.(fileName, text);
|
|
195
|
-
return text;
|
|
196
|
-
}
|
|
197
|
-
catch {
|
|
198
|
-
// ignore
|
|
199
|
-
}
|
|
269
|
+
return await fetchText(url);
|
|
200
270
|
}
|
|
201
271
|
resolveRequestFileName(fileName) {
|
|
202
272
|
for (const [key, version] of Object.entries(this.versions)) {
|
|
@@ -207,20 +277,27 @@ class CdnDtsHost {
|
|
|
207
277
|
}
|
|
208
278
|
return fileName;
|
|
209
279
|
}
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
json[fileName] = (await file) ?? null;
|
|
280
|
+
}
|
|
281
|
+
async function fetchText(url) {
|
|
282
|
+
try {
|
|
283
|
+
const res = await fetch(url);
|
|
284
|
+
if (res.status === 200) {
|
|
285
|
+
return await res.text();
|
|
217
286
|
}
|
|
218
|
-
return json;
|
|
219
287
|
}
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
288
|
+
catch {
|
|
289
|
+
// ignore
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
async function fetchJson(url) {
|
|
293
|
+
try {
|
|
294
|
+
const res = await fetch(url);
|
|
295
|
+
if (res.status === 200) {
|
|
296
|
+
return await res.json();
|
|
223
297
|
}
|
|
224
298
|
}
|
|
299
|
+
catch {
|
|
300
|
+
// ignore
|
|
301
|
+
}
|
|
225
302
|
}
|
|
226
303
|
//# sourceMappingURL=worker.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@volar/monaco",
|
|
3
|
-
"version": "1.6.
|
|
3
|
+
"version": "1.6.5",
|
|
4
4
|
"main": "out/index.js",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"files": [
|
|
@@ -15,10 +15,10 @@
|
|
|
15
15
|
"directory": "packages/monaco"
|
|
16
16
|
},
|
|
17
17
|
"dependencies": {
|
|
18
|
-
"@volar/language-service": "1.6.
|
|
18
|
+
"@volar/language-service": "1.6.5",
|
|
19
19
|
"monaco-editor-core": "^0.36.0",
|
|
20
20
|
"vscode-languageserver-protocol": "^3.17.3",
|
|
21
21
|
"vscode-uri": "^3.0.7"
|
|
22
22
|
},
|
|
23
|
-
"gitHead": "
|
|
23
|
+
"gitHead": "7fa98d2d3bf1fde8aabb39f62d8522bea0c23098"
|
|
24
24
|
}
|