weapp-tailwindcss 5.0.10 → 5.0.12

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 (57) hide show
  1. package/dist/{bundle-state-CXzPknlT.mjs → bundle-state-BxMNKjBV.mjs} +2 -34
  2. package/dist/{bundle-state-BwtEqxvU.js → bundle-state-DU2ATDhw.js} +1 -39
  3. package/dist/bundlers/gulp/vinyl-transform.d.ts +1 -1
  4. package/dist/bundlers/shared/hmr-timing.d.ts +1 -0
  5. package/dist/bundlers/vite/generate-bundle/css-output.d.ts +2 -1
  6. package/dist/bundlers/vite/generate-bundle/remembered-css.d.ts +1 -1
  7. package/dist/bundlers/vite/generate-bundle/types.d.ts +5 -0
  8. package/dist/bundlers/vite/generate-bundle.d.ts +1 -1
  9. package/dist/bundlers/vite/source-candidates.d.ts +6 -0
  10. package/dist/bundlers/vite/weapp-vite-config.d.ts +1 -0
  11. package/dist/bundlers/webpack/BaseUnifiedPlugin/v5-assets/helpers.d.ts +10 -8
  12. package/dist/cache/index.d.ts +4 -0
  13. package/dist/cli.js +7 -0
  14. package/dist/cli.mjs +7 -0
  15. package/dist/core.d.ts +7 -0
  16. package/dist/core.js +8 -5
  17. package/dist/core.mjs +8 -5
  18. package/dist/{generator-ChgOWNOj.js → generator-Cb1Zp3Al.js} +1 -1
  19. package/dist/{generator-h2XRiJ9-.mjs → generator-mvNFUvns.mjs} +1 -1
  20. package/dist/generator.js +2 -2
  21. package/dist/generator.mjs +2 -2
  22. package/dist/{gulp-Be88jhoY.mjs → gulp-BfZpaYSQ.mjs} +97 -11
  23. package/dist/{gulp-CHtZF-oT.js → gulp-CxGZU0-v.js} +97 -11
  24. package/dist/gulp.js +1 -1
  25. package/dist/gulp.mjs +1 -1
  26. package/dist/{hmr-timing-BkivBZvN.js → hmr-timing-DFR51wgo.js} +61 -9
  27. package/dist/{hmr-timing-Ct5w4hdM.mjs → hmr-timing-DNjF8bWA.mjs} +49 -10
  28. package/dist/index.js +4 -4
  29. package/dist/index.mjs +4 -4
  30. package/dist/postcss.js +9 -10
  31. package/dist/postcss.mjs +7 -5
  32. package/dist/{precheck-CY9oaH49.js → precheck-30zNPRlI.js} +13 -3
  33. package/dist/{precheck-BpHxsWRd.mjs → precheck-CsFr1q2l.mjs} +14 -4
  34. package/dist/presets.js +2 -2
  35. package/dist/presets.mjs +2 -2
  36. package/dist/tailwindcss/source-scan.d.ts +1 -0
  37. package/dist/tailwindcss/v3-engine/generator.d.ts +17 -0
  38. package/dist/tailwindcss/v3-engine/index.d.ts +1 -1
  39. package/dist/tailwindcss/v3-engine/types.d.ts +1 -0
  40. package/dist/tailwindcss/v4-engine/generator.d.ts +19 -0
  41. package/dist/tailwindcss/v4-engine/index.d.ts +1 -1
  42. package/dist/{tailwindcss-Bfy2egdX.mjs → tailwindcss-CK84uGBp.mjs} +1 -1
  43. package/dist/{tailwindcss-DbbAKAZP.js → tailwindcss-Clpkz1oR.js} +1 -1
  44. package/dist/{transform-Cd634UZV.js → transform-CaVEBOuR.js} +1 -1
  45. package/dist/{transform-r5evL6Hn.mjs → transform-Cju08-aJ.mjs} +1 -1
  46. package/dist/{v3-engine-D0yA9ZkF.js → v3-engine-CQE5JJNZ.js} +142 -29
  47. package/dist/{v3-engine-CFkP6dWF.mjs → v3-engine-DKBaKWGL.mjs} +131 -30
  48. package/dist/{vite-Bh-BNp5g.js → vite-BBGOjh9e.js} +301 -56
  49. package/dist/{vite-BM_iIFmS.mjs → vite-CS5DE-HD.mjs} +300 -55
  50. package/dist/vite.js +1 -1
  51. package/dist/vite.mjs +1 -1
  52. package/dist/weapp-tw-css-import-rewrite-loader.js +130 -31
  53. package/dist/{webpack-CJAOcYEO.js → webpack-DIWrcpRo.js} +93 -12
  54. package/dist/{webpack-DPdrcC2X.mjs → webpack-SPcri_D8.mjs} +92 -11
  55. package/dist/webpack.js +1 -1
  56. package/dist/webpack.mjs +1 -1
  57. package/package.json +3 -3
@@ -1,13 +1,14 @@
1
1
  const require_chunk = require("./chunk-emK7D4bc.js");
2
- const require_v3_engine = require("./v3-engine-D0yA9ZkF.js");
3
- const require_generator = require("./generator-ChgOWNOj.js");
4
- const require_precheck = require("./precheck-CY9oaH49.js");
2
+ const require_v3_engine = require("./v3-engine-CQE5JJNZ.js");
3
+ const require_generator = require("./generator-Cb1Zp3Al.js");
4
+ const require_precheck = require("./precheck-30zNPRlI.js");
5
5
  const require_utils = require("./utils-Dolmt8EO.js");
6
- const require_tailwindcss = require("./tailwindcss-DbbAKAZP.js");
7
- const require_hmr_timing = require("./hmr-timing-BkivBZvN.js");
8
- const require_bundle_state = require("./bundle-state-BwtEqxvU.js");
6
+ const require_tailwindcss = require("./tailwindcss-Clpkz1oR.js");
7
+ const require_hmr_timing = require("./hmr-timing-DFR51wgo.js");
8
+ const require_bundle_state = require("./bundle-state-DU2ATDhw.js");
9
9
  require("./logger-TlKT3xmR.js");
10
10
  let _weapp_tailwindcss_postcss = require("@weapp-tailwindcss/postcss");
11
+ let lru_cache = require("lru-cache");
11
12
  let tailwindcss_patch = require("tailwindcss-patch");
12
13
  let node_fs = require("node:fs");
13
14
  node_fs = require_chunk.__toESM(node_fs);
@@ -480,7 +481,7 @@ function resolveUniAppXStyleIsolationEnabled(root) {
480
481
  //#region src/uni-app-x/vite.ts
481
482
  let transformUVuePromise;
482
483
  function loadTransformUVue() {
483
- transformUVuePromise ?? (transformUVuePromise = Promise.resolve().then(() => require("./transform-Cd634UZV.js")).then((mod) => mod.transformUVue));
484
+ transformUVuePromise ?? (transformUVuePromise = Promise.resolve().then(() => require("./transform-CaVEBOuR.js")).then((mod) => mod.transformUVue));
484
485
  return transformUVuePromise;
485
486
  }
486
487
  const preprocessorLangs = new Set([
@@ -795,12 +796,24 @@ function resolveReplayCssOutputFile(rootDir, file) {
795
796
  if (normalizedFile.length === 0 || normalizedFile === "." || normalizedFile === ".." || normalizedFile.startsWith("../")) return require_bundle_state.normalizeOutputPathKey(node_path.default.basename(file));
796
797
  return normalizedFile;
797
798
  }
799
+ function normalizeViteSourceRoot(rootDir, sourceRoot) {
800
+ if (typeof sourceRoot !== "string" || sourceRoot.trim().length === 0) return;
801
+ return require_bundle_state.normalizeOutputPathKey(node_path.default.isAbsolute(sourceRoot) ? node_path.default.relative(rootDir, sourceRoot) : sourceRoot).replace(/\/+$/, "");
802
+ }
803
+ function resolveReplayCssOutputFileFromSourceRoot(rootDir, file, sourceRoot) {
804
+ const outputFile = resolveReplayCssOutputFile(rootDir, file);
805
+ const normalizedSourceRoot = normalizeViteSourceRoot(rootDir, sourceRoot);
806
+ if (!normalizedSourceRoot) return outputFile;
807
+ if (outputFile === normalizedSourceRoot) return node_path.default.posix.basename(outputFile);
808
+ if (outputFile.startsWith(`${normalizedSourceRoot}/`)) return outputFile.slice(normalizedSourceRoot.length + 1);
809
+ return outputFile;
810
+ }
798
811
  function resolveViteCssOutputFile(file, opts, isWebGeneratorTarget, preserveCssExtension = false) {
799
812
  if (isWebGeneratorTarget || preserveCssExtension || opts.cssMatcher(file) || !SOURCE_STYLE_OUTPUT_EXT_RE.test(file) || !require_bundle_state.isCSSRequest(file)) return file;
800
813
  return file.replace(SOURCE_STYLE_OUTPUT_EXT_RE, ".wxss");
801
814
  }
802
- function resolveViteCssPipelineOutputFile(file, _opts, rootDir, isWebGeneratorTarget = false, preserveCssExtension = false) {
803
- const normalizedFile = resolveReplayCssOutputFile(rootDir, file);
815
+ function resolveViteCssPipelineOutputFile(file, _opts, rootDir, isWebGeneratorTarget = false, preserveCssExtension = false, sourceRoot) {
816
+ const normalizedFile = resolveReplayCssOutputFileFromSourceRoot(rootDir, file, sourceRoot);
804
817
  if (isWebGeneratorTarget || preserveCssExtension || MINI_PROGRAM_STYLE_OUTPUT_EXT_RE.test(normalizedFile) || !CSS_SOURCE_OUTPUT_EXT_RE.test(normalizedFile) || !require_bundle_state.isCSSRequest(normalizedFile)) return normalizedFile;
805
818
  return normalizedFile.replace(CSS_SOURCE_OUTPUT_EXT_RE, ".wxss");
806
819
  }
@@ -1271,10 +1284,10 @@ function mergeRememberedCssSources(sources, outputFile) {
1271
1284
  sourceFile: sources[0]?.sourceFile ?? outputFile
1272
1285
  };
1273
1286
  }
1274
- function collectRememberedCssReplayGroups(sources, opts, rootDir, isWebGeneratorTarget, preserveCssExtension) {
1287
+ function collectRememberedCssReplayGroups(sources, opts, rootDir, isWebGeneratorTarget, preserveCssExtension, sourceRoot) {
1275
1288
  const groups = /* @__PURE__ */ new Map();
1276
1289
  for (const [key, remembered] of sources ?? []) {
1277
- const outputKey = require_bundle_state.normalizeOutputPathKey(resolveViteCssPipelineOutputFile(remembered.outputFile, opts, rootDir, isWebGeneratorTarget, preserveCssExtension));
1290
+ const outputKey = require_bundle_state.normalizeOutputPathKey(resolveViteCssPipelineOutputFile(remembered.outputFile, opts, rootDir, isWebGeneratorTarget, preserveCssExtension, sourceRoot));
1278
1291
  const group = groups.get(outputKey) ?? [];
1279
1292
  group.push({
1280
1293
  key,
@@ -1992,13 +2005,31 @@ function collectImportedBundleCssSources(bundle, importedStyleFiles) {
1992
2005
  }
1993
2006
  return importedSources;
1994
2007
  }
2008
+ function collectBundleAssetFiles(bundle) {
2009
+ const files = /* @__PURE__ */ new Set();
2010
+ for (const [bundleFile, output] of Object.entries(bundle)) {
2011
+ if (output.type !== "asset") continue;
2012
+ files.add(require_bundle_state.normalizeOutputPathKey(getAssetFile(bundleFile, output)));
2013
+ }
2014
+ return files;
2015
+ }
2016
+ function isCoveredViteGeneratedSourceAsset(file, existingAssetFiles, resolveViteProcessedCssOutputFile) {
2017
+ const resolvedOutputFile = require_bundle_state.normalizeOutputPathKey(resolveViteProcessedCssOutputFile?.(file) ?? file);
2018
+ return resolvedOutputFile !== require_bundle_state.normalizeOutputPathKey(file) && existingAssetFiles.has(resolvedOutputFile);
2019
+ }
1995
2020
  function collectViteProcessedCssAssetResults(bundle, options) {
1996
2021
  let collected = 0;
2022
+ const existingAssetFiles = collectBundleAssetFiles(bundle);
1997
2023
  for (const [bundleFile, output] of Object.entries(bundle)) {
1998
2024
  if (output.type !== "asset") continue;
1999
2025
  const file = getAssetFile(bundleFile, output);
2000
2026
  if (!isCssOutputFile(file) || !options.isViteProcessedCssAsset?.(output, file)) continue;
2001
2027
  const rawSource = readAssetSource(output);
2028
+ if (isCoveredViteGeneratedSourceAsset(file, existingAssetFiles, options.resolveViteProcessedCssOutputFile)) {
2029
+ delete bundle[bundleFile];
2030
+ options.debug?.("skip covered vite-generated source css asset: %s", file);
2031
+ continue;
2032
+ }
2002
2033
  const nextCss = resolveViteProcessedCssAssetSource(file, rawSource, options.resolveViteProcessedCssOutputFile);
2003
2034
  if (nextCss !== rawSource) output.source = nextCss;
2004
2035
  options.markCssAssetProcessed?.(output, file);
@@ -2104,7 +2135,19 @@ function resolveUniAppXNativeCssHandlerOptions(opts) {
2104
2135
  };
2105
2136
  }
2106
2137
  //#endregion
2138
+ //#region src/bundlers/vite/weapp-vite-config.ts
2139
+ function resolveWeappViteSourceRoot(config) {
2140
+ const srcRoot = config?.weapp?.srcRoot;
2141
+ return typeof srcRoot === "string" && srcRoot.trim().length > 0 ? srcRoot : void 0;
2142
+ }
2143
+ //#endregion
2107
2144
  //#region src/bundlers/vite/generate-bundle.ts
2145
+ const VITE_LAST_CSS_RESULT_CACHE_MAX = 64;
2146
+ function resolveViteCssTaskConcurrency(useIncrementalMode) {
2147
+ const configured = Number.parseInt(node_process.default.env["WEAPP_TW_VITE_CSS_CONCURRENCY"] ?? "", 10);
2148
+ if (Number.isFinite(configured) && configured > 0) return configured;
2149
+ return useIncrementalMode ? 1 : 2;
2150
+ }
2108
2151
  function addSiblingCssFile(files, file) {
2109
2152
  if (file.endsWith(".wxml")) files.add(file.replace(/\.wxml$/, ".wxss"));
2110
2153
  else if (file.endsWith(".js")) files.add(file.replace(/\.js$/, ".wxss"));
@@ -2115,6 +2158,90 @@ function collectRuntimeLinkedCssFiles(snapshot) {
2115
2158
  for (const file of snapshot.runtimeAffectingChangedByType.js) addSiblingCssFile(files, file);
2116
2159
  return files;
2117
2160
  }
2161
+ function normalizeViteCssCacheKey(file) {
2162
+ return require_bundle_state.normalizeOutputPathKey(file);
2163
+ }
2164
+ function rememberLastCssResult(resultByFile, sourceHashByFile, file, css, sourceHash) {
2165
+ const key = normalizeViteCssCacheKey(file);
2166
+ resultByFile.delete(key);
2167
+ sourceHashByFile.delete(key);
2168
+ resultByFile.set(key, css);
2169
+ sourceHashByFile.set(key, sourceHash);
2170
+ while (resultByFile.size > VITE_LAST_CSS_RESULT_CACHE_MAX) {
2171
+ const oldestKey = resultByFile.keys().next().value;
2172
+ if (typeof oldestKey !== "string") break;
2173
+ resultByFile.delete(oldestKey);
2174
+ sourceHashByFile.delete(oldestKey);
2175
+ }
2176
+ }
2177
+ function getLastCssResult(resultByFile, ...files) {
2178
+ for (const file of files) {
2179
+ if (!file) continue;
2180
+ const key = normalizeViteCssCacheKey(file);
2181
+ const css = resultByFile.get(key);
2182
+ if (css == null) continue;
2183
+ resultByFile.delete(key);
2184
+ resultByFile.set(key, css);
2185
+ return css;
2186
+ }
2187
+ }
2188
+ function getLastCssSourceHash(sourceHashByFile, file) {
2189
+ return sourceHashByFile.get(normalizeViteCssCacheKey(file));
2190
+ }
2191
+ function pruneLastCssResults(resultByFile, sourceHashByFile, activeFiles) {
2192
+ for (const key of resultByFile.keys()) {
2193
+ if (activeFiles.has(key)) continue;
2194
+ resultByFile.delete(key);
2195
+ sourceHashByFile.delete(key);
2196
+ }
2197
+ }
2198
+ function toMb(bytes) {
2199
+ return Math.round(bytes / 1024 / 1024);
2200
+ }
2201
+ function summarizeStringMapCache(map) {
2202
+ let bytes = 0;
2203
+ for (const value of map.values()) bytes += value.length;
2204
+ return {
2205
+ bytes,
2206
+ mb: toMb(bytes),
2207
+ size: map.size
2208
+ };
2209
+ }
2210
+ function resolveViteMemoryDebugStats(context) {
2211
+ if (node_process.default.env["WEAPP_TW_HMR_MEMORY_DEBUG"] !== "1") return;
2212
+ const memory = node_process.default.memoryUsage();
2213
+ return {
2214
+ phase: context.phase,
2215
+ mode: context.useIncrementalMode ? "incremental" : "full",
2216
+ process: {
2217
+ rssMb: toMb(memory.rss),
2218
+ heapTotalMb: toMb(memory.heapTotal),
2219
+ heapUsedMb: toMb(memory.heapUsed),
2220
+ externalMb: toMb(memory.external),
2221
+ arrayBuffersMb: toMb(memory.arrayBuffers)
2222
+ },
2223
+ runtime: {
2224
+ sourceCandidates: context.sourceCandidatesSize,
2225
+ runtime: context.runtimeSize,
2226
+ transformRuntime: context.transformRuntimeSize,
2227
+ generatorRuntime: context.generatorRuntimeSize
2228
+ },
2229
+ processCache: {
2230
+ instance: context.cache.instance.size,
2231
+ hashMap: context.cache.hashMap.size,
2232
+ activeCacheKeys: context.activeProcessCacheKeys.size,
2233
+ activeHashKeys: context.activeProcessHashKeys.size
2234
+ },
2235
+ viteCss: {
2236
+ ...context.getViteCssCacheStats?.(),
2237
+ lastCssResultByFile: summarizeStringMapCache(context.lastCssResultByFile)
2238
+ },
2239
+ tailwind: {
2240
+ v3: require_v3_engine.getTailwindV3IncrementalGenerateCacheStats(),
2241
+ v4: require_v3_engine.getTailwindV4IncrementalGenerateCacheStats()
2242
+ }
2243
+ };
2244
+ }
2118
2245
  async function createScopedGeneratorCandidateSignature(rawSource, sourceFile, fallbackSignature, getSourceCandidatesForEntries, options = {}) {
2119
2246
  if (!getSourceCandidatesForEntries || !rawSource.includes("@source")) return fallbackSignature;
2120
2247
  const resolved = await require_v3_engine.resolveTailwindV4EntriesFromCssCached(rawSource, node_path.default.dirname(node_path.default.resolve(sourceFile.replace(/[?#].*$/, ""))));
@@ -2125,6 +2252,7 @@ async function createScopedGeneratorCandidateSignature(rawSource, sourceFile, fa
2125
2252
  function createGenerateBundleHook(context) {
2126
2253
  const state = require_bundle_state.createBundleBuildState();
2127
2254
  const lastCssResultByFile = /* @__PURE__ */ new Map();
2255
+ const lastCssSourceHashByFile = /* @__PURE__ */ new Map();
2128
2256
  let currentOutDir;
2129
2257
  let currentSubpackageRoots;
2130
2258
  const cssHandlerOptions = createCssHandlerOptionsCache({
@@ -2136,7 +2264,7 @@ function createGenerateBundleHook(context) {
2136
2264
  });
2137
2265
  return async function generateBundle(_opt, bundle) {
2138
2266
  const addWatchFile = (id) => this.addWatchFile?.(id);
2139
- const { opts, runtimeState, ensureBundleRuntimeClassSet, debug, getResolvedConfig, markCssAssetProcessed, isCssAssetProcessed, isViteProcessedCssAsset, recordCssAssetResult, recordViteProcessedCssAssetResult, getViteProcessedCssAssetResults, getViteProcessedCssAssetResult, getSourceCandidates, getSourceCandidatesForEntries, getSourceCandidateSourcesForEntries, waitForSourceCandidateSyncs, rememberCssSource, refreshRememberedCssSource, getRememberedCssSources, getRememberedCssSignature, setRememberedCssSignature, getKnownSfcSource, recordGeneratorCandidates, hmrTimingRecorder } = context;
2267
+ const { opts, runtimeState, ensureBundleRuntimeClassSet, debug, getResolvedConfig, markCssAssetProcessed, isCssAssetProcessed, isViteProcessedCssAsset, recordCssAssetResult, recordViteProcessedCssAssetResult, getViteProcessedCssAssetResults, getViteProcessedCssAssetResult, getSourceCandidates, getSourceCandidatesForEntries, getSourceCandidateSourcesForEntries, waitForSourceCandidateSyncs, rememberCssSource, refreshRememberedCssSource, getRememberedCssSources, getRememberedCssSignature, setRememberedCssSignature, getKnownSfcSource, recordGeneratorCandidates, pruneViteCssCaches, getViteCssCacheStats, hmrTimingRecorder } = context;
2140
2268
  const getBundlerSfcSource = (sourceFile) => {
2141
2269
  const code = this.getModuleInfo?.(sourceFile)?.code;
2142
2270
  return typeof code === "string" && hasSfcStyleSources(code) ? code : void 0;
@@ -2154,6 +2282,7 @@ function createGenerateBundleHook(context) {
2154
2282
  const shouldGenerateWebCssByGenerator = isWebGeneratorTarget && runtimeState.twPatcher.majorVersion === 3;
2155
2283
  const { getCssHandlerOptions, getCssUserHandlerOptions } = cssHandlerOptions;
2156
2284
  const rootDir = resolvedConfig?.root ? node_path.default.resolve(resolvedConfig.root) : node_process.default.cwd();
2285
+ const sourceRoot = resolveWeappViteSourceRoot(resolvedConfig);
2157
2286
  const outDir = resolvedConfig?.build?.outDir ? node_path.default.resolve(rootDir, resolvedConfig.build.outDir) : rootDir;
2158
2287
  await runtimeState.readyPromise;
2159
2288
  debug("start");
@@ -2165,7 +2294,7 @@ function createGenerateBundleHook(context) {
2165
2294
  markCssAssetProcessed,
2166
2295
  recordCssAssetResult,
2167
2296
  recordViteProcessedCssAssetResult,
2168
- resolveViteProcessedCssOutputFile: (file) => resolveViteCssPipelineOutputFile(file, opts, rootDir, isWebGeneratorTarget, shouldPreserveAppCssExtension),
2297
+ resolveViteProcessedCssOutputFile: (file) => resolveViteCssPipelineOutputFile(file, opts, rootDir, isWebGeneratorTarget, shouldPreserveAppCssExtension, sourceRoot),
2169
2298
  debug
2170
2299
  });
2171
2300
  const hmrTimingStartedAt = performance.now();
@@ -2181,6 +2310,16 @@ function createGenerateBundleHook(context) {
2181
2310
  recordTimingDetail(`tasks.${name}`, start);
2182
2311
  }
2183
2312
  };
2313
+ const emitOrReplayCssAsset = (fileName, source) => {
2314
+ const replayAsset = createReplayCssAsset(fileName, source);
2315
+ if (typeof this.emitFile === "function") this.emitFile({
2316
+ type: "asset",
2317
+ fileName,
2318
+ source
2319
+ });
2320
+ else bundle[fileName] = replayAsset;
2321
+ return replayAsset;
2322
+ };
2184
2323
  const metrics = createEmptyMetrics();
2185
2324
  const forceRuntimeRefreshByEnv = node_process.default.env["WEAPP_TW_VITE_FORCE_RUNTIME_REFRESH"] === "1";
2186
2325
  const disableDirtyOptimization = node_process.default.env["WEAPP_TW_VITE_DISABLE_DIRTY"] === "1";
@@ -2188,6 +2327,7 @@ function createGenerateBundleHook(context) {
2188
2327
  const debugCssDiff = node_process.default.env["WEAPP_TW_VITE_DEBUG_CSS_DIFF"] === "1";
2189
2328
  const disableV3OxideSourceRuntime = node_process.default.env["WEAPP_TW_VITE_DISABLE_V3_OXIDE_RUNTIME"] === "1";
2190
2329
  const bundleFiles = Object.keys(bundle);
2330
+ const activeViteCssCacheFiles = new Set(bundleFiles.map(normalizeViteCssCacheKey));
2191
2331
  const subpackageRoots = collectMiniProgramSubpackageRoots(bundle);
2192
2332
  if (subpackageRoots) currentSubpackageRoots = subpackageRoots;
2193
2333
  const isMainPackageStyleOutputFile = (file) => currentSubpackageRoots != null && !isSubpackageOutputFile(file, currentSubpackageRoots);
@@ -2311,7 +2451,14 @@ function createGenerateBundleHook(context) {
2311
2451
  });
2312
2452
  const linkedByEntry = useIncrementalMode ? /* @__PURE__ */ new Map() : void 0;
2313
2453
  const sharedCssResultCache = /* @__PURE__ */ new Map();
2454
+ const activeProcessCacheKeys = /* @__PURE__ */ new Set();
2455
+ const activeProcessHashKeys = /* @__PURE__ */ new Set();
2456
+ const rememberProcessCacheKey = (cacheKey, hashKey = cacheKey) => {
2457
+ activeProcessCacheKeys.add(cacheKey);
2458
+ activeProcessHashKeys.add(hashKey);
2459
+ };
2314
2460
  const tasks = [];
2461
+ const cssTaskFactories = [];
2315
2462
  const jsTaskFactories = [];
2316
2463
  for (const entry of snapshot.entries) {
2317
2464
  const { file, output: originalSource, source: originalEntrySource, type } = entry;
@@ -2323,10 +2470,13 @@ function createGenerateBundleHook(context) {
2323
2470
  }
2324
2471
  if (!processFiles.html.has(file)) continue;
2325
2472
  const rawSource = originalEntrySource;
2473
+ const cacheKey = file;
2474
+ const hashKey = `${file}:html:${runtimeSignature}`;
2475
+ rememberProcessCacheKey(cacheKey, hashKey);
2326
2476
  tasks.push(timeTask("html", () => require_hmr_timing.processCachedTask({
2327
2477
  cache,
2328
- cacheKey: file,
2329
- hashKey: `${file}:html:${runtimeSignature}`,
2478
+ cacheKey,
2479
+ hashKey,
2330
2480
  hash: getSnapshotHash(snapshot.sourceHashByFile, file, rawSource),
2331
2481
  applyResult(source) {
2332
2482
  originalSource.source = source;
@@ -2365,6 +2515,7 @@ function createGenerateBundleHook(context) {
2365
2515
  metrics.css.total++;
2366
2516
  const rawSource = normalizeRelativeCssConfigDirectives(originalEntrySource, file, outDir, opts);
2367
2517
  const outputFile = resolveViteCssOutputFile(file, opts, isWebGeneratorTarget, shouldPreserveAppCssExtension);
2518
+ activeViteCssCacheFiles.add(normalizeViteCssCacheKey(outputFile));
2368
2519
  if (outputFile !== file && !canProcessViteSourceStyleAsCss(rawSource, file)) {
2369
2520
  delete bundle[file];
2370
2521
  debug("css skip raw source style asset: %s -> %s", file, outputFile);
@@ -2373,12 +2524,7 @@ function createGenerateBundleHook(context) {
2373
2524
  const applyCssResult = (source) => {
2374
2525
  if (outputFile !== file) {
2375
2526
  delete bundle[file];
2376
- if (typeof this.emitFile === "function") this.emitFile({
2377
- type: "asset",
2378
- fileName: outputFile,
2379
- source
2380
- });
2381
- else bundle[outputFile] = createReplayCssAsset(outputFile, source);
2527
+ emitOrReplayCssAsset(outputFile, source);
2382
2528
  originalSource.fileName = outputFile;
2383
2529
  }
2384
2530
  originalSource.source = source;
@@ -2454,8 +2600,10 @@ function createGenerateBundleHook(context) {
2454
2600
  const cssRuntimeSignature = createCssRuntimeSignature(runtimeSignature, scopedGeneratorCandidateSignature);
2455
2601
  const rememberedCssRuntimeSignature = createRememberedCssRuntimeSignature(cssRuntimeSignature, cssRuntimeAffectingHash);
2456
2602
  const cssSharedCacheKey = `${cssShareScope}:${cssRuntimeSignature}:${runtimeState.twPatcher.majorVersion ?? "unknown"}:${cssHandlerOptions.isMainChunk ? "1" : "0"}:${cssRuntimeAffectingSignature}:${sourceTraceSignature}`;
2603
+ const cssCacheKey = file;
2604
+ const cssHashKey = `${file}:css:${cssRuntimeSignature}:${runtimeState.twPatcher.majorVersion ?? "unknown"}`;
2457
2605
  if (!shouldTrackGeneratorRuntime) {
2458
- const lastCss = lastCssResultByFile.get(outputFile) ?? lastCssResultByFile.get(file);
2606
+ const lastCss = getLastCssResult(lastCssResultByFile, outputFile, file);
2459
2607
  if (lastCss != null) {
2460
2608
  applyCssResult(lastCss);
2461
2609
  markCssAssetProcessed?.(originalSource, outputFile);
@@ -2464,14 +2612,15 @@ function createGenerateBundleHook(context) {
2464
2612
  continue;
2465
2613
  }
2466
2614
  }
2467
- tasks.push(timeTask("css", () => require_hmr_timing.processCachedTask({
2615
+ rememberProcessCacheKey(cssCacheKey, cssHashKey);
2616
+ cssTaskFactories.push(() => timeTask("css", () => require_hmr_timing.processCachedTask({
2468
2617
  cache,
2469
- cacheKey: file,
2470
- hashKey: `${file}:css:${cssRuntimeSignature}:${runtimeState.twPatcher.majorVersion ?? "unknown"}`,
2618
+ cacheKey: cssCacheKey,
2619
+ hashKey: cssHashKey,
2471
2620
  hash: `${cssRuntimeAffectingHash}:${scopedGeneratorCandidateSignature}:${sourceTraceSignature}`,
2472
2621
  applyResult(source) {
2473
2622
  applyCssResult(source);
2474
- lastCssResultByFile.set(outputFile, source);
2623
+ rememberLastCssResult(lastCssResultByFile, lastCssSourceHashByFile, outputFile, source, cssRuntimeAffectingHash);
2475
2624
  markCssAssetProcessed?.(originalSource, outputFile);
2476
2625
  if (rememberedCssSources.length <= 1) rememberCssSource?.({
2477
2626
  outputFile,
@@ -2508,7 +2657,7 @@ function createGenerateBundleHook(context) {
2508
2657
  getSourceCandidatesForEntries: scopedSourceCandidateGetter,
2509
2658
  styleHandler,
2510
2659
  debug,
2511
- previousCss: !vitePipelineCssAsset && useIncrementalMode && !hasRuntimeAffectingChanges && !snapshot.changedByType.css.has(file) ? lastCssResultByFile.get(outputFile) ?? lastCssResultByFile.get(file) : void 0
2660
+ previousCss: !vitePipelineCssAsset && useIncrementalMode && !hasRuntimeAffectingChanges && !snapshot.changedByType.css.has(file) ? getLastCssResult(lastCssResultByFile, outputFile, file) : void 0
2512
2661
  });
2513
2662
  if (generated) {
2514
2663
  const tracedCss = annotateCss(generated.css);
@@ -2569,10 +2718,12 @@ function createGenerateBundleHook(context) {
2569
2718
  jsTaskFactories.push(async () => {
2570
2719
  await timeTask("js", async () => {
2571
2720
  const hashSalt = createJsHashSalt(runtimeSignature, useIncrementalMode ? createLinkedImpactSignature(file, snapshot.linkedImpactsByEntry, snapshot.sourceHashByFile) : void 0);
2721
+ const hashKey = `${file}:js`;
2722
+ rememberProcessCacheKey(file, hashKey);
2572
2723
  await require_hmr_timing.processCachedTask({
2573
2724
  cache,
2574
2725
  cacheKey: file,
2575
- hashKey: `${file}:js`,
2726
+ hashKey,
2576
2727
  hash: `${getSnapshotHash(snapshot.sourceHashByFile, file, initialRawSource)}:${hashSalt}`,
2577
2728
  applyResult(source) {
2578
2729
  originalSource.code = source;
@@ -2611,9 +2762,11 @@ function createGenerateBundleHook(context) {
2611
2762
  collectLinkedFileNames(linked, getJsEntry, linkedSet);
2612
2763
  baseApplyLinkedUpdates(linked);
2613
2764
  };
2765
+ const uniAppXJsHashKey = `${file}:js`;
2766
+ rememberProcessCacheKey(file, uniAppXJsHashKey);
2614
2767
  const factory = createUniAppXAssetTask(file, originalSource, outDir, {
2615
2768
  cache,
2616
- hashKey: `${file}:js`,
2769
+ hashKey: uniAppXJsHashKey,
2617
2770
  hashSalt: createJsHashSalt(runtimeSignature, [UNI_APP_X_STYLE_PLACEHOLDER_VERSION, useIncrementalMode ? createLinkedImpactSignature(file, snapshot.linkedImpactsByEntry, snapshot.sourceHashByFile) : void 0].filter(Boolean).join(":")),
2618
2771
  createHandlerOptions,
2619
2772
  debug,
@@ -2655,7 +2808,7 @@ function createGenerateBundleHook(context) {
2655
2808
  }
2656
2809
  }
2657
2810
  if (useIncrementalMode || isNativeAppStyleTarget) {
2658
- const rememberedReplayGroups = collectRememberedCssReplayGroups(getRememberedCssSources?.(), opts, rootDir, isWebGeneratorTarget, shouldPreserveAppCssExtension);
2811
+ const rememberedReplayGroups = collectRememberedCssReplayGroups(getRememberedCssSources?.(), opts, rootDir, isWebGeneratorTarget, shouldPreserveAppCssExtension, sourceRoot);
2659
2812
  for (const [outputFile, rememberedGroup] of rememberedReplayGroups) {
2660
2813
  const refreshedRememberedGroup = await Promise.all(rememberedGroup.map(async (item) => ({
2661
2814
  key: item.key,
@@ -2664,6 +2817,8 @@ function createGenerateBundleHook(context) {
2664
2817
  const rememberedCssSource = mergeRememberedCssSources(refreshedRememberedGroup.map((item) => item.remembered), outputFile);
2665
2818
  if (!rememberedCssSource) continue;
2666
2819
  const { rawSource, sourceFile } = rememberedCssSource;
2820
+ activeViteCssCacheFiles.add(normalizeViteCssCacheKey(outputFile));
2821
+ activeViteCssCacheFiles.add(normalizeViteCssCacheKey(sourceFile));
2667
2822
  const outputCssHandlerOptions = getCssHandlerOptions(outputFile);
2668
2823
  const cssHandlerOptions = {
2669
2824
  ...getCssHandlerOptions(sourceFile),
@@ -2677,11 +2832,14 @@ function createGenerateBundleHook(context) {
2677
2832
  tokenSources: sourceTraceTokenSources
2678
2833
  });
2679
2834
  const scopedGeneratorRuntime = createScopedGeneratorRuntime(outputFile, cssHandlerOptions, generatorRuntime);
2680
- const rememberedCssRuntimeSignature = createRememberedCssRuntimeSignature(createCssRuntimeSignature(createCandidateSignature(scopedGeneratorRuntime), await createScopedGeneratorCandidateSignature(rawSource, sourceFile, createCandidateSignature(scopedGeneratorRuntime), scopedSourceCandidateGetter, { includeFallbackSignature: cssHandlerOptions.isMainChunk })), cache.computeHash(require_bundle_state.createRuntimeAffectingSourceSignature(rawSource, "css")));
2835
+ const cssRuntimeSignature = createCssRuntimeSignature(createCandidateSignature(scopedGeneratorRuntime), await createScopedGeneratorCandidateSignature(rawSource, sourceFile, createCandidateSignature(scopedGeneratorRuntime), scopedSourceCandidateGetter, { includeFallbackSignature: cssHandlerOptions.isMainChunk }));
2836
+ const cssRuntimeAffectingHash = cache.computeHash(require_bundle_state.createRuntimeAffectingSourceSignature(rawSource, "css"));
2837
+ const rememberedCssRuntimeSignature = createRememberedCssRuntimeSignature(cssRuntimeSignature, cssRuntimeAffectingHash);
2838
+ const previousCss = useIncrementalMode && getLastCssSourceHash(lastCssSourceHashByFile, outputFile) === cssRuntimeAffectingHash ? getLastCssResult(lastCssResultByFile, outputFile) : void 0;
2681
2839
  const rememberedKeys = refreshedRememberedGroup.map((item) => item.key);
2682
2840
  const allRememberedSignaturesFresh = rememberedKeys.length > 0 && rememberedKeys.every((key) => getRememberedCssSignature?.(key) === rememberedCssRuntimeSignature);
2683
2841
  if (bundleFiles.includes(outputFile) || bundleFiles.includes(sourceFile) || allRememberedSignaturesFresh) continue;
2684
- tasks.push(timeTask("css.replay", async () => {
2842
+ cssTaskFactories.push(() => timeTask("css.replay", async () => {
2685
2843
  const start = performance.now();
2686
2844
  const generated = await require_hmr_timing.generateCssByGenerator({
2687
2845
  opts,
@@ -2693,9 +2851,11 @@ function createGenerateBundleHook(context) {
2693
2851
  cssUserHandlerOptions: getCssUserHandlerOptions(sourceFile),
2694
2852
  getSourceCandidatesForEntries: scopedSourceCandidateGetter,
2695
2853
  styleHandler,
2696
- debug
2854
+ debug,
2855
+ previousCss
2697
2856
  });
2698
2857
  const css = annotateCss(generated?.css ?? (await styleHandler(rawSource, cssHandlerOptions)).css);
2858
+ rememberLastCssResult(lastCssResultByFile, lastCssSourceHashByFile, outputFile, css, cssRuntimeAffectingHash);
2699
2859
  for (const key of rememberedKeys) setRememberedCssSignature?.(key, rememberedCssRuntimeSignature);
2700
2860
  if (generated) {
2701
2861
  registerGeneratorDependencies$1({ addWatchFile }, generated.dependencies);
@@ -2707,13 +2867,7 @@ function createGenerateBundleHook(context) {
2707
2867
  });
2708
2868
  debug("css replay generated result: %s bytes=%d", outputFile, css.length);
2709
2869
  }
2710
- const replayAsset = createReplayCssAsset(outputFile, css);
2711
- bundle[outputFile] = replayAsset;
2712
- if (typeof this.emitFile === "function") this.emitFile({
2713
- type: "asset",
2714
- fileName: outputFile,
2715
- source: css
2716
- });
2870
+ const replayAsset = emitOrReplayCssAsset(outputFile, css);
2717
2871
  markCssAssetProcessed?.(replayAsset, outputFile);
2718
2872
  metrics.css.elapsed += measureElapsed(start);
2719
2873
  metrics.css.transformed++;
@@ -2722,7 +2876,11 @@ function createGenerateBundleHook(context) {
2722
2876
  }));
2723
2877
  }
2724
2878
  }
2725
- require_bundle_state.pushConcurrentTaskFactories(tasks, jsTaskFactories);
2879
+ require_hmr_timing.pushConcurrentTaskFactories(tasks, jsTaskFactories);
2880
+ if (cssTaskFactories.length > 0) {
2881
+ const cssConcurrency = resolveViteCssTaskConcurrency(useIncrementalMode);
2882
+ tasks.push(require_hmr_timing.runWithConcurrency(cssTaskFactories, cssConcurrency).then(() => void 0));
2883
+ }
2726
2884
  const tasksStart = performance.now();
2727
2885
  await Promise.all(tasks);
2728
2886
  recordTimingDetail("tasks", tasksStart);
@@ -2777,7 +2935,7 @@ function createGenerateBundleHook(context) {
2777
2935
  markCssAssetProcessed,
2778
2936
  recordCssAssetResult,
2779
2937
  recordViteProcessedCssAssetResult,
2780
- resolveViteProcessedCssOutputFile: (file) => resolveViteCssPipelineOutputFile(file, opts, rootDir, isWebGeneratorTarget, shouldPreserveAppCssExtension),
2938
+ resolveViteProcessedCssOutputFile: (file) => resolveViteCssPipelineOutputFile(file, opts, rootDir, isWebGeneratorTarget, shouldPreserveAppCssExtension, sourceRoot),
2781
2939
  debug
2782
2940
  });
2783
2941
  return injectViteProcessedCssIntoMainCssAssets(bundle, {
@@ -2797,10 +2955,34 @@ function createGenerateBundleHook(context) {
2797
2955
  const stateUpdateStart = performance.now();
2798
2956
  require_bundle_state.updateBundleBuildState(state, snapshot, useIncrementalMode ? linkedByEntry ?? /* @__PURE__ */ new Map() : /* @__PURE__ */ new Map(), { incremental: useIncrementalMode });
2799
2957
  state.generatorCandidateSignature = generatorCandidateSignature;
2958
+ if (useIncrementalMode && !snapshot.hasOmittedKnownFiles) cache.prune?.({
2959
+ cacheKeys: activeProcessCacheKeys,
2960
+ hashKeys: activeProcessHashKeys
2961
+ });
2962
+ pruneLastCssResults(lastCssResultByFile, lastCssSourceHashByFile, activeViteCssCacheFiles);
2963
+ pruneViteCssCaches?.({
2964
+ activeFiles: activeViteCssCacheFiles,
2965
+ activeKnownSfcFiles: new Set([...snapshot.sourceHashByFile.keys(), ...snapshot.entries.map((entry) => entry.file)])
2966
+ });
2800
2967
  recordTimingDetail("state.update", stateUpdateStart);
2801
2968
  debug("metrics iteration=%d runtime=%sms html(total=%d transform=%d hit=%d rate=%s elapsed=%sms) js(total=%d transform=%d hit=%d rate=%s elapsed=%sms) css(total=%d transform=%d hit=%d rate=%s elapsed=%sms)", useIncrementalMode ? state.iteration : 0, formatMs(metrics.runtimeSet), metrics.html.total, metrics.html.transformed, metrics.html.cacheHits, formatCacheHitRate(metrics.html), formatMs(metrics.html.elapsed), metrics.js.total, metrics.js.transformed, metrics.js.cacheHits, formatCacheHitRate(metrics.js), formatMs(metrics.js.elapsed), metrics.css.total, metrics.css.transformed, metrics.css.cacheHits, formatCacheHitRate(metrics.css), formatMs(metrics.css.elapsed));
2802
2969
  if (hmrTimingRecorder) {
2803
- hmrTimingRecorder.record("generateBundle", performance.now() - hmrTimingStartedAt, timingDetails);
2970
+ hmrTimingRecorder.record("generateBundle", performance.now() - hmrTimingStartedAt, {
2971
+ ...timingDetails,
2972
+ memoryDebug: resolveViteMemoryDebugStats({
2973
+ activeProcessCacheKeys,
2974
+ activeProcessHashKeys,
2975
+ cache,
2976
+ generatorRuntimeSize: generatorRuntime.size,
2977
+ getViteCssCacheStats,
2978
+ lastCssResultByFile,
2979
+ phase: "generateBundle",
2980
+ runtimeSize: runtime.size,
2981
+ sourceCandidatesSize: sourceCandidates.size,
2982
+ transformRuntimeSize: transformRuntime.size,
2983
+ useIncrementalMode
2984
+ })
2985
+ });
2804
2986
  hmrTimingRecorder.emitTotal();
2805
2987
  }
2806
2988
  onEnd();
@@ -2864,6 +3046,7 @@ function createViteCssFinalizerOutputPlugin(context) {
2864
3046
  const isNativeAppStyleTarget = uniUtsPlatform.isApp || isHarmonyAppStyleTarget;
2865
3047
  if (resolvedConfig?.command !== "build" && !isNativeAppStyleTarget) return;
2866
3048
  const rootDir = resolvedConfig?.root ? node_path.default.resolve(resolvedConfig.root) : node_process.default.cwd();
3049
+ const sourceRoot = resolveWeappViteSourceRoot(resolvedConfig);
2867
3050
  const sourceTraceTokenSources = getSourceCandidateSourcesForEntries ? require_hmr_timing.createCssTokenSourceMap(getSourceCandidateSourcesForEntries(void 0), opts) : void 0;
2868
3051
  const annotateCss = (css) => require_hmr_timing.annotateCssSourceTrace(css, {
2869
3052
  opts,
@@ -2876,7 +3059,7 @@ function createViteCssFinalizerOutputPlugin(context) {
2876
3059
  markCssAssetProcessed,
2877
3060
  recordCssAssetResult,
2878
3061
  recordViteProcessedCssAssetResult,
2879
- resolveViteProcessedCssOutputFile: (file) => resolveViteCssPipelineOutputFile(file, opts, rootDir, isWebGeneratorTarget, isNativeAppStyleTarget),
3062
+ resolveViteProcessedCssOutputFile: (file) => resolveViteCssPipelineOutputFile(file, opts, rootDir, isWebGeneratorTarget, isNativeAppStyleTarget, sourceRoot),
2880
3063
  debug
2881
3064
  });
2882
3065
  };
@@ -3430,7 +3613,10 @@ function resolveImplicitTailwindcssBasedirFromViteRoot(root) {
3430
3613
  const debug = require_v3_engine.createDebug();
3431
3614
  const weappTailwindcssPackageDir = require_bundle_state.resolvePackageDir("weapp-tailwindcss");
3432
3615
  const weappTailwindcssDirPosix = require_bundle_state.slash(weappTailwindcssPackageDir);
3433
- const sourceCandidateScanSnapshotCache = /* @__PURE__ */ new Map();
3616
+ const SOURCE_CANDIDATE_SCAN_CACHE_MAX = 8;
3617
+ const sourceCandidateScanSnapshotCache = new lru_cache.LRUCache({ max: SOURCE_CANDIDATE_SCAN_CACHE_MAX });
3618
+ const VITE_REMEMBERED_CSS_CACHE_MAX = 96;
3619
+ const VITE_KNOWN_SFC_SOURCE_CACHE_MAX = 128;
3434
3620
  const SFC_STYLE_BLOCK_RE = /<style\b[^>]*>([\s\S]*?)<\/style>/gi;
3435
3621
  const SFC_COMPONENT_FILE_RE = /\.(?:vue|uvue|nvue|svelte|mpx)$/i;
3436
3622
  function normalizeSignaturePath(value) {
@@ -3475,6 +3661,21 @@ function normalizeCssSourceIdentity(sourceFile) {
3475
3661
  if (query.type === "style") return `${normalizedFile}?type=style&index=${query.index ?? 0}`;
3476
3662
  return require_bundle_state.normalizeOutputPathKey(require_bundle_state.stripRequestQuery(cleanSourceFile));
3477
3663
  }
3664
+ function touchMapEntry(map, key, value) {
3665
+ map.delete(key);
3666
+ map.set(key, value);
3667
+ }
3668
+ function pruneMapToMaxSize(map, maxSize, onDelete) {
3669
+ while (map.size > maxSize) {
3670
+ const key = map.keys().next().value;
3671
+ if (key === void 0) break;
3672
+ map.delete(key);
3673
+ onDelete?.(key);
3674
+ }
3675
+ }
3676
+ function normalizeVitePersistentCacheKey(file) {
3677
+ return require_bundle_state.normalizeOutputPathKey(file);
3678
+ }
3478
3679
  /**
3479
3680
  * @name WeappTailwindcss
3480
3681
  * @description uni-app vite / uni-app-x 版本插件
@@ -3571,7 +3772,7 @@ function WeappTailwindcss(options = {}) {
3571
3772
  bareArbitraryValues: opts.arbitraryValues?.bareArbitraryValues,
3572
3773
  extractor: sourceCandidateExtractor
3573
3774
  });
3574
- const sourceCandidateScanCache = /* @__PURE__ */ new Map();
3775
+ const sourceCandidateScanCache = new lru_cache.LRUCache({ max: SOURCE_CANDIDATE_SCAN_CACHE_MAX });
3575
3776
  let sourceScanEntries;
3576
3777
  let sourceScanMatcher;
3577
3778
  let sourceScanDependencies = /* @__PURE__ */ new Set();
@@ -3767,12 +3968,16 @@ function WeappTailwindcss(options = {}) {
3767
3968
  const file = (0, _weapp_tailwindcss_shared.cleanUrl)(id);
3768
3969
  if (!SFC_COMPONENT_FILE_RE.test(file)) return;
3769
3970
  if (!hasSfcStyleBlocks(code)) return;
3770
- knownSfcSources.set(normalizeKnownSfcSourceKey(file), code);
3971
+ touchMapEntry(knownSfcSources, normalizeKnownSfcSourceKey(file), code);
3972
+ pruneMapToMaxSize(knownSfcSources, VITE_KNOWN_SFC_SOURCE_CACHE_MAX);
3771
3973
  };
3772
3974
  const getKnownSfcSource = (file) => {
3773
3975
  const scanSource = sourceCandidateCollector.source(file);
3774
3976
  if (scanSource && hasSfcStyleBlocks(scanSource)) return scanSource;
3775
- return knownSfcSources.get(normalizeKnownSfcSourceKey(file));
3977
+ const key = normalizeKnownSfcSourceKey(file);
3978
+ const source = knownSfcSources.get(key);
3979
+ if (source != null) touchMapEntry(knownSfcSources, key, source);
3980
+ return source;
3776
3981
  };
3777
3982
  const rememberCssSource = (entry, cssRuntimeSignature) => {
3778
3983
  const outputKey = require_bundle_state.normalizeOutputPathKey(entry.outputFile);
@@ -3780,10 +3985,10 @@ function WeappTailwindcss(options = {}) {
3780
3985
  const previousOutputEntry = rememberedCssSources.get(outputKey);
3781
3986
  const key = previousOutputEntry != null && normalizeCssSourceIdentity(previousOutputEntry.sourceFile) !== normalizedSourceFile ? `${outputKey}\0${normalizedSourceFile}` : outputKey;
3782
3987
  const previous = rememberedCssSources.get(key);
3783
- rememberedCssSources.set(key, entry);
3988
+ touchMapEntry(rememberedCssSources, key, entry);
3784
3989
  for (const [rememberedKey, remembered] of rememberedCssSources) {
3785
3990
  if (rememberedKey === key || normalizeCssSourceIdentity(remembered.sourceFile) !== normalizedSourceFile) continue;
3786
- rememberedCssSources.set(rememberedKey, {
3991
+ touchMapEntry(rememberedCssSources, rememberedKey, {
3787
3992
  ...remembered,
3788
3993
  rawSource: entry.rawSource,
3789
3994
  sourceFile: entry.sourceFile
@@ -3792,6 +3997,9 @@ function WeappTailwindcss(options = {}) {
3792
3997
  }
3793
3998
  if (cssRuntimeSignature) rememberedCssSignatureByFile.set(key, cssRuntimeSignature);
3794
3999
  else if (previous?.rawSource !== entry.rawSource || previous?.sourceFile !== entry.sourceFile) rememberedCssSignatureByFile.delete(key);
4000
+ pruneMapToMaxSize(rememberedCssSources, VITE_REMEMBERED_CSS_CACHE_MAX, (rememberedKey) => {
4001
+ rememberedCssSignatureByFile.delete(String(rememberedKey));
4002
+ });
3795
4003
  };
3796
4004
  const refreshRememberedCssSourceEntry = (rememberedKey, remembered, sourceFile, rawSource) => {
3797
4005
  if (remembered.rawSource === rawSource && remembered.sourceFile === sourceFile) return remembered;
@@ -3800,7 +4008,7 @@ function WeappTailwindcss(options = {}) {
3800
4008
  rawSource,
3801
4009
  sourceFile
3802
4010
  };
3803
- rememberedCssSources.set(rememberedKey, nextRemembered);
4011
+ touchMapEntry(rememberedCssSources, rememberedKey, nextRemembered);
3804
4012
  rememberedCssSignatureByFile.delete(rememberedKey);
3805
4013
  return nextRemembered;
3806
4014
  };
@@ -3881,19 +4089,53 @@ function WeappTailwindcss(options = {}) {
3881
4089
  rememberedCssSignatureByFile.set(require_bundle_state.normalizeOutputPathKey(file), cssRuntimeSignature);
3882
4090
  };
3883
4091
  const recordCssAssetResult = (file, css) => {
3884
- viteGeneratedCssByFile.set(file, css);
4092
+ touchMapEntry(viteGeneratedCssByFile, normalizeVitePersistentCacheKey(file), css);
3885
4093
  };
3886
4094
  const recordViteProcessedCssAssetResult = (file, css, options = {}) => {
3887
- const key = require_bundle_state.normalizeOutputPathKey(file);
4095
+ const key = normalizeVitePersistentCacheKey(file);
3888
4096
  const previous = viteProcessedCssAssetResults.get(key);
3889
- viteProcessedCssAssetResults.set(key, {
4097
+ touchMapEntry(viteProcessedCssAssetResults, key, {
3890
4098
  css,
3891
4099
  injectIntoMain: options.injectIntoMain ?? previous?.injectIntoMain,
3892
4100
  outputFile: options.outputFile ?? previous?.outputFile
3893
4101
  });
3894
4102
  };
3895
4103
  const getViteProcessedCssAssetResults = () => viteProcessedCssAssetResults.entries();
3896
- const getViteProcessedCssAssetResult = (file) => viteProcessedCssAssetResults.get(require_bundle_state.normalizeOutputPathKey(file));
4104
+ const getViteProcessedCssAssetResult = (file) => viteProcessedCssAssetResults.get(normalizeVitePersistentCacheKey(file));
4105
+ const getViteCssCacheStats = () => ({
4106
+ viteGeneratedCssByFile: viteGeneratedCssByFile.size,
4107
+ viteProcessedCssAssetResults: viteProcessedCssAssetResults.size,
4108
+ rememberedCssSources: rememberedCssSources.size,
4109
+ rememberedCssSignatureByFile: rememberedCssSignatureByFile.size,
4110
+ knownSfcSources: knownSfcSources.size,
4111
+ sourceCandidateScanCache: sourceCandidateScanCache.size,
4112
+ pendingSourceCandidateSyncs: pendingSourceCandidateSyncs.size,
4113
+ pendingSourceCandidateSyncByFile: pendingSourceCandidateSyncByFile.size
4114
+ });
4115
+ const pruneViteCssCaches = (options) => {
4116
+ const activeFiles = new Set([...options.activeFiles].map(normalizeVitePersistentCacheKey));
4117
+ for (const key of viteGeneratedCssByFile.keys()) if (!activeFiles.has(key)) viteGeneratedCssByFile.delete(key);
4118
+ for (const [key, record] of viteProcessedCssAssetResults) {
4119
+ const outputKey = typeof record.outputFile === "string" ? normalizeVitePersistentCacheKey(record.outputFile) : void 0;
4120
+ if (!activeFiles.has(key) && (outputKey == null || !activeFiles.has(outputKey))) viteProcessedCssAssetResults.delete(key);
4121
+ }
4122
+ for (const [key, remembered] of rememberedCssSources) {
4123
+ const outputKey = normalizeVitePersistentCacheKey(remembered.outputFile);
4124
+ const sourceKey = normalizeVitePersistentCacheKey(remembered.sourceFile);
4125
+ if (!activeFiles.has(key) && !activeFiles.has(outputKey) && !activeFiles.has(sourceKey)) {
4126
+ rememberedCssSources.delete(key);
4127
+ rememberedCssSignatureByFile.delete(key);
4128
+ }
4129
+ }
4130
+ if (options.activeKnownSfcFiles) {
4131
+ const activeKnownSfcFiles = new Set([...options.activeKnownSfcFiles].map((file) => normalizeKnownSfcSourceKey(file)).filter((file) => SFC_COMPONENT_FILE_RE.test(file)));
4132
+ for (const key of knownSfcSources.keys()) if (!activeKnownSfcFiles.has(key)) knownSfcSources.delete(key);
4133
+ }
4134
+ pruneMapToMaxSize(rememberedCssSources, VITE_REMEMBERED_CSS_CACHE_MAX, (rememberedKey) => {
4135
+ rememberedCssSignatureByFile.delete(String(rememberedKey));
4136
+ });
4137
+ pruneMapToMaxSize(knownSfcSources, VITE_KNOWN_SFC_SOURCE_CACHE_MAX);
4138
+ };
3897
4139
  const normalizeViteProcessedCssFile = (file) => node_path.default.resolve((0, _weapp_tailwindcss_shared.cleanUrl)(file));
3898
4140
  const markViteProcessedCssSource = (file) => {
3899
4141
  viteProcessedCssSourceFiles.add(normalizeViteProcessedCssFile(file));
@@ -4003,7 +4245,8 @@ function WeappTailwindcss(options = {}) {
4003
4245
  const rootDir = resolvedConfig?.root ? node_path.default.resolve(resolvedConfig.root) : node_process.default.cwd();
4004
4246
  const isHarmonyAppStyleTarget = isHarmonyAppBuildTarget();
4005
4247
  const isNativeAppStyleTarget = require_utils.resolveUniUtsPlatform().isApp || isHarmonyAppStyleTarget;
4006
- const outputFile = resolveViteCssPipelineOutputFile(file, opts, rootDir, generatorOptions.target === "web", isNativeAppStyleTarget);
4248
+ const sourceRoot = resolveWeappViteSourceRoot(resolvedConfig);
4249
+ const outputFile = resolveViteCssPipelineOutputFile(file, opts, rootDir, generatorOptions.target === "web", isNativeAppStyleTarget, sourceRoot);
4007
4250
  const runtime = getRecordedGeneratorCandidates() ?? getSourceCandidates() ?? await ensureRuntimeClassSet();
4008
4251
  const outputCssHandlerOptions = transformCssHandlerOptions.getCssHandlerOptions(outputFile);
4009
4252
  const cssHandlerOptions = {
@@ -4094,6 +4337,8 @@ function WeappTailwindcss(options = {}) {
4094
4337
  setRememberedCssSignature,
4095
4338
  getKnownSfcSource,
4096
4339
  recordGeneratorCandidates,
4340
+ pruneViteCssCaches,
4341
+ getViteCssCacheStats,
4097
4342
  hmrTimingRecorder
4098
4343
  });
4099
4344
  const cssFinalizerOutputPlugin = createViteCssFinalizerOutputPlugin({