-
-
Notifications
You must be signed in to change notification settings - Fork 102
Expand file tree
/
Copy pathfinalize.ts
More file actions
126 lines (121 loc) · 4.57 KB
/
Copy pathfinalize.ts
File metadata and controls
126 lines (121 loc) · 4.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
import type { FinalizeMiniProgramCssOptions } from './finalize-options'
import postcss from 'postcss'
import { normalizeMiniProgramPrefixedDeclaration, removeUnsupportedMiniProgramPrefixedAtRule } from '../mini-program-prefixes'
import { appendTailwindcssV4MiniProgramGradientRules, collectUsedTailwindcssV4Variables, createMissingCssVarsV4Nodes, mergeTailwindcssV4GradientDirectionRules, normalizeTailwindcssV4Declaration } from '../tailwindcss-v4'
import { removeUnsupportedCascadeLayers, removeUnsupportedMiniProgramAtRules } from './at-rules'
import {
hasTailwindcssV4Signal,
removeTailwindGenerationDirectives,
TAILWIND_V4_BANNER_RE,
unwrapTailwindSourceMedia,
} from './directives'
import { createHoistInsertionAnchor, insertHoistedRules, mergeEquivalentHoistedRules } from './hoist'
import { collectPreflightRules, createPreflightResetRule } from './preflight'
import {
removeDisplayP3Declarations,
removeEmptyAtRules,
removeRootSpecificityPlaceholders,
removeSpecificityPlaceholders,
removeSpecificityPlaceholdersFromSource,
removeTailwindContainerMaxWidthMediaRules,
removeTailwindContainerWidthRules,
removeUnsupportedBrowserSelectors,
removeUnsupportedModernColorDeclarations,
} from './root-cleanups'
import { MINI_PROGRAM_ELEMENT_SCOPE_SELECTOR } from './selectors'
import { collectThemeVariableRule } from './theme'
export type { FinalizeMiniProgramCssOptions } from './finalize-options'
export { insertHoistedRules } from './hoist'
export { collectPreflightRules } from './preflight'
function finalizeMiniProgramCssRoot(root: postcss.Root, options: FinalizeMiniProgramCssOptions = {}) {
const shouldInjectTailwindcssV4Defaults = options.isTailwindcssV4 === true
const tailwindcssV4DefaultNodes = shouldInjectTailwindcssV4Defaults
? createMissingCssVarsV4Nodes(root, collectUsedTailwindcssV4Variables(root))
: []
removeUnsupportedCascadeLayers(root)
unwrapTailwindSourceMedia(root)
removeTailwindGenerationDirectives(root)
root.walkAtRules('property', (atRule) => {
atRule.remove()
})
removeSpecificityPlaceholders(root)
removeRootSpecificityPlaceholders(root)
removeUnsupportedBrowserSelectors(root)
removeDisplayP3Declarations(root)
removeTailwindContainerMaxWidthMediaRules(root)
removeTailwindContainerWidthRules(root, { generatedOnly: true })
removeUnsupportedModernColorDeclarations(root)
root.walkDecls((decl) => {
if (shouldInjectTailwindcssV4Defaults) {
normalizeTailwindcssV4Declaration(decl)
}
normalizeMiniProgramPrefixedDeclaration(decl)
})
root.walkAtRules((atRule) => {
removeUnsupportedMiniProgramPrefixedAtRule(atRule)
})
if (shouldInjectTailwindcssV4Defaults) {
mergeTailwindcssV4GradientDirectionRules(root)
if (options.tailwindcssV4GradientFallback === true) {
appendTailwindcssV4MiniProgramGradientRules(root)
}
}
const hoistAnchor = createHoistInsertionAnchor(root)
const preflightRules = collectPreflightRules(root, options)
if (preflightRules.length === 0) {
const resetRule = createPreflightResetRule(options.cssPreflight)
if (resetRule) {
preflightRules.push(resetRule)
}
}
if (tailwindcssV4DefaultNodes.length > 0) {
preflightRules.push(postcss.rule({
selector: MINI_PROGRAM_ELEMENT_SCOPE_SELECTOR,
nodes: tailwindcssV4DefaultNodes,
}))
}
const themeRule = collectThemeVariableRule(root, options)
const hoistedRules = themeRule ? [...preflightRules, themeRule] : preflightRules
insertHoistedRules(root, mergeEquivalentHoistedRules(hoistedRules), hoistAnchor)
if (options.removeEmptyAtRuleAncestors !== false) {
removeEmptyAtRules(root)
}
else {
root.walkAtRules((atRule) => {
if (atRule.nodes?.length === 0) {
atRule.remove()
}
})
}
}
export function hoistTailwindPreflightBase(css: string) {
try {
const root = postcss.parse(css)
const preflightRules = collectPreflightRules(root)
insertHoistedRules(root, preflightRules)
return root.toString()
}
catch {
return css
}
}
export function finalizeMiniProgramCss(css: string, options: FinalizeMiniProgramCssOptions = {}) {
let isTailwindcssV4 = options.isTailwindcssV4
if (isTailwindcssV4 === undefined) {
try {
isTailwindcssV4 = hasTailwindcssV4Signal(css)
}
catch {
isTailwindcssV4 = TAILWIND_V4_BANNER_RE.test(css)
}
}
const cleanedCss = removeUnsupportedMiniProgramAtRules(css)
try {
const root = postcss.parse(cleanedCss)
finalizeMiniProgramCssRoot(root, { ...options, isTailwindcssV4 })
return root.toString()
}
catch {
return removeSpecificityPlaceholdersFromSource(cleanedCss)
}
}