webpack 5.99.9 → 5.100.1

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.
Files changed (308) hide show
  1. package/bin/webpack.js +8 -2
  2. package/hot/log.js +15 -15
  3. package/hot/poll.js +1 -0
  4. package/lib/APIPlugin.js +3 -3
  5. package/lib/AbstractMethodError.js +1 -0
  6. package/lib/AutomaticPrefetchPlugin.js +1 -0
  7. package/lib/BannerPlugin.js +1 -1
  8. package/lib/CaseSensitiveModulesWarning.js +4 -4
  9. package/lib/Chunk.js +6 -6
  10. package/lib/ChunkGraph.js +37 -31
  11. package/lib/ChunkGroup.js +4 -4
  12. package/lib/ChunkTemplate.js +1 -1
  13. package/lib/CleanPlugin.js +94 -17
  14. package/lib/CodeGenerationResults.js +1 -1
  15. package/lib/CompatibilityPlugin.js +5 -2
  16. package/lib/Compilation.js +67 -45
  17. package/lib/Compiler.js +46 -16
  18. package/lib/ConcatenationScope.js +15 -6
  19. package/lib/ConstPlugin.js +5 -3
  20. package/lib/ContextModule.js +16 -12
  21. package/lib/ContextModuleFactory.js +4 -3
  22. package/lib/ContextReplacementPlugin.js +4 -2
  23. package/lib/CssModule.js +2 -2
  24. package/lib/DefinePlugin.js +111 -3
  25. package/lib/DelegatedModuleFactoryPlugin.js +18 -18
  26. package/lib/Dependency.js +11 -4
  27. package/lib/DependencyTemplate.js +1 -0
  28. package/lib/DllEntryPlugin.js +3 -1
  29. package/lib/DllPlugin.js +4 -3
  30. package/lib/DllReferencePlugin.js +2 -2
  31. package/lib/DynamicEntryPlugin.js +1 -1
  32. package/lib/EntryOptionPlugin.js +5 -0
  33. package/lib/ErrorHelpers.js +4 -4
  34. package/lib/EvalDevToolModulePlugin.js +3 -3
  35. package/lib/EvalSourceMapDevToolPlugin.js +7 -7
  36. package/lib/ExportsInfo.js +48 -39
  37. package/lib/ExternalModule.js +15 -11
  38. package/lib/ExternalModuleFactoryPlugin.js +5 -2
  39. package/lib/FileSystemInfo.js +51 -36
  40. package/lib/FlagDependencyExportsPlugin.js +14 -7
  41. package/lib/FlagDependencyUsagePlugin.js +1 -1
  42. package/lib/Generator.js +14 -1
  43. package/lib/HookWebpackError.js +1 -0
  44. package/lib/HotModuleReplacementPlugin.js +77 -50
  45. package/lib/IgnorePlugin.js +5 -2
  46. package/lib/InvalidDependenciesModuleWarning.js +1 -1
  47. package/lib/JavascriptMetaInfoPlugin.js +0 -1
  48. package/lib/LibManifestPlugin.js +4 -2
  49. package/lib/LoaderOptionsPlugin.js +6 -4
  50. package/lib/MainTemplate.js +2 -2
  51. package/lib/Module.js +21 -6
  52. package/lib/ModuleFactory.js +1 -0
  53. package/lib/ModuleGraph.js +24 -2
  54. package/lib/ModuleGraphConnection.js +5 -5
  55. package/lib/ModuleInfoHeaderPlugin.js +2 -1
  56. package/lib/ModuleParseError.js +1 -0
  57. package/lib/ModuleSourceTypesConstants.js +12 -12
  58. package/lib/ModuleTemplate.js +1 -1
  59. package/lib/ModuleTypeConstants.js +21 -21
  60. package/lib/MultiCompiler.js +6 -6
  61. package/lib/NormalModule.js +31 -44
  62. package/lib/NormalModuleFactory.js +34 -20
  63. package/lib/NormalModuleReplacementPlugin.js +1 -1
  64. package/lib/NullFactory.js +1 -0
  65. package/lib/OptimizationStages.js +1 -1
  66. package/lib/Parser.js +1 -0
  67. package/lib/ProgressPlugin.js +12 -5
  68. package/lib/ProvidePlugin.js +5 -1
  69. package/lib/RawModule.js +14 -0
  70. package/lib/RecordIdsPlugin.js +3 -3
  71. package/lib/RuntimeGlobals.js +175 -155
  72. package/lib/RuntimeModule.js +1 -0
  73. package/lib/RuntimePlugin.js +33 -7
  74. package/lib/RuntimeTemplate.js +111 -11
  75. package/lib/SourceMapDevToolModuleOptionsPlugin.js +15 -25
  76. package/lib/SourceMapDevToolPlugin.js +19 -17
  77. package/lib/Template.js +2 -2
  78. package/lib/TemplatedPathPlugin.js +1 -1
  79. package/lib/WarnDeprecatedOptionPlugin.js +7 -8
  80. package/lib/WatchIgnorePlugin.js +4 -3
  81. package/lib/WebpackIsIncludedPlugin.js +2 -1
  82. package/lib/WebpackOptionsApply.js +115 -27
  83. package/lib/asset/AssetGenerator.js +15 -11
  84. package/lib/asset/AssetModulesPlugin.js +19 -17
  85. package/lib/asset/AssetSourceGenerator.js +4 -4
  86. package/lib/asset/RawDataUrlModule.js +4 -2
  87. package/lib/async-modules/AwaitDependenciesInitFragment.js +1 -1
  88. package/lib/buildChunkGraph.js +6 -3
  89. package/lib/cache/AddBuildDependenciesPlugin.js +5 -6
  90. package/lib/cache/IdleFileCachePlugin.js +7 -4
  91. package/lib/cache/MemoryCachePlugin.js +1 -0
  92. package/lib/cache/MemoryWithGcCachePlugin.js +1 -0
  93. package/lib/cache/PackFileCacheStrategy.js +26 -20
  94. package/lib/cache/ResolverCachePlugin.js +16 -8
  95. package/lib/cli.js +15 -10
  96. package/lib/config/browserslistTargetHandler.js +3 -3
  97. package/lib/config/defaults.js +25 -17
  98. package/lib/config/normalization.js +2 -1
  99. package/lib/config/target.js +6 -5
  100. package/lib/container/ContainerPlugin.js +1 -1
  101. package/lib/container/ContainerReferencePlugin.js +1 -1
  102. package/lib/container/FallbackModule.js +2 -1
  103. package/lib/container/HoistContainerReferencesPlugin.js +1 -1
  104. package/lib/container/ModuleFederationPlugin.js +2 -2
  105. package/lib/container/RemoteModule.js +1 -1
  106. package/lib/css/CssGenerator.js +9 -6
  107. package/lib/css/CssModulesPlugin.js +44 -31
  108. package/lib/css/CssParser.js +6 -4
  109. package/lib/css/walkCssTokens.js +33 -37
  110. package/lib/debug/ProfilingPlugin.js +6 -6
  111. package/lib/dependencies/AMDDefineDependencyParserPlugin.js +8 -8
  112. package/lib/dependencies/AMDPlugin.js +12 -8
  113. package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +28 -26
  114. package/lib/dependencies/CachedConstDependency.js +1 -5
  115. package/lib/dependencies/CommonJsExportRequireDependency.js +6 -4
  116. package/lib/dependencies/CommonJsExportsParserPlugin.js +22 -25
  117. package/lib/dependencies/CommonJsFullRequireDependency.js +1 -9
  118. package/lib/dependencies/CommonJsImportsParserPlugin.js +100 -114
  119. package/lib/dependencies/CommonJsPlugin.js +15 -16
  120. package/lib/dependencies/ContextDependencyHelpers.js +2 -1
  121. package/lib/dependencies/ContextDependencyTemplateAsId.js +1 -0
  122. package/lib/dependencies/ContextDependencyTemplateAsRequireCall.js +1 -0
  123. package/lib/dependencies/CssIcssExportDependency.js +1 -1
  124. package/lib/dependencies/CssLocalIdentifierDependency.js +2 -2
  125. package/lib/dependencies/CssSelfLocalIdentifierDependency.js +2 -1
  126. package/lib/dependencies/DynamicExports.js +9 -9
  127. package/lib/dependencies/ExportsInfoDependency.js +1 -1
  128. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +122 -101
  129. package/lib/dependencies/HarmonyExportExpressionDependency.js +1 -1
  130. package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +95 -19
  131. package/lib/dependencies/HarmonyExportInitFragment.js +1 -1
  132. package/lib/dependencies/HarmonyImportDependency.js +11 -5
  133. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +238 -162
  134. package/lib/dependencies/HarmonyImportSideEffectDependency.js +4 -1
  135. package/lib/dependencies/HarmonyImportSpecifierDependency.js +20 -9
  136. package/lib/dependencies/HarmonyModulesPlugin.js +23 -12
  137. package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +1 -0
  138. package/lib/dependencies/ImportMetaContextPlugin.js +2 -1
  139. package/lib/dependencies/ImportMetaPlugin.js +2 -2
  140. package/lib/dependencies/ImportParserPlugin.js +40 -9
  141. package/lib/dependencies/ImportPlugin.js +3 -1
  142. package/lib/dependencies/LoaderPlugin.js +1 -0
  143. package/lib/dependencies/ModuleDependency.js +3 -1
  144. package/lib/dependencies/ModuleDependencyTemplateAsRequireId.js +1 -0
  145. package/lib/dependencies/RequireContextPlugin.js +3 -1
  146. package/lib/dependencies/RequireEnsurePlugin.js +6 -6
  147. package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +33 -34
  148. package/lib/dependencies/RequireIncludePlugin.js +1 -0
  149. package/lib/dependencies/RuntimeRequirementsDependency.js +1 -1
  150. package/lib/dependencies/SystemPlugin.js +1 -1
  151. package/lib/dependencies/URLContextDependency.js +65 -0
  152. package/lib/dependencies/URLPlugin.js +17 -157
  153. package/lib/dependencies/WorkerPlugin.js +23 -10
  154. package/lib/dependencies/processExportInfo.js +2 -1
  155. package/lib/esm/ModuleChunkFormatPlugin.js +269 -185
  156. package/lib/esm/ModuleChunkLoadingPlugin.js +39 -1
  157. package/lib/esm/ModuleChunkLoadingRuntimeModule.js +70 -3
  158. package/lib/hmr/HotModuleReplacement.runtime.js +0 -1
  159. package/lib/hmr/HotModuleReplacementRuntimeModule.js +1 -1
  160. package/lib/hmr/JavascriptHotModuleReplacementHelper.js +37 -0
  161. package/lib/hmr/LazyCompilationPlugin.js +4 -2
  162. package/lib/hmr/lazyCompilationBackend.js +4 -2
  163. package/lib/ids/ChunkModuleIdRangePlugin.js +6 -3
  164. package/lib/ids/DeterministicChunkIdsPlugin.js +30 -35
  165. package/lib/ids/DeterministicModuleIdsPlugin.js +4 -3
  166. package/lib/ids/HashedModuleIdsPlugin.js +5 -4
  167. package/lib/ids/IdHelpers.js +21 -17
  168. package/lib/ids/NamedChunkIdsPlugin.js +5 -5
  169. package/lib/ids/NamedModuleIdsPlugin.js +4 -4
  170. package/lib/ids/NaturalChunkIdsPlugin.js +2 -1
  171. package/lib/ids/NaturalModuleIdsPlugin.js +1 -1
  172. package/lib/ids/OccurrenceChunkIdsPlugin.js +3 -2
  173. package/lib/ids/OccurrenceModuleIdsPlugin.js +1 -1
  174. package/lib/ids/SyncModuleIdsPlugin.js +1 -1
  175. package/lib/index.js +13 -3
  176. package/lib/javascript/ArrayPushCallbackChunkFormatPlugin.js +113 -119
  177. package/lib/javascript/BasicEvaluatedExpression.js +2 -1
  178. package/lib/javascript/ChunkHelpers.js +1 -0
  179. package/lib/javascript/CommonJsChunkFormatPlugin.js +121 -136
  180. package/lib/javascript/EnableChunkLoadingPlugin.js +6 -3
  181. package/lib/javascript/JavascriptGenerator.js +14 -2
  182. package/lib/javascript/JavascriptModulesPlugin.js +68 -27
  183. package/lib/javascript/JavascriptParser.js +117 -76
  184. package/lib/javascript/JavascriptParserHelpers.js +41 -41
  185. package/lib/javascript/StartupHelpers.js +17 -17
  186. package/lib/json/JsonGenerator.js +4 -2
  187. package/lib/json/JsonModulesPlugin.js +2 -2
  188. package/lib/json/JsonParser.js +1 -1
  189. package/lib/library/AbstractLibraryPlugin.js +6 -2
  190. package/lib/library/AssignLibraryPlugin.js +21 -6
  191. package/lib/library/EnableLibraryPlugin.js +23 -3
  192. package/lib/library/UmdLibraryPlugin.js +15 -6
  193. package/lib/logging/createConsoleLogger.js +3 -3
  194. package/lib/logging/runtime.js +9 -9
  195. package/lib/node/ReadFileChunkLoadingRuntimeModule.js +4 -22
  196. package/lib/node/RequireChunkLoadingRuntimeModule.js +4 -22
  197. package/lib/node/nodeConsole.js +4 -2
  198. package/lib/optimize/AggressiveMergingPlugin.js +45 -46
  199. package/lib/optimize/AggressiveSplittingPlugin.js +13 -12
  200. package/lib/optimize/ConcatenatedModule.js +227 -57
  201. package/lib/optimize/EnsureChunkConditionsPlugin.js +58 -58
  202. package/lib/optimize/FlagIncludedChunksPlugin.js +3 -1
  203. package/lib/optimize/InnerGraph.js +115 -112
  204. package/lib/optimize/InnerGraphPlugin.js +2 -2
  205. package/lib/optimize/LimitChunkCountPlugin.js +4 -2
  206. package/lib/optimize/MangleExportsPlugin.js +4 -3
  207. package/lib/optimize/MergeDuplicateChunksPlugin.js +80 -81
  208. package/lib/optimize/MinChunkSizePlugin.js +6 -3
  209. package/lib/optimize/ModuleConcatenationPlugin.js +31 -22
  210. package/lib/optimize/RealContentHashPlugin.js +26 -20
  211. package/lib/optimize/RemoveEmptyChunksPlugin.js +2 -1
  212. package/lib/optimize/RemoveParentModulesPlugin.js +1 -0
  213. package/lib/optimize/SideEffectsFlagPlugin.js +3 -2
  214. package/lib/optimize/SplitChunksPlugin.js +16 -13
  215. package/lib/rules/BasicEffectRulePlugin.js +4 -2
  216. package/lib/rules/BasicMatcherRulePlugin.js +3 -1
  217. package/lib/rules/ObjectMatcherRulePlugin.js +3 -1
  218. package/lib/rules/RuleSetCompiler.js +19 -5
  219. package/lib/rules/UseEffectRulePlugin.js +17 -9
  220. package/lib/runtime/AsyncModuleRuntimeModule.js +64 -9
  221. package/lib/runtime/CreateFakeNamespaceObjectRuntimeModule.js +1 -1
  222. package/lib/runtime/MakeDeferredNamespaceObjectRuntime.js +214 -0
  223. package/lib/runtime/RuntimeIdRuntimeModule.js +2 -1
  224. package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +8 -7
  225. package/lib/schemes/FileUriPlugin.js +1 -1
  226. package/lib/schemes/HttpUriPlugin.js +27 -19
  227. package/lib/schemes/VirtualUrlPlugin.js +222 -0
  228. package/lib/serialization/AggregateErrorSerializer.js +1 -1
  229. package/lib/serialization/BinaryMiddleware.js +5 -4
  230. package/lib/serialization/FileMiddleware.js +7 -4
  231. package/lib/serialization/ObjectMiddleware.js +14 -8
  232. package/lib/serialization/Serializer.js +5 -3
  233. package/lib/serialization/SerializerMiddleware.js +2 -0
  234. package/lib/sharing/ConsumeSharedModule.js +1 -1
  235. package/lib/sharing/ConsumeSharedPlugin.js +3 -3
  236. package/lib/sharing/ConsumeSharedRuntimeModule.js +2 -2
  237. package/lib/sharing/ProvideSharedModule.js +1 -1
  238. package/lib/sharing/ProvideSharedPlugin.js +3 -2
  239. package/lib/sharing/SharePlugin.js +2 -1
  240. package/lib/sharing/ShareRuntimeModule.js +3 -5
  241. package/lib/sharing/utils.js +34 -34
  242. package/lib/stats/DefaultStatsFactoryPlugin.js +49 -46
  243. package/lib/stats/DefaultStatsPresetPlugin.js +13 -13
  244. package/lib/stats/DefaultStatsPrinterPlugin.js +15 -9
  245. package/lib/stats/StatsFactory.js +6 -3
  246. package/lib/stats/StatsPrinter.js +6 -7
  247. package/lib/url/URLParserPlugin.js +266 -0
  248. package/lib/util/ArrayQueue.js +1 -1
  249. package/lib/util/AsyncQueue.js +1 -1
  250. package/lib/util/Hash.js +2 -0
  251. package/lib/util/IterableHelpers.js +1 -1
  252. package/lib/util/LazyBucketSortedSet.js +2 -1
  253. package/lib/util/LazySet.js +11 -6
  254. package/lib/util/ParallelismFactorCalculator.js +1 -1
  255. package/lib/util/SetHelpers.js +3 -3
  256. package/lib/util/SortableSet.js +2 -2
  257. package/lib/util/StackedCacheMap.js +3 -1
  258. package/lib/util/StackedMap.js +2 -2
  259. package/lib/util/StringXor.js +1 -0
  260. package/lib/util/TupleSet.js +1 -0
  261. package/lib/util/URLAbsoluteSpecifier.js +1 -1
  262. package/lib/util/cleverMerge.js +95 -58
  263. package/lib/util/comparators.js +154 -127
  264. package/lib/util/compileBooleanMatcher.js +8 -3
  265. package/lib/util/concatenate.js +8 -7
  266. package/lib/util/conventions.js +72 -73
  267. package/lib/util/create-schema-validation.js +2 -1
  268. package/lib/util/createHash.js +10 -4
  269. package/lib/util/deprecation.js +69 -66
  270. package/lib/util/deterministicGrouping.js +4 -2
  271. package/lib/util/extractUrlAndGlobal.js +1 -1
  272. package/lib/util/findGraphRoots.js +2 -2
  273. package/lib/util/fs.js +30 -23
  274. package/lib/util/hash/md4.js +2 -2
  275. package/lib/util/hash/wasm-hash.js +4 -2
  276. package/lib/util/identifier.js +13 -12
  277. package/lib/util/internalSerializables.js +2 -0
  278. package/lib/util/magicComment.js +5 -5
  279. package/lib/util/processAsyncTree.js +1 -1
  280. package/lib/util/propertyAccess.js +1 -1
  281. package/lib/util/propertyName.js +1 -1
  282. package/lib/util/registerExternalSerializer.js +1 -2
  283. package/lib/util/removeBOM.js +1 -1
  284. package/lib/util/runtime.js +29 -21
  285. package/lib/util/semver.js +1 -1
  286. package/lib/util/serialization.js +3 -0
  287. package/lib/util/source.js +3 -2
  288. package/lib/validateSchema.js +1 -0
  289. package/lib/wasm/EnableWasmLoadingPlugin.js +6 -3
  290. package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +4 -1
  291. package/lib/wasm-async/AsyncWebAssemblyModulesPlugin.js +46 -49
  292. package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +2 -2
  293. package/lib/wasm-sync/WebAssemblyGenerator.js +2 -3
  294. package/lib/wasm-sync/WebAssemblyInInitialChunkError.js +3 -2
  295. package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +3 -0
  296. package/lib/wasm-sync/WebAssemblyUtils.js +1 -1
  297. package/lib/web/JsonpChunkLoadingRuntimeModule.js +4 -22
  298. package/lib/webpack.js +4 -5
  299. package/lib/webworker/ImportScriptsChunkLoadingPlugin.js +1 -0
  300. package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +6 -24
  301. package/lib/webworker/WebWorkerTemplatePlugin.js +1 -0
  302. package/package.json +119 -113
  303. package/schemas/WebpackOptions.check.js +1 -1
  304. package/schemas/WebpackOptions.json +17 -0
  305. package/schemas/plugins/schemes/VirtualUrlPlugin.check.d.ts +7 -0
  306. package/schemas/plugins/schemes/VirtualUrlPlugin.check.js +6 -0
  307. package/schemas/plugins/schemes/VirtualUrlPlugin.json +77 -0
  308. package/types.d.ts +1243 -409
@@ -30,10 +30,12 @@ const DYNAMIC_INFO = Symbol("cleverMerge dynamic info");
30
30
  const cachedCleverMerge = (first, second) => {
31
31
  if (second === undefined) return /** @type {T} */ (first);
32
32
  if (first === undefined) return /** @type {O} */ (second);
33
- if (typeof second !== "object" || second === null)
33
+ if (typeof second !== "object" || second === null) {
34
34
  return /** @type {O} */ (second);
35
- if (typeof first !== "object" || first === null)
35
+ }
36
+ if (typeof first !== "object" || first === null) {
36
37
  return /** @type {T} */ (first);
38
+ }
37
39
 
38
40
  let innerCache = mergeCache.get(first);
39
41
  if (innerCache === undefined) {
@@ -83,32 +85,43 @@ const cachedSetProperty = (obj, property, value) => {
83
85
  };
84
86
 
85
87
  /**
86
- * @template V
87
- * @typedef {Map<string, V | undefined>} ByValues
88
+ * @typedef {Map<string, EXPECTED_ANY>} ByValues
88
89
  */
89
90
 
90
91
  /**
92
+ * @template T
91
93
  * @typedef {object} ObjectParsedPropertyEntry
92
- * @property {TODO | undefined} base base value
94
+ * @property {T[keyof T] | undefined} base base value
93
95
  * @property {string | undefined} byProperty the name of the selector property
94
- * @property {ByValues<TODO>} byValues value depending on selector property, merged with base
96
+ * @property {ByValues | undefined} byValues value depending on selector property, merged with base
95
97
  */
96
98
 
97
99
  /** @typedef {(function(...EXPECTED_ANY): object) & { [DYNAMIC_INFO]: [DynamicFunction, object] }} DynamicFunction */
98
100
 
99
101
  /**
102
+ * @template {object} T
103
+ * @typedef {Map<keyof T, ObjectParsedPropertyEntry<T>>} ParsedObjectStatic
104
+ */
105
+
106
+ /**
107
+ * @template {object} T
108
+ * @typedef {{ byProperty: string, fn: DynamicFunction }} ParsedObjectDynamic
109
+ */
110
+
111
+ /**
112
+ * @template {object} T
100
113
  * @typedef {object} ParsedObject
101
- * @property {Map<string, ObjectParsedPropertyEntry>} static static properties (key is property name)
102
- * @property {{ byProperty: string, fn: DynamicFunction } | undefined} dynamic dynamic part
114
+ * @property {ParsedObjectStatic<T>} static static properties (key is property name)
115
+ * @property {ParsedObjectDynamic<T> | undefined} dynamic dynamic part
103
116
  */
104
117
 
105
- /** @type {WeakMap<EXPECTED_OBJECT, ParsedObject>} */
118
+ /** @type {WeakMap<EXPECTED_OBJECT, ParsedObject<EXPECTED_ANY>>} */
106
119
  const parseCache = new WeakMap();
107
120
 
108
121
  /**
109
122
  * @template {object} T
110
123
  * @param {T} obj the object
111
- * @returns {ParsedObject} parsed object
124
+ * @returns {ParsedObject<T>} parsed object
112
125
  */
113
126
  const cachedParseObject = obj => {
114
127
  const entry = parseCache.get(/** @type {EXPECTED_OBJECT} */ (obj));
@@ -118,18 +131,21 @@ const cachedParseObject = obj => {
118
131
  return result;
119
132
  };
120
133
 
134
+ /** @typedef {{ [p: string]: { [p: string]: EXPECTED_ANY } } | DynamicFunction} ByObject */
135
+
121
136
  /**
122
137
  * @template {object} T
123
- * @template V
124
138
  * @param {T} obj the object
125
- * @returns {ParsedObject} parsed object
139
+ * @returns {ParsedObject<T>} parsed object
126
140
  */
127
141
  const parseObject = obj => {
142
+ /** @type {ParsedObjectStatic<T>} */
128
143
  const info = new Map();
144
+ /** @type {ParsedObjectDynamic<T> | undefined} */
129
145
  let dynamicInfo;
130
146
  /**
131
- * @param {string} p path
132
- * @returns {Partial<ObjectParsedPropertyEntry>} object parsed property entry
147
+ * @param {keyof T} p path
148
+ * @returns {Partial<ObjectParsedPropertyEntry<T>>} object parsed property entry
133
149
  */
134
150
  const getInfo = p => {
135
151
  const entry = info.get(p);
@@ -142,38 +158,37 @@ const parseObject = obj => {
142
158
  info.set(p, newEntry);
143
159
  return newEntry;
144
160
  };
145
- for (const key of Object.keys(obj)) {
146
- if (key.startsWith("by")) {
147
- const byProperty = /** @type {keyof T} */ (key);
148
- const byObj = /** @type {TODO} */ (obj[byProperty]);
161
+ for (const key_ of Object.keys(obj)) {
162
+ const key = /** @type {keyof T} */ (key_);
163
+ if (typeof key === "string" && key.startsWith("by")) {
164
+ const byProperty = key;
165
+ const byObj = /** @type {ByObject} */ (obj[byProperty]);
149
166
  if (typeof byObj === "object") {
150
167
  for (const byValue of Object.keys(byObj)) {
151
168
  const obj = byObj[/** @type {keyof (keyof T)} */ (byValue)];
152
169
  for (const key of Object.keys(obj)) {
153
- const entry = getInfo(key);
170
+ const entry = getInfo(/** @type {keyof T} */ (key));
154
171
  if (entry.byProperty === undefined) {
155
- entry.byProperty = /** @type {string} */ (byProperty);
172
+ entry.byProperty = byProperty;
156
173
  entry.byValues = new Map();
157
174
  } else if (entry.byProperty !== byProperty) {
158
175
  throw new Error(
159
176
  `${/** @type {string} */ (byProperty)} and ${entry.byProperty} for a single property is not supported`
160
177
  );
161
178
  }
162
- /** @type {ByValues<V>} */
163
- (entry.byValues).set(
164
- byValue,
165
- obj[/** @type {keyof (keyof T)} */ (key)]
166
- );
179
+ /** @type {ByValues} */
180
+ (entry.byValues).set(byValue, obj[key]);
167
181
  if (byValue === "default") {
168
182
  for (const otherByValue of Object.keys(byObj)) {
169
183
  if (
170
184
  !(
171
- /** @type {ByValues<V>} */
185
+ /** @type {ByValues} */
172
186
  (entry.byValues).has(otherByValue)
173
187
  )
174
- )
175
- /** @type {ByValues<V>} */
188
+ ) {
189
+ /** @type {ByValues} */
176
190
  (entry.byValues).set(otherByValue, undefined);
191
+ }
177
192
  }
178
193
  }
179
194
  }
@@ -191,11 +206,11 @@ const parseObject = obj => {
191
206
  }
192
207
  } else {
193
208
  const entry = getInfo(key);
194
- entry.base = obj[/** @type {keyof T} */ (key)];
209
+ entry.base = obj[key];
195
210
  }
196
211
  } else {
197
212
  const entry = getInfo(key);
198
- entry.base = obj[/** @type {keyof T} */ (key)];
213
+ entry.base = obj[key];
199
214
  }
200
215
  }
201
216
  return {
@@ -206,8 +221,8 @@ const parseObject = obj => {
206
221
 
207
222
  /**
208
223
  * @template {object} T
209
- * @param {Map<string, ObjectParsedPropertyEntry>} info static properties (key is property name)
210
- * @param {{ byProperty: string, fn: (...args: EXPECTED_ANY[]) => T } | undefined} dynamicInfo dynamic part
224
+ * @param {ParsedObjectStatic<T>} info static properties (key is property name)
225
+ * @param {{ byProperty: string, fn: DynamicFunction } | undefined} dynamicInfo dynamic part
211
226
  * @returns {T} the object
212
227
  */
213
228
  const serializeObject = (info, dynamicInfo) => {
@@ -218,7 +233,7 @@ const serializeObject = (info, dynamicInfo) => {
218
233
  const byProperty = /** @type {keyof T} */ (entry.byProperty);
219
234
  const byObj = (obj[byProperty] =
220
235
  obj[byProperty] || /** @type {TODO} */ ({}));
221
- for (const byValue of entry.byValues.keys()) {
236
+ for (const byValue of /** @type {ByValues} */ (entry.byValues).keys()) {
222
237
  byObj[byValue] = byObj[byValue] || {};
223
238
  }
224
239
  }
@@ -233,7 +248,11 @@ const serializeObject = (info, dynamicInfo) => {
233
248
  const byObj = (obj[byProperty] =
234
249
  obj[byProperty] || /** @type {TODO} */ ({}));
235
250
  for (const byValue of Object.keys(byObj)) {
236
- const value = getFromByValues(entry.byValues, byValue);
251
+ const value = getFromByValues(
252
+ /** @type {ByValues} */
253
+ (entry.byValues),
254
+ byValue
255
+ );
237
256
  if (value !== undefined) byObj[byValue][key] = value;
238
257
  }
239
258
  }
@@ -314,7 +333,7 @@ const _cleverMerge = (first, second, internalCaching = false) => {
314
333
  const fnInfo = fn[DYNAMIC_INFO];
315
334
  if (fnInfo) {
316
335
  second =
317
- /** @type {TODO} */
336
+ /** @type {O} */
318
337
  (
319
338
  internalCaching
320
339
  ? cachedCleverMerge(fnInfo[1], second)
@@ -340,10 +359,12 @@ const _cleverMerge = (first, second, internalCaching = false) => {
340
359
  ? cachedParseObject(second)
341
360
  : parseObject(second);
342
361
  const { static: secondInfo, dynamic: secondDynamicInfo } = secondObject;
343
- /** @type {Map<string, ObjectParsedPropertyEntry>} */
344
362
  const resultInfo = new Map();
345
363
  for (const [key, firstEntry] of firstInfo) {
346
- const secondEntry = secondInfo.get(key);
364
+ const secondEntry = secondInfo.get(
365
+ /** @type {keyof (T | O)} */
366
+ (key)
367
+ );
347
368
  const entry =
348
369
  secondEntry !== undefined
349
370
  ? mergeEntries(firstEntry, secondEntry, internalCaching)
@@ -351,7 +372,7 @@ const _cleverMerge = (first, second, internalCaching = false) => {
351
372
  resultInfo.set(key, entry);
352
373
  }
353
374
  for (const [key, secondEntry] of secondInfo) {
354
- if (!firstInfo.has(key)) {
375
+ if (!firstInfo.has(/** @type {keyof (T | O)} */ (key))) {
355
376
  resultInfo.set(key, secondEntry);
356
377
  }
357
378
  }
@@ -359,10 +380,11 @@ const _cleverMerge = (first, second, internalCaching = false) => {
359
380
  };
360
381
 
361
382
  /**
362
- * @param {ObjectParsedPropertyEntry} firstEntry a
363
- * @param {ObjectParsedPropertyEntry} secondEntry b
383
+ * @template T, O
384
+ * @param {ObjectParsedPropertyEntry<T>} firstEntry a
385
+ * @param {ObjectParsedPropertyEntry<O>} secondEntry b
364
386
  * @param {boolean} internalCaching should parsing of objects and nested merges be cached
365
- * @returns {ObjectParsedPropertyEntry} new entry
387
+ * @returns {ObjectParsedPropertyEntry<TODO>} new entry
366
388
  */
367
389
  const mergeEntries = (firstEntry, secondEntry, internalCaching) => {
368
390
  switch (getValueType(secondEntry.base)) {
@@ -388,8 +410,14 @@ const mergeEntries = (firstEntry, secondEntry, internalCaching) => {
388
410
  // = first.base + (first.byProperty + second.byProperty)
389
411
  // need to merge first and second byValues
390
412
  const newByValues = new Map(firstEntry.byValues);
391
- for (const [key, value] of secondEntry.byValues) {
392
- const firstValue = getFromByValues(firstEntry.byValues, key);
413
+ for (const [key, value] of /** @type {ByValues} */ (
414
+ secondEntry.byValues
415
+ )) {
416
+ const firstValue = getFromByValues(
417
+ /** @type {ByValues} */
418
+ (firstEntry.byValues),
419
+ key
420
+ );
393
421
  newByValues.set(
394
422
  key,
395
423
  mergeSingleValue(firstValue, value, internalCaching)
@@ -406,11 +434,15 @@ const mergeEntries = (firstEntry, secondEntry, internalCaching) => {
406
434
  // The simple case
407
435
  // = (first.base + second.base) + second.byProperty
408
436
  return {
409
- base: mergeSingleValue(
410
- firstEntry.base,
411
- secondEntry.base,
412
- internalCaching
413
- ),
437
+ base:
438
+ /** @type {T[keyof T] & O[keyof O]} */
439
+ (
440
+ mergeSingleValue(
441
+ firstEntry.base,
442
+ secondEntry.base,
443
+ internalCaching
444
+ )
445
+ ),
414
446
  byProperty: secondEntry.byProperty,
415
447
  byValues: secondEntry.byValues
416
448
  };
@@ -424,10 +456,12 @@ const mergeEntries = (firstEntry, secondEntry, internalCaching) => {
424
456
  );
425
457
  }
426
458
  if (
427
- Array.from(firstEntry.byValues.values()).every(value => {
428
- const type = getValueType(value);
429
- return type === VALUE_TYPE_ATOM || type === VALUE_TYPE_DELETE;
430
- })
459
+ [.../** @type {ByValues} */ (firstEntry.byValues).values()].every(
460
+ value => {
461
+ const type = getValueType(value);
462
+ return type === VALUE_TYPE_ATOM || type === VALUE_TYPE_DELETE;
463
+ }
464
+ )
431
465
  ) {
432
466
  // = (first.base + second.base) + ((first.byProperty + second.base) + second.byProperty)
433
467
  newBase = mergeSingleValue(
@@ -438,8 +472,9 @@ const mergeEntries = (firstEntry, secondEntry, internalCaching) => {
438
472
  } else {
439
473
  // = first.base + ((first.byProperty (+default) + second.base) + second.byProperty)
440
474
  newBase = firstEntry.base;
441
- if (!intermediateByValues.has("default"))
475
+ if (!intermediateByValues.has("default")) {
442
476
  intermediateByValues.set("default", secondEntry.base);
477
+ }
443
478
  }
444
479
  if (!secondEntry.byProperty) {
445
480
  // = first.base + (first.byProperty + second.base)
@@ -454,7 +489,9 @@ const mergeEntries = (firstEntry, secondEntry, internalCaching) => {
454
489
  );
455
490
  }
456
491
  const newByValues = new Map(intermediateByValues);
457
- for (const [key, value] of secondEntry.byValues) {
492
+ for (const [key, value] of /** @type {ByValues} */ (
493
+ secondEntry.byValues
494
+ )) {
458
495
  const firstValue = getFromByValues(intermediateByValues, key);
459
496
  newByValues.set(
460
497
  key,
@@ -472,7 +509,7 @@ const mergeEntries = (firstEntry, secondEntry, internalCaching) => {
472
509
 
473
510
  /**
474
511
  * @template V
475
- * @param {ByValues<V>} byValues all values
512
+ * @param {ByValues} byValues all values
476
513
  * @param {string} key value of the selector
477
514
  * @returns {V | undefined} value
478
515
  */
@@ -629,9 +666,9 @@ const resolveByProperty = (obj, byProperty, ...values) => {
629
666
  return obj;
630
667
  };
631
668
 
632
- module.exports.cachedSetProperty = cachedSetProperty;
669
+ module.exports.DELETE = DELETE;
633
670
  module.exports.cachedCleverMerge = cachedCleverMerge;
671
+ module.exports.cachedSetProperty = cachedSetProperty;
634
672
  module.exports.cleverMerge = cleverMerge;
635
- module.exports.resolveByProperty = resolveByProperty;
636
673
  module.exports.removeOperations = removeOperations;
637
- module.exports.DELETE = DELETE;
674
+ module.exports.resolveByProperty = resolveByProperty;