webpack 4.15.0 → 4.16.2
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 -20
- package/README.md +761 -758
- package/SECURITY.md +9 -9
- package/buildin/amd-define.js +3 -3
- package/buildin/amd-options.js +2 -2
- package/buildin/global.js +20 -20
- package/buildin/harmony-module.js +24 -24
- package/buildin/module.js +22 -22
- package/buildin/system.js +7 -7
- package/hot/dev-server.js +61 -61
- package/hot/emitter.js +2 -2
- package/hot/log-apply-result.js +44 -44
- package/hot/log.js +45 -45
- package/hot/only-dev-server.js +105 -105
- package/hot/poll.js +40 -37
- package/hot/signal.js +62 -62
- package/lib/APIPlugin.js +84 -84
- package/lib/AmdMainTemplatePlugin.js +87 -87
- package/lib/AsyncDependencyToInitialChunkError.js +31 -31
- package/lib/AutomaticPrefetchPlugin.js +1 -1
- package/lib/BannerPlugin.js +117 -117
- package/lib/BasicEvaluatedExpression.js +211 -211
- package/lib/CachePlugin.js +102 -102
- package/lib/CaseSensitiveModulesWarning.js +67 -67
- package/lib/Chunk.js +833 -811
- package/lib/ChunkGroup.js +4 -4
- package/lib/ChunkRenderError.js +32 -32
- package/lib/CommentCompilationWarning.js +2 -2
- package/lib/CompatibilityPlugin.js +70 -70
- package/lib/Compilation.js +46 -15
- package/lib/ConcurrentCompilationError.js +19 -19
- package/lib/ConstPlugin.js +258 -258
- package/lib/ContextExclusionPlugin.js +28 -17
- package/lib/ContextModule.js +844 -739
- package/lib/ContextModuleFactory.js +262 -256
- package/lib/ContextReplacementPlugin.js +133 -133
- package/lib/DefinePlugin.js +49 -0
- package/lib/DelegatedModule.js +5 -0
- package/lib/DelegatedModuleFactoryPlugin.js +95 -89
- package/lib/DelegatedPlugin.js +39 -39
- package/lib/DependenciesBlock.js +1 -1
- package/lib/Dependency.js +10 -4
- package/lib/DllModule.js +60 -54
- package/lib/DllModuleFactory.js +29 -29
- package/lib/DllPlugin.js +44 -44
- package/lib/DllReferencePlugin.js +132 -84
- package/lib/EntryModuleNotFoundError.js +21 -21
- package/lib/Entrypoint.js +54 -54
- package/lib/EnvironmentPlugin.js +72 -65
- package/lib/ErrorHelpers.js +60 -60
- package/lib/EvalDevToolModulePlugin.js +27 -27
- package/lib/EvalSourceMapDevToolModuleTemplatePlugin.js +115 -115
- package/lib/EvalSourceMapDevToolPlugin.js +41 -41
- package/lib/ExportPropertyMainTemplatePlugin.js +53 -53
- package/lib/ExternalModule.js +165 -159
- package/lib/ExternalsPlugin.js +23 -23
- package/lib/FlagDependencyExportsPlugin.js +146 -146
- package/lib/FlagInitialModulesAsUsedPlugin.js +36 -36
- package/lib/FunctionModuleTemplatePlugin.js +100 -100
- package/lib/Generator.js +60 -52
- package/lib/HarmonyLinkingError.js +17 -17
- package/lib/HashedModuleIdsPlugin.js +53 -53
- package/lib/HotModuleReplacementPlugin.js +411 -413
- package/lib/IgnorePlugin.js +90 -90
- package/lib/JavascriptGenerator.js +229 -229
- package/lib/JavascriptModulesPlugin.js +179 -179
- package/lib/JsonGenerator.js +55 -55
- package/lib/JsonModulesPlugin.js +30 -30
- package/lib/JsonParser.js +27 -27
- package/lib/LibManifestPlugin.js +86 -86
- package/lib/LibraryTemplatePlugin.js +153 -153
- package/lib/LoaderOptionsPlugin.js +53 -53
- package/lib/LoaderTargetPlugin.js +24 -24
- package/lib/MemoryOutputFileSystem.js +5 -5
- package/lib/Module.js +431 -391
- package/lib/ModuleBuildError.js +52 -52
- package/lib/ModuleDependencyError.js +35 -35
- package/lib/ModuleDependencyWarning.js +25 -25
- package/lib/ModuleError.js +36 -36
- package/lib/ModuleFilenameHelpers.js +178 -178
- package/lib/ModuleNotFoundError.js +23 -23
- package/lib/ModuleParseError.js +57 -57
- package/lib/ModuleTemplate.js +93 -93
- package/lib/ModuleWarning.js +36 -36
- package/lib/MultiCompiler.js +283 -283
- package/lib/MultiModule.js +87 -81
- package/lib/MultiModuleFactory.js +23 -23
- package/lib/MultiStats.js +92 -92
- package/lib/MultiWatching.js +38 -38
- package/lib/NamedChunksPlugin.js +29 -29
- package/lib/NamedModulesPlugin.js +57 -57
- package/lib/NoEmitOnErrorsPlugin.js +20 -20
- package/lib/NoModeWarning.js +23 -23
- package/lib/NodeStuffPlugin.js +197 -179
- package/lib/NormalModule.js +542 -536
- package/lib/NormalModuleFactory.js +526 -526
- package/lib/NormalModuleReplacementPlugin.js +51 -51
- package/lib/NullFactory.js +12 -12
- package/lib/OptionsApply.js +10 -10
- package/lib/OptionsDefaulter.js +84 -84
- package/lib/Parser.js +2202 -2193
- package/lib/ParserHelpers.js +103 -103
- package/lib/PrefetchPlugin.js +37 -37
- package/lib/ProgressPlugin.js +246 -246
- package/lib/ProvidePlugin.js +86 -86
- package/lib/RawModule.js +56 -56
- package/lib/RecordIdsPlugin.js +230 -230
- package/lib/RemovedPluginError.js +11 -11
- package/lib/RequestShortener.js +83 -83
- package/lib/RequireJsStuffPlugin.js +69 -69
- package/lib/ResolverFactory.js +64 -64
- package/lib/RuntimeTemplate.js +12 -0
- package/lib/SetVarMainTemplatePlugin.js +69 -69
- package/lib/SingleEntryPlugin.js +6 -1
- package/lib/SizeFormatHelpers.js +24 -24
- package/lib/SourceMapDevToolModuleOptionsPlugin.js +49 -49
- package/lib/SourceMapDevToolPlugin.js +301 -301
- package/lib/Stats.js +28 -5
- package/lib/TemplatedPathPlugin.js +173 -173
- package/lib/UnsupportedFeatureWarning.js +22 -22
- package/lib/UseStrictPlugin.js +54 -54
- package/lib/WarnCaseSensitiveModulesPlugin.js +37 -37
- package/lib/WarnNoModeSetPlugin.js +17 -17
- package/lib/WatchIgnorePlugin.js +100 -100
- package/lib/Watching.js +194 -194
- package/lib/WebpackOptionsApply.js +92 -10
- package/lib/WebpackOptionsDefaulter.js +368 -354
- package/lib/debug/ProfilingPlugin.js +430 -430
- package/lib/dependencies/AMDPlugin.js +250 -250
- package/lib/dependencies/AMDRequireArrayDependency.js +49 -49
- package/lib/dependencies/AMDRequireContextDependency.js +20 -20
- package/lib/dependencies/AMDRequireDependency.js +135 -135
- package/lib/dependencies/AMDRequireItemDependency.js +22 -22
- package/lib/dependencies/CommonJsPlugin.js +161 -161
- package/lib/dependencies/CommonJsRequireContextDependency.js +23 -23
- package/lib/dependencies/CommonJsRequireDependency.js +22 -22
- package/lib/dependencies/CommonJsRequireDependencyParserPlugin.js +6 -0
- package/lib/dependencies/ConstDependency.js +33 -33
- package/lib/dependencies/ContextDependency.js +68 -68
- package/lib/dependencies/ContextDependencyHelpers.js +142 -142
- package/lib/dependencies/ContextDependencyTemplateAsId.js +42 -42
- package/lib/dependencies/ContextDependencyTemplateAsRequireCall.js +38 -38
- package/lib/dependencies/ContextElementDependency.js +21 -21
- package/lib/dependencies/CriticalDependencyWarning.js +20 -20
- package/lib/dependencies/DelegatedSourceDependency.js +18 -18
- package/lib/dependencies/DllEntryDependency.js +20 -20
- package/lib/dependencies/HarmonyAcceptDependency.js +45 -45
- package/lib/dependencies/HarmonyCompatibilityDependency.js +31 -31
- package/lib/dependencies/HarmonyDetectionParserPlugin.js +92 -92
- package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +139 -139
- package/lib/dependencies/HarmonyExportHeaderDependency.js +30 -30
- package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +2 -1
- package/lib/dependencies/HarmonyImportDependency.js +109 -109
- package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +222 -222
- package/lib/dependencies/HarmonyImportSideEffectDependency.js +31 -31
- package/lib/dependencies/HarmonyImportSpecifierDependency.js +167 -167
- package/lib/dependencies/HarmonyInitDependency.js +60 -60
- package/lib/dependencies/HarmonyModulesPlugin.js +146 -146
- package/lib/dependencies/HarmonyTopLevelThisParserPlugin.js +26 -26
- package/lib/dependencies/ImportContextDependency.js +23 -23
- package/lib/dependencies/ImportDependenciesBlock.js +18 -18
- package/lib/dependencies/ImportDependency.js +34 -34
- package/lib/dependencies/ImportEagerDependency.js +32 -32
- package/lib/dependencies/ImportParserPlugin.js +263 -263
- package/lib/dependencies/ImportPlugin.js +82 -82
- package/lib/dependencies/ImportWeakDependency.js +34 -34
- package/lib/dependencies/LoaderPlugin.js +18 -1
- package/lib/dependencies/LocalModule.js +23 -23
- package/lib/dependencies/LocalModulesHelpers.js +52 -52
- package/lib/dependencies/ModuleDependencyTemplateAsId.js +17 -17
- package/lib/dependencies/ModuleDependencyTemplateAsRequireId.js +17 -17
- package/lib/dependencies/ModuleHotAcceptDependency.js +23 -23
- package/lib/dependencies/ModuleHotDeclineDependency.js +23 -23
- package/lib/dependencies/NullDependency.js +20 -20
- package/lib/dependencies/PrefetchDependency.js +18 -18
- package/lib/dependencies/RequireContextDependency.js +22 -22
- package/lib/dependencies/RequireContextDependencyParserPlugin.js +56 -56
- package/lib/dependencies/RequireContextPlugin.js +143 -143
- package/lib/dependencies/RequireEnsureDependenciesBlock.js +33 -33
- package/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js +116 -116
- package/lib/dependencies/RequireEnsureDependency.js +58 -58
- package/lib/dependencies/RequireEnsureItemDependency.js +21 -21
- package/lib/dependencies/RequireEnsurePlugin.js +74 -74
- package/lib/dependencies/RequireHeaderDependency.js +26 -26
- package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +23 -23
- package/lib/dependencies/RequireIncludePlugin.js +61 -61
- package/lib/dependencies/RequireResolveContextDependency.js +23 -23
- package/lib/dependencies/RequireResolveDependency.js +22 -22
- package/lib/dependencies/RequireResolveDependencyParserPlugin.js +85 -85
- package/lib/dependencies/RequireResolveHeaderDependency.js +26 -26
- package/lib/dependencies/SystemPlugin.js +125 -125
- package/lib/dependencies/UnsupportedDependency.js +27 -27
- package/lib/dependencies/WebAssemblyExportImportedDependency.js +29 -29
- package/lib/dependencies/WebAssemblyImportDependency.js +48 -48
- package/lib/dependencies/WebpackMissingModule.js +20 -20
- package/lib/formatLocation.js +75 -61
- package/lib/node/NodeChunkTemplatePlugin.js +31 -31
- package/lib/node/NodeEnvironmentPlugin.js +28 -28
- package/lib/node/NodeHotUpdateChunkTemplatePlugin.js +36 -36
- package/lib/node/NodeMainTemplate.runtime.js +27 -27
- package/lib/node/NodeMainTemplatePlugin.js +323 -323
- package/lib/node/NodeOutputFileSystem.js +22 -22
- package/lib/node/NodeSourcePlugin.js +144 -144
- package/lib/node/NodeTargetPlugin.js +18 -18
- package/lib/node/NodeTemplatePlugin.js +31 -31
- package/lib/node/NodeWatchFileSystem.js +99 -99
- package/lib/node/ReadFileCompileWasmTemplatePlugin.js +61 -61
- package/lib/optimize/AggressiveMergingPlugin.js +87 -87
- package/lib/optimize/AggressiveSplittingPlugin.js +287 -287
- package/lib/optimize/ConcatenatedModule.js +5 -0
- package/lib/optimize/EnsureChunkConditionsPlugin.js +70 -70
- package/lib/optimize/FlagIncludedChunksPlugin.js +99 -99
- package/lib/optimize/LimitChunkCountPlugin.js +66 -66
- package/lib/optimize/MergeDuplicateChunksPlugin.js +78 -78
- package/lib/optimize/MinChunkSizePlugin.js +77 -77
- package/lib/optimize/NaturalChunkOrderPlugin.js +41 -0
- package/lib/optimize/OccurrenceChunkOrderPlugin.js +61 -0
- package/lib/optimize/OccurrenceModuleOrderPlugin.js +103 -0
- package/lib/optimize/OccurrenceOrderPlugin.js +135 -133
- package/lib/optimize/RemoveEmptyChunksPlugin.js +42 -42
- package/lib/optimize/RemoveParentModulesPlugin.js +127 -127
- package/lib/optimize/RuntimeChunkPlugin.js +41 -41
- package/lib/optimize/SideEffectsFlagPlugin.js +168 -168
- package/lib/optimize/SplitChunksPlugin.js +866 -850
- package/lib/performance/AssetsOverSizeLimitWarning.js +30 -30
- package/lib/performance/EntrypointsOverSizeLimitWarning.js +30 -30
- package/lib/performance/NoAsyncChunksWarning.js +21 -21
- package/lib/performance/SizeLimitsPlugin.js +105 -105
- package/lib/util/SortableSet.js +1 -0
- package/lib/util/StackedSetMap.js +144 -135
- package/lib/util/TrackingSet.js +35 -35
- package/lib/util/cachedMerge.js +35 -35
- package/lib/util/deterministicGrouping.js +251 -251
- package/lib/util/identifier.js +103 -103
- package/lib/util/objectToMap.js +16 -16
- package/lib/validateSchema.js +67 -67
- package/lib/wasm/UnsupportedWebAssemblyFeatureError.js +17 -17
- package/lib/wasm/WasmFinalizeExportsPlugin.js +1 -1
- package/lib/wasm/WebAssemblyGenerator.js +16 -2
- package/lib/wasm/WebAssemblyJavascriptGenerator.js +147 -133
- package/lib/wasm/WebAssemblyParser.js +174 -174
- package/lib/wasm/WebAssemblyUtils.js +59 -59
- package/lib/web/FetchCompileWasmTemplatePlugin.js +37 -37
- package/lib/web/JsonpExportMainTemplatePlugin.js +47 -47
- package/lib/web/JsonpHotUpdateChunkTemplatePlugin.js +39 -39
- package/lib/web/JsonpMainTemplate.runtime.js +65 -65
- package/lib/web/JsonpMainTemplatePlugin.js +1 -1
- package/lib/web/JsonpTemplatePlugin.js +23 -23
- package/lib/web/WebEnvironmentPlugin.js +18 -18
- package/lib/webpack.js +5 -0
- package/lib/webworker/WebWorkerChunkTemplatePlugin.js +35 -35
- package/lib/webworker/WebWorkerHotUpdateChunkTemplatePlugin.js +40 -40
- package/lib/webworker/WebWorkerMainTemplate.runtime.js +65 -65
- package/lib/webworker/WebWorkerMainTemplatePlugin.js +196 -196
- package/lib/webworker/WebWorkerTemplatePlugin.js +25 -25
- package/package.json +22 -13
- package/schemas/WebpackOptions.json +2062 -2036
- package/schemas/ajv.absolutePath.js +55 -55
- package/schemas/plugins/BannerPlugin.json +96 -96
- package/schemas/plugins/DllPlugin.json +32 -32
- package/schemas/plugins/DllReferencePlugin.json +99 -99
- package/schemas/plugins/HashedModuleIdsPlugin.json +24 -24
- package/schemas/plugins/LoaderOptionsPlugin.json +26 -26
- package/schemas/plugins/SourceMapDevToolPlugin.json +187 -187
- package/schemas/plugins/WatchIgnorePlugin.json +16 -16
- package/schemas/plugins/debug/ProfilingPlugin.json +12 -12
- package/schemas/plugins/optimize/AggressiveSplittingPlugin.json +22 -22
- package/schemas/plugins/optimize/LimitChunkCountPlugin.json +15 -15
- package/schemas/plugins/optimize/MinChunkSizePlugin.json +13 -13
- package/schemas/plugins/optimize/OccurrenceOrderChunkIdsPlugin.json +10 -0
- package/schemas/plugins/optimize/OccurrenceOrderModuleIdsPlugin.json +10 -0
package/lib/RequestShortener.js
CHANGED
@@ -1,83 +1,83 @@
|
|
1
|
-
/*
|
2
|
-
MIT License http://www.opensource.org/licenses/mit-license.php
|
3
|
-
Author Tobias Koppers @sokra
|
4
|
-
*/
|
5
|
-
"use strict";
|
6
|
-
|
7
|
-
const path = require("path");
|
8
|
-
const NORMALIZE_SLASH_DIRECTION_REGEXP = /\\/g;
|
9
|
-
const PATH_CHARS_REGEXP = /[-[\]{}()*+?.,\\^$|#\s]/g;
|
10
|
-
const SEPARATOR_REGEXP = /[/\\]$/;
|
11
|
-
const FRONT_OR_BACK_BANG_REGEXP = /^!|!$/g;
|
12
|
-
const INDEX_JS_REGEXP = /\/index.js(!|\?|\(query\))/g;
|
13
|
-
const MATCH_RESOURCE_REGEXP = /!=!/;
|
14
|
-
|
15
|
-
const normalizeBackSlashDirection = request => {
|
16
|
-
return request.replace(NORMALIZE_SLASH_DIRECTION_REGEXP, "/");
|
17
|
-
};
|
18
|
-
|
19
|
-
const createRegExpForPath = path => {
|
20
|
-
const regexpTypePartial = path.replace(PATH_CHARS_REGEXP, "\\$&");
|
21
|
-
return new RegExp(`(^|!)${regexpTypePartial}`, "g");
|
22
|
-
};
|
23
|
-
|
24
|
-
class RequestShortener {
|
25
|
-
constructor(directory) {
|
26
|
-
directory = normalizeBackSlashDirection(directory);
|
27
|
-
if (SEPARATOR_REGEXP.test(directory)) {
|
28
|
-
directory = directory.substr(0, directory.length - 1);
|
29
|
-
}
|
30
|
-
|
31
|
-
if (directory) {
|
32
|
-
this.currentDirectoryRegExp = createRegExpForPath(directory);
|
33
|
-
}
|
34
|
-
|
35
|
-
const dirname = path.dirname(directory);
|
36
|
-
const endsWithSeparator = SEPARATOR_REGEXP.test(dirname);
|
37
|
-
const parentDirectory = endsWithSeparator
|
38
|
-
? dirname.substr(0, dirname.length - 1)
|
39
|
-
: dirname;
|
40
|
-
if (parentDirectory && parentDirectory !== directory) {
|
41
|
-
this.parentDirectoryRegExp = createRegExpForPath(parentDirectory);
|
42
|
-
}
|
43
|
-
|
44
|
-
if (__dirname.length >= 2) {
|
45
|
-
const buildins = normalizeBackSlashDirection(path.join(__dirname, ".."));
|
46
|
-
const buildinsAsModule =
|
47
|
-
this.currentDirectoryRegExp &&
|
48
|
-
this.currentDirectoryRegExp.test(buildins);
|
49
|
-
this.buildinsAsModule = buildinsAsModule;
|
50
|
-
this.buildinsRegExp = createRegExpForPath(buildins);
|
51
|
-
}
|
52
|
-
|
53
|
-
this.cache = new Map();
|
54
|
-
}
|
55
|
-
|
56
|
-
shorten(request) {
|
57
|
-
if (!request) return request;
|
58
|
-
const cacheEntry = this.cache.get(request);
|
59
|
-
if (cacheEntry !== undefined) {
|
60
|
-
return cacheEntry;
|
61
|
-
}
|
62
|
-
let result = normalizeBackSlashDirection(request);
|
63
|
-
if (this.buildinsAsModule && this.buildinsRegExp) {
|
64
|
-
result = result.replace(this.buildinsRegExp, "!(webpack)");
|
65
|
-
}
|
66
|
-
if (this.currentDirectoryRegExp) {
|
67
|
-
result = result.replace(this.currentDirectoryRegExp, "!.");
|
68
|
-
}
|
69
|
-
if (this.parentDirectoryRegExp) {
|
70
|
-
result = result.replace(this.parentDirectoryRegExp, "!..");
|
71
|
-
}
|
72
|
-
if (!this.buildinsAsModule && this.buildinsRegExp) {
|
73
|
-
result = result.replace(this.buildinsRegExp, "!(webpack)");
|
74
|
-
}
|
75
|
-
result = result.replace(INDEX_JS_REGEXP, "$1");
|
76
|
-
result = result.replace(FRONT_OR_BACK_BANG_REGEXP, "");
|
77
|
-
result = result.replace(MATCH_RESOURCE_REGEXP, " = ");
|
78
|
-
this.cache.set(request, result);
|
79
|
-
return result;
|
80
|
-
}
|
81
|
-
}
|
82
|
-
|
83
|
-
module.exports = RequestShortener;
|
1
|
+
/*
|
2
|
+
MIT License http://www.opensource.org/licenses/mit-license.php
|
3
|
+
Author Tobias Koppers @sokra
|
4
|
+
*/
|
5
|
+
"use strict";
|
6
|
+
|
7
|
+
const path = require("path");
|
8
|
+
const NORMALIZE_SLASH_DIRECTION_REGEXP = /\\/g;
|
9
|
+
const PATH_CHARS_REGEXP = /[-[\]{}()*+?.,\\^$|#\s]/g;
|
10
|
+
const SEPARATOR_REGEXP = /[/\\]$/;
|
11
|
+
const FRONT_OR_BACK_BANG_REGEXP = /^!|!$/g;
|
12
|
+
const INDEX_JS_REGEXP = /\/index.js(!|\?|\(query\))/g;
|
13
|
+
const MATCH_RESOURCE_REGEXP = /!=!/;
|
14
|
+
|
15
|
+
const normalizeBackSlashDirection = request => {
|
16
|
+
return request.replace(NORMALIZE_SLASH_DIRECTION_REGEXP, "/");
|
17
|
+
};
|
18
|
+
|
19
|
+
const createRegExpForPath = path => {
|
20
|
+
const regexpTypePartial = path.replace(PATH_CHARS_REGEXP, "\\$&");
|
21
|
+
return new RegExp(`(^|!)${regexpTypePartial}`, "g");
|
22
|
+
};
|
23
|
+
|
24
|
+
class RequestShortener {
|
25
|
+
constructor(directory) {
|
26
|
+
directory = normalizeBackSlashDirection(directory);
|
27
|
+
if (SEPARATOR_REGEXP.test(directory)) {
|
28
|
+
directory = directory.substr(0, directory.length - 1);
|
29
|
+
}
|
30
|
+
|
31
|
+
if (directory) {
|
32
|
+
this.currentDirectoryRegExp = createRegExpForPath(directory);
|
33
|
+
}
|
34
|
+
|
35
|
+
const dirname = path.dirname(directory);
|
36
|
+
const endsWithSeparator = SEPARATOR_REGEXP.test(dirname);
|
37
|
+
const parentDirectory = endsWithSeparator
|
38
|
+
? dirname.substr(0, dirname.length - 1)
|
39
|
+
: dirname;
|
40
|
+
if (parentDirectory && parentDirectory !== directory) {
|
41
|
+
this.parentDirectoryRegExp = createRegExpForPath(parentDirectory);
|
42
|
+
}
|
43
|
+
|
44
|
+
if (__dirname.length >= 2) {
|
45
|
+
const buildins = normalizeBackSlashDirection(path.join(__dirname, ".."));
|
46
|
+
const buildinsAsModule =
|
47
|
+
this.currentDirectoryRegExp &&
|
48
|
+
this.currentDirectoryRegExp.test(buildins);
|
49
|
+
this.buildinsAsModule = buildinsAsModule;
|
50
|
+
this.buildinsRegExp = createRegExpForPath(buildins);
|
51
|
+
}
|
52
|
+
|
53
|
+
this.cache = new Map();
|
54
|
+
}
|
55
|
+
|
56
|
+
shorten(request) {
|
57
|
+
if (!request) return request;
|
58
|
+
const cacheEntry = this.cache.get(request);
|
59
|
+
if (cacheEntry !== undefined) {
|
60
|
+
return cacheEntry;
|
61
|
+
}
|
62
|
+
let result = normalizeBackSlashDirection(request);
|
63
|
+
if (this.buildinsAsModule && this.buildinsRegExp) {
|
64
|
+
result = result.replace(this.buildinsRegExp, "!(webpack)");
|
65
|
+
}
|
66
|
+
if (this.currentDirectoryRegExp) {
|
67
|
+
result = result.replace(this.currentDirectoryRegExp, "!.");
|
68
|
+
}
|
69
|
+
if (this.parentDirectoryRegExp) {
|
70
|
+
result = result.replace(this.parentDirectoryRegExp, "!..");
|
71
|
+
}
|
72
|
+
if (!this.buildinsAsModule && this.buildinsRegExp) {
|
73
|
+
result = result.replace(this.buildinsRegExp, "!(webpack)");
|
74
|
+
}
|
75
|
+
result = result.replace(INDEX_JS_REGEXP, "$1");
|
76
|
+
result = result.replace(FRONT_OR_BACK_BANG_REGEXP, "");
|
77
|
+
result = result.replace(MATCH_RESOURCE_REGEXP, " = ");
|
78
|
+
this.cache.set(request, result);
|
79
|
+
return result;
|
80
|
+
}
|
81
|
+
}
|
82
|
+
|
83
|
+
module.exports = RequestShortener;
|
@@ -1,69 +1,69 @@
|
|
1
|
-
/*
|
2
|
-
MIT License http://www.opensource.org/licenses/mit-license.php
|
3
|
-
Author Tobias Koppers @sokra
|
4
|
-
*/
|
5
|
-
"use strict";
|
6
|
-
|
7
|
-
const ParserHelpers = require("./ParserHelpers");
|
8
|
-
const ConstDependency = require("./dependencies/ConstDependency");
|
9
|
-
const NullFactory = require("./NullFactory");
|
10
|
-
|
11
|
-
module.exports = class RequireJsStuffPlugin {
|
12
|
-
apply(compiler) {
|
13
|
-
compiler.hooks.compilation.tap(
|
14
|
-
"RequireJsStuffPlugin",
|
15
|
-
(compilation, { normalModuleFactory }) => {
|
16
|
-
compilation.dependencyFactories.set(ConstDependency, new NullFactory());
|
17
|
-
compilation.dependencyTemplates.set(
|
18
|
-
ConstDependency,
|
19
|
-
new ConstDependency.Template()
|
20
|
-
);
|
21
|
-
const handler = (parser, parserOptions) => {
|
22
|
-
if (
|
23
|
-
typeof parserOptions.requireJs !== "undefined" &&
|
24
|
-
!parserOptions.requireJs
|
25
|
-
)
|
26
|
-
return;
|
27
|
-
|
28
|
-
parser.hooks.call
|
29
|
-
.for("require.config")
|
30
|
-
.tap(
|
31
|
-
"RequireJsStuffPlugin",
|
32
|
-
ParserHelpers.toConstantDependency(parser, "undefined")
|
33
|
-
);
|
34
|
-
parser.hooks.call
|
35
|
-
.for("requirejs.config")
|
36
|
-
.tap(
|
37
|
-
"RequireJsStuffPlugin",
|
38
|
-
ParserHelpers.toConstantDependency(parser, "undefined")
|
39
|
-
);
|
40
|
-
|
41
|
-
parser.hooks.expression
|
42
|
-
.for("require.version")
|
43
|
-
.tap(
|
44
|
-
"RequireJsStuffPlugin",
|
45
|
-
ParserHelpers.toConstantDependency(
|
46
|
-
parser,
|
47
|
-
JSON.stringify("0.0.0")
|
48
|
-
)
|
49
|
-
);
|
50
|
-
parser.hooks.expression
|
51
|
-
.for("requirejs.onError")
|
52
|
-
.tap(
|
53
|
-
"RequireJsStuffPlugin",
|
54
|
-
ParserHelpers.toConstantDependencyWithWebpackRequire(
|
55
|
-
parser,
|
56
|
-
"__webpack_require__.oe"
|
57
|
-
)
|
58
|
-
);
|
59
|
-
};
|
60
|
-
normalModuleFactory.hooks.parser
|
61
|
-
.for("javascript/auto")
|
62
|
-
.tap("RequireJsStuffPlugin", handler);
|
63
|
-
normalModuleFactory.hooks.parser
|
64
|
-
.for("javascript/dynamic")
|
65
|
-
.tap("RequireJsStuffPlugin", handler);
|
66
|
-
}
|
67
|
-
);
|
68
|
-
}
|
69
|
-
};
|
1
|
+
/*
|
2
|
+
MIT License http://www.opensource.org/licenses/mit-license.php
|
3
|
+
Author Tobias Koppers @sokra
|
4
|
+
*/
|
5
|
+
"use strict";
|
6
|
+
|
7
|
+
const ParserHelpers = require("./ParserHelpers");
|
8
|
+
const ConstDependency = require("./dependencies/ConstDependency");
|
9
|
+
const NullFactory = require("./NullFactory");
|
10
|
+
|
11
|
+
module.exports = class RequireJsStuffPlugin {
|
12
|
+
apply(compiler) {
|
13
|
+
compiler.hooks.compilation.tap(
|
14
|
+
"RequireJsStuffPlugin",
|
15
|
+
(compilation, { normalModuleFactory }) => {
|
16
|
+
compilation.dependencyFactories.set(ConstDependency, new NullFactory());
|
17
|
+
compilation.dependencyTemplates.set(
|
18
|
+
ConstDependency,
|
19
|
+
new ConstDependency.Template()
|
20
|
+
);
|
21
|
+
const handler = (parser, parserOptions) => {
|
22
|
+
if (
|
23
|
+
typeof parserOptions.requireJs !== "undefined" &&
|
24
|
+
!parserOptions.requireJs
|
25
|
+
)
|
26
|
+
return;
|
27
|
+
|
28
|
+
parser.hooks.call
|
29
|
+
.for("require.config")
|
30
|
+
.tap(
|
31
|
+
"RequireJsStuffPlugin",
|
32
|
+
ParserHelpers.toConstantDependency(parser, "undefined")
|
33
|
+
);
|
34
|
+
parser.hooks.call
|
35
|
+
.for("requirejs.config")
|
36
|
+
.tap(
|
37
|
+
"RequireJsStuffPlugin",
|
38
|
+
ParserHelpers.toConstantDependency(parser, "undefined")
|
39
|
+
);
|
40
|
+
|
41
|
+
parser.hooks.expression
|
42
|
+
.for("require.version")
|
43
|
+
.tap(
|
44
|
+
"RequireJsStuffPlugin",
|
45
|
+
ParserHelpers.toConstantDependency(
|
46
|
+
parser,
|
47
|
+
JSON.stringify("0.0.0")
|
48
|
+
)
|
49
|
+
);
|
50
|
+
parser.hooks.expression
|
51
|
+
.for("requirejs.onError")
|
52
|
+
.tap(
|
53
|
+
"RequireJsStuffPlugin",
|
54
|
+
ParserHelpers.toConstantDependencyWithWebpackRequire(
|
55
|
+
parser,
|
56
|
+
"__webpack_require__.oe"
|
57
|
+
)
|
58
|
+
);
|
59
|
+
};
|
60
|
+
normalModuleFactory.hooks.parser
|
61
|
+
.for("javascript/auto")
|
62
|
+
.tap("RequireJsStuffPlugin", handler);
|
63
|
+
normalModuleFactory.hooks.parser
|
64
|
+
.for("javascript/dynamic")
|
65
|
+
.tap("RequireJsStuffPlugin", handler);
|
66
|
+
}
|
67
|
+
);
|
68
|
+
}
|
69
|
+
};
|
package/lib/ResolverFactory.js
CHANGED
@@ -1,64 +1,64 @@
|
|
1
|
-
/*
|
2
|
-
MIT License http://www.opensource.org/licenses/mit-license.php
|
3
|
-
Author Tobias Koppers @sokra
|
4
|
-
*/
|
5
|
-
"use strict";
|
6
|
-
|
7
|
-
const { Tapable, HookMap, SyncHook, SyncWaterfallHook } = require("tapable");
|
8
|
-
const Factory = require("enhanced-resolve").ResolverFactory;
|
9
|
-
|
10
|
-
module.exports = class ResolverFactory extends Tapable {
|
11
|
-
constructor() {
|
12
|
-
super();
|
13
|
-
this.hooks = {
|
14
|
-
resolveOptions: new HookMap(
|
15
|
-
() => new SyncWaterfallHook(["resolveOptions"])
|
16
|
-
),
|
17
|
-
resolver: new HookMap(() => new SyncHook(["resolver", "resolveOptions"]))
|
18
|
-
};
|
19
|
-
this._pluginCompat.tap("ResolverFactory", options => {
|
20
|
-
let match;
|
21
|
-
match = /^resolve-options (.+)$/.exec(options.name);
|
22
|
-
if (match) {
|
23
|
-
this.hooks.resolveOptions.tap(
|
24
|
-
match[1],
|
25
|
-
options.fn.name || "unnamed compat plugin",
|
26
|
-
options.fn
|
27
|
-
);
|
28
|
-
return true;
|
29
|
-
}
|
30
|
-
match = /^resolver (.+)$/.exec(options.name);
|
31
|
-
if (match) {
|
32
|
-
this.hooks.resolver.tap(
|
33
|
-
match[1],
|
34
|
-
options.fn.name || "unnamed compat plugin",
|
35
|
-
options.fn
|
36
|
-
);
|
37
|
-
return true;
|
38
|
-
}
|
39
|
-
});
|
40
|
-
this.cache1 = new WeakMap();
|
41
|
-
this.cache2 = new Map();
|
42
|
-
}
|
43
|
-
|
44
|
-
get(type, resolveOptions) {
|
45
|
-
const cachedResolver = this.cache1.get(resolveOptions);
|
46
|
-
if (cachedResolver) return cachedResolver();
|
47
|
-
const ident = `${type}|${JSON.stringify(resolveOptions)}`;
|
48
|
-
const resolver = this.cache2.get(ident);
|
49
|
-
if (resolver) return resolver;
|
50
|
-
const newResolver = this._create(type, resolveOptions);
|
51
|
-
this.cache2.set(ident, newResolver);
|
52
|
-
return newResolver;
|
53
|
-
}
|
54
|
-
|
55
|
-
_create(type, resolveOptions) {
|
56
|
-
resolveOptions = this.hooks.resolveOptions.for(type).call(resolveOptions);
|
57
|
-
const resolver = Factory.createResolver(resolveOptions);
|
58
|
-
if (!resolver) {
|
59
|
-
throw new Error("No resolver created");
|
60
|
-
}
|
61
|
-
this.hooks.resolver.for(type).call(resolver, resolveOptions);
|
62
|
-
return resolver;
|
63
|
-
}
|
64
|
-
};
|
1
|
+
/*
|
2
|
+
MIT License http://www.opensource.org/licenses/mit-license.php
|
3
|
+
Author Tobias Koppers @sokra
|
4
|
+
*/
|
5
|
+
"use strict";
|
6
|
+
|
7
|
+
const { Tapable, HookMap, SyncHook, SyncWaterfallHook } = require("tapable");
|
8
|
+
const Factory = require("enhanced-resolve").ResolverFactory;
|
9
|
+
|
10
|
+
module.exports = class ResolverFactory extends Tapable {
|
11
|
+
constructor() {
|
12
|
+
super();
|
13
|
+
this.hooks = {
|
14
|
+
resolveOptions: new HookMap(
|
15
|
+
() => new SyncWaterfallHook(["resolveOptions"])
|
16
|
+
),
|
17
|
+
resolver: new HookMap(() => new SyncHook(["resolver", "resolveOptions"]))
|
18
|
+
};
|
19
|
+
this._pluginCompat.tap("ResolverFactory", options => {
|
20
|
+
let match;
|
21
|
+
match = /^resolve-options (.+)$/.exec(options.name);
|
22
|
+
if (match) {
|
23
|
+
this.hooks.resolveOptions.tap(
|
24
|
+
match[1],
|
25
|
+
options.fn.name || "unnamed compat plugin",
|
26
|
+
options.fn
|
27
|
+
);
|
28
|
+
return true;
|
29
|
+
}
|
30
|
+
match = /^resolver (.+)$/.exec(options.name);
|
31
|
+
if (match) {
|
32
|
+
this.hooks.resolver.tap(
|
33
|
+
match[1],
|
34
|
+
options.fn.name || "unnamed compat plugin",
|
35
|
+
options.fn
|
36
|
+
);
|
37
|
+
return true;
|
38
|
+
}
|
39
|
+
});
|
40
|
+
this.cache1 = new WeakMap();
|
41
|
+
this.cache2 = new Map();
|
42
|
+
}
|
43
|
+
|
44
|
+
get(type, resolveOptions) {
|
45
|
+
const cachedResolver = this.cache1.get(resolveOptions);
|
46
|
+
if (cachedResolver) return cachedResolver();
|
47
|
+
const ident = `${type}|${JSON.stringify(resolveOptions)}`;
|
48
|
+
const resolver = this.cache2.get(ident);
|
49
|
+
if (resolver) return resolver;
|
50
|
+
const newResolver = this._create(type, resolveOptions);
|
51
|
+
this.cache2.set(ident, newResolver);
|
52
|
+
return newResolver;
|
53
|
+
}
|
54
|
+
|
55
|
+
_create(type, resolveOptions) {
|
56
|
+
resolveOptions = this.hooks.resolveOptions.for(type).call(resolveOptions);
|
57
|
+
const resolver = Factory.createResolver(resolveOptions);
|
58
|
+
if (!resolver) {
|
59
|
+
throw new Error("No resolver created");
|
60
|
+
}
|
61
|
+
this.hooks.resolver.for(type).call(resolver, resolveOptions);
|
62
|
+
return resolver;
|
63
|
+
}
|
64
|
+
};
|
package/lib/RuntimeTemplate.js
CHANGED
@@ -6,6 +6,8 @@
|
|
6
6
|
|
7
7
|
const Template = require("./Template");
|
8
8
|
|
9
|
+
/** @typedef {import("./Module")} Module */
|
10
|
+
|
9
11
|
module.exports = class RuntimeTemplate {
|
10
12
|
constructor(outputOptions, requestShortener) {
|
11
13
|
this.outputOptions = outputOptions || {};
|
@@ -188,6 +190,16 @@ module.exports = class RuntimeTemplate {
|
|
188
190
|
return `${promise || "Promise.resolve()"}.then(${getModuleFunction})`;
|
189
191
|
}
|
190
192
|
|
193
|
+
/**
|
194
|
+
*
|
195
|
+
* @param {Object} options options object
|
196
|
+
* @param {boolean=} options.update whether a new variable should be created or the existing one updated
|
197
|
+
* @param {Module} options.module the module
|
198
|
+
* @param {string} options.request the request that should be printed as comment
|
199
|
+
* @param {string} options.importVar name of the import variable
|
200
|
+
* @param {Module} options.originModule module in which the statement is emitted
|
201
|
+
* @returns {string} the import statement
|
202
|
+
*/
|
191
203
|
importStatement({ update, module, request, importVar, originModule }) {
|
192
204
|
if (!module) {
|
193
205
|
return this.missingModuleStatement({
|
@@ -1,69 +1,69 @@
|
|
1
|
-
/*
|
2
|
-
MIT License http://www.opensource.org/licenses/mit-license.php
|
3
|
-
Author Tobias Koppers @sokra
|
4
|
-
*/
|
5
|
-
"use strict";
|
6
|
-
|
7
|
-
const { ConcatSource } = require("webpack-sources");
|
8
|
-
|
9
|
-
/** @typedef {import("./Compilation")} Compilation */
|
10
|
-
|
11
|
-
class SetVarMainTemplatePlugin {
|
12
|
-
/**
|
13
|
-
* @param {string} varExpression the accessor where the library is exported
|
14
|
-
* @param {boolean} copyObject specify copying the exports
|
15
|
-
*/
|
16
|
-
constructor(varExpression, copyObject) {
|
17
|
-
/** @type {string} */
|
18
|
-
this.varExpression = varExpression;
|
19
|
-
/** @type {boolean} */
|
20
|
-
this.copyObject = copyObject;
|
21
|
-
}
|
22
|
-
|
23
|
-
/**
|
24
|
-
* @param {Compilation} compilation the compilation instance
|
25
|
-
* @returns {void}
|
26
|
-
*/
|
27
|
-
apply(compilation) {
|
28
|
-
const { mainTemplate, chunkTemplate } = compilation;
|
29
|
-
|
30
|
-
const onRenderWithEntry = (source, chunk, hash) => {
|
31
|
-
const varExpression = mainTemplate.getAssetPath(this.varExpression, {
|
32
|
-
hash,
|
33
|
-
chunk
|
34
|
-
});
|
35
|
-
if (this.copyObject) {
|
36
|
-
return new ConcatSource(
|
37
|
-
`(function(e, a) { for(var i in a) e[i] = a[i]; }(${varExpression}, `,
|
38
|
-
source,
|
39
|
-
"))"
|
40
|
-
);
|
41
|
-
} else {
|
42
|
-
const prefix = `${varExpression} =\n`;
|
43
|
-
return new ConcatSource(prefix, source);
|
44
|
-
}
|
45
|
-
};
|
46
|
-
|
47
|
-
for (const template of [mainTemplate, chunkTemplate]) {
|
48
|
-
template.hooks.renderWithEntry.tap(
|
49
|
-
"SetVarMainTemplatePlugin",
|
50
|
-
onRenderWithEntry
|
51
|
-
);
|
52
|
-
}
|
53
|
-
|
54
|
-
mainTemplate.hooks.globalHashPaths.tap(
|
55
|
-
"SetVarMainTemplatePlugin",
|
56
|
-
paths => {
|
57
|
-
if (this.varExpression) paths.push(this.varExpression);
|
58
|
-
return paths;
|
59
|
-
}
|
60
|
-
);
|
61
|
-
mainTemplate.hooks.hash.tap("SetVarMainTemplatePlugin", hash => {
|
62
|
-
hash.update("set var");
|
63
|
-
hash.update(`${this.varExpression}`);
|
64
|
-
hash.update(`${this.copyObject}`);
|
65
|
-
});
|
66
|
-
}
|
67
|
-
}
|
68
|
-
|
69
|
-
module.exports = SetVarMainTemplatePlugin;
|
1
|
+
/*
|
2
|
+
MIT License http://www.opensource.org/licenses/mit-license.php
|
3
|
+
Author Tobias Koppers @sokra
|
4
|
+
*/
|
5
|
+
"use strict";
|
6
|
+
|
7
|
+
const { ConcatSource } = require("webpack-sources");
|
8
|
+
|
9
|
+
/** @typedef {import("./Compilation")} Compilation */
|
10
|
+
|
11
|
+
class SetVarMainTemplatePlugin {
|
12
|
+
/**
|
13
|
+
* @param {string} varExpression the accessor where the library is exported
|
14
|
+
* @param {boolean} copyObject specify copying the exports
|
15
|
+
*/
|
16
|
+
constructor(varExpression, copyObject) {
|
17
|
+
/** @type {string} */
|
18
|
+
this.varExpression = varExpression;
|
19
|
+
/** @type {boolean} */
|
20
|
+
this.copyObject = copyObject;
|
21
|
+
}
|
22
|
+
|
23
|
+
/**
|
24
|
+
* @param {Compilation} compilation the compilation instance
|
25
|
+
* @returns {void}
|
26
|
+
*/
|
27
|
+
apply(compilation) {
|
28
|
+
const { mainTemplate, chunkTemplate } = compilation;
|
29
|
+
|
30
|
+
const onRenderWithEntry = (source, chunk, hash) => {
|
31
|
+
const varExpression = mainTemplate.getAssetPath(this.varExpression, {
|
32
|
+
hash,
|
33
|
+
chunk
|
34
|
+
});
|
35
|
+
if (this.copyObject) {
|
36
|
+
return new ConcatSource(
|
37
|
+
`(function(e, a) { for(var i in a) e[i] = a[i]; }(${varExpression}, `,
|
38
|
+
source,
|
39
|
+
"))"
|
40
|
+
);
|
41
|
+
} else {
|
42
|
+
const prefix = `${varExpression} =\n`;
|
43
|
+
return new ConcatSource(prefix, source);
|
44
|
+
}
|
45
|
+
};
|
46
|
+
|
47
|
+
for (const template of [mainTemplate, chunkTemplate]) {
|
48
|
+
template.hooks.renderWithEntry.tap(
|
49
|
+
"SetVarMainTemplatePlugin",
|
50
|
+
onRenderWithEntry
|
51
|
+
);
|
52
|
+
}
|
53
|
+
|
54
|
+
mainTemplate.hooks.globalHashPaths.tap(
|
55
|
+
"SetVarMainTemplatePlugin",
|
56
|
+
paths => {
|
57
|
+
if (this.varExpression) paths.push(this.varExpression);
|
58
|
+
return paths;
|
59
|
+
}
|
60
|
+
);
|
61
|
+
mainTemplate.hooks.hash.tap("SetVarMainTemplatePlugin", hash => {
|
62
|
+
hash.update("set var");
|
63
|
+
hash.update(`${this.varExpression}`);
|
64
|
+
hash.update(`${this.copyObject}`);
|
65
|
+
});
|
66
|
+
}
|
67
|
+
}
|
68
|
+
|
69
|
+
module.exports = SetVarMainTemplatePlugin;
|
package/lib/SingleEntryPlugin.js
CHANGED
@@ -48,9 +48,14 @@ class SingleEntryPlugin {
|
|
48
48
|
);
|
49
49
|
}
|
50
50
|
|
51
|
+
/**
|
52
|
+
* @param {string} entry entry request
|
53
|
+
* @param {string} name entry name
|
54
|
+
* @returns {SingleEntryDependency} the dependency
|
55
|
+
*/
|
51
56
|
static createDependency(entry, name) {
|
52
57
|
const dep = new SingleEntryDependency(entry);
|
53
|
-
dep.loc = name;
|
58
|
+
dep.loc = { name };
|
54
59
|
return dep;
|
55
60
|
}
|
56
61
|
}
|
package/lib/SizeFormatHelpers.js
CHANGED
@@ -1,24 +1,24 @@
|
|
1
|
-
/*
|
2
|
-
MIT License http://www.opensource.org/licenses/mit-license.php
|
3
|
-
Author Sean Larkin @thelarkinn
|
4
|
-
*/
|
5
|
-
"use strict";
|
6
|
-
|
7
|
-
const SizeFormatHelpers = exports;
|
8
|
-
|
9
|
-
SizeFormatHelpers.formatSize = size => {
|
10
|
-
if (typeof size !== "number" || Number.isNaN(size) === true) {
|
11
|
-
return "unknown size";
|
12
|
-
}
|
13
|
-
|
14
|
-
if (size <= 0) {
|
15
|
-
return "0 bytes";
|
16
|
-
}
|
17
|
-
|
18
|
-
const abbreviations = ["bytes", "KiB", "MiB", "GiB"];
|
19
|
-
const index = Math.floor(Math.log(size) / Math.log(1024));
|
20
|
-
|
21
|
-
return `${+(size / Math.pow(1024, index)).toPrecision(3)} ${
|
22
|
-
abbreviations[index]
|
23
|
-
}`;
|
24
|
-
};
|
1
|
+
/*
|
2
|
+
MIT License http://www.opensource.org/licenses/mit-license.php
|
3
|
+
Author Sean Larkin @thelarkinn
|
4
|
+
*/
|
5
|
+
"use strict";
|
6
|
+
|
7
|
+
const SizeFormatHelpers = exports;
|
8
|
+
|
9
|
+
SizeFormatHelpers.formatSize = size => {
|
10
|
+
if (typeof size !== "number" || Number.isNaN(size) === true) {
|
11
|
+
return "unknown size";
|
12
|
+
}
|
13
|
+
|
14
|
+
if (size <= 0) {
|
15
|
+
return "0 bytes";
|
16
|
+
}
|
17
|
+
|
18
|
+
const abbreviations = ["bytes", "KiB", "MiB", "GiB"];
|
19
|
+
const index = Math.floor(Math.log(size) / Math.log(1024));
|
20
|
+
|
21
|
+
return `${+(size / Math.pow(1024, index)).toPrecision(3)} ${
|
22
|
+
abbreviations[index]
|
23
|
+
}`;
|
24
|
+
};
|