@tailwindcss-obfuscator/core 1.0.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.
@@ -0,0 +1,2 @@
1
+ export declare function compressCSS(css: string): string;
2
+ //# sourceMappingURL=compressor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compressor.d.ts","sourceRoot":"","sources":["../src/compressor.ts"],"names":[],"mappings":"AAEA,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAW/C"}
@@ -0,0 +1,17 @@
1
+ // src/compressor.ts
2
+ import { transform as lightningTransform } from "lightningcss";
3
+ function compressCSS(css) {
4
+ try {
5
+ const result = lightningTransform({
6
+ code: Buffer.from(css),
7
+ filename: "style.css",
8
+ minify: true
9
+ });
10
+ return result.code.toString();
11
+ } catch {
12
+ return css;
13
+ }
14
+ }
15
+ export {
16
+ compressCSS
17
+ };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compressor.js","sourceRoot":"","sources":["../src/compressor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,IAAI,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAE/D,MAAM,UAAU,WAAW,CAAC,GAAW;IACtC,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,kBAAkB,CAAC;YACjC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;YACtB,QAAQ,EAAE,WAAW;YACrB,MAAM,EAAE,IAAI;SACZ,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,GAAG,CAAC;IACZ,CAAC;AACF,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { ClassMap } from "./types.ts";
2
+ export declare class CSSHandler {
3
+ private classMap;
4
+ setClassMap(map: ClassMap): void;
5
+ transformCSS(css: string): string;
6
+ reset(): void;
7
+ }
8
+ //# sourceMappingURL=css-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"css-handler.d.ts","sourceRoot":"","sources":["../src/css-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAiB3C,qBAAa,UAAU;IACtB,OAAO,CAAC,QAAQ,CAAuB;IAEvC,WAAW,CAAC,GAAG,EAAE,QAAQ,GAAG,IAAI;IAIhC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IA8CjC,KAAK,IAAI,IAAI;CAGb"}
@@ -0,0 +1,37 @@
1
+ // src/css-handler.ts
2
+ function escapeStringRegexp(str) {
3
+ return str.replaceAll(/[$*+?[\\\]^{|}]/g, "\\$&").replaceAll("-", "\\x2d").replaceAll("/", "\\/").replaceAll("(", "\\\\(").replaceAll(")", "\\\\)").replaceAll(".", "\\\\.").replaceAll(",", "\\\\,");
4
+ }
5
+
6
+ class CSSHandler {
7
+ classMap = new Map;
8
+ setClassMap(map) {
9
+ this.classMap = map;
10
+ }
11
+ transformCSS(css) {
12
+ if (this.classMap.size === 0) {
13
+ return css;
14
+ }
15
+ let transformed = css;
16
+ const sortedClasses = Array.from(this.classMap.entries()).sort((a, b) => b[0].length - a[0].length);
17
+ for (const [original, obfuscated] of sortedClasses) {
18
+ const escapedOriginal = escapeStringRegexp(original);
19
+ const classRegex = new RegExp(`\\.(${escapedOriginal})(?=[\\s\\{\\[\\]\\(\\):,;]|$)`, "g");
20
+ transformed = transformed.replace(classRegex, `.${obfuscated}`);
21
+ if (original.includes("[") || original.includes("]") || original.includes(":") || original.includes("/") || original.includes(".") || original.includes(",")) {
22
+ const cssEscaped = original.replaceAll(/\[/g, "\\[").replaceAll(/\]/g, "\\]").replaceAll(/:/g, "\\:").replaceAll(/\//g, "\\/").replaceAll("(", "\\(").replaceAll(")", "\\)").replaceAll(".", "\\.").replaceAll(",", "\\,");
23
+ const cssSelector = `.${cssEscaped}`;
24
+ if (transformed.includes(cssSelector)) {
25
+ transformed = transformed.replaceAll(cssSelector, `.${obfuscated}`);
26
+ }
27
+ }
28
+ }
29
+ return transformed;
30
+ }
31
+ reset() {
32
+ this.classMap.clear();
33
+ }
34
+ }
35
+ export {
36
+ CSSHandler
37
+ };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"css-handler.js","sourceRoot":"","sources":["../src/css-handler.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,SAAS,kBAAkB,CAAC,GAAW;IACtC,OAAO,GAAG;SACR,UAAU,CAAC,kBAAkB,EAAE,MAAM,CAAC;SACtC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC;SACxB,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC;SACtB,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC;SACxB,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC;SACxB,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC;SACxB,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,OAAO,UAAU;IACd,QAAQ,GAAa,IAAI,GAAG,EAAE,CAAC;IAEvC,WAAW,CAAC,GAAa;QACxB,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;IACrB,CAAC;IAED,YAAY,CAAC,GAAW;QACvB,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO,GAAG,CAAC;QACZ,CAAC;QAED,IAAI,WAAW,GAAG,GAAG,CAAC;QACtB,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAC7D,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CACnC,CAAC;QAEF,KAAK,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,IAAI,aAAa,EAAE,CAAC;YACpD,MAAM,eAAe,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;YACrD,MAAM,UAAU,GAAG,IAAI,MAAM,CAC5B,OAAO,eAAe,gCAAgC,EACtD,GAAG,CACH,CAAC;YACF,WAAW,GAAG,WAAW,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,UAAU,EAAE,CAAC,CAAC;YAEhE,yFAAyF;YACzF,IACC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC;gBACtB,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC;gBACtB,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC;gBACtB,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC;gBACtB,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC;gBACtB,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EACrB,CAAC;gBACF,MAAM,UAAU,GAAG,QAAQ;qBACzB,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC;qBACxB,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC;qBACxB,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC;qBACvB,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC;qBACxB,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC;qBACtB,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC;qBACtB,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC;qBACtB,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBACzB,MAAM,WAAW,GAAG,IAAI,UAAU,EAAE,CAAC;gBACrC,IAAI,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;oBACvC,WAAW,GAAG,WAAW,CAAC,UAAU,CAAC,WAAW,EAAE,IAAI,UAAU,EAAE,CAAC,CAAC;gBACrE,CAAC;YACF,CAAC;QACF,CAAC;QAED,OAAO,WAAW,CAAC;IACpB,CAAC;IAED,KAAK;QACJ,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;CACD"}
@@ -0,0 +1,12 @@
1
+ import type { ClassMap } from "./types.ts";
2
+ export declare class CodeGenerator {
3
+ private counter;
4
+ private readonly map;
5
+ private readonly alphabet;
6
+ private numberToLetters;
7
+ private generateCode;
8
+ getObfuscatedClass(originalClass: string): string;
9
+ getMap(): ClassMap;
10
+ reset(): void;
11
+ }
12
+ //# sourceMappingURL=generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAI3C,qBAAa,aAAa;IACzB,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAuB;IAC3C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgC;IAEzD,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,43 @@
1
+ // src/generator.ts
2
+ var PREFIX = "az";
3
+
4
+ class CodeGenerator {
5
+ counter = 0;
6
+ map = new Map;
7
+ alphabet = "abcdefghijklmnopqrstuvwxyz";
8
+ numberToLetters(num) {
9
+ let result = "";
10
+ let n = num;
11
+ const base = this.alphabet.length;
12
+ do {
13
+ result = this.alphabet[n % base] + result;
14
+ n = Math.floor(n / base);
15
+ } while (n > 0);
16
+ return result;
17
+ }
18
+ generateCode() {
19
+ const letters = this.numberToLetters(this.counter);
20
+ const code = letters.padStart(2, "a");
21
+ this.counter += 1;
22
+ return PREFIX + code;
23
+ }
24
+ getObfuscatedClass(originalClass) {
25
+ const existing = this.map.get(originalClass);
26
+ if (existing !== undefined) {
27
+ return existing;
28
+ }
29
+ const obfuscated = this.generateCode();
30
+ this.map.set(originalClass, obfuscated);
31
+ return obfuscated;
32
+ }
33
+ getMap() {
34
+ return new Map(this.map);
35
+ }
36
+ reset() {
37
+ this.counter = 0;
38
+ this.map.clear();
39
+ }
40
+ }
41
+ export {
42
+ CodeGenerator
43
+ };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,GAAG,IAAI,CAAC;AAEpB,MAAM,OAAO,aAAa;IACjB,OAAO,GAAG,CAAC,CAAC;IACH,GAAG,GAAa,IAAI,GAAG,EAAE,CAAC;IAC1B,QAAQ,GAAG,4BAA4B,CAAC;IAEjD,eAAe,CAAC,GAAW;QAClC,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC,GAAG,GAAG,CAAC;QAEZ,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAClC,GAAG,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,MAAM,CAAC;YAC1C,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QAC1B,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;QAEhB,OAAO,MAAM,CAAC;IACf,CAAC;IAEO,YAAY;QACnB,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnD,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACtC,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;QAClB,OAAO,MAAM,GAAG,IAAI,CAAC;IACtB,CAAC;IAED,kBAAkB,CAAC,aAAqB;QACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC7C,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC5B,OAAO,QAAQ,CAAC;QACjB,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QACvC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;QACxC,OAAO,UAAU,CAAC;IACnB,CAAC;IAED,MAAM;QACL,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK;QACJ,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;QACjB,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;CACD"}
@@ -0,0 +1,6 @@
1
+ export type { ClassMap } from './types.js';
2
+ export { CodeGenerator } from './generator.js';
3
+ export { CSSHandler } from './css-handler.js';
4
+ export { SourceTransformer } from './transformer.js';
5
+ export { compressCSS } from './compressor.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,5 @@
1
+ export { CodeGenerator } from './generator.js';
2
+ export { CSSHandler } from './css-handler.js';
3
+ export { SourceTransformer } from './transformer.js';
4
+ export { compressCSS } from './compressor.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { ClassMap } from "./types.ts";
2
+ export declare class SourceTransformer {
3
+ private readonly generator;
4
+ private normalizeClass;
5
+ private transformClassString;
6
+ private skipToMatchingParen;
7
+ private findCnCalls;
8
+ private processCnCalls;
9
+ private processClassNameAttrs;
10
+ transform(code: string, _id: string): {
11
+ code: string;
12
+ map: ClassMap;
13
+ };
14
+ getMap(): Map<string, string>;
15
+ reset(): void;
16
+ }
17
+ //# sourceMappingURL=transformer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transformer.d.ts","sourceRoot":"","sources":["../src/transformer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AA6C3C,qBAAa,iBAAiB;IAC7B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAuB;IAEjD,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,oBAAoB;IAY5B,OAAO,CAAC,mBAAmB;IAmB3B,OAAO,CAAC,WAAW;IAqBnB,OAAO,CAAC,cAAc;IA0BtB,OAAO,CAAC,qBAAqB;IAoC7B,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,QAAQ,CAAA;KAAE;IAOrE,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAI7B,KAAK,IAAI,IAAI;CAGb"}
@@ -0,0 +1,188 @@
1
+ // src/generator.ts
2
+ var PREFIX = "az";
3
+
4
+ class CodeGenerator {
5
+ counter = 0;
6
+ map = new Map;
7
+ alphabet = "abcdefghijklmnopqrstuvwxyz";
8
+ numberToLetters(num) {
9
+ let result = "";
10
+ let n = num;
11
+ const base = this.alphabet.length;
12
+ do {
13
+ result = this.alphabet[n % base] + result;
14
+ n = Math.floor(n / base);
15
+ } while (n > 0);
16
+ return result;
17
+ }
18
+ generateCode() {
19
+ const letters = this.numberToLetters(this.counter);
20
+ const code = letters.padStart(2, "a");
21
+ this.counter += 1;
22
+ return PREFIX + code;
23
+ }
24
+ getObfuscatedClass(originalClass) {
25
+ const existing = this.map.get(originalClass);
26
+ if (existing !== undefined) {
27
+ return existing;
28
+ }
29
+ const obfuscated = this.generateCode();
30
+ this.map.set(originalClass, obfuscated);
31
+ return obfuscated;
32
+ }
33
+ getMap() {
34
+ return new Map(this.map);
35
+ }
36
+ reset() {
37
+ this.counter = 0;
38
+ this.map.clear();
39
+ }
40
+ }
41
+
42
+ // src/transformer.ts
43
+ import MagicString from "magic-string";
44
+ var CN_FUNCTION_NAMES = ["cn", "clsx", "classNames", "twMerge"];
45
+ var RE_WHITESPACE = /\s+/;
46
+ var TAILWIND_CLASS_TEST = /[:-]/;
47
+ var KNOWN_TAILWIND_UTILITIES = new Set([
48
+ "flex",
49
+ "grid",
50
+ "block",
51
+ "inline",
52
+ "hidden",
53
+ "static",
54
+ "relative",
55
+ "absolute",
56
+ "fixed",
57
+ "sticky",
58
+ "table",
59
+ "contents"
60
+ ]);
61
+ function stripEscapeSequence(str) {
62
+ return str.replaceAll("\\", "");
63
+ }
64
+ function isTailwindClass(className) {
65
+ return TAILWIND_CLASS_TEST.test(className) || KNOWN_TAILWIND_UTILITIES.has(className);
66
+ }
67
+ function skipQuotedString(code, i) {
68
+ const quote = code[i];
69
+ let pos = i + 1;
70
+ while (pos < code.length && code[pos] !== quote) {
71
+ if (code[pos] === "\\") {
72
+ pos += 1;
73
+ }
74
+ pos += 1;
75
+ }
76
+ return pos + 1;
77
+ }
78
+
79
+ class SourceTransformer {
80
+ generator = new CodeGenerator;
81
+ normalizeClass(cls) {
82
+ return stripEscapeSequence(cls);
83
+ }
84
+ transformClassString(classString) {
85
+ const classes = classString.split(RE_WHITESPACE).filter(Boolean);
86
+ const transformed = classes.map((cls) => {
87
+ const normalized = this.normalizeClass(cls);
88
+ if (!isTailwindClass(normalized)) {
89
+ return cls;
90
+ }
91
+ return this.generator.getObfuscatedClass(normalized);
92
+ });
93
+ return transformed.join(" ");
94
+ }
95
+ skipToMatchingParen(code, fromIndex) {
96
+ let depth = 1;
97
+ let i = fromIndex;
98
+ while (i < code.length && depth > 0) {
99
+ if (code[i] === "(") {
100
+ depth += 1;
101
+ i += 1;
102
+ } else if (code[i] === ")") {
103
+ depth -= 1;
104
+ i += 1;
105
+ } else if (code[i] === '"' || code[i] === "'" || code[i] === "`") {
106
+ i = skipQuotedString(code, i);
107
+ } else {
108
+ i += 1;
109
+ }
110
+ }
111
+ return i;
112
+ }
113
+ findCnCalls(code) {
114
+ const calls = [];
115
+ for (const fnName of CN_FUNCTION_NAMES) {
116
+ const regex = new RegExp(`\\b${fnName}\\s*\\(`, "g");
117
+ regex.lastIndex = 0;
118
+ let match = regex.exec(code);
119
+ while (match !== null) {
120
+ const start = match.index;
121
+ const i = this.skipToMatchingParen(code, start + match[0].length);
122
+ calls.push({ content: code.slice(start, i), end: i, start });
123
+ match = regex.exec(code);
124
+ }
125
+ }
126
+ return calls;
127
+ }
128
+ processCnCalls(s, code) {
129
+ const cnCalls = this.findCnCalls(code);
130
+ const stringRegex = /(['"`])(.*?)\1/g;
131
+ for (const call of cnCalls) {
132
+ stringRegex.lastIndex = 0;
133
+ let match = stringRegex.exec(call.content);
134
+ while (match !== null) {
135
+ const [fullMatch, quote, classString] = match;
136
+ if (classString.split(RE_WHITESPACE).some((c) => isTailwindClass(this.normalizeClass(c)))) {
137
+ const transformed = this.transformClassString(classString);
138
+ const startInFile = call.start + match.index;
139
+ s.overwrite(startInFile, startInFile + fullMatch.length, `${quote}${transformed}${quote}`);
140
+ }
141
+ match = stringRegex.exec(call.content);
142
+ }
143
+ }
144
+ }
145
+ processClassNameAttrs(s, code) {
146
+ const jsxClassNameRegex = /className\s*=\s*(?:\{[^}]*["'`]([^"'`]+)["'`][^}]*\}|["'`]([^"'`]+)["'`])/g;
147
+ const compiledClassNameRegex = /className\s*:\s*(["'`])([^"'`]+)\1/g;
148
+ for (const { regex, getClassString } of [
149
+ {
150
+ getClassString: (m) => m[1] || m[2],
151
+ regex: jsxClassNameRegex
152
+ },
153
+ {
154
+ getClassString: (m) => m[2],
155
+ regex: compiledClassNameRegex
156
+ }
157
+ ]) {
158
+ regex.lastIndex = 0;
159
+ let classMatch = regex.exec(code);
160
+ while (classMatch !== null) {
161
+ const [fullMatch] = classMatch;
162
+ const classString = getClassString(classMatch);
163
+ if (classString && !CN_FUNCTION_NAMES.some((fn) => fullMatch.includes(`${fn}(`)) && classString.split(RE_WHITESPACE).some((c) => isTailwindClass(this.normalizeClass(c)))) {
164
+ const transformed = this.transformClassString(classString);
165
+ const startInFile = classMatch.index;
166
+ const newValue = fullMatch.replace(classString, transformed);
167
+ s.overwrite(startInFile, startInFile + fullMatch.length, newValue);
168
+ }
169
+ classMatch = regex.exec(code);
170
+ }
171
+ }
172
+ }
173
+ transform(code, _id) {
174
+ const s = new MagicString(code);
175
+ this.processCnCalls(s, code);
176
+ this.processClassNameAttrs(s, code);
177
+ return { code: s.toString(), map: this.generator.getMap() };
178
+ }
179
+ getMap() {
180
+ return this.generator.getMap();
181
+ }
182
+ reset() {
183
+ this.generator.reset();
184
+ }
185
+ }
186
+ export {
187
+ SourceTransformer
188
+ };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transformer.js","sourceRoot":"","sources":["../src/transformer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export type ClassMap = Map<string, string>;
2
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC"}
package/dist/types.js ADDED
File without changes
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "dependencies": {
3
+ "lightningcss": "^1.31.1",
4
+ "magic-string": "^0.30.21"
5
+ },
6
+ "devDependencies": {
7
+ "typescript": "^5.9.3"
8
+ },
9
+ "exports": {
10
+ "./compressor": {
11
+ "import": "./dist/compressor.js",
12
+ "types": "./dist/compressor.d.ts"
13
+ },
14
+ "./css-handler": {
15
+ "import": "./dist/css-handler.js",
16
+ "types": "./dist/css-handler.d.ts"
17
+ },
18
+ "./transformer": {
19
+ "import": "./dist/transformer.js",
20
+ "types": "./dist/transformer.d.ts"
21
+ },
22
+ "./types": {
23
+ "import": "./dist/types.js",
24
+ "types": "./dist/types.d.ts"
25
+ }
26
+ },
27
+ "files": [
28
+ "dist"
29
+ ],
30
+ "name": "@tailwindcss-obfuscator/core",
31
+ "publishConfig": {
32
+ "access": "public"
33
+ },
34
+ "scripts": {
35
+ "build": "tsc && bun build src/transformer.ts src/css-handler.ts src/compressor.ts src/generator.ts src/types.ts --outdir=dist --format=esm --external=lightningcss --external=magic-string"
36
+ },
37
+ "type": "module",
38
+ "types": "./dist/transformer.d.ts",
39
+ "version": "1.0.0"
40
+ }