@csszyx/unplugin 0.11.7 → 0.11.9

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 (41) hide show
  1. package/README.md +6 -1
  2. package/dist/css-mangler.cjs +9 -6
  3. package/dist/css-mangler.mjs +9 -6
  4. package/dist/index.cjs +5 -4
  5. package/dist/index.d.cts +2 -2
  6. package/dist/index.d.mts +2 -2
  7. package/dist/index.mjs +4 -4
  8. package/dist/next-config.cjs +1 -1
  9. package/dist/next-config.mjs +1 -1
  10. package/dist/next-prebuild.cjs +5 -5
  11. package/dist/next-prebuild.mjs +5 -5
  12. package/dist/next-turbo-loader.cjs +7 -12
  13. package/dist/next-turbo-loader.mjs +7 -12
  14. package/dist/next-watcher.cjs +2 -2
  15. package/dist/next-watcher.mjs +2 -2
  16. package/dist/shared/{unplugin.Dqt1aLCX.mjs → unplugin.7TELUwsj.mjs} +5 -3
  17. package/dist/shared/unplugin.B3XoSRB8.mjs +40 -0
  18. package/dist/shared/unplugin.BkRah5Ot.cjs +48 -0
  19. package/dist/shared/{unplugin.VSslRpfN.mjs → unplugin.Bqx2WfBV.mjs} +51 -50
  20. package/dist/shared/{unplugin.PhOFTQpB.d.cts → unplugin.CjCKWnoX.d.cts} +25 -6
  21. package/dist/shared/{unplugin.PhOFTQpB.d.mts → unplugin.CjCKWnoX.d.mts} +25 -6
  22. package/dist/shared/{unplugin.CwcOd1q3.mjs → unplugin.D-K57LNR.mjs} +6 -1
  23. package/dist/shared/{unplugin.ByAzFdqO.cjs → unplugin.DUI48s3S.cjs} +1181 -766
  24. package/dist/shared/{unplugin.D8vSG36M.cjs → unplugin.DVCQC5wq.cjs} +6 -0
  25. package/dist/shared/{unplugin.Rov-j_Wm.cjs → unplugin.DmuOKVS4.cjs} +21 -0
  26. package/dist/shared/{unplugin.D6hes1O8.cjs → unplugin.WVn08Fln.cjs} +5 -3
  27. package/dist/shared/{unplugin.CZKUWN1J.cjs → unplugin.jZsBqx54.cjs} +51 -50
  28. package/dist/shared/unplugin.nnsa7OVW.mjs +49 -0
  29. package/dist/shared/{unplugin.CtHwCYxE.mjs → unplugin.wx3cvxxX.mjs} +1180 -766
  30. package/dist/vite.cjs +4 -4
  31. package/dist/vite.d.cts +2 -25
  32. package/dist/vite.d.mts +1 -25
  33. package/dist/vite.mjs +4 -8
  34. package/dist/webpack.cjs +4 -4
  35. package/dist/webpack.d.cts +2 -5
  36. package/dist/webpack.d.mts +1 -5
  37. package/dist/webpack.mjs +4 -8
  38. package/package.json +7 -7
  39. package/dist/shared/unplugin.B1mblcm-.mjs +0 -9
  40. package/dist/shared/unplugin.B3RHYokB.mjs +0 -29
  41. package/dist/shared/unplugin.BCwRIUs_.cjs +0 -12
@@ -1,8 +1,8 @@
1
1
  import { readFileSync } from 'node:fs';
2
2
  import { ensureRustTransformAvailable, transformSourceCode, transformRust, transformOxc, transform } from '@csszyx/compiler';
3
- import { c as createTransformCacheKey, a as readTransformCache, w as writeTransformCache } from './unplugin.CwcOd1q3.mjs';
3
+ import { c as createTransformCacheKey, a as readTransformCache, w as writeTransformCache, n as normalizePathSeparators } from './unplugin.D-K57LNR.mjs';
4
4
  import { createHash } from 'node:crypto';
5
- import { s as sortStrings } from './unplugin.B1mblcm-.mjs';
5
+ import { s as sortStrings } from './unplugin.B3XoSRB8.mjs';
6
6
 
7
7
  function readPackageVersion(relativePackageJson, fromUrl) {
8
8
  try {
@@ -59,61 +59,19 @@ function stripJsCommentsAndStrings(source) {
59
59
  const char = source[index];
60
60
  const peek = index + 1 < length ? source[index + 1] : "";
61
61
  if (char === "/" && peek === "/") {
62
- index += 2;
63
- while (index < length && source[index] !== "\n") {
64
- index++;
65
- }
62
+ index = skipLineComment(source, index);
66
63
  continue;
67
64
  }
68
65
  if (char === "/" && peek === "*") {
69
- index += 2;
70
- while (index + 1 < length && !(source[index] === "*" && source[index + 1] === "/")) {
71
- index++;
72
- }
73
- index = Math.min(length, index + 2);
66
+ index = skipBlockComment(source, index);
74
67
  continue;
75
68
  }
76
69
  if (char === "/" && isRegexLiteralStart(out)) {
77
- index++;
78
- let inCharClass = false;
79
- while (index < length) {
80
- const current = source[index];
81
- if (current === "\\" && index + 1 < length) {
82
- index += 2;
83
- continue;
84
- }
85
- if (current === "[") {
86
- inCharClass = true;
87
- index++;
88
- continue;
89
- }
90
- if (current === "]") {
91
- inCharClass = false;
92
- index++;
93
- continue;
94
- }
95
- if (current === "/" && !inCharClass) {
96
- index++;
97
- while (/[a-z]/i.test(source[index] ?? "")) {
98
- index++;
99
- }
100
- break;
101
- }
102
- index++;
103
- }
70
+ index = skipRegexLiteral(source, index);
104
71
  continue;
105
72
  }
106
73
  if (char === '"' || char === "'" || char === "`") {
107
- const quote = char;
108
- index++;
109
- while (index < length && source[index] !== quote) {
110
- if (source[index] === "\\" && index + 1 < length) {
111
- index += 2;
112
- } else {
113
- index++;
114
- }
115
- }
116
- index++;
74
+ index = skipQuotedSource(source, index, char);
117
75
  continue;
118
76
  }
119
77
  out += char;
@@ -121,6 +79,46 @@ function stripJsCommentsAndStrings(source) {
121
79
  }
122
80
  return out;
123
81
  }
82
+ function skipLineComment(source, start) {
83
+ const newline = source.indexOf("\n", start + 2);
84
+ return newline === -1 ? source.length : newline;
85
+ }
86
+ function skipBlockComment(source, start) {
87
+ const close = source.indexOf("*/", start + 2);
88
+ return close === -1 ? source.length : close + 2;
89
+ }
90
+ function skipRegexLiteral(source, start) {
91
+ let index = start + 1;
92
+ let inCharClass = false;
93
+ while (index < source.length) {
94
+ const current = source[index];
95
+ if (current === "\\" && index + 1 < source.length) {
96
+ index += 2;
97
+ continue;
98
+ }
99
+ if (current === "[") {
100
+ inCharClass = true;
101
+ } else if (current === "]") {
102
+ inCharClass = false;
103
+ } else if (current === "/" && !inCharClass) {
104
+ return skipRegexFlags(source, index + 1);
105
+ }
106
+ index++;
107
+ }
108
+ return index;
109
+ }
110
+ function skipRegexFlags(source, start) {
111
+ let index = start;
112
+ while (/[a-z]/i.test(source[index] ?? "")) index++;
113
+ return index;
114
+ }
115
+ function skipQuotedSource(source, start, quote) {
116
+ let index = start + 1;
117
+ while (index < source.length && source[index] !== quote) {
118
+ index += source[index] === "\\" && index + 1 < source.length ? 2 : 1;
119
+ }
120
+ return index + 1;
121
+ }
124
122
  function isRegexLiteralStart(emitted) {
125
123
  const trimmed = emitted.trimEnd();
126
124
  const previous = trimmed.length > 0 ? trimmed.charAt(trimmed.length - 1) : void 0;
@@ -174,13 +172,16 @@ function createNextSourceTransformCacheInput(input, filename, producer) {
174
172
  };
175
173
  }
176
174
  function normalizeSourceFilename(filename) {
177
- return filename.replace(/\\/g, "/");
175
+ return normalizePathSeparators(filename);
178
176
  }
179
177
  function normalizeGlobalVarAliasesForCache(aliases) {
180
178
  if (!aliases) {
181
179
  return [];
182
180
  }
183
- const entries = aliases instanceof Map ? aliases.entries() : Array.isArray(aliases) ? aliases : Object.entries(aliases);
181
+ let entries;
182
+ if (aliases instanceof Map) entries = aliases.entries();
183
+ else if (Array.isArray(aliases)) entries = aliases;
184
+ else entries = Object.entries(aliases);
184
185
  const normalized = /* @__PURE__ */ new Map();
185
186
  for (const [original, alias] of entries) {
186
187
  if (original.startsWith("--") && alias.startsWith("--")) {
@@ -334,7 +334,7 @@ declare function findLocalImportSources(code: string): string[];
334
334
  *
335
335
  * Supports:
336
336
  * - Multiple @theme blocks per file
337
- * - @theme inline { } syntax (inline keyword ignored)
337
+ * - @theme option keywords (inline, static, reference, combinations ignored)
338
338
  * - @theme inside @layer (two-pass strip)
339
339
  * - --color-brand-50 shade suffixes (deduped to 'brand')
340
340
  * - Multi-file merge via mergeThemes()
@@ -407,6 +407,12 @@ interface PluginState {
407
407
  classes: Set<string>;
408
408
  /** Merged @theme scan result — feeds the theme-groups virtual module. */
409
409
  parsedTheme: ParsedTheme | null;
410
+ /**
411
+ * CSS files the zero-config @theme auto-scan found tokens in (only when
412
+ * `build.scanCss` is unset). Dev HMR re-scans when one of these — or any
413
+ * other .css file — changes, mirroring the explicit scanCss reload path.
414
+ */
415
+ autoThemeCssFiles: string[];
410
416
  /**
411
417
  * True once any processed CSS file was seen importing `tailwindcss`. Used to
412
418
  * warn at build end when csszyx generated classes but nothing makes Tailwind
@@ -430,12 +436,17 @@ interface PluginState {
430
436
  /** Memoized `isMonorepoPackage(rootDir)` result; `undefined` until computed. */
431
437
  inMonorepo?: boolean;
432
438
  /**
433
- * Classes csszyx generated by lowering `sz` props the ONLY classes the
434
- * mangle map may rename. Author-written `className` values are deliberately
435
- * excluded: renaming them would break selectors an external stylesheet (or
436
- * JS that references classes by name) owns.
439
+ * Classes csszyx generated by lowering `sz` props. Final map eligibility
440
+ * subtracts authoredClasses because a class can be both generated and used
441
+ * by a raw selector consumer.
437
442
  */
438
443
  ownedClasses: Set<string>;
444
+ /**
445
+ * Classes written through author-facing class/className attributes. Any
446
+ * overlap with ownedClasses must keep its original name because bundled
447
+ * helper calls may not preserve enough context for safe string rewriting.
448
+ */
449
+ authoredClasses: Set<string>;
439
450
  /** Unresolvable-spread warnings surfaced to the build log in every mode. */
440
451
  spreadWarnings: Set<string>;
441
452
  /**
@@ -706,6 +717,14 @@ declare function isHardIgnoredPath(id: string, sourceDirs?: readonly string[]):
706
717
  * @returns true when the file should be prescanned for safelist extraction.
707
718
  */
708
719
  declare function fileMayContainSafelistableSz(content: string): boolean;
720
+ /**
721
+ * Return csszyx-owned classes that are safe to rename.
722
+ *
723
+ * @param ownedClasses Classes emitted from sz transforms.
724
+ * @param authoredClasses Classes also written in class/className source positions.
725
+ * @returns Owned classes with hybrid raw consumers removed.
726
+ */
727
+ declare function mangleEligibleClasses(ownedClasses: ReadonlySet<string>, authoredClasses: ReadonlySet<string>): string[];
709
728
  /**
710
729
  * Whether a file is workspace-package source that csszyx skipped only because it
711
730
  * lives under `/packages/` and is not under any opted-in `compileSources`
@@ -836,5 +855,5 @@ declare const rollupPlugin: (options?: PartialCsszyxConfig) => InputPluginOption
836
855
  */
837
856
  declare const esbuildPlugin: (options?: PartialCsszyxConfig) => Plugin;
838
857
 
839
- export { missingTailwindEntryMessage as $, unplugin as A, deleteRSCModuleRecord as B, esbuildPlugin as D, extractGlobalVarAliasesForManifest as E, fileMayContainSafelistableSz as F, findLocalImportSources as H, findRSCBoundaryViolation as I, findRSCGraphViolation as J, hasInjectableTailwindCandidate as K, hasTokens as L, hasUseClientDirective as N, hasUseServerDirective as O, isCompileSourceOptedIn as Q, isHardIgnoredPath as T, isMonorepoPackage as U, isPackagesSkippedSource as W, isRSCServerModule as X, mangleCodeClassesSync as Y, mangleHybridHazardMessage as Z, mergeThemes as _, normalizeGlobalVarAliasesForCache as a0, parseThemeBlocks as a1, recordGlobalVarSourceFile as a2, resolveCompileSourceDirs as a3, resolveNativeCacheIdentity as a4, rollupPlugin as a5, scanCustomPropertyNames as a6, shouldEmitWarning as a7, shouldTrackGlobalVarSources as a8, shouldWarnMissingTailwindEntry as a9, shouldWarnUnscopedMonorepo as aa, skippedSzFilesMessage as ab, unscopedMonorepoMessage as ac, vitePlugin as ad, webpackPlugin as ae, appendTailwindSourceDirective as r, assertNoRSCBoundaryViolation as s, assertNoRSCGraphViolation as t, collectMangleHybridHazards as u, computeSafelistRelPath as v, createGlobalVarMapAssetSource as w, createRSCModuleRecord as x, cssHasContentScope as y, cssImportsTailwind as z };
858
+ export { mergeThemes as $, unplugin as A, deleteRSCModuleRecord as B, esbuildPlugin as D, extractGlobalVarAliasesForManifest as E, fileMayContainSafelistableSz as F, findLocalImportSources as H, findRSCBoundaryViolation as I, findRSCGraphViolation as J, hasInjectableTailwindCandidate as K, hasTokens as L, hasUseClientDirective as N, hasUseServerDirective as O, isCompileSourceOptedIn as Q, isHardIgnoredPath as T, isMonorepoPackage as U, isPackagesSkippedSource as W, isRSCServerModule as X, mangleCodeClassesSync as Y, mangleEligibleClasses as Z, mangleHybridHazardMessage as _, missingTailwindEntryMessage as a0, normalizeGlobalVarAliasesForCache as a1, parseThemeBlocks as a2, recordGlobalVarSourceFile as a3, resolveCompileSourceDirs as a4, resolveNativeCacheIdentity as a5, rollupPlugin as a6, scanCustomPropertyNames as a7, shouldEmitWarning as a8, shouldTrackGlobalVarSources as a9, shouldWarnMissingTailwindEntry as aa, shouldWarnUnscopedMonorepo as ab, skippedSzFilesMessage as ac, unscopedMonorepoMessage as ad, vitePlugin as ae, webpackPlugin as af, appendTailwindSourceDirective as r, assertNoRSCBoundaryViolation as s, assertNoRSCGraphViolation as t, collectMangleHybridHazards as u, computeSafelistRelPath as v, createGlobalVarMapAssetSource as w, createRSCModuleRecord as x, cssHasContentScope as y, cssImportsTailwind as z };
840
859
  export type { CssVarScanResult as C, GlobalVarScanCacheKeyInput as G, MangleHybridHazards as M, PlanGlobalVarAliasesInput as P, RewriteGlobalVarCssAliasesOptions as R, ScanGlobalVarCssOptions as S, ValidateGlobalVarAliasInputsOptions as V, GlobalVarAliasPlan as a, GlobalVarCssAliasRewriteResult as b, CreateGlobalVarAliasValidationOptionsInput as c, GlobalVarAliasValidationResult as d, CssVarDefinition as e, CssVarLocation as f, CssVarReference as g, GlobalVarAliasDiagnostic as h, GlobalVarAliasDiagnosticSeverity as i, GlobalVarAliasEntry as j, GlobalVarCodeSource as k, GlobalVarCssAssetSource as l, GlobalVarCssSource as m, GlobalVarScanCacheEntry as n, ParsedTheme as o, RSCBoundaryViolation as p, RSCModuleRecord as q };
@@ -334,7 +334,7 @@ declare function findLocalImportSources(code: string): string[];
334
334
  *
335
335
  * Supports:
336
336
  * - Multiple @theme blocks per file
337
- * - @theme inline { } syntax (inline keyword ignored)
337
+ * - @theme option keywords (inline, static, reference, combinations ignored)
338
338
  * - @theme inside @layer (two-pass strip)
339
339
  * - --color-brand-50 shade suffixes (deduped to 'brand')
340
340
  * - Multi-file merge via mergeThemes()
@@ -407,6 +407,12 @@ interface PluginState {
407
407
  classes: Set<string>;
408
408
  /** Merged @theme scan result — feeds the theme-groups virtual module. */
409
409
  parsedTheme: ParsedTheme | null;
410
+ /**
411
+ * CSS files the zero-config @theme auto-scan found tokens in (only when
412
+ * `build.scanCss` is unset). Dev HMR re-scans when one of these — or any
413
+ * other .css file — changes, mirroring the explicit scanCss reload path.
414
+ */
415
+ autoThemeCssFiles: string[];
410
416
  /**
411
417
  * True once any processed CSS file was seen importing `tailwindcss`. Used to
412
418
  * warn at build end when csszyx generated classes but nothing makes Tailwind
@@ -430,12 +436,17 @@ interface PluginState {
430
436
  /** Memoized `isMonorepoPackage(rootDir)` result; `undefined` until computed. */
431
437
  inMonorepo?: boolean;
432
438
  /**
433
- * Classes csszyx generated by lowering `sz` props the ONLY classes the
434
- * mangle map may rename. Author-written `className` values are deliberately
435
- * excluded: renaming them would break selectors an external stylesheet (or
436
- * JS that references classes by name) owns.
439
+ * Classes csszyx generated by lowering `sz` props. Final map eligibility
440
+ * subtracts authoredClasses because a class can be both generated and used
441
+ * by a raw selector consumer.
437
442
  */
438
443
  ownedClasses: Set<string>;
444
+ /**
445
+ * Classes written through author-facing class/className attributes. Any
446
+ * overlap with ownedClasses must keep its original name because bundled
447
+ * helper calls may not preserve enough context for safe string rewriting.
448
+ */
449
+ authoredClasses: Set<string>;
439
450
  /** Unresolvable-spread warnings surfaced to the build log in every mode. */
440
451
  spreadWarnings: Set<string>;
441
452
  /**
@@ -706,6 +717,14 @@ declare function isHardIgnoredPath(id: string, sourceDirs?: readonly string[]):
706
717
  * @returns true when the file should be prescanned for safelist extraction.
707
718
  */
708
719
  declare function fileMayContainSafelistableSz(content: string): boolean;
720
+ /**
721
+ * Return csszyx-owned classes that are safe to rename.
722
+ *
723
+ * @param ownedClasses Classes emitted from sz transforms.
724
+ * @param authoredClasses Classes also written in class/className source positions.
725
+ * @returns Owned classes with hybrid raw consumers removed.
726
+ */
727
+ declare function mangleEligibleClasses(ownedClasses: ReadonlySet<string>, authoredClasses: ReadonlySet<string>): string[];
709
728
  /**
710
729
  * Whether a file is workspace-package source that csszyx skipped only because it
711
730
  * lives under `/packages/` and is not under any opted-in `compileSources`
@@ -836,5 +855,5 @@ declare const rollupPlugin: (options?: PartialCsszyxConfig) => InputPluginOption
836
855
  */
837
856
  declare const esbuildPlugin: (options?: PartialCsszyxConfig) => Plugin;
838
857
 
839
- export { missingTailwindEntryMessage as $, unplugin as A, deleteRSCModuleRecord as B, esbuildPlugin as D, extractGlobalVarAliasesForManifest as E, fileMayContainSafelistableSz as F, findLocalImportSources as H, findRSCBoundaryViolation as I, findRSCGraphViolation as J, hasInjectableTailwindCandidate as K, hasTokens as L, hasUseClientDirective as N, hasUseServerDirective as O, isCompileSourceOptedIn as Q, isHardIgnoredPath as T, isMonorepoPackage as U, isPackagesSkippedSource as W, isRSCServerModule as X, mangleCodeClassesSync as Y, mangleHybridHazardMessage as Z, mergeThemes as _, normalizeGlobalVarAliasesForCache as a0, parseThemeBlocks as a1, recordGlobalVarSourceFile as a2, resolveCompileSourceDirs as a3, resolveNativeCacheIdentity as a4, rollupPlugin as a5, scanCustomPropertyNames as a6, shouldEmitWarning as a7, shouldTrackGlobalVarSources as a8, shouldWarnMissingTailwindEntry as a9, shouldWarnUnscopedMonorepo as aa, skippedSzFilesMessage as ab, unscopedMonorepoMessage as ac, vitePlugin as ad, webpackPlugin as ae, appendTailwindSourceDirective as r, assertNoRSCBoundaryViolation as s, assertNoRSCGraphViolation as t, collectMangleHybridHazards as u, computeSafelistRelPath as v, createGlobalVarMapAssetSource as w, createRSCModuleRecord as x, cssHasContentScope as y, cssImportsTailwind as z };
858
+ export { mergeThemes as $, unplugin as A, deleteRSCModuleRecord as B, esbuildPlugin as D, extractGlobalVarAliasesForManifest as E, fileMayContainSafelistableSz as F, findLocalImportSources as H, findRSCBoundaryViolation as I, findRSCGraphViolation as J, hasInjectableTailwindCandidate as K, hasTokens as L, hasUseClientDirective as N, hasUseServerDirective as O, isCompileSourceOptedIn as Q, isHardIgnoredPath as T, isMonorepoPackage as U, isPackagesSkippedSource as W, isRSCServerModule as X, mangleCodeClassesSync as Y, mangleEligibleClasses as Z, mangleHybridHazardMessage as _, missingTailwindEntryMessage as a0, normalizeGlobalVarAliasesForCache as a1, parseThemeBlocks as a2, recordGlobalVarSourceFile as a3, resolveCompileSourceDirs as a4, resolveNativeCacheIdentity as a5, rollupPlugin as a6, scanCustomPropertyNames as a7, shouldEmitWarning as a8, shouldTrackGlobalVarSources as a9, shouldWarnMissingTailwindEntry as aa, shouldWarnUnscopedMonorepo as ab, skippedSzFilesMessage as ac, unscopedMonorepoMessage as ad, vitePlugin as ae, webpackPlugin as af, appendTailwindSourceDirective as r, assertNoRSCBoundaryViolation as s, assertNoRSCGraphViolation as t, collectMangleHybridHazards as u, computeSafelistRelPath as v, createGlobalVarMapAssetSource as w, createRSCModuleRecord as x, cssHasContentScope as y, cssImportsTailwind as z };
840
859
  export type { CssVarScanResult as C, GlobalVarScanCacheKeyInput as G, MangleHybridHazards as M, PlanGlobalVarAliasesInput as P, RewriteGlobalVarCssAliasesOptions as R, ScanGlobalVarCssOptions as S, ValidateGlobalVarAliasInputsOptions as V, GlobalVarAliasPlan as a, GlobalVarCssAliasRewriteResult as b, CreateGlobalVarAliasValidationOptionsInput as c, GlobalVarAliasValidationResult as d, CssVarDefinition as e, CssVarLocation as f, CssVarReference as g, GlobalVarAliasDiagnostic as h, GlobalVarAliasDiagnosticSeverity as i, GlobalVarAliasEntry as j, GlobalVarCodeSource as k, GlobalVarCssAssetSource as l, GlobalVarCssSource as m, GlobalVarScanCacheEntry as n, ParsedTheme as o, RSCBoundaryViolation as p, RSCModuleRecord as q };
@@ -2,6 +2,11 @@ import { createHash, randomUUID } from 'node:crypto';
2
2
  import * as fs from 'node:fs';
3
3
  import * as path from 'node:path';
4
4
 
5
+ const WINDOWS_PATH_SEPARATOR = String.fromCodePoint(92);
6
+ function normalizePathSeparators(value) {
7
+ return value.split(WINDOWS_PATH_SEPARATOR).join("/");
8
+ }
9
+
5
10
  const CACHE_SCHEMA_VERSION = 10;
6
11
  function resolveTransformCacheDir(rootDir, cacheDir) {
7
12
  return path.resolve(rootDir, cacheDir ?? ".csszyx/cache", "transform");
@@ -201,4 +206,4 @@ function evictMemoryCacheToBudget(cache, totalCodeChars, maxEntries, maxCodeChar
201
206
  return total;
202
207
  }
203
208
 
204
- export { readTransformCache as a, evictMemoryCacheToBudget as b, createTransformCacheKey as c, evictOldTransformCacheEntries as e, resolveTransformCacheDir as r, writeTransformCache as w };
209
+ export { readTransformCache as a, evictMemoryCacheToBudget as b, createTransformCacheKey as c, evictOldTransformCacheEntries as e, normalizePathSeparators as n, resolveTransformCacheDir as r, writeTransformCache as w };