Skip to content

Commit daa2719

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

17 files changed

+3630
-1776
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

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

lib/extractICSS.js

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

lib/index.js

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
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(require("./replaceValueSymbols.js"));
32+
33+
var _replaceSymbols = _interopRequireDefault(require("./replaceSymbols.js"));
34+
35+
var _extractICSS = _interopRequireDefault(require("./extractICSS.js"));
36+
37+
var _createICSSRules = _interopRequireDefault(require("./createICSSRules.js"));
38+
39+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

lib/replaceSymbols.js

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

lib/replaceValueSymbols.js

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
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 = value.slice(0, matches.index) + replacement + value.slice(matchValueName.lastIndex);
17+
matchValueName.lastIndex -= matches[0].length - replacement.length;
18+
}
19+
}
20+
21+
return value;
22+
};
23+
24+
var _default = replaceValueSymbols;
25+
exports.default = _default;

0 commit comments

Comments
 (0)