diff --git a/packages/@angular/cli/models/webpack-configs/styles.ts b/packages/@angular/cli/models/webpack-configs/styles.ts index 122be05274a3..9d5d737be7bd 100644 --- a/packages/@angular/cli/models/webpack-configs/styles.ts +++ b/packages/@angular/cli/models/webpack-configs/styles.ts @@ -58,6 +58,10 @@ export function getStylesConfig(wco: WebpackConfigOptions) { }; return [ + postcssUrl({ + filter: ({ url }: { url: string }) => url.startsWith('~'), + url: ({ url }: { url: string }) => path.join(projectRoot, 'node_modules', url.substr(1)), + }), postcssUrl([ { // Only convert root relative URLs, which CSS-Loader won't process into require(). @@ -98,7 +102,7 @@ export function getStylesConfig(wco: WebpackConfigOptions) { 'cssnano': 'cssnano', 'postcss-custom-properties': 'customProperties' }, - variables: { minimizeCss, baseHref, deployUrl } + variables: { minimizeCss, baseHref, deployUrl, projectRoot } }; // determine hashing format diff --git a/tests/e2e/tests/build/styles/inline-urls.ts b/tests/e2e/tests/build/styles/inline-urls.ts index ead6e674e05b..310ca9ab53c2 100644 --- a/tests/e2e/tests/build/styles/inline-urls.ts +++ b/tests/e2e/tests/build/styles/inline-urls.ts @@ -1,4 +1,4 @@ -import { ng } from '../../../utils/process'; +import { ng, silentNpm } from '../../../utils/process'; import { expectFileToMatch, expectFileToExist, @@ -7,6 +7,7 @@ import { } from '../../../utils/fs'; import { copyProjectAsset } from '../../../utils/assets'; import { expectToFail } from '../../../utils/utils'; +import { updateJsonFile } from '../../../utils/project'; const imgSvg = ` @@ -16,8 +17,11 @@ const imgSvg = ` export default function () { return Promise.resolve() + .then(() => silentNpm('install', 'font-awesome@4.7.0')) .then(() => writeMultipleFiles({ - 'src/styles.css': ` + 'src/styles.scss': ` + $fa-font-path: "~font-awesome/font"; + @import "~font-awesome/scss/font-awesome"; h1 { background: url('./assets/large.png'); } h2 { background: url('./assets/small.svg'); } p { background: url('./assets/small-id.svg#testID'); } @@ -30,7 +34,16 @@ export default function () { 'src/assets/small-id.svg': imgSvg })) .then(() => copyProjectAsset('images/spectrum.png', './assets/large.png')) + .then(() => updateJsonFile('.angular-cli.json', configJson => { + const app = configJson['apps'][0]; + app['styles'] = ['styles.scss']; + })) .then(() => ng('build', '--extract-css', '--aot')) + .then(({ stdout }) => { + if (stdout.match(/postcss-url: \.+: Can't read file '\.+', ignoring/)) { + throw new Error('Expected no postcss-url file read warnings.'); + } + }) // Check paths are correctly generated. .then(() => expectFileToMatch('dist/styles.bundle.css', /url\([\'"]?large\.[0-9a-f]{20}\.png[\'"]?\)/))