@weapp-tailwindcss/engine 0.1.4 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_v4 = require("./v4-CGN22VSy.cjs");
2
+ const require_v4 = require("./v4-B5YEEbhA.cjs");
3
3
  let node_process = require("node:process");
4
4
  node_process = require_v4.__toESM(node_process, 1);
5
5
  let _weapp_tailwindcss_source_scan = require("@weapp-tailwindcss/source-scan");
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { A as expandTailwindV4SourceEntryBraces, B as expandTailwindV4SourceEntries, C as TAILWIND_V4_AUTO_SOURCE_SCAN_PATTERN, D as createTailwindV4CompiledSourceEntries, E as TAILWIND_V4_IGNORED_FILES, F as resolveTailwindV4SourceBaseCandidates, G as compileTailwindV4Source, H as isFileExcludedByTailwindV4SourceEntries, I as resolveTailwindV4SourceEntry, J as loadTailwindV4NodeModule, K as getTailwindV4DesignSystemCacheKey, L as toPosixPath, M as normalizeTailwindV4ScannerSources, N as normalizeTailwindV4SourceEntries, O as createTailwindV4DefaultIgnoreSources, P as resolveSourceScanPath, R as createTailwindV4SourceEntryMatcher, S as resolveProjectSourceFiles, T as TAILWIND_V4_IGNORED_EXTENSIONS, U as isFileMatchedByTailwindV4SourceEntries, V as groupTailwindV4SourceEntriesByBase, W as mergeTailwindV4SourceEntries, _ as isBareArbitraryValuesEnabled, a as createTailwindGenerationSession, b as extractProjectCandidatesWithPositions, c as replaceBareArbitraryValueSelectors, d as extractRawCandidates, f as extractRawCandidatesWithPositions, g as extractBareArbitraryValueSourceCandidatesWithPositions, h as extractBareArbitraryValueSourceCandidates, i as createTailwindV4Engine, j as normalizeGlobPattern, k as createTailwindV4RootSources, l as resolveValidTailwindV4Candidates, m as extractSourceCandidatesWithPositions, n as generateTailwindV4Style, o as collectTailwindStyleCandidates, p as extractSourceCandidates, q as loadTailwindV4DesignSystem, r as resolveTailwindV4Source, s as canonicalizeBareArbitraryValueCandidates, t as collectTailwindV4StyleCandidates, u as extractTailwindV4InlineSourceCandidates, v as resolveBareArbitraryValueCandidate, w as TAILWIND_V4_IGNORED_CONTENT_DIRS, x as groupTokensByFile, y as escapeCssClassName, z as createTailwindV4SourceExclusionMatcher } from "./v4-C-xBi2Bh.js";
1
+ import { A as expandTailwindV4SourceEntryBraces, B as expandTailwindV4SourceEntries, C as TAILWIND_V4_AUTO_SOURCE_SCAN_PATTERN, D as createTailwindV4CompiledSourceEntries, E as TAILWIND_V4_IGNORED_FILES, F as resolveTailwindV4SourceBaseCandidates, G as compileTailwindV4Source, H as isFileExcludedByTailwindV4SourceEntries, I as resolveTailwindV4SourceEntry, J as loadTailwindV4NodeModule, K as getTailwindV4DesignSystemCacheKey, L as toPosixPath, M as normalizeTailwindV4ScannerSources, N as normalizeTailwindV4SourceEntries, O as createTailwindV4DefaultIgnoreSources, P as resolveSourceScanPath, R as createTailwindV4SourceEntryMatcher, S as resolveProjectSourceFiles, T as TAILWIND_V4_IGNORED_EXTENSIONS, U as isFileMatchedByTailwindV4SourceEntries, V as groupTailwindV4SourceEntriesByBase, W as mergeTailwindV4SourceEntries, _ as isBareArbitraryValuesEnabled, a as createTailwindGenerationSession, b as extractProjectCandidatesWithPositions, c as replaceBareArbitraryValueSelectors, d as extractRawCandidates, f as extractRawCandidatesWithPositions, g as extractBareArbitraryValueSourceCandidatesWithPositions, h as extractBareArbitraryValueSourceCandidates, i as createTailwindV4Engine, j as normalizeGlobPattern, k as createTailwindV4RootSources, l as resolveValidTailwindV4Candidates, m as extractSourceCandidatesWithPositions, n as generateTailwindV4Style, o as collectTailwindStyleCandidates, p as extractSourceCandidates, q as loadTailwindV4DesignSystem, r as resolveTailwindV4Source, s as canonicalizeBareArbitraryValueCandidates, t as collectTailwindV4StyleCandidates, u as extractTailwindV4InlineSourceCandidates, v as resolveBareArbitraryValueCandidate, w as TAILWIND_V4_IGNORED_CONTENT_DIRS, x as groupTokensByFile, y as escapeCssClassName, z as createTailwindV4SourceExclusionMatcher } from "./v4-sBv0Uojf.js";
2
2
  import process from "node:process";
3
3
  //#region src/extraction/candidate-extractor/valid.ts
4
4
  const designSystemCandidateCache = /* @__PURE__ */ new WeakMap();
package/dist/v4/index.cjs CHANGED
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_v4 = require("../v4-CGN22VSy.cjs");
2
+ const require_v4 = require("../v4-B5YEEbhA.cjs");
3
3
  let _weapp_tailwindcss_source_scan = require("@weapp-tailwindcss/source-scan");
4
4
  exports.TAILWIND_V4_AUTO_SOURCE_SCAN_PATTERN = require_v4.TAILWIND_V4_AUTO_SOURCE_SCAN_PATTERN;
5
5
  exports.TAILWIND_V4_IGNORED_CONTENT_DIRS = require_v4.TAILWIND_V4_IGNORED_CONTENT_DIRS;
package/dist/v4/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import { A as expandTailwindV4SourceEntryBraces, B as expandTailwindV4SourceEntries, C as TAILWIND_V4_AUTO_SOURCE_SCAN_PATTERN, D as createTailwindV4CompiledSourceEntries, E as TAILWIND_V4_IGNORED_FILES, F as resolveTailwindV4SourceBaseCandidates, G as compileTailwindV4Source, H as isFileExcludedByTailwindV4SourceEntries, I as resolveTailwindV4SourceEntry, J as loadTailwindV4NodeModule, K as getTailwindV4DesignSystemCacheKey, L as toPosixPath, M as normalizeTailwindV4ScannerSources, N as normalizeTailwindV4SourceEntries, O as createTailwindV4DefaultIgnoreSources, P as resolveSourceScanPath, R as createTailwindV4SourceEntryMatcher, T as TAILWIND_V4_IGNORED_EXTENSIONS, U as isFileMatchedByTailwindV4SourceEntries, V as groupTailwindV4SourceEntriesByBase, W as mergeTailwindV4SourceEntries, _ as isBareArbitraryValuesEnabled, a as createTailwindGenerationSession, c as replaceBareArbitraryValueSelectors, g as extractBareArbitraryValueSourceCandidatesWithPositions, h as extractBareArbitraryValueSourceCandidates, i as createTailwindV4Engine, j as normalizeGlobPattern, k as createTailwindV4RootSources, l as resolveValidTailwindV4Candidates, n as generateTailwindV4Style, q as loadTailwindV4DesignSystem, r as resolveTailwindV4Source, s as canonicalizeBareArbitraryValueCandidates, t as collectTailwindV4StyleCandidates, u as extractTailwindV4InlineSourceCandidates, v as resolveBareArbitraryValueCandidate, w as TAILWIND_V4_IGNORED_CONTENT_DIRS, y as escapeCssClassName, z as createTailwindV4SourceExclusionMatcher } from "../v4-C-xBi2Bh.js";
1
+ import { A as expandTailwindV4SourceEntryBraces, B as expandTailwindV4SourceEntries, C as TAILWIND_V4_AUTO_SOURCE_SCAN_PATTERN, D as createTailwindV4CompiledSourceEntries, E as TAILWIND_V4_IGNORED_FILES, F as resolveTailwindV4SourceBaseCandidates, G as compileTailwindV4Source, H as isFileExcludedByTailwindV4SourceEntries, I as resolveTailwindV4SourceEntry, J as loadTailwindV4NodeModule, K as getTailwindV4DesignSystemCacheKey, L as toPosixPath, M as normalizeTailwindV4ScannerSources, N as normalizeTailwindV4SourceEntries, O as createTailwindV4DefaultIgnoreSources, P as resolveSourceScanPath, R as createTailwindV4SourceEntryMatcher, T as TAILWIND_V4_IGNORED_EXTENSIONS, U as isFileMatchedByTailwindV4SourceEntries, V as groupTailwindV4SourceEntriesByBase, W as mergeTailwindV4SourceEntries, _ as isBareArbitraryValuesEnabled, a as createTailwindGenerationSession, c as replaceBareArbitraryValueSelectors, g as extractBareArbitraryValueSourceCandidatesWithPositions, h as extractBareArbitraryValueSourceCandidates, i as createTailwindV4Engine, j as normalizeGlobPattern, k as createTailwindV4RootSources, l as resolveValidTailwindV4Candidates, n as generateTailwindV4Style, q as loadTailwindV4DesignSystem, r as resolveTailwindV4Source, s as canonicalizeBareArbitraryValueCandidates, t as collectTailwindV4StyleCandidates, u as extractTailwindV4InlineSourceCandidates, v as resolveBareArbitraryValueCandidate, w as TAILWIND_V4_IGNORED_CONTENT_DIRS, y as escapeCssClassName, z as createTailwindV4SourceExclusionMatcher } from "../v4-sBv0Uojf.js";
2
2
  export { TAILWIND_V4_AUTO_SOURCE_SCAN_PATTERN, TAILWIND_V4_IGNORED_CONTENT_DIRS, TAILWIND_V4_IGNORED_EXTENSIONS, TAILWIND_V4_IGNORED_FILES, canonicalizeBareArbitraryValueCandidates, collectTailwindV4StyleCandidates, compileTailwindV4Source, createTailwindGenerationSession, createTailwindV4CompiledSourceEntries, createTailwindV4DefaultIgnoreSources, createTailwindV4Engine, createTailwindV4RootSources, createTailwindV4SourceEntryMatcher, createTailwindV4SourceExclusionMatcher, escapeCssClassName, expandTailwindV4SourceEntries, expandTailwindV4SourceEntryBraces, extractBareArbitraryValueSourceCandidates, extractBareArbitraryValueSourceCandidatesWithPositions, extractTailwindV4InlineSourceCandidates, generateTailwindV4Style, getTailwindV4DesignSystemCacheKey, groupTailwindV4SourceEntriesByBase, isBareArbitraryValuesEnabled, isFileExcludedByTailwindV4SourceEntries, isFileMatchedByTailwindV4SourceEntries, loadTailwindV4DesignSystem, loadTailwindV4NodeModule, mergeTailwindV4SourceEntries, normalizeGlobPattern, normalizeTailwindV4ScannerSources, normalizeTailwindV4SourceEntries, replaceBareArbitraryValueSelectors, resolveBareArbitraryValueCandidate, resolveSourceScanPath, resolveTailwindV4Source, resolveTailwindV4SourceBaseCandidates, resolveTailwindV4SourceEntry, resolveValidTailwindV4Candidates, toPosixPath };
@@ -20,12 +20,12 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
20
20
  enumerable: true
21
21
  }) : target, mod));
22
22
  //#endregion
23
- let node_fs = require("node:fs");
24
23
  let node_path = require("node:path");
25
24
  node_path = __toESM(node_path, 1);
26
25
  let node_process = require("node:process");
27
26
  node_process = __toESM(node_process, 1);
28
27
  let node_crypto = require("node:crypto");
28
+ let node_fs = require("node:fs");
29
29
  let node_module = require("node:module");
30
30
  let node_url = require("node:url");
31
31
  let node_async_hooks = require("node:async_hooks");
@@ -478,6 +478,37 @@ function resolveTailwindV4SourceBaseCandidates(projectRoot, base, baseFallbacks)
478
478
  ]);
479
479
  }
480
480
  //#endregion
481
+ //#region src/extraction/file-io.ts
482
+ const CANDIDATE_FILE_CONCURRENCY = 8;
483
+ let activeReads = 0;
484
+ let pendingOffset = 0;
485
+ const pendingReads = [];
486
+ /** 原始补扫、任意值补扫与位置报告共享读取预算,避免多生成请求耗尽文件描述符。 */
487
+ async function readCandidateFile(file) {
488
+ if (activeReads >= CANDIDATE_FILE_CONCURRENCY) await new Promise((resolve) => {
489
+ pendingReads.push(resolve);
490
+ });
491
+ else activeReads++;
492
+ try {
493
+ return await node_fs.promises.readFile(file, "utf8");
494
+ } finally {
495
+ if (pendingOffset < pendingReads.length) {
496
+ const next = pendingReads[pendingOffset++];
497
+ if (pendingOffset === pendingReads.length) {
498
+ pendingReads.length = 0;
499
+ pendingOffset = 0;
500
+ }
501
+ next();
502
+ } else activeReads--;
503
+ }
504
+ }
505
+ /** 分批遍历避免为全部文件同时分配 Promise,输出沿用文件枚举顺序。 */
506
+ async function mapCandidateFiles(files, handle) {
507
+ const results = [];
508
+ for (let start = 0; start < files.length; start += CANDIDATE_FILE_CONCURRENCY) results.push(...await Promise.all(files.slice(start, start + CANDIDATE_FILE_CONCURRENCY).map(handle)));
509
+ return results;
510
+ }
511
+ //#endregion
481
512
  //#region src/extraction/oxide.ts
482
513
  let oxideImportPromise;
483
514
  function createOxideRuntimeDependencyError(cause) {
@@ -601,7 +632,7 @@ async function extractProjectCandidatesWithPositions(options) {
601
632
  const batchSize = 32;
602
633
  for (let start = 0; start < files.length; start += batchSize) {
603
634
  const batch = files.slice(start, start + batchSize);
604
- const contents = await Promise.allSettled(batch.map((file) => node_fs.promises.readFile(file, "utf8")));
635
+ const contents = await Promise.allSettled(batch.map(readCandidateFile));
605
636
  for (const [index, file] of batch.entries()) {
606
637
  const result = contents[index];
607
638
  if (result.status === "rejected") {
@@ -3398,27 +3429,27 @@ async function extractRawCandidates(sources, options) {
3398
3429
  if (cached) return [...cached.candidates];
3399
3430
  const scannedCandidates = scanner.scan();
3400
3431
  if (scannedCandidates.length === 0 && files.length > 0) {
3401
- const changedContents = (await Promise.all(files.map(async (file) => {
3432
+ const changedContents = (await mapCandidateFiles(files, async (file) => {
3402
3433
  try {
3403
3434
  return {
3404
- content: await node_fs.promises.readFile(file, "utf8"),
3435
+ content: await readCandidateFile(file),
3405
3436
  extension: toExtension(file)
3406
3437
  };
3407
3438
  } catch {
3408
3439
  return;
3409
3440
  }
3410
- }))).filter((entry) => entry !== void 0);
3441
+ })).filter((entry) => entry !== void 0);
3411
3442
  scannedCandidates.push(...scanner.scanFiles(changedContents));
3412
3443
  }
3413
3444
  const candidates = new Set(scannedCandidates);
3414
- if (options?.bareArbitraryValues !== void 0 && options.bareArbitraryValues !== false) await Promise.all(files.map(async (file) => {
3445
+ if (options?.bareArbitraryValues !== void 0 && options.bareArbitraryValues !== false) await mapCandidateFiles(files, async (file) => {
3415
3446
  try {
3416
- const content = await node_fs.promises.readFile(file, "utf8");
3447
+ const content = await readCandidateFile(file);
3417
3448
  const extension = toExtension(file);
3418
3449
  const jsStringStaticRanges = JS_LIKE_SOURCE_EXTENSION_RE.test(extension) ? createJsStringStaticRanges(content) : void 0;
3419
3450
  for (const candidate of extractBareArbitraryValueSourceCandidatesWithPositions(content, options.bareArbitraryValues)) if (shouldKeepSourceCandidate(content, extension, candidate, jsStringStaticRanges)) candidates.add(candidate.rawCandidate);
3420
3451
  } catch {}
3421
- }));
3452
+ });
3422
3453
  const result = [...candidates];
3423
3454
  setRawCandidateCacheEntry(cacheKey, fingerprint, result);
3424
3455
  return [...result];
@@ -1,8 +1,8 @@
1
1
  import { createRequire, findPackageJSON } from "node:module";
2
- import { promises, readFileSync } from "node:fs";
3
2
  import path from "node:path";
4
3
  import process from "node:process";
5
4
  import { createHash } from "node:crypto";
5
+ import { promises, readFileSync } from "node:fs";
6
6
  import { fileURLToPath, pathToFileURL } from "node:url";
7
7
  import { AsyncLocalStorage } from "node:async_hooks";
8
8
  import { clearRequireCache } from "@tailwindcss/node/require-cache";
@@ -453,6 +453,37 @@ function resolveTailwindV4SourceBaseCandidates(projectRoot, base, baseFallbacks)
453
453
  ]);
454
454
  }
455
455
  //#endregion
456
+ //#region src/extraction/file-io.ts
457
+ const CANDIDATE_FILE_CONCURRENCY = 8;
458
+ let activeReads = 0;
459
+ let pendingOffset = 0;
460
+ const pendingReads = [];
461
+ /** 原始补扫、任意值补扫与位置报告共享读取预算,避免多生成请求耗尽文件描述符。 */
462
+ async function readCandidateFile(file) {
463
+ if (activeReads >= CANDIDATE_FILE_CONCURRENCY) await new Promise((resolve) => {
464
+ pendingReads.push(resolve);
465
+ });
466
+ else activeReads++;
467
+ try {
468
+ return await promises.readFile(file, "utf8");
469
+ } finally {
470
+ if (pendingOffset < pendingReads.length) {
471
+ const next = pendingReads[pendingOffset++];
472
+ if (pendingOffset === pendingReads.length) {
473
+ pendingReads.length = 0;
474
+ pendingOffset = 0;
475
+ }
476
+ next();
477
+ } else activeReads--;
478
+ }
479
+ }
480
+ /** 分批遍历避免为全部文件同时分配 Promise,输出沿用文件枚举顺序。 */
481
+ async function mapCandidateFiles(files, handle) {
482
+ const results = [];
483
+ for (let start = 0; start < files.length; start += CANDIDATE_FILE_CONCURRENCY) results.push(...await Promise.all(files.slice(start, start + CANDIDATE_FILE_CONCURRENCY).map(handle)));
484
+ return results;
485
+ }
486
+ //#endregion
456
487
  //#region src/extraction/oxide.ts
457
488
  let oxideImportPromise;
458
489
  function createOxideRuntimeDependencyError(cause) {
@@ -576,7 +607,7 @@ async function extractProjectCandidatesWithPositions(options) {
576
607
  const batchSize = 32;
577
608
  for (let start = 0; start < files.length; start += batchSize) {
578
609
  const batch = files.slice(start, start + batchSize);
579
- const contents = await Promise.allSettled(batch.map((file) => promises.readFile(file, "utf8")));
610
+ const contents = await Promise.allSettled(batch.map(readCandidateFile));
580
611
  for (const [index, file] of batch.entries()) {
581
612
  const result = contents[index];
582
613
  if (result.status === "rejected") {
@@ -3373,27 +3404,27 @@ async function extractRawCandidates(sources, options) {
3373
3404
  if (cached) return [...cached.candidates];
3374
3405
  const scannedCandidates = scanner.scan();
3375
3406
  if (scannedCandidates.length === 0 && files.length > 0) {
3376
- const changedContents = (await Promise.all(files.map(async (file) => {
3407
+ const changedContents = (await mapCandidateFiles(files, async (file) => {
3377
3408
  try {
3378
3409
  return {
3379
- content: await promises.readFile(file, "utf8"),
3410
+ content: await readCandidateFile(file),
3380
3411
  extension: toExtension(file)
3381
3412
  };
3382
3413
  } catch {
3383
3414
  return;
3384
3415
  }
3385
- }))).filter((entry) => entry !== void 0);
3416
+ })).filter((entry) => entry !== void 0);
3386
3417
  scannedCandidates.push(...scanner.scanFiles(changedContents));
3387
3418
  }
3388
3419
  const candidates = new Set(scannedCandidates);
3389
- if (options?.bareArbitraryValues !== void 0 && options.bareArbitraryValues !== false) await Promise.all(files.map(async (file) => {
3420
+ if (options?.bareArbitraryValues !== void 0 && options.bareArbitraryValues !== false) await mapCandidateFiles(files, async (file) => {
3390
3421
  try {
3391
- const content = await promises.readFile(file, "utf8");
3422
+ const content = await readCandidateFile(file);
3392
3423
  const extension = toExtension(file);
3393
3424
  const jsStringStaticRanges = JS_LIKE_SOURCE_EXTENSION_RE.test(extension) ? createJsStringStaticRanges(content) : void 0;
3394
3425
  for (const candidate of extractBareArbitraryValueSourceCandidatesWithPositions(content, options.bareArbitraryValues)) if (shouldKeepSourceCandidate(content, extension, candidate, jsStringStaticRanges)) candidates.add(candidate.rawCandidate);
3395
3426
  } catch {}
3396
- }));
3427
+ });
3397
3428
  const result = [...candidates];
3398
3429
  setRawCandidateCacheEntry(cacheKey, fingerprint, result);
3399
3430
  return [...result];
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@weapp-tailwindcss/engine",
3
3
  "type": "module",
4
- "version": "0.1.4",
4
+ "version": "0.1.6",
5
5
  "description": "Tailwind CSS 4 候选提取、源码扫描与样式生成引擎。",
6
6
  "author": "ice breaker <1324318532@qq.com>",
7
7
  "license": "MIT",
@@ -67,7 +67,7 @@
67
67
  "@tailwindcss/node": "^4.3.3",
68
68
  "@tailwindcss/oxide": "^4.3.3",
69
69
  "@weapp-tailwindcss/source-scan": "0.1.2",
70
- "postcss": "^8.5.29"
70
+ "postcss": "^8.5.30"
71
71
  },
72
72
  "devDependencies": {
73
73
  "htmlparser2": "^12.0.0",