Skip to content

Commit 0631851

Browse files
RobinMalfaitadamwathan
authored andcommitted
introduce a useMemo utility
Naming is hard so I took this name from the React hook 😎 Also use this useMemoy utility to make sure that the extractUtilityNames is cached. There is no need to re-compute the utility names all the time.
1 parent 00f4427 commit 0631851

File tree

2 files changed

+28
-14
lines changed

2 files changed

+28
-14
lines changed

src/flagged/applyComplexClasses.js

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import substituteResponsiveAtRules from '../lib/substituteResponsiveAtRules'
88
import convertLayerAtRulesToControlComments from '../lib/convertLayerAtRulesToControlComments'
99
import substituteScreenAtRules from '../lib/substituteScreenAtRules'
1010
import prefixSelector from '../util/prefixSelector'
11+
import { useMemo } from '../util/useMemo'
1112

1213
function hasAtRule(css, atRule) {
1314
let foundAtRule = false
@@ -39,7 +40,7 @@ const tailwindApplyPlaceholder = selectorParser.attribute({
3940
})
4041

4142
function generateRulesFromApply({ rule, utilityName: className, classPosition }, replaceWith) {
42-
const processor = selectorParser(selectors => {
43+
const parser = selectorParser(selectors => {
4344
let i = 0
4445
selectors.walkClasses(c => {
4546
if (classPosition === i++ && c.value === className) {
@@ -52,7 +53,7 @@ function generateRulesFromApply({ rule, utilityName: className, classPosition },
5253
// You could argue we should make this replacement at the AST level, but if we believe
5354
// the placeholder string is safe from collisions then it is safe to do this is a simple
5455
// string replacement, and much, much faster.
55-
return processor.processSync(selector).replace('[__TAILWIND-APPLY-PLACEHOLDER__]', replaceWith)
56+
return parser.processSync(selector).replace('[__TAILWIND-APPLY-PLACEHOLDER__]', replaceWith)
5657
})
5758

5859
const cloned = rule.clone()
@@ -72,19 +73,16 @@ function generateRulesFromApply({ rule, utilityName: className, classPosition },
7273
return current
7374
}
7475

75-
function extractUtilityNames(selector) {
76-
const processor = selectorParser(selectors => {
77-
let classes = []
78-
79-
selectors.walkClasses(c => {
80-
classes.push(c)
81-
})
82-
83-
return classes.map(c => c.value)
84-
})
76+
const extractUtilityNamesParser = selectorParser(selectors => {
77+
let classes = []
78+
selectors.walkClasses(c => classes.push(c.value))
79+
return classes
80+
})
8581

86-
return processor.transformSync(selector)
87-
}
82+
const extractUtilityNames = useMemo(
83+
selector => extractUtilityNamesParser.transformSync(selector),
84+
selector => selector
85+
)
8886

8987
function buildUtilityMap(css) {
9088
let index = 0

src/util/useMemo.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
export function useMemo(cb, keyResolver) {
2+
const cache = new Map()
3+
4+
return (...args) => {
5+
const key = keyResolver(...args)
6+
7+
if (cache.has(key)) {
8+
return cache.get(key)
9+
}
10+
11+
const result = cb(...args)
12+
cache.set(key, result)
13+
14+
return result
15+
}
16+
}

0 commit comments

Comments
 (0)