From 3e40369a31ec4b20dbba526c0e3ddabe4e74b7fa Mon Sep 17 00:00:00 2001 From: Konstantin Pschera Date: Fri, 7 May 2021 14:50:25 +0200 Subject: [PATCH] Use compiler.webpack if available This will use compiler.webpack if it is available. Otherwise, it will fall back to require webpack lazily. This will make the plugin compatible with NextJS 10. Closes https://github.com/microsoft/monaco-editor-webpack-plugin/issues/141 --- src/index.ts | 8 +++++--- src/plugins/AddWorkerEntryPointPlugin.ts | 19 ++++++++++--------- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/index.ts b/src/index.ts index 39c7d4e..f8b3acc 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,5 @@ +import type * as webpack from 'webpack'; import * as path from 'path'; -import * as webpack from 'webpack'; import * as loaderUtils from 'loader-utils'; import * as fs from 'fs'; import { AddWorkerEntryPointPlugin } from './plugins/AddWorkerEntryPointPlugin'; @@ -139,7 +139,7 @@ class MonacoEditorWebpackPlugin implements webpack.WebpackPluginInstance { } }); const rules = createLoaderRules(languages, features, workers, filename, publicPath, compilationPublicPath); - const plugins = createPlugins(workers, filename); + const plugins = createPlugins(compiler, workers, filename); addCompilerRules(compiler, rules); addCompilerPlugins(compiler, plugins); } @@ -247,7 +247,9 @@ function createLoaderRules(languages: IFeatureDefinition[], features: IFeatureDe ]; } -function createPlugins(workers: ILabeledWorkerDefinition[], filename: string): AddWorkerEntryPointPlugin[] { +function createPlugins(compiler: webpack.Compiler, workers: ILabeledWorkerDefinition[], filename: string): AddWorkerEntryPointPlugin[] { + const webpack = compiler.webpack ?? require('webpack'); + return ( ([]) .concat(workers.map(({ id, entry }) => diff --git a/src/plugins/AddWorkerEntryPointPlugin.ts b/src/plugins/AddWorkerEntryPointPlugin.ts index 8f39d2c..34be2c2 100644 --- a/src/plugins/AddWorkerEntryPointPlugin.ts +++ b/src/plugins/AddWorkerEntryPointPlugin.ts @@ -1,8 +1,4 @@ -import * as webpack from 'webpack'; -const webpackVersion = require('webpack/package.json').version; -const SingleEntryPlugin = require('webpack/lib/SingleEntryPlugin'); -const LoaderTargetPlugin = require('webpack/lib/LoaderTargetPlugin'); -const WebWorkerTemplatePlugin = require('webpack/lib/webworker/WebWorkerTemplatePlugin'); +import type * as webpack from 'webpack'; export interface IAddWorkerEntryPointPluginOptions { id: string; @@ -13,6 +9,8 @@ export interface IAddWorkerEntryPointPluginOptions { } function getCompilerHook(compiler: webpack.Compiler, { id, entry, filename, chunkFilename, plugins }: IAddWorkerEntryPointPluginOptions) { + const webpack = compiler.webpack ?? require('webpack'); + return function (compilation: webpack.Compilation, callback: (error?: Error | null | false) => void) { const outputOptions = { filename, @@ -22,13 +20,14 @@ function getCompilerHook(compiler: webpack.Compiler, { id, entry, filename, chun globalObject: 'this', }; const childCompiler = compilation.createChildCompiler(id, outputOptions, [ - new WebWorkerTemplatePlugin(), - new LoaderTargetPlugin('webworker'), + new webpack.webworker.WebWorkerTemplatePlugin(), + new webpack.LoaderTargetPlugin('webworker'), ]); + const SingleEntryPlugin = webpack.EntryPlugin ?? webpack.SingleEntryPlugin; new SingleEntryPlugin(compiler.context, entry, 'main').apply(childCompiler); plugins.forEach((plugin) => plugin.apply(childCompiler)); - childCompiler.runAsChild((err?: Error, entries?: webpack.Chunk[], compilation?: webpack.Compilation) => callback(err)); + childCompiler.runAsChild((err?: Error) => callback(err)); } } @@ -41,8 +40,10 @@ export class AddWorkerEntryPointPlugin implements webpack.WebpackPluginInstance } apply(compiler: webpack.Compiler) { + const webpack = compiler.webpack ?? require('webpack'); const compilerHook = getCompilerHook(compiler, this.options); - if (webpackVersion < '4') { + const majorVersion = webpack.version.split('.')[0] + if (parseInt(majorVersion) < 4) { (compiler).plugin('make', compilerHook); } else { compiler.hooks.make.tapAsync('AddWorkerEntryPointPlugin', compilerHook);