From 0be8abff27857d29a40783dacf7f4dfe14d9dd84 Mon Sep 17 00:00:00 2001 From: evilebottnawi Date: Wed, 11 Dec 2019 18:06:27 +0300 Subject: [PATCH] fix: handling urls in @import --- src/plugins/postcss-import-parser.js | 36 ++++--- src/plugins/postcss-url-parser.js | 49 +++++---- src/utils.js | 52 ++++++---- test/__snapshots__/import-option.test.js.snap | 99 ++++++++++++++++++- test/fixtures/import/import.css | 35 +++++++ test/fixtures/import/te'st.css | 3 + test/fixtures/import/test test.css | 3 + 7 files changed, 216 insertions(+), 61 deletions(-) create mode 100644 test/fixtures/import/te'st.css create mode 100644 test/fixtures/import/test test.css diff --git a/src/plugins/postcss-import-parser.js b/src/plugins/postcss-import-parser.js index fe75acab..d5f3efd9 100644 --- a/src/plugins/postcss-import-parser.js +++ b/src/plugins/postcss-import-parser.js @@ -1,22 +1,24 @@ import postcss from 'postcss'; import valueParser from 'postcss-value-parser'; -import { isUrlRequest, urlToRequest } from 'loader-utils'; +import { isUrlRequest } from 'loader-utils'; -const pluginName = 'postcss-import-parser'; +import { normalizeUrl } from '../utils'; -function getArg(nodes) { - return nodes.length !== 0 && nodes[0].type === 'string' - ? nodes[0].value - : valueParser.stringify(nodes); -} +const pluginName = 'postcss-import-parser'; -function getUrl(node) { +function getParsedValue(node) { if (node.type === 'function' && node.value.toLowerCase() === 'url') { - return getArg(node.nodes); + const { nodes } = node; + const isStringValue = nodes.length !== 0 && nodes[0].type === 'string'; + const url = isStringValue ? nodes[0].value : valueParser.stringify(nodes); + + return { url, isStringValue }; } if (node.type === 'string') { - return node.value; + const url = node.value; + + return { url, isStringValue: true }; } return null; @@ -29,14 +31,22 @@ function parseImport(params) { return null; } - let url = getUrl(nodes[0]); + const value = getParsedValue(nodes[0]); - if (!url || url.trim().length === 0) { + if (!value) { + return null; + } + + let { url } = value; + + if (url.trim().length === 0) { return null; } if (isUrlRequest(url)) { - url = urlToRequest(url); + const { isStringValue } = value; + + url = normalizeUrl(url, isStringValue); } return { diff --git a/src/plugins/postcss-url-parser.js b/src/plugins/postcss-url-parser.js index 8ae234e9..1fa0517d 100644 --- a/src/plugins/postcss-url-parser.js +++ b/src/plugins/postcss-url-parser.js @@ -1,8 +1,7 @@ import postcss from 'postcss'; import valueParser from 'postcss-value-parser'; -import { urlToRequest } from 'loader-utils'; -import { unescape } from '../utils'; +import { normalizeUrl } from '../utils'; const pluginName = 'postcss-url-parser'; @@ -21,13 +20,11 @@ function walkUrls(parsed, callback) { } if (isUrlFunc.test(node.value)) { - const isStringNode = - node.nodes.length !== 0 && node.nodes[0].type === 'string'; - const url = isStringNode - ? node.nodes[0].value - : valueParser.stringify(node.nodes); + const { nodes } = node; + const isStringValue = nodes.length !== 0 && nodes[0].type === 'string'; + const url = isStringValue ? nodes[0].value : valueParser.stringify(nodes); - callback(getNodeFromUrlFunc(node), url, false, isStringNode); + callback(getNodeFromUrlFunc(node), url, false, isStringValue); // Do not traverse inside `url` // eslint-disable-next-line consistent-return @@ -36,18 +33,22 @@ function walkUrls(parsed, callback) { if (isImageSetFunc.test(node.value)) { node.nodes.forEach((nNode) => { - if (nNode.type === 'function' && isUrlFunc.test(nNode.value)) { - const isStringNode = - nNode.nodes.length !== 0 && nNode.nodes[0].type === 'string'; - const url = isStringNode - ? nNode.nodes[0].value - : valueParser.stringify(nNode.nodes); - - callback(getNodeFromUrlFunc(nNode), url, false, isStringNode); + const { type, value } = nNode; + + if (type === 'function' && isUrlFunc.test(value)) { + const { nodes } = nNode; + + const isStringValue = + nodes.length !== 0 && nodes[0].type === 'string'; + const url = isStringValue + ? nodes[0].value + : valueParser.stringify(nodes); + + callback(getNodeFromUrlFunc(nNode), url, false, isStringValue); } - if (nNode.type === 'string') { - callback(nNode, nNode.value, true, true); + if (type === 'string') { + callback(nNode, value, true, true); } }); @@ -66,7 +67,7 @@ function getUrlsFromValue(value, result, filter, decl) { const parsed = valueParser(value); const urls = []; - walkUrls(parsed, (node, url, needQuotes, isStringNode) => { + walkUrls(parsed, (node, url, needQuotes, isStringValue) => { if (url.trim().replace(/\\[\r\n]/g, '').length === 0) { result.warn(`Unable to find uri in '${decl ? decl.toString() : value}'`, { node: decl, @@ -80,19 +81,13 @@ function getUrlsFromValue(value, result, filter, decl) { } const splittedUrl = url.split(/(\?)?#/); - let [normalizedUrl] = splittedUrl; - const [, singleQuery, hashValue] = splittedUrl; + const [urlWithoutHash, singleQuery, hashValue] = splittedUrl; const hash = singleQuery || hashValue ? `${singleQuery ? '?' : ''}${hashValue ? `#${hashValue}` : ''}` : ''; - // See https://drafts.csswg.org/css-values-4/#strings - if (isStringNode && /\\[\n]/.test(normalizedUrl)) { - normalizedUrl = normalizedUrl.replace(/\\[\n]/g, ''); - } - - normalizedUrl = urlToRequest(decodeURIComponent(unescape(normalizedUrl))); + const normalizedUrl = normalizeUrl(urlWithoutHash, isStringValue); urls.push({ node, url: normalizedUrl, hash, needQuotes }); }); diff --git a/src/utils.js b/src/utils.js index 498861af..c3596c60 100644 --- a/src/utils.js +++ b/src/utils.js @@ -4,7 +4,11 @@ */ import path from 'path'; -import loaderUtils, { isUrlRequest, stringifyRequest } from 'loader-utils'; +import loaderUtils, { + isUrlRequest, + stringifyRequest, + urlToRequest, +} from 'loader-utils'; import normalizePath from 'normalize-path'; import cssesc from 'cssesc'; import modulesValues from 'postcss-modules-values'; @@ -13,23 +17,6 @@ import extractImports from 'postcss-modules-extract-imports'; import modulesScope from 'postcss-modules-scope'; import camelCase from 'camelcase'; -function getImportPrefix(loaderContext, importLoaders) { - if (importLoaders === false) { - return ''; - } - - const numberImportedLoaders = parseInt(importLoaders, 10) || 0; - const loadersRequest = loaderContext.loaders - .slice( - loaderContext.loaderIndex, - loaderContext.loaderIndex + 1 + numberImportedLoaders - ) - .map((x) => x.request) - .join('!'); - - return `-!${loadersRequest}!`; -} - const whitespace = '[\\x20\\t\\r\\n\\f]'; const unescapeRegExp = new RegExp( `\\\\([\\da-f]{1,6}${whitespace}?|(${whitespace})|.)`, @@ -90,6 +77,16 @@ function getLocalIdent(loaderContext, localIdentName, localName, options) { ).replace(/\\\[local\\\]/gi, localName); } +function normalizeUrl(url, isStringValue) { + let normalizedUrl = url; + + if (isStringValue && /\\[\n]/.test(normalizedUrl)) { + normalizedUrl = normalizedUrl.replace(/\\[\n]/g, ''); + } + + return urlToRequest(decodeURIComponent(unescape(normalizedUrl))); +} + function getFilter(filter, resourcePath, defaultFilter = null) { return (item) => { if (defaultFilter && !defaultFilter(item)) { @@ -186,6 +183,23 @@ function normalizeSourceMap(map) { return newMap; } +function getImportPrefix(loaderContext, importLoaders) { + if (importLoaders === false) { + return ''; + } + + const numberImportedLoaders = parseInt(importLoaders, 10) || 0; + const loadersRequest = loaderContext.loaders + .slice( + loaderContext.loaderIndex, + loaderContext.loaderIndex + 1 + numberImportedLoaders + ) + .map((x) => x.request) + .join('!'); + + return `-!${loadersRequest}!`; +} + function getImportCode( loaderContext, imports, @@ -395,7 +409,7 @@ function getExportCode( } export { - unescape, + normalizeUrl, getFilter, getModulesPlugins, normalizeSourceMap, diff --git a/test/__snapshots__/import-option.test.js.snap b/test/__snapshots__/import-option.test.js.snap index 6bce6e38..c1765b25 100644 --- a/test/__snapshots__/import-option.test.js.snap +++ b/test/__snapshots__/import-option.test.js.snap @@ -118,6 +118,14 @@ Array [ ".background-imported { background: url(/webpack/public/path/img.png); } +", + "", + ], + Array [ + 12, + ".strange { + color: red; +} ", "", ], @@ -170,6 +178,36 @@ Array [ } @import url(./test.css); + +@import './te\\\\ +st.css'; +@import './te\\\\ +\\\\ +\\\\ +st.css'; +@import url('./te\\\\ +st.css'); +@import url('./te\\\\ +\\\\ +\\\\ +st.css'); +@import './test test.css'; +@import url('./test test.css'); +@import './test\\\\ test.css'; +@import url('./test\\\\ test.css'); +@import './test%20test.css'; +@import url('./test%20test.css'); +@import './\\\\74\\\\65\\\\73\\\\74.css'; +@import url('./\\\\74\\\\65\\\\73\\\\74.css'); +@import './t\\\\65\\\\73\\\\74.css'; +@import url('./t\\\\65\\\\73\\\\74.css'); +@import url(./test\\\\ test.css); +@import url(./t\\\\65st%20test.css); +@import url('./t\\\\65st%20test.css'); +@import url(\\"./t\\\\65st%20test.css\\"); +@import \\"./t\\\\65st%20test.css\\"; +@import './t\\\\65st%20test.css'; +@import url( test.css ); ", "", ], @@ -189,6 +227,7 @@ var ___CSS_LOADER_AT_RULE_IMPORT_15___ = require(\\"-!../../../src/index.js??ref var ___CSS_LOADER_AT_RULE_IMPORT_16___ = require(\\"-!../../../src/index.js??ref--4-0!package/tilde.css\\"); var ___CSS_LOADER_AT_RULE_IMPORT_17___ = require(\\"-!../../../src/index.js??ref--4-0!aliasesImport/alias.css\\"); var ___CSS_LOADER_AT_RULE_IMPORT_18___ = require(\\"-!../../../src/index.js??ref--4-0!./url.css\\"); +var ___CSS_LOADER_AT_RULE_IMPORT_19___ = require(\\"-!../../../src/index.js??ref--4-0!./te'st.css\\"); var ___CSS_LOADER_GET_URL_IMPORT___ = require(\\"../../../src/runtime/getUrl.js\\"); var ___CSS_LOADER_URL_PURE_IMPORT_0___ = require(\\"./img.png\\"); exports = module.exports = ___CSS_LOADER_API_IMPORT___(false); @@ -211,9 +250,10 @@ exports.i(___CSS_LOADER_AT_RULE_IMPORT_15___); exports.i(___CSS_LOADER_AT_RULE_IMPORT_16___); exports.i(___CSS_LOADER_AT_RULE_IMPORT_17___); exports.i(___CSS_LOADER_AT_RULE_IMPORT_18___); +exports.i(___CSS_LOADER_AT_RULE_IMPORT_19___); var ___CSS_LOADER_URL_IMPORT_0___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_PURE_IMPORT_0___); // Module -exports.push([module.id, \\"@import url(test.css);\\\\n@import url('test.css');\\\\n@import url(\\\\\\"test.css\\\\\\");\\\\n@IMPORT url(test.css);\\\\n@import URL(test.css);\\\\n@import url(test.css );\\\\n@import url( test.css);\\\\n@import url( test.css );\\\\n@import url(\\\\n test.css\\\\n);\\\\n@import url();\\\\n@import url('');\\\\n@import url(\\\\\\"\\\\\\");\\\\n@import \\\\\\"test.css\\\\\\";\\\\n@import 'test.css';\\\\n@import '';\\\\n@import \\\\\\"\\\\\\";\\\\n@import \\\\\\" \\\\\\";\\\\n@import \\\\\\"\\\\n\\\\\\";\\\\n@import url();\\\\n@import url('');\\\\n@import url(\\\\\\"\\\\\\");\\\\n@import url(test.css) screen and print;\\\\n@import url(test.css) SCREEN AND PRINT;\\\\n@import url(test.css)screen and print;\\\\n@import url(test.css) screen and print;\\\\n@import url(~package/test.css);\\\\n@import ;\\\\n@import foo-bar;\\\\n@import-normalize;\\\\n@import url('http://') :root {}\\\\n\\\\n.class {\\\\n a: b c d;\\\\n}\\\\n\\\\n.foo {\\\\n @import 'path.css';\\\\n}\\\\n\\\\n.background {\\\\n background: url(\\" + ___CSS_LOADER_URL_IMPORT_0___ + \\");\\\\n}\\\\n\\\\n@import url(./test.css);\\\\n\\", \\"\\"]); +exports.push([module.id, \\"@import url(test.css);\\\\n@import url('test.css');\\\\n@import url(\\\\\\"test.css\\\\\\");\\\\n@IMPORT url(test.css);\\\\n@import URL(test.css);\\\\n@import url(test.css );\\\\n@import url( test.css);\\\\n@import url( test.css );\\\\n@import url(\\\\n test.css\\\\n);\\\\n@import url();\\\\n@import url('');\\\\n@import url(\\\\\\"\\\\\\");\\\\n@import \\\\\\"test.css\\\\\\";\\\\n@import 'test.css';\\\\n@import '';\\\\n@import \\\\\\"\\\\\\";\\\\n@import \\\\\\" \\\\\\";\\\\n@import \\\\\\"\\\\n\\\\\\";\\\\n@import url();\\\\n@import url('');\\\\n@import url(\\\\\\"\\\\\\");\\\\n@import url(test.css) screen and print;\\\\n@import url(test.css) SCREEN AND PRINT;\\\\n@import url(test.css)screen and print;\\\\n@import url(test.css) screen and print;\\\\n@import url(~package/test.css);\\\\n@import ;\\\\n@import foo-bar;\\\\n@import-normalize;\\\\n@import url('http://') :root {}\\\\n\\\\n.class {\\\\n a: b c d;\\\\n}\\\\n\\\\n.foo {\\\\n @import 'path.css';\\\\n}\\\\n\\\\n.background {\\\\n background: url(\\" + ___CSS_LOADER_URL_IMPORT_0___ + \\");\\\\n}\\\\n\\\\n@import url(./test.css);\\\\n\\\\n@import './te\\\\\\\\\\\\nst.css';\\\\n@import './te\\\\\\\\\\\\n\\\\\\\\\\\\n\\\\\\\\\\\\nst.css';\\\\n@import url('./te\\\\\\\\\\\\nst.css');\\\\n@import url('./te\\\\\\\\\\\\n\\\\\\\\\\\\n\\\\\\\\\\\\nst.css');\\\\n@import './test test.css';\\\\n@import url('./test test.css');\\\\n@import './test\\\\\\\\ test.css';\\\\n@import url('./test\\\\\\\\ test.css');\\\\n@import './test%20test.css';\\\\n@import url('./test%20test.css');\\\\n@import './\\\\\\\\74\\\\\\\\65\\\\\\\\73\\\\\\\\74.css';\\\\n@import url('./\\\\\\\\74\\\\\\\\65\\\\\\\\73\\\\\\\\74.css');\\\\n@import './t\\\\\\\\65\\\\\\\\73\\\\\\\\74.css';\\\\n@import url('./t\\\\\\\\65\\\\\\\\73\\\\\\\\74.css');\\\\n@import url(./test\\\\\\\\ test.css);\\\\n@import url(./t\\\\\\\\65st%20test.css);\\\\n@import url('./t\\\\\\\\65st%20test.css');\\\\n@import url(\\\\\\"./t\\\\\\\\65st%20test.css\\\\\\");\\\\n@import \\\\\\"./t\\\\\\\\65st%20test.css\\\\\\";\\\\n@import './t\\\\\\\\65st%20test.css';\\\\n@import url( test.css );\\\\n\\", \\"\\"]); " `; @@ -350,6 +390,41 @@ Array [ } @import url(./test.css); + +@import './te\\\\ +st.css'; +@import './te\\\\ +\\\\ +\\\\ +st.css'; +@import url('./te\\\\ +st.css'); +@import url('./te\\\\ +\\\\ +\\\\ +st.css'); + +@import \\"./te'st.css\\"; +@import url(\\"./te'st.css\\"); +@import './te\\\\'st.css'; +@import url('./te\\\\'st.css'); +@import './test test.css'; +@import url('./test test.css'); +@import './test\\\\ test.css'; +@import url('./test\\\\ test.css'); +@import './test%20test.css'; +@import url('./test%20test.css'); +@import './\\\\74\\\\65\\\\73\\\\74.css'; +@import url('./\\\\74\\\\65\\\\73\\\\74.css'); +@import './t\\\\65\\\\73\\\\74.css'; +@import url('./t\\\\65\\\\73\\\\74.css'); +@import url(./test\\\\ test.css); +@import url(./t\\\\65st%20test.css); +@import url('./t\\\\65st%20test.css'); +@import url(\\"./t\\\\65st%20test.css\\"); +@import \\"./t\\\\65st%20test.css\\"; +@import './t\\\\65st%20test.css'; +@import url( test.css ); ", "", ], @@ -364,7 +439,7 @@ var ___CSS_LOADER_URL_PURE_IMPORT_0___ = require(\\"./img.png\\"); exports = module.exports = ___CSS_LOADER_API_IMPORT___(false); var ___CSS_LOADER_URL_IMPORT_0___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_PURE_IMPORT_0___); // Module -exports.push([module.id, \\"@import url(test.css);\\\\n@import url('test.css');\\\\n@import url(\\\\\\"test.css\\\\\\");\\\\n@IMPORT url(test.css);\\\\n@import URL(test.css);\\\\n@import url(test.css );\\\\n@import url( test.css);\\\\n@import url( test.css );\\\\n@import url(\\\\n test.css\\\\n);\\\\n@import url();\\\\n@import url('');\\\\n@import url(\\\\\\"\\\\\\");\\\\n@import \\\\\\"test.css\\\\\\";\\\\n@import 'test.css';\\\\n@import '';\\\\n@import \\\\\\"\\\\\\";\\\\n@import \\\\\\" \\\\\\";\\\\n@import \\\\\\"\\\\n\\\\\\";\\\\n@import url();\\\\n@import url('');\\\\n@import url(\\\\\\"\\\\\\");\\\\n@import url(test.css) screen and print;\\\\n@import url(test.css) SCREEN AND PRINT;\\\\n@import url(test.css)screen and print;\\\\n@import url(test.css) screen and print;\\\\n@import url(test-media.css) screen and print;\\\\n@import url(test-other.css) (min-width: 100px);\\\\n@import url(http://example.com/style.css);\\\\n@import url(http://example.com/style.css);\\\\n@import url(http://example.com/style.css#hash);\\\\n@import url(http://example.com/style.css?#hash);\\\\n@import url(http://example.com/style.css?foo=bar#hash);\\\\n@import url(http://example.com/other-style.css) screen and print;\\\\n@import url(http://example.com/other-style.css) screen and print;\\\\n@import url(\\\\\\"//example.com/style.css\\\\\\");\\\\n@import url(~package/test.css);\\\\n@import ;\\\\n@import foo-bar;\\\\n@import-normalize;\\\\n@import url('http://') :root {}\\\\n@import url('query.css?foo=1&bar=1');\\\\n@import url('other-query.css?foo=1&bar=1#hash');\\\\n@import url('other-query.css?foo=1&bar=1#hash') screen and print;\\\\n@import url('https://fonts.googleapis.com/css?family=Roboto');\\\\n@import url('https://fonts.googleapis.com/css?family=Noto+Sans+TC');\\\\n@import url('https://fonts.googleapis.com/css?family=Noto+Sans+TC|Roboto');\\\\n\\\\n.class {\\\\n a: b c d;\\\\n}\\\\n\\\\n.foo {\\\\n @import 'path.css';\\\\n}\\\\n\\\\n@import url('./relative.css');\\\\n@import url('../import/top-relative.css');\\\\n@import url(~package/tilde.css);\\\\n@import url(~aliasesImport/alias.css);\\\\n@import url('./url.css');\\\\n\\\\n.background {\\\\n background: url(\\" + ___CSS_LOADER_URL_IMPORT_0___ + \\");\\\\n}\\\\n\\\\n@import url(./test.css);\\\\n\\", \\"\\"]); +exports.push([module.id, \\"@import url(test.css);\\\\n@import url('test.css');\\\\n@import url(\\\\\\"test.css\\\\\\");\\\\n@IMPORT url(test.css);\\\\n@import URL(test.css);\\\\n@import url(test.css );\\\\n@import url( test.css);\\\\n@import url( test.css );\\\\n@import url(\\\\n test.css\\\\n);\\\\n@import url();\\\\n@import url('');\\\\n@import url(\\\\\\"\\\\\\");\\\\n@import \\\\\\"test.css\\\\\\";\\\\n@import 'test.css';\\\\n@import '';\\\\n@import \\\\\\"\\\\\\";\\\\n@import \\\\\\" \\\\\\";\\\\n@import \\\\\\"\\\\n\\\\\\";\\\\n@import url();\\\\n@import url('');\\\\n@import url(\\\\\\"\\\\\\");\\\\n@import url(test.css) screen and print;\\\\n@import url(test.css) SCREEN AND PRINT;\\\\n@import url(test.css)screen and print;\\\\n@import url(test.css) screen and print;\\\\n@import url(test-media.css) screen and print;\\\\n@import url(test-other.css) (min-width: 100px);\\\\n@import url(http://example.com/style.css);\\\\n@import url(http://example.com/style.css);\\\\n@import url(http://example.com/style.css#hash);\\\\n@import url(http://example.com/style.css?#hash);\\\\n@import url(http://example.com/style.css?foo=bar#hash);\\\\n@import url(http://example.com/other-style.css) screen and print;\\\\n@import url(http://example.com/other-style.css) screen and print;\\\\n@import url(\\\\\\"//example.com/style.css\\\\\\");\\\\n@import url(~package/test.css);\\\\n@import ;\\\\n@import foo-bar;\\\\n@import-normalize;\\\\n@import url('http://') :root {}\\\\n@import url('query.css?foo=1&bar=1');\\\\n@import url('other-query.css?foo=1&bar=1#hash');\\\\n@import url('other-query.css?foo=1&bar=1#hash') screen and print;\\\\n@import url('https://fonts.googleapis.com/css?family=Roboto');\\\\n@import url('https://fonts.googleapis.com/css?family=Noto+Sans+TC');\\\\n@import url('https://fonts.googleapis.com/css?family=Noto+Sans+TC|Roboto');\\\\n\\\\n.class {\\\\n a: b c d;\\\\n}\\\\n\\\\n.foo {\\\\n @import 'path.css';\\\\n}\\\\n\\\\n@import url('./relative.css');\\\\n@import url('../import/top-relative.css');\\\\n@import url(~package/tilde.css);\\\\n@import url(~aliasesImport/alias.css);\\\\n@import url('./url.css');\\\\n\\\\n.background {\\\\n background: url(\\" + ___CSS_LOADER_URL_IMPORT_0___ + \\");\\\\n}\\\\n\\\\n@import url(./test.css);\\\\n\\\\n@import './te\\\\\\\\\\\\nst.css';\\\\n@import './te\\\\\\\\\\\\n\\\\\\\\\\\\n\\\\\\\\\\\\nst.css';\\\\n@import url('./te\\\\\\\\\\\\nst.css');\\\\n@import url('./te\\\\\\\\\\\\n\\\\\\\\\\\\n\\\\\\\\\\\\nst.css');\\\\n\\\\n@import \\\\\\"./te'st.css\\\\\\";\\\\n@import url(\\\\\\"./te'st.css\\\\\\");\\\\n@import './te\\\\\\\\'st.css';\\\\n@import url('./te\\\\\\\\'st.css');\\\\n@import './test test.css';\\\\n@import url('./test test.css');\\\\n@import './test\\\\\\\\ test.css';\\\\n@import url('./test\\\\\\\\ test.css');\\\\n@import './test%20test.css';\\\\n@import url('./test%20test.css');\\\\n@import './\\\\\\\\74\\\\\\\\65\\\\\\\\73\\\\\\\\74.css';\\\\n@import url('./\\\\\\\\74\\\\\\\\65\\\\\\\\73\\\\\\\\74.css');\\\\n@import './t\\\\\\\\65\\\\\\\\73\\\\\\\\74.css';\\\\n@import url('./t\\\\\\\\65\\\\\\\\73\\\\\\\\74.css');\\\\n@import url(./test\\\\\\\\ test.css);\\\\n@import url(./t\\\\\\\\65st%20test.css);\\\\n@import url('./t\\\\\\\\65st%20test.css');\\\\n@import url(\\\\\\"./t\\\\\\\\65st%20test.css\\\\\\");\\\\n@import \\\\\\"./t\\\\\\\\65st%20test.css\\\\\\";\\\\n@import './t\\\\\\\\65st%20test.css';\\\\n@import url( test.css );\\\\n\\", \\"\\"]); " `; @@ -512,6 +587,22 @@ Array [ ".background-imported { background: url(/webpack/public/path/img.png); } +", + "", + ], + Array [ + 15, + ".strange { + color: red; +} +", + "", + ], + Array [ + 16, + ".space { + color: gray; +} ", "", ], @@ -566,6 +657,8 @@ var ___CSS_LOADER_AT_RULE_IMPORT_18___ = require(\\"-!../../../src/index.js??ref var ___CSS_LOADER_AT_RULE_IMPORT_19___ = require(\\"-!../../../src/index.js??ref--4-0!package/tilde.css\\"); var ___CSS_LOADER_AT_RULE_IMPORT_20___ = require(\\"-!../../../src/index.js??ref--4-0!aliasesImport/alias.css\\"); var ___CSS_LOADER_AT_RULE_IMPORT_21___ = require(\\"-!../../../src/index.js??ref--4-0!./url.css\\"); +var ___CSS_LOADER_AT_RULE_IMPORT_22___ = require(\\"-!../../../src/index.js??ref--4-0!./te'st.css\\"); +var ___CSS_LOADER_AT_RULE_IMPORT_23___ = require(\\"-!../../../src/index.js??ref--4-0!./test test.css\\"); var ___CSS_LOADER_GET_URL_IMPORT___ = require(\\"../../../src/runtime/getUrl.js\\"); var ___CSS_LOADER_URL_PURE_IMPORT_0___ = require(\\"./img.png\\"); exports = module.exports = ___CSS_LOADER_API_IMPORT___(false); @@ -591,6 +684,8 @@ exports.i(___CSS_LOADER_AT_RULE_IMPORT_18___); exports.i(___CSS_LOADER_AT_RULE_IMPORT_19___); exports.i(___CSS_LOADER_AT_RULE_IMPORT_20___); exports.i(___CSS_LOADER_AT_RULE_IMPORT_21___); +exports.i(___CSS_LOADER_AT_RULE_IMPORT_22___); +exports.i(___CSS_LOADER_AT_RULE_IMPORT_23___); var ___CSS_LOADER_URL_IMPORT_0___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_PURE_IMPORT_0___); // Module exports.push([module.id, \\"@import url();\\\\n@import url('');\\\\n@import url(\\\\\\"\\\\\\");\\\\n@import '';\\\\n@import \\\\\\"\\\\\\";\\\\n@import \\\\\\" \\\\\\";\\\\n@import \\\\\\"\\\\n\\\\\\";\\\\n@import url();\\\\n@import url('');\\\\n@import url(\\\\\\"\\\\\\");\\\\n@import ;\\\\n@import foo-bar;\\\\n@import-normalize;\\\\n@import url('http://') :root {}\\\\n\\\\n.class {\\\\n a: b c d;\\\\n}\\\\n\\\\n.foo {\\\\n @import 'path.css';\\\\n}\\\\n\\\\n.background {\\\\n background: url(\\" + ___CSS_LOADER_URL_IMPORT_0___ + \\");\\\\n}\\\\n\\", \\"\\"]); diff --git a/test/fixtures/import/import.css b/test/fixtures/import/import.css index 49d41583..b6e7afa5 100644 --- a/test/fixtures/import/import.css +++ b/test/fixtures/import/import.css @@ -67,3 +67,38 @@ } @import url(./test.css); + +@import './te\ +st.css'; +@import './te\ +\ +\ +st.css'; +@import url('./te\ +st.css'); +@import url('./te\ +\ +\ +st.css'); + +@import "./te'st.css"; +@import url("./te'st.css"); +@import './te\'st.css'; +@import url('./te\'st.css'); +@import './test test.css'; +@import url('./test test.css'); +@import './test\ test.css'; +@import url('./test\ test.css'); +@import './test%20test.css'; +@import url('./test%20test.css'); +@import './\74\65\73\74.css'; +@import url('./\74\65\73\74.css'); +@import './t\65\73\74.css'; +@import url('./t\65\73\74.css'); +@import url(./test\ test.css); +@import url(./t\65st%20test.css); +@import url('./t\65st%20test.css'); +@import url("./t\65st%20test.css"); +@import "./t\65st%20test.css"; +@import './t\65st%20test.css'; +@import url( test.css ); diff --git a/test/fixtures/import/te'st.css b/test/fixtures/import/te'st.css new file mode 100644 index 00000000..b4c37197 --- /dev/null +++ b/test/fixtures/import/te'st.css @@ -0,0 +1,3 @@ +.strange { + color: red; +} diff --git a/test/fixtures/import/test test.css b/test/fixtures/import/test test.css new file mode 100644 index 00000000..8c6bf2f2 --- /dev/null +++ b/test/fixtures/import/test test.css @@ -0,0 +1,3 @@ +.space { + color: gray; +}