jinbi-utils 1.0.21 → 1.0.23
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/chunk-optimizer.cjs +703 -0
- package/dist/index.esm.js +3085 -0
- package/dist/index.esm.min.js +15 -0
- package/dist/index.umd.js +3198 -0
- package/dist/index.umd.min.js +16 -0
- package/package.json +36 -3
- package/.babelrc +0 -19
- package/.cz-config.js +0 -55
- package/.dockerignore +0 -3
- package/.editorconfig +0 -12
- package/.eslintignore +0 -8
- package/.eslintrc.js +0 -54
- package/.versionrc.json +0 -9
- package/CHUNK_OPTIMIZER_USAGE.md +0 -132
- package/Dockerfile +0 -3
- package/QUICK_RELEASE.md +0 -85
- package/RELEASE_GUIDE.md +0 -243
- package/api-extractor.json +0 -15
- package/commitlint.config.js +0 -3
- package/jest.config.js +0 -15
- package/rollup.config.chunk-optimizer.js +0 -32
- package/rollup.config.js +0 -73
- package/src/array/index.ts +0 -85
- package/src/build/chunk-optimizer/ARCHITECTURE.md +0 -347
- package/src/build/chunk-optimizer/QUICK_START.md +0 -370
- package/src/build/chunk-optimizer/README.md +0 -240
- package/src/build/chunk-optimizer/core/chunk-generator.ts +0 -166
- package/src/build/chunk-optimizer/core/classifier.ts +0 -148
- package/src/build/chunk-optimizer/core/dependency-reader.ts +0 -138
- package/src/build/chunk-optimizer/examples/basic-usage.ts +0 -234
- package/src/build/chunk-optimizer/index.ts +0 -166
- package/src/build/chunk-optimizer/rules/common-rules.ts +0 -131
- package/src/build/chunk-optimizer/rules/framework-rules.ts +0 -93
- package/src/build/chunk-optimizer/rules/index.ts +0 -27
- package/src/build/chunk-optimizer/test.ts +0 -94
- package/src/build/chunk-optimizer/types.ts +0 -128
- package/src/color/index.ts +0 -58
- package/src/common/index.ts +0 -353
- package/src/constant/common.constant.ts +0 -13
- package/src/date/index.ts +0 -143
- package/src/dom/index.ts +0 -198
- package/src/file/index.ts +0 -319
- package/src/http/apiBuilder/README.md +0 -648
- package/src/http/apiBuilder/api-builder.ts +0 -502
- package/src/http/apiBuilder/example.ts +0 -243
- package/src/http/apiBuilder/index.ts +0 -1
- package/src/http/apiBuilder//345/277/253/351/200/237/345/217/202/350/200/203.md +0 -199
- package/src/http/http.ts +0 -79
- package/src/http/httpEnums.ts +0 -61
- package/src/iam/index.ts +0 -46
- package/src/index.ts +0 -20
- package/src/middleware/requestLogger.middware.ts +0 -371
- package/src/middleware/requestLoggerUnified.ts +0 -371
- package/src/number/index.ts +0 -362
- package/src/object/index.ts +0 -54
- package/src/print/index.ts +0 -102
- package/src/string/index.ts +0 -189
- package/src/utils/curl.ts +0 -108
- package/src/validate/index.ts +0 -100
- package/src/websocket/emitter.ts +0 -39
- package/src/websocket/index.ts +0 -6
- package/src/websocket/manager.ts +0 -151
- package/src/websocket/pinia-store.ts +0 -91
- package/src/websocket/service.ts +0 -34
- package/src/websocket/types.ts +0 -45
- package/test/common/index.test.ts +0 -19
- package/test/date/index.test.ts +0 -107
- package/test/file/index.test.ts +0 -104
- package/test/number/index.test.ts +0 -108
- package/test/object/index.test.ts +0 -20
- package/test/string/index.test.ts +0 -82
- package/tsconfig.json +0 -39
- package/typedoc.json +0 -12
|
@@ -0,0 +1,703 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var fs = require('fs');
|
|
6
|
+
var path = require('path');
|
|
7
|
+
|
|
8
|
+
/*! *****************************************************************************
|
|
9
|
+
Copyright (c) Microsoft Corporation.
|
|
10
|
+
|
|
11
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
|
12
|
+
purpose with or without fee is hereby granted.
|
|
13
|
+
|
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
15
|
+
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
16
|
+
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
17
|
+
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
18
|
+
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
19
|
+
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
20
|
+
PERFORMANCE OF THIS SOFTWARE.
|
|
21
|
+
***************************************************************************** */
|
|
22
|
+
|
|
23
|
+
var __assign = function() {
|
|
24
|
+
__assign = Object.assign || function __assign(t) {
|
|
25
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
26
|
+
s = arguments[i];
|
|
27
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
|
|
28
|
+
}
|
|
29
|
+
return t;
|
|
30
|
+
};
|
|
31
|
+
return __assign.apply(this, arguments);
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
function __spreadArrays() {
|
|
35
|
+
for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
|
|
36
|
+
for (var r = Array(s), k = 0, i = 0; i < il; i++)
|
|
37
|
+
for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
|
|
38
|
+
r[k] = a[j];
|
|
39
|
+
return r;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* 依赖读取器类
|
|
44
|
+
*/
|
|
45
|
+
var DependencyReader = /** @class */ (function () {
|
|
46
|
+
function DependencyReader(packageJsonPath) {
|
|
47
|
+
this.packageJson = null;
|
|
48
|
+
// 默认使用项目根目录的 package.json
|
|
49
|
+
this.packageJsonPath = packageJsonPath || path.resolve(process.cwd(), 'package.json');
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* 读取 package.json
|
|
53
|
+
*/
|
|
54
|
+
DependencyReader.prototype.readPackageJson = function () {
|
|
55
|
+
if (this.packageJson) {
|
|
56
|
+
return this.packageJson;
|
|
57
|
+
}
|
|
58
|
+
if (!fs.existsSync(this.packageJsonPath)) {
|
|
59
|
+
throw new Error("package.json not found at: " + this.packageJsonPath);
|
|
60
|
+
}
|
|
61
|
+
try {
|
|
62
|
+
var content = fs.readFileSync(this.packageJsonPath, 'utf-8');
|
|
63
|
+
this.packageJson = JSON.parse(content);
|
|
64
|
+
return this.packageJson;
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
throw new Error("Failed to parse package.json: " + error);
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* 获取所有依赖信息
|
|
72
|
+
*/
|
|
73
|
+
DependencyReader.prototype.getDependencies = function () {
|
|
74
|
+
var pkg = this.readPackageJson();
|
|
75
|
+
var dependencies = [];
|
|
76
|
+
// 读取生产依赖
|
|
77
|
+
if (pkg.dependencies) {
|
|
78
|
+
Object.entries(pkg.dependencies).forEach(function (_a) {
|
|
79
|
+
var name = _a[0], version = _a[1];
|
|
80
|
+
dependencies.push({
|
|
81
|
+
name: name,
|
|
82
|
+
version: version,
|
|
83
|
+
isDev: false,
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
// 读取开发依赖
|
|
88
|
+
if (pkg.devDependencies) {
|
|
89
|
+
Object.entries(pkg.devDependencies).forEach(function (_a) {
|
|
90
|
+
var name = _a[0], version = _a[1];
|
|
91
|
+
dependencies.push({
|
|
92
|
+
name: name,
|
|
93
|
+
version: version,
|
|
94
|
+
isDev: true,
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
return dependencies;
|
|
99
|
+
};
|
|
100
|
+
/**
|
|
101
|
+
* 检测项目使用的框架
|
|
102
|
+
*/
|
|
103
|
+
DependencyReader.prototype.detectFramework = function () {
|
|
104
|
+
var pkg = this.readPackageJson();
|
|
105
|
+
var allDeps = __assign(__assign({}, pkg.dependencies), pkg.devDependencies);
|
|
106
|
+
// 检测 Vue
|
|
107
|
+
if (allDeps['vue']) {
|
|
108
|
+
return 'vue';
|
|
109
|
+
}
|
|
110
|
+
// 检测 React
|
|
111
|
+
if (allDeps['react']) {
|
|
112
|
+
return 'react';
|
|
113
|
+
}
|
|
114
|
+
// 检测 Angular
|
|
115
|
+
if (allDeps['@angular/core']) {
|
|
116
|
+
return 'angular';
|
|
117
|
+
}
|
|
118
|
+
// 检测 Svelte
|
|
119
|
+
if (allDeps['svelte']) {
|
|
120
|
+
return 'svelte';
|
|
121
|
+
}
|
|
122
|
+
// 默认返回 auto
|
|
123
|
+
return 'auto';
|
|
124
|
+
};
|
|
125
|
+
/**
|
|
126
|
+
* 检查是否存在某个依赖
|
|
127
|
+
*/
|
|
128
|
+
DependencyReader.prototype.hasDependency = function (name) {
|
|
129
|
+
var _a, _b;
|
|
130
|
+
var pkg = this.readPackageJson();
|
|
131
|
+
return !!(((_a = pkg.dependencies) === null || _a === void 0 ? void 0 : _a[name]) || ((_b = pkg.devDependencies) === null || _b === void 0 ? void 0 : _b[name]));
|
|
132
|
+
};
|
|
133
|
+
/**
|
|
134
|
+
* 获取依赖版本
|
|
135
|
+
*/
|
|
136
|
+
DependencyReader.prototype.getDependencyVersion = function (name) {
|
|
137
|
+
var _a, _b;
|
|
138
|
+
var pkg = this.readPackageJson();
|
|
139
|
+
return (((_a = pkg.dependencies) === null || _a === void 0 ? void 0 : _a[name]) || ((_b = pkg.devDependencies) === null || _b === void 0 ? void 0 : _b[name]) ||
|
|
140
|
+
null);
|
|
141
|
+
};
|
|
142
|
+
return DependencyReader;
|
|
143
|
+
}());
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Vue 生态规则
|
|
147
|
+
*/
|
|
148
|
+
var vueRules = [
|
|
149
|
+
// Vue 核心
|
|
150
|
+
{ match: 'vue', category: 'vendor-vue', priority: 100, description: 'Vue 核心框架' },
|
|
151
|
+
{ match: /^@vue\//, category: 'vendor-vue', priority: 100, description: 'Vue 官方包' },
|
|
152
|
+
// 状态管理
|
|
153
|
+
{ match: 'pinia', category: 'vendor-vue', priority: 100, description: 'Pinia 状态管理' },
|
|
154
|
+
{ match: 'vuex', category: 'vendor-state', priority: 90, description: 'Vuex 状态管理' },
|
|
155
|
+
// 路由
|
|
156
|
+
{ match: 'vue-router', category: 'vendor-router', priority: 100, description: 'Vue Router' },
|
|
157
|
+
// UI 框架
|
|
158
|
+
{ match: 'element-plus', category: 'vendor-element', priority: 80, description: 'Element Plus UI' },
|
|
159
|
+
{ match: 'ant-design-vue', category: 'vendor-ui', priority: 80, description: 'Ant Design Vue' },
|
|
160
|
+
{ match: 'naive-ui', category: 'vendor-ui', priority: 80, description: 'Naive UI' },
|
|
161
|
+
{ match: 'vant', category: 'vendor-ui', priority: 80, description: 'Vant UI' },
|
|
162
|
+
{ match: 'arco-design', category: 'vendor-ui', priority: 80, description: 'Arco Design' },
|
|
163
|
+
// VueUse
|
|
164
|
+
{ match: /^@vueuse\//, category: 'vendor-vueuse', priority: 70, description: 'VueUse 工具集' },
|
|
165
|
+
// 国际化
|
|
166
|
+
{ match: 'vue-i18n', category: 'vendor-i18n', priority: 60, description: 'Vue I18n' },
|
|
167
|
+
{ match: /^@intlify\//, category: 'vendor-i18n', priority: 60, description: 'Intlify' },
|
|
168
|
+
];
|
|
169
|
+
/**
|
|
170
|
+
* React 生态规则
|
|
171
|
+
*/
|
|
172
|
+
var reactRules = [
|
|
173
|
+
// React 核心
|
|
174
|
+
{ match: 'react', category: 'vendor-react', priority: 100, description: 'React 核心' },
|
|
175
|
+
{ match: 'react-dom', category: 'vendor-react', priority: 100, description: 'React DOM' },
|
|
176
|
+
// 状态管理
|
|
177
|
+
{ match: 'redux', category: 'vendor-state', priority: 90, description: 'Redux' },
|
|
178
|
+
{ match: 'react-redux', category: 'vendor-state', priority: 90, description: 'React Redux' },
|
|
179
|
+
{ match: 'zustand', category: 'vendor-state', priority: 90, description: 'Zustand' },
|
|
180
|
+
{ match: 'mobx', category: 'vendor-state', priority: 90, description: 'MobX' },
|
|
181
|
+
{ match: 'mobx-react', category: 'vendor-state', priority: 90, description: 'MobX React' },
|
|
182
|
+
// 路由
|
|
183
|
+
{ match: 'react-router', category: 'vendor-router', priority: 100, description: 'React Router' },
|
|
184
|
+
{ match: 'react-router-dom', category: 'vendor-router', priority: 100, description: 'React Router DOM' },
|
|
185
|
+
// UI 框架
|
|
186
|
+
{ match: 'antd', category: 'vendor-ui', priority: 80, description: 'Ant Design' },
|
|
187
|
+
{ match: '@ant-design/icons', category: 'vendor-icons', priority: 70, description: 'Ant Design Icons' },
|
|
188
|
+
{ match: '@mui/material', category: 'vendor-ui', priority: 80, description: 'Material UI' },
|
|
189
|
+
{ match: 'chakra-ui', category: 'vendor-ui', priority: 80, description: 'Chakra UI' },
|
|
190
|
+
];
|
|
191
|
+
/**
|
|
192
|
+
* Angular 生态规则
|
|
193
|
+
*/
|
|
194
|
+
var angularRules = [
|
|
195
|
+
{ match: /^@angular\//, category: 'vendor-angular', priority: 100, description: 'Angular 框架' },
|
|
196
|
+
];
|
|
197
|
+
/**
|
|
198
|
+
* Svelte 生态规则
|
|
199
|
+
*/
|
|
200
|
+
var svelteRules = [
|
|
201
|
+
{ match: 'svelte', category: 'vendor-svelte', priority: 100, description: 'Svelte 框架' },
|
|
202
|
+
];
|
|
203
|
+
/**
|
|
204
|
+
* 获取框架规则
|
|
205
|
+
*/
|
|
206
|
+
function getFrameworkRules(framework) {
|
|
207
|
+
switch (framework) {
|
|
208
|
+
case 'vue':
|
|
209
|
+
return vueRules;
|
|
210
|
+
case 'react':
|
|
211
|
+
return reactRules;
|
|
212
|
+
case 'angular':
|
|
213
|
+
return angularRules;
|
|
214
|
+
case 'svelte':
|
|
215
|
+
return svelteRules;
|
|
216
|
+
default:
|
|
217
|
+
return __spreadArrays(vueRules, reactRules, angularRules, svelteRules);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* 工具库规则
|
|
223
|
+
*/
|
|
224
|
+
var utilsRules = [
|
|
225
|
+
// 日期时间
|
|
226
|
+
{ match: 'dayjs', category: 'vendor-utils', priority: 60, description: '日期时间库' },
|
|
227
|
+
{ match: 'moment', category: 'vendor-utils', priority: 60, description: 'Moment.js' },
|
|
228
|
+
{ match: 'date-fns', category: 'vendor-utils', priority: 60, description: 'date-fns' },
|
|
229
|
+
// HTTP 请求
|
|
230
|
+
{ match: 'axios', category: 'vendor-utils', priority: 70, description: 'Axios HTTP 客户端' },
|
|
231
|
+
{ match: 'ky', category: 'vendor-utils', priority: 70, description: 'Ky HTTP 客户端' },
|
|
232
|
+
// 工具函数
|
|
233
|
+
{ match: 'lodash', category: 'vendor-utils', priority: 60, description: 'Lodash' },
|
|
234
|
+
{ match: 'lodash-es', category: 'vendor-utils', priority: 60, description: 'Lodash ES' },
|
|
235
|
+
{ match: 'ramda', category: 'vendor-utils', priority: 60, description: 'Ramda' },
|
|
236
|
+
// Cookie & Storage
|
|
237
|
+
{ match: 'js-cookie', category: 'vendor-utils', priority: 50, description: 'JS Cookie' },
|
|
238
|
+
{ match: 'localforage', category: 'vendor-utils', priority: 50, description: 'LocalForage' },
|
|
239
|
+
{ match: 'responsive-storage', category: 'vendor-utils', priority: 50, description: 'Responsive Storage' },
|
|
240
|
+
// 查询字符串
|
|
241
|
+
{ match: 'qs', category: 'vendor-utils', priority: 50, description: 'Query String' },
|
|
242
|
+
// 事件总线
|
|
243
|
+
{ match: 'mitt', category: 'vendor-utils', priority: 50, description: 'Mitt 事件总线' },
|
|
244
|
+
{ match: 'eventemitter3', category: 'vendor-utils', priority: 50, description: 'EventEmitter3' },
|
|
245
|
+
// 数学计算
|
|
246
|
+
{ match: 'decimal.js', category: 'vendor-utils', priority: 50, description: 'Decimal.js' },
|
|
247
|
+
{ match: 'big.js', category: 'vendor-utils', priority: 50, description: 'Big.js' },
|
|
248
|
+
// 拖拽
|
|
249
|
+
{ match: 'sortablejs', category: 'vendor-utils', priority: 50, description: 'SortableJS' },
|
|
250
|
+
// 动画
|
|
251
|
+
{ match: 'animate.css', category: 'vendor-utils', priority: 40, description: 'Animate.css' },
|
|
252
|
+
{ match: '@vueuse/motion', category: 'vendor-utils', priority: 40, description: 'VueUse Motion' },
|
|
253
|
+
// 其他工具
|
|
254
|
+
{ match: 'nprogress', category: 'vendor-utils', priority: 40, description: 'NProgress' },
|
|
255
|
+
{ match: 'path-browserify', category: 'vendor-utils', priority: 40, description: 'Path Browserify' },
|
|
256
|
+
];
|
|
257
|
+
/**
|
|
258
|
+
* 图标库规则
|
|
259
|
+
*/
|
|
260
|
+
var iconRules = [
|
|
261
|
+
{ match: /^@iconify\//, category: 'vendor-icons', priority: 60, description: 'Iconify' },
|
|
262
|
+
{ match: 'unplugin-icons', category: 'vendor-icons', priority: 60, description: 'Unplugin Icons' },
|
|
263
|
+
{ match: /-icons?$/, category: 'vendor-icons', priority: 50, description: '图标库(通用匹配)' },
|
|
264
|
+
];
|
|
265
|
+
/**
|
|
266
|
+
* 表单和验证规则
|
|
267
|
+
*/
|
|
268
|
+
var formRules = [
|
|
269
|
+
{ match: 'vee-validate', category: 'vendor-utils', priority: 50, description: 'VeeValidate' },
|
|
270
|
+
{ match: 'yup', category: 'vendor-utils', priority: 50, description: 'Yup 验证' },
|
|
271
|
+
{ match: 'zod', category: 'vendor-utils', priority: 50, description: 'Zod 验证' },
|
|
272
|
+
{ match: '@zxcvbn-ts/core', category: 'vendor-utils', priority: 40, description: 'Zxcvbn 密码强度' },
|
|
273
|
+
];
|
|
274
|
+
/**
|
|
275
|
+
* 图表库规则
|
|
276
|
+
*/
|
|
277
|
+
var chartRules = [
|
|
278
|
+
{ match: 'echarts', category: 'vendor-charts', priority: 70, description: 'ECharts' },
|
|
279
|
+
{ match: 'chart.js', category: 'vendor-charts', priority: 70, description: 'Chart.js' },
|
|
280
|
+
{ match: 'd3', category: 'vendor-charts', priority: 70, description: 'D3.js' },
|
|
281
|
+
{ match: /^@antv\//, category: 'vendor-charts', priority: 70, description: 'AntV 图表' },
|
|
282
|
+
];
|
|
283
|
+
/**
|
|
284
|
+
* 富文本编辑器规则
|
|
285
|
+
*/
|
|
286
|
+
var editorRules = [
|
|
287
|
+
{ match: 'quill', category: 'vendor-editor', priority: 60, description: 'Quill 编辑器' },
|
|
288
|
+
{ match: '@wangeditor/editor', category: 'vendor-editor', priority: 60, description: 'wangEditor' },
|
|
289
|
+
{ match: 'tinymce', category: 'vendor-editor', priority: 60, description: 'TinyMCE' },
|
|
290
|
+
{ match: '@tiptap/vue-3', category: 'vendor-editor', priority: 60, description: 'Tiptap' },
|
|
291
|
+
];
|
|
292
|
+
/**
|
|
293
|
+
* 表格库规则
|
|
294
|
+
*/
|
|
295
|
+
var tableRules = [
|
|
296
|
+
{ match: 'vxe-table', category: 'vendor-table', priority: 70, description: 'VXE Table' },
|
|
297
|
+
{ match: 'ag-grid', category: 'vendor-table', priority: 70, description: 'AG Grid' },
|
|
298
|
+
];
|
|
299
|
+
/**
|
|
300
|
+
* 中国特色库规则
|
|
301
|
+
*/
|
|
302
|
+
var chinaRules = [
|
|
303
|
+
{ match: 'china-area-data', category: 'vendor-utils', priority: 40, description: '中国地区数据' },
|
|
304
|
+
{ match: 'pinyin-pro', category: 'vendor-utils', priority: 40, description: '拼音转换' },
|
|
305
|
+
];
|
|
306
|
+
/**
|
|
307
|
+
* 业务组件库规则
|
|
308
|
+
*/
|
|
309
|
+
var businessRules = [
|
|
310
|
+
{ match: 'plus-pro-components', category: 'vendor-pro', priority: 70, description: 'Plus Pro Components' },
|
|
311
|
+
{ match: 'vue-tippy', category: 'vendor-utils', priority: 40, description: 'Vue Tippy' },
|
|
312
|
+
{ match: 'vue-types', category: 'vendor-utils', priority: 40, description: 'Vue Types' },
|
|
313
|
+
];
|
|
314
|
+
/**
|
|
315
|
+
* 获取所有通用规则
|
|
316
|
+
*/
|
|
317
|
+
function getCommonRules() {
|
|
318
|
+
return __spreadArrays(utilsRules, iconRules, formRules, chartRules, editorRules, tableRules, chinaRules, businessRules);
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
/**
|
|
322
|
+
* 获取所有规则
|
|
323
|
+
*/
|
|
324
|
+
function getAllRules(framework) {
|
|
325
|
+
if (framework === void 0) { framework = 'auto'; }
|
|
326
|
+
var frameworkRules = getFrameworkRules(framework === 'auto' ? 'all' : framework);
|
|
327
|
+
var commonRules = getCommonRules();
|
|
328
|
+
return __spreadArrays(frameworkRules, commonRules);
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* 根据优先级排序规则
|
|
332
|
+
*/
|
|
333
|
+
function sortRulesByPriority(rules) {
|
|
334
|
+
return rules.sort(function (a, b) { return (b.priority || 0) - (a.priority || 0); });
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
/**
|
|
338
|
+
* 依赖分类器
|
|
339
|
+
*/
|
|
340
|
+
var DependencyClassifier = /** @class */ (function () {
|
|
341
|
+
function DependencyClassifier(framework, customRules, exclude) {
|
|
342
|
+
if (framework === void 0) { framework = 'auto'; }
|
|
343
|
+
if (customRules === void 0) { customRules = {}; }
|
|
344
|
+
if (exclude === void 0) { exclude = []; }
|
|
345
|
+
// 获取并排序规则(按优先级)
|
|
346
|
+
this.rules = sortRulesByPriority(getAllRules(framework));
|
|
347
|
+
this.customRules = customRules;
|
|
348
|
+
this.exclude = exclude;
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* 检查是否应该排除某个包
|
|
352
|
+
*/
|
|
353
|
+
DependencyClassifier.prototype.shouldExclude = function (packageName) {
|
|
354
|
+
return this.exclude.some(function (pattern) {
|
|
355
|
+
if (pattern.includes('*')) {
|
|
356
|
+
// 支持通配符匹配
|
|
357
|
+
var regex = new RegExp('^' + pattern.replace(/\*/g, '.*') + '$');
|
|
358
|
+
return regex.test(packageName);
|
|
359
|
+
}
|
|
360
|
+
return packageName === pattern;
|
|
361
|
+
});
|
|
362
|
+
};
|
|
363
|
+
/**
|
|
364
|
+
* 匹配规则
|
|
365
|
+
*/
|
|
366
|
+
DependencyClassifier.prototype.matchRule = function (packageName, rule) {
|
|
367
|
+
if (typeof rule.match === 'string') {
|
|
368
|
+
return packageName === rule.match;
|
|
369
|
+
}
|
|
370
|
+
else {
|
|
371
|
+
return rule.match.test(packageName);
|
|
372
|
+
}
|
|
373
|
+
};
|
|
374
|
+
/**
|
|
375
|
+
* 对单个依赖进行分类
|
|
376
|
+
*/
|
|
377
|
+
DependencyClassifier.prototype.classifyDependency = function (dep) {
|
|
378
|
+
// 检查是否应该排除
|
|
379
|
+
if (this.shouldExclude(dep.name)) {
|
|
380
|
+
return null;
|
|
381
|
+
}
|
|
382
|
+
// 优先使用自定义规则
|
|
383
|
+
if (this.customRules[dep.name]) {
|
|
384
|
+
return this.customRules[dep.name];
|
|
385
|
+
}
|
|
386
|
+
// 检查自定义规则中的通配符
|
|
387
|
+
for (var _i = 0, _a = Object.entries(this.customRules); _i < _a.length; _i++) {
|
|
388
|
+
var _b = _a[_i], pattern = _b[0], category = _b[1];
|
|
389
|
+
if (pattern.includes('*')) {
|
|
390
|
+
var regex = new RegExp('^' + pattern.replace(/\*/g, '.*') + '$');
|
|
391
|
+
if (regex.test(dep.name)) {
|
|
392
|
+
return category;
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
// 使用预定义规则
|
|
397
|
+
for (var _c = 0, _d = this.rules; _c < _d.length; _c++) {
|
|
398
|
+
var rule = _d[_c];
|
|
399
|
+
if (this.matchRule(dep.name, rule)) {
|
|
400
|
+
return rule.category;
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
// 默认分类
|
|
404
|
+
return 'vendor-libs';
|
|
405
|
+
};
|
|
406
|
+
/**
|
|
407
|
+
* 对所有依赖进行分类
|
|
408
|
+
*/
|
|
409
|
+
DependencyClassifier.prototype.classifyAll = function (dependencies) {
|
|
410
|
+
var _this = this;
|
|
411
|
+
return dependencies.map(function (dep) { return (__assign(__assign({}, dep), { category: _this.classifyDependency(dep) || undefined })); });
|
|
412
|
+
};
|
|
413
|
+
/**
|
|
414
|
+
* 获取分类统计
|
|
415
|
+
*/
|
|
416
|
+
DependencyClassifier.prototype.getCategoryStats = function (dependencies) {
|
|
417
|
+
var stats = {};
|
|
418
|
+
dependencies.forEach(function (dep) {
|
|
419
|
+
if (dep.category) {
|
|
420
|
+
stats[dep.category] = (stats[dep.category] || 0) + 1;
|
|
421
|
+
}
|
|
422
|
+
});
|
|
423
|
+
return stats;
|
|
424
|
+
};
|
|
425
|
+
/**
|
|
426
|
+
* 打印分类信息(调试用)
|
|
427
|
+
*/
|
|
428
|
+
DependencyClassifier.prototype.printClassification = function (dependencies) {
|
|
429
|
+
console.log('\n📦 Chunk Optimizer - Dependency Classification\n');
|
|
430
|
+
var categorized = this.classifyAll(dependencies);
|
|
431
|
+
var stats = this.getCategoryStats(categorized);
|
|
432
|
+
// 按分类分组
|
|
433
|
+
var grouped = {};
|
|
434
|
+
categorized.forEach(function (dep) {
|
|
435
|
+
if (dep.category) {
|
|
436
|
+
if (!grouped[dep.category]) {
|
|
437
|
+
grouped[dep.category] = [];
|
|
438
|
+
}
|
|
439
|
+
grouped[dep.category].push(dep.name);
|
|
440
|
+
}
|
|
441
|
+
});
|
|
442
|
+
// 打印每个分类
|
|
443
|
+
Object.entries(grouped)
|
|
444
|
+
.sort(function (_a, _b) {
|
|
445
|
+
var a = _a[0];
|
|
446
|
+
var b = _b[0];
|
|
447
|
+
return a.localeCompare(b);
|
|
448
|
+
})
|
|
449
|
+
.forEach(function (_a) {
|
|
450
|
+
var category = _a[0], packages = _a[1];
|
|
451
|
+
console.log("\n" + category + " (" + packages.length + "):");
|
|
452
|
+
packages.forEach(function (pkg) {
|
|
453
|
+
console.log(" - " + pkg);
|
|
454
|
+
});
|
|
455
|
+
});
|
|
456
|
+
console.log('\n📊 Summary:');
|
|
457
|
+
console.log(" Total dependencies: " + dependencies.length);
|
|
458
|
+
console.log(" Categorized: " + categorized.filter(function (d) { return d.category; }).length);
|
|
459
|
+
console.log(" Categories: " + Object.keys(stats).length);
|
|
460
|
+
console.log('');
|
|
461
|
+
};
|
|
462
|
+
return DependencyClassifier;
|
|
463
|
+
}());
|
|
464
|
+
|
|
465
|
+
/**
|
|
466
|
+
* Chunk 生成器
|
|
467
|
+
*/
|
|
468
|
+
var ChunkGenerator = /** @class */ (function () {
|
|
469
|
+
function ChunkGenerator(dependencies, sourceCodeStrategy, debug) {
|
|
470
|
+
var _this = this;
|
|
471
|
+
if (sourceCodeStrategy === void 0) { sourceCodeStrategy = {}; }
|
|
472
|
+
if (debug === void 0) { debug = false; }
|
|
473
|
+
// 构建依赖名称到分类的映射
|
|
474
|
+
this.dependencyMap = new Map();
|
|
475
|
+
dependencies.forEach(function (dep) {
|
|
476
|
+
if (dep.category) {
|
|
477
|
+
_this.dependencyMap.set(dep.name, dep.category);
|
|
478
|
+
}
|
|
479
|
+
});
|
|
480
|
+
this.sourceCodeStrategy = __assign({ views: true, components: true, utils: true, store: true }, sourceCodeStrategy);
|
|
481
|
+
this.debug = debug;
|
|
482
|
+
}
|
|
483
|
+
/**
|
|
484
|
+
* 从模块 ID 中提取包名
|
|
485
|
+
*/
|
|
486
|
+
ChunkGenerator.prototype.extractPackageName = function (id) {
|
|
487
|
+
var match = id.match(/node_modules\/(@[^/]+\/[^/]+|[^/]+)/);
|
|
488
|
+
return match ? match[1] : null;
|
|
489
|
+
};
|
|
490
|
+
/**
|
|
491
|
+
* 处理 node_modules 依赖
|
|
492
|
+
*/
|
|
493
|
+
ChunkGenerator.prototype.handleNodeModules = function (id) {
|
|
494
|
+
var packageName = this.extractPackageName(id);
|
|
495
|
+
if (!packageName) {
|
|
496
|
+
return undefined;
|
|
497
|
+
}
|
|
498
|
+
// 查找依赖分类
|
|
499
|
+
var category = this.dependencyMap.get(packageName);
|
|
500
|
+
if (this.debug && category) {
|
|
501
|
+
console.log("[Chunk] " + packageName + " -> " + category);
|
|
502
|
+
}
|
|
503
|
+
return category;
|
|
504
|
+
};
|
|
505
|
+
/**
|
|
506
|
+
* 处理业务代码
|
|
507
|
+
*/
|
|
508
|
+
ChunkGenerator.prototype.handleSourceCode = function (id) {
|
|
509
|
+
// 处理 views 目录
|
|
510
|
+
if (this.sourceCodeStrategy.views && id.includes('/src/views/')) {
|
|
511
|
+
var match = id.match(/\/src\/views\/([^/]+)\//);
|
|
512
|
+
if (match) {
|
|
513
|
+
return "chunk-" + match[1];
|
|
514
|
+
}
|
|
515
|
+
return 'chunk-views';
|
|
516
|
+
}
|
|
517
|
+
// 处理 components 目录
|
|
518
|
+
if (this.sourceCodeStrategy.components && id.includes('/src/components/')) {
|
|
519
|
+
return 'chunk-components';
|
|
520
|
+
}
|
|
521
|
+
// 处理 utils 和 config 目录
|
|
522
|
+
if (this.sourceCodeStrategy.utils) {
|
|
523
|
+
if (id.includes('/src/utils/') || id.includes('/src/config/')) {
|
|
524
|
+
return 'chunk-common';
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
// 处理 store 目录
|
|
528
|
+
if (this.sourceCodeStrategy.store && id.includes('/src/store/')) {
|
|
529
|
+
return 'chunk-store';
|
|
530
|
+
}
|
|
531
|
+
// 处理自定义规则
|
|
532
|
+
if (this.sourceCodeStrategy.custom) {
|
|
533
|
+
for (var _i = 0, _a = this.sourceCodeStrategy.custom; _i < _a.length; _i++) {
|
|
534
|
+
var rule = _a[_i];
|
|
535
|
+
if (rule.pattern.test(id)) {
|
|
536
|
+
return rule.chunkName;
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
return undefined;
|
|
541
|
+
};
|
|
542
|
+
/**
|
|
543
|
+
* 生成 manualChunks 函数
|
|
544
|
+
*/
|
|
545
|
+
ChunkGenerator.prototype.generate = function () {
|
|
546
|
+
var _this = this;
|
|
547
|
+
return function (id) {
|
|
548
|
+
// 处理 node_modules 依赖
|
|
549
|
+
if (id.includes('node_modules')) {
|
|
550
|
+
return _this.handleNodeModules(id);
|
|
551
|
+
}
|
|
552
|
+
// 处理业务代码
|
|
553
|
+
return _this.handleSourceCode(id);
|
|
554
|
+
};
|
|
555
|
+
};
|
|
556
|
+
/**
|
|
557
|
+
* 获取依赖统计信息
|
|
558
|
+
*/
|
|
559
|
+
ChunkGenerator.prototype.getStats = function () {
|
|
560
|
+
var categories = new Set();
|
|
561
|
+
this.dependencyMap.forEach(function (category) {
|
|
562
|
+
categories.add(category);
|
|
563
|
+
});
|
|
564
|
+
return {
|
|
565
|
+
totalDependencies: this.dependencyMap.size,
|
|
566
|
+
categorizedDependencies: this.dependencyMap.size,
|
|
567
|
+
categories: Array.from(categories).sort(),
|
|
568
|
+
};
|
|
569
|
+
};
|
|
570
|
+
/**
|
|
571
|
+
* 打印统计信息
|
|
572
|
+
*/
|
|
573
|
+
ChunkGenerator.prototype.printStats = function () {
|
|
574
|
+
var _this = this;
|
|
575
|
+
var stats = this.getStats();
|
|
576
|
+
console.log('\n🎯 Chunk Optimizer - Statistics\n');
|
|
577
|
+
console.log("Total dependencies: " + stats.totalDependencies);
|
|
578
|
+
console.log("Categorized: " + stats.categorizedDependencies);
|
|
579
|
+
console.log("\nChunk categories (" + stats.categories.length + "):");
|
|
580
|
+
stats.categories.forEach(function (category) {
|
|
581
|
+
var count = Array.from(_this.dependencyMap.values()).filter(function (c) { return c === category; }).length;
|
|
582
|
+
console.log(" - " + category + ": " + count + " packages");
|
|
583
|
+
});
|
|
584
|
+
console.log('');
|
|
585
|
+
};
|
|
586
|
+
return ChunkGenerator;
|
|
587
|
+
}());
|
|
588
|
+
|
|
589
|
+
/**
|
|
590
|
+
* Vite Chunk Optimizer
|
|
591
|
+
* 智能分包优化工具 - 自动分析依赖并生成最优的 manualChunks 配置
|
|
592
|
+
*
|
|
593
|
+
* @author Your Name
|
|
594
|
+
* @license MIT
|
|
595
|
+
*/
|
|
596
|
+
/**
|
|
597
|
+
* Chunk 优化器类
|
|
598
|
+
*/
|
|
599
|
+
var ChunkOptimizer = /** @class */ (function () {
|
|
600
|
+
function ChunkOptimizer(options) {
|
|
601
|
+
if (options === void 0) { options = {}; }
|
|
602
|
+
this.generator = null;
|
|
603
|
+
// 设置默认选项
|
|
604
|
+
this.options = {
|
|
605
|
+
framework: options.framework || 'auto',
|
|
606
|
+
strategy: options.strategy || 'balanced',
|
|
607
|
+
customRules: options.customRules || {},
|
|
608
|
+
exclude: options.exclude || ['@types/*'],
|
|
609
|
+
minChunkSize: options.minChunkSize || 0,
|
|
610
|
+
debug: options.debug || false,
|
|
611
|
+
sourceCodeStrategy: __assign({ views: true, components: true, utils: true, store: true }, options.sourceCodeStrategy),
|
|
612
|
+
packageJsonPath: options.packageJsonPath || '',
|
|
613
|
+
};
|
|
614
|
+
// 初始化依赖读取器
|
|
615
|
+
this.reader = new DependencyReader(this.options.packageJsonPath);
|
|
616
|
+
// 自动检测框架
|
|
617
|
+
if (this.options.framework === 'auto') {
|
|
618
|
+
this.options.framework = this.reader.detectFramework();
|
|
619
|
+
if (this.options.debug) {
|
|
620
|
+
console.log("\uD83D\uDD0D Detected framework: " + this.options.framework);
|
|
621
|
+
}
|
|
622
|
+
}
|
|
623
|
+
// 初始化分类器
|
|
624
|
+
this.classifier = new DependencyClassifier(this.options.framework, this.options.customRules, this.options.exclude);
|
|
625
|
+
}
|
|
626
|
+
/**
|
|
627
|
+
* 分析依赖
|
|
628
|
+
*/
|
|
629
|
+
ChunkOptimizer.prototype.analyze = function () {
|
|
630
|
+
var dependencies = this.reader.getDependencies();
|
|
631
|
+
var classified = this.classifier.classifyAll(dependencies);
|
|
632
|
+
var stats = this.classifier.getCategoryStats(classified);
|
|
633
|
+
return {
|
|
634
|
+
dependencies: classified,
|
|
635
|
+
detectedFramework: this.options.framework,
|
|
636
|
+
categoryStats: stats,
|
|
637
|
+
};
|
|
638
|
+
};
|
|
639
|
+
/**
|
|
640
|
+
* 生成 manualChunks 函数
|
|
641
|
+
*/
|
|
642
|
+
ChunkOptimizer.prototype.generate = function () {
|
|
643
|
+
if (this.generator) {
|
|
644
|
+
return this.generator.generate();
|
|
645
|
+
}
|
|
646
|
+
// 分析依赖
|
|
647
|
+
var result = this.analyze();
|
|
648
|
+
// 如果开启调试模式,打印分类信息
|
|
649
|
+
if (this.options.debug) {
|
|
650
|
+
this.classifier.printClassification(result.dependencies);
|
|
651
|
+
}
|
|
652
|
+
// 创建生成器
|
|
653
|
+
this.generator = new ChunkGenerator(result.dependencies, this.options.sourceCodeStrategy, this.options.debug);
|
|
654
|
+
// 如果开启调试模式,打印统计信息
|
|
655
|
+
if (this.options.debug) {
|
|
656
|
+
this.generator.printStats();
|
|
657
|
+
}
|
|
658
|
+
return this.generator.generate();
|
|
659
|
+
};
|
|
660
|
+
/**
|
|
661
|
+
* 获取分析结果
|
|
662
|
+
*/
|
|
663
|
+
ChunkOptimizer.prototype.getAnalysisResult = function () {
|
|
664
|
+
return this.analyze();
|
|
665
|
+
};
|
|
666
|
+
/**
|
|
667
|
+
* 打印分析报告
|
|
668
|
+
*/
|
|
669
|
+
ChunkOptimizer.prototype.printReport = function () {
|
|
670
|
+
var result = this.analyze();
|
|
671
|
+
console.log('\n' + '='.repeat(60));
|
|
672
|
+
console.log('📦 Vite Chunk Optimizer - Analysis Report');
|
|
673
|
+
console.log('='.repeat(60) + '\n');
|
|
674
|
+
console.log("Framework: " + result.detectedFramework);
|
|
675
|
+
console.log("Strategy: " + this.options.strategy);
|
|
676
|
+
console.log("Total Dependencies: " + result.dependencies.length + "\n");
|
|
677
|
+
console.log('Chunk Distribution:');
|
|
678
|
+
Object.entries(result.categoryStats)
|
|
679
|
+
.sort(function (_a, _b) {
|
|
680
|
+
var a = _a[1];
|
|
681
|
+
var b = _b[1];
|
|
682
|
+
return b - a;
|
|
683
|
+
})
|
|
684
|
+
.forEach(function (_a) {
|
|
685
|
+
var category = _a[0], count = _a[1];
|
|
686
|
+
var percentage = ((count / result.dependencies.length) * 100).toFixed(1);
|
|
687
|
+
console.log(" " + category.padEnd(25) + " " + count.toString().padStart(3) + " (" + percentage + "%)");
|
|
688
|
+
});
|
|
689
|
+
console.log('\n' + '='.repeat(60) + '\n');
|
|
690
|
+
};
|
|
691
|
+
return ChunkOptimizer;
|
|
692
|
+
}());
|
|
693
|
+
/**
|
|
694
|
+
* 创建 Chunk 优化器(工厂函数)
|
|
695
|
+
*/
|
|
696
|
+
function createChunkOptimizer(options) {
|
|
697
|
+
if (options === void 0) { options = {}; }
|
|
698
|
+
return new ChunkOptimizer(options);
|
|
699
|
+
}
|
|
700
|
+
|
|
701
|
+
exports.ChunkOptimizer = ChunkOptimizer;
|
|
702
|
+
exports.createChunkOptimizer = createChunkOptimizer;
|
|
703
|
+
exports["default"] = createChunkOptimizer;
|