webpack 5.59.0 → 5.76.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.
Potentially problematic release.
This version of webpack might be problematic. Click here for more details.
- package/README.md +22 -24
- package/bin/webpack.js +0 -0
- package/hot/dev-server.js +17 -4
- package/hot/lazy-compilation-node.js +3 -1
- package/hot/poll.js +1 -1
- package/hot/signal.js +1 -1
- package/lib/APIPlugin.js +33 -0
- package/lib/BannerPlugin.js +13 -5
- package/lib/Cache.js +1 -1
- package/lib/CacheFacade.js +4 -11
- package/lib/Chunk.js +6 -3
- package/lib/ChunkGraph.js +94 -8
- package/lib/ChunkGroup.js +1 -1
- package/lib/CleanPlugin.js +81 -20
- package/lib/Compilation.js +188 -93
- package/lib/Compiler.js +87 -18
- package/lib/ConstPlugin.js +2 -2
- package/lib/ContextModule.js +142 -51
- package/lib/ContextModuleFactory.js +65 -25
- package/lib/DelegatedModule.js +1 -1
- package/lib/DelegatedModuleFactoryPlugin.js +1 -1
- package/lib/Dependency.js +17 -0
- package/lib/DependencyTemplate.js +9 -0
- package/lib/DependencyTemplates.js +1 -1
- package/lib/DllModule.js +1 -1
- package/lib/DllReferencePlugin.js +1 -1
- package/lib/EntryOptionPlugin.js +2 -0
- package/lib/ErrorHelpers.js +2 -2
- package/lib/EvalDevToolModulePlugin.js +16 -1
- package/lib/EvalSourceMapDevToolPlugin.js +25 -4
- package/lib/ExportsInfo.js +5 -5
- package/lib/ExternalModule.js +94 -54
- package/lib/ExternalModuleFactoryPlugin.js +5 -5
- package/lib/FileSystemInfo.js +124 -58
- package/lib/Generator.js +3 -0
- package/lib/HookWebpackError.js +1 -1
- package/lib/HotModuleReplacementPlugin.js +3 -1
- package/lib/LoaderOptionsPlugin.js +1 -1
- package/lib/Module.js +28 -4
- package/lib/ModuleFilenameHelpers.js +8 -4
- package/lib/ModuleHashingError.js +29 -0
- package/lib/MultiCompiler.js +1 -1
- package/lib/MultiWatching.js +1 -1
- package/lib/NodeStuffPlugin.js +13 -3
- package/lib/NormalModule.js +51 -33
- package/lib/NormalModuleFactory.js +42 -37
- package/lib/ProgressPlugin.js +4 -5
- package/lib/RawModule.js +1 -1
- package/lib/RuntimeGlobals.js +29 -1
- package/lib/RuntimeModule.js +1 -1
- package/lib/RuntimePlugin.js +84 -1
- package/lib/RuntimeTemplate.js +114 -2
- package/lib/Template.js +3 -2
- package/lib/TemplatedPathPlugin.js +48 -23
- package/lib/WatchIgnorePlugin.js +19 -7
- package/lib/Watching.js +33 -19
- package/lib/WebpackOptionsApply.js +79 -11
- package/lib/asset/AssetGenerator.js +228 -71
- package/lib/asset/AssetModulesPlugin.js +3 -0
- package/lib/asset/AssetParser.js +1 -0
- package/lib/asset/AssetSourceGenerator.js +31 -6
- package/lib/asset/AssetSourceParser.js +1 -0
- package/lib/asset/RawDataUrlModule.js +148 -0
- package/lib/async-modules/AwaitDependenciesInitFragment.js +4 -4
- package/lib/buildChunkGraph.js +38 -7
- package/lib/cache/PackFileCacheStrategy.js +15 -8
- package/lib/cache/ResolverCachePlugin.js +90 -29
- package/lib/cli.js +44 -3
- package/lib/config/browserslistTargetHandler.js +41 -6
- package/lib/config/defaults.js +123 -19
- package/lib/config/normalization.js +10 -2
- package/lib/config/target.js +10 -0
- package/lib/container/ContainerEntryModule.js +8 -5
- package/lib/container/FallbackModule.js +4 -4
- package/lib/container/ModuleFederationPlugin.js +2 -0
- package/lib/container/RemoteModule.js +4 -2
- package/lib/container/RemoteRuntimeModule.js +8 -7
- package/lib/css/CssExportsGenerator.js +139 -0
- package/lib/css/CssGenerator.js +109 -0
- package/lib/css/CssLoadingRuntimeModule.js +442 -0
- package/lib/css/CssModulesPlugin.js +462 -0
- package/lib/css/CssParser.js +618 -0
- package/lib/css/walkCssTokens.js +659 -0
- package/lib/debug/ProfilingPlugin.js +24 -21
- package/lib/dependencies/AMDRequireDependency.js +6 -6
- package/lib/dependencies/CommonJsExportsParserPlugin.js +1 -2
- package/lib/dependencies/CommonJsFullRequireDependency.js +5 -1
- package/lib/dependencies/CommonJsImportsParserPlugin.js +344 -61
- package/lib/dependencies/CommonJsRequireContextDependency.js +6 -2
- package/lib/dependencies/CommonJsRequireDependency.js +2 -1
- package/lib/dependencies/ContextDependency.js +16 -2
- package/lib/dependencies/ContextDependencyHelpers.js +21 -8
- package/lib/dependencies/ContextDependencyTemplateAsRequireCall.js +4 -1
- package/lib/dependencies/ContextElementDependency.js +25 -3
- package/lib/dependencies/CreateScriptUrlDependency.js +12 -0
- package/lib/dependencies/CssExportDependency.js +85 -0
- package/lib/dependencies/CssImportDependency.js +75 -0
- package/lib/dependencies/CssLocalIdentifierDependency.js +119 -0
- package/lib/dependencies/CssSelfLocalIdentifierDependency.js +101 -0
- package/lib/dependencies/CssUrlDependency.js +132 -0
- package/lib/dependencies/ExportsInfoDependency.js +6 -0
- package/lib/dependencies/HarmonyAcceptImportDependency.js +5 -3
- package/lib/dependencies/HarmonyCompatibilityDependency.js +5 -5
- package/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js +127 -0
- package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +12 -3
- package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +25 -17
- package/lib/dependencies/HarmonyExportInitFragment.js +4 -1
- package/lib/dependencies/HarmonyImportDependency.js +23 -0
- package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +142 -45
- package/lib/dependencies/HarmonyImportSpecifierDependency.js +46 -22
- package/lib/dependencies/HarmonyModulesPlugin.js +10 -0
- package/lib/dependencies/ImportContextDependency.js +0 -2
- package/lib/dependencies/ImportMetaContextDependency.js +35 -0
- package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +252 -0
- package/lib/dependencies/ImportMetaContextPlugin.js +59 -0
- package/lib/dependencies/ImportMetaPlugin.js +22 -3
- package/lib/dependencies/ImportParserPlugin.js +35 -29
- package/lib/dependencies/JsonExportsDependency.js +17 -21
- package/lib/dependencies/LoaderDependency.js +13 -0
- package/lib/dependencies/LoaderImportDependency.js +13 -0
- package/lib/dependencies/LoaderPlugin.js +4 -2
- package/lib/dependencies/ModuleDependency.js +11 -1
- package/lib/dependencies/ProvidedDependency.js +31 -8
- package/lib/dependencies/RequireContextDependency.js +0 -16
- package/lib/dependencies/RequireEnsureDependency.js +2 -2
- package/lib/dependencies/RequireResolveContextDependency.js +2 -2
- package/lib/dependencies/RequireResolveDependency.js +2 -1
- package/lib/dependencies/URLDependency.js +3 -8
- package/lib/dependencies/URLPlugin.js +22 -1
- package/lib/dependencies/WorkerPlugin.js +2 -0
- package/lib/esm/ModuleChunkFormatPlugin.js +74 -49
- package/lib/esm/ModuleChunkLoadingPlugin.js +3 -1
- package/lib/esm/ModuleChunkLoadingRuntimeModule.js +25 -9
- package/lib/hmr/HotModuleReplacement.runtime.js +29 -14
- package/lib/hmr/JavascriptHotModuleReplacement.runtime.js +4 -3
- package/lib/hmr/LazyCompilationPlugin.js +54 -26
- package/lib/hmr/lazyCompilationBackend.js +51 -12
- package/lib/ids/DeterministicModuleIdsPlugin.js +55 -35
- package/lib/ids/HashedModuleIdsPlugin.js +11 -14
- package/lib/ids/IdHelpers.js +26 -12
- package/lib/ids/NamedModuleIdsPlugin.js +6 -9
- package/lib/ids/NaturalModuleIdsPlugin.js +10 -13
- package/lib/ids/OccurrenceModuleIdsPlugin.js +13 -10
- package/lib/ids/SyncModuleIdsPlugin.js +140 -0
- package/lib/index.js +20 -0
- package/lib/javascript/ArrayPushCallbackChunkFormatPlugin.js +2 -2
- package/lib/javascript/BasicEvaluatedExpression.js +5 -2
- package/lib/javascript/ChunkHelpers.js +33 -0
- package/lib/javascript/JavascriptGenerator.js +1 -0
- package/lib/javascript/JavascriptModulesPlugin.js +27 -2
- package/lib/javascript/JavascriptParser.js +143 -73
- package/lib/javascript/StartupHelpers.js +7 -30
- package/lib/json/JsonData.js +8 -0
- package/lib/json/JsonParser.js +4 -6
- package/lib/library/AssignLibraryPlugin.js +39 -15
- package/lib/library/EnableLibraryPlugin.js +11 -0
- package/lib/library/UmdLibraryPlugin.js +5 -3
- package/lib/node/NodeTargetPlugin.js +3 -0
- package/lib/node/NodeWatchFileSystem.js +85 -31
- package/lib/node/ReadFileChunkLoadingRuntimeModule.js +23 -8
- package/lib/node/RequireChunkLoadingRuntimeModule.js +24 -9
- package/lib/optimize/ConcatenatedModule.js +62 -26
- package/lib/optimize/ModuleConcatenationPlugin.js +26 -4
- package/lib/optimize/RealContentHashPlugin.js +45 -15
- package/lib/optimize/SplitChunksPlugin.js +8 -1
- package/lib/runtime/AsyncModuleRuntimeModule.js +50 -66
- package/lib/runtime/BaseUriRuntimeModule.js +31 -0
- package/lib/runtime/CreateScriptRuntimeModule.js +36 -0
- package/lib/runtime/CreateScriptUrlRuntimeModule.js +9 -34
- package/lib/runtime/GetTrustedTypesPolicyRuntimeModule.js +76 -0
- package/lib/runtime/LoadScriptRuntimeModule.js +11 -9
- package/lib/runtime/NonceRuntimeModule.js +24 -0
- package/lib/schemes/HttpUriPlugin.js +77 -14
- package/lib/serialization/FileMiddleware.js +44 -9
- package/lib/sharing/ConsumeSharedModule.js +8 -2
- package/lib/sharing/ConsumeSharedRuntimeModule.js +26 -5
- package/lib/sharing/ProvideSharedModule.js +4 -2
- package/lib/sharing/ProvideSharedPlugin.js +1 -2
- package/lib/sharing/ShareRuntimeModule.js +1 -1
- package/lib/sharing/utils.js +1 -1
- package/lib/stats/DefaultStatsFactoryPlugin.js +113 -68
- package/lib/stats/DefaultStatsPrinterPlugin.js +90 -25
- package/lib/util/ArrayHelpers.js +30 -0
- package/lib/util/AsyncQueue.js +1 -1
- package/lib/util/compileBooleanMatcher.js +1 -1
- package/lib/util/create-schema-validation.js +9 -2
- package/lib/util/createHash.js +12 -0
- package/lib/util/deprecation.js +10 -2
- package/lib/util/deterministicGrouping.js +1 -1
- package/lib/util/extractUrlAndGlobal.js +3 -0
- package/lib/util/fs.js +11 -0
- package/lib/util/hash/BatchedHash.js +7 -4
- package/lib/util/hash/md4.js +20 -0
- package/lib/util/hash/wasm-hash.js +163 -0
- package/lib/util/hash/xxhash64.js +5 -139
- package/lib/util/identifier.js +65 -44
- package/lib/util/internalSerializables.js +15 -0
- package/lib/util/nonNumericOnlyHash.js +22 -0
- package/lib/util/semver.js +17 -10
- package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +9 -3
- package/lib/wasm-sync/WebAssemblyParser.js +1 -1
- package/lib/web/JsonpChunkLoadingRuntimeModule.js +31 -18
- package/lib/webpack.js +10 -3
- package/lib/webworker/ImportScriptsChunkLoadingPlugin.js +3 -11
- package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +33 -22
- package/module.d.ts +215 -0
- package/package.json +28 -32
- package/schemas/WebpackOptions.check.js +1 -1
- package/schemas/WebpackOptions.json +321 -30
- package/schemas/plugins/BannerPlugin.check.js +1 -1
- package/schemas/plugins/BannerPlugin.json +4 -0
- package/schemas/plugins/DllReferencePlugin.check.js +1 -1
- package/schemas/plugins/HashedModuleIdsPlugin.check.js +1 -1
- package/schemas/plugins/ProgressPlugin.check.js +1 -1
- package/schemas/plugins/asset/AssetGeneratorOptions.check.js +1 -1
- package/schemas/plugins/asset/AssetParserOptions.check.js +1 -1
- package/schemas/plugins/asset/AssetResourceGeneratorOptions.check.js +1 -1
- package/schemas/plugins/container/ContainerPlugin.check.js +1 -1
- package/schemas/plugins/container/ContainerPlugin.json +2 -1
- package/schemas/plugins/container/ContainerReferencePlugin.check.js +1 -1
- package/schemas/plugins/container/ContainerReferencePlugin.json +1 -0
- package/schemas/plugins/container/ExternalsType.check.js +1 -1
- package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
- package/schemas/plugins/container/ModuleFederationPlugin.json +3 -1
- package/schemas/plugins/css/CssGeneratorOptions.check.d.ts +7 -0
- package/schemas/plugins/css/CssGeneratorOptions.check.js +6 -0
- package/schemas/plugins/css/CssGeneratorOptions.json +3 -0
- package/schemas/plugins/css/CssParserOptions.check.d.ts +7 -0
- package/schemas/plugins/css/CssParserOptions.check.js +6 -0
- package/schemas/plugins/css/CssParserOptions.json +3 -0
- package/schemas/plugins/optimize/AggressiveSplittingPlugin.check.js +1 -1
- package/schemas/plugins/optimize/LimitChunkCountPlugin.check.js +1 -1
- package/schemas/plugins/optimize/MinChunkSizePlugin.check.js +1 -1
- package/schemas/plugins/schemes/HttpUriPlugin.check.js +1 -1
- package/schemas/plugins/schemes/HttpUriPlugin.json +4 -0
- package/types.d.ts +869 -296
@@ -0,0 +1,462 @@
|
|
1
|
+
/*
|
2
|
+
MIT License http://www.opensource.org/licenses/mit-license.php
|
3
|
+
Author Tobias Koppers @sokra
|
4
|
+
*/
|
5
|
+
|
6
|
+
"use strict";
|
7
|
+
|
8
|
+
const { ConcatSource } = require("webpack-sources");
|
9
|
+
const HotUpdateChunk = require("../HotUpdateChunk");
|
10
|
+
const RuntimeGlobals = require("../RuntimeGlobals");
|
11
|
+
const SelfModuleFactory = require("../SelfModuleFactory");
|
12
|
+
const CssExportDependency = require("../dependencies/CssExportDependency");
|
13
|
+
const CssImportDependency = require("../dependencies/CssImportDependency");
|
14
|
+
const CssLocalIdentifierDependency = require("../dependencies/CssLocalIdentifierDependency");
|
15
|
+
const CssSelfLocalIdentifierDependency = require("../dependencies/CssSelfLocalIdentifierDependency");
|
16
|
+
const CssUrlDependency = require("../dependencies/CssUrlDependency");
|
17
|
+
const StaticExportsDependency = require("../dependencies/StaticExportsDependency");
|
18
|
+
const { compareModulesByIdentifier } = require("../util/comparators");
|
19
|
+
const createSchemaValidation = require("../util/create-schema-validation");
|
20
|
+
const createHash = require("../util/createHash");
|
21
|
+
const memoize = require("../util/memoize");
|
22
|
+
const nonNumericOnlyHash = require("../util/nonNumericOnlyHash");
|
23
|
+
const CssExportsGenerator = require("./CssExportsGenerator");
|
24
|
+
const CssGenerator = require("./CssGenerator");
|
25
|
+
const CssParser = require("./CssParser");
|
26
|
+
|
27
|
+
/** @typedef {import("webpack-sources").Source} Source */
|
28
|
+
/** @typedef {import("../../declarations/WebpackOptions").CssExperimentOptions} CssExperimentOptions */
|
29
|
+
/** @typedef {import("../Chunk")} Chunk */
|
30
|
+
/** @typedef {import("../Compiler")} Compiler */
|
31
|
+
/** @typedef {import("../Module")} Module */
|
32
|
+
|
33
|
+
const getCssLoadingRuntimeModule = memoize(() =>
|
34
|
+
require("./CssLoadingRuntimeModule")
|
35
|
+
);
|
36
|
+
|
37
|
+
const getSchema = name => {
|
38
|
+
const { definitions } = require("../../schemas/WebpackOptions.json");
|
39
|
+
return {
|
40
|
+
definitions,
|
41
|
+
oneOf: [{ $ref: `#/definitions/${name}` }]
|
42
|
+
};
|
43
|
+
};
|
44
|
+
|
45
|
+
const validateGeneratorOptions = createSchemaValidation(
|
46
|
+
require("../../schemas/plugins/css/CssGeneratorOptions.check.js"),
|
47
|
+
() => getSchema("CssGeneratorOptions"),
|
48
|
+
{
|
49
|
+
name: "Css Modules Plugin",
|
50
|
+
baseDataPath: "parser"
|
51
|
+
}
|
52
|
+
);
|
53
|
+
const validateParserOptions = createSchemaValidation(
|
54
|
+
require("../../schemas/plugins/css/CssParserOptions.check.js"),
|
55
|
+
() => getSchema("CssParserOptions"),
|
56
|
+
{
|
57
|
+
name: "Css Modules Plugin",
|
58
|
+
baseDataPath: "parser"
|
59
|
+
}
|
60
|
+
);
|
61
|
+
|
62
|
+
const escapeCss = (str, omitOptionalUnderscore) => {
|
63
|
+
const escaped = `${str}`.replace(
|
64
|
+
// cspell:word uffff
|
65
|
+
/[^a-zA-Z0-9_\u0081-\uffff-]/g,
|
66
|
+
s => `\\${s}`
|
67
|
+
);
|
68
|
+
return !omitOptionalUnderscore && /^(?!--)[0-9_-]/.test(escaped)
|
69
|
+
? `_${escaped}`
|
70
|
+
: escaped;
|
71
|
+
};
|
72
|
+
|
73
|
+
const plugin = "CssModulesPlugin";
|
74
|
+
|
75
|
+
class CssModulesPlugin {
|
76
|
+
/**
|
77
|
+
* @param {CssExperimentOptions} options options
|
78
|
+
*/
|
79
|
+
constructor({ exportsOnly = false }) {
|
80
|
+
this._exportsOnly = exportsOnly;
|
81
|
+
}
|
82
|
+
/**
|
83
|
+
* Apply the plugin
|
84
|
+
* @param {Compiler} compiler the compiler instance
|
85
|
+
* @returns {void}
|
86
|
+
*/
|
87
|
+
apply(compiler) {
|
88
|
+
compiler.hooks.compilation.tap(
|
89
|
+
plugin,
|
90
|
+
(compilation, { normalModuleFactory }) => {
|
91
|
+
const selfFactory = new SelfModuleFactory(compilation.moduleGraph);
|
92
|
+
compilation.dependencyFactories.set(
|
93
|
+
CssUrlDependency,
|
94
|
+
normalModuleFactory
|
95
|
+
);
|
96
|
+
compilation.dependencyTemplates.set(
|
97
|
+
CssUrlDependency,
|
98
|
+
new CssUrlDependency.Template()
|
99
|
+
);
|
100
|
+
compilation.dependencyTemplates.set(
|
101
|
+
CssLocalIdentifierDependency,
|
102
|
+
new CssLocalIdentifierDependency.Template()
|
103
|
+
);
|
104
|
+
compilation.dependencyFactories.set(
|
105
|
+
CssSelfLocalIdentifierDependency,
|
106
|
+
selfFactory
|
107
|
+
);
|
108
|
+
compilation.dependencyTemplates.set(
|
109
|
+
CssSelfLocalIdentifierDependency,
|
110
|
+
new CssSelfLocalIdentifierDependency.Template()
|
111
|
+
);
|
112
|
+
compilation.dependencyTemplates.set(
|
113
|
+
CssExportDependency,
|
114
|
+
new CssExportDependency.Template()
|
115
|
+
);
|
116
|
+
compilation.dependencyFactories.set(
|
117
|
+
CssImportDependency,
|
118
|
+
normalModuleFactory
|
119
|
+
);
|
120
|
+
compilation.dependencyTemplates.set(
|
121
|
+
CssImportDependency,
|
122
|
+
new CssImportDependency.Template()
|
123
|
+
);
|
124
|
+
compilation.dependencyTemplates.set(
|
125
|
+
StaticExportsDependency,
|
126
|
+
new StaticExportsDependency.Template()
|
127
|
+
);
|
128
|
+
normalModuleFactory.hooks.createParser
|
129
|
+
.for("css")
|
130
|
+
.tap(plugin, parserOptions => {
|
131
|
+
validateParserOptions(parserOptions);
|
132
|
+
return new CssParser();
|
133
|
+
});
|
134
|
+
normalModuleFactory.hooks.createParser
|
135
|
+
.for("css/global")
|
136
|
+
.tap(plugin, parserOptions => {
|
137
|
+
validateParserOptions(parserOptions);
|
138
|
+
return new CssParser({
|
139
|
+
allowPseudoBlocks: false,
|
140
|
+
allowModeSwitch: false
|
141
|
+
});
|
142
|
+
});
|
143
|
+
normalModuleFactory.hooks.createParser
|
144
|
+
.for("css/module")
|
145
|
+
.tap(plugin, parserOptions => {
|
146
|
+
validateParserOptions(parserOptions);
|
147
|
+
return new CssParser({
|
148
|
+
defaultMode: "local"
|
149
|
+
});
|
150
|
+
});
|
151
|
+
normalModuleFactory.hooks.createGenerator
|
152
|
+
.for("css")
|
153
|
+
.tap(plugin, generatorOptions => {
|
154
|
+
validateGeneratorOptions(generatorOptions);
|
155
|
+
return this._exportsOnly
|
156
|
+
? new CssExportsGenerator()
|
157
|
+
: new CssGenerator();
|
158
|
+
});
|
159
|
+
normalModuleFactory.hooks.createGenerator
|
160
|
+
.for("css/global")
|
161
|
+
.tap(plugin, generatorOptions => {
|
162
|
+
validateGeneratorOptions(generatorOptions);
|
163
|
+
return this._exportsOnly
|
164
|
+
? new CssExportsGenerator()
|
165
|
+
: new CssGenerator();
|
166
|
+
});
|
167
|
+
normalModuleFactory.hooks.createGenerator
|
168
|
+
.for("css/module")
|
169
|
+
.tap(plugin, generatorOptions => {
|
170
|
+
validateGeneratorOptions(generatorOptions);
|
171
|
+
return this._exportsOnly
|
172
|
+
? new CssExportsGenerator()
|
173
|
+
: new CssGenerator();
|
174
|
+
});
|
175
|
+
const orderedCssModulesPerChunk = new WeakMap();
|
176
|
+
compilation.hooks.afterCodeGeneration.tap("CssModulesPlugin", () => {
|
177
|
+
const { chunkGraph } = compilation;
|
178
|
+
for (const chunk of compilation.chunks) {
|
179
|
+
if (CssModulesPlugin.chunkHasCss(chunk, chunkGraph)) {
|
180
|
+
orderedCssModulesPerChunk.set(
|
181
|
+
chunk,
|
182
|
+
this.getOrderedChunkCssModules(chunk, chunkGraph, compilation)
|
183
|
+
);
|
184
|
+
}
|
185
|
+
}
|
186
|
+
});
|
187
|
+
compilation.hooks.contentHash.tap("CssModulesPlugin", chunk => {
|
188
|
+
const {
|
189
|
+
chunkGraph,
|
190
|
+
outputOptions: {
|
191
|
+
hashSalt,
|
192
|
+
hashDigest,
|
193
|
+
hashDigestLength,
|
194
|
+
hashFunction
|
195
|
+
}
|
196
|
+
} = compilation;
|
197
|
+
const modules = orderedCssModulesPerChunk.get(chunk);
|
198
|
+
if (modules === undefined) return;
|
199
|
+
const hash = createHash(hashFunction);
|
200
|
+
if (hashSalt) hash.update(hashSalt);
|
201
|
+
for (const module of modules) {
|
202
|
+
hash.update(chunkGraph.getModuleHash(module, chunk.runtime));
|
203
|
+
}
|
204
|
+
const digest = /** @type {string} */ (hash.digest(hashDigest));
|
205
|
+
chunk.contentHash.css = nonNumericOnlyHash(digest, hashDigestLength);
|
206
|
+
});
|
207
|
+
compilation.hooks.renderManifest.tap(plugin, (result, options) => {
|
208
|
+
const { chunkGraph } = compilation;
|
209
|
+
const { hash, chunk, codeGenerationResults } = options;
|
210
|
+
|
211
|
+
if (chunk instanceof HotUpdateChunk) return result;
|
212
|
+
|
213
|
+
const modules = orderedCssModulesPerChunk.get(chunk);
|
214
|
+
if (modules !== undefined) {
|
215
|
+
result.push({
|
216
|
+
render: () =>
|
217
|
+
this.renderChunk({
|
218
|
+
chunk,
|
219
|
+
chunkGraph,
|
220
|
+
codeGenerationResults,
|
221
|
+
uniqueName: compilation.outputOptions.uniqueName,
|
222
|
+
modules
|
223
|
+
}),
|
224
|
+
filenameTemplate: CssModulesPlugin.getChunkFilenameTemplate(
|
225
|
+
chunk,
|
226
|
+
compilation.outputOptions
|
227
|
+
),
|
228
|
+
pathOptions: {
|
229
|
+
hash,
|
230
|
+
runtime: chunk.runtime,
|
231
|
+
chunk,
|
232
|
+
contentHashType: "css"
|
233
|
+
},
|
234
|
+
identifier: `css${chunk.id}`,
|
235
|
+
hash: chunk.contentHash.css
|
236
|
+
});
|
237
|
+
}
|
238
|
+
return result;
|
239
|
+
});
|
240
|
+
const enabledChunks = new WeakSet();
|
241
|
+
const handler = (chunk, set) => {
|
242
|
+
if (enabledChunks.has(chunk)) {
|
243
|
+
return;
|
244
|
+
}
|
245
|
+
enabledChunks.add(chunk);
|
246
|
+
|
247
|
+
set.add(RuntimeGlobals.publicPath);
|
248
|
+
set.add(RuntimeGlobals.getChunkCssFilename);
|
249
|
+
set.add(RuntimeGlobals.hasOwnProperty);
|
250
|
+
set.add(RuntimeGlobals.moduleFactoriesAddOnly);
|
251
|
+
set.add(RuntimeGlobals.makeNamespaceObject);
|
252
|
+
|
253
|
+
const CssLoadingRuntimeModule = getCssLoadingRuntimeModule();
|
254
|
+
compilation.addRuntimeModule(chunk, new CssLoadingRuntimeModule(set));
|
255
|
+
};
|
256
|
+
compilation.hooks.runtimeRequirementInTree
|
257
|
+
.for(RuntimeGlobals.hasCssModules)
|
258
|
+
.tap(plugin, handler);
|
259
|
+
compilation.hooks.runtimeRequirementInTree
|
260
|
+
.for(RuntimeGlobals.ensureChunkHandlers)
|
261
|
+
.tap(plugin, handler);
|
262
|
+
compilation.hooks.runtimeRequirementInTree
|
263
|
+
.for(RuntimeGlobals.hmrDownloadUpdateHandlers)
|
264
|
+
.tap(plugin, handler);
|
265
|
+
}
|
266
|
+
);
|
267
|
+
}
|
268
|
+
|
269
|
+
getModulesInOrder(chunk, modules, compilation) {
|
270
|
+
if (!modules) return [];
|
271
|
+
|
272
|
+
const modulesList = [...modules];
|
273
|
+
|
274
|
+
// Get ordered list of modules per chunk group
|
275
|
+
// Lists are in reverse order to allow to use Array.pop()
|
276
|
+
const modulesByChunkGroup = Array.from(chunk.groupsIterable, chunkGroup => {
|
277
|
+
const sortedModules = modulesList
|
278
|
+
.map(module => {
|
279
|
+
return {
|
280
|
+
module,
|
281
|
+
index: chunkGroup.getModulePostOrderIndex(module)
|
282
|
+
};
|
283
|
+
})
|
284
|
+
.filter(item => item.index !== undefined)
|
285
|
+
.sort((a, b) => b.index - a.index)
|
286
|
+
.map(item => item.module);
|
287
|
+
|
288
|
+
return { list: sortedModules, set: new Set(sortedModules) };
|
289
|
+
});
|
290
|
+
|
291
|
+
if (modulesByChunkGroup.length === 1)
|
292
|
+
return modulesByChunkGroup[0].list.reverse();
|
293
|
+
|
294
|
+
const compareModuleLists = ({ list: a }, { list: b }) => {
|
295
|
+
if (a.length === 0) {
|
296
|
+
return b.length === 0 ? 0 : 1;
|
297
|
+
} else {
|
298
|
+
if (b.length === 0) return -1;
|
299
|
+
return compareModulesByIdentifier(a[a.length - 1], b[b.length - 1]);
|
300
|
+
}
|
301
|
+
};
|
302
|
+
|
303
|
+
modulesByChunkGroup.sort(compareModuleLists);
|
304
|
+
|
305
|
+
const finalModules = [];
|
306
|
+
|
307
|
+
for (;;) {
|
308
|
+
const failedModules = new Set();
|
309
|
+
const list = modulesByChunkGroup[0].list;
|
310
|
+
if (list.length === 0) {
|
311
|
+
// done, everything empty
|
312
|
+
break;
|
313
|
+
}
|
314
|
+
let selectedModule = list[list.length - 1];
|
315
|
+
let hasFailed = undefined;
|
316
|
+
outer: for (;;) {
|
317
|
+
for (const { list, set } of modulesByChunkGroup) {
|
318
|
+
if (list.length === 0) continue;
|
319
|
+
const lastModule = list[list.length - 1];
|
320
|
+
if (lastModule === selectedModule) continue;
|
321
|
+
if (!set.has(selectedModule)) continue;
|
322
|
+
failedModules.add(selectedModule);
|
323
|
+
if (failedModules.has(lastModule)) {
|
324
|
+
// There is a conflict, try other alternatives
|
325
|
+
hasFailed = lastModule;
|
326
|
+
continue;
|
327
|
+
}
|
328
|
+
selectedModule = lastModule;
|
329
|
+
hasFailed = false;
|
330
|
+
continue outer; // restart
|
331
|
+
}
|
332
|
+
break;
|
333
|
+
}
|
334
|
+
if (hasFailed) {
|
335
|
+
// There is a not resolve-able conflict with the selectedModule
|
336
|
+
if (compilation) {
|
337
|
+
// TODO print better warning
|
338
|
+
compilation.warnings.push(
|
339
|
+
new Error(
|
340
|
+
`chunk ${
|
341
|
+
chunk.name || chunk.id
|
342
|
+
}\nConflicting order between ${hasFailed.readableIdentifier(
|
343
|
+
compilation.requestShortener
|
344
|
+
)} and ${selectedModule.readableIdentifier(
|
345
|
+
compilation.requestShortener
|
346
|
+
)}`
|
347
|
+
)
|
348
|
+
);
|
349
|
+
}
|
350
|
+
selectedModule = hasFailed;
|
351
|
+
}
|
352
|
+
// Insert the selected module into the final modules list
|
353
|
+
finalModules.push(selectedModule);
|
354
|
+
// Remove the selected module from all lists
|
355
|
+
for (const { list, set } of modulesByChunkGroup) {
|
356
|
+
const lastModule = list[list.length - 1];
|
357
|
+
if (lastModule === selectedModule) list.pop();
|
358
|
+
else if (hasFailed && set.has(selectedModule)) {
|
359
|
+
const idx = list.indexOf(selectedModule);
|
360
|
+
if (idx >= 0) list.splice(idx, 1);
|
361
|
+
}
|
362
|
+
}
|
363
|
+
modulesByChunkGroup.sort(compareModuleLists);
|
364
|
+
}
|
365
|
+
return finalModules;
|
366
|
+
}
|
367
|
+
|
368
|
+
getOrderedChunkCssModules(chunk, chunkGraph, compilation) {
|
369
|
+
return [
|
370
|
+
...this.getModulesInOrder(
|
371
|
+
chunk,
|
372
|
+
chunkGraph.getOrderedChunkModulesIterableBySourceType(
|
373
|
+
chunk,
|
374
|
+
"css-import",
|
375
|
+
compareModulesByIdentifier
|
376
|
+
),
|
377
|
+
compilation
|
378
|
+
),
|
379
|
+
...this.getModulesInOrder(
|
380
|
+
chunk,
|
381
|
+
chunkGraph.getOrderedChunkModulesIterableBySourceType(
|
382
|
+
chunk,
|
383
|
+
"css",
|
384
|
+
compareModulesByIdentifier
|
385
|
+
),
|
386
|
+
compilation
|
387
|
+
)
|
388
|
+
];
|
389
|
+
}
|
390
|
+
|
391
|
+
renderChunk({
|
392
|
+
uniqueName,
|
393
|
+
chunk,
|
394
|
+
chunkGraph,
|
395
|
+
codeGenerationResults,
|
396
|
+
modules
|
397
|
+
}) {
|
398
|
+
const source = new ConcatSource();
|
399
|
+
const metaData = [];
|
400
|
+
for (const module of modules) {
|
401
|
+
try {
|
402
|
+
const codeGenResult = codeGenerationResults.get(module, chunk.runtime);
|
403
|
+
|
404
|
+
const s =
|
405
|
+
codeGenResult.sources.get("css") ||
|
406
|
+
codeGenResult.sources.get("css-import");
|
407
|
+
if (s) {
|
408
|
+
source.add(s);
|
409
|
+
source.add("\n");
|
410
|
+
}
|
411
|
+
const exports =
|
412
|
+
codeGenResult.data && codeGenResult.data.get("css-exports");
|
413
|
+
const moduleId = chunkGraph.getModuleId(module) + "";
|
414
|
+
metaData.push(
|
415
|
+
`${
|
416
|
+
exports
|
417
|
+
? Array.from(exports, ([n, v]) => {
|
418
|
+
const shortcutValue = `${
|
419
|
+
uniqueName ? uniqueName + "-" : ""
|
420
|
+
}${moduleId}-${n}`;
|
421
|
+
return v === shortcutValue
|
422
|
+
? `${escapeCss(n)}/`
|
423
|
+
: v === "--" + shortcutValue
|
424
|
+
? `${escapeCss(n)}%`
|
425
|
+
: `${escapeCss(n)}(${escapeCss(v)})`;
|
426
|
+
}).join("")
|
427
|
+
: ""
|
428
|
+
}${escapeCss(moduleId)}`
|
429
|
+
);
|
430
|
+
} catch (e) {
|
431
|
+
e.message += `\nduring rendering of css ${module.identifier()}`;
|
432
|
+
throw e;
|
433
|
+
}
|
434
|
+
}
|
435
|
+
source.add(
|
436
|
+
`head{--webpack-${escapeCss(
|
437
|
+
(uniqueName ? uniqueName + "-" : "") + chunk.id,
|
438
|
+
true
|
439
|
+
)}:${metaData.join(",")};}`
|
440
|
+
);
|
441
|
+
return source;
|
442
|
+
}
|
443
|
+
|
444
|
+
static getChunkFilenameTemplate(chunk, outputOptions) {
|
445
|
+
if (chunk.cssFilenameTemplate) {
|
446
|
+
return chunk.cssFilenameTemplate;
|
447
|
+
} else if (chunk.canBeInitial()) {
|
448
|
+
return outputOptions.cssFilename;
|
449
|
+
} else {
|
450
|
+
return outputOptions.cssChunkFilename;
|
451
|
+
}
|
452
|
+
}
|
453
|
+
|
454
|
+
static chunkHasCss(chunk, chunkGraph) {
|
455
|
+
return (
|
456
|
+
!!chunkGraph.getChunkModulesIterableBySourceType(chunk, "css") ||
|
457
|
+
!!chunkGraph.getChunkModulesIterableBySourceType(chunk, "css-import")
|
458
|
+
);
|
459
|
+
}
|
460
|
+
}
|
461
|
+
|
462
|
+
module.exports = CssModulesPlugin;
|