@tailwindcss-obfuscator/core 1.0.11 → 1.1.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.
@@ -13,7 +13,5 @@ export declare class ApplyClassNames {
13
13
  };
14
14
  updateStylesheet(css: string): string;
15
15
  getMap(): Map<string, string>;
16
- /** Clears the obfuscator map only. Keeps allowlist so configResolved (after buildStart) does not clear it before transform runs. */
17
- reset(): void;
18
16
  }
19
17
  //# sourceMappingURL=apply-class-names.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"apply-class-names.d.ts","sourceRoot":"","sources":["../src/apply-class-names.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,QAAQ,EAAc,MAAM,2BAA2B,CAAC;AA6BtE,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,oIAAoI;IACpI,KAAK,IAAI,IAAI;CAGb"}
1
+ {"version":3,"file":"apply-class-names.d.ts","sourceRoot":"","sources":["../src/apply-class-names.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,QAAQ,EAAc,MAAM,2BAA2B,CAAC;AAyBtE,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;IA2DrC,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;CAG7B"}
@@ -44,6 +44,75 @@ function findCnCalls(code) {
44
44
  }
45
45
  return calls;
46
46
  }
47
+ function findObjectKeysInSpan(code, start, end) {
48
+ const keys = [];
49
+ let i = start;
50
+ let braceDepth = 0;
51
+ let inObject = false;
52
+ while (i < end) {
53
+ const ch = code[i];
54
+ if (ch === '"' || ch === "'" || ch === "`") {
55
+ i = skipQuotedString(code, i);
56
+ } else if (ch === "{") {
57
+ if (!inObject) {
58
+ inObject = true;
59
+ }
60
+ braceDepth += 1;
61
+ i += 1;
62
+ } else if (ch === "}") {
63
+ braceDepth -= 1;
64
+ if (braceDepth === 0) {
65
+ inObject = false;
66
+ }
67
+ i += 1;
68
+ } else if (inObject && braceDepth === 1) {
69
+ if (/[a-zA-Z_]/.test(ch)) {
70
+ let key = "";
71
+ const keyStart = i;
72
+ while (i < end && /[a-zA-Z0-9_-]/.test(code[i])) {
73
+ key += code[i];
74
+ i += 1;
75
+ }
76
+ const keyEnd = i;
77
+ while (i < end && /\s/.test(code[i])) {
78
+ i += 1;
79
+ }
80
+ if (i < end && code[i] === ":") {
81
+ keys.push({ end: keyEnd, key, start: keyStart });
82
+ i += 1;
83
+ }
84
+ } else if (ch === '"' || ch === "'") {
85
+ const strStart = i;
86
+ i = skipQuotedString(code, i);
87
+ const strEnd = i;
88
+ const quote = code[strStart];
89
+ let key = "";
90
+ let j = strStart + 1;
91
+ while (j < strEnd - 1) {
92
+ if (code[j] === "\\" && j + 1 < strEnd - 1) {
93
+ key += code[j + 1];
94
+ j += 2;
95
+ } else {
96
+ key += code[j];
97
+ j += 1;
98
+ }
99
+ }
100
+ while (i < end && /\s/.test(code[i])) {
101
+ i += 1;
102
+ }
103
+ if (i < end && code[i] === ":") {
104
+ keys.push({ end: strEnd, key, start: strStart });
105
+ i += 1;
106
+ }
107
+ } else {
108
+ i += 1;
109
+ }
110
+ } else {
111
+ i += 1;
112
+ }
113
+ }
114
+ return keys;
115
+ }
47
116
  function findClassStrings(code) {
48
117
  const matches = [];
49
118
  const stringRegex = /(['"`])(.*?)\1/g;
@@ -62,6 +131,22 @@ function findClassStrings(code) {
62
131
  }
63
132
  match = stringRegex.exec(call.content);
64
133
  }
134
+ const parenContentStart = call.content.indexOf("(") + 1;
135
+ const parenContentEnd = call.content.lastIndexOf(")");
136
+ if (parenContentStart > 0 && parenContentEnd > parenContentStart) {
137
+ const callBodyStart = call.start + parenContentStart;
138
+ const keys = findObjectKeysInSpan(code, callBodyStart, callBodyStart + (parenContentEnd - parenContentStart));
139
+ for (const { key, start, end } of keys) {
140
+ if (key.length >= 1) {
141
+ matches.push({
142
+ classString: key,
143
+ end,
144
+ fullMatch: code.slice(start, end),
145
+ start
146
+ });
147
+ }
148
+ }
149
+ }
65
150
  }
66
151
  const jsxClassNameRegex = /className\s*=\s*(?:\{\s*["'`]([^"'`]+)["'`]\s*\}|["'`]([^"'`]+)["'`])/g;
67
152
  const compiledClassNameRegex = /className\s*:\s*(["'`])([^"'`]+)\1/g;
@@ -144,7 +229,6 @@ class Obfuscator {
144
229
  getMap() {
145
230
  return new Map(this.map);
146
231
  }
147
- reset() {}
148
232
  }
149
233
  // src/apply-class-names.ts
150
234
  var RE_WHITESPACE = /\s+/;
@@ -215,8 +299,8 @@ class ApplyClassNames {
215
299
  const importantRegex = new RegExp(`\\.${escapedForRegex}(?=[\\s\\{\\[\\]\\(\\):,;]|$)`, "g");
216
300
  transformed = transformed.replace(importantRegex, `.${obfuscated}`);
217
301
  }
218
- if (original.includes("[") || original.includes("]") || original.includes(":") || original.includes("/") || original.includes(".") || original.includes(",")) {
219
- const cssEscaped = original.replaceAll(/\[/g, "\\[").replaceAll(/\]/g, "\\]").replaceAll(/:/g, "\\:").replaceAll(/\//g, "\\/").replaceAll("(", "\\(").replaceAll(")", "\\)").replaceAll(".", "\\.").replaceAll(",", "\\,");
302
+ if (original.includes("[") || original.includes("]") || original.includes(":") || original.includes("/") || original.includes(".") || original.includes(",") || original.includes("&")) {
303
+ const cssEscaped = original.replaceAll(/\[/g, "\\[").replaceAll(/\]/g, "\\]").replaceAll(/:/g, "\\:").replaceAll(/\//g, "\\/").replaceAll("(", "\\(").replaceAll(")", "\\)").replaceAll(".", "\\.").replaceAll(",", "\\,").replaceAll("&", "\\&");
220
304
  const cssSelector = `.${cssEscaped}`;
221
305
  if (transformed.includes(cssSelector)) {
222
306
  transformed = transformed.replaceAll(cssSelector, `.${obfuscated}`);
@@ -228,9 +312,6 @@ class ApplyClassNames {
228
312
  getMap() {
229
313
  return this.obfuscator.getMap();
230
314
  }
231
- reset() {
232
- this.obfuscator.reset();
233
- }
234
315
  }
235
316
  export {
236
317
  ApplyClassNames
@@ -4,9 +4,5 @@ export interface ClassStringMatch {
4
4
  classString: string;
5
5
  start: number;
6
6
  }
7
- /**
8
- * Find all class string occurrences in source (className="...", cn("..."), etc.).
9
- * Only finds; does not replace or check allowlist.
10
- */
11
7
  export declare function findClassStrings(code: string): ClassStringMatch[];
12
8
  //# sourceMappingURL=find-class-strings.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"find-class-strings.d.ts","sourceRoot":"","sources":["../src/find-class-strings.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,CA0DjE"}
1
+ {"version":3,"file":"find-class-strings.d.ts","sourceRoot":"","sources":["../src/find-class-strings.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;AAqFD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAgFjE"}
@@ -44,6 +44,75 @@ function findCnCalls(code) {
44
44
  }
45
45
  return calls;
46
46
  }
47
+ function findObjectKeysInSpan(code, start, end) {
48
+ const keys = [];
49
+ let i = start;
50
+ let braceDepth = 0;
51
+ let inObject = false;
52
+ while (i < end) {
53
+ const ch = code[i];
54
+ if (ch === '"' || ch === "'" || ch === "`") {
55
+ i = skipQuotedString(code, i);
56
+ } else if (ch === "{") {
57
+ if (!inObject) {
58
+ inObject = true;
59
+ }
60
+ braceDepth += 1;
61
+ i += 1;
62
+ } else if (ch === "}") {
63
+ braceDepth -= 1;
64
+ if (braceDepth === 0) {
65
+ inObject = false;
66
+ }
67
+ i += 1;
68
+ } else if (inObject && braceDepth === 1) {
69
+ if (/[a-zA-Z_]/.test(ch)) {
70
+ let key = "";
71
+ const keyStart = i;
72
+ while (i < end && /[a-zA-Z0-9_-]/.test(code[i])) {
73
+ key += code[i];
74
+ i += 1;
75
+ }
76
+ const keyEnd = i;
77
+ while (i < end && /\s/.test(code[i])) {
78
+ i += 1;
79
+ }
80
+ if (i < end && code[i] === ":") {
81
+ keys.push({ end: keyEnd, key, start: keyStart });
82
+ i += 1;
83
+ }
84
+ } else if (ch === '"' || ch === "'") {
85
+ const strStart = i;
86
+ i = skipQuotedString(code, i);
87
+ const strEnd = i;
88
+ const quote = code[strStart];
89
+ let key = "";
90
+ let j = strStart + 1;
91
+ while (j < strEnd - 1) {
92
+ if (code[j] === "\\" && j + 1 < strEnd - 1) {
93
+ key += code[j + 1];
94
+ j += 2;
95
+ } else {
96
+ key += code[j];
97
+ j += 1;
98
+ }
99
+ }
100
+ while (i < end && /\s/.test(code[i])) {
101
+ i += 1;
102
+ }
103
+ if (i < end && code[i] === ":") {
104
+ keys.push({ end: strEnd, key, start: strStart });
105
+ i += 1;
106
+ }
107
+ } else {
108
+ i += 1;
109
+ }
110
+ } else {
111
+ i += 1;
112
+ }
113
+ }
114
+ return keys;
115
+ }
47
116
  function findClassStrings(code) {
48
117
  const matches = [];
49
118
  const stringRegex = /(['"`])(.*?)\1/g;
@@ -62,6 +131,22 @@ function findClassStrings(code) {
62
131
  }
63
132
  match = stringRegex.exec(call.content);
64
133
  }
134
+ const parenContentStart = call.content.indexOf("(") + 1;
135
+ const parenContentEnd = call.content.lastIndexOf(")");
136
+ if (parenContentStart > 0 && parenContentEnd > parenContentStart) {
137
+ const callBodyStart = call.start + parenContentStart;
138
+ const keys = findObjectKeysInSpan(code, callBodyStart, callBodyStart + (parenContentEnd - parenContentStart));
139
+ for (const { key, start, end } of keys) {
140
+ if (key.length >= 1) {
141
+ matches.push({
142
+ classString: key,
143
+ end,
144
+ fullMatch: code.slice(start, end),
145
+ start
146
+ });
147
+ }
148
+ }
149
+ }
65
150
  }
66
151
  const jsxClassNameRegex = /className\s*=\s*(?:\{\s*["'`]([^"'`]+)["'`]\s*\}|["'`]([^"'`]+)["'`])/g;
67
152
  const compiledClassNameRegex = /className\s*:\s*(["'`])([^"'`]+)\1/g;
@@ -1,5 +1,5 @@
1
1
  type ClassMap = Map<string, string>;
2
- export declare function __resetGlobalClassMap(): void;
2
+ declare function __resetGlobalClassMap(): void;
3
3
  declare class Obfuscator {
4
4
  private readonly map;
5
5
  private readonly prefix;
@@ -7,8 +7,8 @@ declare class Obfuscator {
7
7
  constructor(prefix?: string);
8
8
  getObfuscatedClass(originalClass: string): string;
9
9
  getMap(): ClassMap;
10
- reset(): void;
11
10
  }
12
11
  export type { ClassMap };
13
12
  export { Obfuscator };
13
+ export { __resetGlobalClassMap };
14
14
  //# sourceMappingURL=generate-class-names.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"generate-class-names.d.ts","sourceRoot":"","sources":["../src/generate-class-names.ts"],"names":[],"mappings":"AAAA,KAAK,QAAQ,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAwCpC,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C;AAED,cAAM,UAAU;IACf,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA4B;IAChD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgC;gBAE7C,MAAM,SAAO;IAIzB,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM;IAejD,MAAM,IAAI,QAAQ;IAIlB,KAAK,IAAI,IAAI;CAKb;AAED,YAAY,EAAE,QAAQ,EAAE,CAAC;AACzB,OAAO,EAAE,UAAU,EAAE,CAAC"}
1
+ {"version":3,"file":"generate-class-names.d.ts","sourceRoot":"","sources":["../src/generate-class-names.ts"],"names":[],"mappings":"AAAA,KAAK,QAAQ,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAkCpC,iBAAS,qBAAqB,IAAI,IAAI,CAErC;AAED,cAAM,UAAU;IACf,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA4B;IAChD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgC;gBAE7C,MAAM,SAAO;IAIzB,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM;IAejD,MAAM,IAAI,QAAQ;CAGlB;AAED,YAAY,EAAE,QAAQ,EAAE,CAAC;AACzB,OAAO,EAAE,UAAU,EAAE,CAAC;AACtB,OAAO,EAAE,qBAAqB,EAAE,CAAC"}
@@ -48,7 +48,6 @@ class Obfuscator {
48
48
  getMap() {
49
49
  return new Map(this.map);
50
50
  }
51
- reset() {}
52
51
  }
53
52
  export {
54
53
  __resetGlobalClassMap,
package/package.json CHANGED
@@ -20,5 +20,5 @@
20
20
  },
21
21
  "type": "module",
22
22
  "types": "./dist/apply-class-names.d.ts",
23
- "version": "1.0.11"
23
+ "version": "1.1.0"
24
24
  }