@tailwindcss-obfuscator/core 1.0.2 → 1.0.3

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 (60) hide show
  1. package/dist/1-class-strings-finder.d.ts +12 -0
  2. package/dist/1-class-strings-finder.d.ts.map +1 -0
  3. package/dist/1-class-strings-finder.js +96 -0
  4. package/dist/2-obfuscator.d.ts +14 -0
  5. package/dist/2-obfuscator.d.ts.map +1 -0
  6. package/dist/2-obfuscator.js +45 -0
  7. package/dist/2-rename-class-strings.d.ts +14 -0
  8. package/dist/2-rename-class-strings.d.ts.map +1 -0
  9. package/dist/2-rename-class-strings.js +45 -0
  10. package/dist/3-apply-class-names.d.ts +18 -0
  11. package/dist/3-apply-class-names.d.ts.map +1 -0
  12. package/dist/3-apply-class-names.js +227 -0
  13. package/dist/3-rewrite-source.d.ts +17 -0
  14. package/dist/3-rewrite-source.d.ts.map +1 -0
  15. package/dist/3-rewrite-source.js +199 -0
  16. package/dist/4-rewrite-css.d.ts +8 -0
  17. package/dist/4-rewrite-css.d.ts.map +1 -0
  18. package/dist/4-rewrite-css.js +42 -0
  19. package/dist/apply-class-names.d.ts +18 -0
  20. package/dist/apply-class-names.d.ts.map +1 -0
  21. package/dist/apply-class-names.js +227 -0
  22. package/dist/class-strings-finder.d.ts +12 -0
  23. package/dist/class-strings-finder.d.ts.map +1 -0
  24. package/dist/class-strings-finder.js +96 -0
  25. package/dist/css/4-rewrite-css.d.ts +8 -0
  26. package/dist/css/4-rewrite-css.d.ts.map +1 -0
  27. package/dist/css/4-rewrite-css.js +42 -0
  28. package/dist/css/css-handler.d.ts +8 -0
  29. package/dist/css/css-handler.d.ts.map +1 -0
  30. package/dist/css/css-handler.js +42 -0
  31. package/dist/css/parse-class-selectors.d.ts +7 -0
  32. package/dist/css/parse-class-selectors.d.ts.map +1 -0
  33. package/dist/css/parse-class-selectors.js +65 -0
  34. package/dist/css/rewrite-css.d.ts +8 -0
  35. package/dist/css/rewrite-css.d.ts.map +1 -0
  36. package/dist/css/rewrite-css.js +42 -0
  37. package/dist/css-handler.d.ts.map +1 -1
  38. package/dist/css-handler.js +5 -0
  39. package/dist/find-class-strings.d.ts +12 -0
  40. package/dist/find-class-strings.d.ts.map +1 -0
  41. package/dist/find-class-strings.js +96 -0
  42. package/dist/generate-class-names.d.ts +14 -0
  43. package/dist/generate-class-names.d.ts.map +1 -0
  44. package/dist/generate-class-names.js +45 -0
  45. package/dist/generator.d.ts +2 -0
  46. package/dist/generator.d.ts.map +1 -1
  47. package/dist/generator.js +5 -3
  48. package/dist/obfuscator.d.ts +14 -0
  49. package/dist/obfuscator.d.ts.map +1 -0
  50. package/dist/obfuscator.js +45 -0
  51. package/dist/parse-class-selectors.d.ts +7 -0
  52. package/dist/parse-class-selectors.d.ts.map +1 -0
  53. package/dist/parse-class-selectors.js +65 -0
  54. package/dist/rewrite-source.d.ts +17 -0
  55. package/dist/rewrite-source.d.ts.map +1 -0
  56. package/dist/rewrite-source.js +199 -0
  57. package/dist/transformer.d.ts +7 -3
  58. package/dist/transformer.d.ts.map +1 -1
  59. package/dist/transformer.js +50 -39
  60. package/package.json +6 -22
@@ -0,0 +1,12 @@
1
+ export interface ClassStringMatch {
2
+ end: number;
3
+ fullMatch: string;
4
+ classString: string;
5
+ start: number;
6
+ }
7
+ /**
8
+ * Find all class string occurrences in source (className="...", cn("..."), etc.).
9
+ * Only finds; does not replace or check allowlist.
10
+ */
11
+ export declare function findClassStrings(code: string): ClassStringMatch[];
12
+ //# sourceMappingURL=1-class-strings-finder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"1-class-strings-finder.d.ts","sourceRoot":"","sources":["../src/1-class-strings-finder.ts"],"names":[],"mappings":"AAsDA,MAAM,WAAW,gBAAgB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAqDjE"}
@@ -0,0 +1,96 @@
1
+ // src/1-class-strings-finder.ts
2
+ var CN_FUNCTION_NAMES = ["cn", "clsx", "classNames", "twMerge", "cva"];
3
+ function skipQuotedString(code, i) {
4
+ const quote = code[i];
5
+ let pos = i + 1;
6
+ while (pos < code.length && code[pos] !== quote) {
7
+ if (code[pos] === "\\") {
8
+ pos += 1;
9
+ }
10
+ pos += 1;
11
+ }
12
+ return pos + 1;
13
+ }
14
+ function skipToMatchingParen(code, fromIndex) {
15
+ let depth = 1;
16
+ let i = fromIndex;
17
+ while (i < code.length && depth > 0) {
18
+ if (code[i] === "(") {
19
+ depth += 1;
20
+ i += 1;
21
+ } else if (code[i] === ")") {
22
+ depth -= 1;
23
+ i += 1;
24
+ } else if (code[i] === '"' || code[i] === "'" || code[i] === "`") {
25
+ i = skipQuotedString(code, i);
26
+ } else {
27
+ i += 1;
28
+ }
29
+ }
30
+ return i;
31
+ }
32
+ function findCnCalls(code) {
33
+ const calls = [];
34
+ for (const fnName of CN_FUNCTION_NAMES) {
35
+ const regex = new RegExp(`\\b${fnName}\\s*\\(`, "g");
36
+ regex.lastIndex = 0;
37
+ let match = regex.exec(code);
38
+ while (match !== null) {
39
+ const start = match.index;
40
+ const i = skipToMatchingParen(code, start + match[0].length);
41
+ calls.push({ content: code.slice(start, i), end: i, start });
42
+ match = regex.exec(code);
43
+ }
44
+ }
45
+ return calls;
46
+ }
47
+ function findClassStrings(code) {
48
+ const matches = [];
49
+ const stringRegex = /(['"`])(.*?)\1/g;
50
+ for (const call of findCnCalls(code)) {
51
+ stringRegex.lastIndex = 0;
52
+ let match = stringRegex.exec(call.content);
53
+ while (match !== null) {
54
+ const [fullMatch, , classString] = match;
55
+ matches.push({
56
+ classString,
57
+ end: call.start + match.index + fullMatch.length,
58
+ fullMatch,
59
+ start: call.start + match.index
60
+ });
61
+ match = stringRegex.exec(call.content);
62
+ }
63
+ }
64
+ const jsxClassNameRegex = /className\s*=\s*(?:\{[^}]*["'`]([^"'`]+)["'`][^}]*\}|["'`]([^"'`]+)["'`])/g;
65
+ const compiledClassNameRegex = /className\s*:\s*(["'`])([^"'`]+)\1/g;
66
+ for (const { regex, getClassString } of [
67
+ {
68
+ getClassString: (m) => m[1] || m[2],
69
+ regex: jsxClassNameRegex
70
+ },
71
+ {
72
+ getClassString: (m) => m[2],
73
+ regex: compiledClassNameRegex
74
+ }
75
+ ]) {
76
+ regex.lastIndex = 0;
77
+ let classMatch = regex.exec(code);
78
+ while (classMatch !== null) {
79
+ const [fullMatch] = classMatch;
80
+ const classString = getClassString(classMatch);
81
+ if (classString && !CN_FUNCTION_NAMES.some((fn) => fullMatch.includes(`${fn}(`))) {
82
+ matches.push({
83
+ classString,
84
+ end: classMatch.index + fullMatch.length,
85
+ fullMatch,
86
+ start: classMatch.index
87
+ });
88
+ }
89
+ classMatch = regex.exec(code);
90
+ }
91
+ }
92
+ return matches;
93
+ }
94
+ export {
95
+ findClassStrings
96
+ };
@@ -0,0 +1,14 @@
1
+ import type { ClassMap } from "./types.ts";
2
+ export declare class Obfuscator {
3
+ private counter;
4
+ private readonly map;
5
+ private readonly prefix;
6
+ private readonly alphabet;
7
+ constructor(prefix?: string);
8
+ private numberToLetters;
9
+ private generateCode;
10
+ getObfuscatedClass(originalClass: string): string;
11
+ getMap(): ClassMap;
12
+ reset(): void;
13
+ }
14
+ //# sourceMappingURL=2-obfuscator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"2-obfuscator.d.ts","sourceRoot":"","sources":["../src/2-obfuscator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,qBAAa,UAAU;IACtB,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAuB;IAC3C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgC;gBAE7C,MAAM,SAAO;IAIzB,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,YAAY;IAOpB,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM;IAWjD,MAAM,IAAI,QAAQ;IAIlB,KAAK,IAAI,IAAI;CAIb"}
@@ -0,0 +1,45 @@
1
+ // src/2-obfuscator.ts
2
+ class Obfuscator {
3
+ counter = 0;
4
+ map = new Map;
5
+ prefix;
6
+ alphabet = "abcdefghijklmnopqrstuvwxyz";
7
+ constructor(prefix = "az") {
8
+ this.prefix = prefix;
9
+ }
10
+ numberToLetters(num) {
11
+ let result = "";
12
+ let n = num;
13
+ const base = this.alphabet.length;
14
+ do {
15
+ result = this.alphabet[n % base] + result;
16
+ n = Math.floor(n / base);
17
+ } while (n > 0);
18
+ return result;
19
+ }
20
+ generateCode() {
21
+ const letters = this.numberToLetters(this.counter);
22
+ const code = letters.padStart(2, "a");
23
+ this.counter += 1;
24
+ return this.prefix + code;
25
+ }
26
+ getObfuscatedClass(originalClass) {
27
+ const existing = this.map.get(originalClass);
28
+ if (existing !== undefined) {
29
+ return existing;
30
+ }
31
+ const obfuscated = this.generateCode();
32
+ this.map.set(originalClass, obfuscated);
33
+ return obfuscated;
34
+ }
35
+ getMap() {
36
+ return new Map(this.map);
37
+ }
38
+ reset() {
39
+ this.counter = 0;
40
+ this.map.clear();
41
+ }
42
+ }
43
+ export {
44
+ Obfuscator
45
+ };
@@ -0,0 +1,14 @@
1
+ import type { ClassMap } from "./types.ts";
2
+ export declare class Obfuscator {
3
+ private counter;
4
+ private readonly map;
5
+ private readonly prefix;
6
+ private readonly alphabet;
7
+ constructor(prefix?: string);
8
+ private numberToLetters;
9
+ private generateCode;
10
+ getObfuscatedClass(originalClass: string): string;
11
+ getMap(): ClassMap;
12
+ reset(): void;
13
+ }
14
+ //# sourceMappingURL=2-rename-class-strings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"2-rename-class-strings.d.ts","sourceRoot":"","sources":["../src/2-rename-class-strings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,qBAAa,UAAU;IACtB,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAuB;IAC3C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgC;gBAE7C,MAAM,SAAO;IAIzB,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,YAAY;IAOpB,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM;IAWjD,MAAM,IAAI,QAAQ;IAIlB,KAAK,IAAI,IAAI;CAIb"}
@@ -0,0 +1,45 @@
1
+ // src/2-rename-class-strings.ts
2
+ class Obfuscator {
3
+ counter = 0;
4
+ map = new Map;
5
+ prefix;
6
+ alphabet = "abcdefghijklmnopqrstuvwxyz";
7
+ constructor(prefix = "az") {
8
+ this.prefix = prefix;
9
+ }
10
+ numberToLetters(num) {
11
+ let result = "";
12
+ let n = num;
13
+ const base = this.alphabet.length;
14
+ do {
15
+ result = this.alphabet[n % base] + result;
16
+ n = Math.floor(n / base);
17
+ } while (n > 0);
18
+ return result;
19
+ }
20
+ generateCode() {
21
+ const letters = this.numberToLetters(this.counter);
22
+ const code = letters.padStart(2, "a");
23
+ this.counter += 1;
24
+ return this.prefix + code;
25
+ }
26
+ getObfuscatedClass(originalClass) {
27
+ const existing = this.map.get(originalClass);
28
+ if (existing !== undefined) {
29
+ return existing;
30
+ }
31
+ const obfuscated = this.generateCode();
32
+ this.map.set(originalClass, obfuscated);
33
+ return obfuscated;
34
+ }
35
+ getMap() {
36
+ return new Map(this.map);
37
+ }
38
+ reset() {
39
+ this.counter = 0;
40
+ this.map.clear();
41
+ }
42
+ }
43
+ export {
44
+ Obfuscator
45
+ };
@@ -0,0 +1,18 @@
1
+ import type { ClassMap } from "./types.ts";
2
+ export declare class ApplyClassNames {
3
+ private allowlist;
4
+ private readonly obfuscator;
5
+ constructor(prefix?: string);
6
+ setAllowlist(allowlist: Set<string>): void;
7
+ private normalizeClass;
8
+ private isInAllowlist;
9
+ private transformClassString;
10
+ updateJavaScript(code: string, _id: string): {
11
+ code: string;
12
+ map: ClassMap;
13
+ };
14
+ updateStylesheet(css: string): string;
15
+ getMap(): Map<string, string>;
16
+ reset(): void;
17
+ }
18
+ //# sourceMappingURL=3-apply-class-names.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"3-apply-class-names.d.ts","sourceRoot":"","sources":["../src/3-apply-class-names.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AA6B3C,qBAAa,eAAe;IAC3B,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;gBAE5B,MAAM,SAAO;IAIzB,YAAY,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI;IAI1C,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,oBAAoB;IAY5B,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,QAAQ,CAAA;KAAE;IAwB5E,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAyDrC,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAI7B,KAAK,IAAI,IAAI;CAIb"}
@@ -0,0 +1,227 @@
1
+ // src/find-class-strings.ts
2
+ var CN_FUNCTION_NAMES = ["cn", "clsx", "classNames", "twMerge", "cva"];
3
+ function skipQuotedString(code, i) {
4
+ const quote = code[i];
5
+ let pos = i + 1;
6
+ while (pos < code.length && code[pos] !== quote) {
7
+ if (code[pos] === "\\") {
8
+ pos += 1;
9
+ }
10
+ pos += 1;
11
+ }
12
+ return pos + 1;
13
+ }
14
+ function skipToMatchingParen(code, fromIndex) {
15
+ let depth = 1;
16
+ let i = fromIndex;
17
+ while (i < code.length && depth > 0) {
18
+ if (code[i] === "(") {
19
+ depth += 1;
20
+ i += 1;
21
+ } else if (code[i] === ")") {
22
+ depth -= 1;
23
+ i += 1;
24
+ } else if (code[i] === '"' || code[i] === "'" || code[i] === "`") {
25
+ i = skipQuotedString(code, i);
26
+ } else {
27
+ i += 1;
28
+ }
29
+ }
30
+ return i;
31
+ }
32
+ function findCnCalls(code) {
33
+ const calls = [];
34
+ for (const fnName of CN_FUNCTION_NAMES) {
35
+ const regex = new RegExp(`\\b${fnName}\\s*\\(`, "g");
36
+ regex.lastIndex = 0;
37
+ let match = regex.exec(code);
38
+ while (match !== null) {
39
+ const start = match.index;
40
+ const i = skipToMatchingParen(code, start + match[0].length);
41
+ calls.push({ content: code.slice(start, i), end: i, start });
42
+ match = regex.exec(code);
43
+ }
44
+ }
45
+ return calls;
46
+ }
47
+ function findClassStrings(code) {
48
+ const matches = [];
49
+ const stringRegex = /(['"`])(.*?)\1/g;
50
+ for (const call of findCnCalls(code)) {
51
+ stringRegex.lastIndex = 0;
52
+ let match = stringRegex.exec(call.content);
53
+ while (match !== null) {
54
+ const [fullMatch, , classString] = match;
55
+ matches.push({
56
+ classString,
57
+ end: call.start + match.index + fullMatch.length,
58
+ fullMatch,
59
+ start: call.start + match.index
60
+ });
61
+ match = stringRegex.exec(call.content);
62
+ }
63
+ }
64
+ const jsxClassNameRegex = /className\s*=\s*(?:\{[^}]*["'`]([^"'`]+)["'`][^}]*\}|["'`]([^"'`]+)["'`])/g;
65
+ const compiledClassNameRegex = /className\s*:\s*(["'`])([^"'`]+)\1/g;
66
+ for (const { regex, getClassString } of [
67
+ {
68
+ getClassString: (m) => m[1] || m[2],
69
+ regex: jsxClassNameRegex
70
+ },
71
+ {
72
+ getClassString: (m) => m[2],
73
+ regex: compiledClassNameRegex
74
+ }
75
+ ]) {
76
+ regex.lastIndex = 0;
77
+ let classMatch = regex.exec(code);
78
+ while (classMatch !== null) {
79
+ const [fullMatch] = classMatch;
80
+ const classString = getClassString(classMatch);
81
+ if (classString && !CN_FUNCTION_NAMES.some((fn) => fullMatch.includes(`${fn}(`))) {
82
+ matches.push({
83
+ classString,
84
+ end: classMatch.index + fullMatch.length,
85
+ fullMatch,
86
+ start: classMatch.index
87
+ });
88
+ }
89
+ classMatch = regex.exec(code);
90
+ }
91
+ }
92
+ return matches;
93
+ }
94
+
95
+ // src/generate-class-names.ts
96
+ class Obfuscator {
97
+ counter = 0;
98
+ map = new Map;
99
+ prefix;
100
+ alphabet = "abcdefghijklmnopqrstuvwxyz";
101
+ constructor(prefix = "az") {
102
+ this.prefix = prefix;
103
+ }
104
+ numberToLetters(num) {
105
+ let result = "";
106
+ let n = num;
107
+ const base = this.alphabet.length;
108
+ do {
109
+ result = this.alphabet[n % base] + result;
110
+ n = Math.floor(n / base);
111
+ } while (n > 0);
112
+ return result;
113
+ }
114
+ generateCode() {
115
+ const letters = this.numberToLetters(this.counter);
116
+ const code = letters.padStart(2, "a");
117
+ this.counter += 1;
118
+ return this.prefix + code;
119
+ }
120
+ getObfuscatedClass(originalClass) {
121
+ const existing = this.map.get(originalClass);
122
+ if (existing !== undefined) {
123
+ return existing;
124
+ }
125
+ const obfuscated = this.generateCode();
126
+ this.map.set(originalClass, obfuscated);
127
+ return obfuscated;
128
+ }
129
+ getMap() {
130
+ return new Map(this.map);
131
+ }
132
+ reset() {
133
+ this.counter = 0;
134
+ this.map.clear();
135
+ }
136
+ }
137
+
138
+ // src/3-apply-class-names.ts
139
+ var RE_WHITESPACE = /\s+/;
140
+ function stripEscapeSequence(str) {
141
+ return str.replaceAll("\\", "");
142
+ }
143
+ function escapeStringRegexp(str) {
144
+ return str.replaceAll(/[$*+?[\\\]^{|}]/g, "\\$&").replaceAll("-", "\\x2d").replaceAll("/", "\\/").replaceAll("(", "\\\\(").replaceAll(")", "\\\\)").replaceAll(".", "\\\\.").replaceAll(",", "\\\\,");
145
+ }
146
+
147
+ class ApplyClassNames {
148
+ allowlist = new Set;
149
+ obfuscator;
150
+ constructor(prefix = "az") {
151
+ this.obfuscator = new Obfuscator(prefix);
152
+ }
153
+ setAllowlist(allowlist) {
154
+ this.allowlist = allowlist;
155
+ }
156
+ normalizeClass(cls) {
157
+ return stripEscapeSequence(cls);
158
+ }
159
+ isInAllowlist(normalized) {
160
+ return this.allowlist.has(normalized);
161
+ }
162
+ transformClassString(classString) {
163
+ const classes = classString.split(RE_WHITESPACE).filter(Boolean);
164
+ const transformed = classes.map((cls) => {
165
+ const normalized = this.normalizeClass(cls);
166
+ if (!this.isInAllowlist(normalized)) {
167
+ return cls;
168
+ }
169
+ return this.obfuscator.getObfuscatedClass(normalized);
170
+ });
171
+ return transformed.join(" ");
172
+ }
173
+ updateJavaScript(code, _id) {
174
+ const matches = findClassStrings(code);
175
+ const replacements = [];
176
+ for (const { start, end, classString, fullMatch } of matches) {
177
+ const hasAllowlistClass = classString.split(RE_WHITESPACE).some((c) => this.isInAllowlist(this.normalizeClass(c)));
178
+ if (hasAllowlistClass) {
179
+ const transformed = this.transformClassString(classString);
180
+ const newContent = fullMatch.replace(classString, transformed);
181
+ replacements.push({ end, newContent, start });
182
+ }
183
+ }
184
+ replacements.sort((a, b) => b.start - a.start);
185
+ let result = code;
186
+ for (const { start, end, newContent } of replacements) {
187
+ result = result.slice(0, start) + newContent + result.slice(end);
188
+ }
189
+ return { code: result, map: this.obfuscator.getMap() };
190
+ }
191
+ updateStylesheet(css) {
192
+ const classMap = this.obfuscator.getMap();
193
+ if (classMap.size === 0) {
194
+ return css;
195
+ }
196
+ let transformed = css;
197
+ const sortedClasses = Array.from(classMap.entries()).sort((a, b) => b[0].length - a[0].length);
198
+ for (const [original, obfuscated] of sortedClasses) {
199
+ const escapedOriginal = escapeStringRegexp(original);
200
+ const classRegex = new RegExp(`\\.(${escapedOriginal})(?=[\\s\\{\\[\\]\\(\\):,;]|$)`, "g");
201
+ transformed = transformed.replace(classRegex, `.${obfuscated}`);
202
+ if (original.endsWith("!")) {
203
+ const escapedForRegex = escapeStringRegexp(`${original.slice(0, -1)}\\!`);
204
+ const importantRegex = new RegExp(`\\.${escapedForRegex}(?=[\\s\\{\\[\\]\\(\\):,;]|$)`, "g");
205
+ transformed = transformed.replace(importantRegex, `.${obfuscated}`);
206
+ }
207
+ if (original.includes("[") || original.includes("]") || original.includes(":") || original.includes("/") || original.includes(".") || original.includes(",")) {
208
+ const cssEscaped = original.replaceAll(/\[/g, "\\[").replaceAll(/\]/g, "\\]").replaceAll(/:/g, "\\:").replaceAll(/\//g, "\\/").replaceAll("(", "\\(").replaceAll(")", "\\)").replaceAll(".", "\\.").replaceAll(",", "\\,");
209
+ const cssSelector = `.${cssEscaped}`;
210
+ if (transformed.includes(cssSelector)) {
211
+ transformed = transformed.replaceAll(cssSelector, `.${obfuscated}`);
212
+ }
213
+ }
214
+ }
215
+ return transformed;
216
+ }
217
+ getMap() {
218
+ return this.obfuscator.getMap();
219
+ }
220
+ reset() {
221
+ this.allowlist = new Set;
222
+ this.obfuscator.reset();
223
+ }
224
+ }
225
+ export {
226
+ ApplyClassNames
227
+ };
@@ -0,0 +1,17 @@
1
+ import type { ClassMap } from "./types.ts";
2
+ export declare class RewriteSource {
3
+ private allowlist;
4
+ private readonly obfuscator;
5
+ constructor(prefix?: string);
6
+ setAllowlist(allowlist: Set<string>): void;
7
+ private normalizeClass;
8
+ private isInAllowlist;
9
+ private transformClassString;
10
+ transform(code: string, _id: string): {
11
+ code: string;
12
+ map: ClassMap;
13
+ };
14
+ getMap(): Map<string, string>;
15
+ reset(): void;
16
+ }
17
+ //# sourceMappingURL=3-rewrite-source.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"3-rewrite-source.d.ts","sourceRoot":"","sources":["../src/3-rewrite-source.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAc3C,qBAAa,aAAa;IACzB,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;gBAE5B,MAAM,SAAO;IAIzB,YAAY,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI;IAI1C,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,oBAAoB;IAY5B,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,QAAQ,CAAA;KAAE;IAyBrE,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAI7B,KAAK,IAAI,IAAI;CAIb"}