@css-modules-kit/core 0.8.0 → 0.9.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.
@@ -85,14 +85,24 @@ export function parseRule(rule) {
85
85
  column: rule.source.start.column + className.source.start.column,
86
86
  offset: rule.source.start.offset + className.sourceIndex + 1,
87
87
  };
88
+ /**
89
+ * When there is a selector like `.\31 backslash`, `className.value` becomes `"1backslash"`.
90
+ * In other words, it is the string after escape sequences have been interpreted.
91
+ * However, here we need the raw string as written in the CSS source code.
92
+ * So we use `className.toString()`.
93
+ *
94
+ * The return value of `className.toString()` may contain leading dots and spaces like `" .1backslash"`.
95
+ * Therefore, we remove the leading spaces and dot with a regular expression.
96
+ */
97
+ const rawClassName = className.toString().replace(/^\s*\./u, '');
88
98
  const end = {
89
99
  // The end line is always the same as the start line, as a class selector cannot break in the middle.
90
100
  line: start.line,
91
- column: start.column + className.value.length,
92
- offset: start.offset + className.value.length,
101
+ column: start.column + rawClassName.length,
102
+ offset: start.offset + rawClassName.length,
93
103
  };
94
104
  return {
95
- name: className.value,
105
+ name: rawClassName,
96
106
  loc: { start, end },
97
107
  declarationLoc: { start: rule.source.start, end: rule.positionBy({ index: rule.toString().length }) },
98
108
  };
@@ -1 +1 @@
1
- {"version":3,"file":"rule-parser.js","sourceRoot":"","sources":["../../src/parser/rule-parser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rule-parser.js","sourceRoot":"","sources":["../../src/parser/rule-parser.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../src/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,KAAK,EAAE,QAAQ,EAAmB,MAAM,WAAW,CAAC;AAG3D,wBAAgB,cAAc,CAC5B,eAAe,EAAE,eAAe,EAChC,qBAAqB,EAAE,EAAE,CAAC,qBAAqB,GAAG,SAAS,GAC1D,QAAQ,CAyBV"}
1
+ {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../src/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,KAAK,EAAE,QAAQ,EAAmB,MAAM,WAAW,CAAC;AAG3D,wBAAgB,cAAc,CAC5B,eAAe,EAAE,eAAe,EAChC,qBAAqB,EAAE,EAAE,CAAC,qBAAqB,GAAG,SAAS,GAC1D,QAAQ,CAwBV"}
package/dist/resolver.js CHANGED
@@ -7,16 +7,15 @@ export function createResolver(compilerOptions, moduleResolutionCache) {
7
7
  const host = {
8
8
  ...ts.sys,
9
9
  fileExists: (fileName) => {
10
- if (fileName.endsWith('.module.d.css.ts')) {
11
- return ts.sys.fileExists(fileName.replace(/\.module\.d\.css\.ts$/u, '.module.css'));
10
+ if (fileName.endsWith('.d.css.ts')) {
11
+ return ts.sys.fileExists(fileName.replace(/\.d\.css\.ts$/u, '.css'));
12
12
  }
13
13
  return ts.sys.fileExists(fileName);
14
14
  },
15
15
  };
16
16
  const { resolvedModule } = ts.resolveModuleName(specifier, options.request, compilerOptions, host, moduleResolutionCache);
17
17
  if (resolvedModule) {
18
- // TODO: Logging that the paths is used.
19
- return resolvedModule.resolvedFileName.replace(/\.module\.d\.css\.ts$/u, '.module.css');
18
+ return resolvedModule.resolvedFileName.replace(/\.d\.css\.ts$/u, '.css');
20
19
  }
21
20
  return undefined;
22
21
  };
@@ -1 +1 @@
1
- {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../src/resolver.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAE3C,MAAM,UAAU,cAAc,CAC5B,eAAgC,EAChC,qBAA2D;IAE3D,OAAO,CAAC,SAAiB,EAAE,OAAwB,EAAE,EAAE;QACrD,IAAI,cAAc,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAC;QAChD,MAAM,IAAI,GAA4B;YACpC,GAAG,EAAE,CAAC,GAAG;YACT,UAAU,EAAE,CAAC,QAAQ,EAAE,EAAE;gBACvB,IAAI,QAAQ,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;oBAC1C,OAAO,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,wBAAwB,EAAE,aAAa,CAAC,CAAC,CAAC;gBACtF,CAAC;gBACD,OAAO,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YACrC,CAAC;SACF,CAAC;QACF,MAAM,EAAE,cAAc,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAC7C,SAAS,EACT,OAAO,CAAC,OAAO,EACf,eAAe,EACf,IAAI,EACJ,qBAAqB,CACtB,CAAC;QACF,IAAI,cAAc,EAAE,CAAC;YACnB,wCAAwC;YACxC,OAAO,cAAc,CAAC,gBAAgB,CAAC,OAAO,CAAC,wBAAwB,EAAE,aAAa,CAAC,CAAC;QAC1F,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../src/resolver.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAE3C,MAAM,UAAU,cAAc,CAC5B,eAAgC,EAChC,qBAA2D;IAE3D,OAAO,CAAC,SAAiB,EAAE,OAAwB,EAAE,EAAE;QACrD,IAAI,cAAc,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAC;QAChD,MAAM,IAAI,GAA4B;YACpC,GAAG,EAAE,CAAC,GAAG;YACT,UAAU,EAAE,CAAC,QAAQ,EAAE,EAAE;gBACvB,IAAI,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;oBACnC,OAAO,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC,CAAC;gBACvE,CAAC;gBACD,OAAO,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YACrC,CAAC;SACF,CAAC;QACF,MAAM,EAAE,cAAc,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAC7C,SAAS,EACT,OAAO,CAAC,OAAO,EACf,eAAe,EACf,IAAI,EACJ,qBAAqB,CACtB,CAAC;QACF,IAAI,cAAc,EAAE,CAAC;YACnB,OAAO,cAAc,CAAC,gBAAgB,CAAC,OAAO,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;QAC3E,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;AACJ,CAAC"}
package/dist/util.d.ts CHANGED
@@ -1,5 +1,16 @@
1
1
  export declare function isPosixRelativePath(path: string): boolean;
2
- export declare function isValidAsJSIdentifier(name: string): boolean;
2
+ /** The type of token name violation. */
3
+ export type TokenNameViolation = 'invalid-js-identifier' | 'proto-not-allowed' | 'default-not-allowed' | 'backslash-not-allowed';
4
+ export interface ValidateTokenNameOptions {
5
+ namedExports: boolean;
6
+ }
7
+ /**
8
+ * Validates a token name and returns the violation if any.
9
+ * @param name The token name to validate.
10
+ * @param options The validation options.
11
+ * @returns The violation, or `undefined` if the name is valid.
12
+ */
13
+ export declare function validateTokenName(name: string, options: ValidateTokenNameOptions): TokenNameViolation | undefined;
3
14
  export declare function findUsedTokenNames(componentText: string): Set<string>;
4
15
  export declare function isURLSpecifier(specifier: string): boolean;
5
16
  //# sourceMappingURL=util.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEzD;AAID,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE3D;AAWD,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAOrE;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAEzD"}
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEzD;AAID,wCAAwC;AACxC,MAAM,MAAM,kBAAkB,GAC1B,uBAAuB,GACvB,mBAAmB,GACnB,qBAAqB,GACrB,uBAAuB,CAAC;AAE5B,MAAM,WAAW,wBAAwB;IACvC,YAAY,EAAE,OAAO,CAAC;CACvB;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,wBAAwB,GAAG,kBAAkB,GAAG,SAAS,CASjH;AAWD,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAOrE;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAEzD"}
package/dist/util.js CHANGED
@@ -2,22 +2,40 @@ export function isPosixRelativePath(path) {
2
2
  return path.startsWith(`./`) || path.startsWith(`../`);
3
3
  }
4
4
  const JS_IDENTIFIER_PATTERN = /^[$_\p{ID_Start}][$\u200c\u200d\p{ID_Continue}]*$/u;
5
- export function isValidAsJSIdentifier(name) {
6
- return JS_IDENTIFIER_PATTERN.test(name);
5
+ /**
6
+ * Validates a token name and returns the violation if any.
7
+ * @param name The token name to validate.
8
+ * @param options The validation options.
9
+ * @returns The violation, or `undefined` if the name is valid.
10
+ */
11
+ export function validateTokenName(name, options) {
12
+ if (name === '__proto__')
13
+ return 'proto-not-allowed';
14
+ if (options.namedExports) {
15
+ if (name === 'default')
16
+ return 'default-not-allowed';
17
+ if (!JS_IDENTIFIER_PATTERN.test(name))
18
+ return 'invalid-js-identifier';
19
+ }
20
+ else {
21
+ if (name.includes('\\'))
22
+ return 'backslash-not-allowed';
23
+ }
24
+ return undefined;
7
25
  }
8
26
  /**
9
27
  * The syntax pattern for consuming tokens imported from CSS Module.
10
- * @example `styles.foo`
28
+ * @example `styles.foo`, `styles['foo']`, `styles["foo"]`
11
29
  */
12
- // TODO(#125): Support `styles['foo']` and `styles["foo"]`
13
30
  // MEMO: The `xxxStyles.foo` format is not supported, because the css module file for current component file is usually imported with `styles`.
14
31
  // It is sufficient to support only the `styles.foo` format.
15
- const TOKEN_CONSUMER_PATTERN = /styles\.([$_\p{ID_Start}][$\u200c\u200d\p{ID_Continue}]*)/gu;
32
+ const TOKEN_CONSUMER_PATTERN = /styles(?:\.([$_\p{ID_Start}][$\u200c\u200d\p{ID_Continue}]*)|\['([^']*?)'\]|\["([^"]*?)"\])/gu;
16
33
  export function findUsedTokenNames(componentText) {
17
34
  const usedClassNames = new Set();
18
- let match;
19
- while ((match = TOKEN_CONSUMER_PATTERN.exec(componentText)) !== null) {
20
- usedClassNames.add(match[1]);
35
+ for (const match of componentText.matchAll(TOKEN_CONSUMER_PATTERN)) {
36
+ const name = match[1] ?? match[2] ?? match[3];
37
+ if (name)
38
+ usedClassNames.add(name);
21
39
  }
22
40
  return usedClassNames;
23
41
  }
package/dist/util.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,qBAAqB,GAAG,oDAAoD,CAAC;AAEnF,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,OAAO,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1C,CAAC;AAED;;;GAGG;AACH,0DAA0D;AAC1D,+IAA+I;AAC/I,kEAAkE;AAClE,MAAM,sBAAsB,GAAG,6DAA6D,CAAC;AAE7F,MAAM,UAAU,kBAAkB,CAAC,aAAqB;IACtD,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;IACzC,IAAI,KAAK,CAAC;IACV,OAAO,CAAC,KAAK,GAAG,sBAAsB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACrE,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC9C,OAAO,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;AACjC,CAAC"}
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,qBAAqB,GAAG,oDAAoD,CAAC;AAanF;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,OAAiC;IAC/E,IAAI,IAAI,KAAK,WAAW;QAAE,OAAO,mBAAmB,CAAC;IACrD,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;QACzB,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,qBAAqB,CAAC;QACrD,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,uBAAuB,CAAC;IACxE,CAAC;SAAM,CAAC;QACN,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO,uBAAuB,CAAC;IAC1D,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,+IAA+I;AAC/I,kEAAkE;AAClE,MAAM,sBAAsB,GAC1B,+FAA+F,CAAC;AAElG,MAAM,UAAU,kBAAkB,CAAC,aAAqB;IACtD,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;IACzC,KAAK,MAAM,KAAK,IAAI,aAAa,CAAC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,CAAC;QACnE,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;QAC9C,IAAI,IAAI;YAAE,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC9C,OAAO,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;AACjC,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@css-modules-kit/core",
3
3
  "description": "The core of css-modules-kit",
4
- "version": "0.8.0",
4
+ "version": "0.9.0",
5
5
  "type": "module",
6
6
  "sideEffects": false,
7
7
  "repository": {
package/src/checker.ts CHANGED
@@ -10,7 +10,7 @@ import type {
10
10
  Resolver,
11
11
  TokenImporter,
12
12
  } from './type.js';
13
- import { isURLSpecifier, isValidAsJSIdentifier } from './util.js';
13
+ import { isURLSpecifier, type TokenNameViolation, validateTokenName } from './util.js';
14
14
 
15
15
  export interface CheckerArgs {
16
16
  config: CMKConfig;
@@ -20,21 +20,15 @@ export interface CheckerArgs {
20
20
  getCSSModule: (path: string) => CSSModule | undefined;
21
21
  }
22
22
 
23
- // eslint-disable-next-line complexity
24
23
  export function checkCSSModule(cssModule: CSSModule, args: CheckerArgs): Diagnostic[] {
25
24
  const { config } = args;
26
25
  const diagnostics: Diagnostic[] = [];
27
26
 
28
27
  for (const token of cssModule.localTokens) {
29
28
  // Reject special names as they may break .d.ts files
30
- if (!isValidAsJSIdentifier(token.name)) {
31
- diagnostics.push(createInvalidNameAsJSIdentifiersDiagnostic(cssModule, token.loc));
32
- }
33
- if (token.name === '__proto__') {
34
- diagnostics.push(createProtoIsNotAllowedDiagnostic(cssModule, token.loc));
35
- }
36
- if (config.namedExports && token.name === 'default') {
37
- diagnostics.push(createDefaultIsNotAllowedDiagnostic(cssModule, token.loc));
29
+ const violation = validateTokenName(token.name, { namedExports: config.namedExports });
30
+ if (violation) {
31
+ diagnostics.push(createTokenNameDiagnostic(cssModule, token.loc, violation));
38
32
  }
39
33
  }
40
34
 
@@ -55,24 +49,14 @@ export function checkCSSModule(cssModule: CSSModule, args: CheckerArgs): Diagnos
55
49
  if (!exportRecord.allTokens.includes(value.name)) {
56
50
  diagnostics.push(createModuleHasNoExportedTokenDiagnostic(cssModule, tokenImporter, value));
57
51
  }
58
- if (!isValidAsJSIdentifier(value.name)) {
59
- diagnostics.push(createInvalidNameAsJSIdentifiersDiagnostic(cssModule, value.loc));
60
- }
61
- if (value.localName && !isValidAsJSIdentifier(value.localName)) {
62
- diagnostics.push(createInvalidNameAsJSIdentifiersDiagnostic(cssModule, value.localLoc!));
63
- }
64
- if (value.name === '__proto__') {
65
- diagnostics.push(createProtoIsNotAllowedDiagnostic(cssModule, value.loc));
66
- }
67
- if (value.localName === '__proto__') {
68
- diagnostics.push(createProtoIsNotAllowedDiagnostic(cssModule, value.localLoc!));
52
+ const nameViolation = validateTokenName(value.name, { namedExports: config.namedExports });
53
+ if (nameViolation) {
54
+ diagnostics.push(createTokenNameDiagnostic(cssModule, value.loc, nameViolation));
69
55
  }
70
- if (config.namedExports) {
71
- if (value.name === 'default') {
72
- diagnostics.push(createDefaultIsNotAllowedDiagnostic(cssModule, value.loc));
73
- }
74
- if (value.localName === 'default') {
75
- diagnostics.push(createDefaultIsNotAllowedDiagnostic(cssModule, value.localLoc!));
56
+ if (value.localName) {
57
+ const localNameViolation = validateTokenName(value.localName, { namedExports: config.namedExports });
58
+ if (localNameViolation) {
59
+ diagnostics.push(createTokenNameDiagnostic(cssModule, value.localLoc!, localNameViolation));
76
60
  }
77
61
  }
78
62
  }
@@ -81,6 +65,33 @@ export function checkCSSModule(cssModule: CSSModule, args: CheckerArgs): Diagnos
81
65
  return diagnostics;
82
66
  }
83
67
 
68
+ function createTokenNameDiagnostic(cssModule: CSSModule, loc: Location, violation: TokenNameViolation): Diagnostic {
69
+ let text: string;
70
+ switch (violation) {
71
+ case 'invalid-js-identifier':
72
+ text = `Token names must be valid JavaScript identifiers when \`cmkOptions.namedExports\` is set to \`true\`.`;
73
+ break;
74
+ case 'proto-not-allowed':
75
+ text = `\`__proto__\` is not allowed as names.`;
76
+ break;
77
+ case 'default-not-allowed':
78
+ text = `\`default\` is not allowed as names when \`cmkOptions.namedExports\` is set to \`true\`.`;
79
+ break;
80
+ case 'backslash-not-allowed':
81
+ text = `Backslash (\\) is not allowed in names when \`cmkOptions.namedExports\` is set to \`false\`.`;
82
+ break;
83
+ default:
84
+ throw new Error('unreachable: unknown TokenNameViolation');
85
+ }
86
+ return {
87
+ text,
88
+ category: 'error',
89
+ file: { fileName: cssModule.fileName, text: cssModule.text },
90
+ start: { line: loc.start.line, column: loc.start.column },
91
+ length: loc.end.offset - loc.start.offset,
92
+ };
93
+ }
94
+
84
95
  function createCannotImportModuleDiagnostic(cssModule: CSSModule, tokenImporter: TokenImporter): Diagnostic {
85
96
  return {
86
97
  text: `Cannot import module '${tokenImporter.from}'`,
@@ -104,33 +115,3 @@ function createModuleHasNoExportedTokenDiagnostic(
104
115
  length: value.loc.end.offset - value.loc.start.offset,
105
116
  };
106
117
  }
107
-
108
- function createInvalidNameAsJSIdentifiersDiagnostic(cssModule: CSSModule, loc: Location): Diagnostic {
109
- return {
110
- text: `css-modules-kit does not support invalid names as JavaScript identifiers.`,
111
- category: 'error',
112
- file: { fileName: cssModule.fileName, text: cssModule.text },
113
- start: { line: loc.start.line, column: loc.start.column },
114
- length: loc.end.offset - loc.start.offset,
115
- };
116
- }
117
-
118
- function createProtoIsNotAllowedDiagnostic(cssModule: CSSModule, loc: Location): Diagnostic {
119
- return {
120
- text: `\`__proto__\` is not allowed as names.`,
121
- category: 'error',
122
- file: { fileName: cssModule.fileName, text: cssModule.text },
123
- start: { line: loc.start.line, column: loc.start.column },
124
- length: loc.end.offset - loc.start.offset,
125
- };
126
- }
127
-
128
- function createDefaultIsNotAllowedDiagnostic(cssModule: CSSModule, loc: Location): Diagnostic {
129
- return {
130
- text: `\`default\` is not allowed as names when \`cmkOptions.namedExports\` is set to \`true\`.`,
131
- category: 'error',
132
- file: { fileName: cssModule.fileName, text: cssModule.text },
133
- start: { line: loc.start.line, column: loc.start.column },
134
- length: loc.end.offset - loc.start.offset,
135
- };
136
- }
package/src/config.ts CHANGED
@@ -101,7 +101,6 @@ function isTsConfigFileExists(fileName: string): boolean {
101
101
  return ts.findConfigFile(dirname(fileName), ts.sys.fileExists.bind(ts.sys), basename(fileName)) !== undefined;
102
102
  }
103
103
 
104
- // eslint-disable-next-line complexity
105
104
  function parseRawData(raw: unknown, tsConfigSourceFile: ts.TsConfigSourceFile): ParsedRawData {
106
105
  const result: ParsedRawData = {
107
106
  config: {},