@glint/tsserver-plugin 0.2.1 → 1.0.1-unstable.845d5fa

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/README.md CHANGED
@@ -1,6 +1,6 @@
1
- # `@glint/tsserver-plugin`
1
+ # @glint/typescript-plugin
2
2
 
3
- This package contains a TypeScript [language service plugin] to present [glint] diagnostics for Glimmer templates, as well as enabling quick info, symbol renaming, jump-to-definition and limited autocomplete in template contexts.
3
+ The TypeScript server plugin that performs type-checking.
4
+
5
+ Old Glint used the LanguageServer to perform type-checking; Glint 2 uses a TypeScript server plugin to follow suit with Volar.
4
6
 
5
- [language service plugin]: https://github.com/microsoft/TypeScript/wiki/Writing-a-Language-Service-Plugin
6
- [glint]: https://github.com/typed-ember/glint
@@ -0,0 +1,34 @@
1
+ declare const plugin: any;
2
+ export = plugin;
3
+ /**
4
+ * Return semantic tokens for semantic highlighting:
5
+ * https://code.visualstudio.com/api/language-extensions/semantic-highlight-guide
6
+ function getEncodedSemanticClassifications<T>(
7
+ ts: typeof import('typescript'),
8
+ language: any, // Language<T>,
9
+ languageService: ts.LanguageService,
10
+ asScriptId: (fileName: string) => T,
11
+ getEncodedSemanticClassifications: ts.LanguageService['getEncodedSemanticClassifications'],
12
+ ): ts.LanguageService['getEncodedSemanticClassifications'] {
13
+ return (filePath, span, format) => {
14
+ const fileName = filePath.replace(windowsPathReg, '/');
15
+ const result = getEncodedSemanticClassifications(fileName, span, format);
16
+ const sourceScript = language.scripts.get(asScriptId(fileName));
17
+ const root = sourceScript?.generated?.root;
18
+ if (root instanceof VirtualGtsCode) {
19
+ // This would remove all semantic highlighting from .gts files, including the TS parts
20
+ // outside of the `<template>` tags, which is probably undesirable.
21
+ // result.spans = [];
22
+
23
+ // We can push span to the end of the array to override previous entries.
24
+ // result.spans.push(
25
+ // 0,
26
+ // 100,
27
+ // 256, // class
28
+ // );
29
+ }
30
+ return result;
31
+ };
32
+ }
33
+ */
34
+ //# sourceMappingURL=typescript-server-plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typescript-server-plugin.d.ts","sourceRoot":"","sources":["../src/typescript-server-plugin.ts"],"names":[],"mappings":"AA+BA,QAAA,MAAM,MAAM,KA4IX,CAAC;AAEF,SAAS,MAAM,CAAC;AA8HhB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG"}
@@ -0,0 +1,251 @@
1
+ const { createJiti } = require('jiti');
2
+ const jiti = createJiti(__filename);
3
+ const { createLanguageServicePlugin, } = require('@volar/typescript/lib/quickstart/createLanguageServicePlugin.js');
4
+ /**
5
+ * We use the jiti (https://github.com/unjs/jiti) runtime to make it possible to
6
+ * synchronously load the ESM glint libraries from the current CommonJS context.
7
+ * It is a requirement that TypeScript plugins are written in CommonJS, which poses issues
8
+ * with having Glint be authored in ESM due to the requirement that typically `await import`
9
+ * is required to load ESM modules from CJS. But with jiti we can synchronously load the ESM
10
+ * modules from CJS which lets us avoid a ton of hacks and complexity we (or Volar)
11
+ * would otherwise have to write to bridge the sync/async APIs.
12
+ */
13
+ let emberTscPath = '@glint/ember-tsc';
14
+ try {
15
+ // @ts-expect-error esbuild define
16
+ emberTscPath = EMBER_TSC_PATH;
17
+ }
18
+ catch {
19
+ // Ignore; must not be running in esbuild context
20
+ }
21
+ const emberTsc = jiti(emberTscPath);
22
+ const { VirtualGtsCode, augmentDiagnostics } = emberTsc;
23
+ const plugin = createLanguageServicePlugin((ts, info) => {
24
+ const { findConfig, createEmberLanguagePlugin } = emberTsc;
25
+ const cwd = info.languageServiceHost.getCurrentDirectory();
26
+ const glintConfig = findConfig(cwd);
27
+ // Uncomment as a smoke test to see if the plugin is running
28
+ const enableLogging = false;
29
+ if (glintConfig) {
30
+ if (enableLogging) {
31
+ info.project.projectService.logger.info('Glint TS Plugin is running!');
32
+ }
33
+ const gtsLanguagePlugin = createEmberLanguagePlugin(glintConfig, {
34
+ clientId: 'tsserver-plugin',
35
+ });
36
+ return {
37
+ languagePlugins: [gtsLanguagePlugin],
38
+ setup: (language) => {
39
+ // project2Service.set(info.project, [
40
+ // language,
41
+ // info.languageServiceHost,
42
+ // info.languageService,
43
+ // ]);
44
+ info.languageService = proxyLanguageServiceForGlint(ts, language, info.languageService, (fileName) => fileName);
45
+ const resolveModuleNameLiterals = info.languageServiceHost.resolveModuleNameLiterals?.bind(info.languageServiceHost);
46
+ if (resolveModuleNameLiterals) {
47
+ // TS isn't aware of our custom .gts/.gjs extensions by default which causes
48
+ // issues with resolving imports that omit extensions. We hackishly "teach"
49
+ // TS about these extensions by overriding `resolveModuleNameLiterals` to
50
+ // inject non-existent imports that cause TS to consider the extensions when
51
+ // resolving.
52
+ //
53
+ // Origin of this hack:
54
+ // https://github.com/typed-ember/glint/issues/806#issuecomment-2758616327
55
+ info.languageServiceHost.resolveModuleNameLiterals = (moduleLiterals, containingFile, redirectedReference, options, ...rest) => {
56
+ let fakeImportNodes = [];
57
+ if (moduleLiterals.length > 0) {
58
+ fakeImportNodes.push({
59
+ ...moduleLiterals[0],
60
+ text: './__NONEXISTENT_GLINT_HACK__.gts',
61
+ });
62
+ fakeImportNodes.push({
63
+ ...moduleLiterals[0],
64
+ text: './__NONEXISTENT_GLINT_HACK__.gjs',
65
+ });
66
+ }
67
+ const result = resolveModuleNameLiterals([...fakeImportNodes, ...moduleLiterals], containingFile, redirectedReference, options, ...rest);
68
+ return result.slice(fakeImportNodes.length);
69
+ };
70
+ }
71
+ // Add Glint-specific protocol handlers for tsserver communication
72
+ addGlintCommands();
73
+ // #3963
74
+ // const timer = setInterval(() => {
75
+ // if (info.project['program']) {
76
+ // clearInterval(timer);
77
+ // info.project['program'].__glint__ = { language };
78
+ // }
79
+ // }, 50);
80
+ },
81
+ };
82
+ }
83
+ else {
84
+ if (enableLogging) {
85
+ info.project.projectService.logger.info('Glint TS Plugin is NOT running!');
86
+ }
87
+ return {
88
+ languagePlugins: [],
89
+ };
90
+ }
91
+ // https://github.com/JetBrains/intellij-plugins/blob/6435723ad88fa296b41144162ebe3b8513f4949b/Angular/src-js/angular-service/src/index.ts#L69
92
+ function addGlintCommands() {
93
+ const projectService = info.project.projectService;
94
+ projectService.logger.info('Glint: called handler processing ' + info.project.projectKind);
95
+ const session = info.session;
96
+ if (session == undefined) {
97
+ projectService.logger.info('Glint: there is no session in info.');
98
+ return;
99
+ }
100
+ if (session.addProtocolHandler == undefined) {
101
+ // addProtocolHandler was introduced in TS 4.4 or 4.5 in 2021, see https://github.com/microsoft/TypeScript/issues/43893
102
+ projectService.logger.info('Glint: there is no addProtocolHandler method.');
103
+ return;
104
+ }
105
+ if (session.handlers.has('_glint:projectInfo')) {
106
+ return;
107
+ }
108
+ // Map _glint: prefixed commands to their corresponding TypeScript server commands
109
+ session.addProtocolHandler('_glint:projectInfo', ({ arguments: args }) => {
110
+ return session.handlers.get('projectInfo')?.({ arguments: args });
111
+ });
112
+ session.addProtocolHandler('_glint:documentHighlights-full', ({ arguments: args }) => {
113
+ return session.handlers.get('documentHighlights-full')?.({ arguments: args });
114
+ });
115
+ session.addProtocolHandler('_glint:encodedSemanticClassifications-full', ({ arguments: args }) => {
116
+ return session.handlers.get('encodedSemanticClassifications-full')?.({
117
+ arguments: args,
118
+ });
119
+ });
120
+ session.addProtocolHandler('_glint:quickinfo', ({ arguments: args }) => {
121
+ return session.handlers.get('quickinfo')?.({ arguments: args });
122
+ });
123
+ projectService.logger.info('Glint specific commands are successfully added.');
124
+ }
125
+ });
126
+ module.exports = plugin;
127
+ function proxyLanguageServiceForGlint(ts, language, // Language<T>,
128
+ languageService, asScriptId) {
129
+ const proxyCache = new Map();
130
+ const getProxyMethod = (target, p) => {
131
+ switch (p) {
132
+ case 'getCompletionsAtPosition':
133
+ return getCompletionsAtPosition(ts, language, languageService, asScriptId, target[p]);
134
+ // case 'getCompletionEntryDetails': return getCompletionEntryDetails(language, asScriptId, target[p]);
135
+ // case 'getCodeFixesAtPosition': return getCodeFixesAtPosition(target[p]);
136
+ // case 'getDefinitionAndBoundSpan': return getDefinitionAndBoundSpan(ts, language, languageService, glintOptions, asScriptId, target[p]);
137
+ // case 'getQuickInfoAtPosition': return getQuickInfoAtPosition(ts, target, target[p]);
138
+ // TS plugin only
139
+ // Left as an example in case we want to augment semantic classification in .gts files.
140
+ // e.g. Vue does this to semantically classify Component names as `class` tokens.
141
+ // case 'getEncodedSemanticClassifications':
142
+ // return getEncodedSemanticClassifications(ts, language, target, asScriptId, target[p]);
143
+ case 'getSemanticDiagnostics':
144
+ return getSemanticDiagnostics(ts, language, languageService, asScriptId, target[p]);
145
+ }
146
+ };
147
+ return new Proxy(languageService, {
148
+ get(target, p, receiver) {
149
+ if (getProxyMethod) {
150
+ if (!proxyCache.has(p)) {
151
+ proxyCache.set(p, getProxyMethod(target, p));
152
+ }
153
+ const proxyMethod = proxyCache.get(p);
154
+ if (proxyMethod) {
155
+ return proxyMethod;
156
+ }
157
+ }
158
+ return Reflect.get(target, p, receiver);
159
+ },
160
+ set(target, p, value, receiver) {
161
+ return Reflect.set(target, p, value, receiver);
162
+ },
163
+ });
164
+ }
165
+ function getCompletionsAtPosition(ts, language, // Language<T>,
166
+ languageService, asScriptId, getCompletionsAtPosition) {
167
+ return (fileName, position, options, formattingSettings) => {
168
+ try {
169
+ const sourceScript = language.scripts.get(asScriptId(fileName));
170
+ const root = sourceScript?.generated?.root;
171
+ const transformedModule = root?.transformedModule;
172
+ const completions = getCompletionsAtPosition(fileName, position, options, formattingSettings);
173
+ const transformedRange = transformedModule?.getTransformedRange(transformedModule.originalFileName, position, position);
174
+ if (completions && transformedRange) {
175
+ // for attribute names on elements, we do not want the wrapping `"`.
176
+ if (transformedRange.mapping?.parent?.sourceNode.type === 'ElementNode') {
177
+ completions.entries = completions.entries.map((e) => ({
178
+ ...e,
179
+ name: e.name.replace(/^"/, '').replace(/"$/, ''),
180
+ sortText: e.sortText.replace(/\\"/g, ''),
181
+ }));
182
+ }
183
+ }
184
+ console.log(completions);
185
+ return completions;
186
+ }
187
+ catch (e) {
188
+ console.log('error', e?.message);
189
+ console.log(e);
190
+ throw e;
191
+ }
192
+ };
193
+ }
194
+ function getSemanticDiagnostics(ts, language, // Language<T>,
195
+ languageService, asScriptId, getSemanticDiagnostics) {
196
+ return (fileName) => {
197
+ const tsDiagnostics = getSemanticDiagnostics(fileName);
198
+ const program = languageService.getProgram();
199
+ const sourceScript = language.scripts.get(asScriptId(fileName));
200
+ if (!sourceScript?.generated) {
201
+ return tsDiagnostics;
202
+ }
203
+ const root = sourceScript.generated.root;
204
+ if (!(root instanceof VirtualGtsCode)) {
205
+ return tsDiagnostics;
206
+ }
207
+ const transformedModule = root.transformedModule;
208
+ if (!transformedModule) {
209
+ return tsDiagnostics;
210
+ }
211
+ const sourceFile = program.getSourceFile(fileName);
212
+ if (!sourceFile) {
213
+ return tsDiagnostics;
214
+ }
215
+ const augmentedTsDiagnostics = augmentDiagnostics(transformedModule, tsDiagnostics);
216
+ return augmentedTsDiagnostics;
217
+ };
218
+ }
219
+ const windowsPathReg = /\\/g;
220
+ /**
221
+ * Return semantic tokens for semantic highlighting:
222
+ * https://code.visualstudio.com/api/language-extensions/semantic-highlight-guide
223
+ function getEncodedSemanticClassifications<T>(
224
+ ts: typeof import('typescript'),
225
+ language: any, // Language<T>,
226
+ languageService: ts.LanguageService,
227
+ asScriptId: (fileName: string) => T,
228
+ getEncodedSemanticClassifications: ts.LanguageService['getEncodedSemanticClassifications'],
229
+ ): ts.LanguageService['getEncodedSemanticClassifications'] {
230
+ return (filePath, span, format) => {
231
+ const fileName = filePath.replace(windowsPathReg, '/');
232
+ const result = getEncodedSemanticClassifications(fileName, span, format);
233
+ const sourceScript = language.scripts.get(asScriptId(fileName));
234
+ const root = sourceScript?.generated?.root;
235
+ if (root instanceof VirtualGtsCode) {
236
+ // This would remove all semantic highlighting from .gts files, including the TS parts
237
+ // outside of the `<template>` tags, which is probably undesirable.
238
+ // result.spans = [];
239
+
240
+ // We can push span to the end of the array to override previous entries.
241
+ // result.spans.push(
242
+ // 0,
243
+ // 100,
244
+ // 256, // class
245
+ // );
246
+ }
247
+ return result;
248
+ };
249
+ }
250
+ */
251
+ //# sourceMappingURL=typescript-server-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typescript-server-plugin.js","sourceRoot":"","sources":["../src/typescript-server-plugin.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,32 +1,45 @@
1
1
  {
2
2
  "name": "@glint/tsserver-plugin",
3
- "version": "0.2.1",
3
+ "version": "1.0.1-unstable.845d5fa",
4
+ "type": "commonjs",
4
5
  "repository": "typed-ember/glint",
5
- "description": "A TypeScript language service plugin to provide typechecking and editor support for working with Glimmer templates",
6
+ "description": "TypeScript Server Plugin for Glint",
6
7
  "license": "MIT",
7
- "author": "Dan Freeman (https://github.com/dfreeman)",
8
- "main": "lib/index.js",
9
- "types": "lib/index.d.ts",
8
+ "main": "lib/typescript-server-plugin.js",
9
+ "authors": [
10
+ "Alex Matchneer (https://github.com/machty)"
11
+ ],
10
12
  "files": [
11
13
  "README.md",
12
14
  "lib"
13
15
  ],
14
16
  "scripts": {
15
- "lint": "eslint . --ext ts --max-warnings 0 && prettier --check src",
16
- "test": "jest",
17
+ "test": "echo 'no standalone tests within this project'",
18
+ "test:typecheck": "echo 'no standalone typecheck within this project'",
19
+ "test:tsc": "echo 'no standalone typecheck within this project'",
17
20
  "build": "tsc --build",
18
- "prepack": "yarn build"
21
+ "prepack": "pnpm build"
19
22
  },
20
23
  "dependencies": {
21
- "@glint/config": "^0.2.1",
22
- "@glint/transform": "^0.2.1"
24
+ "@glint/ember-tsc": "1.0.1-unstable.845d5fa",
25
+ "@volar/language-core": "2.4.23",
26
+ "@volar/typescript": "2.4.23",
27
+ "jiti": "~2.4.2",
28
+ "typescript": ">=5.6.0"
23
29
  },
24
- "devDependencies": {
25
- "@types/jest": "^25.2.1",
26
- "jest": "^25.5.4",
27
- "ts-jest": "^25.4.0"
30
+ "release-plan": {
31
+ "semverIncrementAs": {
32
+ "major": "prerelease",
33
+ "minor": "prerelease",
34
+ "patch": "prerelease"
35
+ },
36
+ "semverIncrementTag": "alpha",
37
+ "publishTag": "alpha"
28
38
  },
29
39
  "publishConfig": {
30
40
  "access": "public"
41
+ },
42
+ "devDependencies": {
43
+ "@types/node": "^22.13.11"
31
44
  }
32
45
  }
package/lib/index.d.ts DELETED
@@ -1,3 +0,0 @@
1
- import type ts from 'typescript/lib/tsserverlibrary';
2
- declare const init: ts.server.PluginModuleFactory;
3
- export = init;
package/lib/index.js DELETED
@@ -1,57 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- const path_1 = __importDefault(require("path"));
6
- const config_1 = require("@glint/config");
7
- const virtual_module_manager_1 = __importDefault(require("./virtual-module-manager"));
8
- const lib_1 = require("./patch/lib");
9
- const language_service_host_1 = require("./patch/language-service-host");
10
- const logging_1 = require("./util/logging");
11
- const language_service_1 = __importDefault(require("./language-service"));
12
- const init = ({ typescript: ts }) => {
13
- const modules = new virtual_module_manager_1.default(ts);
14
- lib_1.patchLib(ts, modules);
15
- return {
16
- create(info) {
17
- let logger = logging_1.loggerFor(info);
18
- let config = config_1.loadConfig(path_1.default.dirname(info.project.projectName));
19
- logger.log('\nStarting @glint/tsserver-plugin at', new Date().toString());
20
- language_service_host_1.patchLanguageServiceHost(config, info);
21
- modules.addProject(config, info.project);
22
- let glintService = new language_service_1.default(ts, modules, info);
23
- let fullService = makeProxy(info.languageService, glintService);
24
- if (info.config.logLanguageServiceMethodCalls) {
25
- installMethodLogging(logger, fullService);
26
- }
27
- return fullService;
28
- },
29
- };
30
- };
31
- function makeProxy(base, glint) {
32
- return new Proxy(base, {
33
- get(_, key) {
34
- if (key in glint) {
35
- return glint[key];
36
- }
37
- return base[key];
38
- },
39
- set(_, key, value) {
40
- glint[key] = value;
41
- return true;
42
- },
43
- });
44
- }
45
- function installMethodLogging(logger, service) {
46
- for (let _key in service) {
47
- let key = _key;
48
- let f = service[key];
49
- if (typeof f === 'function') {
50
- service[key] = ((...params) => {
51
- logger.log(key, params[0]);
52
- return f.apply(service, params);
53
- });
54
- }
55
- }
56
- }
57
- module.exports = init;
@@ -1,32 +0,0 @@
1
- import type ts from 'typescript/lib/tsserverlibrary';
2
- import VirtualModuleManager from './virtual-module-manager';
3
- export default class GlintLanguageService implements Partial<ts.LanguageService> {
4
- private readonly ts;
5
- private readonly modules;
6
- private readonly ls;
7
- private readonly logger;
8
- constructor(ts: typeof import('typescript/lib/tsserverlibrary'), modules: VirtualModuleManager, info: ts.server.PluginCreateInfo);
9
- private getTransformInfoForOriginalPath;
10
- private getTransformInfoForTransformedPath;
11
- private getTransformInfo;
12
- getSyntacticDiagnostics(fileName: string): ts.DiagnosticWithLocation[];
13
- getSemanticDiagnostics(fileName: string): ts.Diagnostic[];
14
- getSuggestionDiagnostics(fileName: string): ts.DiagnosticWithLocation[];
15
- getEncodedSyntacticClassifications(fileName: string, span: ts.TextSpan): ts.Classifications;
16
- getEncodedSemanticClassifications(fileName: string, span: ts.TextSpan): ts.Classifications;
17
- getCompletionsAtPosition(fileName: string, offset: number, options: ts.GetCompletionsAtPositionOptions | undefined): ts.WithMetadata<ts.CompletionInfo> | undefined;
18
- getCompletionEntryDetails(fileName: string, offset: number, name: string, formatOptions: ts.FormatCodeOptions | ts.FormatCodeSettings | undefined, source: string | undefined, preferences: ts.UserPreferences | undefined): ts.CompletionEntryDetails | undefined;
19
- getCompletionEntrySymbol(fileName: string, offset: number, name: string, source: string | undefined): ts.Symbol | undefined;
20
- getQuickInfoAtPosition(fileName: string, offset: number): ts.QuickInfo | undefined;
21
- getRenameInfo(fileName: string, offset: number, options?: ts.RenameInfoOptions | undefined): ts.RenameInfo;
22
- findRenameLocations(fileName: string, offset: number, findInStrings: boolean, findInComments: boolean, providePrefixAndSuffixTextForRename?: boolean | undefined): readonly ts.RenameLocation[] | undefined;
23
- getEditsForFileRename(oldFilePath: string, newFilePath: string, formatOptions: ts.FormatCodeSettings, preferences: ts.UserPreferences | undefined): readonly ts.FileTextChanges[];
24
- getDefinitionAtPosition(fileName: string, offset: number): readonly ts.DefinitionInfo[] | undefined;
25
- getDefinitionAndBoundSpan(fileName: string, offset: number): ts.DefinitionInfoAndBoundSpan | undefined;
26
- getReferencesAtPosition(fileName: string, offset: number): ts.ReferenceEntry[] | undefined;
27
- findReferences(fileName: string, offset: number): ts.ReferencedSymbol[] | undefined;
28
- private rewriteDefinition;
29
- private rewriteReferenceEntries;
30
- private rewriteDocumentSpan;
31
- private rewriteCodeAction;
32
- }