@rsdoctor/utils 1.1.10 → 1.2.0-beta.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.
- package/dist/cjs/build/envinfo.js +107 -95
- package/dist/cjs/build/file/cache.js +65 -56
- package/dist/cjs/build/file/index.js +78 -41
- package/dist/cjs/build/file/sharding.js +90 -78
- package/dist/cjs/build/index.js +49 -47
- package/dist/cjs/build/json.js +91 -98
- package/dist/cjs/build/process.js +47 -42
- package/dist/cjs/build/server.js +110 -87
- package/dist/cjs/common/alerts.js +46 -44
- package/dist/cjs/common/algorithm.js +63 -54
- package/dist/cjs/common/bundle.js +52 -46
- package/dist/cjs/common/crypto.js +47 -46
- package/dist/cjs/common/data/index.js +381 -455
- package/dist/cjs/common/file.js +44 -0
- package/dist/cjs/common/global-config.js +72 -64
- package/dist/cjs/common/graph/assets.js +274 -308
- package/dist/cjs/common/graph/chunk.js +66 -63
- package/dist/cjs/common/graph/dependency.js +42 -32
- package/dist/cjs/common/graph/entrypoints.js +33 -25
- package/dist/cjs/common/graph/index.js +93 -27
- package/dist/cjs/common/graph/modules.js +113 -98
- package/dist/cjs/common/index.js +101 -83
- package/dist/cjs/common/loader.js +277 -273
- package/dist/cjs/common/lodash.js +73 -62
- package/dist/cjs/common/manifest.js +57 -59
- package/dist/cjs/common/package.js +79 -80
- package/dist/cjs/common/plugin.js +78 -73
- package/dist/cjs/common/resolver.js +79 -69
- package/dist/cjs/common/rspack.js +43 -34
- package/dist/cjs/common/summary.js +39 -31
- package/dist/cjs/common/time.js +73 -78
- package/dist/cjs/common/url.js +44 -36
- package/dist/cjs/error/error.js +183 -220
- package/dist/cjs/error/index.js +70 -28
- package/dist/cjs/error/transform.js +150 -143
- package/dist/cjs/error/utils.js +54 -58
- package/dist/cjs/index.js +37 -38
- package/dist/cjs/logger.js +99 -73
- package/dist/cjs/rule-utils/document/document.js +83 -82
- package/dist/cjs/rule-utils/document/index.js +75 -23
- package/dist/cjs/rule-utils/document/server.js +42 -35
- package/dist/cjs/rule-utils/document/types.js +17 -15
- package/dist/cjs/rule-utils/index.js +66 -21
- package/dist/cjs/rule-utils/parser/asserts.js +129 -147
- package/dist/cjs/rule-utils/parser/index.js +84 -25
- package/dist/cjs/rule-utils/parser/parser.js +50 -85
- package/dist/cjs/rule-utils/parser/types.js +38 -30
- package/dist/cjs/rule-utils/parser/utils.js +141 -168
- package/dist/esm/build/envinfo.mjs +57 -0
- package/dist/esm/build/file/cache.mjs +23 -0
- package/dist/esm/build/file/index.mjs +4 -0
- package/dist/esm/build/file/sharding.mjs +50 -0
- package/dist/esm/build/index.mjs +6 -0
- package/dist/esm/build/json.mjs +66 -0
- package/dist/esm/build/process.mjs +17 -0
- package/dist/esm/build/server.mjs +96 -0
- package/dist/esm/common/alerts.mjs +17 -0
- package/dist/esm/common/algorithm.mjs +32 -0
- package/dist/esm/common/bundle.mjs +22 -0
- package/dist/esm/common/crypto.mjs +17 -0
- package/dist/esm/common/data/index.mjs +354 -0
- package/dist/esm/common/file.mjs +7 -0
- package/dist/esm/common/global-config.mjs +32 -0
- package/dist/esm/common/graph/assets.mjs +238 -0
- package/dist/esm/common/graph/chunk.mjs +32 -0
- package/dist/esm/common/graph/dependency.mjs +10 -0
- package/dist/esm/common/graph/entrypoints.mjs +4 -0
- package/dist/esm/common/graph/index.mjs +5 -0
- package/dist/esm/common/graph/modules.mjs +78 -0
- package/dist/esm/common/index.mjs +19 -0
- package/dist/esm/common/loader.mjs +247 -0
- package/dist/esm/common/lodash.mjs +32 -0
- package/dist/esm/common/manifest.mjs +30 -0
- package/dist/esm/common/package.mjs +56 -0
- package/dist/esm/common/plugin.mjs +48 -0
- package/dist/esm/common/resolver.mjs +46 -0
- package/dist/esm/common/rspack.mjs +9 -0
- package/dist/esm/common/summary.mjs +8 -0
- package/dist/esm/common/time.mjs +43 -0
- package/dist/esm/common/url.mjs +14 -0
- package/dist/esm/error/error.mjs +154 -0
- package/dist/esm/error/index.mjs +3 -0
- package/dist/esm/error/transform.mjs +138 -0
- package/dist/esm/error/utils.mjs +22 -0
- package/dist/esm/index.mjs +3 -0
- package/dist/esm/logger.mjs +50 -0
- package/dist/esm/rule-utils/document/document.mjs +58 -0
- package/dist/esm/rule-utils/document/index.mjs +3 -0
- package/dist/esm/rule-utils/document/server.mjs +12 -0
- package/dist/esm/rule-utils/index.mjs +2 -0
- package/dist/esm/rule-utils/parser/asserts.mjs +104 -0
- package/dist/esm/rule-utils/parser/index.mjs +4 -0
- package/dist/esm/rule-utils/parser/parser.mjs +23 -0
- package/dist/esm/rule-utils/parser/types.mjs +7 -0
- package/dist/esm/rule-utils/parser/utils.mjs +109 -0
- package/dist/type/common/file.d.ts +3 -0
- package/dist/type/common/file.d.ts.map +1 -0
- package/dist/type/common/graph/modules.d.ts +1 -1
- package/dist/type/common/graph/modules.d.ts.map +1 -1
- package/dist/type/common/index.d.ts +1 -0
- package/dist/type/common/index.d.ts.map +1 -1
- package/dist/type/logger.d.ts +3 -1
- package/dist/type/logger.d.ts.map +1 -1
- package/package.json +13 -12
- package/dist/esm/build/envinfo.js +0 -75
- package/dist/esm/build/file/cache.js +0 -30
- package/dist/esm/build/file/index.js +0 -7
- package/dist/esm/build/file/sharding.js +0 -50
- package/dist/esm/build/index.js +0 -12
- package/dist/esm/build/json.js +0 -85
- package/dist/esm/build/process.js +0 -24
- package/dist/esm/build/server.js +0 -96
- package/dist/esm/common/alerts.js +0 -25
- package/dist/esm/common/algorithm.js +0 -39
- package/dist/esm/common/bundle.js +0 -30
- package/dist/esm/common/crypto.js +0 -28
- package/dist/esm/common/data/index.js +0 -428
- package/dist/esm/common/global-config.js +0 -38
- package/dist/esm/common/graph/assets.js +0 -310
- package/dist/esm/common/graph/chunk.js +0 -49
- package/dist/esm/common/graph/dependency.js +0 -14
- package/dist/esm/common/graph/entrypoints.js +0 -6
- package/dist/esm/common/graph/index.js +0 -5
- package/dist/esm/common/graph/modules.js +0 -90
- package/dist/esm/common/index.js +0 -36
- package/dist/esm/common/loader.js +0 -279
- package/dist/esm/common/lodash.js +0 -49
- package/dist/esm/common/manifest.js +0 -46
- package/dist/esm/common/package.js +0 -71
- package/dist/esm/common/plugin.js +0 -59
- package/dist/esm/common/resolver.js +0 -54
- package/dist/esm/common/rspack.js +0 -12
- package/dist/esm/common/summary.js +0 -10
- package/dist/esm/common/time.js +0 -64
- package/dist/esm/common/url.js +0 -20
- package/dist/esm/error/error.js +0 -202
- package/dist/esm/error/index.js +0 -5
- package/dist/esm/error/transform.js +0 -141
- package/dist/esm/error/utils.js +0 -40
- package/dist/esm/index.js +0 -6
- package/dist/esm/logger.js +0 -44
- package/dist/esm/rule-utils/document/document.js +0 -67
- package/dist/esm/rule-utils/document/index.js +0 -3
- package/dist/esm/rule-utils/document/server.js +0 -17
- package/dist/esm/rule-utils/index.js +0 -2
- package/dist/esm/rule-utils/parser/asserts.js +0 -132
- package/dist/esm/rule-utils/parser/index.js +0 -4
- package/dist/esm/rule-utils/parser/parser.js +0 -58
- package/dist/esm/rule-utils/parser/types.js +0 -9
- package/dist/esm/rule-utils/parser/utils.js +0 -164
- /package/dist/esm/rule-utils/document/{types.js → types.mjs} +0 -0
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
import { Client, Constants } from "@rsdoctor/types";
|
|
2
|
+
import { getChunksByAsset } from "./chunk.mjs";
|
|
3
|
+
import { getModulesByAsset } from "./modules.mjs";
|
|
4
|
+
const EXT = 'js|css|html';
|
|
5
|
+
const hashPattern = /[a-z|A-Z|0-9]{4,32}/;
|
|
6
|
+
const hashSeparatorPattern = /[-|.]/;
|
|
7
|
+
const fileExtensionPattern = /(?:\.[a-z|A-Z|0-9]{2,}){1,}/;
|
|
8
|
+
const filenamePattern = new RegExp(`(.*)${hashSeparatorPattern.source}${hashPattern.source}(${fileExtensionPattern.source})$`);
|
|
9
|
+
function formatAssetName(assetName, fileConfig) {
|
|
10
|
+
var _splitFilesList_;
|
|
11
|
+
const splitFilesList = null == fileConfig ? void 0 : fileConfig.split('.');
|
|
12
|
+
let outputFileTailName = '';
|
|
13
|
+
let unHashedFileName = assetName;
|
|
14
|
+
if ((null == splitFilesList ? void 0 : splitFilesList.length) && splitFilesList.length >= 3 && (null == (_splitFilesList_ = splitFilesList[splitFilesList.length - 2]) ? void 0 : _splitFilesList_.indexOf('[')) < 0 && EXT.indexOf(splitFilesList[splitFilesList.length - 1]) > -1) {
|
|
15
|
+
outputFileTailName = splitFilesList[splitFilesList.length - 2];
|
|
16
|
+
const _regPattern = /(.*)(\.[a-f0-9]{4,32})([^.]*.[^.]+){2,}/g;
|
|
17
|
+
unHashedFileName = assetName.replace(_regPattern, '$1');
|
|
18
|
+
return `${unHashedFileName}.${outputFileTailName}.${assetName.substring(assetName.lastIndexOf('.') + 1)}`;
|
|
19
|
+
}
|
|
20
|
+
return assetName.replace(filenamePattern, '$1$2');
|
|
21
|
+
}
|
|
22
|
+
function isAssetMatchExtension(asset, ext) {
|
|
23
|
+
return asset.path.slice(-ext.length) === ext || extname(asset.path) === ext;
|
|
24
|
+
}
|
|
25
|
+
function isAssetMatchExtensions(asset, exts) {
|
|
26
|
+
if (!exts.length) return false;
|
|
27
|
+
return exts.some((ext)=>isAssetMatchExtension(asset, ext));
|
|
28
|
+
}
|
|
29
|
+
function filterAssetsByExtensions(assets, exts) {
|
|
30
|
+
if ('string' == typeof exts) return assets.filter((e)=>isAssetMatchExtension(e, exts));
|
|
31
|
+
if (Array.isArray(exts)) return assets.filter((e)=>isAssetMatchExtensions(e, exts));
|
|
32
|
+
return [];
|
|
33
|
+
}
|
|
34
|
+
function filterAssets(assets, filterOrExtensions) {
|
|
35
|
+
if (filterOrExtensions) assets = 'function' == typeof filterOrExtensions ? assets.filter(filterOrExtensions) : filterAssetsByExtensions(assets, filterOrExtensions);
|
|
36
|
+
return assets;
|
|
37
|
+
}
|
|
38
|
+
function getAssetsSizeInfo(assets, chunks, options = {}) {
|
|
39
|
+
const { withFileContent = true, filterOrExtensions } = options;
|
|
40
|
+
assets = assets.filter((e)=>!isAssetMatchExtensions(e, Constants.MapExtensions));
|
|
41
|
+
if (filterOrExtensions) assets = filterAssets(assets, filterOrExtensions);
|
|
42
|
+
if (assets.length) return {
|
|
43
|
+
count: assets.length,
|
|
44
|
+
size: assets.reduce((t, c)=>t + c.size, 0),
|
|
45
|
+
files: assets.map((e)=>({
|
|
46
|
+
path: e.path,
|
|
47
|
+
size: e.size,
|
|
48
|
+
gzipSize: e.gzipSize,
|
|
49
|
+
initial: isInitialAsset(e, chunks),
|
|
50
|
+
content: withFileContent ? e.content : void 0
|
|
51
|
+
}))
|
|
52
|
+
};
|
|
53
|
+
return {
|
|
54
|
+
count: 0,
|
|
55
|
+
size: 0,
|
|
56
|
+
files: []
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
function isInitialAsset(asset, chunks) {
|
|
60
|
+
const cks = getChunksByAsset(asset, chunks);
|
|
61
|
+
return cks.some((e)=>Boolean(e.initial));
|
|
62
|
+
}
|
|
63
|
+
function getInitialAssetsSizeInfo(assets, chunks, options = {}) {
|
|
64
|
+
if (options.filterOrExtensions) assets = filterAssets(assets, options.filterOrExtensions);
|
|
65
|
+
return getAssetsSizeInfo(assets, chunks, {
|
|
66
|
+
...options,
|
|
67
|
+
filterOrExtensions: (asset)=>isInitialAsset(asset, chunks)
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
function getAssetsDiffResult(baseline, current) {
|
|
71
|
+
return {
|
|
72
|
+
all: {
|
|
73
|
+
total: diffAssetsByExtensions(baseline, current)
|
|
74
|
+
},
|
|
75
|
+
js: {
|
|
76
|
+
total: diffAssetsByExtensions(baseline, current, Constants.JSExtension),
|
|
77
|
+
initial: diffAssetsByExtensions(baseline, current, Constants.JSExtension, true)
|
|
78
|
+
},
|
|
79
|
+
css: {
|
|
80
|
+
total: diffAssetsByExtensions(baseline, current, Constants.CSSExtension),
|
|
81
|
+
initial: diffAssetsByExtensions(baseline, current, Constants.CSSExtension, true)
|
|
82
|
+
},
|
|
83
|
+
imgs: {
|
|
84
|
+
total: diffAssetsByExtensions(baseline, current, Constants.ImgExtensions)
|
|
85
|
+
},
|
|
86
|
+
html: {
|
|
87
|
+
total: diffAssetsByExtensions(baseline, current, Constants.HtmlExtension)
|
|
88
|
+
},
|
|
89
|
+
media: {
|
|
90
|
+
total: diffAssetsByExtensions(baseline, current, Constants.MediaExtensions)
|
|
91
|
+
},
|
|
92
|
+
fonts: {
|
|
93
|
+
total: diffAssetsByExtensions(baseline, current, Constants.FontExtensions)
|
|
94
|
+
},
|
|
95
|
+
others: {
|
|
96
|
+
total: diffAssetsByExtensions(baseline, current, (asset)=>!isAssetMatchExtensions(asset, [
|
|
97
|
+
Constants.JSExtension,
|
|
98
|
+
Constants.CSSExtension,
|
|
99
|
+
Constants.HtmlExtension
|
|
100
|
+
].concat(Constants.ImgExtensions, Constants.MediaExtensions, Constants.FontExtensions, Constants.MapExtensions)))
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
function diffSize(bSize, cSize) {
|
|
105
|
+
const isEqual = bSize === cSize;
|
|
106
|
+
const percent = isEqual ? 0 : 0 === bSize ? 100 : Math.abs(cSize - bSize) / bSize * 100;
|
|
107
|
+
const state = isEqual ? Client.RsdoctorClientDiffState.Equal : bSize > cSize ? Client.RsdoctorClientDiffState.Down : Client.RsdoctorClientDiffState.Up;
|
|
108
|
+
return {
|
|
109
|
+
percent,
|
|
110
|
+
state
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
function diffAssetsByExtensions(baseline, current, filterOrExtensions, isInitial = false) {
|
|
114
|
+
const { size: bSize, count: bCount } = isInitial ? getInitialAssetsSizeInfo(baseline.assets, baseline.chunks, {
|
|
115
|
+
filterOrExtensions
|
|
116
|
+
}) : getAssetsSizeInfo(baseline.assets, baseline.chunks, {
|
|
117
|
+
filterOrExtensions
|
|
118
|
+
});
|
|
119
|
+
let cSize;
|
|
120
|
+
let cCount;
|
|
121
|
+
if (baseline === current) {
|
|
122
|
+
cSize = bSize;
|
|
123
|
+
cCount = bCount;
|
|
124
|
+
} else {
|
|
125
|
+
const { size, count } = isInitial ? getInitialAssetsSizeInfo(current.assets, current.chunks, {
|
|
126
|
+
filterOrExtensions
|
|
127
|
+
}) : getAssetsSizeInfo(current.assets, current.chunks, {
|
|
128
|
+
filterOrExtensions
|
|
129
|
+
});
|
|
130
|
+
cSize = size;
|
|
131
|
+
cCount = count;
|
|
132
|
+
}
|
|
133
|
+
const { percent, state } = diffSize(bSize, cSize);
|
|
134
|
+
return {
|
|
135
|
+
size: {
|
|
136
|
+
baseline: bSize,
|
|
137
|
+
current: cSize
|
|
138
|
+
},
|
|
139
|
+
count: {
|
|
140
|
+
baseline: bCount,
|
|
141
|
+
current: cCount
|
|
142
|
+
},
|
|
143
|
+
percent,
|
|
144
|
+
state
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
function getAssetsSummary(assets, chunks, options = {}) {
|
|
148
|
+
const jsOpt = {
|
|
149
|
+
...options,
|
|
150
|
+
filterOrExtensions: Constants.JSExtension
|
|
151
|
+
};
|
|
152
|
+
const cssOpt = {
|
|
153
|
+
...options,
|
|
154
|
+
filterOrExtensions: Constants.CSSExtension
|
|
155
|
+
};
|
|
156
|
+
const imgOpt = {
|
|
157
|
+
...options,
|
|
158
|
+
filterOrExtensions: Constants.ImgExtensions
|
|
159
|
+
};
|
|
160
|
+
const htmlOpt = {
|
|
161
|
+
...options,
|
|
162
|
+
filterOrExtensions: Constants.HtmlExtension
|
|
163
|
+
};
|
|
164
|
+
const mediaOpt = {
|
|
165
|
+
...options,
|
|
166
|
+
filterOrExtensions: Constants.MediaExtensions
|
|
167
|
+
};
|
|
168
|
+
const fontOpt = {
|
|
169
|
+
...options,
|
|
170
|
+
filterOrExtensions: Constants.FontExtensions
|
|
171
|
+
};
|
|
172
|
+
const otherOpt = {
|
|
173
|
+
...options,
|
|
174
|
+
filterOrExtensions: (asset)=>!isAssetMatchExtensions(asset, [
|
|
175
|
+
Constants.JSExtension,
|
|
176
|
+
Constants.CSSExtension,
|
|
177
|
+
Constants.HtmlExtension
|
|
178
|
+
].concat(Constants.ImgExtensions, Constants.MediaExtensions, Constants.FontExtensions, Constants.MapExtensions))
|
|
179
|
+
};
|
|
180
|
+
return {
|
|
181
|
+
all: {
|
|
182
|
+
total: getAssetsSizeInfo(assets, chunks, options)
|
|
183
|
+
},
|
|
184
|
+
js: {
|
|
185
|
+
total: getAssetsSizeInfo(assets, chunks, jsOpt),
|
|
186
|
+
initial: getInitialAssetsSizeInfo(assets, chunks, jsOpt)
|
|
187
|
+
},
|
|
188
|
+
css: {
|
|
189
|
+
total: getAssetsSizeInfo(assets, chunks, cssOpt),
|
|
190
|
+
initial: getInitialAssetsSizeInfo(assets, chunks, cssOpt)
|
|
191
|
+
},
|
|
192
|
+
imgs: {
|
|
193
|
+
total: getAssetsSizeInfo(assets, chunks, imgOpt)
|
|
194
|
+
},
|
|
195
|
+
html: {
|
|
196
|
+
total: getAssetsSizeInfo(assets, chunks, htmlOpt)
|
|
197
|
+
},
|
|
198
|
+
media: {
|
|
199
|
+
total: getAssetsSizeInfo(assets, chunks, mediaOpt)
|
|
200
|
+
},
|
|
201
|
+
fonts: {
|
|
202
|
+
total: getAssetsSizeInfo(assets, chunks, fontOpt)
|
|
203
|
+
},
|
|
204
|
+
others: {
|
|
205
|
+
total: getAssetsSizeInfo(assets, chunks, otherOpt)
|
|
206
|
+
}
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
function getAssetDetails(assetPath, assets, chunks, modules) {
|
|
210
|
+
const asset = assets.find((e)=>e.path === assetPath);
|
|
211
|
+
return {
|
|
212
|
+
asset,
|
|
213
|
+
chunks: getChunksByAsset(asset, chunks),
|
|
214
|
+
modules: getModulesByAsset(asset, chunks, modules)
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
function getAllBundleData(assets, chunks, modules, filtersModules) {
|
|
218
|
+
const result = [];
|
|
219
|
+
try {
|
|
220
|
+
for(let i = 0; i < assets.length; i++){
|
|
221
|
+
const asset = assets[i];
|
|
222
|
+
result.push({
|
|
223
|
+
asset,
|
|
224
|
+
modules: getModulesByAsset(asset, chunks, modules, filtersModules)
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
return result;
|
|
228
|
+
} catch (error) {
|
|
229
|
+
console.error(error);
|
|
230
|
+
return [];
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
function extname(filename) {
|
|
234
|
+
const baseName = filename.split('?')[0];
|
|
235
|
+
const matches = baseName.match(/\.([0-9a-z]+)(?:[\?#]|$)/i);
|
|
236
|
+
return matches ? `.${matches[1]}` : '';
|
|
237
|
+
}
|
|
238
|
+
export { diffAssetsByExtensions, diffSize, extname, filterAssets, filterAssetsByExtensions, formatAssetName, getAllBundleData, getAssetDetails, getAssetsDiffResult, getAssetsSizeInfo, getAssetsSummary, getInitialAssetsSizeInfo, isAssetMatchExtension, isAssetMatchExtensions, isInitialAsset };
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
function getChunkIdsByAsset(asset) {
|
|
2
|
+
if (asset.chunks) return asset.chunks;
|
|
3
|
+
return [];
|
|
4
|
+
}
|
|
5
|
+
function getChunksByModule(module, chunks) {
|
|
6
|
+
if (module.chunks.length) return getChunksByChunkIds(module.chunks, chunks);
|
|
7
|
+
return [];
|
|
8
|
+
}
|
|
9
|
+
function getChunkByChunkId(chunkId, chunks) {
|
|
10
|
+
return chunks.find((e)=>e.id === chunkId);
|
|
11
|
+
}
|
|
12
|
+
function getChunksByChunkIds(chunkIds, chunks, filters) {
|
|
13
|
+
if (!chunkIds.length) return [];
|
|
14
|
+
const result = chunkIds.map((id)=>chunks.find((e)=>e.id === id)).filter(Boolean).map((chunk)=>{
|
|
15
|
+
if (filters && filters.length > 0) {
|
|
16
|
+
const filtered = {};
|
|
17
|
+
for (const key of filters)if (void 0 !== chunk[key]) filtered[key] = chunk[key];
|
|
18
|
+
return filtered;
|
|
19
|
+
}
|
|
20
|
+
return chunk;
|
|
21
|
+
});
|
|
22
|
+
return result;
|
|
23
|
+
}
|
|
24
|
+
function getChunksByAsset(asset, chunks, filters) {
|
|
25
|
+
return getChunksByChunkIds(getChunkIdsByAsset(asset), chunks, filters);
|
|
26
|
+
}
|
|
27
|
+
function getChunksByModuleId(id, modules, chunks) {
|
|
28
|
+
const mod = modules.find((e)=>e.id === id);
|
|
29
|
+
if (!mod) return [];
|
|
30
|
+
return getChunksByModule(mod, chunks);
|
|
31
|
+
}
|
|
32
|
+
export { getChunkByChunkId, getChunkIdsByAsset, getChunksByAsset, getChunksByChunkIds, getChunksByModule, getChunksByModuleId };
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
function getDependencyByPackageData(dep, dependencies) {
|
|
2
|
+
return dependencies.find((item)=>item.id === dep.dependencyId);
|
|
3
|
+
}
|
|
4
|
+
function getDependenciesByModule(module, dependencies) {
|
|
5
|
+
return module.dependencies.map((id)=>dependencies.find((dep)=>dep.id === id)).filter(Boolean);
|
|
6
|
+
}
|
|
7
|
+
function getDependencyByResolvedRequest(resolvedRequest, dependencies) {
|
|
8
|
+
return dependencies.find((e)=>e.resolvedRequest === resolvedRequest);
|
|
9
|
+
}
|
|
10
|
+
export { getDependenciesByModule, getDependencyByPackageData, getDependencyByResolvedRequest };
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { getChunkIdsByAsset, getChunksByChunkIds } from "./chunk.mjs";
|
|
2
|
+
import { getDependenciesByModule, getDependencyByPackageData } from "./dependency.mjs";
|
|
3
|
+
import { logger } from "../../logger.mjs";
|
|
4
|
+
import { isJsExt, isStyleExt } from "../file.mjs";
|
|
5
|
+
function getModulesByAsset(asset, chunks, modules, filterModules) {
|
|
6
|
+
const ids = getChunkIdsByAsset(asset);
|
|
7
|
+
const cks = getChunksByChunkIds(ids, chunks);
|
|
8
|
+
const res = getModulesByChunks(asset.path, cks, modules, filterModules);
|
|
9
|
+
return res;
|
|
10
|
+
}
|
|
11
|
+
function getModuleIdsByChunk(chunk) {
|
|
12
|
+
const { modules = [] } = chunk;
|
|
13
|
+
return modules;
|
|
14
|
+
}
|
|
15
|
+
function getModuleIdsByModulesIds(moduleIds, modules) {
|
|
16
|
+
return moduleIds.map((id)=>modules.find((m)=>m.id === id)).filter(Boolean);
|
|
17
|
+
}
|
|
18
|
+
function getModulesByChunk(chunk, modules, filterModules) {
|
|
19
|
+
const ids = getModuleIdsByChunk(chunk);
|
|
20
|
+
return ids.map((id)=>{
|
|
21
|
+
const module = modules.find((e)=>e.id === id);
|
|
22
|
+
if (filterModules && filterModules.length > 0) {
|
|
23
|
+
if (!module) return null;
|
|
24
|
+
const filtered = {};
|
|
25
|
+
for (const key of filterModules)if (void 0 !== module[key]) filtered[key] = module[key];
|
|
26
|
+
return filtered;
|
|
27
|
+
}
|
|
28
|
+
return module;
|
|
29
|
+
}).filter(Boolean);
|
|
30
|
+
}
|
|
31
|
+
function getTypeChecker(assetPath) {
|
|
32
|
+
if (isStyleExt(assetPath)) return isStyleExt;
|
|
33
|
+
if (isJsExt(assetPath)) return isJsExt;
|
|
34
|
+
return ()=>true;
|
|
35
|
+
}
|
|
36
|
+
function getModulesByChunks(assetPath, chunks, modules, filterModules) {
|
|
37
|
+
const res = [];
|
|
38
|
+
const typeChecker = getTypeChecker(assetPath);
|
|
39
|
+
try {
|
|
40
|
+
chunks.forEach((chunk)=>{
|
|
41
|
+
getModulesByChunk(chunk, modules, filterModules).forEach((md)=>{
|
|
42
|
+
const name = md.path || '';
|
|
43
|
+
if (!typeChecker(name)) return;
|
|
44
|
+
if (!res.filter((_m)=>_m.id === md.id).length) res.push(md);
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
} catch (error) {
|
|
48
|
+
logger.debug(error);
|
|
49
|
+
}
|
|
50
|
+
return res;
|
|
51
|
+
}
|
|
52
|
+
function getModuleByDependency(dep, modules) {
|
|
53
|
+
return modules.find((item)=>item.id === dep.module);
|
|
54
|
+
}
|
|
55
|
+
function filterModulesAndDependenciesByPackageDeps(deps, dependencies, modules) {
|
|
56
|
+
const _dependencies = [];
|
|
57
|
+
const _modules = [];
|
|
58
|
+
for(let i = 0; i < deps.length; i++){
|
|
59
|
+
const dep = getDependencyByPackageData(deps[i], dependencies);
|
|
60
|
+
if (dep) {
|
|
61
|
+
_dependencies.push(dep);
|
|
62
|
+
const module = getModuleByDependency(dep, modules);
|
|
63
|
+
if (module) _modules.push(module);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
dependencies: _dependencies,
|
|
68
|
+
modules: _modules
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
function getModuleDetails(moduleId, modules, dependencies) {
|
|
72
|
+
const module = modules.find((e)=>e.id === moduleId);
|
|
73
|
+
return {
|
|
74
|
+
module,
|
|
75
|
+
dependencies: getDependenciesByModule(module, dependencies)
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
export { filterModulesAndDependenciesByPackageDeps, getModuleByDependency, getModuleDetails, getModuleIdsByChunk, getModuleIdsByModulesIds, getModulesByAsset, getModulesByChunk, getModulesByChunks };
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import * as __WEBPACK_EXTERNAL_MODULE__summary_mjs_54f58833__ from "./summary.mjs";
|
|
2
|
+
import * as __WEBPACK_EXTERNAL_MODULE__crypto_mjs_252a9c2c__ from "./crypto.mjs";
|
|
3
|
+
import * as __WEBPACK_EXTERNAL_MODULE__manifest_mjs_2d750078__ from "./manifest.mjs";
|
|
4
|
+
import * as __WEBPACK_EXTERNAL_MODULE__loader_mjs_ab87ced3__ from "./loader.mjs";
|
|
5
|
+
import * as __WEBPACK_EXTERNAL_MODULE__time_mjs_7d968bf1__ from "./time.mjs";
|
|
6
|
+
import * as __WEBPACK_EXTERNAL_MODULE__algorithm_mjs_ed543360__ from "./algorithm.mjs";
|
|
7
|
+
import * as __WEBPACK_EXTERNAL_MODULE__resolver_mjs_24d6f61e__ from "./resolver.mjs";
|
|
8
|
+
import * as __WEBPACK_EXTERNAL_MODULE__graph_index_mjs_4e5a8d12__ from "./graph/index.mjs";
|
|
9
|
+
import * as __WEBPACK_EXTERNAL_MODULE__bundle_mjs_804f0b3a__ from "./bundle.mjs";
|
|
10
|
+
import * as __WEBPACK_EXTERNAL_MODULE__url_mjs_0b48a1db__ from "./url.mjs";
|
|
11
|
+
import * as __WEBPACK_EXTERNAL_MODULE__plugin_mjs_ee4957f9__ from "./plugin.mjs";
|
|
12
|
+
import * as __WEBPACK_EXTERNAL_MODULE__data_index_mjs_870691a9__ from "./data/index.mjs";
|
|
13
|
+
import * as __WEBPACK_EXTERNAL_MODULE__alerts_mjs_af8e297e__ from "./alerts.mjs";
|
|
14
|
+
import * as __WEBPACK_EXTERNAL_MODULE__rspack_mjs_fb7d03b6__ from "./rspack.mjs";
|
|
15
|
+
import * as __WEBPACK_EXTERNAL_MODULE__package_mjs_f12bd493__ from "./package.mjs";
|
|
16
|
+
import * as __WEBPACK_EXTERNAL_MODULE__lodash_mjs_5081b560__ from "./lodash.mjs";
|
|
17
|
+
import * as __WEBPACK_EXTERNAL_MODULE__global_config_mjs_ce875cc9__ from "./global-config.mjs";
|
|
18
|
+
import * as __WEBPACK_EXTERNAL_MODULE__file_mjs_bb53e012__ from "./file.mjs";
|
|
19
|
+
export { __WEBPACK_EXTERNAL_MODULE__alerts_mjs_af8e297e__ as Alerts, __WEBPACK_EXTERNAL_MODULE__algorithm_mjs_ed543360__ as Algorithm, __WEBPACK_EXTERNAL_MODULE__bundle_mjs_804f0b3a__ as Bundle, __WEBPACK_EXTERNAL_MODULE__crypto_mjs_252a9c2c__ as Crypto, __WEBPACK_EXTERNAL_MODULE__data_index_mjs_870691a9__ as Data, __WEBPACK_EXTERNAL_MODULE__file_mjs_bb53e012__ as File, __WEBPACK_EXTERNAL_MODULE__global_config_mjs_ce875cc9__ as GlobalConfig, __WEBPACK_EXTERNAL_MODULE__graph_index_mjs_4e5a8d12__ as Graph, __WEBPACK_EXTERNAL_MODULE__loader_mjs_ab87ced3__ as Loader, __WEBPACK_EXTERNAL_MODULE__lodash_mjs_5081b560__ as Lodash, __WEBPACK_EXTERNAL_MODULE__manifest_mjs_2d750078__ as Manifest, __WEBPACK_EXTERNAL_MODULE__package_mjs_f12bd493__ as Package, __WEBPACK_EXTERNAL_MODULE__plugin_mjs_ee4957f9__ as Plugin, __WEBPACK_EXTERNAL_MODULE__resolver_mjs_24d6f61e__ as Resolver, __WEBPACK_EXTERNAL_MODULE__rspack_mjs_fb7d03b6__ as Rspack, __WEBPACK_EXTERNAL_MODULE__summary_mjs_54f58833__ as Summary, __WEBPACK_EXTERNAL_MODULE__time_mjs_7d968bf1__ as Time, __WEBPACK_EXTERNAL_MODULE__url_mjs_0b48a1db__ as Url };
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
import { mergeIntervals } from "./algorithm.mjs";
|
|
2
|
+
function findLoaderTotalTiming(loaders) {
|
|
3
|
+
let start = 1 / 0;
|
|
4
|
+
let end = -1 / 0;
|
|
5
|
+
for(let i = 0; i < loaders.length; i++){
|
|
6
|
+
const loader = loaders[i];
|
|
7
|
+
if (loader.startAt <= start) start = loader.startAt;
|
|
8
|
+
if (loader.endAt >= end) end = loader.endAt;
|
|
9
|
+
}
|
|
10
|
+
return {
|
|
11
|
+
start,
|
|
12
|
+
end
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
function getLoadersCosts(filter, loaders) {
|
|
16
|
+
const match = {};
|
|
17
|
+
const others = {};
|
|
18
|
+
loaders.forEach((e)=>{
|
|
19
|
+
if (filter(e)) {
|
|
20
|
+
if (!match[e.pid]) match[e.pid] = [];
|
|
21
|
+
match[e.pid].push([
|
|
22
|
+
e.startAt,
|
|
23
|
+
e.endAt
|
|
24
|
+
]);
|
|
25
|
+
} else {
|
|
26
|
+
if (!others[e.pid]) others[e.pid] = [];
|
|
27
|
+
others[e.pid].push([
|
|
28
|
+
e.startAt,
|
|
29
|
+
e.endAt
|
|
30
|
+
]);
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
let costs = 0;
|
|
34
|
+
const pids = Object.keys(match);
|
|
35
|
+
for(let i = 0; i < pids.length; i++){
|
|
36
|
+
const pid = pids[i];
|
|
37
|
+
const _match = mergeIntervals(match[pid]);
|
|
38
|
+
const _others = mergeIntervals(others[pid] || []).filter(([s, e])=>_match.some((el)=>s >= el[0] && e <= el[1]));
|
|
39
|
+
const matchSum = _match.length ? _match.reduce((t, c)=>t += c[1] - c[0], 0) : 0;
|
|
40
|
+
const othersSum = _others.length ? _others.reduce((t, c)=>t += c[1] - c[0], 0) : 0;
|
|
41
|
+
costs += matchSum - othersSum;
|
|
42
|
+
}
|
|
43
|
+
return costs;
|
|
44
|
+
}
|
|
45
|
+
function getLoaderCosts(loader, loaders) {
|
|
46
|
+
const blocked = loaders.filter((e)=>{
|
|
47
|
+
if (e.loader.includes('builtin')) return false;
|
|
48
|
+
if (e !== loader && e.pid === loader.pid) {
|
|
49
|
+
if (e.startAt >= loader.startAt) {
|
|
50
|
+
if (e.endAt <= loader.endAt) return true;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return false;
|
|
54
|
+
});
|
|
55
|
+
let costs = loader.endAt - loader.startAt;
|
|
56
|
+
if (blocked.length) {
|
|
57
|
+
const intervals = blocked.map((e)=>[
|
|
58
|
+
Math.max(e.startAt, loader.startAt),
|
|
59
|
+
Math.min(e.endAt, loader.endAt)
|
|
60
|
+
]);
|
|
61
|
+
mergeIntervals(intervals).forEach((e)=>{
|
|
62
|
+
const sub = e[1] - e[0];
|
|
63
|
+
costs -= sub;
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
return costs;
|
|
67
|
+
}
|
|
68
|
+
function getLoaderNames(loaders) {
|
|
69
|
+
const names = new Set();
|
|
70
|
+
loaders.forEach((e)=>e.loaders.forEach((l)=>names.add(getLoadrName(l.loader))));
|
|
71
|
+
return [
|
|
72
|
+
...names
|
|
73
|
+
];
|
|
74
|
+
}
|
|
75
|
+
function getLoadersTransformData(loaders) {
|
|
76
|
+
const res = [];
|
|
77
|
+
for(let i = 0; i < loaders.length; i++){
|
|
78
|
+
const item = loaders[i];
|
|
79
|
+
for(let j = 0; j < item.loaders.length; j++){
|
|
80
|
+
const loader = item.loaders[j];
|
|
81
|
+
res.push(loader);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return res;
|
|
85
|
+
}
|
|
86
|
+
function getLoaderChartData(loaders) {
|
|
87
|
+
const res = [];
|
|
88
|
+
const list = getLoadersTransformData(loaders);
|
|
89
|
+
loaders.forEach((item)=>{
|
|
90
|
+
item.loaders.forEach((el)=>{
|
|
91
|
+
res.push({
|
|
92
|
+
layer: item.resource.layer,
|
|
93
|
+
loader: getLoadrName(el.loader),
|
|
94
|
+
isPitch: el.isPitch,
|
|
95
|
+
startAt: el.startAt,
|
|
96
|
+
endAt: el.endAt,
|
|
97
|
+
pid: el.pid,
|
|
98
|
+
sync: el.sync,
|
|
99
|
+
resource: item.resource.path,
|
|
100
|
+
costs: getLoaderCosts(el, list)
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
return res;
|
|
105
|
+
}
|
|
106
|
+
function getLoaderFileTree(loaders) {
|
|
107
|
+
const list = getLoadersTransformData(loaders);
|
|
108
|
+
return loaders.map((data)=>{
|
|
109
|
+
const { loaders: arr, resource } = data;
|
|
110
|
+
return {
|
|
111
|
+
path: resource.path,
|
|
112
|
+
layer: resource.layer,
|
|
113
|
+
loaders: arr.map((l)=>({
|
|
114
|
+
key: l.path,
|
|
115
|
+
loader: getLoadrName(l.loader),
|
|
116
|
+
path: l.path,
|
|
117
|
+
errors: l.errors,
|
|
118
|
+
costs: getLoaderCosts(l, list)
|
|
119
|
+
}))
|
|
120
|
+
};
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
function getLoaderFileDetails(path, loaders) {
|
|
124
|
+
const data = loaders.find((e)=>e.resource.path === path);
|
|
125
|
+
if (!data) throw new Error(`"${path}" not match any loader data`);
|
|
126
|
+
const list = getLoadersTransformData(loaders);
|
|
127
|
+
return {
|
|
128
|
+
...data,
|
|
129
|
+
loaders: data.loaders.map((el)=>({
|
|
130
|
+
...el,
|
|
131
|
+
loader: getLoadrName(el.loader),
|
|
132
|
+
costs: getLoaderCosts(el, list)
|
|
133
|
+
}))
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
function getLoaderFolderStatistics(folder, loaders) {
|
|
137
|
+
const datas = loaders.filter((data)=>{
|
|
138
|
+
const { path } = data.resource;
|
|
139
|
+
return path.startsWith(folder);
|
|
140
|
+
});
|
|
141
|
+
const filteredLoaders = [];
|
|
142
|
+
const uniqueLoaders = new Map();
|
|
143
|
+
datas.forEach((data)=>{
|
|
144
|
+
data.loaders.forEach((fl)=>{
|
|
145
|
+
const uniqueLoader = uniqueLoaders.get(fl.loader);
|
|
146
|
+
if (uniqueLoader) uniqueLoaders.set(fl.loader, {
|
|
147
|
+
files: uniqueLoader.files + 1,
|
|
148
|
+
path: fl.path
|
|
149
|
+
});
|
|
150
|
+
else uniqueLoaders.set(fl.loader, {
|
|
151
|
+
files: 1,
|
|
152
|
+
path: fl.path
|
|
153
|
+
});
|
|
154
|
+
return filteredLoaders.push({
|
|
155
|
+
loader: fl.loader,
|
|
156
|
+
startAt: fl.startAt,
|
|
157
|
+
endAt: fl.endAt,
|
|
158
|
+
pid: fl.pid
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
const loaderCosts = Array.from(uniqueLoaders).map((uniqueLoader)=>{
|
|
163
|
+
const filter = (l)=>l.loader === uniqueLoader[0];
|
|
164
|
+
const costs = getLoadersCosts(filter, filteredLoaders);
|
|
165
|
+
return {
|
|
166
|
+
loader: uniqueLoader[0],
|
|
167
|
+
files: uniqueLoader[1].files,
|
|
168
|
+
path: uniqueLoader[1].path,
|
|
169
|
+
costs
|
|
170
|
+
};
|
|
171
|
+
});
|
|
172
|
+
return loaderCosts;
|
|
173
|
+
}
|
|
174
|
+
function collectResourceDirectories(loaders, root) {
|
|
175
|
+
const directories = new Set();
|
|
176
|
+
loaders.forEach((item)=>{
|
|
177
|
+
if (item.resource.path.startsWith(root)) {
|
|
178
|
+
const pathParts = item.resource.path.split(root).slice(1).join('/').split('/');
|
|
179
|
+
if (pathParts.length >= 2) {
|
|
180
|
+
const twoLevelDir = pathParts.slice(0, 2).join('/');
|
|
181
|
+
directories.add(`${root}/${twoLevelDir}`);
|
|
182
|
+
}
|
|
183
|
+
} else {
|
|
184
|
+
const pathParts = item.resource.path.split('/');
|
|
185
|
+
const twoLevelDir = pathParts.slice(0, pathParts.length - 1).join('/');
|
|
186
|
+
directories.add(twoLevelDir);
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
return Array.from(directories);
|
|
190
|
+
}
|
|
191
|
+
function getDirectoriesLoaders(loaders, root) {
|
|
192
|
+
const rootPath = root || process.cwd();
|
|
193
|
+
const directories = collectResourceDirectories(loaders, rootPath);
|
|
194
|
+
return directories.map((directory)=>{
|
|
195
|
+
const stats = getLoaderFolderStatistics(directory, loaders);
|
|
196
|
+
return {
|
|
197
|
+
directory,
|
|
198
|
+
stats
|
|
199
|
+
};
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
function getLoaderFileFirstInput(file, loaders) {
|
|
203
|
+
for(let i = 0; i < loaders.length; i++){
|
|
204
|
+
const item = loaders[i];
|
|
205
|
+
if (item.resource.path === file) {
|
|
206
|
+
const nonPitchLoaders = item.loaders.filter((e)=>!e.isPitch);
|
|
207
|
+
if (!nonPitchLoaders.length) return '';
|
|
208
|
+
return nonPitchLoaders[0].input || '';
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
return '';
|
|
212
|
+
}
|
|
213
|
+
function getLoaderFileInputAndOutput(file, loader, loaderIndex, loaders) {
|
|
214
|
+
for(let i = 0; i < loaders.length; i++){
|
|
215
|
+
const item = loaders[i];
|
|
216
|
+
if (item.resource.path === file) for(let j = 0; j < item.loaders.length; j++){
|
|
217
|
+
const l = item.loaders[j];
|
|
218
|
+
if (l.loader === loader && l.loaderIndex === loaderIndex) return {
|
|
219
|
+
input: l.input || '',
|
|
220
|
+
output: l.result || ''
|
|
221
|
+
};
|
|
222
|
+
return {
|
|
223
|
+
input: '',
|
|
224
|
+
output: ''
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
return {
|
|
229
|
+
input: '',
|
|
230
|
+
output: ''
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
const LoaderInternalPropertyName = '__l__';
|
|
234
|
+
const isVue = (compiler)=>{
|
|
235
|
+
const rules = 'module' in compiler.options && compiler.options.module.rules || [];
|
|
236
|
+
const hasVueRule = rules.some((rule)=>{
|
|
237
|
+
var _rule_test;
|
|
238
|
+
if (rule && 'object' == typeof rule && rule.test instanceof RegExp && (null == (_rule_test = rule.test) ? void 0 : _rule_test.test('.vue'))) return true;
|
|
239
|
+
return false;
|
|
240
|
+
});
|
|
241
|
+
return hasVueRule;
|
|
242
|
+
};
|
|
243
|
+
const getLoadrName = (loader)=>{
|
|
244
|
+
const regResults = loader.includes('node_modules') ? loader.split('node_modules') : null;
|
|
245
|
+
return regResults ? regResults[regResults.length - 1] : loader;
|
|
246
|
+
};
|
|
247
|
+
export { LoaderInternalPropertyName, findLoaderTotalTiming, getDirectoriesLoaders, getLoaderChartData, getLoaderCosts, getLoaderFileDetails, getLoaderFileFirstInput, getLoaderFileInputAndOutput, getLoaderFileTree, getLoaderFolderStatistics, getLoaderNames, getLoadersCosts, getLoadersTransformData, isVue };
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
function isUndefined(value) {
|
|
2
|
+
return void 0 === value;
|
|
3
|
+
}
|
|
4
|
+
function isNumber(value) {
|
|
5
|
+
return 'number' == typeof value && !Number.isNaN(value);
|
|
6
|
+
}
|
|
7
|
+
function isObject(value) {
|
|
8
|
+
return 'object' == typeof value && null !== value;
|
|
9
|
+
}
|
|
10
|
+
function isEmpty(value) {
|
|
11
|
+
return null == value || Array.isArray(value) && 0 === value.length || 'object' == typeof value && 0 === Object.keys(value).length;
|
|
12
|
+
}
|
|
13
|
+
function last(array) {
|
|
14
|
+
return array[array.length - 1];
|
|
15
|
+
}
|
|
16
|
+
function compact(array) {
|
|
17
|
+
return array.filter((item)=>null != item || !item);
|
|
18
|
+
}
|
|
19
|
+
function isNil(value) {
|
|
20
|
+
return null == value;
|
|
21
|
+
}
|
|
22
|
+
const isPlainObject = (obj)=>null !== obj && 'object' == typeof obj && Object.getPrototypeOf(obj) === Object.prototype;
|
|
23
|
+
const isString = (v)=>'string' == typeof v || !!v && 'object' == typeof v && !Array.isArray(v) && '[object String]' === ({}).toString.call(v);
|
|
24
|
+
function pick(obj, keys) {
|
|
25
|
+
const result = {};
|
|
26
|
+
for(let i = 0; i < keys.length; i++){
|
|
27
|
+
const key = keys[i];
|
|
28
|
+
if (Object.hasOwn(obj, key)) result[key] = obj[key];
|
|
29
|
+
}
|
|
30
|
+
return result;
|
|
31
|
+
}
|
|
32
|
+
export { compact, isEmpty, isNil, isNumber, isObject, isPlainObject, isString, isUndefined, last, pick };
|