@rushstack/heft-webpack5-plugin 0.5.50 → 0.6.0-dev.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -1
- package/dist/heft-webpack5-plugin.d.ts +73 -22
- package/dist/tsdoc-metadata.json +1 -1
- package/heft-plugin.json +20 -0
- package/lib/Webpack5Plugin.d.ts +33 -0
- package/lib/Webpack5Plugin.d.ts.map +1 -0
- package/lib/Webpack5Plugin.js +362 -0
- package/lib/Webpack5Plugin.js.map +1 -0
- package/lib/WebpackConfigurationLoader.d.ts +16 -4
- package/lib/WebpackConfigurationLoader.d.ts.map +1 -1
- package/lib/WebpackConfigurationLoader.js +36 -15
- package/lib/WebpackConfigurationLoader.js.map +1 -1
- package/lib/index.d.ts +2 -7
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +3 -5
- package/lib/index.js.map +1 -1
- package/lib/schemas/heft-webpack5-plugin.schema.json +25 -0
- package/lib/shared.d.ts +64 -14
- package/lib/shared.d.ts.map +1 -1
- package/lib/shared.js.map +1 -1
- package/package.json +9 -6
- package/lib/WebpackPlugin.d.ts +0 -14
- package/lib/WebpackPlugin.d.ts.map +0 -1
- package/lib/WebpackPlugin.js +0 -248
- package/lib/WebpackPlugin.js.map +0 -1
package/lib/WebpackPlugin.js
DELETED
|
@@ -1,248 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
|
|
3
|
-
// See LICENSE in the project root for license information.
|
|
4
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
5
|
-
if (k2 === undefined) k2 = k;
|
|
6
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
7
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
8
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
9
|
-
}
|
|
10
|
-
Object.defineProperty(o, k2, desc);
|
|
11
|
-
}) : (function(o, m, k, k2) {
|
|
12
|
-
if (k2 === undefined) k2 = k;
|
|
13
|
-
o[k2] = m[k];
|
|
14
|
-
}));
|
|
15
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
16
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
17
|
-
}) : function(o, v) {
|
|
18
|
-
o["default"] = v;
|
|
19
|
-
});
|
|
20
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
21
|
-
if (mod && mod.__esModule) return mod;
|
|
22
|
-
var result = {};
|
|
23
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
24
|
-
__setModuleDefault(result, mod);
|
|
25
|
-
return result;
|
|
26
|
-
};
|
|
27
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
28
|
-
exports.WebpackPlugin = void 0;
|
|
29
|
-
const nodePath = __importStar(require("path"));
|
|
30
|
-
const node_core_library_1 = require("@rushstack/node-core-library");
|
|
31
|
-
const WebpackConfigurationLoader_1 = require("./WebpackConfigurationLoader");
|
|
32
|
-
const webpack = node_core_library_1.Import.lazy('webpack', require);
|
|
33
|
-
const PLUGIN_NAME = 'WebpackPlugin';
|
|
34
|
-
const WEBPACK_DEV_SERVER_PACKAGE_NAME = 'webpack-dev-server';
|
|
35
|
-
const WEBPACK_DEV_SERVER_ENV_VAR_NAME = 'WEBPACK_DEV_SERVER';
|
|
36
|
-
/**
|
|
37
|
-
* @internal
|
|
38
|
-
*/
|
|
39
|
-
class WebpackPlugin {
|
|
40
|
-
constructor() {
|
|
41
|
-
this.pluginName = PLUGIN_NAME;
|
|
42
|
-
}
|
|
43
|
-
static _getWebpackVersions() {
|
|
44
|
-
if (!WebpackPlugin._webpackVersions) {
|
|
45
|
-
const webpackDevServerPackageJsonPath = node_core_library_1.Import.resolveModule({
|
|
46
|
-
modulePath: 'webpack-dev-server/package.json',
|
|
47
|
-
baseFolderPath: __dirname
|
|
48
|
-
});
|
|
49
|
-
const webpackDevServerPackageJson = node_core_library_1.PackageJsonLookup.instance.loadPackageJson(webpackDevServerPackageJsonPath);
|
|
50
|
-
WebpackPlugin._webpackVersions = {
|
|
51
|
-
webpackVersion: webpack.version,
|
|
52
|
-
webpackDevServerVersion: webpackDevServerPackageJson.version
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
return WebpackPlugin._webpackVersions;
|
|
56
|
-
}
|
|
57
|
-
apply(heftSession, heftConfiguration) {
|
|
58
|
-
heftSession.hooks.build.tap(PLUGIN_NAME, (build) => {
|
|
59
|
-
build.hooks.bundle.tap(PLUGIN_NAME, (bundle) => {
|
|
60
|
-
bundle.hooks.configureWebpack.tap({ name: PLUGIN_NAME, stage: Number.MIN_SAFE_INTEGER }, (webpackConfiguration) => {
|
|
61
|
-
const webpackVersions = WebpackPlugin._getWebpackVersions();
|
|
62
|
-
bundle.properties.webpackVersion = webpack.version;
|
|
63
|
-
bundle.properties.webpackDevServerVersion = webpackVersions.webpackDevServerVersion;
|
|
64
|
-
return webpackConfiguration;
|
|
65
|
-
});
|
|
66
|
-
bundle.hooks.configureWebpack.tapPromise(PLUGIN_NAME, async (existingConfiguration) => {
|
|
67
|
-
const logger = heftSession.requestScopedLogger('configure-webpack');
|
|
68
|
-
if (existingConfiguration) {
|
|
69
|
-
logger.terminal.writeVerboseLine('Skipping loading webpack config file because the webpack config has already been set.');
|
|
70
|
-
return existingConfiguration;
|
|
71
|
-
}
|
|
72
|
-
else {
|
|
73
|
-
return await WebpackConfigurationLoader_1.WebpackConfigurationLoader.tryLoadWebpackConfigAsync(logger, heftConfiguration.buildFolder, build.properties);
|
|
74
|
-
}
|
|
75
|
-
});
|
|
76
|
-
bundle.hooks.run.tapPromise(PLUGIN_NAME, async () => {
|
|
77
|
-
await this._runWebpackAsync(heftSession, heftConfiguration, bundle.properties, build.properties, heftConfiguration.terminalProvider.supportsColor);
|
|
78
|
-
});
|
|
79
|
-
});
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
async _runWebpackAsync(heftSession, heftConfiguration, bundleSubstageProperties, buildProperties, supportsColor) {
|
|
83
|
-
const webpackConfiguration = bundleSubstageProperties.webpackConfiguration;
|
|
84
|
-
if (!webpackConfiguration) {
|
|
85
|
-
return;
|
|
86
|
-
}
|
|
87
|
-
const logger = heftSession.requestScopedLogger('webpack');
|
|
88
|
-
const webpackVersions = WebpackPlugin._getWebpackVersions();
|
|
89
|
-
if (bundleSubstageProperties.webpackVersion !== webpackVersions.webpackVersion) {
|
|
90
|
-
logger.emitError(new Error(`The Webpack plugin expected to be configured with Webpack version ${webpackVersions.webpackVersion}, ` +
|
|
91
|
-
`but the configuration specifies version ${bundleSubstageProperties.webpackVersion}. ` +
|
|
92
|
-
'Are multiple versions of the Webpack plugin present?'));
|
|
93
|
-
}
|
|
94
|
-
if (bundleSubstageProperties.webpackDevServerVersion !== webpackVersions.webpackDevServerVersion) {
|
|
95
|
-
logger.emitError(new Error(`The Webpack plugin expected to be configured with webpack-dev-server version ${webpackVersions.webpackDevServerVersion}, ` +
|
|
96
|
-
`but the configuration specifies version ${bundleSubstageProperties.webpackDevServerVersion}. ` +
|
|
97
|
-
'Are multiple versions of the Webpack plugin present?'));
|
|
98
|
-
}
|
|
99
|
-
logger.terminal.writeLine(`Using Webpack version ${webpack.version}`);
|
|
100
|
-
let compiler;
|
|
101
|
-
if (Array.isArray(webpackConfiguration)) {
|
|
102
|
-
if (webpackConfiguration.length === 0) {
|
|
103
|
-
logger.terminal.writeLine('The webpack configuration is an empty array - nothing to do.');
|
|
104
|
-
return;
|
|
105
|
-
}
|
|
106
|
-
else {
|
|
107
|
-
compiler = webpack(webpackConfiguration); /* (webpack.Compilation[]) => MultiCompiler */
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
else {
|
|
111
|
-
compiler = webpack(webpackConfiguration); /* (webpack.Compilation) => Compiler */
|
|
112
|
-
}
|
|
113
|
-
if (buildProperties.serveMode) {
|
|
114
|
-
const defaultDevServerOptions = {
|
|
115
|
-
host: 'localhost',
|
|
116
|
-
devMiddleware: {
|
|
117
|
-
publicPath: '/',
|
|
118
|
-
stats: {
|
|
119
|
-
cached: false,
|
|
120
|
-
cachedAssets: false,
|
|
121
|
-
colors: supportsColor
|
|
122
|
-
}
|
|
123
|
-
},
|
|
124
|
-
client: {
|
|
125
|
-
logging: 'info'
|
|
126
|
-
},
|
|
127
|
-
port: 8080
|
|
128
|
-
};
|
|
129
|
-
let options;
|
|
130
|
-
if (Array.isArray(webpackConfiguration)) {
|
|
131
|
-
const devServerOptions = webpackConfiguration
|
|
132
|
-
.map((configuration) => configuration.devServer)
|
|
133
|
-
.filter((devServer) => !!devServer);
|
|
134
|
-
if (devServerOptions.length > 1) {
|
|
135
|
-
logger.emitWarning(new Error(`Detected multiple webpack devServer configurations, using the first one.`));
|
|
136
|
-
}
|
|
137
|
-
if (devServerOptions.length > 0) {
|
|
138
|
-
options = Object.assign(Object.assign({}, defaultDevServerOptions), devServerOptions[0]);
|
|
139
|
-
}
|
|
140
|
-
else {
|
|
141
|
-
options = defaultDevServerOptions;
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
else {
|
|
145
|
-
options = Object.assign(Object.assign({}, defaultDevServerOptions), webpackConfiguration.devServer);
|
|
146
|
-
}
|
|
147
|
-
// Register a plugin to callback after webpack is done with the first compilation
|
|
148
|
-
// so we can move on to post-build
|
|
149
|
-
let firstCompilationDoneCallback;
|
|
150
|
-
const originalBeforeCallback = options.setupMiddlewares;
|
|
151
|
-
options.setupMiddlewares = (middlewares, devServer) => {
|
|
152
|
-
compiler.hooks.done.tap('heft-webpack-plugin', () => {
|
|
153
|
-
if (firstCompilationDoneCallback) {
|
|
154
|
-
firstCompilationDoneCallback();
|
|
155
|
-
firstCompilationDoneCallback = undefined;
|
|
156
|
-
}
|
|
157
|
-
});
|
|
158
|
-
if (originalBeforeCallback) {
|
|
159
|
-
return originalBeforeCallback(middlewares, devServer);
|
|
160
|
-
}
|
|
161
|
-
return middlewares;
|
|
162
|
-
};
|
|
163
|
-
// The webpack-dev-server package has a design flaw, where merely loading its package will set the
|
|
164
|
-
// WEBPACK_DEV_SERVER environment variable -- even if no APIs are accessed. This environment variable
|
|
165
|
-
// causes incorrect behavior if Heft is not running in serve mode. Thus, we need to be careful to call require()
|
|
166
|
-
// only if Heft is in serve mode.
|
|
167
|
-
const WebpackDevServer = require(WEBPACK_DEV_SERVER_PACKAGE_NAME);
|
|
168
|
-
// TODO: the WebpackDevServer accepts a third parameter for a logger. We should make
|
|
169
|
-
// use of that to make logging cleaner
|
|
170
|
-
const webpackDevServer = new WebpackDevServer(options, compiler);
|
|
171
|
-
await new Promise((resolve, reject) => {
|
|
172
|
-
firstCompilationDoneCallback = resolve;
|
|
173
|
-
// Wrap in promise.resolve due to small issue in the type declaration, return type should be
|
|
174
|
-
// webpackDevServer.start(): Promise<void>;
|
|
175
|
-
Promise.resolve(webpackDevServer.start()).catch(reject);
|
|
176
|
-
});
|
|
177
|
-
}
|
|
178
|
-
else {
|
|
179
|
-
if (process.env[WEBPACK_DEV_SERVER_ENV_VAR_NAME]) {
|
|
180
|
-
logger.emitWarning(new Error(`The "${WEBPACK_DEV_SERVER_ENV_VAR_NAME}" environment variable is set, ` +
|
|
181
|
-
'which will cause problems when webpack is not running in serve mode. ' +
|
|
182
|
-
`(Did a dependency inadvertently load the "${WEBPACK_DEV_SERVER_PACKAGE_NAME}" package?)`));
|
|
183
|
-
}
|
|
184
|
-
let stats;
|
|
185
|
-
if (buildProperties.watchMode) {
|
|
186
|
-
try {
|
|
187
|
-
stats = await node_core_library_1.LegacyAdapters.convertCallbackToPromise(compiler.watch.bind(compiler), {});
|
|
188
|
-
}
|
|
189
|
-
catch (e) {
|
|
190
|
-
logger.emitError(e);
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
else {
|
|
194
|
-
try {
|
|
195
|
-
stats = await node_core_library_1.LegacyAdapters.convertCallbackToPromise(compiler.run.bind(compiler));
|
|
196
|
-
await node_core_library_1.LegacyAdapters.convertCallbackToPromise(compiler.close.bind(compiler));
|
|
197
|
-
}
|
|
198
|
-
catch (e) {
|
|
199
|
-
logger.emitError(e);
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
if (stats) {
|
|
203
|
-
// eslint-disable-next-line require-atomic-updates
|
|
204
|
-
buildProperties.webpackStats = stats;
|
|
205
|
-
this._emitErrors(logger, heftConfiguration.buildFolder, stats);
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
_emitErrors(logger, buildFolder, stats) {
|
|
210
|
-
if (stats.hasErrors() || stats.hasWarnings()) {
|
|
211
|
-
const serializedStats = stats.toJson('errors-warnings');
|
|
212
|
-
if (serializedStats.warnings) {
|
|
213
|
-
for (const warning of serializedStats.warnings) {
|
|
214
|
-
logger.emitWarning(this._normalizeError(buildFolder, warning));
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
if (serializedStats.errors) {
|
|
218
|
-
for (const error of serializedStats.errors) {
|
|
219
|
-
logger.emitError(this._normalizeError(buildFolder, error));
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
_normalizeError(buildFolder, error) {
|
|
225
|
-
if (error instanceof Error) {
|
|
226
|
-
return error;
|
|
227
|
-
}
|
|
228
|
-
else {
|
|
229
|
-
let moduleName = error.moduleName;
|
|
230
|
-
if (!moduleName && error.moduleIdentifier) {
|
|
231
|
-
moduleName = node_core_library_1.Path.convertToSlashes(nodePath.relative(buildFolder, error.moduleIdentifier));
|
|
232
|
-
}
|
|
233
|
-
let formattedError;
|
|
234
|
-
if (error.loc && moduleName) {
|
|
235
|
-
formattedError = `${moduleName}:${error.loc} - ${error.message}`;
|
|
236
|
-
}
|
|
237
|
-
else if (moduleName) {
|
|
238
|
-
formattedError = `${moduleName} - ${error.message}`;
|
|
239
|
-
}
|
|
240
|
-
else {
|
|
241
|
-
formattedError = error.message;
|
|
242
|
-
}
|
|
243
|
-
return new Error(formattedError);
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
exports.WebpackPlugin = WebpackPlugin;
|
|
248
|
-
//# sourceMappingURL=WebpackPlugin.js.map
|
package/lib/WebpackPlugin.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"WebpackPlugin.js","sourceRoot":"","sources":["../src/WebpackPlugin.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport * as nodePath from 'path';\nimport type {\n Compiler as WebpackCompiler,\n MultiCompiler as WebpackMultiCompiler,\n Stats as WebpackStats,\n MultiStats as WebpackMultiStats,\n StatsCompilation as WebpackStatsCompilation,\n StatsError as WebpackStatsError\n} from 'webpack';\nimport type TWebpackDevServer from 'webpack-dev-server';\nimport { LegacyAdapters, Path, Import, IPackageJson, PackageJsonLookup } from '@rushstack/node-core-library';\nimport type {\n HeftConfiguration,\n HeftSession,\n IBuildStageContext,\n IBuildStageProperties,\n IBundleSubstage,\n IHeftPlugin,\n ScopedLogger\n} from '@rushstack/heft';\nimport type {\n IWebpackConfiguration,\n IWebpackBundleSubstageProperties,\n IWebpackBuildStageProperties\n} from './shared';\nimport { WebpackConfigurationLoader } from './WebpackConfigurationLoader';\n\nconst webpack: typeof import('webpack') = Import.lazy('webpack', require);\n\nconst PLUGIN_NAME: string = 'WebpackPlugin';\nconst WEBPACK_DEV_SERVER_PACKAGE_NAME: string = 'webpack-dev-server';\nconst WEBPACK_DEV_SERVER_ENV_VAR_NAME: string = 'WEBPACK_DEV_SERVER';\n\ninterface IWebpackVersions {\n webpackVersion: string;\n webpackDevServerVersion: string;\n}\n\n/**\n * @internal\n */\nexport class WebpackPlugin implements IHeftPlugin {\n public readonly pluginName: string = PLUGIN_NAME;\n\n private static _webpackVersions: IWebpackVersions | undefined;\n private static _getWebpackVersions(): IWebpackVersions {\n if (!WebpackPlugin._webpackVersions) {\n const webpackDevServerPackageJsonPath: string = Import.resolveModule({\n modulePath: 'webpack-dev-server/package.json',\n baseFolderPath: __dirname\n });\n const webpackDevServerPackageJson: IPackageJson = PackageJsonLookup.instance.loadPackageJson(\n webpackDevServerPackageJsonPath\n );\n WebpackPlugin._webpackVersions = {\n webpackVersion: webpack.version!,\n webpackDevServerVersion: webpackDevServerPackageJson.version\n };\n }\n\n return WebpackPlugin._webpackVersions;\n }\n\n public apply(heftSession: HeftSession, heftConfiguration: HeftConfiguration): void {\n heftSession.hooks.build.tap(PLUGIN_NAME, (build: IBuildStageContext) => {\n build.hooks.bundle.tap(PLUGIN_NAME, (bundle: IBundleSubstage) => {\n bundle.hooks.configureWebpack.tap(\n { name: PLUGIN_NAME, stage: Number.MIN_SAFE_INTEGER },\n (webpackConfiguration: unknown) => {\n const webpackVersions: IWebpackVersions = WebpackPlugin._getWebpackVersions();\n bundle.properties.webpackVersion = webpack.version;\n bundle.properties.webpackDevServerVersion = webpackVersions.webpackDevServerVersion;\n\n return webpackConfiguration;\n }\n );\n\n bundle.hooks.configureWebpack.tapPromise(PLUGIN_NAME, async (existingConfiguration: unknown) => {\n const logger: ScopedLogger = heftSession.requestScopedLogger('configure-webpack');\n if (existingConfiguration) {\n logger.terminal.writeVerboseLine(\n 'Skipping loading webpack config file because the webpack config has already been set.'\n );\n return existingConfiguration;\n } else {\n return await WebpackConfigurationLoader.tryLoadWebpackConfigAsync(\n logger,\n heftConfiguration.buildFolder,\n build.properties\n );\n }\n });\n\n bundle.hooks.run.tapPromise(PLUGIN_NAME, async () => {\n await this._runWebpackAsync(\n heftSession,\n heftConfiguration,\n bundle.properties as IWebpackBundleSubstageProperties,\n build.properties,\n heftConfiguration.terminalProvider.supportsColor\n );\n });\n });\n });\n }\n\n private async _runWebpackAsync(\n heftSession: HeftSession,\n heftConfiguration: HeftConfiguration,\n bundleSubstageProperties: IWebpackBundleSubstageProperties,\n buildProperties: IBuildStageProperties,\n supportsColor: boolean\n ): Promise<void> {\n const webpackConfiguration: IWebpackConfiguration | undefined | null =\n bundleSubstageProperties.webpackConfiguration;\n if (!webpackConfiguration) {\n return;\n }\n\n const logger: ScopedLogger = heftSession.requestScopedLogger('webpack');\n const webpackVersions: IWebpackVersions = WebpackPlugin._getWebpackVersions();\n if (bundleSubstageProperties.webpackVersion !== webpackVersions.webpackVersion) {\n logger.emitError(\n new Error(\n `The Webpack plugin expected to be configured with Webpack version ${webpackVersions.webpackVersion}, ` +\n `but the configuration specifies version ${bundleSubstageProperties.webpackVersion}. ` +\n 'Are multiple versions of the Webpack plugin present?'\n )\n );\n }\n\n if (bundleSubstageProperties.webpackDevServerVersion !== webpackVersions.webpackDevServerVersion) {\n logger.emitError(\n new Error(\n `The Webpack plugin expected to be configured with webpack-dev-server version ${webpackVersions.webpackDevServerVersion}, ` +\n `but the configuration specifies version ${bundleSubstageProperties.webpackDevServerVersion}. ` +\n 'Are multiple versions of the Webpack plugin present?'\n )\n );\n }\n\n logger.terminal.writeLine(`Using Webpack version ${webpack.version}`);\n\n let compiler: WebpackCompiler | WebpackMultiCompiler;\n if (Array.isArray(webpackConfiguration)) {\n if (webpackConfiguration.length === 0) {\n logger.terminal.writeLine('The webpack configuration is an empty array - nothing to do.');\n return;\n } else {\n compiler = webpack(webpackConfiguration); /* (webpack.Compilation[]) => MultiCompiler */\n }\n } else {\n compiler = webpack(webpackConfiguration); /* (webpack.Compilation) => Compiler */\n }\n\n if (buildProperties.serveMode) {\n const defaultDevServerOptions: TWebpackDevServer.Configuration = {\n host: 'localhost',\n devMiddleware: {\n publicPath: '/',\n stats: {\n cached: false,\n cachedAssets: false,\n colors: supportsColor\n }\n },\n client: {\n logging: 'info'\n },\n port: 8080\n };\n\n let options: TWebpackDevServer.Configuration;\n if (Array.isArray(webpackConfiguration)) {\n const devServerOptions: TWebpackDevServer.Configuration[] = webpackConfiguration\n .map((configuration) => configuration.devServer)\n .filter((devServer): devServer is TWebpackDevServer.Configuration => !!devServer);\n if (devServerOptions.length > 1) {\n logger.emitWarning(\n new Error(`Detected multiple webpack devServer configurations, using the first one.`)\n );\n }\n\n if (devServerOptions.length > 0) {\n options = { ...defaultDevServerOptions, ...devServerOptions[0] };\n } else {\n options = defaultDevServerOptions;\n }\n } else {\n options = { ...defaultDevServerOptions, ...webpackConfiguration.devServer };\n }\n\n // Register a plugin to callback after webpack is done with the first compilation\n // so we can move on to post-build\n let firstCompilationDoneCallback: (() => void) | undefined;\n const originalBeforeCallback: typeof options.setupMiddlewares | undefined = options.setupMiddlewares;\n options.setupMiddlewares = (middlewares, devServer) => {\n compiler.hooks.done.tap('heft-webpack-plugin', () => {\n if (firstCompilationDoneCallback) {\n firstCompilationDoneCallback();\n firstCompilationDoneCallback = undefined;\n }\n });\n\n if (originalBeforeCallback) {\n return originalBeforeCallback(middlewares, devServer);\n }\n return middlewares;\n };\n\n // The webpack-dev-server package has a design flaw, where merely loading its package will set the\n // WEBPACK_DEV_SERVER environment variable -- even if no APIs are accessed. This environment variable\n // causes incorrect behavior if Heft is not running in serve mode. Thus, we need to be careful to call require()\n // only if Heft is in serve mode.\n const WebpackDevServer: typeof TWebpackDevServer = require(WEBPACK_DEV_SERVER_PACKAGE_NAME);\n // TODO: the WebpackDevServer accepts a third parameter for a logger. We should make\n // use of that to make logging cleaner\n const webpackDevServer: TWebpackDevServer = new WebpackDevServer(options, compiler);\n\n await new Promise<void>((resolve: () => void, reject: (error: Error) => void) => {\n firstCompilationDoneCallback = resolve;\n\n // Wrap in promise.resolve due to small issue in the type declaration, return type should be\n // webpackDevServer.start(): Promise<void>;\n Promise.resolve(webpackDevServer.start()).catch(reject);\n });\n } else {\n if (process.env[WEBPACK_DEV_SERVER_ENV_VAR_NAME]) {\n logger.emitWarning(\n new Error(\n `The \"${WEBPACK_DEV_SERVER_ENV_VAR_NAME}\" environment variable is set, ` +\n 'which will cause problems when webpack is not running in serve mode. ' +\n `(Did a dependency inadvertently load the \"${WEBPACK_DEV_SERVER_PACKAGE_NAME}\" package?)`\n )\n );\n }\n\n let stats: WebpackStats | WebpackMultiStats | undefined;\n if (buildProperties.watchMode) {\n try {\n stats = await LegacyAdapters.convertCallbackToPromise(\n (compiler as WebpackCompiler).watch.bind(compiler),\n {}\n );\n } catch (e) {\n logger.emitError(e as Error);\n }\n } else {\n try {\n stats = await LegacyAdapters.convertCallbackToPromise(\n (compiler as WebpackCompiler).run.bind(compiler)\n );\n await LegacyAdapters.convertCallbackToPromise(compiler.close.bind(compiler));\n } catch (e) {\n logger.emitError(e as Error);\n }\n }\n\n if (stats) {\n // eslint-disable-next-line require-atomic-updates\n (buildProperties as IWebpackBuildStageProperties).webpackStats = stats;\n\n this._emitErrors(logger, heftConfiguration.buildFolder, stats);\n }\n }\n }\n\n private _emitErrors(\n logger: ScopedLogger,\n buildFolder: string,\n stats: WebpackStats | WebpackMultiStats\n ): void {\n if (stats.hasErrors() || stats.hasWarnings()) {\n const serializedStats: WebpackStatsCompilation = stats.toJson('errors-warnings');\n\n if (serializedStats.warnings) {\n for (const warning of serializedStats.warnings) {\n logger.emitWarning(this._normalizeError(buildFolder, warning));\n }\n }\n\n if (serializedStats.errors) {\n for (const error of serializedStats.errors) {\n logger.emitError(this._normalizeError(buildFolder, error));\n }\n }\n }\n }\n\n private _normalizeError(buildFolder: string, error: WebpackStatsError): Error {\n if (error instanceof Error) {\n return error;\n } else {\n let moduleName: string | undefined = error.moduleName;\n if (!moduleName && error.moduleIdentifier) {\n moduleName = Path.convertToSlashes(nodePath.relative(buildFolder, error.moduleIdentifier));\n }\n\n let formattedError: string;\n if (error.loc && moduleName) {\n formattedError = `${moduleName}:${error.loc} - ${error.message}`;\n } else if (moduleName) {\n formattedError = `${moduleName} - ${error.message}`;\n } else {\n formattedError = error.message;\n }\n\n return new Error(formattedError);\n }\n }\n}\n"]}
|