1
1
mirror of https://github.com/primer/css.git synced 2024-12-26 23:54:28 +03:00

Upgrade analyze-variables plugin

This commit is contained in:
Jon Rohan 2021-04-08 10:27:54 -07:00
parent 266ca1f13d
commit 63764f7edd
No known key found for this signature in database
GPG Key ID: B0BBE304A9A0AECB

View File

@ -63,54 +63,57 @@ function analyzeVariables(file) {
} }
function variablePlugin(variables) { function variablePlugin(variables) {
return postcss.plugin('analyze-variables', (options = {}) => { return (options = {}) => {
const {cwd = process.cwd()} = options const {cwd = process.cwd()} = options
return root => { return {
const decls = new Map() postcssPlugin: 'analyze-variables',
Once(root) {
const decls = new Map()
root.walkDecls(/^\$/, decl => { root.walkDecls(/^\$/, decl => {
const {prop, value} = decl const {prop, value} = decl
if (decl.parent === root && !value.startsWith('(')) { if (decl.parent === root && !value.startsWith('(')) {
decl.value = value.replace(/ *!default$/, '') decl.value = value.replace(/ *!default$/, '')
decls.set(prop, decl) decls.set(prop, decl)
} }
}) })
for (const [prop, decl] of decls.entries()) { for (const [prop, decl] of decls.entries()) {
const {nodes} = valueParser(decl.value) const {nodes} = valueParser(decl.value)
const values = [valueParser.stringify(nodes)] const values = [valueParser.stringify(nodes)]
while (nodes.some(node => decls.has(node.value))) { while (nodes.some(node => decls.has(node.value))) {
for (const node of nodes) { for (const node of nodes) {
const {value} = node const {value} = node
if (decls.has(value)) { if (decls.has(value)) {
node.value = decls.get(value).value node.value = decls.get(value).value
}
}
values.push(valueParser.stringify(nodes))
}
const {source} = decl
variables[prop] = {
values,
source: {
path: source.input.file.replace(`${cwd}/`, ''),
line: source.start.line
} }
} }
values.push(valueParser.stringify(nodes))
} }
const {source} = decl const container = postcss.rule({selector: ':root'})
variables[prop] = { for (const [prop, decl] of decls.entries()) {
values, container.append(
source: { postcss.decl({
path: source.input.file.replace(`${cwd}/`, ''), prop: `--${prop.substr(1)}`,
line: source.start.line value: `#{${decl.value}}`
} })
)
} }
root.append(container)
} }
const container = postcss.rule({selector: ':root'})
for (const [prop, decl] of decls.entries()) {
container.append(
postcss.decl({
prop: `--${prop.substr(1)}`,
value: `#{${decl.value}}`
})
)
}
root.append(container)
} }
}) }
} }
function sortObject(obj, cmp) { function sortObject(obj, cmp) {