mirror of https://github.com/webpack/webpack.git
add backward-compat layer for ModuleGraph and ChunkGraph
This commit is contained in:
parent
42167db4af
commit
5a78e96dc9
165
lib/Chunk.js
165
lib/Chunk.js
|
|
@ -5,13 +5,13 @@
|
|||
|
||||
"use strict";
|
||||
|
||||
const ChunkGraph = require("./ChunkGraph");
|
||||
const Entrypoint = require("./Entrypoint");
|
||||
const { intersect } = require("./util/SetHelpers");
|
||||
const SortableSet = require("./util/SortableSet");
|
||||
const { compareModulesById } = require("./util/comparators");
|
||||
|
||||
/** @typedef {import("webpack-sources").Source} Source */
|
||||
/** @typedef {import("./ChunkGraph")} ChunkGraph */
|
||||
/** @typedef {import("./ChunkGroup")} ChunkGroup */
|
||||
/** @typedef {import("./Compilation")} Compilation */
|
||||
/** @typedef {import("./Module")} Module */
|
||||
|
|
@ -89,6 +89,169 @@ class Chunk {
|
|||
this.removedModules = undefined;
|
||||
}
|
||||
|
||||
// TODO remove in webpack 6
|
||||
// BACKWARD-COMPAT START
|
||||
get entryModule() {
|
||||
const entryModules = Array.from(
|
||||
ChunkGraph.getChunkGraphForChunk(
|
||||
this,
|
||||
"Chunk.entryModule"
|
||||
).getChunkEntryModulesIterable(this)
|
||||
);
|
||||
if (entryModules.length === 0) {
|
||||
return undefined;
|
||||
} else if (entryModules.length === 1) {
|
||||
return entryModules[0];
|
||||
} else {
|
||||
throw new Error(
|
||||
"Module.entryModule: Multiple entry modules are not supported by the deprecated API (Use the new ChunkGroup API)"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
hasEntryModule() {
|
||||
return (
|
||||
ChunkGraph.getChunkGraphForChunk(
|
||||
this,
|
||||
"Chunk.hasEntryModule"
|
||||
).getNumberOfEntryModules(this) > 0
|
||||
);
|
||||
}
|
||||
|
||||
addModule(module) {
|
||||
return ChunkGraph.getChunkGraphForChunk(
|
||||
this,
|
||||
"Chunk.addModule"
|
||||
).connectChunkAndModule(this, module);
|
||||
}
|
||||
|
||||
removeModule(module) {
|
||||
return ChunkGraph.getChunkGraphForChunk(
|
||||
this,
|
||||
"Chunk.removeModule"
|
||||
).disconnectChunkAndModule(this, module);
|
||||
}
|
||||
|
||||
getNumberOfModules() {
|
||||
return ChunkGraph.getChunkGraphForChunk(
|
||||
this,
|
||||
"Chunk.getNumberOfModules"
|
||||
).getNumberOfChunkModules(this);
|
||||
}
|
||||
|
||||
get modulesIterable() {
|
||||
const chunkGraph = ChunkGraph.getChunkGraphForChunk(
|
||||
this,
|
||||
"Chunk.modulesIterable"
|
||||
);
|
||||
return chunkGraph.getOrderedChunkModulesIterable(
|
||||
this,
|
||||
compareModulesById(chunkGraph._moduleGraph)
|
||||
);
|
||||
}
|
||||
|
||||
compareTo(otherChunk) {
|
||||
const chunkGraph = ChunkGraph.getChunkGraphForChunk(
|
||||
this,
|
||||
"Chunk.compareTo"
|
||||
);
|
||||
return chunkGraph.compareChunks(chunkGraph._moduleGraph, this, otherChunk);
|
||||
}
|
||||
|
||||
containsModule(module) {
|
||||
return ChunkGraph.getChunkGraphForChunk(
|
||||
this,
|
||||
"Chunk.containsModule"
|
||||
).isModuleInChunk(module, this);
|
||||
}
|
||||
|
||||
getModules() {
|
||||
return ChunkGraph.getChunkGraphForChunk(
|
||||
this,
|
||||
"Chunk.getModules"
|
||||
).getChunkModules(this);
|
||||
}
|
||||
|
||||
remove() {
|
||||
const chunkGraph = ChunkGraph.getChunkGraphForChunk(this, "Chunk.remove");
|
||||
chunkGraph.disconnectChunk(this);
|
||||
this.disconnectFromGroups();
|
||||
}
|
||||
|
||||
moveModule(module, otherChunk) {
|
||||
const chunkGraph = ChunkGraph.getChunkGraphForChunk(
|
||||
this,
|
||||
"Chunk.moveModule"
|
||||
);
|
||||
chunkGraph.disconnectChunkAndModule(this, module);
|
||||
chunkGraph.connectChunkAndModule(otherChunk, module);
|
||||
}
|
||||
|
||||
integrate(otherChunk) {
|
||||
const chunkGraph = ChunkGraph.getChunkGraphForChunk(
|
||||
this,
|
||||
"Chunk.integrate"
|
||||
);
|
||||
if (!chunkGraph.canChunksBeIntegrated(this, otherChunk)) return false;
|
||||
chunkGraph.integrateChunks(this, otherChunk);
|
||||
return true;
|
||||
}
|
||||
|
||||
canBeIntegrated(otherChunk) {
|
||||
const chunkGraph = ChunkGraph.getChunkGraphForChunk(
|
||||
this,
|
||||
"Chunk.canBeIntegrated"
|
||||
);
|
||||
return chunkGraph.canChunksBeIntegrated(this, otherChunk);
|
||||
}
|
||||
|
||||
isEmpty() {
|
||||
const chunkGraph = ChunkGraph.getChunkGraphForChunk(this, "Chunk.isEmpty");
|
||||
return chunkGraph.getNumberOfChunkModules(this) === 0;
|
||||
}
|
||||
|
||||
modulesSize() {
|
||||
const chunkGraph = ChunkGraph.getChunkGraphForChunk(
|
||||
this,
|
||||
"Chunk.modulesSize"
|
||||
);
|
||||
return chunkGraph.getChunkModulesSize(this);
|
||||
}
|
||||
|
||||
size(options) {
|
||||
const chunkGraph = ChunkGraph.getChunkGraphForChunk(this, "Chunk.size");
|
||||
return chunkGraph.getChunkSize(this, options);
|
||||
}
|
||||
|
||||
integratedSize(otherChunk, options) {
|
||||
const chunkGraph = ChunkGraph.getChunkGraphForChunk(
|
||||
this,
|
||||
"Chunk.integratedSize"
|
||||
);
|
||||
return chunkGraph.getIntegratedChunksSize(this, otherChunk, options);
|
||||
}
|
||||
|
||||
getChunkModuleMaps(filterFn) {
|
||||
const chunkGraph = ChunkGraph.getChunkGraphForChunk(
|
||||
this,
|
||||
"Chunk.getChunkModuleMaps"
|
||||
);
|
||||
return chunkGraph.getChunkModuleMaps(
|
||||
chunkGraph._moduleGraph,
|
||||
this,
|
||||
filterFn
|
||||
);
|
||||
}
|
||||
|
||||
hasModuleInGraph(filterFn, filterChunkFn) {
|
||||
const chunkGraph = ChunkGraph.getChunkGraphForChunk(
|
||||
this,
|
||||
"Chunk.hasModuleInGraph"
|
||||
);
|
||||
return chunkGraph.hasModuleInGraph(this, filterFn, filterChunkFn);
|
||||
}
|
||||
// BACKWARD-COMPAT END
|
||||
|
||||
/**
|
||||
* @returns {boolean} whether or not the Chunk will have a runtime
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@
|
|||
|
||||
"use strict";
|
||||
|
||||
const util = require("util");
|
||||
const SortableSet = require("./util/SortableSet");
|
||||
const { compareModulesById } = require("./util/comparators");
|
||||
|
||||
|
|
@ -86,11 +87,16 @@ class ChunkGraphChunk {
|
|||
}
|
||||
|
||||
class ChunkGraph {
|
||||
constructor() {
|
||||
/**
|
||||
* @param {ModuleGraph} moduleGraph the module graph
|
||||
*/
|
||||
constructor(moduleGraph) {
|
||||
/** @private @type {WeakMap<Module, ChunkGraphModule>} */
|
||||
this._modules = new WeakMap();
|
||||
/** @private @type {WeakMap<Chunk, ChunkGraphChunk>} */
|
||||
this._chunks = new WeakMap();
|
||||
/** @private @type {ModuleGraph} */
|
||||
this._moduleGraph = moduleGraph;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -669,6 +675,100 @@ class ChunkGraph {
|
|||
const cgc = this._getChunkGraphChunk(chunk);
|
||||
return cgc.entryModules;
|
||||
}
|
||||
|
||||
// TODO remove in webpack 6
|
||||
/**
|
||||
* @param {Module} module the module
|
||||
* @param {string} deprecateMessage message for the deprecation message
|
||||
* @returns {ChunkGraph} the chunk graph
|
||||
*/
|
||||
static getChunkGraphForModule(module, deprecateMessage) {
|
||||
const fn = deprecateGetChunkGraphForModuleMap.get(deprecateMessage);
|
||||
if (fn) return fn(module);
|
||||
const newFn = util.deprecate(
|
||||
/**
|
||||
* @param {Module} module the module
|
||||
* @returns {ChunkGraph} the chunk graph
|
||||
*/
|
||||
module => {
|
||||
const chunkGraph = chunkGraphForModuleMap.get(module);
|
||||
if (!chunkGraph)
|
||||
throw new Error(
|
||||
deprecateMessage +
|
||||
": There was no ChunkGraph assigned to the Module for backward-compat (Use the new API)"
|
||||
);
|
||||
return chunkGraph;
|
||||
},
|
||||
deprecateMessage + ": Use new ChunkGraph API"
|
||||
);
|
||||
deprecateGetChunkGraphForModuleMap.set(deprecateMessage, newFn);
|
||||
return newFn(module);
|
||||
}
|
||||
|
||||
// TODO remove in webpack 6
|
||||
/**
|
||||
* @param {Module} module the module
|
||||
* @param {ChunkGraph} chunkGraph the chunk graph
|
||||
* @returns {void}
|
||||
*/
|
||||
static setChunkGraphForModule(module, chunkGraph) {
|
||||
chunkGraphForModuleMap.set(module, chunkGraph);
|
||||
}
|
||||
|
||||
// TODO remove in webpack 6
|
||||
/**
|
||||
* @param {Chunk} chunk the chunk
|
||||
* @param {string} deprecateMessage message for the deprecation message
|
||||
* @returns {ChunkGraph} the chunk graph
|
||||
*/
|
||||
static getChunkGraphForChunk(chunk, deprecateMessage) {
|
||||
const fn = deprecateGetChunkGraphForChunkMap.get(deprecateMessage);
|
||||
if (fn) return fn(chunk);
|
||||
const newFn = util.deprecate(
|
||||
/**
|
||||
* @param {Chunk} chunk the chunk
|
||||
* @returns {ChunkGraph} the chunk graph
|
||||
*/
|
||||
chunk => {
|
||||
const chunkGraph = chunkGraphForChunkMap.get(chunk);
|
||||
if (!chunkGraph)
|
||||
throw new Error(
|
||||
deprecateMessage +
|
||||
"There was no ChunkGraph assigned to the Chunk for backward-compat (Use the new API)"
|
||||
);
|
||||
return chunkGraph;
|
||||
},
|
||||
deprecateMessage + ": Use new ChunkGraph API"
|
||||
);
|
||||
deprecateGetChunkGraphForChunkMap.set(deprecateMessage, newFn);
|
||||
return newFn(chunk);
|
||||
}
|
||||
|
||||
// TODO remove in webpack 6
|
||||
/**
|
||||
* @param {Chunk} chunk the chunk
|
||||
* @param {ChunkGraph} chunkGraph the chunk graph
|
||||
* @returns {void}
|
||||
*/
|
||||
static setChunkGraphForChunk(chunk, chunkGraph) {
|
||||
chunkGraphForChunkMap.set(chunk, chunkGraph);
|
||||
}
|
||||
}
|
||||
|
||||
// TODO remove in webpack 6
|
||||
/** @type {WeakMap<Module, ChunkGraph>} */
|
||||
const chunkGraphForModuleMap = new WeakMap();
|
||||
|
||||
// TODO remove in webpack 6
|
||||
/** @type {WeakMap<Chunk, ChunkGraph>} */
|
||||
const chunkGraphForChunkMap = new WeakMap();
|
||||
|
||||
// TODO remove in webpack 6
|
||||
/** @type {Map<string, (module: Module) => ChunkGraph>} */
|
||||
const deprecateGetChunkGraphForModuleMap = new Map();
|
||||
|
||||
// TODO remove in webpack 6
|
||||
/** @type {Map<string, (chunk: Chunk) => ChunkGraph>} */
|
||||
const deprecateGetChunkGraphForChunkMap = new Map();
|
||||
|
||||
module.exports = ChunkGraph;
|
||||
|
|
|
|||
|
|
@ -1064,9 +1064,13 @@ class Compilation {
|
|||
* @returns {void}
|
||||
*/
|
||||
seal(callback) {
|
||||
const chunkGraph = new ChunkGraph();
|
||||
const chunkGraph = new ChunkGraph(this.moduleGraph);
|
||||
this.chunkGraph = chunkGraph;
|
||||
|
||||
for (const module of this.modules) {
|
||||
ChunkGraph.setChunkGraphForModule(module, chunkGraph);
|
||||
}
|
||||
|
||||
this.hooks.seal.call();
|
||||
|
||||
while (this.hooks.optimizeDependencies.call(this.modules)) {
|
||||
|
|
@ -1295,6 +1299,7 @@ class Compilation {
|
|||
}
|
||||
const chunk = new Chunk(name);
|
||||
this.chunks.push(chunk);
|
||||
ChunkGraph.setChunkGraphForChunk(chunk, this.chunkGraph);
|
||||
if (name) {
|
||||
this.namedChunks.set(name, chunk);
|
||||
}
|
||||
|
|
|
|||
121
lib/Module.js
121
lib/Module.js
|
|
@ -5,17 +5,18 @@
|
|||
|
||||
"use strict";
|
||||
|
||||
const ChunkGraph = require("./ChunkGraph");
|
||||
const DependenciesBlock = require("./DependenciesBlock");
|
||||
const ModuleGraph = require("./ModuleGraph");
|
||||
const Template = require("./Template");
|
||||
const { compareChunksById } = require("./util/comparators");
|
||||
|
||||
/** @typedef {import("webpack-sources").Source} Source */
|
||||
/** @typedef {import("./Chunk")} Chunk */
|
||||
/** @typedef {import("./ChunkGraph")} ChunkGraph */
|
||||
/** @typedef {import("./ChunkGroup")} ChunkGroup */
|
||||
/** @typedef {import("./Compilation")} Compilation */
|
||||
/** @typedef {import("./Dependency")} Dependency */
|
||||
/** @typedef {import("./DependencyTemplates")} DependencyTemplates */
|
||||
/** @typedef {import("./ModuleGraph")} ModuleGraph */
|
||||
/** @typedef {import("./RequestShortener")} RequestShortener */
|
||||
/** @typedef {import("./RuntimeTemplate")} RuntimeTemplate */
|
||||
/** @typedef {import("./WebpackError")} WebpackError */
|
||||
|
|
@ -115,14 +116,126 @@ class Module extends DependenciesBlock {
|
|||
this.useSourceMap = false;
|
||||
}
|
||||
|
||||
// TODO remove in webpack 6
|
||||
// BACKWARD-COMPAT START
|
||||
get index() {
|
||||
throw new Error();
|
||||
return ModuleGraph.getModuleGraphForModule(
|
||||
this,
|
||||
"Module.index"
|
||||
).getPreOrderIndex(this);
|
||||
}
|
||||
|
||||
set index(value) {
|
||||
ModuleGraph.getModuleGraphForModule(this, "Module.index").setPreOrderIndex(
|
||||
this,
|
||||
value
|
||||
);
|
||||
}
|
||||
|
||||
get index2() {
|
||||
throw new Error();
|
||||
return ModuleGraph.getModuleGraphForModule(
|
||||
this,
|
||||
"Module.index2"
|
||||
).getPostOrderIndex(this);
|
||||
}
|
||||
|
||||
set index2(value) {
|
||||
ModuleGraph.getModuleGraphForModule(
|
||||
this,
|
||||
"Module.index2"
|
||||
).setPostOrderIndex(this, value);
|
||||
}
|
||||
|
||||
get issuer() {
|
||||
return ModuleGraph.getModuleGraphForModule(this, "Module.issuer").getIssuer(
|
||||
this
|
||||
);
|
||||
}
|
||||
|
||||
set issuer(value) {
|
||||
ModuleGraph.getModuleGraphForModule(this, "Module.issuer").setIssuer(
|
||||
this,
|
||||
value
|
||||
);
|
||||
}
|
||||
|
||||
get usedExports() {
|
||||
return ModuleGraph.getModuleGraphForModule(
|
||||
this,
|
||||
"Module.usedExports"
|
||||
).getUsedExports(this);
|
||||
}
|
||||
|
||||
set usedExports(value) {
|
||||
ModuleGraph.getModuleGraphForModule(
|
||||
this,
|
||||
"Module.usedExports"
|
||||
).setUsedExports(this, value);
|
||||
}
|
||||
|
||||
get optimizationBailout() {
|
||||
return ModuleGraph.getModuleGraphForModule(
|
||||
this,
|
||||
"Module.optimizationBailout"
|
||||
).getOptimizationBailout(this);
|
||||
}
|
||||
|
||||
get optional() {
|
||||
return this.isOptional(
|
||||
ModuleGraph.getModuleGraphForModule(this, "Module.optional")
|
||||
);
|
||||
}
|
||||
|
||||
addChunk(chunk) {
|
||||
return ChunkGraph.getChunkGraphForModule(
|
||||
this,
|
||||
"Module.addChunk"
|
||||
).connectChunkAndModule(chunk, this);
|
||||
}
|
||||
|
||||
removeChunk(chunk) {
|
||||
return ChunkGraph.getChunkGraphForModule(
|
||||
this,
|
||||
"Module.removeChunk"
|
||||
).disconnectChunkAndModule(chunk, this);
|
||||
}
|
||||
|
||||
isInChunk(chunk) {
|
||||
return ChunkGraph.getChunkGraphForModule(
|
||||
this,
|
||||
"Module.isInChunk"
|
||||
).isModuleInChunk(this, chunk);
|
||||
}
|
||||
|
||||
isEntryModule() {
|
||||
return ChunkGraph.getChunkGraphForModule(
|
||||
this,
|
||||
"Module.isEntryModule"
|
||||
).isEntryModule(this);
|
||||
}
|
||||
|
||||
getChunks() {
|
||||
return ChunkGraph.getChunkGraphForModule(
|
||||
this,
|
||||
"Module.getChunks"
|
||||
).getModuleChunks(this);
|
||||
}
|
||||
|
||||
getNumberOfChunks() {
|
||||
return ChunkGraph.getChunkGraphForModule(
|
||||
this,
|
||||
"Module.getNumberOfChunks"
|
||||
).getNumberOfModuleChunks(this);
|
||||
}
|
||||
|
||||
get chunksIterable() {
|
||||
return ChunkGraph.getChunkGraphForModule(
|
||||
this,
|
||||
"Module.chunksIterable"
|
||||
).getOrderedModuleChunksIterable(this, compareChunksById);
|
||||
}
|
||||
// BACKWARD-COMPAT END
|
||||
|
||||
/**
|
||||
* @deprecated moved to .buildInfo.exportsArgument
|
||||
* @returns {string} name of the exports argument
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@
|
|||
|
||||
"use strict";
|
||||
|
||||
const util = require("util");
|
||||
const ModuleGraphConnection = require("./ModuleGraphConnection");
|
||||
|
||||
/** @typedef {import("./DependenciesBlock")} DependenciesBlock */
|
||||
|
|
@ -428,7 +429,54 @@ class ModuleGraph {
|
|||
}
|
||||
return meta;
|
||||
}
|
||||
|
||||
// TODO remove in webpack 6
|
||||
/**
|
||||
* @param {Module} module the module
|
||||
* @param {string} deprecateMessage message for the deprecation message
|
||||
* @returns {ModuleGraph} the module graph
|
||||
*/
|
||||
static getModuleGraphForModule(module, deprecateMessage) {
|
||||
const fn = deprecateMap.get(deprecateMessage);
|
||||
if (fn) return fn(module);
|
||||
const newFn = util.deprecate(
|
||||
/**
|
||||
* @param {Module} module the module
|
||||
* @returns {ModuleGraph} the module graph
|
||||
*/
|
||||
module => {
|
||||
const moduleGraph = moduleGraphForModuleMap.get(module);
|
||||
if (!moduleGraph)
|
||||
throw new Error(
|
||||
deprecateMessage +
|
||||
"There was no ModuleGraph assigned to the Module for backward-compat (Use the new API)"
|
||||
);
|
||||
return moduleGraph;
|
||||
},
|
||||
deprecateMessage + ": Use new ModuleGraph API"
|
||||
);
|
||||
deprecateMap.set(deprecateMessage, newFn);
|
||||
return newFn(module);
|
||||
}
|
||||
|
||||
// TODO remove in webpack 6
|
||||
/**
|
||||
* @param {Module} module the module
|
||||
* @param {ModuleGraph} moduleGraph the module graph
|
||||
* @returns {void}
|
||||
*/
|
||||
static setModuleGraphForModule(module, moduleGraph) {
|
||||
moduleGraphForModuleMap.set(module, moduleGraph);
|
||||
}
|
||||
}
|
||||
|
||||
// TODO remove in webpack 6
|
||||
/** @type {WeakMap<Module, ModuleGraph>} */
|
||||
const moduleGraphForModuleMap = new WeakMap();
|
||||
|
||||
// TODO remove in webpack 6
|
||||
/** @type {Map<string, (module: Module) => ModuleGraph>} */
|
||||
const deprecateMap = new Map();
|
||||
|
||||
module.exports = ModuleGraph;
|
||||
module.exports.ModuleGraphConnection = ModuleGraphConnection;
|
||||
|
|
|
|||
|
|
@ -5,6 +5,8 @@
|
|||
|
||||
"use strict";
|
||||
|
||||
const ChunkGraph = require("../ChunkGraph");
|
||||
const ModuleGraph = require("../ModuleGraph");
|
||||
const { STAGE_DEFAULT } = require("../OptimizationStages");
|
||||
const HarmonyCompatibilityDependency = require("../dependencies/HarmonyCompatibilityDependency");
|
||||
const HarmonyImportDependency = require("../dependencies/HarmonyImportDependency");
|
||||
|
|
@ -331,6 +333,8 @@ class ModuleConcatenationPlugin {
|
|||
modules,
|
||||
compilation
|
||||
);
|
||||
ChunkGraph.setChunkGraphForModule(newModule, chunkGraph);
|
||||
ModuleGraph.setModuleGraphForModule(newModule, moduleGraph);
|
||||
for (const warning of concatConfiguration.getWarningsSorted()) {
|
||||
moduleGraph
|
||||
.getOptimizationBailout(newModule)
|
||||
|
|
|
|||
Loading…
Reference in New Issue