Skip to content

Commit 4be57b5

Browse files
committed
fix(@angular-devkit/build-angular): improve webpack loader resolution
Previously, all loaders either needed to be in the workspace's node modules directory or a node modules directory directly within the build angular package. A package manager can potentially hoist a loader to a node modules location inbetween the two and causing loader resolution to fail. This change causes webpack to check all intermediate node modules directories in addition to the initial two locations.
1 parent 1bba17f commit 4be57b5

File tree

2 files changed

+25
-15
lines changed
  • packages/angular_devkit/build_angular/src/angular-cli-files

2 files changed

+25
-15
lines changed

packages/angular_devkit/build_angular/src/angular-cli-files/models/webpack-configs/common.ts

+3-11
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,7 @@ import { AssetPatternObject } from '../../../browser/schema';
1313
import { BundleBudgetPlugin } from '../../plugins/bundle-budget';
1414
import { CleanCssWebpackPlugin } from '../../plugins/cleancss-webpack-plugin';
1515
import { ScriptsWebpackPlugin } from '../../plugins/scripts-webpack-plugin';
16-
import { findUp } from '../../utilities/find-up';
17-
import { isDirectory } from '../../utilities/is-directory';
16+
import { findAllNodeModules, findUp } from '../../utilities/find-up';
1817
import { requireProjectModule } from '../../utilities/require-project-module';
1918
import { BuildOptions, WebpackConfigOptions } from '../build-options';
2019
import { getOutputHashFormat, normalizeExtraEntryPoints } from './utils';
@@ -201,15 +200,8 @@ export function getCommonConfig(wco: WebpackConfigOptions) {
201200
// Allow loaders to be in a node_modules nested inside the devkit/build-angular package.
202201
// This is important in case loaders do not get hoisted.
203202
// If this file moves to another location, alter potentialNodeModules as well.
204-
const loaderNodeModules = ['node_modules'];
205-
const buildAngularNodeModules = findUp('node_modules', __dirname);
206-
if (buildAngularNodeModules
207-
&& isDirectory(buildAngularNodeModules)
208-
&& buildAngularNodeModules !== nodeModules
209-
&& buildAngularNodeModules.startsWith(nodeModules)
210-
) {
211-
loaderNodeModules.push(buildAngularNodeModules);
212-
}
203+
const loaderNodeModules = findAllNodeModules(__dirname, projectRoot);
204+
loaderNodeModules.unshift('node_modules');
213205

214206
// Load rxjs path aliases.
215207
// https://github.com/ReactiveX/rxjs/blob/master/doc/lettable-operators.md#build-and-treeshaking

packages/angular_devkit/build_angular/src/angular-cli-files/utilities/find-up.ts

+22-4
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,9 @@
55
* Use of this source code is governed by an MIT-style license that can be
66
* found in the LICENSE file at https://angular.io/license
77
*/
8-
// tslint:disable
9-
// TODO: cleanup this file, it's copied as is from Angular CLI.
10-
11-
import * as path from 'path';
128
import { existsSync } from 'fs';
9+
import * as path from 'path';
10+
import { isDirectory } from './is-directory';
1311

1412
export function findUp(names: string | string[], from: string, stopOnNodeModules = false) {
1513
if (!Array.isArray(names)) {
@@ -38,3 +36,23 @@ export function findUp(names: string | string[], from: string, stopOnNodeModules
3836

3937
return null;
4038
}
39+
40+
export function findAllNodeModules(from: string, root?: string) {
41+
const nodeModules: string[] = [];
42+
43+
let current = from;
44+
while (current && current !== root) {
45+
const potential = path.join(current, 'node_modules');
46+
if (existsSync(potential) && isDirectory(potential)) {
47+
nodeModules.push(potential);
48+
}
49+
50+
const next = path.dirname(current);
51+
if (next === current) {
52+
break;
53+
}
54+
current = next;
55+
}
56+
57+
return nodeModules;
58+
}

0 commit comments

Comments
 (0)