weapp-tailwindcss 5.1.9 → 5.1.10

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 (55) hide show
  1. package/dist/bundlers/shared/generator-css/generation-helpers.d.ts +1 -0
  2. package/dist/bundlers/shared/generator-css/output-import-shell.d.ts +4 -0
  3. package/dist/bundlers/shared/generator-css/source-resolver/metadata.d.ts +1 -0
  4. package/dist/bundlers/shared/generator-css/types.d.ts +2 -0
  5. package/dist/bundlers/vite/generate-bundle/css-assets.d.ts +1 -1
  6. package/dist/bundlers/vite/generate-bundle/remembered-css-replay.d.ts +2 -0
  7. package/dist/bundlers/vite/generate-bundle/scoped-generator.d.ts +1 -0
  8. package/dist/bundlers/vite/hot-css-modules.d.ts +1 -1
  9. package/dist/bundlers/vite/source-candidates.d.ts +7 -2
  10. package/dist/bundlers/vite/web-css-compat.d.ts +3 -0
  11. package/dist/bundlers/webpack/BaseUnifiedPlugin/v5-assets/css-source-resolvers.d.ts +9 -0
  12. package/dist/bundlers/webpack/BaseUnifiedPlugin/v5-assets/pipeline-helpers.d.ts +3 -0
  13. package/dist/cli.js +3 -2
  14. package/dist/cli.mjs +2 -1
  15. package/dist/{context-CfXr3hWz.mjs → context-DzkSFEVL.mjs} +4 -4
  16. package/dist/{context-CRhUs_5e.js → context-y2BGCok4.js} +10 -10
  17. package/dist/core.js +1 -1
  18. package/dist/core.mjs +1 -1
  19. package/dist/generator/options.d.ts +8 -1
  20. package/dist/{v4-engine-BZP2462H.js → generator-Bz94KTkH.js} +229 -17
  21. package/dist/{v4-engine-CjjWONB0.mjs → generator-ROzBodj6.mjs} +185 -9
  22. package/dist/generator.js +7 -8
  23. package/dist/generator.mjs +1 -2
  24. package/dist/{gulp-CRjkPsbX.mjs → gulp-BKqMb_Ds.mjs} +4 -4
  25. package/dist/{gulp-JUfnhOOo.js → gulp-DfOLvYLs.js} +10 -10
  26. package/dist/gulp.js +1 -1
  27. package/dist/gulp.mjs +1 -1
  28. package/dist/{hmr-timing-DcIEXnf8.js → hmr-timing-DOTdH18A.js} +556 -170
  29. package/dist/{hmr-timing-BecOXMd8.mjs → hmr-timing-DwtYJdwb.mjs} +430 -56
  30. package/dist/index.js +4 -4
  31. package/dist/index.mjs +4 -4
  32. package/dist/postcss.js +2 -3
  33. package/dist/postcss.mjs +1 -2
  34. package/dist/presets.js +7 -6
  35. package/dist/presets.mjs +5 -4
  36. package/dist/rspack.js +1 -1
  37. package/dist/rspack.mjs +1 -1
  38. package/dist/{source-candidate-scan-signature-10tvdJVC.js → source-candidate-scan-signature-BrWuBTjY.js} +34 -6
  39. package/dist/{source-candidate-scan-signature-DAg8QSgh.mjs → source-candidate-scan-signature-CQ04hiox.mjs} +29 -7
  40. package/dist/{tailwindcss-BZjZZi60.js → tailwindcss-Dn5DVlkI.js} +55 -47
  41. package/dist/{tailwindcss-PA2jHHpx.mjs → tailwindcss-hzy_WaC9.mjs} +14 -6
  42. package/dist/{transform-wNEbcZeQ.mjs → transform-BgnNYkIG.mjs} +1 -1
  43. package/dist/{transform-B0BxX3XB.js → transform-DZQETx51.js} +1 -1
  44. package/dist/{vite-ClpyoD9e.mjs → vite-BimHmlSp.mjs} +824 -207
  45. package/dist/{vite-CHk7V9EA.js → vite-bztpcI8_.js} +871 -254
  46. package/dist/vite.js +1 -1
  47. package/dist/vite.mjs +1 -1
  48. package/dist/weapp-tw-css-import-rewrite-loader.js +613 -63
  49. package/dist/{webpack-2s-TFhgm.mjs → webpack-CCapGlNg.mjs} +235 -38
  50. package/dist/{webpack-BhM4Hqla.js → webpack-XxBCIrBp.js} +276 -79
  51. package/dist/webpack.js +1 -1
  52. package/dist/webpack.mjs +1 -1
  53. package/package.json +6 -6
  54. package/dist/generator-DaaFxR5V.js +0 -174
  55. package/dist/generator-DugIHBgl.mjs +0 -127
@@ -1,12 +1,11 @@
1
1
  const require_rolldown_runtime = require("./rolldown-runtime-emK7D4bc.js");
2
2
  const require_framework = require("./framework.js");
3
- const require_v4_engine = require("./v4-engine-BZP2462H.js");
4
- const require_generator = require("./generator-DaaFxR5V.js");
3
+ const require_generator = require("./generator-Bz94KTkH.js");
5
4
  const require_utils = require("./utils-D3h8j7Mk.js");
6
- const require_context = require("./context-CRhUs_5e.js");
7
- const require_tailwindcss = require("./tailwindcss-BZjZZi60.js");
8
- const require_hmr_timing = require("./hmr-timing-DcIEXnf8.js");
9
- const require_source_candidate_scan_signature = require("./source-candidate-scan-signature-10tvdJVC.js");
5
+ const require_context = require("./context-y2BGCok4.js");
6
+ const require_tailwindcss = require("./tailwindcss-Dn5DVlkI.js");
7
+ const require_hmr_timing = require("./hmr-timing-DOTdH18A.js");
8
+ const require_source_candidate_scan_signature = require("./source-candidate-scan-signature-BrWuBTjY.js");
10
9
  require("./logger-TlKT3xmR.js");
11
10
  let node_fs = require("node:fs");
12
11
  node_fs = require_rolldown_runtime.__toESM(node_fs);
@@ -473,7 +472,7 @@ function createUniAppXBundleAssetSourceGetter(bundle) {
473
472
  //#region src/bundlers/vite/generate-bundle/configured-css-sources.ts
474
473
  function collectConfiguredTailwindV4CssSources(opts) {
475
474
  const runtimeCssSources = opts.tailwindcssRuntimeOptions?.tailwindcss?.v4?.cssSources ?? [];
476
- return require_v4_engine.filterTailwindV4CssSourceRoots([...opts.tailwindcss?.v4?.cssSources ?? [], ...runtimeCssSources]) ?? [];
475
+ return require_generator.filterTailwindV4CssSourceRoots([...opts.tailwindcss?.v4?.cssSources ?? [], ...runtimeCssSources]) ?? [];
477
476
  }
478
477
  function collectExplicitTailwindV4CssEntries(opts) {
479
478
  const entries = [
@@ -502,7 +501,7 @@ function collectConfiguredTailwindV4CssSourceEntries(opts, fallbackBase) {
502
501
  }
503
502
  for (const cssSource of collectConfiguredTailwindV4CssSources(opts)) {
504
503
  if (typeof cssSource.css !== "string" || cssSource.css.length === 0) continue;
505
- const base = require_v4_engine.resolveTailwindV4CssSourceBase(cssSource, fallbackBase);
504
+ const base = require_generator.resolveTailwindV4CssSourceBase(cssSource, fallbackBase);
506
505
  const file = typeof cssSource.file === "string" && cssSource.file.length > 0 ? cssSource.file : node_path.default.join(base, "tailwind.css");
507
506
  const resolvedFile = node_path.default.isAbsolute(file) ? node_path.default.resolve(file) : node_path.default.resolve(base, file);
508
507
  const key = `${resolvedFile}\0${cssSource.css}`;
@@ -547,8 +546,13 @@ function registerGeneratorDependencies$1(ctx, dependencies) {
547
546
  }
548
547
  //#endregion
549
548
  //#region src/bundlers/vite/generate-bundle/css-assets.ts
550
- function createCssAssetEmitter(context) {
549
+ function createCssAssetEmitter(context, bundle) {
551
550
  return (fileName, source) => {
551
+ const existing = bundle?.[fileName];
552
+ if (existing && typeof existing === "object" && "type" in existing && existing.type === "asset") {
553
+ existing.source = source;
554
+ return existing;
555
+ }
552
556
  if (context.emitFile) {
553
557
  context.emitFile({
554
558
  type: "asset",
@@ -658,9 +662,9 @@ function resolveReplayCssOutputFileFromSourceRoot(rootDir, file, sourceRoot) {
658
662
  return outputFile;
659
663
  }
660
664
  function resolveViteCssOutputFile(file, opts, isWebGeneratorTarget, preserveCssExtension = false, styleOutputExtension, styleOutputFiles) {
661
- if (isWebGeneratorTarget || preserveCssExtension || opts.cssMatcher(file) || !SOURCE_STYLE_OUTPUT_EXT_RE.test(file) || !require_source_candidate_scan_signature.isCSSRequest(file)) return file;
662
- const stem = file.replace(/[?#].*$/, "").replace(SOURCE_STYLE_OUTPUT_EXT_RE, "");
663
- return file.replace(SOURCE_STYLE_OUTPUT_EXT_RE, resolveMiniProgramStyleOutputExtension({
665
+ if (isWebGeneratorTarget || preserveCssExtension || opts.cssMatcher(file) || !CSS_SOURCE_OUTPUT_EXT_RE.test(file) || !require_source_candidate_scan_signature.isCSSRequest(file)) return file;
666
+ const stem = file.replace(/[?#].*$/, "").replace(CSS_SOURCE_OUTPUT_EXT_RE, "");
667
+ return file.replace(CSS_SOURCE_OUTPUT_EXT_RE, resolveMiniProgramStyleOutputExtension({
664
668
  cssMatcher: opts.cssMatcher,
665
669
  fallback: styleOutputExtension,
666
670
  files: styleOutputFiles,
@@ -814,7 +818,7 @@ function collectCssConfigBaseCandidates(source, file, outputRoot, opts) {
814
818
  const cssSourceCss = typeof cssSource.css === "string" ? normalizeCssSourceForCompare(cssSource.css) : void 0;
815
819
  if (cssSourceFile && !isMatchingCssSourceFile(file, cssSourceFile, outputRoot) && cssSourceCss !== normalizedSource) continue;
816
820
  addCandidate(cssSourceFile ? node_path.default.dirname(cssSourceFile) : void 0);
817
- addCandidate(require_v4_engine.resolveTailwindV4CssSourceBase(cssSource, sourceBaseFallback));
821
+ addCandidate(require_generator.resolveTailwindV4CssSourceBase(cssSource, sourceBaseFallback));
818
822
  }
819
823
  return candidates;
820
824
  }
@@ -1006,7 +1010,7 @@ function createCssTransformShareScope(file, rawSource) {
1006
1010
  function createCssTransformShareScopeKey(opts, file, rawSource) {
1007
1011
  if (opts.mainCssChunkMatcher(file, opts.appType)) return `main:${require_source_candidate_scan_signature.normalizeOutputPathKey(file)}`;
1008
1012
  const generatorOptions = require_generator.normalizeWeappTailwindcssGeneratorOptions(opts.generator);
1009
- if (require_v4_engine.hasTailwindGeneratedCssMarkers(rawSource) || require_v4_engine.hasTailwindSourceDirectives(rawSource, { importFallback: generatorOptions.importFallback })) return `source:${require_source_candidate_scan_signature.normalizeOutputPathKey(file)}`;
1013
+ if (require_generator.hasTailwindGeneratedCssMarkers(rawSource) || require_generator.hasTailwindSourceDirectives(rawSource, { importFallback: generatorOptions.importFallback })) return `source:${require_source_candidate_scan_signature.normalizeOutputPathKey(file)}`;
1010
1014
  return createCssTransformShareScope(file, rawSource);
1011
1015
  }
1012
1016
  function createCssRuntimeSignature(runtimeSignature, generatorCandidateSignature) {
@@ -1548,10 +1552,10 @@ function resolveSfcStyleRequestFromKnownSource(sourceFile, sfcSource, styleSourc
1548
1552
  }
1549
1553
  function hasTailwindGenerationSource(source, options = {}) {
1550
1554
  const allowRootDirectives = options.allowRootDirectives !== false;
1551
- return require_v4_engine.hasTailwindNonRootGenerationDirectives(source, { importFallback: true }) || allowRootDirectives && require_v4_engine.hasTailwindSourceDirectives(source, { importFallback: true }) || allowRootDirectives && require_v4_engine.hasTailwindRootDirectives(source, { importFallback: true }) || require_v4_engine.hasTailwindApplyDirective(source);
1555
+ return require_generator.hasTailwindNonRootGenerationDirectives(source, { importFallback: true }) || allowRootDirectives && require_generator.hasTailwindSourceDirectives(source, { importFallback: true }) || allowRootDirectives && require_generator.hasTailwindRootDirectives(source, { importFallback: true }) || require_generator.hasTailwindApplyDirective(source);
1552
1556
  }
1553
1557
  function hasTailwindGenerationSourceForFile(file, source) {
1554
- if (require_v4_engine.isTailwindV4CssEntry(file)) return hasTailwindGenerationSource(source);
1558
+ if (require_generator.isTailwindV4CssEntry(file)) return hasTailwindGenerationSource(source);
1555
1559
  return hasTailwindGenerationSource(source, { allowRootDirectives: false });
1556
1560
  }
1557
1561
  async function resolveSfcStyleSourceFromOutputFile(outputFile, snapshot, outputRoot, sourceRoot, cssMatcher, getSfcSource, debug) {
@@ -1657,6 +1661,10 @@ function resolveSourceStyleFileFromSiblingChunk(outputFile, snapshot, outputRoot
1657
1661
  debug("source style sibling chunk skipped: no source style modules for %s -> %s", outputFile, siblingJsFile);
1658
1662
  return;
1659
1663
  }
1664
+ if (sourceFiles.length === 1) {
1665
+ debug("source style sibling chunk inferred from single css module: %s -> %s", outputFile, sourceFiles[0]);
1666
+ return sourceFiles[0];
1667
+ }
1660
1668
  const scoredSources = sourceFiles.map((sourceFile) => ({
1661
1669
  sourceFile,
1662
1670
  score: scoreMatchingStyleFileBase(outputFile, sourceFile, outputRoot, sourceRoot)
@@ -1675,11 +1683,23 @@ function resolveSourceStyleSourceFromOutputFile(outputFile, snapshot, outputRoot
1675
1683
  let sourceFile = resolveSourceStyleFileFromSiblingChunk(outputFile, snapshot, outputRoot, sourceRoot, debug);
1676
1684
  let rawSource = sourceFile ? getSourceStyleSource?.(sourceFile) : void 0;
1677
1685
  if (!sourceFile || !rawSource || !hasTailwindGenerationSourceForFile(sourceFile, rawSource)) {
1678
- const scoredSources = [...getSourceStyleSources?.() ?? [], ...configuredSourceEntries ?? []].filter(([file, source]) => CSS_SOURCE_OUTPUT_EXT_RE.test(file) && hasTailwindGenerationSourceForFile(file, source)).map(([file, source]) => ({
1686
+ const cachedSources = [...getSourceStyleSources?.() ?? []].filter(([file, source]) => CSS_SOURCE_OUTPUT_EXT_RE.test(file) && hasTailwindGenerationSourceForFile(file, source)).map(([file, source]) => ({
1679
1687
  file,
1680
1688
  source,
1681
- score: scoreMatchingStyleFileBase(outputFile, file, outputRoot, sourceRoot)
1682
- })).filter((item) => item.score > 0).sort((a, b) => b.score - a.score);
1689
+ score: require_hmr_timing.scoreTailwindV4CssSourceFileMatch(outputFile, file, {
1690
+ outputRoot,
1691
+ projectRoot: sourceRoot
1692
+ })
1693
+ }));
1694
+ const configuredSources = [...configuredSourceEntries ?? []].filter(([file, source]) => CSS_SOURCE_OUTPUT_EXT_RE.test(file) && hasTailwindGenerationSourceForFile(file, source)).map(([file, source]) => ({
1695
+ file,
1696
+ source,
1697
+ score: require_hmr_timing.scoreTailwindV4CssSourceFileMatch(outputFile, file, {
1698
+ outputRoot,
1699
+ projectRoot: sourceRoot
1700
+ })
1701
+ }));
1702
+ const scoredSources = [...cachedSources, ...configuredSources].filter((item) => item.score > 0).sort((a, b) => b.score - a.score);
1683
1703
  const bestScore = scoredSources[0]?.score;
1684
1704
  const bestSources = bestScore ? scoredSources.filter((item) => item.score === bestScore) : [];
1685
1705
  if (bestSources.length === 1) {
@@ -1834,13 +1854,13 @@ function removeTailwindSourceMediaWrappersFallback(css) {
1834
1854
  }
1835
1855
  function removeTailwindEntryDirectivesFromCss(css) {
1836
1856
  try {
1837
- const source = require_v4_engine.stripGeneratorPlaceholderMarkers(css);
1857
+ const source = require_generator.stripGeneratorPlaceholderMarkers(css);
1838
1858
  const root = _weapp_tailwindcss_postcss.postcss.parse(source);
1839
1859
  const removedMediaWrappers = removeTailwindSourceMediaWrappersRoot(root);
1840
1860
  const removedTailwindDirectives = (0, _weapp_tailwindcss_postcss.removeTailwindSourceDirectivesRoot)(root);
1841
1861
  return removedMediaWrappers || removedTailwindDirectives ? root.toString() : source;
1842
1862
  } catch {
1843
- return require_v4_engine.removeTailwindSourceDirectives(removeTailwindSourceMediaWrappersFallback(css));
1863
+ return require_generator.removeTailwindSourceDirectives(removeTailwindSourceMediaWrappersFallback(css));
1844
1864
  }
1845
1865
  }
1846
1866
  function removeUnsupportedMiniProgramCssImportsFallback(css, file) {
@@ -1862,9 +1882,11 @@ function normalizeInjectableCssForTargetWithImports(css, file) {
1862
1882
  };
1863
1883
  try {
1864
1884
  const root = _weapp_tailwindcss_postcss.postcss.parse(css);
1885
+ const changed = isMiniProgramStyleOutputFile(file) ? (0, _weapp_tailwindcss_postcss.removeUnsupportedMiniProgramCssImportsRoot)(root) : false;
1886
+ const importedStyleFiles = collectImportedStyleFilesRoot(root, file);
1865
1887
  return {
1866
- css: (isMiniProgramStyleOutputFile(file) ? (0, _weapp_tailwindcss_postcss.removeUnsupportedMiniProgramCssImportsRoot)(root) : false) ? root.toString() : css,
1867
- importedStyleFiles: collectImportedStyleFilesRoot(root, file)
1888
+ css: changed ? root.toString() : css,
1889
+ importedStyleFiles: importedStyleFiles.size > 0 ? importedStyleFiles : collectImportedStyleFilesFallback(css, file)
1868
1890
  };
1869
1891
  } catch {
1870
1892
  const fallbackCss = removeUnsupportedMiniProgramCssImportsFallback(css, file);
@@ -1898,12 +1920,16 @@ function collectImportedStyleFilesFromRequests(requests, targetFile) {
1898
1920
  function collectImportedStyleFilesRoot(root, targetFile) {
1899
1921
  return collectImportedStyleFilesFromRequests((0, _weapp_tailwindcss_postcss.collectCssImportRequestsRoot)(root), targetFile);
1900
1922
  }
1923
+ function collectImportedStyleFilesFallback(css, targetFile) {
1924
+ return collectImportedStyleFilesFromRequests([...css.matchAll(/@import\s+(?:url\(\s*)?(?:"([^"]+)"|'([^']+)'|([^\s;)]+))/g)].map((match) => match[1] ?? match[2] ?? match[3]).filter((request) => typeof request === "string" && request.length > 0), targetFile);
1925
+ }
1901
1926
  function collectImportedStyleFiles(css, targetFile) {
1902
1927
  if (!css.includes("@import")) return /* @__PURE__ */ new Set();
1903
1928
  try {
1904
- return collectImportedStyleFilesRoot(_weapp_tailwindcss_postcss.postcss.parse(css), targetFile);
1929
+ const imports = collectImportedStyleFilesRoot(_weapp_tailwindcss_postcss.postcss.parse(css), targetFile);
1930
+ return imports.size > 0 ? imports : collectImportedStyleFilesFallback(css, targetFile);
1905
1931
  } catch {}
1906
- return /* @__PURE__ */ new Set();
1932
+ return collectImportedStyleFilesFallback(css, targetFile);
1907
1933
  }
1908
1934
  function normalizeMarkerOutputFile(markerFile, resolveViteProcessedCssOutputFile) {
1909
1935
  return resolveViteProcessedCssOutputFile?.(markerFile) ?? markerFile;
@@ -2060,9 +2086,21 @@ function isUnscopedMiniProgramTailwindPreflightRule(rule) {
2060
2086
  const declarations = rule.nodes?.filter((node) => node.type === "decl") ?? [];
2061
2087
  return declarations.length > 0 && declarations.every(isMiniProgramTailwindPreflightDeclaration);
2062
2088
  }
2089
+ function isScopedMiniProgramTailwindContentInitRule(rule) {
2090
+ const selectors = rule.selectors ?? [rule.selector];
2091
+ if (selectors.length === 0 || !selectors.every((selector) => {
2092
+ const normalized = normalizeCssSignatureValue(selector);
2093
+ return hasVueScopedAttr(selector) && MINI_PROGRAM_PREFLIGHT_SELECTORS.has(normalized);
2094
+ })) return false;
2095
+ const declarations = rule.nodes?.filter((node) => node.type === "decl") ?? [];
2096
+ return declarations.length > 0 && declarations.every((decl) => decl.prop === "--tw-content");
2097
+ }
2063
2098
  function hasUnscopedMiniProgramTailwindPreflightRule(css) {
2064
2099
  return /(?:^|[{}])\s*view\s*,\s*text\s*,\s*::after\s*,\s*::before\s*\{/.test(css);
2065
2100
  }
2101
+ function hasScopedMiniProgramTailwindContentInitRule(css) {
2102
+ return /(?:^|[{}])[^{}]*\.data-v-[\w-][^{}]*\{\s*--tw-content\s*:/.test(css);
2103
+ }
2066
2104
  function collectRootScopedComparableCssCoverage(cssSources) {
2067
2105
  const rules = /* @__PURE__ */ new Set();
2068
2106
  const atRules = /* @__PURE__ */ new Set();
@@ -2099,14 +2137,15 @@ function isRuleCoveredByRootCss(rule, coverage) {
2099
2137
  return declarationKeys.length > 0 && selectors.every((selector) => {
2100
2138
  const rootDeclarations = coverage.declarationsBySelector.get(normalizeCssSignatureValue(selector));
2101
2139
  return rootDeclarations != null && declarationKeys.every((declaration) => rootDeclarations.has(declaration));
2102
- }) || selectors.every((selector) => coverage.declarationsBySelector.has(normalizeCssSignatureValue(selector)));
2140
+ });
2103
2141
  }
2104
2142
  function removeScopedCssCoveredByRootStyleSources(css, rootSources) {
2105
2143
  if (!hasVueScopedAttr(css)) return css;
2106
2144
  const hasScopedTailwindGeneratedCss = /tailwindcss v\d/i.test(css);
2107
2145
  const hasUnscopedMiniProgramPreflight = hasUnscopedMiniProgramTailwindPreflightRule(css);
2146
+ const hasScopedMiniProgramContentInit = hasScopedMiniProgramTailwindContentInitRule(css);
2108
2147
  const coverage = collectRootScopedComparableCssCoverage(rootSources);
2109
- if (coverage.rules.size === 0 && coverage.atRules.size === 0 && !hasScopedTailwindGeneratedCss && !hasUnscopedMiniProgramPreflight) return css;
2148
+ if (coverage.rules.size === 0 && coverage.atRules.size === 0 && !hasScopedTailwindGeneratedCss && !hasUnscopedMiniProgramPreflight && !hasScopedMiniProgramContentInit) return css;
2110
2149
  try {
2111
2150
  const root = _weapp_tailwindcss_postcss.postcss.parse(css);
2112
2151
  let changed = false;
@@ -2117,7 +2156,7 @@ function removeScopedCssCoveredByRootStyleSources(css, rootSources) {
2117
2156
  }
2118
2157
  });
2119
2158
  root.walkRules((rule) => {
2120
- if (isRuleCoveredByRootCss(rule, coverage) || hasScopedTailwindGeneratedCss && isLikelyTailwindGlobalRule(rule) || isUnscopedMiniProgramTailwindPreflightRule(rule)) {
2159
+ if (isRuleCoveredByRootCss(rule, coverage) || hasScopedTailwindGeneratedCss && isLikelyTailwindGlobalRule(rule) || isUnscopedMiniProgramTailwindPreflightRule(rule) || isScopedMiniProgramTailwindContentInitRule(rule)) {
2121
2160
  rule.remove();
2122
2161
  changed = true;
2123
2162
  }
@@ -2251,6 +2290,7 @@ function shouldUseCssAssetAsMainInjectionTarget(opts, file, records, options, bu
2251
2290
  }) === true && !isMiniProgramStyleOutputFile(file) && matchedRootWebOutputTargets.length > 0) return matchedRootWebOutputTargets.includes(fileKey);
2252
2291
  const explicitRootTargets = records.filter((record) => record.injectIntoMain === true).map((record) => typeof record.outputFile === "string" ? require_source_candidate_scan_signature.normalizeOutputPathKey(record.outputFile) : void 0).filter((outputFile) => typeof outputFile === "string" && isRootStyleOutputFile(outputFile) && !isMiniProgramStyleOutputFile(outputFile));
2253
2292
  const explicitWebCssTargets = records.filter((record) => record.injectIntoMain === true).map((record) => typeof record.outputFile === "string" ? require_source_candidate_scan_signature.normalizeOutputPathKey(record.outputFile) : void 0).filter((outputFile) => typeof outputFile === "string" && isCssOutputFile(outputFile) && !isMiniProgramStyleOutputFile(outputFile));
2293
+ const explicitStyleOutputTargets = records.filter((record) => record.injectIntoMain === true).map((record) => typeof record.outputFile === "string" ? require_source_candidate_scan_signature.normalizeOutputPathKey(record.outputFile) : void 0).filter((outputFile) => typeof outputFile === "string" && isRootStyleOutputFile(outputFile));
2254
2294
  if (context !== void 0 && options.cssPipelineStrategy?.shouldPreferExplicitWebCssTargets?.({
2255
2295
  ...context,
2256
2296
  explicitRootTargets,
@@ -2260,12 +2300,25 @@ function shouldUseCssAssetAsMainInjectionTarget(opts, file, records, options, bu
2260
2300
  if (explicitRootTargets.length > 0) return explicitRootTargets.includes(fileKey);
2261
2301
  if (records.some((record) => {
2262
2302
  if (record.injectIntoMain !== true) return false;
2303
+ if (explicitStyleOutputTargets.length > 0) return explicitStyleOutputTargets.includes(fileKey) || isRootStyleOutputFile(file) && isViteProcessedRootStyleImportingTargets(bundle, file, explicitStyleOutputTargets) || isRootStyleOutputFile(file) && opts.mainCssChunkMatcher(file, opts.appType) && explicitStyleOutputTargets.some((outputFile) => opts.mainCssChunkMatcher(outputFile, opts.appType));
2263
2304
  return isRootStyleOutputFile(file) || typeof record.outputFile === "string" && require_source_candidate_scan_signature.normalizeOutputPathKey(record.outputFile) === fileKey;
2264
2305
  })) return true;
2265
- if (records.some((record) => record.injectIntoMain === true)) return false;
2306
+ if (records.some((record) => record.injectIntoMain === true)) {
2307
+ const matchedExplicitMiniProgramTargets = explicitStyleOutputTargets.filter((outputFile) => isMiniProgramStyleOutputFile(outputFile) && opts.mainCssChunkMatcher(outputFile, opts.appType));
2308
+ if (matchedExplicitMiniProgramTargets.length > 0) return matchedExplicitMiniProgramTargets.includes(fileKey);
2309
+ return isRootStyleOutputFile(file) && isMiniProgramStyleOutputFile(file);
2310
+ }
2266
2311
  if (opts.mainCssChunkMatcher(file, opts.appType)) return true;
2267
2312
  return isRootStyleOutputFile(file) && records.some((record) => record.injectIntoMain === true);
2268
2313
  }
2314
+ function isViteProcessedRootStyleImportingTargets(bundle, file, targetFiles) {
2315
+ const targetFileSet = new Set(targetFiles.map(require_source_candidate_scan_signature.normalizeOutputPathKey));
2316
+ for (const [bundleFile, output] of Object.entries(bundle)) {
2317
+ if (output.type !== "asset" || require_source_candidate_scan_signature.normalizeOutputPathKey(getAssetFile$1(bundleFile, output)) !== require_source_candidate_scan_signature.normalizeOutputPathKey(file)) continue;
2318
+ return [...collectImportedStyleFiles(readAssetSource$2(output), file)].some((importedFile) => targetFileSet.has(require_source_candidate_scan_signature.normalizeOutputPathKey(importedFile)));
2319
+ }
2320
+ return false;
2321
+ }
2269
2322
  function isViteProcessedCssResultImported(record, importedStyleFiles) {
2270
2323
  return importedStyleFiles.has(require_source_candidate_scan_signature.normalizeOutputPathKey(record.file)) || typeof record.outputFile === "string" && importedStyleFiles.has(require_source_candidate_scan_signature.normalizeOutputPathKey(record.outputFile));
2271
2324
  }
@@ -2309,7 +2362,84 @@ function removeCssCoveredByImportedViteResults(css, importedCssSources) {
2309
2362
  if (importedCssSources.length === 0) return css;
2310
2363
  const importedCss = importedCssSources.map((source) => require_source_candidate_scan_signature.stripBundlerGeneratedCssMarkers(source).trim()).filter(Boolean).join("\n");
2311
2364
  if (importedCss.length === 0) return css;
2312
- return (0, _weapp_tailwindcss_postcss.filterExistingCssRules)(importedCss, css);
2365
+ return restoreCssImportAtRules(css, removeCssRulesCoveredBySources(css, [importedCss], { exactOnly: true }));
2366
+ }
2367
+ function removeCssRulesCoveredBySources(css, sources, options = {}) {
2368
+ if (sources.length === 0 || css.trim().length === 0) return css;
2369
+ const coverage = collectRootScopedComparableCssCoverage(sources);
2370
+ const coveredRuleCss = collectNormalizedRuleCss(sources);
2371
+ if (coverage.rules.size === 0 && coverage.declarationsBySelector.size === 0 && coveredRuleCss.size === 0) return css;
2372
+ try {
2373
+ const root = _weapp_tailwindcss_postcss.postcss.parse(css);
2374
+ let changed = false;
2375
+ root.walkRules((rule) => {
2376
+ if (!coveredRuleCss.has(normalizeCssSignatureValue(rule.toString())) && (options.exactOnly === true || !isRuleCoveredByRootCss(rule, coverage))) return;
2377
+ rule.remove();
2378
+ changed = true;
2379
+ });
2380
+ return changed ? root.toString() : css;
2381
+ } catch {
2382
+ return css;
2383
+ }
2384
+ }
2385
+ function collectNormalizedRuleCss(sources) {
2386
+ const rules = /* @__PURE__ */ new Set();
2387
+ for (const source of sources) try {
2388
+ _weapp_tailwindcss_postcss.postcss.parse(source).walkRules((rule) => {
2389
+ rules.add(normalizeCssSignatureValue(rule.toString()));
2390
+ });
2391
+ } catch {}
2392
+ return rules;
2393
+ }
2394
+ function collectCssImportAtRuleCss(css) {
2395
+ if (!css.includes("@import")) return [];
2396
+ const fallbackImports = [...css.matchAll(/@import\s[^;]+;?/g)].map((match) => match[0]);
2397
+ if (fallbackImports.length > 0) return fallbackImports;
2398
+ try {
2399
+ const root = _weapp_tailwindcss_postcss.postcss.parse(css);
2400
+ const imports = [];
2401
+ root.each((node) => {
2402
+ if (node.type === "atrule" && node.name === "import") imports.push(node.toString());
2403
+ });
2404
+ return imports;
2405
+ } catch {
2406
+ return [];
2407
+ }
2408
+ }
2409
+ function parseCssImportRequest(importCss) {
2410
+ const trimmed = importCss.trim();
2411
+ if (!trimmed.startsWith("@import")) return;
2412
+ return (0, _weapp_tailwindcss_postcss.parseTailwindCssDirectiveRequest)(trimmed.slice(7).trim().replace(/;$/, "").trim());
2413
+ }
2414
+ function shouldRestoreCssImportAtRule(importCss, file) {
2415
+ if (file === void 0 || !isMiniProgramStyleOutputFile(file)) return true;
2416
+ const request = parseCssImportRequest(importCss);
2417
+ if (request === void 0) return false;
2418
+ if ((0, _weapp_tailwindcss_postcss.isMiniProgramLocalCssImportRequest)(request)) return true;
2419
+ return isStyleImportRequest(request) && !request.includes("/");
2420
+ }
2421
+ function restoreCssImportAtRules(source, filtered, file) {
2422
+ const imports = collectCssImportAtRuleCss(source).filter((importCss) => shouldRestoreCssImportAtRule(importCss, file));
2423
+ if (imports.length === 0) return filtered;
2424
+ const missingImports = imports.filter((importCss) => !filtered.includes(importCss));
2425
+ if (missingImports.length === 0) return filtered;
2426
+ return appendCss$1(missingImports.join("\n"), filtered);
2427
+ }
2428
+ function removeCommentOnlyAtRules(css) {
2429
+ if (!css.includes("@")) return css;
2430
+ try {
2431
+ const root = _weapp_tailwindcss_postcss.postcss.parse(css);
2432
+ let changed = false;
2433
+ root.walkAtRules((atRule) => {
2434
+ if (!atRule.nodes || atRule.nodes.length === 0) return;
2435
+ if (atRule.nodes.some((node) => node.type !== "comment")) return;
2436
+ atRule.remove();
2437
+ changed = true;
2438
+ });
2439
+ return changed ? root.toString() : css;
2440
+ } catch {
2441
+ return css;
2442
+ }
2313
2443
  }
2314
2444
  function collectImportedBundleCssSources(bundle, importedStyleFiles) {
2315
2445
  if (importedStyleFiles.size === 0) return [];
@@ -2575,7 +2705,9 @@ function injectViteProcessedCssIntoMainCssAssets(bundle, options) {
2575
2705
  if (missingCss.length === 0 || !hasNonCommentCss(missingCss) || (0, _weapp_tailwindcss_postcss.containsCssAfterMinify)(nextCss, missingCss)) continue;
2576
2706
  nextCss = appendCss$1(nextCss, missingCss);
2577
2707
  }
2578
- nextCss = transformCss(nextCss, file);
2708
+ const finalImportedCssSources = collectImportedBundleCssSources(bundle, collectImportedStyleFiles(originalSource, file));
2709
+ nextCss = transformCss(removeCommentOnlyAtRules(restoreCssImportAtRules(originalSource, removeCssRulesCoveredBySources(nextCss, finalImportedCssSources, { exactOnly: true }).trim(), file)), file);
2710
+ if (nextCss.trim() === originalSource.trim()) nextCss = originalSource;
2579
2711
  if (nextCss !== originalSource) {
2580
2712
  output.source = nextCss;
2581
2713
  options.markCssAssetProcessed?.(output, file);
@@ -2701,7 +2833,7 @@ function resolveViteMemoryDebugStats(context) {
2701
2833
  ...context.getViteCssCacheStats?.(),
2702
2834
  lastCssResultByFile: summarizeStringMapCache$1(context.lastCssResultByFile)
2703
2835
  },
2704
- tailwind: { v4: require_v4_engine.getTailwindV4IncrementalGenerateCacheStats() }
2836
+ tailwind: { v4: require_generator.getTailwindV4IncrementalGenerateCacheStats() }
2705
2837
  };
2706
2838
  }
2707
2839
  //#endregion
@@ -2860,14 +2992,15 @@ function getAssetFile(bundleFile, asset) {
2860
2992
  return asset.fileName || bundleFile;
2861
2993
  }
2862
2994
  function finalizeWebviewCssCompat(bundle, options) {
2863
- if (options.opts.generator?.webCompat === false) return 0;
2995
+ const generatorOptions = require_generator.normalizeWeappTailwindcssGeneratorOptions(options.opts.generator);
2996
+ if (generatorOptions.webCompat === false) return 0;
2864
2997
  let transformed = 0;
2865
2998
  for (const [bundleFile, output] of Object.entries(bundle)) {
2866
2999
  if (output.type !== "asset") continue;
2867
3000
  const file = getAssetFile(bundleFile, output);
2868
3001
  if (!options.opts.cssMatcher(file) || !/\.css(?:$|[?#])/i.test(file)) continue;
2869
3002
  const rawSource = readAssetSource(output);
2870
- const nextCss = (0, _weapp_tailwindcss_postcss.transformWebCssSafeSelectors)((0, _weapp_tailwindcss_postcss.transformWebCssCompat)(rawSource, options.opts.generator?.webCompat ?? true), { escapeMap: options.opts.escapeMap });
3003
+ const nextCss = (0, _weapp_tailwindcss_postcss.transformWebCssSafeSelectors)((0, _weapp_tailwindcss_postcss.transformWebCssCompat)(rawSource, generatorOptions.webCompat ?? true), { escapeMap: options.opts.escapeMap });
2871
3004
  if (nextCss === rawSource) continue;
2872
3005
  output.source = nextCss;
2873
3006
  options.recordCssAssetResult?.(file, nextCss);
@@ -2903,7 +3036,7 @@ function resolveSingleCssImportOutputFile(targetFile, css) {
2903
3036
  try {
2904
3037
  _weapp_tailwindcss_postcss.postcss.parse(css).walkAtRules("import", (atRule) => {
2905
3038
  if (importedFile !== void 0) return;
2906
- const request = require_v4_engine.parseImportRequest(atRule.params);
3039
+ const request = require_generator.parseImportRequest(atRule.params);
2907
3040
  if (!request || /^(?:https?:)?\/\//i.test(request) || request.startsWith("data:")) return;
2908
3041
  const cleanRequest = request.replace(/[?#].*$/, "");
2909
3042
  if (!/\.(?:css|wxss|acss|ttss|qss|jxss|tyss)$/i.test(cleanRequest)) return;
@@ -3327,7 +3460,7 @@ function resolveUniAppXStyleIsolationEnabled(root) {
3327
3460
  //#region src/uni-app-x/vite.ts
3328
3461
  let transformUVuePromise;
3329
3462
  function loadTransformUVue() {
3330
- transformUVuePromise ?? (transformUVuePromise = Promise.resolve().then(() => require("./transform-B0BxX3XB.js")).then((mod) => mod.transformUVue));
3463
+ transformUVuePromise ?? (transformUVuePromise = Promise.resolve().then(() => require("./transform-DZQETx51.js")).then((mod) => mod.transformUVue));
3331
3464
  return transformUVuePromise;
3332
3465
  }
3333
3466
  const preprocessorLangs = /* @__PURE__ */ new Set([
@@ -3401,14 +3534,14 @@ function createUniAppXPlugins(options) {
3401
3534
  const parsed = query ?? parseVueRequest(id).query;
3402
3535
  if (require_source_candidate_scan_signature.isCSSRequest(id) || parsed.vue && parsed.type === "style") {
3403
3536
  if (isCssModuleExport(code)) return;
3404
- const shouldGenerateCss = require_v4_engine.hasTailwindSourceDirectives(code, { importFallback: true }) || require_v4_engine.hasTailwindApplyDirective(code);
3537
+ const shouldGenerateCss = require_generator.hasTailwindSourceDirectives(code, { importFallback: true }) || require_generator.hasTailwindApplyDirective(code);
3405
3538
  rememberHarmonyApplySource(code);
3406
3539
  const generatedCss = shouldGenerateCss ? await generateCss?.(id, code, hookContext) : void 0;
3407
3540
  const styleCode = typeof generatedCss === "string" && generatedCss.trim().length > 0 ? generatedCss : code;
3408
3541
  const cacheKey = `${mainCssChunkMatcher(id, appType) ? "1" : "0"}:${id}`;
3409
3542
  let styleHandlerOptions = cssHandlerOptionsCache.get(cacheKey);
3410
3543
  if (!styleHandlerOptions) {
3411
- styleHandlerOptions = require_v4_engine.omitUndefined({
3544
+ styleHandlerOptions = require_generator.omitUndefined({
3412
3545
  isMainChunk: mainCssChunkMatcher(id, appType),
3413
3546
  uniAppXCssTarget: resolveUniAppXCssTarget(id),
3414
3547
  uniAppXUnsupported: resolvedUniAppXOptions.uvueUnsupported,
@@ -3471,7 +3604,7 @@ function createUniAppXPlugins(options) {
3471
3604
  const transformUVue = await loadTransformUVue();
3472
3605
  const enableComponentLocalStyle = shouldEnableComponentLocalStyle();
3473
3606
  const enablePageLocalStyle = shouldEnableHarmonyPageLocalStyle();
3474
- if (customAttributesEntities.length > 0 || disabledDefaultTemplateHandler || enableComponentLocalStyle || enablePageLocalStyle) return transformUVue(code, id, jsHandler, currentRuntimeSet, require_v4_engine.omitUndefined({
3607
+ if (customAttributesEntities.length > 0 || disabledDefaultTemplateHandler || enableComponentLocalStyle || enablePageLocalStyle) return transformUVue(code, id, jsHandler, currentRuntimeSet, require_generator.omitUndefined({
3475
3608
  ...customAttributesEntities.length > 0 ? { customAttributesEntities } : {},
3476
3609
  ...disabledDefaultTemplateHandler ? { disabledDefaultTemplateHandler } : {},
3477
3610
  ...enableComponentLocalStyle ? { enableComponentLocalStyle } : {},
@@ -3785,7 +3918,7 @@ function collectRememberedCssReplayGroups(sources, opts, rootDir, isWebGenerator
3785
3918
  //#endregion
3786
3919
  //#region src/bundlers/vite/generate-bundle/remembered-css-replay.ts
3787
3920
  async function processRememberedCssReplay(options) {
3788
- const { addWatchFile, activeViteCssCacheFiles, bundleFiles, cache, createScopedGeneratorRuntime, createScopedSourceCandidateGetter, createScopedSourceCandidateSourceGetter, cssTaskFactories, debug, defaultStyleOutputExtension, emitOrReplayCssAsset, generatorRuntime, generatorPlatform, getCssHandlerOptions, getCssUserHandlerOptions, getRememberedCssSignature, getRememberedCssSources, isNativeAppStyleTarget, isWebGeneratorTarget, lastCssResultByFile, lastCssSourceHashByFile, markCssAssetProcessed, metrics, normalizeViteCssCacheKey, onUpdate, opts, recordCssAssetResult, recordViteProcessedCssAssetResult, refreshRememberedCssSource, rootDir, runtimeState, setRememberedCssSignature, shouldInjectCssIntoMainFromOutput, shouldPreserveAppCssExtension, sourceRoot, styleHandler, timeTask, useIncrementalMode } = options;
3921
+ const { addWatchFile, activeViteCssCacheFiles, bundleFiles, cache, changedCssFiles = /* @__PURE__ */ new Set(), createScopedGeneratorRuntime, createScopedSourceCandidateGetter, createScopedSourceCandidateSourceGetter, cssTaskFactories, debug, defaultStyleOutputExtension, emitOrReplayCssAsset, generatorRuntime, generatorPlatform, getCssHandlerOptions, getCssUserHandlerOptions, getRememberedCssSignature, getRememberedCssSources, isNativeAppStyleTarget, isWebGeneratorTarget, lastCssRawSourceHashByFile = /* @__PURE__ */ new Map(), lastCssResultByFile, lastCssSourceHashByFile, markCssAssetProcessed, metrics, normalizeViteCssCacheKey, onUpdate, opts, recordCssAssetResult, recordViteProcessedCssAssetResult, refreshRememberedCssSource, rootDir, runtimeState, setRememberedCssSignature, shouldInjectCssIntoMainFromOutput, shouldPreserveAppCssExtension, sourceRoot, styleHandler, timeTask, useIncrementalMode } = options;
3789
3922
  const rememberedReplayGroups = collectRememberedCssReplayGroups(getRememberedCssSources?.(), opts, rootDir, isWebGeneratorTarget, shouldPreserveAppCssExtension, sourceRoot, defaultStyleOutputExtension, bundleFiles);
3790
3923
  for (const [outputFile, rememberedGroup] of rememberedReplayGroups) {
3791
3924
  if (require_source_candidate_scan_signature.isHTMLRequest(outputFile) || options.opts.htmlMatcher(outputFile)) continue;
@@ -3797,6 +3930,7 @@ async function processRememberedCssReplay(options) {
3797
3930
  const rememberedCssSource = mergeRememberedCssSources(refreshedRememberedGroup.map((item) => item.remembered), outputFile);
3798
3931
  if (!rememberedCssSource) continue;
3799
3932
  const { rawSource, sourceFile } = rememberedCssSource;
3933
+ const generatorRawSource = isWebGeneratorTarget ? rawSource : require_hmr_timing.normalizeMiniProgramGeneratorCssSource(rawSource, outputFile);
3800
3934
  activeViteCssCacheFiles.add(normalizeViteCssCacheKey(outputFile));
3801
3935
  activeViteCssCacheFiles.add(normalizeViteCssCacheKey(sourceFile));
3802
3936
  const outputCssHandlerOptions = getCssHandlerOptions(outputFile);
@@ -3806,17 +3940,21 @@ async function processRememberedCssReplay(options) {
3806
3940
  };
3807
3941
  const scopedSourceCandidateGetter = createScopedSourceCandidateGetter(outputFile, cssHandlerOptions);
3808
3942
  const scopedSourceCandidateSourceGetter = createScopedSourceCandidateSourceGetter(outputFile, cssHandlerOptions);
3809
- const scopedGeneratorRuntime = await createScopedGeneratorRuntime(outputFile, cssHandlerOptions, generatorRuntime, rawSource, sourceFile);
3810
- const cssRuntimeSignature = createCssRuntimeSignature(require_source_candidate_scan_signature.createCandidateSignature(scopedGeneratorRuntime), await require_source_candidate_scan_signature.createScopedGeneratorCandidateSignature(rawSource, sourceFile, require_source_candidate_scan_signature.createCandidateSignature(scopedGeneratorRuntime), scopedSourceCandidateGetter, {
3943
+ const scopedGeneratorRuntime = await createScopedGeneratorRuntime(outputFile, cssHandlerOptions, generatorRuntime, generatorRawSource, sourceFile);
3944
+ const cssRuntimeSignature = createCssRuntimeSignature(require_source_candidate_scan_signature.createCandidateSignature(scopedGeneratorRuntime), await require_source_candidate_scan_signature.createScopedGeneratorCandidateSignature(generatorRawSource, sourceFile, require_source_candidate_scan_signature.createCandidateSignature(scopedGeneratorRuntime), scopedSourceCandidateGetter, {
3811
3945
  includeFallbackSignature: cssHandlerOptions.isMainChunk,
3812
3946
  majorVersion: runtimeState.tailwindRuntime.majorVersion
3813
3947
  }));
3814
3948
  const cssRuntimeAffectingHash = cache.computeHash(require_source_candidate_scan_signature.createRuntimeAffectingSourceSignature(rawSource, "css"));
3815
3949
  const rememberedCssRuntimeSignature = createRememberedCssRuntimeSignature(cssRuntimeSignature, cssRuntimeAffectingHash);
3816
- const previousCss = useIncrementalMode && getLastCssSourceHash(lastCssSourceHashByFile, outputFile) === cssRuntimeAffectingHash ? getLastCssResult(lastCssResultByFile, outputFile) : void 0;
3950
+ const rawSourceHash = cache.computeHash(rawSource);
3951
+ const previousRawSourceHash = lastCssRawSourceHashByFile.get(outputFile);
3952
+ const cssSourceChanged = changedCssFiles.has(outputFile) || changedCssFiles.has(sourceFile) || previousRawSourceHash != null && previousRawSourceHash !== rawSourceHash;
3953
+ const previousCss = useIncrementalMode && !cssSourceChanged && getLastCssSourceHash(lastCssSourceHashByFile, outputFile) === cssRuntimeAffectingHash ? getLastCssResult(lastCssResultByFile, outputFile) : void 0;
3817
3954
  const allRememberedSignaturesFresh = rememberedKeys.length > 0 && rememberedKeys.every((key) => getRememberedCssSignature?.(key) === rememberedCssRuntimeSignature);
3818
3955
  if (bundleFiles.includes(outputFile) || bundleFiles.includes(sourceFile) || allRememberedSignaturesFresh) continue;
3819
- const sourceTraceTokenSources = scopedSourceCandidateSourceGetter ? require_hmr_timing.createCssTokenSourceMap(scopedSourceCandidateSourceGetter(void 0), opts) : void 0;
3956
+ const sourceTraceSources = scopedSourceCandidateSourceGetter ? await require_source_candidate_scan_signature.createScopedGeneratorSourceTraceMap(generatorRawSource, sourceFile, scopedSourceCandidateSourceGetter) : void 0;
3957
+ const sourceTraceTokenSources = sourceTraceSources ? require_hmr_timing.createCssTokenSourceMap(sourceTraceSources, opts) : void 0;
3820
3958
  const annotateCss = (css) => require_hmr_timing.annotateCssSourceTrace(css, {
3821
3959
  opts,
3822
3960
  tokenSources: sourceTraceTokenSources
@@ -3824,13 +3962,32 @@ async function processRememberedCssReplay(options) {
3824
3962
  const shouldRecordRememberedReplayCss = useIncrementalMode || isNativeAppStyleTarget;
3825
3963
  const shouldEmitRememberedReplayCssAsset = shouldRecordRememberedReplayCss;
3826
3964
  if (!shouldRecordRememberedReplayCss) continue;
3965
+ if (!isWebGeneratorTarget && (0, _weapp_tailwindcss_postcss.isPureLocalCssImportWrapper)(rawSource)) {
3966
+ cssTaskFactories.push(() => timeTask("css.replay", async () => {
3967
+ const start = performance.now();
3968
+ const css = annotateCss(require_hmr_timing.normalizeMiniProgramImportShell(rawSource));
3969
+ lastCssRawSourceHashByFile.set(outputFile, rawSourceHash);
3970
+ rememberLastCssResult(lastCssResultByFile, lastCssSourceHashByFile, outputFile, css, cssRuntimeAffectingHash);
3971
+ for (const key of rememberedKeys) setRememberedCssSignature?.(key, rememberedCssRuntimeSignature);
3972
+ recordCssAssetResult?.(outputFile, css);
3973
+ if (shouldEmitRememberedReplayCssAsset) {
3974
+ const replayAsset = emitOrReplayCssAsset(outputFile, css);
3975
+ if (replayAsset) markCssAssetProcessed?.(replayAsset, outputFile);
3976
+ }
3977
+ metrics.css.elapsed += measureElapsed(start);
3978
+ metrics.css.transformed++;
3979
+ onUpdate(outputFile, rawSource, css);
3980
+ debug("css replay preserve local import shell: %s", outputFile);
3981
+ }));
3982
+ continue;
3983
+ }
3827
3984
  cssTaskFactories.push(() => timeTask("css.replay", async () => {
3828
3985
  const start = performance.now();
3829
3986
  const generated = await require_source_candidate_scan_signature.generateTailwindV4Css({
3830
3987
  opts,
3831
3988
  runtimeState,
3832
3989
  runtime: scopedGeneratorRuntime,
3833
- rawSource,
3990
+ rawSource: generatorRawSource,
3834
3991
  file: sourceFile,
3835
3992
  outputFile,
3836
3993
  cssHandlerOptions,
@@ -3841,7 +3998,8 @@ async function processRememberedCssReplay(options) {
3841
3998
  debug,
3842
3999
  previousCss
3843
4000
  });
3844
- const css = annotateCss(generated?.css ?? (await styleHandler(rawSource, cssHandlerOptions)).css);
4001
+ const css = annotateCss(generated?.css ?? (await styleHandler(generatorRawSource, cssHandlerOptions)).css);
4002
+ lastCssRawSourceHashByFile.set(outputFile, rawSourceHash);
3845
4003
  rememberLastCssResult(lastCssResultByFile, lastCssSourceHashByFile, outputFile, css, cssRuntimeAffectingHash);
3846
4004
  for (const key of rememberedKeys) setRememberedCssSignature?.(key, rememberedCssRuntimeSignature);
3847
4005
  if (generated) {
@@ -3852,6 +4010,10 @@ async function processRememberedCssReplay(options) {
3852
4010
  injectIntoMain: outputCssHandlerOptions.isMainChunk ? false : shouldInjectReplayCssIntoMain,
3853
4011
  outputFile
3854
4012
  });
4013
+ if (outputFile !== sourceFile) recordViteProcessedCssAssetResult?.(outputFile, css, {
4014
+ injectIntoMain: outputCssHandlerOptions.isMainChunk ? false : shouldInjectReplayCssIntoMain,
4015
+ outputFile
4016
+ });
3855
4017
  debug("css replay generated result: %s bytes=%d", outputFile, css.length);
3856
4018
  }
3857
4019
  if (shouldEmitRememberedReplayCssAsset) {
@@ -4110,37 +4272,119 @@ function createStableTextSignature(input) {
4110
4272
  }
4111
4273
  return (hash >>> 0).toString(36);
4112
4274
  }
4275
+ function parseQuotedRequest(params) {
4276
+ const input = params.trim();
4277
+ const quote = input[0];
4278
+ if (quote !== "\"" && quote !== "'") return;
4279
+ let escaped = false;
4280
+ for (let index = 1; index < input.length; index++) {
4281
+ const char = input[index];
4282
+ if (escaped) {
4283
+ escaped = false;
4284
+ continue;
4285
+ }
4286
+ if (char === "\\") {
4287
+ escaped = true;
4288
+ continue;
4289
+ }
4290
+ if (char === quote) return input.slice(1, index);
4291
+ }
4292
+ }
4293
+ function parseSourceParams(params) {
4294
+ let input = params.trim();
4295
+ let negated = false;
4296
+ if (input.startsWith("not ")) {
4297
+ negated = true;
4298
+ input = input.slice(4).trim();
4299
+ }
4300
+ if (input.startsWith("inline(") && input.endsWith(")")) return {
4301
+ prefix: negated ? "source:inline:not" : "source:inline",
4302
+ value: input.slice(7, -1).trim()
4303
+ };
4304
+ const request = parseQuotedRequest(input);
4305
+ if (!request) return;
4306
+ return {
4307
+ prefix: negated ? "source:not" : "source",
4308
+ value: request
4309
+ };
4310
+ }
4311
+ function parseTailwindImportSource(params) {
4312
+ if (parseQuotedRequest(params) !== "tailwindcss") return;
4313
+ return /\bsource\(([^)]*)\)/.exec(params)?.[1]?.trim();
4314
+ }
4315
+ function hasExplicitTailwindV4Directive(source) {
4316
+ try {
4317
+ let found = false;
4318
+ _weapp_tailwindcss_postcss.postcss.parse(source).walkAtRules((rule) => {
4319
+ if (rule.name === "config" || rule.name === "source" || rule.name === "plugin" || rule.name === "custom-variant" || rule.name === "theme" || rule.name === "utility" || rule.name === "variant" || rule.name === "apply") {
4320
+ found = true;
4321
+ return false;
4322
+ }
4323
+ });
4324
+ return found;
4325
+ } catch {
4326
+ return false;
4327
+ }
4328
+ }
4113
4329
  function collectTailwindV4SourceFingerprint(source) {
4114
4330
  const tokens = /* @__PURE__ */ new Set();
4115
4331
  const add = (prefix, value) => {
4116
4332
  tokens.add(`${prefix}:${value.trim()}`);
4117
4333
  };
4118
- for (const match of source.matchAll(/@config\s+(["'])(.+?)\1\s*;?/g)) {
4119
- const configRequest = match[2];
4120
- add("config", node_path.default.basename(configRequest));
4121
- add("config-request", configRequest.replace(/\\/g, "/"));
4122
- }
4123
- for (const match of source.matchAll(/@source\s+(not\s+)?(["'])(.+?)\2\s*;?/g)) add(match[1] ? "source:not" : "source", match[3]);
4124
- for (const match of source.matchAll(/@plugin\s+(["'])(.+?)\1\s*(?:\{([\s\S]*?)\}|;)/g)) {
4125
- const request = match[2];
4126
- const optionBlock = match[3];
4127
- add("plugin", request);
4128
- add("plugin-request", request.replace(/\\/g, "/"));
4129
- if (optionBlock !== void 0) add("plugin-options", `${request}:${createStableTextSignature(optionBlock)}`);
4130
- }
4131
4334
  try {
4132
- _weapp_tailwindcss_postcss.postcss.parse(source).walkAtRules("plugin", (rule) => {
4133
- const request = /^(['"])(.+?)\1/.exec(rule.params.trim())?.[2];
4134
- if (!request || !rule.nodes?.length) return;
4135
- rule.walkDecls((decl) => {
4136
- add("plugin-option", `${request}:${decl.prop}:${decl.value}`);
4137
- });
4335
+ const root = _weapp_tailwindcss_postcss.postcss.parse(source);
4336
+ root.walkAtRules((rule) => {
4337
+ if (rule.name === "import") {
4338
+ const sourceMode = parseTailwindImportSource(rule.params);
4339
+ if (sourceMode) add("import-source", sourceMode);
4340
+ return;
4341
+ }
4342
+ if (rule.name === "config") {
4343
+ const configRequest = parseQuotedRequest(rule.params);
4344
+ if (configRequest) {
4345
+ add("config", node_path.default.basename(configRequest));
4346
+ add("config-request", configRequest.replace(/\\/g, "/"));
4347
+ }
4348
+ return;
4349
+ }
4350
+ if (rule.name === "source") {
4351
+ const parsed = parseSourceParams(rule.params);
4352
+ if (parsed) add(parsed.prefix, parsed.value);
4353
+ return;
4354
+ }
4355
+ if (rule.name === "plugin") {
4356
+ const request = parseQuotedRequest(rule.params);
4357
+ if (!request) return;
4358
+ add("plugin", request);
4359
+ add("plugin-request", request.replace(/\\/g, "/"));
4360
+ if (rule.nodes?.length) {
4361
+ add("plugin-options", `${request}:${createStableTextSignature(rule.toString())}`);
4362
+ rule.walkDecls((decl) => {
4363
+ add("plugin-option", `${request}:${decl.prop}:${decl.value}`);
4364
+ });
4365
+ }
4366
+ return;
4367
+ }
4368
+ if (rule.name === "custom-variant") {
4369
+ const [name] = rule.params.trim().split(/\s+/, 1);
4370
+ if (name) add("custom-variant", name);
4371
+ return;
4372
+ }
4373
+ if (rule.name === "theme" || rule.name === "utility" || rule.name === "variant" || rule.name === "layer") {
4374
+ const [name] = rule.params.trim().split(/\s+/, 1);
4375
+ if (name) add("directive", name);
4376
+ }
4377
+ });
4378
+ root.walkDecls((decl) => {
4379
+ if (decl.prop.startsWith("--")) add("theme-token", decl.prop);
4380
+ });
4381
+ root.walkRules((rule) => {
4382
+ for (const selector of rule.selectors ?? []) {
4383
+ const match = /\.([_a-z][\w-]*)/i.exec(selector);
4384
+ if (match?.[1]) add("selector", match[1]);
4385
+ }
4138
4386
  });
4139
4387
  } catch {}
4140
- for (const match of source.matchAll(/@custom-variant\s+([^{\s]+)/g)) add("custom-variant", match[1]);
4141
- for (const match of source.matchAll(/@(?:theme|utility|variant|layer)\s+([^{;\s]+)/g)) add("directive", match[1]);
4142
- for (const match of source.matchAll(/--[\w-]+(?=\s*:)/g)) add("theme-token", match[0]);
4143
- for (const match of source.matchAll(/\.([_a-z][\w-]*)\s*[{,]/gi)) add("selector", match[1]);
4144
4388
  return tokens;
4145
4389
  }
4146
4390
  function scoreConfiguredTailwindV4SourceForRawSource(rawSource, entrySource) {
@@ -4156,7 +4400,7 @@ function selectTailwindV4GenerationCssSourceForOutput(outputFile, entries, rawSo
4156
4400
  const generationSources = entries.filter((entry) => hasTailwindGenerationSource(entry.source));
4157
4401
  if (generationSources.length <= 1) return generationSources[0];
4158
4402
  const canMatchByOutputPath = Boolean(options.cwd || options.outputRoot || options.projectRoot);
4159
- const selectByOutputPath = (candidates) => {
4403
+ const selectByOutputPath = (candidates, shouldUseScore = (score) => score > 0) => {
4160
4404
  if (!canMatchByOutputPath) return;
4161
4405
  const scoredSources = candidates.map((entry) => ({
4162
4406
  entry,
@@ -4165,7 +4409,7 @@ function selectTailwindV4GenerationCssSourceForOutput(outputFile, entries, rawSo
4165
4409
  outputRoot: options.outputRoot,
4166
4410
  projectRoot: options.projectRoot
4167
4411
  })
4168
- })).filter((item) => item.score > 0).sort((a, b) => b.score - a.score);
4412
+ })).filter((item) => shouldUseScore(item.score)).sort((a, b) => b.score - a.score);
4169
4413
  const bestScore = scoredSources[0]?.score;
4170
4414
  const bestSources = bestScore ? scoredSources.filter((item) => item.score === bestScore) : [];
4171
4415
  return bestSources.length === 1 ? bestSources[0]?.entry : void 0;
@@ -4179,10 +4423,12 @@ function selectTailwindV4GenerationCssSourceForOutput(outputFile, entries, rawSo
4179
4423
  const bestSources = bestScore ? scoredSources.filter((item) => item.score === bestScore) : [];
4180
4424
  return bestSources.length === 1 ? bestSources[0]?.entry : void 0;
4181
4425
  };
4426
+ const explicitSources = generationSources.filter((entry) => hasExplicitTailwindV4Directive(entry.source));
4427
+ const candidates = explicitSources.length === 1 ? explicitSources : generationSources;
4428
+ const directoryIndexOutputPathMatched = selectByOutputPath(candidates, (score) => score >= 25e3 && score < 5e4);
4429
+ if (directoryIndexOutputPathMatched) return directoryIndexOutputPathMatched;
4182
4430
  const rawSourceMatched = selectByRawSourceFingerprint(generationSources);
4183
4431
  if (rawSourceMatched) return rawSourceMatched;
4184
- const explicitSources = generationSources.filter((entry) => /@(?:config|source|plugin|custom-variant|theme|utility|variant|apply)\b/.test(entry.source));
4185
- const candidates = explicitSources.length === 1 ? explicitSources : generationSources;
4186
4432
  const outputPathMatched = selectByOutputPath(candidates);
4187
4433
  if (outputPathMatched) return outputPathMatched;
4188
4434
  if (candidates.length === 1) return candidates[0];
@@ -4201,8 +4447,7 @@ function createTemporaryCssAssetSourceResolver(entries) {
4201
4447
  const seenEntryFiles = /* @__PURE__ */ new Set();
4202
4448
  const queuedEntries = entries.filter((entry) => {
4203
4449
  const entryFile = normalizeCssSourceKey(entry.file);
4204
- const outputFile = normalizeCssSourceKey(entry.outputFile);
4205
- if (outputFile === entryFile || !outputFile.includes("/") || seenEntryFiles.has(entryFile)) return false;
4450
+ if (normalizeCssSourceKey(entry.outputFile) === entryFile || seenEntryFiles.has(entryFile)) return false;
4206
4451
  seenEntryFiles.add(entryFile);
4207
4452
  return true;
4208
4453
  });
@@ -4215,14 +4460,18 @@ function createTemporaryCssAssetSourceResolver(entries) {
4215
4460
  },
4216
4461
  resolve(outputFile, rawSource) {
4217
4462
  if (!isTemporaryCssAssetFile(outputFile)) return;
4218
- const availableEntries = queuedEntries.filter((item) => !usedEntryFiles.has(normalizeCssSourceKey(item.file)));
4463
+ const outputFileKey = normalizeCssSourceKey(outputFile);
4464
+ const unusedEntries = queuedEntries.filter((item) => !usedEntryFiles.has(normalizeCssSourceKey(item.file)));
4465
+ const matchedOutputEntries = unusedEntries.filter((item) => normalizeCssSourceKey(item.outputFile) === outputFileKey);
4466
+ const usesMatchedOutputEntries = matchedOutputEntries.length > 0;
4467
+ const availableEntries = matchedOutputEntries.length > 0 ? matchedOutputEntries : unusedEntries.filter((item) => normalizeCssSourceKey(item.outputFile).includes("/"));
4219
4468
  const scoredEntries = rawSource ? availableEntries.map((entry) => ({
4220
4469
  entry,
4221
4470
  score: scoreConfiguredTailwindV4SourceForRawSource(rawSource, entry.source)
4222
4471
  })).filter((item) => item.score > 0).sort((a, b) => b.score - a.score) : [];
4223
4472
  const bestScore = scoredEntries[0]?.score;
4224
4473
  const bestEntries = bestScore ? scoredEntries.filter((item) => item.score === bestScore) : [];
4225
- const entry = bestEntries.length === 1 ? bestEntries[0]?.entry : availableEntries.find((item) => hasTailwindGenerationSource(item.source));
4474
+ const entry = bestEntries.length === 1 ? bestEntries[0]?.entry : usesMatchedOutputEntries || rawSource == null ? availableEntries.find((item) => hasTailwindGenerationSource(item.source)) : void 0;
4226
4475
  if (!entry) return;
4227
4476
  usedEntryFiles.add(normalizeCssSourceKey(entry.file));
4228
4477
  return {
@@ -4396,6 +4645,19 @@ function resolveSourceRootFromBundleGraph(config, bundle) {
4396
4645
  return sourceRoots.size === 1 ? [...sourceRoots][0] : void 0;
4397
4646
  }
4398
4647
  //#endregion
4648
+ //#region src/bundlers/vite/web-css-compat.ts
4649
+ /**
4650
+ * Web target 的 Tailwind 兼容转换由 generator-css 负责;Vite 外层只处理非 Web 生成目标
4651
+ * 落到 WebView 产物时的最终兼容需求,避免同一份 CSS 在 dev/build 中被重复解析转换。
4652
+ */
4653
+ function shouldApplyViteWebCssCompat(context, strategy) {
4654
+ if (strategy?.shouldApplyWebCssCompat?.(context) !== true) return false;
4655
+ return !context.currentGeneratorBranch.isWeb || context.currentGeneratorOptions.webCompat !== void 0;
4656
+ }
4657
+ function resolveViteWebCssCompatOptions(context) {
4658
+ return context.currentGeneratorBranch.isWeb ? context.currentGeneratorOptions.webCompat : context.currentGeneratorOptions.webCompat ?? true;
4659
+ }
4660
+ //#endregion
4399
4661
  //#region src/bundlers/vite/generate-bundle.ts
4400
4662
  function inferPlatformFromViteOutDir$1(outDir) {
4401
4663
  const segment = outDir ? node_path.default.basename(node_path.default.normalize(outDir)) : void 0;
@@ -4407,6 +4669,7 @@ function createGenerateBundleHook(context) {
4407
4669
  const state = require_source_candidate_scan_signature.createBundleBuildState();
4408
4670
  const lastCssResultByFile = /* @__PURE__ */ new Map();
4409
4671
  const lastCssSourceHashByFile = /* @__PURE__ */ new Map();
4672
+ const lastCssRawSourceHashByFile = /* @__PURE__ */ new Map();
4410
4673
  let currentOutDir;
4411
4674
  let currentSubpackageRoots;
4412
4675
  const createInitialCssPipelineContext = (file) => {
@@ -4479,14 +4742,14 @@ function createGenerateBundleHook(context) {
4479
4742
  resolveStylePlatform: () => generatorPlatform
4480
4743
  };
4481
4744
  const isWebGeneratorTarget = generatorBranch.isWeb;
4482
- const shouldApplyWebCssCompat = context.cssPipelineStrategy?.shouldApplyWebCssCompat?.(cssPipelineContext) === true;
4745
+ const shouldApplyWebCssCompat = shouldApplyViteWebCssCompat(cssPipelineContext, context.cssPipelineStrategy);
4483
4746
  const transformWebTargetCss = (css) => {
4484
4747
  return context.cssPipelineStrategy?.transformGeneratedCss?.(css, {
4485
4748
  ...cssPipelineContext,
4486
- defaultWebCssCompat: (value) => (0, _weapp_tailwindcss_postcss.transformWebCssCompat)(value, isWebGeneratorTarget ? generatorOptions.webCompat : generatorOptions.webCompat ?? true),
4749
+ defaultWebCssCompat: (value) => (0, _weapp_tailwindcss_postcss.transformWebCssCompat)(value, resolveViteWebCssCompatOptions(cssPipelineContext)),
4487
4750
  removeScopedPreflight: (value) => value,
4488
4751
  shouldApplyWebCssCompat
4489
- }) ?? (shouldApplyWebCssCompat ? (0, _weapp_tailwindcss_postcss.transformWebCssCompat)(css, isWebGeneratorTarget ? generatorOptions.webCompat : generatorOptions.webCompat ?? true) : css);
4752
+ }) ?? (shouldApplyWebCssCompat ? (0, _weapp_tailwindcss_postcss.transformWebCssCompat)(css, resolveViteWebCssCompatOptions(cssPipelineContext)) : css);
4490
4753
  };
4491
4754
  const isNativeAppStyleTarget = context.cssPipelineStrategy?.isNativeAppStyleTarget?.(cssPipelineContext) === true;
4492
4755
  const isHarmonyAppStyleTarget = context.cssPipelineStrategy?.isHarmonyAppStyleTarget?.(cssPipelineContext) === true;
@@ -4497,6 +4760,9 @@ function createGenerateBundleHook(context) {
4497
4760
  const sourceRoot = resolveWeappViteSourceRoot(resolvedConfig, opts.appType) ?? resolveSourceRootFromBundleGraph(resolvedConfig, bundle);
4498
4761
  const outDir = resolvedConfig?.build?.outDir ? node_path.default.resolve(rootDir, resolvedConfig.build.outDir) : rootDir;
4499
4762
  const defaultStyleOutputExtension = resolveMiniProgramStyleOutputExtension({ files: Object.keys(bundle) });
4763
+ const normalizeMiniProgramGeneratorRawSource = (source, outputFile) => {
4764
+ return isWebGeneratorTarget ? source : require_hmr_timing.normalizeMiniProgramGeneratorCssSource(source, outputFile);
4765
+ };
4500
4766
  await runtimeState.readyPromise;
4501
4767
  debug("start");
4502
4768
  onStart();
@@ -4522,7 +4788,7 @@ function createGenerateBundleHook(context) {
4522
4788
  timingDetails[name] = (timingDetails[name] ?? 0) + Math.max(0, performance.now() - startedAt);
4523
4789
  };
4524
4790
  const timeTask = createBundleTaskTimer(recordTimingDetail);
4525
- const emitOrReplayCssAsset = createCssAssetEmitter(this);
4791
+ const emitOrReplayCssAsset = createCssAssetEmitter(this, bundle);
4526
4792
  const metrics = createEmptyMetrics();
4527
4793
  const envFlags = resolveGenerateBundleEnvFlags();
4528
4794
  const bundleFiles = Object.keys(bundle);
@@ -4532,8 +4798,8 @@ function createGenerateBundleHook(context) {
4532
4798
  tailwindcssRuntimeOptions: {
4533
4799
  ...opts.tailwindcssRuntimeOptions ?? {},
4534
4800
  tailwindcss: {
4535
- ...require_v4_engine.resolveTailwindcssOptions(opts.tailwindcssRuntimeOptions) ?? {},
4536
- ...require_v4_engine.resolveTailwindcssOptions(runtimeState.tailwindRuntime.options) ?? {}
4801
+ ...require_generator.resolveTailwindcssOptions(opts.tailwindcssRuntimeOptions) ?? {},
4802
+ ...require_generator.resolveTailwindcssOptions(runtimeState.tailwindRuntime.options) ?? {}
4537
4803
  }
4538
4804
  }
4539
4805
  }, opts.tailwindcssBasedir ?? rootDir);
@@ -4562,8 +4828,8 @@ function createGenerateBundleHook(context) {
4562
4828
  const cleanFile = file.replace(/[?#].*$/, "");
4563
4829
  return normalizeSystemAliasPathKey(require_source_candidate_scan_signature.normalizeOutputPathKey(node_path.default.isAbsolute(cleanFile) ? node_path.default.resolve(cleanFile) : node_path.default.resolve(opts.tailwindcssBasedir ?? rootDir, cleanFile)));
4564
4830
  };
4565
- const runtimeTailwindcssOptions = require_v4_engine.resolveTailwindcssOptions(opts.tailwindcssRuntimeOptions);
4566
- const tailwindRuntimeOptions = require_v4_engine.resolveTailwindcssOptions(runtimeState.tailwindRuntime.options);
4831
+ const runtimeTailwindcssOptions = require_generator.resolveTailwindcssOptions(opts.tailwindcssRuntimeOptions);
4832
+ const tailwindRuntimeOptions = require_generator.resolveTailwindcssOptions(runtimeState.tailwindRuntime.options);
4567
4833
  const configuredTailwindV4CssSourceFileKeysForScope = new Set(configuredTailwindV4CssSourceEntriesForScope.map((entry) => normalizeConfiguredTailwindV4CssEntryFileKey(entry.file)));
4568
4834
  const configuredTailwindV4ExplicitCssEntryFileKeysForScope = new Set([
4569
4835
  ...Array.isArray(opts.cssEntries) ? opts.cssEntries : [],
@@ -4589,15 +4855,20 @@ function createGenerateBundleHook(context) {
4589
4855
  });
4590
4856
  };
4591
4857
  const resolveConfiguredTailwindV4CssEntryOutputFile = (sourceFile) => resolveViteCssPipelineOutputFile(sourceFile, opts, rootDir, isWebGeneratorTarget, shouldPreserveAppCssExtension, sourceRoot, defaultStyleOutputExtension, bundleFiles);
4592
- const selectConfiguredRootCssSourceEntry = (outputFile, entries, originalFileNames) => {
4593
- const matchedOriginalEntry = entries.find((entry) => originalFileNames?.some((originalFile) => normalizeConfiguredTailwindV4CssEntryFileKey(originalFile) === normalizeConfiguredTailwindV4CssEntryFileKey(entry.file)) === true);
4594
- if (matchedOriginalEntry && outputFile.replace(/[?#].*$/, "").endsWith(".css")) return matchedOriginalEntry;
4595
- if (!(context.cssPipelineStrategy?.shouldSelectConfiguredCssEntryRootSource?.({
4858
+ const shouldSelectConfiguredRootCssOutput = (outputFile) => {
4859
+ if (!opts.cssMatcher(outputFile) || !isRootStyleOutputFile(outputFile)) return false;
4860
+ return context.cssPipelineStrategy?.shouldSelectConfiguredCssEntryRootSource?.({
4596
4861
  ...cssPipelineContext,
4597
4862
  isRootStyleOutputFile,
4598
4863
  outputFile
4599
- }) === true || cssPipelineContext.currentGeneratorBranch.isWeb && opts.cssMatcher(outputFile) && isRootStyleOutputFile(outputFile))) return;
4600
- const generationEntries = entries.filter((entry) => hasTailwindGenerationSource(entry.source));
4864
+ }) === true || cssPipelineContext.currentGeneratorBranch.isWeb;
4865
+ };
4866
+ const selectConfiguredRootCssSourceEntry = (outputFile, entries, originalFileNames) => {
4867
+ const matchedOriginalEntry = entries.find((entry) => originalFileNames?.some((originalFile) => normalizeConfiguredTailwindV4CssEntryFileKey(originalFile) === normalizeConfiguredTailwindV4CssEntryFileKey(entry.file)) === true);
4868
+ if (matchedOriginalEntry && outputFile.replace(/[?#].*$/, "").endsWith(".css")) return matchedOriginalEntry;
4869
+ if (!shouldSelectConfiguredRootCssOutput(outputFile)) return;
4870
+ const shouldRequireExplicitConfiguredEntry = !cssPipelineContext.currentGeneratorBranch.isWeb && opts.cssMatcher(outputFile) && isRootStyleOutputFile(outputFile);
4871
+ const generationEntries = entries.filter((entry) => hasTailwindGenerationSource(entry.source) && (!shouldRequireExplicitConfiguredEntry || configuredTailwindV4ExplicitCssEntryFileKeysForScope.has(normalizeConfiguredTailwindV4CssEntryFileKey(entry.file))));
4601
4872
  if (generationEntries.length <= 1) return generationEntries[0];
4602
4873
  const rootOutputEntries = generationEntries.filter((entry) => {
4603
4874
  return !require_source_candidate_scan_signature.normalizeOutputPathKey(resolveConfiguredTailwindV4CssEntryOutputFile(entry.file).replace(/[?#].*$/, "")).includes("/");
@@ -4610,6 +4881,35 @@ function createGenerateBundleHook(context) {
4610
4881
  if (mainPackageEntries.length === 1) return mainPackageEntries[0];
4611
4882
  }
4612
4883
  };
4884
+ const resolveConfiguredRootCssSourceStyle = (outputFile, entries, originalFileNames) => {
4885
+ const entry = selectConfiguredRootCssSourceEntry(outputFile, entries, originalFileNames);
4886
+ return entry ? {
4887
+ outputFile,
4888
+ rawSource: entry.source,
4889
+ sourceFile: entry.file
4890
+ } : void 0;
4891
+ };
4892
+ const shouldKeepCurrentRootMiniProgramStyleOutputAsImportShell = (outputFile, css) => {
4893
+ const normalizedOutputFile = require_source_candidate_scan_signature.normalizeOutputPathKey(outputFile.replace(/[?#].*$/, ""));
4894
+ return opts.cssMatcher(outputFile) && isMiniProgramStyleOutputFile(outputFile) && !normalizedOutputFile.includes("/") && shouldKeepRootMiniProgramStyleAsImportShell(context.cssPipelineStrategy?.shouldKeepRootMiniProgramStyleAsImportShell?.({
4895
+ ...cssPipelineContext,
4896
+ css,
4897
+ file: outputFile
4898
+ }));
4899
+ };
4900
+ const shouldKeepCurrentRootCssOutputForConfiguredSource = (sourceFile, outputFile) => {
4901
+ const normalizedOutputFile = require_source_candidate_scan_signature.normalizeOutputPathKey(outputFile.replace(/[?#].*$/, ""));
4902
+ const isRootConfiguredStyleOutput = normalizedOutputFile.endsWith(".css") ? isRootStyleOutputFile(outputFile) : isMiniProgramStyleOutputFile(outputFile) && !normalizedOutputFile.includes("/");
4903
+ return typeof sourceFile === "string" && opts.cssMatcher(outputFile) && isRootConfiguredStyleOutput && !shouldKeepCurrentRootMiniProgramStyleOutputAsImportShell(outputFile) && configuredTailwindV4ExplicitCssEntryFileKeysForScope.has(normalizeConfiguredTailwindV4CssEntryFileKey(sourceFile));
4904
+ };
4905
+ const hasExplicitConfiguredRootCssEntryForOutput = (outputFile) => {
4906
+ if (cssPipelineContext.currentGeneratorBranch.isWeb || !opts.cssMatcher(outputFile) || !isRootStyleOutputFile(outputFile) || !shouldSelectConfiguredRootCssOutput(outputFile)) return false;
4907
+ return configuredTailwindV4CssSourceEntriesForScope.some((entry) => {
4908
+ if (!configuredTailwindV4ExplicitCssEntryFileKeysForScope.has(normalizeConfiguredTailwindV4CssEntryFileKey(entry.file))) return false;
4909
+ const entryOutputFile = resolveConfiguredTailwindV4CssEntryOutputFile(entry.file);
4910
+ return !require_source_candidate_scan_signature.normalizeOutputPathKey(entryOutputFile.replace(/[?#].*$/, "")).includes("/") || currentSubpackageRoots != null && !isSubpackageOutputFile(entryOutputFile, currentSubpackageRoots);
4911
+ });
4912
+ };
4613
4913
  const { createScopedSourceCandidateGetter, createScopedSourceCandidateSourceGetter, shouldExcludeSubpackageSourceCandidates, shouldInjectCssIntoMainFromOutput } = createSubpackageSourceCandidateScope({
4614
4914
  cssSourceFiles: configuredTailwindV4CssSourceEntriesForScope.map((entry) => entry.file),
4615
4915
  getSourceCandidateSourcesForEntries,
@@ -4661,8 +4961,8 @@ function createGenerateBundleHook(context) {
4661
4961
  }) : await context.ensureRuntimeClassSet(envFlags.forceRuntimeRefreshByEnv);
4662
4962
  const shouldFilterTailwindV4MiniProgramCandidates = require_generator.shouldUseMiniProgramCssBranch(generatorBranch);
4663
4963
  const collectedGeneratorCandidates = /* @__PURE__ */ new Set([...runtime, ...sourceCandidates]);
4664
- const filteredGeneratorCandidates = shouldFilterTailwindV4MiniProgramCandidates ? require_v4_engine.filterUnsupportedMiniProgramTailwindV4Candidates(collectedGeneratorCandidates) : collectedGeneratorCandidates;
4665
- const filteredSourceCandidates = shouldFilterTailwindV4MiniProgramCandidates ? require_v4_engine.filterUnsupportedMiniProgramTailwindV4Candidates(sourceCandidates) : sourceCandidates;
4964
+ const filteredGeneratorCandidates = shouldFilterTailwindV4MiniProgramCandidates ? require_generator.filterUnsupportedMiniProgramTailwindV4Candidates(collectedGeneratorCandidates) : collectedGeneratorCandidates;
4965
+ const filteredSourceCandidates = shouldFilterTailwindV4MiniProgramCandidates ? require_generator.filterUnsupportedMiniProgramTailwindV4Candidates(sourceCandidates) : sourceCandidates;
4666
4966
  const transformRuntime = shouldFilterTailwindV4MiniProgramCandidates ? new Set(runtime) : new Set(filteredGeneratorCandidates);
4667
4967
  const generatorRuntime = filteredGeneratorCandidates;
4668
4968
  const cssEntries = snapshot.entries.filter((entry) => entry.type === "css" && entry.output.type === "asset");
@@ -4671,7 +4971,8 @@ function createGenerateBundleHook(context) {
4671
4971
  const mainCssEntry = cssEntries.find((entry) => getCssHandlerOptions(entry.file).isMainChunk) ?? cssEntries[0];
4672
4972
  if (mainCssEntry) {
4673
4973
  const mainCssRawSource = typeof mainCssEntry.output.source === "string" ? mainCssEntry.output.source : node_buffer.Buffer.from(mainCssEntry.output.source).toString();
4674
- if (!require_v4_engine.hasTailwindApplyDirective(mainCssRawSource)) {
4974
+ if (!require_generator.hasTailwindApplyDirective(mainCssRawSource)) {
4975
+ const validationRawSource = normalizeMiniProgramGeneratorRawSource(mainCssRawSource, mainCssEntry.file);
4675
4976
  const generatedCssSources = /* @__PURE__ */ new Set();
4676
4977
  for (const [, record] of getViteProcessedCssAssetResults?.() ?? []) if (typeof record === "string") generatedCssSources.add(record);
4677
4978
  else if (typeof record?.css === "string") generatedCssSources.add(record.css);
@@ -4679,7 +4980,7 @@ function createGenerateBundleHook(context) {
4679
4980
  opts,
4680
4981
  runtimeState,
4681
4982
  candidates: filteredSourceCandidates,
4682
- rawSource: mainCssRawSource,
4983
+ rawSource: validationRawSource,
4683
4984
  generatedCssSources,
4684
4985
  file: mainCssEntry.file,
4685
4986
  cssHandlerOptions: getCssHandlerOptions(mainCssEntry.file),
@@ -4697,6 +4998,9 @@ function createGenerateBundleHook(context) {
4697
4998
  const cssExtensionByStem = collectCssExtensionByStem(bundleFiles, opts.cssMatcher);
4698
4999
  const jsImportedCssFiles = collectJsImportedCssFiles(snapshot);
4699
5000
  const runtimeLinkedCssFiles = /* @__PURE__ */ new Set([...collectRuntimeLinkedCssFiles(snapshot, cssExtensionByStem, defaultStyleOutputExtension), ...jsImportedCssFiles]);
5001
+ const shouldQueueTemporaryCssSourceEntry = (sourceFile, outputFile) => {
5002
+ return require_source_candidate_scan_signature.normalizeOutputPathKey(outputFile).includes("/") || typeof sourceFile === "string" && shouldSelectConfiguredRootCssOutput(outputFile) && configuredTailwindV4ExplicitCssEntryFileKeysForScope.has(normalizeConfiguredTailwindV4CssEntryFileKey(sourceFile));
5003
+ };
4700
5004
  rememberRuntimeLinkedCssSources({
4701
5005
  bundleFiles,
4702
5006
  debug,
@@ -4719,7 +5023,7 @@ function createGenerateBundleHook(context) {
4719
5023
  ...[...runtimeLinkedCssFiles].filter((file) => !snapshot.sourceHashByFile.has(file)).map((file) => {
4720
5024
  const outputFile = resolveViteCssPipelineOutputFile(file, opts, rootDir, isWebGeneratorTarget, shouldPreserveAppCssExtension, sourceRoot, defaultStyleOutputExtension, bundleFiles);
4721
5025
  const inferredSourceStyle = resolveSourceStyleSourceFromOutputFile(outputFile, snapshot, outDir, sourceRoot, getCssSource, jsImportedCssFiles.has(file) ? getSourceCandidateSources : void 0, getConfiguredTailwindV4CssSourceEntries().map((entry) => [entry.file, entry.source]), debug);
4722
- return inferredSourceStyle && currentSubpackageRoots ? {
5026
+ return inferredSourceStyle && currentSubpackageRoots && shouldQueueTemporaryCssSourceEntry(inferredSourceStyle.sourceFile, outputFile) ? {
4723
5027
  file: inferredSourceStyle.sourceFile,
4724
5028
  outputFile,
4725
5029
  source: inferredSourceStyle.rawSource
@@ -4729,10 +5033,11 @@ function createGenerateBundleHook(context) {
4729
5033
  file: remembered.sourceFile,
4730
5034
  outputFile: remembered.outputFile,
4731
5035
  source: remembered.rawSource
4732
- })),
5036
+ })).filter((entry) => shouldQueueTemporaryCssSourceEntry(entry.file, entry.outputFile)),
4733
5037
  ...getConfiguredTailwindV4CssSourceEntries().map((entry) => {
4734
5038
  const outputFile = resolveMatchedCssSourceOutputFile(entry.file);
4735
- return outputFile ? {
5039
+ const isExplicitConfiguredEntry = configuredTailwindV4ExplicitCssEntryFileKeysForScope.has(normalizeConfiguredTailwindV4CssEntryFileKey(entry.file));
5040
+ return outputFile && (require_source_candidate_scan_signature.normalizeOutputPathKey(outputFile).includes("/") || isExplicitConfiguredEntry && shouldSelectConfiguredRootCssOutput(outputFile)) ? {
4736
5041
  file: entry.file,
4737
5042
  outputFile,
4738
5043
  source: entry.source
@@ -4909,6 +5214,7 @@ function createGenerateBundleHook(context) {
4909
5214
  return await refreshRememberedCssSource?.(remembered) ?? remembered;
4910
5215
  }));
4911
5216
  rememberedCssSources = rememberedCssSources.filter((remembered) => {
5217
+ if (hasExplicitConfiguredRootCssEntryForOutput(outputFile) && !configuredTailwindV4ExplicitCssEntryFileKeysForScope.has(normalizeConfiguredTailwindV4CssEntryFileKey(remembered.sourceFile))) return false;
4912
5218
  if (!configuredTailwindV4CssSourceFileKeysForScope.has(normalizeConfiguredTailwindV4CssEntryFileKey(remembered.sourceFile))) return true;
4913
5219
  const matchedOutputFile = resolveMatchedOutputFileForCurrentAsset(remembered.sourceFile);
4914
5220
  return !matchedOutputFile || require_source_candidate_scan_signature.normalizeOutputPathKey(matchedOutputFile) === require_source_candidate_scan_signature.normalizeOutputPathKey(outputFile);
@@ -4925,10 +5231,17 @@ function createGenerateBundleHook(context) {
4925
5231
  hasUsableRememberedTailwindSource = false;
4926
5232
  }
4927
5233
  let outputCssHandlerOptions = getCssHandlerOptions(outputFile);
4928
- if (isTemporaryCssAssetFile(outputFile) && hasTailwindGenerationSource(rawSource)) {
5234
+ const configuredRootSourceStyle = resolveConfiguredRootCssSourceStyle(outputFile, getConfiguredTailwindV4CssSourceEntries(), originalSource.originalFileNames);
5235
+ const hasExplicitRememberedRootSource = rememberedCssSources.some((remembered) => configuredTailwindV4ExplicitCssEntryFileKeysForScope.has(normalizeConfiguredTailwindV4CssEntryFileKey(remembered.sourceFile)));
5236
+ if (configuredRootSourceStyle && (!hasUsableRememberedTailwindSource || !hasExplicitRememberedRootSource)) {
5237
+ rememberedCssSources = [configuredRootSourceStyle];
5238
+ hasUsableRememberedTailwindSource = true;
5239
+ debug("source style source inferred from configured root tailwind v4 css source: %s -> %s", outputFile, configuredRootSourceStyle.sourceFile);
5240
+ }
5241
+ if (!hasUsableRememberedTailwindSource && isTemporaryCssAssetFile(outputFile) && hasTailwindGenerationSource(rawSource)) {
4929
5242
  const resolvedTemporarySource = temporaryCssAssetSourceResolver.resolve(outputFile, rawSource);
4930
5243
  if (resolvedTemporarySource) {
4931
- outputFile = resolveMatchedOutputFileForCurrentAsset(resolvedTemporarySource.sourceFile) ?? resolvedTemporarySource.outputFile;
5244
+ outputFile = shouldKeepCurrentRootCssOutputForConfiguredSource(resolvedTemporarySource.sourceFile, outputFile) ? outputFile : resolveMatchedOutputFileForCurrentAsset(resolvedTemporarySource.sourceFile) ?? resolvedTemporarySource.outputFile;
4932
5245
  activeViteCssCacheFiles.add(normalizeViteCssCacheKey(outputFile));
4933
5246
  outputCssHandlerOptions = getCssHandlerOptions(outputFile);
4934
5247
  outputCssHandlerOptions = {
@@ -4948,50 +5261,19 @@ function createGenerateBundleHook(context) {
4948
5261
  }
4949
5262
  if (!hasUsableRememberedTailwindSource) {
4950
5263
  const configuredTailwindV4CssSourceEntries = getConfiguredTailwindV4CssSourceEntries();
4951
- const inferredSourceStyle = resolveSourceStyleSourceFromOutputFile(outputFile, snapshot, outDir, sourceRoot, getCssSource, getSourceCandidateSources, configuredTailwindV4CssSourceEntries.map((entry) => [entry.file, entry.source]), debug);
4952
- const inferredWebviewRootSourceEntry = inferredSourceStyle ? void 0 : selectConfiguredRootCssSourceEntry(outputFile, configuredTailwindV4CssSourceEntries, originalSource.originalFileNames);
4953
- const inferredWebviewRootSourceStyle = inferredWebviewRootSourceEntry ? {
4954
- outputFile,
4955
- rawSource: inferredWebviewRootSourceEntry.source,
4956
- sourceFile: inferredWebviewRootSourceEntry.file
4957
- } : void 0;
4958
- const inferredOriginalSourceStyle = inferredSourceStyle ?? (outputFile === file ? void 0 : resolveSourceStyleSourceFromOutputFile(file, snapshot, outDir, sourceRoot, getCssSource, getSourceCandidateSources, configuredTailwindV4CssSourceEntries.map((entry) => [entry.file, entry.source]), debug)) ?? inferredWebviewRootSourceStyle;
4959
- if (inferredOriginalSourceStyle) {
4960
- outputFile = resolveMatchedOutputFileForCurrentAsset(inferredOriginalSourceStyle.sourceFile) ?? outputFile;
4961
- activeViteCssCacheFiles.add(normalizeViteCssCacheKey(outputFile));
4962
- outputCssHandlerOptions = getCssHandlerOptions(outputFile);
4963
- rememberedCssSources = [{
4964
- ...inferredOriginalSourceStyle,
4965
- outputFile
4966
- }];
4967
- } else if (isTemporaryCssAssetFile(outputFile) && configuredTailwindV4CssSourceEntries.length > 1) {
4968
- const resolvedTemporarySource = temporaryCssAssetSourceResolver.resolve(outputFile, rawSource);
4969
- if (resolvedTemporarySource) {
4970
- outputFile = resolveMatchedOutputFileForCurrentAsset(resolvedTemporarySource.sourceFile) ?? resolvedTemporarySource.outputFile;
4971
- activeViteCssCacheFiles.add(normalizeViteCssCacheKey(outputFile));
4972
- outputCssHandlerOptions = getCssHandlerOptions(outputFile);
4973
- outputCssHandlerOptions = {
4974
- ...outputCssHandlerOptions,
4975
- isMainChunk: false
4976
- };
4977
- resolvedFromTemporaryCssAsset = true;
4978
- usedConfiguredTailwindV4CssSourceFiles.add(require_source_candidate_scan_signature.normalizeOutputPathKey(resolvedTemporarySource.sourceFile));
4979
- rememberedCssSources = [{
4980
- outputFile,
4981
- rawSource: resolvedTemporarySource.rawSource,
4982
- sourceFile: resolvedTemporarySource.sourceFile
4983
- }];
4984
- debug("source style source inferred from temporary configured tailwind v4 css source: %s -> %s", outputFile, resolvedTemporarySource.sourceFile);
4985
- }
4986
- } else if (hasTailwindGenerationSource(rawSource) && (originalSource.originalFileNames?.length ?? 0) === 0) {
4987
- const availableConfiguredTailwindV4CssSourceEntries = configuredTailwindV4CssSourceEntries.filter((entry) => !usedConfiguredTailwindV4CssSourceFiles.has(require_source_candidate_scan_signature.normalizeOutputPathKey(entry.file)));
4988
- const configuredGenerationSource = selectTailwindV4GenerationCssSourceForOutput(outputFile, availableConfiguredTailwindV4CssSourceEntries, rawSource, {
5264
+ const isCurrentRootMiniProgramStyleOutput = opts.cssMatcher(outputFile) && isMiniProgramStyleOutputFile(outputFile) && !require_source_candidate_scan_signature.normalizeOutputPathKey(outputFile.replace(/[?#].*$/, "")).includes("/");
5265
+ if (isCurrentRootMiniProgramStyleOutput && hasTailwindGenerationSource(rawSource)) {
5266
+ const configuredGenerationSource = selectTailwindV4GenerationCssSourceForOutput(outputFile, configuredTailwindV4CssSourceEntries, rawSource, {
4989
5267
  cwd: opts.tailwindcssBasedir,
4990
5268
  outputRoot: outDir,
4991
5269
  projectRoot: sourceRoot ?? rootDir
4992
5270
  });
4993
- if (configuredGenerationSource && !hasViteProcessedCssResultForSource(configuredGenerationSource.file, getViteProcessedCssAssetResults)) {
4994
- outputFile = resolveMatchedOutputFileForCurrentAsset(configuredGenerationSource.file) ?? outputFile;
5271
+ const configuredGenerationOutputFile = configuredGenerationSource ? shouldKeepCurrentRootMiniProgramStyleOutputAsImportShell(outputFile, rawSource) ? resolveMatchedOutputFileForCurrentAsset(configuredGenerationSource.file) ?? outputFile : outputFile : void 0;
5272
+ const hasConfiguredGenerationSourceAlreadyUsed = configuredGenerationSource ? usedConfiguredTailwindV4CssSourceFiles.has(require_source_candidate_scan_signature.normalizeOutputPathKey(configuredGenerationSource.file)) : false;
5273
+ const hasConfiguredGenerationSourceAlreadyProcessed = configuredGenerationSource ? hasViteProcessedCssResultForSource(configuredGenerationSource.file, getViteProcessedCssAssetResults) : false;
5274
+ const shouldUseConfiguredGenerationSource = configuredGenerationSource && (!hasConfiguredGenerationSourceAlreadyUsed && !hasConfiguredGenerationSourceAlreadyProcessed || require_source_candidate_scan_signature.normalizeOutputPathKey(configuredGenerationOutputFile ?? outputFile) === require_source_candidate_scan_signature.normalizeOutputPathKey(outputFile));
5275
+ if (configuredGenerationSource && shouldUseConfiguredGenerationSource) {
5276
+ outputFile = configuredGenerationOutputFile ?? outputFile;
4995
5277
  activeViteCssCacheFiles.add(normalizeViteCssCacheKey(outputFile));
4996
5278
  outputCssHandlerOptions = getCssHandlerOptions(outputFile);
4997
5279
  usedConfiguredTailwindV4CssSourceFiles.add(require_source_candidate_scan_signature.normalizeOutputPathKey(configuredGenerationSource.file));
@@ -5000,9 +5282,70 @@ function createGenerateBundleHook(context) {
5000
5282
  rawSource: configuredGenerationSource.source,
5001
5283
  sourceFile: configuredGenerationSource.file
5002
5284
  }];
5285
+ hasUsableRememberedTailwindSource = true;
5003
5286
  debug("source style source inferred from scoped configured tailwind v4 css source: %s -> %s", outputFile, configuredGenerationSource.file);
5004
5287
  }
5005
5288
  }
5289
+ if (!hasUsableRememberedTailwindSource) {
5290
+ const inferredSourceStyle = resolveSourceStyleSourceFromOutputFile(outputFile, snapshot, outDir, sourceRoot, getCssSource, getSourceCandidateSources, configuredTailwindV4CssSourceEntries.map((entry) => [entry.file, entry.source]), debug);
5291
+ const inferredWebviewRootSourceEntry = inferredSourceStyle ? void 0 : selectConfiguredRootCssSourceEntry(outputFile, configuredTailwindV4CssSourceEntries, originalSource.originalFileNames);
5292
+ const inferredWebviewRootSourceStyle = inferredWebviewRootSourceEntry ? {
5293
+ outputFile,
5294
+ rawSource: inferredWebviewRootSourceEntry.source,
5295
+ sourceFile: inferredWebviewRootSourceEntry.file
5296
+ } : void 0;
5297
+ const inferredOriginalSourceStyle = inferredSourceStyle ?? (outputFile === file ? void 0 : resolveSourceStyleSourceFromOutputFile(file, snapshot, outDir, sourceRoot, getCssSource, getSourceCandidateSources, configuredTailwindV4CssSourceEntries.map((entry) => [entry.file, entry.source]), debug)) ?? inferredWebviewRootSourceStyle;
5298
+ if (inferredOriginalSourceStyle) {
5299
+ const matchedOutputFile = require_source_candidate_scan_signature.normalizeOutputPathKey(inferredOriginalSourceStyle.outputFile) === require_source_candidate_scan_signature.normalizeOutputPathKey(outputFile) ? outputFile : resolveMatchedOutputFileForCurrentAsset(inferredOriginalSourceStyle.sourceFile) ?? outputFile;
5300
+ debug("source style output resolved: %s -> %s from %s", outputFile, matchedOutputFile, inferredOriginalSourceStyle.sourceFile);
5301
+ outputFile = matchedOutputFile;
5302
+ activeViteCssCacheFiles.add(normalizeViteCssCacheKey(outputFile));
5303
+ outputCssHandlerOptions = getCssHandlerOptions(outputFile);
5304
+ rememberedCssSources = [{
5305
+ ...inferredOriginalSourceStyle,
5306
+ outputFile
5307
+ }];
5308
+ } else if (isTemporaryCssAssetFile(outputFile) && configuredTailwindV4CssSourceEntries.length > 1) {
5309
+ const resolvedTemporarySource = temporaryCssAssetSourceResolver.resolve(outputFile, rawSource);
5310
+ if (resolvedTemporarySource) {
5311
+ outputFile = shouldKeepCurrentRootCssOutputForConfiguredSource(resolvedTemporarySource.sourceFile, outputFile) ? outputFile : resolveMatchedOutputFileForCurrentAsset(resolvedTemporarySource.sourceFile) ?? resolvedTemporarySource.outputFile;
5312
+ activeViteCssCacheFiles.add(normalizeViteCssCacheKey(outputFile));
5313
+ outputCssHandlerOptions = getCssHandlerOptions(outputFile);
5314
+ outputCssHandlerOptions = {
5315
+ ...outputCssHandlerOptions,
5316
+ isMainChunk: false
5317
+ };
5318
+ resolvedFromTemporaryCssAsset = true;
5319
+ usedConfiguredTailwindV4CssSourceFiles.add(require_source_candidate_scan_signature.normalizeOutputPathKey(resolvedTemporarySource.sourceFile));
5320
+ rememberedCssSources = [{
5321
+ outputFile,
5322
+ rawSource: resolvedTemporarySource.rawSource,
5323
+ sourceFile: resolvedTemporarySource.sourceFile
5324
+ }];
5325
+ debug("source style source inferred from temporary configured tailwind v4 css source: %s -> %s", outputFile, resolvedTemporarySource.sourceFile);
5326
+ }
5327
+ } else if (!isCurrentRootMiniProgramStyleOutput && hasTailwindGenerationSource(rawSource) && (originalSource.originalFileNames?.length ?? 0) === 0) {
5328
+ const availableConfiguredTailwindV4CssSourceEntries = configuredTailwindV4CssSourceEntries.filter((entry) => !usedConfiguredTailwindV4CssSourceFiles.has(require_source_candidate_scan_signature.normalizeOutputPathKey(entry.file)));
5329
+ const configuredGenerationSource = selectTailwindV4GenerationCssSourceForOutput(outputFile, availableConfiguredTailwindV4CssSourceEntries, rawSource, {
5330
+ cwd: opts.tailwindcssBasedir,
5331
+ outputRoot: outDir,
5332
+ projectRoot: sourceRoot ?? rootDir
5333
+ });
5334
+ if (configuredGenerationSource && !hasViteProcessedCssResultForSource(configuredGenerationSource.file, getViteProcessedCssAssetResults)) {
5335
+ outputFile = resolveMatchedOutputFileForCurrentAsset(configuredGenerationSource.file) ?? outputFile;
5336
+ activeViteCssCacheFiles.add(normalizeViteCssCacheKey(outputFile));
5337
+ outputCssHandlerOptions = getCssHandlerOptions(outputFile);
5338
+ usedConfiguredTailwindV4CssSourceFiles.add(require_source_candidate_scan_signature.normalizeOutputPathKey(configuredGenerationSource.file));
5339
+ rememberedCssSources = [{
5340
+ outputFile,
5341
+ rawSource: configuredGenerationSource.source,
5342
+ sourceFile: configuredGenerationSource.file
5343
+ }];
5344
+ hasUsableRememberedTailwindSource = true;
5345
+ debug("source style source inferred from scoped configured tailwind v4 css source: %s -> %s", outputFile, configuredGenerationSource.file);
5346
+ }
5347
+ }
5348
+ }
5006
5349
  }
5007
5350
  let rememberedCssSource = mergeRememberedCssSources(rememberedCssSources, outputFile);
5008
5351
  if (rememberedCssSource && viteProcessedCssAsset && outputCssHandlerOptions.isMainChunk !== true && configuredTailwindV4CssSourceFileKeysForScope.has(normalizeConfiguredTailwindV4CssEntryFileKey(rememberedCssSource.sourceFile))) {
@@ -5020,10 +5363,10 @@ function createGenerateBundleHook(context) {
5020
5363
  const shouldKeepImportedCssShell = isCssImportOnlyBundleAsset(bundle, file, rawSource);
5021
5364
  const useRememberedCssSource = !shouldKeepImportedCssShell && rememberedCssSource != null && (require_source_candidate_scan_signature.normalizeOutputPathKey(rememberedCssSource.sourceFile) !== require_source_candidate_scan_signature.normalizeOutputPathKey(file) || !hasTailwindGenerationSource(rawSource) && hasTailwindGenerationSource(rememberedCssSource.rawSource));
5022
5365
  const vitePipelineCssAsset = viteProcessedCssAsset || useRememberedCssSource;
5023
- const generatorRawSource = vitePipelineCssAsset ? rememberedCssSource?.rawSource ?? rawSource : rawSource;
5024
- const hasRememberedApplySource = vitePipelineCssAsset && rememberedCssSource != null && require_v4_engine.hasTailwindApplyDirective(generatorRawSource);
5366
+ const generatorRawSource = normalizeMiniProgramGeneratorRawSource(vitePipelineCssAsset ? rememberedCssSource?.rawSource ?? rawSource : rawSource, outputFile);
5367
+ const hasRememberedApplySource = vitePipelineCssAsset && rememberedCssSource != null && require_generator.hasTailwindApplyDirective(generatorRawSource);
5025
5368
  const hasDifferentRememberedCssSource = rememberedCssSource != null && normalizeCssSourceForCompare(rememberedCssSource.rawSource) !== normalizeCssSourceForCompare(rawSource);
5026
- const hasCurrentTailwindGenerationDirective = require_v4_engine.hasTailwindSourceDirectives(rawSource, { importFallback: true }) || require_v4_engine.hasTailwindRootDirectives(rawSource, { importFallback: true }) || require_v4_engine.hasTailwindApplyDirective(rawSource);
5369
+ const hasCurrentTailwindGenerationDirective = require_generator.hasTailwindSourceDirectives(rawSource, { importFallback: true }) || require_generator.hasTailwindRootDirectives(rawSource, { importFallback: true }) || require_generator.hasTailwindApplyDirective(rawSource);
5027
5370
  if (shouldKeepImportedCssShell && !hasCurrentTailwindGenerationDirective) {
5028
5371
  applyCssResult(rawSource);
5029
5372
  markCssAssetProcessed?.(originalSource, outputFile);
@@ -5032,7 +5375,7 @@ function createGenerateBundleHook(context) {
5032
5375
  debug("css preserve imported shell asset: %s", outputFile);
5033
5376
  continue;
5034
5377
  }
5035
- const hasRememberedApplyDirective = rememberedCssSource != null && require_v4_engine.hasTailwindApplyDirective(rememberedCssSource.rawSource);
5378
+ const hasRememberedApplyDirective = rememberedCssSource != null && require_generator.hasTailwindApplyDirective(rememberedCssSource.rawSource);
5036
5379
  const hasRememberedTailwindGenerationSource = rememberedCssSource != null && hasTailwindGenerationSource(rememberedCssSource.rawSource);
5037
5380
  const hasSameOutputRememberedTailwindGenerationSource = hasRememberedTailwindGenerationSource && rememberedCssSource != null && require_source_candidate_scan_signature.normalizeOutputPathKey(rememberedCssSource.outputFile) === require_source_candidate_scan_signature.normalizeOutputPathKey(outputFile);
5038
5381
  const hasStaleViteProcessedCssSource = vitePipelineCssAsset && hasDifferentRememberedCssSource && (hasCurrentTailwindGenerationDirective || hasRememberedApplyDirective || hasRememberedTailwindGenerationSource);
@@ -5047,7 +5390,10 @@ function createGenerateBundleHook(context) {
5047
5390
  ...getCssHandlerOptions(generatorSourceFile),
5048
5391
  isMainChunk: resolvedFromTemporaryCssAsset ? false : outputCssHandlerOptions.isMainChunk
5049
5392
  } : getCssHandlerOptions(file);
5050
- const generatorCssEntries = configuredTailwindV4ExplicitCssEntryFileKeysForScope.has(normalizeConfiguredTailwindV4CssEntryFileKey(generatorSourceFile)) ? [generatorSourceFile] : opts.cssEntries;
5393
+ const generatorSourceFileKey = normalizeConfiguredTailwindV4CssEntryFileKey(generatorSourceFile);
5394
+ const isExplicitGeneratorCssEntry = configuredTailwindV4ExplicitCssEntryFileKeysForScope.has(generatorSourceFileKey);
5395
+ const shouldUsePipelineSourceAsCssEntry = !isExplicitGeneratorCssEntry && vitePipelineCssAsset && opts.cssMatcher(generatorSourceFile) && hasTailwindGenerationSource(generatorRawSource);
5396
+ const generatorCssEntries = isExplicitGeneratorCssEntry || shouldUsePipelineSourceAsCssEntry ? [generatorSourceFile] : opts.cssEntries;
5051
5397
  const generatorCssHandlerOptions = {
5052
5398
  ...cssHandlerOptions,
5053
5399
  sourceOptions: {
@@ -5058,7 +5404,8 @@ function createGenerateBundleHook(context) {
5058
5404
  };
5059
5405
  const scopedSourceCandidateGetter = createScopedSourceCandidateGetter(outputFile, generatorCssHandlerOptions);
5060
5406
  const scopedSourceCandidateSourceGetter = createScopedSourceCandidateSourceGetter(outputFile, generatorCssHandlerOptions);
5061
- const sourceTraceTokenSources = scopedSourceCandidateSourceGetter ? require_hmr_timing.createCssTokenSourceMap(scopedSourceCandidateSourceGetter(void 0), opts) : void 0;
5407
+ const sourceTraceSources = scopedSourceCandidateSourceGetter ? await require_source_candidate_scan_signature.createScopedGeneratorSourceTraceMap(generatorRawSource, generatorSourceFile, scopedSourceCandidateSourceGetter) : void 0;
5408
+ const sourceTraceTokenSources = sourceTraceSources ? require_hmr_timing.createCssTokenSourceMap(sourceTraceSources, opts) : void 0;
5062
5409
  const sourceTraceSignature = require_hmr_timing.createCssSourceTraceCacheSignature(sourceTraceTokenSources, opts);
5063
5410
  const scopedGeneratorRuntime = await createScopedGeneratorRuntime$1(outputFile, generatorCssHandlerOptions, generatorRuntime, generatorRawSource, generatorSourceFile);
5064
5411
  const annotateCss = (css) => require_hmr_timing.annotateCssSourceTrace(css, {
@@ -5082,7 +5429,7 @@ function createGenerateBundleHook(context) {
5082
5429
  const shouldTrackGeneratorRuntime = hasStaleViteProcessedCssSource || shouldRegenerateMainPackageCssWithScopedCandidates || hasCurrentTailwindGenerationDirective || hasSameOutputRememberedTailwindGenerationSource || shouldProcessTailwindGeneration && (!useIncrementalMode || cssHandlerOptions.isMainChunk || processFiles.css.has(file) || runtimeLinkedCssFiles.has(file) || runtimeLinkedCssFiles.has(outputFile) || shouldRegenerateCollectedViteCss || hasRuntimeAffectingChanges && (alreadyProcessedCssAsset || vitePipelineCssAsset));
5083
5430
  const shouldPreserveCollectedViteCssAsset = !shouldRegenerateCollectedViteCss && (state.generatorCandidateSignature === void 0 || !generatorCandidatesChanged) && (collectedBundlerGeneratedCssFiles.has(file) || require_source_candidate_scan_signature.hasBundlerGeneratedCssMarker(rawSource));
5084
5431
  const strippedViteProcessedCss = require_source_candidate_scan_signature.stripBundlerGeneratedCssMarkers(rawSource);
5085
- const shouldPreserveStaleGeneratedCssAsset = hasStaleViteProcessedCssSource && shouldPreserveCollectedViteCssAsset && strippedViteProcessedCss.trim().length > 0 && !strippedViteProcessedCss.includes("weapp-tailwindcss generator-placeholder") && !strippedViteProcessedCss.includes("vite-placeholder") && !hasTailwindGenerationSource(strippedViteProcessedCss) && !require_v4_engine.hasTailwindApplyDirective(strippedViteProcessedCss);
5432
+ const shouldPreserveStaleGeneratedCssAsset = hasStaleViteProcessedCssSource && shouldPreserveCollectedViteCssAsset && strippedViteProcessedCss.trim().length > 0 && !strippedViteProcessedCss.includes("weapp-tailwindcss generator-placeholder") && !strippedViteProcessedCss.includes("vite-placeholder") && !hasTailwindGenerationSource(strippedViteProcessedCss) && !require_generator.hasTailwindApplyDirective(strippedViteProcessedCss);
5086
5433
  if (alreadyProcessedCssAsset && !shouldRefreshViteProcessedCssByCandidates && (!hasStaleViteProcessedCssSource || shouldPreserveStaleGeneratedCssAsset) && !hasRememberedApplySource && !shouldRegenerateMainPackageCssWithScopedCandidates && (!shouldTrackGeneratorRuntime || shouldPreserveCollectedViteCssAsset)) {
5087
5434
  const nextCss = removeRootCoveredCssFromScopedAsset(strippedViteProcessedCss);
5088
5435
  applyCssResult(nextCss);
@@ -5161,11 +5508,13 @@ function createGenerateBundleHook(context) {
5161
5508
  const start = performance.now();
5162
5509
  await runtimeState.readyPromise;
5163
5510
  const previousCss = !vitePipelineCssAsset && useIncrementalMode && !hasRuntimeAffectingChanges && !snapshot.changedByType.css.has(file) ? getLastCssResult(lastCssResultByFile, outputFile, file) : void 0;
5164
- const generated = hasTailwindGenerationSource(generatorRawSource) || require_source_candidate_scan_signature.hasBundlerGeneratedCssMarker(rawSource) ? await require_source_candidate_scan_signature.generateTailwindV4Css({
5511
+ const generatorTransformRawSource = generatorRawSource;
5512
+ const previousGeneratorCss = previousCss && !isWebGeneratorTarget ? normalizeMiniProgramGeneratorRawSource(previousCss, outputFile) : previousCss;
5513
+ const generated = hasTailwindGenerationSource(generatorTransformRawSource) || require_source_candidate_scan_signature.hasBundlerGeneratedCssMarker(rawSource) ? await require_source_candidate_scan_signature.generateTailwindV4Css({
5165
5514
  opts,
5166
5515
  runtimeState,
5167
5516
  runtime: scopedGeneratorRuntime,
5168
- rawSource: generatorRawSource,
5517
+ rawSource: generatorTransformRawSource,
5169
5518
  file: generatorSourceFile,
5170
5519
  outputFile,
5171
5520
  cssHandlerOptions: generatorCssHandlerOptions,
@@ -5175,8 +5524,8 @@ function createGenerateBundleHook(context) {
5175
5524
  generatorPlatform,
5176
5525
  styleHandler,
5177
5526
  debug,
5178
- previousCss,
5179
- ...vitePipelineCssAsset && !require_source_candidate_scan_signature.hasBundlerGeneratedCssMarker(rawSource) && normalizeCssSourceForCompare(rawSource) !== normalizeCssSourceForCompare(generatorRawSource) ? { userRawSource: normalizeGeneratorUserRawSource(rawSource, generatorSourceFile, assetSourceFile) } : {},
5527
+ previousCss: previousGeneratorCss,
5528
+ ...vitePipelineCssAsset && !require_source_candidate_scan_signature.hasBundlerGeneratedCssMarker(rawSource) && normalizeCssSourceForCompare(rawSource) !== normalizeCssSourceForCompare(generatorRawSource) ? { userRawSource: normalizeMiniProgramGeneratorRawSource(normalizeGeneratorUserRawSource(rawSource, generatorSourceFile, assetSourceFile), outputFile) } : {},
5180
5529
  ...usesConfiguredTailwindV4FallbackSource ? { restoreLocalCssImports: false } : {}
5181
5530
  }) : void 0;
5182
5531
  if (generated) {
@@ -5206,9 +5555,17 @@ function createGenerateBundleHook(context) {
5206
5555
  debug("css preserve web target: %s", outputFile);
5207
5556
  return annotateCss(outputCss);
5208
5557
  }
5209
- const { css } = await styleHandler(generatorRawSource, cssHandlerOptions);
5558
+ if ((0, _weapp_tailwindcss_postcss.isPureLocalCssImportWrapper)(generatorTransformRawSource)) {
5559
+ const tracedCss = annotateCss(generatorTransformRawSource);
5560
+ recordCssAssetResult?.(outputFile, tracedCss);
5561
+ metrics.css.elapsed += measureElapsed(start);
5562
+ metrics.css.transformed++;
5563
+ debug("css preserve mini-program import shell: %s", outputFile);
5564
+ return tracedCss;
5565
+ }
5566
+ const { css } = await styleHandler(generatorTransformRawSource, cssHandlerOptions);
5210
5567
  const tracedCss = annotateCss(css);
5211
- if (envFlags.debugCssDiff) debug("css diff %s: %s", generatorSourceFile, require_source_candidate_scan_signature.summarizeStringDiff(generatorRawSource, tracedCss));
5568
+ if (envFlags.debugCssDiff) debug("css diff %s: %s", generatorSourceFile, require_source_candidate_scan_signature.summarizeStringDiff(generatorTransformRawSource, tracedCss));
5212
5569
  metrics.css.elapsed += measureElapsed(start);
5213
5570
  metrics.css.transformed++;
5214
5571
  return tracedCss;
@@ -5263,6 +5620,7 @@ function createGenerateBundleHook(context) {
5263
5620
  bundle,
5264
5621
  bundleFiles,
5265
5622
  cache,
5623
+ changedCssFiles: snapshot.changedByType.css,
5266
5624
  cssTaskFactories,
5267
5625
  createScopedGeneratorRuntime: createScopedGeneratorRuntime$1,
5268
5626
  createScopedSourceCandidateGetter,
@@ -5278,6 +5636,7 @@ function createGenerateBundleHook(context) {
5278
5636
  getRememberedCssSources,
5279
5637
  isNativeAppStyleTarget,
5280
5638
  isWebGeneratorTarget,
5639
+ lastCssRawSourceHashByFile,
5281
5640
  lastCssResultByFile,
5282
5641
  lastCssSourceHashByFile,
5283
5642
  markCssAssetProcessed,
@@ -5381,12 +5740,13 @@ function registerGeneratorDependencies(ctx, dependencies) {
5381
5740
  throw error;
5382
5741
  }
5383
5742
  }
5384
- function createCssHandlerOptions(opts, majorVersion, file, extraOptions = {}) {
5743
+ function createCssHandlerOptions(opts, majorVersion, file, outputRoot, extraOptions = {}) {
5744
+ const from = node_path.default.isAbsolute(file) ? file : outputRoot ? node_path.default.resolve(outputRoot, file) : file;
5385
5745
  return {
5386
5746
  ...extraOptions,
5387
5747
  cssPreflight: opts.cssPreflight,
5388
5748
  isMainChunk: opts.mainCssChunkMatcher(file, opts.appType),
5389
- postcssOptions: { options: { from: file } },
5749
+ postcssOptions: { options: { from } },
5390
5750
  ...require_context.normalizeStyleHandlerMajorVersion(majorVersion) === void 0 ? {} : { majorVersion: 4 }
5391
5751
  };
5392
5752
  }
@@ -5397,10 +5757,11 @@ function shouldGenerateCssByGenerator(opts, majorVersion, file, rawSource, proce
5397
5757
  tailwindcssMajorVersion: majorVersion,
5398
5758
  uniAppX: opts.uniAppX
5399
5759
  });
5400
- if (require_v4_engine.hasLocalCssImport(rawSource)) return false;
5401
- if (require_v4_engine.hasTailwindGeneratedCssMarkers(rawSource)) return true;
5402
- if (require_v4_engine.hasTailwindRootDirectives(rawSource, { importFallback: generatorOptions.importFallback })) return true;
5403
- return processed && require_v4_engine.hasTailwindApplyDirective(rawSource) && shouldFinalizeProcessedCssAsset(opts, file);
5760
+ if (!generatorOptions.enabled) return false;
5761
+ if (require_generator.hasLocalCssImport(rawSource)) return false;
5762
+ if (require_generator.hasTailwindGeneratedCssMarkers(rawSource)) return true;
5763
+ if (require_generator.hasTailwindRootDirectives(rawSource, { importFallback: generatorOptions.importFallback })) return true;
5764
+ return processed && require_generator.hasTailwindApplyDirective(rawSource) && shouldFinalizeProcessedCssAsset(opts, file);
5404
5765
  }
5405
5766
  function shouldFinalizeProcessedCssAsset(opts, file) {
5406
5767
  return opts.mainCssChunkMatcher(file, opts.appType);
@@ -5409,8 +5770,8 @@ function collectViteProcessedCssSources(getViteProcessedCssAssetResults) {
5409
5770
  return [...getViteProcessedCssAssetResults?.() ?? []].map(([, record]) => typeof record === "string" ? record : record.css);
5410
5771
  }
5411
5772
  function finalizeWebCss(css, context, cssPipelineStrategy) {
5412
- const shouldApplyWebCssCompat = cssPipelineStrategy?.shouldApplyWebCssCompat?.(context) === true;
5413
- const defaultWebCssCompat = (value) => (0, _weapp_tailwindcss_postcss.transformWebCssCompat)(value, context.currentGeneratorBranch.isWeb ? context.currentGeneratorOptions.webCompat : context.currentGeneratorOptions.webCompat ?? true);
5773
+ const shouldApplyWebCssCompat = shouldApplyViteWebCssCompat(context, cssPipelineStrategy);
5774
+ const defaultWebCssCompat = (value) => (0, _weapp_tailwindcss_postcss.transformWebCssCompat)(value, resolveViteWebCssCompatOptions(context));
5414
5775
  return cssPipelineStrategy?.transformGeneratedCss?.(css, {
5415
5776
  ...context,
5416
5777
  defaultWebCssCompat,
@@ -5456,6 +5817,7 @@ function createViteCssFinalizerOutputPlugin(context) {
5456
5817
  const isNativeAppStyleTarget = cssPipelineStrategy?.isNativeAppStyleTarget?.(createCssPipelineContext("")) === true;
5457
5818
  if (resolvedConfig?.command !== "build" && !isNativeAppStyleTarget) return;
5458
5819
  const rootDir = resolvedConfig?.root ? node_path.default.resolve(resolvedConfig.root) : node_process.default.cwd();
5820
+ const outDir = resolvedConfig?.build?.outDir ? node_path.default.resolve(rootDir, resolvedConfig.build.outDir) : rootDir;
5459
5821
  const sourceRoot = resolveWeappViteSourceRoot(resolvedConfig, opts.appType) ?? resolveSourceRootFromBundleGraph(resolvedConfig, bundle);
5460
5822
  const sourceTraceTokenSources = getSourceCandidateSourcesForEntries ? require_hmr_timing.createCssTokenSourceMap(getSourceCandidateSourcesForEntries(void 0), opts) : void 0;
5461
5823
  const annotateCss = (css) => require_hmr_timing.annotateCssSourceTrace(css, {
@@ -5502,7 +5864,7 @@ function createViteCssFinalizerOutputPlugin(context) {
5502
5864
  const applyStyleSources = collectUniAppXHarmonyApplyStyleSources(bundle);
5503
5865
  if (applyUtilities.size === 0 || applyStyleSources.length === 0) return cssSources;
5504
5866
  const harmonyRuntime = /* @__PURE__ */ new Set([...runtime, ...applyUtilities]);
5505
- const harmonyCssHandlerOptions = createCssHandlerOptions(opts, runtimeState.tailwindRuntime.majorVersion, "uni-app-x-harmony-apply.css", cssPipelineStrategy?.getCssHandlerExtraOptions?.({
5867
+ const harmonyCssHandlerOptions = createCssHandlerOptions(opts, runtimeState.tailwindRuntime.majorVersion, "uni-app-x-harmony-apply.css", outDir, cssPipelineStrategy?.getCssHandlerExtraOptions?.({
5506
5868
  ...createCssPipelineContext("uni-app-x-harmony-apply.css"),
5507
5869
  file: "uni-app-x-harmony-apply.css"
5508
5870
  }) ?? {});
@@ -5553,7 +5915,7 @@ function createViteCssFinalizerOutputPlugin(context) {
5553
5915
  await waitForSourceCandidateSyncs?.();
5554
5916
  const runtime = getRecordedGeneratorCandidates?.() ?? getSourceCandidates?.() ?? await ensureRuntimeClassSet();
5555
5917
  const collectedGeneratorCandidates = /* @__PURE__ */ new Set([...runtime, ...getSourceCandidates?.() ?? []]);
5556
- const generatorRuntime = require_generator.shouldUseMiniProgramCssBranch(generatorBranch) ? require_v4_engine.filterUnsupportedMiniProgramTailwindV4Candidates(collectedGeneratorCandidates) : collectedGeneratorCandidates;
5918
+ const generatorRuntime = require_generator.shouldUseMiniProgramCssBranch(generatorBranch) ? require_generator.filterUnsupportedMiniProgramTailwindV4Candidates(collectedGeneratorCandidates) : collectedGeneratorCandidates;
5557
5919
  await Promise.all(entries.map(async ([bundleFile, output]) => {
5558
5920
  const file = output.fileName || bundleFile;
5559
5921
  const rawSource = output.source.toString();
@@ -5568,7 +5930,7 @@ function createViteCssFinalizerOutputPlugin(context) {
5568
5930
  debug("css finalizer skip vite-processed css: %s", file);
5569
5931
  return;
5570
5932
  }
5571
- const cssHandlerOptions = createCssHandlerOptions(opts, runtimeState.tailwindRuntime.majorVersion, file, cssPipelineStrategy?.getCssHandlerExtraOptions?.({
5933
+ const cssHandlerOptions = createCssHandlerOptions(opts, runtimeState.tailwindRuntime.majorVersion, file, outDir, cssPipelineStrategy?.getCssHandlerExtraOptions?.({
5572
5934
  ...createCssPipelineContext(file),
5573
5935
  file
5574
5936
  }) ?? {});
@@ -5576,11 +5938,21 @@ function createViteCssFinalizerOutputPlugin(context) {
5576
5938
  ...cssHandlerOptions,
5577
5939
  isMainChunk: false
5578
5940
  };
5941
+ const cleanRawSource = require_source_candidate_scan_signature.stripBundlerGeneratedCssMarkers(rawSource);
5942
+ if (cleanRawSource !== rawSource && cleanRawSource.trim().length === 0) {
5943
+ output.source = cleanRawSource;
5944
+ markCssAssetProcessed(output, file);
5945
+ recordCssAssetResult?.(file, cleanRawSource);
5946
+ opts.onUpdate(file, rawSource, cleanRawSource);
5947
+ debug("css finalizer strip empty marker asset: %s", file);
5948
+ return;
5949
+ }
5579
5950
  const processed = isCssAssetProcessed(output, file);
5580
5951
  const rememberedMainCssSource = processed && cssHandlerOptions.isMainChunk ? getRememberedMainCssSource?.(file) : void 0;
5581
- const generatorRawSource = rememberedMainCssSource?.rawSource ?? rawSource;
5952
+ const resolvedGeneratorRawSource = rememberedMainCssSource?.rawSource ?? cleanRawSource;
5953
+ const generatorRawSource = generatorBranch.isWeb ? resolvedGeneratorRawSource : require_hmr_timing.normalizeMiniProgramGeneratorCssSource(resolvedGeneratorRawSource, file);
5582
5954
  const generatorSourceFile = rememberedMainCssSource?.sourceFile ?? file;
5583
- const generatorCssHandlerOptions = rememberedMainCssSource ? createCssHandlerOptions(opts, runtimeState.tailwindRuntime.majorVersion, generatorSourceFile, cssPipelineStrategy?.getCssHandlerExtraOptions?.({
5955
+ const generatorCssHandlerOptions = rememberedMainCssSource ? createCssHandlerOptions(opts, runtimeState.tailwindRuntime.majorVersion, generatorSourceFile, outDir, cssPipelineStrategy?.getCssHandlerExtraOptions?.({
5584
5956
  ...createCssPipelineContext(generatorSourceFile),
5585
5957
  file: generatorSourceFile
5586
5958
  }) ?? {}) : cssHandlerOptions;
@@ -5588,11 +5960,12 @@ function createViteCssFinalizerOutputPlugin(context) {
5588
5960
  ...generatorCssHandlerOptions,
5589
5961
  isMainChunk: false
5590
5962
  } : cssUserHandlerOptions;
5591
- const generated = shouldGenerateCssByGenerator(opts, runtimeState.tailwindRuntime.majorVersion, file, generatorRawSource, processed) ? await require_source_candidate_scan_signature.generateTailwindV4Css({
5963
+ const generatorTransformRawSource = generatorRawSource;
5964
+ const generated = shouldGenerateCssByGenerator(opts, runtimeState.tailwindRuntime.majorVersion, file, generatorTransformRawSource, processed) ? await require_source_candidate_scan_signature.generateTailwindV4Css({
5592
5965
  opts,
5593
5966
  runtimeState,
5594
5967
  runtime: generatorRuntime,
5595
- rawSource: generatorRawSource,
5968
+ rawSource: generatorTransformRawSource,
5596
5969
  file: generatorSourceFile,
5597
5970
  outputFile: file,
5598
5971
  cssHandlerOptions: generatorCssHandlerOptions,
@@ -5602,10 +5975,21 @@ function createViteCssFinalizerOutputPlugin(context) {
5602
5975
  styleHandler: opts.styleHandler,
5603
5976
  debug
5604
5977
  }) : void 0;
5605
- const nextCss = annotateCss(generated?.css ?? (generatorBranch.isWeb ? finalizeWebCss(rawSource, {
5978
+ if (!generated && !generatorBranch.isWeb && (0, _weapp_tailwindcss_postcss.isPureLocalCssImportWrapper)(generatorTransformRawSource)) {
5979
+ const nextCss = generatorTransformRawSource;
5980
+ if (nextCss !== rawSource) {
5981
+ output.source = nextCss;
5982
+ opts.onUpdate(file, rawSource, nextCss);
5983
+ }
5984
+ markCssAssetProcessed(output, file);
5985
+ recordCssAssetResult?.(file, nextCss);
5986
+ debug("css finalizer preserve mini-program import shell: %s", file);
5987
+ return;
5988
+ }
5989
+ const nextCss = annotateCss(generated?.css ?? (generatorBranch.isWeb ? finalizeWebCss(cleanRawSource, {
5606
5990
  ...createCssPipelineContext(file),
5607
5991
  file
5608
- }, cssPipelineStrategy) : (await opts.styleHandler(rawSource, cssHandlerOptions)).css));
5992
+ }, cssPipelineStrategy) : (await opts.styleHandler(generatorTransformRawSource, cssHandlerOptions)).css));
5609
5993
  if (generated) {
5610
5994
  registerGeneratorDependencies(this, generated.dependencies);
5611
5995
  debug("css finalizer generated result: %s bytes=%d", file, nextCss.length);
@@ -5891,9 +6275,21 @@ function createViteCssMemory(options) {
5891
6275
  function resolveHotTailwindCssModules(ctx, tailwindRootCssModuleIds) {
5892
6276
  const modules = [];
5893
6277
  const seenModules = /* @__PURE__ */ new Set();
6278
+ const root = ctx.server.config?.root ?? node_process.default.cwd();
6279
+ const outDir = ctx.server.config?.build?.outDir ? normalizeAbsoluteFilePath(node_path.default.resolve(root, ctx.server.config.build.outDir)) : void 0;
6280
+ const isHotSourceStyleModule = (id) => {
6281
+ if (!require_source_candidate_scan_signature.isSourceStyleRequest(id)) return false;
6282
+ const file = (0, _weapp_tailwindcss_shared.cleanUrl)(id);
6283
+ if (isRootMiniProgramStyleUrl(file) || !isAbsoluteFilePath(file) && !file.startsWith("/")) return false;
6284
+ if (outDir && isAbsoluteFilePath(file)) {
6285
+ const normalizedFile = normalizeAbsoluteFilePath(file);
6286
+ if (normalizedFile === outDir || normalizedFile.startsWith(`${outDir}/`)) return false;
6287
+ }
6288
+ return true;
6289
+ };
5894
6290
  const collectModule = (mod) => {
5895
6291
  if (mod == null || seenModules.has(mod)) return;
5896
- if (!require_source_candidate_scan_signature.isSourceStyleRequest(mod.id ?? mod.url)) return;
6292
+ if (!isHotSourceStyleModule(mod.id ?? mod.url)) return;
5897
6293
  seenModules.add(mod);
5898
6294
  ctx.server.moduleGraph.invalidateModule(mod);
5899
6295
  modules.push(mod);
@@ -5929,6 +6325,29 @@ function resolveModuleHotUrl(mod) {
5929
6325
  if (typeof mod.url === "string" && mod.url.length > 0) return mod.url;
5930
6326
  if (typeof mod.id === "string" && mod.id.startsWith("/")) return mod.id;
5931
6327
  }
6328
+ function isAbsoluteFilePath(file) {
6329
+ return node_path.default.isAbsolute(file) || /^[A-Z]:[\\/]/i.test(file) || file.startsWith("\\\\");
6330
+ }
6331
+ function normalizeAbsoluteFilePath(file) {
6332
+ if (/^[A-Z]:[\\/]/i.test(file) || file.startsWith("\\\\")) return require_source_candidate_scan_signature.slash(node_path.default.win32.resolve(file));
6333
+ return require_source_candidate_scan_signature.slash(node_path.default.resolve(file));
6334
+ }
6335
+ function isRootMiniProgramStyleUrl(file) {
6336
+ return /^\/[^/]+\.(?:wxss|acss|ttss|qss|jxss|tyss)(?:$|[?#])/i.test(file);
6337
+ }
6338
+ function resolveCssHotUrl(id, root) {
6339
+ const suffix = /[?#]/.test(id) ? id.slice(id.search(/[?#]/)) : "";
6340
+ const file = (0, _weapp_tailwindcss_shared.cleanUrl)(id);
6341
+ if (/^\/(?![A-Z]:)/i.test(file) && !file.startsWith(require_source_candidate_scan_signature.slash(root))) {
6342
+ if (isRootMiniProgramStyleUrl(file)) return;
6343
+ return `${file}${suffix}`;
6344
+ }
6345
+ if (!isAbsoluteFilePath(file)) return;
6346
+ const normalizedRoot = normalizeAbsoluteFilePath(root);
6347
+ const normalizedFile = normalizeAbsoluteFilePath(file);
6348
+ if (!normalizedFile.startsWith(`${normalizedRoot}/`)) return;
6349
+ return `/${require_source_candidate_scan_signature.slash(node_path.default.relative(normalizedRoot, normalizedFile))}${suffix}`;
6350
+ }
5932
6351
  function includesHotModule(modules, target) {
5933
6352
  const targetUrl = resolveModuleHotUrl(target);
5934
6353
  const targetId = target.id;
@@ -5937,24 +6356,46 @@ function includesHotModule(modules, target) {
5937
6356
  return targetUrl !== void 0 && resolveModuleHotUrl(mod) === targetUrl || typeof targetId === "string" && targetId.length > 0 && mod.id === targetId;
5938
6357
  });
5939
6358
  }
6359
+ function createSupplementalHotUpdate(hotUrl, timestamp) {
6360
+ if (/[?&](?:direct|vue)(?:&|$)/.test(hotUrl)) return {
6361
+ type: "js-update",
6362
+ timestamp,
6363
+ path: hotUrl,
6364
+ acceptedPath: hotUrl,
6365
+ explicitImportRequired: false,
6366
+ isWithinCircularImport: false
6367
+ };
6368
+ return {
6369
+ type: "css-update",
6370
+ timestamp,
6371
+ path: hotUrl,
6372
+ acceptedPath: hotUrl
6373
+ };
6374
+ }
5940
6375
  function hasSelfAcceptingNonStyleHotModule(modules) {
5941
6376
  return modules.some((mod) => {
5942
6377
  return !require_source_candidate_scan_signature.isSourceStyleRequest(mod.id ?? mod.url) && mod.isSelfAccepting === true;
5943
6378
  });
5944
6379
  }
5945
- function sendSupplementalCssHotUpdates(ctx, cssModules) {
5946
- const updates = cssModules.filter((mod) => !includesHotModule(ctx.modules, mod)).map((mod) => {
5947
- const hotUrl = resolveModuleHotUrl(mod);
5948
- if (!hotUrl) return;
5949
- return {
5950
- type: "js-update",
5951
- timestamp: ctx.timestamp,
5952
- path: hotUrl,
5953
- acceptedPath: hotUrl,
5954
- explicitImportRequired: false,
5955
- isWithinCircularImport: false
5956
- };
5957
- }).filter((update) => update !== void 0);
6380
+ function sendSupplementalCssHotUpdates(ctx, cssModules, fallbackCssIds = []) {
6381
+ const seenUrls = /* @__PURE__ */ new Set();
6382
+ const root = ctx.server.config?.root ?? node_process.default.cwd();
6383
+ const updates = [];
6384
+ for (const id of fallbackCssIds) {
6385
+ if (!require_source_candidate_scan_signature.isSourceStyleRequest(id)) continue;
6386
+ const hotUrl = resolveCssHotUrl(id, root);
6387
+ if (!hotUrl || seenUrls.has(hotUrl)) continue;
6388
+ seenUrls.add(hotUrl);
6389
+ updates.push(createSupplementalHotUpdate(hotUrl, ctx.timestamp));
6390
+ }
6391
+ for (const mod of cssModules) {
6392
+ if (includesHotModule(ctx.modules, mod)) continue;
6393
+ const moduleHotUrl = resolveModuleHotUrl(mod);
6394
+ const hotUrl = moduleHotUrl ? resolveCssHotUrl(moduleHotUrl, root) : void 0;
6395
+ if (!hotUrl || seenUrls.has(hotUrl)) continue;
6396
+ seenUrls.add(hotUrl);
6397
+ updates.push(createSupplementalHotUpdate(hotUrl, ctx.timestamp));
6398
+ }
5958
6399
  if (updates.length === 0) return;
5959
6400
  queueMicrotask(() => {
5960
6401
  ctx.server.ws?.send?.({
@@ -6105,9 +6546,9 @@ function createRewriteCssImportsPlugins(options) {
6105
6546
  async transform(code, id) {
6106
6547
  if (!require_source_candidate_scan_signature.isCSSRequest(id)) return null;
6107
6548
  const file = (0, _weapp_tailwindcss_shared.cleanUrl)(id);
6108
- const normalizedCode = require_v4_engine.hasTailwindRootDirectives(code) || code.includes("@config") ? require_v4_engine.normalizeTailwindConfigDirectives(code, node_path.default.dirname(file)) : code;
6549
+ const normalizedCode = require_generator.hasTailwindRootDirectives(code) || code.includes("@config") ? require_generator.normalizeTailwindConfigDirectives(code, node_path.default.dirname(file)) : code;
6109
6550
  await options.onCssSourceTransform?.(id, normalizedCode);
6110
- const hasTailwindRoot = require_v4_engine.hasTailwindRootDirectives(normalizedCode);
6551
+ const hasTailwindRoot = require_generator.hasTailwindRootDirectives(normalizedCode, { importFallback: true });
6111
6552
  if (hasTailwindRoot) await options.onTailwindRootCss?.(id, normalizedCode);
6112
6553
  const shouldGenerateInPreTransform = !options.shouldDeferGeneration?.(id, normalizedCode) && (hasTailwindRoot || options.shouldGenerateCss?.(id, normalizedCode));
6113
6554
  if (options.shouldOwnTailwindGeneration && shouldGenerateInPreTransform) {
@@ -6139,7 +6580,7 @@ function createRewriteCssImportsPlugins(options) {
6139
6580
  }];
6140
6581
  }
6141
6582
  function hasVitePipelineTailwindGenerationDirective(code) {
6142
- return require_v4_engine.hasTailwindRootDirectives(code) || require_v4_engine.hasTailwindApplyDirective(code);
6583
+ return require_generator.hasTailwindRootDirectives(code) || require_generator.hasTailwindApplyDirective(code);
6143
6584
  }
6144
6585
  //#endregion
6145
6586
  //#region src/bundlers/vite/runtime-class-set.ts
@@ -6163,7 +6604,7 @@ function createViteRuntimeClassSet(options) {
6163
6604
  let runtimeRefreshSignature;
6164
6605
  let runtimeRefreshOptionsKey;
6165
6606
  function resolveRuntimeRefreshOptions() {
6166
- const configPath = require_v4_engine.resolveTailwindcssOptions(runtimeState.tailwindRuntime.options)?.config;
6607
+ const configPath = require_generator.resolveTailwindcssOptions(runtimeState.tailwindRuntime.options)?.config;
6167
6608
  const signature = require_tailwindcss.getRuntimeClassSetSignature(runtimeState.tailwindRuntime);
6168
6609
  const optionsKey = JSON.stringify({
6169
6610
  appType: opts.appType,
@@ -6269,6 +6710,7 @@ const SPECIAL_QUERY_RE$1 = /[?&](?:worker|sharedworker|raw|url)\b/;
6269
6710
  const COMMON_JS_PROXY_RE = /\?commonjs-proxy/;
6270
6711
  const VITE_CSS_HMR_MODULE_RE = /\b__vite__updateStyle\s*\(/;
6271
6712
  const VITE_CSS_CONST_RE = /\bconst\s+__vite__css\s*=\s*("(?:\\[\s\S]|[^"])*")/;
6713
+ const DEFERRED_CSS_HMR_QUERY_RE = /[?&](?:hmr(?:[=&]|$)|t=\d+)/;
6272
6714
  function decodeJsStringLiteral(literal) {
6273
6715
  try {
6274
6716
  return JSON.parse(literal);
@@ -6302,13 +6744,13 @@ function isViteServeCssRootRequest(id, command) {
6302
6744
  return command === "serve" && require_source_candidate_scan_signature.isSourceStyleRequest(id) && !SPECIAL_QUERY_RE$1.test(id) && !COMMON_JS_PROXY_RE.test(id);
6303
6745
  }
6304
6746
  function isViteCssHmrModule(code, id, command) {
6305
- return isViteServeStyleRequest(id, command) && VITE_CSS_HMR_MODULE_RE.test(code) && /[?&](?:direct|vue)(?:&|$)/.test(id);
6747
+ return isViteServeStyleRequest(id, command) && VITE_CSS_HMR_MODULE_RE.test(code) && (/[?&](?:direct|vue)(?:&|$)/.test(id) || DEFERRED_CSS_HMR_QUERY_RE.test(id));
6306
6748
  }
6307
6749
  function hasViteServeCssGenerationDirective(code) {
6308
- return require_v4_engine.hasTailwindRootDirectives(code) || require_v4_engine.hasTailwindSourceDirectives(code, { importFallback: true }) || require_v4_engine.hasTailwindApplyDirective(code);
6750
+ return require_generator.hasTailwindRootDirectives(code) || require_generator.hasTailwindSourceDirectives(code, { importFallback: true }) || require_generator.hasTailwindApplyDirective(code);
6309
6751
  }
6310
6752
  function hasViteServeCssRootDirective(code) {
6311
- return require_v4_engine.hasTailwindRootDirectives(code);
6753
+ return require_generator.hasTailwindRootDirectives(code);
6312
6754
  }
6313
6755
  function createViteServeCssGenerationPlugins(options) {
6314
6756
  return [{
@@ -6317,7 +6759,8 @@ function createViteServeCssGenerationPlugins(options) {
6317
6759
  enforce: "pre",
6318
6760
  async transform(code, id) {
6319
6761
  if (!options.shouldGenerate() || !isViteServeCssRootRequest(id, options.getCommand())) return;
6320
- if (!require_v4_engine.hasTailwindRootDirectives(code)) return;
6762
+ if (!require_generator.hasTailwindRootDirectives(code)) return;
6763
+ if (DEFERRED_CSS_HMR_QUERY_RE.test(id)) return;
6321
6764
  await options.onTailwindRootCss?.(id, code);
6322
6765
  const generatedCss = await options.generateCss(id, code, this);
6323
6766
  if (generatedCss === void 0 || generatedCss === code) return;
@@ -6389,7 +6832,7 @@ function resolveImplicitTailwindcssBasedirFromViteRoot(root) {
6389
6832
  }
6390
6833
  const tailwindConfigPath = require_tailwindcss.findTailwindConfig(searchRoots);
6391
6834
  if (tailwindConfigPath) return node_path.default.dirname(tailwindConfigPath);
6392
- const packageRoot = require_v4_engine.findNearestPackageRoot(resolvedRoot);
6835
+ const packageRoot = require_generator.findNearestPackageRoot(resolvedRoot);
6393
6836
  if (packageRoot && (0, node_fs.existsSync)(node_path.default.join(packageRoot, PACKAGE_JSON_FILE))) return packageRoot;
6394
6837
  return resolvedRoot;
6395
6838
  }
@@ -6399,6 +6842,7 @@ const debug = require_context.createDebug();
6399
6842
  const weappTailwindcssPackageDir = require_source_candidate_scan_signature.resolvePackageDir("weapp-tailwindcss");
6400
6843
  const weappTailwindcssDirPosix = require_source_candidate_scan_signature.slash(weappTailwindcssPackageDir);
6401
6844
  const SOURCE_CANDIDATE_SCAN_CACHE_MAX = 8;
6845
+ const WEB_HMR_RUNTIME_AFFECTING_DIRECTIVE_RE = /@(?:theme|source|config|plugin|apply)\b/;
6402
6846
  const sourceCandidateScanSnapshotCache = new lru_cache.LRUCache({ max: SOURCE_CANDIDATE_SCAN_CACHE_MAX });
6403
6847
  const ENV_PLATFORM_KEYS = [
6404
6848
  "UNI_PLATFORM",
@@ -6433,9 +6877,6 @@ function inferPlatformFromOutDir(outDir) {
6433
6877
  function isWebOrNativeAppPlatform(platform) {
6434
6878
  return platform === "h5" || platform === "web" || platform?.startsWith("web-") === true || platform === "app" || platform === "app-plus" || platform?.startsWith("app-") === true;
6435
6879
  }
6436
- function applyViteWebCssCompat(css, options) {
6437
- return (0, _weapp_tailwindcss_postcss.transformWebCssCompat)(css, options.compat);
6438
- }
6439
6880
  function isInternalUserDefinedOptions(options) {
6440
6881
  return typeof options.onLoad === "function" && typeof options.mainCssChunkMatcher === "function" && typeof options.tailwindRuntime === "object" && typeof options.refreshTailwindcssRuntime === "function";
6441
6882
  }
@@ -6454,7 +6895,7 @@ function createViteFrameworkPlugins(options = {}, frameworkBranch) {
6454
6895
  });
6455
6896
  const syncCssEntriesFromAnchor = (anchor) => {
6456
6897
  var _opts$tailwindcss;
6457
- const normalizedCssEntries = require_v4_engine.normalizeCssEntries(rawCssEntries, anchor ?? node_process.default.cwd());
6898
+ const normalizedCssEntries = require_generator.normalizeCssEntries(rawCssEntries, anchor ?? node_process.default.cwd());
6458
6899
  if (!normalizedCssEntries) return false;
6459
6900
  const changed = !sameStringList(opts.cssEntries, normalizedCssEntries);
6460
6901
  opts.cssEntries = normalizedCssEntries;
@@ -6475,7 +6916,6 @@ function createViteFrameworkPlugins(options = {}, frameworkBranch) {
6475
6916
  const disabledOptions = require_source_candidate_scan_signature.resolvePluginDisabledState(disabled);
6476
6917
  const tailwindcssMajorVersion = initialTailwindRuntime.majorVersion ?? 0;
6477
6918
  if (!disabledOptions.plugin && tailwindcssMajorVersion !== 4) throw new Error("weapp-tailwindcss/vite 新生成管线仅支持 Tailwind CSS v4,请升级 tailwindcss 或停留在旧版 weapp-tailwindcss。");
6478
- const shouldOwnTailwindGeneration = !disabledOptions.plugin;
6479
6919
  const shouldRewriteCssImports = opts.rewriteCssImports === true;
6480
6920
  let resolvedConfig;
6481
6921
  const resolveViteStylePlatform = () => {
@@ -6494,6 +6934,7 @@ function createViteFrameworkPlugins(options = {}, frameworkBranch) {
6494
6934
  tailwindcssMajorVersion,
6495
6935
  uniAppX
6496
6936
  });
6937
+ const shouldOwnTailwindGeneration = !disabledOptions.plugin && resolveCurrentGeneratorOptions().enabled;
6497
6938
  const resolveCurrentGeneratorBranch = () => require_generator.resolveGeneratorRuntimeBranch(resolveCurrentGeneratorOptions(), {
6498
6939
  appType: opts.appType,
6499
6940
  platform: resolveGeneratorPlatform(),
@@ -6523,7 +6964,7 @@ function createViteFrameworkPlugins(options = {}, frameworkBranch) {
6523
6964
  return (0, _weapp_tailwindcss_postcss.unwrapUnsupportedCascadeLayers)(css);
6524
6965
  };
6525
6966
  const shouldInferAppType = !hasExplicitAppType && !initialGeneratorBranch.isWeb;
6526
- const hasInitialTailwindCssRoots = require_v4_engine.hasConfiguredTailwindV4CssRoots({
6967
+ const hasInitialTailwindCssRoots = require_generator.hasConfiguredTailwindV4CssRoots({
6527
6968
  ...rawOptions,
6528
6969
  cssEntries: opts.cssEntries ?? rawOptions.cssEntries
6529
6970
  });
@@ -6541,11 +6982,11 @@ function createViteFrameworkPlugins(options = {}, frameworkBranch) {
6541
6982
  if (!shouldOwnTailwindGeneration) return;
6542
6983
  const file = (0, _weapp_tailwindcss_shared.cleanUrl)(id);
6543
6984
  if (!node_path.default.isAbsolute(file)) return;
6544
- if (!require_v4_engine.isTailwindV4CssEntry(file)) return;
6985
+ if (!require_generator.isTailwindV4CssEntry(file)) return;
6545
6986
  if (isMissingInternalCssSource(file, weappTailwindcssPackageDir)) return;
6546
6987
  const sourceFile = node_path.default.normalize(file);
6547
6988
  const sourceBase = node_path.default.dirname(sourceFile);
6548
- const sourceCss = require_v4_engine.normalizeTailwindSourceForGenerator(require_v4_engine.normalizeTailwindConfigDirectives(css, sourceBase), { importFallback: true });
6989
+ const sourceCss = require_generator.normalizeTailwindSourceForGenerator(require_generator.normalizeTailwindConfigDirectives(css, sourceBase), { importFallback: true });
6549
6990
  if (autoCssSourceContent.get(sourceFile) === sourceCss) return;
6550
6991
  autoCssSourceContent.set(sourceFile, sourceCss);
6551
6992
  await syncTailwindCssSourceCandidates(sourceFile, sourceCss);
@@ -6563,7 +7004,7 @@ function createViteFrameworkPlugins(options = {}, frameworkBranch) {
6563
7004
  const dependencies = await require_tailwindcss.resolveViteTailwindV4CssDependencies(sourceCss, sourceBase);
6564
7005
  transientSource.dependencies = dependencies;
6565
7006
  transientAutoCssSources.set(sourceFile, transientSource);
6566
- if (!require_v4_engine.upsertTailwindV4CssSource(opts, {
7007
+ if (!require_generator.upsertTailwindV4CssSource(opts, {
6567
7008
  file: sourceFile,
6568
7009
  base: sourceBase,
6569
7010
  css: sourceCss,
@@ -6586,11 +7027,11 @@ function createViteFrameworkPlugins(options = {}, frameworkBranch) {
6586
7027
  for (const cssEntry of cssEntries) {
6587
7028
  const sourceFile = node_path.default.resolve(cssEntry);
6588
7029
  const sourceBase = node_path.default.dirname(sourceFile);
6589
- const sourceCss = require_v4_engine.normalizeTailwindSourceForGenerator(require_v4_engine.normalizeTailwindConfigDirectives(await (0, node_fs_promises.readFile)(sourceFile, "utf8"), sourceBase), { importFallback: true });
7030
+ const sourceCss = require_generator.normalizeTailwindSourceForGenerator(require_generator.normalizeTailwindConfigDirectives(await (0, node_fs_promises.readFile)(sourceFile, "utf8"), sourceBase), { importFallback: true });
6590
7031
  if (autoCssSourceContent.get(sourceFile) === sourceCss) continue;
6591
7032
  autoCssSourceContent.set(sourceFile, sourceCss);
6592
7033
  await syncTailwindCssSourceCandidates(sourceFile, sourceCss);
6593
- changed = require_v4_engine.upsertTailwindV4CssSource(opts, {
7034
+ changed = require_generator.upsertTailwindV4CssSource(opts, {
6594
7035
  file: sourceFile,
6595
7036
  base: sourceBase,
6596
7037
  css: sourceCss,
@@ -6614,8 +7055,11 @@ function createViteFrameworkPlugins(options = {}, frameworkBranch) {
6614
7055
  const pendingSourceCandidateSyncs = /* @__PURE__ */ new Set();
6615
7056
  const pendingSourceCandidateSyncByFile = /* @__PURE__ */ new Map();
6616
7057
  const processedCssAssets = /* @__PURE__ */ new WeakSet();
7058
+ const processedCssAssetSourceByFile = /* @__PURE__ */ new Map();
6617
7059
  const viteProcessedCssSourceFiles = /* @__PURE__ */ new Set();
6618
- const viteGeneratedCssByFile = /* @__PURE__ */ new Map();
7060
+ const cleanGeneratedCssByFile = /* @__PURE__ */ new Map();
7061
+ const tracedGeneratedCssByFile = /* @__PURE__ */ new Map();
7062
+ const generatedClassSetByFile = /* @__PURE__ */ new Map();
6619
7063
  const viteProcessedCssAssetResults = /* @__PURE__ */ new Map();
6620
7064
  const cssMemory = createViteCssMemory({
6621
7065
  debug,
@@ -6635,15 +7079,21 @@ function createViteFrameworkPlugins(options = {}, frameworkBranch) {
6635
7079
  refreshRuntimeStateForAutoCssSources = refreshRuntimeState;
6636
7080
  onLoad();
6637
7081
  const getResolvedConfig = () => resolvedConfig;
6638
- const markCssAssetProcessed = (asset, _file) => {
7082
+ const readCssAssetSource = (asset) => {
7083
+ return typeof asset.source === "string" ? asset.source : asset.source instanceof Uint8Array ? node_buffer.Buffer.from(asset.source).toString() : String(asset.source ?? "");
7084
+ };
7085
+ const markCssAssetProcessed = (asset, file) => {
6639
7086
  processedCssAssets.add(asset);
7087
+ if (file) processedCssAssetSourceByFile.set(require_source_candidate_scan_signature.normalizeOutputPathKey(file), readCssAssetSource(asset));
6640
7088
  };
6641
7089
  const isCssAssetProcessed = (asset, file) => {
6642
7090
  if (processedCssAssets.has(asset)) return true;
6643
7091
  if (!file) return false;
7092
+ const source = readCssAssetSource(asset);
7093
+ if (processedCssAssetSourceByFile.get(require_source_candidate_scan_signature.normalizeOutputPathKey(file)) === source) return true;
6644
7094
  const record = viteProcessedCssAssetResults.get(require_source_candidate_scan_signature.normalizeOutputPathKey(file));
6645
7095
  if (!record) return false;
6646
- return (typeof asset.source === "string" ? asset.source : asset.source instanceof Uint8Array ? node_buffer.Buffer.from(asset.source).toString() : String(asset.source ?? "")) === record.css;
7096
+ return source === record.css;
6647
7097
  };
6648
7098
  const recordGeneratorCandidates = (candidates) => {
6649
7099
  recordedGeneratorCandidates = new Set(candidates);
@@ -6666,6 +7116,95 @@ function createViteFrameworkPlugins(options = {}, frameworkBranch) {
6666
7116
  const cleanId = (0, _weapp_tailwindcss_shared.cleanUrl)(id);
6667
7117
  return cleanId.includes("/pages/") && /\.(?:vue|tsx?|jsx?)$/.test(cleanId);
6668
7118
  };
7119
+ const hasWebHmrRuntimeAffectingDirectives = (source) => typeof source === "string" && WEB_HMR_RUNTIME_AFFECTING_DIRECTIVE_RE.test(source);
7120
+ let pendingHmrCandidateChange;
7121
+ let pendingHmrCssTargetFiles;
7122
+ let pendingFullHmrCssRegeneration = false;
7123
+ const normalizeHmrCssTargetFile = (file) => normalizeVitePersistentCacheKey((0, _weapp_tailwindcss_shared.cleanUrl)(file));
7124
+ const collectPendingHmrCssTargetFiles = (cssModules, fallbackCssIds) => {
7125
+ const targets = /* @__PURE__ */ new Set();
7126
+ const addTarget = (file) => {
7127
+ if (typeof file !== "string" || file.length === 0) return;
7128
+ const key = normalizeHmrCssTargetFile(file);
7129
+ if (cleanGeneratedCssByFile.has(key)) targets.add(key);
7130
+ };
7131
+ for (const mod of cssModules) {
7132
+ addTarget(mod.id);
7133
+ addTarget(mod.file);
7134
+ addTarget(mod.url);
7135
+ }
7136
+ for (const id of fallbackCssIds) addTarget(id);
7137
+ return targets.size > 0 ? targets : void 0;
7138
+ };
7139
+ const armPendingHmrCssTargetFiles = (cssModules, fallbackCssIds) => {
7140
+ if (!pendingHmrCandidateChange) {
7141
+ pendingHmrCssTargetFiles = void 0;
7142
+ return;
7143
+ }
7144
+ pendingHmrCssTargetFiles = collectPendingHmrCssTargetFiles(cssModules, fallbackCssIds);
7145
+ };
7146
+ const createViteSourceCandidateChange = (file, change, options = {}) => ({
7147
+ ...change,
7148
+ file,
7149
+ runtimeAffecting: options.runtimeAffecting === true || require_source_candidate_scan_signature.isSourceStyleRequest(file) || hasWebHmrRuntimeAffectingDirectives(sourceCandidateCollector.source(file))
7150
+ });
7151
+ const clearPendingHmrCandidateChange = () => {
7152
+ pendingHmrCandidateChange = void 0;
7153
+ pendingHmrCssTargetFiles = void 0;
7154
+ pendingFullHmrCssRegeneration = false;
7155
+ };
7156
+ const queueHmrCandidateChange = (change) => {
7157
+ pendingFullHmrCssRegeneration = false;
7158
+ if (!pendingHmrCandidateChange) {
7159
+ pendingHmrCandidateChange = {
7160
+ file: change.file,
7161
+ runtimeAffecting: change.runtimeAffecting,
7162
+ addedCandidates: new Set(change.addedCandidates),
7163
+ removedCandidates: new Set(change.removedCandidates)
7164
+ };
7165
+ return;
7166
+ }
7167
+ for (const candidate of change.addedCandidates) {
7168
+ pendingHmrCandidateChange.addedCandidates.add(candidate);
7169
+ pendingHmrCandidateChange.removedCandidates.delete(candidate);
7170
+ }
7171
+ for (const candidate of change.removedCandidates) if (!pendingHmrCandidateChange.addedCandidates.delete(candidate)) pendingHmrCandidateChange.removedCandidates.add(candidate);
7172
+ pendingHmrCandidateChange.runtimeAffecting = pendingHmrCandidateChange.runtimeAffecting || change.runtimeAffecting;
7173
+ pendingHmrCandidateChange.file = change.file;
7174
+ };
7175
+ const queueFullHmrCssRegeneration = () => {
7176
+ pendingHmrCandidateChange = void 0;
7177
+ pendingHmrCssTargetFiles = void 0;
7178
+ pendingFullHmrCssRegeneration = true;
7179
+ };
7180
+ const applySourceCandidateHmrState = (change) => {
7181
+ if (require_source_candidate_scan_signature.isSourceStyleRequest(change.file)) {
7182
+ clearPendingHmrCandidateChange();
7183
+ return change;
7184
+ }
7185
+ const preserveDeletedCssInHmr = resolveCurrentGeneratorOptions().hmr.preserveDeletedCss;
7186
+ if (preserveDeletedCssInHmr && !change.runtimeAffecting) {
7187
+ if (change.addedCandidates.size > 0) queueHmrCandidateChange(change);
7188
+ else if (!pendingHmrCandidateChange) clearPendingHmrCandidateChange();
7189
+ return change;
7190
+ }
7191
+ clearPendingHmrCandidateChange();
7192
+ if (!preserveDeletedCssInHmr) queueFullHmrCssRegeneration();
7193
+ return change;
7194
+ };
7195
+ const resolvePendingHmrCandidateChange = (generatorCode, file) => {
7196
+ if (resolvedConfig?.command !== "serve" || !pendingHmrCandidateChange || pendingHmrCandidateChange.runtimeAffecting || pendingHmrCandidateChange.addedCandidates.size === 0 || resolveCurrentGeneratorOptions().target === "weapp" && require_generator.hasUserCssLayerBlocks(generatorCode) || !cleanGeneratedCssByFile.has(file) || !generatedClassSetByFile.has(file) || pendingHmrCssTargetFiles !== void 0 && !pendingHmrCssTargetFiles.has(normalizeHmrCssTargetFile(file))) return;
7197
+ return pendingHmrCandidateChange;
7198
+ };
7199
+ const finishPendingHmrCssTargetFile = (file) => {
7200
+ if (!pendingHmrCandidateChange) return;
7201
+ if (!pendingHmrCssTargetFiles) {
7202
+ clearPendingHmrCandidateChange();
7203
+ return;
7204
+ }
7205
+ pendingHmrCssTargetFiles.delete(normalizeHmrCssTargetFile(file));
7206
+ if (pendingHmrCssTargetFiles.size === 0) clearPendingHmrCandidateChange();
7207
+ };
6669
7208
  const hasSourceCandidateScanState = () => sourceCandidateScanSignature !== void 0;
6670
7209
  const normalizeSourceScanDependency = (file) => node_path.default.normalize(node_path.default.resolve((0, _weapp_tailwindcss_shared.cleanUrl)(file)));
6671
7210
  const isSourceScanDependency = (file) => sourceScanDependencies.has(normalizeSourceScanDependency(file));
@@ -6691,7 +7230,7 @@ function createViteFrameworkPlugins(options = {}, frameworkBranch) {
6691
7230
  seenRoots.add(basedir);
6692
7231
  }
6693
7232
  for (const cssEntry of opts.tailwindcss?.v4?.cssEntries ?? []) {
6694
- if (!require_v4_engine.isTailwindV4CssEntry(cssEntry)) continue;
7233
+ if (!require_generator.isTailwindV4CssEntry(cssEntry)) continue;
6695
7234
  const cssEntryRoot = node_path.default.dirname(node_path.default.resolve(cssEntry));
6696
7235
  if (seenRoots.has(cssEntryRoot)) continue;
6697
7236
  roots.push({ root: cssEntryRoot });
@@ -6770,34 +7309,41 @@ function createViteFrameworkPlugins(options = {}, frameworkBranch) {
6770
7309
  const waitForSourceCandidateSyncs = async () => {
6771
7310
  while (pendingSourceCandidateSyncs.size > 0) await Promise.all(pendingSourceCandidateSyncs);
6772
7311
  };
6773
- const syncChangedSourceCandidateFile = (id) => {
6774
- if (!shouldOwnTailwindGeneration || !require_hmr_timing.isSourceCandidateRequest(id)) return Promise.resolve();
7312
+ const syncChangedSourceCandidateFile = (id, sourceOverride) => {
7313
+ if (!shouldOwnTailwindGeneration || !require_hmr_timing.isSourceCandidateRequest(id)) return Promise.resolve(void 0);
6775
7314
  const file = (0, _weapp_tailwindcss_shared.cleanUrl)(id);
6776
- if (isSourceScanDependency(file)) invalidateSourceCandidateScan();
7315
+ const runtimeAffectingByDependency = isSourceScanDependency(file);
7316
+ if (runtimeAffectingByDependency) invalidateSourceCandidateScan();
6777
7317
  if (sourceScanMatcher && !sourceScanMatcher(file)) {
6778
- sourceCandidateCollector.remove(file);
7318
+ const change = sourceCandidateCollector.remove(file);
6779
7319
  cacheCurrentSourceCandidateScan();
6780
7320
  if (require_source_candidate_scan_signature.isSourceStyleRequest(file)) return (0, node_fs_promises.readFile)(file, "utf8").then((source) => cssMemory.refreshRememberedCssSourceBySourceFile(file, source)).catch((error) => {
6781
7321
  if ((typeof error === "object" && error !== null && "code" in error ? error.code : void 0) !== "ENOENT") debug("remembered css source watch refresh failed: %s %O", file, error);
6782
- }).then(() => cssMemory.refreshRememberedCssSourceByCurrentFile(file)).then(() => void 0);
6783
- return cssMemory.refreshRememberedCssSourceByCurrentFile(file);
7322
+ }).then(() => cssMemory.refreshRememberedCssSourceByCurrentFile(file)).then(() => applySourceCandidateHmrState(createViteSourceCandidateChange(file, change, { runtimeAffecting: true })));
7323
+ return cssMemory.refreshRememberedCssSourceByCurrentFile(file).then(() => applySourceCandidateHmrState(createViteSourceCandidateChange(file, change, { runtimeAffecting: true })));
6784
7324
  }
6785
- const existingTask = pendingSourceCandidateSyncByFile.get(file);
6786
- if (existingTask) return existingTask.then(() => cssMemory.refreshRememberedCssSourceByCurrentFile(file)).then(() => void 0);
6787
- const task = sourceCandidateCollector.syncCurrentFile(id).catch((error) => {
7325
+ const existingTask = sourceOverride === void 0 ? pendingSourceCandidateSyncByFile.get(file) : void 0;
7326
+ if (existingTask) return existingTask.then(async () => {
7327
+ return await syncChangedSourceCandidateFile(id);
7328
+ });
7329
+ const task = (sourceOverride === void 0 ? sourceCandidateCollector.syncCurrentFile(id) : sourceCandidateCollector.syncCurrentSource(id, sourceOverride)).catch((error) => {
6788
7330
  debug("source candidate watch sync failed: %s %O", id, error);
6789
- }).then(() => {
7331
+ }).then((change) => {
6790
7332
  cacheCurrentSourceCandidateScan();
7333
+ return change ? applySourceCandidateHmrState(createViteSourceCandidateChange(file, change, { runtimeAffecting: runtimeAffectingByDependency })) : void 0;
6791
7334
  }).finally(() => {
6792
7335
  pendingSourceCandidateSyncs.delete(task);
6793
7336
  pendingSourceCandidateSyncByFile.delete(file);
6794
7337
  });
6795
7338
  pendingSourceCandidateSyncs.add(task);
6796
7339
  pendingSourceCandidateSyncByFile.set(file, task);
6797
- return task.then(() => cssMemory.refreshRememberedCssSourceByCurrentFile(file)).then(() => void 0);
7340
+ return task.then(async (change) => {
7341
+ await cssMemory.refreshRememberedCssSourceByCurrentFile(file);
7342
+ return change;
7343
+ });
6798
7344
  };
6799
7345
  const recordCssAssetResult = (file, css) => {
6800
- touchMapEntry(viteGeneratedCssByFile, normalizeVitePersistentCacheKey(file), css);
7346
+ touchMapEntry(cleanGeneratedCssByFile, normalizeVitePersistentCacheKey(file), css);
6801
7347
  };
6802
7348
  const recordViteProcessedCssAssetResult = (file, css, options = {}) => {
6803
7349
  const key = normalizeVitePersistentCacheKey(file);
@@ -6811,8 +7357,11 @@ function createViteFrameworkPlugins(options = {}, frameworkBranch) {
6811
7357
  const getViteProcessedCssAssetResults = () => viteProcessedCssAssetResults.entries();
6812
7358
  const getViteProcessedCssAssetResult = (file) => viteProcessedCssAssetResults.get(normalizeVitePersistentCacheKey(file));
6813
7359
  const getViteCssCacheStats = () => ({
6814
- viteGeneratedCssByFile: viteGeneratedCssByFile.size,
6815
- viteGeneratedCssByFileRaw: summarizeStringCache(viteGeneratedCssByFile),
7360
+ cleanGeneratedCssByFile: cleanGeneratedCssByFile.size,
7361
+ cleanGeneratedCssByFileRaw: summarizeStringCache(cleanGeneratedCssByFile),
7362
+ tracedGeneratedCssByFile: tracedGeneratedCssByFile.size,
7363
+ tracedGeneratedCssByFileRaw: summarizeStringCache(tracedGeneratedCssByFile),
7364
+ generatedClassSetByFile: generatedClassSetByFile.size,
6816
7365
  viteProcessedCssAssetResults: viteProcessedCssAssetResults.size,
6817
7366
  viteProcessedCssAssetResultsRaw: summarizeViteProcessedCssResults(viteProcessedCssAssetResults),
6818
7367
  ...cssMemory.getStats(),
@@ -6822,7 +7371,9 @@ function createViteFrameworkPlugins(options = {}, frameworkBranch) {
6822
7371
  });
6823
7372
  const pruneViteCssCaches = (options) => {
6824
7373
  const activeFiles = new Set([...options.activeFiles].map(normalizeVitePersistentCacheKey));
6825
- for (const key of viteGeneratedCssByFile.keys()) if (!activeFiles.has(key)) viteGeneratedCssByFile.delete(key);
7374
+ for (const key of cleanGeneratedCssByFile.keys()) if (!activeFiles.has(key)) cleanGeneratedCssByFile.delete(key);
7375
+ for (const key of tracedGeneratedCssByFile.keys()) if (!activeFiles.has(key)) tracedGeneratedCssByFile.delete(key);
7376
+ for (const key of generatedClassSetByFile.keys()) if (!activeFiles.has(key)) generatedClassSetByFile.delete(key);
6826
7377
  for (const [key, record] of viteProcessedCssAssetResults) {
6827
7378
  const outputKey = typeof record.outputFile === "string" ? normalizeVitePersistentCacheKey(record.outputFile) : void 0;
6828
7379
  if (!activeFiles.has(key) && (outputKey == null || !activeFiles.has(outputKey))) viteProcessedCssAssetResults.delete(key);
@@ -6836,7 +7387,12 @@ function createViteFrameworkPlugins(options = {}, frameworkBranch) {
6836
7387
  const rememberTailwindRootCssModule = (id) => {
6837
7388
  if (!shouldOwnTailwindGeneration) return;
6838
7389
  tailwindRootCssModuleIds.add(id);
6839
- tailwindRootCssModuleIds.add((0, _weapp_tailwindcss_shared.cleanUrl)(id));
7390
+ const cleanId = (0, _weapp_tailwindcss_shared.cleanUrl)(id);
7391
+ if (require_source_candidate_scan_signature.isSourceStyleRequest(cleanId)) tailwindRootCssModuleIds.add(cleanId);
7392
+ };
7393
+ const registerTailwindRootCss = async (id, code) => {
7394
+ rememberTailwindRootCssModule(id);
7395
+ await registerAutoCssSource(id, code);
6840
7396
  };
6841
7397
  const isUniViteProject = () => {
6842
7398
  return resolvedConfig?.plugins?.some((plugin) => plugin.name.includes("uni")) ?? false;
@@ -6878,7 +7434,7 @@ function createViteFrameworkPlugins(options = {}, frameworkBranch) {
6878
7434
  const file = (0, _weapp_tailwindcss_shared.cleanUrl)(id);
6879
7435
  const requestFile = require_source_candidate_scan_signature.isCSSRequest(id) ? id === file ? resolveSfcStyleRequestFromKnownSource(file, cssMemory.getKnownSfcSource(file), code) : id : file;
6880
7436
  if (!require_source_candidate_scan_signature.isCSSRequest(requestFile) || opts.htmlMatcher(file) || require_source_candidate_scan_signature.isHTMLRequest(file)) return;
6881
- const generatorCode = require_v4_engine.normalizeEmptyTailwindCustomVariants(code);
7437
+ const generatorCode = require_generator.normalizeEmptyTailwindCustomVariants(code);
6882
7438
  const rootDir = resolvedConfig?.root ? node_path.default.resolve(resolvedConfig.root) : node_process.default.cwd();
6883
7439
  const currentGeneratorOptions = resolveCurrentGeneratorOptions();
6884
7440
  const currentGeneratorBranch = resolveCurrentGeneratorBranch();
@@ -6889,28 +7445,41 @@ function createViteFrameworkPlugins(options = {}, frameworkBranch) {
6889
7445
  const shouldPreserveStyleOutputExtension = frameworkCssPipelineStrategy?.shouldPreserveStyleOutputExtension?.(cssPipelineContext) ?? frameworkCssPipelineStrategy?.isNativeAppStyleTarget?.(cssPipelineContext) === true;
6890
7446
  const sourceRoot = resolveWeappViteSourceRoot(resolvedConfig, opts.appType);
6891
7447
  const outputFile = resolveViteCssPipelineOutputFile(requestFile, opts, rootDir, currentGeneratorBranch.isWeb, shouldPreserveStyleOutputExtension, sourceRoot);
6892
- const runtime = getRecordedGeneratorCandidates() ?? getSourceCandidates() ?? await ensureRuntimeClassSet();
7448
+ const generatorTransformCode = currentGeneratorBranch.isWeb ? generatorCode : require_hmr_timing.normalizeMiniProgramGeneratorCssSource(generatorCode, outputFile);
7449
+ const fullRuntime = getSourceCandidates() ?? getRecordedGeneratorCandidates() ?? await ensureRuntimeClassSet();
7450
+ const pendingHmrChange = resolvePendingHmrCandidateChange(generatorCode, file);
7451
+ const forceFullHmrCssRegeneration = pendingFullHmrCssRegeneration || resolvedConfig?.command === "serve" && pendingHmrCandidateChange !== void 0 && pendingHmrChange === void 0;
7452
+ const runtime = pendingHmrChange ? new Set(pendingHmrChange.addedCandidates) : fullRuntime;
7453
+ if (pendingHmrChange && currentGeneratorOptions.target === "weapp" && require_generator.filterUnsupportedMiniProgramTailwindV4Candidates(pendingHmrChange.addedCandidates).size === 0) {
7454
+ const previousTracedCss = tracedGeneratedCssByFile.get(file);
7455
+ if (previousTracedCss !== void 0) {
7456
+ finishPendingHmrCssTargetFile(file);
7457
+ return `${require_source_candidate_scan_signature.createBundlerGeneratedCssMarker("vite", normalizeViteProcessedCssFile(file))}\n${previousTracedCss}`;
7458
+ }
7459
+ }
6893
7460
  const sourceCssHandlerOptions = transformCssHandlerOptions.getCssHandlerOptions(requestFile);
6894
7461
  const outputCssHandlerOptions = transformCssHandlerOptions.getCssHandlerOptions(outputFile);
6895
7462
  const cssHandlerOptions = {
6896
7463
  ...sourceCssHandlerOptions,
6897
7464
  isMainChunk: outputCssHandlerOptions.isMainChunk
6898
7465
  };
6899
- const transientCssSource = transientAutoCssSources.get(file) ?? (require_v4_engine.hasTailwindRootDirectives(generatorCode, { importFallback: currentGeneratorOptions.importFallback }) || require_v4_engine.hasTailwindSourceDirectives(generatorCode, { importFallback: currentGeneratorOptions.importFallback }) || require_v4_engine.hasTailwindApplyDirective(generatorCode) ? {
7466
+ const transientCssSource = transientAutoCssSources.get(file) ?? (require_generator.hasTailwindRootDirectives(generatorTransformCode, { importFallback: currentGeneratorOptions.importFallback }) || require_generator.hasTailwindSourceDirectives(generatorTransformCode, { importFallback: currentGeneratorOptions.importFallback }) || require_generator.hasTailwindApplyDirective(generatorTransformCode) ? {
6900
7467
  base: node_path.default.dirname(node_path.default.resolve(file)),
6901
- css: generatorCode,
7468
+ css: generatorTransformCode,
6902
7469
  file: node_path.default.resolve(file)
6903
7470
  } : void 0);
6904
7471
  const shouldDeferEmptyScopedCssSource = transientCssSource == null && (frameworkCssPipelineStrategy?.shouldDeferEmptyScopedCssSource?.({
6905
7472
  ...cssPipelineContext,
6906
7473
  cssHandlerOptions,
6907
- generatorCode
7474
+ generatorCode: generatorTransformCode
6908
7475
  }) ?? true);
6909
- const generated = await require_source_candidate_scan_signature.generateTailwindV4Css({
7476
+ const previousCss = pendingHmrChange && !forceFullHmrCssRegeneration ? cleanGeneratedCssByFile.get(file) : void 0;
7477
+ const previousGeneratorCss = previousCss && !currentGeneratorBranch.isWeb ? require_hmr_timing.normalizeMiniProgramGeneratorCssSource(previousCss, outputFile) : previousCss;
7478
+ const generated = await hmrTimingRecorder.measure("generateCss.serve", () => require_source_candidate_scan_signature.generateTailwindV4Css({
6910
7479
  opts,
6911
7480
  runtimeState,
6912
7481
  runtime,
6913
- rawSource: generatorCode,
7482
+ rawSource: generatorTransformCode,
6914
7483
  file,
6915
7484
  outputFile,
6916
7485
  cssHandlerOptions,
@@ -6920,25 +7489,45 @@ function createViteFrameworkPlugins(options = {}, frameworkBranch) {
6920
7489
  generatorPlatform: resolveGeneratorPlatform(),
6921
7490
  styleHandler,
6922
7491
  debug,
6923
- previousCss: viteGeneratedCssByFile.get(file),
7492
+ previousCss: previousGeneratorCss,
7493
+ previousClassSet: pendingHmrChange && !forceFullHmrCssRegeneration ? generatedClassSetByFile.get(file) : void 0,
6924
7494
  deferEmptyScopedCssSource: shouldDeferEmptyScopedCssSource,
7495
+ disableSourceScan: pendingHmrChange !== void 0,
6925
7496
  restoreLocalCssImports: !currentGeneratorBranch.isWeb
7497
+ }), {
7498
+ file,
7499
+ memoryDebug: {
7500
+ cleanCacheHit: cleanGeneratedCssByFile.has(file),
7501
+ forceFullHmrCssRegeneration,
7502
+ pendingAddedCandidates: pendingHmrCandidateChange?.addedCandidates.size ?? 0,
7503
+ pendingCssTargets: pendingHmrCssTargetFiles?.size ?? 0,
7504
+ pendingResolved: pendingHmrChange !== void 0,
7505
+ runtimeCandidates: runtime.size,
7506
+ target: currentGeneratorOptions.target
7507
+ }
6926
7508
  });
6927
- if (!generated) return;
7509
+ if (!generated) {
7510
+ if (pendingHmrChange) finishPendingHmrCssTargetFile(file);
7511
+ else if (!pendingHmrCandidateChange) clearPendingHmrCandidateChange();
7512
+ return;
7513
+ }
6928
7514
  const finalizedCss = finalizeViteMiniProgramCss(generated.css);
6929
- const shouldApplyWebCssCompat = currentGeneratorBranch.isWeb || frameworkCssPipelineStrategy?.shouldApplyWebCssCompat?.(cssPipelineContext) === true;
6930
- const tracedCss = require_hmr_timing.annotateCssSourceTrace(frameworkCssPipelineStrategy?.transformGeneratedCss?.(finalizedCss, {
7515
+ const shouldApplyWebCssCompat = shouldApplyViteWebCssCompat(cssPipelineContext, frameworkCssPipelineStrategy);
7516
+ const outputCss = frameworkCssPipelineStrategy?.transformGeneratedCss?.(finalizedCss, {
6931
7517
  ...cssPipelineContext,
6932
- defaultWebCssCompat: (css) => applyViteWebCssCompat(css, { compat: currentGeneratorOptions.webCompat ?? true }),
7518
+ defaultWebCssCompat: (css) => (0, _weapp_tailwindcss_postcss.transformWebCssCompat)(css, resolveViteWebCssCompatOptions(cssPipelineContext)),
6933
7519
  removeScopedPreflight: removeScopedTailwindPreflightCss,
6934
7520
  shouldApplyWebCssCompat
6935
- }) ?? removeScopedTailwindPreflightCss(shouldApplyWebCssCompat ? applyViteWebCssCompat(finalizedCss, { compat: currentGeneratorOptions.webCompat ?? true }) : finalizedCss), {
7521
+ }) ?? removeScopedTailwindPreflightCss(shouldApplyWebCssCompat ? (0, _weapp_tailwindcss_postcss.transformWebCssCompat)(finalizedCss, resolveViteWebCssCompatOptions(cssPipelineContext)) : finalizedCss);
7522
+ const tracedCss = require_hmr_timing.annotateCssSourceTrace(outputCss, {
6936
7523
  opts,
6937
7524
  tokenSources: require_hmr_timing.createCssTokenSourceMap(getSourceCandidateSourcesForEntries(void 0), opts)
6938
7525
  });
6939
7526
  for (const dependency of generated.dependencies) hookContext?.addWatchFile?.(dependency);
6940
- viteGeneratedCssByFile.set(file, tracedCss);
6941
- const shouldInjectGeneratedCssIntoMain = mainCssChunkMatcher(outputFile, opts.appType) || require_v4_engine.hasTailwindRootDirectives(generatorCode, { importFallback: currentGeneratorOptions.importFallback }) && !require_source_candidate_scan_signature.normalizeOutputPathKey(outputFile).includes("/");
7527
+ cleanGeneratedCssByFile.set(file, outputCss);
7528
+ tracedGeneratedCssByFile.set(file, tracedCss);
7529
+ generatedClassSetByFile.set(file, new Set(generated.classSet));
7530
+ const shouldInjectGeneratedCssIntoMain = mainCssChunkMatcher(outputFile, opts.appType) || require_generator.hasTailwindRootDirectives(generatorTransformCode, { importFallback: currentGeneratorOptions.importFallback }) && !require_source_candidate_scan_signature.normalizeOutputPathKey(outputFile).includes("/");
6942
7531
  recordViteProcessedCssAssetResult(file, tracedCss, {
6943
7532
  injectIntoMain: shouldInjectGeneratedCssIntoMain,
6944
7533
  outputFile
@@ -6954,7 +7543,9 @@ function createViteFrameworkPlugins(options = {}, frameworkBranch) {
6954
7543
  });
6955
7544
  markViteProcessedCssSource(file);
6956
7545
  rememberTailwindRootCssModule(id);
6957
- recordGeneratorCandidates(runtime);
7546
+ recordGeneratorCandidates(fullRuntime);
7547
+ if (pendingHmrChange) finishPendingHmrCssTargetFile(file);
7548
+ else if (!pendingHmrCandidateChange) clearPendingHmrCandidateChange();
6958
7549
  cssMemory.rememberCssSource({
6959
7550
  outputFile,
6960
7551
  rawSource: code,
@@ -6967,10 +7558,10 @@ function createViteFrameworkPlugins(options = {}, frameworkBranch) {
6967
7558
  getAppType: () => opts.appType,
6968
7559
  generateTailwindCss: generateTailwindCssForVitePipeline,
6969
7560
  rootImport: shouldOwnTailwindGeneration ? `${weappTailwindcssDirPosix}/generator-placeholder.css` : void 0,
6970
- onTailwindRootCss: (id, code) => registerAutoCssSource(id, code),
7561
+ onTailwindRootCss: registerTailwindRootCss,
6971
7562
  onCssSourceTransform: (id, code) => cssMemory.refreshRememberedCssSourceBySourceFile(id, code),
6972
7563
  shouldGenerateCss: (_id, code) => hasVitePipelineTailwindGenerationDirective(code),
6973
- shouldDeferGeneration: (_id, code) => !shouldRewriteCssImports && require_v4_engine.hasTailwindRootDirectives(code, { importFallback: resolveCurrentGeneratorOptions().importFallback }),
7564
+ shouldDeferGeneration: (_id, code) => !shouldRewriteCssImports && require_generator.hasTailwindRootDirectives(code, { importFallback: resolveCurrentGeneratorOptions().importFallback }),
6974
7565
  shouldOwnTailwindGeneration,
6975
7566
  shouldRewrite: shouldRewriteCssImports,
6976
7567
  weappTailwindcssDirPosix
@@ -7073,7 +7664,10 @@ function createViteFrameworkPlugins(options = {}, frameworkBranch) {
7073
7664
  let transformedCode = code;
7074
7665
  if (shouldOwnTailwindGeneration && !resolveCurrentGeneratorBranch().isWeb && require_source_candidate_scan_signature.isCSSRequest(id)) transformedCode = transformEarlyMiniProgramCss(code);
7075
7666
  const shouldReturnTransformedCode = transformedCode !== code;
7076
- if (shouldOwnTailwindGeneration) cssMemory.rememberKnownSfcSource(id, transformedCode);
7667
+ if (shouldOwnTailwindGeneration) {
7668
+ cssMemory.rememberKnownSfcSource(id, transformedCode);
7669
+ if (require_source_candidate_scan_signature.isCSSRequest(id) && require_generator.hasTailwindRootDirectives(transformedCode, { importFallback: resolveCurrentGeneratorOptions().importFallback })) rememberTailwindRootCssModule(id);
7670
+ }
7077
7671
  if (!shouldOwnTailwindGeneration || !require_hmr_timing.isSourceCandidateRequest(id) || !shouldCollectTransformedSourceCandidates(id)) {
7078
7672
  if (shouldReturnTransformedCode) return {
7079
7673
  code: transformedCode,
@@ -7103,8 +7697,10 @@ function createViteFrameworkPlugins(options = {}, frameworkBranch) {
7103
7697
  if (shouldOwnTailwindGeneration && require_hmr_timing.isSourceCandidateRequest(id)) invalidateRecordedGeneratorCandidates();
7104
7698
  if (isSourceScanDependency(id)) invalidateSourceCandidateScan();
7105
7699
  if (change.event === "delete") {
7106
- sourceCandidateCollector.remove(id);
7700
+ const file = (0, _weapp_tailwindcss_shared.cleanUrl)(id);
7701
+ const sourceCandidateChange = sourceCandidateCollector.remove(file);
7107
7702
  cacheCurrentSourceCandidateScan();
7703
+ applySourceCandidateHmrState(createViteSourceCandidateChange(file, sourceCandidateChange, { runtimeAffecting: isSourceScanDependency(file) }));
7108
7704
  return;
7109
7705
  }
7110
7706
  await syncChangedSourceCandidateFile(id);
@@ -7113,18 +7709,36 @@ function createViteFrameworkPlugins(options = {}, frameworkBranch) {
7113
7709
  async handleHotUpdate(ctx) {
7114
7710
  return hmrTimingRecorder.measure("sourceCandidates.handleHotUpdate", async () => {
7115
7711
  const isSourceCandidateHotUpdate = shouldOwnTailwindGeneration && require_hmr_timing.isSourceCandidateRequest(ctx.file);
7116
- await syncChangedSourceCandidateFile(ctx.file);
7712
+ if (isSourceCandidateHotUpdate && require_source_candidate_scan_signature.isSourceStyleRequest(ctx.file)) for (const mod of ctx.modules) {
7713
+ if (mod.id) rememberTailwindRootCssModule(mod.id);
7714
+ if (mod.url) rememberTailwindRootCssModule(mod.url);
7715
+ if (mod.file) rememberTailwindRootCssModule(mod.file);
7716
+ }
7717
+ const canReadHotSource = typeof ctx.read === "function";
7718
+ const hotSource = isSourceCandidateHotUpdate && canReadHotSource ? await ctx.read().catch(() => void 0) : void 0;
7719
+ const sourceCandidateChange = await syncChangedSourceCandidateFile(ctx.file, hotSource);
7117
7720
  const isWebLikeHotUpdate = isCurrentWebLikeStylePlatform();
7721
+ let canUseHmrCandidateAppend = false;
7118
7722
  if (isSourceCandidateHotUpdate) {
7119
7723
  invalidateRecordedGeneratorCandidates();
7120
- if (isWebLikeHotUpdate) {
7121
- await refreshRuntimeStateForAutoCssSources?.(true);
7122
- await syncSourceCandidateScan({ force: true });
7724
+ const preserveDeletedCssInHmr = resolveCurrentGeneratorOptions().hmr.preserveDeletedCss;
7725
+ canUseHmrCandidateAppend = preserveDeletedCssInHmr && !require_source_candidate_scan_signature.isSourceStyleRequest(ctx.file) && sourceCandidateChange !== void 0 && !sourceCandidateChange.runtimeAffecting;
7726
+ if (!canUseHmrCandidateAppend) {
7727
+ if (sourceCandidateChange === void 0) {
7728
+ clearPendingHmrCandidateChange();
7729
+ if (!preserveDeletedCssInHmr && !require_source_candidate_scan_signature.isSourceStyleRequest(ctx.file)) queueFullHmrCssRegeneration();
7730
+ }
7731
+ if (isWebLikeHotUpdate) {
7732
+ await refreshRuntimeStateForAutoCssSources?.(true);
7733
+ await syncSourceCandidateScan({ force: true });
7734
+ }
7123
7735
  }
7124
7736
  }
7737
+ if (isSourceCandidateHotUpdate) await waitForSourceCandidateSyncs();
7125
7738
  const cssModules = resolveHotTailwindCssModules(ctx, tailwindRootCssModuleIds);
7126
7739
  const sourceModules = isSourceCandidateHotUpdate && !require_source_candidate_scan_signature.isSourceStyleRequest(ctx.file) ? resolveHotSourceModules(ctx) : ctx.modules;
7127
- if (isSourceCandidateHotUpdate && !require_source_candidate_scan_signature.isSourceStyleRequest(ctx.file) && !isWebLikeHotUpdate && (!hasSelfAcceptingNonStyleHotModule(sourceModules) && cssModules.length === 0 || cssModules.length > 0 && isUniViteProject())) {
7740
+ const hasHmrCandidateAppend = pendingHmrCandidateChange !== void 0 && !pendingHmrCandidateChange.runtimeAffecting && pendingHmrCandidateChange.addedCandidates.size > 0 || canUseHmrCandidateAppend && sourceCandidateChange !== void 0 && sourceCandidateChange.addedCandidates.size > 0;
7741
+ if (isSourceCandidateHotUpdate && !require_source_candidate_scan_signature.isSourceStyleRequest(ctx.file) && !hasHmrCandidateAppend && !isWebLikeHotUpdate && (!hasSelfAcceptingNonStyleHotModule(sourceModules) && cssModules.length === 0 || cssModules.length > 0 && isUniViteProject())) {
7128
7742
  sendFullReloadForUnresolvedHotUpdate(ctx);
7129
7743
  return [];
7130
7744
  }
@@ -7132,7 +7746,10 @@ function createViteFrameworkPlugins(options = {}, frameworkBranch) {
7132
7746
  sendFullReloadForUnresolvedHotUpdate(ctx);
7133
7747
  return [];
7134
7748
  }
7135
- sendSupplementalCssHotUpdates(ctx, cssModules);
7749
+ const shouldSendSupplementalCssHotUpdates = !(isWebLikeHotUpdate && isSourceCandidateHotUpdate && !require_source_candidate_scan_signature.isSourceStyleRequest(ctx.file) && resolveCurrentGeneratorOptions().hmr.preserveDeletedCss && sourceCandidateChange !== void 0 && !sourceCandidateChange.runtimeAffecting && sourceCandidateChange.addedCandidates.size === 0 && sourceCandidateChange.removedCandidates.size > 0);
7750
+ const supplementalCssFallbackIds = /* @__PURE__ */ new Set([...tailwindRootCssModuleIds, ...viteProcessedCssSourceFiles]);
7751
+ if (hasHmrCandidateAppend) armPendingHmrCssTargetFiles(cssModules, supplementalCssFallbackIds);
7752
+ if (shouldSendSupplementalCssHotUpdates) sendSupplementalCssHotUpdates(ctx, cssModules, supplementalCssFallbackIds);
7136
7753
  if (isWebLikeHotUpdate && isSourceCandidateHotUpdate && !require_source_candidate_scan_signature.isSourceStyleRequest(ctx.file)) return;
7137
7754
  if (isSourceCandidateHotUpdate && !require_source_candidate_scan_signature.isSourceStyleRequest(ctx.file) && cssModules.length > 0) return [...sourceModules, ...cssModules];
7138
7755
  return cssModules.length > 0 ? [...ctx.modules, ...cssModules] : void 0;
@@ -7147,7 +7764,7 @@ function createViteFrameworkPlugins(options = {}, frameworkBranch) {
7147
7764
  ...createViteServeCssGenerationPlugins({
7148
7765
  generateCss: generateTailwindCssForVitePipeline,
7149
7766
  getCommand: () => resolvedConfig?.command,
7150
- onTailwindRootCss: (id, code) => registerAutoCssSource(id, code),
7767
+ onTailwindRootCss: registerTailwindRootCss,
7151
7768
  shouldGenerate: () => shouldOwnTailwindGeneration
7152
7769
  }),
7153
7770
  createViteServeJsTransformPlugin({
@@ -7332,13 +7949,13 @@ const uniAppCssPipelineStrategy = {
7332
7949
  return context.isWebGeneratorTarget && isUniAppWebviewAppBundle(context.bundleFiles);
7333
7950
  },
7334
7951
  shouldSelectConfiguredCssEntryRootSource(context) {
7335
- return context.currentGeneratorBranch.isWeb && context.opts.cssMatcher(context.outputFile) && context.isRootStyleOutputFile(context.outputFile);
7952
+ return context.opts.cssMatcher(context.outputFile) && context.isRootStyleOutputFile(context.outputFile);
7336
7953
  },
7337
7954
  shouldTransformServeJs(context) {
7338
7955
  return !context.currentGeneratorBranch.isWeb || isUniAppWebviewStylePlatform(context.resolveStylePlatform());
7339
7956
  },
7340
7957
  transformGeneratedCss(css, context) {
7341
- const webCss = context.shouldApplyWebCssCompat ? (0, _weapp_tailwindcss_postcss.transformWebCssCompat)(css, context.currentGeneratorBranch.isWeb ? context.currentGeneratorOptions.webCompat : context.currentGeneratorOptions.webCompat ?? true) : css;
7958
+ const webCss = context.shouldApplyWebCssCompat ? context.defaultWebCssCompat(css) : css;
7342
7959
  const safeCss = isUniAppWebviewStylePlatform(context.resolveStylePlatform()) ? (0, _weapp_tailwindcss_postcss.transformWebCssSafeSelectors)(webCss, { escapeMap: context.opts.escapeMap }) : webCss;
7343
7960
  return context.removeScopedPreflight(safeCss);
7344
7961
  }
@@ -7460,7 +8077,7 @@ const uniAppXCssPipelineStrategy = {
7460
8077
  return true;
7461
8078
  },
7462
8079
  shouldDeferEmptyScopedCssSource(context) {
7463
- if (!context.cssHandlerOptions.isMainChunk && require_v4_engine.hasTailwindApplyDirective(context.generatorCode)) return false;
8080
+ if (!context.cssHandlerOptions.isMainChunk && require_generator.hasTailwindApplyDirective(context.generatorCode)) return false;
7464
8081
  return true;
7465
8082
  },
7466
8083
  transformGeneratedCss(css, context) {