@css-modules-kit/ts-plugin 0.3.0 → 0.5.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.
Files changed (48) hide show
  1. package/dist/index.d.ts +2 -1
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +32 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/language-plugin.js +1 -1
  6. package/dist/language-plugin.js.map +1 -1
  7. package/dist/language-service/feature/code-fix.d.ts +1 -1
  8. package/dist/language-service/feature/code-fix.d.ts.map +1 -1
  9. package/dist/language-service/feature/code-fix.js +26 -20
  10. package/dist/language-service/feature/code-fix.js.map +1 -1
  11. package/dist/language-service/feature/semantic-diagnostic.d.ts +2 -2
  12. package/dist/language-service/feature/semantic-diagnostic.d.ts.map +1 -1
  13. package/dist/language-service/feature/semantic-diagnostic.js +2 -2
  14. package/dist/language-service/feature/semantic-diagnostic.js.map +1 -1
  15. package/dist/language-service/proxy.d.ts.map +1 -1
  16. package/dist/language-service/proxy.js +1 -1
  17. package/dist/language-service/proxy.js.map +1 -1
  18. package/dist/protocol-handler/documentLink.d.ts +6 -0
  19. package/dist/protocol-handler/documentLink.d.ts.map +1 -0
  20. package/dist/protocol-handler/documentLink.js +32 -0
  21. package/dist/protocol-handler/documentLink.js.map +1 -0
  22. package/dist/protocol-handler/rename.d.ts +4 -0
  23. package/dist/protocol-handler/rename.d.ts.map +1 -0
  24. package/dist/protocol-handler/rename.js +21 -0
  25. package/dist/protocol-handler/rename.js.map +1 -0
  26. package/dist/protocol-handler/renameInfo.d.ts +4 -0
  27. package/dist/protocol-handler/renameInfo.d.ts.map +1 -0
  28. package/dist/protocol-handler/renameInfo.js +21 -0
  29. package/dist/protocol-handler/renameInfo.js.map +1 -0
  30. package/dist/type.d.ts +62 -0
  31. package/dist/type.d.ts.map +1 -0
  32. package/dist/type.js +3 -0
  33. package/dist/type.js.map +1 -0
  34. package/dist/util.d.ts +1 -0
  35. package/dist/util.d.ts.map +1 -1
  36. package/dist/util.js +7 -0
  37. package/dist/util.js.map +1 -1
  38. package/package.json +12 -2
  39. package/src/index.ts +44 -0
  40. package/src/language-plugin.ts +1 -1
  41. package/src/language-service/feature/code-fix.ts +25 -20
  42. package/src/language-service/feature/semantic-diagnostic.ts +3 -2
  43. package/src/language-service/proxy.ts +1 -0
  44. package/src/protocol-handler/documentLink.ts +38 -0
  45. package/src/protocol-handler/rename.ts +15 -0
  46. package/src/protocol-handler/renameInfo.ts +15 -0
  47. package/src/type.ts +61 -0
  48. package/src/util.ts +9 -0
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
- declare const plugin: import("typescript").server.PluginModuleFactory;
1
+ import type ts from 'typescript';
2
+ declare const plugin: ts.server.PluginModuleFactory;
2
3
  export = plugin;
3
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAOA,QAAA,MAAM,MAAM,iDA0DV,CAAC;AAEH,SAAS,MAAM,CAAC"}
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`);
@@ -48,7 +52,35 @@ const plugin = (0, createLanguageServicePlugin_js_1.createLanguageServicePlugin)
48
52
  return {
49
53
  languagePlugins: [(0, language_plugin_js_1.createCSSLanguagePlugin)(resolver, matchesPattern, config)],
50
54
  setup: (language) => {
55
+ projectToLanguage.set(info.project, language);
51
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
+ }
52
84
  },
53
85
  };
54
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;AAClE,oHAA8G;AAC9G,6DAA+D;AAC/D,0DAAmE;AAEnE,MAAM,MAAM,GAAG,IAAA,4DAA2B,EAAC,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE;IACtD,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,KAAK,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC;QAClE,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;QACxG,OAAO,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC;IACjC,CAAC;IAED,IAAI,MAAiB,CAAC;IACtB,IAAI,CAAC;QACH,MAAM,GAAG,IAAA,qBAAc,EAAC,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;QACvD,2BAA2B;QAC3B,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CACrC,4DAA4D,MAAM,CAAC,cAAc,GAAG,CACrF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,uDAAuD;QACvD,IAAI,KAAK,YAAY,gCAAyB,EAAE,CAAC;YAC/C,OAAO,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC;QACjC,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,GAAG,8DAA8D,CAAC;YACzE,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;gBAC3B,GAAG,IAAI,OAAO,KAAK,CAAC,OAAO,EAAE,CAAC;gBAC9B,GAAG,IAAI,KAAK,KAAK,CAAC,KAAK,EAAE,CAAC;YAC5B,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC7C,OAAO,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC;QACjC,CAAC;IACH,CAAC;IAED,gGAAgG;IAChG,6FAA6F;IAC7F,iGAAiG;IACjG,MAAM,sBAAsB,GAAG,IAAI,CAAC,mBAAmB,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC9G,IAAI,CAAC,mBAAmB,CAAC,sBAAsB,GAAG,GAAG,EAAE;QACrD,MAAM,QAAQ,GAAG,EAAE,GAAG,sBAAsB,EAAE,EAAE,CAAC;QACjD,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACtB,gEAAgE;YAChE,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,MAAM,CAAC,SAAS,CAAC,CAAC;QAClF,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC;IAEF,MAAM,qBAAqB,GAAG,IAAI,CAAC,mBAAmB,CAAC,wBAAwB,EAAE,EAAE,CAAC;IACpF,MAAM,QAAQ,GAAG,IAAA,qBAAc,EAAC,MAAM,CAAC,eAAe,EAAE,qBAAqB,CAAC,CAAC;IAC/E,MAAM,cAAc,GAAG,IAAA,2BAAoB,EAAC,MAAM,CAAC,CAAC;IAEpD,OAAO;QACL,eAAe,EAAE,CAAC,IAAA,4CAAuB,EAAC,QAAQ,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC;QAC5E,KAAK,EAAE,CAAC,QAAQ,EAAE,EAAE;YAClB,IAAI,CAAC,eAAe,GAAG,IAAA,+BAAoB,EACzC,QAAQ,EACR,IAAI,CAAC,eAAe,EACpB,IAAI,CAAC,OAAO,EACZ,QAAQ,EACR,cAAc,EACd,MAAM,CACP,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,iBAAS,MAAM,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -43,7 +43,7 @@ function createCSSLanguagePlugin(resolver, matchesPattern, config) {
43
43
  let { text, mapping, linkedCodeMapping } = (0, core_1.createDts)(cssModule, { resolver, matchesPattern }, { ...config, forTsPlugin: true });
44
44
  return {
45
45
  id: 'main',
46
- languageId: exports.LANGUAGE_ID,
46
+ languageId: 'typescript',
47
47
  snapshot: {
48
48
  getText: (start, end) => text.slice(start, end),
49
49
  getLength: () => text.length,
@@ -1 +1 @@
1
- {"version":3,"file":"language-plugin.js","sourceRoot":"","sources":["../src/language-plugin.ts"],"names":[],"mappings":"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"}
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 PROPERTY_DOES_NOT_EXIST_ERROR_CODE = 2339;
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;AAK5B,eAAO,MAAM,2BAA2B,OAAO,CAAC;AAChD,eAAO,MAAM,kCAAkC,OAAO,CAAC;AAEvD,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,CAmC9C"}
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.PROPERTY_DOES_NOT_EXIST_ERROR_CODE = exports.CANNOT_FIND_NAME_ERROR_CODE = void 0;
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.PROPERTY_DOES_NOT_EXIST_ERROR_CODE = 2339;
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
- if ((0, core_1.isComponentFileName)(fileName)) {
24
- // If a user is trying to use a non-existent token (e.g. `styles.nonExistToken`), provide a code fix to add the token.
25
- if (errorCodes.includes(exports.PROPERTY_DOES_NOT_EXIST_ERROR_CODE)) {
26
- const tokenConsumer = getTokenConsumerAtPosition(fileName, start, language, languageService, project);
27
- if (tokenConsumer) {
28
- prior.push({
29
- fixName: 'fixMissingCSSRule',
30
- description: `Add missing CSS rule '.${tokenConsumer.tokenName}'`,
31
- changes: [createInsertRuleFileChange(tokenConsumer.from, tokenConsumer.tokenName, language)],
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, language, languageService, project) {
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
- const definitions = languageService.getDefinitionAtPosition(fileName, expression.getStart());
74
- if (definitions && definitions[0]) {
75
- const script = language.scripts.get(definitions[0].fileName);
76
- if ((0, language_plugin_js_1.isCSSModuleScript)(script)) {
77
- return { tokenName: propertyAccessExpression.name.text, from: definitions[0].fileName };
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":"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"}
1
+ {"version":3,"file":"code-fix.js","sourceRoot":"","sources":["../../../src/language-service/feature/code-fix.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import type { CSSModule, ExportBuilder, MatchesPattern, Resolver } from '@css-modules-kit/core';
1
+ import type { CMKConfig, CSSModule, ExportBuilder, MatchesPattern, Resolver } from '@css-modules-kit/core';
2
2
  import type { Language } from '@volar/language-core';
3
3
  import type ts from 'typescript';
4
- export declare function getSemanticDiagnostics(language: Language<string>, languageService: ts.LanguageService, exportBuilder: ExportBuilder, resolver: Resolver, matchesPattern: MatchesPattern, getCSSModule: (path: string) => CSSModule | undefined): ts.LanguageService['getSemanticDiagnostics'];
4
+ export declare function getSemanticDiagnostics(language: Language<string>, languageService: ts.LanguageService, exportBuilder: ExportBuilder, resolver: Resolver, matchesPattern: MatchesPattern, getCSSModule: (path: string) => CSSModule | undefined, config: CMKConfig): ts.LanguageService['getSemanticDiagnostics'];
5
5
  //# sourceMappingURL=semantic-diagnostic.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"semantic-diagnostic.d.ts","sourceRoot":"","sources":["../../../src/language-service/feature/semantic-diagnostic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEhG,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAIjC,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,EAC1B,eAAe,EAAE,EAAE,CAAC,eAAe,EACnC,aAAa,EAAE,aAAa,EAC5B,QAAQ,EAAE,QAAQ,EAClB,cAAc,EAAE,cAAc,EAC9B,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,SAAS,GAAG,SAAS,GACpD,EAAE,CAAC,eAAe,CAAC,wBAAwB,CAAC,CAkB9C"}
1
+ {"version":3,"file":"semantic-diagnostic.d.ts","sourceRoot":"","sources":["../../../src/language-service/feature/semantic-diagnostic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAE3G,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAIjC,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,EAC1B,eAAe,EAAE,EAAE,CAAC,eAAe,EACnC,aAAa,EAAE,aAAa,EAC5B,QAAQ,EAAE,QAAQ,EAClB,cAAc,EAAE,cAAc,EAC9B,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,SAAS,GAAG,SAAS,EACrD,MAAM,EAAE,SAAS,GAChB,EAAE,CAAC,eAAe,CAAC,wBAAwB,CAAC,CAkB9C"}
@@ -4,7 +4,7 @@ exports.getSemanticDiagnostics = getSemanticDiagnostics;
4
4
  const core_1 = require("@css-modules-kit/core");
5
5
  const language_plugin_js_1 = require("../../language-plugin.js");
6
6
  // eslint-disable-next-line max-params
7
- function getSemanticDiagnostics(language, languageService, exportBuilder, resolver, matchesPattern, getCSSModule) {
7
+ function getSemanticDiagnostics(language, languageService, exportBuilder, resolver, matchesPattern, getCSSModule, config) {
8
8
  return (fileName) => {
9
9
  const prior = languageService.getSemanticDiagnostics(fileName);
10
10
  const script = language.scripts.get(fileName);
@@ -13,7 +13,7 @@ function getSemanticDiagnostics(language, languageService, exportBuilder, resolv
13
13
  const cssModule = virtualCode[language_plugin_js_1.CMK_DATA_KEY].cssModule;
14
14
  // Clear cache to update export records for all files
15
15
  exportBuilder.clearCache();
16
- const diagnostics = (0, core_1.checkCSSModule)(cssModule, exportBuilder, matchesPattern, resolver, getCSSModule);
16
+ const diagnostics = (0, core_1.checkCSSModule)(cssModule, config, exportBuilder, matchesPattern, resolver, getCSSModule);
17
17
  const sourceFile = languageService.getProgram().getSourceFile(fileName);
18
18
  const tsDiagnostics = diagnostics.map((diagnostic) => (0, core_1.convertDiagnostic)(diagnostic, () => sourceFile));
19
19
  prior.push(...tsDiagnostics);
@@ -1 +1 @@
1
- {"version":3,"file":"semantic-diagnostic.js","sourceRoot":"","sources":["../../../src/language-service/feature/semantic-diagnostic.ts"],"names":[],"mappings":";;AAOA,wDAyBC;AA/BD,gDAA0E;AAG1E,iEAA2E;AAE3E,sCAAsC;AACtC,SAAgB,sBAAsB,CACpC,QAA0B,EAC1B,eAAmC,EACnC,aAA4B,EAC5B,QAAkB,EAClB,cAA8B,EAC9B,YAAqD;IAErD,OAAO,CAAC,QAAgB,EAAE,EAAE;QAC1B,MAAM,KAAK,GAAG,eAAe,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC;QAC/D,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC9C,IAAI,IAAA,sCAAiB,EAAC,MAAM,CAAC,EAAE,CAAC;YAC9B,MAAM,WAAW,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC;YAC1C,MAAM,SAAS,GAAG,WAAW,CAAC,iCAAY,CAAC,CAAC,SAAS,CAAC;YAEtD,qDAAqD;YACrD,aAAa,CAAC,UAAU,EAAE,CAAC;YAE3B,MAAM,WAAW,GAAG,IAAA,qBAAc,EAAC,SAAS,EAAE,aAAa,EAAE,cAAc,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;YACrG,MAAM,UAAU,GAAG,eAAe,CAAC,UAAU,EAAG,CAAC,aAAa,CAAC,QAAQ,CAAE,CAAC;YAC1E,MAAM,aAAa,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,IAAA,wBAAiB,EAAC,UAAU,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;YACvG,KAAK,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC;QAC/B,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"semantic-diagnostic.js","sourceRoot":"","sources":["../../../src/language-service/feature/semantic-diagnostic.ts"],"names":[],"mappings":";;AAOA,wDA0BC;AAhCD,gDAA0E;AAG1E,iEAA2E;AAE3E,sCAAsC;AACtC,SAAgB,sBAAsB,CACpC,QAA0B,EAC1B,eAAmC,EACnC,aAA4B,EAC5B,QAAkB,EAClB,cAA8B,EAC9B,YAAqD,EACrD,MAAiB;IAEjB,OAAO,CAAC,QAAgB,EAAE,EAAE;QAC1B,MAAM,KAAK,GAAG,eAAe,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC;QAC/D,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC9C,IAAI,IAAA,sCAAiB,EAAC,MAAM,CAAC,EAAE,CAAC;YAC9B,MAAM,WAAW,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC;YAC1C,MAAM,SAAS,GAAG,WAAW,CAAC,iCAAY,CAAC,CAAC,SAAS,CAAC;YAEtD,qDAAqD;YACrD,aAAa,CAAC,UAAU,EAAE,CAAC;YAE3B,MAAM,WAAW,GAAG,IAAA,qBAAc,EAAC,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;YAC7G,MAAM,UAAU,GAAG,eAAe,CAAC,UAAU,EAAG,CAAC,aAAa,CAAC,QAAQ,CAAE,CAAC;YAC1E,MAAM,aAAa,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,IAAA,wBAAiB,EAAC,UAAU,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;YACvG,KAAK,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC;QAC/B,CAAC;QACD,OAAO,KAAK,CAAC;IACf,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;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"}
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,CAqCpB"}
@@ -27,7 +27,7 @@ function proxyLanguageService(language, languageService, project, resolver, matc
27
27
  };
28
28
  const exportBuilder = (0, core_1.createExportBuilder)({ getCSSModule, resolver, matchesPattern });
29
29
  proxy.getSyntacticDiagnostics = (0, syntactic_diagnostic_js_1.getSyntacticDiagnostics)(language, languageService);
30
- proxy.getSemanticDiagnostics = (0, semantic_diagnostic_js_1.getSemanticDiagnostics)(language, languageService, exportBuilder, resolver, matchesPattern, getCSSModule);
30
+ proxy.getSemanticDiagnostics = (0, semantic_diagnostic_js_1.getSemanticDiagnostics)(language, languageService, exportBuilder, resolver, matchesPattern, getCSSModule, config);
31
31
  proxy.getApplicableRefactors = (0, refactor_js_1.getApplicableRefactors)(languageService, project);
32
32
  proxy.getEditsForRefactor = (0, refactor_js_1.getEditsForRefactor)(languageService);
33
33
  proxy.getCompletionsAtPosition = (0, completion_js_1.getCompletionsAtPosition)(languageService, config);
@@ -1 +1 @@
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"}
1
+ {"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../src/language-service/proxy.ts"],"names":[],"mappings":";;AAaA,oDA4CC;AAxDD,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,EACZ,MAAM,CACP,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
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=type.js.map
@@ -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
@@ -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;AAzDD,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"}
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.3.0",
4
+ "version": "0.5.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.4.0"
52
+ "@css-modules-kit/core": "^0.5.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) {
@@ -53,6 +60,7 @@ const plugin = createLanguageServicePlugin((ts, info) => {
53
60
  return {
54
61
  languagePlugins: [createCSSLanguagePlugin(resolver, matchesPattern, config)],
55
62
  setup: (language) => {
63
+ projectToLanguage.set(info.project, language);
56
64
  info.languageService = proxyLanguageService(
57
65
  language,
58
66
  info.languageService,
@@ -61,6 +69,42 @@ const plugin = createLanguageServicePlugin((ts, info) => {
61
69
  matchesPattern,
62
70
  config,
63
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
+ }
64
108
  },
65
109
  };
66
110
  });
@@ -61,7 +61,7 @@ export function createCSSLanguagePlugin(
61
61
  );
62
62
  return {
63
63
  id: 'main',
64
- languageId: LANGUAGE_ID,
64
+ languageId: 'typescript',
65
65
  snapshot: {
66
66
  getText: (start, end) => text.slice(start, end),
67
67
  getLength: () => text.length,
@@ -1,13 +1,12 @@
1
1
  import type { CMKConfig, Resolver } from '@css-modules-kit/core';
2
- import { isComponentFileName, isCSSModuleFile } from '@css-modules-kit/core';
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 PROPERTY_DOES_NOT_EXIST_ERROR_CODE = 2339;
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
- if (isComponentFileName(fileName)) {
38
- // If a user is trying to use a non-existent token (e.g. `styles.nonExistToken`), provide a code fix to add the token.
39
- if (errorCodes.includes(PROPERTY_DOES_NOT_EXIST_ERROR_CODE)) {
40
- const tokenConsumer = getTokenConsumerAtPosition(fileName, start, language, languageService, project);
41
- if (tokenConsumer) {
42
- prior.push({
43
- fixName: 'fixMissingCSSRule',
44
- description: `Add missing CSS rule '.${tokenConsumer.tokenName}'`,
45
- changes: [createInsertRuleFileChange(tokenConsumer.from, tokenConsumer.tokenName, language)],
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
- const definitions = languageService.getDefinitionAtPosition(fileName, expression.getStart());
103
- if (definitions && definitions[0]) {
104
- const script = language.scripts.get(definitions[0].fileName);
105
- if (isCSSModuleScript(script)) {
106
- return { tokenName: propertyAccessExpression.name.text, from: definitions[0].fileName };
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;
@@ -1,4 +1,4 @@
1
- import type { CSSModule, ExportBuilder, MatchesPattern, Resolver } from '@css-modules-kit/core';
1
+ import type { CMKConfig, CSSModule, ExportBuilder, MatchesPattern, Resolver } from '@css-modules-kit/core';
2
2
  import { checkCSSModule, convertDiagnostic } from '@css-modules-kit/core';
3
3
  import type { Language } from '@volar/language-core';
4
4
  import type ts from 'typescript';
@@ -12,6 +12,7 @@ export function getSemanticDiagnostics(
12
12
  resolver: Resolver,
13
13
  matchesPattern: MatchesPattern,
14
14
  getCSSModule: (path: string) => CSSModule | undefined,
15
+ config: CMKConfig,
15
16
  ): ts.LanguageService['getSemanticDiagnostics'] {
16
17
  return (fileName: string) => {
17
18
  const prior = languageService.getSemanticDiagnostics(fileName);
@@ -23,7 +24,7 @@ export function getSemanticDiagnostics(
23
24
  // Clear cache to update export records for all files
24
25
  exportBuilder.clearCache();
25
26
 
26
- const diagnostics = checkCSSModule(cssModule, exportBuilder, matchesPattern, resolver, getCSSModule);
27
+ const diagnostics = checkCSSModule(cssModule, config, exportBuilder, matchesPattern, resolver, getCSSModule);
27
28
  const sourceFile = languageService.getProgram()!.getSourceFile(fileName)!;
28
29
  const tsDiagnostics = diagnostics.map((diagnostic) => convertDiagnostic(diagnostic, () => sourceFile));
29
30
  prior.push(...tsDiagnostics);
@@ -45,6 +45,7 @@ export function proxyLanguageService(
45
45
  resolver,
46
46
  matchesPattern,
47
47
  getCSSModule,
48
+ config,
48
49
  );
49
50
  proxy.getApplicableRefactors = getApplicableRefactors(languageService, project);
50
51
  proxy.getEditsForRefactor = getEditsForRefactor(languageService);
@@ -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
+ }