From af2747d322676b503cb68af7390c6cf12aabc17d Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Tue, 27 Feb 2018 07:59:25 -0500 Subject: [PATCH 01/82] Update prettier to version 1.11.0 (#346) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 68e446c0..39d0bf50 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "eslint-plugin-prettier": "^2.2.0", "npmpub": "^3.0.1", "postcss-scss": "^1.0.0", - "prettier": "1.10.2", + "prettier": "1.11.0", "sugarss": "^1.0.0" }, "scripts": { From 64ffaa2ba35fcac217891c86ede56f687c1412a8 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Thu, 12 Apr 2018 08:09:53 -0400 Subject: [PATCH 02/82] Update prettier to version 1.12.0 (#352) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 39d0bf50..ca2d805d 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "eslint-plugin-prettier": "^2.2.0", "npmpub": "^3.0.1", "postcss-scss": "^1.0.0", - "prettier": "1.11.0", + "prettier": "1.12.0", "sugarss": "^1.0.0" }, "scripts": { From f72bdc20cdc6495b07a15c4929873abe04c72950 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Tue, 17 Apr 2018 07:08:45 -0400 Subject: [PATCH 03/82] Update prettier to version 1.12.1 (#353) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ca2d805d..a81bd333 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "eslint-plugin-prettier": "^2.2.0", "npmpub": "^3.0.1", "postcss-scss": "^1.0.0", - "prettier": "1.12.0", + "prettier": "1.12.1", "sugarss": "^1.0.0" }, "scripts": { From 3d9dc49074866dd49347bb84ce380ff80799bce0 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Mon, 28 May 2018 09:10:58 -0400 Subject: [PATCH 04/82] Update prettier to version 1.13.0 (#357) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a81bd333..9950fef3 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "eslint-plugin-prettier": "^2.2.0", "npmpub": "^3.0.1", "postcss-scss": "^1.0.0", - "prettier": "1.12.1", + "prettier": "1.13.0", "sugarss": "^1.0.0" }, "scripts": { From c62200b2ffdabd1d8ab485446410e444262dcbe2 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Thu, 7 Jun 2018 09:59:19 -0400 Subject: [PATCH 05/82] Update eslint-config-i-am-meticulous to version 9.0.0 (#361) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9950fef3..3fb13725 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "devDependencies": { "ava": "^0.25.0", "eslint": "^4.16.0", - "eslint-config-i-am-meticulous": "^8.0.0", + "eslint-config-i-am-meticulous": "^9.0.0", "eslint-plugin-import": "^2.2.0", "eslint-plugin-prettier": "^2.2.0", "npmpub": "^3.0.1", From fcc31b17995b9bafa68e35f81d7266ea59678ffa Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Thu, 7 Jun 2018 10:33:17 -0400 Subject: [PATCH 06/82] Update npmpub to version 4.0.0 (#360) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3fb13725..23945397 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "eslint-config-i-am-meticulous": "^9.0.0", "eslint-plugin-import": "^2.2.0", "eslint-plugin-prettier": "^2.2.0", - "npmpub": "^3.0.1", + "npmpub": "^4.0.0", "postcss-scss": "^1.0.0", "prettier": "1.13.0", "sugarss": "^1.0.0" From 7127b77e0c7adad16714314fba31ad1f972b755e Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Wed, 13 Jun 2018 08:57:04 -0400 Subject: [PATCH 07/82] Update eslint-config-i-am-meticulous to version 10.0.0 (#362) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 23945397..6ff96c4b 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "devDependencies": { "ava": "^0.25.0", "eslint": "^4.16.0", - "eslint-config-i-am-meticulous": "^9.0.0", + "eslint-config-i-am-meticulous": "^10.0.0", "eslint-plugin-import": "^2.2.0", "eslint-plugin-prettier": "^2.2.0", "npmpub": "^4.0.0", From 84d35e29547e4e15a82da399fe9bbb54ac9800f4 Mon Sep 17 00:00:00 2001 From: Ryan Zimmerman Date: Sat, 16 Jun 2018 10:30:47 -0400 Subject: [PATCH 08/82] Update prettier to version 1.13.5 (#363) Closes #359 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6ff96c4b..62deba26 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "eslint-plugin-prettier": "^2.2.0", "npmpub": "^4.0.0", "postcss-scss": "^1.0.0", - "prettier": "1.13.0", + "prettier": "1.13.5", "sugarss": "^1.0.0" }, "scripts": { From 9cd2953df9c7db0a2c22f116f47910fa780cfe45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rouven=20We=C3=9Fling?= Date: Sat, 4 Aug 2018 17:06:37 +0200 Subject: [PATCH 09/82] Use PostCSS 7 & drop support for Node.js 4 (#372) * Require Node.js 6 * Use PostCSS 7 Closes #369 --- .travis.yml | 5 ++++- package.json | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 8debb2f0..4a347be9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,8 @@ language: node_js node_js: - stable - - 4.5 + - 10 + - 8 + - 6 + script: npm run ci diff --git a/package.json b/package.json index 62deba26..97a6497d 100644 --- a/package.json +++ b/package.json @@ -17,8 +17,11 @@ "index.js", "lib" ], + "engines": { + "node": ">=6.0.0" + }, "dependencies": { - "postcss": "^6.0.1", + "postcss": "^7.0.1", "postcss-value-parser": "^3.2.3", "read-cache": "^1.0.0", "resolve": "^1.1.7" From 92e38d733f83a121f4c5967a0e3871e9f64a54c4 Mon Sep 17 00:00:00 2001 From: Ryan Zimmerman Date: Sat, 4 Aug 2018 11:18:00 -0400 Subject: [PATCH 10/82] Drop Node 4 from AppVeyor --- appveyor.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 547d721b..5a2d5bfb 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -2,8 +2,8 @@ environment: matrix: - - nodejs_version: 8 - - nodejs_version: 4.5 + - nodejs_version: 10 + - nodejs_version: 6 version: "{build}" build: off From 8c8c7ece0cd0d1519fb15a010e961bfb2d0ce7f6 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Sat, 4 Aug 2018 12:27:01 -0400 Subject: [PATCH 11/82] Update eslint to version 5.0.0 (#364) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 97a6497d..31dd3806 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ }, "devDependencies": { "ava": "^0.25.0", - "eslint": "^4.16.0", + "eslint": "^5.0.0", "eslint-config-i-am-meticulous": "^10.0.0", "eslint-plugin-import": "^2.2.0", "eslint-plugin-prettier": "^2.2.0", From 1c40a5f7098691d014d41486649f0877721391f0 Mon Sep 17 00:00:00 2001 From: Ryan Zimmerman Date: Sat, 4 Aug 2018 13:17:05 -0400 Subject: [PATCH 12/82] Update prettier to version 1.14.0 (#373) Closes #367 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 31dd3806..d83f6bb4 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "eslint-plugin-prettier": "^2.2.0", "npmpub": "^4.0.0", "postcss-scss": "^1.0.0", - "prettier": "1.13.5", + "prettier": "1.14.0", "sugarss": "^1.0.0" }, "scripts": { From 3868ce240ab23b13e57d241abd6065b5c26a107d Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Sat, 4 Aug 2018 13:39:49 -0400 Subject: [PATCH 13/82] Update postcss-scss to version 2.0.0 (#370) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d83f6bb4..3823def4 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "eslint-plugin-import": "^2.2.0", "eslint-plugin-prettier": "^2.2.0", "npmpub": "^4.0.0", - "postcss-scss": "^1.0.0", + "postcss-scss": "^2.0.0", "prettier": "1.14.0", "sugarss": "^1.0.0" }, From d9bc09fdb1be9dfbedbc159f02a35f9570048834 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Sat, 4 Aug 2018 13:59:48 -0400 Subject: [PATCH 14/82] Update eslint-config-i-am-meticulous to version 11.0.0 (#371) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3823def4..40d23ef2 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "devDependencies": { "ava": "^0.25.0", "eslint": "^5.0.0", - "eslint-config-i-am-meticulous": "^10.0.0", + "eslint-config-i-am-meticulous": "^11.0.0", "eslint-plugin-import": "^2.2.0", "eslint-plugin-prettier": "^2.2.0", "npmpub": "^4.0.0", From aae7db398cff204131483db7e61d730447a4185f Mon Sep 17 00:00:00 2001 From: Ryan Zimmerman Date: Sat, 4 Aug 2018 14:23:13 -0400 Subject: [PATCH 15/82] 12.0.0 --- CHANGELOG.md | 5 +++++ package.json | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c2d44e07..fd31f2a5 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +# 12.0.0 - 2018-08-04 + +- Removed: Support for Node.js v4 +- Changed: Uses PostCSS v7 (https://github.com/postcss/postcss/releases/tag/7.0.0) + # 11.1.0 - 2018-02-10 - Added: `filter` option diff --git a/package.json b/package.json index 40d23ef2..9acfb424 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "postcss-import", - "version": "11.1.0", + "version": "12.0.0", "description": "PostCSS plugin to import CSS files", "keywords": [ "css", From 20dd08f029c6bfb5d141ff5f5533b9003a4b87af Mon Sep 17 00:00:00 2001 From: Ryan Zimmerman Date: Sat, 4 Aug 2018 14:30:07 -0400 Subject: [PATCH 16/82] Remove npmpub; doesn't work with npm 2FA --otp --- package.json | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/package.json b/package.json index 9acfb424..60da8d12 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,6 @@ "eslint-config-i-am-meticulous": "^11.0.0", "eslint-plugin-import": "^2.2.0", "eslint-plugin-prettier": "^2.2.0", - "npmpub": "^4.0.0", "postcss-scss": "^2.0.0", "prettier": "1.14.0", "sugarss": "^1.0.0" @@ -41,8 +40,7 @@ "ci": "eslint . && ava", "lint": "eslint . --fix", "pretest": "npm run lint", - "test": "ava", - "release": "npmpub" + "test": "ava" }, "eslintConfig": { "extends": "eslint-config-i-am-meticulous", From a9a7ab2af3b9f10e4952ff7a88e657b6fcb80e3d Mon Sep 17 00:00:00 2001 From: Ryan Zimmerman Date: Wed, 8 Aug 2018 15:03:20 -0400 Subject: [PATCH 17/82] Loosen prettier dependency to use ~ instead of pinning versions Resolves #374 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 60da8d12..01017b92 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "eslint-plugin-import": "^2.2.0", "eslint-plugin-prettier": "^2.2.0", "postcss-scss": "^2.0.0", - "prettier": "1.14.0", + "prettier": "~1.14.0", "sugarss": "^1.0.0" }, "scripts": { From 85c7e6a2633a05aa09662034c98c38ab8d9cae1c Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Sat, 11 Aug 2018 08:12:09 -0400 Subject: [PATCH 18/82] Update sugarss to version 2.0.0 (#375) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 01017b92..48a5629d 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "eslint-plugin-prettier": "^2.2.0", "postcss-scss": "^2.0.0", "prettier": "~1.14.0", - "sugarss": "^1.0.0" + "sugarss": "^2.0.0" }, "scripts": { "ci": "eslint . && ava", From f98dd1a5a6a987c8cf197db46644765a4d43d73a Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Mon, 1 Oct 2018 10:03:14 -0400 Subject: [PATCH 19/82] Update eslint-plugin-prettier to version 3.0.0 (#377) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 48a5629d..496f951d 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "eslint": "^5.0.0", "eslint-config-i-am-meticulous": "^11.0.0", "eslint-plugin-import": "^2.2.0", - "eslint-plugin-prettier": "^2.2.0", + "eslint-plugin-prettier": "^3.0.0", "postcss-scss": "^2.0.0", "prettier": "~1.14.0", "sugarss": "^2.0.0" From 67f4553fd7fa43c9a3320d172e00e0cd6c6ddc46 Mon Sep 17 00:00:00 2001 From: nodaguti Date: Tue, 23 Oct 2018 09:47:37 +0900 Subject: [PATCH 20/82] Set plugin property on dependency messages (#380) This is required as per http://api.postcss.org/Result.html#messages Fixes #379 --- index.js | 1 + test/import-events.js | 2 ++ 2 files changed, 3 insertions(+) diff --git a/index.js b/index.js index 561c7431..d32cf967 100755 --- a/index.js +++ b/index.js @@ -199,6 +199,7 @@ function resolveImportId(result, stmt, options, state) { resolved.forEach(file => { result.messages.push({ type: "dependency", + plugin: "postcss-import", file: file, parent: sourceFile, }) diff --git a/test/import-events.js b/test/import-events.js index bdcc2c2f..d5486cff 100644 --- a/test/import-events.js +++ b/test/import-events.js @@ -22,11 +22,13 @@ test("should add dependency message for each import", t => { const expected = [ { type: "dependency", + plugin: "postcss-import", file: resolve("test/fixtures/imports/media-import-level-2.css"), parent: resolve("test/fixtures/media-import.css"), }, { type: "dependency", + plugin: "postcss-import", file: resolve("test/fixtures/imports/media-import-level-3.css"), parent: resolve("test/fixtures/imports/media-import-level-2.css"), }, From 397cc440866d515e0fd01ada9ee93fc2e058004b Mon Sep 17 00:00:00 2001 From: Ryan Zimmerman Date: Mon, 22 Oct 2018 21:25:33 -0400 Subject: [PATCH 21/82] 12.0.1 --- CHANGELOG.md | 4 ++++ package.json | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fd31f2a5..bb3479c9 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +# 12.0.1 / 2018-10-22 + +- Add `plugin` property to dependency messages ([#379](https://github.com/postcss/postcss-import/issues/379), [#380](https://github.com/postcss/postcss-import/pull/380)) + # 12.0.0 - 2018-08-04 - Removed: Support for Node.js v4 diff --git a/package.json b/package.json index 496f951d..afed7037 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "postcss-import", - "version": "12.0.0", + "version": "12.0.1", "description": "PostCSS plugin to import CSS files", "keywords": [ "css", From eb7ff856714354fab5186994f2c5caba69d386d1 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Wed, 7 Nov 2018 07:45:11 -0500 Subject: [PATCH 22/82] Update prettier to version 1.15.0 (#382) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index afed7037..fe70c759 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "eslint-plugin-import": "^2.2.0", "eslint-plugin-prettier": "^3.0.0", "postcss-scss": "^2.0.0", - "prettier": "~1.14.0", + "prettier": "~1.15.0", "sugarss": "^2.0.0" }, "scripts": { From 00e2d0345ee595f78a4601ecd0abf3b85bf291ca Mon Sep 17 00:00:00 2001 From: r-browser-app-team <43392236+r-browser-app-team@users.noreply.github.com> Date: Tue, 27 Nov 2018 21:57:05 +0900 Subject: [PATCH 23/82] Update LICENSE (#383) --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index 8aad8d24..13983fbf 100755 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) Maxime Thirouin, Jason Campbell & Kevin MÃ¥rtensson +Copyright (c) 2014 Maxime Thirouin, Jason Campbell & Kevin MÃ¥rtensson Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in From d68f50abd03a7f2f5088f0c01e35eac2938a780b Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Sat, 15 Dec 2018 09:30:53 -0500 Subject: [PATCH 24/82] Update ava to version 1.0.1 (#384) * Update ava to version 1.0.1 * Fix duplicate test title --- package.json | 2 +- test/resolve.js | 11 ++++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index fe70c759..9ed39f2f 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "resolve": "^1.1.7" }, "devDependencies": { - "ava": "^0.25.0", + "ava": "^1.0.1", "eslint": "^5.0.0", "eslint-config-i-am-meticulous": "^11.0.0", "eslint-plugin-import": "^2.2.0", diff --git a/test/resolve.js b/test/resolve.js index 009352b8..5cf72ddc 100644 --- a/test/resolve.js +++ b/test/resolve.js @@ -39,9 +39,14 @@ test("should resolve local modules", checkFixture, "resolve-local-modules", { path: null, }) -test("should resolve local modules", checkFixture, "resolve-path-modules", { - path: "test/fixtures/imports/modules", -}) +test( + "should resolve modules with path option", + checkFixture, + "resolve-path-modules", + { + path: "test/fixtures/imports/modules", + } +) test( "should be able to consume npm package or local modules", From 93b7af8c33203a2a080bd44f87cfb979e566776e Mon Sep 17 00:00:00 2001 From: Ryan Zimmerman Date: Fri, 11 Jan 2019 18:13:26 -0500 Subject: [PATCH 25/82] Fix sourcemap tests Fixes #387 --- test/sourcemap/imported.css | 2 +- test/sourcemap/out.css | 2 ++ test/sourcemap/out.css.map | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/test/sourcemap/imported.css b/test/sourcemap/imported.css index c9941e71..c9133230 100755 --- a/test/sourcemap/imported.css +++ b/test/sourcemap/imported.css @@ -1,3 +1,3 @@ html { background: blue; -} \ No newline at end of file +} diff --git a/test/sourcemap/out.css b/test/sourcemap/out.css index 8cbfde19..33f0115e 100755 --- a/test/sourcemap/out.css +++ b/test/sourcemap/out.css @@ -5,3 +5,5 @@ html { body { color: red; } + +/*# sourceMappingURL=out.css.map */ diff --git a/test/sourcemap/out.css.map b/test/sourcemap/out.css.map index 252d8b9a..ac9f8b58 100644 --- a/test/sourcemap/out.css.map +++ b/test/sourcemap/out.css.map @@ -1 +1 @@ -{"version":3,"sources":["test/sourcemap/imported.css","test/sourcemap/in.css"],"names":[],"mappings":"AAAA;EACE,iBAAiB;CAClB;;ACAD;EACE,WAAW;CACZ","file":"test/sourcemap/in.css","sourcesContent":["html {\n background: blue;\n}","@import \"imported.css\";\n\nbody {\n color: red;\n}\n"]} +{"version":3,"sources":["test/sourcemap/imported.css","test/sourcemap/in.css"],"names":[],"mappings":"AAAA;EACE,gBAAgB;AAClB;;ACAA;EACE,UAAU;AACZ","file":"test/sourcemap/in.css","sourcesContent":["html {\n background: blue;\n}","@import \"imported.css\";\n\nbody {\n color: red;\n}\n"]} From 56516e7ff83b311e3c1a6bbd5fadc9fc456747cf Mon Sep 17 00:00:00 2001 From: Ryan Zimmerman Date: Fri, 11 Jan 2019 20:57:11 -0500 Subject: [PATCH 26/82] Actually fix sourcmap test --- test/sourcemap/out.css.map | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/sourcemap/out.css.map b/test/sourcemap/out.css.map index ac9f8b58..e2a31ac7 100644 --- a/test/sourcemap/out.css.map +++ b/test/sourcemap/out.css.map @@ -1 +1 @@ -{"version":3,"sources":["test/sourcemap/imported.css","test/sourcemap/in.css"],"names":[],"mappings":"AAAA;EACE,gBAAgB;AAClB;;ACAA;EACE,UAAU;AACZ","file":"test/sourcemap/in.css","sourcesContent":["html {\n background: blue;\n}","@import \"imported.css\";\n\nbody {\n color: red;\n}\n"]} +{"version":3,"sources":["test/sourcemap/imported.css","test/sourcemap/in.css"],"names":[],"mappings":"AAAA;EACE,gBAAgB;AAClB;;ACAA;EACE,UAAU;AACZ","file":"test/sourcemap/in.css","sourcesContent":["html {\n background: blue;\n}\n","@import \"imported.css\";\n\nbody {\n color: red;\n}\n"]} From 87f43206200747146c15d86676c7cc764d2c87ba Mon Sep 17 00:00:00 2001 From: Ryan Zimmerman <17342435+RyanZim@users.noreply.github.com> Date: Sat, 13 Apr 2019 13:43:43 -0400 Subject: [PATCH 27/82] Update eslint-plugin-import to version 2.17.1 (#395) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9ed39f2f..87b0ecb7 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "ava": "^1.0.1", "eslint": "^5.0.0", "eslint-config-i-am-meticulous": "^11.0.0", - "eslint-plugin-import": "^2.2.0", + "eslint-plugin-import": "^2.17.1", "eslint-plugin-prettier": "^3.0.0", "postcss-scss": "^2.0.0", "prettier": "~1.15.0", From 25013d6a48bc05c0336eadc6d099e08a365598a7 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Sat, 13 Apr 2019 14:21:19 -0400 Subject: [PATCH 28/82] chore(package): update prettier to version 1.17.0 (#393) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 87b0ecb7..63566eee 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "eslint-plugin-import": "^2.17.1", "eslint-plugin-prettier": "^3.0.0", "postcss-scss": "^2.0.0", - "prettier": "~1.15.0", + "prettier": "~1.17.0", "sugarss": "^2.0.0" }, "scripts": { From 7680182995c98900d35a6f359ea54fa58f04df99 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Thu, 6 Jun 2019 20:47:14 -0400 Subject: [PATCH 29/82] Update prettier to version 1.18.0 (#398) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 63566eee..9c34ef1c 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "eslint-plugin-import": "^2.17.1", "eslint-plugin-prettier": "^3.0.0", "postcss-scss": "^2.0.0", - "prettier": "~1.17.0", + "prettier": "~1.18.0", "sugarss": "^2.0.0" }, "scripts": { From 3a7f728e9688423ee75787a4e51691d4f64b454d Mon Sep 17 00:00:00 2001 From: Ryan Zimmerman <17342435+RyanZim@users.noreply.github.com> Date: Wed, 29 Jan 2020 20:16:33 -0500 Subject: [PATCH 30/82] Update prettier to version 1.19.1 (#408) Closes #405 Co-authored-by: greenkeeper[bot] <23040076+greenkeeper[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9c34ef1c..b37ba63f 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "eslint-plugin-import": "^2.17.1", "eslint-plugin-prettier": "^3.0.0", "postcss-scss": "^2.0.0", - "prettier": "~1.18.0", + "prettier": "~1.19.1", "sugarss": "^2.0.0" }, "scripts": { From 614fb64e5930e350ec2e65dd66e7bd55c7c7b44f Mon Sep 17 00:00:00 2001 From: Ryan Zimmerman Date: Tue, 28 Apr 2020 16:14:55 -0400 Subject: [PATCH 31/82] Fix linting --- test/custom-resolve.js | 6 +++--- test/import.js | 6 +++--- test/plugins.js | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/test/custom-resolve.js b/test/custom-resolve.js index 77c8b2b3..2ab3e88a 100644 --- a/test/custom-resolve.js +++ b/test/custom-resolve.js @@ -5,12 +5,12 @@ import path from "path" import test from "ava" import postcss from "postcss" -// internal tooling -import checkFixture from "./helpers/check-fixture" - // plugin import atImport from ".." +// internal tooling +import checkFixture from "./helpers/check-fixture" + test.serial("should accept file", checkFixture, "custom-resolve-file", { resolve: () => path.resolve("test/fixtures/imports/custom-resolve-1.css"), }) diff --git a/test/import.js b/test/import.js index e99d36c9..ad36328c 100644 --- a/test/import.js +++ b/test/import.js @@ -6,12 +6,12 @@ import path from "path" import test from "ava" import postcss from "postcss" -// internal tooling -import checkFixture from "./helpers/check-fixture" - // plugin import atImport from ".." +// internal tooling +import checkFixture from "./helpers/check-fixture" + test("should import stylsheets", checkFixture, "simple") test("should not import a stylsheet twice", checkFixture, "no-duplicate") diff --git a/test/plugins.js b/test/plugins.js index b96fed01..f5664cb0 100644 --- a/test/plugins.js +++ b/test/plugins.js @@ -2,12 +2,12 @@ import test from "ava" import postcss from "postcss" -// internal tooling -import checkFixture from "./helpers/check-fixture" - // plugin import atImport from ".." +// internal tooling +import checkFixture from "./helpers/check-fixture" + test("should apply plugins to root", t => { const atRules = [] const rules = [] From 21ad9ebc5844305f04c11cde08169791cdcf3094 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 28 Apr 2020 16:23:23 -0400 Subject: [PATCH 32/82] Configure Renovate (#411) * Add renovate.json * Update renovate.json Co-authored-by: Renovate Bot Co-authored-by: Ryan Zimmerman <17342435+RyanZim@users.noreply.github.com> --- renovate.json | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 renovate.json diff --git a/renovate.json b/renovate.json new file mode 100644 index 00000000..a5132835 --- /dev/null +++ b/renovate.json @@ -0,0 +1,7 @@ +{ + "extends": [ + "config:base", + ":preserveSemverRanges", + ":label(deps)" + ] +} From d288ea35cfdfbc992343b4d9344d88cc23f17890 Mon Sep 17 00:00:00 2001 From: Ryan Zimmerman <17342435+RyanZim@users.noreply.github.com> Date: Sat, 3 Oct 2020 19:40:07 -0400 Subject: [PATCH 33/82] BREAKING: Require Node 10 or later; update CI config (#429) --- .travis.yml | 9 +++++---- appveyor.yml | 19 ------------------- package.json | 2 +- 3 files changed, 6 insertions(+), 24 deletions(-) delete mode 100644 appveyor.yml diff --git a/.travis.yml b/.travis.yml index 4a347be9..08bb673d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,8 +1,9 @@ language: node_js +os: + - linux + - windows node_js: - - stable + - node + - 12 - 10 - - 8 - - 6 - script: npm run ci diff --git a/appveyor.yml b/appveyor.yml deleted file mode 100644 index 5a2d5bfb..00000000 --- a/appveyor.yml +++ /dev/null @@ -1,19 +0,0 @@ -# http://www.appveyor.com/docs/appveyor-yml - -environment: - matrix: - - nodejs_version: 10 - - nodejs_version: 6 - -version: "{build}" -build: off -deploy: off - -install: - - ps: Install-Product node $env:nodejs_version - - npm install - -test_script: - - node --version - - npm --version - - cmd: "npm run ci" diff --git a/package.json b/package.json index b37ba63f..1ad0a695 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "lib" ], "engines": { - "node": ">=6.0.0" + "node": ">=10.0.0" }, "dependencies": { "postcss": "^7.0.1", From c5679db0a9409a36dd81e0b523099700521db41d Mon Sep 17 00:00:00 2001 From: Oscar Otero Date: Tue, 13 Oct 2020 17:32:54 +0200 Subject: [PATCH 34/82] Add support for postcss v8 (#432) * added support for postcss v8 * Added a different sourcemap test for Windows * fix map in windows --- index.js | 428 +++++++++++++++++---------------- package.json | 5 +- test/import.js | 7 +- test/sourcemap/out.css.win.map | 1 + 4 files changed, 233 insertions(+), 208 deletions(-) create mode 100644 test/sourcemap/out.css.win.map diff --git a/index.js b/index.js index d32cf967..0687f65c 100755 --- a/index.js +++ b/index.js @@ -2,9 +2,6 @@ // builtin tooling const path = require("path") -// external tooling -const postcss = require("postcss") - // internal tooling const joinMedia = require("./lib/join-media") const resolveId = require("./lib/resolve-id") @@ -35,234 +32,253 @@ function AtImport(options) { options.path = options.path.map(p => path.resolve(options.root, p)) - return function(styles, result) { - const state = { - importedFiles: {}, - hashFiles: {}, - } - - if (styles.source && styles.source.input && styles.source.input.file) { - state.importedFiles[styles.source.input.file] = {} - } - - if (options.plugins && !Array.isArray(options.plugins)) { - throw new Error("plugins option must be an array") - } - - return parseStyles(result, styles, options, state, []).then(bundle => { - applyRaws(bundle) - applyMedia(bundle) - applyStyles(bundle, styles) - }) - } -} - -function applyRaws(bundle) { - bundle.forEach((stmt, index) => { - if (index === 0) return - - if (stmt.parent) { - const before = stmt.parent.node.raws.before - if (stmt.type === "nodes") stmt.nodes[0].raws.before = before - else stmt.node.raws.before = before - } else if (stmt.type === "nodes") { - stmt.nodes[0].raws.before = stmt.nodes[0].raws.before || "\n" - } - }) -} + return { + postcssPlugin: "postcss-import", + Once(styles, { result, atRule }) { + const state = { + importedFiles: {}, + hashFiles: {}, + } -function applyMedia(bundle) { - bundle.forEach(stmt => { - if (!stmt.media.length) return - if (stmt.type === "import") { - stmt.node.params = `${stmt.fullUri} ${stmt.media.join(", ")}` - } else if (stmt.type === "media") stmt.node.params = stmt.media.join(", ") - else { - const nodes = stmt.nodes - const parent = nodes[0].parent - const mediaNode = postcss.atRule({ - name: "media", - params: stmt.media.join(", "), - source: parent.source, - }) + if (styles.source && styles.source.input && styles.source.input.file) { + state.importedFiles[styles.source.input.file] = {} + } - parent.insertBefore(nodes[0], mediaNode) + if (options.plugins && !Array.isArray(options.plugins)) { + throw new Error("plugins option must be an array") + } - // remove nodes - nodes.forEach(node => { - node.parent = undefined + return parseStyles(result, styles, options, state, []).then(bundle => { + applyRaws(bundle) + applyMedia(bundle) + applyStyles(bundle, styles) }) - // better output - nodes[0].raws.before = nodes[0].raws.before || "\n" + function applyRaws(bundle) { + bundle.forEach((stmt, index) => { + if (index === 0) return - // wrap new rules with media query - mediaNode.append(nodes) + if (stmt.parent) { + const before = stmt.parent.node.raws.before + if (stmt.type === "nodes") stmt.nodes[0].raws.before = before + else stmt.node.raws.before = before + } else if (stmt.type === "nodes") { + stmt.nodes[0].raws.before = stmt.nodes[0].raws.before || "\n" + } + }) + } - stmt.type = "media" - stmt.node = mediaNode - delete stmt.nodes - } - }) -} + function applyMedia(bundle) { + bundle.forEach(stmt => { + if (!stmt.media.length) return + if (stmt.type === "import") { + stmt.node.params = `${stmt.fullUri} ${stmt.media.join(", ")}` + } else if (stmt.type === "media") + stmt.node.params = stmt.media.join(", ") + else { + const nodes = stmt.nodes + const parent = nodes[0].parent + const mediaNode = atRule({ + name: "media", + params: stmt.media.join(", "), + source: parent.source, + }) -function applyStyles(bundle, styles) { - styles.nodes = [] - - // Strip additional statements. - bundle.forEach(stmt => { - if (stmt.type === "import") { - stmt.node.parent = undefined - styles.append(stmt.node) - } else if (stmt.type === "media") { - stmt.node.parent = undefined - styles.append(stmt.node) - } else if (stmt.type === "nodes") { - stmt.nodes.forEach(node => { - node.parent = undefined - styles.append(node) - }) - } - }) -} + parent.insertBefore(nodes[0], mediaNode) -function parseStyles(result, styles, options, state, media) { - const statements = parseStatements(result, styles) + // remove nodes + nodes.forEach(node => { + node.parent = undefined + }) - return Promise.resolve(statements) - .then(stmts => { - // process each statement in series - return stmts.reduce((promise, stmt) => { - return promise.then(() => { - stmt.media = joinMedia(media, stmt.media || []) + // better output + nodes[0].raws.before = nodes[0].raws.before || "\n" - // skip protocol base uri (protocol://url) or protocol-relative - if (stmt.type !== "import" || /^(?:[a-z]+:)?\/\//i.test(stmt.uri)) { - return - } + // wrap new rules with media query + mediaNode.append(nodes) - if (options.filter && !options.filter(stmt.uri)) { - // rejected by filter - return + stmt.type = "media" + stmt.node = mediaNode + delete stmt.nodes } - - return resolveImportId(result, stmt, options, state) - }) - }, Promise.resolve()) - }) - .then(() => { - const imports = [] - const bundle = [] - - // squash statements and their children - statements.forEach(stmt => { - if (stmt.type === "import") { - if (stmt.children) { - stmt.children.forEach((child, index) => { - if (child.type === "import") imports.push(child) - else bundle.push(child) - // For better output - if (index === 0) child.parent = stmt - }) - } else imports.push(stmt) - } else if (stmt.type === "media" || stmt.type === "nodes") { - bundle.push(stmt) - } - }) - - return imports.concat(bundle) - }) -} - -function resolveImportId(result, stmt, options, state) { - const atRule = stmt.node - let sourceFile - if (atRule.source && atRule.source.input && atRule.source.input.file) { - sourceFile = atRule.source.input.file - } - const base = sourceFile - ? path.dirname(atRule.source.input.file) - : options.root - - return Promise.resolve(options.resolve(stmt.uri, base, options)) - .then(paths => { - if (!Array.isArray(paths)) paths = [paths] - // Ensure that each path is absolute: - return Promise.all( - paths.map(file => { - return !path.isAbsolute(file) ? resolveId(file, base, options) : file }) - ) - }) - .then(resolved => { - // Add dependency messages: - resolved.forEach(file => { - result.messages.push({ - type: "dependency", - plugin: "postcss-import", - file: file, - parent: sourceFile, - }) - }) + } - return Promise.all( - resolved.map(file => { - return loadImportContent(result, stmt, file, options, state) + function applyStyles(bundle, styles) { + styles.nodes = [] + + // Strip additional statements. + bundle.forEach(stmt => { + if (stmt.type === "import") { + stmt.node.parent = undefined + styles.append(stmt.node) + } else if (stmt.type === "media") { + stmt.node.parent = undefined + styles.append(stmt.node) + } else if (stmt.type === "nodes") { + stmt.nodes.forEach(node => { + node.parent = undefined + styles.append(node) + }) + } }) - ) - }) - .then(result => { - // Merge loaded statements - stmt.children = result.reduce((result, statements) => { - return statements ? result.concat(statements) : result - }, []) - }) -} + } -function loadImportContent(result, stmt, filename, options, state) { - const atRule = stmt.node - const media = stmt.media - if (options.skipDuplicates) { - // skip files already imported at the same scope - if (state.importedFiles[filename] && state.importedFiles[filename][media]) { - return - } - - // save imported files to skip them next time - if (!state.importedFiles[filename]) state.importedFiles[filename] = {} - state.importedFiles[filename][media] = true - } + function parseStyles(result, styles, options, state, media) { + const statements = parseStatements(result, styles) + + return Promise.resolve(statements) + .then(stmts => { + // process each statement in series + return stmts.reduce((promise, stmt) => { + return promise.then(() => { + stmt.media = joinMedia(media, stmt.media || []) + + // skip protocol base uri (protocol://url) or protocol-relative + if ( + stmt.type !== "import" || + /^(?:[a-z]+:)?\/\//i.test(stmt.uri) + ) { + return + } + + if (options.filter && !options.filter(stmt.uri)) { + // rejected by filter + return + } + + return resolveImportId(result, stmt, options, state) + }) + }, Promise.resolve()) + }) + .then(() => { + const imports = [] + const bundle = [] + + // squash statements and their children + statements.forEach(stmt => { + if (stmt.type === "import") { + if (stmt.children) { + stmt.children.forEach((child, index) => { + if (child.type === "import") imports.push(child) + else bundle.push(child) + // For better output + if (index === 0) child.parent = stmt + }) + } else imports.push(stmt) + } else if (stmt.type === "media" || stmt.type === "nodes") { + bundle.push(stmt) + } + }) - return Promise.resolve(options.load(filename, options)).then(content => { - if (content.trim() === "") { - result.warn(`${filename} is empty`, { node: atRule }) - return - } + return imports.concat(bundle) + }) + } - // skip previous imported files not containing @import rules - if (state.hashFiles[content] && state.hashFiles[content][media]) return + function resolveImportId(result, stmt, options, state) { + const atRule = stmt.node + let sourceFile + if (atRule.source && atRule.source.input && atRule.source.input.file) { + sourceFile = atRule.source.input.file + } + const base = sourceFile + ? path.dirname(atRule.source.input.file) + : options.root + + return Promise.resolve(options.resolve(stmt.uri, base, options)) + .then(paths => { + if (!Array.isArray(paths)) paths = [paths] + // Ensure that each path is absolute: + return Promise.all( + paths.map(file => { + return !path.isAbsolute(file) + ? resolveId(file, base, options) + : file + }) + ) + }) + .then(resolved => { + // Add dependency messages: + resolved.forEach(file => { + result.messages.push({ + type: "dependency", + plugin: "postcss-import", + file: file, + parent: sourceFile, + }) + }) - return processContent(result, content, filename, options).then( - importedResult => { - const styles = importedResult.root - result.messages = result.messages.concat(importedResult.messages) + return Promise.all( + resolved.map(file => { + return loadImportContent(result, stmt, file, options, state) + }) + ) + }) + .then(result => { + // Merge loaded statements + stmt.children = result.reduce((result, statements) => { + return statements ? result.concat(statements) : result + }, []) + }) + } + function loadImportContent(result, stmt, filename, options, state) { + const atRule = stmt.node + const media = stmt.media if (options.skipDuplicates) { - const hasImport = styles.some(child => { - return child.type === "atrule" && child.name === "import" - }) - if (!hasImport) { - // save hash files to skip them next time - if (!state.hashFiles[content]) state.hashFiles[content] = {} - state.hashFiles[content][media] = true + // skip files already imported at the same scope + if ( + state.importedFiles[filename] && + state.importedFiles[filename][media] + ) { + return } + + // save imported files to skip them next time + if (!state.importedFiles[filename]) state.importedFiles[filename] = {} + state.importedFiles[filename][media] = true } - // recursion: import @import from imported file - return parseStyles(result, styles, options, state, media) + return Promise.resolve(options.load(filename, options)).then( + content => { + if (content.trim() === "") { + result.warn(`${filename} is empty`, { node: atRule }) + return + } + + // skip previous imported files not containing @import rules + if (state.hashFiles[content] && state.hashFiles[content][media]) + return + + return processContent(result, content, filename, options).then( + importedResult => { + const styles = importedResult.root + result.messages = result.messages.concat( + importedResult.messages + ) + + if (options.skipDuplicates) { + const hasImport = styles.some(child => { + return child.type === "atrule" && child.name === "import" + }) + if (!hasImport) { + // save hash files to skip them next time + if (!state.hashFiles[content]) state.hashFiles[content] = {} + state.hashFiles[content][media] = true + } + } + + // recursion: import @import from imported file + return parseStyles(result, styles, options, state, media) + } + ) + } + ) } - ) - }) + }, + } } -module.exports = postcss.plugin("postcss-import", AtImport) +AtImport.postcss = true + +module.exports = AtImport diff --git a/package.json b/package.json index 1ad0a695..177c61ff 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,6 @@ "node": ">=10.0.0" }, "dependencies": { - "postcss": "^7.0.1", "postcss-value-parser": "^3.2.3", "read-cache": "^1.0.0", "resolve": "^1.1.7" @@ -32,10 +31,14 @@ "eslint-config-i-am-meticulous": "^11.0.0", "eslint-plugin-import": "^2.17.1", "eslint-plugin-prettier": "^3.0.0", + "postcss": "^8.0.0", "postcss-scss": "^2.0.0", "prettier": "~1.19.1", "sugarss": "^2.0.0" }, + "peerDependencies": { + "postcss": "^8.0.0" + }, "scripts": { "ci": "eslint . && ava", "lint": "eslint . --fix", diff --git a/test/import.js b/test/import.js index ad36328c..56c6250c 100644 --- a/test/import.js +++ b/test/import.js @@ -65,7 +65,12 @@ test("should contain a correct sourcemap", t => { .then(result => { t.is( result.map.toString(), - readFileSync("test/sourcemap/out.css.map", "utf8").trim() + readFileSync( + process.platform === "win32" + ? "test/sourcemap/out.css.win.map" + : "test/sourcemap/out.css.map", + "utf8" + ).trim() ) }) }) diff --git a/test/sourcemap/out.css.win.map b/test/sourcemap/out.css.win.map new file mode 100644 index 00000000..fa8890c4 --- /dev/null +++ b/test/sourcemap/out.css.win.map @@ -0,0 +1 @@ +{"version":3,"sources":["test/sourcemap/imported.css","test/sourcemap/in.css"],"names":[],"mappings":"AAAA;EACE,gBAAgB;AAClB;;ACAA;EACE,UAAU;AACZ","file":"test\\sourcemap\\in.css","sourcesContent":["html {\n background: blue;\n}\n","@import \"imported.css\";\n\nbody {\n color: red;\n}\n"]} From 19632bc4a89f1c1896b914d32596c63db5b9001c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 13 Oct 2020 16:06:12 -0400 Subject: [PATCH 35/82] Update dependency prettier to v2 (#419) * Update dependency prettier to v2 * Update prettier config * Format code Co-authored-by: Renovate Bot Co-authored-by: Ryan Zimmerman --- lib/join-media.js | 2 +- lib/parse-statements.js | 2 +- lib/resolve-id.js | 2 +- package.json | 4 ++-- test/helpers/check-fixture.js | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/join-media.js b/lib/join-media.js index 397aa957..5780de9a 100644 --- a/lib/join-media.js +++ b/lib/join-media.js @@ -1,6 +1,6 @@ "use strict" -module.exports = function(parentMedia, childMedia) { +module.exports = function (parentMedia, childMedia) { if (!parentMedia.length && childMedia.length) return childMedia if (parentMedia.length && !childMedia.length) return parentMedia if (!parentMedia.length && !childMedia.length) return [] diff --git a/lib/parse-statements.js b/lib/parse-statements.js index a864864b..228e451d 100644 --- a/lib/parse-statements.js +++ b/lib/parse-statements.js @@ -20,7 +20,7 @@ function split(params, start) { return list } -module.exports = function(result, styles) { +module.exports = function (result, styles) { const statements = [] let nodes = [] diff --git a/lib/resolve-id.js b/lib/resolve-id.js index 5819a2af..e342ad06 100644 --- a/lib/resolve-id.js +++ b/lib/resolve-id.js @@ -11,7 +11,7 @@ function resolveModule(id, opts) { }) } -module.exports = function(id, base, options) { +module.exports = function (id, base, options) { const paths = options.path const resolveOpts = { diff --git a/package.json b/package.json index 177c61ff..1a0fa6c7 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "eslint-plugin-prettier": "^3.0.0", "postcss": "^8.0.0", "postcss-scss": "^2.0.0", - "prettier": "~1.19.1", + "prettier": "~2.1.0", "sugarss": "^2.0.0" }, "peerDependencies": { @@ -55,7 +55,7 @@ "error", { "semi": false, - "trailingComma": "es5" + "arrowParens": "avoid" } ] } diff --git a/test/helpers/check-fixture.js b/test/helpers/check-fixture.js index c31aec6c..cf217680 100644 --- a/test/helpers/check-fixture.js +++ b/test/helpers/check-fixture.js @@ -14,7 +14,7 @@ function read(name, ext) { return fs.readFileSync(`test/fixtures/${name}${ext}`, "utf8") } -module.exports = function(t, file, opts, postcssOpts, warnings) { +module.exports = function (t, file, opts, postcssOpts, warnings) { opts = Object.assign({ path: "test/fixtures/imports" }, opts) postcssOpts = Object.assign({ from: undefined }, postcssOpts) if (typeof file === "string") file = { name: file, ext: ".css" } From 4fb674670cf0428e2fac23a7dc2a3cb7694aaa2c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 13 Oct 2020 17:44:15 -0400 Subject: [PATCH 36/82] Update dependency postcss-value-parser to v4 (#423) Co-authored-by: Renovate Bot --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1a0fa6c7..b24535e1 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "node": ">=10.0.0" }, "dependencies": { - "postcss-value-parser": "^3.2.3", + "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", "resolve": "^1.1.7" }, From 64d57af93aea79da870b4005fd44d9d05ec8aa7f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 13 Oct 2020 18:19:30 -0400 Subject: [PATCH 37/82] Update dependency postcss-scss to v3 (#431) Co-authored-by: Renovate Bot --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b24535e1..3375ea41 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "eslint-plugin-import": "^2.17.1", "eslint-plugin-prettier": "^3.0.0", "postcss": "^8.0.0", - "postcss-scss": "^2.0.0", + "postcss-scss": "^3.0.0", "prettier": "~2.1.0", "sugarss": "^2.0.0" }, From a1898924684db8cc3946f7d74be3503bc799b9ce Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 14 Oct 2020 07:42:08 -0400 Subject: [PATCH 38/82] Update dependency sugarss to v3 (#433) Co-authored-by: Renovate Bot --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3375ea41..81c0b42f 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "postcss": "^8.0.0", "postcss-scss": "^3.0.0", "prettier": "~2.1.0", - "sugarss": "^2.0.0" + "sugarss": "^3.0.0" }, "peerDependencies": { "postcss": "^8.0.0" From 7cdbb2b2c71013da6b30e521b7a1659a266c088e Mon Sep 17 00:00:00 2001 From: Ryan Zimmerman Date: Tue, 20 Oct 2020 18:30:28 -0400 Subject: [PATCH 39/82] 13.0.0 --- CHANGELOG.md | 6 ++++++ package.json | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bb3479c9..ba7d3e32 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +# 13.0.0 / 2020-10-20 + +- **BREAKING:** Require Node 10+ ([#429](https://github.com/postcss/postcss-import/pull/429)) +- **BREAKING:** Upgrade to postcss v8 and require it as a `peerDependency` ([#427](https://github.com/postcss/postcss-import/issues/427), [#432](https://github.com/postcss/postcss-import/pull/432)) +- Update dependencies + # 12.0.1 / 2018-10-22 - Add `plugin` property to dependency messages ([#379](https://github.com/postcss/postcss-import/issues/379), [#380](https://github.com/postcss/postcss-import/pull/380)) diff --git a/package.json b/package.json index 81c0b42f..59ca148b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "postcss-import", - "version": "12.0.1", + "version": "13.0.0", "description": "PostCSS plugin to import CSS files", "keywords": [ "css", From 4344b33cacd2617dea62411a5398faa7030e28b5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 30 Oct 2020 08:46:17 -0400 Subject: [PATCH 40/82] Update dependency ava to v3 (#415) * Update dependency ava to v3 * Remove import usage Co-authored-by: Renovate Bot Co-authored-by: Ryan Zimmerman --- package.json | 2 +- test/custom-load.js | 4 ++-- test/custom-resolve.js | 10 +++++----- test/custom-syntax-parser.js | 8 ++++---- test/filter.js | 4 ++-- test/import-events.js | 10 +++++----- test/import.js | 12 ++++++------ test/lint.js | 6 +++--- test/media.js | 4 ++-- test/order.js | 4 ++-- test/plugins.js | 8 ++++---- test/resolve.js | 4 ++-- test/syntax-error.js | 8 ++++---- 13 files changed, 42 insertions(+), 42 deletions(-) diff --git a/package.json b/package.json index 59ca148b..0660b082 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "resolve": "^1.1.7" }, "devDependencies": { - "ava": "^1.0.1", + "ava": "^3.0.0", "eslint": "^5.0.0", "eslint-config-i-am-meticulous": "^11.0.0", "eslint-plugin-import": "^2.17.1", diff --git a/test/custom-load.js b/test/custom-load.js index 9ecd1878..eb306d3b 100644 --- a/test/custom-load.js +++ b/test/custom-load.js @@ -1,8 +1,8 @@ // external tooling -import test from "ava" +const test = require("ava") // internal tooling -import checkFixture from "./helpers/check-fixture" +const checkFixture = require("./helpers/check-fixture") test.serial("should accept content", checkFixture, "custom-load", { load: () => "custom-content {}", diff --git a/test/custom-resolve.js b/test/custom-resolve.js index 2ab3e88a..e3aafb32 100644 --- a/test/custom-resolve.js +++ b/test/custom-resolve.js @@ -1,15 +1,15 @@ // builtin tooling -import path from "path" +const path = require("path") // external tooling -import test from "ava" -import postcss from "postcss" +const test = require("ava") +const postcss = require("postcss") // plugin -import atImport from ".." +const atImport = require("..") // internal tooling -import checkFixture from "./helpers/check-fixture" +const checkFixture = require("./helpers/check-fixture") test.serial("should accept file", checkFixture, "custom-resolve-file", { resolve: () => path.resolve("test/fixtures/imports/custom-resolve-1.css"), diff --git a/test/custom-syntax-parser.js b/test/custom-syntax-parser.js index 975ebc88..a9b66c15 100644 --- a/test/custom-syntax-parser.js +++ b/test/custom-syntax-parser.js @@ -1,10 +1,10 @@ // external tooling -import test from "ava" -import scss from "postcss-scss" -import sugarss from "sugarss" +const test = require("ava") +const scss = require("postcss-scss") +const sugarss = require("sugarss") // internal tooling -import checkFixture from "./helpers/check-fixture" +const checkFixture = require("./helpers/check-fixture") test("should process custom syntax", checkFixture, "scss-syntax", null, { syntax: scss, diff --git a/test/filter.js b/test/filter.js index 3b07a3a0..724be5e3 100644 --- a/test/filter.js +++ b/test/filter.js @@ -1,8 +1,8 @@ // external tooling -import test from "ava" +const test = require("ava") // internal tooling -import checkFixture from "./helpers/check-fixture" +const checkFixture = require("./helpers/check-fixture") test("should filter all imported stylesheets", checkFixture, "filter-all", { filter: () => false, diff --git a/test/import-events.js b/test/import-events.js index d5486cff..00a0489c 100644 --- a/test/import-events.js +++ b/test/import-events.js @@ -1,13 +1,13 @@ // builtin tooling -import { readFileSync } from "fs" -import { resolve } from "path" +const { readFileSync } = require("fs") +const { resolve } = require("path") // external tooling -import test from "ava" -import postcss from "postcss" +const test = require("ava") +const postcss = require("postcss") // plugin -import atImport from ".." +const atImport = require("..") test("should add dependency message for each import", t => { return postcss() diff --git a/test/import.js b/test/import.js index 56c6250c..76e9053a 100644 --- a/test/import.js +++ b/test/import.js @@ -1,16 +1,16 @@ // builtin tooling -import { readFileSync } from "fs" -import path from "path" +const { readFileSync } = require("fs") +const path = require("path") // external tooling -import test from "ava" -import postcss from "postcss" +const test = require("ava") +const postcss = require("postcss") // plugin -import atImport from ".." +const atImport = require("..") // internal tooling -import checkFixture from "./helpers/check-fixture" +const checkFixture = require("./helpers/check-fixture") test("should import stylsheets", checkFixture, "simple") diff --git a/test/lint.js b/test/lint.js index 66c102e5..c6efdce3 100644 --- a/test/lint.js +++ b/test/lint.js @@ -1,9 +1,9 @@ // external tooling -import test from "ava" -import postcss from "postcss" +const test = require("ava") +const postcss = require("postcss") // plugin -import atImport from ".." +const atImport = require("..") const processor = postcss().use(atImport()) diff --git a/test/media.js b/test/media.js index 78161990..99781fe4 100644 --- a/test/media.js +++ b/test/media.js @@ -1,8 +1,8 @@ // external tooling -import test from "ava" +const test = require("ava") // internal tooling -import checkFixture from "./helpers/check-fixture" +const checkFixture = require("./helpers/check-fixture") test( "should resolve media queries of import statements", diff --git a/test/order.js b/test/order.js index 5d690976..d6e405b1 100644 --- a/test/order.js +++ b/test/order.js @@ -1,8 +1,8 @@ // external tooling -import test from "ava" +const test = require("ava") // internal tooling -import checkFixture from "./helpers/check-fixture" +const checkFixture = require("./helpers/check-fixture") test(`should order nested imports correctly`, t => { let first = true diff --git a/test/plugins.js b/test/plugins.js index f5664cb0..c8b63b43 100644 --- a/test/plugins.js +++ b/test/plugins.js @@ -1,12 +1,12 @@ // external tooling -import test from "ava" -import postcss from "postcss" +const test = require("ava") +const postcss = require("postcss") // plugin -import atImport from ".." +const atImport = require("..") // internal tooling -import checkFixture from "./helpers/check-fixture" +const checkFixture = require("./helpers/check-fixture") test("should apply plugins to root", t => { const atRules = [] diff --git a/test/resolve.js b/test/resolve.js index 5cf72ddc..36475414 100644 --- a/test/resolve.js +++ b/test/resolve.js @@ -1,8 +1,8 @@ // external tooling -import test from "ava" +const test = require("ava") // internal tooling -import checkFixture from "./helpers/check-fixture" +const checkFixture = require("./helpers/check-fixture") test("should resolve relative to cwd", checkFixture, "resolve-cwd", { path: null, diff --git a/test/syntax-error.js b/test/syntax-error.js index 18d6bfb1..feba2c0a 100644 --- a/test/syntax-error.js +++ b/test/syntax-error.js @@ -1,12 +1,12 @@ // builtin tooling -import fs from "fs" +const fs = require("fs") // external tooling -import test from "ava" -import postcss from "postcss" +const test = require("ava") +const postcss = require("postcss") // plugin -import atImport from ".." +const atImport = require("..") test("SyntaxError in imported file throws", t => { return postcss(atImport({ path: "test/fixtures/imports" })) From fee216ea46323ee64bc96fa2b06f7547b5f8e6bb Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 30 Oct 2020 13:30:47 -0400 Subject: [PATCH 41/82] Update dependency eslint to v7 (#420) * Update dependency eslint to v7 * Switch to eslint-config-problems; format code Co-authored-by: Renovate Bot Co-authored-by: Ryan Zimmerman --- index.js | 32 +++++++++---------- lib/parse-statements.js | 9 +++--- lib/process-content.js | 6 ++-- lib/resolve-id.js | 2 +- package.json | 10 +++--- test/custom-load.js | 1 + test/custom-resolve.js | 1 + test/custom-syntax-parser.js | 1 + test/filter.js | 1 + test/fixtures/imports/modules/main-js/main.js | 1 + test/helpers/check-fixture.js | 5 +-- test/import-events.js | 1 + test/import.js | 1 + test/lint.js | 1 + test/media.js | 1 + test/order.js | 1 + test/plugins.js | 1 + test/resolve.js | 1 + test/syntax-error.js | 1 + 19 files changed, 45 insertions(+), 32 deletions(-) diff --git a/index.js b/index.js index 0687f65c..6b788492 100755 --- a/index.js +++ b/index.js @@ -10,18 +10,16 @@ const processContent = require("./lib/process-content") const parseStatements = require("./lib/parse-statements") function AtImport(options) { - options = Object.assign( - { - root: process.cwd(), - path: [], - skipDuplicates: true, - resolve: resolveId, - load: loadContent, - plugins: [], - addModulesDirectories: [], - }, - options - ) + options = { + root: process.cwd(), + path: [], + skipDuplicates: true, + resolve: resolveId, + load: loadContent, + plugins: [], + addModulesDirectories: [], + ...options, + } options.root = path.resolve(options.root) @@ -59,7 +57,7 @@ function AtImport(options) { if (index === 0) return if (stmt.parent) { - const before = stmt.parent.node.raws.before + const { before } = stmt.parent.node.raws if (stmt.type === "nodes") stmt.nodes[0].raws.before = before else stmt.node.raws.before = before } else if (stmt.type === "nodes") { @@ -76,8 +74,8 @@ function AtImport(options) { } else if (stmt.type === "media") stmt.node.params = stmt.media.join(", ") else { - const nodes = stmt.nodes - const parent = nodes[0].parent + const { nodes } = stmt + const { parent } = nodes[0] const mediaNode = atRule({ name: "media", params: stmt.media.join(", "), @@ -203,7 +201,7 @@ function AtImport(options) { result.messages.push({ type: "dependency", plugin: "postcss-import", - file: file, + file, parent: sourceFile, }) }) @@ -224,7 +222,7 @@ function AtImport(options) { function loadImportContent(result, stmt, filename, options, state) { const atRule = stmt.node - const media = stmt.media + const { media } = stmt if (options.skipDuplicates) { // skip files already imported at the same scope if ( diff --git a/lib/parse-statements.js b/lib/parse-statements.js index 228e451d..ac25e925 100644 --- a/lib/parse-statements.js +++ b/lib/parse-statements.js @@ -4,7 +4,7 @@ const valueParser = require("postcss-value-parser") // extended tooling -const stringify = valueParser.stringify +const { stringify } = valueParser function split(params, start) { const list = [] @@ -35,7 +35,7 @@ module.exports = function (result, styles) { if (nodes.length) { statements.push({ type: "nodes", - nodes: nodes, + nodes, media: [], }) nodes = [] @@ -47,7 +47,7 @@ module.exports = function (result, styles) { if (nodes.length) { statements.push({ type: "nodes", - nodes: nodes, + nodes, media: [], }) } @@ -76,7 +76,8 @@ function parseImport(result, atRule) { "@import must precede all other statements (besides @charset)", { node: atRule } ) - } else prev = getPrev(prev) + } + prev = getPrev(prev) } while (prev) } diff --git a/lib/process-content.js b/lib/process-content.js index 3de45ac1..531e7745 100644 --- a/lib/process-content.js +++ b/lib/process-content.js @@ -10,7 +10,7 @@ const postcss = require("postcss") let sugarss module.exports = function processContent(result, content, filename, options) { - const plugins = options.plugins + const { plugins } = options const ext = path.extname(filename) const parserList = [] @@ -20,9 +20,7 @@ module.exports = function processContent(result, content, filename, options) { if (!sugarss) { try { sugarss = require("sugarss") - } catch (e) { - // Ignore - } + } catch {} // Ignore } if (sugarss) return runPostcss(content, filename, plugins, [sugarss]) } diff --git a/lib/resolve-id.js b/lib/resolve-id.js index e342ad06..ffef034c 100644 --- a/lib/resolve-id.js +++ b/lib/resolve-id.js @@ -17,7 +17,7 @@ module.exports = function (id, base, options) { const resolveOpts = { basedir: base, moduleDirectory: moduleDirectories.concat(options.addModulesDirectories), - paths: paths, + paths, extensions: [".css"], packageFilter: function processPackage(pkg) { if (pkg.style) pkg.main = pkg.style diff --git a/package.json b/package.json index 0660b082..9465ca0e 100644 --- a/package.json +++ b/package.json @@ -27,9 +27,8 @@ }, "devDependencies": { "ava": "^3.0.0", - "eslint": "^5.0.0", - "eslint-config-i-am-meticulous": "^11.0.0", - "eslint-plugin-import": "^2.17.1", + "eslint": "^7.0.0", + "eslint-config-problems": "^5.0.0", "eslint-plugin-prettier": "^3.0.0", "postcss": "^8.0.0", "postcss-scss": "^3.0.0", @@ -46,7 +45,10 @@ "test": "ava" }, "eslintConfig": { - "extends": "eslint-config-i-am-meticulous", + "extends": "eslint-config-problems", + "env": { + "node": true + }, "plugins": [ "prettier" ], diff --git a/test/custom-load.js b/test/custom-load.js index eb306d3b..872b15a7 100644 --- a/test/custom-load.js +++ b/test/custom-load.js @@ -1,3 +1,4 @@ +"use strict" // external tooling const test = require("ava") diff --git a/test/custom-resolve.js b/test/custom-resolve.js index e3aafb32..130f9dab 100644 --- a/test/custom-resolve.js +++ b/test/custom-resolve.js @@ -1,3 +1,4 @@ +"use strict" // builtin tooling const path = require("path") diff --git a/test/custom-syntax-parser.js b/test/custom-syntax-parser.js index a9b66c15..729f6b29 100644 --- a/test/custom-syntax-parser.js +++ b/test/custom-syntax-parser.js @@ -1,3 +1,4 @@ +"use strict" // external tooling const test = require("ava") const scss = require("postcss-scss") diff --git a/test/filter.js b/test/filter.js index 724be5e3..1e2f70d6 100644 --- a/test/filter.js +++ b/test/filter.js @@ -1,3 +1,4 @@ +"use strict" // external tooling const test = require("ava") diff --git a/test/fixtures/imports/modules/main-js/main.js b/test/fixtures/imports/modules/main-js/main.js index 4ba52ba2..588e23ee 100644 --- a/test/fixtures/imports/modules/main-js/main.js +++ b/test/fixtures/imports/modules/main-js/main.js @@ -1 +1,2 @@ +"use strict" module.exports = {} diff --git a/test/helpers/check-fixture.js b/test/helpers/check-fixture.js index cf217680..480d04b0 100644 --- a/test/helpers/check-fixture.js +++ b/test/helpers/check-fixture.js @@ -15,8 +15,8 @@ function read(name, ext) { } module.exports = function (t, file, opts, postcssOpts, warnings) { - opts = Object.assign({ path: "test/fixtures/imports" }, opts) - postcssOpts = Object.assign({ from: undefined }, postcssOpts) + opts = { path: "test/fixtures/imports", ...opts } + postcssOpts = { from: undefined, ...postcssOpts } if (typeof file === "string") file = { name: file, ext: ".css" } const { name, ext } = file @@ -27,6 +27,7 @@ module.exports = function (t, file, opts, postcssOpts, warnings) { const expected = read(`${name}.expected`) // handy thing: checkout actual in the *.actual.css file fs.writeFile(`test/fixtures/${name}.actual.css`, actual, err => { + // eslint-disable-next-line no-console if (err) console.warn(`Warning: ${err}; not fatal, continuing`) }) t.is(actual, expected) diff --git a/test/import-events.js b/test/import-events.js index 00a0489c..638754ea 100644 --- a/test/import-events.js +++ b/test/import-events.js @@ -1,3 +1,4 @@ +"use strict" // builtin tooling const { readFileSync } = require("fs") const { resolve } = require("path") diff --git a/test/import.js b/test/import.js index 76e9053a..9b637c22 100644 --- a/test/import.js +++ b/test/import.js @@ -1,3 +1,4 @@ +"use strict" // builtin tooling const { readFileSync } = require("fs") const path = require("path") diff --git a/test/lint.js b/test/lint.js index c6efdce3..6361ae71 100644 --- a/test/lint.js +++ b/test/lint.js @@ -1,3 +1,4 @@ +"use strict" // external tooling const test = require("ava") const postcss = require("postcss") diff --git a/test/media.js b/test/media.js index 99781fe4..cdac2144 100644 --- a/test/media.js +++ b/test/media.js @@ -1,3 +1,4 @@ +"use strict" // external tooling const test = require("ava") diff --git a/test/order.js b/test/order.js index d6e405b1..86af6642 100644 --- a/test/order.js +++ b/test/order.js @@ -1,3 +1,4 @@ +"use strict" // external tooling const test = require("ava") diff --git a/test/plugins.js b/test/plugins.js index c8b63b43..20cee886 100644 --- a/test/plugins.js +++ b/test/plugins.js @@ -1,3 +1,4 @@ +"use strict" // external tooling const test = require("ava") const postcss = require("postcss") diff --git a/test/resolve.js b/test/resolve.js index 36475414..2be4794c 100644 --- a/test/resolve.js +++ b/test/resolve.js @@ -1,3 +1,4 @@ +"use strict" // external tooling const test = require("ava") diff --git a/test/syntax-error.js b/test/syntax-error.js index feba2c0a..98330607 100644 --- a/test/syntax-error.js +++ b/test/syntax-error.js @@ -1,3 +1,4 @@ +"use strict" // builtin tooling const fs = require("fs") From 443c1120ef3152430478e2a8e4d3fd12625f8667 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 27 Nov 2020 16:15:43 -0500 Subject: [PATCH 42/82] Update dependency prettier to ~2.2.0 (#444) Co-authored-by: Renovate Bot --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9465ca0e..ad08dc32 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "eslint-plugin-prettier": "^3.0.0", "postcss": "^8.0.0", "postcss-scss": "^3.0.0", - "prettier": "~2.1.0", + "prettier": "~2.2.0", "sugarss": "^3.0.0" }, "peerDependencies": { From f8c36935e83fd47c56c58bc5b1903bc4fbd5f35c Mon Sep 17 00:00:00 2001 From: Ryan Zimmerman <17342435+RyanZim@users.noreply.github.com> Date: Mon, 14 Dec 2020 14:03:28 -0500 Subject: [PATCH 43/82] Fix charset handling (#447) * Fix @charset handling Fixes #436 Closes #438 * Ensure @charset statements are first --- index.js | 29 +++++++++++++++----- lib/parse-statements.js | 31 +++++++++++++--------- test/fixtures/charset-error.css | 2 ++ test/fixtures/charset-import.css | 4 +++ test/fixtures/charset-import.expected.css | 3 +++ test/fixtures/imports/charset.css | 1 + test/import.js | 32 +++++++++++++++++++++++ test/lint.js | 17 ++++++++++++ 8 files changed, 101 insertions(+), 18 deletions(-) create mode 100644 test/fixtures/charset-error.css create mode 100644 test/fixtures/charset-import.css create mode 100644 test/fixtures/charset-import.expected.css create mode 100644 test/fixtures/imports/charset.css diff --git a/index.js b/index.js index 6b788492..233a1723 100755 --- a/index.js +++ b/index.js @@ -107,10 +107,7 @@ function AtImport(options) { // Strip additional statements. bundle.forEach(stmt => { - if (stmt.type === "import") { - stmt.node.parent = undefined - styles.append(stmt.node) - } else if (stmt.type === "media") { + if (["charset", "import", "media"].includes(stmt.type)) { stmt.node.parent = undefined styles.append(stmt.node) } else if (stmt.type === "nodes") { @@ -150,15 +147,33 @@ function AtImport(options) { }, Promise.resolve()) }) .then(() => { + let charset const imports = [] const bundle = [] + function handleCharset(stmt) { + if (!charset) charset = stmt + // charsets aren't case-sensitive, so convert to lower case to compare + else if ( + stmt.node.params.toLowerCase() !== + charset.node.params.toLowerCase() + ) { + throw new Error( + `Incompatable @charset statements: + ${stmt.node.params} specified in ${stmt.node.source.input.file} + ${charset.node.params} specified in ${charset.node.source.input.file}` + ) + } + } + // squash statements and their children statements.forEach(stmt => { - if (stmt.type === "import") { + if (stmt.type === "charset") handleCharset(stmt) + else if (stmt.type === "import") { if (stmt.children) { stmt.children.forEach((child, index) => { if (child.type === "import") imports.push(child) + else if (child.type === "charset") handleCharset(child) else bundle.push(child) // For better output if (index === 0) child.parent = stmt @@ -169,7 +184,9 @@ function AtImport(options) { } }) - return imports.concat(bundle) + return charset + ? [charset, ...imports.concat(bundle)] + : imports.concat(bundle) }) } diff --git a/lib/parse-statements.js b/lib/parse-statements.js index ac25e925..59bb4274 100644 --- a/lib/parse-statements.js +++ b/lib/parse-statements.js @@ -29,6 +29,7 @@ module.exports = function (result, styles) { if (node.type === "atrule") { if (node.name === "import") stmt = parseImport(result, node) else if (node.name === "media") stmt = parseMedia(result, node) + else if (node.name === "charset") stmt = parseCharset(result, node) } if (stmt) { @@ -64,20 +65,34 @@ function parseMedia(result, atRule) { } } +function parseCharset(result, atRule) { + if (atRule.prev()) { + return result.warn("@charset must precede all other statements", { + node: atRule, + }) + } + return { + type: "charset", + node: atRule, + media: [], + } +} + function parseImport(result, atRule) { - let prev = getPrev(atRule) + let prev = atRule.prev() if (prev) { do { if ( - prev.type !== "atrule" || - (prev.name !== "import" && prev.name !== "charset") + prev.type !== "comment" && + (prev.type !== "atrule" || + (prev.name !== "import" && prev.name !== "charset")) ) { return result.warn( "@import must precede all other statements (besides @charset)", { node: atRule } ) } - prev = getPrev(prev) + prev = prev.prev() } while (prev) } @@ -128,11 +143,3 @@ function parseImport(result, atRule) { return stmt } - -function getPrev(item) { - let prev = item.prev() - while (prev && prev.type === "comment") { - prev = prev.prev() - } - return prev -} diff --git a/test/fixtures/charset-error.css b/test/fixtures/charset-error.css new file mode 100644 index 00000000..3456d4a5 --- /dev/null +++ b/test/fixtures/charset-error.css @@ -0,0 +1,2 @@ +@charset "foobar"; +@import "imports/charset.css"; diff --git a/test/fixtures/charset-import.css b/test/fixtures/charset-import.css new file mode 100644 index 00000000..f06162a3 --- /dev/null +++ b/test/fixtures/charset-import.css @@ -0,0 +1,4 @@ +@charset "UTF-8"; +@import "test/fixtures/imports/foo.css"; +@import "test/fixtures/imports/charset.css"; +bar{} diff --git a/test/fixtures/charset-import.expected.css b/test/fixtures/charset-import.expected.css new file mode 100644 index 00000000..5262c38e --- /dev/null +++ b/test/fixtures/charset-import.expected.css @@ -0,0 +1,3 @@ +@charset "UTF-8"; +foo{} +bar{} diff --git a/test/fixtures/imports/charset.css b/test/fixtures/imports/charset.css new file mode 100644 index 00000000..9f44090c --- /dev/null +++ b/test/fixtures/imports/charset.css @@ -0,0 +1 @@ +@charset "UTF-8"; diff --git a/test/import.js b/test/import.js index 9b637c22..4bcafdcd 100644 --- a/test/import.js +++ b/test/import.js @@ -46,6 +46,38 @@ test("should not fail with absolute and local import", t => { .then(result => t.is(result.css, "@import url('http://');\nfoo{}")) }) +test("should keep @charset first", t => { + const base = '@charset "UTF-8";\n@import url(http://);' + return postcss() + .use(atImport()) + .process(base, { from: undefined }) + .then(result => { + t.is(result.warnings().length, 0) + t.is(result.css, base) + }) +}) + +test( + "should handle multiple @charset statements", + checkFixture, + "charset-import" +) + +test("should error if incompatable @charset statements", t => { + t.plan(2) + const file = "test/fixtures/charset-error.css" + return postcss() + .use(atImport()) + .process(readFileSync(file), { from: file }) + .catch(err => { + t.truthy(err) + t.regex( + err.message, + /Incompatable @charset statements:.+specified in.+specified in.+/s + ) + }) +}) + test("should error when file not found", t => { t.plan(1) const file = "test/fixtures/imports/import-missing.css" diff --git a/test/lint.js b/test/lint.js index 6361ae71..7e65c098 100644 --- a/test/lint.js +++ b/test/lint.js @@ -78,6 +78,23 @@ test("should not warn when @charset or @import statement before", t => { }) }) +test("should warn when @charset is not first", t => { + return Promise.all([ + processor.process(`a {} @charset "utf-8";`, { from: undefined }), + processor.process(`@media {} @charset "utf-8";`, { from: undefined }), + processor.process(`/* foo */ @charset "utf-8";`, { from: undefined }), + processor.process(`@import "bar.css"; @charset "utf-8";`, { + from: "test/fixtures/imports/foo.css", + }), + ]).then(results => { + results.forEach(result => { + const warnings = result.warnings() + t.is(warnings.length, 1) + t.is(warnings[0].text, "@charset must precede all other statements") + }) + }) +}) + test("should warn when a user didn't close an import with ;", t => { return processor .process(`@import url('http://') :root{}`, { from: undefined }) From 8b239c6c5e2f5da1e70eeeb6192513cbeee46a73 Mon Sep 17 00:00:00 2001 From: Ryan Zimmerman Date: Mon, 14 Dec 2020 14:20:47 -0500 Subject: [PATCH 44/82] 14.0.0 --- CHANGELOG.md | 8 ++++++++ package.json | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ba7d3e32..8e2f21fb 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +# 14.0.0 / 2020-12-14 + +This release should not have breaking changes for the vast majority of users; only those with `@charset` statements in their CSS _may_ be affected. + +- **BREAKING:** Error if multiple incompatible `@charset` statements ([#447](https://github.com/postcss/postcss-import/pull/447)) +- **BREAKING:** Warn if `@charset` statements are not at the top of files ([#447](https://github.com/postcss/postcss-import/pull/447)) +- Fix handing of `@charset` ([#436](https://github.com/postcss/postcss-import/issues/436), [#447](https://github.com/postcss/postcss-import/pull/447)) + # 13.0.0 / 2020-10-20 - **BREAKING:** Require Node 10+ ([#429](https://github.com/postcss/postcss-import/pull/429)) diff --git a/package.json b/package.json index ad08dc32..0f8ac49e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "postcss-import", - "version": "13.0.0", + "version": "14.0.0", "description": "PostCSS plugin to import CSS files", "keywords": [ "css", From f85d645cbee660637690a09c9e02c1329c4a3369 Mon Sep 17 00:00:00 2001 From: Ryan Zimmerman <17342435+RyanZim@users.noreply.github.com> Date: Wed, 31 Mar 2021 18:48:23 -0400 Subject: [PATCH 45/82] Fix handling of @charset in media imports (#453) Fixes #448 --- index.js | 2 +- test/fixtures/imports/charset-content.css | 2 ++ test/fixtures/media-charset.css | 1 + test/fixtures/media-charset.expected.css | 4 ++++ test/media.js | 6 ++++++ 5 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 test/fixtures/imports/charset-content.css create mode 100644 test/fixtures/media-charset.css create mode 100644 test/fixtures/media-charset.expected.css diff --git a/index.js b/index.js index 233a1723..9dd2cc39 100755 --- a/index.js +++ b/index.js @@ -68,7 +68,7 @@ function AtImport(options) { function applyMedia(bundle) { bundle.forEach(stmt => { - if (!stmt.media.length) return + if (!stmt.media.length || stmt.type === "charset") return if (stmt.type === "import") { stmt.node.params = `${stmt.fullUri} ${stmt.media.join(", ")}` } else if (stmt.type === "media") diff --git a/test/fixtures/imports/charset-content.css b/test/fixtures/imports/charset-content.css new file mode 100644 index 00000000..0058c1e6 --- /dev/null +++ b/test/fixtures/imports/charset-content.css @@ -0,0 +1,2 @@ +@charset "UTF-8"; +.charset-content {} diff --git a/test/fixtures/media-charset.css b/test/fixtures/media-charset.css new file mode 100644 index 00000000..b7faa401 --- /dev/null +++ b/test/fixtures/media-charset.css @@ -0,0 +1 @@ +@import "charset-content" level-1; diff --git a/test/fixtures/media-charset.expected.css b/test/fixtures/media-charset.expected.css new file mode 100644 index 00000000..8b65f60c --- /dev/null +++ b/test/fixtures/media-charset.expected.css @@ -0,0 +1,4 @@ +@charset "UTF-8"; +@media level-1{ +.charset-content {} +} diff --git a/test/media.js b/test/media.js index cdac2144..3c0c030a 100644 --- a/test/media.js +++ b/test/media.js @@ -19,4 +19,10 @@ test( "media-content" ) +test( + "should resolve media query imports with charset", + checkFixture, + "media-charset" +) + test("should join correctly media queries", checkFixture, "media-join") From b8fabce4f17da7635dd04b45bd2f040371e9cd8c Mon Sep 17 00:00:00 2001 From: Ryan Zimmerman Date: Wed, 31 Mar 2021 18:56:04 -0400 Subject: [PATCH 46/82] 14.0.1 --- CHANGELOG.md | 4 ++++ package.json | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8e2f21fb..61007f63 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +# 14.0.1 / 2021-03-31 + +- Fix bug with `@charset` statements in media imports ([#448](https://github.com/postcss/postcss-import/issues/448), [#453](https://github.com/postcss/postcss-import/pull/453)) + # 14.0.0 / 2020-12-14 This release should not have breaking changes for the vast majority of users; only those with `@charset` statements in their CSS _may_ be affected. diff --git a/package.json b/package.json index 0f8ac49e..a2bd4887 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "postcss-import", - "version": "14.0.0", + "version": "14.0.1", "description": "PostCSS plugin to import CSS files", "keywords": [ "css", From fab1f9aad4e6e1703268451c64680fc9a8e341ec Mon Sep 17 00:00:00 2001 From: Ryan Zimmerman Date: Wed, 31 Mar 2021 19:19:58 -0400 Subject: [PATCH 47/82] Update README --- README.md | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 7b8315b6..92871fc2 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,8 @@ # postcss-import -[![Unix Build status](https://img.shields.io/travis/postcss/postcss-import/master.svg?branch=master&label=unix%20build)](https://travis-ci.org/postcss/postcss-import) -[![Windows Build status](https://img.shields.io/appveyor/ci/MoOx/postcss-import/master.svg?label=window%20build)](https://ci.appveyor.com/project/MoOx/postcss-import/branch/master) -[![Version](https://img.shields.io/npm/v/postcss-import.svg)](https://github.com/postcss/postcss-import/blob/master/CHANGELOG.md) -[![Greenkeeper badge](https://badges.greenkeeper.io/postcss/postcss-import.svg)](https://greenkeeper.io/) - +[![Build](https://img.shields.io/travis/postcss/postcss-import/master)](https://travis-ci.org/postcss/postcss-import) +[![Version](https://img.shields.io/npm/v/postcss-import)](https://github.com/postcss/postcss-import/blob/master/CHANGELOG.md) +[![postcss compatibility](https://img.shields.io/npm/dependency-version/postcss-import/peer/postcss)](https://postcss.org/) > [PostCSS](https://github.com/postcss/postcss) plugin to transform `@import` rules by inlining content. @@ -54,12 +52,12 @@ work. ```js // dependencies -var fs = require("fs") -var postcss = require("postcss") -var atImport = require("postcss-import") +const fs = require("fs") +const postcss = require("postcss") +const atImport = require("postcss-import") // css to be processed -var css = fs.readFileSync("css/input.css", "utf8") +const css = fs.readFileSync("css/input.css", "utf8") // process css postcss() @@ -68,8 +66,8 @@ postcss() // `from` option is needed here from: "css/input.css" }) - .then(function (result) { - var output = result.css + .then((result) => { + const output = result.css console.log(output) }) @@ -192,16 +190,16 @@ this value will be ignored. #### Example with some options ```js -var postcss = require("postcss") -var atImport = require("postcss-import") +const postcss = require("postcss") +const atImport = require("postcss-import") postcss() .use(atImport({ path: ["src/css"], })) .process(cssString) - .then(function (result) { - var css = result.css + .then((result) => { + const { css } = result }) ``` From de7b657977b44d587051ac8ed777244e98ecc577 Mon Sep 17 00:00:00 2001 From: Oscar Otero Date: Fri, 7 May 2021 01:01:09 +0200 Subject: [PATCH 48/82] Remove explicit postcss require (#456) Fixes #455 --- index.js | 44 ++++++++++++++++++++++-------------------- lib/process-content.js | 20 +++++++++++-------- 2 files changed, 35 insertions(+), 29 deletions(-) diff --git a/index.js b/index.js index 9dd2cc39..889cdaa7 100755 --- a/index.js +++ b/index.js @@ -32,7 +32,7 @@ function AtImport(options) { return { postcssPlugin: "postcss-import", - Once(styles, { result, atRule }) { + Once(styles, { result, atRule, postcss }) { const state = { importedFiles: {}, hashFiles: {}, @@ -265,28 +265,30 @@ function AtImport(options) { if (state.hashFiles[content] && state.hashFiles[content][media]) return - return processContent(result, content, filename, options).then( - importedResult => { - const styles = importedResult.root - result.messages = result.messages.concat( - importedResult.messages - ) - - if (options.skipDuplicates) { - const hasImport = styles.some(child => { - return child.type === "atrule" && child.name === "import" - }) - if (!hasImport) { - // save hash files to skip them next time - if (!state.hashFiles[content]) state.hashFiles[content] = {} - state.hashFiles[content][media] = true - } + return processContent( + result, + content, + filename, + options, + postcss + ).then(importedResult => { + const styles = importedResult.root + result.messages = result.messages.concat(importedResult.messages) + + if (options.skipDuplicates) { + const hasImport = styles.some(child => { + return child.type === "atrule" && child.name === "import" + }) + if (!hasImport) { + // save hash files to skip them next time + if (!state.hashFiles[content]) state.hashFiles[content] = {} + state.hashFiles[content][media] = true } - - // recursion: import @import from imported file - return parseStyles(result, styles, options, state, media) } - ) + + // recursion: import @import from imported file + return parseStyles(result, styles, options, state, media) + }) } ) } diff --git a/lib/process-content.js b/lib/process-content.js index 531e7745..beaa3f03 100644 --- a/lib/process-content.js +++ b/lib/process-content.js @@ -3,13 +3,16 @@ // builtin tooling const path = require("path") -// external tooling -const postcss = require("postcss") - // placeholder tooling let sugarss -module.exports = function processContent(result, content, filename, options) { +module.exports = function processContent( + result, + content, + filename, + options, + postcss +) { const { plugins } = options const ext = path.extname(filename) @@ -22,7 +25,8 @@ module.exports = function processContent(result, content, filename, options) { sugarss = require("sugarss") } catch {} // Ignore } - if (sugarss) return runPostcss(content, filename, plugins, [sugarss]) + if (sugarss) + return runPostcss(postcss, content, filename, plugins, [sugarss]) } // Syntax support: @@ -35,10 +39,10 @@ module.exports = function processContent(result, content, filename, options) { // Try the default as a last resort: parserList.push(null) - return runPostcss(content, filename, plugins, parserList) + return runPostcss(postcss, content, filename, plugins, parserList) } -function runPostcss(content, filename, plugins, parsers, index) { +function runPostcss(postcss, content, filename, plugins, parsers, index) { if (!index) index = 0 return postcss(plugins) .process(content, { @@ -50,6 +54,6 @@ function runPostcss(content, filename, plugins, parsers, index) { index++ // If there are no parsers left, throw it if (index === parsers.length) throw err - return runPostcss(content, filename, plugins, parsers, index) + return runPostcss(postcss, content, filename, plugins, parsers, index) }) } From d43bac932a4fbaa96d44777b63a9071937862299 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 10 May 2021 13:48:29 -0400 Subject: [PATCH 49/82] Update dependency prettier to ~2.3.0 (#457) Co-authored-by: Renovate Bot --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a2bd4887..92f9a7de 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "eslint-plugin-prettier": "^3.0.0", "postcss": "^8.0.0", "postcss-scss": "^3.0.0", - "prettier": "~2.2.0", + "prettier": "~2.3.0", "sugarss": "^3.0.0" }, "peerDependencies": { From 3cac12aad6e4985bcdc060cf4c7eaa7f2a4fe4ce Mon Sep 17 00:00:00 2001 From: Ryan Zimmerman Date: Mon, 10 May 2021 14:16:02 -0400 Subject: [PATCH 50/82] 14.0.2 --- CHANGELOG.md | 4 ++++ package.json | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 61007f63..839cc166 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +# 14.0.2 / 2021-05-10 + +- Remove remaining direct import of `postcss` package ([#455](https://github.com/postcss/postcss-import/issues/455), [#456](https://github.com/postcss/postcss-import/pull/456)) + # 14.0.1 / 2021-03-31 - Fix bug with `@charset` statements in media imports ([#448](https://github.com/postcss/postcss-import/issues/448), [#453](https://github.com/postcss/postcss-import/pull/453)) diff --git a/package.json b/package.json index 92f9a7de..309c67cd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "postcss-import", - "version": "14.0.1", + "version": "14.0.2", "description": "PostCSS plugin to import CSS files", "keywords": [ "css", From 6bd17a107e48b3b1977149d24301b8500ceac2bc Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 14 Jun 2021 18:34:36 -0400 Subject: [PATCH 51/82] Update dependency sugarss to v4 (#461) Co-authored-by: Renovate Bot --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 309c67cd..afa5e6f5 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "postcss": "^8.0.0", "postcss-scss": "^3.0.0", "prettier": "~2.3.0", - "sugarss": "^3.0.0" + "sugarss": "^4.0.0" }, "peerDependencies": { "postcss": "^8.0.0" From 9ec7ab208c7ab5f3362375015c0c38bb915e517a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 14 Jun 2021 19:23:03 -0400 Subject: [PATCH 52/82] Update dependency postcss-scss to v4 (#460) Co-authored-by: Renovate Bot --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index afa5e6f5..5ae692cd 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "eslint-config-problems": "^5.0.0", "eslint-plugin-prettier": "^3.0.0", "postcss": "^8.0.0", - "postcss-scss": "^3.0.0", + "postcss-scss": "^4.0.0", "prettier": "~2.3.0", "sugarss": "^4.0.0" }, From e71751a4228f0ff8312488225bbe75fe1c0e5e93 Mon Sep 17 00:00:00 2001 From: Eaton Zveare Date: Tue, 13 Jul 2021 15:34:40 -0400 Subject: [PATCH 53/82] Update npm install docs (#464) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 92871fc2..06f05c70 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ please look at ## Installation ```console -$ npm install postcss-import +$ npm install -D postcss-import ``` ## Usage From 6b01dc888a48edc3da8deabff3261a80f601d8ec Mon Sep 17 00:00:00 2001 From: Ryan Zimmerman <17342435+RyanZim@users.noreply.github.com> Date: Thu, 4 Nov 2021 18:51:48 -0400 Subject: [PATCH 54/82] Switch from TravisCI to GitHub Workflows (#472) --- .github/workflows/ci.yaml | 21 +++++++++++++++++++++ .travis.yml | 9 --------- 2 files changed, 21 insertions(+), 9 deletions(-) create mode 100644 .github/workflows/ci.yaml delete mode 100644 .travis.yml diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml new file mode 100644 index 00000000..9ba7fbd8 --- /dev/null +++ b/.github/workflows/ci.yaml @@ -0,0 +1,21 @@ +name: Node.js CI + +on: + push: + branches: master + pull_request: + +jobs: + test: + runs-on: ubuntu-latest + strategy: + matrix: + node-version: [10.x, 12.x, 14.x, 16.x, 17.x] + steps: + - uses: actions/checkout@v2 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v2 + with: + node-version: ${{ matrix.node-version }} + - run: npm install + - run: npm test diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 08bb673d..00000000 --- a/.travis.yml +++ /dev/null @@ -1,9 +0,0 @@ -language: node_js -os: - - linux - - windows -node_js: - - node - - 12 - - 10 -script: npm run ci From 2846425d609a189c068c6cb6acbb3121f0bda98a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 4 Nov 2021 19:03:15 -0400 Subject: [PATCH 55/82] Update dependency prettier to ~2.4.0 (#468) Co-authored-by: Renovate Bot --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5ae692cd..1c58ba5e 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "eslint-plugin-prettier": "^3.0.0", "postcss": "^8.0.0", "postcss-scss": "^4.0.0", - "prettier": "~2.3.0", + "prettier": "~2.4.0", "sugarss": "^4.0.0" }, "peerDependencies": { From 9eadd93f799177e0b982ba88e271c0d4b3622a2c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 4 Nov 2021 19:03:33 -0400 Subject: [PATCH 56/82] Update dependency eslint-plugin-prettier to v4 (#473) Co-authored-by: Renovate Bot --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1c58ba5e..edd51874 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "ava": "^3.0.0", "eslint": "^7.0.0", "eslint-config-problems": "^5.0.0", - "eslint-plugin-prettier": "^3.0.0", + "eslint-plugin-prettier": "^4.0.0", "postcss": "^8.0.0", "postcss-scss": "^4.0.0", "prettier": "~2.4.0", From fe000304ed5fe59dd7445b2122f288ea77e5c6b6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 25 Nov 2021 11:24:23 -0500 Subject: [PATCH 57/82] Update dependency prettier to ~2.5.0 (#476) Co-authored-by: Renovate Bot --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index edd51874..18aeba09 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "eslint-plugin-prettier": "^4.0.0", "postcss": "^8.0.0", "postcss-scss": "^4.0.0", - "prettier": "~2.4.0", + "prettier": "~2.5.0", "sugarss": "^4.0.0" }, "peerDependencies": { From e2d28908a5820a6cf356bb5f8f1ea453169bc693 Mon Sep 17 00:00:00 2001 From: Tommy Williams Date: Wed, 16 Feb 2022 13:23:43 -0500 Subject: [PATCH 58/82] Link to new glob plugin in README (#482) --- README.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/README.md b/README.md index 06f05c70..f0ce11ec 100644 --- a/README.md +++ b/README.md @@ -29,10 +29,7 @@ a given scope (root, media query...). Tests are made from the path & the content of imported files (using a hash table). If this behavior is not what you want, look at `skipDuplicates` option -- **If you are looking for glob, or sass like imports (prefixed partials)**, -please look at -[postcss-easy-import](https://github.com/trysound/postcss-easy-import) -(which use this plugin under the hood). +- If you are looking for **Glob Imports**, you can use [postcss-import-ext-glob](https://github.com/dimitrinicolas/postcss-import-ext-glob) to extend postcss-import. - Imports which are not modified (by `options.filter` or because they are remote imports) are moved to the top of the output. - **This plugin attempts to follow the CSS `@import` spec**; `@import` From 8bd0173c286b15c254a3b88a4d48b1e4aabe08cc Mon Sep 17 00:00:00 2001 From: Romain Menke <11521496+romainmenke@users.noreply.github.com> Date: Tue, 22 Mar 2022 15:57:34 +0100 Subject: [PATCH 59/82] Add @layer support (#483) * layers support * finish implementation * add more tests * add more tests --- index.js | 83 ++++++++++++++++++++------- lib/join-layer.js | 9 +++ lib/parse-statements.js | 37 ++++++++++-- test/fixtures/imports/foo-layered.css | 3 + test/fixtures/layer.css | 10 ++++ test/fixtures/layer.expected.css | 24 ++++++++ test/layer.js | 8 +++ test/lint.js | 28 ++++++++- 8 files changed, 175 insertions(+), 27 deletions(-) create mode 100644 lib/join-layer.js create mode 100755 test/fixtures/imports/foo-layered.css create mode 100644 test/fixtures/layer.css create mode 100644 test/fixtures/layer.expected.css create mode 100644 test/layer.js diff --git a/index.js b/index.js index 889cdaa7..e6a3dc33 100755 --- a/index.js +++ b/index.js @@ -4,6 +4,7 @@ const path = require("path") // internal tooling const joinMedia = require("./lib/join-media") +const joinLayer = require("./lib/join-layer") const resolveId = require("./lib/resolve-id") const loadContent = require("./lib/load-content") const processContent = require("./lib/process-content") @@ -46,11 +47,13 @@ function AtImport(options) { throw new Error("plugins option must be an array") } - return parseStyles(result, styles, options, state, []).then(bundle => { - applyRaws(bundle) - applyMedia(bundle) - applyStyles(bundle, styles) - }) + return parseStyles(result, styles, options, state, [], []).then( + bundle => { + applyRaws(bundle) + applyMedia(bundle) + applyStyles(bundle, styles) + } + ) function applyRaws(bundle) { bundle.forEach((stmt, index) => { @@ -68,21 +71,60 @@ function AtImport(options) { function applyMedia(bundle) { bundle.forEach(stmt => { - if (!stmt.media.length || stmt.type === "charset") return + if ( + (!stmt.media.length && !stmt.layer.length) || + stmt.type === "charset" + ) { + return + } + if (stmt.type === "import") { stmt.node.params = `${stmt.fullUri} ${stmt.media.join(", ")}` - } else if (stmt.type === "media") + } else if (stmt.type === "media") { stmt.node.params = stmt.media.join(", ") - else { + } else { const { nodes } = stmt const { parent } = nodes[0] - const mediaNode = atRule({ - name: "media", - params: stmt.media.join(", "), - source: parent.source, - }) - parent.insertBefore(nodes[0], mediaNode) + let outerAtRule + let innerAtRule + if (stmt.media.length && stmt.layer.length) { + const mediaNode = atRule({ + name: "media", + params: stmt.media.join(", "), + source: parent.source, + }) + + const layerNode = atRule({ + name: "layer", + params: stmt.layer.filter(layer => layer !== "").join("."), + source: parent.source, + }) + + mediaNode.append(layerNode) + innerAtRule = layerNode + outerAtRule = mediaNode + } else if (stmt.media.length) { + const mediaNode = atRule({ + name: "media", + params: stmt.media.join(", "), + source: parent.source, + }) + + innerAtRule = mediaNode + outerAtRule = mediaNode + } else if (stmt.layer.length) { + const layerNode = atRule({ + name: "layer", + params: stmt.layer.filter(layer => layer !== "").join("."), + source: parent.source, + }) + + innerAtRule = layerNode + outerAtRule = layerNode + } + + parent.insertBefore(nodes[0], outerAtRule) // remove nodes nodes.forEach(node => { @@ -92,11 +134,11 @@ function AtImport(options) { // better output nodes[0].raws.before = nodes[0].raws.before || "\n" - // wrap new rules with media query - mediaNode.append(nodes) + // wrap new rules with media query and/or layer at rule + innerAtRule.append(nodes) stmt.type = "media" - stmt.node = mediaNode + stmt.node = outerAtRule delete stmt.nodes } }) @@ -119,7 +161,7 @@ function AtImport(options) { }) } - function parseStyles(result, styles, options, state, media) { + function parseStyles(result, styles, options, state, media, layer) { const statements = parseStatements(result, styles) return Promise.resolve(statements) @@ -128,6 +170,7 @@ function AtImport(options) { return stmts.reduce((promise, stmt) => { return promise.then(() => { stmt.media = joinMedia(media, stmt.media || []) + stmt.layer = joinLayer(layer, stmt.layer || []) // skip protocol base uri (protocol://url) or protocol-relative if ( @@ -239,7 +282,7 @@ function AtImport(options) { function loadImportContent(result, stmt, filename, options, state) { const atRule = stmt.node - const { media } = stmt + const { media, layer } = stmt if (options.skipDuplicates) { // skip files already imported at the same scope if ( @@ -287,7 +330,7 @@ function AtImport(options) { } // recursion: import @import from imported file - return parseStyles(result, styles, options, state, media) + return parseStyles(result, styles, options, state, media, layer) }) } ) diff --git a/lib/join-layer.js b/lib/join-layer.js new file mode 100644 index 00000000..9d915193 --- /dev/null +++ b/lib/join-layer.js @@ -0,0 +1,9 @@ +"use strict" + +module.exports = function (parentLayer, childLayer) { + if (!parentLayer.length && childLayer.length) return childLayer + if (parentLayer.length && !childLayer.length) return parentLayer + if (!parentLayer.length && !childLayer.length) return [] + + return parentLayer.concat(childLayer) +} diff --git a/lib/parse-statements.js b/lib/parse-statements.js index 59bb4274..0c94e5a4 100644 --- a/lib/parse-statements.js +++ b/lib/parse-statements.js @@ -38,6 +38,7 @@ module.exports = function (result, styles) { type: "nodes", nodes, media: [], + layer: [], }) nodes = [] } @@ -50,6 +51,7 @@ module.exports = function (result, styles) { type: "nodes", nodes, media: [], + layer: [], }) } @@ -62,6 +64,7 @@ function parseMedia(result, atRule) { type: "media", node: atRule, media: split(params, 0), + layer: [], } } @@ -75,6 +78,7 @@ function parseCharset(result, atRule) { type: "charset", node: atRule, media: [], + layer: [], } } @@ -85,10 +89,12 @@ function parseImport(result, atRule) { if ( prev.type !== "comment" && (prev.type !== "atrule" || - (prev.name !== "import" && prev.name !== "charset")) + (prev.name !== "import" && + prev.name !== "charset" && + !(prev.name === "layer" && !prev.nodes))) ) { return result.warn( - "@import must precede all other statements (besides @charset)", + "@import must precede all other statements (besides @charset or empty @layer)", { node: atRule } ) } @@ -109,6 +115,7 @@ function parseImport(result, atRule) { type: "import", node: atRule, media: [], + layer: [], } // prettier-ignore @@ -134,11 +141,31 @@ function parseImport(result, atRule) { else stmt.uri = params[0].nodes[0].value stmt.fullUri = stringify(params[0]) - if (params.length > 2) { - if (params[1].type !== "space") { + let remainder = params + if (remainder.length > 2) { + if ( + (remainder[2].type === "word" || remainder[2].type === "function") && + remainder[2].value === "layer" + ) { + if (remainder[1].type !== "space") { + return result.warn("Invalid import layer statement", { node: atRule }) + } + + if (remainder[2].nodes) { + stmt.layer = [stringify(remainder[2].nodes)] + } else { + stmt.layer = [""] + } + remainder = remainder.slice(2) + } + } + + if (remainder.length > 2) { + if (remainder[1].type !== "space") { return result.warn("Invalid import media statement", { node: atRule }) } - stmt.media = split(params, 2) + + stmt.media = split(remainder, 2) } return stmt diff --git a/test/fixtures/imports/foo-layered.css b/test/fixtures/imports/foo-layered.css new file mode 100755 index 00000000..30f6252e --- /dev/null +++ b/test/fixtures/imports/foo-layered.css @@ -0,0 +1,3 @@ +@layer foo { + foo {} +} diff --git a/test/fixtures/layer.css b/test/fixtures/layer.css new file mode 100644 index 00000000..1d1c59a4 --- /dev/null +++ b/test/fixtures/layer.css @@ -0,0 +1,10 @@ +@layer layer-alpha, layer-beta.one; + +@import "foo.css" layer; +@import 'bar.css' layer(bar); +@import 'bar.css' layer(bar) level-1 and level-2; +@import url(baz.css) layer; +@import url("foobar.css") layer(foobar); +@import url("foo-layered.css") layer(foo-layered); + +content{} diff --git a/test/fixtures/layer.expected.css b/test/fixtures/layer.expected.css new file mode 100644 index 00000000..0a189869 --- /dev/null +++ b/test/fixtures/layer.expected.css @@ -0,0 +1,24 @@ +@layer layer-alpha, layer-beta.one; +@layer{ +foo{} +} +@layer bar{ +bar{} +} +@media level-1 and level-2{ +@layer bar{ +bar{} +} +} +@layer{ +baz{} +} +@layer foobar{ +foobar{} +} +@layer foo-layered{ +@layer foo { + foo {} +} +} +content{} diff --git a/test/layer.js b/test/layer.js new file mode 100644 index 00000000..1b50f4c5 --- /dev/null +++ b/test/layer.js @@ -0,0 +1,8 @@ +"use strict" +// external tooling +const test = require("ava") + +// internal tooling +const checkFixture = require("./helpers/check-fixture") + +test("should resolve layers of import statements", checkFixture, "layer") diff --git a/test/lint.js b/test/lint.js index 7e65c098..71a7c3b5 100644 --- a/test/lint.js +++ b/test/lint.js @@ -18,7 +18,7 @@ test("should warn when not @charset and not @import statement before", t => { t.is(warnings.length, 1) t.is( warnings[0].text, - "@import must precede all other statements (besides @charset)" + "@import must precede all other statements (besides @charset or empty @layer)" ) }) }) @@ -39,12 +39,36 @@ test("should warn about all imports after some other CSS declaration", t => { result.warnings().forEach(warning => { t.is( warning.text, - "@import must precede all other statements (besides @charset)" + "@import must precede all other statements (besides @charset or empty @layer)" ) }) }) }) +test("should warn if non-empty @layer before @import", t => { + return processor + .process(`@layer { a {} } @import "a.css";`, { from: undefined }) + .then(result => { + t.plan(1) + result.warnings().forEach(warning => { + t.is( + warning.text, + "@import must precede all other statements (besides @charset or empty @layer)" + ) + }) + }) +}) + +test("should not warn if empty @layer before @import", t => { + return processor + .process(`@layer a; @import "";`, { from: undefined }) + .then(result => { + const warnings = result.warnings() + t.is(warnings.length, 1) + t.is(warnings[0].text, `Unable to find uri in '@import ""'`) + }) +}) + test("should not warn if comments before @import", t => { return processor .process(`/* skipped comment */ @import "";`, { from: undefined }) From ca66f67c9c2643f3de226f48d897c282c26389cf Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 22 Mar 2022 10:58:22 -0400 Subject: [PATCH 60/82] Update actions/checkout action to v3 (#485) Co-authored-by: Renovate Bot --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 9ba7fbd8..5c2f83c7 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -12,7 +12,7 @@ jobs: matrix: node-version: [10.x, 12.x, 14.x, 16.x, 17.x] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v2 with: From eaf609976a64775a619cb26e58dce4f39e114f1a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 22 Mar 2022 10:58:34 -0400 Subject: [PATCH 61/82] Update actions/setup-node action to v3 (#486) Co-authored-by: Renovate Bot --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 5c2f83c7..e49ad26e 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -14,7 +14,7 @@ jobs: steps: - uses: actions/checkout@v3 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v2 + uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} - run: npm install From 1557315e2c3f4184b4307caeea7e459b76f25b9b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 22 Mar 2022 11:02:17 -0400 Subject: [PATCH 62/82] Update dependency prettier to ~2.6.0 (#488) Co-authored-by: Renovate Bot --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 18aeba09..1a5e5fad 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "eslint-plugin-prettier": "^4.0.0", "postcss": "^8.0.0", "postcss-scss": "^4.0.0", - "prettier": "~2.5.0", + "prettier": "~2.6.0", "sugarss": "^4.0.0" }, "peerDependencies": { From 1c215c02b8dbf1688f363c9e34037ca91b9d71fa Mon Sep 17 00:00:00 2001 From: Ryan Zimmerman Date: Tue, 22 Mar 2022 11:10:15 -0400 Subject: [PATCH 63/82] 14.1.0 --- CHANGELOG.md | 4 ++++ package.json | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 839cc166..fb836eac 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +# 14.1.0 / 2022-03-22 + +- Add `@layer` support ([#483](https://github.com/postcss/postcss-import/pull/483)) + # 14.0.2 / 2021-05-10 - Remove remaining direct import of `postcss` package ([#455](https://github.com/postcss/postcss-import/issues/455), [#456](https://github.com/postcss/postcss-import/pull/456)) diff --git a/package.json b/package.json index 1a5e5fad..46767be8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "postcss-import", - "version": "14.0.2", + "version": "14.1.0", "description": "PostCSS plugin to import CSS files", "keywords": [ "css", From ee6063f452efb80ca8b3da055f787b5f3b6ef652 Mon Sep 17 00:00:00 2001 From: Romain Menke <11521496+romainmenke@users.noreply.github.com> Date: Tue, 22 Mar 2022 17:25:25 +0100 Subject: [PATCH 64/82] Update readme with layer example (#489) --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index f0ce11ec..f7e2ac28 100644 --- a/README.md +++ b/README.md @@ -81,6 +81,8 @@ postcss() @import "bar.css" (min-width: 25em); +@import 'baz.css' layer(baz-layer); + body { background: black; } @@ -98,6 +100,10 @@ will give you: /* ... content of css/bar.css */ } +@layer baz-layer { +/* ... content of css/baz.css */ +} + body { background: black; } From 64867f47ebc885367de226fc582721c463d00db6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 21 Jun 2022 10:04:40 -0400 Subject: [PATCH 65/82] Update dependency prettier to ~2.7.0 (#494) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 46767be8..9f308073 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "eslint-plugin-prettier": "^4.0.0", "postcss": "^8.0.0", "postcss-scss": "^4.0.0", - "prettier": "~2.6.0", + "prettier": "~2.7.0", "sugarss": "^4.0.0" }, "peerDependencies": { From 64dd1c2991e055233876c1c0525bfaef7870d320 Mon Sep 17 00:00:00 2001 From: Romain Menke <11521496+romainmenke@users.noreply.github.com> Date: Tue, 30 Aug 2022 21:45:34 +0200 Subject: [PATCH 66/82] Fix import with layer; add nameLayer option (#496) * fix import with layer * one more fix * remove unreachable code * fix anonymous layers * fix anonymous layers * basic implementation * add warning * cleanup and more tests * use the rootFilename --- README.md | 11 ++ index.js | 76 ++++++++++- test/fixtures/imports/layer-anonymous.css | 33 +++++ .../imports/layer-level-2-anonymous.css | 7 + test/fixtures/imports/layer-level-2.css | 7 + test/fixtures/imports/layer-level-3.css | 5 + test/fixtures/imports/layer-rule-grouping.css | 13 ++ test/fixtures/imports/layer.css | 33 +++++ .../layer-import-atrules-anonymous.css | 3 + ...ayer-import-atrules-anonymous.expected.css | 127 ++++++++++++++++++ test/fixtures/layer-import-atrules.css | 3 + .../layer-import-atrules.expected.css | 127 ++++++++++++++++++ test/fixtures/layer-rule-grouping.css | 6 + .../fixtures/layer-rule-grouping.expected.css | 88 ++++++++++++ test/fixtures/layer.css | 4 +- test/fixtures/layer.expected.css | 4 +- test/layer.js | 72 ++++++++++ 17 files changed, 608 insertions(+), 11 deletions(-) create mode 100644 test/fixtures/imports/layer-anonymous.css create mode 100644 test/fixtures/imports/layer-level-2-anonymous.css create mode 100644 test/fixtures/imports/layer-level-2.css create mode 100644 test/fixtures/imports/layer-level-3.css create mode 100644 test/fixtures/imports/layer-rule-grouping.css create mode 100644 test/fixtures/imports/layer.css create mode 100644 test/fixtures/layer-import-atrules-anonymous.css create mode 100644 test/fixtures/layer-import-atrules-anonymous.expected.css create mode 100644 test/fixtures/layer-import-atrules.css create mode 100644 test/fixtures/layer-import-atrules.expected.css create mode 100644 test/fixtures/layer-rule-grouping.css create mode 100644 test/fixtures/layer-rule-grouping.expected.css diff --git a/README.md b/README.md index f7e2ac28..ac0148e1 100644 --- a/README.md +++ b/README.md @@ -190,6 +190,17 @@ This option is only for adding additional directories to default resolver. If you provide your own resolver via the `resolve` configuration option above, then this value will be ignored. +#### `nameLayer` + +Type: `Function` +Default: `null` + +You can provide a custom naming function for anonymous layers (`@import 'baz.css' layer;`). +This function gets `(index, rootFilename)` arguments and should return a unique string. + +This option only influences imports without a layer name. +Without this option the plugin will warn on anonymous layers. + #### Example with some options ```js diff --git a/index.js b/index.js index e6a3dc33..6cb912e1 100755 --- a/index.js +++ b/index.js @@ -19,6 +19,7 @@ function AtImport(options) { load: loadContent, plugins: [], addModulesDirectories: [], + nameLayer: null, ...options, } @@ -37,9 +38,12 @@ function AtImport(options) { const state = { importedFiles: {}, hashFiles: {}, + rootFilename: null, + anonymousLayerCounter: 0, } if (styles.source && styles.source.input && styles.source.input.file) { + state.rootFilename = styles.source.input.file state.importedFiles[styles.source.input.file] = {} } @@ -47,6 +51,10 @@ function AtImport(options) { throw new Error("plugins option must be an array") } + if (options.nameLayer && typeof options.nameLayer !== "function") { + throw new Error("nameLayer option must be a function") + } + return parseStyles(result, styles, options, state, [], []).then( bundle => { applyRaws(bundle) @@ -81,7 +89,30 @@ function AtImport(options) { if (stmt.type === "import") { stmt.node.params = `${stmt.fullUri} ${stmt.media.join(", ")}` } else if (stmt.type === "media") { - stmt.node.params = stmt.media.join(", ") + if (stmt.layer.length) { + const layerNode = atRule({ + name: "layer", + params: stmt.layer.filter(layer => layer !== "").join("."), + source: stmt.node.source, + }) + + if (stmt.parentMedia && stmt.parentMedia.length) { + const mediaNode = atRule({ + name: "media", + params: stmt.parentMedia.join(", "), + source: stmt.node.source, + }) + + mediaNode.append(layerNode) + layerNode.append(stmt.node) + stmt.node = mediaNode + } else { + layerNode.append(stmt.node) + stmt.node = layerNode + } + } else { + stmt.node.params = stmt.media.join(", ") + } } else { const { nodes } = stmt const { parent } = nodes[0] @@ -170,6 +201,7 @@ function AtImport(options) { return stmts.reduce((promise, stmt) => { return promise.then(() => { stmt.media = joinMedia(media, stmt.media || []) + stmt.parentMedia = media stmt.layer = joinLayer(layer, stmt.layer || []) // skip protocol base uri (protocol://url) or protocol-relative @@ -283,18 +315,38 @@ function AtImport(options) { function loadImportContent(result, stmt, filename, options, state) { const atRule = stmt.node const { media, layer } = stmt + layer.forEach((layerPart, i) => { + if (layerPart === "") { + if (options.nameLayer) { + layer[i] = options + .nameLayer(state.anonymousLayerCounter++, state.rootFilename) + .toString() + } else { + throw atRule.error( + `When using anonymous layers in @import you must also set the "nameLayer" plugin option` + ) + } + } + }) + if (options.skipDuplicates) { // skip files already imported at the same scope if ( state.importedFiles[filename] && - state.importedFiles[filename][media] + state.importedFiles[filename][media] && + state.importedFiles[filename][media][layer] ) { return } // save imported files to skip them next time - if (!state.importedFiles[filename]) state.importedFiles[filename] = {} - state.importedFiles[filename][media] = true + if (!state.importedFiles[filename]) { + state.importedFiles[filename] = {} + } + if (!state.importedFiles[filename][media]) { + state.importedFiles[filename][media] = {} + } + state.importedFiles[filename][media][layer] = true } return Promise.resolve(options.load(filename, options)).then( @@ -305,8 +357,13 @@ function AtImport(options) { } // skip previous imported files not containing @import rules - if (state.hashFiles[content] && state.hashFiles[content][media]) + if ( + state.hashFiles[content] && + state.hashFiles[content][media] && + state.hashFiles[content][media][layer] + ) { return + } return processContent( result, @@ -324,8 +381,13 @@ function AtImport(options) { }) if (!hasImport) { // save hash files to skip them next time - if (!state.hashFiles[content]) state.hashFiles[content] = {} - state.hashFiles[content][media] = true + if (!state.hashFiles[content]) { + state.hashFiles[content] = {} + } + if (!state.hashFiles[content][media]) { + state.hashFiles[content][media] = {} + } + state.hashFiles[content][media][layer] = true } } diff --git a/test/fixtures/imports/layer-anonymous.css b/test/fixtures/imports/layer-anonymous.css new file mode 100644 index 00000000..589aeeb1 --- /dev/null +++ b/test/fixtures/imports/layer-anonymous.css @@ -0,0 +1,33 @@ +@import url("layer-level-2-anonymous.css") layer; + +body { + order: 1; +} + +@media (min-width: 50rem) { + body { + order: 2; + } +} + +@keyframes RED_TO_BLUE { + 0% { + background-color: red; + } + 100% { + background-color: blue; + } +} + +@supports (display: grid) { + body { + display: grid; + order: 3; + } +} + +@layer A { + body { + order: 4; + } +} diff --git a/test/fixtures/imports/layer-level-2-anonymous.css b/test/fixtures/imports/layer-level-2-anonymous.css new file mode 100644 index 00000000..36d69c28 --- /dev/null +++ b/test/fixtures/imports/layer-level-2-anonymous.css @@ -0,0 +1,7 @@ +@import url("layer-level-3.css") layer (min-width: 320px); + +@layer Y { + body { + color: purple; + } +} diff --git a/test/fixtures/imports/layer-level-2.css b/test/fixtures/imports/layer-level-2.css new file mode 100644 index 00000000..8ec5e25b --- /dev/null +++ b/test/fixtures/imports/layer-level-2.css @@ -0,0 +1,7 @@ +@import url("layer-level-3.css") layer(level-3) (min-width: 320px); + +@layer Y { + body { + color: purple; + } +} diff --git a/test/fixtures/imports/layer-level-3.css b/test/fixtures/imports/layer-level-3.css new file mode 100644 index 00000000..1567ae96 --- /dev/null +++ b/test/fixtures/imports/layer-level-3.css @@ -0,0 +1,5 @@ +@layer Z { + body { + color: cyan; + } +} diff --git a/test/fixtures/imports/layer-rule-grouping.css b/test/fixtures/imports/layer-rule-grouping.css new file mode 100644 index 00000000..c3febe5e --- /dev/null +++ b/test/fixtures/imports/layer-rule-grouping.css @@ -0,0 +1,13 @@ +rule-one {} + +rule-two {} + +@media (min-width: 50rem) { + rule-three {} + + rule-four {} +} + +rule-five {} + +rule-six {} diff --git a/test/fixtures/imports/layer.css b/test/fixtures/imports/layer.css new file mode 100644 index 00000000..9e554b76 --- /dev/null +++ b/test/fixtures/imports/layer.css @@ -0,0 +1,33 @@ +@import url("layer-level-2.css") layer(level-2); + +body { + order: 1; +} + +@media (min-width: 50rem) { + body { + order: 2; + } +} + +@keyframes RED_TO_BLUE { + 0% { + background-color: red; + } + 100% { + background-color: blue; + } +} + +@supports (display: grid) { + body { + display: grid; + order: 3; + } +} + +@layer A { + body { + order: 4; + } +} diff --git a/test/fixtures/layer-import-atrules-anonymous.css b/test/fixtures/layer-import-atrules-anonymous.css new file mode 100644 index 00000000..f2d93560 --- /dev/null +++ b/test/fixtures/layer-import-atrules-anonymous.css @@ -0,0 +1,3 @@ +@import url("layer-anonymous.css") layer screen; + +@import url("layer-anonymous.css") layer; diff --git a/test/fixtures/layer-import-atrules-anonymous.expected.css b/test/fixtures/layer-import-atrules-anonymous.expected.css new file mode 100644 index 00000000..be1df273 --- /dev/null +++ b/test/fixtures/layer-import-atrules-anonymous.expected.css @@ -0,0 +1,127 @@ +@media screen and (min-width: 320px) { +@layer import-anon-layer-0.import-anon-layer-1.import-anon-layer-2 { +@layer Z { + body { + color: cyan; + } +} +} +} + +@media screen { +@layer import-anon-layer-0.import-anon-layer-1 { + +@layer Y { + body { + color: purple; + } +} +} +} + +@media screen { +@layer import-anon-layer-0 { + +body { + order: 1; +} +} +} + +@media screen { +@layer import-anon-layer-0 { + +@media (min-width: 50rem) { + body { + order: 2; + } +} +} +} + +@media screen { +@layer import-anon-layer-0 { + +@keyframes RED_TO_BLUE { + 0% { + background-color: red; + } + 100% { + background-color: blue; + } +} + +@supports (display: grid) { + body { + display: grid; + order: 3; + } +} + +@layer A { + body { + order: 4; + } +} +} +} + +@media (min-width: 320px) { +@layer import-anon-layer-3.import-anon-layer-4.import-anon-layer-5 { +@layer Z { + body { + color: cyan; + } +} +} +} + +@layer import-anon-layer-3.import-anon-layer-4 { + +@layer Y { + body { + color: purple; + } +} +} + +@layer import-anon-layer-3 { + +body { + order: 1; +} +} + +@layer import-anon-layer-3 { + +@media (min-width: 50rem) { + body { + order: 2; + } +} +} + +@layer import-anon-layer-3 { + +@keyframes RED_TO_BLUE { + 0% { + background-color: red; + } + 100% { + background-color: blue; + } +} + +@supports (display: grid) { + body { + display: grid; + order: 3; + } +} + +@layer A { + body { + order: 4; + } +} +} diff --git a/test/fixtures/layer-import-atrules.css b/test/fixtures/layer-import-atrules.css new file mode 100644 index 00000000..dab4c0e7 --- /dev/null +++ b/test/fixtures/layer-import-atrules.css @@ -0,0 +1,3 @@ +@import url("layer.css") layer(imported-with-media) screen; + +@import url("layer.css") layer(imported-without-media); diff --git a/test/fixtures/layer-import-atrules.expected.css b/test/fixtures/layer-import-atrules.expected.css new file mode 100644 index 00000000..e4d6c195 --- /dev/null +++ b/test/fixtures/layer-import-atrules.expected.css @@ -0,0 +1,127 @@ +@media screen and (min-width: 320px) { +@layer imported-with-media.level-2.level-3 { +@layer Z { + body { + color: cyan; + } +} +} +} + +@media screen { +@layer imported-with-media.level-2 { + +@layer Y { + body { + color: purple; + } +} +} +} + +@media screen { +@layer imported-with-media { + +body { + order: 1; +} +} +} + +@media screen { +@layer imported-with-media { + +@media (min-width: 50rem) { + body { + order: 2; + } +} +} +} + +@media screen { +@layer imported-with-media { + +@keyframes RED_TO_BLUE { + 0% { + background-color: red; + } + 100% { + background-color: blue; + } +} + +@supports (display: grid) { + body { + display: grid; + order: 3; + } +} + +@layer A { + body { + order: 4; + } +} +} +} + +@media (min-width: 320px) { +@layer imported-without-media.level-2.level-3 { +@layer Z { + body { + color: cyan; + } +} +} +} + +@layer imported-without-media.level-2 { + +@layer Y { + body { + color: purple; + } +} +} + +@layer imported-without-media { + +body { + order: 1; +} +} + +@layer imported-without-media { + +@media (min-width: 50rem) { + body { + order: 2; + } +} +} + +@layer imported-without-media { + +@keyframes RED_TO_BLUE { + 0% { + background-color: red; + } + 100% { + background-color: blue; + } +} + +@supports (display: grid) { + body { + display: grid; + order: 3; + } +} + +@layer A { + body { + order: 4; + } +} +} diff --git a/test/fixtures/layer-rule-grouping.css b/test/fixtures/layer-rule-grouping.css new file mode 100644 index 00000000..afa489e5 --- /dev/null +++ b/test/fixtures/layer-rule-grouping.css @@ -0,0 +1,6 @@ +@import url("layer-rule-grouping.css") screen; + +@import url("layer-rule-grouping.css") layer; +@import url("layer-rule-grouping.css") layer; + +@import url("layer-rule-grouping.css") layer(named); diff --git a/test/fixtures/layer-rule-grouping.expected.css b/test/fixtures/layer-rule-grouping.expected.css new file mode 100644 index 00000000..a4e34d0e --- /dev/null +++ b/test/fixtures/layer-rule-grouping.expected.css @@ -0,0 +1,88 @@ +@media screen { + +rule-one {} + +rule-two {} +} + +@media screen and (min-width: 50rem) { + rule-three {} + + rule-four {} +} + +@media screen { + +rule-five {} + +rule-six {} +} + +@layer import-anon-layer-0 { + +rule-one {} + +rule-two {} +} + +@layer import-anon-layer-0 { + +@media (min-width: 50rem) { + rule-three {} + + rule-four {} +} +} + +@layer import-anon-layer-0 { + +rule-five {} + +rule-six {} +} + +@layer import-anon-layer-1 { + +rule-one {} + +rule-two {} +} + +@layer import-anon-layer-1 { + +@media (min-width: 50rem) { + rule-three {} + + rule-four {} +} +} + +@layer import-anon-layer-1 { + +rule-five {} + +rule-six {} +} + +@layer named { + +rule-one {} + +rule-two {} +} + +@layer named { + +@media (min-width: 50rem) { + rule-three {} + + rule-four {} +} +} + +@layer named { + +rule-five {} + +rule-six {} +} diff --git a/test/fixtures/layer.css b/test/fixtures/layer.css index 1d1c59a4..b9894dab 100644 --- a/test/fixtures/layer.css +++ b/test/fixtures/layer.css @@ -1,9 +1,9 @@ @layer layer-alpha, layer-beta.one; -@import "foo.css" layer; +@import "foo.css" layer(foo); @import 'bar.css' layer(bar); @import 'bar.css' layer(bar) level-1 and level-2; -@import url(baz.css) layer; +@import url(baz.css) layer(baz); @import url("foobar.css") layer(foobar); @import url("foo-layered.css") layer(foo-layered); diff --git a/test/fixtures/layer.expected.css b/test/fixtures/layer.expected.css index 0a189869..bc73a558 100644 --- a/test/fixtures/layer.expected.css +++ b/test/fixtures/layer.expected.css @@ -1,5 +1,5 @@ @layer layer-alpha, layer-beta.one; -@layer{ +@layer foo{ foo{} } @layer bar{ @@ -10,7 +10,7 @@ bar{} bar{} } } -@layer{ +@layer baz{ baz{} } @layer foobar{ diff --git a/test/layer.js b/test/layer.js index 1b50f4c5..69d27afd 100644 --- a/test/layer.js +++ b/test/layer.js @@ -1,8 +1,80 @@ "use strict" // external tooling const test = require("ava") +const postcss = require("postcss") + +const crypto = require("crypto") +const cwd = process.cwd() + +// plugin +const atImport = require("..") // internal tooling const checkFixture = require("./helpers/check-fixture") test("should resolve layers of import statements", checkFixture, "layer") + +test( + "should correctly wrap imported at rules in layers", + checkFixture, + "layer-import-atrules", + { + nameLayer: hashLayerName, + } +) + +test( + "should correctly wrap imported at rules in anonymous layers", + checkFixture, + "layer-import-atrules-anonymous", + { + nameLayer: hashLayerName, + } +) + +test("should group rules", checkFixture, "layer-rule-grouping", { + nameLayer: hashLayerName, +}) + +test("should pass the root file name to the nameLayer function", t => { + return postcss() + .use(atImport({ path: "test/fixtures/imports", nameLayer: hashLayerName })) + .process('@import "foo.css" layer;', { from: "layer.css" }) + .then(result => { + t.is(result.css, `@layer import-anon-layer-52ff1597784c{\nfoo{}\n}`) + }) +}) + +test("should error when value is not a function", t => { + return postcss() + .use(atImport({ nameLayer: "not a function" })) + .process("", { from: undefined }) + .catch(error => t.is(error.message, "nameLayer option must be a function")) +}) + +test("should throw when using anonymous layers without the nameLayer plugin option", t => { + return postcss() + .use(atImport({ path: "test/fixtures/imports" })) + .process('@import "foo.css" layer;', { from: undefined }) + .catch(err => { + t.is( + err.message, + 'postcss-import: :1:1: When using anonymous layers in @import you must also set the "nameLayer" plugin option' + ) + }) +}) + +function hashLayerName(index, rootFilename) { + if (!rootFilename) { + return `import-anon-layer-${index}` + } + + // A stable, deterministic and unique layer name: + // - layer index + // - relative rootFilename to current working directory + return `import-anon-layer-${crypto + .createHash("sha256") + .update(`${index}-${rootFilename.split(cwd)[1]}`) + .digest("hex") + .slice(0, 12)}` +} From 9aa378abf8f1cb2072d54b531e444dad0b1d6db4 Mon Sep 17 00:00:00 2001 From: Ryan Zimmerman <17342435+RyanZim@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:02:16 -0400 Subject: [PATCH 67/82] BREAKING: Require Node v14+ (#497) --- .github/workflows/ci.yaml | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index e49ad26e..209586cc 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - node-version: [10.x, 12.x, 14.x, 16.x, 17.x] + node-version: [14.x, 16.x, 18.x] steps: - uses: actions/checkout@v3 - name: Use Node.js ${{ matrix.node-version }} diff --git a/package.json b/package.json index 9f308073..caa71df2 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "lib" ], "engines": { - "node": ">=10.0.0" + "node": ">=14.0.0" }, "dependencies": { "postcss-value-parser": "^4.0.0", From 2ee943e9982e987f76ee5e44ede47a74f3455d0f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:05:27 -0400 Subject: [PATCH 68/82] Update eslint & eslint-config-problems (#474) Co-authored-by: Ryan Zimmerman <17342435+RyanZim@users.noreply.github.com> --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index caa71df2..0ac81d0c 100644 --- a/package.json +++ b/package.json @@ -27,8 +27,8 @@ }, "devDependencies": { "ava": "^3.0.0", - "eslint": "^7.0.0", - "eslint-config-problems": "^5.0.0", + "eslint": "^8.2.0", + "eslint-config-problems": "^6.0.0", "eslint-plugin-prettier": "^4.0.0", "postcss": "^8.0.0", "postcss-scss": "^4.0.0", From 3a36a19536d502fe27bb0d32c4ae700a6e592307 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:07:00 -0400 Subject: [PATCH 69/82] Update dependency ava to v4 (#478) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0ac81d0c..c676855b 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "resolve": "^1.1.7" }, "devDependencies": { - "ava": "^3.0.0", + "ava": "^4.0.0", "eslint": "^8.2.0", "eslint-config-problems": "^6.0.0", "eslint-plugin-prettier": "^4.0.0", From 5493a614d853f4abb6c09cf28fa8acad0342b2a8 Mon Sep 17 00:00:00 2001 From: Ryan Zimmerman Date: Tue, 30 Aug 2022 16:20:52 -0400 Subject: [PATCH 70/82] Use optional chaining syntax --- index.js | 18 +++++------------- lib/process-content.js | 2 +- 2 files changed, 6 insertions(+), 14 deletions(-) diff --git a/index.js b/index.js index 6cb912e1..8c881703 100755 --- a/index.js +++ b/index.js @@ -42,7 +42,7 @@ function AtImport(options) { anonymousLayerCounter: 0, } - if (styles.source && styles.source.input && styles.source.input.file) { + if (styles.source?.input?.file) { state.rootFilename = styles.source.input.file state.importedFiles[styles.source.input.file] = {} } @@ -96,7 +96,7 @@ function AtImport(options) { source: stmt.node.source, }) - if (stmt.parentMedia && stmt.parentMedia.length) { + if (stmt.parentMedia?.length) { const mediaNode = atRule({ name: "media", params: stmt.parentMedia.join(", "), @@ -268,7 +268,7 @@ function AtImport(options) { function resolveImportId(result, stmt, options, state) { const atRule = stmt.node let sourceFile - if (atRule.source && atRule.source.input && atRule.source.input.file) { + if (atRule.source?.input?.file) { sourceFile = atRule.source.input.file } const base = sourceFile @@ -331,11 +331,7 @@ function AtImport(options) { if (options.skipDuplicates) { // skip files already imported at the same scope - if ( - state.importedFiles[filename] && - state.importedFiles[filename][media] && - state.importedFiles[filename][media][layer] - ) { + if (state.importedFiles[filename]?.[media]?.[layer]) { return } @@ -357,11 +353,7 @@ function AtImport(options) { } // skip previous imported files not containing @import rules - if ( - state.hashFiles[content] && - state.hashFiles[content][media] && - state.hashFiles[content][media][layer] - ) { + if (state.hashFiles[content]?.[media]?.[layer]) { return } diff --git a/lib/process-content.js b/lib/process-content.js index beaa3f03..ec413e06 100644 --- a/lib/process-content.js +++ b/lib/process-content.js @@ -30,7 +30,7 @@ module.exports = function processContent( } // Syntax support: - if (result.opts.syntax && result.opts.syntax.parse) { + if (result.opts.syntax?.parse) { parserList.push(result.opts.syntax.parse) } From e2ed4833cdb5c67cd5c8fe33831d1a7afec2b988 Mon Sep 17 00:00:00 2001 From: Ryan Zimmerman Date: Tue, 30 Aug 2022 16:23:39 -0400 Subject: [PATCH 71/82] Disable package-lock.json --- .npmrc | 1 + 1 file changed, 1 insertion(+) create mode 100644 .npmrc diff --git a/.npmrc b/.npmrc new file mode 100644 index 00000000..43c97e71 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +package-lock=false From 4e8feca173050e5c437812d9b3ddf9d7bb82e72b Mon Sep 17 00:00:00 2001 From: Ryan Zimmerman Date: Tue, 30 Aug 2022 18:29:43 -0400 Subject: [PATCH 72/82] 15.0.0 --- CHANGELOG.md | 6 ++++++ package.json | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fb836eac..982a64af 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +# 15.0.0 / 2022-08-30 + +- **BREAKING:** Require Node.js v14+ ([#497](https://github.com/postcss/postcss-import/pull/497)) +- **BREAKING:** Require `nameLayer` option for handling anonymous layers ([#496](https://github.com/postcss/postcss-import/pull/496)) +- Fix handling of `@media` queries inside layered imports ([#495](https://github.com/postcss/postcss-import/issues/495), [#496](https://github.com/postcss/postcss-import/pull/496)) + # 14.1.0 / 2022-03-22 - Add `@layer` support ([#483](https://github.com/postcss/postcss-import/pull/483)) diff --git a/package.json b/package.json index c676855b..290f994b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "postcss-import", - "version": "14.1.0", + "version": "15.0.0", "description": "PostCSS plugin to import CSS files", "keywords": [ "css", From 11922cd7232b548a1f1e5c751a74a7c647a676fb Mon Sep 17 00:00:00 2001 From: Romain Menke <11521496+romainmenke@users.noreply.github.com> Date: Fri, 30 Sep 2022 20:51:30 +0200 Subject: [PATCH 73/82] Update tests results for postcss v8.4.17 (#503) --- test/fixtures/duplicates.expected.css | 1 + .../fixtures/layer-import-atrules-anonymous.expected.css | 1 + test/fixtures/layer-import-atrules.expected.css | 1 + test/fixtures/layer-rule-grouping.expected.css | 2 -- test/fixtures/layer.expected.css | 9 +++++++++ test/fixtures/no-duplicate.expected.css | 5 +++++ 6 files changed, 17 insertions(+), 2 deletions(-) diff --git a/test/fixtures/duplicates.expected.css b/test/fixtures/duplicates.expected.css index f736160e..7fd1266a 100644 --- a/test/fixtures/duplicates.expected.css +++ b/test/fixtures/duplicates.expected.css @@ -2,6 +2,7 @@ foo{} foo{} foo{} @media screen{ + foo{} } @media screen{ diff --git a/test/fixtures/layer-import-atrules-anonymous.expected.css b/test/fixtures/layer-import-atrules-anonymous.expected.css index be1df273..535340db 100644 --- a/test/fixtures/layer-import-atrules-anonymous.expected.css +++ b/test/fixtures/layer-import-atrules-anonymous.expected.css @@ -68,6 +68,7 @@ body { @media (min-width: 320px) { @layer import-anon-layer-3.import-anon-layer-4.import-anon-layer-5 { + @layer Z { body { color: cyan; diff --git a/test/fixtures/layer-import-atrules.expected.css b/test/fixtures/layer-import-atrules.expected.css index e4d6c195..32ed337d 100644 --- a/test/fixtures/layer-import-atrules.expected.css +++ b/test/fixtures/layer-import-atrules.expected.css @@ -68,6 +68,7 @@ body { @media (min-width: 320px) { @layer imported-without-media.level-2.level-3 { + @layer Z { body { color: cyan; diff --git a/test/fixtures/layer-rule-grouping.expected.css b/test/fixtures/layer-rule-grouping.expected.css index a4e34d0e..5c16c56a 100644 --- a/test/fixtures/layer-rule-grouping.expected.css +++ b/test/fixtures/layer-rule-grouping.expected.css @@ -1,5 +1,4 @@ @media screen { - rule-one {} rule-two {} @@ -42,7 +41,6 @@ rule-six {} } @layer import-anon-layer-1 { - rule-one {} rule-two {} diff --git a/test/fixtures/layer.expected.css b/test/fixtures/layer.expected.css index bc73a558..224032f4 100644 --- a/test/fixtures/layer.expected.css +++ b/test/fixtures/layer.expected.css @@ -1,24 +1,33 @@ @layer layer-alpha, layer-beta.one; + @layer foo{ + foo{} } + @layer bar{ bar{} } + @media level-1 and level-2{ + @layer bar{ bar{} } } + @layer baz{ baz{} } + @layer foobar{ foobar{} } + @layer foo-layered{ @layer foo { foo {} } } + content{} diff --git a/test/fixtures/no-duplicate.expected.css b/test/fixtures/no-duplicate.expected.css index 82382a1e..bc472710 100644 --- a/test/fixtures/no-duplicate.expected.css +++ b/test/fixtures/no-duplicate.expected.css @@ -1,7 +1,12 @@ foo{} + @media screen{ + foo{} } + proxy {} + import {} + content{} From 9f6376bf1abdba21e4c6c9d87945f62bff4db35d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 11 Oct 2022 11:05:27 -0400 Subject: [PATCH 74/82] Update dependency eslint-config-problems to v7 (#504) * Update dependency eslint-config-problems to v7 * Fix linter error Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Ryan Zimmerman --- package.json | 2 +- test/import.js | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 290f994b..a94514a3 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "devDependencies": { "ava": "^4.0.0", "eslint": "^8.2.0", - "eslint-config-problems": "^6.0.0", + "eslint-config-problems": "^7.0.0", "eslint-plugin-prettier": "^4.0.0", "postcss": "^8.0.0", "postcss-scss": "^4.0.0", diff --git a/test/import.js b/test/import.js index 4bcafdcd..c13bd769 100644 --- a/test/import.js +++ b/test/import.js @@ -115,7 +115,9 @@ test("inlined @import should keep PostCSS AST references clean", t => { from: undefined, }) .then(result => { - result.root.nodes.forEach(node => t.is(result.root, node.parent)) + result.root.nodes.forEach(node => { + t.is(result.root, node.parent) + }) }) }) From 99d755b17d30cc616c4127ecce7ce9355c8b10d0 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 24 Oct 2022 14:28:10 -0400 Subject: [PATCH 75/82] Update dependency ava to v5 (#506) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a94514a3..f8b9cceb 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "resolve": "^1.1.7" }, "devDependencies": { - "ava": "^4.0.0", + "ava": "^5.0.0", "eslint": "^8.2.0", "eslint-config-problems": "^7.0.0", "eslint-plugin-prettier": "^4.0.0", From 22864f1be6c203e6a2d954a872c68be92b65f63d Mon Sep 17 00:00:00 2001 From: Romain Menke <11521496+romainmenke@users.noreply.github.com> Date: Sun, 13 Nov 2022 00:36:32 +0100 Subject: [PATCH 76/82] Update test results for PostCSS 8.4.19 (#507) --- test/fixtures/duplicates.expected.css | 1 - .../fixtures/layer-import-atrules-anonymous.expected.css | 1 - test/fixtures/layer-import-atrules.expected.css | 1 - test/fixtures/layer-rule-grouping.expected.css | 2 ++ test/fixtures/layer.expected.css | 9 --------- test/fixtures/no-duplicate.expected.css | 5 ----- 6 files changed, 2 insertions(+), 17 deletions(-) diff --git a/test/fixtures/duplicates.expected.css b/test/fixtures/duplicates.expected.css index 7fd1266a..f736160e 100644 --- a/test/fixtures/duplicates.expected.css +++ b/test/fixtures/duplicates.expected.css @@ -2,7 +2,6 @@ foo{} foo{} foo{} @media screen{ - foo{} } @media screen{ diff --git a/test/fixtures/layer-import-atrules-anonymous.expected.css b/test/fixtures/layer-import-atrules-anonymous.expected.css index 535340db..be1df273 100644 --- a/test/fixtures/layer-import-atrules-anonymous.expected.css +++ b/test/fixtures/layer-import-atrules-anonymous.expected.css @@ -68,7 +68,6 @@ body { @media (min-width: 320px) { @layer import-anon-layer-3.import-anon-layer-4.import-anon-layer-5 { - @layer Z { body { color: cyan; diff --git a/test/fixtures/layer-import-atrules.expected.css b/test/fixtures/layer-import-atrules.expected.css index 32ed337d..e4d6c195 100644 --- a/test/fixtures/layer-import-atrules.expected.css +++ b/test/fixtures/layer-import-atrules.expected.css @@ -68,7 +68,6 @@ body { @media (min-width: 320px) { @layer imported-without-media.level-2.level-3 { - @layer Z { body { color: cyan; diff --git a/test/fixtures/layer-rule-grouping.expected.css b/test/fixtures/layer-rule-grouping.expected.css index 5c16c56a..a4e34d0e 100644 --- a/test/fixtures/layer-rule-grouping.expected.css +++ b/test/fixtures/layer-rule-grouping.expected.css @@ -1,4 +1,5 @@ @media screen { + rule-one {} rule-two {} @@ -41,6 +42,7 @@ rule-six {} } @layer import-anon-layer-1 { + rule-one {} rule-two {} diff --git a/test/fixtures/layer.expected.css b/test/fixtures/layer.expected.css index 224032f4..bc73a558 100644 --- a/test/fixtures/layer.expected.css +++ b/test/fixtures/layer.expected.css @@ -1,33 +1,24 @@ @layer layer-alpha, layer-beta.one; - @layer foo{ - foo{} } - @layer bar{ bar{} } - @media level-1 and level-2{ - @layer bar{ bar{} } } - @layer baz{ baz{} } - @layer foobar{ foobar{} } - @layer foo-layered{ @layer foo { foo {} } } - content{} diff --git a/test/fixtures/no-duplicate.expected.css b/test/fixtures/no-duplicate.expected.css index bc472710..82382a1e 100644 --- a/test/fixtures/no-duplicate.expected.css +++ b/test/fixtures/no-duplicate.expected.css @@ -1,12 +1,7 @@ foo{} - @media screen{ - foo{} } - proxy {} - import {} - content{} From 13376a6aae3de5af10943ba97d23ad26359b861c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 23 Nov 2022 11:22:20 -0500 Subject: [PATCH 77/82] Update dependency prettier to ~2.8.0 (#508) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f8b9cceb..659134ba 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "eslint-plugin-prettier": "^4.0.0", "postcss": "^8.0.0", "postcss-scss": "^4.0.0", - "prettier": "~2.7.0", + "prettier": "~2.8.0", "sugarss": "^4.0.0" }, "peerDependencies": { From 2780457f13b9fca632aaa9497326f4a873aac08b Mon Sep 17 00:00:00 2001 From: Romain Menke <11521496+romainmenke@users.noreply.github.com> Date: Thu, 1 Dec 2022 19:13:27 +0100 Subject: [PATCH 78/82] Preserve layer in ignored import statements (#511) Fixes #510 --- index.js | 47 +++++--- lib/assign-layer-names.js | 17 +++ test/fixtures/ignore.css | 4 + test/fixtures/ignore.expected.css | 4 + .../imports/layer-level-2-anonymous.css | 2 + .../layer-import-atrules-anonymous.css | 4 + ...ayer-import-atrules-anonymous.expected.css | 101 +++++++++++++----- 7 files changed, 138 insertions(+), 41 deletions(-) create mode 100644 lib/assign-layer-names.js diff --git a/index.js b/index.js index 8c881703..d14873d9 100755 --- a/index.js +++ b/index.js @@ -9,6 +9,7 @@ const resolveId = require("./lib/resolve-id") const loadContent = require("./lib/load-content") const processContent = require("./lib/process-content") const parseStatements = require("./lib/parse-statements") +const assignLayerNames = require("./lib/assign-layer-names") function AtImport(options) { options = { @@ -86,13 +87,36 @@ function AtImport(options) { return } + if (stmt.layer.length > 1) { + assignLayerNames(stmt.layer, stmt.node, state, options) + } + if (stmt.type === "import") { - stmt.node.params = `${stmt.fullUri} ${stmt.media.join(", ")}` + const parts = [stmt.fullUri] + + const media = stmt.media.join(", ") + + if (stmt.layer.length) { + const layerName = stmt.layer.join(".") + + let layerParams = "layer" + if (layerName) { + layerParams = `layer(${layerName})` + } + + parts.push(layerParams) + } + + if (media) { + parts.push(media) + } + + stmt.node.params = parts.join(" ") } else if (stmt.type === "media") { if (stmt.layer.length) { const layerNode = atRule({ name: "layer", - params: stmt.layer.filter(layer => layer !== "").join("."), + params: stmt.layer.join("."), source: stmt.node.source, }) @@ -128,7 +152,7 @@ function AtImport(options) { const layerNode = atRule({ name: "layer", - params: stmt.layer.filter(layer => layer !== "").join("."), + params: stmt.layer.join("."), source: parent.source, }) @@ -147,7 +171,7 @@ function AtImport(options) { } else if (stmt.layer.length) { const layerNode = atRule({ name: "layer", - params: stmt.layer.filter(layer => layer !== "").join("."), + params: stmt.layer.join("."), source: parent.source, }) @@ -315,19 +339,8 @@ function AtImport(options) { function loadImportContent(result, stmt, filename, options, state) { const atRule = stmt.node const { media, layer } = stmt - layer.forEach((layerPart, i) => { - if (layerPart === "") { - if (options.nameLayer) { - layer[i] = options - .nameLayer(state.anonymousLayerCounter++, state.rootFilename) - .toString() - } else { - throw atRule.error( - `When using anonymous layers in @import you must also set the "nameLayer" plugin option` - ) - } - } - }) + + assignLayerNames(layer, atRule, state, options) if (options.skipDuplicates) { // skip files already imported at the same scope diff --git a/lib/assign-layer-names.js b/lib/assign-layer-names.js new file mode 100644 index 00000000..18cfcc71 --- /dev/null +++ b/lib/assign-layer-names.js @@ -0,0 +1,17 @@ +"use strict" + +module.exports = function (layer, node, state, options) { + layer.forEach((layerPart, i) => { + if (layerPart.trim() === "") { + if (options.nameLayer) { + layer[i] = options + .nameLayer(state.anonymousLayerCounter++, state.rootFilename) + .toString() + } else { + throw node.error( + `When using anonymous layers in @import you must also set the "nameLayer" plugin option` + ) + } + } + }) +} diff --git a/test/fixtures/ignore.css b/test/fixtures/ignore.css index 71a7951e..5f66c649 100644 --- a/test/fixtures/ignore.css +++ b/test/fixtures/ignore.css @@ -12,5 +12,9 @@ @import url("//css"); @import url('//css'); @import url(//css); +@import "http://css" layer; +@import "http://css" layer(bar); +@import "http://css" layer screen and (min-width: 25em), print; +@import "http://css" layer(bar) screen and (min-width: 25em), print; content{} diff --git a/test/fixtures/ignore.expected.css b/test/fixtures/ignore.expected.css index 527c13e0..0f1fcc77 100644 --- a/test/fixtures/ignore.expected.css +++ b/test/fixtures/ignore.expected.css @@ -13,6 +13,10 @@ @import url("//css"); @import url('//css'); @import url(//css); +@import "http://css" layer; +@import "http://css" layer(bar); +@import "http://css" layer screen and (min-width: 25em), print; +@import "http://css" layer(bar) screen and (min-width: 25em), print; @media (min-width: 25em){ ignore{} } diff --git a/test/fixtures/imports/layer-level-2-anonymous.css b/test/fixtures/imports/layer-level-2-anonymous.css index 36d69c28..6846c756 100644 --- a/test/fixtures/imports/layer-level-2-anonymous.css +++ b/test/fixtures/imports/layer-level-2-anonymous.css @@ -1,3 +1,5 @@ +@import "http://css" layer; +@import "http://css-bar" layer(bar); @import url("layer-level-3.css") layer (min-width: 320px); @layer Y { diff --git a/test/fixtures/layer-import-atrules-anonymous.css b/test/fixtures/layer-import-atrules-anonymous.css index f2d93560..dc0eb164 100644 --- a/test/fixtures/layer-import-atrules-anonymous.css +++ b/test/fixtures/layer-import-atrules-anonymous.css @@ -1,3 +1,7 @@ @import url("layer-anonymous.css") layer screen; @import url("layer-anonymous.css") layer; + +@import url("layer-anonymous.css") layer(named-layer-1); + +@import "http://css-top-level" layer; diff --git a/test/fixtures/layer-import-atrules-anonymous.expected.css b/test/fixtures/layer-import-atrules-anonymous.expected.css index be1df273..83111e92 100644 --- a/test/fixtures/layer-import-atrules-anonymous.expected.css +++ b/test/fixtures/layer-import-atrules-anonymous.expected.css @@ -1,5 +1,12 @@ -@media screen and (min-width: 320px) { -@layer import-anon-layer-0.import-anon-layer-1.import-anon-layer-2 { +@import "http://css" layer(import-anon-layer-0.import-anon-layer-1.import-anon-layer-8) screen; +@import "http://css-bar" layer(import-anon-layer-0.import-anon-layer-1.bar) screen; +@import "http://css" layer(import-anon-layer-3.import-anon-layer-4.import-anon-layer-9); +@import "http://css-bar" layer(import-anon-layer-3.import-anon-layer-4.bar); +@import "http://css" layer(named-layer-1.import-anon-layer-6.import-anon-layer-10); +@import "http://css-bar" layer(named-layer-1.import-anon-layer-6.bar); +@import "http://css-top-level" layer; +@media screen and (min-width: 320px){ +@layer import-anon-layer-0.import-anon-layer-1.import-anon-layer-2{ @layer Z { body { color: cyan; @@ -7,9 +14,8 @@ } } } - -@media screen { -@layer import-anon-layer-0.import-anon-layer-1 { +@media screen{ +@layer import-anon-layer-0.import-anon-layer-1{ @layer Y { body { @@ -18,18 +24,16 @@ } } } - -@media screen { -@layer import-anon-layer-0 { +@media screen{ +@layer import-anon-layer-0{ body { order: 1; } } } - -@media screen { -@layer import-anon-layer-0 { +@media screen{ +@layer import-anon-layer-0{ @media (min-width: 50rem) { body { @@ -38,9 +42,8 @@ body { } } } - -@media screen { -@layer import-anon-layer-0 { +@media screen{ +@layer import-anon-layer-0{ @keyframes RED_TO_BLUE { 0% { @@ -65,9 +68,8 @@ body { } } } - -@media (min-width: 320px) { -@layer import-anon-layer-3.import-anon-layer-4.import-anon-layer-5 { +@media (min-width: 320px){ +@layer import-anon-layer-3.import-anon-layer-4.import-anon-layer-5{ @layer Z { body { color: cyan; @@ -75,8 +77,7 @@ body { } } } - -@layer import-anon-layer-3.import-anon-layer-4 { +@layer import-anon-layer-3.import-anon-layer-4{ @layer Y { body { @@ -84,15 +85,13 @@ body { } } } - -@layer import-anon-layer-3 { +@layer import-anon-layer-3{ body { order: 1; } } - -@layer import-anon-layer-3 { +@layer import-anon-layer-3{ @media (min-width: 50rem) { body { @@ -100,8 +99,62 @@ body { } } } +@layer import-anon-layer-3{ + +@keyframes RED_TO_BLUE { + 0% { + background-color: red; + } + 100% { + background-color: blue; + } +} + +@supports (display: grid) { + body { + display: grid; + order: 3; + } +} + +@layer A { + body { + order: 4; + } +} +} +@media (min-width: 320px){ +@layer named-layer-1.import-anon-layer-6.import-anon-layer-7{ +@layer Z { + body { + color: cyan; + } +} +} +} +@layer named-layer-1.import-anon-layer-6{ + +@layer Y { + body { + color: purple; + } +} +} +@layer named-layer-1{ + +body { + order: 1; +} +} +@layer named-layer-1{ -@layer import-anon-layer-3 { +@media (min-width: 50rem) { + body { + order: 2; + } +} +} +@layer named-layer-1{ @keyframes RED_TO_BLUE { 0% { From 2db3239ec1bcf94bab9eb988e1a5c745bdcfc7cd Mon Sep 17 00:00:00 2001 From: Romain Menke <11521496+romainmenke@users.noreply.github.com> Date: Thu, 1 Dec 2022 22:11:06 +0100 Subject: [PATCH 79/82] Correctly sort media queries before joining them (#513) --- lib/join-media.js | 13 ++++++++++++- test/fixtures/filter-ignore.expected.css | 2 +- test/fixtures/ignore.expected.css | 2 +- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/lib/join-media.js b/lib/join-media.js index 5780de9a..fcaaecd3 100644 --- a/lib/join-media.js +++ b/lib/join-media.js @@ -1,5 +1,7 @@ "use strict" +const startsWithKeywordRegexp = /^(all|not|only|print|screen)/i + module.exports = function (parentMedia, childMedia) { if (!parentMedia.length && childMedia.length) return childMedia if (parentMedia.length && !childMedia.length) return parentMedia @@ -8,8 +10,17 @@ module.exports = function (parentMedia, childMedia) { const media = [] parentMedia.forEach(parentItem => { + const parentItemStartsWithKeyword = startsWithKeywordRegexp.test(parentItem) + childMedia.forEach(childItem => { - if (parentItem !== childItem) media.push(`${parentItem} and ${childItem}`) + const childItemStartsWithKeyword = startsWithKeywordRegexp.test(childItem) + if (parentItem !== childItem) { + if (childItemStartsWithKeyword && !parentItemStartsWithKeyword) { + media.push(`${childItem} and ${parentItem}`) + } else { + media.push(`${parentItem} and ${childItem}`) + } + } }) }) diff --git a/test/fixtures/filter-ignore.expected.css b/test/fixtures/filter-ignore.expected.css index 527c13e0..a9791220 100644 --- a/test/fixtures/filter-ignore.expected.css +++ b/test/fixtures/filter-ignore.expected.css @@ -1,5 +1,5 @@ @import "http://css" (min-width: 25em); -@import "http://css-screen" (min-width: 25em) and screen; +@import "http://css-screen" screen and (min-width: 25em); @import "http://css"; @import "https://css"; @import 'http://css'; diff --git a/test/fixtures/ignore.expected.css b/test/fixtures/ignore.expected.css index 0f1fcc77..dd97ad66 100644 --- a/test/fixtures/ignore.expected.css +++ b/test/fixtures/ignore.expected.css @@ -1,5 +1,5 @@ @import "http://css" (min-width: 25em); -@import "http://css-screen" (min-width: 25em) and screen; +@import "http://css-screen" screen and (min-width: 25em); @import "http://css"; @import "https://css"; @import 'http://css'; From 2c0c3e9c7943db77b5847f9663b435e170812236 Mon Sep 17 00:00:00 2001 From: Ryan Zimmerman Date: Thu, 1 Dec 2022 16:15:04 -0500 Subject: [PATCH 80/82] 15.0.1 --- CHANGELOG.md | 5 +++++ package.json | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 982a64af..1451b3da 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +# 15.0.1 / 2022-12-01 + +- Preserve layer in ignored `@import`s ([#510](https://github.com/postcss/postcss-import/issues/510), [#511](https://github.com/postcss/postcss-import/pull/511)) +- Join media queries in the correct order ([#512](https://github.com/postcss/postcss-import/issues/512), [#513](https://github.com/postcss/postcss-import/pull/513)) + # 15.0.0 / 2022-08-30 - **BREAKING:** Require Node.js v14+ ([#497](https://github.com/postcss/postcss-import/pull/497)) diff --git a/package.json b/package.json index 659134ba..e9ff635f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "postcss-import", - "version": "15.0.0", + "version": "15.0.1", "description": "PostCSS plugin to import CSS files", "keywords": [ "css", From 90e035b66604a9b2cf7ef865cd87d88d2e2391ee Mon Sep 17 00:00:00 2001 From: Romain Menke <11521496+romainmenke@users.noreply.github.com> Date: Wed, 7 Dec 2022 18:31:30 +0100 Subject: [PATCH 81/82] add data url support (#515) * add data url support * more complex tests * fix older node * Update lib/data-url.js Co-authored-by: Ryan Zimmerman Co-authored-by: Ryan Zimmerman --- index.js | 9 +++++++++ lib/data-url.js | 17 +++++++++++++++++ lib/load-content.js | 9 ++++++++- test/data-url.js | 8 ++++++++ test/fixtures/data-url.css | 6 ++++++ test/fixtures/data-url.expected.css | 24 ++++++++++++++++++++++++ test/fixtures/imports/data-url.css | 1 + 7 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 lib/data-url.js create mode 100644 test/data-url.js create mode 100644 test/fixtures/data-url.css create mode 100644 test/fixtures/data-url.expected.css create mode 100644 test/fixtures/imports/data-url.css diff --git a/index.js b/index.js index d14873d9..d324a7e0 100755 --- a/index.js +++ b/index.js @@ -10,6 +10,7 @@ const loadContent = require("./lib/load-content") const processContent = require("./lib/process-content") const parseStatements = require("./lib/parse-statements") const assignLayerNames = require("./lib/assign-layer-names") +const dataURL = require("./lib/data-url") function AtImport(options) { options = { @@ -290,6 +291,14 @@ function AtImport(options) { } function resolveImportId(result, stmt, options, state) { + if (dataURL.isValid(stmt.uri)) { + return loadImportContent(result, stmt, stmt.uri, options, state).then( + result => { + stmt.children = result + } + ) + } + const atRule = stmt.node let sourceFile if (atRule.source?.input?.file) { diff --git a/lib/data-url.js b/lib/data-url.js new file mode 100644 index 00000000..a59c5fb5 --- /dev/null +++ b/lib/data-url.js @@ -0,0 +1,17 @@ +"use strict" + +const dataURLRegexp = /^data:text\/css;base64,/i + +function isValid(url) { + return dataURLRegexp.test(url) +} + +function contents(url) { + // "data:text/css;base64,".length === 21 + return Buffer.from(url.slice(21), "base64").toString() +} + +module.exports = { + isValid, + contents, +} diff --git a/lib/load-content.js b/lib/load-content.js index de611559..c10b57e4 100644 --- a/lib/load-content.js +++ b/lib/load-content.js @@ -1,5 +1,12 @@ "use strict" const readCache = require("read-cache") +const dataURL = require("./data-url") -module.exports = filename => readCache(filename, "utf-8") +module.exports = filename => { + if (dataURL.isValid(filename)) { + return dataURL.contents(filename) + } + + return readCache(filename, "utf-8") +} diff --git a/test/data-url.js b/test/data-url.js new file mode 100644 index 00000000..13af7d8d --- /dev/null +++ b/test/data-url.js @@ -0,0 +1,8 @@ +"use strict" +// external tooling +const test = require("ava") + +// internal tooling +const checkFixture = require("./helpers/check-fixture") + +test("should inline data urls", checkFixture, "data-url") diff --git a/test/fixtures/data-url.css b/test/fixtures/data-url.css new file mode 100644 index 00000000..6f1276ef --- /dev/null +++ b/test/fixtures/data-url.css @@ -0,0 +1,6 @@ +@import url(data:text/css;base64,QGltcG9ydCB1cmwoZGF0YTp0ZXh0L2NzcztiYXNlNjQsY0NCN0lHTnZiRzl5T2lCbmNtVmxianNnZlE9PSk7CgpwIHsgY29sb3I6IGJsdWU7IH0K); +@import url("DATA:TEXT/CSS;BASE64,QGltcG9ydCB1cmwoZGF0YTp0ZXh0L2NzcztiYXNlNjQsY0NCN0lHTnZiRzl5T2lCbmNtVmxianNnZlE9PSk7CgpwIHsgY29sb3I6IGJsdWU7IH0K") layer(foo) (min-width: 320px); + +/* Mixed imports: */ +@import url(data:text/css;base64,QGltcG9ydCB1cmwoZm9vLmNzcyk7CgpwIHsKICBjb2xvcjogYmx1ZTsKfQo=); +@import url(data-url.css); diff --git a/test/fixtures/data-url.expected.css b/test/fixtures/data-url.expected.css new file mode 100644 index 00000000..207253e4 --- /dev/null +++ b/test/fixtures/data-url.expected.css @@ -0,0 +1,24 @@ +p { color: green; } + +p { color: blue; } + +@media (min-width: 320px) { + + @layer foo { +p { color: green; } } } + +@media (min-width: 320px) { + + @layer foo { + +p { color: blue; } } } + +/* Mixed imports: */ + +foo{} + +p { + color: blue; +} + +p { color: pink; } diff --git a/test/fixtures/imports/data-url.css b/test/fixtures/imports/data-url.css new file mode 100644 index 00000000..d6804421 --- /dev/null +++ b/test/fixtures/imports/data-url.css @@ -0,0 +1 @@ +@import url("DATA:text/CSS;BASE64,cCB7IGNvbG9yOiBwaW5rOyB9"); From 3f06816f2a10b25f59ae0c6afd71abd48a1f65a2 Mon Sep 17 00:00:00 2001 From: Ryan Zimmerman Date: Wed, 7 Dec 2022 16:44:55 -0500 Subject: [PATCH 82/82] 15.1.0 --- CHANGELOG.md | 4 ++++ package.json | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1451b3da..645bbaac 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +# 15.1.0 / 2022-12-07 + +- Add `data:` URL support (this is not useful for most consumers) ([#515](https://github.com/postcss/postcss-import/pull/515)) + # 15.0.1 / 2022-12-01 - Preserve layer in ignored `@import`s ([#510](https://github.com/postcss/postcss-import/issues/510), [#511](https://github.com/postcss/postcss-import/pull/511)) diff --git a/package.json b/package.json index e9ff635f..a81ea5f0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "postcss-import", - "version": "15.0.1", + "version": "15.1.0", "description": "PostCSS plugin to import CSS files", "keywords": [ "css",