refactor(types): Improve module type strictness and refactor module type string usages in module subclasses

This commit is contained in:
Sean Larkin 2023-05-04 23:19:11 +00:00
parent 1018ca80b3
commit e958ac552b
20 changed files with 228 additions and 46 deletions

View File

@ -49,6 +49,7 @@ const ModuleProfile = require("./ModuleProfile");
const ModuleRestoreError = require("./ModuleRestoreError");
const ModuleStoreError = require("./ModuleStoreError");
const ModuleTemplate = require("./ModuleTemplate");
const { WEBPACK_MODULE_TYPE_RUNTIME } = require("./ModuleTypeConstants");
const RuntimeGlobals = require("./RuntimeGlobals");
const RuntimeTemplate = require("./RuntimeTemplate");
const Stats = require("./Stats");
@ -5121,7 +5122,7 @@ This prevents using hashes of each other and should be avoided.`);
const usedIds = new Set();
for (const module of this.modules) {
if (module.type === "runtime") continue;
if (module.type === WEBPACK_MODULE_TYPE_RUNTIME) continue;
const moduleId = chunkGraph.getModuleId(module);
if (moduleId === null) continue;
if (usedIds.has(moduleId)) {

View File

@ -18,6 +18,14 @@ const makeSerializable = require("./util/makeSerializable");
/** @typedef {(d: Dependency) => boolean} DependencyFilterFunction */
/**
* DependenciesBlock is the base class for all Module classes in webpack. It describes a
* "block" of dependencies which are pointers to other DependenciesBlock instances. For example
* when a Module has a CommonJs require statement, the DependencyBlock for the CommonJs module
* would be added as a dependency to the Module. DependenciesBlock is inherited by two types of classes:
* Module subclasses and AsyncDependenciesBlock subclasses. The only difference between the two is that
* AsyncDependenciesBlock subclasses are used for code-splitting (async boundary) and Module subclasses are not.
*/
class DependenciesBlock {
constructor() {
/** @type {Dependency[]} */

View File

@ -38,7 +38,8 @@ const {
const {
JAVASCRIPT_MODULE_TYPE_AUTO,
JAVASCRIPT_MODULE_TYPE_DYNAMIC,
JAVASCRIPT_MODULE_TYPE_ESM
JAVASCRIPT_MODULE_TYPE_ESM,
WEBPACK_MODULE_TYPE_RUNTIME
} = require("./ModuleTypeConstants");
/** @typedef {import("./Chunk")} Chunk */
@ -564,7 +565,7 @@ class HotModuleReplacementPlugin {
newRuntime
);
if (hash !== oldHash) {
if (module.type === "runtime") {
if (module.type === WEBPACK_MODULE_TYPE_RUNTIME) {
newRuntimeModules = newRuntimeModules || [];
newRuntimeModules.push(
/** @type {RuntimeModule} */ (module)

View File

@ -28,6 +28,7 @@ const makeSerializable = require("./util/makeSerializable");
/** @typedef {import("./ExportsInfo").UsageStateType} UsageStateType */
/** @typedef {import("./FileSystemInfo")} FileSystemInfo */
/** @typedef {import("./ModuleGraphConnection").ConnectionState} ConnectionState */
/** @typedef {import("./ModuleTypeConstants").ModuleTypes} ModuleTypes */
/** @typedef {import("./NormalModuleFactory")} NormalModuleFactory */
/** @typedef {import("./RequestShortener")} RequestShortener */
/** @typedef {import("./ResolverFactory").ResolverWithOptions} ResolverWithOptions */
@ -129,14 +130,14 @@ const deprecatedNeedRebuild = util.deprecate(
class Module extends DependenciesBlock {
/**
* @param {string} type the module type
* @param {ModuleTypes | ""} type the module type, when deserializing the type is not known and is an empty string
* @param {string=} context an optional context
* @param {string=} layer an optional layer in which the module is
*/
constructor(type, context = null, layer = null) {
super();
/** @type {string} */
/** @type {ModuleTypes | ""} */
this.type = type;
/** @type {string | null} */
this.context = context;

View File

@ -60,6 +60,88 @@ const CSS_MODULE_TYPE_GLOBAL = "css/global";
*/
const CSS_MODULE_TYPE_MODULE = "css/module";
/**
* @type {Readonly<"asset">}
* This is the module type used for automatically choosing between `asset/inline`, `asset/resource` based on asset size limit (8096).
*/
const ASSET_MODULE_TYPE = "asset";
/**
* @type {Readonly<"asset/inline">}
* This is the module type used for assets that are inlined as a data URI. This is the equivalent of `url-loader`.
*/
const ASSET_MODULE_TYPE_INLINE = "asset/inline";
/**
* @type {Readonly<"asset/resource">}
* This is the module type used for assets that are copied to the output directory. This is the equivalent of `file-loader`.
*/
const ASSET_MODULE_TYPE_RESOURCE = "asset/resource";
/**
* @type {Readonly<"asset/source">}
* This is the module type used for assets that are imported as source code. This is the equivalent of `raw-loader`.
*/
const ASSET_MODULE_TYPE_SOURCE = "asset/source";
/**
* @type {Readonly<"asset/raw-data-url">}
* TODO: Document what this asset type is for. See css-loader tests for its usage.
*/
const ASSET_MODULE_TYPE_RAW_DATA_URL = "asset/raw-data-url";
/**
* @type {Readonly<"runtime">}
* This is the module type used for the webpack runtime abstractions.
*/
const WEBPACK_MODULE_TYPE_RUNTIME = "runtime";
/**
* @type {Readonly<"fallback-module">}
* This is the module type used for the ModuleFederation feature's FallbackModule class.
* TODO: Document this better.
*/
const WEBPACK_MODULE_TYPE_FALLBACK = "fallback-module";
/**
* @type {Readonly<"remote-module">}
* This is the module type used for the ModuleFederation feature's RemoteModule class.
* TODO: Document this better.
*/
const WEBPACK_MODULE_TYPE_REMOTE = "remote-module";
/**
* @type {Readonly<"provide-module">}
* This is the module type used for the ModuleFederation feature's ProvideModule class.
* TODO: Document this better.
*/
const WEBPACK_MODULE_TYPE_PROVIDE = "provide-module";
/**
* @type {Readonly<"consume-shared-module">}
* This is the module type used for the ModuleFederation feature's ConsumeSharedModule class.
*/
const WEBPACK_MODULE_TYPE_CONSUME_SHARED_MODULE = "consume-shared-module";
/**
* @type {Readonly<"lazy-compilation-proxy">}
* Module type used for `experiments.lazyCompilation` feature. See `LazyCompilationPlugin` for more information.
*/
const WEBPACK_MODULE_TYPE_LAZY_COMPILATION_PROXY = "lazy-compilation-proxy";
/** @typedef {"javascript/auto" | "javascript/dynamic" | "javascript/esm"} JavaScriptModuleTypes */
/** @typedef {"json"} JSONModuleType */
/** @typedef {"webassembly/async" | "webassembly/sync"} WebAssemblyModuleTypes */
/** @typedef {"css" | "css/global" | "css/module"} CSSModuleTypes */
/** @typedef {"asset" | "asset/inline" | "asset/resource" | "asset/source" | "asset/raw-data-url"} AssetModuleTypes */
/** @typedef {"runtime" | "fallback-module" | "remote-module" | "provide-module" | "consume-shared-module" | "lazy-compilation-proxy"} WebpackModuleTypes */
/** @typedef {JavaScriptModuleTypes | JSONModuleType | WebAssemblyModuleTypes | CSSModuleTypes | AssetModuleTypes | WebpackModuleTypes} ModuleTypes */
exports.ASSET_MODULE_TYPE = ASSET_MODULE_TYPE;
exports.ASSET_MODULE_TYPE_RAW_DATA_URL = ASSET_MODULE_TYPE_RAW_DATA_URL;
exports.ASSET_MODULE_TYPE_SOURCE = ASSET_MODULE_TYPE_SOURCE;
exports.ASSET_MODULE_TYPE_RESOURCE = ASSET_MODULE_TYPE_RESOURCE;
exports.ASSET_MODULE_TYPE_INLINE = ASSET_MODULE_TYPE_INLINE;
exports.JAVASCRIPT_MODULE_TYPE_AUTO = JAVASCRIPT_MODULE_TYPE_AUTO;
exports.JAVASCRIPT_MODULE_TYPE_DYNAMIC = JAVASCRIPT_MODULE_TYPE_DYNAMIC;
exports.JAVASCRIPT_MODULE_TYPE_ESM = JAVASCRIPT_MODULE_TYPE_ESM;
@ -69,3 +151,11 @@ exports.WEBASSEMBLY_MODULE_TYPE_SYNC = WEBASSEMBLY_MODULE_TYPE_SYNC;
exports.CSS_MODULE_TYPE = CSS_MODULE_TYPE;
exports.CSS_MODULE_TYPE_GLOBAL = CSS_MODULE_TYPE_GLOBAL;
exports.CSS_MODULE_TYPE_MODULE = CSS_MODULE_TYPE_MODULE;
exports.WEBPACK_MODULE_TYPE_RUNTIME = WEBPACK_MODULE_TYPE_RUNTIME;
exports.WEBPACK_MODULE_TYPE_FALLBACK = WEBPACK_MODULE_TYPE_FALLBACK;
exports.WEBPACK_MODULE_TYPE_REMOTE = WEBPACK_MODULE_TYPE_REMOTE;
exports.WEBPACK_MODULE_TYPE_PROVIDE = WEBPACK_MODULE_TYPE_PROVIDE;
exports.WEBPACK_MODULE_TYPE_CONSUME_SHARED_MODULE =
WEBPACK_MODULE_TYPE_CONSUME_SHARED_MODULE;
exports.WEBPACK_MODULE_TYPE_LAZY_COMPILATION_PROXY =
WEBPACK_MODULE_TYPE_LAZY_COMPILATION_PROXY;

View File

@ -65,6 +65,7 @@ const memoize = require("./util/memoize");
/** @typedef {import("./Module").NeedBuildContext} NeedBuildContext */
/** @typedef {import("./ModuleGraph")} ModuleGraph */
/** @typedef {import("./ModuleGraphConnection").ConnectionState} ConnectionState */
/** @typedef {import("./ModuleTypeConstants").JavaScriptModuleTypes} JavaScriptModuleTypes */
/** @typedef {import("./NormalModuleFactory")} NormalModuleFactory */
/** @typedef {import("./Parser")} Parser */
/** @typedef {import("./RequestShortener")} RequestShortener */
@ -201,7 +202,7 @@ makeSerializable(
/**
* @typedef {Object} NormalModuleCreateData
* @property {string=} layer an optional layer in which the module is
* @property {string} type module type
* @property {JavaScriptModuleTypes | ""} type module type
* @property {string} request request string
* @property {string} userRequest request intended by user (without loaders from config)
* @property {string} rawRequest request without resolving

View File

@ -8,6 +8,7 @@
const { RawSource } = require("webpack-sources");
const OriginalSource = require("webpack-sources").OriginalSource;
const Module = require("./Module");
const { WEBPACK_MODULE_TYPE_RUNTIME } = require("./ModuleTypeConstants");
/** @typedef {import("webpack-sources").Source} Source */
/** @typedef {import("../declarations/WebpackOptions").WebpackOptionsNormalized} WebpackOptions */
@ -24,7 +25,7 @@ const Module = require("./Module");
/** @typedef {import("./util/Hash")} Hash */
/** @typedef {import("./util/fs").InputFileSystem} InputFileSystem */
const TYPES = new Set(["runtime"]);
const TYPES = new Set([WEBPACK_MODULE_TYPE_RUNTIME]);
class RuntimeModule extends Module {
/**
@ -32,7 +33,7 @@ class RuntimeModule extends Module {
* @param {number=} stage an optional stage
*/
constructor(name, stage = 0) {
super("runtime");
super(WEBPACK_MODULE_TYPE_RUNTIME);
this.name = name;
this.stage = stage;
this.buildMeta = {};
@ -137,7 +138,7 @@ class RuntimeModule extends Module {
const generatedCode = this.getGeneratedCode();
if (generatedCode) {
sources.set(
"runtime",
WEBPACK_MODULE_TYPE_RUNTIME,
this.useSourceMap || this.useSimpleSourceMap
? new OriginalSource(generatedCode, this.identifier())
: new RawSource(generatedCode)

View File

@ -6,6 +6,7 @@
"use strict";
const { ConcatSource, PrefixSource } = require("webpack-sources");
const { WEBPACK_MODULE_TYPE_RUNTIME } = require("./ModuleTypeConstants");
/** @typedef {import("webpack-sources").Source} Source */
/** @typedef {import("../declarations/WebpackOptions").Output} OutputOptions */
@ -362,7 +363,7 @@ class Template {
runtimeSource = codeGenerationResults.getSource(
module,
renderContext.chunk.runtime,
"runtime"
WEBPACK_MODULE_TYPE_RUNTIME
);
} else {
const codeGenResult = module.codeGeneration({

View File

@ -10,6 +10,7 @@ const path = require("path");
const { RawSource } = require("webpack-sources");
const ConcatenationScope = require("../ConcatenationScope");
const Generator = require("../Generator");
const { ASSET_MODULE_TYPE } = require("../ModuleTypeConstants");
const RuntimeGlobals = require("../RuntimeGlobals");
const createHash = require("../util/createHash");
const { makePathsRelative } = require("../util/identifier");
@ -122,7 +123,7 @@ const decodeDataUriContent = (encoding, content) => {
};
const JS_TYPES = new Set(["javascript"]);
const JS_AND_ASSET_TYPES = new Set(["javascript", "asset"]);
const JS_AND_ASSET_TYPES = new Set(["javascript", ASSET_MODULE_TYPE]);
const DEFAULT_ENCODING = "base64";
class AssetGenerator extends Generator {
@ -228,7 +229,7 @@ class AssetGenerator extends Generator {
}
) {
switch (type) {
case "asset":
case ASSET_MODULE_TYPE:
return module.originalSource();
default: {
let content;
@ -406,7 +407,7 @@ class AssetGenerator extends Generator {
*/
getSize(module, type) {
switch (type) {
case "asset": {
case ASSET_MODULE_TYPE: {
const originalSource = module.originalSource();
if (!originalSource) {

View File

@ -5,6 +5,12 @@
"use strict";
const {
ASSET_MODULE_TYPE_RESOURCE,
ASSET_MODULE_TYPE_INLINE,
ASSET_MODULE_TYPE,
ASSET_MODULE_TYPE_SOURCE
} = require("../ModuleTypeConstants");
const { cleverMerge } = require("../util/cleverMerge");
const { compareModulesByIdentifier } = require("../util/comparators");
const createSchemaValidation = require("../util/create-schema-validation");
@ -61,7 +67,7 @@ const getAssetSourceGenerator = memoize(() =>
require("./AssetSourceGenerator")
);
const type = "asset";
const type = ASSET_MODULE_TYPE;
const plugin = "AssetModulesPlugin";
class AssetModulesPlugin {
@ -75,7 +81,7 @@ class AssetModulesPlugin {
plugin,
(compilation, { normalModuleFactory }) => {
normalModuleFactory.hooks.createParser
.for("asset")
.for(ASSET_MODULE_TYPE)
.tap(plugin, parserOptions => {
validateParserOptions(parserOptions);
parserOptions = cleverMerge(
@ -96,35 +102,39 @@ class AssetModulesPlugin {
return new AssetParser(dataUrlCondition);
});
normalModuleFactory.hooks.createParser
.for("asset/inline")
.for(ASSET_MODULE_TYPE_INLINE)
.tap(plugin, parserOptions => {
const AssetParser = getAssetParser();
return new AssetParser(true);
});
normalModuleFactory.hooks.createParser
.for("asset/resource")
.for(ASSET_MODULE_TYPE_RESOURCE)
.tap(plugin, parserOptions => {
const AssetParser = getAssetParser();
return new AssetParser(false);
});
normalModuleFactory.hooks.createParser
.for("asset/source")
.for(ASSET_MODULE_TYPE_SOURCE)
.tap(plugin, parserOptions => {
const AssetSourceParser = getAssetSourceParser();
return new AssetSourceParser();
});
for (const type of ["asset", "asset/inline", "asset/resource"]) {
for (const type of [
ASSET_MODULE_TYPE,
ASSET_MODULE_TYPE_INLINE,
ASSET_MODULE_TYPE_RESOURCE
]) {
normalModuleFactory.hooks.createGenerator
.for(type)
.tap(plugin, generatorOptions => {
validateGeneratorOptions[type](generatorOptions);
let dataUrl = undefined;
if (type !== "asset/resource") {
if (type !== ASSET_MODULE_TYPE_RESOURCE) {
dataUrl = generatorOptions.dataUrl;
if (!dataUrl || typeof dataUrl === "object") {
dataUrl = {
@ -138,7 +148,7 @@ class AssetModulesPlugin {
let filename = undefined;
let publicPath = undefined;
let outputPath = undefined;
if (type !== "asset/inline") {
if (type !== ASSET_MODULE_TYPE_INLINE) {
filename = generatorOptions.filename;
publicPath = generatorOptions.publicPath;
outputPath = generatorOptions.outputPath;
@ -156,7 +166,7 @@ class AssetModulesPlugin {
});
}
normalModuleFactory.hooks.createGenerator
.for("asset/source")
.for(ASSET_MODULE_TYPE_SOURCE)
.tap(plugin, () => {
const AssetSourceGenerator = getAssetSourceGenerator();
@ -169,7 +179,7 @@ class AssetModulesPlugin {
const modules = chunkGraph.getOrderedChunkModulesIterableBySourceType(
chunk,
"asset",
ASSET_MODULE_TYPE,
compareModulesByIdentifier
);
if (modules) {
@ -207,7 +217,7 @@ class AssetModulesPlugin {
"AssetModulesPlugin",
(options, context) => {
const { codeGenerationResult } = options;
const source = codeGenerationResult.sources.get("asset");
const source = codeGenerationResult.sources.get(ASSET_MODULE_TYPE);
if (source === undefined) return;
context.assets.set(codeGenerationResult.data.get("filename"), {
source,

View File

@ -7,6 +7,7 @@
const { RawSource } = require("webpack-sources");
const Module = require("../Module");
const { ASSET_MODULE_TYPE_RAW_DATA_URL } = require("../ModuleTypeConstants");
const RuntimeGlobals = require("../RuntimeGlobals");
const makeSerializable = require("../util/makeSerializable");
@ -33,7 +34,7 @@ class RawDataUrlModule extends Module {
* @param {string=} readableIdentifier readable identifier
*/
constructor(url, identifier, readableIdentifier) {
super("asset/raw-data-url", null);
super(ASSET_MODULE_TYPE_RAW_DATA_URL, null);
this.url = url;
this.urlBuffer = url ? Buffer.from(url) : undefined;
this.identifierStr = identifier || this.url;

View File

@ -13,7 +13,8 @@ const {
WEBASSEMBLY_MODULE_TYPE_ASYNC,
JAVASCRIPT_MODULE_TYPE_ESM,
JAVASCRIPT_MODULE_TYPE_DYNAMIC,
WEBASSEMBLY_MODULE_TYPE_SYNC
WEBASSEMBLY_MODULE_TYPE_SYNC,
ASSET_MODULE_TYPE
} = require("../ModuleTypeConstants");
const Template = require("../Template");
const { cleverMerge } = require("../util/cleverMerge");
@ -511,7 +512,7 @@ const applyModuleDefaults = (
D(module, "unsafeCache", false);
}
F(module.parser, "asset", () => ({}));
F(module.parser, ASSET_MODULE_TYPE, () => ({}));
F(module.parser.asset, "dataUrlCondition", () => ({}));
if (typeof module.parser.asset.dataUrlCondition === "object") {
D(module.parser.asset.dataUrlCondition, "maxSize", 8096);

View File

@ -7,6 +7,7 @@
const { RawSource } = require("webpack-sources");
const Module = require("../Module");
const { WEBPACK_MODULE_TYPE_FALLBACK } = require("../ModuleTypeConstants");
const RuntimeGlobals = require("../RuntimeGlobals");
const Template = require("../Template");
const makeSerializable = require("../util/makeSerializable");
@ -37,7 +38,7 @@ class FallbackModule extends Module {
* @param {string[]} requests list of requests to choose one
*/
constructor(requests) {
super("fallback-module");
super(WEBPACK_MODULE_TYPE_FALLBACK);
this.requests = requests;
this._identifier = `fallback ${this.requests.join(" ")}`;
}

View File

@ -7,6 +7,7 @@
const { RawSource } = require("webpack-sources");
const Module = require("../Module");
const { WEBPACK_MODULE_TYPE_REMOTE } = require("../ModuleTypeConstants");
const RuntimeGlobals = require("../RuntimeGlobals");
const makeSerializable = require("../util/makeSerializable");
const FallbackDependency = require("./FallbackDependency");
@ -39,7 +40,7 @@ class RemoteModule extends Module {
* @param {string} shareScope the used share scope name
*/
constructor(request, externalRequests, internalRequest, shareScope) {
super("remote-module");
super(WEBPACK_MODULE_TYPE_REMOTE);
this.request = request;
this.externalRequests = externalRequests;
this.internalRequest = internalRequest;

View File

@ -10,6 +10,9 @@ const AsyncDependenciesBlock = require("../AsyncDependenciesBlock");
const Dependency = require("../Dependency");
const Module = require("../Module");
const ModuleFactory = require("../ModuleFactory");
const {
WEBPACK_MODULE_TYPE_LAZY_COMPILATION_PROXY
} = require("../ModuleTypeConstants");
const RuntimeGlobals = require("../RuntimeGlobals");
const Template = require("../Template");
const CommonJsRequireDependency = require("../dependencies/CommonJsRequireDependency");
@ -95,7 +98,11 @@ registerNotSerializable(LazyCompilationDependency);
class LazyCompilationProxyModule extends Module {
constructor(context, originalModule, request, client, data, active) {
super("lazy-compilation-proxy", context, originalModule.layer);
super(
WEBPACK_MODULE_TYPE_LAZY_COMPILATION_PROXY,
context,
originalModule.layer
);
this.originalModule = originalModule;
this.request = request;
this.client = client;
@ -107,7 +114,7 @@ class LazyCompilationProxyModule extends Module {
* @returns {string} a unique identifier of the module
*/
identifier() {
return `lazy-compilation-proxy|${this.originalModule.identifier()}`;
return `${WEBPACK_MODULE_TYPE_LAZY_COMPILATION_PROXY}|${this.originalModule.identifier()}`;
}
/**
@ -115,7 +122,7 @@ class LazyCompilationProxyModule extends Module {
* @returns {string} a user readable identifier of the module
*/
readableIdentifier(requestShortener) {
return `lazy-compilation-proxy ${this.originalModule.readableIdentifier(
return `${WEBPACK_MODULE_TYPE_LAZY_COMPILATION_PROXY} ${this.originalModule.readableIdentifier(
requestShortener
)}`;
}
@ -142,7 +149,9 @@ class LazyCompilationProxyModule extends Module {
* @returns {string | null} an identifier for library inclusion
*/
libIdent(options) {
return `${this.originalModule.libIdent(options)}!lazy-compilation-proxy`;
return `${this.originalModule.libIdent(
options
)}!${WEBPACK_MODULE_TYPE_LAZY_COMPILATION_PROXY}`;
}
/**

View File

@ -21,7 +21,8 @@ const InitFragment = require("../InitFragment");
const {
JAVASCRIPT_MODULE_TYPE_AUTO,
JAVASCRIPT_MODULE_TYPE_DYNAMIC,
JAVASCRIPT_MODULE_TYPE_ESM
JAVASCRIPT_MODULE_TYPE_ESM,
WEBPACK_MODULE_TYPE_RUNTIME
} = require("../ModuleTypeConstants");
const RuntimeGlobals = require("../RuntimeGlobals");
const Template = require("../Template");
@ -394,7 +395,7 @@ class JavascriptModulesPlugin {
}
const runtimeModules = chunkGraph.getChunkModulesIterableBySourceType(
chunk,
"runtime"
WEBPACK_MODULE_TYPE_RUNTIME
);
if (runtimeModules) {
const xor = new StringXor();

View File

@ -8,6 +8,9 @@
const { RawSource } = require("webpack-sources");
const AsyncDependenciesBlock = require("../AsyncDependenciesBlock");
const Module = require("../Module");
const {
WEBPACK_MODULE_TYPE_CONSUME_SHARED_MODULE
} = require("../ModuleTypeConstants");
const RuntimeGlobals = require("../RuntimeGlobals");
const makeSerializable = require("../util/makeSerializable");
const { rangeToString, stringifyHoley } = require("../util/semver");
@ -52,7 +55,7 @@ class ConsumeSharedModule extends Module {
* @param {ConsumeOptions} options consume options
*/
constructor(context, options) {
super("consume-shared-module", context);
super(WEBPACK_MODULE_TYPE_CONSUME_SHARED_MODULE, context);
this.options = options;
}
@ -69,7 +72,7 @@ class ConsumeSharedModule extends Module {
singleton,
eager
} = this.options;
return `consume-shared-module|${shareScope}|${shareKey}|${
return `${WEBPACK_MODULE_TYPE_CONSUME_SHARED_MODULE}|${shareScope}|${shareKey}|${
requiredVersion && rangeToString(requiredVersion)
}|${strictVersion}|${importResolved}|${singleton}|${eager}`;
}
@ -88,7 +91,7 @@ class ConsumeSharedModule extends Module {
singleton,
eager
} = this.options;
return `consume shared module (${shareScope}) ${shareKey}@${
return `${WEBPACK_MODULE_TYPE_CONSUME_SHARED_MODULE} (${shareScope}) ${shareKey}@${
requiredVersion ? rangeToString(requiredVersion) : "*"
}${strictVersion ? " (strict)" : ""}${singleton ? " (singleton)" : ""}${
importResolved

View File

@ -7,6 +7,7 @@
const AsyncDependenciesBlock = require("../AsyncDependenciesBlock");
const Module = require("../Module");
const { WEBPACK_MODULE_TYPE_PROVIDE } = require("../ModuleTypeConstants");
const RuntimeGlobals = require("../RuntimeGlobals");
const makeSerializable = require("../util/makeSerializable");
const ProvideForSharedDependency = require("./ProvideForSharedDependency");
@ -39,7 +40,7 @@ class ProvideSharedModule extends Module {
* @param {boolean} eager include the module in sync way
*/
constructor(shareScope, name, version, request, eager) {
super("provide-module");
super(WEBPACK_MODULE_TYPE_PROVIDE);
this._shareScope = shareScope;
this._name = name;
this._version = version;

View File

@ -6,6 +6,7 @@
"use strict";
const util = require("util");
const { WEBPACK_MODULE_TYPE_RUNTIME } = require("../ModuleTypeConstants");
const ModuleDependency = require("../dependencies/ModuleDependency");
const formatLocation = require("../formatLocation");
const { LogType } = require("../logging/Logger");
@ -2093,19 +2094,21 @@ const MODULES_GROUPERS = type => ({
if (!module.moduleType) return;
if (groupModulesByType) {
return [module.moduleType.split("/", 1)[0]];
} else if (module.moduleType === "runtime") {
return ["runtime"];
} else if (module.moduleType === WEBPACK_MODULE_TYPE_RUNTIME) {
return [WEBPACK_MODULE_TYPE_RUNTIME];
}
},
getOptions: key => {
const exclude = key === "runtime" && !options.runtimeModules;
const exclude =
key === WEBPACK_MODULE_TYPE_RUNTIME && !options.runtimeModules;
return {
groupChildren: !exclude,
force: exclude
};
},
createGroup: (key, children, modules) => {
const exclude = key === "runtime" && !options.runtimeModules;
const exclude =
key === WEBPACK_MODULE_TYPE_RUNTIME && !options.runtimeModules;
return {
type: `${key} modules`,
moduleType: key,

52
types.d.ts vendored
View File

@ -6871,8 +6871,54 @@ declare interface MinChunkSizePluginOptions {
minChunkSize: number;
}
declare class Module extends DependenciesBlock {
constructor(type: string, context?: string, layer?: string);
type: string;
constructor(
type:
| ""
| "runtime"
| "javascript/auto"
| "javascript/dynamic"
| "javascript/esm"
| "json"
| "webassembly/async"
| "webassembly/sync"
| "css"
| "css/global"
| "css/module"
| "asset"
| "asset/inline"
| "asset/resource"
| "asset/source"
| "asset/raw-data-url"
| "fallback-module"
| "remote-module"
| "provide-module"
| "consume-shared-module"
| "lazy-compilation-proxy",
context?: string,
layer?: string
);
type:
| ""
| "runtime"
| "javascript/auto"
| "javascript/dynamic"
| "javascript/esm"
| "json"
| "webassembly/async"
| "webassembly/sync"
| "css"
| "css/global"
| "css/module"
| "asset"
| "asset/inline"
| "asset/resource"
| "asset/source"
| "asset/raw-data-url"
| "fallback-module"
| "remote-module"
| "provide-module"
| "consume-shared-module"
| "lazy-compilation-proxy";
context: null | string;
layer: null | string;
needId: boolean;
@ -7833,7 +7879,7 @@ declare interface NormalModuleCreateData {
/**
* module type
*/
type: string;
type: "" | "javascript/auto" | "javascript/dynamic" | "javascript/esm";
/**
* request string