@css-modules-kit/ts-plugin 0.2.0 → 0.4.0
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/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +44 -0
- package/dist/index.js.map +1 -1
- package/dist/language-plugin.d.ts.map +1 -1
- package/dist/language-plugin.js +1 -9
- package/dist/language-plugin.js.map +1 -1
- package/dist/language-service/feature/code-fix.d.ts +1 -1
- package/dist/language-service/feature/code-fix.d.ts.map +1 -1
- package/dist/language-service/feature/code-fix.js +26 -20
- package/dist/language-service/feature/code-fix.js.map +1 -1
- package/dist/language-service/feature/definition-and-bound-span.d.ts +4 -0
- package/dist/language-service/feature/definition-and-bound-span.d.ts.map +1 -0
- package/dist/language-service/feature/definition-and-bound-span.js +28 -0
- package/dist/language-service/feature/definition-and-bound-span.js.map +1 -0
- package/dist/language-service/proxy.d.ts.map +1 -1
- package/dist/language-service/proxy.js +2 -0
- package/dist/language-service/proxy.js.map +1 -1
- package/dist/protocol-handler/documentLink.d.ts +6 -0
- package/dist/protocol-handler/documentLink.d.ts.map +1 -0
- package/dist/protocol-handler/documentLink.js +32 -0
- package/dist/protocol-handler/documentLink.js.map +1 -0
- package/dist/protocol-handler/rename.d.ts +4 -0
- package/dist/protocol-handler/rename.d.ts.map +1 -0
- package/dist/protocol-handler/rename.js +21 -0
- package/dist/protocol-handler/rename.js.map +1 -0
- package/dist/protocol-handler/renameInfo.d.ts +4 -0
- package/dist/protocol-handler/renameInfo.d.ts.map +1 -0
- package/dist/protocol-handler/renameInfo.js +21 -0
- package/dist/protocol-handler/renameInfo.js.map +1 -0
- package/dist/type.d.ts +62 -0
- package/dist/type.d.ts.map +1 -0
- package/dist/type.js +3 -0
- package/dist/type.js.map +1 -0
- package/dist/util.d.ts +1 -0
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +7 -0
- package/dist/util.js.map +1 -1
- package/package.json +12 -2
- package/src/index.ts +57 -0
- package/src/language-plugin.ts +5 -9
- package/src/language-service/feature/code-fix.ts +25 -20
- package/src/language-service/feature/definition-and-bound-span.ts +28 -0
- package/src/language-service/proxy.ts +2 -0
- package/src/protocol-handler/documentLink.ts +38 -0
- package/src/protocol-handler/rename.ts +15 -0
- package/src/protocol-handler/renameInfo.ts +15 -0
- package/src/type.ts +61 -0
- package/src/util.ts +9 -0
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AASjC,QAAA,MAAM,MAAM,+BA+FV,CAAC;AAEH,SAAS,MAAM,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -4,6 +4,10 @@ const core_2 = require("@css-modules-kit/core");
|
|
|
4
4
|
const createLanguageServicePlugin_js_1 = require("@volar/typescript/lib/quickstart/createLanguageServicePlugin.js");
|
|
5
5
|
const language_plugin_js_1 = require("./language-plugin.js");
|
|
6
6
|
const proxy_js_1 = require("./language-service/proxy.js");
|
|
7
|
+
const documentLink_js_1 = require("./protocol-handler/documentLink.js");
|
|
8
|
+
const rename_js_1 = require("./protocol-handler/rename.js");
|
|
9
|
+
const renameInfo_js_1 = require("./protocol-handler/renameInfo.js");
|
|
10
|
+
const projectToLanguage = new WeakMap();
|
|
7
11
|
const plugin = (0, createLanguageServicePlugin_js_1.createLanguageServicePlugin)((ts, info) => {
|
|
8
12
|
if (info.project.projectKind !== ts.server.ProjectKind.Configured) {
|
|
9
13
|
info.project.projectService.logger.info(`[@css-modules-kit/ts-plugin] info: Project is not configured`);
|
|
@@ -30,13 +34,53 @@ const plugin = (0, createLanguageServicePlugin_js_1.createLanguageServicePlugin)
|
|
|
30
34
|
return { languagePlugins: [] };
|
|
31
35
|
}
|
|
32
36
|
}
|
|
37
|
+
// tsserver should report a “Cannot find module” error for import statements in CSS Modules that
|
|
38
|
+
// do not exist. However, if `dtsOutDir` is included in `rootDirs` and old .d.ts files remain
|
|
39
|
+
// in `dtsOutDir`, the error will not be reported. Therefore, remove `dtsOutDir` from `rootDirs`.
|
|
40
|
+
const getCompilationSettings = info.languageServiceHost.getCompilationSettings.bind(info.languageServiceHost);
|
|
41
|
+
info.languageServiceHost.getCompilationSettings = () => {
|
|
42
|
+
const settings = { ...getCompilationSettings() };
|
|
43
|
+
if (settings.rootDirs) {
|
|
44
|
+
// TODO: If the `dtsOutDir` is not in `rootDirs`, warn the user.
|
|
45
|
+
settings.rootDirs = settings.rootDirs.filter((dir) => dir !== config.dtsOutDir);
|
|
46
|
+
}
|
|
47
|
+
return settings;
|
|
48
|
+
};
|
|
33
49
|
const moduleResolutionCache = info.languageServiceHost.getModuleResolutionCache?.();
|
|
34
50
|
const resolver = (0, core_1.createResolver)(config.compilerOptions, moduleResolutionCache);
|
|
35
51
|
const matchesPattern = (0, core_1.createMatchesPattern)(config);
|
|
36
52
|
return {
|
|
37
53
|
languagePlugins: [(0, language_plugin_js_1.createCSSLanguagePlugin)(resolver, matchesPattern, config)],
|
|
38
54
|
setup: (language) => {
|
|
55
|
+
projectToLanguage.set(info.project, language);
|
|
39
56
|
info.languageService = (0, proxy_js_1.proxyLanguageService)(language, info.languageService, info.project, resolver, matchesPattern, config);
|
|
57
|
+
if (info.session) {
|
|
58
|
+
// Register protocol handlers for "Request Forwarding to tsserver".
|
|
59
|
+
// See https://github.com/mizdra/css-modules-kit/pull/207 for more details.
|
|
60
|
+
// `info.session.addProtocolHandler` cannot register multiple handlers with the same command name.
|
|
61
|
+
// Attempting to do so will result in an error.
|
|
62
|
+
//
|
|
63
|
+
// By the way, tsserver creates one ConfiguredProject for each tsconfig.json file. Then, tsserver
|
|
64
|
+
// initializes each plugin for each ConfiguredProject. This means that if there are multiple
|
|
65
|
+
// tsconfig.json files, the handler will be registered multiple times.
|
|
66
|
+
//
|
|
67
|
+
// Therefore, we will do the following:
|
|
68
|
+
// - Implement the handler to handle files from different projects
|
|
69
|
+
// - Skip registration if the handler is already registered
|
|
70
|
+
try {
|
|
71
|
+
info.session.addProtocolHandler('_css-modules-kit:rename', (0, rename_js_1.createRenameHandler)(info.project.projectService));
|
|
72
|
+
info.session.addProtocolHandler('_css-modules-kit:renameInfo', (0, renameInfo_js_1.createRenameInfoHandler)(info.project.projectService));
|
|
73
|
+
info.session.addProtocolHandler('_css-modules-kit:documentLink', (0, documentLink_js_1.createDocumentLinkHandler)(info.project.projectService, projectToLanguage, resolver));
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
info.project.projectService.logger.info(`[@css-modules-kit/ts-plugin] Skipping protocol handler registration because the handlers are already registered.`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
// When a plugin is used via tsserver from the editor, the session is always available.
|
|
81
|
+
// However, when a plugin is used via the TypeScript Compiler API, the session may not be available.
|
|
82
|
+
info.project.projectService.logger.info('[@css-modules-kit/ts-plugin] info: Skipping protocol handler registration because session is not available.');
|
|
83
|
+
}
|
|
40
84
|
},
|
|
41
85
|
};
|
|
42
86
|
});
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,gDAA6F;AAC7F,gDAAkE;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"language-plugin.d.ts","sourceRoot":"","sources":["../src/language-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,sBAAsB,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEpH,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAItF,eAAO,MAAM,WAAW,QAAQ,CAAC;AAEjC,eAAO,MAAM,YAAY,eAAiC,CAAC;AAE3D,UAAU,oBAAqB,SAAQ,WAAW;IAChD,CAAC,YAAY,CAAC,EAAE;QACd,SAAS,EAAE,SAAS,CAAC;QACrB,oBAAoB,EAAE,sBAAsB,EAAE,CAAC;KAChD,CAAC;CACH;AAED,MAAM,WAAW,eAAgB,SAAQ,YAAY,CAAC,MAAM,CAAC;IAC3D,SAAS,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,GAAG;QAC7C,IAAI,EAAE,oBAAoB,CAAC;KAC5B,CAAC;CACH;AAED,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,QAAQ,EAClB,cAAc,EAAE,cAAc,EAC9B,MAAM,EAAE,SAAS,GAChB,cAAc,CAAC,MAAM,EAAE,WAAW,CAAC,
|
|
1
|
+
{"version":3,"file":"language-plugin.d.ts","sourceRoot":"","sources":["../src/language-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,sBAAsB,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEpH,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAItF,eAAO,MAAM,WAAW,QAAQ,CAAC;AAEjC,eAAO,MAAM,YAAY,eAAiC,CAAC;AAE3D,UAAU,oBAAqB,SAAQ,WAAW;IAChD,CAAC,YAAY,CAAC,EAAE;QACd,SAAS,EAAE,SAAS,CAAC;QACrB,oBAAoB,EAAE,sBAAsB,EAAE,CAAC;KAChD,CAAC;CACH;AAED,MAAM,WAAW,eAAgB,SAAQ,YAAY,CAAC,MAAM,CAAC;IAC3D,SAAS,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,GAAG;QAC7C,IAAI,EAAE,oBAAoB,CAAC;KAC5B,CAAC;CACH;AAED,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,QAAQ,EAClB,cAAc,EAAE,cAAc,EAC9B,MAAM,EAAE,SAAS,GAChB,cAAc,CAAC,MAAM,EAAE,WAAW,CAAC,CAqErC;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC,GAAG,SAAS,GAAG,MAAM,IAAI,eAAe,CAIrG"}
|
package/dist/language-plugin.js
CHANGED
|
@@ -40,15 +40,7 @@ function createCSSLanguagePlugin(resolver, matchesPattern, config) {
|
|
|
40
40
|
safe: true,
|
|
41
41
|
});
|
|
42
42
|
// eslint-disable-next-line prefer-const
|
|
43
|
-
let { text, mapping, linkedCodeMapping } = (0, core_1.createDts)(cssModule, {
|
|
44
|
-
resolver,
|
|
45
|
-
matchesPattern,
|
|
46
|
-
namedExports: config.namedExports,
|
|
47
|
-
});
|
|
48
|
-
if (config.namedExports && !config.prioritizeNamedImports) {
|
|
49
|
-
// Export `styles` to appear in code completion suggestions
|
|
50
|
-
text += 'declare const styles: {};\nexport default styles;\n';
|
|
51
|
-
}
|
|
43
|
+
let { text, mapping, linkedCodeMapping } = (0, core_1.createDts)(cssModule, { resolver, matchesPattern }, { ...config, forTsPlugin: true });
|
|
52
44
|
return {
|
|
53
45
|
id: 'main',
|
|
54
46
|
languageId: exports.LANGUAGE_ID,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"language-plugin.js","sourceRoot":"","sources":["../src/language-plugin.ts"],"names":[],"mappings":";;;;;;AAuBA,
|
|
1
|
+
{"version":3,"file":"language-plugin.js","sourceRoot":"","sources":["../src/language-plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,6 @@ import type { CMKConfig, Resolver } from '@css-modules-kit/core';
|
|
|
2
2
|
import type { Language } from '@volar/language-core';
|
|
3
3
|
import ts from 'typescript';
|
|
4
4
|
export declare const CANNOT_FIND_NAME_ERROR_CODE = 2304;
|
|
5
|
-
export declare const
|
|
5
|
+
export declare const PROPERTY_DOES_NOT_EXIST_ERROR_CODES: [number, number];
|
|
6
6
|
export declare function getCodeFixesAtPosition(language: Language<string>, languageService: ts.LanguageService, project: ts.server.Project, resolver: Resolver, config: CMKConfig): ts.LanguageService['getCodeFixesAtPosition'];
|
|
7
7
|
//# sourceMappingURL=code-fix.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code-fix.d.ts","sourceRoot":"","sources":["../../../src/language-service/feature/code-fix.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEjE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"code-fix.d.ts","sourceRoot":"","sources":["../../../src/language-service/feature/code-fix.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEjE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,MAAM,YAAY,CAAC;AAI5B,eAAO,MAAM,2BAA2B,OAAO,CAAC;AAChD,eAAO,MAAM,mCAAmC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAgB,CAAC;AAElF,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,EAC1B,eAAe,EAAE,EAAE,CAAC,eAAe,EACnC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,EAC1B,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,SAAS,GAChB,EAAE,CAAC,eAAe,CAAC,wBAAwB,CAAC,CAiC9C"}
|
|
@@ -3,15 +3,14 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.
|
|
6
|
+
exports.PROPERTY_DOES_NOT_EXIST_ERROR_CODES = exports.CANNOT_FIND_NAME_ERROR_CODE = void 0;
|
|
7
7
|
exports.getCodeFixesAtPosition = getCodeFixesAtPosition;
|
|
8
8
|
const core_1 = require("@css-modules-kit/core");
|
|
9
9
|
const typescript_1 = __importDefault(require("typescript"));
|
|
10
|
-
const language_plugin_js_1 = require("../../language-plugin.js");
|
|
11
10
|
const util_js_1 = require("../../util.js");
|
|
12
11
|
// ref: https://github.com/microsoft/TypeScript/blob/220706eb0320ff46fad8bf80a5e99db624ee7dfb/src/compiler/diagnosticMessages.json
|
|
13
12
|
exports.CANNOT_FIND_NAME_ERROR_CODE = 2304;
|
|
14
|
-
exports.
|
|
13
|
+
exports.PROPERTY_DOES_NOT_EXIST_ERROR_CODES = [2339, 2551];
|
|
15
14
|
function getCodeFixesAtPosition(language, languageService, project, resolver, config) {
|
|
16
15
|
// eslint-disable-next-line max-params
|
|
17
16
|
return (fileName, start, end, errorCodes, formatOptions, preferences) => {
|
|
@@ -20,17 +19,15 @@ function getCodeFixesAtPosition(language, languageService, project, resolver, co
|
|
|
20
19
|
(0, util_js_1.convertDefaultImportsToNamespaceImports)(prior, fileName, resolver);
|
|
21
20
|
excludeNamedImports(prior, fileName, resolver);
|
|
22
21
|
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
});
|
|
33
|
-
}
|
|
22
|
+
// If a user is trying to use a non-existent token (e.g. `styles.nonExistToken`), provide a code fix to add the token.
|
|
23
|
+
if (errorCodes.some((errorCode) => exports.PROPERTY_DOES_NOT_EXIST_ERROR_CODES.includes(errorCode))) {
|
|
24
|
+
const tokenConsumer = getTokenConsumerAtPosition(fileName, start, languageService, project, config);
|
|
25
|
+
if (tokenConsumer) {
|
|
26
|
+
prior.push({
|
|
27
|
+
fixName: 'fixMissingCSSRule',
|
|
28
|
+
description: `Add missing CSS rule '.${tokenConsumer.tokenName}'`,
|
|
29
|
+
changes: [createInsertRuleFileChange(tokenConsumer.from, tokenConsumer.tokenName, language)],
|
|
30
|
+
});
|
|
34
31
|
}
|
|
35
32
|
}
|
|
36
33
|
return prior.filter((codeFix) => codeFix.changes.length > 0);
|
|
@@ -60,7 +57,7 @@ function excludeNamedImports(codeFixes, fileName, resolver) {
|
|
|
60
57
|
* Get the token consumer at the specified position.
|
|
61
58
|
* If the position is at `styles.foo`, it returns `{ tokenName: 'foo', from: '/path/to/a.module.css' }`.
|
|
62
59
|
*/
|
|
63
|
-
function getTokenConsumerAtPosition(fileName, position,
|
|
60
|
+
function getTokenConsumerAtPosition(fileName, position, languageService, project, config) {
|
|
64
61
|
const sourceFile = project.getSourceFile(project.projectService.toPath(fileName));
|
|
65
62
|
if (!sourceFile)
|
|
66
63
|
return undefined;
|
|
@@ -70,11 +67,20 @@ function getTokenConsumerAtPosition(fileName, position, language, languageServic
|
|
|
70
67
|
// Check if the expression of property access expression (e.g. `styles` in `styles.foo`) is imported from a CSS module.
|
|
71
68
|
// `expression` is the expression of the property access expression (e.g. `styles` in `styles.foo`).
|
|
72
69
|
const expression = propertyAccessExpression.expression;
|
|
73
|
-
|
|
74
|
-
if (
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
70
|
+
let [definition] = languageService.getDefinitionAtPosition(fileName, expression.getStart()) ?? [];
|
|
71
|
+
if (!definition)
|
|
72
|
+
return undefined;
|
|
73
|
+
// `definition` is may be `styles` definition in CSS Modules file.
|
|
74
|
+
if ((0, core_1.isCSSModuleFile)(definition.fileName)) {
|
|
75
|
+
return { tokenName: propertyAccessExpression.name.text, from: definition.fileName };
|
|
76
|
+
}
|
|
77
|
+
else if (config.namedExports) {
|
|
78
|
+
// If namespaced import is used, it may be a definition in a component file
|
|
79
|
+
// (e.g. the `styles` of `import * as styles from './a.module.css'`).
|
|
80
|
+
// In that case, we need to call `getDefinitionAtPosition` again to get the definition in CSS module file.
|
|
81
|
+
[definition] = languageService.getDefinitionAtPosition(definition.fileName, definition.textSpan.start) ?? [];
|
|
82
|
+
if (definition && (0, core_1.isCSSModuleFile)(definition.fileName)) {
|
|
83
|
+
return { tokenName: propertyAccessExpression.name.text, from: definition.fileName };
|
|
78
84
|
}
|
|
79
85
|
}
|
|
80
86
|
return undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code-fix.js","sourceRoot":"","sources":["../../../src/language-service/feature/code-fix.ts"],"names":[],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"code-fix.js","sourceRoot":"","sources":["../../../src/language-service/feature/code-fix.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { Language } from '@volar/language-core';
|
|
2
|
+
import type ts from 'typescript';
|
|
3
|
+
export declare function getDefinitionAndBoundSpan(language: Language<string>, languageService: ts.LanguageService): ts.LanguageService['getDefinitionAndBoundSpan'];
|
|
4
|
+
//# sourceMappingURL=definition-and-bound-span.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"definition-and-bound-span.d.ts","sourceRoot":"","sources":["../../../src/language-service/feature/definition-and-bound-span.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAGjC,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,EAC1B,eAAe,EAAE,EAAE,CAAC,eAAe,GAClC,EAAE,CAAC,eAAe,CAAC,2BAA2B,CAAC,CAoBjD"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getDefinitionAndBoundSpan = getDefinitionAndBoundSpan;
|
|
4
|
+
const language_plugin_js_1 = require("../../language-plugin.js");
|
|
5
|
+
function getDefinitionAndBoundSpan(language, languageService) {
|
|
6
|
+
return (...args) => {
|
|
7
|
+
const result = languageService.getDefinitionAndBoundSpan(...args);
|
|
8
|
+
if (!result)
|
|
9
|
+
return;
|
|
10
|
+
if (!result.definitions)
|
|
11
|
+
return result;
|
|
12
|
+
for (const def of result.definitions) {
|
|
13
|
+
const script = language.scripts.get(def.fileName);
|
|
14
|
+
if ((0, language_plugin_js_1.isCSSModuleScript)(script)) {
|
|
15
|
+
const cssModule = script.generated.root[language_plugin_js_1.CMK_DATA_KEY].cssModule;
|
|
16
|
+
const token = cssModule.localTokens.find((t) => t.name === def.name);
|
|
17
|
+
if (token?.declarationLoc) {
|
|
18
|
+
def.contextSpan = {
|
|
19
|
+
start: token.declarationLoc.start.offset,
|
|
20
|
+
length: token.declarationLoc.end.offset - token.declarationLoc.start.offset,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return result;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=definition-and-bound-span.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"definition-and-bound-span.js","sourceRoot":"","sources":["../../../src/language-service/feature/definition-and-bound-span.ts"],"names":[],"mappings":";;AAIA,8DAuBC;AAzBD,iEAA2E;AAE3E,SAAgB,yBAAyB,CACvC,QAA0B,EAC1B,eAAmC;IAEnC,OAAO,CAAC,GAAG,IAAI,EAAE,EAAE;QACjB,MAAM,MAAM,GAAG,eAAe,CAAC,yBAAyB,CAAC,GAAG,IAAI,CAAC,CAAC;QAClE,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,IAAI,CAAC,MAAM,CAAC,WAAW;YAAE,OAAO,MAAM,CAAC;QACvC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;YACrC,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAClD,IAAI,IAAA,sCAAiB,EAAC,MAAM,CAAC,EAAE,CAAC;gBAC9B,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,iCAAY,CAAC,CAAC,SAAS,CAAC;gBAChE,MAAM,KAAK,GAAG,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC;gBACrE,IAAI,KAAK,EAAE,cAAc,EAAE,CAAC;oBAC1B,GAAG,CAAC,WAAW,GAAG;wBAChB,KAAK,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM;wBACxC,MAAM,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM;qBAC5E,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../src/language-service/proxy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAuB,KAAK,cAAc,EAAE,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAChG,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../src/language-service/proxy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAuB,KAAK,cAAc,EAAE,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAChG,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAUjC,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,EAC1B,eAAe,EAAE,EAAE,CAAC,eAAe,EACnC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,EAC1B,QAAQ,EAAE,QAAQ,EAClB,cAAc,EAAE,cAAc,EAC9B,MAAM,EAAE,SAAS,GAChB,EAAE,CAAC,eAAe,CAoCpB"}
|
|
@@ -5,6 +5,7 @@ const core_1 = require("@css-modules-kit/core");
|
|
|
5
5
|
const language_plugin_js_1 = require("../language-plugin.js");
|
|
6
6
|
const code_fix_js_1 = require("./feature/code-fix.js");
|
|
7
7
|
const completion_js_1 = require("./feature/completion.js");
|
|
8
|
+
const definition_and_bound_span_js_1 = require("./feature/definition-and-bound-span.js");
|
|
8
9
|
const refactor_js_1 = require("./feature/refactor.js");
|
|
9
10
|
const semantic_diagnostic_js_1 = require("./feature/semantic-diagnostic.js");
|
|
10
11
|
const syntactic_diagnostic_js_1 = require("./feature/syntactic-diagnostic.js");
|
|
@@ -32,6 +33,7 @@ function proxyLanguageService(language, languageService, project, resolver, matc
|
|
|
32
33
|
proxy.getCompletionsAtPosition = (0, completion_js_1.getCompletionsAtPosition)(languageService, config);
|
|
33
34
|
proxy.getCompletionEntryDetails = (0, completion_js_1.getCompletionEntryDetails)(languageService, resolver, config);
|
|
34
35
|
proxy.getCodeFixesAtPosition = (0, code_fix_js_1.getCodeFixesAtPosition)(language, languageService, project, resolver, config);
|
|
36
|
+
proxy.getDefinitionAndBoundSpan = (0, definition_and_bound_span_js_1.getDefinitionAndBoundSpan)(language, languageService);
|
|
35
37
|
return proxy;
|
|
36
38
|
}
|
|
37
39
|
//# sourceMappingURL=proxy.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../src/language-service/proxy.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../src/language-service/proxy.ts"],"names":[],"mappings":";;AAaA,oDA2CC;AAvDD,gDAAgG;AAGhG,8DAAwE;AACxE,uDAA+D;AAC/D,2DAA8F;AAC9F,yFAAmF;AACnF,uDAAoF;AACpF,6EAA0E;AAC1E,+EAA4E;AAE5E,sCAAsC;AACtC,SAAgB,oBAAoB,CAClC,QAA0B,EAC1B,eAAmC,EACnC,OAA0B,EAC1B,QAAkB,EAClB,cAA8B,EAC9B,MAAiB;IAEjB,MAAM,KAAK,GAAuB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAEtD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,eAAe,CAAiC,EAAE,CAAC;QAC7E,MAAM,CAAC,GAAG,eAAe,CAAC,CAAC,CAAE,CAAC;QAC9B,yEAAyE;QACzE,mEAAmE;QACnE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAU,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,YAAY,GAAG,CAAC,IAAY,EAAE,EAAE;QACpC,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC1C,IAAI,IAAA,sCAAiB,EAAC,MAAM,CAAC,EAAE,CAAC;YAC9B,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,iCAAY,CAAC,CAAC,SAAS,CAAC;QACvD,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;IACF,MAAM,aAAa,GAAG,IAAA,0BAAmB,EAAC,EAAE,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,CAAC;IAEtF,KAAK,CAAC,uBAAuB,GAAG,IAAA,iDAAuB,EAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;IACnF,KAAK,CAAC,sBAAsB,GAAG,IAAA,+CAAsB,EACnD,QAAQ,EACR,eAAe,EACf,aAAa,EACb,QAAQ,EACR,cAAc,EACd,YAAY,CACb,CAAC;IACF,KAAK,CAAC,sBAAsB,GAAG,IAAA,oCAAsB,EAAC,eAAe,EAAE,OAAO,CAAC,CAAC;IAChF,KAAK,CAAC,mBAAmB,GAAG,IAAA,iCAAmB,EAAC,eAAe,CAAC,CAAC;IACjE,KAAK,CAAC,wBAAwB,GAAG,IAAA,wCAAwB,EAAC,eAAe,EAAE,MAAM,CAAC,CAAC;IACnF,KAAK,CAAC,yBAAyB,GAAG,IAAA,yCAAyB,EAAC,eAAe,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC/F,KAAK,CAAC,sBAAsB,GAAG,IAAA,oCAAsB,EAAC,QAAQ,EAAE,eAAe,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC5G,KAAK,CAAC,yBAAyB,GAAG,IAAA,wDAAyB,EAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;IAEvF,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Resolver } from '@css-modules-kit/core';
|
|
2
|
+
import type { Language } from '@volar/language-core';
|
|
3
|
+
import type ts from 'typescript';
|
|
4
|
+
import type { CSSModulesKitDocumentLinkHandlerResponse, CSSModulesKitDocumentLinkRequest } from '../type.js';
|
|
5
|
+
export declare function createDocumentLinkHandler(projectService: ts.server.ProjectService, projectToLanguage: WeakMap<ts.server.Project, Language<string>>, resolver: Resolver): (request: CSSModulesKitDocumentLinkRequest) => CSSModulesKitDocumentLinkHandlerResponse;
|
|
6
|
+
//# sourceMappingURL=documentLink.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"documentLink.d.ts","sourceRoot":"","sources":["../../src/protocol-handler/documentLink.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAEjC,OAAO,KAAK,EACV,wCAAwC,EACxC,gCAAgC,EAEjC,MAAM,YAAY,CAAC;AAGpB,wBAAgB,yBAAyB,CACvC,cAAc,EAAE,EAAE,CAAC,MAAM,CAAC,cAAc,EACxC,iBAAiB,EAAE,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,EAC/D,QAAQ,EAAE,QAAQ,IAEV,SAAS,gCAAgC,KAAG,wCAAwC,CAqB7F"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createDocumentLinkHandler = createDocumentLinkHandler;
|
|
4
|
+
const language_plugin_js_1 = require("../language-plugin.js");
|
|
5
|
+
const util_js_1 = require("../util.js");
|
|
6
|
+
function createDocumentLinkHandler(projectService, projectToLanguage, resolver) {
|
|
7
|
+
return (request) => {
|
|
8
|
+
const { fileName } = request.arguments;
|
|
9
|
+
const project = (0, util_js_1.getConfiguredProjectForFile)(projectService, fileName);
|
|
10
|
+
if (!project)
|
|
11
|
+
return {};
|
|
12
|
+
const language = projectToLanguage.get(project);
|
|
13
|
+
if (!language)
|
|
14
|
+
return {};
|
|
15
|
+
const script = language.scripts.get(fileName);
|
|
16
|
+
const links = [];
|
|
17
|
+
if ((0, language_plugin_js_1.isCSSModuleScript)(script)) {
|
|
18
|
+
const { tokenImporters } = script.generated.root[language_plugin_js_1.CMK_DATA_KEY].cssModule;
|
|
19
|
+
for (const { from, fromLoc } of tokenImporters) {
|
|
20
|
+
const resolved = resolver(from, { request: fileName });
|
|
21
|
+
if (!resolved)
|
|
22
|
+
continue;
|
|
23
|
+
links.push({
|
|
24
|
+
fileName: resolved,
|
|
25
|
+
textSpan: { start: fromLoc.start.offset, length: fromLoc.end.offset - fromLoc.start.offset },
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return { response: { result: links } };
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=documentLink.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"documentLink.js","sourceRoot":"","sources":["../../src/protocol-handler/documentLink.ts"],"names":[],"mappings":";;AAWA,8DA0BC;AAlCD,8DAAwE;AAMxE,wCAAyD;AAEzD,SAAgB,yBAAyB,CACvC,cAAwC,EACxC,iBAA+D,EAC/D,QAAkB;IAElB,OAAO,CAAC,OAAyC,EAA4C,EAAE;QAC7F,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC;QACvC,MAAM,OAAO,GAAG,IAAA,qCAA2B,EAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;QACtE,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,CAAC;QACxB,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAChD,IAAI,CAAC,QAAQ;YAAE,OAAO,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC9C,MAAM,KAAK,GAAmB,EAAE,CAAC;QACjC,IAAI,IAAA,sCAAiB,EAAC,MAAM,CAAC,EAAE,CAAC;YAC9B,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,iCAAY,CAAC,CAAC,SAAS,CAAC;YACzE,KAAK,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,cAAc,EAAE,CAAC;gBAC/C,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACvD,IAAI,CAAC,QAAQ;oBAAE,SAAS;gBACxB,KAAK,CAAC,IAAI,CAAC;oBACT,QAAQ,EAAE,QAAQ;oBAClB,QAAQ,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE;iBAC7F,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,OAAO,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;IACzC,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import ts from 'typescript';
|
|
2
|
+
import type { CSSModulesKitRenameHandlerResponse, CSSModulesKitRenameRequest } from '../type.js';
|
|
3
|
+
export declare function createRenameHandler(projectService: ts.server.ProjectService): (request: CSSModulesKitRenameRequest) => CSSModulesKitRenameHandlerResponse;
|
|
4
|
+
//# sourceMappingURL=rename.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rename.d.ts","sourceRoot":"","sources":["../../src/protocol-handler/rename.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,KAAK,EAAE,kCAAkC,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAGjG,wBAAgB,mBAAmB,CAAC,cAAc,EAAE,EAAE,CAAC,MAAM,CAAC,cAAc,IAClE,SAAS,0BAA0B,KAAG,kCAAkC,CASjF"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.createRenameHandler = createRenameHandler;
|
|
7
|
+
const typescript_1 = __importDefault(require("typescript"));
|
|
8
|
+
const util_js_1 = require("../util.js");
|
|
9
|
+
function createRenameHandler(projectService) {
|
|
10
|
+
return (request) => {
|
|
11
|
+
const { fileName, position } = request.arguments;
|
|
12
|
+
const project = (0, util_js_1.getConfiguredProjectForFile)(projectService, fileName);
|
|
13
|
+
if (!project)
|
|
14
|
+
return {};
|
|
15
|
+
const languageService = project.getLanguageService();
|
|
16
|
+
const preference = project.projectService.getPreferences(typescript_1.default.server.toNormalizedPath(fileName));
|
|
17
|
+
const result = languageService.findRenameLocations(fileName, position, false, false, preference);
|
|
18
|
+
return { response: { result } };
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=rename.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rename.js","sourceRoot":"","sources":["../../src/protocol-handler/rename.ts"],"names":[],"mappings":";;;;;AAIA,kDAUC;AAdD,4DAA4B;AAE5B,wCAAyD;AAEzD,SAAgB,mBAAmB,CAAC,cAAwC;IAC1E,OAAO,CAAC,OAAmC,EAAsC,EAAE;QACjF,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC;QACjD,MAAM,OAAO,GAAG,IAAA,qCAA2B,EAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;QACtE,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,CAAC;QACxB,MAAM,eAAe,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;QACrD,MAAM,UAAU,GAAG,OAAO,CAAC,cAAc,CAAC,cAAc,CAAC,oBAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC/F,MAAM,MAAM,GAAG,eAAe,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;QACjG,OAAO,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC;IAClC,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import ts from 'typescript';
|
|
2
|
+
import type { CSSModulesKitRenameInfoHandlerResponse, CSSModulesKitRenameInfoRequest } from '../type.js';
|
|
3
|
+
export declare function createRenameInfoHandler(projectService: ts.server.ProjectService): (request: CSSModulesKitRenameInfoRequest) => CSSModulesKitRenameInfoHandlerResponse;
|
|
4
|
+
//# sourceMappingURL=renameInfo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renameInfo.d.ts","sourceRoot":"","sources":["../../src/protocol-handler/renameInfo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,KAAK,EAAE,sCAAsC,EAAE,8BAA8B,EAAE,MAAM,YAAY,CAAC;AAGzG,wBAAgB,uBAAuB,CAAC,cAAc,EAAE,EAAE,CAAC,MAAM,CAAC,cAAc,IACtE,SAAS,8BAA8B,KAAG,sCAAsC,CASzF"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.createRenameInfoHandler = createRenameInfoHandler;
|
|
7
|
+
const typescript_1 = __importDefault(require("typescript"));
|
|
8
|
+
const util_js_1 = require("../util.js");
|
|
9
|
+
function createRenameInfoHandler(projectService) {
|
|
10
|
+
return (request) => {
|
|
11
|
+
const { fileName, position } = request.arguments;
|
|
12
|
+
const project = (0, util_js_1.getConfiguredProjectForFile)(projectService, fileName);
|
|
13
|
+
if (!project)
|
|
14
|
+
return {};
|
|
15
|
+
const languageService = project.getLanguageService();
|
|
16
|
+
const preference = project.projectService.getPreferences(typescript_1.default.server.toNormalizedPath(fileName));
|
|
17
|
+
const result = languageService.getRenameInfo(fileName, position, preference);
|
|
18
|
+
return { response: { result } };
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=renameInfo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renameInfo.js","sourceRoot":"","sources":["../../src/protocol-handler/renameInfo.ts"],"names":[],"mappings":";;;;;AAIA,0DAUC;AAdD,4DAA4B;AAE5B,wCAAyD;AAEzD,SAAgB,uBAAuB,CAAC,cAAwC;IAC9E,OAAO,CAAC,OAAuC,EAA0C,EAAE;QACzF,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC;QACjD,MAAM,OAAO,GAAG,IAAA,qCAA2B,EAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;QACtE,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,CAAC;QACxB,MAAM,eAAe,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;QACrD,MAAM,UAAU,GAAG,OAAO,CAAC,cAAc,CAAC,cAAc,CAAC,oBAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC/F,MAAM,MAAM,GAAG,eAAe,CAAC,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC7E,OAAO,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC;IAClC,CAAC,CAAC;AACJ,CAAC"}
|
package/dist/type.d.ts
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type ts from 'typescript';
|
|
2
|
+
export interface CSSModulesKitRenameRequest extends ts.server.protocol.Request {
|
|
3
|
+
command: '_css-modules-kit:rename';
|
|
4
|
+
arguments: {
|
|
5
|
+
fileName: string;
|
|
6
|
+
position: number;
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
export interface CSSModulesKitRenameHandlerResponse extends ts.server.HandlerResponse {
|
|
10
|
+
response?: {
|
|
11
|
+
result: ReturnType<ts.LanguageService['findRenameLocations']>;
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
export interface CSSModulesKitRenameResponse extends ts.server.protocol.Response {
|
|
15
|
+
command: '_css-modules-kit:rename';
|
|
16
|
+
readonly body: CSSModulesKitRenameHandlerResponse['response'];
|
|
17
|
+
}
|
|
18
|
+
export interface CSSModulesKitRenameInfoRequest extends ts.server.protocol.Request {
|
|
19
|
+
command: '_css-modules-kit:renameInfo';
|
|
20
|
+
arguments: {
|
|
21
|
+
fileName: string;
|
|
22
|
+
position: number;
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export interface CSSModulesKitRenameInfoHandlerResponse extends ts.server.HandlerResponse {
|
|
26
|
+
response?: {
|
|
27
|
+
result: ReturnType<ts.LanguageService['getRenameInfo']>;
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export interface CSSModulesKitRenameInfoResponse extends ts.server.protocol.Response {
|
|
31
|
+
command: '_css-modules-kit:renameInfo';
|
|
32
|
+
readonly body: CSSModulesKitRenameInfoHandlerResponse['response'];
|
|
33
|
+
}
|
|
34
|
+
export interface DocumentLink {
|
|
35
|
+
fileName: string;
|
|
36
|
+
textSpan: ts.TextSpan;
|
|
37
|
+
}
|
|
38
|
+
export interface CSSModulesKitDocumentLinkRequest extends ts.server.protocol.Request {
|
|
39
|
+
command: '_css-modules-kit:documentLink';
|
|
40
|
+
arguments: {
|
|
41
|
+
fileName: string;
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
export interface CSSModulesKitDocumentLinkHandlerResponse extends ts.server.HandlerResponse {
|
|
45
|
+
response?: {
|
|
46
|
+
result: DocumentLink[];
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
export interface CSSModulesKitDocumentLinkResponse extends ts.server.protocol.Response {
|
|
50
|
+
command: '_css-modules-kit:documentLink';
|
|
51
|
+
readonly body: CSSModulesKitDocumentLinkHandlerResponse['response'];
|
|
52
|
+
}
|
|
53
|
+
declare module 'typescript' {
|
|
54
|
+
namespace server {
|
|
55
|
+
interface Session {
|
|
56
|
+
addProtocolHandler(command: '_css-modules-kit:rename', handler: (request: CSSModulesKitRenameRequest) => CSSModulesKitRenameHandlerResponse): void;
|
|
57
|
+
addProtocolHandler(command: '_css-modules-kit:renameInfo', handler: (request: CSSModulesKitRenameInfoRequest) => CSSModulesKitRenameInfoHandlerResponse): void;
|
|
58
|
+
addProtocolHandler(command: '_css-modules-kit:documentLink', handler: (request: CSSModulesKitDocumentLinkRequest) => CSSModulesKitDocumentLinkHandlerResponse): void;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=type.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type.d.ts","sourceRoot":"","sources":["../src/type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAEjC,MAAM,WAAW,0BAA2B,SAAQ,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO;IAC5E,OAAO,EAAE,yBAAyB,CAAC;IACnC,SAAS,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;CACnD;AACD,MAAM,WAAW,kCAAmC,SAAQ,EAAE,CAAC,MAAM,CAAC,eAAe;IACnF,QAAQ,CAAC,EAAE;QAAE,MAAM,EAAE,UAAU,CAAC,EAAE,CAAC,eAAe,CAAC,qBAAqB,CAAC,CAAC,CAAA;KAAE,CAAC;CAC9E;AACD,MAAM,WAAW,2BAA4B,SAAQ,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ;IAC9E,OAAO,EAAE,yBAAyB,CAAC;IACnC,QAAQ,CAAC,IAAI,EAAE,kCAAkC,CAAC,UAAU,CAAC,CAAC;CAC/D;AAED,MAAM,WAAW,8BAA+B,SAAQ,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO;IAChF,OAAO,EAAE,6BAA6B,CAAC;IACvC,SAAS,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;CACnD;AACD,MAAM,WAAW,sCAAuC,SAAQ,EAAE,CAAC,MAAM,CAAC,eAAe;IACvF,QAAQ,CAAC,EAAE;QAAE,MAAM,EAAE,UAAU,CAAC,EAAE,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC,CAAA;KAAE,CAAC;CACxE;AACD,MAAM,WAAW,+BAAgC,SAAQ,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ;IAClF,OAAO,EAAE,6BAA6B,CAAC;IACvC,QAAQ,CAAC,IAAI,EAAE,sCAAsC,CAAC,UAAU,CAAC,CAAC;CACnE;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC;CACvB;AACD,MAAM,WAAW,gCAAiC,SAAQ,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO;IAClF,OAAO,EAAE,+BAA+B,CAAC;IACzC,SAAS,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;CACjC;AACD,MAAM,WAAW,wCAAyC,SAAQ,EAAE,CAAC,MAAM,CAAC,eAAe;IACzF,QAAQ,CAAC,EAAE;QAAE,MAAM,EAAE,YAAY,EAAE,CAAA;KAAE,CAAC;CACvC;AACD,MAAM,WAAW,iCAAkC,SAAQ,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ;IACpF,OAAO,EAAE,+BAA+B,CAAC;IACzC,QAAQ,CAAC,IAAI,EAAE,wCAAwC,CAAC,UAAU,CAAC,CAAC;CACrE;AAED,OAAO,QAAQ,YAAY,CAAC;IAE1B,UAAU,MAAM,CAAC;QACf,UAAiB,OAAO;YACtB,kBAAkB,CAChB,OAAO,EAAE,yBAAyB,EAClC,OAAO,EAAE,CAAC,OAAO,EAAE,0BAA0B,KAAK,kCAAkC,GACnF,IAAI,CAAC;YACR,kBAAkB,CAChB,OAAO,EAAE,6BAA6B,EACtC,OAAO,EAAE,CAAC,OAAO,EAAE,8BAA8B,KAAK,sCAAsC,GAC3F,IAAI,CAAC;YACR,kBAAkB,CAChB,OAAO,EAAE,+BAA+B,EACxC,OAAO,EAAE,CAAC,OAAO,EAAE,gCAAgC,KAAK,wCAAwC,GAC/F,IAAI,CAAC;SACT;KACF;CACF"}
|
package/dist/type.js
ADDED
package/dist/type.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type.js","sourceRoot":"","sources":["../src/type.ts"],"names":[],"mappings":""}
|
package/dist/util.d.ts
CHANGED
|
@@ -9,4 +9,5 @@ export declare function createPreferencesForCompletion<T extends ts.UserPreferen
|
|
|
9
9
|
* For example, convert `import styles from './styles.module.css'` to `import * as styles from './styles.module.css'`.
|
|
10
10
|
*/
|
|
11
11
|
export declare function convertDefaultImportsToNamespaceImports(codeFixes: ts.CodeFixAction[] | ts.CodeAction[], fileName: string, resolver: Resolver): void;
|
|
12
|
+
export declare function getConfiguredProjectForFile(projectService: ts.server.ProjectService, fileName: string): ts.server.ConfiguredProject | undefined;
|
|
12
13
|
//# sourceMappingURL=util.d.ts.map
|
package/dist/util.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAmB,KAAK,QAAQ,EAAsB,MAAM,uBAAuB,CAAC;AAC3G,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,0FAA0F;AAG1F,eAAO,MAAM,2BAA2B,IAAI,CAAC;AAE7C,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,YAAY,GAAG,EAAE,CAAC,kBAAkB,CAWxG;AAED,wBAAgB,8BAA8B,CAAC,CAAC,SAAS,EAAE,CAAC,eAAe,EAAE,WAAW,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS,GAAG,CAAC,CAOjH;AACD;;;GAGG;AACH,wBAAgB,uCAAuC,CACrD,SAAS,EAAE,EAAE,CAAC,aAAa,EAAE,GAAG,EAAE,CAAC,UAAU,EAAE,EAC/C,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,QAAQ,GACjB,IAAI,CAoBN"}
|
|
1
|
+
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAmB,KAAK,QAAQ,EAAsB,MAAM,uBAAuB,CAAC;AAC3G,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,0FAA0F;AAG1F,eAAO,MAAM,2BAA2B,IAAI,CAAC;AAE7C,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,YAAY,GAAG,EAAE,CAAC,kBAAkB,CAWxG;AAED,wBAAgB,8BAA8B,CAAC,CAAC,SAAS,EAAE,CAAC,eAAe,EAAE,WAAW,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS,GAAG,CAAC,CAOjH;AACD;;;GAGG;AACH,wBAAgB,uCAAuC,CACrD,SAAS,EAAE,EAAE,CAAC,aAAa,EAAE,GAAG,EAAE,CAAC,UAAU,EAAE,EAC/C,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,QAAQ,GACjB,IAAI,CAoBN;AAED,wBAAgB,2BAA2B,CACzC,cAAc,EAAE,EAAE,CAAC,MAAM,CAAC,cAAc,EACxC,QAAQ,EAAE,MAAM,GACf,EAAE,CAAC,MAAM,CAAC,iBAAiB,GAAG,SAAS,CAIzC"}
|
package/dist/util.js
CHANGED
|
@@ -7,6 +7,7 @@ exports.TS_ERROR_CODE_FOR_CMK_ERROR = void 0;
|
|
|
7
7
|
exports.convertErrorCategory = convertErrorCategory;
|
|
8
8
|
exports.createPreferencesForCompletion = createPreferencesForCompletion;
|
|
9
9
|
exports.convertDefaultImportsToNamespaceImports = convertDefaultImportsToNamespaceImports;
|
|
10
|
+
exports.getConfiguredProjectForFile = getConfiguredProjectForFile;
|
|
10
11
|
const core_1 = require("@css-modules-kit/core");
|
|
11
12
|
const typescript_1 = __importDefault(require("typescript"));
|
|
12
13
|
/** The error code used by tsserver to display the css-modules-kit error in the editor. */
|
|
@@ -57,4 +58,10 @@ function convertDefaultImportsToNamespaceImports(codeFixes, fileName, resolver)
|
|
|
57
58
|
}
|
|
58
59
|
}
|
|
59
60
|
}
|
|
61
|
+
function getConfiguredProjectForFile(projectService, fileName) {
|
|
62
|
+
const project = projectService.getDefaultProjectForFile(typescript_1.default.server.toNormalizedPath(fileName), false);
|
|
63
|
+
if (!project || project.projectKind !== typescript_1.default.server.ProjectKind.Configured)
|
|
64
|
+
return;
|
|
65
|
+
return project;
|
|
66
|
+
}
|
|
60
67
|
//# sourceMappingURL=util.js.map
|
package/dist/util.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":";;;;;;AAQA,oDAWC;AAED,wEAOC;AAKD,0FAwBC;
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":";;;;;;AAQA,oDAWC;AAED,wEAOC;AAKD,0FAwBC;AAED,kEAOC;AAlED,gDAA2G;AAC3G,4DAA4B;AAE5B,0FAA0F;AAC1F,uGAAuG;AACvG,kIAAkI;AACrH,QAAA,2BAA2B,GAAG,CAAC,CAAC;AAE7C,SAAgB,oBAAoB,CAAC,QAA4C;IAC/E,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,OAAO;YACV,OAAO,oBAAE,CAAC,kBAAkB,CAAC,KAAK,CAAC;QACrC,KAAK,SAAS;YACZ,OAAO,oBAAE,CAAC,kBAAkB,CAAC,OAAO,CAAC;QACvC,KAAK,YAAY;YACf,OAAO,oBAAE,CAAC,kBAAkB,CAAC,UAAU,CAAC;QAC1C;YACE,MAAM,IAAI,KAAK,CAAC,qBAAqB,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC7D,CAAC;AACH,CAAC;AAED,SAAgB,8BAA8B,CAA+B,WAAc,EAAE,MAAiB;IAC5G,+EAA+E;IAC/E,kFAAkF;IAClF,OAAO;QACL,GAAG,WAAW;QACd,6BAA6B,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,6BAA6B,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC;KACxG,CAAC;AACJ,CAAC;AACD;;;GAGG;AACH,SAAgB,uCAAuC,CACrD,SAA+C,EAC/C,QAAgB,EAChB,QAAkB;IAElB,KAAK,MAAM,OAAO,IAAI,SAAS,EAAE,CAAC;QAChC,IAAI,SAAS,IAAI,OAAO,IAAI,OAAO,CAAC,OAAO,KAAK,QAAQ;YAAE,SAAS;QACnE,8DAA8D;QAC9D,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;QACrE,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,QAAQ,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC5D,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAA,sBAAe,EAAC,QAAQ,CAAC;YAAE,SAAS;QAEtD,8EAA8E;QAC9E,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACrC,KAAK,MAAM,UAAU,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;gBAC5C,UAAU,CAAC,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,OAAO,CAC7C,UAAU,yBAAkB,OAAO,EACnC,eAAe,yBAAkB,OAAO,CACzC,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAgB,2BAA2B,CACzC,cAAwC,EACxC,QAAgB;IAEhB,MAAM,OAAO,GAAG,cAAc,CAAC,wBAAwB,CAAC,oBAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC;IACrG,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,WAAW,KAAK,oBAAE,CAAC,MAAM,CAAC,WAAW,CAAC,UAAU;QAAE,OAAO;IACjF,OAAO,OAAsC,CAAC;AAChD,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@css-modules-kit/ts-plugin",
|
|
3
3
|
"description": "A TypeScript Language Service Plugin for CSS Modules",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.4.0",
|
|
5
5
|
"type": "commonjs",
|
|
6
6
|
"sideEffects": false,
|
|
7
7
|
"repository": {
|
|
@@ -23,6 +23,16 @@
|
|
|
23
23
|
"access": "public",
|
|
24
24
|
"registry": "https://registry.npmjs.org/"
|
|
25
25
|
},
|
|
26
|
+
"exports": {
|
|
27
|
+
".": {
|
|
28
|
+
"types": "./dist/index.d.ts",
|
|
29
|
+
"default": "./dist/index.js"
|
|
30
|
+
},
|
|
31
|
+
"./type": {
|
|
32
|
+
"types": "./dist/type.d.ts",
|
|
33
|
+
"default": "./dist/type.js"
|
|
34
|
+
}
|
|
35
|
+
},
|
|
26
36
|
"keywords": [
|
|
27
37
|
"css-modules",
|
|
28
38
|
"typescript",
|
|
@@ -39,7 +49,7 @@
|
|
|
39
49
|
"dependencies": {
|
|
40
50
|
"@volar/language-core": "^2.4.11",
|
|
41
51
|
"@volar/typescript": "^2.4.11",
|
|
42
|
-
"@css-modules-kit/core": "^0.
|
|
52
|
+
"@css-modules-kit/core": "^0.4.0"
|
|
43
53
|
},
|
|
44
54
|
"peerDependencies": {
|
|
45
55
|
"typescript": ">=5.6.3"
|
package/src/index.ts
CHANGED
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
import type { CMKConfig } from '@css-modules-kit/core';
|
|
2
2
|
import { createMatchesPattern, createResolver, readConfigFile } from '@css-modules-kit/core';
|
|
3
3
|
import { TsConfigFileNotFoundError } from '@css-modules-kit/core';
|
|
4
|
+
import type { Language } from '@volar/language-core';
|
|
4
5
|
import { createLanguageServicePlugin } from '@volar/typescript/lib/quickstart/createLanguageServicePlugin.js';
|
|
6
|
+
import type ts from 'typescript';
|
|
5
7
|
import { createCSSLanguagePlugin } from './language-plugin.js';
|
|
6
8
|
import { proxyLanguageService } from './language-service/proxy.js';
|
|
9
|
+
import { createDocumentLinkHandler } from './protocol-handler/documentLink.js';
|
|
10
|
+
import { createRenameHandler } from './protocol-handler/rename.js';
|
|
11
|
+
import { createRenameInfoHandler } from './protocol-handler/renameInfo.js';
|
|
12
|
+
|
|
13
|
+
const projectToLanguage = new WeakMap<ts.server.Project, Language<string>>();
|
|
7
14
|
|
|
8
15
|
const plugin = createLanguageServicePlugin((ts, info) => {
|
|
9
16
|
if (info.project.projectKind !== ts.server.ProjectKind.Configured) {
|
|
@@ -33,6 +40,19 @@ const plugin = createLanguageServicePlugin((ts, info) => {
|
|
|
33
40
|
}
|
|
34
41
|
}
|
|
35
42
|
|
|
43
|
+
// tsserver should report a “Cannot find module” error for import statements in CSS Modules that
|
|
44
|
+
// do not exist. However, if `dtsOutDir` is included in `rootDirs` and old .d.ts files remain
|
|
45
|
+
// in `dtsOutDir`, the error will not be reported. Therefore, remove `dtsOutDir` from `rootDirs`.
|
|
46
|
+
const getCompilationSettings = info.languageServiceHost.getCompilationSettings.bind(info.languageServiceHost);
|
|
47
|
+
info.languageServiceHost.getCompilationSettings = () => {
|
|
48
|
+
const settings = { ...getCompilationSettings() };
|
|
49
|
+
if (settings.rootDirs) {
|
|
50
|
+
// TODO: If the `dtsOutDir` is not in `rootDirs`, warn the user.
|
|
51
|
+
settings.rootDirs = settings.rootDirs.filter((dir) => dir !== config.dtsOutDir);
|
|
52
|
+
}
|
|
53
|
+
return settings;
|
|
54
|
+
};
|
|
55
|
+
|
|
36
56
|
const moduleResolutionCache = info.languageServiceHost.getModuleResolutionCache?.();
|
|
37
57
|
const resolver = createResolver(config.compilerOptions, moduleResolutionCache);
|
|
38
58
|
const matchesPattern = createMatchesPattern(config);
|
|
@@ -40,6 +60,7 @@ const plugin = createLanguageServicePlugin((ts, info) => {
|
|
|
40
60
|
return {
|
|
41
61
|
languagePlugins: [createCSSLanguagePlugin(resolver, matchesPattern, config)],
|
|
42
62
|
setup: (language) => {
|
|
63
|
+
projectToLanguage.set(info.project, language);
|
|
43
64
|
info.languageService = proxyLanguageService(
|
|
44
65
|
language,
|
|
45
66
|
info.languageService,
|
|
@@ -48,6 +69,42 @@ const plugin = createLanguageServicePlugin((ts, info) => {
|
|
|
48
69
|
matchesPattern,
|
|
49
70
|
config,
|
|
50
71
|
);
|
|
72
|
+
if (info.session) {
|
|
73
|
+
// Register protocol handlers for "Request Forwarding to tsserver".
|
|
74
|
+
// See https://github.com/mizdra/css-modules-kit/pull/207 for more details.
|
|
75
|
+
|
|
76
|
+
// `info.session.addProtocolHandler` cannot register multiple handlers with the same command name.
|
|
77
|
+
// Attempting to do so will result in an error.
|
|
78
|
+
//
|
|
79
|
+
// By the way, tsserver creates one ConfiguredProject for each tsconfig.json file. Then, tsserver
|
|
80
|
+
// initializes each plugin for each ConfiguredProject. This means that if there are multiple
|
|
81
|
+
// tsconfig.json files, the handler will be registered multiple times.
|
|
82
|
+
//
|
|
83
|
+
// Therefore, we will do the following:
|
|
84
|
+
// - Implement the handler to handle files from different projects
|
|
85
|
+
// - Skip registration if the handler is already registered
|
|
86
|
+
try {
|
|
87
|
+
info.session.addProtocolHandler('_css-modules-kit:rename', createRenameHandler(info.project.projectService));
|
|
88
|
+
info.session.addProtocolHandler(
|
|
89
|
+
'_css-modules-kit:renameInfo',
|
|
90
|
+
createRenameInfoHandler(info.project.projectService),
|
|
91
|
+
);
|
|
92
|
+
info.session.addProtocolHandler(
|
|
93
|
+
'_css-modules-kit:documentLink',
|
|
94
|
+
createDocumentLinkHandler(info.project.projectService, projectToLanguage, resolver),
|
|
95
|
+
);
|
|
96
|
+
} catch {
|
|
97
|
+
info.project.projectService.logger.info(
|
|
98
|
+
`[@css-modules-kit/ts-plugin] Skipping protocol handler registration because the handlers are already registered.`,
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
} else {
|
|
102
|
+
// When a plugin is used via tsserver from the editor, the session is always available.
|
|
103
|
+
// However, when a plugin is used via the TypeScript Compiler API, the session may not be available.
|
|
104
|
+
info.project.projectService.logger.info(
|
|
105
|
+
'[@css-modules-kit/ts-plugin] info: Skipping protocol handler registration because session is not available.',
|
|
106
|
+
);
|
|
107
|
+
}
|
|
51
108
|
},
|
|
52
109
|
};
|
|
53
110
|
});
|
package/src/language-plugin.ts
CHANGED
|
@@ -54,15 +54,11 @@ export function createCSSLanguagePlugin(
|
|
|
54
54
|
safe: true,
|
|
55
55
|
});
|
|
56
56
|
// eslint-disable-next-line prefer-const
|
|
57
|
-
let { text, mapping, linkedCodeMapping } = createDts(
|
|
58
|
-
|
|
59
|
-
matchesPattern,
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
if (config.namedExports && !config.prioritizeNamedImports) {
|
|
63
|
-
// Export `styles` to appear in code completion suggestions
|
|
64
|
-
text += 'declare const styles: {};\nexport default styles;\n';
|
|
65
|
-
}
|
|
57
|
+
let { text, mapping, linkedCodeMapping } = createDts(
|
|
58
|
+
cssModule,
|
|
59
|
+
{ resolver, matchesPattern },
|
|
60
|
+
{ ...config, forTsPlugin: true },
|
|
61
|
+
);
|
|
66
62
|
return {
|
|
67
63
|
id: 'main',
|
|
68
64
|
languageId: LANGUAGE_ID,
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
import type { CMKConfig, Resolver } from '@css-modules-kit/core';
|
|
2
|
-
import {
|
|
2
|
+
import { isCSSModuleFile } from '@css-modules-kit/core';
|
|
3
3
|
import type { Language } from '@volar/language-core';
|
|
4
4
|
import ts from 'typescript';
|
|
5
|
-
import { isCSSModuleScript } from '../../language-plugin.js';
|
|
6
5
|
import { convertDefaultImportsToNamespaceImports, createPreferencesForCompletion } from '../../util.js';
|
|
7
6
|
|
|
8
7
|
// ref: https://github.com/microsoft/TypeScript/blob/220706eb0320ff46fad8bf80a5e99db624ee7dfb/src/compiler/diagnosticMessages.json
|
|
9
8
|
export const CANNOT_FIND_NAME_ERROR_CODE = 2304;
|
|
10
|
-
export const
|
|
9
|
+
export const PROPERTY_DOES_NOT_EXIST_ERROR_CODES: [number, number] = [2339, 2551];
|
|
11
10
|
|
|
12
11
|
export function getCodeFixesAtPosition(
|
|
13
12
|
language: Language<string>,
|
|
@@ -34,17 +33,15 @@ export function getCodeFixesAtPosition(
|
|
|
34
33
|
excludeNamedImports(prior, fileName, resolver);
|
|
35
34
|
}
|
|
36
35
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
});
|
|
47
|
-
}
|
|
36
|
+
// If a user is trying to use a non-existent token (e.g. `styles.nonExistToken`), provide a code fix to add the token.
|
|
37
|
+
if (errorCodes.some((errorCode) => PROPERTY_DOES_NOT_EXIST_ERROR_CODES.includes(errorCode))) {
|
|
38
|
+
const tokenConsumer = getTokenConsumerAtPosition(fileName, start, languageService, project, config);
|
|
39
|
+
if (tokenConsumer) {
|
|
40
|
+
prior.push({
|
|
41
|
+
fixName: 'fixMissingCSSRule',
|
|
42
|
+
description: `Add missing CSS rule '.${tokenConsumer.tokenName}'`,
|
|
43
|
+
changes: [createInsertRuleFileChange(tokenConsumer.from, tokenConsumer.tokenName, language)],
|
|
44
|
+
});
|
|
48
45
|
}
|
|
49
46
|
}
|
|
50
47
|
|
|
@@ -85,9 +82,9 @@ interface TokenConsumer {
|
|
|
85
82
|
function getTokenConsumerAtPosition(
|
|
86
83
|
fileName: string,
|
|
87
84
|
position: number,
|
|
88
|
-
language: Language<string>,
|
|
89
85
|
languageService: ts.LanguageService,
|
|
90
86
|
project: ts.server.Project,
|
|
87
|
+
config: CMKConfig,
|
|
91
88
|
): TokenConsumer | undefined {
|
|
92
89
|
const sourceFile = project.getSourceFile(project.projectService.toPath(fileName));
|
|
93
90
|
if (!sourceFile) return undefined;
|
|
@@ -99,11 +96,19 @@ function getTokenConsumerAtPosition(
|
|
|
99
96
|
// `expression` is the expression of the property access expression (e.g. `styles` in `styles.foo`).
|
|
100
97
|
const expression = propertyAccessExpression.expression;
|
|
101
98
|
|
|
102
|
-
|
|
103
|
-
if (
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
99
|
+
let [definition] = languageService.getDefinitionAtPosition(fileName, expression.getStart()) ?? [];
|
|
100
|
+
if (!definition) return undefined;
|
|
101
|
+
|
|
102
|
+
// `definition` is may be `styles` definition in CSS Modules file.
|
|
103
|
+
if (isCSSModuleFile(definition.fileName)) {
|
|
104
|
+
return { tokenName: propertyAccessExpression.name.text, from: definition.fileName };
|
|
105
|
+
} else if (config.namedExports) {
|
|
106
|
+
// If namespaced import is used, it may be a definition in a component file
|
|
107
|
+
// (e.g. the `styles` of `import * as styles from './a.module.css'`).
|
|
108
|
+
// In that case, we need to call `getDefinitionAtPosition` again to get the definition in CSS module file.
|
|
109
|
+
[definition] = languageService.getDefinitionAtPosition(definition.fileName, definition.textSpan.start) ?? [];
|
|
110
|
+
if (definition && isCSSModuleFile(definition.fileName)) {
|
|
111
|
+
return { tokenName: propertyAccessExpression.name.text, from: definition.fileName };
|
|
107
112
|
}
|
|
108
113
|
}
|
|
109
114
|
return undefined;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { Language } from '@volar/language-core';
|
|
2
|
+
import type ts from 'typescript';
|
|
3
|
+
import { CMK_DATA_KEY, isCSSModuleScript } from '../../language-plugin.js';
|
|
4
|
+
|
|
5
|
+
export function getDefinitionAndBoundSpan(
|
|
6
|
+
language: Language<string>,
|
|
7
|
+
languageService: ts.LanguageService,
|
|
8
|
+
): ts.LanguageService['getDefinitionAndBoundSpan'] {
|
|
9
|
+
return (...args) => {
|
|
10
|
+
const result = languageService.getDefinitionAndBoundSpan(...args);
|
|
11
|
+
if (!result) return;
|
|
12
|
+
if (!result.definitions) return result;
|
|
13
|
+
for (const def of result.definitions) {
|
|
14
|
+
const script = language.scripts.get(def.fileName);
|
|
15
|
+
if (isCSSModuleScript(script)) {
|
|
16
|
+
const cssModule = script.generated.root[CMK_DATA_KEY].cssModule;
|
|
17
|
+
const token = cssModule.localTokens.find((t) => t.name === def.name);
|
|
18
|
+
if (token?.declarationLoc) {
|
|
19
|
+
def.contextSpan = {
|
|
20
|
+
start: token.declarationLoc.start.offset,
|
|
21
|
+
length: token.declarationLoc.end.offset - token.declarationLoc.start.offset,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return result;
|
|
27
|
+
};
|
|
28
|
+
}
|
|
@@ -5,6 +5,7 @@ import type ts from 'typescript';
|
|
|
5
5
|
import { CMK_DATA_KEY, isCSSModuleScript } from '../language-plugin.js';
|
|
6
6
|
import { getCodeFixesAtPosition } from './feature/code-fix.js';
|
|
7
7
|
import { getCompletionEntryDetails, getCompletionsAtPosition } from './feature/completion.js';
|
|
8
|
+
import { getDefinitionAndBoundSpan } from './feature/definition-and-bound-span.js';
|
|
8
9
|
import { getApplicableRefactors, getEditsForRefactor } from './feature/refactor.js';
|
|
9
10
|
import { getSemanticDiagnostics } from './feature/semantic-diagnostic.js';
|
|
10
11
|
import { getSyntacticDiagnostics } from './feature/syntactic-diagnostic.js';
|
|
@@ -50,6 +51,7 @@ export function proxyLanguageService(
|
|
|
50
51
|
proxy.getCompletionsAtPosition = getCompletionsAtPosition(languageService, config);
|
|
51
52
|
proxy.getCompletionEntryDetails = getCompletionEntryDetails(languageService, resolver, config);
|
|
52
53
|
proxy.getCodeFixesAtPosition = getCodeFixesAtPosition(language, languageService, project, resolver, config);
|
|
54
|
+
proxy.getDefinitionAndBoundSpan = getDefinitionAndBoundSpan(language, languageService);
|
|
53
55
|
|
|
54
56
|
return proxy;
|
|
55
57
|
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { Resolver } from '@css-modules-kit/core';
|
|
2
|
+
import type { Language } from '@volar/language-core';
|
|
3
|
+
import type ts from 'typescript';
|
|
4
|
+
import { CMK_DATA_KEY, isCSSModuleScript } from '../language-plugin.js';
|
|
5
|
+
import type {
|
|
6
|
+
CSSModulesKitDocumentLinkHandlerResponse,
|
|
7
|
+
CSSModulesKitDocumentLinkRequest,
|
|
8
|
+
DocumentLink,
|
|
9
|
+
} from '../type.js';
|
|
10
|
+
import { getConfiguredProjectForFile } from '../util.js';
|
|
11
|
+
|
|
12
|
+
export function createDocumentLinkHandler(
|
|
13
|
+
projectService: ts.server.ProjectService,
|
|
14
|
+
projectToLanguage: WeakMap<ts.server.Project, Language<string>>,
|
|
15
|
+
resolver: Resolver,
|
|
16
|
+
) {
|
|
17
|
+
return (request: CSSModulesKitDocumentLinkRequest): CSSModulesKitDocumentLinkHandlerResponse => {
|
|
18
|
+
const { fileName } = request.arguments;
|
|
19
|
+
const project = getConfiguredProjectForFile(projectService, fileName);
|
|
20
|
+
if (!project) return {};
|
|
21
|
+
const language = projectToLanguage.get(project);
|
|
22
|
+
if (!language) return {};
|
|
23
|
+
const script = language.scripts.get(fileName);
|
|
24
|
+
const links: DocumentLink[] = [];
|
|
25
|
+
if (isCSSModuleScript(script)) {
|
|
26
|
+
const { tokenImporters } = script.generated.root[CMK_DATA_KEY].cssModule;
|
|
27
|
+
for (const { from, fromLoc } of tokenImporters) {
|
|
28
|
+
const resolved = resolver(from, { request: fileName });
|
|
29
|
+
if (!resolved) continue;
|
|
30
|
+
links.push({
|
|
31
|
+
fileName: resolved,
|
|
32
|
+
textSpan: { start: fromLoc.start.offset, length: fromLoc.end.offset - fromLoc.start.offset },
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return { response: { result: links } };
|
|
37
|
+
};
|
|
38
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import ts from 'typescript';
|
|
2
|
+
import type { CSSModulesKitRenameHandlerResponse, CSSModulesKitRenameRequest } from '../type.js';
|
|
3
|
+
import { getConfiguredProjectForFile } from '../util.js';
|
|
4
|
+
|
|
5
|
+
export function createRenameHandler(projectService: ts.server.ProjectService) {
|
|
6
|
+
return (request: CSSModulesKitRenameRequest): CSSModulesKitRenameHandlerResponse => {
|
|
7
|
+
const { fileName, position } = request.arguments;
|
|
8
|
+
const project = getConfiguredProjectForFile(projectService, fileName);
|
|
9
|
+
if (!project) return {};
|
|
10
|
+
const languageService = project.getLanguageService();
|
|
11
|
+
const preference = project.projectService.getPreferences(ts.server.toNormalizedPath(fileName));
|
|
12
|
+
const result = languageService.findRenameLocations(fileName, position, false, false, preference);
|
|
13
|
+
return { response: { result } };
|
|
14
|
+
};
|
|
15
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import ts from 'typescript';
|
|
2
|
+
import type { CSSModulesKitRenameInfoHandlerResponse, CSSModulesKitRenameInfoRequest } from '../type.js';
|
|
3
|
+
import { getConfiguredProjectForFile } from '../util.js';
|
|
4
|
+
|
|
5
|
+
export function createRenameInfoHandler(projectService: ts.server.ProjectService) {
|
|
6
|
+
return (request: CSSModulesKitRenameInfoRequest): CSSModulesKitRenameInfoHandlerResponse => {
|
|
7
|
+
const { fileName, position } = request.arguments;
|
|
8
|
+
const project = getConfiguredProjectForFile(projectService, fileName);
|
|
9
|
+
if (!project) return {};
|
|
10
|
+
const languageService = project.getLanguageService();
|
|
11
|
+
const preference = project.projectService.getPreferences(ts.server.toNormalizedPath(fileName));
|
|
12
|
+
const result = languageService.getRenameInfo(fileName, position, preference);
|
|
13
|
+
return { response: { result } };
|
|
14
|
+
};
|
|
15
|
+
}
|
package/src/type.ts
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type ts from 'typescript';
|
|
2
|
+
|
|
3
|
+
export interface CSSModulesKitRenameRequest extends ts.server.protocol.Request {
|
|
4
|
+
command: '_css-modules-kit:rename';
|
|
5
|
+
arguments: { fileName: string; position: number };
|
|
6
|
+
}
|
|
7
|
+
export interface CSSModulesKitRenameHandlerResponse extends ts.server.HandlerResponse {
|
|
8
|
+
response?: { result: ReturnType<ts.LanguageService['findRenameLocations']> };
|
|
9
|
+
}
|
|
10
|
+
export interface CSSModulesKitRenameResponse extends ts.server.protocol.Response {
|
|
11
|
+
command: '_css-modules-kit:rename';
|
|
12
|
+
readonly body: CSSModulesKitRenameHandlerResponse['response'];
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface CSSModulesKitRenameInfoRequest extends ts.server.protocol.Request {
|
|
16
|
+
command: '_css-modules-kit:renameInfo';
|
|
17
|
+
arguments: { fileName: string; position: number };
|
|
18
|
+
}
|
|
19
|
+
export interface CSSModulesKitRenameInfoHandlerResponse extends ts.server.HandlerResponse {
|
|
20
|
+
response?: { result: ReturnType<ts.LanguageService['getRenameInfo']> };
|
|
21
|
+
}
|
|
22
|
+
export interface CSSModulesKitRenameInfoResponse extends ts.server.protocol.Response {
|
|
23
|
+
command: '_css-modules-kit:renameInfo';
|
|
24
|
+
readonly body: CSSModulesKitRenameInfoHandlerResponse['response'];
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface DocumentLink {
|
|
28
|
+
fileName: string;
|
|
29
|
+
textSpan: ts.TextSpan;
|
|
30
|
+
}
|
|
31
|
+
export interface CSSModulesKitDocumentLinkRequest extends ts.server.protocol.Request {
|
|
32
|
+
command: '_css-modules-kit:documentLink';
|
|
33
|
+
arguments: { fileName: string };
|
|
34
|
+
}
|
|
35
|
+
export interface CSSModulesKitDocumentLinkHandlerResponse extends ts.server.HandlerResponse {
|
|
36
|
+
response?: { result: DocumentLink[] };
|
|
37
|
+
}
|
|
38
|
+
export interface CSSModulesKitDocumentLinkResponse extends ts.server.protocol.Response {
|
|
39
|
+
command: '_css-modules-kit:documentLink';
|
|
40
|
+
readonly body: CSSModulesKitDocumentLinkHandlerResponse['response'];
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
declare module 'typescript' {
|
|
44
|
+
// eslint-disable-next-line @typescript-eslint/no-namespace
|
|
45
|
+
namespace server {
|
|
46
|
+
export interface Session {
|
|
47
|
+
addProtocolHandler(
|
|
48
|
+
command: '_css-modules-kit:rename',
|
|
49
|
+
handler: (request: CSSModulesKitRenameRequest) => CSSModulesKitRenameHandlerResponse,
|
|
50
|
+
): void;
|
|
51
|
+
addProtocolHandler(
|
|
52
|
+
command: '_css-modules-kit:renameInfo',
|
|
53
|
+
handler: (request: CSSModulesKitRenameInfoRequest) => CSSModulesKitRenameInfoHandlerResponse,
|
|
54
|
+
): void;
|
|
55
|
+
addProtocolHandler(
|
|
56
|
+
command: '_css-modules-kit:documentLink',
|
|
57
|
+
handler: (request: CSSModulesKitDocumentLinkRequest) => CSSModulesKitDocumentLinkHandlerResponse,
|
|
58
|
+
): void;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
package/src/util.ts
CHANGED
|
@@ -56,3 +56,12 @@ export function convertDefaultImportsToNamespaceImports(
|
|
|
56
56
|
}
|
|
57
57
|
}
|
|
58
58
|
}
|
|
59
|
+
|
|
60
|
+
export function getConfiguredProjectForFile(
|
|
61
|
+
projectService: ts.server.ProjectService,
|
|
62
|
+
fileName: string,
|
|
63
|
+
): ts.server.ConfiguredProject | undefined {
|
|
64
|
+
const project = projectService.getDefaultProjectForFile(ts.server.toNormalizedPath(fileName), false);
|
|
65
|
+
if (!project || project.projectKind !== ts.server.ProjectKind.Configured) return;
|
|
66
|
+
return project as ts.server.ConfiguredProject;
|
|
67
|
+
}
|