Skip to content

Commit dea244f

Browse files
clydinhansl
authored andcommitted
fix(@angular/cli): improve processing multi-line url() CSS rules
1 parent cb349b0 commit dea244f

File tree

2 files changed

+20
-14
lines changed

2 files changed

+20
-14
lines changed

packages/@angular/cli/plugins/postcss-cli-resources.ts

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -121,34 +121,39 @@ export default postcss.plugin('postcss-cli-resources', (options: PostcssCliResou
121121

122122
return Promise.all(urlDeclarations.map(async decl => {
123123
const value = decl.value;
124-
const urlRegex = /url\(\s*['"]?([ \S]+?)['"]??\s*\)/g;
124+
const urlRegex = /url\(\s*(?:"([^"]+)"|'([^']+)'|(.+))\s*\)/g;
125125
const segments: string[] = [];
126126

127127
let match;
128128
let lastIndex = 0;
129129
let modified = false;
130130
// tslint:disable-next-line:no-conditional-assignment
131131
while (match = urlRegex.exec(value)) {
132+
const originalUrl = match[1] || match[2] || match[3];
132133
let processedUrl;
133134
try {
134-
processedUrl = await process(match[1], resourceCache);
135+
processedUrl = await process(originalUrl, resourceCache);
135136
} catch (err) {
136-
loader.emitError(decl.error(err.message, { word: match[1] }).toString());
137+
loader.emitError(decl.error(err.message, { word: originalUrl }).toString());
137138
continue;
138139
}
139140

140-
if (lastIndex !== match.index) {
141+
if (lastIndex < match.index) {
141142
segments.push(value.slice(lastIndex, match.index));
142143
}
143144

144-
if (!processedUrl || match[1] === processedUrl) {
145+
if (!processedUrl || originalUrl === processedUrl) {
145146
segments.push(match[0]);
146147
} else {
147148
segments.push(wrapUrl(processedUrl));
148149
modified = true;
149150
}
150151

151-
lastIndex = urlRegex.lastIndex;
152+
lastIndex = match.index + match[0].length;
153+
}
154+
155+
if (lastIndex < value.length) {
156+
segments.push(value.slice(lastIndex));
152157
}
153158

154159
if (modified) {

tests/e2e/tests/build/styles/inline-urls.ts

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,14 @@ export default function () {
2222
'src/styles.scss': `
2323
$fa-font-path: "~font-awesome/fonts";
2424
@import "~font-awesome/scss/font-awesome";
25-
h1 { background: url('./assets/large.png'); }
25+
h1 { background: url('./assets/large.png'),
26+
linear-gradient(to bottom, #0e40fa 25%, #0654f4 75%); }
2627
h2 { background: url('./assets/small.svg'); }
27-
p { background: url('./assets/small-id.svg#testID'); }
28+
p { background: url(./assets/small-id.svg#testID); }
2829
`,
2930
'src/app/app.component.css': `
3031
h3 { background: url('../assets/small.svg'); }
31-
h4 { background: url('../assets/large.png'); }
32+
h4 { background: url("../assets/large.png"); }
3233
`,
3334
'src/assets/small.svg': imgSvg,
3435
'src/assets/small-id.svg': imgSvg
@@ -46,15 +47,15 @@ export default function () {
4647
})
4748
// Check paths are correctly generated.
4849
.then(() => expectFileToMatch('dist/styles.bundle.css',
49-
/url\([\'"]?large\.[0-9a-f]{20}\.png[\'"]?\)/))
50+
/url\(['"]?large\.[0-9a-f]{20}\.png['"]?\),\s+linear-gradient\(to bottom, #0e40fa 25%, #0654f4 75%\);/))
5051
.then(() => expectFileToMatch('dist/styles.bundle.css',
51-
/url\(\\?[\'"]data:image\/svg\+xml/))
52+
/url\(\\?['"]data:image\/svg\+xml/))
5253
.then(() => expectFileToMatch('dist/styles.bundle.css',
53-
/url\([\'"]?small-id\.[0-9a-f]{20}\.svg#testID[\'"]?\)/))
54+
/url\(['"]?small-id\.[0-9a-f]{20}\.svg#testID['"]?\)/))
5455
.then(() => expectFileToMatch('dist/main.bundle.js',
55-
/url\(\\?[\'"]data:image\/svg\+xml/))
56+
/url\(\\?['"]data:image\/svg\+xml/))
5657
.then(() => expectFileToMatch('dist/main.bundle.js',
57-
/url\((?:[\'"]|\\')?large\.[0-9a-f]{20}\.png(?:[\'"]|\\')?\)/))
58+
/url\((?:['"]|\\')?large\.[0-9a-f]{20}\.png(?:['"]|\\')?\)/))
5859
// Check files are correctly created.
5960
.then(() => expectToFail(() => expectFileToExist('dist/small.svg')))
6061
.then(() => expectFileMatchToExist('./dist', /large\.[0-9a-f]{20}\.png/))

0 commit comments

Comments
 (0)