@typespec/compiler 0.62.0-dev.7 → 0.62.0-dev.9

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.
Files changed (37) hide show
  1. package/dist/generated-defs/TypeSpec.d.ts +1 -1
  2. package/dist/manifest.js +2 -2
  3. package/dist/src/config/config-schema.d.ts +2 -1
  4. package/dist/src/config/config-schema.d.ts.map +1 -1
  5. package/dist/src/config/config-schema.js +2 -1
  6. package/dist/src/config/config-schema.js.map +1 -1
  7. package/dist/src/server/emitter-provider.d.ts +22 -0
  8. package/dist/src/server/emitter-provider.d.ts.map +1 -0
  9. package/dist/src/server/emitter-provider.js +79 -0
  10. package/dist/src/server/emitter-provider.js.map +1 -0
  11. package/dist/src/server/npm-package-provider.d.ts +51 -0
  12. package/dist/src/server/npm-package-provider.d.ts.map +1 -0
  13. package/dist/src/server/npm-package-provider.js +201 -0
  14. package/dist/src/server/npm-package-provider.js.map +1 -0
  15. package/dist/src/server/serverlib.d.ts.map +1 -1
  16. package/dist/src/server/serverlib.js +52 -1
  17. package/dist/src/server/serverlib.js.map +1 -1
  18. package/dist/src/server/tspconfig/completion.d.ts +11 -0
  19. package/dist/src/server/tspconfig/completion.d.ts.map +1 -0
  20. package/dist/src/server/tspconfig/completion.js +176 -0
  21. package/dist/src/server/tspconfig/completion.js.map +1 -0
  22. package/dist/src/server/yaml-resolver.d.ts +24 -0
  23. package/dist/src/server/yaml-resolver.d.ts.map +1 -0
  24. package/dist/src/server/yaml-resolver.js +253 -0
  25. package/dist/src/server/yaml-resolver.js.map +1 -0
  26. package/dist/src/testing/test-host.d.ts.map +1 -1
  27. package/dist/src/testing/test-host.js +22 -1
  28. package/dist/src/testing/test-host.js.map +1 -1
  29. package/dist/src/testing/types.d.ts +1 -0
  30. package/dist/src/testing/types.d.ts.map +1 -1
  31. package/dist/src/testing/types.js.map +1 -1
  32. package/dist/src/utils/misc.d.ts +5 -0
  33. package/dist/src/utils/misc.d.ts.map +1 -1
  34. package/dist/src/utils/misc.js +32 -0
  35. package/dist/src/utils/misc.js.map +1 -1
  36. package/lib/std/decorators.tsp +1 -1
  37. package/package.json +1 -1
@@ -443,7 +443,7 @@ export type ExampleDecorator = (context: DecoratorContext, target: Model | Enum
443
443
  * @param options Optional metadata for the example.
444
444
  * @example
445
445
  * ```tsp
446
- * @example(#{parameters: #{name: "Fluffy", age: 2}, returnType: #{name: "Fluffy", age: 2, id: "abc"})
446
+ * @opExample(#{parameters: #{name: "Fluffy", age: 2}, returnType: #{name: "Fluffy", age: 2, id: "abc"})
447
447
  * op createPet(pet: Pet): Pet;
448
448
  * ```
449
449
  */
package/dist/manifest.js CHANGED
@@ -1,4 +1,4 @@
1
1
  export default {
2
- "version": "0.62.0-dev.7",
3
- "commit": "90e87534f95a5017a7d8ab294e03e7ee44cfd35c"
2
+ "version": "0.62.0-dev.9",
3
+ "commit": "7710c4d7ebf2ffede2fdb9e02fdf1f915df6ad20"
4
4
  };
@@ -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,EAAkB,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAW/D,eAAO,MAAM,wBAAwB,EAAE,cAAc,CAAC,iBAAiB,CAqGtE,CAAC"}
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":"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"}
1
+ {"version":3,"file":"config-schema.js","sourceRoot":"","sources":["../../../src/config/config-schema.ts"],"names":[],"mappings":"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"}
@@ -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":"AAyFA,OAAO,EAGL,MAAM,EACN,UAAU,EAIX,MAAM,YAAY,CAAC;AAEpB,wBAAgB,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAs4BrD"}
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);