Skip to content

Commit 0807524

Browse files
authored
enhancement/plugin-guidelines (#33)
* improvement: add support for a custom adaptive prop selectors * tests: align formatting * tests: reduce mock object for adaptive prop case, spelling * improvement: destruct parse from Once instead of postcss import * improvement: fast media at-rule listener
1 parent d573236 commit 0807524

File tree

1 file changed

+34
-31
lines changed

1 file changed

+34
-31
lines changed

index.js

+34-31
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,11 @@
1111
* limitations under the License.
1212
*/
1313

14-
const postcss = require('postcss')
15-
const fs = require('fs');
16-
const glob = require('tiny-glob/sync');
14+
const fs = require('fs');
1715
const crypto = require('crypto');
1816

17+
const glob = require('tiny-glob/sync');
18+
1919
const processed = Symbol('processed')
2020

2121
const getAdaptivePropSelector = (userProps) => {
@@ -28,6 +28,7 @@ const getAdaptivePropSelector = (userProps) => {
2828
}
2929
}
3030

31+
/** @type { import('postcss').PluginCreator<any> }*/
3132
module.exports = (UserProps) => {
3233
const FilePropsCache = new Map();
3334

@@ -40,7 +41,7 @@ module.exports = (UserProps) => {
4041
mapped: null, // track prepended props
4142
mapped_dark: null, // track dark mode prepended props
4243

43-
target_layer: null, // layer for props
44+
target_layer: null, // layer for props
4445
target_rule: null, // :root for props
4546
target_rule_dark: null, // :root for dark props
4647
target_ss: null, // stylesheet for keyframes/MQs
@@ -50,7 +51,7 @@ module.exports = (UserProps) => {
5051
const adaptivePropSelector = getAdaptivePropSelector(UserProps)
5152

5253
return {
53-
async Once(node, { result, Rule, AtRule }) {
54+
Once(node, { parse, result, Rule, AtRule }) {
5455
let target_selector = ':root'
5556

5657
if (!Object.keys(UserPropsCopy).length) {
@@ -63,7 +64,7 @@ module.exports = (UserProps) => {
6364
.map((file) => glob(file))
6465
.reduce((flattenedFileList, files) => flattenedFileList.concat(files), [])
6566

66-
await Promise.all(files.map(async file => {
67+
files.map(file => {
6768
result.messages.push({
6869
type: 'dependency',
6970
plugin: 'postcss-jit-props',
@@ -86,11 +87,11 @@ module.exports = (UserProps) => {
8687

8788
return
8889
}
89-
90+
9091
const fileProps = new Map()
9192
FilePropsCache.set(fileCacheKey, fileProps)
92-
93-
let dependencyResult = postcss.parse(data, { from: file })
93+
94+
let dependencyResult = parse(data, { from: file })
9495

9596
dependencyResult.walkDecls(decl => {
9697
if (!decl.variable) return
@@ -111,7 +112,7 @@ module.exports = (UserProps) => {
111112
fileProps.set(keyframeName, keyframes)
112113
}
113114
})
114-
}))
115+
})
115116
}
116117

117118
if (UserPropsCopy?.custom_selector) {
@@ -134,34 +135,36 @@ module.exports = (UserProps) => {
134135
STATE.target_ss = node.root()
135136
},
136137

137-
AtRule(atrule) {
138-
// bail early if possible
139-
if (atrule.name !== 'media' || atrule[processed]) return
138+
AtRule: {
139+
media: atrule => {
140+
// bail early if possible
141+
if (atrule[processed]) return
140142

141-
// extract prop from atrule params
142-
let prop = atrule.params.replace(/[( )]+/g, '');
143+
// extract prop from atrule params
144+
let prop = atrule.params.replace(/[( )]+/g, '');
143145

144-
// bail if media prop already prepended
145-
if (STATE.mapped.has(prop)) return
146+
// bail if media prop already prepended
147+
if (STATE.mapped.has(prop)) return
146148

147-
// create :root {} context just in time
148-
if (STATE.mapped.size === 0)
149-
STATE.target_ss.prepend(STATE.target_rule)
149+
// create :root {} context just in time
150+
if (STATE.mapped.size === 0)
151+
STATE.target_ss.prepend(STATE.target_rule)
150152

151-
// lookup prop value from pool
152-
let value = UserPropsCopy[prop] || null
153+
// lookup prop value from pool
154+
let value = UserPropsCopy[prop] || null
153155

154-
// warn if media prop not resolved
155-
if (!value) {
156-
return
157-
}
156+
// warn if media prop not resolved
157+
if (!value) {
158+
return
159+
}
158160

159-
// prepend the custom media
160-
STATE.target_ss.prepend(value)
161+
// prepend the custom media
162+
STATE.target_ss.prepend(value)
161163

162-
// track work to prevent duplication
163-
atrule[processed] = true
164-
STATE.mapped.add(prop)
164+
// track work to prevent duplication
165+
atrule[processed] = true
166+
STATE.mapped.add(prop)
167+
}
165168
},
166169

167170
Declaration(node, { Declaration }) {

0 commit comments

Comments
 (0)