tailwind-styled-v4 5.1.16 → 5.1.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/dist/atomic.js +16 -4
  2. package/dist/atomic.js.map +1 -1
  3. package/dist/atomic.mjs +13 -2
  4. package/dist/atomic.mjs.map +1 -1
  5. package/dist/cli.js +80 -68
  6. package/dist/cli.js.map +1 -1
  7. package/dist/cli.mjs +77 -66
  8. package/dist/cli.mjs.map +1 -1
  9. package/dist/compiler.d.mts +84 -4
  10. package/dist/compiler.d.ts +84 -4
  11. package/dist/compiler.js +245 -15
  12. package/dist/compiler.js.map +1 -1
  13. package/dist/compiler.mjs +240 -14
  14. package/dist/compiler.mjs.map +1 -1
  15. package/dist/engine.js +209 -167
  16. package/dist/engine.js.map +1 -1
  17. package/dist/engine.mjs +200 -159
  18. package/dist/engine.mjs.map +1 -1
  19. package/dist/index.browser.mjs +1 -1
  20. package/dist/index.browser.mjs.map +1 -1
  21. package/dist/index.js +1 -1
  22. package/dist/index.js.map +1 -1
  23. package/dist/index.mjs +1 -1
  24. package/dist/index.mjs.map +1 -1
  25. package/dist/next.d.mts +16 -0
  26. package/dist/next.d.ts +16 -0
  27. package/dist/next.js +458 -158
  28. package/dist/next.js.map +1 -1
  29. package/dist/next.mjs +454 -154
  30. package/dist/next.mjs.map +1 -1
  31. package/dist/runtime.js +1 -1
  32. package/dist/runtime.js.map +1 -1
  33. package/dist/runtime.mjs +1 -1
  34. package/dist/runtime.mjs.map +1 -1
  35. package/dist/shared.js +106 -64
  36. package/dist/shared.js.map +1 -1
  37. package/dist/shared.mjs +101 -60
  38. package/dist/shared.mjs.map +1 -1
  39. package/dist/theme.js +1 -1
  40. package/dist/theme.js.map +1 -1
  41. package/dist/theme.mjs +1 -1
  42. package/dist/theme.mjs.map +1 -1
  43. package/dist/turbopackLoader.js +94 -52
  44. package/dist/turbopackLoader.js.map +1 -1
  45. package/dist/turbopackLoader.mjs +92 -51
  46. package/dist/turbopackLoader.mjs.map +1 -1
  47. package/dist/tw.js +80 -68
  48. package/dist/tw.js.map +1 -1
  49. package/dist/tw.mjs +77 -66
  50. package/dist/tw.mjs.map +1 -1
  51. package/dist/vite.js +172 -130
  52. package/dist/vite.js.map +1 -1
  53. package/dist/vite.mjs +166 -125
  54. package/dist/vite.mjs.map +1 -1
  55. package/dist/webpackLoader.js +28 -10
  56. package/dist/webpackLoader.js.map +1 -1
  57. package/dist/webpackLoader.mjs +26 -9
  58. package/dist/webpackLoader.mjs.map +1 -1
  59. package/package.json +1 -1
package/dist/compiler.mjs CHANGED
@@ -171,7 +171,7 @@ var init_nativeBridge = __esm({
171
171
  "use strict";
172
172
  init_esm_shims();
173
173
  init_src();
174
- _loadNative = (path5) => __require(path5);
174
+ _loadNative = (path6) => __require(path6);
175
175
  log = (...args) => {
176
176
  if (process.env.DEBUG?.includes("compiler:native")) {
177
177
  console.log("[compiler:native]", ...args);
@@ -2014,9 +2014,202 @@ var init_watch = __esm({
2014
2014
  }
2015
2015
  });
2016
2016
 
2017
- // packages/domain/compiler/src/index.ts
2017
+ // packages/domain/compiler/src/routeGraph.ts
2018
2018
  import fs3 from "fs";
2019
2019
  import path4 from "path";
2020
+ function deriveRouteFromPageFile(normalizedFile) {
2021
+ const rootMatch = normalizedFile.match(ROOT_PAGE_RE);
2022
+ if (rootMatch) return "/";
2023
+ const match = normalizedFile.match(PAGE_RE);
2024
+ if (!match) return null;
2025
+ const segments = match[1].split("/").filter((s) => !(s.startsWith("(") && s.endsWith(")")));
2026
+ return `/${segments.join("/")}`;
2027
+ }
2028
+ function stripJsonComments(input) {
2029
+ let out = "";
2030
+ let i = 0;
2031
+ let inString = false;
2032
+ let stringChar = "";
2033
+ while (i < input.length) {
2034
+ const ch = input[i];
2035
+ if (inString) {
2036
+ out += ch;
2037
+ if (ch === "\\" && i + 1 < input.length) {
2038
+ out += input[i + 1];
2039
+ i += 2;
2040
+ continue;
2041
+ }
2042
+ if (ch === stringChar) inString = false;
2043
+ i++;
2044
+ continue;
2045
+ }
2046
+ if (ch === '"' || ch === "'") {
2047
+ inString = true;
2048
+ stringChar = ch;
2049
+ out += ch;
2050
+ i++;
2051
+ continue;
2052
+ }
2053
+ if (ch === "/" && input[i + 1] === "/") {
2054
+ while (i < input.length && input[i] !== "\n") i++;
2055
+ continue;
2056
+ }
2057
+ if (ch === "/" && input[i + 1] === "*") {
2058
+ i += 2;
2059
+ while (i < input.length && !(input[i] === "*" && input[i + 1] === "/")) i++;
2060
+ i += 2;
2061
+ continue;
2062
+ }
2063
+ out += ch;
2064
+ i++;
2065
+ }
2066
+ return out;
2067
+ }
2068
+ function loadTsconfigAliases(root) {
2069
+ for (const candidate of ["tsconfig.json", "jsconfig.json"]) {
2070
+ const configPath = path4.join(root, candidate);
2071
+ if (!fs3.existsSync(configPath)) continue;
2072
+ try {
2073
+ const raw = stripJsonComments(fs3.readFileSync(configPath, "utf-8"));
2074
+ const parsed = JSON.parse(raw);
2075
+ const co = parsed.compilerOptions;
2076
+ if (!co?.paths) continue;
2077
+ const baseDir = path4.join(root, co.baseUrl ?? ".");
2078
+ const paths = Object.entries(co.paths).map(([prefix, targets]) => ({
2079
+ prefix: prefix.replace(/\*$/, ""),
2080
+ targets: targets.map((t) => t.replace(/\*$/, ""))
2081
+ }));
2082
+ return { baseDir, paths };
2083
+ } catch {
2084
+ continue;
2085
+ }
2086
+ }
2087
+ return null;
2088
+ }
2089
+ function resolveSpecifier(specifier, fromFile, aliasInfo) {
2090
+ let candidate = null;
2091
+ if (specifier.startsWith(".")) {
2092
+ candidate = path4.resolve(path4.dirname(fromFile), specifier);
2093
+ } else if (aliasInfo) {
2094
+ for (const { prefix, targets } of aliasInfo.paths) {
2095
+ if (specifier.startsWith(prefix)) {
2096
+ const rest = specifier.slice(prefix.length);
2097
+ candidate = path4.join(aliasInfo.baseDir, targets[0] ?? "", rest);
2098
+ break;
2099
+ }
2100
+ }
2101
+ }
2102
+ if (!candidate) return null;
2103
+ if (/\.(css|scss|sass|less|svg|png|jpe?g|gif|webp|json|woff2?|ttf|eot)$/i.test(candidate)) return null;
2104
+ if (fs3.existsSync(candidate) && fs3.statSync(candidate).isFile()) return candidate;
2105
+ for (const ext of CODE_EXTENSIONS) {
2106
+ if (fs3.existsSync(candidate + ext)) return candidate + ext;
2107
+ }
2108
+ for (const ext of CODE_EXTENSIONS) {
2109
+ const indexPath = path4.join(candidate, `index${ext}`);
2110
+ if (fs3.existsSync(indexPath)) return indexPath;
2111
+ }
2112
+ return null;
2113
+ }
2114
+ function extractImportSpecifiers(source) {
2115
+ const specs = /* @__PURE__ */ new Set();
2116
+ for (const re of [IMPORT_FROM_RE, SIDE_EFFECT_IMPORT_RE, DYNAMIC_IMPORT_RE]) {
2117
+ re.lastIndex = 0;
2118
+ let m;
2119
+ while (m = re.exec(source)) {
2120
+ if (m[1]) specs.add(m[1]);
2121
+ }
2122
+ }
2123
+ return [...specs];
2124
+ }
2125
+ function buildRouteClassBuckets(root, srcDir, files) {
2126
+ const aliasInfo = loadTsconfigAliases(root);
2127
+ const classesByFile = /* @__PURE__ */ new Map();
2128
+ const adjacency = /* @__PURE__ */ new Map();
2129
+ for (const f of files) {
2130
+ const normalized = path4.normalize(f.file);
2131
+ classesByFile.set(normalized, f.classes);
2132
+ if (!adjacency.has(normalized)) adjacency.set(normalized, /* @__PURE__ */ new Set());
2133
+ }
2134
+ for (const f of files) {
2135
+ const normalized = path4.normalize(f.file);
2136
+ let source;
2137
+ try {
2138
+ source = fs3.readFileSync(normalized, "utf-8");
2139
+ } catch {
2140
+ continue;
2141
+ }
2142
+ const edges = adjacency.get(normalized);
2143
+ for (const spec of extractImportSpecifiers(source)) {
2144
+ const resolved = resolveSpecifier(spec, normalized, aliasInfo);
2145
+ if (resolved && classesByFile.has(resolved)) edges.add(resolved);
2146
+ }
2147
+ }
2148
+ const routeEntries = [];
2149
+ for (const f of files) {
2150
+ const normalized = path4.normalize(f.file).replace(/\\/g, "/");
2151
+ const route = deriveRouteFromPageFile(normalized);
2152
+ if (route) routeEntries.push({ route, file: path4.normalize(f.file) });
2153
+ }
2154
+ const reachableByRoute = /* @__PURE__ */ new Map();
2155
+ for (const { route, file } of routeEntries) {
2156
+ const visited = /* @__PURE__ */ new Set();
2157
+ const queue = [file];
2158
+ while (queue.length > 0) {
2159
+ const current = queue.shift();
2160
+ if (visited.has(current)) continue;
2161
+ visited.add(current);
2162
+ for (const next of adjacency.get(current) ?? []) {
2163
+ if (!visited.has(next)) queue.push(next);
2164
+ }
2165
+ }
2166
+ reachableByRoute.set(route, visited);
2167
+ }
2168
+ const routesByFile = /* @__PURE__ */ new Map();
2169
+ for (const [route, fileSet] of reachableByRoute) {
2170
+ for (const file of fileSet) {
2171
+ if (!routesByFile.has(file)) routesByFile.set(file, /* @__PURE__ */ new Set());
2172
+ routesByFile.get(file).add(route);
2173
+ }
2174
+ }
2175
+ const result = { routes: /* @__PURE__ */ new Map(), global: /* @__PURE__ */ new Set() };
2176
+ for (const [file, classes] of classesByFile) {
2177
+ const normalizedSlash = file.replace(/\\/g, "/");
2178
+ const isSharedSegment = SHARED_SEGMENT_RE.test(normalizedSlash);
2179
+ const reachingRoutes = isSharedSegment ? /* @__PURE__ */ new Set() : routesByFile.get(file);
2180
+ if (!isSharedSegment && reachingRoutes && reachingRoutes.size === 1) {
2181
+ const [route] = reachingRoutes;
2182
+ if (!result.routes.has(route)) result.routes.set(route, /* @__PURE__ */ new Set());
2183
+ const bucket = result.routes.get(route);
2184
+ for (const cls of classes) bucket.add(cls);
2185
+ } else {
2186
+ for (const cls of classes) result.global.add(cls);
2187
+ }
2188
+ }
2189
+ return result;
2190
+ }
2191
+ function routeToCssFilename(route) {
2192
+ const slug = route.replace(/^\/+/, "").replace(/[^a-zA-Z0-9_-]+/g, "_").replace(/^_+|_+$/g, "");
2193
+ return `route_${slug || "root"}.css`;
2194
+ }
2195
+ var CODE_EXTENSIONS, SHARED_SEGMENT_RE, PAGE_RE, ROOT_PAGE_RE, IMPORT_FROM_RE, SIDE_EFFECT_IMPORT_RE, DYNAMIC_IMPORT_RE;
2196
+ var init_routeGraph = __esm({
2197
+ "packages/domain/compiler/src/routeGraph.ts"() {
2198
+ "use strict";
2199
+ init_esm_shims();
2200
+ CODE_EXTENSIONS = [".tsx", ".ts", ".jsx", ".js", ".mjs", ".cjs"];
2201
+ SHARED_SEGMENT_RE = /(?:^|[\\/])(layout|loading|error|template|not-found|default)\.(?:tsx|ts|jsx|js)$/;
2202
+ PAGE_RE = /(?:^|[\\/])app[\\/](.*?)[\\/]page\.(?:tsx|ts|jsx|js)$/;
2203
+ ROOT_PAGE_RE = /(?:^|[\\/])app[\\/]page\.(?:tsx|ts|jsx|js)$/;
2204
+ IMPORT_FROM_RE = /(?:import|export)(?:[^'"`;]*?)from\s+["']([^"']+)["']/g;
2205
+ SIDE_EFFECT_IMPORT_RE = /^\s*import\s+["']([^"']+)["']/gm;
2206
+ DYNAMIC_IMPORT_RE = /\bimport\s*\(\s*["']([^"']+)["']\s*\)/g;
2207
+ }
2208
+ });
2209
+
2210
+ // packages/domain/compiler/src/index.ts
2211
+ import fs4 from "fs";
2212
+ import path5 from "path";
2020
2213
  import { createRequire as createRequire5 } from "module";
2021
2214
  function _layoutClassesToCss(classes) {
2022
2215
  const native = getNativeBridge();
@@ -2052,7 +2245,7 @@ function extractContainerCssFromSource(source) {
2052
2245
  }
2053
2246
  return rules.join("\n");
2054
2247
  }
2055
- var _require3, transformSource, hasTwUsage, isAlreadyTransformed, shouldProcess, compileCssFromClasses, buildStyleTag, generateCssForClasses, eliminateDeadCss, findDeadVariants, runElimination, scanProjectUsage, generateSafelist, loadSafelist, loadTailwindConfig, getContentPaths, _CONTAINER_BREAKPOINTS, runLoaderTransform, shouldSkipFile, fileToRoute, getAllRoutes, getRouteClasses, registerFileClasses, registerGlobalClasses, _incrementalEngineInstance, getIncrementalEngine, resetIncrementalEngine, IncrementalEngine, getBucketEngine, resetBucketEngine, BucketEngine, classifyNode, detectConflicts, bucketSort, analyzeFile, analyzeVariantUsage, injectClientDirective, injectServerOnlyComment, analyzeClasses, extractTwStateConfigs, generateStaticStateCss, extractAndGenerateStateCss;
2248
+ var _require3, transformSource, hasTwUsage, isAlreadyTransformed, shouldProcess, compileCssFromClasses, buildStyleTag, generateCssForClasses, eliminateDeadCss, findDeadVariants, runElimination, scanProjectUsage, generateSafelist, loadSafelist, loadTailwindConfig, getContentPaths, _CONTAINER_BREAKPOINTS, runLoaderTransform, shouldSkipFile, fileToRoute, getAllRoutes, _fileClassesMap, _globalClasses, getRouteClasses, getAllRegisteredClasses, registerFileClasses, registerGlobalClasses, resetRouteClassRegistry, _incrementalEngineInstance, getIncrementalEngine, resetIncrementalEngine, IncrementalEngine, getBucketEngine, resetBucketEngine, BucketEngine, classifyNode, detectConflicts, bucketSort, analyzeFile, analyzeVariantUsage, injectClientDirective, injectServerOnlyComment, analyzeClasses, extractTwStateConfigs, generateStaticStateCss, extractAndGenerateStateCss;
2056
2249
  var init_src2 = __esm({
2057
2250
  "packages/domain/compiler/src/index.ts"() {
2058
2251
  "use strict";
@@ -2064,6 +2257,7 @@ var init_src2 = __esm({
2064
2257
  init_cache();
2065
2258
  init_redis();
2066
2259
  init_watch();
2260
+ init_routeGraph();
2067
2261
  _require3 = createRequire5(
2068
2262
  typeof __require !== "undefined" ? typeof __filename !== "undefined" ? `file://${__filename}` : "file://unknown" : import.meta.url
2069
2263
  );
@@ -2158,7 +2352,7 @@ var init_src2 = __esm({
2158
2352
  };
2159
2353
  scanProjectUsage = (dirs, cwd) => {
2160
2354
  const { batchExtractClasses: batchExtractClasses2 } = _require3("./parser");
2161
- const files = dirs.map((dir) => path4.resolve(cwd, dir));
2355
+ const files = dirs.map((dir) => path5.resolve(cwd, dir));
2162
2356
  const results = batchExtractClasses2(files) || [];
2163
2357
  const combined = {};
2164
2358
  for (const result of results) {
@@ -2175,13 +2369,13 @@ var init_src2 = __esm({
2175
2369
  const classes = scanProjectUsage(scanDirs, cwd || process.cwd());
2176
2370
  const allClasses = Object.keys(classes).sort();
2177
2371
  if (outputPath) {
2178
- fs3.writeFileSync(outputPath, JSON.stringify(allClasses, null, 2));
2372
+ fs4.writeFileSync(outputPath, JSON.stringify(allClasses, null, 2));
2179
2373
  }
2180
2374
  return allClasses;
2181
2375
  };
2182
2376
  loadSafelist = (safelistPath) => {
2183
2377
  try {
2184
- const content = fs3.readFileSync(safelistPath, "utf-8");
2378
+ const content = fs4.readFileSync(safelistPath, "utf-8");
2185
2379
  return JSON.parse(content);
2186
2380
  } catch {
2187
2381
  return [];
@@ -2195,8 +2389,8 @@ var init_src2 = __esm({
2195
2389
  "tailwind.config.cjs"
2196
2390
  ];
2197
2391
  for (const file of configFiles) {
2198
- const fullPath = path4.join(cwd, file);
2199
- if (fs3.existsSync(fullPath)) {
2392
+ const fullPath = path5.join(cwd, file);
2393
+ if (fs4.existsSync(fullPath)) {
2200
2394
  const mod = __require(fullPath);
2201
2395
  return mod.default || mod;
2202
2396
  }
@@ -2206,9 +2400,9 @@ var init_src2 = __esm({
2206
2400
  getContentPaths = (cwd = process.cwd()) => {
2207
2401
  return {
2208
2402
  content: [
2209
- path4.join(cwd, "src/**/*.{js,ts,jsx,tsx}"),
2210
- path4.join(cwd, "app/**/*.{js,ts,jsx,tsx}"),
2211
- path4.join(cwd, "pages/**/*.{js,ts,jsx,tsx}")
2403
+ path5.join(cwd, "src/**/*.{js,ts,jsx,tsx}"),
2404
+ path5.join(cwd, "app/**/*.{js,ts,jsx,tsx}"),
2405
+ path5.join(cwd, "pages/**/*.{js,ts,jsx,tsx}")
2212
2406
  ]
2213
2407
  };
2214
2408
  };
@@ -2279,10 +2473,38 @@ var init_src2 = __esm({
2279
2473
  }
2280
2474
  return ["/", "__global"];
2281
2475
  };
2282
- getRouteClasses = (_route) => /* @__PURE__ */ new Set();
2283
- registerFileClasses = (_filepath, _classes) => {
2476
+ _fileClassesMap = /* @__PURE__ */ new Map();
2477
+ _globalClasses = /* @__PURE__ */ new Set();
2478
+ getRouteClasses = (route) => {
2479
+ const result = /* @__PURE__ */ new Set();
2480
+ for (const [filepath, classes] of _fileClassesMap) {
2481
+ const fileRoute = fileToRoute(filepath) ?? "__global";
2482
+ if (fileRoute === route) {
2483
+ for (const cls of classes) result.add(cls);
2484
+ }
2485
+ }
2486
+ return result;
2487
+ };
2488
+ getAllRegisteredClasses = () => {
2489
+ const result = new Set(_globalClasses);
2490
+ for (const classes of _fileClassesMap.values()) {
2491
+ for (const cls of classes) result.add(cls);
2492
+ }
2493
+ return result;
2494
+ };
2495
+ registerFileClasses = (filepath, classes) => {
2496
+ if (!classes || classes.length === 0) {
2497
+ _fileClassesMap.delete(filepath);
2498
+ return;
2499
+ }
2500
+ _fileClassesMap.set(filepath, new Set(classes));
2501
+ };
2502
+ registerGlobalClasses = (classes) => {
2503
+ for (const cls of classes) _globalClasses.add(cls);
2284
2504
  };
2285
- registerGlobalClasses = (_classes) => {
2505
+ resetRouteClassRegistry = () => {
2506
+ _fileClassesMap.clear();
2507
+ _globalClasses.clear();
2286
2508
  };
2287
2509
  _incrementalEngineInstance = null;
2288
2510
  getIncrementalEngine = () => {
@@ -2421,6 +2643,7 @@ export {
2421
2643
  batchExtractClasses,
2422
2644
  batchExtractClassesNative,
2423
2645
  bucketSort,
2646
+ buildRouteClassBuckets,
2424
2647
  buildStyleTag,
2425
2648
  cachePriority,
2426
2649
  cacheRead,
@@ -2480,6 +2703,7 @@ export {
2480
2703
  generateStaticStateCss,
2481
2704
  generateStaticStateCssNative,
2482
2705
  generateSubComponentTypes,
2706
+ getAllRegisteredClasses,
2483
2707
  getAllRoutes,
2484
2708
  getBucketEngine,
2485
2709
  getCacheOptimizationHints,
@@ -2583,6 +2807,7 @@ export {
2583
2807
  resetMemoryStats,
2584
2808
  resetNativeBridgeCache,
2585
2809
  resetResolverPoolStats,
2810
+ resetRouteClassRegistry,
2586
2811
  resolveCascade,
2587
2812
  resolveClassNames,
2588
2813
  resolveColorCached,
@@ -2594,6 +2819,7 @@ export {
2594
2819
  resolveVariants,
2595
2820
  reverseLookupProperty,
2596
2821
  reverseLookupValue,
2822
+ routeToCssFilename,
2597
2823
  runCssPipeline,
2598
2824
  runElimination,
2599
2825
  runLoaderTransform,