ember-scoped-css 0.0.1 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/getClassesTagsFromCss.js +3 -2
- package/src/isInsideGlobal.js +6 -0
- package/src/rewriteCss.js +18 -3
- package/test/getClassesTagsFromCss.js +15 -0
- package/test/rewriteCss.js +45 -0
package/package.json
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
const postcss = require('postcss');
|
|
2
2
|
const parser = require('postcss-selector-parser');
|
|
3
|
+
const isInsideGlobal = require('./isInsideGlobal');
|
|
3
4
|
|
|
4
5
|
function getClassesAndTags(sel, classes, tags) {
|
|
5
6
|
const transform = (sls) => {
|
|
6
7
|
sls.walk((selector) => {
|
|
7
|
-
if (selector.type === 'class') {
|
|
8
|
+
if (selector.type === 'class' && !isInsideGlobal(selector)) {
|
|
8
9
|
classes.add(selector.value);
|
|
9
|
-
} else if (selector.type === 'tag') {
|
|
10
|
+
} else if (selector.type === 'tag' && !isInsideGlobal(selector)) {
|
|
10
11
|
tags.add(selector.value);
|
|
11
12
|
}
|
|
12
13
|
});
|
package/src/rewriteCss.js
CHANGED
|
@@ -1,27 +1,42 @@
|
|
|
1
1
|
const parser = require('postcss-selector-parser');
|
|
2
2
|
const postcss = require('postcss');
|
|
3
|
+
const isInsideGlobal = require('./isInsideGlobal');
|
|
3
4
|
|
|
4
5
|
function rewriteSelector(sel, postfix) {
|
|
5
6
|
const transform = (selectors) => {
|
|
6
7
|
selectors.walk((selector) => {
|
|
7
|
-
if (selector.type === 'class') {
|
|
8
|
+
if (selector.type === 'class' && !isInsideGlobal(selector)) {
|
|
8
9
|
selector.value += '_' + postfix;
|
|
9
|
-
} else if (selector.type === 'tag') {
|
|
10
|
+
} else if (selector.type === 'tag' && !isInsideGlobal(selector)) {
|
|
10
11
|
selector.replaceWith(
|
|
11
12
|
parser.tag({ value: selector.value }),
|
|
12
13
|
parser.className({ value: postfix })
|
|
13
14
|
);
|
|
14
15
|
}
|
|
15
16
|
});
|
|
17
|
+
|
|
18
|
+
// remove :global
|
|
19
|
+
selectors.walk((selector) => {
|
|
20
|
+
if (selector.type === 'pseudo' && selector.value === ':global') {
|
|
21
|
+
selector.replaceWith(...selector.nodes);
|
|
22
|
+
}
|
|
23
|
+
});
|
|
16
24
|
};
|
|
17
25
|
const transformed = parser(transform).processSync(sel);
|
|
18
26
|
return transformed;
|
|
19
27
|
}
|
|
20
28
|
|
|
29
|
+
function isInsideKeyframes(node) {
|
|
30
|
+
const parent = node.parent;
|
|
31
|
+
if (!parent) return false;
|
|
32
|
+
if (parent.type === 'atrule' && parent.name === 'keyframes') return true;
|
|
33
|
+
return isInsideKeyframes(parent);
|
|
34
|
+
}
|
|
35
|
+
|
|
21
36
|
module.exports = function rewriteCss(css, postfix, fileName) {
|
|
22
37
|
const ast = postcss.parse(css);
|
|
23
38
|
ast.walk((node) => {
|
|
24
|
-
if (node.type === 'rule') {
|
|
39
|
+
if (node.type === 'rule' && !isInsideKeyframes(node)) {
|
|
25
40
|
node.selector = rewriteSelector(node.selector, postfix);
|
|
26
41
|
}
|
|
27
42
|
});
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
const expect = require('chai').expect;
|
|
2
|
+
const getClassesTagsFromCss = require('../src/getClassesTagsFromCss');
|
|
3
|
+
|
|
4
|
+
describe('rewriteCss', function () {
|
|
5
|
+
it('should return classes and tags that are not in :global', function () {
|
|
6
|
+
const css = '.baz :global(.foo) .bar div :global(p) { color: red; }';
|
|
7
|
+
const { classes, tags } = getClassesTagsFromCss(css);
|
|
8
|
+
|
|
9
|
+
// classes should be baz and bar
|
|
10
|
+
expect(classes.size).to.equal(2);
|
|
11
|
+
expect([...classes]).to.have.members(['baz', 'bar']);
|
|
12
|
+
expect(tags.size).to.equal(1);
|
|
13
|
+
expect([...tags]).to.have.members(['div']);
|
|
14
|
+
});
|
|
15
|
+
});
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
const expect = require('chai').expect;
|
|
2
|
+
const { stub } = require('sinon');
|
|
3
|
+
const rewriteCss = require('../src/rewriteCss');
|
|
4
|
+
|
|
5
|
+
describe('rewriteCss', function () {
|
|
6
|
+
it('should rewrite css', function () {
|
|
7
|
+
const css = '.foo { color: red; }';
|
|
8
|
+
const postfix = 'postfix';
|
|
9
|
+
const fileName = 'foo.css';
|
|
10
|
+
const rewritten = rewriteCss(css, postfix, fileName);
|
|
11
|
+
|
|
12
|
+
expect(rewritten).to.equal(
|
|
13
|
+
`/* foo.css */\n@layer components {\n\n.foo_postfix { color: red; }\n}\n`
|
|
14
|
+
);
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it('shouldnt rewrite global', function () {
|
|
18
|
+
const css = '.baz :global(.foo p) .bar { color: red; }';
|
|
19
|
+
const postfix = 'postfix';
|
|
20
|
+
const fileName = 'foo.css';
|
|
21
|
+
const rewritten = rewriteCss(css, postfix, fileName);
|
|
22
|
+
|
|
23
|
+
expect(rewritten).to.equal(
|
|
24
|
+
`/* foo.css */\n@layer components {\n\n.baz_postfix .foo p .bar_postfix { color: red; }\n}\n`
|
|
25
|
+
);
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it.only('sudnt rewrite keyframes', function () {
|
|
29
|
+
const css = `
|
|
30
|
+
@keyframes luna-view-navigation {
|
|
31
|
+
100% {
|
|
32
|
+
padding-top: 1rem;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
`;
|
|
36
|
+
|
|
37
|
+
const postfix = 'postfix';
|
|
38
|
+
const fileName = 'foo.css';
|
|
39
|
+
const rewritten = rewriteCss(css, postfix, fileName);
|
|
40
|
+
|
|
41
|
+
expect(rewritten).to.equal(
|
|
42
|
+
`/* foo.css */\n@layer components {\n\n${css}\n}\n`
|
|
43
|
+
);
|
|
44
|
+
});
|
|
45
|
+
});
|