@typespec/compiler 0.62.0-dev.7 → 0.62.0-dev.8
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/dist/manifest.js +2 -2
- package/dist/src/config/config-schema.d.ts +2 -1
- package/dist/src/config/config-schema.d.ts.map +1 -1
- package/dist/src/config/config-schema.js +2 -1
- package/dist/src/config/config-schema.js.map +1 -1
- package/dist/src/server/emitter-provider.d.ts +22 -0
- package/dist/src/server/emitter-provider.d.ts.map +1 -0
- package/dist/src/server/emitter-provider.js +79 -0
- package/dist/src/server/emitter-provider.js.map +1 -0
- package/dist/src/server/npm-package-provider.d.ts +51 -0
- package/dist/src/server/npm-package-provider.d.ts.map +1 -0
- package/dist/src/server/npm-package-provider.js +201 -0
- package/dist/src/server/npm-package-provider.js.map +1 -0
- package/dist/src/server/serverlib.d.ts.map +1 -1
- package/dist/src/server/serverlib.js +52 -1
- package/dist/src/server/serverlib.js.map +1 -1
- package/dist/src/server/tspconfig/completion.d.ts +11 -0
- package/dist/src/server/tspconfig/completion.d.ts.map +1 -0
- package/dist/src/server/tspconfig/completion.js +176 -0
- package/dist/src/server/tspconfig/completion.js.map +1 -0
- package/dist/src/server/yaml-resolver.d.ts +24 -0
- package/dist/src/server/yaml-resolver.d.ts.map +1 -0
- package/dist/src/server/yaml-resolver.js +253 -0
- package/dist/src/server/yaml-resolver.js.map +1 -0
- package/dist/src/testing/test-host.d.ts.map +1 -1
- package/dist/src/testing/test-host.js +22 -1
- package/dist/src/testing/test-host.js.map +1 -1
- package/dist/src/testing/types.d.ts +1 -0
- package/dist/src/testing/types.d.ts.map +1 -1
- package/dist/src/testing/types.js.map +1 -1
- package/dist/src/utils/misc.d.ts +5 -0
- package/dist/src/utils/misc.d.ts.map +1 -1
- package/dist/src/utils/misc.js +32 -0
- package/dist/src/utils/misc.js.map +1 -1
- package/package.json +1 -1
package/dist/manifest.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { JSONSchemaType } from "ajv";
|
|
2
|
-
import { TypeSpecRawConfig } from "./types.js";
|
|
2
|
+
import { EmitterOptions, TypeSpecRawConfig } from "./types.js";
|
|
3
|
+
export declare const emitterOptionsSchema: JSONSchemaType<EmitterOptions>;
|
|
3
4
|
export declare const TypeSpecConfigJsonSchema: JSONSchemaType<TypeSpecRawConfig>;
|
|
4
5
|
//# sourceMappingURL=config-schema.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-schema.d.ts","sourceRoot":"","sources":["../../../src/config/config-schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,KAAK,CAAC;AAC1C,OAAO,
|
|
1
|
+
{"version":3,"file":"config-schema.d.ts","sourceRoot":"","sources":["../../../src/config/config-schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,KAAK,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/D,eAAO,MAAM,oBAAoB,EAAE,cAAc,CAAC,cAAc,CAO/D,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,cAAc,CAAC,iBAAiB,CAsGtE,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const emitterOptionsSchema = {
|
|
1
|
+
export const emitterOptionsSchema = {
|
|
2
2
|
type: "object",
|
|
3
3
|
additionalProperties: true,
|
|
4
4
|
required: [],
|
|
@@ -74,6 +74,7 @@ export const TypeSpecConfigJsonSchema = {
|
|
|
74
74
|
emitters: {
|
|
75
75
|
type: "object",
|
|
76
76
|
nullable: true,
|
|
77
|
+
deprecated: true,
|
|
77
78
|
required: [],
|
|
78
79
|
additionalProperties: {
|
|
79
80
|
oneOf: [{ type: "boolean" }, emitterOptionsSchema],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-schema.js","sourceRoot":"","sources":["../../../src/config/config-schema.ts"],"names":[],"mappings":"AAGA,MAAM,oBAAoB,GAAmC;
|
|
1
|
+
{"version":3,"file":"config-schema.js","sourceRoot":"","sources":["../../../src/config/config-schema.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,oBAAoB,GAAmC;IAClE,IAAI,EAAE,QAAQ;IACd,oBAAoB,EAAE,IAAI;IAC1B,QAAQ,EAAE,EAAE;IACZ,UAAU,EAAE;QACV,oBAAoB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAS;KAChE;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,wBAAwB,GAAsC;IACzE,IAAI,EAAE,QAAQ;IACd,oBAAoB,EAAE,KAAK;IAC3B,UAAU,EAAE;QACV,OAAO,EAAE;YACP,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,IAAI;SACf;QACD,uBAAuB,EAAE;YACvB,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,EAAE;YACZ,oBAAoB,EAAE;gBACpB,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;iBAC5B;gBACD,QAAQ,EAAE,CAAC,SAAS,CAAC;aACtB;SACF;QACD,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,EAAE;YACZ,oBAAoB,EAAE;gBACpB,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;iBAC5B;gBACD,QAAQ,EAAE,CAAC,SAAS,CAAC;aACtB;SACF;QAED,YAAY,EAAE;YACZ,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,IAAI;SACf;QACD,eAAe,EAAE;YACf,IAAI,EAAE,SAAS;YACf,QAAQ,EAAE,IAAI;SACf;QACD,KAAK,EAAE;YACL,KAAK,EAAE;gBACL,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAClB;oBACE,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;iBAC1B;aACF;SACK,EAAE,2FAA2F;QACrG,OAAO,EAAE;YACP,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;SAC1B;QACD,IAAI,EAAE;YACJ,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;SAC1B;QACD,OAAO,EAAE;YACP,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,EAAE;YACZ,oBAAoB,EAAE,oBAAoB;SAC3C;QACD,QAAQ,EAAE;YACR,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,IAAI;YACd,UAAU,EAAE,IAAI;YAChB,QAAQ,EAAE,EAAE;YACZ,oBAAoB,EAAE;gBACpB,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,oBAAoB,CAAC;aACnD;SACF;QAED,MAAM,EAAE;YACN,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,EAAE;YACZ,oBAAoB,EAAE,KAAK;YAC3B,UAAU,EAAE;gBACV,OAAO,EAAE;oBACP,IAAI,EAAE,OAAO;oBACb,QAAQ,EAAE,IAAI;oBACd,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;iBAC1B;gBACD,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,QAAQ,EAAE,EAAE;oBACZ,QAAQ,EAAE,IAAI;oBACd,oBAAoB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;iBAC1C;gBACD,OAAO,EAAE;oBACP,IAAI,EAAE,QAAQ;oBACd,QAAQ,EAAE,EAAE;oBACZ,QAAQ,EAAE,IAAI;oBACd,oBAAoB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;iBACzC;aACF;SACK,EAAE,oDAAoD;KAC/D;CACF,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { NpmPackage, NpmPackageProvider } from "./npm-package-provider.js";
|
|
2
|
+
export declare class EmitterProvider {
|
|
3
|
+
private npmPackageProvider;
|
|
4
|
+
private isEmitterPackageCache;
|
|
5
|
+
constructor(npmPackageProvider: NpmPackageProvider);
|
|
6
|
+
/**
|
|
7
|
+
*
|
|
8
|
+
* @param startFolder folder starts to search for package.json with emitters defined as dependencies
|
|
9
|
+
* @returns
|
|
10
|
+
*/
|
|
11
|
+
listEmitters(startFolder: string): Promise<Record<string, NpmPackage>>;
|
|
12
|
+
/**
|
|
13
|
+
*
|
|
14
|
+
* @param startFolder folder starts to search for package.json with emitters defined as dependencies
|
|
15
|
+
* @param emitterName
|
|
16
|
+
* @returns
|
|
17
|
+
*/
|
|
18
|
+
getEmitter(startFolder: string, emitterName: string): Promise<NpmPackage | undefined>;
|
|
19
|
+
private isEmitter;
|
|
20
|
+
private getEmitterFromDep;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=emitter-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emitter-provider.d.ts","sourceRoot":"","sources":["../../../src/server/emitter-provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAE3E,qBAAa,eAAe;IAEd,OAAO,CAAC,kBAAkB;IADtC,OAAO,CAAC,qBAAqB,CAA8B;gBACvC,kBAAkB,EAAE,kBAAkB;IAE1D;;;;OAIG;IACG,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAsB5E;;;;;OAKG;IACG,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;YAQ7E,SAAS;YAwBT,iBAAiB;CAQhC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { joinPaths } from "../core/path-utils.js";
|
|
2
|
+
export class EmitterProvider {
|
|
3
|
+
npmPackageProvider;
|
|
4
|
+
isEmitterPackageCache = new Map();
|
|
5
|
+
constructor(npmPackageProvider) {
|
|
6
|
+
this.npmPackageProvider = npmPackageProvider;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
*
|
|
10
|
+
* @param startFolder folder starts to search for package.json with emitters defined as dependencies
|
|
11
|
+
* @returns
|
|
12
|
+
*/
|
|
13
|
+
async listEmitters(startFolder) {
|
|
14
|
+
const packageJsonFolder = await this.npmPackageProvider.getPackageJsonFolder(startFolder);
|
|
15
|
+
if (!packageJsonFolder)
|
|
16
|
+
return {};
|
|
17
|
+
const pkg = await this.npmPackageProvider.get(packageJsonFolder);
|
|
18
|
+
const data = await pkg?.getPackageJsonData();
|
|
19
|
+
if (!data)
|
|
20
|
+
return {};
|
|
21
|
+
const emitters = {};
|
|
22
|
+
const allDep = {
|
|
23
|
+
...(data.dependencies ?? {}),
|
|
24
|
+
...(data.devDependencies ?? {}),
|
|
25
|
+
};
|
|
26
|
+
for (const dep of Object.keys(allDep)) {
|
|
27
|
+
const depPkg = await this.getEmitterFromDep(packageJsonFolder, dep);
|
|
28
|
+
if (depPkg) {
|
|
29
|
+
emitters[dep] = depPkg;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return emitters;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
*
|
|
36
|
+
* @param startFolder folder starts to search for package.json with emitters defined as dependencies
|
|
37
|
+
* @param emitterName
|
|
38
|
+
* @returns
|
|
39
|
+
*/
|
|
40
|
+
async getEmitter(startFolder, emitterName) {
|
|
41
|
+
const packageJsonFolder = await this.npmPackageProvider.getPackageJsonFolder(startFolder);
|
|
42
|
+
if (!packageJsonFolder) {
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
return this.getEmitterFromDep(packageJsonFolder, emitterName);
|
|
46
|
+
}
|
|
47
|
+
async isEmitter(depName, pkg) {
|
|
48
|
+
if (this.isEmitterPackageCache.has(depName)) {
|
|
49
|
+
return this.isEmitterPackageCache.get(depName);
|
|
50
|
+
}
|
|
51
|
+
const data = await pkg.getPackageJsonData();
|
|
52
|
+
// don't add to cache when failing to load package.json which is unexpected
|
|
53
|
+
if (!data)
|
|
54
|
+
return false;
|
|
55
|
+
if ((data.devDependencies && data.devDependencies["@typespec/compiler"]) ||
|
|
56
|
+
(data.dependencies && data.dependencies["@typespec/compiler"])) {
|
|
57
|
+
const exports = await pkg.getModuleExports();
|
|
58
|
+
// don't add to cache when failing to load exports which is unexpected
|
|
59
|
+
if (!exports)
|
|
60
|
+
return false;
|
|
61
|
+
const isEmitter = exports.$onEmit !== undefined;
|
|
62
|
+
this.isEmitterPackageCache.set(depName, isEmitter);
|
|
63
|
+
return isEmitter;
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
this.isEmitterPackageCache.set(depName, false);
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
async getEmitterFromDep(packageJsonFolder, depName) {
|
|
71
|
+
const depFolder = joinPaths(packageJsonFolder, "node_modules", depName);
|
|
72
|
+
const depPkg = await this.npmPackageProvider.get(depFolder);
|
|
73
|
+
if (depPkg && (await this.isEmitter(depName, depPkg))) {
|
|
74
|
+
return depPkg;
|
|
75
|
+
}
|
|
76
|
+
return undefined;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=emitter-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emitter-provider.js","sourceRoot":"","sources":["../../../src/server/emitter-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { FileEvent } from "vscode-languageserver";
|
|
2
|
+
import { CompilerHost } from "../core/types.js";
|
|
3
|
+
import { NodePackage } from "../index.js";
|
|
4
|
+
export declare class NpmPackageProvider {
|
|
5
|
+
private host;
|
|
6
|
+
private pkgCache;
|
|
7
|
+
constructor(host: CompilerHost);
|
|
8
|
+
notify(changes: FileEvent[]): void;
|
|
9
|
+
/**
|
|
10
|
+
* Search for the nearest package.json file starting from the given folder to its parent/grandparent/... folders
|
|
11
|
+
* @param startFolder the folder to start searching for package.json file
|
|
12
|
+
* @returns
|
|
13
|
+
*/
|
|
14
|
+
getPackageJsonFolder(startFolder: string): Promise<string | undefined>;
|
|
15
|
+
/**
|
|
16
|
+
* Get the NpmPackage instance from the folder containing the package.json file.
|
|
17
|
+
*
|
|
18
|
+
* @param packageJsonFolder the dir containing the package.json file. This method won't search for the package.json file, use getPackageJsonFolder to search for the folder containing the package.json file if needed.
|
|
19
|
+
* @returns the NpmPackage instance or undefined if no proper package.json file found
|
|
20
|
+
*/
|
|
21
|
+
get(packageJsonFolder: string): Promise<NpmPackage | undefined>;
|
|
22
|
+
private resetCache;
|
|
23
|
+
/**
|
|
24
|
+
* reset the status of the provider with all the caches properly cleaned up
|
|
25
|
+
*/
|
|
26
|
+
reset(): void;
|
|
27
|
+
}
|
|
28
|
+
export declare class NpmPackage {
|
|
29
|
+
private host;
|
|
30
|
+
private packageJsonFolder;
|
|
31
|
+
private packageJsonData;
|
|
32
|
+
private constructor();
|
|
33
|
+
getPackageJsonData(): Promise<NodePackage | undefined>;
|
|
34
|
+
private packageModule;
|
|
35
|
+
getModuleExports(): Promise<Record<string, any> | undefined>;
|
|
36
|
+
resetCache(): void;
|
|
37
|
+
/**
|
|
38
|
+
* Create a NpmPackage instance from a folder containing a package.json file. Make sure to dispose the instance when you finish using it.
|
|
39
|
+
* @param packageJsonFolder the folder containing the package.json file
|
|
40
|
+
* @returns
|
|
41
|
+
*/
|
|
42
|
+
static createFrom(host: CompilerHost, packageJsonFolder: string): Promise<NpmPackage | undefined>;
|
|
43
|
+
/**
|
|
44
|
+
*
|
|
45
|
+
* @param packageJsonFolder the folder containing the package.json file
|
|
46
|
+
* @returns
|
|
47
|
+
*/
|
|
48
|
+
private static loadNodePackage;
|
|
49
|
+
private static loadModuleExports;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=npm-package-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"npm-package-provider.d.ts","sourceRoot":"","sources":["../../../src/server/npm-package-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAGlD,OAAO,EAAE,YAAY,EAAY,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAiB,MAAM,aAAa,CAAC;AAEzD,qBAAa,kBAAkB;IAGjB,OAAO,CAAC,IAAI;IAFxB,OAAO,CAAC,QAAQ,CAAiC;gBAE7B,IAAI,EAAE,YAAY;IAEtC,MAAM,CAAC,OAAO,EAAE,SAAS,EAAE;IAuB3B;;;;OAIG;IACG,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAuB5E;;;;;OAKG;IACU,GAAG,CAAC,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAgB5E,OAAO,CAAC,UAAU;IAQlB;;OAEG;IACI,KAAK;CAGb;AAED,qBAAa,UAAU;IAEnB,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,iBAAiB;IACzB,OAAO,CAAC,eAAe;IAHzB,OAAO;IAMD,kBAAkB,IAAI,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAO5D,OAAO,CAAC,aAAa,CAAkC;IACjD,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS,CAAC;IAalE,UAAU;IAKV;;;;OAIG;WACiB,UAAU,CAC5B,IAAI,EAAE,YAAY,EAClB,iBAAiB,EAAE,MAAM,GACxB,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAWlC;;;;OAIG;mBACkB,eAAe;mBAyBf,iBAAiB;CA0CvC"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import { getDirectoryPath, joinPaths, normalizePath } from "../core/path-utils.js";
|
|
2
|
+
import { loadJsFile } from "../core/source-loader.js";
|
|
3
|
+
import { NoTarget } from "../core/types.js";
|
|
4
|
+
import { resolveModule } from "../index.js";
|
|
5
|
+
import { distinctArray, isWhitespaceStringOrUndefined, tryParseJson } from "../utils/misc.js";
|
|
6
|
+
export class NpmPackageProvider {
|
|
7
|
+
host;
|
|
8
|
+
pkgCache = new Map();
|
|
9
|
+
constructor(host) {
|
|
10
|
+
this.host = host;
|
|
11
|
+
}
|
|
12
|
+
notify(changes) {
|
|
13
|
+
let folders = changes
|
|
14
|
+
.map((c) => normalizePath(this.host.fileURLToPath(c.uri)))
|
|
15
|
+
.filter((c) => c.endsWith("/package.json"))
|
|
16
|
+
.map((c) => getDirectoryPath(c));
|
|
17
|
+
folders = distinctArray(folders, (f) => f);
|
|
18
|
+
for (const folder of folders) {
|
|
19
|
+
const pkg = this.pkgCache.get(folder);
|
|
20
|
+
if (pkg) {
|
|
21
|
+
pkg.resetCache();
|
|
22
|
+
// since we may not get the notification for changes under node_modules
|
|
23
|
+
// just reset those for safety
|
|
24
|
+
const nodeModulesFolder = joinPaths(folder, "node_modules");
|
|
25
|
+
this.pkgCache.forEach((nmPkg, key) => {
|
|
26
|
+
if (key.startsWith(nodeModulesFolder)) {
|
|
27
|
+
nmPkg.resetCache();
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Search for the nearest package.json file starting from the given folder to its parent/grandparent/... folders
|
|
35
|
+
* @param startFolder the folder to start searching for package.json file
|
|
36
|
+
* @returns
|
|
37
|
+
*/
|
|
38
|
+
async getPackageJsonFolder(startFolder) {
|
|
39
|
+
if (isWhitespaceStringOrUndefined(startFolder)) {
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
let lastFolder = "";
|
|
43
|
+
let curFolder = startFolder;
|
|
44
|
+
while (curFolder !== lastFolder) {
|
|
45
|
+
const packageJsonPath = joinPaths(curFolder, "package.json");
|
|
46
|
+
try {
|
|
47
|
+
const stat = await this.host.stat(packageJsonPath);
|
|
48
|
+
if (stat.isFile()) {
|
|
49
|
+
return curFolder;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
catch (e) {
|
|
53
|
+
// ignore
|
|
54
|
+
}
|
|
55
|
+
lastFolder = curFolder;
|
|
56
|
+
curFolder = getDirectoryPath(curFolder);
|
|
57
|
+
}
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Get the NpmPackage instance from the folder containing the package.json file.
|
|
62
|
+
*
|
|
63
|
+
* @param packageJsonFolder the dir containing the package.json file. This method won't search for the package.json file, use getPackageJsonFolder to search for the folder containing the package.json file if needed.
|
|
64
|
+
* @returns the NpmPackage instance or undefined if no proper package.json file found
|
|
65
|
+
*/
|
|
66
|
+
async get(packageJsonFolder) {
|
|
67
|
+
const key = normalizePath(packageJsonFolder);
|
|
68
|
+
const r = this.pkgCache.get(key);
|
|
69
|
+
if (r) {
|
|
70
|
+
return r;
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
const pkg = await NpmPackage.createFrom(this.host, packageJsonFolder);
|
|
74
|
+
if (pkg) {
|
|
75
|
+
this.pkgCache.set(key, pkg);
|
|
76
|
+
return pkg;
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
return undefined;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
resetCache() {
|
|
84
|
+
const t = this.pkgCache;
|
|
85
|
+
this.pkgCache = new Map();
|
|
86
|
+
t.forEach((pkg) => {
|
|
87
|
+
pkg.resetCache();
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* reset the status of the provider with all the caches properly cleaned up
|
|
92
|
+
*/
|
|
93
|
+
reset() {
|
|
94
|
+
this.resetCache();
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
export class NpmPackage {
|
|
98
|
+
host;
|
|
99
|
+
packageJsonFolder;
|
|
100
|
+
packageJsonData;
|
|
101
|
+
constructor(host, packageJsonFolder, packageJsonData) {
|
|
102
|
+
this.host = host;
|
|
103
|
+
this.packageJsonFolder = packageJsonFolder;
|
|
104
|
+
this.packageJsonData = packageJsonData;
|
|
105
|
+
}
|
|
106
|
+
async getPackageJsonData() {
|
|
107
|
+
if (!this.packageJsonData) {
|
|
108
|
+
this.packageJsonData = await NpmPackage.loadNodePackage(this.host, this.packageJsonFolder);
|
|
109
|
+
}
|
|
110
|
+
return this.packageJsonData;
|
|
111
|
+
}
|
|
112
|
+
packageModule;
|
|
113
|
+
async getModuleExports() {
|
|
114
|
+
if (!this.packageModule) {
|
|
115
|
+
const data = await this.getPackageJsonData();
|
|
116
|
+
if (!data)
|
|
117
|
+
return undefined;
|
|
118
|
+
this.packageModule = await NpmPackage.loadModuleExports(this.host, this.packageJsonFolder, data.name);
|
|
119
|
+
}
|
|
120
|
+
return this.packageModule;
|
|
121
|
+
}
|
|
122
|
+
resetCache() {
|
|
123
|
+
this.packageJsonData = undefined;
|
|
124
|
+
this.packageModule = undefined;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Create a NpmPackage instance from a folder containing a package.json file. Make sure to dispose the instance when you finish using it.
|
|
128
|
+
* @param packageJsonFolder the folder containing the package.json file
|
|
129
|
+
* @returns
|
|
130
|
+
*/
|
|
131
|
+
static async createFrom(host, packageJsonFolder) {
|
|
132
|
+
if (!packageJsonFolder) {
|
|
133
|
+
return undefined;
|
|
134
|
+
}
|
|
135
|
+
const data = await NpmPackage.loadNodePackage(host, packageJsonFolder);
|
|
136
|
+
if (!data) {
|
|
137
|
+
return undefined;
|
|
138
|
+
}
|
|
139
|
+
return new NpmPackage(host, packageJsonFolder, data);
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
*
|
|
143
|
+
* @param packageJsonFolder the folder containing the package.json file
|
|
144
|
+
* @returns
|
|
145
|
+
*/
|
|
146
|
+
static async loadNodePackage(host, packageJsonFolder) {
|
|
147
|
+
if (!packageJsonFolder) {
|
|
148
|
+
return undefined;
|
|
149
|
+
}
|
|
150
|
+
const packageJsonPath = joinPaths(packageJsonFolder, "package.json");
|
|
151
|
+
try {
|
|
152
|
+
if (!(await host.stat(packageJsonPath)).isFile()) {
|
|
153
|
+
return undefined;
|
|
154
|
+
}
|
|
155
|
+
const content = await host.readFile(packageJsonPath);
|
|
156
|
+
const data = tryParseJson(content.text);
|
|
157
|
+
if (!data || !data.name) {
|
|
158
|
+
return undefined;
|
|
159
|
+
}
|
|
160
|
+
return data;
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
return undefined;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
static async loadModuleExports(host, baseDir, packageName) {
|
|
167
|
+
try {
|
|
168
|
+
const module = await resolveModule({
|
|
169
|
+
realpath: host.realpath,
|
|
170
|
+
readFile: async (path) => {
|
|
171
|
+
const sf = await host.readFile(path);
|
|
172
|
+
return sf.text;
|
|
173
|
+
},
|
|
174
|
+
stat: host.stat,
|
|
175
|
+
}, packageName, { baseDir });
|
|
176
|
+
if (!module) {
|
|
177
|
+
return undefined;
|
|
178
|
+
}
|
|
179
|
+
const entrypoint = module.type === "file" ? module.path : module.mainFile;
|
|
180
|
+
const oldExit = process.exit;
|
|
181
|
+
try {
|
|
182
|
+
// override process.exit to prevent the process from exiting because of it's called in loaded js file
|
|
183
|
+
let result;
|
|
184
|
+
process.exit = (() => {
|
|
185
|
+
// for module that calls process.exit when being imported, create an empty object as it's exports to avoid load it again
|
|
186
|
+
result = {};
|
|
187
|
+
throw new Error("process.exit is called unexpectedly when loading js file: " + entrypoint);
|
|
188
|
+
});
|
|
189
|
+
const [file] = await loadJsFile(host, entrypoint, NoTarget);
|
|
190
|
+
return result ?? file?.esmExports;
|
|
191
|
+
}
|
|
192
|
+
finally {
|
|
193
|
+
process.exit = oldExit;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
catch (e) {
|
|
197
|
+
return undefined;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=npm-package-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"npm-package-provider.js","sourceRoot":"","sources":["../../../src/server/npm-package-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serverlib.d.ts","sourceRoot":"","sources":["../../../src/server/serverlib.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"serverlib.d.ts","sourceRoot":"","sources":["../../../src/server/serverlib.ts"],"names":[],"mappings":"AA6FA,OAAO,EAGL,MAAM,EACN,UAAU,EAIX,MAAM,YAAY,CAAC;AAEpB,wBAAgB,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAw7BrD"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CodeAction, CodeActionKind, DiagnosticSeverity, DiagnosticTag, DocumentHighlightKind, MarkupKind, Range, SemanticTokensBuilder, TextDocumentSyncKind, TextEdit, Diagnostic as VSDiagnostic, } from "vscode-languageserver/node.js";
|
|
1
|
+
import { CodeAction, CodeActionKind, CompletionList, DiagnosticSeverity, DiagnosticTag, DocumentHighlightKind, MarkupKind, Range, SemanticTokensBuilder, TextDocumentSyncKind, TextEdit, Diagnostic as VSDiagnostic, } from "vscode-languageserver/node.js";
|
|
2
2
|
import { resolveCodeFix } from "../core/code-fixes.js";
|
|
3
3
|
import { compilerAssert, getSourceLocation } from "../core/diagnostics.js";
|
|
4
4
|
import { formatTypeSpec } from "../core/formatter.js";
|
|
@@ -15,9 +15,12 @@ import { getSemanticTokens } from "./classify.js";
|
|
|
15
15
|
import { createCompileService } from "./compile-service.js";
|
|
16
16
|
import { resolveCompletion } from "./completion.js";
|
|
17
17
|
import { Commands } from "./constants.js";
|
|
18
|
+
import { EmitterProvider } from "./emitter-provider.js";
|
|
18
19
|
import { createFileService } from "./file-service.js";
|
|
19
20
|
import { createFileSystemCache } from "./file-system-cache.js";
|
|
21
|
+
import { NpmPackageProvider } from "./npm-package-provider.js";
|
|
20
22
|
import { getSymbolStructure } from "./symbol-structure.js";
|
|
23
|
+
import { provideTspconfigCompletionItems } from "./tspconfig/completion.js";
|
|
21
24
|
import { getParameterDocumentation, getSymbolDetails, getTemplateParameterDocumentation, } from "./type-details.js";
|
|
22
25
|
import { SemanticTokenKind, } from "./types.js";
|
|
23
26
|
export function createServer(host) {
|
|
@@ -31,6 +34,8 @@ export function createServer(host) {
|
|
|
31
34
|
log,
|
|
32
35
|
});
|
|
33
36
|
const compilerHost = createCompilerHost();
|
|
37
|
+
const npmPackageProvider = new NpmPackageProvider(compilerHost);
|
|
38
|
+
const emitterProvider = new EmitterProvider(npmPackageProvider);
|
|
34
39
|
const compileService = createCompileService({
|
|
35
40
|
fileService,
|
|
36
41
|
fileSystemCache,
|
|
@@ -177,8 +182,14 @@ export function createServer(host) {
|
|
|
177
182
|
}
|
|
178
183
|
function watchedFilesChanged(params) {
|
|
179
184
|
fileSystemCache.notify(params.changes);
|
|
185
|
+
npmPackageProvider.notify(params.changes);
|
|
186
|
+
}
|
|
187
|
+
function isTspConfigFile(doc) {
|
|
188
|
+
return doc.uri.endsWith("tspconfig.yaml");
|
|
180
189
|
}
|
|
181
190
|
async function getFoldingRanges(params) {
|
|
191
|
+
if (isTspConfigFile(params.textDocument))
|
|
192
|
+
return [];
|
|
182
193
|
const ast = await compileService.getScript(params.textDocument);
|
|
183
194
|
if (!ast) {
|
|
184
195
|
return [];
|
|
@@ -233,6 +244,8 @@ export function createServer(host) {
|
|
|
233
244
|
}
|
|
234
245
|
}
|
|
235
246
|
async function getDocumentSymbols(params) {
|
|
247
|
+
if (isTspConfigFile(params.textDocument))
|
|
248
|
+
return [];
|
|
236
249
|
const ast = await compileService.getScript(params.textDocument);
|
|
237
250
|
if (!ast) {
|
|
238
251
|
return [];
|
|
@@ -240,6 +253,8 @@ export function createServer(host) {
|
|
|
240
253
|
return getSymbolStructure(ast);
|
|
241
254
|
}
|
|
242
255
|
async function findDocumentHighlight(params) {
|
|
256
|
+
if (isTspConfigFile(params.textDocument))
|
|
257
|
+
return [];
|
|
243
258
|
const result = await compileService.compile(params.textDocument);
|
|
244
259
|
if (result === undefined) {
|
|
245
260
|
return [];
|
|
@@ -252,9 +267,13 @@ export function createServer(host) {
|
|
|
252
267
|
}));
|
|
253
268
|
}
|
|
254
269
|
async function checkChange(change) {
|
|
270
|
+
if (isTspConfigFile(change.document))
|
|
271
|
+
return undefined;
|
|
255
272
|
compileService.notifyChange(change.document);
|
|
256
273
|
}
|
|
257
274
|
async function reportDiagnostics({ program, document }) {
|
|
275
|
+
if (isTspConfigFile(document))
|
|
276
|
+
return undefined;
|
|
258
277
|
currentDiagnosticIndex.clear();
|
|
259
278
|
// Group diagnostics by file.
|
|
260
279
|
//
|
|
@@ -312,6 +331,8 @@ export function createServer(host) {
|
|
|
312
331
|
}
|
|
313
332
|
}
|
|
314
333
|
async function getHover(params) {
|
|
334
|
+
if (isTspConfigFile(params.textDocument))
|
|
335
|
+
return { contents: [] };
|
|
315
336
|
const result = await compileService.compile(params.textDocument);
|
|
316
337
|
if (result === undefined) {
|
|
317
338
|
return { contents: [] };
|
|
@@ -328,6 +349,8 @@ export function createServer(host) {
|
|
|
328
349
|
};
|
|
329
350
|
}
|
|
330
351
|
async function getSignatureHelp(params) {
|
|
352
|
+
if (isTspConfigFile(params.textDocument))
|
|
353
|
+
return undefined;
|
|
331
354
|
const result = await compileService.compile(params.textDocument);
|
|
332
355
|
if (result === undefined) {
|
|
333
356
|
return undefined;
|
|
@@ -441,6 +464,8 @@ export function createServer(host) {
|
|
|
441
464
|
return help;
|
|
442
465
|
}
|
|
443
466
|
async function formatDocument(params) {
|
|
467
|
+
if (isTspConfigFile(params.textDocument))
|
|
468
|
+
return [];
|
|
444
469
|
const document = host.getOpenDocumentByURL(params.textDocument.uri);
|
|
445
470
|
if (document === undefined) {
|
|
446
471
|
return [];
|
|
@@ -488,6 +513,8 @@ export function createServer(host) {
|
|
|
488
513
|
return TextEdit.replace(Range.create(pos0, pos1), newText);
|
|
489
514
|
}
|
|
490
515
|
async function gotoDefinition(params) {
|
|
516
|
+
if (isTspConfigFile(params.textDocument))
|
|
517
|
+
return [];
|
|
491
518
|
const result = await compileService.compile(params.textDocument);
|
|
492
519
|
if (result === undefined) {
|
|
493
520
|
return [];
|
|
@@ -530,6 +557,18 @@ export function createServer(host) {
|
|
|
530
557
|
};
|
|
531
558
|
}
|
|
532
559
|
async function complete(params) {
|
|
560
|
+
if (isTspConfigFile(params.textDocument)) {
|
|
561
|
+
const doc = host.getOpenDocumentByURL(params.textDocument.uri);
|
|
562
|
+
if (doc) {
|
|
563
|
+
const items = await provideTspconfigCompletionItems(doc, params.position, {
|
|
564
|
+
fileService,
|
|
565
|
+
emitterProvider,
|
|
566
|
+
log,
|
|
567
|
+
});
|
|
568
|
+
return CompletionList.create(items);
|
|
569
|
+
}
|
|
570
|
+
return CompletionList.create([]);
|
|
571
|
+
}
|
|
533
572
|
const completions = {
|
|
534
573
|
isIncomplete: false,
|
|
535
574
|
items: [],
|
|
@@ -548,6 +587,8 @@ export function createServer(host) {
|
|
|
548
587
|
return completions;
|
|
549
588
|
}
|
|
550
589
|
async function findReferences(params) {
|
|
590
|
+
if (isTspConfigFile(params.textDocument))
|
|
591
|
+
return [];
|
|
551
592
|
const result = await compileService.compile(params.textDocument);
|
|
552
593
|
if (result === undefined) {
|
|
553
594
|
return [];
|
|
@@ -556,6 +597,8 @@ export function createServer(host) {
|
|
|
556
597
|
return getLocations(identifiers);
|
|
557
598
|
}
|
|
558
599
|
async function prepareRename(params) {
|
|
600
|
+
if (isTspConfigFile(params.textDocument))
|
|
601
|
+
return undefined;
|
|
559
602
|
const result = await compileService.compile(params.textDocument);
|
|
560
603
|
if (result === undefined) {
|
|
561
604
|
return undefined;
|
|
@@ -564,6 +607,8 @@ export function createServer(host) {
|
|
|
564
607
|
return id?.kind === SyntaxKind.Identifier ? getLocation(id)?.range : undefined;
|
|
565
608
|
}
|
|
566
609
|
async function rename(params) {
|
|
610
|
+
if (isTspConfigFile(params.textDocument))
|
|
611
|
+
return { changes: {} };
|
|
567
612
|
const changes = {};
|
|
568
613
|
const result = await compileService.compile(params.textDocument);
|
|
569
614
|
if (result) {
|
|
@@ -608,6 +653,8 @@ export function createServer(host) {
|
|
|
608
653
|
return references;
|
|
609
654
|
}
|
|
610
655
|
async function getSemanticTokensForDocument(params) {
|
|
656
|
+
if (isTspConfigFile(params.textDocument))
|
|
657
|
+
return [];
|
|
611
658
|
const ast = await compileService.getScript(params.textDocument);
|
|
612
659
|
if (!ast) {
|
|
613
660
|
return [];
|
|
@@ -615,6 +662,8 @@ export function createServer(host) {
|
|
|
615
662
|
return getSemanticTokens(ast);
|
|
616
663
|
}
|
|
617
664
|
async function buildSemanticTokens(params) {
|
|
665
|
+
if (isTspConfigFile(params.textDocument))
|
|
666
|
+
return { data: [] };
|
|
618
667
|
const builder = new SemanticTokensBuilder();
|
|
619
668
|
const tokens = await getSemanticTokensForDocument(params);
|
|
620
669
|
const file = await compilerHost.readFile(await fileService.getPath(params.textDocument));
|
|
@@ -632,6 +681,8 @@ export function createServer(host) {
|
|
|
632
681
|
return builder.build();
|
|
633
682
|
}
|
|
634
683
|
async function getCodeActions(params) {
|
|
684
|
+
if (isTspConfigFile(params.textDocument))
|
|
685
|
+
return [];
|
|
635
686
|
const actions = [];
|
|
636
687
|
for (const vsDiag of params.context.diagnostics) {
|
|
637
688
|
const tspDiag = currentDiagnosticIndex.get(vsDiag.data?.id);
|