@weapp-tailwindcss/postcss 3.2.12 → 3.3.1
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.
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import postcss from 'postcss';
|
|
2
2
|
export declare const TAILWIND_V4_BANNER_RE: RegExp;
|
|
3
|
+
/**
|
|
4
|
+
* 严格移除文件末尾残留的 Tailwind source media 开始标记。
|
|
5
|
+
* 仅处理可确认属于 Tailwind 的尾部残片,其它非法 CSS 保持原样。
|
|
6
|
+
*/
|
|
7
|
+
export declare function repairTrailingUnclosedTailwindSourceMedia(css: string): string;
|
|
3
8
|
export declare function hasTailwindcssV4Signal(css: string): boolean;
|
|
4
9
|
export declare function unwrapTailwindSourceMedia(root: postcss.Root): void;
|
|
5
10
|
export declare function removeTailwindGenerationDirectives(root: postcss.Root): void;
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import type { FinalizeMiniProgramCssOptions } from './finalize-options.js';
|
|
2
|
+
import postcss from 'postcss';
|
|
2
3
|
export type { FinalizeMiniProgramCssOptions } from './finalize-options.js';
|
|
3
4
|
export { insertHoistedRules } from './hoist.js';
|
|
4
5
|
export { collectPreflightRules } from './preflight.js';
|
|
6
|
+
export declare function finalizeMiniProgramCssRoot(root: postcss.Root, options?: FinalizeMiniProgramCssOptions): void;
|
|
5
7
|
export declare function hoistTailwindPreflightBase(css: string): string;
|
|
6
8
|
export declare function finalizeMiniProgramCss(css: string, options?: FinalizeMiniProgramCssOptions): string;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export { removeUnsupportedAtSupports, removeUnsupportedCascadeLayers, removeUnsupportedMiniProgramAtRules, unwrapUnsupportedCascadeLayers, } from './at-rules.js';
|
|
2
2
|
export { consumeCascadeLayers } from './cascade-layers.js';
|
|
3
|
-
export {
|
|
3
|
+
export { repairTrailingUnclosedTailwindSourceMedia } from './directives.js';
|
|
4
|
+
export { finalizeMiniProgramCss, type FinalizeMiniProgramCssOptions, finalizeMiniProgramCssRoot, hoistTailwindPreflightBase, } from './finalize.js';
|
|
4
5
|
export { normalizeMiniProgramGeneratedCssForPostcss, pruneMiniProgramGeneratedCss, type PruneMiniProgramGeneratedCssOptions, } from './prune-generated.js';
|
|
5
6
|
export { hasMiniProgramCssSpecificityPlaceholders, removeEmptyAtRules, stripMiniProgramCssSpecificityPlaceholders, } from './root-cleanups.js';
|
package/dist/index.cjs
CHANGED
|
@@ -2484,6 +2484,120 @@ function unwrapUnsupportedCascadeLayers(css) {
|
|
|
2484
2484
|
}
|
|
2485
2485
|
}
|
|
2486
2486
|
//#endregion
|
|
2487
|
+
//#region src/compat/mini-program-css/directives.ts
|
|
2488
|
+
const TAILWIND_V4_BANNER_RE = /\/\*!\s*tailwindcss v4\./;
|
|
2489
|
+
const GENERATOR_PLACEHOLDER_COMMENT_RE = /^\s*(?:!\s*)?weapp-tailwindcss generator-placeholder\s*$/i;
|
|
2490
|
+
function isCssWhitespace(code) {
|
|
2491
|
+
return code === 9 || code === 10 || code === 12 || code === 13 || code === 32;
|
|
2492
|
+
}
|
|
2493
|
+
function skipCssWhitespace(css, start) {
|
|
2494
|
+
let index = start;
|
|
2495
|
+
while (index < css.length && isCssWhitespace(css.charCodeAt(index))) index++;
|
|
2496
|
+
return index;
|
|
2497
|
+
}
|
|
2498
|
+
function findClosingParenthesis(css, openingIndex) {
|
|
2499
|
+
let depth = 0;
|
|
2500
|
+
let quote = 0;
|
|
2501
|
+
for (let index = openingIndex; index < css.length; index++) {
|
|
2502
|
+
const code = css.charCodeAt(index);
|
|
2503
|
+
if (quote !== 0) {
|
|
2504
|
+
if (code === 92) index++;
|
|
2505
|
+
else if (code === quote) quote = 0;
|
|
2506
|
+
continue;
|
|
2507
|
+
}
|
|
2508
|
+
if (code === 34 || code === 39) {
|
|
2509
|
+
quote = code;
|
|
2510
|
+
continue;
|
|
2511
|
+
}
|
|
2512
|
+
if (code === 92) {
|
|
2513
|
+
index++;
|
|
2514
|
+
continue;
|
|
2515
|
+
}
|
|
2516
|
+
if (code === 47 && css.charCodeAt(index + 1) === 42) {
|
|
2517
|
+
const commentEnd = css.indexOf("*/", index + 2);
|
|
2518
|
+
if (commentEnd < 0) return -1;
|
|
2519
|
+
index = commentEnd + 1;
|
|
2520
|
+
continue;
|
|
2521
|
+
}
|
|
2522
|
+
if (code === 40) {
|
|
2523
|
+
depth++;
|
|
2524
|
+
continue;
|
|
2525
|
+
}
|
|
2526
|
+
if (code === 41) {
|
|
2527
|
+
depth--;
|
|
2528
|
+
if (depth === 0) return index;
|
|
2529
|
+
}
|
|
2530
|
+
}
|
|
2531
|
+
return -1;
|
|
2532
|
+
}
|
|
2533
|
+
function isCssCodePosition(css, position) {
|
|
2534
|
+
let quote = 0;
|
|
2535
|
+
for (let index = 0; index < position; index++) {
|
|
2536
|
+
const code = css.charCodeAt(index);
|
|
2537
|
+
if (quote !== 0) {
|
|
2538
|
+
if (code === 92) index++;
|
|
2539
|
+
else if (code === quote) quote = 0;
|
|
2540
|
+
continue;
|
|
2541
|
+
}
|
|
2542
|
+
if (code === 34 || code === 39) {
|
|
2543
|
+
quote = code;
|
|
2544
|
+
continue;
|
|
2545
|
+
}
|
|
2546
|
+
if (code === 47 && css.charCodeAt(index + 1) === 42) {
|
|
2547
|
+
const commentEnd = css.indexOf("*/", index + 2);
|
|
2548
|
+
if (commentEnd < 0 || commentEnd >= position) return false;
|
|
2549
|
+
index = commentEnd + 1;
|
|
2550
|
+
}
|
|
2551
|
+
}
|
|
2552
|
+
return quote === 0;
|
|
2553
|
+
}
|
|
2554
|
+
/**
|
|
2555
|
+
* 严格移除文件末尾残留的 Tailwind source media 开始标记。
|
|
2556
|
+
* 仅处理可确认属于 Tailwind 的尾部残片,其它非法 CSS 保持原样。
|
|
2557
|
+
*/
|
|
2558
|
+
function repairTrailingUnclosedTailwindSourceMedia(css) {
|
|
2559
|
+
const sourceMediaPattern = /(?:^|\r?\n)[\t\f ]*@media\s+source\(/g;
|
|
2560
|
+
for (let match = sourceMediaPattern.exec(css); match !== null; match = sourceMediaPattern.exec(css)) {
|
|
2561
|
+
const prefixLength = match[0].startsWith("\n") ? 1 : match[0].startsWith("\r\n") ? 2 : 0;
|
|
2562
|
+
const start = match.index + prefixLength;
|
|
2563
|
+
if (!isCssCodePosition(css, start)) continue;
|
|
2564
|
+
const closingIndex = findClosingParenthesis(css, start + match[0].length - prefixLength - 1);
|
|
2565
|
+
if (closingIndex < 0) continue;
|
|
2566
|
+
const blockStart = skipCssWhitespace(css, closingIndex + 1);
|
|
2567
|
+
if (css.charCodeAt(blockStart) !== 123) continue;
|
|
2568
|
+
if (skipCssWhitespace(css, blockStart + 1) !== css.length) continue;
|
|
2569
|
+
return css.slice(0, match.index);
|
|
2570
|
+
}
|
|
2571
|
+
return css;
|
|
2572
|
+
}
|
|
2573
|
+
function hasTailwindcssV4Signal(css) {
|
|
2574
|
+
if (TAILWIND_V4_BANNER_RE.test(css)) return true;
|
|
2575
|
+
const root = postcss.default.parse(css);
|
|
2576
|
+
let hasProperty = false;
|
|
2577
|
+
root.walkAtRules("property", (atRule) => {
|
|
2578
|
+
if (atRule.params.trim().startsWith("--tw-")) {
|
|
2579
|
+
hasProperty = true;
|
|
2580
|
+
return false;
|
|
2581
|
+
}
|
|
2582
|
+
});
|
|
2583
|
+
return hasProperty;
|
|
2584
|
+
}
|
|
2585
|
+
function unwrapTailwindSourceMedia(root) {
|
|
2586
|
+
root.walkAtRules("media", (atRule) => {
|
|
2587
|
+
if (!atRule.params.startsWith("source(")) return;
|
|
2588
|
+
if (atRule.nodes && atRule.nodes.length > 0) atRule.replaceWith(...atRule.nodes);
|
|
2589
|
+
else atRule.remove();
|
|
2590
|
+
});
|
|
2591
|
+
}
|
|
2592
|
+
function removeTailwindGenerationDirectives(root) {
|
|
2593
|
+
root.walkComments((comment) => {
|
|
2594
|
+
if (GENERATOR_PLACEHOLDER_COMMENT_RE.test(comment.text)) comment.remove();
|
|
2595
|
+
});
|
|
2596
|
+
root.walkAtRules((atRule) => {
|
|
2597
|
+
if (atRule.name === "config" || atRule.name === "source" || atRule.name === "tailwind" || atRule.name === "reference" || atRule.name === "plugin") atRule.remove();
|
|
2598
|
+
});
|
|
2599
|
+
}
|
|
2600
|
+
//#endregion
|
|
2487
2601
|
//#region src/compat/mini-program-prefixes.ts
|
|
2488
2602
|
const PRESERVED_WEBKIT_DECLARATION_PROPS = /* @__PURE__ */ new Set([
|
|
2489
2603
|
"-webkit-box-orient",
|
|
@@ -2574,37 +2688,6 @@ function removeUnsupportedMiniProgramPrefixedAtRule(atRule) {
|
|
|
2574
2688
|
if (atRule.name.toLowerCase() === "-webkit-keyframes") atRule.remove();
|
|
2575
2689
|
}
|
|
2576
2690
|
//#endregion
|
|
2577
|
-
//#region src/compat/mini-program-css/directives.ts
|
|
2578
|
-
const TAILWIND_V4_BANNER_RE = /\/\*!\s*tailwindcss v4\./;
|
|
2579
|
-
const GENERATOR_PLACEHOLDER_COMMENT_RE = /^\s*(?:!\s*)?weapp-tailwindcss generator-placeholder\s*$/i;
|
|
2580
|
-
function hasTailwindcssV4Signal(css) {
|
|
2581
|
-
if (TAILWIND_V4_BANNER_RE.test(css)) return true;
|
|
2582
|
-
const root = postcss.default.parse(css);
|
|
2583
|
-
let hasProperty = false;
|
|
2584
|
-
root.walkAtRules("property", (atRule) => {
|
|
2585
|
-
if (atRule.params.trim().startsWith("--tw-")) {
|
|
2586
|
-
hasProperty = true;
|
|
2587
|
-
return false;
|
|
2588
|
-
}
|
|
2589
|
-
});
|
|
2590
|
-
return hasProperty;
|
|
2591
|
-
}
|
|
2592
|
-
function unwrapTailwindSourceMedia(root) {
|
|
2593
|
-
root.walkAtRules("media", (atRule) => {
|
|
2594
|
-
if (!atRule.params.startsWith("source(")) return;
|
|
2595
|
-
if (atRule.nodes && atRule.nodes.length > 0) atRule.replaceWith(...atRule.nodes);
|
|
2596
|
-
else atRule.remove();
|
|
2597
|
-
});
|
|
2598
|
-
}
|
|
2599
|
-
function removeTailwindGenerationDirectives(root) {
|
|
2600
|
-
root.walkComments((comment) => {
|
|
2601
|
-
if (GENERATOR_PLACEHOLDER_COMMENT_RE.test(comment.text)) comment.remove();
|
|
2602
|
-
});
|
|
2603
|
-
root.walkAtRules((atRule) => {
|
|
2604
|
-
if (atRule.name === "config" || atRule.name === "source" || atRule.name === "tailwind" || atRule.name === "reference" || atRule.name === "plugin") atRule.remove();
|
|
2605
|
-
});
|
|
2606
|
-
}
|
|
2607
|
-
//#endregion
|
|
2608
2691
|
//#region src/compat/mini-program-css/hoist.ts
|
|
2609
2692
|
const HOIST_ANCHOR_COMMENT = "__weapp_tailwindcss_base_anchor__";
|
|
2610
2693
|
function getTopDirectiveTail(root) {
|
|
@@ -2789,6 +2872,9 @@ function finalizeMiniProgramCssRoot(root, options = {}) {
|
|
|
2789
2872
|
root.walkAtRules("property", (atRule) => {
|
|
2790
2873
|
atRule.remove();
|
|
2791
2874
|
});
|
|
2875
|
+
root.walkAtRules("supports", (atRule) => {
|
|
2876
|
+
atRule.remove();
|
|
2877
|
+
});
|
|
2792
2878
|
removeSpecificityPlaceholders(root);
|
|
2793
2879
|
removeRootSpecificityPlaceholders(root);
|
|
2794
2880
|
removeUnsupportedBrowserSelectors(root);
|
|
@@ -2835,13 +2921,14 @@ function hoistTailwindPreflightBase(css) {
|
|
|
2835
2921
|
}
|
|
2836
2922
|
}
|
|
2837
2923
|
function finalizeMiniProgramCss(css, options = {}) {
|
|
2924
|
+
const repairedCss = repairTrailingUnclosedTailwindSourceMedia(css);
|
|
2838
2925
|
let isTailwindcssV4 = options.isTailwindcssV4;
|
|
2839
2926
|
if (isTailwindcssV4 === void 0) try {
|
|
2840
|
-
isTailwindcssV4 = hasTailwindcssV4Signal(
|
|
2927
|
+
isTailwindcssV4 = hasTailwindcssV4Signal(repairedCss);
|
|
2841
2928
|
} catch {
|
|
2842
|
-
isTailwindcssV4 = TAILWIND_V4_BANNER_RE.test(
|
|
2929
|
+
isTailwindcssV4 = TAILWIND_V4_BANNER_RE.test(repairedCss);
|
|
2843
2930
|
}
|
|
2844
|
-
const cleanedCss = removeUnsupportedMiniProgramAtRules(
|
|
2931
|
+
const cleanedCss = removeUnsupportedMiniProgramAtRules(repairedCss);
|
|
2845
2932
|
try {
|
|
2846
2933
|
const root = postcss.default.parse(cleanedCss);
|
|
2847
2934
|
finalizeMiniProgramCssRoot(root, {
|
|
@@ -7700,6 +7787,7 @@ exports.filterApplyOnlyGeneratedCss = filterApplyOnlyGeneratedCss;
|
|
|
7700
7787
|
exports.filterApplyOnlyGeneratedCssRoot = filterApplyOnlyGeneratedCssRoot;
|
|
7701
7788
|
exports.filterExistingCssRules = filterExistingCssRules;
|
|
7702
7789
|
exports.finalizeMiniProgramCss = finalizeMiniProgramCss;
|
|
7790
|
+
exports.finalizeMiniProgramCssRoot = finalizeMiniProgramCssRoot;
|
|
7703
7791
|
exports.getPostcssPluginName = getPostcssPluginName;
|
|
7704
7792
|
exports.hasCssMacroStyleOptions = hasCssMacroStyleOptions;
|
|
7705
7793
|
exports.hasCssMacroTailwindV4CustomVariantConditionalComments = hasCssMacroTailwindV4CustomVariantConditionalComments;
|
|
@@ -7760,6 +7848,7 @@ exports.removeUnsupportedCascadeLayers = removeUnsupportedCascadeLayers;
|
|
|
7760
7848
|
exports.removeUnsupportedMiniProgramAtRules = removeUnsupportedMiniProgramAtRules;
|
|
7761
7849
|
exports.removeUnsupportedMiniProgramCssImportsRoot = removeUnsupportedMiniProgramCssImportsRoot;
|
|
7762
7850
|
exports.removeUnsupportedMiniProgramPrefixedAtRule = removeUnsupportedMiniProgramPrefixedAtRule;
|
|
7851
|
+
exports.repairTrailingUnclosedTailwindSourceMedia = repairTrailingUnclosedTailwindSourceMedia;
|
|
7763
7852
|
exports.resolveCssSourceEntries = resolveCssSourceEntries;
|
|
7764
7853
|
exports.resolveFilteredPostcssConfig = resolveFilteredPostcssConfig;
|
|
7765
7854
|
exports.resolvePostcssConfig = resolvePostcssConfig;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export { type PostcssAppType, type PostcssStyleBranch, type PostcssStyleBranchProfile, resolvePostcssStyleBranch, type ResolvePostcssStyleBranchOptions, resolvePostcssStyleBranchProfile, } from './branches/index.js';
|
|
2
2
|
export { type DynamicColorMixAlphaProtection, type DynamicColorMixAlphaProtectionOptions, type ModernColorValueNormalization, normalizeModernColorValue, protectDynamicColorMixAlpha, protectDynamicVarFallbacks, } from './compat/color-mix.js';
|
|
3
3
|
export { transformLynxCssCompat } from './compat/lynx-css.js';
|
|
4
|
-
export { consumeCascadeLayers, finalizeMiniProgramCss, hasMiniProgramCssSpecificityPlaceholders, hoistTailwindPreflightBase, normalizeMiniProgramGeneratedCssForPostcss, pruneMiniProgramGeneratedCss, removeEmptyAtRules, removeUnsupportedAtSupports, removeUnsupportedCascadeLayers, removeUnsupportedMiniProgramAtRules, stripMiniProgramCssSpecificityPlaceholders, unwrapUnsupportedCascadeLayers, } from './compat/mini-program-css/index.js';
|
|
4
|
+
export { consumeCascadeLayers, finalizeMiniProgramCss, type FinalizeMiniProgramCssOptions, finalizeMiniProgramCssRoot, hasMiniProgramCssSpecificityPlaceholders, hoistTailwindPreflightBase, normalizeMiniProgramGeneratedCssForPostcss, pruneMiniProgramGeneratedCss, removeEmptyAtRules, removeUnsupportedAtSupports, removeUnsupportedCascadeLayers, removeUnsupportedMiniProgramAtRules, repairTrailingUnclosedTailwindSourceMedia, stripMiniProgramCssSpecificityPlaceholders, unwrapUnsupportedCascadeLayers, } from './compat/mini-program-css/index.js';
|
|
5
5
|
export { normalizeMiniProgramPrefixedDeclaration, removeUnsupportedMiniProgramPrefixedAtRule, } from './compat/mini-program-prefixes.js';
|
|
6
6
|
export { convertTailwindcssRpxDeclarationsToRem, convertTailwindcssRpxDeclarationToRem, convertTailwindcssRpxValueToRem, normalizeTailwindcssRpxDeclaration, normalizeTailwindcssRpxDeclarations, normalizeTailwindcssWebRpxDeclarations, type TailwindcssRpxToRemOptions, } from './compat/tailwindcss-rpx.js';
|
|
7
7
|
export { normalizeTailwindcssV4InfinityCalcCss } from './compat/tailwindcss-v4.js';
|
package/dist/index.js
CHANGED
|
@@ -2468,6 +2468,120 @@ function unwrapUnsupportedCascadeLayers(css) {
|
|
|
2468
2468
|
}
|
|
2469
2469
|
}
|
|
2470
2470
|
//#endregion
|
|
2471
|
+
//#region src/compat/mini-program-css/directives.ts
|
|
2472
|
+
const TAILWIND_V4_BANNER_RE = /\/\*!\s*tailwindcss v4\./;
|
|
2473
|
+
const GENERATOR_PLACEHOLDER_COMMENT_RE = /^\s*(?:!\s*)?weapp-tailwindcss generator-placeholder\s*$/i;
|
|
2474
|
+
function isCssWhitespace(code) {
|
|
2475
|
+
return code === 9 || code === 10 || code === 12 || code === 13 || code === 32;
|
|
2476
|
+
}
|
|
2477
|
+
function skipCssWhitespace(css, start) {
|
|
2478
|
+
let index = start;
|
|
2479
|
+
while (index < css.length && isCssWhitespace(css.charCodeAt(index))) index++;
|
|
2480
|
+
return index;
|
|
2481
|
+
}
|
|
2482
|
+
function findClosingParenthesis(css, openingIndex) {
|
|
2483
|
+
let depth = 0;
|
|
2484
|
+
let quote = 0;
|
|
2485
|
+
for (let index = openingIndex; index < css.length; index++) {
|
|
2486
|
+
const code = css.charCodeAt(index);
|
|
2487
|
+
if (quote !== 0) {
|
|
2488
|
+
if (code === 92) index++;
|
|
2489
|
+
else if (code === quote) quote = 0;
|
|
2490
|
+
continue;
|
|
2491
|
+
}
|
|
2492
|
+
if (code === 34 || code === 39) {
|
|
2493
|
+
quote = code;
|
|
2494
|
+
continue;
|
|
2495
|
+
}
|
|
2496
|
+
if (code === 92) {
|
|
2497
|
+
index++;
|
|
2498
|
+
continue;
|
|
2499
|
+
}
|
|
2500
|
+
if (code === 47 && css.charCodeAt(index + 1) === 42) {
|
|
2501
|
+
const commentEnd = css.indexOf("*/", index + 2);
|
|
2502
|
+
if (commentEnd < 0) return -1;
|
|
2503
|
+
index = commentEnd + 1;
|
|
2504
|
+
continue;
|
|
2505
|
+
}
|
|
2506
|
+
if (code === 40) {
|
|
2507
|
+
depth++;
|
|
2508
|
+
continue;
|
|
2509
|
+
}
|
|
2510
|
+
if (code === 41) {
|
|
2511
|
+
depth--;
|
|
2512
|
+
if (depth === 0) return index;
|
|
2513
|
+
}
|
|
2514
|
+
}
|
|
2515
|
+
return -1;
|
|
2516
|
+
}
|
|
2517
|
+
function isCssCodePosition(css, position) {
|
|
2518
|
+
let quote = 0;
|
|
2519
|
+
for (let index = 0; index < position; index++) {
|
|
2520
|
+
const code = css.charCodeAt(index);
|
|
2521
|
+
if (quote !== 0) {
|
|
2522
|
+
if (code === 92) index++;
|
|
2523
|
+
else if (code === quote) quote = 0;
|
|
2524
|
+
continue;
|
|
2525
|
+
}
|
|
2526
|
+
if (code === 34 || code === 39) {
|
|
2527
|
+
quote = code;
|
|
2528
|
+
continue;
|
|
2529
|
+
}
|
|
2530
|
+
if (code === 47 && css.charCodeAt(index + 1) === 42) {
|
|
2531
|
+
const commentEnd = css.indexOf("*/", index + 2);
|
|
2532
|
+
if (commentEnd < 0 || commentEnd >= position) return false;
|
|
2533
|
+
index = commentEnd + 1;
|
|
2534
|
+
}
|
|
2535
|
+
}
|
|
2536
|
+
return quote === 0;
|
|
2537
|
+
}
|
|
2538
|
+
/**
|
|
2539
|
+
* 严格移除文件末尾残留的 Tailwind source media 开始标记。
|
|
2540
|
+
* 仅处理可确认属于 Tailwind 的尾部残片,其它非法 CSS 保持原样。
|
|
2541
|
+
*/
|
|
2542
|
+
function repairTrailingUnclosedTailwindSourceMedia(css) {
|
|
2543
|
+
const sourceMediaPattern = /(?:^|\r?\n)[\t\f ]*@media\s+source\(/g;
|
|
2544
|
+
for (let match = sourceMediaPattern.exec(css); match !== null; match = sourceMediaPattern.exec(css)) {
|
|
2545
|
+
const prefixLength = match[0].startsWith("\n") ? 1 : match[0].startsWith("\r\n") ? 2 : 0;
|
|
2546
|
+
const start = match.index + prefixLength;
|
|
2547
|
+
if (!isCssCodePosition(css, start)) continue;
|
|
2548
|
+
const closingIndex = findClosingParenthesis(css, start + match[0].length - prefixLength - 1);
|
|
2549
|
+
if (closingIndex < 0) continue;
|
|
2550
|
+
const blockStart = skipCssWhitespace(css, closingIndex + 1);
|
|
2551
|
+
if (css.charCodeAt(blockStart) !== 123) continue;
|
|
2552
|
+
if (skipCssWhitespace(css, blockStart + 1) !== css.length) continue;
|
|
2553
|
+
return css.slice(0, match.index);
|
|
2554
|
+
}
|
|
2555
|
+
return css;
|
|
2556
|
+
}
|
|
2557
|
+
function hasTailwindcssV4Signal(css) {
|
|
2558
|
+
if (TAILWIND_V4_BANNER_RE.test(css)) return true;
|
|
2559
|
+
const root = postcss$1.parse(css);
|
|
2560
|
+
let hasProperty = false;
|
|
2561
|
+
root.walkAtRules("property", (atRule) => {
|
|
2562
|
+
if (atRule.params.trim().startsWith("--tw-")) {
|
|
2563
|
+
hasProperty = true;
|
|
2564
|
+
return false;
|
|
2565
|
+
}
|
|
2566
|
+
});
|
|
2567
|
+
return hasProperty;
|
|
2568
|
+
}
|
|
2569
|
+
function unwrapTailwindSourceMedia(root) {
|
|
2570
|
+
root.walkAtRules("media", (atRule) => {
|
|
2571
|
+
if (!atRule.params.startsWith("source(")) return;
|
|
2572
|
+
if (atRule.nodes && atRule.nodes.length > 0) atRule.replaceWith(...atRule.nodes);
|
|
2573
|
+
else atRule.remove();
|
|
2574
|
+
});
|
|
2575
|
+
}
|
|
2576
|
+
function removeTailwindGenerationDirectives(root) {
|
|
2577
|
+
root.walkComments((comment) => {
|
|
2578
|
+
if (GENERATOR_PLACEHOLDER_COMMENT_RE.test(comment.text)) comment.remove();
|
|
2579
|
+
});
|
|
2580
|
+
root.walkAtRules((atRule) => {
|
|
2581
|
+
if (atRule.name === "config" || atRule.name === "source" || atRule.name === "tailwind" || atRule.name === "reference" || atRule.name === "plugin") atRule.remove();
|
|
2582
|
+
});
|
|
2583
|
+
}
|
|
2584
|
+
//#endregion
|
|
2471
2585
|
//#region src/compat/mini-program-prefixes.ts
|
|
2472
2586
|
const PRESERVED_WEBKIT_DECLARATION_PROPS = /* @__PURE__ */ new Set([
|
|
2473
2587
|
"-webkit-box-orient",
|
|
@@ -2558,37 +2672,6 @@ function removeUnsupportedMiniProgramPrefixedAtRule(atRule) {
|
|
|
2558
2672
|
if (atRule.name.toLowerCase() === "-webkit-keyframes") atRule.remove();
|
|
2559
2673
|
}
|
|
2560
2674
|
//#endregion
|
|
2561
|
-
//#region src/compat/mini-program-css/directives.ts
|
|
2562
|
-
const TAILWIND_V4_BANNER_RE = /\/\*!\s*tailwindcss v4\./;
|
|
2563
|
-
const GENERATOR_PLACEHOLDER_COMMENT_RE = /^\s*(?:!\s*)?weapp-tailwindcss generator-placeholder\s*$/i;
|
|
2564
|
-
function hasTailwindcssV4Signal(css) {
|
|
2565
|
-
if (TAILWIND_V4_BANNER_RE.test(css)) return true;
|
|
2566
|
-
const root = postcss$1.parse(css);
|
|
2567
|
-
let hasProperty = false;
|
|
2568
|
-
root.walkAtRules("property", (atRule) => {
|
|
2569
|
-
if (atRule.params.trim().startsWith("--tw-")) {
|
|
2570
|
-
hasProperty = true;
|
|
2571
|
-
return false;
|
|
2572
|
-
}
|
|
2573
|
-
});
|
|
2574
|
-
return hasProperty;
|
|
2575
|
-
}
|
|
2576
|
-
function unwrapTailwindSourceMedia(root) {
|
|
2577
|
-
root.walkAtRules("media", (atRule) => {
|
|
2578
|
-
if (!atRule.params.startsWith("source(")) return;
|
|
2579
|
-
if (atRule.nodes && atRule.nodes.length > 0) atRule.replaceWith(...atRule.nodes);
|
|
2580
|
-
else atRule.remove();
|
|
2581
|
-
});
|
|
2582
|
-
}
|
|
2583
|
-
function removeTailwindGenerationDirectives(root) {
|
|
2584
|
-
root.walkComments((comment) => {
|
|
2585
|
-
if (GENERATOR_PLACEHOLDER_COMMENT_RE.test(comment.text)) comment.remove();
|
|
2586
|
-
});
|
|
2587
|
-
root.walkAtRules((atRule) => {
|
|
2588
|
-
if (atRule.name === "config" || atRule.name === "source" || atRule.name === "tailwind" || atRule.name === "reference" || atRule.name === "plugin") atRule.remove();
|
|
2589
|
-
});
|
|
2590
|
-
}
|
|
2591
|
-
//#endregion
|
|
2592
2675
|
//#region src/compat/mini-program-css/hoist.ts
|
|
2593
2676
|
const HOIST_ANCHOR_COMMENT = "__weapp_tailwindcss_base_anchor__";
|
|
2594
2677
|
function getTopDirectiveTail(root) {
|
|
@@ -2773,6 +2856,9 @@ function finalizeMiniProgramCssRoot(root, options = {}) {
|
|
|
2773
2856
|
root.walkAtRules("property", (atRule) => {
|
|
2774
2857
|
atRule.remove();
|
|
2775
2858
|
});
|
|
2859
|
+
root.walkAtRules("supports", (atRule) => {
|
|
2860
|
+
atRule.remove();
|
|
2861
|
+
});
|
|
2776
2862
|
removeSpecificityPlaceholders(root);
|
|
2777
2863
|
removeRootSpecificityPlaceholders(root);
|
|
2778
2864
|
removeUnsupportedBrowserSelectors(root);
|
|
@@ -2819,13 +2905,14 @@ function hoistTailwindPreflightBase(css) {
|
|
|
2819
2905
|
}
|
|
2820
2906
|
}
|
|
2821
2907
|
function finalizeMiniProgramCss(css, options = {}) {
|
|
2908
|
+
const repairedCss = repairTrailingUnclosedTailwindSourceMedia(css);
|
|
2822
2909
|
let isTailwindcssV4 = options.isTailwindcssV4;
|
|
2823
2910
|
if (isTailwindcssV4 === void 0) try {
|
|
2824
|
-
isTailwindcssV4 = hasTailwindcssV4Signal(
|
|
2911
|
+
isTailwindcssV4 = hasTailwindcssV4Signal(repairedCss);
|
|
2825
2912
|
} catch {
|
|
2826
|
-
isTailwindcssV4 = TAILWIND_V4_BANNER_RE.test(
|
|
2913
|
+
isTailwindcssV4 = TAILWIND_V4_BANNER_RE.test(repairedCss);
|
|
2827
2914
|
}
|
|
2828
|
-
const cleanedCss = removeUnsupportedMiniProgramAtRules(
|
|
2915
|
+
const cleanedCss = removeUnsupportedMiniProgramAtRules(repairedCss);
|
|
2829
2916
|
try {
|
|
2830
2917
|
const root = postcss$1.parse(cleanedCss);
|
|
2831
2918
|
finalizeMiniProgramCssRoot(root, {
|
|
@@ -7648,4 +7735,4 @@ function mergeMiniProgramThemeScopeRuleDeclarations(baseCss, css) {
|
|
|
7648
7735
|
}
|
|
7649
7736
|
}
|
|
7650
7737
|
//#endregion
|
|
7651
|
-
export { CSS_MACRO_POSTCSS_PLUGIN_NAME, CSS_MACRO_STYLE_OPTIONS_MARKER, FULL_SOURCE_SCAN_EXTENSIONS, FULL_SOURCE_SCAN_EXTENSION_RE, FULL_SOURCE_SCAN_PATTERN, UNI_APP_X_IMPORTANT_APPLY_MARKER, analyzeTailwindCssDirectives, cleanLocalCssImportWrapperTailwindDirectives, cleanLocalCssImportWrapperTailwindDirectivesRoot, collectApplyOnlyCssSelectors, collectApplyOnlyCssSelectorsRoot, collectCssImportRequestsRoot, collectCssInlineSourceCandidates, compileCssMacroConditionalComments, consumeCascadeLayers, containsCssAfterMinify, convertTailwindcssRpxDeclarationToRem, convertTailwindcssRpxDeclarationsToRem, convertTailwindcssRpxValueToRem, createCssSourceOrderAppend, createFallbackPlaceholderReplacer, createInjectPreflight, createPostcssStyleTargetProfile, createSourceScanPattern, createStyleHandler, createStylePipeline, createTailwindSourceEntryMatcher, createWeappTailwindcssPostcssPlugin, creator as cssMacroPostcssPlugin, dedupeCoveredCssRules, expandInlineSourceCandidatePattern, expandTailwindSourceEntries, filterApplyOnlyGeneratedCss, filterApplyOnlyGeneratedCssRoot, filterExistingCssRules, finalizeMiniProgramCss, getPostcssPluginName, hasCssMacroStyleOptions, hasCssMacroTailwindV4CustomVariantConditionalComments, hasCssMacroTailwindV4Directive, hasCssMacroTailwindV4InternalAtRules, hasCssMacroTailwindV4Source, hasMiniProgramCssSpecificityPlaceholders, hoistTailwindPreflightBase, internalCssSelectorReplacer, isFileExcludedByTailwindSourceEntries, isFileMatchedByTailwindSourceEntries, isLocalCssImportRequest, isMiniProgramLocalCssImportRequest, isPureLocalCssImportWrapper, isPureLocalCssImportWrapperRoot, isTailwindCssGenerationDirective, isTailwindCssImportAtRule, isTailwindCssImportRequest, isTailwindCssPackageJsonImportRequest, isWeappTailwindcssImportRequest, mergeCoveredCssRuleDeclarations, mergeMiniProgramPreflightRuleDeclarations, mergeMiniProgramThemeScopeRuleDeclarations, normalizeLegacyContentEntries, normalizeMiniProgramGeneratedCssForPostcss, normalizeMiniProgramPrefixedDeclaration, normalizeModernColorValue, normalizeOutputImportRequest, normalizeTailwindCssImportRequest, normalizeTailwindcssRpxDeclaration, normalizeTailwindcssRpxDeclarations, normalizeTailwindcssV4InfinityCalcCss, normalizeTailwindcssWebRpxDeclarations, normalizeUniAppXImportantApplyForSass, normalizeWebCssCompatOptions, parseConfigParam, parseSourceFileParam, parseTailwindCssConfigRequest, parseTailwindCssDirectiveRequest, postcss, postcssHtmlTransform, prefixLocalCssImportsWithWebpackIgnoreRoot, protectDynamicColorMixAlpha, protectDynamicVarFallbacks, pruneMiniProgramGeneratedCss, removeEmptyAtRules, removeMatchingLocalCssImports, removeMatchingLocalCssImportsRoot, removeTailwindPostcssPlugins, removeTailwindSourceDirectivesRoot, removeUnsupportedAtSupports, removeUnsupportedCascadeLayers, removeUnsupportedMiniProgramAtRules, removeUnsupportedMiniProgramCssImportsRoot, removeUnsupportedMiniProgramPrefixedAtRule, resolveCssSourceEntries, resolveFilteredPostcssConfig, resolvePostcssConfig, resolvePostcssFrameworkProfile, resolvePostcssFrameworkStrategy, resolvePostcssStyleBranch, resolvePostcssStyleBranchProfile, resolvePostcssStyleTarget, resolveSourceScanPath, resolveTailwindSourceEntry, restoreLocalCssImports, restoreUniAppXImportantApplyMarker, rewriteLocalCssImportRequestsForOutput, rewriteLocalCssImportRequestsForOutputRoot, selectorContainsPseudoClass, splitLocalCssImports, splitLocalCssImportsRoot, stripMiniProgramCssSpecificityPlaceholders, toPosixPath, transformCssMacroCss, transformCssMacroTailwindV4Source, transformLynxCssCompat, transformWebCssCompat, transformWebCssSafeSelectors, unitConversionComposeRules, unitConversionPresets, unwrapUnsupportedCascadeLayers, withCssMacroStyleOptions };
|
|
7738
|
+
export { CSS_MACRO_POSTCSS_PLUGIN_NAME, CSS_MACRO_STYLE_OPTIONS_MARKER, FULL_SOURCE_SCAN_EXTENSIONS, FULL_SOURCE_SCAN_EXTENSION_RE, FULL_SOURCE_SCAN_PATTERN, UNI_APP_X_IMPORTANT_APPLY_MARKER, analyzeTailwindCssDirectives, cleanLocalCssImportWrapperTailwindDirectives, cleanLocalCssImportWrapperTailwindDirectivesRoot, collectApplyOnlyCssSelectors, collectApplyOnlyCssSelectorsRoot, collectCssImportRequestsRoot, collectCssInlineSourceCandidates, compileCssMacroConditionalComments, consumeCascadeLayers, containsCssAfterMinify, convertTailwindcssRpxDeclarationToRem, convertTailwindcssRpxDeclarationsToRem, convertTailwindcssRpxValueToRem, createCssSourceOrderAppend, createFallbackPlaceholderReplacer, createInjectPreflight, createPostcssStyleTargetProfile, createSourceScanPattern, createStyleHandler, createStylePipeline, createTailwindSourceEntryMatcher, createWeappTailwindcssPostcssPlugin, creator as cssMacroPostcssPlugin, dedupeCoveredCssRules, expandInlineSourceCandidatePattern, expandTailwindSourceEntries, filterApplyOnlyGeneratedCss, filterApplyOnlyGeneratedCssRoot, filterExistingCssRules, finalizeMiniProgramCss, finalizeMiniProgramCssRoot, getPostcssPluginName, hasCssMacroStyleOptions, hasCssMacroTailwindV4CustomVariantConditionalComments, hasCssMacroTailwindV4Directive, hasCssMacroTailwindV4InternalAtRules, hasCssMacroTailwindV4Source, hasMiniProgramCssSpecificityPlaceholders, hoistTailwindPreflightBase, internalCssSelectorReplacer, isFileExcludedByTailwindSourceEntries, isFileMatchedByTailwindSourceEntries, isLocalCssImportRequest, isMiniProgramLocalCssImportRequest, isPureLocalCssImportWrapper, isPureLocalCssImportWrapperRoot, isTailwindCssGenerationDirective, isTailwindCssImportAtRule, isTailwindCssImportRequest, isTailwindCssPackageJsonImportRequest, isWeappTailwindcssImportRequest, mergeCoveredCssRuleDeclarations, mergeMiniProgramPreflightRuleDeclarations, mergeMiniProgramThemeScopeRuleDeclarations, normalizeLegacyContentEntries, normalizeMiniProgramGeneratedCssForPostcss, normalizeMiniProgramPrefixedDeclaration, normalizeModernColorValue, normalizeOutputImportRequest, normalizeTailwindCssImportRequest, normalizeTailwindcssRpxDeclaration, normalizeTailwindcssRpxDeclarations, normalizeTailwindcssV4InfinityCalcCss, normalizeTailwindcssWebRpxDeclarations, normalizeUniAppXImportantApplyForSass, normalizeWebCssCompatOptions, parseConfigParam, parseSourceFileParam, parseTailwindCssConfigRequest, parseTailwindCssDirectiveRequest, postcss, postcssHtmlTransform, prefixLocalCssImportsWithWebpackIgnoreRoot, protectDynamicColorMixAlpha, protectDynamicVarFallbacks, pruneMiniProgramGeneratedCss, removeEmptyAtRules, removeMatchingLocalCssImports, removeMatchingLocalCssImportsRoot, removeTailwindPostcssPlugins, removeTailwindSourceDirectivesRoot, removeUnsupportedAtSupports, removeUnsupportedCascadeLayers, removeUnsupportedMiniProgramAtRules, removeUnsupportedMiniProgramCssImportsRoot, removeUnsupportedMiniProgramPrefixedAtRule, repairTrailingUnclosedTailwindSourceMedia, resolveCssSourceEntries, resolveFilteredPostcssConfig, resolvePostcssConfig, resolvePostcssFrameworkProfile, resolvePostcssFrameworkStrategy, resolvePostcssStyleBranch, resolvePostcssStyleBranchProfile, resolvePostcssStyleTarget, resolveSourceScanPath, resolveTailwindSourceEntry, restoreLocalCssImports, restoreUniAppXImportantApplyMarker, rewriteLocalCssImportRequestsForOutput, rewriteLocalCssImportRequestsForOutputRoot, selectorContainsPseudoClass, splitLocalCssImports, splitLocalCssImportsRoot, stripMiniProgramCssSpecificityPlaceholders, toPosixPath, transformCssMacroCss, transformCssMacroTailwindV4Source, transformLynxCssCompat, transformWebCssCompat, transformWebCssSafeSelectors, unitConversionComposeRules, unitConversionPresets, unwrapUnsupportedCascadeLayers, withCssMacroStyleOptions };
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@weapp-tailwindcss/postcss",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "3.
|
|
4
|
+
"version": "3.3.1",
|
|
5
5
|
"description": "PostCSS transforms that bring Tailwind CSS compatibility to every platform. 将 Tailwind CSS 兼容能力带到全端的 PostCSS 转换工具。",
|
|
6
6
|
"author": "ice breaker <1324318532@qq.com>",
|
|
7
7
|
"license": "MIT",
|
|
@@ -66,7 +66,7 @@
|
|
|
66
66
|
"node": "^20.19.0 || >=22.12.0"
|
|
67
67
|
},
|
|
68
68
|
"dependencies": {
|
|
69
|
-
"@csstools/css-color-parser": "^4.2.
|
|
69
|
+
"@csstools/css-color-parser": "^4.2.2",
|
|
70
70
|
"@csstools/css-parser-algorithms": "^4.0.0",
|
|
71
71
|
"@csstools/css-tokenizer": "^4.0.0",
|
|
72
72
|
"@tailwindcss-mangle/engine": "0.2.0",
|
|
@@ -74,7 +74,7 @@
|
|
|
74
74
|
"@weapp-tailwindcss/postcss-calc": "1.0.5",
|
|
75
75
|
"@weapp-tailwindcss/shared": "2.0.3",
|
|
76
76
|
"autoprefixer": "^10.5.4",
|
|
77
|
-
"es-toolkit": "^1.
|
|
77
|
+
"es-toolkit": "^1.52.0",
|
|
78
78
|
"lru-cache": "11.5.2",
|
|
79
79
|
"micromatch": "^4.0.8",
|
|
80
80
|
"postcss": "^8.5.26",
|
|
@@ -91,7 +91,7 @@
|
|
|
91
91
|
"devDependencies": {
|
|
92
92
|
"@csstools/postcss-is-pseudo-class": "^6.0.0",
|
|
93
93
|
"fast-check": "^4.9.0",
|
|
94
|
-
"postcss-calc": "link
|
|
94
|
+
"postcss-calc": "link:../postcss-calc",
|
|
95
95
|
"postcss-custom-properties": "^15.0.1"
|
|
96
96
|
},
|
|
97
97
|
"scripts": {
|