@weapp-tailwindcss/engine 0.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.
package/dist/index.cjs ADDED
@@ -0,0 +1,272 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_v4 = require("./v4-CUw9Iuc5.cjs");
3
+ let node_fs = require("node:fs");
4
+ let node_path = require("node:path");
5
+ node_path = require_v4.__toESM(node_path, 1);
6
+ let node_process = require("node:process");
7
+ node_process = require_v4.__toESM(node_process, 1);
8
+ //#region src/extraction/candidate-extractor/project.ts
9
+ async function resolveScannerSources(options) {
10
+ const cwd = options?.cwd ? node_path.default.resolve(options.cwd) : node_process.default.cwd();
11
+ if (options?.sources?.length || options?.css === void 0) return {
12
+ cwd,
13
+ sources: require_v4.normalizeTailwindV4ScannerSources(options?.sources, cwd, options?.ignoredSources)
14
+ };
15
+ const base = options.base ? node_path.default.resolve(options.base) : cwd;
16
+ const { compiled } = await require_v4.compileTailwindV4Source({
17
+ projectRoot: cwd,
18
+ base,
19
+ baseFallbacks: options.baseFallbacks?.map((baseFallback) => node_path.default.resolve(baseFallback)) ?? [],
20
+ css: options.css,
21
+ dependencies: []
22
+ });
23
+ return {
24
+ cwd,
25
+ sources: require_v4.normalizeTailwindV4ScannerSources(require_v4.createTailwindV4CompiledSourceEntries(compiled.root, compiled.sources, base), cwd, options.ignoredSources)
26
+ };
27
+ }
28
+ async function resolveProjectSourceFiles(options) {
29
+ const { sources } = await resolveScannerSources(options);
30
+ const { Scanner } = await require_v4.getOxideModule();
31
+ const files = new Scanner({ sources }).files ?? [];
32
+ return options?.filter ? files.filter(options.filter) : files;
33
+ }
34
+ async function extractProjectCandidatesWithPositions(options) {
35
+ const { cwd, sources } = await resolveScannerSources(options);
36
+ const { Scanner } = await require_v4.getOxideModule();
37
+ const scanner = new Scanner({ sources });
38
+ const files = scanner.files ?? [];
39
+ const entries = [];
40
+ const skipped = [];
41
+ for (const file of files) {
42
+ let content;
43
+ try {
44
+ content = await node_fs.promises.readFile(file, "utf8");
45
+ } catch (error) {
46
+ skipped.push({
47
+ file,
48
+ reason: error instanceof Error ? error.message : "Unknown error"
49
+ });
50
+ continue;
51
+ }
52
+ const extension = require_v4.toExtension(file);
53
+ const matches = scanner.getCandidatesWithPositions({
54
+ file,
55
+ content,
56
+ extension
57
+ });
58
+ if (!matches.length) continue;
59
+ const offsets = require_v4.buildLineOffsets(content);
60
+ for (const match of matches) entries.push(require_v4.createTokenLocation({
61
+ cwd,
62
+ file,
63
+ content,
64
+ extension,
65
+ candidate: match.candidate,
66
+ position: match.position,
67
+ offsets
68
+ }));
69
+ }
70
+ return {
71
+ entries,
72
+ filesScanned: files.length,
73
+ skippedFiles: skipped,
74
+ sources
75
+ };
76
+ }
77
+ function groupTokensByFile(report, options) {
78
+ const key = options?.key ?? "relative";
79
+ const stripAbsolute = options?.stripAbsolutePaths ?? key !== "absolute";
80
+ return report.entries.reduce((acc, entry) => {
81
+ const bucketKey = key === "absolute" ? entry.file : entry.relativeFile;
82
+ const bucket = acc[bucketKey] ?? (acc[bucketKey] = []);
83
+ const value = stripAbsolute ? {
84
+ ...entry,
85
+ file: entry.relativeFile
86
+ } : entry;
87
+ bucket.push(value);
88
+ return acc;
89
+ }, {});
90
+ }
91
+ //#endregion
92
+ //#region src/extraction/candidate-extractor/valid.ts
93
+ const designSystemCandidateCache = /* @__PURE__ */ new Map();
94
+ function createCandidateCacheKey(designSystemKey, options) {
95
+ if (options.bareArbitraryValues == null || options.bareArbitraryValues === false) return designSystemKey;
96
+ return `${designSystemKey}:bare-arbitrary:${JSON.stringify(options.bareArbitraryValues)}`;
97
+ }
98
+ async function extractValidCandidates(options) {
99
+ const providedOptions = options ?? {};
100
+ const defaultCwd = providedOptions.cwd ?? node_process.default.cwd();
101
+ const base = providedOptions.base ?? defaultCwd;
102
+ const baseFallbacks = providedOptions.baseFallbacks ?? [];
103
+ const css = providedOptions.css ?? "@import \"tailwindcss\";";
104
+ const sources = (providedOptions.sources ?? [{
105
+ base: defaultCwd,
106
+ pattern: "**/*",
107
+ negated: false
108
+ }]).map((source) => ({
109
+ base: source.base ?? defaultCwd,
110
+ pattern: source.pattern,
111
+ negated: source.negated
112
+ }));
113
+ const source = {
114
+ projectRoot: defaultCwd,
115
+ base,
116
+ baseFallbacks,
117
+ css,
118
+ dependencies: []
119
+ };
120
+ const designSystemKey = require_v4.getTailwindV4DesignSystemCacheKey(source);
121
+ const designSystem = await require_v4.loadTailwindV4DesignSystem(source);
122
+ const candidateCacheKey = createCandidateCacheKey(designSystemKey, providedOptions);
123
+ const candidateCache = designSystemCandidateCache.get(candidateCacheKey) ?? /* @__PURE__ */ new Map();
124
+ designSystemCandidateCache.set(candidateCacheKey, candidateCache);
125
+ const candidates = await require_v4.extractRawCandidates(sources, providedOptions.bareArbitraryValues === void 0 ? void 0 : { bareArbitraryValues: providedOptions.bareArbitraryValues });
126
+ const inlineSources = require_v4.extractTailwindV4InlineSourceCandidates(css);
127
+ for (const candidate of inlineSources.included) candidates.push(candidate);
128
+ for (const candidate of inlineSources.excluded) {
129
+ let index = candidates.indexOf(candidate);
130
+ while (index !== -1) {
131
+ candidates.splice(index, 1);
132
+ index = candidates.indexOf(candidate);
133
+ }
134
+ }
135
+ const validCandidates = [];
136
+ const uncachedCandidates = [];
137
+ for (const rawCandidate of candidates) {
138
+ const cached = candidateCache.get(rawCandidate);
139
+ if (cached === true) {
140
+ validCandidates.push(rawCandidate);
141
+ continue;
142
+ }
143
+ if (cached === false) continue;
144
+ const bareArbitrary = require_v4.resolveBareArbitraryValueCandidate(rawCandidate, providedOptions.bareArbitraryValues);
145
+ if (designSystem.parseCandidate(rawCandidate).length > 0 || bareArbitrary && designSystem.parseCandidate(bareArbitrary.canonicalCandidate).length > 0) {
146
+ uncachedCandidates.push(rawCandidate);
147
+ continue;
148
+ }
149
+ candidateCache.set(rawCandidate, false);
150
+ }
151
+ if (uncachedCandidates.length === 0) return validCandidates;
152
+ const validUncachedCandidates = require_v4.resolveValidTailwindV4Candidates(designSystem, uncachedCandidates, providedOptions.bareArbitraryValues === void 0 ? void 0 : { bareArbitraryValues: providedOptions.bareArbitraryValues });
153
+ for (const candidate of uncachedCandidates) {
154
+ const isValid = validUncachedCandidates.has(candidate);
155
+ candidateCache.set(candidate, isValid);
156
+ if (!isValid) continue;
157
+ validCandidates.push(candidate);
158
+ }
159
+ return validCandidates;
160
+ }
161
+ //#endregion
162
+ //#region src/extraction/split-candidate-tokens.ts
163
+ const validateCandidateTokenRE = /[\w\u00A0-\uFFFF%-?]/;
164
+ function isValidCandidateToken(token = "") {
165
+ return validateCandidateTokenRE.test(token);
166
+ }
167
+ const SPLIT_CACHE_LIMIT = 8192;
168
+ const ESCAPED_WHITESPACE_RE = /\\[nrt]/g;
169
+ const splitCache = /* @__PURE__ */ new Map();
170
+ function isSplitter(char, bracketDepth) {
171
+ return bracketDepth === 0 && (char === "\"" || /\s/.test(char));
172
+ }
173
+ function hasClosingQuotedArbitraryValue(code, start, quote) {
174
+ for (let index = start; index < code.length; index++) {
175
+ if (code[index] === "\\") {
176
+ index++;
177
+ continue;
178
+ }
179
+ if (code[index] === quote) return code.includes("]", index + 1);
180
+ }
181
+ return false;
182
+ }
183
+ function splitBracketAware(code) {
184
+ const result = [];
185
+ let bracketDepth = 0;
186
+ let bracketQuote;
187
+ let start = 0;
188
+ for (let index = 0; index < code.length; index++) {
189
+ const char = code[index];
190
+ if (char === void 0) continue;
191
+ if (bracketDepth > 0 && char === "\\") {
192
+ index++;
193
+ continue;
194
+ }
195
+ if (bracketDepth > 0 && (char === "\"" || char === "'")) {
196
+ if (bracketQuote === char) bracketQuote = void 0;
197
+ else if (bracketQuote === void 0 && hasClosingQuotedArbitraryValue(code, index + 1, char)) bracketQuote = char;
198
+ }
199
+ if (bracketQuote === void 0) {
200
+ if (char === "[" && code.includes("]", index + 1)) bracketDepth++;
201
+ else if (char === "]" && bracketDepth > 0) bracketDepth--;
202
+ }
203
+ if (!isSplitter(char, bracketDepth)) continue;
204
+ const candidate = code.slice(start, index);
205
+ if (isValidCandidateToken(candidate)) result.push(candidate);
206
+ start = index + 1;
207
+ }
208
+ const candidate = code.slice(start);
209
+ if (isValidCandidateToken(candidate)) result.push(candidate);
210
+ return result;
211
+ }
212
+ function splitCandidateTokens(code) {
213
+ const cached = splitCache.get(code);
214
+ if (cached) return cached;
215
+ const result = splitBracketAware(code.includes("\\") ? code.replace(ESCAPED_WHITESPACE_RE, " ") : code);
216
+ if (splitCache.size >= SPLIT_CACHE_LIMIT) splitCache.clear();
217
+ splitCache.set(code, result);
218
+ return result;
219
+ }
220
+ //#endregion
221
+ exports.TAILWIND_V4_AUTO_SOURCE_SCAN_PATTERN = require_v4.TAILWIND_V4_AUTO_SOURCE_SCAN_PATTERN;
222
+ exports.TAILWIND_V4_IGNORED_CONTENT_DIRS = require_v4.TAILWIND_V4_IGNORED_CONTENT_DIRS;
223
+ exports.TAILWIND_V4_IGNORED_EXTENSIONS = require_v4.TAILWIND_V4_IGNORED_EXTENSIONS;
224
+ exports.TAILWIND_V4_IGNORED_FILES = require_v4.TAILWIND_V4_IGNORED_FILES;
225
+ exports.canonicalizeBareArbitraryValueCandidates = require_v4.canonicalizeBareArbitraryValueCandidates;
226
+ exports.collectTailwindStyleCandidates = require_v4.collectTailwindStyleCandidates;
227
+ exports.collectTailwindV4StyleCandidates = require_v4.collectTailwindV4StyleCandidates;
228
+ exports.compileTailwindV4Source = require_v4.compileTailwindV4Source;
229
+ exports.createTailwindGenerationSession = require_v4.createTailwindGenerationSession;
230
+ exports.createTailwindV4CompiledSourceEntries = require_v4.createTailwindV4CompiledSourceEntries;
231
+ exports.createTailwindV4DefaultIgnoreSources = require_v4.createTailwindV4DefaultIgnoreSources;
232
+ exports.createTailwindV4Engine = require_v4.createTailwindV4Engine;
233
+ exports.createTailwindV4RootSources = require_v4.createTailwindV4RootSources;
234
+ exports.createTailwindV4SourceEntryMatcher = require_v4.createTailwindV4SourceEntryMatcher;
235
+ exports.createTailwindV4SourceExclusionMatcher = require_v4.createTailwindV4SourceExclusionMatcher;
236
+ exports.escapeCssClassName = require_v4.escapeCssClassName;
237
+ exports.expandTailwindV4SourceEntries = require_v4.expandTailwindV4SourceEntries;
238
+ exports.expandTailwindV4SourceEntryBraces = require_v4.expandTailwindV4SourceEntryBraces;
239
+ exports.extractBareArbitraryValueSourceCandidates = require_v4.extractBareArbitraryValueSourceCandidates;
240
+ exports.extractBareArbitraryValueSourceCandidatesWithPositions = require_v4.extractBareArbitraryValueSourceCandidatesWithPositions;
241
+ exports.extractProjectCandidatesWithPositions = extractProjectCandidatesWithPositions;
242
+ exports.extractRawCandidates = require_v4.extractRawCandidates;
243
+ exports.extractRawCandidatesWithPositions = require_v4.extractRawCandidatesWithPositions;
244
+ exports.extractSourceCandidates = require_v4.extractSourceCandidates;
245
+ exports.extractSourceCandidatesWithPositions = require_v4.extractSourceCandidatesWithPositions;
246
+ exports.extractTailwindV4InlineSourceCandidates = require_v4.extractTailwindV4InlineSourceCandidates;
247
+ exports.extractValidCandidates = extractValidCandidates;
248
+ exports.generateTailwindV4Style = require_v4.generateTailwindV4Style;
249
+ exports.getTailwindV4DesignSystemCacheKey = require_v4.getTailwindV4DesignSystemCacheKey;
250
+ exports.groupTailwindV4SourceEntriesByBase = require_v4.groupTailwindV4SourceEntriesByBase;
251
+ exports.groupTokensByFile = groupTokensByFile;
252
+ exports.isBareArbitraryValuesEnabled = require_v4.isBareArbitraryValuesEnabled;
253
+ exports.isFileExcludedByTailwindV4SourceEntries = require_v4.isFileExcludedByTailwindV4SourceEntries;
254
+ exports.isFileMatchedByTailwindV4SourceEntries = require_v4.isFileMatchedByTailwindV4SourceEntries;
255
+ exports.isValidCandidateToken = isValidCandidateToken;
256
+ exports.loadTailwindV4DesignSystem = require_v4.loadTailwindV4DesignSystem;
257
+ exports.loadTailwindV4NodeModule = require_v4.loadTailwindV4NodeModule;
258
+ exports.mergeTailwindV4SourceEntries = require_v4.mergeTailwindV4SourceEntries;
259
+ exports.normalizeGlobPattern = require_v4.normalizeGlobPattern;
260
+ exports.normalizeTailwindV4ScannerSources = require_v4.normalizeTailwindV4ScannerSources;
261
+ exports.normalizeTailwindV4SourceEntries = require_v4.normalizeTailwindV4SourceEntries;
262
+ exports.replaceBareArbitraryValueSelectors = require_v4.replaceBareArbitraryValueSelectors;
263
+ exports.resolveBareArbitraryValueCandidate = require_v4.resolveBareArbitraryValueCandidate;
264
+ exports.resolveProjectSourceFiles = resolveProjectSourceFiles;
265
+ exports.resolveSourceScanPath = require_v4.resolveSourceScanPath;
266
+ exports.resolveTailwindV4Source = require_v4.resolveTailwindV4Source;
267
+ exports.resolveTailwindV4SourceBaseCandidates = require_v4.resolveTailwindV4SourceBaseCandidates;
268
+ exports.resolveTailwindV4SourceEntry = require_v4.resolveTailwindV4SourceEntry;
269
+ exports.resolveValidTailwindV4Candidates = require_v4.resolveValidTailwindV4Candidates;
270
+ exports.splitCandidateTokens = splitCandidateTokens;
271
+ exports.toPosixPath = require_v4.toPosixPath;
272
+ exports.validateCandidateTokenRE = validateCandidateTokenRE;
@@ -0,0 +1,84 @@
1
+ import { $ as TailwindV4StyleGenerateOptions, A as createTailwindGenerationSession, B as SourceEntry, C as isFileExcludedByTailwindV4SourceEntries, D as getTailwindV4DesignSystemCacheKey, E as compileTailwindV4Source, F as extractTailwindV4InlineSourceCandidates, G as TailwindV4CssSource, H as TailwindGenerationSession, I as CssFragment, J as TailwindV4GenerateOptions, K as TailwindV4DesignSystem, L as CssFragmentKind, M as canonicalizeBareArbitraryValueCandidates, N as replaceBareArbitraryValueSelectors, O as loadTailwindV4DesignSystem, P as resolveValidTailwindV4Candidates, Q as TailwindV4SourcePattern, R as GenerationChange, S as groupTailwindV4SourceEntriesByBase, T as mergeTailwindV4SourceEntries, U as TailwindV4CandidateSource, V as TailwindGenerationArtifact, W as TailwindV4CompiledSourceRoot, X as TailwindV4ResolvedSource, Y as TailwindV4GenerateResult, Z as TailwindV4SourceOptions, _ as resolveTailwindV4SourceEntry, a as TAILWIND_V4_IGNORED_CONTENT_DIRS, at as isBareArbitraryValuesEnabled, b as createTailwindV4SourceExclusionMatcher, c as createTailwindV4CompiledSourceEntries, ct as extractBareArbitraryValueSourceCandidatesWithPositions, d as expandTailwindV4SourceEntryBraces, dt as BareArbitraryValueSourceCandidate, et as TailwindV4StyleGenerateResult, f as normalizeGlobPattern, ft as escapeCssClassName, g as resolveTailwindV4SourceBaseCandidates, h as resolveSourceScanPath, i as TAILWIND_V4_AUTO_SOURCE_SCAN_PATTERN, it as collectTailwindStyleCandidates, j as createTailwindV4Engine, k as loadTailwindV4NodeModule, l as createTailwindV4DefaultIgnoreSources, lt as BareArbitraryValueOptions, m as normalizeTailwindV4SourceEntries, n as generateTailwindV4Style, nt as TailwindStyleCandidateOptions, o as TAILWIND_V4_IGNORED_EXTENSIONS, ot as resolveBareArbitraryValueCandidate, p as normalizeTailwindV4ScannerSources, q as TailwindV4Engine, r as resolveTailwindV4Source, rt as TailwindStyleSource, s as TAILWIND_V4_IGNORED_FILES, st as extractBareArbitraryValueSourceCandidates, t as collectTailwindV4StyleCandidates, tt as TailwindV4StyleSource, u as createTailwindV4RootSources, ut as BareArbitraryValueResolveResult, v as toPosixPath, w as isFileMatchedByTailwindV4SourceEntries, x as expandTailwindV4SourceEntries, y as createTailwindV4SourceEntryMatcher, z as GenerationRequest } from "./index-BKLDGE3a.cjs";
2
+ import { SourceEntry as SourceEntry$1 } from "@tailwindcss/oxide";
3
+ //#region src/types.d.ts
4
+ export interface TailwindTokenLocation {
5
+ rawCandidate: string;
6
+ file: string;
7
+ relativeFile: string;
8
+ extension: string;
9
+ start: number;
10
+ end: number;
11
+ length: number;
12
+ line: number;
13
+ column: number;
14
+ lineText: string;
15
+ }
16
+ export type TailwindTokenFileKey = 'relative' | 'absolute';
17
+ export interface TailwindTokenReport {
18
+ entries: TailwindTokenLocation[];
19
+ filesScanned: number;
20
+ sources: SourceEntry$1[];
21
+ skippedFiles: {
22
+ file: string;
23
+ reason: string;
24
+ }[];
25
+ }
26
+ export type TailwindTokenByFileMap = Record<string, TailwindTokenLocation[]>;
27
+ //#endregion
28
+ //#region src/extraction/candidate-extractor/project.d.ts
29
+ export interface ExtractProjectCandidatesOptions {
30
+ cwd?: string;
31
+ sources?: SourceEntry$1[];
32
+ base?: string;
33
+ baseFallbacks?: string[];
34
+ css?: string;
35
+ }
36
+ export interface ResolveProjectSourceFilesOptions {
37
+ cwd?: string;
38
+ sources?: SourceEntry$1[];
39
+ ignoredSources?: SourceEntry$1[];
40
+ base?: string;
41
+ baseFallbacks?: string[];
42
+ css?: string;
43
+ filter?: (file: string) => boolean;
44
+ }
45
+ export declare function resolveProjectSourceFiles(options?: ResolveProjectSourceFilesOptions): Promise<string[]>;
46
+ export declare function extractProjectCandidatesWithPositions(options?: ExtractProjectCandidatesOptions): Promise<TailwindTokenReport>;
47
+ export declare function groupTokensByFile(report: TailwindTokenReport, options?: {
48
+ key?: TailwindTokenFileKey;
49
+ stripAbsolutePaths?: boolean;
50
+ }): TailwindTokenByFileMap;
51
+ //#endregion
52
+ //#region src/extraction/types.d.ts
53
+ interface ExtractCandidateOptions {
54
+ bareArbitraryValues?: boolean | BareArbitraryValueOptions;
55
+ }
56
+ interface ExtractSourceCandidate {
57
+ rawCandidate: string;
58
+ start: number;
59
+ end: number;
60
+ }
61
+ //#endregion
62
+ //#region src/extraction/candidate-extractor/raw.d.ts
63
+ export declare function extractRawCandidatesWithPositions(content: string, extension?: string, options?: ExtractCandidateOptions): Promise<ExtractSourceCandidate[]>;
64
+ export declare function extractSourceCandidatesWithPositions(content: string, extension?: string, options?: ExtractCandidateOptions): Promise<ExtractSourceCandidate[]>;
65
+ export declare function extractSourceCandidates(content: string, extension?: string, options?: ExtractCandidateOptions): Promise<string[]>;
66
+ export declare function extractRawCandidates(sources?: SourceEntry$1[], options?: ExtractCandidateOptions): Promise<string[]>;
67
+ //#endregion
68
+ //#region src/extraction/candidate-extractor/valid.d.ts
69
+ export interface ExtractValidCandidatesOption {
70
+ sources?: SourceEntry$1[];
71
+ base?: string;
72
+ baseFallbacks?: string[];
73
+ css?: string;
74
+ cwd?: string;
75
+ bareArbitraryValues?: boolean | BareArbitraryValueOptions;
76
+ }
77
+ export declare function extractValidCandidates(options?: ExtractValidCandidatesOption): Promise<string[]>;
78
+ //#endregion
79
+ //#region src/extraction/split-candidate-tokens.d.ts
80
+ export declare const validateCandidateTokenRE: RegExp;
81
+ export declare function isValidCandidateToken(token?: string): token is string;
82
+ export declare function splitCandidateTokens(code: string): string[];
83
+ //#endregion
84
+ export { type BareArbitraryValueOptions, type BareArbitraryValueResolveResult, type BareArbitraryValueSourceCandidate, type CssFragment, type CssFragmentKind, type ExtractCandidateOptions, type ExtractSourceCandidate, type GenerationChange, type GenerationRequest, type SourceEntry, TAILWIND_V4_AUTO_SOURCE_SCAN_PATTERN, TAILWIND_V4_IGNORED_CONTENT_DIRS, TAILWIND_V4_IGNORED_EXTENSIONS, TAILWIND_V4_IGNORED_FILES, type TailwindGenerationArtifact, type TailwindGenerationSession, TailwindStyleCandidateOptions, TailwindStyleSource, type TailwindV4CandidateSource, type TailwindV4CompiledSourceRoot, type TailwindV4CssSource, type TailwindV4DesignSystem, type TailwindV4Engine, type TailwindV4GenerateOptions, type TailwindV4GenerateResult, type TailwindV4ResolvedSource, type TailwindV4SourceOptions, type TailwindV4SourcePattern, type TailwindV4StyleGenerateOptions, type TailwindV4StyleGenerateResult, type TailwindV4StyleSource, canonicalizeBareArbitraryValueCandidates, collectTailwindStyleCandidates, collectTailwindV4StyleCandidates, compileTailwindV4Source, createTailwindGenerationSession, createTailwindV4CompiledSourceEntries, createTailwindV4DefaultIgnoreSources, createTailwindV4Engine, createTailwindV4RootSources, createTailwindV4SourceEntryMatcher, createTailwindV4SourceExclusionMatcher, escapeCssClassName, expandTailwindV4SourceEntries, expandTailwindV4SourceEntryBraces, extractBareArbitraryValueSourceCandidates, extractBareArbitraryValueSourceCandidatesWithPositions, extractTailwindV4InlineSourceCandidates, generateTailwindV4Style, getTailwindV4DesignSystemCacheKey, groupTailwindV4SourceEntriesByBase, isBareArbitraryValuesEnabled, isFileExcludedByTailwindV4SourceEntries, isFileMatchedByTailwindV4SourceEntries, loadTailwindV4DesignSystem, loadTailwindV4NodeModule, mergeTailwindV4SourceEntries, normalizeGlobPattern, normalizeTailwindV4ScannerSources, normalizeTailwindV4SourceEntries, replaceBareArbitraryValueSelectors, resolveBareArbitraryValueCandidate, resolveSourceScanPath, resolveTailwindV4Source, resolveTailwindV4SourceBaseCandidates, resolveTailwindV4SourceEntry, resolveValidTailwindV4Candidates, toPosixPath };
@@ -0,0 +1,84 @@
1
+ import { $ as TailwindV4StyleGenerateOptions, A as createTailwindGenerationSession, B as SourceEntry, C as isFileExcludedByTailwindV4SourceEntries, D as getTailwindV4DesignSystemCacheKey, E as compileTailwindV4Source, F as extractTailwindV4InlineSourceCandidates, G as TailwindV4CssSource, H as TailwindGenerationSession, I as CssFragment, J as TailwindV4GenerateOptions, K as TailwindV4DesignSystem, L as CssFragmentKind, M as canonicalizeBareArbitraryValueCandidates, N as replaceBareArbitraryValueSelectors, O as loadTailwindV4DesignSystem, P as resolveValidTailwindV4Candidates, Q as TailwindV4SourcePattern, R as GenerationChange, S as groupTailwindV4SourceEntriesByBase, T as mergeTailwindV4SourceEntries, U as TailwindV4CandidateSource, V as TailwindGenerationArtifact, W as TailwindV4CompiledSourceRoot, X as TailwindV4ResolvedSource, Y as TailwindV4GenerateResult, Z as TailwindV4SourceOptions, _ as resolveTailwindV4SourceEntry, a as TAILWIND_V4_IGNORED_CONTENT_DIRS, at as isBareArbitraryValuesEnabled, b as createTailwindV4SourceExclusionMatcher, c as createTailwindV4CompiledSourceEntries, ct as extractBareArbitraryValueSourceCandidatesWithPositions, d as expandTailwindV4SourceEntryBraces, dt as BareArbitraryValueSourceCandidate, et as TailwindV4StyleGenerateResult, f as normalizeGlobPattern, ft as escapeCssClassName, g as resolveTailwindV4SourceBaseCandidates, h as resolveSourceScanPath, i as TAILWIND_V4_AUTO_SOURCE_SCAN_PATTERN, it as collectTailwindStyleCandidates, j as createTailwindV4Engine, k as loadTailwindV4NodeModule, l as createTailwindV4DefaultIgnoreSources, lt as BareArbitraryValueOptions, m as normalizeTailwindV4SourceEntries, n as generateTailwindV4Style, nt as TailwindStyleCandidateOptions, o as TAILWIND_V4_IGNORED_EXTENSIONS, ot as resolveBareArbitraryValueCandidate, p as normalizeTailwindV4ScannerSources, q as TailwindV4Engine, r as resolveTailwindV4Source, rt as TailwindStyleSource, s as TAILWIND_V4_IGNORED_FILES, st as extractBareArbitraryValueSourceCandidates, t as collectTailwindV4StyleCandidates, tt as TailwindV4StyleSource, u as createTailwindV4RootSources, ut as BareArbitraryValueResolveResult, v as toPosixPath, w as isFileMatchedByTailwindV4SourceEntries, x as expandTailwindV4SourceEntries, y as createTailwindV4SourceEntryMatcher, z as GenerationRequest } from "./index-CJQBHKch.js";
2
+ import { SourceEntry as SourceEntry$1 } from "@tailwindcss/oxide";
3
+ //#region src/types.d.ts
4
+ export interface TailwindTokenLocation {
5
+ rawCandidate: string;
6
+ file: string;
7
+ relativeFile: string;
8
+ extension: string;
9
+ start: number;
10
+ end: number;
11
+ length: number;
12
+ line: number;
13
+ column: number;
14
+ lineText: string;
15
+ }
16
+ export type TailwindTokenFileKey = 'relative' | 'absolute';
17
+ export interface TailwindTokenReport {
18
+ entries: TailwindTokenLocation[];
19
+ filesScanned: number;
20
+ sources: SourceEntry$1[];
21
+ skippedFiles: {
22
+ file: string;
23
+ reason: string;
24
+ }[];
25
+ }
26
+ export type TailwindTokenByFileMap = Record<string, TailwindTokenLocation[]>;
27
+ //#endregion
28
+ //#region src/extraction/candidate-extractor/project.d.ts
29
+ export interface ExtractProjectCandidatesOptions {
30
+ cwd?: string;
31
+ sources?: SourceEntry$1[];
32
+ base?: string;
33
+ baseFallbacks?: string[];
34
+ css?: string;
35
+ }
36
+ export interface ResolveProjectSourceFilesOptions {
37
+ cwd?: string;
38
+ sources?: SourceEntry$1[];
39
+ ignoredSources?: SourceEntry$1[];
40
+ base?: string;
41
+ baseFallbacks?: string[];
42
+ css?: string;
43
+ filter?: (file: string) => boolean;
44
+ }
45
+ export declare function resolveProjectSourceFiles(options?: ResolveProjectSourceFilesOptions): Promise<string[]>;
46
+ export declare function extractProjectCandidatesWithPositions(options?: ExtractProjectCandidatesOptions): Promise<TailwindTokenReport>;
47
+ export declare function groupTokensByFile(report: TailwindTokenReport, options?: {
48
+ key?: TailwindTokenFileKey;
49
+ stripAbsolutePaths?: boolean;
50
+ }): TailwindTokenByFileMap;
51
+ //#endregion
52
+ //#region src/extraction/types.d.ts
53
+ interface ExtractCandidateOptions {
54
+ bareArbitraryValues?: boolean | BareArbitraryValueOptions;
55
+ }
56
+ interface ExtractSourceCandidate {
57
+ rawCandidate: string;
58
+ start: number;
59
+ end: number;
60
+ }
61
+ //#endregion
62
+ //#region src/extraction/candidate-extractor/raw.d.ts
63
+ export declare function extractRawCandidatesWithPositions(content: string, extension?: string, options?: ExtractCandidateOptions): Promise<ExtractSourceCandidate[]>;
64
+ export declare function extractSourceCandidatesWithPositions(content: string, extension?: string, options?: ExtractCandidateOptions): Promise<ExtractSourceCandidate[]>;
65
+ export declare function extractSourceCandidates(content: string, extension?: string, options?: ExtractCandidateOptions): Promise<string[]>;
66
+ export declare function extractRawCandidates(sources?: SourceEntry$1[], options?: ExtractCandidateOptions): Promise<string[]>;
67
+ //#endregion
68
+ //#region src/extraction/candidate-extractor/valid.d.ts
69
+ export interface ExtractValidCandidatesOption {
70
+ sources?: SourceEntry$1[];
71
+ base?: string;
72
+ baseFallbacks?: string[];
73
+ css?: string;
74
+ cwd?: string;
75
+ bareArbitraryValues?: boolean | BareArbitraryValueOptions;
76
+ }
77
+ export declare function extractValidCandidates(options?: ExtractValidCandidatesOption): Promise<string[]>;
78
+ //#endregion
79
+ //#region src/extraction/split-candidate-tokens.d.ts
80
+ export declare const validateCandidateTokenRE: RegExp;
81
+ export declare function isValidCandidateToken(token?: string): token is string;
82
+ export declare function splitCandidateTokens(code: string): string[];
83
+ //#endregion
84
+ export { type BareArbitraryValueOptions, type BareArbitraryValueResolveResult, type BareArbitraryValueSourceCandidate, type CssFragment, type CssFragmentKind, type ExtractCandidateOptions, type ExtractSourceCandidate, type GenerationChange, type GenerationRequest, type SourceEntry, TAILWIND_V4_AUTO_SOURCE_SCAN_PATTERN, TAILWIND_V4_IGNORED_CONTENT_DIRS, TAILWIND_V4_IGNORED_EXTENSIONS, TAILWIND_V4_IGNORED_FILES, type TailwindGenerationArtifact, type TailwindGenerationSession, TailwindStyleCandidateOptions, TailwindStyleSource, type TailwindV4CandidateSource, type TailwindV4CompiledSourceRoot, type TailwindV4CssSource, type TailwindV4DesignSystem, type TailwindV4Engine, type TailwindV4GenerateOptions, type TailwindV4GenerateResult, type TailwindV4ResolvedSource, type TailwindV4SourceOptions, type TailwindV4SourcePattern, type TailwindV4StyleGenerateOptions, type TailwindV4StyleGenerateResult, type TailwindV4StyleSource, canonicalizeBareArbitraryValueCandidates, collectTailwindStyleCandidates, collectTailwindV4StyleCandidates, compileTailwindV4Source, createTailwindGenerationSession, createTailwindV4CompiledSourceEntries, createTailwindV4DefaultIgnoreSources, createTailwindV4Engine, createTailwindV4RootSources, createTailwindV4SourceEntryMatcher, createTailwindV4SourceExclusionMatcher, escapeCssClassName, expandTailwindV4SourceEntries, expandTailwindV4SourceEntryBraces, extractBareArbitraryValueSourceCandidates, extractBareArbitraryValueSourceCandidatesWithPositions, extractTailwindV4InlineSourceCandidates, generateTailwindV4Style, getTailwindV4DesignSystemCacheKey, groupTailwindV4SourceEntriesByBase, isBareArbitraryValuesEnabled, isFileExcludedByTailwindV4SourceEntries, isFileMatchedByTailwindV4SourceEntries, loadTailwindV4DesignSystem, loadTailwindV4NodeModule, mergeTailwindV4SourceEntries, normalizeGlobPattern, normalizeTailwindV4ScannerSources, normalizeTailwindV4SourceEntries, replaceBareArbitraryValueSelectors, resolveBareArbitraryValueCandidate, resolveSourceScanPath, resolveTailwindV4Source, resolveTailwindV4SourceBaseCandidates, resolveTailwindV4SourceEntry, resolveValidTailwindV4Candidates, toPosixPath };
package/dist/index.js ADDED
@@ -0,0 +1,218 @@
1
+ import { A as mergeTailwindV4SourceEntries, B as normalizeTailwindV4ScannerSources, C as getOxideModule, D as groupTailwindV4SourceEntriesByBase, E as expandTailwindV4SourceEntries, F as createTailwindV4CompiledSourceEntries, G as toPosixPath, H as resolveSourceScanPath, I as createTailwindV4DefaultIgnoreSources, J as loadTailwindV4DesignSystem, K as compileTailwindV4Source, L as createTailwindV4RootSources, M as TAILWIND_V4_IGNORED_CONTENT_DIRS, N as TAILWIND_V4_IGNORED_EXTENSIONS, O as isFileExcludedByTailwindV4SourceEntries, P as TAILWIND_V4_IGNORED_FILES, R as expandTailwindV4SourceEntryBraces, S as toExtension, T as createTailwindV4SourceExclusionMatcher, U as resolveTailwindV4SourceBaseCandidates, V as normalizeTailwindV4SourceEntries, W as resolveTailwindV4SourceEntry, Y as loadTailwindV4NodeModule, _ as isBareArbitraryValuesEnabled, a as createTailwindGenerationSession, b as buildLineOffsets, c as replaceBareArbitraryValueSelectors, d as extractRawCandidates, f as extractRawCandidatesWithPositions, g as extractBareArbitraryValueSourceCandidatesWithPositions, h as extractBareArbitraryValueSourceCandidates, i as createTailwindV4Engine, j as TAILWIND_V4_AUTO_SOURCE_SCAN_PATTERN, k as isFileMatchedByTailwindV4SourceEntries, l as resolveValidTailwindV4Candidates, m as extractSourceCandidatesWithPositions, n as generateTailwindV4Style, o as collectTailwindStyleCandidates, p as extractSourceCandidates, q as getTailwindV4DesignSystemCacheKey, r as resolveTailwindV4Source, s as canonicalizeBareArbitraryValueCandidates, t as collectTailwindV4StyleCandidates, u as extractTailwindV4InlineSourceCandidates, v as resolveBareArbitraryValueCandidate, w as createTailwindV4SourceEntryMatcher, x as createTokenLocation, y as escapeCssClassName, z as normalizeGlobPattern } from "./v4-BdeIFyye.js";
2
+ import { promises } from "node:fs";
3
+ import path from "node:path";
4
+ import process from "node:process";
5
+ //#region src/extraction/candidate-extractor/project.ts
6
+ async function resolveScannerSources(options) {
7
+ const cwd = options?.cwd ? path.resolve(options.cwd) : process.cwd();
8
+ if (options?.sources?.length || options?.css === void 0) return {
9
+ cwd,
10
+ sources: normalizeTailwindV4ScannerSources(options?.sources, cwd, options?.ignoredSources)
11
+ };
12
+ const base = options.base ? path.resolve(options.base) : cwd;
13
+ const { compiled } = await compileTailwindV4Source({
14
+ projectRoot: cwd,
15
+ base,
16
+ baseFallbacks: options.baseFallbacks?.map((baseFallback) => path.resolve(baseFallback)) ?? [],
17
+ css: options.css,
18
+ dependencies: []
19
+ });
20
+ return {
21
+ cwd,
22
+ sources: normalizeTailwindV4ScannerSources(createTailwindV4CompiledSourceEntries(compiled.root, compiled.sources, base), cwd, options.ignoredSources)
23
+ };
24
+ }
25
+ async function resolveProjectSourceFiles(options) {
26
+ const { sources } = await resolveScannerSources(options);
27
+ const { Scanner } = await getOxideModule();
28
+ const files = new Scanner({ sources }).files ?? [];
29
+ return options?.filter ? files.filter(options.filter) : files;
30
+ }
31
+ async function extractProjectCandidatesWithPositions(options) {
32
+ const { cwd, sources } = await resolveScannerSources(options);
33
+ const { Scanner } = await getOxideModule();
34
+ const scanner = new Scanner({ sources });
35
+ const files = scanner.files ?? [];
36
+ const entries = [];
37
+ const skipped = [];
38
+ for (const file of files) {
39
+ let content;
40
+ try {
41
+ content = await promises.readFile(file, "utf8");
42
+ } catch (error) {
43
+ skipped.push({
44
+ file,
45
+ reason: error instanceof Error ? error.message : "Unknown error"
46
+ });
47
+ continue;
48
+ }
49
+ const extension = toExtension(file);
50
+ const matches = scanner.getCandidatesWithPositions({
51
+ file,
52
+ content,
53
+ extension
54
+ });
55
+ if (!matches.length) continue;
56
+ const offsets = buildLineOffsets(content);
57
+ for (const match of matches) entries.push(createTokenLocation({
58
+ cwd,
59
+ file,
60
+ content,
61
+ extension,
62
+ candidate: match.candidate,
63
+ position: match.position,
64
+ offsets
65
+ }));
66
+ }
67
+ return {
68
+ entries,
69
+ filesScanned: files.length,
70
+ skippedFiles: skipped,
71
+ sources
72
+ };
73
+ }
74
+ function groupTokensByFile(report, options) {
75
+ const key = options?.key ?? "relative";
76
+ const stripAbsolute = options?.stripAbsolutePaths ?? key !== "absolute";
77
+ return report.entries.reduce((acc, entry) => {
78
+ const bucketKey = key === "absolute" ? entry.file : entry.relativeFile;
79
+ const bucket = acc[bucketKey] ?? (acc[bucketKey] = []);
80
+ const value = stripAbsolute ? {
81
+ ...entry,
82
+ file: entry.relativeFile
83
+ } : entry;
84
+ bucket.push(value);
85
+ return acc;
86
+ }, {});
87
+ }
88
+ //#endregion
89
+ //#region src/extraction/candidate-extractor/valid.ts
90
+ const designSystemCandidateCache = /* @__PURE__ */ new Map();
91
+ function createCandidateCacheKey(designSystemKey, options) {
92
+ if (options.bareArbitraryValues == null || options.bareArbitraryValues === false) return designSystemKey;
93
+ return `${designSystemKey}:bare-arbitrary:${JSON.stringify(options.bareArbitraryValues)}`;
94
+ }
95
+ async function extractValidCandidates(options) {
96
+ const providedOptions = options ?? {};
97
+ const defaultCwd = providedOptions.cwd ?? process.cwd();
98
+ const base = providedOptions.base ?? defaultCwd;
99
+ const baseFallbacks = providedOptions.baseFallbacks ?? [];
100
+ const css = providedOptions.css ?? "@import \"tailwindcss\";";
101
+ const sources = (providedOptions.sources ?? [{
102
+ base: defaultCwd,
103
+ pattern: "**/*",
104
+ negated: false
105
+ }]).map((source) => ({
106
+ base: source.base ?? defaultCwd,
107
+ pattern: source.pattern,
108
+ negated: source.negated
109
+ }));
110
+ const source = {
111
+ projectRoot: defaultCwd,
112
+ base,
113
+ baseFallbacks,
114
+ css,
115
+ dependencies: []
116
+ };
117
+ const designSystemKey = getTailwindV4DesignSystemCacheKey(source);
118
+ const designSystem = await loadTailwindV4DesignSystem(source);
119
+ const candidateCacheKey = createCandidateCacheKey(designSystemKey, providedOptions);
120
+ const candidateCache = designSystemCandidateCache.get(candidateCacheKey) ?? /* @__PURE__ */ new Map();
121
+ designSystemCandidateCache.set(candidateCacheKey, candidateCache);
122
+ const candidates = await extractRawCandidates(sources, providedOptions.bareArbitraryValues === void 0 ? void 0 : { bareArbitraryValues: providedOptions.bareArbitraryValues });
123
+ const inlineSources = extractTailwindV4InlineSourceCandidates(css);
124
+ for (const candidate of inlineSources.included) candidates.push(candidate);
125
+ for (const candidate of inlineSources.excluded) {
126
+ let index = candidates.indexOf(candidate);
127
+ while (index !== -1) {
128
+ candidates.splice(index, 1);
129
+ index = candidates.indexOf(candidate);
130
+ }
131
+ }
132
+ const validCandidates = [];
133
+ const uncachedCandidates = [];
134
+ for (const rawCandidate of candidates) {
135
+ const cached = candidateCache.get(rawCandidate);
136
+ if (cached === true) {
137
+ validCandidates.push(rawCandidate);
138
+ continue;
139
+ }
140
+ if (cached === false) continue;
141
+ const bareArbitrary = resolveBareArbitraryValueCandidate(rawCandidate, providedOptions.bareArbitraryValues);
142
+ if (designSystem.parseCandidate(rawCandidate).length > 0 || bareArbitrary && designSystem.parseCandidate(bareArbitrary.canonicalCandidate).length > 0) {
143
+ uncachedCandidates.push(rawCandidate);
144
+ continue;
145
+ }
146
+ candidateCache.set(rawCandidate, false);
147
+ }
148
+ if (uncachedCandidates.length === 0) return validCandidates;
149
+ const validUncachedCandidates = resolveValidTailwindV4Candidates(designSystem, uncachedCandidates, providedOptions.bareArbitraryValues === void 0 ? void 0 : { bareArbitraryValues: providedOptions.bareArbitraryValues });
150
+ for (const candidate of uncachedCandidates) {
151
+ const isValid = validUncachedCandidates.has(candidate);
152
+ candidateCache.set(candidate, isValid);
153
+ if (!isValid) continue;
154
+ validCandidates.push(candidate);
155
+ }
156
+ return validCandidates;
157
+ }
158
+ //#endregion
159
+ //#region src/extraction/split-candidate-tokens.ts
160
+ const validateCandidateTokenRE = /[\w\u00A0-\uFFFF%-?]/;
161
+ function isValidCandidateToken(token = "") {
162
+ return validateCandidateTokenRE.test(token);
163
+ }
164
+ const SPLIT_CACHE_LIMIT = 8192;
165
+ const ESCAPED_WHITESPACE_RE = /\\[nrt]/g;
166
+ const splitCache = /* @__PURE__ */ new Map();
167
+ function isSplitter(char, bracketDepth) {
168
+ return bracketDepth === 0 && (char === "\"" || /\s/.test(char));
169
+ }
170
+ function hasClosingQuotedArbitraryValue(code, start, quote) {
171
+ for (let index = start; index < code.length; index++) {
172
+ if (code[index] === "\\") {
173
+ index++;
174
+ continue;
175
+ }
176
+ if (code[index] === quote) return code.includes("]", index + 1);
177
+ }
178
+ return false;
179
+ }
180
+ function splitBracketAware(code) {
181
+ const result = [];
182
+ let bracketDepth = 0;
183
+ let bracketQuote;
184
+ let start = 0;
185
+ for (let index = 0; index < code.length; index++) {
186
+ const char = code[index];
187
+ if (char === void 0) continue;
188
+ if (bracketDepth > 0 && char === "\\") {
189
+ index++;
190
+ continue;
191
+ }
192
+ if (bracketDepth > 0 && (char === "\"" || char === "'")) {
193
+ if (bracketQuote === char) bracketQuote = void 0;
194
+ else if (bracketQuote === void 0 && hasClosingQuotedArbitraryValue(code, index + 1, char)) bracketQuote = char;
195
+ }
196
+ if (bracketQuote === void 0) {
197
+ if (char === "[" && code.includes("]", index + 1)) bracketDepth++;
198
+ else if (char === "]" && bracketDepth > 0) bracketDepth--;
199
+ }
200
+ if (!isSplitter(char, bracketDepth)) continue;
201
+ const candidate = code.slice(start, index);
202
+ if (isValidCandidateToken(candidate)) result.push(candidate);
203
+ start = index + 1;
204
+ }
205
+ const candidate = code.slice(start);
206
+ if (isValidCandidateToken(candidate)) result.push(candidate);
207
+ return result;
208
+ }
209
+ function splitCandidateTokens(code) {
210
+ const cached = splitCache.get(code);
211
+ if (cached) return cached;
212
+ const result = splitBracketAware(code.includes("\\") ? code.replace(ESCAPED_WHITESPACE_RE, " ") : code);
213
+ if (splitCache.size >= SPLIT_CACHE_LIMIT) splitCache.clear();
214
+ splitCache.set(code, result);
215
+ return result;
216
+ }
217
+ //#endregion
218
+ export { TAILWIND_V4_AUTO_SOURCE_SCAN_PATTERN, TAILWIND_V4_IGNORED_CONTENT_DIRS, TAILWIND_V4_IGNORED_EXTENSIONS, TAILWIND_V4_IGNORED_FILES, canonicalizeBareArbitraryValueCandidates, collectTailwindStyleCandidates, collectTailwindV4StyleCandidates, compileTailwindV4Source, createTailwindGenerationSession, createTailwindV4CompiledSourceEntries, createTailwindV4DefaultIgnoreSources, createTailwindV4Engine, createTailwindV4RootSources, createTailwindV4SourceEntryMatcher, createTailwindV4SourceExclusionMatcher, escapeCssClassName, expandTailwindV4SourceEntries, expandTailwindV4SourceEntryBraces, extractBareArbitraryValueSourceCandidates, extractBareArbitraryValueSourceCandidatesWithPositions, extractProjectCandidatesWithPositions, extractRawCandidates, extractRawCandidatesWithPositions, extractSourceCandidates, extractSourceCandidatesWithPositions, extractTailwindV4InlineSourceCandidates, extractValidCandidates, generateTailwindV4Style, getTailwindV4DesignSystemCacheKey, groupTailwindV4SourceEntriesByBase, groupTokensByFile, isBareArbitraryValuesEnabled, isFileExcludedByTailwindV4SourceEntries, isFileMatchedByTailwindV4SourceEntries, isValidCandidateToken, loadTailwindV4DesignSystem, loadTailwindV4NodeModule, mergeTailwindV4SourceEntries, normalizeGlobPattern, normalizeTailwindV4ScannerSources, normalizeTailwindV4SourceEntries, replaceBareArbitraryValueSelectors, resolveBareArbitraryValueCandidate, resolveProjectSourceFiles, resolveSourceScanPath, resolveTailwindV4Source, resolveTailwindV4SourceBaseCandidates, resolveTailwindV4SourceEntry, resolveValidTailwindV4Candidates, splitCandidateTokens, toPosixPath, validateCandidateTokenRE };