@tailwindcss-obfuscator/vite 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.
@@ -0,0 +1,22 @@
1
+ interface FileSystem {
2
+ readFileSync: (path: string, encoding: "utf-8") => string;
3
+ readdirSync: (path: string) => string[];
4
+ statSync: (path: string) => {
5
+ isDirectory: () => boolean;
6
+ };
7
+ join: (...segments: string[]) => string;
8
+ resolve: (...segments: string[]) => string;
9
+ }
10
+ export interface BuiltCssAllowlistOptions {
11
+ cssEntry: string;
12
+ fs: FileSystem;
13
+ root: string;
14
+ }
15
+ /**
16
+ * At build time: run Tailwind to get built CSS, scrape class names from it,
17
+ * return that set as the allowlist for the obfuscator.
18
+ */
19
+ export declare function getAllowlistFromBuiltCss(options: BuiltCssAllowlistOptions): Promise<Set<string> | null>;
20
+ export declare function createNodeFs(): FileSystem;
21
+ export type { FileSystem };
22
+ //# sourceMappingURL=built-css-allowlist.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"built-css-allowlist.d.ts","sourceRoot":"","sources":["../src/built-css-allowlist.ts"],"names":[],"mappings":"AASA,UAAU,UAAU;IACnB,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,KAAK,MAAM,CAAC;IAC1D,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;IACxC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK;QAAE,WAAW,EAAE,MAAM,OAAO,CAAA;KAAE,CAAC;IAC3D,IAAI,EAAE,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE,KAAK,MAAM,CAAC;IACxC,OAAO,EAAE,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE,KAAK,MAAM,CAAC;CAC3C;AA8ED,MAAM,WAAW,wBAAwB;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,UAAU,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACb;AAWD;;;GAGG;AACH,wBAAsB,wBAAwB,CAC7C,OAAO,EAAE,wBAAwB,GAC/B,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CA+C7B;AAED,wBAAgB,YAAY,IAAI,UAAU,CAWzC;AAED,YAAY,EAAE,UAAU,EAAE,CAAC"}
@@ -0,0 +1,132 @@
1
+ import nodeFs from "node:fs";
2
+ import nodePath from "node:path";
3
+ import { parseClassSelectors } from "@tailwindcss-obfuscator/core/parse-class-selectors";
4
+ const CONTENT_EXTENSIONS = new Set([".tsx", ".ts", ".jsx", ".js", ".html"]);
5
+ const RE_CLASS_STRINGS = /(?:className\s*=\s*(?:{[^}]*)?["'`]([^"'`]+)["'`]|(?:cn|clsx|classNames|twMerge|cva)\s*\(\s*["'`]([^"'`]+)["'`])/g;
6
+ const RE_WHITESPACE = /\s+/;
7
+ const RE_BACKSLASH = /\\/g;
8
+ function shouldSkipEntry(name) {
9
+ return name === "node_modules" || name.startsWith(".");
10
+ }
11
+ function tryStat(fs, full) {
12
+ try {
13
+ return fs.statSync(full);
14
+ }
15
+ catch {
16
+ return;
17
+ }
18
+ }
19
+ function collectFromDir(fs, dir, files) {
20
+ let entries;
21
+ try {
22
+ entries = fs.readdirSync(dir);
23
+ }
24
+ catch {
25
+ return;
26
+ }
27
+ for (const name of entries) {
28
+ if (!shouldSkipEntry(name)) {
29
+ const full = fs.join(dir, name);
30
+ const stat = tryStat(fs, full);
31
+ if (stat !== undefined) {
32
+ if (stat.isDirectory()) {
33
+ findContentFiles(fs, full, files);
34
+ }
35
+ else if (CONTENT_EXTENSIONS.has(name.slice(name.lastIndexOf(".")))) {
36
+ files.push(full);
37
+ }
38
+ }
39
+ }
40
+ }
41
+ }
42
+ function findContentFiles(fs, dir, files = []) {
43
+ collectFromDir(fs, dir, files);
44
+ return files;
45
+ }
46
+ function extractCandidatesFromFile(filePath, readFile) {
47
+ const candidates = [];
48
+ let content;
49
+ try {
50
+ content = readFile(filePath, "utf-8");
51
+ }
52
+ catch {
53
+ return candidates;
54
+ }
55
+ RE_CLASS_STRINGS.lastIndex = 0;
56
+ let match = RE_CLASS_STRINGS.exec(content);
57
+ while (match !== null) {
58
+ const raw = match[1] ?? match[2] ?? "";
59
+ for (const token of raw.split(RE_WHITESPACE)) {
60
+ const t = token.trim();
61
+ if (t.length > 0) {
62
+ candidates.push(t.replace(RE_BACKSLASH, ""));
63
+ }
64
+ }
65
+ match = RE_CLASS_STRINGS.exec(content);
66
+ }
67
+ return candidates;
68
+ }
69
+ /**
70
+ * At build time: run Tailwind to get built CSS, scrape class names from it,
71
+ * return that set as the allowlist for the obfuscator.
72
+ */
73
+ export async function getAllowlistFromBuiltCss(options) {
74
+ const { root, cssEntry, fs } = options;
75
+ let compileFn;
76
+ try {
77
+ const node = await import("@tailwindcss/node");
78
+ compileFn = node.compile;
79
+ }
80
+ catch {
81
+ return null;
82
+ }
83
+ const fromPath = fs.resolve(root, cssEntry);
84
+ let entryCss;
85
+ try {
86
+ entryCss = fs.readFileSync(fromPath, "utf-8");
87
+ }
88
+ catch {
89
+ return null;
90
+ }
91
+ let result;
92
+ try {
93
+ result = await compileFn(entryCss, {
94
+ base: root,
95
+ from: fromPath,
96
+ onDependency: () => {
97
+ /* Tailwind reports dependencies; we ignore for allowlist */
98
+ },
99
+ });
100
+ }
101
+ catch {
102
+ return null;
103
+ }
104
+ const contentFiles = findContentFiles(fs, root);
105
+ const allCandidates = new Set();
106
+ for (const file of contentFiles) {
107
+ for (const c of extractCandidatesFromFile(file, fs.readFileSync)) {
108
+ allCandidates.add(c);
109
+ }
110
+ }
111
+ let builtCss;
112
+ try {
113
+ builtCss = result.build(Array.from(allCandidates));
114
+ }
115
+ catch {
116
+ return null;
117
+ }
118
+ return parseClassSelectors(builtCss);
119
+ }
120
+ export function createNodeFs() {
121
+ return {
122
+ join: (...segments) => nodePath.join(...segments),
123
+ readdirSync: (p) => nodeFs.readdirSync(p),
124
+ readFileSync: (p, enc) => nodeFs.readFileSync(p, enc),
125
+ resolve: (...segments) => nodePath.resolve(...segments),
126
+ statSync: (p) => {
127
+ const stat = nodeFs.statSync(p);
128
+ return { isDirectory: () => stat.isDirectory() };
129
+ },
130
+ };
131
+ }
132
+ //# sourceMappingURL=built-css-allowlist.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"built-css-allowlist.js","sourceRoot":"","sources":["../src/built-css-allowlist.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ interface FileSystem {
2
+ readFileSync: (path: string, encoding: "utf-8") => string;
3
+ readdirSync: (path: string) => string[];
4
+ statSync: (path: string) => {
5
+ isDirectory: () => boolean;
6
+ };
7
+ join: (...segments: string[]) => string;
8
+ resolve: (...segments: string[]) => string;
9
+ }
10
+ export interface ClassSetClonerOptions {
11
+ cssEntry: string;
12
+ fs: FileSystem;
13
+ root: string;
14
+ }
15
+ /**
16
+ * At build time: run Tailwind to get built CSS, scrape class names from it,
17
+ * return a clone of that set (for the obfuscator).
18
+ */
19
+ export declare function cloneClassSetFromBuiltCss(options: ClassSetClonerOptions): Promise<Set<string> | null>;
20
+ export declare function createNodeFs(): FileSystem;
21
+ export type { FileSystem };
22
+ //# sourceMappingURL=class-set-cloner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"class-set-cloner.d.ts","sourceRoot":"","sources":["../src/class-set-cloner.ts"],"names":[],"mappings":"AASA,UAAU,UAAU;IACnB,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,KAAK,MAAM,CAAC;IAC1D,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;IACxC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK;QAAE,WAAW,EAAE,MAAM,OAAO,CAAA;KAAE,CAAC;IAC3D,IAAI,EAAE,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE,KAAK,MAAM,CAAC;IACxC,OAAO,EAAE,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE,KAAK,MAAM,CAAC;CAC3C;AA8ED,MAAM,WAAW,qBAAqB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,UAAU,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACb;AAWD;;;GAGG;AACH,wBAAsB,yBAAyB,CAC9C,OAAO,EAAE,qBAAqB,GAC5B,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CA+C7B;AAED,wBAAgB,YAAY,IAAI,UAAU,CAWzC;AAED,YAAY,EAAE,UAAU,EAAE,CAAC"}
@@ -0,0 +1,132 @@
1
+ import nodeFs from "node:fs";
2
+ import nodePath from "node:path";
3
+ import { parseClassSelectors } from "./parse-class-selectors.js";
4
+ const CONTENT_EXTENSIONS = new Set([".tsx", ".ts", ".jsx", ".js", ".html"]);
5
+ const RE_CLASS_STRINGS = /(?:className\s*=\s*(?:{[^}]*)?["'`]([^"'`]+)["'`]|(?:cn|clsx|classNames|twMerge|cva)\s*\(\s*["'`]([^"'`]+)["'`])/g;
6
+ const RE_WHITESPACE = /\s+/;
7
+ const RE_BACKSLASH = /\\/g;
8
+ function shouldSkipEntry(name) {
9
+ return name === "node_modules" || name.startsWith(".");
10
+ }
11
+ function tryStat(fs, full) {
12
+ try {
13
+ return fs.statSync(full);
14
+ }
15
+ catch {
16
+ return;
17
+ }
18
+ }
19
+ function collectFromDir(fs, dir, files) {
20
+ let entries;
21
+ try {
22
+ entries = fs.readdirSync(dir);
23
+ }
24
+ catch {
25
+ return;
26
+ }
27
+ for (const name of entries) {
28
+ if (!shouldSkipEntry(name)) {
29
+ const full = fs.join(dir, name);
30
+ const stat = tryStat(fs, full);
31
+ if (stat !== undefined) {
32
+ if (stat.isDirectory()) {
33
+ findContentFiles(fs, full, files);
34
+ }
35
+ else if (CONTENT_EXTENSIONS.has(name.slice(name.lastIndexOf(".")))) {
36
+ files.push(full);
37
+ }
38
+ }
39
+ }
40
+ }
41
+ }
42
+ function findContentFiles(fs, dir, files = []) {
43
+ collectFromDir(fs, dir, files);
44
+ return files;
45
+ }
46
+ function extractCandidatesFromFile(filePath, readFile) {
47
+ const candidates = [];
48
+ let content;
49
+ try {
50
+ content = readFile(filePath, "utf-8");
51
+ }
52
+ catch {
53
+ return candidates;
54
+ }
55
+ RE_CLASS_STRINGS.lastIndex = 0;
56
+ let match = RE_CLASS_STRINGS.exec(content);
57
+ while (match !== null) {
58
+ const raw = match[1] ?? match[2] ?? "";
59
+ for (const token of raw.split(RE_WHITESPACE)) {
60
+ const t = token.trim();
61
+ if (t.length > 0) {
62
+ candidates.push(t.replace(RE_BACKSLASH, ""));
63
+ }
64
+ }
65
+ match = RE_CLASS_STRINGS.exec(content);
66
+ }
67
+ return candidates;
68
+ }
69
+ /**
70
+ * At build time: run Tailwind to get built CSS, scrape class names from it,
71
+ * return a clone of that set (for the obfuscator).
72
+ */
73
+ export async function cloneClassSetFromBuiltCss(options) {
74
+ const { root, cssEntry, fs } = options;
75
+ let compileFn;
76
+ try {
77
+ const node = await import("@tailwindcss/node");
78
+ compileFn = node.compile;
79
+ }
80
+ catch {
81
+ return null;
82
+ }
83
+ const fromPath = fs.resolve(root, cssEntry);
84
+ let entryCss;
85
+ try {
86
+ entryCss = fs.readFileSync(fromPath, "utf-8");
87
+ }
88
+ catch {
89
+ return null;
90
+ }
91
+ let result;
92
+ try {
93
+ result = await compileFn(entryCss, {
94
+ base: root,
95
+ from: fromPath,
96
+ onDependency: () => {
97
+ /* Tailwind reports dependencies; we ignore for class set */
98
+ },
99
+ });
100
+ }
101
+ catch {
102
+ return null;
103
+ }
104
+ const contentFiles = findContentFiles(fs, root);
105
+ const allCandidates = new Set();
106
+ for (const file of contentFiles) {
107
+ for (const c of extractCandidatesFromFile(file, fs.readFileSync)) {
108
+ allCandidates.add(c);
109
+ }
110
+ }
111
+ let builtCss;
112
+ try {
113
+ builtCss = result.build(Array.from(allCandidates));
114
+ }
115
+ catch {
116
+ return null;
117
+ }
118
+ return parseClassSelectors(builtCss);
119
+ }
120
+ export function createNodeFs() {
121
+ return {
122
+ join: (...segments) => nodePath.join(...segments),
123
+ readdirSync: (p) => nodeFs.readdirSync(p),
124
+ readFileSync: (p, enc) => nodeFs.readFileSync(p, enc),
125
+ resolve: (...segments) => nodePath.resolve(...segments),
126
+ statSync: (p) => {
127
+ const stat = nodeFs.statSync(p);
128
+ return { isDirectory: () => stat.isDirectory() };
129
+ },
130
+ };
131
+ }
132
+ //# sourceMappingURL=class-set-cloner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"class-set-cloner.js","sourceRoot":"","sources":["../src/class-set-cloner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Parse a CSS string and extract all class selector names (unescaped, source form).
3
+ * Handles Tailwind-escaped selectors like .size-6\! and .w-\[100px\].
4
+ * Only matches .class in selector context (not inside declaration values).
5
+ */
6
+ declare function parseClassSelectors(css: string): Set<string>;
7
+ interface FileSystem {
8
+ readFileSync: (path: string, encoding: "utf-8") => string;
9
+ readdirSync: (path: string) => string[];
10
+ statSync: (path: string) => {
11
+ isDirectory: () => boolean;
12
+ };
13
+ join: (...segments: string[]) => string;
14
+ resolve: (...segments: string[]) => string;
15
+ }
16
+ interface ClassSetClonerOptions {
17
+ cssEntry: string;
18
+ fs: FileSystem;
19
+ root: string;
20
+ }
21
+ /**
22
+ * At build time: run Tailwind to get built CSS, scrape class names from it,
23
+ * return a clone of that set (for the obfuscator).
24
+ */
25
+ export declare function cloneClassSetFromBuiltCss(options: ClassSetClonerOptions): Promise<Set<string> | null>;
26
+ export declare function createNodeFs(): FileSystem;
27
+ export { parseClassSelectors };
28
+ export type { ClassSetClonerOptions, FileSystem };
29
+ //# sourceMappingURL=clone-class-set.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clone-class-set.d.ts","sourceRoot":"","sources":["../src/clone-class-set.ts"],"names":[],"mappings":"AA8HA;;;;GAIG;AACH,iBAAS,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAoCrD;AAED,UAAU,UAAU;IACnB,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,KAAK,MAAM,CAAC;IAC1D,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;IACxC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK;QAAE,WAAW,EAAE,MAAM,OAAO,CAAA;KAAE,CAAC;IAC3D,IAAI,EAAE,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE,KAAK,MAAM,CAAC;IACxC,OAAO,EAAE,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE,KAAK,MAAM,CAAC;CAC3C;AAsGD,UAAU,qBAAqB;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,UAAU,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACb;AAWD;;;GAGG;AACH,wBAAsB,yBAAyB,CAC9C,OAAO,EAAE,qBAAqB,GAC5B,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CA+C7B;AAED,wBAAgB,YAAY,IAAI,UAAU,CAWzC;AAED,OAAO,EAAE,mBAAmB,EAAE,CAAC;AAC/B,YAAY,EAAE,qBAAqB,EAAE,UAAU,EAAE,CAAC"}
@@ -0,0 +1,304 @@
1
+ import nodeFs from "node:fs";
2
+ import nodePath from "node:path";
3
+ const CONTENT_EXTENSIONS = new Set([".tsx", ".ts", ".jsx", ".js", ".html"]);
4
+ const RE_CLASS_END = /[\s{[\]}:,;>+~)]/;
5
+ const RE_SELECTOR_WS = /[\s\n\r\t]/;
6
+ const CN_FUNCTION_NAMES = ["cn", "clsx", "classNames", "twMerge", "cva"];
7
+ const RE_WHITESPACE = /\s+/;
8
+ const RE_BACKSLASH = /\\/g;
9
+ function skipQuotedString(content, i) {
10
+ const quote = content[i];
11
+ let pos = i + 1;
12
+ while (pos < content.length && content[pos] !== quote) {
13
+ if (content[pos] === "\\") {
14
+ pos += 1;
15
+ }
16
+ pos += 1;
17
+ }
18
+ return pos + 1;
19
+ }
20
+ function findMatchingParen(content, openAt) {
21
+ let depth = 1;
22
+ let i = openAt + 1;
23
+ while (i < content.length && depth > 0) {
24
+ const ch = content[i];
25
+ if (ch === "(" || ch === "[" || ch === "{") {
26
+ depth += 1;
27
+ i += 1;
28
+ }
29
+ else if (ch === ")" || ch === "]" || ch === "}") {
30
+ depth -= 1;
31
+ i += 1;
32
+ }
33
+ else if (ch === '"' || ch === "'" || ch === "`") {
34
+ i = skipQuotedString(content, i);
35
+ }
36
+ else {
37
+ i += 1;
38
+ }
39
+ }
40
+ if (depth === 0) {
41
+ return i - 1;
42
+ }
43
+ return -1;
44
+ }
45
+ function readOneQuotedString(content, start, end) {
46
+ const quote = content[start];
47
+ let pos = start + 1;
48
+ let value = "";
49
+ while (pos < end && content[pos] !== quote) {
50
+ if (content[pos] === "\\") {
51
+ pos += 1;
52
+ if (pos < end) {
53
+ value += content[pos];
54
+ pos += 1;
55
+ }
56
+ }
57
+ else {
58
+ value += content[pos];
59
+ pos += 1;
60
+ }
61
+ }
62
+ let nextIndex = end;
63
+ if (pos < end) {
64
+ nextIndex = pos + 1;
65
+ }
66
+ return { nextIndex, value };
67
+ }
68
+ function extractStringsInSpan(content, start, end) {
69
+ const strings = [];
70
+ let i = start;
71
+ while (i < end) {
72
+ const ch = content[i];
73
+ if (ch === '"' || ch === "'") {
74
+ const result = readOneQuotedString(content, i, end);
75
+ strings.push(result.value);
76
+ i = result.nextIndex;
77
+ }
78
+ else {
79
+ i += 1;
80
+ }
81
+ }
82
+ return strings;
83
+ }
84
+ function readClassName(css, start) {
85
+ let i = start;
86
+ let name = "";
87
+ while (i < css.length) {
88
+ const ch = css[i];
89
+ if (ch === "\\" && i + 1 < css.length) {
90
+ name += css[i + 1];
91
+ i += 2;
92
+ }
93
+ else if (RE_CLASS_END.test(ch)) {
94
+ break;
95
+ }
96
+ else {
97
+ name += ch;
98
+ i += 1;
99
+ }
100
+ }
101
+ return { end: i, name };
102
+ }
103
+ function updateSelectorContext(c, inSelectorContext) {
104
+ if (c === "{" || c === "}") {
105
+ return true;
106
+ }
107
+ if (c === ";") {
108
+ return false;
109
+ }
110
+ if (!RE_SELECTOR_WS.test(c)) {
111
+ return false;
112
+ }
113
+ return inSelectorContext;
114
+ }
115
+ /**
116
+ * Parse a CSS string and extract all class selector names (unescaped, source form).
117
+ * Handles Tailwind-escaped selectors like .size-6\! and .w-\[100px\].
118
+ * Only matches .class in selector context (not inside declaration values).
119
+ */
120
+ function parseClassSelectors(css) {
121
+ const classes = new Set();
122
+ let i = 0;
123
+ let inSelectorContext = true;
124
+ while (i < css.length) {
125
+ const c = css[i];
126
+ if (c === "{") {
127
+ inSelectorContext = true;
128
+ i += 1;
129
+ }
130
+ else if (c === "}") {
131
+ inSelectorContext = true;
132
+ i += 1;
133
+ }
134
+ else if (c === ";") {
135
+ inSelectorContext = false;
136
+ i += 1;
137
+ }
138
+ else if (inSelectorContext &&
139
+ c === "." &&
140
+ (i === 0 || css[i - 1] !== "\\")) {
141
+ i += 1;
142
+ const { name, end } = readClassName(css, i);
143
+ i = end;
144
+ if (name.length > 0) {
145
+ classes.add(name);
146
+ }
147
+ inSelectorContext = false;
148
+ }
149
+ else {
150
+ inSelectorContext = updateSelectorContext(c, inSelectorContext);
151
+ i += 1;
152
+ }
153
+ }
154
+ return classes;
155
+ }
156
+ function shouldSkipEntry(name) {
157
+ return name === "node_modules" || name.startsWith(".");
158
+ }
159
+ function tryStat(fs, full) {
160
+ try {
161
+ return fs.statSync(full);
162
+ }
163
+ catch {
164
+ return;
165
+ }
166
+ }
167
+ function collectFromDir(fs, dir, files) {
168
+ let entries;
169
+ try {
170
+ entries = fs.readdirSync(dir);
171
+ }
172
+ catch {
173
+ return;
174
+ }
175
+ for (const name of entries) {
176
+ if (!shouldSkipEntry(name)) {
177
+ const full = fs.join(dir, name);
178
+ const stat = tryStat(fs, full);
179
+ if (stat !== undefined) {
180
+ if (stat.isDirectory()) {
181
+ findContentFiles(fs, full, files);
182
+ }
183
+ else if (CONTENT_EXTENSIONS.has(name.slice(name.lastIndexOf(".")))) {
184
+ files.push(full);
185
+ }
186
+ }
187
+ }
188
+ }
189
+ }
190
+ function findContentFiles(fs, dir, files = []) {
191
+ collectFromDir(fs, dir, files);
192
+ return files;
193
+ }
194
+ function addTokensFromRaw(candidates, raw) {
195
+ for (const token of raw.split(RE_WHITESPACE)) {
196
+ const t = token.trim();
197
+ if (t.length > 0) {
198
+ candidates.push(t.replace(RE_BACKSLASH, ""));
199
+ }
200
+ }
201
+ }
202
+ function extractCandidatesFromCnCalls(content) {
203
+ const candidates = [];
204
+ for (const fnName of CN_FUNCTION_NAMES) {
205
+ const openRegex = new RegExp(`\\b${fnName}\\s*\\(`, "g");
206
+ let openMatch = openRegex.exec(content);
207
+ while (openMatch !== null) {
208
+ const parenStart = openMatch.index + openMatch[0].length - 1;
209
+ const parenEnd = findMatchingParen(content, parenStart);
210
+ if (parenEnd !== -1) {
211
+ const strings = extractStringsInSpan(content, parenStart + 1, parenEnd);
212
+ for (const raw of strings) {
213
+ addTokensFromRaw(candidates, raw);
214
+ }
215
+ }
216
+ openMatch = openRegex.exec(content);
217
+ }
218
+ }
219
+ return candidates;
220
+ }
221
+ function extractCandidatesFromFile(filePath, readFile) {
222
+ const candidates = [];
223
+ let content;
224
+ try {
225
+ content = readFile(filePath, "utf-8");
226
+ }
227
+ catch {
228
+ return candidates;
229
+ }
230
+ candidates.push(...extractCandidatesFromCnCalls(content));
231
+ const classNameRegex = /className\s*=\s*(?:{[^}]*)?["'`]([^"'`]+)["'`]/g;
232
+ let classMatch = classNameRegex.exec(content);
233
+ while (classMatch !== null) {
234
+ const raw = classMatch[1] ?? "";
235
+ addTokensFromRaw(candidates, raw);
236
+ classMatch = classNameRegex.exec(content);
237
+ }
238
+ return candidates;
239
+ }
240
+ /**
241
+ * At build time: run Tailwind to get built CSS, scrape class names from it,
242
+ * return a clone of that set (for the obfuscator).
243
+ */
244
+ export async function cloneClassSetFromBuiltCss(options) {
245
+ const { root, cssEntry, fs } = options;
246
+ let compileFn;
247
+ try {
248
+ const node = await import("@tailwindcss/node");
249
+ compileFn = node.compile;
250
+ }
251
+ catch {
252
+ return null;
253
+ }
254
+ const fromPath = fs.resolve(root, cssEntry);
255
+ let entryCss;
256
+ try {
257
+ entryCss = fs.readFileSync(fromPath, "utf-8");
258
+ }
259
+ catch {
260
+ return null;
261
+ }
262
+ let result;
263
+ try {
264
+ result = await compileFn(entryCss, {
265
+ base: root,
266
+ from: fromPath,
267
+ onDependency: () => {
268
+ /* Tailwind reports dependencies; we ignore for class set */
269
+ },
270
+ });
271
+ }
272
+ catch {
273
+ return null;
274
+ }
275
+ const contentFiles = findContentFiles(fs, root);
276
+ const allCandidates = new Set();
277
+ for (const file of contentFiles) {
278
+ for (const c of extractCandidatesFromFile(file, fs.readFileSync)) {
279
+ allCandidates.add(c);
280
+ }
281
+ }
282
+ let builtCss;
283
+ try {
284
+ builtCss = result.build(Array.from(allCandidates));
285
+ }
286
+ catch {
287
+ return null;
288
+ }
289
+ return parseClassSelectors(builtCss);
290
+ }
291
+ export function createNodeFs() {
292
+ return {
293
+ join: (...segments) => nodePath.join(...segments),
294
+ readdirSync: (p) => nodeFs.readdirSync(p),
295
+ readFileSync: (p, enc) => nodeFs.readFileSync(p, enc),
296
+ resolve: (...segments) => nodePath.resolve(...segments),
297
+ statSync: (p) => {
298
+ const stat = nodeFs.statSync(p);
299
+ return { isDirectory: () => stat.isDirectory() };
300
+ },
301
+ };
302
+ }
303
+ export { parseClassSelectors };
304
+ //# sourceMappingURL=clone-class-set.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clone-class-set.js","sourceRoot":"","sources":["../src/clone-class-set.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,3 +1,8 @@
1
1
  import type { Plugin } from "vite";
2
- export declare function tailwindcssObfuscator(): Plugin;
2
+ interface TailwindcssObfuscatorOptions {
3
+ cssEntry: string;
4
+ }
5
+ declare function tailwindcssObfuscator(options: TailwindcssObfuscatorOptions): Plugin;
6
+ export type { TailwindcssObfuscatorOptions };
7
+ export { tailwindcssObfuscator };
3
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAwCnC,wBAAgB,qBAAqB,IAAI,MAAM,CA2D9C"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AA4FnC,UAAU,4BAA4B;IACrC,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,iBAAS,qBAAqB,CAAC,OAAO,EAAE,4BAA4B,GAAG,MAAM,CAoC5E;AAED,YAAY,EAAE,4BAA4B,EAAE,CAAC;AAC7C,OAAO,EAAE,qBAAqB,EAAE,CAAC"}
package/dist/index.js CHANGED
@@ -1,13 +1,11 @@
1
- import { compressCSS } from "@tailwindcss-obfuscator/core/compressor";
2
- import { CSSHandler } from "@tailwindcss-obfuscator/core/css-handler";
3
- import { SourceTransformer } from "@tailwindcss-obfuscator/core/transformer";
1
+ import { ApplyClassNames } from "@tailwindcss-obfuscator/core/apply-class-names";
2
+ import { cloneClassSetFromBuiltCss, createNodeFs } from "./clone-class-set.js";
4
3
  const SOURCE_EXT_REGEX = /\.(js|ts|jsx|tsx)$/;
5
- async function processBundleCSS(bundle, cssHandler) {
4
+ async function processBundleCSS(bundle, applyClassNames) {
6
5
  const entries = Object.entries(bundle).filter(([fileName, chunk]) => fileName.endsWith(".css") && chunk.type === "asset");
7
6
  const results = await Promise.all(entries.map(([, chunk]) => {
8
- let css = chunk.source.toString();
9
- css = cssHandler.transformCSS(css);
10
- return compressCSS(css);
7
+ const css = chunk.source.toString();
8
+ return applyClassNames.updateStylesheet(css);
11
9
  }));
12
10
  for (let i = 0; i < entries.length; i += 1) {
13
11
  entries[i][1].source = results[i];
@@ -21,56 +19,71 @@ function replaceClassesInHtml(html, classMap) {
21
19
  }
22
20
  return transformed;
23
21
  }
24
- export function tailwindcssObfuscator() {
25
- const transformer = new SourceTransformer();
26
- const cssHandler = new CSSHandler();
27
- let isProduction = false;
22
+ async function runBuildStart(state, options) {
23
+ if (!state.isProduction) {
24
+ return;
25
+ }
26
+ const fs = createNodeFs();
27
+ const classSet = await cloneClassSetFromBuiltCss({
28
+ cssEntry: options.cssEntry,
29
+ fs,
30
+ root: state.rootDir,
31
+ });
32
+ state.applyClassNames.setAllowlist(classSet ?? new Set());
33
+ }
34
+ function createTransform(state) {
35
+ return function transform(code, id) {
36
+ if (!state.isProduction) {
37
+ return null;
38
+ }
39
+ const isSourceOrJs = SOURCE_EXT_REGEX.test(id) || code.includes("className");
40
+ if (!isSourceOrJs) {
41
+ return null;
42
+ }
43
+ const result = state.applyClassNames.updateJavaScript(code, id);
44
+ if (result.code !== code) {
45
+ return { code: result.code, map: null };
46
+ }
47
+ return null;
48
+ };
49
+ }
50
+ function createTransformIndexHtmlHandler(state) {
51
+ return function handler(html) {
52
+ if (!state.isProduction) {
53
+ return html;
54
+ }
55
+ return replaceClassesInHtml(html, state.applyClassNames.getMap());
56
+ };
57
+ }
58
+ function tailwindcssObfuscator(options) {
59
+ const state = {
60
+ applyClassNames: new ApplyClassNames("az"),
61
+ isProduction: false,
62
+ rootDir: "",
63
+ };
28
64
  return {
65
+ async buildStart() {
66
+ await runBuildStart(state, options);
67
+ },
29
68
  configResolved(config) {
30
- isProduction = config.mode === "production";
31
- transformer.reset();
32
- cssHandler.reset();
69
+ state.isProduction = config.mode === "production";
70
+ state.rootDir = config.root;
71
+ state.applyClassNames.reset();
33
72
  },
34
73
  enforce: "pre",
35
74
  async generateBundle(_options, bundle) {
36
- if (!isProduction) {
37
- return;
38
- }
39
- const classMap = transformer.getMap();
40
- if (classMap.size === 0) {
75
+ if (!state.isProduction) {
41
76
  return;
42
77
  }
43
- await processBundleCSS(bundle, cssHandler);
78
+ await processBundleCSS(bundle, state.applyClassNames);
44
79
  },
45
80
  name: "tailwindcss-obfuscator",
46
- transform(code, id) {
47
- if (!isProduction) {
48
- return null;
49
- }
50
- const isSourceOrJs = SOURCE_EXT_REGEX.test(id) || code.includes("className");
51
- if (!isSourceOrJs) {
52
- return null;
53
- }
54
- const result = transformer.transform(code, id);
55
- if (result.code !== code) {
56
- cssHandler.setClassMap(result.map);
57
- return { code: result.code, map: null };
58
- }
59
- return null;
60
- },
81
+ transform: createTransform(state),
61
82
  transformIndexHtml: {
62
- handler(html) {
63
- if (!isProduction) {
64
- return html;
65
- }
66
- const classMap = transformer.getMap();
67
- if (classMap.size === 0) {
68
- return html;
69
- }
70
- return replaceClassesInHtml(html, classMap);
71
- },
83
+ handler: createTransformIndexHtmlHandler(state),
72
84
  order: "post",
73
85
  },
74
86
  };
75
87
  }
88
+ export { tailwindcssObfuscator };
76
89
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Parse a CSS string and extract all class selector names (unescaped, source form).
3
+ * Handles Tailwind-escaped selectors like .size-6\! and .w-\[100px\].
4
+ * Only matches .class in selector context (not inside declaration values).
5
+ */
6
+ export declare function parseClassSelectors(css: string): Set<string>;
7
+ //# sourceMappingURL=parse-class-selectors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-class-selectors.d.ts","sourceRoot":"","sources":["../src/parse-class-selectors.ts"],"names":[],"mappings":"AAqCA;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAoC5D"}
@@ -0,0 +1,75 @@
1
+ const RE_CLASS_END = /[\s{[\]}:,;>+~)]/;
2
+ const RE_WHITESPACE = /[\s\n\r\t]/;
3
+ function readClassName(css, start) {
4
+ let i = start;
5
+ let name = "";
6
+ while (i < css.length) {
7
+ const ch = css[i];
8
+ if (ch === "\\" && i + 1 < css.length) {
9
+ name += css[i + 1];
10
+ i += 2;
11
+ }
12
+ else if (RE_CLASS_END.test(ch)) {
13
+ break;
14
+ }
15
+ else {
16
+ name += ch;
17
+ i += 1;
18
+ }
19
+ }
20
+ return { end: i, name };
21
+ }
22
+ function updateSelectorContext(c, inSelectorContext) {
23
+ if (c === "{" || c === "}") {
24
+ return true;
25
+ }
26
+ if (c === ";") {
27
+ return false;
28
+ }
29
+ if (!RE_WHITESPACE.test(c)) {
30
+ return false;
31
+ }
32
+ return inSelectorContext;
33
+ }
34
+ /**
35
+ * Parse a CSS string and extract all class selector names (unescaped, source form).
36
+ * Handles Tailwind-escaped selectors like .size-6\! and .w-\[100px\].
37
+ * Only matches .class in selector context (not inside declaration values).
38
+ */
39
+ export function parseClassSelectors(css) {
40
+ const classes = new Set();
41
+ let i = 0;
42
+ let inSelectorContext = true;
43
+ while (i < css.length) {
44
+ const c = css[i];
45
+ if (c === "{") {
46
+ inSelectorContext = true;
47
+ i += 1;
48
+ }
49
+ else if (c === "}") {
50
+ inSelectorContext = true;
51
+ i += 1;
52
+ }
53
+ else if (c === ";") {
54
+ inSelectorContext = false;
55
+ i += 1;
56
+ }
57
+ else if (inSelectorContext &&
58
+ c === "." &&
59
+ (i === 0 || css[i - 1] !== "\\")) {
60
+ i += 1;
61
+ const { name, end } = readClassName(css, i);
62
+ i = end;
63
+ if (name.length > 0) {
64
+ classes.add(name);
65
+ }
66
+ inSelectorContext = false;
67
+ }
68
+ else {
69
+ inSelectorContext = updateSelectorContext(c, inSelectorContext);
70
+ i += 1;
71
+ }
72
+ }
73
+ return classes;
74
+ }
75
+ //# sourceMappingURL=parse-class-selectors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-class-selectors.js","sourceRoot":"","sources":["../src/parse-class-selectors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { Plugin } from "vite";
2
+ interface TailwindcssObfuscatorOptions {
3
+ cssEntry: string;
4
+ }
5
+ declare function tailwindcssObfuscator(options: TailwindcssObfuscatorOptions): Plugin;
6
+ export type { TailwindcssObfuscatorOptions };
7
+ export { tailwindcssObfuscator };
8
+ //# sourceMappingURL=plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AA4FnC,UAAU,4BAA4B;IACrC,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,iBAAS,qBAAqB,CAAC,OAAO,EAAE,4BAA4B,GAAG,MAAM,CAoC5E;AAED,YAAY,EAAE,4BAA4B,EAAE,CAAC;AAC7C,OAAO,EAAE,qBAAqB,EAAE,CAAC"}
package/dist/plugin.js ADDED
@@ -0,0 +1,89 @@
1
+ import { ApplyClassNames } from "@tailwindcss-obfuscator/core/apply-class-names";
2
+ import { cloneClassSetFromBuiltCss, createNodeFs } from "./clone-class-set.js";
3
+ const SOURCE_EXT_REGEX = /\.(js|ts|jsx|tsx)$/;
4
+ async function processBundleCSS(bundle, applyClassNames) {
5
+ const entries = Object.entries(bundle).filter(([fileName, chunk]) => fileName.endsWith(".css") && chunk.type === "asset");
6
+ const results = await Promise.all(entries.map(([, chunk]) => {
7
+ const css = chunk.source.toString();
8
+ return applyClassNames.updateStylesheet(css);
9
+ }));
10
+ for (let i = 0; i < entries.length; i += 1) {
11
+ entries[i][1].source = results[i];
12
+ }
13
+ }
14
+ function replaceClassesInHtml(html, classMap) {
15
+ let transformed = html;
16
+ for (const [original, obfuscated] of classMap) {
17
+ const regex = new RegExp(`\\b${original}\\b`, "g");
18
+ transformed = transformed.replace(regex, obfuscated);
19
+ }
20
+ return transformed;
21
+ }
22
+ async function runBuildStart(state, options) {
23
+ if (!state.isProduction) {
24
+ return;
25
+ }
26
+ const fs = createNodeFs();
27
+ const classSet = await cloneClassSetFromBuiltCss({
28
+ cssEntry: options.cssEntry,
29
+ fs,
30
+ root: state.rootDir,
31
+ });
32
+ state.applyClassNames.setAllowlist(classSet ?? new Set());
33
+ }
34
+ function createTransform(state) {
35
+ return function transform(code, id) {
36
+ if (!state.isProduction) {
37
+ return null;
38
+ }
39
+ const isSourceOrJs = SOURCE_EXT_REGEX.test(id) || code.includes("className");
40
+ if (!isSourceOrJs) {
41
+ return null;
42
+ }
43
+ const result = state.applyClassNames.updateJavaScript(code, id);
44
+ if (result.code !== code) {
45
+ return { code: result.code, map: null };
46
+ }
47
+ return null;
48
+ };
49
+ }
50
+ function createTransformIndexHtmlHandler(state) {
51
+ return function handler(html) {
52
+ if (!state.isProduction) {
53
+ return html;
54
+ }
55
+ return replaceClassesInHtml(html, state.applyClassNames.getMap());
56
+ };
57
+ }
58
+ function tailwindcssObfuscator(options) {
59
+ const state = {
60
+ applyClassNames: new ApplyClassNames("az"),
61
+ isProduction: false,
62
+ rootDir: "",
63
+ };
64
+ return {
65
+ async buildStart() {
66
+ await runBuildStart(state, options);
67
+ },
68
+ configResolved(config) {
69
+ state.isProduction = config.mode === "production";
70
+ state.rootDir = config.root;
71
+ state.applyClassNames.reset();
72
+ },
73
+ enforce: "pre",
74
+ async generateBundle(_options, bundle) {
75
+ if (!state.isProduction) {
76
+ return;
77
+ }
78
+ await processBundleCSS(bundle, state.applyClassNames);
79
+ },
80
+ name: "tailwindcss-obfuscator",
81
+ transform: createTransform(state),
82
+ transformIndexHtml: {
83
+ handler: createTransformIndexHtmlHandler(state),
84
+ order: "post",
85
+ },
86
+ };
87
+ }
88
+ export { tailwindcssObfuscator };
89
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ interface FileSystem {
2
+ readFileSync: (path: string, encoding: "utf-8") => string;
3
+ readdirSync: (path: string) => string[];
4
+ statSync: (path: string) => {
5
+ isDirectory: () => boolean;
6
+ };
7
+ join: (...segments: string[]) => string;
8
+ resolve: (...segments: string[]) => string;
9
+ }
10
+ interface TailwindAllowlistOptions {
11
+ root: string;
12
+ cssEntry: string;
13
+ fs: FileSystem;
14
+ }
15
+ declare function getTailwindAllowlist(options: TailwindAllowlistOptions): Promise<Set<string> | null>;
16
+ declare function createNodeFs(): FileSystem;
17
+ export type { FileSystem, TailwindAllowlistOptions };
18
+ export { createNodeFs, getTailwindAllowlist };
19
+ //# sourceMappingURL=tailwind-allowlist.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tailwind-allowlist.d.ts","sourceRoot":"","sources":["../src/tailwind-allowlist.ts"],"names":[],"mappings":"AASA,UAAU,UAAU;IACnB,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,KAAK,MAAM,CAAC;IAC1D,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;IACxC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK;QAAE,WAAW,EAAE,MAAM,OAAO,CAAA;KAAE,CAAC;IAC3D,IAAI,EAAE,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE,KAAK,MAAM,CAAC;IACxC,OAAO,EAAE,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE,KAAK,MAAM,CAAC;CAC3C;AA8ED,UAAU,wBAAwB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,UAAU,CAAC;CACf;AAWD,iBAAe,oBAAoB,CAClC,OAAO,EAAE,wBAAwB,GAC/B,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CA+C7B;AAED,iBAAS,YAAY,IAAI,UAAU,CAWlC;AAED,YAAY,EAAE,UAAU,EAAE,wBAAwB,EAAE,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,CAAC"}
@@ -0,0 +1,129 @@
1
+ import nodeFs from "node:fs";
2
+ import nodePath from "node:path";
3
+ import { parseClassSelectors } from "@tailwindcss-obfuscator/core/parse-class-selectors";
4
+ const CONTENT_EXTENSIONS = new Set([".tsx", ".ts", ".jsx", ".js", ".html"]);
5
+ const RE_CLASS_STRINGS = /(?:className\s*=\s*(?:{[^}]*)?["'`]([^"'`]+)["'`]|(?:cn|clsx|classNames|twMerge|cva)\s*\(\s*["'`]([^"'`]+)["'`])/g;
6
+ const RE_WHITESPACE = /\s+/;
7
+ const RE_BACKSLASH = /\\/g;
8
+ function shouldSkipEntry(name) {
9
+ return name === "node_modules" || name.startsWith(".");
10
+ }
11
+ function tryStat(fs, full) {
12
+ try {
13
+ return fs.statSync(full);
14
+ }
15
+ catch {
16
+ return;
17
+ }
18
+ }
19
+ function collectFromDir(fs, dir, files) {
20
+ let entries;
21
+ try {
22
+ entries = fs.readdirSync(dir);
23
+ }
24
+ catch {
25
+ return;
26
+ }
27
+ for (const name of entries) {
28
+ if (!shouldSkipEntry(name)) {
29
+ const full = fs.join(dir, name);
30
+ const stat = tryStat(fs, full);
31
+ if (stat !== undefined) {
32
+ if (stat.isDirectory()) {
33
+ findContentFiles(fs, full, files);
34
+ }
35
+ else if (CONTENT_EXTENSIONS.has(name.slice(name.lastIndexOf(".")))) {
36
+ files.push(full);
37
+ }
38
+ }
39
+ }
40
+ }
41
+ }
42
+ function findContentFiles(fs, dir, files = []) {
43
+ collectFromDir(fs, dir, files);
44
+ return files;
45
+ }
46
+ function extractCandidatesFromFile(filePath, readFile) {
47
+ const candidates = [];
48
+ let content;
49
+ try {
50
+ content = readFile(filePath, "utf-8");
51
+ }
52
+ catch {
53
+ return candidates;
54
+ }
55
+ RE_CLASS_STRINGS.lastIndex = 0;
56
+ let match = RE_CLASS_STRINGS.exec(content);
57
+ while (match !== null) {
58
+ const raw = match[1] ?? match[2] ?? "";
59
+ for (const token of raw.split(RE_WHITESPACE)) {
60
+ const t = token.trim();
61
+ if (t.length > 0) {
62
+ candidates.push(t.replace(RE_BACKSLASH, ""));
63
+ }
64
+ }
65
+ match = RE_CLASS_STRINGS.exec(content);
66
+ }
67
+ return candidates;
68
+ }
69
+ async function getTailwindAllowlist(options) {
70
+ const { root, cssEntry, fs } = options;
71
+ let compileFn;
72
+ try {
73
+ const node = await import("@tailwindcss/node");
74
+ compileFn = node.compile;
75
+ }
76
+ catch {
77
+ return null;
78
+ }
79
+ const fromPath = fs.resolve(root, cssEntry);
80
+ let entryCss;
81
+ try {
82
+ entryCss = fs.readFileSync(fromPath, "utf-8");
83
+ }
84
+ catch {
85
+ return null;
86
+ }
87
+ let result;
88
+ try {
89
+ result = await compileFn(entryCss, {
90
+ base: root,
91
+ from: fromPath,
92
+ onDependency: () => {
93
+ /* Tailwind reports dependencies; we ignore for allowlist */
94
+ },
95
+ });
96
+ }
97
+ catch {
98
+ return null;
99
+ }
100
+ const contentFiles = findContentFiles(fs, root);
101
+ const allCandidates = new Set();
102
+ for (const file of contentFiles) {
103
+ for (const c of extractCandidatesFromFile(file, fs.readFileSync)) {
104
+ allCandidates.add(c);
105
+ }
106
+ }
107
+ let builtCss;
108
+ try {
109
+ builtCss = result.build(Array.from(allCandidates));
110
+ }
111
+ catch {
112
+ return null;
113
+ }
114
+ return parseClassSelectors(builtCss);
115
+ }
116
+ function createNodeFs() {
117
+ return {
118
+ join: (...segments) => nodePath.join(...segments),
119
+ readdirSync: (p) => nodeFs.readdirSync(p),
120
+ readFileSync: (p, enc) => nodeFs.readFileSync(p, enc),
121
+ resolve: (...segments) => nodePath.resolve(...segments),
122
+ statSync: (p) => {
123
+ const stat = nodeFs.statSync(p);
124
+ return { isDirectory: () => stat.isDirectory() };
125
+ },
126
+ };
127
+ }
128
+ export { createNodeFs, getTailwindAllowlist };
129
+ //# sourceMappingURL=tailwind-allowlist.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tailwind-allowlist.js","sourceRoot":"","sources":["../src/tailwind-allowlist.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -7,25 +7,31 @@
7
7
  },
8
8
  "exports": {
9
9
  ".": {
10
- "import": "./dist/index.js",
11
- "types": "./dist/index.d.ts"
10
+ "import": "./dist/plugin.js",
11
+ "types": "./dist/plugin.d.ts"
12
12
  }
13
13
  },
14
14
  "files": [
15
15
  "dist"
16
16
  ],
17
- "main": "./dist/index.js",
17
+ "main": "./dist/plugin.js",
18
18
  "name": "@tailwindcss-obfuscator/vite",
19
19
  "peerDependencies": {
20
+ "@tailwindcss/node": "^4.1.18",
20
21
  "vite": "^7.3.1"
21
22
  },
23
+ "peerDependenciesMeta": {
24
+ "@tailwindcss/node": {
25
+ "optional": true
26
+ }
27
+ },
22
28
  "publishConfig": {
23
29
  "access": "public"
24
30
  },
25
31
  "scripts": {
26
- "build": "tsc"
32
+ "build": "tsc --build"
27
33
  },
28
34
  "type": "module",
29
- "types": "./dist/index.d.ts",
30
- "version": "1.0.2"
35
+ "types": "./dist/plugin.d.ts",
36
+ "version": "1.0.3"
31
37
  }