Skip to content

Commit

Permalink
Write postcss-functions ourselves
Browse files Browse the repository at this point in the history
  • Loading branch information
adamwathan committed May 11, 2021
1 parent d43aa7a commit d435f02
Show file tree
Hide file tree
Showing 2 changed files with 67 additions and 20 deletions.
1 change: 0 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,6 @@
"normalize-path": "^3.0.0",
"object-hash": "^2.1.1",
"parse-glob": "^3.0.4",
"postcss-functions": "^3",
"postcss-js": "^3.0.3",
"postcss-nested": "5.0.5",
"postcss-selector-parser": "^6.0.5",
Expand Down
86 changes: 67 additions & 19 deletions src/lib/evaluateTailwindFunctions.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import _ from 'lodash'
import functions from 'postcss-functions'
import didYouMean from 'didyoumean'
import transformThemeValue from '../util/transformThemeValue'
import buildMediaQuery from '../util/buildMediaQuery'
import parseValue from 'postcss-value-parser'

function findClosestExistingPath(theme, path) {
const parts = _.toPath(path)
Expand Down Expand Up @@ -109,23 +110,70 @@ function validatePath(config, path, defaultValue) {
}
}

function extractArgs(node, vNodes, functions) {
vNodes = vNodes.map((vNode) => resolveVNode(node, vNode, functions))

let args = ['']

for (let vNode of vNodes) {
if (vNode.type === 'div' && vNode.value === ',') {
args.push('')
} else {
args[args.length - 1] += parseValue.stringify(vNode)
}
}

return args
}

function resolveVNode(node, vNode, functions) {
if (vNode.type === 'function' && functions[vNode.value] !== undefined) {
let args = extractArgs(node, vNode.nodes, functions)
vNode.type = 'word'
vNode.value = functions[vNode.value](node, ...args)
}

return vNode
}

function resolveFunctions(node, input, functions) {
return parseValue(input)
.walk((vNode) => {
resolveVNode(node, vNode, functions)
})
.toString()
}

let nodeTypePropertyMap = {
atrule: 'params',
decl: 'value',
}

export default function (config) {
return (root) =>
functions({
functions: {
theme: (path, ...defaultValue) => {
const { isValid, value, error } = validatePath(
config,
path,
defaultValue.length ? defaultValue : undefined
)

if (!isValid) {
throw root.error(error)
}

return value
},
},
})(root)
let functions = {
theme: (node, path, ...defaultValue) => {
const { isValid, value, error } = validatePath(
config,
path,
defaultValue.length ? defaultValue : undefined
)

if (!isValid) {
throw node.error(error)
}

return value
},
}
return (root) => {
root.walk((node) => {
let property = nodeTypePropertyMap[node.type]

if (property === undefined) {
return
}

node[property] = resolveFunctions(node, node[property], functions)
})
}
}

0 comments on commit d435f02

Please sign in to comment.