diff --git a/.yarn-offline-mirror/html-webpack-plugin-4.3.0.tgz b/.yarn-offline-mirror/html-webpack-plugin-4.3.0.tgz deleted file mode 100644 index 9dfad43..0000000 Binary files a/.yarn-offline-mirror/html-webpack-plugin-4.3.0.tgz and /dev/null differ diff --git a/.yarn-offline-mirror/html-webpack-plugin-5.0.0-alpha.6.tgz b/.yarn-offline-mirror/html-webpack-plugin-5.0.0-alpha.6.tgz new file mode 100644 index 0000000..3ed4b0b Binary files /dev/null and b/.yarn-offline-mirror/html-webpack-plugin-5.0.0-alpha.6.tgz differ diff --git a/.yarn-offline-mirror/lodash-4.17.20.tgz b/.yarn-offline-mirror/lodash-4.17.20.tgz new file mode 100644 index 0000000..350db99 Binary files /dev/null and b/.yarn-offline-mirror/lodash-4.17.20.tgz differ diff --git a/.yarn-offline-mirror/object.getownpropertydescriptors-2.0.3.tgz b/.yarn-offline-mirror/object.getownpropertydescriptors-2.0.3.tgz deleted file mode 100644 index 1228517..0000000 Binary files a/.yarn-offline-mirror/object.getownpropertydescriptors-2.0.3.tgz and /dev/null differ diff --git a/.yarn-offline-mirror/util.promisify-1.0.0.tgz b/.yarn-offline-mirror/util.promisify-1.0.0.tgz deleted file mode 100644 index 43150c4..0000000 Binary files a/.yarn-offline-mirror/util.promisify-1.0.0.tgz and /dev/null differ diff --git a/examples/vue-cssextract/webpack.config.js b/examples/vue-cssextract/webpack.config.js index c2f0eec..3454ca6 100644 --- a/examples/vue-cssextract/webpack.config.js +++ b/examples/vue-cssextract/webpack.config.js @@ -19,9 +19,7 @@ module.exports = { use: BabelMultiTargetPlugin.loader(), }, { test: /\.vue$/, - use: [ - BabelMultiTargetPlugin.loader('vue-loader'), - ], + use: BabelMultiTargetPlugin.loader('vue-loader'), }, { test: /\.css$/, @@ -31,18 +29,4 @@ module.exports = { ], }], }, - - node: { - // prevent webpack from injecting useless setImmediate polyfill because Vue - // source contains it (although only uses it if it's native). - setImmediate: false, - // prevent webpack from injecting mocks to Node native modules - // that does not make sense for the client - dgram: 'empty', - fs: 'empty', - net: 'empty', - tls: 'empty', - // eslint-disable-next-line camelcase - child_process: 'empty', - }, } diff --git a/examples/vue-dynamic-import/webpack.config.js b/examples/vue-dynamic-import/webpack.config.js index d3b2fcb..a071fb1 100644 --- a/examples/vue-dynamic-import/webpack.config.js +++ b/examples/vue-dynamic-import/webpack.config.js @@ -38,18 +38,4 @@ module.exports = { }, ], }, - - node: { - // prevent webpack from injecting useless setImmediate polyfill because Vue - // source contains it (although only uses it if it's native). - setImmediate: false, - // prevent webpack from injecting mocks to Node native modules - // that does not make sense for the client - dgram: 'empty', - fs: 'empty', - net: 'empty', - tls: 'empty', - // eslint-disable-next-line camelcase - child_process: 'empty', - }, } diff --git a/package.json b/package.json index d2b8b6f..0448e2d 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,7 @@ }, "peerDependencies": { "core-js": "^2.6.3 || ^3.6.5", - "html-webpack-plugin": "^4.0.0", + "html-webpack-plugin": "^5.0.0-alpha.6", "terser": ">=3.12.0", "webpack": "^5.0.0", "webpack-dev-server": "^3.1.0" @@ -115,7 +115,7 @@ "hard-source-webpack-plugin": "^0.13.1", "html-loader": "^1.1.0", "html-webpack-include-assets-plugin": "^2.0.0", - "html-webpack-plugin": "^4.3.0", + "html-webpack-plugin": "^5.0.0-alpha.6", "jasmine-core": "^3.6.0", "jasmine-spec-reporter": "^5.0.2", "mini-css-extract-plugin": "^0.9.0", diff --git a/src/babel-target.ts b/src/babel-target.ts index d0c6166..04e4244 100644 --- a/src/babel-target.ts +++ b/src/babel-target.ts @@ -1,9 +1,5 @@ import { BabelLoaderTransformOptions, BabelPresetOptions } from 'babel-loader' -import * as webpack from 'webpack' -import Chunk = webpack.Chunk -import ChunkGroup = webpack.ChunkGroup -import Entrypoint = webpack.Entrypoint -import Module = webpack.Module +import { Chunk, ChunkGroup, ChunkGraph, Entrypoint, Module } from 'webpack' import { BabelLoaderCacheDirectoryOption } from './babel.multi.target.options' import { BabelTargetOptions } from './babel.target.options' @@ -33,8 +29,9 @@ export type BabelTargetInfo = { [TOption in keyof BabelTargetOptions]: BabelTarg // so, need to do this instead const SIG = { module: [ - 'disconnect', - 'unseal', + // These are removed in webpack@5 + // 'disconnect', + // 'unseal', 'isEntryModule', 'isInChunk', ], @@ -51,7 +48,8 @@ const SIG = { 'hasEntryModule', 'addModule', 'removeModule', - 'setModules', + // This is removed in webpack@5 + // 'setModules', 'getNumberOfModules', 'addGroup', 'isInGroup', @@ -137,7 +135,7 @@ export class BabelTarget implements BabelTargetInfo { } public static getTargetFromModule(module: Module): BabelTarget { - if (module.options && module.options.babelTarget) { + if (module.options?.babelTarget) { return module.options.babelTarget } @@ -146,7 +144,7 @@ export class BabelTarget implements BabelTargetInfo { } for (const reason of module.reasons) { - if (reason.dependency && reason.dependency.babelTarget) { + if (reason.dependency?.babelTarget) { return reason.dependency.babelTarget } if (reason.module) { @@ -162,10 +160,16 @@ export class BabelTarget implements BabelTargetInfo { } public static getTargetFromEntrypoint(entrypoint: Entrypoint): BabelTarget { - if (!entrypoint.runtimeChunk.hasEntryModule()) { + if (!entrypoint.getRuntimeChunk().hasEntryModule()) { return undefined } - return BabelTarget.getTargetFromModule(entrypoint.runtimeChunk.entryModule) + const arr = Array.from( + ChunkGraph.getChunkGraphForChunk( + entrypoint.getRuntimeChunk(), + 'Chunk.entryModule', + 'DEP_WEBPACK_CHUNK_ENTRY_MODULE', + ).getChunkEntryModulesIterable(entrypoint.getRuntimeChunk())) + return BabelTarget.getTargetFromModule(arr[0]) } // eslint-disable-next-line diff --git a/src/babel.multi.target.html.updater.ts b/src/babel.multi.target.html.updater.ts index cb8082c..7b67401 100644 --- a/src/babel.multi.target.html.updater.ts +++ b/src/babel.multi.target.html.updater.ts @@ -90,18 +90,18 @@ export class BabelMultiTargetHtmlUpdater implements Plugin { // not sure if this is a problem since webpack will wait for dependencies to load, but sorting // by auto/dependency will result in a cyclic dependency error for lazy-loaded routes - htmlWebpackPlugin.options.chunksSortMode = 'none' as any + htmlWebpackPlugin.userOptions.chunksSortMode = 'none' as any - if ((htmlWebpackPlugin.options.chunks as any) !== 'all' && - htmlWebpackPlugin.options.chunks && - htmlWebpackPlugin.options.chunks.length + if ((htmlWebpackPlugin.userOptions.chunks as any) !== 'all' && + htmlWebpackPlugin.userOptions.chunks && + htmlWebpackPlugin.userOptions.chunks.length ) { - htmlWebpackPlugin.options.chunks = this.mapChunkNames(htmlWebpackPlugin.options.chunks as string[]) + htmlWebpackPlugin.userOptions.chunks = this.mapChunkNames(htmlWebpackPlugin.userOptions.chunks as string[]) } - if (htmlWebpackPlugin.options.excludeChunks && - htmlWebpackPlugin.options.excludeChunks.length) { - htmlWebpackPlugin.options.excludeChunks = this.mapChunkNames(htmlWebpackPlugin.options.excludeChunks) + if (htmlWebpackPlugin.userOptions.excludeChunks && + htmlWebpackPlugin.userOptions.excludeChunks.length) { + htmlWebpackPlugin.userOptions.excludeChunks = this.mapChunkNames(htmlWebpackPlugin.userOptions.excludeChunks) } compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation: Compilation) => { diff --git a/src/babel.multi.target.plugin.ts b/src/babel.multi.target.plugin.ts index 0186ac7..231456c 100644 --- a/src/babel.multi.target.plugin.ts +++ b/src/babel.multi.target.plugin.ts @@ -73,7 +73,8 @@ export class BabelMultiTargetPlugin implements Plugin { // magic starts here! new BabelTargetEntryOptionPlugin(this.targets).apply(compiler) new TargetingPlugin(this.targets, this.options.exclude, this.options.doNotTarget, compiler.options.externals).apply(compiler) - new NormalizeCssChunksPlugin(this.targets).apply(compiler) + // TODO + // new NormalizeCssChunksPlugin(this.targets).apply(compiler) new BabelMultiTargetHtmlUpdater(this.targets).apply(compiler) if (this.options.safari10NoModuleFix) { new SafariNoModuleFixPlugin(this.options.safari10NoModuleFix).apply(compiler) diff --git a/src/babel.target.entry.dependency.ts b/src/babel.target.entry.dependency.ts index c3e6745..986c459 100644 --- a/src/babel.target.entry.dependency.ts +++ b/src/babel.target.entry.dependency.ts @@ -1,14 +1,40 @@ import { BabelTarget } from './babel-target' +import { DEV_SERVER_CLIENT } from './constants' -import Dependency = require('webpack/lib/Dependency') +import ModuleDependency = require('webpack/lib/dependencies/ModuleDependency') -export interface EntryLoc { +interface EntryLoc { name: string index?: number } -export interface BabelTargetEntryDependency extends Dependency { - babelTarget: BabelTarget - loc: EntryLoc - name: string +// TODO what's makeSerializable? +export class BabelTargetEntryDependency extends ModuleDependency { + + public name: string + public loc: EntryLoc + + public get type(): string { + return 'babel target entry' + } + + public getResourceIdentifier(): string { + return `module${this.request}!${this.babelTarget.key}` + } + + public get category(): string { + return 'esm' + } + + constructor(public babelTarget: BabelTarget, request: string, public originalName: string, loc?: EntryLoc) { + super(`${request.startsWith(DEV_SERVER_CLIENT) ? request : babelTarget.getTargetedRequest(request)}`) + + this.name = babelTarget.getTargetedAssetName(originalName) + if (!loc) { + loc = { name: `${this.request}:${babelTarget.key}` } + } else { + loc.name += `:${babelTarget.key}` + } + this.loc = loc + } } diff --git a/src/babel.target.entry.option.plugin.ts b/src/babel.target.entry.option.plugin.ts index 68281fe..abf8ff4 100644 --- a/src/babel.target.entry.option.plugin.ts +++ b/src/babel.target.entry.option.plugin.ts @@ -1,8 +1,7 @@ import { Compiler, Plugin } from 'webpack' import { BabelTarget } from './babel-target' -import { BabelTargetMultiEntryPlugin } from './babel.target.multi.entry.plugin' -import { BabelTargetSingleEntryPlugin } from './babel.target.single.entry.plugin' +import { BabelTargetEntryPlugin } from './babel.target.entry.plugin' // takes over processing of webpack's entry options so that it generates one entry per entry and target // basically the same as webpack's built-in EntryOptionPlugin, just using the babel targeting stuff instead @@ -15,27 +14,56 @@ export class BabelTargetEntryOptionPlugin implements Plugin { constructor(private targets: BabelTarget[]) { } - private itemToPlugin(context: string, item: string | string[], name: string): Plugin { - if (Array.isArray(item)) { - return new BabelTargetMultiEntryPlugin(this.targets, context, name, item) + // private itemToPlugin(context: string, item: string | string[], name: string): Plugin { + // if (Array.isArray(item)) { + // return new BabelTargetMultiEntryPlugin(this.targets, context, name, item) + // } + // if (this.targets.find(target => !!(target.additionalModules && target.additionalModules.length))) { + // return new BabelTargetMultiEntryPlugin(this.targets, context, name, [item]) + // } + // return new BabelTargetSingleEntryPlugin(this.targets, context, name, item) + // } + + private static entryDescriptionToOptions(compiler: Compiler, name: string, desc: any): any { + const options = { + name, + filename: desc.filename, + runtime: desc.runtime, + dependOn: desc.dependOn, + chunkLoading: desc.chunkLoading, + wasmLoading: desc.wasmLoading, + library: desc.library, + } + // TODO what does those plugins do? + if (desc.chunkLoading) { + // const EnableChunkLoadingPlugin = require("./javascript/EnableChunkLoadingPlugin") + // EnableChunkLoadingPlugin.checkEnabled(compiler, desc.chunkLoading) } - if (this.targets.find(target => !!(target.additionalModules && target.additionalModules.length))) { - return new BabelTargetMultiEntryPlugin(this.targets, context, name, [item]) + if (desc.wasmLoading) { + // const EnableWasmLoadingPlugin = require("./wasm/EnableWasmLoadingPlugin") + // EnableWasmLoadingPlugin.checkEnabled(compiler, desc.wasmLoading) } - return new BabelTargetSingleEntryPlugin(this.targets, context, name, item) + if (desc.library) { + // const EnableLibraryPlugin = require("./library/EnableLibraryPlugin") + // EnableLibraryPlugin.checkEnabled(compiler, desc.library.type) + } + return options } public apply(compiler: Compiler): void { compiler.hooks.entryOption.tap('EntryOptionPlugin', (context: string, entry: any) => { - if (typeof entry === 'string' || Array.isArray(entry)) { - this.itemToPlugin(context, entry, 'main').apply(compiler) - } else if (typeof entry === 'object') { - for (const name of Object.keys(entry)) { - this.itemToPlugin(context, entry[name], name).apply(compiler) - } - } else if (typeof entry === 'function') { + if (typeof entry === 'function') { + // TODO figure out why throw new Error('not supported') // new DynamicEntryPlugin(context, entry).apply(compiler) + } else{ + for (const name of Object.keys(entry)) { + const desc = entry[name] + const options = BabelTargetEntryOptionPlugin.entryDescriptionToOptions(compiler, name, desc) + for (const entry of desc.import) { + new BabelTargetEntryPlugin(this.targets, context, entry, options).apply(compiler) + } + } } return true }) diff --git a/src/babel.target.entry.plugin.ts b/src/babel.target.entry.plugin.ts index 213561c..296a478 100644 --- a/src/babel.target.entry.plugin.ts +++ b/src/babel.target.entry.plugin.ts @@ -1,24 +1,32 @@ -import { Compiler, Plugin, Compilation, Dependency, NormalModuleFactory } from 'webpack' +import { Compiler, EntryPlugin, Compilation, Dependency, NormalModuleFactory } from 'webpack' import { BabelTarget } from './babel-target' -import { BabelTargetSingleEntryDependency } from './babel.target.single.entry.dependency' import { BabelTargetEntryDependency } from './babel.target.entry.dependency' -export abstract class BabelTargetEntryPlugin implements Plugin { - - protected constructor(protected targets: BabelTarget[], protected context: string, protected name: string) { - } +export class BabelTargetEntryPlugin implements EntryPlugin { + public constructor(protected targets: BabelTarget[], public context: string, + public entry: string, public options: EntryPlugin['options']) {} public apply(compiler: Compiler): void { compiler.hooks.compilation.tap( this.constructor.name, (compilation: Compilation, { normalModuleFactory }: { normalModuleFactory: NormalModuleFactory }) => { compilation.dependencyFactories.set( - BabelTargetSingleEntryDependency, + BabelTargetEntryDependency, normalModuleFactory, ) }, ) + + compiler.hooks.make.tapPromise( + this.constructor.name, + async (compilation: Compilation) => { + await Promise.all(this.targets.map(async target => { + const dep = new BabelTargetEntryDependency(target, this.entry, (this.options as any).name) + return await this.addEntry(compilation, dep) + })) + }, + ) } protected async addEntry(compilation: Compilation, dep: BabelTargetEntryDependency): Promise diff --git a/src/babel.target.multi.entry.dependency.ts b/src/babel.target.multi.entry.dependency.ts deleted file mode 100644 index e5bd212..0000000 --- a/src/babel.target.multi.entry.dependency.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { BabelTarget } from './babel-target' -import { BabelTargetEntryDependency, EntryLoc } from './babel.target.entry.dependency' -import Dependency = require('webpack/lib/Dependency') - -export class BabelTargetMultiEntryDependency extends Dependency implements BabelTargetEntryDependency { - - public loc: EntryLoc - public name: string - - public get type(): string { - return 'babel target multi entry' - } - - constructor(public babelTarget: BabelTarget, public dependencies: Dependency[], public originalName: string) { - super() - this.name = babelTarget.getTargetedAssetName(originalName) - } -} diff --git a/src/babel.target.multi.entry.plugin.ts b/src/babel.target.multi.entry.plugin.ts deleted file mode 100644 index d89b101..0000000 --- a/src/babel.target.multi.entry.plugin.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { Compilation, Compiler, NormalModuleFactory } from 'webpack' -import MultiModuleFactory = require('webpack/lib/MultiModuleFactory') -import SingleEntryDependency = require('webpack/lib/dependencies/SingleEntryDependency') - -import { BabelTarget } from './babel-target' -import { BabelTargetEntryDependency } from './babel.target.entry.dependency' -import { BabelTargetEntryPlugin } from './babel.target.entry.plugin' -import { BabelTargetMultiEntryDependency } from './babel.target.multi.entry.dependency' -import { BabelTargetSingleEntryDependency } from './babel.target.single.entry.dependency' - -interface ExistingFactories { - multiModuleFactory?: MultiModuleFactory - normalModuleFactory?: NormalModuleFactory -} - -export class BabelTargetMultiEntryPlugin extends BabelTargetEntryPlugin { - - constructor(targets: BabelTarget[], context: string, name: string, private entries: string[]) { - super(targets, context, name) - } - - public apply(compiler: Compiler): void { - super.apply(compiler) - - compiler.hooks.compilation.tap( - 'BabelTargetMultiEntryPlugin', - (compilation: Compilation, { multiModuleFactory, normalModuleFactory }: ExistingFactories) => { - (compilation.dependencyFactories as Map).set( - BabelTargetMultiEntryDependency, - multiModuleFactory || new MultiModuleFactory(), - ); - (compilation.dependencyFactories as Map).set( - SingleEntryDependency, - normalModuleFactory, - ) - }, - ) - - compiler.hooks.make.tapPromise( - 'BabelTargetMultiEntryPlugin', - async (compilation: Compilation) => { - - await Promise.all(this.targets.map(async target => { - const entries = [...(target.additionalModules || []), ...this.entries] - const dep = BabelTargetMultiEntryPlugin.createDependency(target, entries, this.name) - return await this.addEntry(compilation, dep) - })) - }, - ) - } - - static createDependency(target: BabelTarget, entries: string[], name: string): BabelTargetEntryDependency { - return new BabelTargetMultiEntryDependency(target, - entries.map((e, idx) => { - // Because entrypoints are not dependencies found in an - // existing module, we give it a synthetic id - return new BabelTargetSingleEntryDependency(target, e, name, { name, index: idx }) - }), - name, - ) - } - -} diff --git a/src/babel.target.single.entry.dependency.ts b/src/babel.target.single.entry.dependency.ts deleted file mode 100644 index 757c988..0000000 --- a/src/babel.target.single.entry.dependency.ts +++ /dev/null @@ -1,31 +0,0 @@ -import ModuleDependency = require('webpack/lib/dependencies/ModuleDependency') - -import { BabelTarget } from './babel-target' -import { BabelTargetEntryDependency, EntryLoc } from './babel.target.entry.dependency' -import { DEV_SERVER_CLIENT } from './constants' - -export class BabelTargetSingleEntryDependency extends ModuleDependency implements BabelTargetEntryDependency { - - public name: string - public loc: EntryLoc - - public get type(): string { - return 'babel target single entry' - } - - public getResourceIdentifier(): string { - return `module${this.request}!${this.babelTarget.key}` - } - - constructor(public babelTarget: BabelTarget, request: string, public originalName: string, loc?: EntryLoc) { - super(`${request.startsWith(DEV_SERVER_CLIENT) ? request : babelTarget.getTargetedRequest(request)}`) - - this.name = babelTarget.getTargetedAssetName(originalName) - if (!loc) { - loc = { name: `${this.request}:${babelTarget.key}` } - } else { - loc.name += `:${babelTarget.key}` - } - this.loc = loc - } -} diff --git a/src/babel.target.single.entry.plugin.ts b/src/babel.target.single.entry.plugin.ts deleted file mode 100644 index db43ff5..0000000 --- a/src/babel.target.single.entry.plugin.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { Compilation, Compiler } from 'webpack' - -import { BabelTarget } from './babel-target' -import { BabelTargetEntryDependency } from './babel.target.entry.dependency' -import { BabelTargetEntryPlugin } from './babel.target.entry.plugin' -import { BabelTargetSingleEntryDependency } from './babel.target.single.entry.dependency' - -export class BabelTargetSingleEntryPlugin extends BabelTargetEntryPlugin { - - constructor(targets: BabelTarget[], context: string, name: string, private entry: string) { - super(targets, context, name) - } - - public apply(compiler: Compiler): void { - super.apply(compiler) - - compiler.hooks.make.tapPromise( - 'BabelTargetSingleEntryPlugin', - async (compilation: Compilation) => { - - await Promise.all(this.targets.map(async target => { - const dep = BabelTargetSingleEntryPlugin.createDependency(target, this.entry, this.name) - return await this.addEntry(compilation, dep) - })) - - }, - ) - } - - static createDependency(target: BabelTarget, entry: string, name: string): BabelTargetEntryDependency { - return new BabelTargetSingleEntryDependency(target, entry, name) - } - -} diff --git a/src/named.lazy.chunks.plugin.ts b/src/named.lazy.chunks.plugin.ts index 29cb640..c74d0ad 100644 --- a/src/named.lazy.chunks.plugin.ts +++ b/src/named.lazy.chunks.plugin.ts @@ -15,9 +15,9 @@ export class NamedLazyChunksPlugin implements Plugin { if (!group.origins) { return } - if ((group as Entrypoint).runtimeChunk === chunk) { + if ((group as Entrypoint).getRuntimeChunk() === chunk) { // TODO did this actually get called? - result.origins = [ (group as Entrypoint).runtimeChunk.entryModule.reasons[0].dependencies.originalName ] + result.origins = [ (group as Entrypoint).getRuntimeChunk().entryModule.reasons[0].dependencies.originalName ] result.isEntry = true } group.origins.forEach((origin) => { diff --git a/src/normalize.module.ids.plugin.ts b/src/normalize.module.ids.plugin.ts index c7eb4d1..1f56015 100644 --- a/src/normalize.module.ids.plugin.ts +++ b/src/normalize.module.ids.plugin.ts @@ -45,18 +45,19 @@ export class NormalizeModuleIdsPlugin implements Plugin { if (compilation.name) { return } - const hooks = compilation.mainTemplate.hooks as any - hooks.beforeStartup.tap(this.pluginName('conditional jsonp callback'), (source: string) => { - const insertPointCode = 'var oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n' - const insertPoint = source.indexOf(insertPointCode) - if (insertPoint < 0) { - return - } - const before = source.substring(0, insertPoint) - const after = source.substring(insertPoint) - return `${before}if (jsonpArray.push.name === 'webpackJsonpCallback') return;\n${after}` - - }) + // TODO: what's the alternative? + // const hooks = compilation.mainTemplate.hooks + // hooks.beforeStartup.tap(this.pluginName('conditional jsonp callback'), (source: string) => { + // const insertPointCode = 'var oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n' + // const insertPoint = source.indexOf(insertPointCode) + // if (insertPoint < 0) { + // return + // } + // const before = source.substring(0, insertPoint) + // const after = source.substring(insertPoint) + // return `${before}if (jsonpArray.push.name === 'webpackJsonpCallback') return;\n${after}` + + // }) }) return compiler }) diff --git a/src/targeting.plugin.ts b/src/targeting.plugin.ts index 1be1696..9e9c5a1 100644 --- a/src/targeting.plugin.ts +++ b/src/targeting.plugin.ts @@ -214,7 +214,7 @@ export class TargetingPlugin implements Plugin { } public async afterResolve(resolveContext: any): Promise { - const loaders: BabelMultiTargetLoader[] = (resolveContext.loaders || []) + const loaders: BabelMultiTargetLoader[] = (resolveContext.createData?.loaders || []) .filter((loaderInfo: any) => loaderInfo.options && loaderInfo.options.isBabelMultiTargetLoader) this.checkResolveTarget(resolveContext, !!loaders.length) @@ -242,7 +242,7 @@ export class TargetingPlugin implements Plugin { // this is probably a dynamic import, in which case the dependencies need to get targeted resolveContext.dependencies.forEach((dep: Dependency) => this.targetDependency(dep, babelTarget)) } else { - babelTarget = this.getBlindTarget(resolveContext.resourceResolveData.context.issuer, resolveContext.request) + babelTarget = this.getBlindTarget(resolveContext.contextInfo.issuer, resolveContext.request) } this.targetChunkNames(resolveContext, babelTarget) @@ -269,10 +269,10 @@ export class TargetingPlugin implements Plugin { (resolveContext.resourceResolveData && this.getTargetFromContext(resolveContext))) loaders.forEach((loader: BabelMultiTargetLoader) => { - const index = resolveContext.loaders.indexOf(loader) + const index = resolveContext.createData.loaders.indexOf(loader) if (!babelTarget) { - resolveContext.loaders.splice(index, 1) + resolveContext.createData.loaders.splice(index, 1) return } @@ -282,9 +282,9 @@ export class TargetingPlugin implements Plugin { ident: (loader as any).ident, } if (loader.loader === this.babelLoaderPath) { - resolveContext.loaders.splice(index, 1, this.getTargetedBabelLoader(effectiveLoader, babelTarget)) + resolveContext.createData.loaders.splice(index, 1, this.getTargetedBabelLoader(effectiveLoader, babelTarget)) } else { - resolveContext.loaders.splice(index, 1, effectiveLoader) + resolveContext.createData.loaders.splice(index, 1, effectiveLoader) } }) @@ -361,8 +361,8 @@ export class TargetingPlugin implements Plugin { return true } - const pkgRoot = resolveContext.resourceResolveData.descriptionFileRoot - const pkg = resolveContext.resourceResolveData.descriptionFileData + const pkgRoot = resolveContext.createData.resourceResolveData.descriptionFileRoot + const pkg = resolveContext.createData.resourceResolveData.descriptionFileData // coming from a package's "main" or "browser" field? don't need to transpile if (pkg.main && resolveContext.resource === path.resolve(pkgRoot, pkg.main)) { @@ -403,9 +403,7 @@ export class TargetingPlugin implements Plugin { if (context.contextInfo && context.contextInfo.babelTarget) { return context.contextInfo.babelTarget } - if (context.resourceResolveData && - context.resourceResolveData.context && - context.resourceResolveData.context.babelTarget + if (context.resourceResolveData?.context?.babelTarget ) { return context.resourceResolveData.context.babelTarget } diff --git a/src/types/webpack.d.ts b/src/types/webpack.d.ts index b64daea..7104926 100644 --- a/src/types/webpack.d.ts +++ b/src/types/webpack.d.ts @@ -3,7 +3,7 @@ import { Source } from 'webpack-sources' declare module 'webpack' { import { AsyncHook, AsyncParallelHook, AsyncSeriesHook, SyncBailHook, SyncHook } from 'tapable' - import { Chunk, Compiler, Compilation, Entry, Record, Stats, Output, ExternalsPlugin, WebpackPluginInstance } from 'webpack' + import { Chunk, Compiler, Compilation, Entry, Stats, ExternalsPlugin, WebpackPluginInstance } from 'webpack' import { Source } from 'webpack-sources' import LoaderContext = webpack.loader.LoaderContext @@ -19,47 +19,17 @@ declare module 'webpack' { type NormalModuleFactory = ReturnType['normalModuleFactory']; type ContextModuleFactory = ReturnType['contextModuleFactory']; - interface Compiler { - hooks: CompilerHooks - - runAsChild(handler?: Compiler.Handler): void - - parentCompilation?: Compilation - context: string - } - export type AssetPathData = any - interface SizeOptions { - chunkOverhead: number - entryChunkMultiplicator: number - } - - type DeArray = T extends Array ? TEle : never - type ChunkGroup = DeArray - - interface Chunk { - isInitial(): boolean; - } - - interface Block {} - - interface Entrypoint extends ChunkGroup { - runtimeChunk: Chunk - } + type ChunkGroup = DeArraCompilation['chunkGroups'][number] + type Entrypoint = Compilation['asyncEntrypoints'][number] interface Compilation { addChunkInGroup(name?: string, module?: Module, loc?: any, request?: string): ChunkGroup } import { BabelTarget } from './babel.target' - interface Compilation { - assetTargets: { [file: string]: BabelTarget } - targetAssets: { [key: string]: { target: BabelTarget; map: { [originalFile: string]: string } } } - babelIgnored: string[] - } - interface Dependency { module: Module request: string @@ -70,39 +40,8 @@ declare module 'webpack' { originalName?: string } - interface DependenciesBlock { - dependencies: Dependency[] - blocks: any[] - variables: any[] - } - interface Module extends DependenciesBlock { - addDependency(dep: Dependency): void - - type: string - context: string - debugId: number - hash: string - renderedHash: string - resolveOptions: any - factoryMeta: any - warnings: any[] - errors: any[] reasons: any[] - buildMeta: any - buildInfo: any - id: string - index: number - index2: number - depth: number - issuer: Module - profile: any - prefetched: boolean - built: boolean - used: any - usedExports: any - optimizationBailout: any[] - request?: string options?: any } diff --git a/yarn.lock b/yarn.lock index 544fc8a..55c842f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1446,7 +1446,7 @@ "@types/source-list-map" "*" source-map "^0.7.3" -"@types/webpack@*", "@types/webpack@^4.41.8": +"@types/webpack@*": version "4.41.21" resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.21.tgz#cc685b332c33f153bb2f5fc1fa3ac8adeb592dee" integrity sha512-2j9WVnNrr/8PLAB5csW44xzQSJwS26aOnICsP3pSGCEdsu6KYtfQ6QJsVUKHWRnm1bL7HziJsfh5fHqth87yKA== @@ -3183,7 +3183,7 @@ error-ex@^1.2.0, error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.12.0, es-abstract@^1.5.1, es-abstract@^1.7.0: +es-abstract@^1.12.0, es-abstract@^1.7.0: version "1.13.0" resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg== @@ -4182,20 +4182,18 @@ html-webpack-include-assets-plugin@^2.0.0: minimatch "^3.0.4" slash "^2.0.0" -html-webpack-plugin@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.3.0.tgz#53bf8f6d696c4637d5b656d3d9863d89ce8174fd" - integrity sha512-C0fzKN8yQoVLTelcJxZfJCE+aAvQiY2VUf3UuKrR4a9k5UMWYOtpDLsaXwATbcVCnI05hUS7L9ULQHWLZhyi3w== +html-webpack-plugin@^5.0.0-alpha.6: + version "5.0.0-alpha.6" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.0.0-alpha.6.tgz#948f218b27d6f2bfbf0ae4f40816141dcdf55674" + integrity sha512-duuDbc+3/GZtTmxP7N4jsTyF83QpjOlM2llL0AjCg22wSreSmbzD6r2ZjnAgLjHvNAmSrMQgPxL9PrE0pTaBmQ== dependencies: "@types/html-minifier-terser" "^5.0.0" "@types/tapable" "^1.0.5" - "@types/webpack" "^4.41.8" html-minifier-terser "^5.0.1" - loader-utils "^1.2.3" - lodash "^4.17.15" + loader-utils "2.0.0" + lodash "^4.17.20" pretty-error "^2.1.1" - tapable "^1.1.3" - util.promisify "1.0.0" + tapable "2.0.0" htmlparser2@^3.3.0: version "3.10.1" @@ -5071,6 +5069,15 @@ loader-runner@^4.1.0: resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.1.0.tgz#f70bc0c29edbabdf2043e7ee73ccc3fe1c96b42d" integrity sha512-oR4lB4WvwFoC70ocraKhn5nkKSs23t57h9udUgw8o0iH8hMXeEoRuUgfcvgUwAJ1ZpRqBvcou4N2SMvM1DwMrA== +loader-utils@2.0.0, loader-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0" + integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + loader-utils@^0.2.17: version "0.2.17" resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348" @@ -5090,7 +5097,7 @@ loader-utils@^1.0.0, loader-utils@^1.4.0: emojis-list "^3.0.0" json5 "^1.0.1" -loader-utils@^1.1.0, loader-utils@^1.2.3: +loader-utils@^1.1.0: version "1.2.3" resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== @@ -5099,15 +5106,6 @@ loader-utils@^1.1.0, loader-utils@^1.2.3: emojis-list "^2.0.0" json5 "^1.0.1" -loader-utils@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0" - integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^2.1.2" - locate-path@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" @@ -5156,6 +5154,11 @@ lodash@^4.17.19: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== +lodash@^4.17.20: + version "4.17.20" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" + integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== + log-driver@^1.2.7: version "1.2.7" resolved "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz#63b95021f0702fedfa2c9bb0a24e7797d71871d8" @@ -5877,14 +5880,6 @@ object.assign@^4.1.0: has-symbols "^1.0.0" object-keys "^1.0.11" -object.getownpropertydescriptors@^2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" - integrity sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY= - dependencies: - define-properties "^1.1.2" - es-abstract "^1.5.1" - object.pick@^1.3.0: version "1.3.0" resolved "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" @@ -7787,16 +7782,16 @@ table@^5.2.3: slice-ansi "^2.1.0" string-width "^3.0.0" -tapable@^1.0.0-beta.5, tapable@^1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" - integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== - -tapable@^2.0.0: +tapable@2.0.0, tapable@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.0.0.tgz#a49c3d6a8a2bb606e7db372b82904c970d537a08" integrity sha512-bjzn0C0RWoffnNdTzNi7rNDhs1Zlwk2tRXgk8EiHKAOX1Mag3d6T0Y5zNa7l9CJ+EoUne/0UHdwS8tMbkh9zDg== +tapable@^1.0.0-beta.5: + version "1.1.3" + resolved "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== + tar@^2.0.0: version "2.2.2" resolved "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz#0ca8848562c7299b8b446ff6a4d60cdbb23edc40" @@ -8211,14 +8206,6 @@ util-deprecate@^1.0.1, util-deprecate@~1.0.1: resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= -util.promisify@1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" - integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== - dependencies: - define-properties "^1.1.2" - object.getownpropertydescriptors "^2.0.3" - utila@^0.4.0, utila@~0.4: version "0.4.0" resolved "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c"