Skip to content

Commit a6e5103

Browse files
clydinalan-agius4
authored andcommitted
fix(@angular-devkit/build-angular): replace Webpack 4 hashForChunk hook usage
Webpack 5 now uses a `chunkHash` hook that is accessible from `JavascriptModulesPlugin.getCompilationHooks()`. The `hashForChunk` hooks have been deprecated in Webpack 5. (cherry picked from commit e0cb822)
1 parent 7ff16a7 commit a6e5103

File tree

1 file changed

+12
-23
lines changed

1 file changed

+12
-23
lines changed

packages/angular_devkit/build_angular/src/utils/webpack-browser-config.ts

+12-23
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import {
1313
resolve,
1414
} from '@angular-devkit/core';
1515
import * as path from 'path';
16-
import * as webpack from 'webpack';
16+
import { Configuration, JavascriptModulesPlugin } from 'webpack';
1717
import { merge as webpackMerge } from 'webpack-merge';
1818
import { Schema as BrowserBuilderSchema } from '../browser/schema';
1919
import {
@@ -33,10 +33,10 @@ export async function generateWebpackConfig(
3333
projectRoot: string,
3434
sourceRoot: string | undefined,
3535
options: NormalizedBrowserBuilderSchema,
36-
webpackPartialGenerator: (wco: BrowserWebpackConfigOptions) => webpack.Configuration[],
36+
webpackPartialGenerator: (wco: BrowserWebpackConfigOptions) => Configuration[],
3737
logger: logging.LoggerApi,
3838
extraBuildOptions: Partial<NormalizedBrowserBuilderSchema>,
39-
): Promise<webpack.Configuration> {
39+
): Promise<Configuration> {
4040
// Ensure Build Optimizer is only used with AOT.
4141
if (options.buildOptimizer && !options.aot) {
4242
throw new Error(`The 'buildOptimizer' option cannot be used without 'aot'.`);
@@ -70,9 +70,9 @@ export async function generateWebpackConfig(
7070
export async function generateI18nBrowserWebpackConfigFromContext(
7171
options: BrowserBuilderSchema,
7272
context: BuilderContext,
73-
webpackPartialGenerator: (wco: BrowserWebpackConfigOptions) => webpack.Configuration[],
73+
webpackPartialGenerator: (wco: BrowserWebpackConfigOptions) => Configuration[],
7474
extraBuildOptions: Partial<NormalizedBrowserBuilderSchema> = {},
75-
): Promise<{ config: webpack.Configuration; projectRoot: string; projectSourceRoot?: string, i18n: I18nOptions }> {
75+
): Promise<{ config: Configuration; projectRoot: string; projectSourceRoot?: string, i18n: I18nOptions }> {
7676
const { buildOptions, i18n } = await configureI18nBuild(context, options);
7777
const result = await generateBrowserWebpackConfigFromContext(
7878
buildOptions,
@@ -106,25 +106,14 @@ export async function generateI18nBrowserWebpackConfigFromContext(
106106
(data, locale) => data + locale.files.map((file) => file.integrity || '').join('|'),
107107
'',
108108
);
109-
if (!config.plugins) {
110-
config.plugins = [];
111-
}
109+
110+
config.plugins ??= [];
112111
config.plugins.push({
113-
apply(compiler: webpack.Compiler) {
112+
apply(compiler) {
114113
compiler.hooks.compilation.tap('build-angular', compilation => {
115-
// Webpack typings do not contain template hashForChunk hook
116-
// tslint:disable-next-line: no-any
117-
(compilation.mainTemplate.hooks as any).hashForChunk.tap(
118-
'build-angular',
119-
(hash: { update(data: string): void }) => {
120-
hash.update('$localize' + i18nHash);
121-
},
122-
);
123-
// Webpack typings do not contain hooks property
124-
// tslint:disable-next-line: no-any
125-
(compilation.chunkTemplate as any).hooks.hashForChunk.tap(
114+
JavascriptModulesPlugin.getCompilationHooks(compilation).chunkHash.tap(
126115
'build-angular',
127-
(hash: { update(data: string): void }) => {
116+
(_, hash) => {
128117
hash.update('$localize' + i18nHash);
129118
},
130119
);
@@ -138,9 +127,9 @@ export async function generateI18nBrowserWebpackConfigFromContext(
138127
export async function generateBrowserWebpackConfigFromContext(
139128
options: BrowserBuilderSchema,
140129
context: BuilderContext,
141-
webpackPartialGenerator: (wco: BrowserWebpackConfigOptions) => webpack.Configuration[],
130+
webpackPartialGenerator: (wco: BrowserWebpackConfigOptions) => Configuration[],
142131
extraBuildOptions: Partial<NormalizedBrowserBuilderSchema> = {},
143-
): Promise<{ config: webpack.Configuration; projectRoot: string; projectSourceRoot?: string }> {
132+
): Promise<{ config: Configuration; projectRoot: string; projectSourceRoot?: string }> {
144133
const projectName = context.target && context.target.project;
145134
if (!projectName) {
146135
throw new Error('The builder requires a target.');

0 commit comments

Comments
 (0)