@css-modules-kit/core 0.8.1 → 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.
- package/dist/checker.d.ts.map +1 -1
- package/dist/checker.js +37 -53
- package/dist/checker.js.map +1 -1
- package/dist/dts-generator.d.ts +3 -0
- package/dist/dts-generator.d.ts.map +1 -1
- package/dist/dts-generator.js +69 -46
- package/dist/dts-generator.js.map +1 -1
- package/dist/parser/rule-parser.d.ts.map +1 -1
- package/dist/parser/rule-parser.js +13 -3
- package/dist/parser/rule-parser.js.map +1 -1
- package/dist/util.d.ts +12 -1
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +26 -8
- package/dist/util.js.map +1 -1
- package/package.json +1 -1
- package/src/checker.ts +38 -56
- package/src/dts-generator.ts +79 -44
- package/src/parser/rule-parser.ts +13 -3
- package/src/util.ts +32 -8
package/dist/checker.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checker.d.ts","sourceRoot":"","sources":["../src/checker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,EAGV,SAAS,EACT,UAAU,EACV,YAAY,EAEZ,cAAc,EACd,QAAQ,EAET,MAAM,WAAW,CAAC;AAGnB,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,SAAS,CAAC;IAClB,eAAe,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,YAAY,CAAC;IACxD,cAAc,EAAE,cAAc,CAAC;IAC/B,QAAQ,EAAE,QAAQ,CAAC;IACnB,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,SAAS,GAAG,SAAS,CAAC;CACvD;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,GAAG,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"checker.d.ts","sourceRoot":"","sources":["../src/checker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,EAGV,SAAS,EACT,UAAU,EACV,YAAY,EAEZ,cAAc,EACd,QAAQ,EAET,MAAM,WAAW,CAAC;AAGnB,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,SAAS,CAAC;IAClB,eAAe,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,YAAY,CAAC;IACxD,cAAc,EAAE,cAAc,CAAC;IAC/B,QAAQ,EAAE,QAAQ,CAAC;IACnB,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,SAAS,GAAG,SAAS,CAAC;CACvD;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,GAAG,UAAU,EAAE,CA2CpF"}
|
package/dist/checker.js
CHANGED
|
@@ -1,17 +1,12 @@
|
|
|
1
|
-
import { isURLSpecifier,
|
|
1
|
+
import { isURLSpecifier, validateTokenName } from './util.js';
|
|
2
2
|
export function checkCSSModule(cssModule, args) {
|
|
3
3
|
const { config } = args;
|
|
4
4
|
const diagnostics = [];
|
|
5
5
|
for (const token of cssModule.localTokens) {
|
|
6
6
|
// Reject special names as they may break .d.ts files
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
if (token.name === '__proto__') {
|
|
11
|
-
diagnostics.push(createProtoIsNotAllowedDiagnostic(cssModule, token.loc));
|
|
12
|
-
}
|
|
13
|
-
if (config.namedExports && token.name === 'default') {
|
|
14
|
-
diagnostics.push(createDefaultIsNotAllowedDiagnostic(cssModule, token.loc));
|
|
7
|
+
const violation = validateTokenName(token.name, { namedExports: config.namedExports });
|
|
8
|
+
if (violation) {
|
|
9
|
+
diagnostics.push(createTokenNameDiagnostic(cssModule, token.loc, violation));
|
|
15
10
|
}
|
|
16
11
|
}
|
|
17
12
|
for (const tokenImporter of cssModule.tokenImporters) {
|
|
@@ -33,24 +28,14 @@ export function checkCSSModule(cssModule, args) {
|
|
|
33
28
|
if (!exportRecord.allTokens.includes(value.name)) {
|
|
34
29
|
diagnostics.push(createModuleHasNoExportedTokenDiagnostic(cssModule, tokenImporter, value));
|
|
35
30
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
if (value.localName && !isValidAsJSIdentifier(value.localName)) {
|
|
40
|
-
diagnostics.push(createInvalidNameAsJSIdentifiersDiagnostic(cssModule, value.localLoc));
|
|
41
|
-
}
|
|
42
|
-
if (value.name === '__proto__') {
|
|
43
|
-
diagnostics.push(createProtoIsNotAllowedDiagnostic(cssModule, value.loc));
|
|
44
|
-
}
|
|
45
|
-
if (value.localName === '__proto__') {
|
|
46
|
-
diagnostics.push(createProtoIsNotAllowedDiagnostic(cssModule, value.localLoc));
|
|
31
|
+
const nameViolation = validateTokenName(value.name, { namedExports: config.namedExports });
|
|
32
|
+
if (nameViolation) {
|
|
33
|
+
diagnostics.push(createTokenNameDiagnostic(cssModule, value.loc, nameViolation));
|
|
47
34
|
}
|
|
48
|
-
if (
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
if (value.localName === 'default') {
|
|
53
|
-
diagnostics.push(createDefaultIsNotAllowedDiagnostic(cssModule, value.localLoc));
|
|
35
|
+
if (value.localName) {
|
|
36
|
+
const localNameViolation = validateTokenName(value.localName, { namedExports: config.namedExports });
|
|
37
|
+
if (localNameViolation) {
|
|
38
|
+
diagnostics.push(createTokenNameDiagnostic(cssModule, value.localLoc, localNameViolation));
|
|
54
39
|
}
|
|
55
40
|
}
|
|
56
41
|
}
|
|
@@ -58,6 +43,32 @@ export function checkCSSModule(cssModule, args) {
|
|
|
58
43
|
}
|
|
59
44
|
return diagnostics;
|
|
60
45
|
}
|
|
46
|
+
function createTokenNameDiagnostic(cssModule, loc, violation) {
|
|
47
|
+
let text;
|
|
48
|
+
switch (violation) {
|
|
49
|
+
case 'invalid-js-identifier':
|
|
50
|
+
text = `Token names must be valid JavaScript identifiers when \`cmkOptions.namedExports\` is set to \`true\`.`;
|
|
51
|
+
break;
|
|
52
|
+
case 'proto-not-allowed':
|
|
53
|
+
text = `\`__proto__\` is not allowed as names.`;
|
|
54
|
+
break;
|
|
55
|
+
case 'default-not-allowed':
|
|
56
|
+
text = `\`default\` is not allowed as names when \`cmkOptions.namedExports\` is set to \`true\`.`;
|
|
57
|
+
break;
|
|
58
|
+
case 'backslash-not-allowed':
|
|
59
|
+
text = `Backslash (\\) is not allowed in names when \`cmkOptions.namedExports\` is set to \`false\`.`;
|
|
60
|
+
break;
|
|
61
|
+
default:
|
|
62
|
+
throw new Error('unreachable: unknown TokenNameViolation');
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
text,
|
|
66
|
+
category: 'error',
|
|
67
|
+
file: { fileName: cssModule.fileName, text: cssModule.text },
|
|
68
|
+
start: { line: loc.start.line, column: loc.start.column },
|
|
69
|
+
length: loc.end.offset - loc.start.offset,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
61
72
|
function createCannotImportModuleDiagnostic(cssModule, tokenImporter) {
|
|
62
73
|
return {
|
|
63
74
|
text: `Cannot import module '${tokenImporter.from}'`,
|
|
@@ -76,31 +87,4 @@ function createModuleHasNoExportedTokenDiagnostic(cssModule, tokenImporter, valu
|
|
|
76
87
|
length: value.loc.end.offset - value.loc.start.offset,
|
|
77
88
|
};
|
|
78
89
|
}
|
|
79
|
-
function createInvalidNameAsJSIdentifiersDiagnostic(cssModule, loc) {
|
|
80
|
-
return {
|
|
81
|
-
text: `css-modules-kit does not support invalid names as JavaScript identifiers.`,
|
|
82
|
-
category: 'error',
|
|
83
|
-
file: { fileName: cssModule.fileName, text: cssModule.text },
|
|
84
|
-
start: { line: loc.start.line, column: loc.start.column },
|
|
85
|
-
length: loc.end.offset - loc.start.offset,
|
|
86
|
-
};
|
|
87
|
-
}
|
|
88
|
-
function createProtoIsNotAllowedDiagnostic(cssModule, loc) {
|
|
89
|
-
return {
|
|
90
|
-
text: `\`__proto__\` is not allowed as names.`,
|
|
91
|
-
category: 'error',
|
|
92
|
-
file: { fileName: cssModule.fileName, text: cssModule.text },
|
|
93
|
-
start: { line: loc.start.line, column: loc.start.column },
|
|
94
|
-
length: loc.end.offset - loc.start.offset,
|
|
95
|
-
};
|
|
96
|
-
}
|
|
97
|
-
function createDefaultIsNotAllowedDiagnostic(cssModule, loc) {
|
|
98
|
-
return {
|
|
99
|
-
text: `\`default\` is not allowed as names when \`cmkOptions.namedExports\` is set to \`true\`.`,
|
|
100
|
-
category: 'error',
|
|
101
|
-
file: { fileName: cssModule.fileName, text: cssModule.text },
|
|
102
|
-
start: { line: loc.start.line, column: loc.start.column },
|
|
103
|
-
length: loc.end.offset - loc.start.offset,
|
|
104
|
-
};
|
|
105
|
-
}
|
|
106
90
|
//# sourceMappingURL=checker.js.map
|
package/dist/checker.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checker.js","sourceRoot":"","sources":["../src/checker.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"checker.js","sourceRoot":"","sources":["../src/checker.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,cAAc,EAA2B,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAUvF,MAAM,UAAU,cAAc,CAAC,SAAoB,EAAE,IAAiB;IACpE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACxB,MAAM,WAAW,GAAiB,EAAE,CAAC;IAErC,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,WAAW,EAAE,CAAC;QAC1C,qDAAqD;QACrD,MAAM,SAAS,GAAG,iBAAiB,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;QACvF,IAAI,SAAS,EAAE,CAAC;YACd,WAAW,CAAC,IAAI,CAAC,yBAAyB,CAAC,SAAS,EAAE,KAAK,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;IAED,KAAK,MAAM,aAAa,IAAI,SAAS,CAAC,cAAc,EAAE,CAAC;QACrD,IAAI,cAAc,CAAC,aAAa,CAAC,IAAI,CAAC;YAAE,SAAS;QACjD,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;QAChF,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,WAAW,CAAC,IAAI,CAAC,kCAAkC,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC;YAC/E,SAAS;QACX,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;YAAE,SAAS;QACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAEvE,IAAI,aAAa,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACnC,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;YACpD,KAAK,MAAM,KAAK,IAAI,aAAa,CAAC,MAAM,EAAE,CAAC;gBACzC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;oBACjD,WAAW,CAAC,IAAI,CAAC,wCAAwC,CAAC,SAAS,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC,CAAC;gBAC9F,CAAC;gBACD,MAAM,aAAa,GAAG,iBAAiB,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;gBAC3F,IAAI,aAAa,EAAE,CAAC;oBAClB,WAAW,CAAC,IAAI,CAAC,yBAAyB,CAAC,SAAS,EAAE,KAAK,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC;gBACnF,CAAC;gBACD,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;oBACpB,MAAM,kBAAkB,GAAG,iBAAiB,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;oBACrG,IAAI,kBAAkB,EAAE,CAAC;wBACvB,WAAW,CAAC,IAAI,CAAC,yBAAyB,CAAC,SAAS,EAAE,KAAK,CAAC,QAAS,EAAE,kBAAkB,CAAC,CAAC,CAAC;oBAC9F,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,SAAS,yBAAyB,CAAC,SAAoB,EAAE,GAAa,EAAE,SAA6B;IACnG,IAAI,IAAY,CAAC;IACjB,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,uBAAuB;YAC1B,IAAI,GAAG,uGAAuG,CAAC;YAC/G,MAAM;QACR,KAAK,mBAAmB;YACtB,IAAI,GAAG,wCAAwC,CAAC;YAChD,MAAM;QACR,KAAK,qBAAqB;YACxB,IAAI,GAAG,0FAA0F,CAAC;YAClG,MAAM;QACR,KAAK,uBAAuB;YAC1B,IAAI,GAAG,8FAA8F,CAAC;YACtG,MAAM;QACR;YACE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO;QACL,IAAI;QACJ,QAAQ,EAAE,OAAO;QACjB,IAAI,EAAE,EAAE,QAAQ,EAAE,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE;QAC5D,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE;QACzD,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM;KAC1C,CAAC;AACJ,CAAC;AAED,SAAS,kCAAkC,CAAC,SAAoB,EAAE,aAA4B;IAC5F,OAAO;QACL,IAAI,EAAE,yBAAyB,aAAa,CAAC,IAAI,GAAG;QACpD,QAAQ,EAAE,OAAO;QACjB,IAAI,EAAE,EAAE,QAAQ,EAAE,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE;QAC5D,KAAK,EAAE,EAAE,IAAI,EAAE,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE;QAC7F,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM;KAC9E,CAAC;AACJ,CAAC;AAED,SAAS,wCAAwC,CAC/C,SAAoB,EACpB,aAAmC,EACnC,KAAgC;IAEhC,OAAO;QACL,IAAI,EAAE,WAAW,aAAa,CAAC,IAAI,4BAA4B,KAAK,CAAC,IAAI,IAAI;QAC7E,QAAQ,EAAE,OAAO;QACjB,IAAI,EAAE,EAAE,QAAQ,EAAE,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE;QAC5D,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE;QACrE,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM;KACtD,CAAC;AACJ,CAAC"}
|
package/dist/dts-generator.d.ts
CHANGED
|
@@ -13,6 +13,8 @@ interface CodeMapping {
|
|
|
13
13
|
lengths: number[];
|
|
14
14
|
/** The generated offsets of the tokens in the *.d.ts file. */
|
|
15
15
|
generatedOffsets: number[];
|
|
16
|
+
/** The lengths of the tokens in the *.d.ts file. If not provided, it is assumed to be the same as `lengths`. */
|
|
17
|
+
generatedLengths?: number[];
|
|
16
18
|
}
|
|
17
19
|
/** The map linking the two codes in *.d.ts */
|
|
18
20
|
interface LinkedCodeMapping extends CodeMapping {
|
|
@@ -28,6 +30,7 @@ interface LinkedCodeMapping extends CodeMapping {
|
|
|
28
30
|
interface GenerateDtsResult {
|
|
29
31
|
text: string;
|
|
30
32
|
mapping: CodeMapping;
|
|
33
|
+
secondaryMapping?: CodeMapping;
|
|
31
34
|
linkedCodeMapping: LinkedCodeMapping;
|
|
32
35
|
}
|
|
33
36
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dts-generator.d.ts","sourceRoot":"","sources":["../src/dts-generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAwB,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"dts-generator.d.ts","sourceRoot":"","sources":["../src/dts-generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAwB,MAAM,WAAW,CAAC;AAIjE,eAAO,MAAM,kBAAkB,WAAW,CAAC;AAE3C,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,OAAO,CAAC;IACtB,sBAAsB,EAAE,OAAO,CAAC;IAChC,mCAAmC;IACnC,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,UAAU,WAAW;IACnB,iEAAiE;IACjE,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,0DAA0D;IAC1D,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,8DAA8D;IAC9D,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,gHAAgH;IAChH,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED,8CAA8C;AAE9C,UAAU,iBAAkB,SAAQ,WAAW;IAC7C,iDAAiD;IACjD,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,iDAAiD;IACjD,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,kDAAkD;IAClD,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,kDAAkD;IAClD,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,UAAU,iBAAiB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,WAAW,CAAC;IACrB,gBAAgB,CAAC,EAAE,WAAW,CAAC;IAC/B,iBAAiB,EAAE,iBAAiB,CAAC;CACtC;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,kBAAkB,GAAG,iBAAiB,CA+DhG"}
|
package/dist/dts-generator.js
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
import { isURLSpecifier,
|
|
1
|
+
import { isURLSpecifier, validateTokenName } from './util.js';
|
|
2
2
|
export const STYLES_EXPORT_NAME = 'styles';
|
|
3
3
|
/**
|
|
4
4
|
* Generate .d.ts from `CSSModule`.
|
|
5
5
|
*/
|
|
6
6
|
export function generateDts(cssModule, options) {
|
|
7
7
|
// Exclude invalid tokens
|
|
8
|
-
const localTokens = cssModule.localTokens.filter((token) =>
|
|
8
|
+
const localTokens = cssModule.localTokens.filter((token) => isValidTokenName(token.name, options));
|
|
9
9
|
const tokenImporters = cssModule.tokenImporters
|
|
10
10
|
// Exclude invalid imported tokens
|
|
11
11
|
.map((tokenImporter) => {
|
|
12
12
|
if (tokenImporter.type === 'value') {
|
|
13
13
|
return {
|
|
14
14
|
...tokenImporter,
|
|
15
|
-
values: tokenImporter.values.filter((value) =>
|
|
16
|
-
(value.localName === undefined ||
|
|
15
|
+
values: tokenImporter.values.filter((value) => isValidTokenName(value.name, options) &&
|
|
16
|
+
(value.localName === undefined || isValidTokenName(value.localName, options))),
|
|
17
17
|
};
|
|
18
18
|
}
|
|
19
19
|
else {
|
|
@@ -214,6 +214,17 @@ function generateNamedExportsDts(localTokens, tokenImporters, options) {
|
|
|
214
214
|
/** Generate a d.ts file with a default export. */
|
|
215
215
|
function generateDefaultExportDts(localTokens, tokenImporters) {
|
|
216
216
|
const mapping = { sourceOffsets: [], lengths: [], generatedOffsets: [] };
|
|
217
|
+
/**
|
|
218
|
+
* In "Go to Definition", mapping only the inner part of the quotes does not work.
|
|
219
|
+
* Therefore, we also generate a mapping that includes the quotes.
|
|
220
|
+
* For more details, see https://github.com/mizdra/volar-single-quote-span-problem.
|
|
221
|
+
*/
|
|
222
|
+
const secondaryMapping = {
|
|
223
|
+
sourceOffsets: [],
|
|
224
|
+
lengths: [],
|
|
225
|
+
generatedOffsets: [],
|
|
226
|
+
generatedLengths: [],
|
|
227
|
+
};
|
|
217
228
|
const linkedCodeMapping = {
|
|
218
229
|
sourceOffsets: [],
|
|
219
230
|
lengths: [],
|
|
@@ -240,27 +251,33 @@ function generateDefaultExportDts(localTokens, tokenImporters) {
|
|
|
240
251
|
* The mapping is created as follows:
|
|
241
252
|
* a.module.css:
|
|
242
253
|
* 1 | .a_1 { color: red; }
|
|
243
|
-
* | ^ mapping.sourceOffsets[0]
|
|
254
|
+
* | ^ mapping.sourceOffsets[0], secondaryMapping.sourceOffsets[0]
|
|
244
255
|
* |
|
|
245
256
|
* 2 | .a_2 { color: blue; }
|
|
246
|
-
* | ^ mapping.sourceOffsets[1]
|
|
257
|
+
* | ^ mapping.sourceOffsets[1], secondaryMapping.sourceOffsets[1]
|
|
247
258
|
* |
|
|
248
259
|
*
|
|
249
260
|
* a.module.css.d.ts:
|
|
250
261
|
* 1 | declare const styles = {
|
|
251
|
-
* 2 | a_1: '' as readonly string,
|
|
252
|
-
* |
|
|
262
|
+
* 2 | 'a_1': '' as readonly string,
|
|
263
|
+
* | ^^ mapping.generatedOffsets[0]
|
|
264
|
+
* | ^ secondaryMapping.generatedOffsets[0]
|
|
253
265
|
* |
|
|
254
|
-
* 3 | a_2: '' as readonly string,
|
|
255
|
-
* |
|
|
266
|
+
* 3 | 'a_2': '' as readonly string,
|
|
267
|
+
* | ^^ mapping.generatedOffsets[1]
|
|
268
|
+
* | ^ secondaryMapping.generatedOffsets[1]
|
|
256
269
|
* |
|
|
257
270
|
* 4 | };
|
|
258
271
|
*/
|
|
259
|
-
text += ` `;
|
|
272
|
+
text += ` '`;
|
|
260
273
|
mapping.sourceOffsets.push(token.loc.start.offset);
|
|
261
|
-
mapping.generatedOffsets.push(text.length);
|
|
262
274
|
mapping.lengths.push(token.name.length);
|
|
263
|
-
text
|
|
275
|
+
mapping.generatedOffsets.push(text.length);
|
|
276
|
+
secondaryMapping.sourceOffsets.push(token.loc.start.offset);
|
|
277
|
+
secondaryMapping.lengths.push(token.name.length);
|
|
278
|
+
secondaryMapping.generatedOffsets.push(text.length - 1);
|
|
279
|
+
secondaryMapping.generatedLengths.push(token.name.length + 2);
|
|
280
|
+
text += `${token.name}': '' as readonly string,\n`;
|
|
264
281
|
}
|
|
265
282
|
for (const tokenImporter of tokenImporters) {
|
|
266
283
|
if (tokenImporter.type === 'import') {
|
|
@@ -297,31 +314,35 @@ function generateDefaultExportDts(localTokens, tokenImporters) {
|
|
|
297
314
|
* The mapping is created as follows:
|
|
298
315
|
* a.module.css:
|
|
299
316
|
* 1 | @value b_1, b_2 from './b.module.css';
|
|
300
|
-
* | ^ ^ ^ mapping.sourceOffsets[
|
|
301
|
-
* | ^ ^ mapping.sourceOffsets[2]
|
|
302
|
-
* | ^ mapping.sourceOffsets[
|
|
317
|
+
* | ^ ^ ^ mapping.sourceOffsets[1]
|
|
318
|
+
* | ^ ^ mapping.sourceOffsets[2], secondaryMapping.sourceOffsets[1]
|
|
319
|
+
* | ^ mapping.sourceOffsets[0], secondaryMapping.sourceOffsets[0]
|
|
303
320
|
* |
|
|
304
321
|
* 2 | @value c_1 as aliased_c_1 from './c.module.css';
|
|
305
322
|
* | ^ ^ ^ mapping.sourceOffsets[4]
|
|
306
|
-
* | ^ ^ mapping.sourceOffsets[3]
|
|
307
|
-
* | ^ mapping.sourceOffsets[5]
|
|
323
|
+
* | ^ ^ mapping.sourceOffsets[3], secondaryMapping.sourceOffsets[2]
|
|
324
|
+
* | ^ mapping.sourceOffsets[5], secondaryMapping.sourceOffsets[3]
|
|
308
325
|
* |
|
|
309
326
|
*
|
|
310
327
|
* a.module.css.d.ts:
|
|
311
328
|
* 1 | declare const styles = {
|
|
312
|
-
* 2 | b_1: (await import('./b.module.css')).default
|
|
313
|
-
* | ^
|
|
314
|
-
* | ^
|
|
315
|
-
* |
|
|
329
|
+
* 2 | 'b_1': (await import('./b.module.css')).default['b_1'],
|
|
330
|
+
* | ^^ ^ ^ linkedCodeMapping.generatedOffsets[0]
|
|
331
|
+
* | ^^ ^ mapping.generatedOffsets[1]
|
|
332
|
+
* | ^^ mapping.generatedOffsets[0]
|
|
333
|
+
* | ^ secondaryMapping.generatedOffsets[0], linkedCodeMapping.sourceOffsets[0]
|
|
316
334
|
* |
|
|
317
|
-
* 3 | b_2: (await import('./b.module.css')).default
|
|
318
|
-
* | ^
|
|
319
|
-
* |
|
|
335
|
+
* 3 | 'b_2': (await import('./b.module.css')).default['b_2'],
|
|
336
|
+
* | ^^ ^ linkedCodeMapping.generatedOffsets[1]
|
|
337
|
+
* | ^^ mapping.generatedOffsets[2]
|
|
338
|
+
* | ^ secondaryMapping.generatedOffsets[1], linkedCodeMapping.sourceOffsets[1]
|
|
320
339
|
* |
|
|
321
|
-
* 4 | aliased_c_1: (await import('./c.module.css')).default
|
|
322
|
-
* | ^
|
|
323
|
-
* | ^ ^
|
|
324
|
-
* | ^ mapping.generatedOffsets[
|
|
340
|
+
* 4 | 'aliased_c_1': (await import('./c.module.css')).default['c_1'],
|
|
341
|
+
* | ^^ ^ ^^ mapping.generatedOffsets[5]
|
|
342
|
+
* | ^^ ^ ^ secondaryMapping.generatedOffsets[3], linkedCodeMapping.generatedOffsets[2]
|
|
343
|
+
* | ^^ ^ mapping.generatedOffsets[4]
|
|
344
|
+
* | ^^ mapping.generatedOffsets[3]
|
|
345
|
+
* | ^ secondaryMapping.generatedOffsets[2], linkedCodeMapping.sourceOffsets[2]
|
|
325
346
|
* |
|
|
326
347
|
* 5 | };
|
|
327
348
|
*
|
|
@@ -331,40 +352,42 @@ function generateDefaultExportDts(localTokens, tokenImporters) {
|
|
|
331
352
|
tokenImporter.values.forEach((value, i) => {
|
|
332
353
|
const localName = value.localName ?? value.name;
|
|
333
354
|
const localLoc = value.localLoc ?? value.loc;
|
|
334
|
-
text += ` `;
|
|
355
|
+
text += ` '`;
|
|
335
356
|
mapping.sourceOffsets.push(localLoc.start.offset);
|
|
336
357
|
mapping.lengths.push(localName.length);
|
|
337
358
|
mapping.generatedOffsets.push(text.length);
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
text
|
|
359
|
+
secondaryMapping.sourceOffsets.push(localLoc.start.offset);
|
|
360
|
+
secondaryMapping.lengths.push(localName.length);
|
|
361
|
+
secondaryMapping.generatedOffsets.push(text.length - 1);
|
|
362
|
+
secondaryMapping.generatedLengths.push(localName.length + 2);
|
|
363
|
+
linkedCodeMapping.sourceOffsets.push(text.length - 1);
|
|
364
|
+
linkedCodeMapping.lengths.push(localName.length + 2);
|
|
365
|
+
text += `${localName}': (await import(`;
|
|
341
366
|
if (i === 0) {
|
|
342
367
|
mapping.sourceOffsets.push(tokenImporter.fromLoc.start.offset - 1);
|
|
343
368
|
mapping.lengths.push(tokenImporter.from.length + 2);
|
|
344
369
|
mapping.generatedOffsets.push(text.length);
|
|
345
370
|
}
|
|
346
|
-
text += `'${tokenImporter.from}')).default
|
|
371
|
+
text += `'${tokenImporter.from}')).default['`;
|
|
347
372
|
if ('localName' in value) {
|
|
348
373
|
mapping.sourceOffsets.push(value.loc.start.offset);
|
|
349
374
|
mapping.lengths.push(value.name.length);
|
|
350
375
|
mapping.generatedOffsets.push(text.length);
|
|
376
|
+
secondaryMapping.sourceOffsets.push(value.loc.start.offset);
|
|
377
|
+
secondaryMapping.lengths.push(value.name.length);
|
|
378
|
+
secondaryMapping.generatedOffsets.push(text.length - 1);
|
|
379
|
+
secondaryMapping.generatedLengths.push(value.name.length + 2);
|
|
351
380
|
}
|
|
352
|
-
linkedCodeMapping.generatedOffsets.push(text.length);
|
|
353
|
-
linkedCodeMapping.generatedLengths.push(value.name.length);
|
|
354
|
-
text += `${value.name},\n`;
|
|
381
|
+
linkedCodeMapping.generatedOffsets.push(text.length - 1);
|
|
382
|
+
linkedCodeMapping.generatedLengths.push(value.name.length + 2);
|
|
383
|
+
text += `${value.name}'],\n`;
|
|
355
384
|
});
|
|
356
385
|
}
|
|
357
386
|
}
|
|
358
387
|
text += `};\nexport default ${STYLES_EXPORT_NAME};\n`;
|
|
359
|
-
return { text, mapping, linkedCodeMapping };
|
|
388
|
+
return { text, mapping, linkedCodeMapping, secondaryMapping };
|
|
360
389
|
}
|
|
361
|
-
function
|
|
362
|
-
|
|
363
|
-
return false;
|
|
364
|
-
if (name === '__proto__')
|
|
365
|
-
return false;
|
|
366
|
-
if (options.namedExports && name === 'default')
|
|
367
|
-
return false;
|
|
368
|
-
return true;
|
|
390
|
+
function isValidTokenName(name, options) {
|
|
391
|
+
return validateTokenName(name, options) === undefined;
|
|
369
392
|
}
|
|
370
393
|
//# sourceMappingURL=dts-generator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dts-generator.js","sourceRoot":"","sources":["../src/dts-generator.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dts-generator.js","sourceRoot":"","sources":["../src/dts-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rule-parser.d.ts","sourceRoot":"","sources":["../../src/parser/rule-parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,cAAc,MAAM,yBAAyB,CAAC;AACrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,8BAA8B,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE/F,iBAAS,4CAA4C,CACnD,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,cAAc,CAAC,IAAI,GACxB;IAAE,KAAK,EAAE,kBAAkB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAI/C;AACD,OAAO,EAAE,4CAA4C,IAAI,mDAAmD,EAAE,CAAC;AA0E/G,UAAU,aAAa;IACrB,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,GAAG,EAAE,QAAQ,CAAC;IACd;;;OAGG;IACH,cAAc,EAAE,QAAQ,CAAC;CAC1B;AAED,UAAU,eAAe;IACvB,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,WAAW,EAAE,8BAA8B,EAAE,CAAC;CAC/C;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,eAAe,
|
|
1
|
+
{"version":3,"file":"rule-parser.d.ts","sourceRoot":"","sources":["../../src/parser/rule-parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,cAAc,MAAM,yBAAyB,CAAC;AACrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,8BAA8B,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE/F,iBAAS,4CAA4C,CACnD,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,cAAc,CAAC,IAAI,GACxB;IAAE,KAAK,EAAE,kBAAkB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAI/C;AACD,OAAO,EAAE,4CAA4C,IAAI,mDAAmD,EAAE,CAAC;AA0E/G,UAAU,aAAa;IACrB,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,GAAG,EAAE,QAAQ,CAAC;IACd;;;OAGG;IACH,cAAc,EAAE,QAAQ,CAAC;CAC1B;AAED,UAAU,eAAe;IACvB,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,WAAW,EAAE,8BAA8B,EAAE,CAAC;CAC/C;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,eAAe,CAmCrD"}
|
|
@@ -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 +
|
|
92
|
-
offset: start.offset +
|
|
101
|
+
column: start.column + rawClassName.length,
|
|
102
|
+
offset: start.offset + rawClassName.length,
|
|
93
103
|
};
|
|
94
104
|
return {
|
|
95
|
-
name:
|
|
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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"}
|
package/dist/util.d.ts
CHANGED
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
export declare function isPosixRelativePath(path: string): boolean;
|
|
2
|
-
|
|
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
|
package/dist/util.d.ts.map
CHANGED
|
@@ -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,
|
|
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
|
-
|
|
6
|
-
|
|
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
|
|
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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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;
|
|
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
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,
|
|
13
|
+
import { isURLSpecifier, type TokenNameViolation, validateTokenName } from './util.js';
|
|
14
14
|
|
|
15
15
|
export interface CheckerArgs {
|
|
16
16
|
config: CMKConfig;
|
|
@@ -26,14 +26,9 @@ export function checkCSSModule(cssModule: CSSModule, args: CheckerArgs): Diagnos
|
|
|
26
26
|
|
|
27
27
|
for (const token of cssModule.localTokens) {
|
|
28
28
|
// Reject special names as they may break .d.ts files
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
if (token.name === '__proto__') {
|
|
33
|
-
diagnostics.push(createProtoIsNotAllowedDiagnostic(cssModule, token.loc));
|
|
34
|
-
}
|
|
35
|
-
if (config.namedExports && token.name === 'default') {
|
|
36
|
-
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));
|
|
37
32
|
}
|
|
38
33
|
}
|
|
39
34
|
|
|
@@ -54,24 +49,14 @@ export function checkCSSModule(cssModule: CSSModule, args: CheckerArgs): Diagnos
|
|
|
54
49
|
if (!exportRecord.allTokens.includes(value.name)) {
|
|
55
50
|
diagnostics.push(createModuleHasNoExportedTokenDiagnostic(cssModule, tokenImporter, value));
|
|
56
51
|
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
if (value.localName && !isValidAsJSIdentifier(value.localName)) {
|
|
61
|
-
diagnostics.push(createInvalidNameAsJSIdentifiersDiagnostic(cssModule, value.localLoc!));
|
|
62
|
-
}
|
|
63
|
-
if (value.name === '__proto__') {
|
|
64
|
-
diagnostics.push(createProtoIsNotAllowedDiagnostic(cssModule, value.loc));
|
|
65
|
-
}
|
|
66
|
-
if (value.localName === '__proto__') {
|
|
67
|
-
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));
|
|
68
55
|
}
|
|
69
|
-
if (
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
if (value.localName === 'default') {
|
|
74
|
-
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));
|
|
75
60
|
}
|
|
76
61
|
}
|
|
77
62
|
}
|
|
@@ -80,6 +65,33 @@ export function checkCSSModule(cssModule: CSSModule, args: CheckerArgs): Diagnos
|
|
|
80
65
|
return diagnostics;
|
|
81
66
|
}
|
|
82
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
|
+
|
|
83
95
|
function createCannotImportModuleDiagnostic(cssModule: CSSModule, tokenImporter: TokenImporter): Diagnostic {
|
|
84
96
|
return {
|
|
85
97
|
text: `Cannot import module '${tokenImporter.from}'`,
|
|
@@ -103,33 +115,3 @@ function createModuleHasNoExportedTokenDiagnostic(
|
|
|
103
115
|
length: value.loc.end.offset - value.loc.start.offset,
|
|
104
116
|
};
|
|
105
117
|
}
|
|
106
|
-
|
|
107
|
-
function createInvalidNameAsJSIdentifiersDiagnostic(cssModule: CSSModule, loc: Location): Diagnostic {
|
|
108
|
-
return {
|
|
109
|
-
text: `css-modules-kit does not support invalid names as JavaScript identifiers.`,
|
|
110
|
-
category: 'error',
|
|
111
|
-
file: { fileName: cssModule.fileName, text: cssModule.text },
|
|
112
|
-
start: { line: loc.start.line, column: loc.start.column },
|
|
113
|
-
length: loc.end.offset - loc.start.offset,
|
|
114
|
-
};
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
function createProtoIsNotAllowedDiagnostic(cssModule: CSSModule, loc: Location): Diagnostic {
|
|
118
|
-
return {
|
|
119
|
-
text: `\`__proto__\` is not allowed as names.`,
|
|
120
|
-
category: 'error',
|
|
121
|
-
file: { fileName: cssModule.fileName, text: cssModule.text },
|
|
122
|
-
start: { line: loc.start.line, column: loc.start.column },
|
|
123
|
-
length: loc.end.offset - loc.start.offset,
|
|
124
|
-
};
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
function createDefaultIsNotAllowedDiagnostic(cssModule: CSSModule, loc: Location): Diagnostic {
|
|
128
|
-
return {
|
|
129
|
-
text: `\`default\` is not allowed as names when \`cmkOptions.namedExports\` is set to \`true\`.`,
|
|
130
|
-
category: 'error',
|
|
131
|
-
file: { fileName: cssModule.fileName, text: cssModule.text },
|
|
132
|
-
start: { line: loc.start.line, column: loc.start.column },
|
|
133
|
-
length: loc.end.offset - loc.start.offset,
|
|
134
|
-
};
|
|
135
|
-
}
|
package/src/dts-generator.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { CSSModule, Token, TokenImporter } from './type.js';
|
|
2
|
-
import {
|
|
2
|
+
import type { ValidateTokenNameOptions } from './util.js';
|
|
3
|
+
import { isURLSpecifier, validateTokenName } from './util.js';
|
|
3
4
|
|
|
4
5
|
export const STYLES_EXPORT_NAME = 'styles';
|
|
5
6
|
|
|
@@ -17,6 +18,8 @@ interface CodeMapping {
|
|
|
17
18
|
lengths: number[];
|
|
18
19
|
/** The generated offsets of the tokens in the *.d.ts file. */
|
|
19
20
|
generatedOffsets: number[];
|
|
21
|
+
/** The lengths of the tokens in the *.d.ts file. If not provided, it is assumed to be the same as `lengths`. */
|
|
22
|
+
generatedLengths?: number[];
|
|
20
23
|
}
|
|
21
24
|
|
|
22
25
|
/** The map linking the two codes in *.d.ts */
|
|
@@ -35,6 +38,7 @@ interface LinkedCodeMapping extends CodeMapping {
|
|
|
35
38
|
interface GenerateDtsResult {
|
|
36
39
|
text: string;
|
|
37
40
|
mapping: CodeMapping;
|
|
41
|
+
secondaryMapping?: CodeMapping;
|
|
38
42
|
linkedCodeMapping: LinkedCodeMapping;
|
|
39
43
|
}
|
|
40
44
|
|
|
@@ -43,7 +47,7 @@ interface GenerateDtsResult {
|
|
|
43
47
|
*/
|
|
44
48
|
export function generateDts(cssModule: CSSModule, options: GenerateDtsOptions): GenerateDtsResult {
|
|
45
49
|
// Exclude invalid tokens
|
|
46
|
-
const localTokens = cssModule.localTokens.filter((token) =>
|
|
50
|
+
const localTokens = cssModule.localTokens.filter((token) => isValidTokenName(token.name, options));
|
|
47
51
|
const tokenImporters = cssModule.tokenImporters
|
|
48
52
|
// Exclude invalid imported tokens
|
|
49
53
|
.map((tokenImporter) => {
|
|
@@ -52,8 +56,8 @@ export function generateDts(cssModule: CSSModule, options: GenerateDtsOptions):
|
|
|
52
56
|
...tokenImporter,
|
|
53
57
|
values: tokenImporter.values.filter(
|
|
54
58
|
(value) =>
|
|
55
|
-
|
|
56
|
-
(value.localName === undefined ||
|
|
59
|
+
isValidTokenName(value.name, options) &&
|
|
60
|
+
(value.localName === undefined || isValidTokenName(value.localName, options)),
|
|
57
61
|
),
|
|
58
62
|
};
|
|
59
63
|
} else {
|
|
@@ -264,8 +268,24 @@ function generateNamedExportsDts(
|
|
|
264
268
|
function generateDefaultExportDts(
|
|
265
269
|
localTokens: Token[],
|
|
266
270
|
tokenImporters: TokenImporter[],
|
|
267
|
-
): {
|
|
271
|
+
): {
|
|
272
|
+
text: string;
|
|
273
|
+
mapping: CodeMapping;
|
|
274
|
+
secondaryMapping: CodeMapping;
|
|
275
|
+
linkedCodeMapping: LinkedCodeMapping;
|
|
276
|
+
} {
|
|
268
277
|
const mapping: CodeMapping = { sourceOffsets: [], lengths: [], generatedOffsets: [] };
|
|
278
|
+
/**
|
|
279
|
+
* In "Go to Definition", mapping only the inner part of the quotes does not work.
|
|
280
|
+
* Therefore, we also generate a mapping that includes the quotes.
|
|
281
|
+
* For more details, see https://github.com/mizdra/volar-single-quote-span-problem.
|
|
282
|
+
*/
|
|
283
|
+
const secondaryMapping: CodeMapping & { generatedLengths: number[] } = {
|
|
284
|
+
sourceOffsets: [],
|
|
285
|
+
lengths: [],
|
|
286
|
+
generatedOffsets: [],
|
|
287
|
+
generatedLengths: [],
|
|
288
|
+
};
|
|
269
289
|
const linkedCodeMapping: LinkedCodeMapping = {
|
|
270
290
|
sourceOffsets: [],
|
|
271
291
|
lengths: [],
|
|
@@ -295,28 +315,34 @@ function generateDefaultExportDts(
|
|
|
295
315
|
* The mapping is created as follows:
|
|
296
316
|
* a.module.css:
|
|
297
317
|
* 1 | .a_1 { color: red; }
|
|
298
|
-
* | ^ mapping.sourceOffsets[0]
|
|
318
|
+
* | ^ mapping.sourceOffsets[0], secondaryMapping.sourceOffsets[0]
|
|
299
319
|
* |
|
|
300
320
|
* 2 | .a_2 { color: blue; }
|
|
301
|
-
* | ^ mapping.sourceOffsets[1]
|
|
321
|
+
* | ^ mapping.sourceOffsets[1], secondaryMapping.sourceOffsets[1]
|
|
302
322
|
* |
|
|
303
323
|
*
|
|
304
324
|
* a.module.css.d.ts:
|
|
305
325
|
* 1 | declare const styles = {
|
|
306
|
-
* 2 | a_1: '' as readonly string,
|
|
307
|
-
* |
|
|
326
|
+
* 2 | 'a_1': '' as readonly string,
|
|
327
|
+
* | ^^ mapping.generatedOffsets[0]
|
|
328
|
+
* | ^ secondaryMapping.generatedOffsets[0]
|
|
308
329
|
* |
|
|
309
|
-
* 3 | a_2: '' as readonly string,
|
|
310
|
-
* |
|
|
330
|
+
* 3 | 'a_2': '' as readonly string,
|
|
331
|
+
* | ^^ mapping.generatedOffsets[1]
|
|
332
|
+
* | ^ secondaryMapping.generatedOffsets[1]
|
|
311
333
|
* |
|
|
312
334
|
* 4 | };
|
|
313
335
|
*/
|
|
314
336
|
|
|
315
|
-
text += ` `;
|
|
337
|
+
text += ` '`;
|
|
316
338
|
mapping.sourceOffsets.push(token.loc.start.offset);
|
|
317
|
-
mapping.generatedOffsets.push(text.length);
|
|
318
339
|
mapping.lengths.push(token.name.length);
|
|
319
|
-
text
|
|
340
|
+
mapping.generatedOffsets.push(text.length);
|
|
341
|
+
secondaryMapping.sourceOffsets.push(token.loc.start.offset);
|
|
342
|
+
secondaryMapping.lengths.push(token.name.length);
|
|
343
|
+
secondaryMapping.generatedOffsets.push(text.length - 1);
|
|
344
|
+
secondaryMapping.generatedLengths.push(token.name.length + 2);
|
|
345
|
+
text += `${token.name}': '' as readonly string,\n`;
|
|
320
346
|
}
|
|
321
347
|
for (const tokenImporter of tokenImporters) {
|
|
322
348
|
if (tokenImporter.type === 'import') {
|
|
@@ -353,31 +379,35 @@ function generateDefaultExportDts(
|
|
|
353
379
|
* The mapping is created as follows:
|
|
354
380
|
* a.module.css:
|
|
355
381
|
* 1 | @value b_1, b_2 from './b.module.css';
|
|
356
|
-
* | ^ ^ ^ mapping.sourceOffsets[
|
|
357
|
-
* | ^ ^ mapping.sourceOffsets[2]
|
|
358
|
-
* | ^ mapping.sourceOffsets[
|
|
382
|
+
* | ^ ^ ^ mapping.sourceOffsets[1]
|
|
383
|
+
* | ^ ^ mapping.sourceOffsets[2], secondaryMapping.sourceOffsets[1]
|
|
384
|
+
* | ^ mapping.sourceOffsets[0], secondaryMapping.sourceOffsets[0]
|
|
359
385
|
* |
|
|
360
386
|
* 2 | @value c_1 as aliased_c_1 from './c.module.css';
|
|
361
387
|
* | ^ ^ ^ mapping.sourceOffsets[4]
|
|
362
|
-
* | ^ ^ mapping.sourceOffsets[3]
|
|
363
|
-
* | ^ mapping.sourceOffsets[5]
|
|
388
|
+
* | ^ ^ mapping.sourceOffsets[3], secondaryMapping.sourceOffsets[2]
|
|
389
|
+
* | ^ mapping.sourceOffsets[5], secondaryMapping.sourceOffsets[3]
|
|
364
390
|
* |
|
|
365
391
|
*
|
|
366
392
|
* a.module.css.d.ts:
|
|
367
393
|
* 1 | declare const styles = {
|
|
368
|
-
* 2 | b_1: (await import('./b.module.css')).default
|
|
369
|
-
* | ^
|
|
370
|
-
* | ^
|
|
371
|
-
* |
|
|
394
|
+
* 2 | 'b_1': (await import('./b.module.css')).default['b_1'],
|
|
395
|
+
* | ^^ ^ ^ linkedCodeMapping.generatedOffsets[0]
|
|
396
|
+
* | ^^ ^ mapping.generatedOffsets[1]
|
|
397
|
+
* | ^^ mapping.generatedOffsets[0]
|
|
398
|
+
* | ^ secondaryMapping.generatedOffsets[0], linkedCodeMapping.sourceOffsets[0]
|
|
372
399
|
* |
|
|
373
|
-
* 3 | b_2: (await import('./b.module.css')).default
|
|
374
|
-
* | ^
|
|
375
|
-
* |
|
|
400
|
+
* 3 | 'b_2': (await import('./b.module.css')).default['b_2'],
|
|
401
|
+
* | ^^ ^ linkedCodeMapping.generatedOffsets[1]
|
|
402
|
+
* | ^^ mapping.generatedOffsets[2]
|
|
403
|
+
* | ^ secondaryMapping.generatedOffsets[1], linkedCodeMapping.sourceOffsets[1]
|
|
376
404
|
* |
|
|
377
|
-
* 4 | aliased_c_1: (await import('./c.module.css')).default
|
|
378
|
-
* | ^
|
|
379
|
-
* | ^ ^
|
|
380
|
-
* | ^ mapping.generatedOffsets[
|
|
405
|
+
* 4 | 'aliased_c_1': (await import('./c.module.css')).default['c_1'],
|
|
406
|
+
* | ^^ ^ ^^ mapping.generatedOffsets[5]
|
|
407
|
+
* | ^^ ^ ^ secondaryMapping.generatedOffsets[3], linkedCodeMapping.generatedOffsets[2]
|
|
408
|
+
* | ^^ ^ mapping.generatedOffsets[4]
|
|
409
|
+
* | ^^ mapping.generatedOffsets[3]
|
|
410
|
+
* | ^ secondaryMapping.generatedOffsets[2], linkedCodeMapping.sourceOffsets[2]
|
|
381
411
|
* |
|
|
382
412
|
* 5 | };
|
|
383
413
|
*
|
|
@@ -389,37 +419,42 @@ function generateDefaultExportDts(
|
|
|
389
419
|
const localName = value.localName ?? value.name;
|
|
390
420
|
const localLoc = value.localLoc ?? value.loc;
|
|
391
421
|
|
|
392
|
-
text += ` `;
|
|
422
|
+
text += ` '`;
|
|
393
423
|
mapping.sourceOffsets.push(localLoc.start.offset);
|
|
394
424
|
mapping.lengths.push(localName.length);
|
|
395
425
|
mapping.generatedOffsets.push(text.length);
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
text
|
|
426
|
+
secondaryMapping.sourceOffsets.push(localLoc.start.offset);
|
|
427
|
+
secondaryMapping.lengths.push(localName.length);
|
|
428
|
+
secondaryMapping.generatedOffsets.push(text.length - 1);
|
|
429
|
+
secondaryMapping.generatedLengths.push(localName.length + 2);
|
|
430
|
+
linkedCodeMapping.sourceOffsets.push(text.length - 1);
|
|
431
|
+
linkedCodeMapping.lengths.push(localName.length + 2);
|
|
432
|
+
text += `${localName}': (await import(`;
|
|
399
433
|
if (i === 0) {
|
|
400
434
|
mapping.sourceOffsets.push(tokenImporter.fromLoc.start.offset - 1);
|
|
401
435
|
mapping.lengths.push(tokenImporter.from.length + 2);
|
|
402
436
|
mapping.generatedOffsets.push(text.length);
|
|
403
437
|
}
|
|
404
|
-
text += `'${tokenImporter.from}')).default
|
|
438
|
+
text += `'${tokenImporter.from}')).default['`;
|
|
405
439
|
if ('localName' in value) {
|
|
406
440
|
mapping.sourceOffsets.push(value.loc.start.offset);
|
|
407
441
|
mapping.lengths.push(value.name.length);
|
|
408
442
|
mapping.generatedOffsets.push(text.length);
|
|
443
|
+
secondaryMapping.sourceOffsets.push(value.loc.start.offset);
|
|
444
|
+
secondaryMapping.lengths.push(value.name.length);
|
|
445
|
+
secondaryMapping.generatedOffsets.push(text.length - 1);
|
|
446
|
+
secondaryMapping.generatedLengths.push(value.name.length + 2);
|
|
409
447
|
}
|
|
410
|
-
linkedCodeMapping.generatedOffsets.push(text.length);
|
|
411
|
-
linkedCodeMapping.generatedLengths.push(value.name.length);
|
|
412
|
-
text += `${value.name},\n`;
|
|
448
|
+
linkedCodeMapping.generatedOffsets.push(text.length - 1);
|
|
449
|
+
linkedCodeMapping.generatedLengths.push(value.name.length + 2);
|
|
450
|
+
text += `${value.name}'],\n`;
|
|
413
451
|
});
|
|
414
452
|
}
|
|
415
453
|
}
|
|
416
454
|
text += `};\nexport default ${STYLES_EXPORT_NAME};\n`;
|
|
417
|
-
return { text, mapping, linkedCodeMapping };
|
|
455
|
+
return { text, mapping, linkedCodeMapping, secondaryMapping };
|
|
418
456
|
}
|
|
419
457
|
|
|
420
|
-
function
|
|
421
|
-
|
|
422
|
-
if (name === '__proto__') return false;
|
|
423
|
-
if (options.namedExports && name === 'default') return false;
|
|
424
|
-
return true;
|
|
458
|
+
function isValidTokenName(name: string, options: ValidateTokenNameOptions): boolean {
|
|
459
|
+
return validateTokenName(name, options) === undefined;
|
|
425
460
|
}
|
|
@@ -119,14 +119,24 @@ export function parseRule(rule: Rule): ParseRuleResult {
|
|
|
119
119
|
column: rule.source!.start!.column + className.source!.start!.column,
|
|
120
120
|
offset: rule.source!.start!.offset + className.sourceIndex + 1,
|
|
121
121
|
};
|
|
122
|
+
/**
|
|
123
|
+
* When there is a selector like `.\31 backslash`, `className.value` becomes `"1backslash"`.
|
|
124
|
+
* In other words, it is the string after escape sequences have been interpreted.
|
|
125
|
+
* However, here we need the raw string as written in the CSS source code.
|
|
126
|
+
* So we use `className.toString()`.
|
|
127
|
+
*
|
|
128
|
+
* The return value of `className.toString()` may contain leading dots and spaces like `" .1backslash"`.
|
|
129
|
+
* Therefore, we remove the leading spaces and dot with a regular expression.
|
|
130
|
+
*/
|
|
131
|
+
const rawClassName = className.toString().replace(/^\s*\./u, '');
|
|
122
132
|
const end = {
|
|
123
133
|
// The end line is always the same as the start line, as a class selector cannot break in the middle.
|
|
124
134
|
line: start.line,
|
|
125
|
-
column: start.column +
|
|
126
|
-
offset: start.offset +
|
|
135
|
+
column: start.column + rawClassName.length,
|
|
136
|
+
offset: start.offset + rawClassName.length,
|
|
127
137
|
};
|
|
128
138
|
return {
|
|
129
|
-
name:
|
|
139
|
+
name: rawClassName,
|
|
130
140
|
loc: { start, end },
|
|
131
141
|
declarationLoc: { start: rule.source!.start!, end: rule.positionBy({ index: rule.toString().length }) },
|
|
132
142
|
};
|
package/src/util.ts
CHANGED
|
@@ -4,24 +4,48 @@ export function isPosixRelativePath(path: string): boolean {
|
|
|
4
4
|
|
|
5
5
|
const JS_IDENTIFIER_PATTERN = /^[$_\p{ID_Start}][$\u200c\u200d\p{ID_Continue}]*$/u;
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
/** The type of token name violation. */
|
|
8
|
+
export type TokenNameViolation =
|
|
9
|
+
| 'invalid-js-identifier' // Invalid as a JavaScript identifier
|
|
10
|
+
| 'proto-not-allowed' // `__proto__` is not allowed
|
|
11
|
+
| 'default-not-allowed' // `default` is not allowed when namedExports is true
|
|
12
|
+
| 'backslash-not-allowed'; // Backslash (`\`) is not allowed
|
|
13
|
+
|
|
14
|
+
export interface ValidateTokenNameOptions {
|
|
15
|
+
namedExports: boolean;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Validates a token name and returns the violation if any.
|
|
20
|
+
* @param name The token name to validate.
|
|
21
|
+
* @param options The validation options.
|
|
22
|
+
* @returns The violation, or `undefined` if the name is valid.
|
|
23
|
+
*/
|
|
24
|
+
export function validateTokenName(name: string, options: ValidateTokenNameOptions): TokenNameViolation | undefined {
|
|
25
|
+
if (name === '__proto__') return 'proto-not-allowed';
|
|
26
|
+
if (options.namedExports) {
|
|
27
|
+
if (name === 'default') return 'default-not-allowed';
|
|
28
|
+
if (!JS_IDENTIFIER_PATTERN.test(name)) return 'invalid-js-identifier';
|
|
29
|
+
} else {
|
|
30
|
+
if (name.includes('\\')) return 'backslash-not-allowed';
|
|
31
|
+
}
|
|
32
|
+
return undefined;
|
|
9
33
|
}
|
|
10
34
|
|
|
11
35
|
/**
|
|
12
36
|
* The syntax pattern for consuming tokens imported from CSS Module.
|
|
13
|
-
* @example `styles.foo`
|
|
37
|
+
* @example `styles.foo`, `styles['foo']`, `styles["foo"]`
|
|
14
38
|
*/
|
|
15
|
-
// TODO(#125): Support `styles['foo']` and `styles["foo"]`
|
|
16
39
|
// MEMO: The `xxxStyles.foo` format is not supported, because the css module file for current component file is usually imported with `styles`.
|
|
17
40
|
// It is sufficient to support only the `styles.foo` format.
|
|
18
|
-
const TOKEN_CONSUMER_PATTERN =
|
|
41
|
+
const TOKEN_CONSUMER_PATTERN =
|
|
42
|
+
/styles(?:\.([$_\p{ID_Start}][$\u200c\u200d\p{ID_Continue}]*)|\['([^']*?)'\]|\["([^"]*?)"\])/gu;
|
|
19
43
|
|
|
20
44
|
export function findUsedTokenNames(componentText: string): Set<string> {
|
|
21
45
|
const usedClassNames = new Set<string>();
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
usedClassNames.add(
|
|
46
|
+
for (const match of componentText.matchAll(TOKEN_CONSUMER_PATTERN)) {
|
|
47
|
+
const name = match[1] ?? match[2] ?? match[3];
|
|
48
|
+
if (name) usedClassNames.add(name);
|
|
25
49
|
}
|
|
26
50
|
return usedClassNames;
|
|
27
51
|
}
|