Skip to content

Commit 76967dc

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

File tree

7 files changed

+3256
-1928
lines changed

7 files changed

+3256
-1928
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

lib/index.js

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

package.json

+27-14
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

+22-19
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)