@eriche/webpack 4.47.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.
- package/LICENSE +20 -0
- package/README.md +784 -0
- package/SECURITY.md +9 -0
- package/bin/webpack.js +171 -0
- package/buildin/amd-define.js +3 -0
- package/buildin/amd-options.js +2 -0
- package/buildin/global.js +20 -0
- package/buildin/harmony-module.js +24 -0
- package/buildin/module.js +22 -0
- package/buildin/system.js +7 -0
- package/declarations/WebpackOptions.d.ts +1466 -0
- package/declarations/plugins/BannerPlugin.d.ts +49 -0
- package/declarations/plugins/DllPlugin.d.ts +32 -0
- package/declarations/plugins/DllReferencePlugin.d.ts +126 -0
- package/declarations/plugins/HashedModuleIdsPlugin.d.ts +24 -0
- package/declarations/plugins/IgnorePlugin.d.ts +27 -0
- package/declarations/plugins/LoaderOptionsPlugin.d.ts +27 -0
- package/declarations/plugins/ProgressPlugin.d.ts +42 -0
- package/declarations/plugins/SourceMapDevToolPlugin.d.ts +94 -0
- package/declarations/plugins/WatchIgnorePlugin.d.ts +10 -0
- package/declarations/plugins/debug/ProfilingPlugin.d.ts +12 -0
- package/declarations/plugins/optimize/AggressiveSplittingPlugin.d.ts +24 -0
- package/declarations/plugins/optimize/LimitChunkCountPlugin.d.ts +16 -0
- package/declarations/plugins/optimize/MinChunkSizePlugin.d.ts +12 -0
- package/declarations/plugins/optimize/OccurrenceOrderChunkIdsPlugin.d.ts +12 -0
- package/declarations/plugins/optimize/OccurrenceOrderModuleIdsPlugin.d.ts +12 -0
- package/hot/dev-server.js +61 -0
- package/hot/emitter.js +2 -0
- package/hot/log-apply-result.js +44 -0
- package/hot/log.js +59 -0
- package/hot/only-dev-server.js +102 -0
- package/hot/poll.js +37 -0
- package/hot/signal.js +62 -0
- package/lib/APIPlugin.js +84 -0
- package/lib/AbstractMethodError.js +43 -0
- package/lib/AmdMainTemplatePlugin.js +106 -0
- package/lib/AsyncDependenciesBlock.js +110 -0
- package/lib/AsyncDependencyToInitialChunkError.js +31 -0
- package/lib/AutomaticPrefetchPlugin.js +57 -0
- package/lib/BannerPlugin.js +122 -0
- package/lib/BasicEvaluatedExpression.js +248 -0
- package/lib/CachePlugin.js +100 -0
- package/lib/CaseSensitiveModulesWarning.js +67 -0
- package/lib/Chunk.js +875 -0
- package/lib/ChunkGroup.js +513 -0
- package/lib/ChunkRenderError.js +32 -0
- package/lib/ChunkTemplate.js +87 -0
- package/lib/CommentCompilationWarning.js +32 -0
- package/lib/CommonJsStuffPlugin.js +116 -0
- package/lib/CompatibilityPlugin.js +70 -0
- package/lib/Compilation.js +2327 -0
- package/lib/Compiler.js +735 -0
- package/lib/ConcurrentCompilationError.js +19 -0
- package/lib/ConstPlugin.js +348 -0
- package/lib/ContextExclusionPlugin.js +28 -0
- package/lib/ContextModule.js +872 -0
- package/lib/ContextModuleFactory.js +262 -0
- package/lib/ContextReplacementPlugin.js +133 -0
- package/lib/DefinePlugin.js +289 -0
- package/lib/DelegatedModule.js +114 -0
- package/lib/DelegatedModuleFactoryPlugin.js +95 -0
- package/lib/DelegatedPlugin.js +39 -0
- package/lib/DependenciesBlock.js +124 -0
- package/lib/DependenciesBlockVariable.js +72 -0
- package/lib/Dependency.js +89 -0
- package/lib/DllEntryPlugin.js +54 -0
- package/lib/DllModule.js +60 -0
- package/lib/DllModuleFactory.js +29 -0
- package/lib/DllPlugin.js +49 -0
- package/lib/DllReferencePlugin.js +156 -0
- package/lib/DynamicEntryPlugin.js +94 -0
- package/lib/EntryModuleNotFoundError.js +21 -0
- package/lib/EntryOptionPlugin.js +46 -0
- package/lib/Entrypoint.js +64 -0
- package/lib/EnvironmentPlugin.js +72 -0
- package/lib/ErrorHelpers.js +60 -0
- package/lib/EvalDevToolModulePlugin.js +27 -0
- package/lib/EvalDevToolModuleTemplatePlugin.js +61 -0
- package/lib/EvalSourceMapDevToolModuleTemplatePlugin.js +120 -0
- package/lib/EvalSourceMapDevToolPlugin.js +41 -0
- package/lib/ExportPropertyMainTemplatePlugin.js +53 -0
- package/lib/ExtendedAPIPlugin.js +88 -0
- package/lib/ExternalModule.js +179 -0
- package/lib/ExternalModuleFactoryPlugin.js +110 -0
- package/lib/ExternalsPlugin.js +23 -0
- package/lib/FlagAllModulesAsUsedPlugin.js +38 -0
- package/lib/FlagDependencyExportsPlugin.js +174 -0
- package/lib/FlagDependencyUsagePlugin.js +116 -0
- package/lib/FlagInitialModulesAsUsedPlugin.js +36 -0
- package/lib/FunctionModulePlugin.js +19 -0
- package/lib/FunctionModuleTemplatePlugin.js +102 -0
- package/lib/Generator.js +60 -0
- package/lib/GraphHelpers.js +65 -0
- package/lib/HarmonyLinkingError.js +17 -0
- package/lib/HashedModuleIdsPlugin.js +63 -0
- package/lib/HotModuleReplacement.runtime.js +721 -0
- package/lib/HotModuleReplacementPlugin.js +425 -0
- package/lib/HotUpdateChunk.js +17 -0
- package/lib/HotUpdateChunkTemplate.js +78 -0
- package/lib/IgnorePlugin.js +91 -0
- package/lib/JavascriptGenerator.js +229 -0
- package/lib/JavascriptModulesPlugin.js +185 -0
- package/lib/JsonGenerator.js +57 -0
- package/lib/JsonModulesPlugin.js +30 -0
- package/lib/JsonParser.js +27 -0
- package/lib/LibManifestPlugin.js +90 -0
- package/lib/LibraryTemplatePlugin.js +186 -0
- package/lib/LoaderOptionsPlugin.js +58 -0
- package/lib/LoaderTargetPlugin.js +24 -0
- package/lib/MainTemplate.js +568 -0
- package/lib/MemoryOutputFileSystem.js +5 -0
- package/lib/Module.js +435 -0
- package/lib/ModuleBuildError.js +52 -0
- package/lib/ModuleDependencyError.js +35 -0
- package/lib/ModuleDependencyWarning.js +25 -0
- package/lib/ModuleError.js +36 -0
- package/lib/ModuleFilenameHelpers.js +179 -0
- package/lib/ModuleNotFoundError.js +23 -0
- package/lib/ModuleParseError.js +67 -0
- package/lib/ModuleReason.js +48 -0
- package/lib/ModuleTemplate.js +93 -0
- package/lib/ModuleWarning.js +36 -0
- package/lib/MultiCompiler.js +290 -0
- package/lib/MultiEntryPlugin.js +80 -0
- package/lib/MultiModule.js +87 -0
- package/lib/MultiModuleFactory.js +23 -0
- package/lib/MultiStats.js +92 -0
- package/lib/MultiWatching.js +50 -0
- package/lib/NamedChunksPlugin.js +29 -0
- package/lib/NamedModulesPlugin.js +58 -0
- package/lib/NoEmitOnErrorsPlugin.js +20 -0
- package/lib/NoModeWarning.js +23 -0
- package/lib/NodeStuffPlugin.js +118 -0
- package/lib/NormalModule.js +582 -0
- package/lib/NormalModuleFactory.js +528 -0
- package/lib/NormalModuleReplacementPlugin.js +51 -0
- package/lib/NullFactory.js +12 -0
- package/lib/OptionsApply.js +10 -0
- package/lib/OptionsDefaulter.js +141 -0
- package/lib/Parser.js +2454 -0
- package/lib/ParserHelpers.js +103 -0
- package/lib/PrefetchPlugin.js +37 -0
- package/lib/ProgressPlugin.js +307 -0
- package/lib/ProvidePlugin.js +86 -0
- package/lib/RawModule.js +56 -0
- package/lib/RecordIdsPlugin.js +236 -0
- package/lib/RemovedPluginError.js +11 -0
- package/lib/RequestShortener.js +83 -0
- package/lib/RequireJsStuffPlugin.js +66 -0
- package/lib/ResolverFactory.js +74 -0
- package/lib/RuleSet.js +567 -0
- package/lib/RuntimeTemplate.js +336 -0
- package/lib/SetVarMainTemplatePlugin.js +69 -0
- package/lib/SingleEntryPlugin.js +63 -0
- package/lib/SizeFormatHelpers.js +24 -0
- package/lib/SourceMapDevToolModuleOptionsPlugin.js +49 -0
- package/lib/SourceMapDevToolPlugin.js +418 -0
- package/lib/Stats.js +1685 -0
- package/lib/SystemMainTemplatePlugin.js +137 -0
- package/lib/Template.js +291 -0
- package/lib/TemplatedPathPlugin.js +188 -0
- package/lib/UmdMainTemplatePlugin.js +305 -0
- package/lib/UnsupportedFeatureWarning.js +30 -0
- package/lib/UseStrictPlugin.js +54 -0
- package/lib/WarnCaseSensitiveModulesPlugin.js +37 -0
- package/lib/WarnNoModeSetPlugin.js +17 -0
- package/lib/WatchIgnorePlugin.js +106 -0
- package/lib/Watching.js +211 -0
- package/lib/WebpackError.js +31 -0
- package/lib/WebpackOptionsApply.js +546 -0
- package/lib/WebpackOptionsDefaulter.js +391 -0
- package/lib/WebpackOptionsValidationError.js +390 -0
- package/lib/buildChunkGraph.js +712 -0
- package/lib/compareLocations.js +52 -0
- package/lib/debug/ProfilingPlugin.js +442 -0
- package/lib/dependencies/AMDDefineDependency.js +137 -0
- package/lib/dependencies/AMDDefineDependencyParserPlugin.js +336 -0
- package/lib/dependencies/AMDPlugin.js +249 -0
- package/lib/dependencies/AMDRequireArrayDependency.js +49 -0
- package/lib/dependencies/AMDRequireContextDependency.js +20 -0
- package/lib/dependencies/AMDRequireDependenciesBlock.js +47 -0
- package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +274 -0
- package/lib/dependencies/AMDRequireDependency.js +135 -0
- package/lib/dependencies/AMDRequireItemDependency.js +22 -0
- package/lib/dependencies/CommonJsPlugin.js +158 -0
- package/lib/dependencies/CommonJsRequireContextDependency.js +23 -0
- package/lib/dependencies/CommonJsRequireDependency.js +22 -0
- package/lib/dependencies/CommonJsRequireDependencyParserPlugin.js +138 -0
- package/lib/dependencies/ConstDependency.js +33 -0
- package/lib/dependencies/ContextDependency.js +68 -0
- package/lib/dependencies/ContextDependencyHelpers.js +232 -0
- package/lib/dependencies/ContextDependencyTemplateAsId.js +43 -0
- package/lib/dependencies/ContextDependencyTemplateAsRequireCall.js +39 -0
- package/lib/dependencies/ContextElementDependency.js +21 -0
- package/lib/dependencies/CriticalDependencyWarning.js +20 -0
- package/lib/dependencies/DelegatedExportsDependency.js +33 -0
- package/lib/dependencies/DelegatedSourceDependency.js +18 -0
- package/lib/dependencies/DependencyReference.js +64 -0
- package/lib/dependencies/DllEntryDependency.js +20 -0
- package/lib/dependencies/HarmonyAcceptDependency.js +48 -0
- package/lib/dependencies/HarmonyAcceptImportDependency.js +23 -0
- package/lib/dependencies/HarmonyCompatibilityDependency.js +31 -0
- package/lib/dependencies/HarmonyDetectionParserPlugin.js +96 -0
- package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +154 -0
- package/lib/dependencies/HarmonyExportExpressionDependency.js +58 -0
- package/lib/dependencies/HarmonyExportHeaderDependency.js +30 -0
- package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +659 -0
- package/lib/dependencies/HarmonyExportSpecifierDependency.js +54 -0
- package/lib/dependencies/HarmonyImportDependency.js +109 -0
- package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +222 -0
- package/lib/dependencies/HarmonyImportSideEffectDependency.js +31 -0
- package/lib/dependencies/HarmonyImportSpecifierDependency.js +163 -0
- package/lib/dependencies/HarmonyInitDependency.js +60 -0
- package/lib/dependencies/HarmonyModulesPlugin.js +143 -0
- package/lib/dependencies/HarmonyTopLevelThisParserPlugin.js +26 -0
- package/lib/dependencies/ImportContextDependency.js +23 -0
- package/lib/dependencies/ImportDependenciesBlock.js +18 -0
- package/lib/dependencies/ImportDependency.js +34 -0
- package/lib/dependencies/ImportEagerDependency.js +32 -0
- package/lib/dependencies/ImportParserPlugin.js +248 -0
- package/lib/dependencies/ImportPlugin.js +79 -0
- package/lib/dependencies/ImportWeakDependency.js +34 -0
- package/lib/dependencies/JsonExportsDependency.js +26 -0
- package/lib/dependencies/LoaderDependency.js +21 -0
- package/lib/dependencies/LoaderPlugin.js +115 -0
- package/lib/dependencies/LocalModule.js +23 -0
- package/lib/dependencies/LocalModuleDependency.js +28 -0
- package/lib/dependencies/LocalModulesHelpers.js +52 -0
- package/lib/dependencies/ModuleDependency.js +23 -0
- package/lib/dependencies/ModuleDependencyTemplateAsId.js +17 -0
- package/lib/dependencies/ModuleDependencyTemplateAsRequireId.js +17 -0
- package/lib/dependencies/ModuleHotAcceptDependency.js +23 -0
- package/lib/dependencies/ModuleHotDeclineDependency.js +23 -0
- package/lib/dependencies/MultiEntryDependency.js +25 -0
- package/lib/dependencies/NullDependency.js +20 -0
- package/lib/dependencies/PrefetchDependency.js +18 -0
- package/lib/dependencies/RequireContextDependency.js +22 -0
- package/lib/dependencies/RequireContextDependencyParserPlugin.js +56 -0
- package/lib/dependencies/RequireContextPlugin.js +143 -0
- package/lib/dependencies/RequireEnsureDependenciesBlock.js +33 -0
- package/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js +116 -0
- package/lib/dependencies/RequireEnsureDependency.js +58 -0
- package/lib/dependencies/RequireEnsureItemDependency.js +21 -0
- package/lib/dependencies/RequireEnsurePlugin.js +74 -0
- package/lib/dependencies/RequireHeaderDependency.js +26 -0
- package/lib/dependencies/RequireIncludeDependency.js +39 -0
- package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +23 -0
- package/lib/dependencies/RequireIncludePlugin.js +61 -0
- package/lib/dependencies/RequireResolveContextDependency.js +23 -0
- package/lib/dependencies/RequireResolveDependency.js +22 -0
- package/lib/dependencies/RequireResolveDependencyParserPlugin.js +86 -0
- package/lib/dependencies/RequireResolveHeaderDependency.js +26 -0
- package/lib/dependencies/SingleEntryDependency.js +21 -0
- package/lib/dependencies/SystemPlugin.js +122 -0
- package/lib/dependencies/UnsupportedDependency.js +27 -0
- package/lib/dependencies/WebAssemblyExportImportedDependency.js +31 -0
- package/lib/dependencies/WebAssemblyImportDependency.js +54 -0
- package/lib/dependencies/WebpackMissingModule.js +20 -0
- package/lib/dependencies/getFunctionExpression.js +52 -0
- package/lib/formatLocation.js +75 -0
- package/lib/logging/Logger.js +128 -0
- package/lib/logging/createConsoleLogger.js +210 -0
- package/lib/logging/runtime.js +36 -0
- package/lib/logging/truncateArgs.js +76 -0
- package/lib/node/NodeChunkTemplatePlugin.js +31 -0
- package/lib/node/NodeEnvironmentPlugin.js +44 -0
- package/lib/node/NodeHotUpdateChunkTemplatePlugin.js +36 -0
- package/lib/node/NodeMainTemplate.runtime.js +32 -0
- package/lib/node/NodeMainTemplateAsync.runtime.js +50 -0
- package/lib/node/NodeMainTemplatePlugin.js +321 -0
- package/lib/node/NodeOutputFileSystem.js +22 -0
- package/lib/node/NodeSourcePlugin.js +141 -0
- package/lib/node/NodeTargetPlugin.js +19 -0
- package/lib/node/NodeTemplatePlugin.js +31 -0
- package/lib/node/NodeWatchFileSystem.js +109 -0
- package/lib/node/ReadFileCompileWasmTemplatePlugin.js +61 -0
- package/lib/node/nodeConsole.js +135 -0
- package/lib/optimize/AggressiveMergingPlugin.js +87 -0
- package/lib/optimize/AggressiveSplittingPlugin.js +294 -0
- package/lib/optimize/ChunkModuleIdRangePlugin.js +66 -0
- package/lib/optimize/ConcatenatedModule.js +1477 -0
- package/lib/optimize/EnsureChunkConditionsPlugin.js +70 -0
- package/lib/optimize/FlagIncludedChunksPlugin.js +99 -0
- package/lib/optimize/LimitChunkCountPlugin.js +231 -0
- package/lib/optimize/MergeDuplicateChunksPlugin.js +78 -0
- package/lib/optimize/MinChunkSizePlugin.js +82 -0
- package/lib/optimize/MinMaxSizeWarning.js +29 -0
- package/lib/optimize/ModuleConcatenationPlugin.js +485 -0
- package/lib/optimize/NaturalChunkOrderPlugin.js +41 -0
- package/lib/optimize/OccurrenceChunkOrderPlugin.js +66 -0
- package/lib/optimize/OccurrenceModuleOrderPlugin.js +112 -0
- package/lib/optimize/OccurrenceOrderPlugin.js +135 -0
- package/lib/optimize/RemoveEmptyChunksPlugin.js +42 -0
- package/lib/optimize/RemoveParentModulesPlugin.js +127 -0
- package/lib/optimize/RuntimeChunkPlugin.js +41 -0
- package/lib/optimize/SideEffectsFlagPlugin.js +352 -0
- package/lib/optimize/SplitChunksPlugin.js +971 -0
- package/lib/performance/AssetsOverSizeLimitWarning.js +30 -0
- package/lib/performance/EntrypointsOverSizeLimitWarning.js +30 -0
- package/lib/performance/NoAsyncChunksWarning.js +21 -0
- package/lib/performance/SizeLimitsPlugin.js +125 -0
- package/lib/util/LazyBucketSortedSet.js +235 -0
- package/lib/util/Queue.js +46 -0
- package/lib/util/Semaphore.js +53 -0
- package/lib/util/SetHelpers.js +48 -0
- package/lib/util/SortableSet.js +140 -0
- package/lib/util/StackedSetMap.js +142 -0
- package/lib/util/TrackingSet.js +35 -0
- package/lib/util/cachedMerge.js +35 -0
- package/lib/util/cleverMerge.js +77 -0
- package/lib/util/createHash.js +174 -0
- package/lib/util/deterministicGrouping.js +274 -0
- package/lib/util/hash/BatchedHash.js +71 -0
- package/lib/util/hash/md4.js +25 -0
- package/lib/util/hash/wasm-hash.js +174 -0
- package/lib/util/identifier.js +127 -0
- package/lib/util/objectToMap.js +16 -0
- package/lib/validateSchema.js +67 -0
- package/lib/wasm/UnsupportedWebAssemblyFeatureError.js +17 -0
- package/lib/wasm/WasmFinalizeExportsPlugin.js +69 -0
- package/lib/wasm/WasmMainTemplatePlugin.js +341 -0
- package/lib/wasm/WebAssemblyGenerator.js +458 -0
- package/lib/wasm/WebAssemblyInInitialChunkError.js +88 -0
- package/lib/wasm/WebAssemblyJavascriptGenerator.js +152 -0
- package/lib/wasm/WebAssemblyModulesPlugin.js +128 -0
- package/lib/wasm/WebAssemblyParser.js +175 -0
- package/lib/wasm/WebAssemblyUtils.js +59 -0
- package/lib/web/FetchCompileWasmTemplatePlugin.js +37 -0
- package/lib/web/JsonpChunkTemplatePlugin.js +71 -0
- package/lib/web/JsonpExportMainTemplatePlugin.js +50 -0
- package/lib/web/JsonpHotUpdateChunkTemplatePlugin.js +39 -0
- package/lib/web/JsonpMainTemplate.runtime.js +71 -0
- package/lib/web/JsonpMainTemplatePlugin.js +615 -0
- package/lib/web/JsonpTemplatePlugin.js +23 -0
- package/lib/web/WebEnvironmentPlugin.js +18 -0
- package/lib/webpack.js +206 -0
- package/lib/webpack.web.js +31 -0
- package/lib/webworker/WebWorkerChunkTemplatePlugin.js +35 -0
- package/lib/webworker/WebWorkerHotUpdateChunkTemplatePlugin.js +40 -0
- package/lib/webworker/WebWorkerMainTemplate.runtime.js +73 -0
- package/lib/webworker/WebWorkerMainTemplatePlugin.js +192 -0
- package/lib/webworker/WebWorkerTemplatePlugin.js +25 -0
- package/package.json +211 -0
- package/schemas/WebpackOptions.json +2285 -0
- package/schemas/ajv.absolutePath.js +57 -0
- package/schemas/plugins/BannerPlugin.json +101 -0
- package/schemas/plugins/DllPlugin.json +36 -0
- package/schemas/plugins/DllReferencePlugin.json +205 -0
- package/schemas/plugins/HashedModuleIdsPlugin.json +26 -0
- package/schemas/plugins/IgnorePlugin.json +37 -0
- package/schemas/plugins/LoaderOptionsPlugin.json +27 -0
- package/schemas/plugins/ProgressPlugin.json +52 -0
- package/schemas/plugins/SourceMapDevToolPlugin.json +185 -0
- package/schemas/plugins/WatchIgnorePlugin.json +18 -0
- package/schemas/plugins/debug/ProfilingPlugin.json +13 -0
- package/schemas/plugins/optimize/AggressiveSplittingPlugin.json +23 -0
- package/schemas/plugins/optimize/LimitChunkCountPlugin.json +16 -0
- package/schemas/plugins/optimize/MinChunkSizePlugin.json +12 -0
- package/schemas/plugins/optimize/OccurrenceOrderChunkIdsPlugin.json +11 -0
- package/schemas/plugins/optimize/OccurrenceOrderModuleIdsPlugin.json +11 -0
- package/web_modules/node-libs-browser.js +0 -0
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
// Simulations show these probabilities for a single change
|
|
4
|
+
// 93.1% that one group is invalidated
|
|
5
|
+
// 4.8% that two groups are invalidated
|
|
6
|
+
// 1.1% that 3 groups are invalidated
|
|
7
|
+
// 0.1% that 4 or more groups are invalidated
|
|
8
|
+
//
|
|
9
|
+
// And these for removing/adding 10 lexically adjacent files
|
|
10
|
+
// 64.5% that one group is invalidated
|
|
11
|
+
// 24.8% that two groups are invalidated
|
|
12
|
+
// 7.8% that 3 groups are invalidated
|
|
13
|
+
// 2.7% that 4 or more groups are invalidated
|
|
14
|
+
//
|
|
15
|
+
// And these for removing/adding 3 random files
|
|
16
|
+
// 0% that one group is invalidated
|
|
17
|
+
// 3.7% that two groups are invalidated
|
|
18
|
+
// 80.8% that 3 groups are invalidated
|
|
19
|
+
// 12.3% that 4 groups are invalidated
|
|
20
|
+
// 3.2% that 5 or more groups are invalidated
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
*
|
|
24
|
+
* @param {string} a key
|
|
25
|
+
* @param {string} b key
|
|
26
|
+
* @returns {number} the similarity as number
|
|
27
|
+
*/
|
|
28
|
+
const similarity = (a, b) => {
|
|
29
|
+
const l = Math.min(a.length, b.length);
|
|
30
|
+
let dist = 0;
|
|
31
|
+
for (let i = 0; i < l; i++) {
|
|
32
|
+
const ca = a.charCodeAt(i);
|
|
33
|
+
const cb = b.charCodeAt(i);
|
|
34
|
+
dist += Math.max(0, 10 - Math.abs(ca - cb));
|
|
35
|
+
}
|
|
36
|
+
return dist;
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* @param {string} a key
|
|
41
|
+
* @param {string} b key
|
|
42
|
+
* @returns {string} the common part and a single char for the difference
|
|
43
|
+
*/
|
|
44
|
+
const getName = (a, b) => {
|
|
45
|
+
const l = Math.min(a.length, b.length);
|
|
46
|
+
let r = "";
|
|
47
|
+
for (let i = 0; i < l; i++) {
|
|
48
|
+
const ca = a.charAt(i);
|
|
49
|
+
const cb = b.charAt(i);
|
|
50
|
+
r += ca;
|
|
51
|
+
if (ca === cb) {
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
return r;
|
|
55
|
+
}
|
|
56
|
+
return a;
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* @template T
|
|
61
|
+
*/
|
|
62
|
+
class Node {
|
|
63
|
+
/**
|
|
64
|
+
* @param {T} item item
|
|
65
|
+
* @param {string} key key
|
|
66
|
+
* @param {number} size size
|
|
67
|
+
*/
|
|
68
|
+
constructor(item, key, size) {
|
|
69
|
+
this.item = item;
|
|
70
|
+
this.key = key;
|
|
71
|
+
this.size = size;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* @template T
|
|
77
|
+
*/
|
|
78
|
+
class Group {
|
|
79
|
+
/**
|
|
80
|
+
* @param {Node<T>[]} nodes nodes
|
|
81
|
+
* @param {number[]} similarities similarities between the nodes (length = nodes.length - 1)
|
|
82
|
+
*/
|
|
83
|
+
constructor(nodes, similarities) {
|
|
84
|
+
this.nodes = nodes;
|
|
85
|
+
this.similarities = similarities;
|
|
86
|
+
this.size = nodes.reduce((size, node) => size + node.size, 0);
|
|
87
|
+
/** @type {string} */
|
|
88
|
+
this.key = undefined;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* @template T
|
|
94
|
+
* @typedef {Object} GroupedItems<T>
|
|
95
|
+
* @property {string} key
|
|
96
|
+
* @property {T[]} items
|
|
97
|
+
* @property {number} size
|
|
98
|
+
*/
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* @template T
|
|
102
|
+
* @typedef {Object} Options
|
|
103
|
+
* @property {number} maxSize maximum size of a group
|
|
104
|
+
* @property {number} minSize minimum size of a group (preferred over maximum size)
|
|
105
|
+
* @property {Iterable<T>} items a list of items
|
|
106
|
+
* @property {function(T): number} getSize function to get size of an item
|
|
107
|
+
* @property {function(T): string} getKey function to get the key of an item
|
|
108
|
+
*/
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* @template T
|
|
112
|
+
* @param {Options<T>} options options object
|
|
113
|
+
* @returns {GroupedItems<T>[]} grouped items
|
|
114
|
+
*/
|
|
115
|
+
module.exports = ({ maxSize, minSize, items, getSize, getKey }) => {
|
|
116
|
+
/** @type {Group<T>[]} */
|
|
117
|
+
const result = [];
|
|
118
|
+
|
|
119
|
+
const nodes = Array.from(
|
|
120
|
+
items,
|
|
121
|
+
item => new Node(item, getKey(item), getSize(item))
|
|
122
|
+
);
|
|
123
|
+
|
|
124
|
+
/** @type {Node<T>[]} */
|
|
125
|
+
const initialNodes = [];
|
|
126
|
+
|
|
127
|
+
// lexically ordering of keys
|
|
128
|
+
nodes.sort((a, b) => {
|
|
129
|
+
if (a.key < b.key) return -1;
|
|
130
|
+
if (a.key > b.key) return 1;
|
|
131
|
+
return 0;
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
// return nodes bigger than maxSize directly as group
|
|
135
|
+
for (const node of nodes) {
|
|
136
|
+
if (node.size >= maxSize) {
|
|
137
|
+
result.push(new Group([node], []));
|
|
138
|
+
} else {
|
|
139
|
+
initialNodes.push(node);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
if (initialNodes.length > 0) {
|
|
144
|
+
// calculate similarities between lexically adjacent nodes
|
|
145
|
+
/** @type {number[]} */
|
|
146
|
+
const similarities = [];
|
|
147
|
+
for (let i = 1; i < initialNodes.length; i++) {
|
|
148
|
+
const a = initialNodes[i - 1];
|
|
149
|
+
const b = initialNodes[i];
|
|
150
|
+
similarities.push(similarity(a.key, b.key));
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
const initialGroup = new Group(initialNodes, similarities);
|
|
154
|
+
|
|
155
|
+
if (initialGroup.size < minSize) {
|
|
156
|
+
// We hit an edgecase where the working set is already smaller than minSize
|
|
157
|
+
// We merge it with the smallest result node to keep minSize intact
|
|
158
|
+
if (result.length > 0) {
|
|
159
|
+
const smallestGroup = result.reduce((min, group) =>
|
|
160
|
+
min.size > group.size ? group : min
|
|
161
|
+
);
|
|
162
|
+
for (const node of initialGroup.nodes) smallestGroup.nodes.push(node);
|
|
163
|
+
smallestGroup.nodes.sort((a, b) => {
|
|
164
|
+
if (a.key < b.key) return -1;
|
|
165
|
+
if (a.key > b.key) return 1;
|
|
166
|
+
return 0;
|
|
167
|
+
});
|
|
168
|
+
} else {
|
|
169
|
+
// There are no other nodes
|
|
170
|
+
// We use all nodes and have to accept that it's smaller than minSize
|
|
171
|
+
result.push(initialGroup);
|
|
172
|
+
}
|
|
173
|
+
} else {
|
|
174
|
+
const queue = [initialGroup];
|
|
175
|
+
|
|
176
|
+
while (queue.length) {
|
|
177
|
+
const group = queue.pop();
|
|
178
|
+
// only groups bigger than maxSize need to be splitted
|
|
179
|
+
if (group.size < maxSize) {
|
|
180
|
+
result.push(group);
|
|
181
|
+
continue;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
// find unsplittable area from left and right
|
|
185
|
+
// going minSize from left and right
|
|
186
|
+
// at least one node need to be included otherwise we get stuck
|
|
187
|
+
let left = 0;
|
|
188
|
+
let leftSize = 0;
|
|
189
|
+
while (leftSize <= minSize) {
|
|
190
|
+
leftSize += group.nodes[left].size;
|
|
191
|
+
left++;
|
|
192
|
+
}
|
|
193
|
+
let right = group.nodes.length - 1;
|
|
194
|
+
let rightSize = 0;
|
|
195
|
+
while (rightSize <= minSize) {
|
|
196
|
+
rightSize += group.nodes[right].size;
|
|
197
|
+
right--;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
if (left - 1 > right) {
|
|
201
|
+
// can't split group while holding minSize
|
|
202
|
+
// because minSize is preferred of maxSize we return
|
|
203
|
+
// the group here even while it's too big
|
|
204
|
+
// To avoid this make sure maxSize > minSize * 3
|
|
205
|
+
result.push(group);
|
|
206
|
+
continue;
|
|
207
|
+
}
|
|
208
|
+
if (left <= right) {
|
|
209
|
+
// when there is a area between left and right
|
|
210
|
+
// we look for best split point
|
|
211
|
+
// we split at the minimum similarity
|
|
212
|
+
// here key space is separated the most
|
|
213
|
+
let best = left - 1;
|
|
214
|
+
let bestSimilarity = group.similarities[best];
|
|
215
|
+
for (let i = left; i <= right; i++) {
|
|
216
|
+
const similarity = group.similarities[i];
|
|
217
|
+
if (similarity < bestSimilarity) {
|
|
218
|
+
best = i;
|
|
219
|
+
bestSimilarity = similarity;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
left = best + 1;
|
|
223
|
+
right = best;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// create two new groups for left and right area
|
|
227
|
+
// and queue them up
|
|
228
|
+
const rightNodes = [group.nodes[right + 1]];
|
|
229
|
+
/** @type {number[]} */
|
|
230
|
+
const rightSimilaries = [];
|
|
231
|
+
for (let i = right + 2; i < group.nodes.length; i++) {
|
|
232
|
+
rightSimilaries.push(group.similarities[i - 1]);
|
|
233
|
+
rightNodes.push(group.nodes[i]);
|
|
234
|
+
}
|
|
235
|
+
queue.push(new Group(rightNodes, rightSimilaries));
|
|
236
|
+
|
|
237
|
+
const leftNodes = [group.nodes[0]];
|
|
238
|
+
/** @type {number[]} */
|
|
239
|
+
const leftSimilaries = [];
|
|
240
|
+
for (let i = 1; i < left; i++) {
|
|
241
|
+
leftSimilaries.push(group.similarities[i - 1]);
|
|
242
|
+
leftNodes.push(group.nodes[i]);
|
|
243
|
+
}
|
|
244
|
+
queue.push(new Group(leftNodes, leftSimilaries));
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
// lexically ordering
|
|
250
|
+
result.sort((a, b) => {
|
|
251
|
+
if (a.nodes[0].key < b.nodes[0].key) return -1;
|
|
252
|
+
if (a.nodes[0].key > b.nodes[0].key) return 1;
|
|
253
|
+
return 0;
|
|
254
|
+
});
|
|
255
|
+
|
|
256
|
+
// give every group a name
|
|
257
|
+
for (let i = 0; i < result.length; i++) {
|
|
258
|
+
const group = result[i];
|
|
259
|
+
const first = group.nodes[0];
|
|
260
|
+
const last = group.nodes[group.nodes.length - 1];
|
|
261
|
+
let name = getName(first.key, last.key);
|
|
262
|
+
group.key = name;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
// return the results
|
|
266
|
+
return result.map(group => {
|
|
267
|
+
/** @type {GroupedItems} */
|
|
268
|
+
return {
|
|
269
|
+
key: group.key,
|
|
270
|
+
items: group.nodes.map(node => node.item),
|
|
271
|
+
size: group.size
|
|
272
|
+
};
|
|
273
|
+
});
|
|
274
|
+
};
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/*
|
|
2
|
+
MIT License http://www.opensource.org/licenses/mit-license.php
|
|
3
|
+
Author Tobias Koppers @sokra
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
// From Webpack 5
|
|
9
|
+
// https://github.com/webpack/webpack/blob/853bfda35a0080605c09e1bdeb0103bcb9367a10/lib/util/hash/BatchedHash.js
|
|
10
|
+
|
|
11
|
+
const { Hash } = require("../createHash");
|
|
12
|
+
const MAX_SHORT_STRING = require("./wasm-hash").MAX_SHORT_STRING;
|
|
13
|
+
|
|
14
|
+
class BatchedHash extends Hash {
|
|
15
|
+
constructor(hash) {
|
|
16
|
+
super();
|
|
17
|
+
this.string = undefined;
|
|
18
|
+
this.encoding = undefined;
|
|
19
|
+
this.hash = hash;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Update hash {@link https://nodejs.org/api/crypto.html#crypto_hash_update_data_inputencoding}
|
|
24
|
+
* @param {string|Buffer} data data
|
|
25
|
+
* @param {string=} inputEncoding data encoding
|
|
26
|
+
* @returns {this} updated hash
|
|
27
|
+
*/
|
|
28
|
+
update(data, inputEncoding) {
|
|
29
|
+
if (this.string !== undefined) {
|
|
30
|
+
if (
|
|
31
|
+
typeof data === "string" &&
|
|
32
|
+
inputEncoding === this.encoding &&
|
|
33
|
+
this.string.length + data.length < MAX_SHORT_STRING
|
|
34
|
+
) {
|
|
35
|
+
this.string += data;
|
|
36
|
+
return this;
|
|
37
|
+
}
|
|
38
|
+
this.hash.update(this.string, this.encoding);
|
|
39
|
+
this.string = undefined;
|
|
40
|
+
}
|
|
41
|
+
if (typeof data === "string") {
|
|
42
|
+
if (
|
|
43
|
+
data.length < MAX_SHORT_STRING &&
|
|
44
|
+
// base64 encoding is not valid since it may contain padding chars
|
|
45
|
+
(!inputEncoding || !inputEncoding.startsWith("ba"))
|
|
46
|
+
) {
|
|
47
|
+
this.string = data;
|
|
48
|
+
this.encoding = inputEncoding;
|
|
49
|
+
} else {
|
|
50
|
+
this.hash.update(data, inputEncoding);
|
|
51
|
+
}
|
|
52
|
+
} else {
|
|
53
|
+
this.hash.update(data);
|
|
54
|
+
}
|
|
55
|
+
return this;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Calculates the digest {@link https://nodejs.org/api/crypto.html#crypto_hash_digest_encoding}
|
|
60
|
+
* @param {string=} encoding encoding of the return value
|
|
61
|
+
* @returns {string|Buffer} digest
|
|
62
|
+
*/
|
|
63
|
+
digest(encoding) {
|
|
64
|
+
if (this.string !== undefined) {
|
|
65
|
+
this.hash.update(this.string, this.encoding);
|
|
66
|
+
}
|
|
67
|
+
return this.hash.digest(encoding);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
module.exports = BatchedHash;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/*
|
|
2
|
+
MIT License http://www.opensource.org/licenses/mit-license.php
|
|
3
|
+
Author Tobias Koppers @sokra
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
// From Webpack 5
|
|
9
|
+
// https://github.com/webpack/webpack/blob/853bfda35a0080605c09e1bdeb0103bcb9367a10/lib/util/hash/md4.js
|
|
10
|
+
|
|
11
|
+
const create = require("./wasm-hash").create;
|
|
12
|
+
|
|
13
|
+
//#region wasm code: md4 (../../../assembly/hash/md4.asm.ts) --initialMemory 1
|
|
14
|
+
// This will only get called on Node 18+
|
|
15
|
+
// eslint-disable-next-line no-undef
|
|
16
|
+
const md4 = new WebAssembly.Module(
|
|
17
|
+
Buffer.from(
|
|
18
|
+
// 2154 bytes
|
|
19
|
+
"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",
|
|
20
|
+
"base64"
|
|
21
|
+
)
|
|
22
|
+
);
|
|
23
|
+
//#endregion
|
|
24
|
+
|
|
25
|
+
module.exports = create.bind(null, md4, [], 64, 32);
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/*
|
|
2
|
+
MIT License http://www.opensource.org/licenses/mit-license.php
|
|
3
|
+
Author Tobias Koppers @sokra
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
// From Webpack 5
|
|
9
|
+
// https://github.com/webpack/webpack/blob/853bfda35a0080605c09e1bdeb0103bcb9367a10/lib/util/hash/wasm-hash.js
|
|
10
|
+
|
|
11
|
+
// 65536 is the size of a wasm memory page
|
|
12
|
+
// 64 is the maximum chunk size for every possible wasm hash implementation
|
|
13
|
+
// 4 is the maximum number of bytes per char for string encoding (max is utf-8)
|
|
14
|
+
// ~3 makes sure that it's always a block of 4 chars, so avoid partially encoded bytes for base64
|
|
15
|
+
const MAX_SHORT_STRING = Math.floor((65536 - 64) / 4) & ~3;
|
|
16
|
+
|
|
17
|
+
class WasmHash {
|
|
18
|
+
/**
|
|
19
|
+
* @param {WebAssembly.Instance} instance wasm instance
|
|
20
|
+
* @param {WebAssembly.Instance[]} instancesPool pool of instances
|
|
21
|
+
* @param {number} chunkSize size of data chunks passed to wasm
|
|
22
|
+
* @param {number} digestSize size of digest returned by wasm
|
|
23
|
+
*/
|
|
24
|
+
constructor(instance, instancesPool, chunkSize, digestSize) {
|
|
25
|
+
const exports = /** @type {any} */ (instance.exports);
|
|
26
|
+
exports.init();
|
|
27
|
+
this.exports = exports;
|
|
28
|
+
this.mem = Buffer.from(exports.memory.buffer, 0, 65536);
|
|
29
|
+
this.buffered = 0;
|
|
30
|
+
this.instancesPool = instancesPool;
|
|
31
|
+
this.chunkSize = chunkSize;
|
|
32
|
+
this.digestSize = digestSize;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
reset() {
|
|
36
|
+
this.buffered = 0;
|
|
37
|
+
this.exports.init();
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* @param {Buffer | string} data data
|
|
42
|
+
* @param {BufferEncoding=} encoding encoding
|
|
43
|
+
* @returns {this} itself
|
|
44
|
+
*/
|
|
45
|
+
update(data, encoding) {
|
|
46
|
+
if (typeof data === "string") {
|
|
47
|
+
while (data.length > MAX_SHORT_STRING) {
|
|
48
|
+
this._updateWithShortString(data.slice(0, MAX_SHORT_STRING), encoding);
|
|
49
|
+
data = data.slice(MAX_SHORT_STRING);
|
|
50
|
+
}
|
|
51
|
+
this._updateWithShortString(data, encoding);
|
|
52
|
+
return this;
|
|
53
|
+
}
|
|
54
|
+
this._updateWithBuffer(data);
|
|
55
|
+
return this;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* @param {string} data data
|
|
60
|
+
* @param {BufferEncoding | 'utf-8'} encoding encoding
|
|
61
|
+
* @returns {void}
|
|
62
|
+
*/
|
|
63
|
+
_updateWithShortString(data, encoding) {
|
|
64
|
+
const { exports, buffered, mem, chunkSize } = this;
|
|
65
|
+
let endPos;
|
|
66
|
+
if (data.length < 70) {
|
|
67
|
+
if (!encoding || encoding === "utf-8" || encoding === "utf8") {
|
|
68
|
+
endPos = buffered;
|
|
69
|
+
for (let i = 0; i < data.length; i++) {
|
|
70
|
+
const cc = data.charCodeAt(i);
|
|
71
|
+
if (cc < 0x80) mem[endPos++] = cc;
|
|
72
|
+
else if (cc < 0x800) {
|
|
73
|
+
mem[endPos] = (cc >> 6) | 0xc0;
|
|
74
|
+
mem[endPos + 1] = (cc & 0x3f) | 0x80;
|
|
75
|
+
endPos += 2;
|
|
76
|
+
} else {
|
|
77
|
+
// bail-out for weird chars
|
|
78
|
+
const slicedData = data.slice(i);
|
|
79
|
+
endPos += mem.write(
|
|
80
|
+
slicedData,
|
|
81
|
+
endPos,
|
|
82
|
+
slicedData.length,
|
|
83
|
+
encoding
|
|
84
|
+
);
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
} else if (encoding === "latin1") {
|
|
89
|
+
endPos = buffered;
|
|
90
|
+
for (let i = 0; i < data.length; i++) {
|
|
91
|
+
const cc = data.charCodeAt(i);
|
|
92
|
+
mem[endPos++] = cc;
|
|
93
|
+
}
|
|
94
|
+
} else {
|
|
95
|
+
endPos = buffered + mem.write(data, buffered, data.length, encoding);
|
|
96
|
+
}
|
|
97
|
+
} else {
|
|
98
|
+
endPos = buffered + mem.write(data, buffered, data.length, encoding);
|
|
99
|
+
}
|
|
100
|
+
if (endPos < chunkSize) {
|
|
101
|
+
this.buffered = endPos;
|
|
102
|
+
} else {
|
|
103
|
+
const l = endPos & ~(this.chunkSize - 1);
|
|
104
|
+
exports.update(l);
|
|
105
|
+
const newBuffered = endPos - l;
|
|
106
|
+
this.buffered = newBuffered;
|
|
107
|
+
if (newBuffered > 0) mem.copyWithin(0, l, endPos);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* @param {Buffer} data data
|
|
113
|
+
* @returns {void}
|
|
114
|
+
*/
|
|
115
|
+
_updateWithBuffer(data) {
|
|
116
|
+
const { exports, buffered, mem } = this;
|
|
117
|
+
const length = data.length;
|
|
118
|
+
if (buffered + length < this.chunkSize) {
|
|
119
|
+
data.copy(mem, buffered, 0, length);
|
|
120
|
+
this.buffered += length;
|
|
121
|
+
} else {
|
|
122
|
+
const l = (buffered + length) & ~(this.chunkSize - 1);
|
|
123
|
+
if (l > 65536) {
|
|
124
|
+
let i = 65536 - buffered;
|
|
125
|
+
data.copy(mem, buffered, 0, i);
|
|
126
|
+
exports.update(65536);
|
|
127
|
+
const stop = l - buffered - 65536;
|
|
128
|
+
while (i < stop) {
|
|
129
|
+
data.copy(mem, 0, i, i + 65536);
|
|
130
|
+
exports.update(65536);
|
|
131
|
+
i += 65536;
|
|
132
|
+
}
|
|
133
|
+
data.copy(mem, 0, i, l - buffered);
|
|
134
|
+
exports.update(l - buffered - i);
|
|
135
|
+
} else {
|
|
136
|
+
data.copy(mem, buffered, 0, l - buffered);
|
|
137
|
+
exports.update(l);
|
|
138
|
+
}
|
|
139
|
+
const newBuffered = length + buffered - l;
|
|
140
|
+
this.buffered = newBuffered;
|
|
141
|
+
if (newBuffered > 0) data.copy(mem, 0, length - newBuffered, length);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
digest(type) {
|
|
146
|
+
const { exports, buffered, mem, digestSize } = this;
|
|
147
|
+
exports.final(buffered);
|
|
148
|
+
this.instancesPool.push(this);
|
|
149
|
+
const hex = mem.toString("latin1", 0, digestSize);
|
|
150
|
+
if (type === "hex") return hex;
|
|
151
|
+
if (type === "binary" || !type) return Buffer.from(hex, "hex");
|
|
152
|
+
return Buffer.from(hex, "hex").toString(type);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
const create = (wasmModule, instancesPool, chunkSize, digestSize) => {
|
|
157
|
+
if (instancesPool.length > 0) {
|
|
158
|
+
const old = instancesPool.pop();
|
|
159
|
+
old.reset();
|
|
160
|
+
return old;
|
|
161
|
+
} else {
|
|
162
|
+
return new WasmHash(
|
|
163
|
+
// This will only get called on Node 18+
|
|
164
|
+
// eslint-disable-next-line no-undef
|
|
165
|
+
new WebAssembly.Instance(wasmModule),
|
|
166
|
+
instancesPool,
|
|
167
|
+
chunkSize,
|
|
168
|
+
digestSize
|
|
169
|
+
);
|
|
170
|
+
}
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
module.exports.create = create;
|
|
174
|
+
module.exports.MAX_SHORT_STRING = MAX_SHORT_STRING;
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
const path = require("path");
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @param {string} context context for relative path
|
|
6
|
+
* @param {string} relativePath path
|
|
7
|
+
* @returns {string} absolute path
|
|
8
|
+
*/
|
|
9
|
+
const requestToAbsolute = (context, relativePath) => {
|
|
10
|
+
if (relativePath.startsWith("./") || relativePath.startsWith("../"))
|
|
11
|
+
return path.join(context, relativePath);
|
|
12
|
+
return relativePath;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @typedef {Object} MakeRelativePathsCache
|
|
17
|
+
* @property {Map<string, Map<string, string>>=} relativePaths
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
*
|
|
22
|
+
* @param {string} maybeAbsolutePath path to check
|
|
23
|
+
* @returns {boolean} returns true if path is "Absolute Path"-like
|
|
24
|
+
*/
|
|
25
|
+
const looksLikeAbsolutePath = maybeAbsolutePath => {
|
|
26
|
+
if (/^\/.*\/$/.test(maybeAbsolutePath)) {
|
|
27
|
+
// this 'path' is actually a regexp generated by dynamic requires.
|
|
28
|
+
// Don't treat it as an absolute path.
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
return /^(?:[a-z]:\\|\/)/i.test(maybeAbsolutePath);
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
*
|
|
36
|
+
* @param {string} p path to normalize
|
|
37
|
+
* @returns {string} normalized version of path
|
|
38
|
+
*/
|
|
39
|
+
const normalizePathSeparator = p => p.replace(/\\/g, "/");
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
*
|
|
43
|
+
* @param {string} context context for relative path
|
|
44
|
+
* @param {string} identifier identifier for path
|
|
45
|
+
* @returns {string} a converted relative path
|
|
46
|
+
*/
|
|
47
|
+
const _makePathsRelative = (context, identifier) => {
|
|
48
|
+
return identifier
|
|
49
|
+
.split(/([|! ])/)
|
|
50
|
+
.map(str =>
|
|
51
|
+
looksLikeAbsolutePath(str)
|
|
52
|
+
? normalizePathSeparator(path.relative(context, str))
|
|
53
|
+
: str
|
|
54
|
+
)
|
|
55
|
+
.join("");
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
*
|
|
60
|
+
* @param {string} context context used to create relative path
|
|
61
|
+
* @param {string} identifier identifier used to create relative path
|
|
62
|
+
* @param {MakeRelativePathsCache=} cache the cache object being set
|
|
63
|
+
* @returns {string} the returned relative path
|
|
64
|
+
*/
|
|
65
|
+
exports.makePathsRelative = (context, identifier, cache) => {
|
|
66
|
+
if (!cache) return _makePathsRelative(context, identifier);
|
|
67
|
+
|
|
68
|
+
const relativePaths =
|
|
69
|
+
cache.relativePaths || (cache.relativePaths = new Map());
|
|
70
|
+
|
|
71
|
+
let cachedResult;
|
|
72
|
+
let contextCache = relativePaths.get(context);
|
|
73
|
+
if (contextCache === undefined) {
|
|
74
|
+
relativePaths.set(context, (contextCache = new Map()));
|
|
75
|
+
} else {
|
|
76
|
+
cachedResult = contextCache.get(identifier);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
if (cachedResult !== undefined) {
|
|
80
|
+
return cachedResult;
|
|
81
|
+
} else {
|
|
82
|
+
const relativePath = _makePathsRelative(context, identifier);
|
|
83
|
+
contextCache.set(identifier, relativePath);
|
|
84
|
+
return relativePath;
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* @param {string} context absolute context path
|
|
90
|
+
* @param {string} request any request string may containing absolute paths, query string, etc.
|
|
91
|
+
* @returns {string} a new request string avoiding absolute paths when possible
|
|
92
|
+
*/
|
|
93
|
+
exports.contextify = (context, request) => {
|
|
94
|
+
return request
|
|
95
|
+
.split("!")
|
|
96
|
+
.map(r => {
|
|
97
|
+
const splitPath = r.split("?", 2);
|
|
98
|
+
if (/^[a-zA-Z]:\\/.test(splitPath[0])) {
|
|
99
|
+
splitPath[0] = path.win32.relative(context, splitPath[0]);
|
|
100
|
+
if (!/^[a-zA-Z]:\\/.test(splitPath[0])) {
|
|
101
|
+
splitPath[0] = splitPath[0].replace(/\\/g, "/");
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
if (/^\//.test(splitPath[0])) {
|
|
105
|
+
splitPath[0] = path.posix.relative(context, splitPath[0]);
|
|
106
|
+
}
|
|
107
|
+
if (!/^(\.\.\/|\/|[a-zA-Z]:\\)/.test(splitPath[0])) {
|
|
108
|
+
splitPath[0] = "./" + splitPath[0];
|
|
109
|
+
}
|
|
110
|
+
return splitPath.join("?");
|
|
111
|
+
})
|
|
112
|
+
.join("!");
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* @param {string} context absolute context path
|
|
117
|
+
* @param {string} request any request string
|
|
118
|
+
* @returns {string} a new request string using absolute paths when possible
|
|
119
|
+
*/
|
|
120
|
+
const _absolutify = (context, request) => {
|
|
121
|
+
return request
|
|
122
|
+
.split("!")
|
|
123
|
+
.map(r => requestToAbsolute(context, r))
|
|
124
|
+
.join("!");
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
exports.absolutify = _absolutify;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* convert an object into its 2D array equivalent to be turned
|
|
3
|
+
* into an ES6 map
|
|
4
|
+
*
|
|
5
|
+
* @param {object} obj any object type that works with Object.keys()
|
|
6
|
+
* @returns {Map<TODO, TODO>} an ES6 Map of KV pairs
|
|
7
|
+
*/
|
|
8
|
+
module.exports = function objectToMap(obj) {
|
|
9
|
+
return new Map(
|
|
10
|
+
Object.keys(obj).map(key => {
|
|
11
|
+
/** @type {[string, string]} */
|
|
12
|
+
const pair = [key, obj[key]];
|
|
13
|
+
return pair;
|
|
14
|
+
})
|
|
15
|
+
);
|
|
16
|
+
};
|