Skip to content

Commit b1c149b

Browse files
chore(release): v1.0.0
1 parent 819b9ce commit b1c149b

File tree

7 files changed

+3255
-1928
lines changed

7 files changed

+3255
-1928
lines changed

.gitignore

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,2 @@
11
node_modules
22
coverage
3-
lib

.travis.yml

Lines changed: 30 additions & 4 deletions
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

lib/index.js

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
"use strict";
2+
3+
var _postcss = _interopRequireDefault(require("postcss"));
4+
5+
var _postcssValueParser = _interopRequireDefault(
6+
require("postcss-value-parser")
7+
);
8+
9+
var _icssUtils = require("icss-utils");
10+
11+
function _interopRequireDefault(obj) {
12+
return obj && obj.__esModule ? obj : { default: obj };
13+
}
14+
15+
const plugin = "postcss-plugin-import";
16+
17+
const getArg = nodes =>
18+
nodes.length !== 0 && nodes[0].type === "string"
19+
? nodes[0].value
20+
: _postcssValueParser.default.stringify(nodes);
21+
22+
const getUrl = node => {
23+
if (node.type === "function" && node.value.toLowerCase() === "url") {
24+
return getArg(node.nodes);
25+
}
26+
27+
if (node.type === "string") {
28+
return node.value;
29+
}
30+
31+
return "";
32+
};
33+
34+
const parseImport = params => {
35+
const _valueParser = (0, _postcssValueParser.default)(params),
36+
nodes = _valueParser.nodes;
37+
38+
if (nodes.length === 0) {
39+
return null;
40+
}
41+
42+
const url = getUrl(nodes[0]);
43+
44+
if (url.trim().length === 0) {
45+
return null;
46+
}
47+
48+
return {
49+
url,
50+
media: _postcssValueParser.default.stringify(nodes.slice(1)).trim()
51+
};
52+
};
53+
54+
const defaultFilter = url => !/^\w+:\/\//.test(url) && !url.startsWith("//");
55+
56+
module.exports = _postcss.default.plugin(
57+
plugin,
58+
(options = {}) => (css, result) => {
59+
const imports = {};
60+
const filter = options.filter || defaultFilter;
61+
css.walkAtRules(/^import$/i, atrule => {
62+
// Convert only top-level @import
63+
if (atrule.parent.type !== "root") {
64+
return;
65+
}
66+
67+
if (atrule.nodes) {
68+
return result.warn(
69+
"It looks like you didn't end your @import statement correctly. " +
70+
"Child nodes are attached to it.",
71+
{
72+
node: atrule
73+
}
74+
);
75+
}
76+
77+
const parsed = parseImport(atrule.params);
78+
79+
if (parsed === null) {
80+
return result.warn(`Unable to find uri in '${atrule.toString()}'`, {
81+
node: atrule
82+
});
83+
}
84+
85+
if (filter && !filter(parsed.url)) {
86+
return;
87+
}
88+
89+
atrule.remove();
90+
imports[
91+
`"${parsed.url}"${
92+
parsed.media.length > 0 ? ` ${parsed.media.toLowerCase()}` : ""
93+
}`
94+
] = {};
95+
});
96+
97+
if (Object.keys(imports).length === 0) {
98+
return;
99+
}
100+
101+
css.prepend((0, _icssUtils.createICSSRules)(imports, {}));
102+
}
103+
);

package.json

Lines changed: 27 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "postcss-icss-import",
3-
"version": "0.1.0",
3+
"version": "1.0.0",
44
"description": "PostCSS plugin for css-modules to convert @import statements to ICSS",
55
"main": "lib/index.js",
66
"files": [
@@ -20,41 +20,54 @@
2020
]
2121
},
2222
"eslintConfig": {
23+
"parser": "babel-eslint",
2324
"parserOptions": {
24-
"ecmaVersion": 6,
2525
"sourceType": "module"
2626
},
27+
"env": {
28+
"es6": true,
29+
"node": true,
30+
"jest": true
31+
},
2732
"extends": "eslint:recommended"
2833
},
2934
"babel": {
3035
"presets": [
3136
[
32-
"env",
37+
"@babel/preset-env",
3338
{
3439
"targets": {
35-
"node": 4
40+
"node": 6
3641
}
3742
}
3843
]
3944
]
4045
},
46+
"husky": {
47+
"hooks": {
48+
"pre-commit": "lint-staged"
49+
}
50+
},
4151
"repository": "css-modules/postcss-icss-import",
4252
"author": "Bogdan Chadkin <[email protected]>",
4353
"license": "MIT",
4454
"devDependencies": {
45-
"babel-cli": "^6.24.1",
46-
"babel-jest": "^20.0.3",
47-
"babel-preset-env": "^1.5.1",
48-
"eslint": "^3.19.0",
49-
"husky": "^0.13.4",
50-
"jest": "^20.0.4",
51-
"lint-staged": "^3.5.1",
52-
"prettier": "^1.3.1",
55+
"@babel/cli": "^7.1.0",
56+
"@babel/core": "^7.1.0",
57+
"@babel/preset-env": "^7.1.0",
58+
"babel-core": "7.0.0-bridge.0",
59+
"babel-eslint": "^10.0.0",
60+
"babel-jest": "^23.6.0",
61+
"eslint": "^5.6.0",
62+
"husky": "^1.0.0",
63+
"jest": "^23.6.0",
64+
"lint-staged": "^7.3.0",
65+
"prettier": "^1.4.4",
5366
"strip-indent": "^2.0.0"
5467
},
5568
"dependencies": {
56-
"icss-utils": "^2.1.0",
57-
"postcss": "^6.0.1",
69+
"icss-utils": "css-modules/icss-utils#chore-release-4",
70+
"postcss": "^7.0.2",
5871
"postcss-value-parser": "^3.3.0"
5972
}
6073
}

src/index.js

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
/* eslint-env node */
21
import postcss from "postcss";
32
import valueParser from "postcss-value-parser";
43
import { createICSSRules } from "icss-utils";
@@ -11,7 +10,7 @@ const getArg = nodes =>
1110
: valueParser.stringify(nodes);
1211

1312
const getUrl = node => {
14-
if (node.type === "function" && node.value === "url") {
13+
if (node.type === "function" && node.value.toLowerCase() === "url") {
1514
return getArg(node.nodes);
1615
}
1716
if (node.type === "string") {
@@ -35,19 +34,16 @@ const parseImport = params => {
3534
};
3635
};
3736

38-
const isExternalUrl = url => /^\w+:\/\//.test(url) || url.startsWith("//");
37+
const defaultFilter = url => !/^\w+:\/\//.test(url) && !url.startsWith("//");
3938

40-
const walkImports = (css, callback) => {
41-
css.each(node => {
42-
if (node.type === "atrule" && node.name.toLowerCase() === "import") {
43-
callback(node);
44-
}
45-
});
46-
};
47-
48-
module.exports = postcss.plugin(plugin, () => (css, result) => {
39+
module.exports = postcss.plugin(plugin, (options = {}) => (css, result) => {
4940
const imports = {};
50-
walkImports(css, atrule => {
41+
const filter = options.filter || defaultFilter;
42+
css.walkAtRules(/^import$/i, atrule => {
43+
// Convert only top-level @import
44+
if (atrule.parent.type !== "root") {
45+
return;
46+
}
5147
if (atrule.nodes) {
5248
return result.warn(
5349
"It looks like you didn't end your @import statement correctly. " +
@@ -61,13 +57,20 @@ module.exports = postcss.plugin(plugin, () => (css, result) => {
6157
node: atrule
6258
});
6359
}
64-
if (!isExternalUrl(parsed.url)) {
65-
atrule.remove();
66-
imports[`'${parsed.url}'`] = {
67-
import: "default" +
68-
(parsed.media.length === 0 ? "" : ` ${parsed.media}`)
69-
};
60+
if (filter && !filter(parsed.url)) {
61+
return;
7062
}
63+
atrule.remove();
64+
imports[
65+
`"${parsed.url}"${
66+
parsed.media.length > 0 ? ` ${parsed.media.toLowerCase()}` : ""
67+
}`
68+
] = {};
7169
});
70+
71+
if (Object.keys(imports).length === 0) {
72+
return;
73+
}
74+
7275
css.prepend(createICSSRules(imports, {}));
7376
});

0 commit comments

Comments
 (0)