Skip to content

Commit f44e311

Browse files
chore(release): 4.0.0
1 parent 911bfc6 commit f44e311

17 files changed

+3575
-1765
lines changed

.gitignore

-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,2 @@
11
node_modules
22
coverage
3-
lib

.travis.yml

+30-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,31 @@
1+
sudo: false
2+
3+
git:
4+
depth: 10
5+
6+
branches:
7+
only:
8+
- master
9+
110
language: node_js
2-
node_js:
3-
- "4"
4-
- "6"
5-
- "node"
11+
12+
# cache node modules
13+
cache:
14+
directories:
15+
- $HOME/.npm
16+
- node_modules
17+
18+
matrix:
19+
fast_finish: true
20+
include:
21+
- node_js: '10'
22+
script: npm run test -- --no-coverage
23+
- node_js: '8'
24+
script: npm run test -- --no-coverage
25+
- node_js: '6'
26+
script: npm run test -- --no-coverage
27+
28+
before_install:
29+
- npm install -g npm@latest
30+
- node --version
31+
- npm --version

README.md

+27-18
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[![Build Status](https://travis-ci.org/css-modules/icss-utils.svg)](https://travis-ci.org/css-modules/icss-utils)
22

3-
# ICSS Utils
3+
# ICSS Utils
44

55
## replaceSymbols
66

@@ -10,9 +10,10 @@ This is broken into its own module in case the behaviour needs to be replicated
1010
(i.e. [CSS Modules Values](https://github.com/css-modules/postcss-modules-values))
1111

1212
```js
13-
import { replaceSymbols, replaceValueSymbols } from "icss-utils"
14-
replaceSymbols(css, replacements)
15-
replaceValueSymbols(string, replacements)
13+
import { replaceSymbols, replaceValueSymbols } from "icss-utils";
14+
15+
replaceSymbols(css, replacements);
16+
replaceValueSymbols(string, replacements);
1617
```
1718

1819
Where:
@@ -30,24 +31,28 @@ A symbol is a string of alphanumeric, `-` or `_` characters. A replacement can b
3031
Extracts and remove (if removeRules is equal true) from PostCSS tree `:import` and `:export` statements.
3132

3233
```js
33-
import postcss from 'postcss';
34-
import { extractICSS } from 'icss-utils'
34+
import postcss from "postcss";
35+
import { extractICSS } from "icss-utils";
3536

3637
const css = postcss.parse(`
37-
:import(colors) {
38+
:import("colors.css" screen and (orientation:landscape)) {
3839
a: b;
3940
}
4041
:export {
4142
c: d;
4243
}
43-
`)
44+
`);
4445

45-
extractICSS(css)
46+
extractICSS(css);
4647
/*
4748
{
4849
icssImports: {
49-
colors: {
50-
a: 'b'
50+
'"colors.css" screen and (orientation:landscape)': {
51+
path: "colors.css",
52+
extra: "screen and (orientation:landscape)",
53+
tokens: {
54+
a: 'b'
55+
}
5156
}
5257
},
5358
icssExports: {
@@ -62,18 +67,22 @@ extractICSS(css)
6267
Converts icss imports and exports definitions to postcss ast
6368

6469
```js
65-
createICSSRules({
66-
colors: {
67-
a: 'b'
70+
createICSSRules(
71+
{
72+
'"colors.css"': {
73+
a: "b"
74+
}
75+
},
76+
{
77+
c: "d"
6878
}
69-
}, {
70-
c: 'd'
71-
})
79+
);
7280
```
7381

7482
## License
7583

7684
ISC
7785

7886
---
79-
Glen Maddern and Bogdan Chadkin, 2015.
87+
88+
Glen Maddern, Bogdan Chadkin and Evilebottnawi 2015-present.

lib/createICSSRules.js

+70
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
"use strict";
2+
3+
Object.defineProperty(exports, "__esModule", {
4+
value: true
5+
});
6+
exports.default = void 0;
7+
8+
var _postcss = _interopRequireDefault(require("postcss"));
9+
10+
function _interopRequireDefault(obj) {
11+
return obj && obj.__esModule ? obj : { default: obj };
12+
}
13+
14+
const createImports = imports => {
15+
return Object.keys(imports).map(token => {
16+
const aliases = imports[token];
17+
const declarations = Object.keys(aliases).map(key =>
18+
_postcss.default.decl({
19+
prop: key,
20+
value: aliases[key],
21+
raws: {
22+
before: "\n "
23+
}
24+
})
25+
);
26+
return _postcss.default
27+
.rule({
28+
selector: `:import(${token})`,
29+
raws: {
30+
after: "\n"
31+
}
32+
})
33+
.append(declarations);
34+
});
35+
};
36+
37+
const createExports = exports => {
38+
const declarations = Object.keys(exports).map(key =>
39+
_postcss.default.decl({
40+
prop: key,
41+
value: exports[key],
42+
raws: {
43+
before: "\n "
44+
}
45+
})
46+
);
47+
48+
if (declarations.length === 0) {
49+
return [];
50+
}
51+
52+
const rule = _postcss.default
53+
.rule({
54+
selector: `:export`,
55+
raws: {
56+
after: "\n"
57+
}
58+
})
59+
.append(declarations);
60+
61+
return [rule];
62+
};
63+
64+
const createICSSRules = (imports, exports) => [
65+
...createImports(imports),
66+
...createExports(exports)
67+
];
68+
69+
var _default = createICSSRules;
70+
exports.default = _default;

lib/extractICSS.js

+61
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
"use strict";
2+
3+
Object.defineProperty(exports, "__esModule", {
4+
value: true
5+
});
6+
exports.default = void 0;
7+
const importPattern = /^:import\(("[^"]*"|'[^']*')(?:\s(.+))?\)$/;
8+
9+
const getDeclsObject = rule => {
10+
const object = {};
11+
rule.walkDecls(decl => {
12+
object[decl.raws.before.trim() + decl.prop] = decl.value;
13+
});
14+
return object;
15+
};
16+
17+
const extractICSS = (css, removeRules = true) => {
18+
const icssImports = {};
19+
const icssExports = {};
20+
css.each(node => {
21+
if (node.type === "rule") {
22+
if (node.selector.slice(0, 7) === ":import") {
23+
const matches = importPattern.exec(node.selector);
24+
25+
if (matches) {
26+
const path = matches[1].replace(/'|"/g, "");
27+
const extra = matches[2] ? matches[2] : "";
28+
const dep = `"${path}"${extra ? ` ${extra}` : ""}`;
29+
icssImports[dep] = Object.assign(icssImports[dep] || {}, {
30+
path,
31+
extra,
32+
tokens: Object.assign(
33+
{},
34+
icssImports[dep] ? icssImports[dep].tokens : {},
35+
getDeclsObject(node)
36+
)
37+
});
38+
39+
if (removeRules) {
40+
node.remove();
41+
}
42+
}
43+
}
44+
45+
if (node.selector === ":export") {
46+
Object.assign(icssExports, getDeclsObject(node));
47+
48+
if (removeRules) {
49+
node.remove();
50+
}
51+
}
52+
}
53+
});
54+
return {
55+
icssImports,
56+
icssExports
57+
};
58+
};
59+
60+
var _default = extractICSS;
61+
exports.default = _default;

lib/index.js

+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
"use strict";
2+
3+
Object.defineProperty(exports, "__esModule", {
4+
value: true
5+
});
6+
Object.defineProperty(exports, "replaceValueSymbols", {
7+
enumerable: true,
8+
get: function get() {
9+
return _replaceValueSymbols.default;
10+
}
11+
});
12+
Object.defineProperty(exports, "replaceSymbols", {
13+
enumerable: true,
14+
get: function get() {
15+
return _replaceSymbols.default;
16+
}
17+
});
18+
Object.defineProperty(exports, "extractICSS", {
19+
enumerable: true,
20+
get: function get() {
21+
return _extractICSS.default;
22+
}
23+
});
24+
Object.defineProperty(exports, "createICSSRules", {
25+
enumerable: true,
26+
get: function get() {
27+
return _createICSSRules.default;
28+
}
29+
});
30+
31+
var _replaceValueSymbols = _interopRequireDefault(
32+
require("./replaceValueSymbols.js")
33+
);
34+
35+
var _replaceSymbols = _interopRequireDefault(require("./replaceSymbols.js"));
36+
37+
var _extractICSS = _interopRequireDefault(require("./extractICSS.js"));
38+
39+
var _createICSSRules = _interopRequireDefault(require("./createICSSRules.js"));
40+
41+
function _interopRequireDefault(obj) {
42+
return obj && obj.__esModule ? obj : { default: obj };
43+
}

lib/replaceSymbols.js

+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
"use strict";
2+
3+
Object.defineProperty(exports, "__esModule", {
4+
value: true
5+
});
6+
exports.default = void 0;
7+
8+
var _replaceValueSymbols = _interopRequireDefault(
9+
require("./replaceValueSymbols.js")
10+
);
11+
12+
function _interopRequireDefault(obj) {
13+
return obj && obj.__esModule ? obj : { default: obj };
14+
}
15+
16+
const replaceSymbols = (css, replacements) => {
17+
css.walk(node => {
18+
if (node.type === "decl") {
19+
node.value = (0, _replaceValueSymbols.default)(node.value, replacements);
20+
} else if (node.type === "rule") {
21+
node.selector = (0, _replaceValueSymbols.default)(
22+
node.selector,
23+
replacements
24+
);
25+
} else if (
26+
node.type === "atrule" &&
27+
["media", "supports"].includes(node.name.toLowerCase())
28+
) {
29+
node.params = (0, _replaceValueSymbols.default)(
30+
node.params,
31+
replacements
32+
);
33+
}
34+
});
35+
};
36+
37+
var _default = replaceSymbols;
38+
exports.default = _default;

lib/replaceValueSymbols.js

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
"use strict";
2+
3+
Object.defineProperty(exports, "__esModule", {
4+
value: true
5+
});
6+
exports.default = void 0;
7+
const matchValueName = /[$]?[\w-]+/g;
8+
9+
const replaceValueSymbols = (value, replacements) => {
10+
let matches;
11+
12+
while ((matches = matchValueName.exec(value))) {
13+
const replacement = replacements[matches[0]];
14+
15+
if (replacement) {
16+
value =
17+
value.slice(0, matches.index) +
18+
replacement +
19+
value.slice(matchValueName.lastIndex);
20+
matchValueName.lastIndex -= matches[0].length - replacement.length;
21+
}
22+
}
23+
24+
return value;
25+
};
26+
27+
var _default = replaceValueSymbols;
28+
exports.default = _default;

0 commit comments

Comments
 (0)