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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 fireworks
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,498 @@
1
+ # @fireworks/dev-standard-cli
2
+
3
+ [![npm version](https://img.shields.io/npm/v/@fireworks/dev-standard-cli.svg)](https://www.npmjs.com/package/@fireworks/dev-standard-cli)
4
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
5
+
6
+ > 企业级前端研发标准化脚手架 - 10 秒完成项目环境准备,实现代码质量闭环
7
+
8
+ ## ✨ 核心特性
9
+
10
+ ### 🔧 研发标准化流水线
11
+ - **物理拦截机制**:集成 Husky + Commitlint + ESLint + Prettier,在 Git 提交阶段强制代码质量检查
12
+ - **零配置启动**:开箱即用的代码规范配置,无需手动调整
13
+ - **团队协作保障**:统一代码风格,消除 "在我电脑上能跑" 问题
14
+
15
+ ### 🌐 高可用网络层
16
+ - **指数退避重试**:智能重试算法,弱网环境下接口成功率 > 95%
17
+ - **熔断保护**:自动识别故障服务,防止雪崩效应
18
+ - **全局拦截器**:统一处理认证、日志、错误等横切关注点
19
+
20
+ ### ⚡ 自动化初始化
21
+ - **一键交付**:通过 execa 实现项目初始化自动化
22
+ - **10 秒启动**:自动完成 Git 初始化、依赖安装、Husky 钩子配置
23
+ - **智能检测**:自动识别 pnpm/yarn/npm 包管理器
24
+
25
+ ---
26
+
27
+ ## 📦 安装
28
+
29
+ ### 全局安装(推荐)
30
+
31
+ ```bash
32
+ npm install -g @fireworks/dev-standard-cli
33
+ # 或
34
+ pnpm add -g @fireworks/dev-standard-cli
35
+ # 或
36
+ yarn global add @fireworks/dev-standard-cli
37
+ ```
38
+
39
+ ### 临时使用
40
+
41
+ ```bash
42
+ npx @fireworks/dev-standard-cli init my-project
43
+ ```
44
+
45
+ ---
46
+
47
+ ## 🚀 快速开始
48
+
49
+ ### 1. 初始化项目
50
+
51
+ ```bash
52
+ # 交互式创建
53
+ dev-standard init
54
+
55
+ # 直接指定项目名
56
+ dev-standard init my-awesome-project
57
+ ```
58
+
59
+ **执行流程(10 秒内完成):**
60
+ 1. ✅ 创建项目目录
61
+ 2. ✅ 初始化 Git 仓库
62
+ 3. ✅ 复制配置文件(ESLint、Prettier、Commitlint)
63
+ 4. ✅ 生成 package.json
64
+ 5. ✅ 自动安装依赖
65
+ 6. ✅ 配置 Husky Git 钩子
66
+
67
+ ### 2. 开始开发
68
+
69
+ ```bash
70
+ cd my-awesome-project
71
+
72
+ # 运行代码检查
73
+ npm run lint
74
+
75
+ # 自动修复问题
76
+ npm run lint:fix
77
+
78
+ # 格式化代码
79
+ npm run format
80
+
81
+ # 提交代码(会自动触发检查)
82
+ git add .
83
+ git commit -m "feat: 添加用户登录功能"
84
+ ```
85
+
86
+ ---
87
+
88
+ ## 📖 命令行工具
89
+
90
+ ### `dev-standard init [project-name]`
91
+ 初始化一个标准化项目
92
+
93
+ ```bash
94
+ dev-standard init my-project
95
+ ```
96
+
97
+ ### `dev-standard test-http`
98
+ 测试网络层功能(重试机制、熔断器)
99
+
100
+ ```bash
101
+ # 使用默认 URL 测试
102
+ dev-standard test-http
103
+
104
+ # 指定 URL 测试
105
+ dev-standard test-http -u https://api.example.com/data
106
+ ```
107
+
108
+ ### `dev-standard info`
109
+ 显示工具链配置信息
110
+
111
+ ```bash
112
+ dev-standard info
113
+ ```
114
+
115
+ ---
116
+
117
+ ## 🔨 集成的工具链
118
+
119
+ | 工具 | 版本 | 作用 |
120
+ |------|------|------|
121
+ | **Husky** | ^8.0.3 | Git 钩子管理,在提交时自动执行检查 |
122
+ | **Commitlint** | ^17.8.1 | 强制 Commit 信息规范 |
123
+ | **ESLint** | ^8.57.0 | JavaScript/TypeScript 代码质量检查 |
124
+ | **Prettier** | ^3.2.5 | 代码格式化工具 |
125
+ | **Lint-staged** | ^15.2.2 | 只检查暂存区文件,提升速度 |
126
+ | **TypeScript** | ^5.4.5 | 类型检查 |
127
+
128
+ ---
129
+
130
+ ## 📝 Commit 规范
131
+
132
+ 采用 [Conventional Commits](https://www.conventionalcommits.org/) 规范:
133
+
134
+ ```bash
135
+ <type>: <subject>
136
+
137
+ # 示例
138
+ feat: 添加用户登录功能
139
+ fix: 修复登录页面样式错误
140
+ docs: 更新 API 文档
141
+ style: 格式化代码
142
+ refactor: 重构用户模块
143
+ perf: 优化列表渲染性能
144
+ test: 添加单元测试
145
+ chore: 更新依赖包
146
+ ```
147
+
148
+ ### Type 类型说明
149
+
150
+ | Type | 说明 |
151
+ |------|------|
152
+ | `feat` | 新功能 |
153
+ | `fix` | 修复 bug |
154
+ | `docs` | 文档变更 |
155
+ | `style` | 代码格式(不影响代码运行) |
156
+ | `refactor` | 重构(既不是新增功能,也不是修改 bug) |
157
+ | `perf` | 性能优化 |
158
+ | `test` | 增加测试 |
159
+ | `chore` | 构建过程或辅助工具的变动 |
160
+ | `revert` | 回退 |
161
+ | `build` | 打包 |
162
+
163
+ ---
164
+
165
+ ## 🌐 网络层使用指南
166
+
167
+ ### 基础使用
168
+
169
+ ```typescript
170
+ import { HttpClient } from '@fireworks/dev-standard-cli/dist/http';
171
+
172
+ // 创建实例
173
+ const http = new HttpClient({
174
+ baseURL: 'https://api.example.com',
175
+ timeout: 10000,
176
+ });
177
+
178
+ // 发送请求
179
+ const data = await http.get('/users');
180
+ const result = await http.post('/login', { username, password });
181
+ ```
182
+
183
+ ### 高级配置
184
+
185
+ ```typescript
186
+ const http = new HttpClient({
187
+ baseURL: 'https://api.example.com',
188
+ timeout: 10000,
189
+
190
+ // 重试配置
191
+ retry: true, // 启用重试
192
+ retryCount: 3, // 最大重试次数
193
+ retryDelay: 1000, // 重试基础延迟(毫秒)
194
+
195
+ // 熔断器配置
196
+ circuitBreaker: true, // 启用熔断
197
+ failureThreshold: 5, // 失败阈值
198
+ recoveryTimeout: 60000, // 恢复时间(毫秒)
199
+ });
200
+ ```
201
+
202
+ ### 单个请求配置
203
+
204
+ ```typescript
205
+ // 禁用某个请求的重试
206
+ await http.get('/critical-data', {
207
+ retry: false,
208
+ timeout: 5000,
209
+ });
210
+
211
+ // 禁用熔断器
212
+ await http.post('/user', data, {
213
+ circuitBreaker: false,
214
+ });
215
+ ```
216
+
217
+ ### 核心机制详解
218
+
219
+ #### 1️⃣ 指数退避重试算法
220
+
221
+ ```
222
+ 第 1 次失败:等待 1000ms + 随机抖动(0-1000ms)
223
+ 第 2 次失败:等待 2000ms + 随机抖动(0-1000ms)
224
+ 第 3 次失败:等待 4000ms + 随机抖动(0-1000ms)
225
+ 最大延迟:30000ms
226
+ ```
227
+
228
+ **重试条件**:
229
+ - 网络错误(无响应)
230
+ - 5xx 服务器错误
231
+ - 408 请求超时
232
+ - 429 请求过多
233
+
234
+ #### 2️⃣ 熔断器模式
235
+
236
+ ```
237
+ 状态流转:
238
+ CLOSED(正常) → OPEN(熔断) → HALF_OPEN(尝试恢复) → CLOSED
239
+ ```
240
+
241
+ **触发条件**:
242
+ - 连续失败 5 次(可配置)→ 进入 OPEN 状态
243
+ - OPEN 状态持续 60 秒(可配置)→ 进入 HALF_OPEN 状态
244
+ - HALF_OPEN 状态下请求成功 → 恢复 CLOSED 状态
245
+
246
+ #### 3️⃣ 全局拦截器
247
+
248
+ **请求拦截器**:
249
+ - GET 请求自动添加时间戳防缓存
250
+ - 自动注入 Authorization Token
251
+ - 请求日志记录
252
+
253
+ **响应拦截器**:
254
+ - 统一错误处理
255
+ - 自动重试逻辑
256
+ - 响应日志记录
257
+
258
+ ### 获取熔断器状态
259
+
260
+ ```typescript
261
+ const state = http.getCircuitBreakerState();
262
+ console.log(state); // 'CLOSED' | 'OPEN' | 'HALF_OPEN'
263
+ ```
264
+
265
+ ---
266
+
267
+ ## 📁 项目结构
268
+
269
+ 初始化后的项目结构:
270
+
271
+ ```
272
+ my-project/
273
+ ├── .husky/ # Husky Git 钩子
274
+ │ ├── commit-msg # Commit 信息检查
275
+ │ └── pre-commit # 提交前代码检查
276
+ ├── node_modules/
277
+ ├── .eslintrc.js # ESLint 配置
278
+ ├── .prettierrc.js # Prettier 配置
279
+ ├── .lintstagedrc.json # Lint-staged 配置
280
+ ├── commitlint.config.js # Commitlint 配置
281
+ ├── .gitignore
282
+ ├── package.json
283
+ └── README.md
284
+ ```
285
+
286
+ ---
287
+
288
+ ## 🔧 配置文件说明
289
+
290
+ ### ESLint 配置 (`.eslintrc.js`)
291
+
292
+ ```javascript
293
+ module.exports = {
294
+ env: {
295
+ browser: true,
296
+ es2021: true,
297
+ node: true,
298
+ },
299
+ extends: [
300
+ 'eslint:recommended',
301
+ 'plugin:@typescript-eslint/recommended',
302
+ 'plugin:prettier/recommended',
303
+ ],
304
+ parser: '@typescript-eslint/parser',
305
+ plugins: ['@typescript-eslint', 'prettier'],
306
+ rules: {
307
+ 'prettier/prettier': 'error',
308
+ '@typescript-eslint/no-explicit-any': 'warn',
309
+ // ... 更多规则
310
+ },
311
+ };
312
+ ```
313
+
314
+ ### Prettier 配置 (`.prettierrc.js`)
315
+
316
+ ```javascript
317
+ module.exports = {
318
+ semi: true,
319
+ singleQuote: true,
320
+ tabWidth: 2,
321
+ trailingComma: 'es5',
322
+ printWidth: 100,
323
+ arrowParens: 'always',
324
+ endOfLine: 'lf',
325
+ };
326
+ ```
327
+
328
+ ### Commitlint 配置 (`commitlint.config.js`)
329
+
330
+ ```javascript
331
+ module.exports = {
332
+ extends: ['@commitlint/config-conventional'],
333
+ rules: {
334
+ 'type-enum': [2, 'always', [
335
+ 'feat', 'fix', 'docs', 'style', 'refactor',
336
+ 'perf', 'test', 'chore', 'revert', 'build'
337
+ ]],
338
+ },
339
+ };
340
+ ```
341
+
342
+ ---
343
+
344
+ ## 💡 最佳实践
345
+
346
+ ### 1. 提交代码前
347
+
348
+ ```bash
349
+ # 运行检查
350
+ npm run lint
351
+
352
+ # 自动修复
353
+ npm run lint:fix
354
+
355
+ # 格式化代码
356
+ npm run format
357
+
358
+ # 提交
359
+ git add .
360
+ git commit -m "feat: 添加新功能"
361
+ ```
362
+
363
+ ### 2. 网络层使用
364
+
365
+ ```typescript
366
+ // ✅ 推荐:使用默认实例
367
+ import { http } from '@fireworks/dev-standard-cli/dist/http';
368
+ await http.get('/api/users');
369
+
370
+ // ✅ 推荐:创建自定义实例
371
+ const customHttp = new HttpClient({
372
+ baseURL: process.env.API_BASE_URL,
373
+ timeout: 15000,
374
+ retry: true,
375
+ });
376
+
377
+ // ❌ 避免:频繁创建实例
378
+ for (let i = 0; i < 100; i++) {
379
+ const http = new HttpClient(); // 浪费资源
380
+ await http.get('/api/data');
381
+ }
382
+ ```
383
+
384
+ ### 3. 团队协作
385
+
386
+ 1. **统一包管理器**:建议团队统一使用 pnpm 或 yarn
387
+ 2. **锁定依赖版本**:提交 `package-lock.json` 或 `pnpm-lock.yaml`
388
+ 3. **配置编辑器**:安装 ESLint 和 Prettier 插件,启用保存时自动修复
389
+
390
+ ---
391
+
392
+ ## 🎯 性能指标
393
+
394
+ | 指标 | 说明 | 数据 |
395
+ |------|------|------|
396
+ | **初始化速度** | 完整项目初始化耗时 | < 10 秒 |
397
+ | **网络成功率** | 弱网环境下接口成功率 | > 95% |
398
+ | **代码检查** | 单次 Lint 检查速度 | < 3 秒 |
399
+ | **包体积** | 安装后占用空间 | ~50MB |
400
+
401
+ ---
402
+
403
+ ## 🤝 贡献指南
404
+
405
+ 欢迎提交 Issue 和 Pull Request!
406
+
407
+ ```bash
408
+ # 克隆项目
409
+ git clone https://github.com/fireworks/dev-standard-cli.git
410
+
411
+ # 安装依赖
412
+ pnpm install
413
+
414
+ # 构建项目
415
+ npm run build
416
+
417
+ # 本地测试
418
+ npm link
419
+ dev-standard init test-project
420
+ ```
421
+
422
+ ---
423
+
424
+ ## 📄 License
425
+
426
+ MIT © [fireworks]
427
+
428
+ ---
429
+
430
+ ## 🔗 相关链接
431
+
432
+ - [Conventional Commits](https://www.conventionalcommits.org/)
433
+ - [ESLint](https://eslint.org/)
434
+ - [Prettier](https://prettier.io/)
435
+ - [Husky](https://typicode.github.io/husky/)
436
+ - [Commitlint](https://commitlint.js.org/)
437
+
438
+ ---
439
+
440
+ ## ❓ 常见问题
441
+
442
+ ### Q1: 为什么提交时会卡住?
443
+ **A:** 首次提交时会安装 Husky 钩子,需要等待几秒。后续提交不会出现此问题。
444
+
445
+ ### Q2: 如何跳过 Commit 检查?
446
+ **A:** 不推荐跳过检查,但紧急情况下可以使用:
447
+ ```bash
448
+ git commit -m "feat: xxx" --no-verify
449
+ ```
450
+
451
+ ### Q3: 网络层如何处理 Token 过期?
452
+ **A:** 需要在响应拦截器中自定义处理:
453
+ ```typescript
454
+ const http = new HttpClient();
455
+ const instance = http.getAxiosInstance();
456
+
457
+ instance.interceptors.response.use(
458
+ (response) => response,
459
+ async (error) => {
460
+ if (error.response?.status === 401) {
461
+ // 刷新 Token 逻辑
462
+ const newToken = await refreshToken();
463
+ localStorage.setItem('auth_token', newToken);
464
+ // 重新请求
465
+ return instance.request(error.config);
466
+ }
467
+ return Promise.reject(error);
468
+ }
469
+ );
470
+ ```
471
+
472
+ ### Q4: 如何自定义配置?
473
+ **A:** 初始化后,可以直接修改项目中的配置文件:
474
+ - `.eslintrc.js` - ESLint 规则
475
+ - `.prettierrc.js` - Prettier 格式
476
+ - `commitlint.config.js` - Commit 规范
477
+
478
+ ### Q5: 支持哪些项目类型?
479
+ **A:** 支持所有前端项目,包括:
480
+ - React / Vue / Angular
481
+ - Node.js 后端
482
+ - TypeScript 项目
483
+ - 纯 JavaScript 项目
484
+
485
+ ---
486
+
487
+ ## 🎉 致谢
488
+
489
+ 感谢以下开源项目:
490
+ - [Husky](https://github.com/typicode/husky)
491
+ - [ESLint](https://github.com/eslint/eslint)
492
+ - [Prettier](https://github.com/prettier/prettier)
493
+ - [Axios](https://github.com/axios/axios)
494
+ - [Execa](https://github.com/sindresorhus/execa)
495
+ - [Commander.js](https://github.com/tj/commander.js)
496
+ - [Inquirer.js](https://github.com/SBoudrias/Inquirer.js)
497
+ - [Ora](https://github.com/sindresorhus/ora)
498
+ - [Chalk](https://github.com/chalk/chalk)
package/bin/cli.js ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+
3
+ require('../dist/index.js');
@@ -0,0 +1,86 @@
1
+ import { AxiosInstance, AxiosRequestConfig } from 'axios';
2
+ /**
3
+ * 网络请求配置接口
4
+ */
5
+ export interface RequestConfig extends AxiosRequestConfig {
6
+ /** 是否启用重试机制 */
7
+ retry?: boolean;
8
+ /** 最大重试次数 */
9
+ retryCount?: number;
10
+ /** 重试延迟基数(毫秒) */
11
+ retryDelay?: number;
12
+ /** 是否启用熔断 */
13
+ circuitBreaker?: boolean;
14
+ /** 熔断失败阈值 */
15
+ failureThreshold?: number;
16
+ /** 熔断恢复时间(毫秒) */
17
+ recoveryTimeout?: number;
18
+ }
19
+ /**
20
+ * 高级 Axios 网络层封装
21
+ */
22
+ export declare class HttpClient {
23
+ private instance;
24
+ private circuitBreaker;
25
+ private defaultConfig;
26
+ constructor(config?: RequestConfig);
27
+ /**
28
+ * 配置拦截器
29
+ */
30
+ private setupInterceptors;
31
+ /**
32
+ * 处理响应错误
33
+ */
34
+ private handleResponseError;
35
+ /**
36
+ * 判断错误是否可重试
37
+ */
38
+ private isRetryableError;
39
+ /**
40
+ * 计算指数退避延迟
41
+ */
42
+ private calculateRetryDelay;
43
+ /**
44
+ * 延迟函数
45
+ */
46
+ private sleep;
47
+ /**
48
+ * 标准化错误信息
49
+ */
50
+ private normalizeError;
51
+ /**
52
+ * 获取认证 token(示例方法,需根据实际情况实现)
53
+ */
54
+ private getToken;
55
+ /**
56
+ * GET 请求
57
+ */
58
+ get<T = any>(url: string, config?: RequestConfig): Promise<T>;
59
+ /**
60
+ * POST 请求
61
+ */
62
+ post<T = any>(url: string, data?: any, config?: RequestConfig): Promise<T>;
63
+ /**
64
+ * PUT 请求
65
+ */
66
+ put<T = any>(url: string, data?: any, config?: RequestConfig): Promise<T>;
67
+ /**
68
+ * DELETE 请求
69
+ */
70
+ delete<T = any>(url: string, config?: RequestConfig): Promise<T>;
71
+ /**
72
+ * 获取原始 Axios 实例
73
+ */
74
+ getAxiosInstance(): AxiosInstance;
75
+ /**
76
+ * 获取熔断器状态
77
+ */
78
+ getCircuitBreakerState(): string;
79
+ }
80
+ export declare const http: HttpClient;
81
+ declare module 'axios' {
82
+ interface AxiosRequestConfig {
83
+ __retryCount?: number;
84
+ }
85
+ }
86
+ //# sourceMappingURL=HttpClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HttpClient.d.ts","sourceRoot":"","sources":["../../src/http/HttpClient.ts"],"names":[],"mappings":"AAAA,OAAc,EAAE,aAAa,EAAE,kBAAkB,EAA6B,MAAM,OAAO,CAAC;AAE5F;;GAEG;AACH,MAAM,WAAW,aAAc,SAAQ,kBAAkB;IACvD,eAAe;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,aAAa;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa;IACb,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa;IACb,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AA8DD;;GAEG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,aAAa,CAQnB;gBAEU,MAAM,GAAE,aAAkB;IAUtC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAuCzB;;OAEG;YACW,mBAAmB;IAuCjC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAWxB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAO3B;;OAEG;IACH,OAAO,CAAC,KAAK;IAIb;;OAEG;IACH,OAAO,CAAC,cAAc;IAUtB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAShB;;OAEG;IACU,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC;IAU1E;;OAEG;IACU,IAAI,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC;IAUvF;;OAEG;IACU,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC;IAUtF;;OAEG;IACU,MAAM,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC;IAU7E;;OAEG;IACI,gBAAgB,IAAI,aAAa;IAIxC;;OAEG;IACI,sBAAsB,IAAI,MAAM;CAGxC;AAGD,eAAO,MAAM,IAAI,YAGf,CAAC;AAGH,OAAO,QAAQ,OAAO,CAAC;IACrB,UAAiB,kBAAkB;QACjC,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB;CACF"}