Skip to content
This repository was archived by the owner on Feb 18, 2022. It is now read-only.

Commit d0bab53

Browse files
Postcss 8 (#35)
* update to postcss 8 This is just a straightforward version bump, using the `Root:` style postcss 8 plugin. I tried to switch to using `Declaration:`, but we get in an infinite replacement loop. I could remedy it with some extra checks in the `transition` transform, but I'm not confident that that were all the possible infinite loop cases, so I went back to this single-pass style. * up rollup * ci: bump matrix * update engines * remove Root func and use Declaration Co-authored-by: Renée Kooi <[email protected]>
1 parent c77dd9e commit d0bab53

20 files changed

+566
-247
lines changed

.rollup.js

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
1-
import babel from 'rollup-plugin-babel';
1+
import babel from '@rollup/plugin-babel';
22

33
export default {
44
input: 'src/index.js',
55
output: [
6-
{ file: 'index.cjs.js', format: 'cjs', sourcemap: true, strict: false },
7-
{ file: 'index.esm.mjs', format: 'esm', sourcemap: true, strict: false }
6+
{ file: 'index.cjs.js', format: 'cjs', sourcemap: true, exports: 'default' },
7+
{ file: 'index.esm.mjs', format: 'esm', sourcemap: true, exports: 'default' }
88
],
99
plugins: [
1010
babel({
11+
babelHelpers: 'bundled',
1112
presets: [
12-
['@babel/env', { modules: false, targets: { node: 8 } }]
13+
['@babel/env', { modules: false, targets: { node: 10 } }]
1314
]
1415
})
1516
]

.tape.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,12 @@ module.exports = {
6565
'size': {
6666
message: 'supports logical "size" properties'
6767
},
68+
'size:preserve': {
69+
message: 'supports logical "size" properties with { preserve: true }',
70+
options: {
71+
preserve: true
72+
}
73+
},
6874
'text-align': {
6975
message: 'supports logical "text-align" properties'
7076
},
@@ -82,5 +88,12 @@ module.exports = {
8288
options: {
8389
dir: 'ltr'
8490
}
91+
},
92+
'transition:preserve:ltr': {
93+
message: 'supports logical "transition" properties with { dir: "ltr", preserve: true }',
94+
options: {
95+
dir: 'ltr',
96+
preserve: true
97+
}
8598
}
8699
};

.travis.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
language: node_js
44

55
node_js:
6-
- 8
6+
- 10
7+
- 12
8+
- 14
79

810
install:
911
- npm install --ignore-scripts

package.json

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,27 +19,26 @@
1919
"build": "rollup --config .rollup.js --silent",
2020
"prepublishOnly": "npm test",
2121
"pretest:tape": "npm run build",
22-
"test": "npm run test:ec && npm run test:js && npm run test:tape",
23-
"test:ec": "echint --ignore index.*.js test",
22+
"test": "npm run test:js && npm run test:tape",
2423
"test:js": "eslint src/{*,**/*}.js --cache --ignore-path .gitignore --quiet",
2524
"test:tape": "postcss-tape"
2625
},
2726
"engines": {
28-
"node": ">=8.0.0"
27+
"node": ">=10.0.0"
2928
},
30-
"dependencies": {
31-
"postcss": "^7.0.17"
29+
"peerDependencies": {
30+
"postcss": "^8.0.0"
3231
},
3332
"devDependencies": {
34-
"@babel/core": "^7.4.5",
35-
"@babel/preset-env": "^7.4.5",
33+
"@babel/core": "^7.13.8",
34+
"@babel/preset-env": "^7.13.9",
35+
"@rollup/plugin-babel": "^5.3.0",
3636
"babel-eslint": "^10.0.1",
37-
"echint": "^4.0.2",
38-
"eslint": "^5.16.0",
39-
"postcss-tape": "^5.0.0",
37+
"eslint": "^7.21.0",
38+
"postcss": "^8.2.7",
39+
"postcss-tape": "^6.0.0",
4040
"pre-commit": "^1.2.2",
41-
"rollup": "^1.14.6",
42-
"rollup-plugin-babel": "^4.3.2"
41+
"rollup": "^2.40.0"
4342
},
4443
"eslintConfig": {
4544
"env": {

src/index.js

Lines changed: 20 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,3 @@
1-
// tooling
2-
import postcss from 'postcss';
3-
4-
// internal tooling
51
import transformBorder from './lib/transform-border';
62
import transformBorderRadius from './lib/transform-border-radius';
73
import transformDirectionalShorthands from './lib/transform-directional-shorthands';
@@ -59,45 +55,32 @@ const transformsRegExp = new RegExp(`^(${Object.keys(transforms).join('|')})$`,
5955
const unsplitPropRegExp = /^(border-block|border-block-end|border-block-start|border-inline|border-inline-end|border-inline-start)$/i;
6056

6157
// plugin
62-
export default postcss.plugin('postcss-logical-properties', opts => {
58+
function postcssLogicalProperties(opts) {
6359
opts = Object(opts);
6460

6561
const preserve = Boolean(opts.preserve);
6662
const dir = !preserve && typeof opts.dir === 'string'
6763
? /^rtl$/i.test(opts.dir)
6864
? 'rtl'
69-
: 'ltr'
70-
: false;
71-
72-
return root => {
73-
root.walkDecls(transformsRegExp, decl => {
74-
const parent = decl.parent;
75-
const values = unsplitPropRegExp.test(decl.prop) ? [decl.value] : splitBySpace(decl.value, true);
76-
const prop = decl.prop.toLowerCase();
77-
78-
const replacer = transforms[prop](decl, values, dir);
79-
80-
if (!replacer) {
81-
return;
82-
}
83-
84-
[].concat(replacer).forEach(replacement => {
85-
if (replacement.type === 'rule') {
86-
parent.before(replacement);
87-
} else {
88-
decl.before(replacement);
65+
: 'ltr'
66+
: false;
67+
68+
return {
69+
postcssPlugin: 'postcss-logical-properties',
70+
Declaration: (decl) => {
71+
if (transformsRegExp.test(decl.prop)) {
72+
const parent = decl.parent;
73+
const values = unsplitPropRegExp.test(decl.prop) ? [decl.value] : splitBySpace(decl.value, true);
74+
const prop = decl.prop.toLowerCase();
75+
76+
transforms[prop](decl, values, dir, preserve);
77+
if (!parent.nodes.length) {
78+
parent.remove();
8979
}
90-
});
91-
92-
if (preserve) {
93-
return;
9480
}
95-
96-
decl.remove();
97-
98-
if (!parent.nodes.length) {
99-
parent.remove();
100-
}
101-
});
81+
}
10282
};
103-
});
83+
}
84+
postcssLogicalProperties.postcss = true;
85+
86+
export default postcssLogicalProperties;

src/lib/clone-decl.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import matchSide from './match-side';
22
import matchInsetPrefix from './match-inset-prefix';
33

4-
export default (decl, suffix, value) => decl.clone({
4+
export default (decl, suffix, value) => decl.cloneBefore({
55
prop: `${decl.prop.replace(matchSide, '$1')}${suffix}`.replace(matchInsetPrefix, ''),
66
value
77
});

src/lib/clone-rule.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import postcss from 'postcss';
22

33
export default (decl, dir) => {
4-
const rule = Object(decl.parent).type === 'rule' ? decl.parent.clone({
4+
const rule = Object(decl.parent).type === 'rule' ? decl.parent.cloneBefore({
55
raws: {}
66
}).removeAll() : postcss.rule({ selector: '&' });
77

8-
rule.selectors = rule.selectors.map(selector => `${selector}:dir(${dir})`);
8+
rule.assign({'selectors': rule.selectors.map(selector => `${selector}:dir(${dir})`)})
99

1010
return rule;
1111
};

src/lib/transform-border-radius.js

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,36 @@ const logicalRadii = /^(border-)(end-end|end-start|start-end|start-start)(-radiu
44
const ltrRadii = { 'end-end': 'bottom-right', 'end-start': 'bottom-left', 'start-end': 'top-right', 'start-start': 'top-left' };
55
const rtlRadii = { 'end-end': 'bottom-left', 'end-start': 'bottom-right', 'start-end': 'top-left', 'start-start': 'top-right' };
66

7-
export default (decl, values, dir) => {
8-
const ltrDecl = decl.clone({
9-
prop: decl.prop.replace(logicalRadii, ($, prefix, direction, suffix) => `${prefix}${ltrRadii[direction]}${suffix}`)
10-
});
11-
7+
export default (decl, values, dir, preserve) => {
128
if (dir === 'ltr') {
13-
return ltrDecl;
9+
lDecl(decl);
10+
clean(decl, preserve);
11+
return;
1412
}
1513

16-
const rtlDecl = decl.clone({
17-
prop: decl.prop.replace(logicalRadii, ($, prefix, direction, suffix) => `${prefix}${rtlRadii[direction]}${suffix}`)
18-
});
19-
2014
if (dir === 'rtl') {
21-
return rtlDecl;
15+
rDecl(decl);
16+
clean(decl, preserve);
17+
return;
2218
}
2319

24-
return [
25-
cloneRule(decl, 'ltr').append(ltrDecl),
26-
cloneRule(decl, 'rtl').append(rtlDecl)
27-
];
20+
cloneRule(decl, 'ltr').append(lDecl(decl));
21+
cloneRule(decl, 'rtl').append(rDecl(decl));
22+
clean(decl, preserve);
2823
};
24+
25+
function lDecl(decl) {
26+
return decl.cloneBefore({
27+
prop: decl.prop.replace(logicalRadii, ($, prefix, direction, suffix) => `${prefix}${ltrRadii[direction]}${suffix}`)
28+
});
29+
}
30+
31+
function rDecl(decl) {
32+
return decl.cloneBefore({
33+
prop: decl.prop.replace(logicalRadii, ($, prefix, direction, suffix) => `${prefix}${rtlRadii[direction]}${suffix}`)
34+
});
35+
}
36+
37+
function clean(decl, preserve) {
38+
if (!preserve) decl.remove();
39+
}

0 commit comments

Comments
 (0)