@volar/monaco 1.6.3 → 1.6.5-patch.1

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 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?: ReturnType<typeof createDtsHost>;
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 createDtsHost(cdn: string, versions?: Record<string, string>, onFetch?: (fileName: string, text: string) => void): CdnDtsHost;
14
- declare class CdnDtsHost {
15
- cdn: string;
16
- versions: Record<string, string>;
17
- onFetch?: ((fileName: string, text: string) => void) | undefined;
18
- files: Map<string, string | Promise<string | undefined> | undefined>;
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 {
20
+ private cdn;
21
+ private versions;
22
+ private flat?;
23
+ private onFetch?;
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): string | Promise<string | undefined> | undefined;
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.createDtsHost = exports.createLanguageService = void 0;
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 oldVersion = await options.dtsHost.getVersion();
33
- let result = await languageService[api](...args);
34
- let newVersion = await options.dtsHost.getVersion();
35
- while (newVersion !== oldVersion) {
36
- oldVersion = newVersion;
37
- if (newVersion !== dtsVersion) {
38
- dtsVersion = newVersion;
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
- result = await languageService[api](...args);
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@${ts.version}/lib/${ts.getDefaultLibFileName(options)}`;
139
+ return `/node_modules/typescript/lib/${ts.getDefaultLibFileName(options)}`;
125
140
  }
126
141
  return '';
127
142
  },
@@ -155,48 +170,109 @@ function createLanguageService(options) {
155
170
  }
156
171
  }
157
172
  exports.createLanguageService = createLanguageService;
158
- function createDtsHost(cdn, versions = {}, onFetch) {
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.createDtsHost = createDtsHost;
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
- this.lastUpdateFilesSize = this.files.size;
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 if 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
- try {
193
- const text = await (await fetch(url)).text();
194
- this.onFetch?.(fileName, text);
195
- return text;
196
- }
197
- catch {
198
- // ignore
269
+ const text = await fetchText(url);
270
+ if (text) {
271
+ if (this.onFetch) {
272
+ this.onFetch(fileName, text);
273
+ }
199
274
  }
275
+ return text;
200
276
  }
201
277
  resolveRequestFileName(fileName) {
202
278
  for (const [key, version] of Object.entries(this.versions)) {
@@ -207,20 +283,27 @@ class CdnDtsHost {
207
283
  }
208
284
  return fileName;
209
285
  }
210
- /**
211
- * save / load with json
212
- */
213
- async toJson() {
214
- const json = {};
215
- for (const [fileName, file] of this.files) {
216
- json[fileName] = (await file) ?? null;
286
+ }
287
+ async function fetchText(url) {
288
+ try {
289
+ const res = await fetch(url);
290
+ if (res.status === 200) {
291
+ return await res.text();
217
292
  }
218
- return json;
219
293
  }
220
- fromJson(json) {
221
- for (const [fileName, file] of Object.entries(json)) {
222
- this.files.set(fileName, file ?? undefined);
294
+ catch {
295
+ // ignore
296
+ }
297
+ }
298
+ async function fetchJson(url) {
299
+ try {
300
+ const res = await fetch(url);
301
+ if (res.status === 200) {
302
+ return await res.json();
223
303
  }
224
304
  }
305
+ catch {
306
+ // ignore
307
+ }
225
308
  }
226
309
  //# sourceMappingURL=worker.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@volar/monaco",
3
- "version": "1.6.3",
3
+ "version": "1.6.5-patch.1",
4
4
  "main": "out/index.js",
5
5
  "license": "MIT",
6
6
  "files": [
@@ -15,10 +15,9 @@
15
15
  "directory": "packages/monaco"
16
16
  },
17
17
  "dependencies": {
18
- "@volar/language-service": "1.6.3",
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
- },
23
- "gitHead": "79c29a4632028168280819ecd6c0d68e31c08848"
22
+ }
24
23
  }