dev-standard-cli 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,247 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.http = exports.HttpClient = void 0;
7
+ const axios_1 = __importDefault(require("axios"));
8
+ /**
9
+ * 熔断器状态
10
+ */
11
+ var CircuitState;
12
+ (function (CircuitState) {
13
+ CircuitState["CLOSED"] = "CLOSED";
14
+ CircuitState["OPEN"] = "OPEN";
15
+ CircuitState["HALF_OPEN"] = "HALF_OPEN"; // 半开状态(尝试恢复)
16
+ })(CircuitState || (CircuitState = {}));
17
+ /**
18
+ * 熔断器类
19
+ */
20
+ class CircuitBreaker {
21
+ constructor(failureThreshold = 5, recoveryTimeout = 60000) {
22
+ this.state = CircuitState.CLOSED;
23
+ this.failureCount = 0;
24
+ this.nextAttempt = Date.now();
25
+ this.failureThreshold = failureThreshold;
26
+ this.recoveryTimeout = recoveryTimeout;
27
+ }
28
+ async execute(fn) {
29
+ if (this.state === CircuitState.OPEN) {
30
+ if (Date.now() < this.nextAttempt) {
31
+ throw new Error('Circuit breaker is OPEN - 熔断器已开启,请求被拒绝');
32
+ }
33
+ this.state = CircuitState.HALF_OPEN;
34
+ }
35
+ try {
36
+ const result = await fn();
37
+ this.onSuccess();
38
+ return result;
39
+ }
40
+ catch (error) {
41
+ this.onFailure();
42
+ throw error;
43
+ }
44
+ }
45
+ onSuccess() {
46
+ this.failureCount = 0;
47
+ this.state = CircuitState.CLOSED;
48
+ }
49
+ onFailure() {
50
+ this.failureCount++;
51
+ if (this.failureCount >= this.failureThreshold) {
52
+ this.state = CircuitState.OPEN;
53
+ this.nextAttempt = Date.now() + this.recoveryTimeout;
54
+ }
55
+ }
56
+ getState() {
57
+ return this.state;
58
+ }
59
+ }
60
+ /**
61
+ * 高级 Axios 网络层封装
62
+ */
63
+ class HttpClient {
64
+ constructor(config = {}) {
65
+ this.defaultConfig = {
66
+ timeout: 10000,
67
+ retry: true,
68
+ retryCount: 3,
69
+ retryDelay: 1000,
70
+ circuitBreaker: true,
71
+ failureThreshold: 5,
72
+ recoveryTimeout: 60000,
73
+ };
74
+ this.defaultConfig = { ...this.defaultConfig, ...config };
75
+ this.instance = axios_1.default.create(this.defaultConfig);
76
+ this.circuitBreaker = new CircuitBreaker(this.defaultConfig.failureThreshold, this.defaultConfig.recoveryTimeout);
77
+ this.setupInterceptors();
78
+ }
79
+ /**
80
+ * 配置拦截器
81
+ */
82
+ setupInterceptors() {
83
+ // 请求拦截器
84
+ this.instance.interceptors.request.use((config) => {
85
+ // 添加时间戳防止缓存
86
+ if (config.method === 'get') {
87
+ config.params = {
88
+ ...config.params,
89
+ _t: Date.now(),
90
+ };
91
+ }
92
+ // 添加认证 token(示例)
93
+ const token = this.getToken();
94
+ if (token) {
95
+ config.headers.Authorization = `Bearer ${token}`;
96
+ }
97
+ console.log(`[HTTP] 请求开始: ${config.method?.toUpperCase()} ${config.url}`);
98
+ return config;
99
+ }, (error) => {
100
+ console.error('[HTTP] 请求配置错误:', error);
101
+ return Promise.reject(error);
102
+ });
103
+ // 响应拦截器
104
+ this.instance.interceptors.response.use((response) => {
105
+ console.log(`[HTTP] 请求成功: ${response.config.url} - 状态码: ${response.status}`);
106
+ return response;
107
+ }, async (error) => {
108
+ return this.handleResponseError(error);
109
+ });
110
+ }
111
+ /**
112
+ * 处理响应错误
113
+ */
114
+ async handleResponseError(error) {
115
+ const config = error.config;
116
+ if (!config) {
117
+ return Promise.reject(error);
118
+ }
119
+ // 初始化重试计数
120
+ config.retryCount = config.retryCount ?? this.defaultConfig.retryCount ?? 3;
121
+ config.__retryCount = config.__retryCount ?? 0;
122
+ // 判断是否需要重试
123
+ const shouldRetry = config.retry !== false &&
124
+ config.__retryCount < config.retryCount &&
125
+ this.isRetryableError(error);
126
+ if (shouldRetry) {
127
+ config.__retryCount++;
128
+ const delay = this.calculateRetryDelay(config.__retryCount, config.retryDelay);
129
+ console.warn(`[HTTP] 请求失败,${delay}ms 后进行第 ${config.__retryCount} 次重试: ${config.url}`);
130
+ await this.sleep(delay);
131
+ return this.instance.request(config);
132
+ }
133
+ // 错误日志
134
+ console.error(`[HTTP] 请求最终失败: ${config.url}`, {
135
+ status: error.response?.status,
136
+ message: error.message,
137
+ retries: config.__retryCount,
138
+ });
139
+ return Promise.reject(this.normalizeError(error));
140
+ }
141
+ /**
142
+ * 判断错误是否可重试
143
+ */
144
+ isRetryableError(error) {
145
+ if (!error.response) {
146
+ // 网络错误(无响应)
147
+ return true;
148
+ }
149
+ const status = error.response.status;
150
+ // 5xx 服务器错误、408 请求超时、429 请求过多
151
+ return status >= 500 || status === 408 || status === 429;
152
+ }
153
+ /**
154
+ * 计算指数退避延迟
155
+ */
156
+ calculateRetryDelay(retryCount, baseDelay = 1000) {
157
+ // 指数退避算法: delay = baseDelay * (2 ^ retryCount) + 随机抖动
158
+ const exponentialDelay = baseDelay * Math.pow(2, retryCount - 1);
159
+ const jitter = Math.random() * 1000; // 0-1000ms 随机抖动
160
+ return Math.min(exponentialDelay + jitter, 30000); // 最大 30 秒
161
+ }
162
+ /**
163
+ * 延迟函数
164
+ */
165
+ sleep(ms) {
166
+ return new Promise((resolve) => setTimeout(resolve, ms));
167
+ }
168
+ /**
169
+ * 标准化错误信息
170
+ */
171
+ normalizeError(error) {
172
+ return {
173
+ message: error.message,
174
+ status: error.response?.status,
175
+ statusText: error.response?.statusText,
176
+ data: error.response?.data,
177
+ code: error.code,
178
+ };
179
+ }
180
+ /**
181
+ * 获取认证 token(示例方法,需根据实际情况实现)
182
+ */
183
+ getToken() {
184
+ // 从 localStorage、sessionStorage 或其他存储中获取
185
+ const storage = globalThis.localStorage;
186
+ return storage?.getItem('auth_token') ?? null;
187
+ }
188
+ /**
189
+ * GET 请求
190
+ */
191
+ async get(url, config) {
192
+ const request = () => this.instance.get(url, config).then((res) => res.data);
193
+ if (config?.circuitBreaker !== false && this.defaultConfig.circuitBreaker) {
194
+ return this.circuitBreaker.execute(request);
195
+ }
196
+ return request();
197
+ }
198
+ /**
199
+ * POST 请求
200
+ */
201
+ async post(url, data, config) {
202
+ const request = () => this.instance.post(url, data, config).then((res) => res.data);
203
+ if (config?.circuitBreaker !== false && this.defaultConfig.circuitBreaker) {
204
+ return this.circuitBreaker.execute(request);
205
+ }
206
+ return request();
207
+ }
208
+ /**
209
+ * PUT 请求
210
+ */
211
+ async put(url, data, config) {
212
+ const request = () => this.instance.put(url, data, config).then((res) => res.data);
213
+ if (config?.circuitBreaker !== false && this.defaultConfig.circuitBreaker) {
214
+ return this.circuitBreaker.execute(request);
215
+ }
216
+ return request();
217
+ }
218
+ /**
219
+ * DELETE 请求
220
+ */
221
+ async delete(url, config) {
222
+ const request = () => this.instance.delete(url, config).then((res) => res.data);
223
+ if (config?.circuitBreaker !== false && this.defaultConfig.circuitBreaker) {
224
+ return this.circuitBreaker.execute(request);
225
+ }
226
+ return request();
227
+ }
228
+ /**
229
+ * 获取原始 Axios 实例
230
+ */
231
+ getAxiosInstance() {
232
+ return this.instance;
233
+ }
234
+ /**
235
+ * 获取熔断器状态
236
+ */
237
+ getCircuitBreakerState() {
238
+ return this.circuitBreaker.getState();
239
+ }
240
+ }
241
+ exports.HttpClient = HttpClient;
242
+ // 默认导出实例
243
+ exports.http = new HttpClient({
244
+ baseURL: process.env.API_BASE_URL || '',
245
+ timeout: 10000,
246
+ });
247
+ //# sourceMappingURL=HttpClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HttpClient.js","sourceRoot":"","sources":["../../src/http/HttpClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { HttpClient, http, RequestConfig } from './HttpClient';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.http = exports.HttpClient = void 0;
4
+ var HttpClient_1 = require("./HttpClient");
5
+ Object.defineProperty(exports, "HttpClient", { enumerable: true, get: function () { return HttpClient_1.HttpClient; } });
6
+ Object.defineProperty(exports, "http", { enumerable: true, get: function () { return HttpClient_1.http; } });
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":";;;AAAA,2CAA+D;AAAtD,wGAAA,UAAU,OAAA;AAAE,kGAAA,IAAI,OAAA"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,144 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ var __importDefault = (this && this.__importDefault) || function (mod) {
37
+ return (mod && mod.__esModule) ? mod : { "default": mod };
38
+ };
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ const commander_1 = require("commander");
41
+ const inquirer_1 = __importDefault(require("inquirer"));
42
+ const chalk_1 = __importDefault(require("chalk"));
43
+ const path = __importStar(require("path"));
44
+ const init_1 = require("./init");
45
+ const http_1 = require("./http");
46
+ const program = new commander_1.Command();
47
+ program
48
+ .name('dev-standard')
49
+ .description('企业级前端研发标准化脚手架')
50
+ .version('1.0.0');
51
+ // 初始化命令
52
+ program
53
+ .command('init [project-name]')
54
+ .description('初始化一个标准化项目')
55
+ .action(async (projectName) => {
56
+ try {
57
+ let finalProjectName = projectName;
58
+ if (!finalProjectName) {
59
+ const answers = await inquirer_1.default.prompt([
60
+ {
61
+ type: 'input',
62
+ name: 'projectName',
63
+ message: '请输入项目名称:',
64
+ default: 'my-project',
65
+ validate: (input) => {
66
+ if (/^[a-z0-9-_]+$/.test(input)) {
67
+ return true;
68
+ }
69
+ return '项目名称只能包含小写字母、数字、连字符和下划线';
70
+ },
71
+ },
72
+ ]);
73
+ finalProjectName = answers.projectName;
74
+ }
75
+ if (!finalProjectName) {
76
+ throw new Error('Project name is required');
77
+ }
78
+ const projectPath = path.resolve(process.cwd(), finalProjectName);
79
+ await (0, init_1.quickInit)(projectPath);
80
+ }
81
+ catch (error) {
82
+ console.error(chalk_1.default.red('初始化失败:'), error);
83
+ process.exit(1);
84
+ }
85
+ });
86
+ // 网络层测试命令
87
+ program
88
+ .command('test-http')
89
+ .description('测试网络层功能')
90
+ .option('-u, --url <url>', '测试 URL', 'https://jsonplaceholder.typicode.com/posts/1')
91
+ .action(async (options) => {
92
+ try {
93
+ console.log(chalk_1.default.cyan('\n🧪 测试网络层功能...\n'));
94
+ const http = new http_1.HttpClient({
95
+ timeout: 5000,
96
+ retry: true,
97
+ retryCount: 3,
98
+ });
99
+ console.log(chalk_1.default.gray(`请求 URL: ${options.url}`));
100
+ console.log(chalk_1.default.gray(`熔断器状态: ${http.getCircuitBreakerState()}\n`));
101
+ const data = await http.get(options.url);
102
+ console.log(chalk_1.default.green('\n✅ 请求成功!'));
103
+ console.log(chalk_1.default.gray('响应数据:'));
104
+ console.log(JSON.stringify(data, null, 2));
105
+ console.log(chalk_1.default.gray(`\n熔断器状态: ${http.getCircuitBreakerState()}`));
106
+ }
107
+ catch (error) {
108
+ console.error(chalk_1.default.red('\n❌ 请求失败:'), error.message);
109
+ process.exit(1);
110
+ }
111
+ });
112
+ // 显示配置信息
113
+ program
114
+ .command('info')
115
+ .description('显示工具链配置信息')
116
+ .action(() => {
117
+ console.log(chalk_1.default.cyan.bold('\n📦 研发标准化工具链\n'));
118
+ console.log(chalk_1.default.white('✓ Husky - Git 钩子管理'));
119
+ console.log(chalk_1.default.white('✓ Commitlint - Commit 信息规范'));
120
+ console.log(chalk_1.default.white('✓ ESLint - 代码质量检查'));
121
+ console.log(chalk_1.default.white('✓ Prettier - 代码格式化'));
122
+ console.log(chalk_1.default.white('✓ Lint-staged - 暂存区文件检查'));
123
+ console.log(chalk_1.default.white('✓ TypeScript - 类型检查'));
124
+ console.log(chalk_1.default.white('✓ Axios 封装 - 指数退避重试 + 熔断机制\n'));
125
+ console.log(chalk_1.default.cyan.bold('📝 Commit 规范:\n'));
126
+ console.log(chalk_1.default.white(' feat: 新功能'));
127
+ console.log(chalk_1.default.white(' fix: 修复 bug'));
128
+ console.log(chalk_1.default.white(' docs: 文档变更'));
129
+ console.log(chalk_1.default.white(' style: 代码格式'));
130
+ console.log(chalk_1.default.white(' refactor: 重构'));
131
+ console.log(chalk_1.default.white(' perf: 性能优化'));
132
+ console.log(chalk_1.default.white(' test: 测试'));
133
+ console.log(chalk_1.default.white(' chore: 构建/工具变动'));
134
+ console.log(chalk_1.default.white(' revert: 回退'));
135
+ console.log(chalk_1.default.white(' build: 打包\n'));
136
+ console.log(chalk_1.default.cyan.bold('🌐 网络层特性:\n'));
137
+ console.log(chalk_1.default.white(' • 指数退避重试算法(最多 3 次)'));
138
+ console.log(chalk_1.default.white(' • 全局请求/响应拦截器'));
139
+ console.log(chalk_1.default.white(' • 熔断器模式(失败阈值:5 次)'));
140
+ console.log(chalk_1.default.white(' • 自动添加时间戳防缓存'));
141
+ console.log(chalk_1.default.white(' • 弱网环境成功率 > 95%\n'));
142
+ });
143
+ program.parse();
144
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * 初始化器类
3
+ */
4
+ export declare class Initializer {
5
+ private projectPath;
6
+ private projectName;
7
+ constructor(projectPath: string);
8
+ /**
9
+ * 执行完整初始化流程
10
+ */
11
+ initialize(): Promise<void>;
12
+ /**
13
+ * 创建项目目录
14
+ */
15
+ private createProjectDirectory;
16
+ /**
17
+ * 初始化 Git 仓库
18
+ */
19
+ private initializeGit;
20
+ /**
21
+ * 复制配置文件
22
+ */
23
+ private copyConfigFiles;
24
+ /**
25
+ * 创建 package.json
26
+ */
27
+ private createPackageJson;
28
+ /**
29
+ * 安装依赖
30
+ */
31
+ private installDependencies;
32
+ /**
33
+ * 检测包管理器
34
+ */
35
+ private detectPackageManager;
36
+ /**
37
+ * 设置 Husky
38
+ */
39
+ private setupHusky;
40
+ /**
41
+ * 打印成功信息
42
+ */
43
+ private printSuccessMessage;
44
+ }
45
+ /**
46
+ * 快速初始化函数
47
+ */
48
+ export declare function quickInit(projectPath: string): Promise<void>;
49
+ //# sourceMappingURL=Initializer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Initializer.d.ts","sourceRoot":"","sources":["../../src/init/Initializer.ts"],"names":[],"mappings":"AAMA;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAS;gBAEhB,WAAW,EAAE,MAAM;IAK/B;;OAEG;IACU,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAmBxC;;OAEG;YACW,sBAAsB;IAcpC;;OAEG;YACW,aAAa;IAgC3B;;OAEG;YACW,eAAe;IA4B7B;;OAEG;YACW,iBAAiB;IA6C/B;;OAEG;YACW,mBAAmB;IAoBjC;;OAEG;YACW,oBAAoB;IAclC;;OAEG;YACW,UAAU;IAqCxB;;OAEG;IACH,OAAO,CAAC,mBAAmB;CAgB5B;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGlE"}