maoda-commander-tt 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (222) hide show
  1. package/README.md +168 -0
  2. package/dist/bedrock/assert/assert.d.ts +5 -0
  3. package/dist/bedrock/assert/assert.d.ts.map +1 -0
  4. package/dist/bedrock/assert/assert.js +21 -0
  5. package/dist/bedrock/assert/assert.js.map +1 -0
  6. package/dist/bedrock/assert/index.d.ts +2 -0
  7. package/dist/bedrock/assert/index.d.ts.map +1 -0
  8. package/dist/bedrock/assert/index.js +3 -0
  9. package/dist/bedrock/assert/index.js.map +1 -0
  10. package/dist/bedrock/async/barrier.d.ts +20 -0
  11. package/dist/bedrock/async/barrier.d.ts.map +1 -0
  12. package/dist/bedrock/async/barrier.js +37 -0
  13. package/dist/bedrock/async/barrier.js.map +1 -0
  14. package/dist/bedrock/async/cancellation.d.ts +28 -0
  15. package/dist/bedrock/async/cancellation.d.ts.map +1 -0
  16. package/dist/bedrock/async/cancellation.js +156 -0
  17. package/dist/bedrock/async/cancellation.js.map +1 -0
  18. package/dist/bedrock/async/idle.d.ts +9 -0
  19. package/dist/bedrock/async/idle.d.ts.map +1 -0
  20. package/dist/bedrock/async/idle.js +2 -0
  21. package/dist/bedrock/async/idle.js.map +1 -0
  22. package/dist/bedrock/async/index.d.ts +7 -0
  23. package/dist/bedrock/async/index.d.ts.map +1 -0
  24. package/dist/bedrock/async/index.js +13 -0
  25. package/dist/bedrock/async/index.js.map +1 -0
  26. package/dist/bedrock/async/promise.d.ts +59 -0
  27. package/dist/bedrock/async/promise.d.ts.map +1 -0
  28. package/dist/bedrock/async/promise.js +124 -0
  29. package/dist/bedrock/async/promise.js.map +1 -0
  30. package/dist/bedrock/async/replace-token.d.ts +61 -0
  31. package/dist/bedrock/async/replace-token.d.ts.map +1 -0
  32. package/dist/bedrock/async/replace-token.js +86 -0
  33. package/dist/bedrock/async/replace-token.js.map +1 -0
  34. package/dist/bedrock/async/serial-async-task.d.ts +10 -0
  35. package/dist/bedrock/async/serial-async-task.d.ts.map +1 -0
  36. package/dist/bedrock/async/serial-async-task.js +101 -0
  37. package/dist/bedrock/async/serial-async-task.js.map +1 -0
  38. package/dist/bedrock/async/wait.d.ts +6 -0
  39. package/dist/bedrock/async/wait.d.ts.map +1 -0
  40. package/dist/bedrock/async/wait.js +8 -0
  41. package/dist/bedrock/async/wait.js.map +1 -0
  42. package/dist/bedrock/cache/index.d.ts +2 -0
  43. package/dist/bedrock/cache/index.d.ts.map +1 -0
  44. package/dist/bedrock/cache/index.js +2 -0
  45. package/dist/bedrock/cache/index.js.map +1 -0
  46. package/dist/bedrock/cache/lru.d.ts +14 -0
  47. package/dist/bedrock/cache/lru.d.ts.map +1 -0
  48. package/dist/bedrock/cache/lru.js +44 -0
  49. package/dist/bedrock/cache/lru.js.map +1 -0
  50. package/dist/bedrock/dispose/disposable-linked-list.d.ts +6 -0
  51. package/dist/bedrock/dispose/disposable-linked-list.d.ts.map +1 -0
  52. package/dist/bedrock/dispose/disposable-linked-list.js +26 -0
  53. package/dist/bedrock/dispose/disposable-linked-list.js.map +1 -0
  54. package/dist/bedrock/dispose/disposable-store.d.ts +12 -0
  55. package/dist/bedrock/dispose/disposable-store.d.ts.map +1 -0
  56. package/dist/bedrock/dispose/disposable-store.js +61 -0
  57. package/dist/bedrock/dispose/disposable-store.js.map +1 -0
  58. package/dist/bedrock/dispose/disposable-t.d.ts +25 -0
  59. package/dist/bedrock/dispose/disposable-t.d.ts.map +1 -0
  60. package/dist/bedrock/dispose/disposable-t.js +85 -0
  61. package/dist/bedrock/dispose/disposable-t.js.map +1 -0
  62. package/dist/bedrock/dispose/disposable-utils.d.ts +6 -0
  63. package/dist/bedrock/dispose/disposable-utils.d.ts.map +1 -0
  64. package/dist/bedrock/dispose/disposable-utils.js +12 -0
  65. package/dist/bedrock/dispose/disposable-utils.js.map +1 -0
  66. package/dist/bedrock/dispose/dispose-base.d.ts +5 -0
  67. package/dist/bedrock/dispose/dispose-base.d.ts.map +1 -0
  68. package/dist/bedrock/dispose/dispose-base.js +3 -0
  69. package/dist/bedrock/dispose/dispose-base.js.map +1 -0
  70. package/dist/bedrock/dispose/index.d.ts +11 -0
  71. package/dist/bedrock/dispose/index.d.ts.map +1 -0
  72. package/dist/bedrock/dispose/index.js +8 -0
  73. package/dist/bedrock/dispose/index.js.map +1 -0
  74. package/dist/bedrock/dispose/logger.d.ts +8 -0
  75. package/dist/bedrock/dispose/logger.d.ts.map +1 -0
  76. package/dist/bedrock/dispose/logger.js +26 -0
  77. package/dist/bedrock/dispose/logger.js.map +1 -0
  78. package/dist/bedrock/dispose/tracker.d.ts +13 -0
  79. package/dist/bedrock/dispose/tracker.d.ts.map +1 -0
  80. package/dist/bedrock/dispose/tracker.js +59 -0
  81. package/dist/bedrock/dispose/tracker.js.map +1 -0
  82. package/dist/bedrock/error/error-base.d.ts +23 -0
  83. package/dist/bedrock/error/error-base.d.ts.map +1 -0
  84. package/dist/bedrock/error/error-base.js +5 -0
  85. package/dist/bedrock/error/error-base.js.map +1 -0
  86. package/dist/bedrock/error/error-code.d.ts +34 -0
  87. package/dist/bedrock/error/error-code.d.ts.map +1 -0
  88. package/dist/bedrock/error/error-code.js +36 -0
  89. package/dist/bedrock/error/error-code.js.map +1 -0
  90. package/dist/bedrock/error/error-const.d.ts +2 -0
  91. package/dist/bedrock/error/error-const.d.ts.map +1 -0
  92. package/dist/bedrock/error/error-const.js +16 -0
  93. package/dist/bedrock/error/error-const.js.map +1 -0
  94. package/dist/bedrock/error/error-or.d.ts +2 -0
  95. package/dist/bedrock/error/error-or.d.ts.map +1 -0
  96. package/dist/bedrock/error/error-or.js +3 -0
  97. package/dist/bedrock/error/error-or.js.map +1 -0
  98. package/dist/bedrock/error/error-t.d.ts +7 -0
  99. package/dist/bedrock/error/error-t.d.ts.map +1 -0
  100. package/dist/bedrock/error/error-t.js +76 -0
  101. package/dist/bedrock/error/error-t.js.map +1 -0
  102. package/dist/bedrock/error/index.d.ts +6 -0
  103. package/dist/bedrock/error/index.d.ts.map +1 -0
  104. package/dist/bedrock/error/index.js +6 -0
  105. package/dist/bedrock/error/index.js.map +1 -0
  106. package/dist/bedrock/event/emitter.d.ts +44 -0
  107. package/dist/bedrock/event/emitter.d.ts.map +1 -0
  108. package/dist/bedrock/event/emitter.js +118 -0
  109. package/dist/bedrock/event/emitter.js.map +1 -0
  110. package/dist/bedrock/event/error-handler.d.ts +14 -0
  111. package/dist/bedrock/event/error-handler.d.ts.map +1 -0
  112. package/dist/bedrock/event/error-handler.js +21 -0
  113. package/dist/bedrock/event/error-handler.js.map +1 -0
  114. package/dist/bedrock/event/index.d.ts +12 -0
  115. package/dist/bedrock/event/index.d.ts.map +1 -0
  116. package/dist/bedrock/event/index.js +10 -0
  117. package/dist/bedrock/event/index.js.map +1 -0
  118. package/dist/bedrock/event/once.d.ts +3 -0
  119. package/dist/bedrock/event/once.d.ts.map +1 -0
  120. package/dist/bedrock/event/once.js +26 -0
  121. package/dist/bedrock/event/once.js.map +1 -0
  122. package/dist/bedrock/event/phase-emitter.d.ts +113 -0
  123. package/dist/bedrock/event/phase-emitter.d.ts.map +1 -0
  124. package/dist/bedrock/event/phase-emitter.js +163 -0
  125. package/dist/bedrock/event/phase-emitter.js.map +1 -0
  126. package/dist/bedrock/event/shortcut-event-utils.d.ts +8 -0
  127. package/dist/bedrock/event/shortcut-event-utils.d.ts.map +1 -0
  128. package/dist/bedrock/event/shortcut-event-utils.js +21 -0
  129. package/dist/bedrock/event/shortcut-event-utils.js.map +1 -0
  130. package/dist/bedrock/get-or-create/get-or-create.d.ts +2 -0
  131. package/dist/bedrock/get-or-create/get-or-create.d.ts.map +1 -0
  132. package/dist/bedrock/get-or-create/get-or-create.js +15 -0
  133. package/dist/bedrock/get-or-create/get-or-create.js.map +1 -0
  134. package/dist/bedrock/get-or-create/index.d.ts +2 -0
  135. package/dist/bedrock/get-or-create/index.d.ts.map +1 -0
  136. package/dist/bedrock/get-or-create/index.js +2 -0
  137. package/dist/bedrock/get-or-create/index.js.map +1 -0
  138. package/dist/bedrock/hash/hash-t.d.ts +3 -0
  139. package/dist/bedrock/hash/hash-t.d.ts.map +1 -0
  140. package/dist/bedrock/hash/hash-t.js +12 -0
  141. package/dist/bedrock/hash/hash-t.js.map +1 -0
  142. package/dist/bedrock/hash/index.d.ts +3 -0
  143. package/dist/bedrock/hash/index.d.ts.map +1 -0
  144. package/dist/bedrock/hash/index.js +3 -0
  145. package/dist/bedrock/hash/index.js.map +1 -0
  146. package/dist/bedrock/json/index.d.ts +2 -0
  147. package/dist/bedrock/json/index.d.ts.map +1 -0
  148. package/dist/bedrock/json/index.js +2 -0
  149. package/dist/bedrock/json/index.js.map +1 -0
  150. package/dist/bedrock/json/json.d.ts +3 -0
  151. package/dist/bedrock/json/json.d.ts.map +1 -0
  152. package/dist/bedrock/json/json.js +17 -0
  153. package/dist/bedrock/json/json.js.map +1 -0
  154. package/dist/bedrock/lock/capability.d.ts +41 -0
  155. package/dist/bedrock/lock/capability.d.ts.map +1 -0
  156. package/dist/bedrock/lock/capability.js +76 -0
  157. package/dist/bedrock/lock/capability.js.map +1 -0
  158. package/dist/bedrock/lock/index.d.ts +2 -0
  159. package/dist/bedrock/lock/index.d.ts.map +1 -0
  160. package/dist/bedrock/lock/index.js +3 -0
  161. package/dist/bedrock/lock/index.js.map +1 -0
  162. package/dist/bedrock/lock/semaphore.d.ts +14 -0
  163. package/dist/bedrock/lock/semaphore.d.ts.map +1 -0
  164. package/dist/bedrock/lock/semaphore.js +18 -0
  165. package/dist/bedrock/lock/semaphore.js.map +1 -0
  166. package/dist/bedrock/lock/shared-mutex.d.ts +98 -0
  167. package/dist/bedrock/lock/shared-mutex.d.ts.map +1 -0
  168. package/dist/bedrock/lock/shared-mutex.js +223 -0
  169. package/dist/bedrock/lock/shared-mutex.js.map +1 -0
  170. package/dist/bedrock/response/index.d.ts +2 -0
  171. package/dist/bedrock/response/index.d.ts.map +1 -0
  172. package/dist/bedrock/response/index.js +2 -0
  173. package/dist/bedrock/response/index.js.map +1 -0
  174. package/dist/bedrock/response/response.d.ts +16 -0
  175. package/dist/bedrock/response/response.d.ts.map +1 -0
  176. package/dist/bedrock/response/response.js +14 -0
  177. package/dist/bedrock/response/response.js.map +1 -0
  178. package/dist/bedrock/structure/linked-list.d.ts +22 -0
  179. package/dist/bedrock/structure/linked-list.d.ts.map +1 -0
  180. package/dist/bedrock/structure/linked-list.js +96 -0
  181. package/dist/bedrock/structure/linked-list.js.map +1 -0
  182. package/dist/bedrock/uuid/index.d.ts +2 -0
  183. package/dist/bedrock/uuid/index.d.ts.map +1 -0
  184. package/dist/bedrock/uuid/index.js +2 -0
  185. package/dist/bedrock/uuid/index.js.map +1 -0
  186. package/dist/bedrock/uuid/uuid.d.ts +7 -0
  187. package/dist/bedrock/uuid/uuid.d.ts.map +1 -0
  188. package/dist/bedrock/uuid/uuid.js +59 -0
  189. package/dist/bedrock/uuid/uuid.js.map +1 -0
  190. package/dist/commands/hello-command.d.ts +16 -0
  191. package/dist/commands/hello-command.d.ts.map +1 -0
  192. package/dist/commands/hello-command.js +28 -0
  193. package/dist/commands/hello-command.js.map +1 -0
  194. package/dist/commands/index.d.ts +2 -0
  195. package/dist/commands/index.d.ts.map +1 -0
  196. package/dist/commands/index.js +2 -0
  197. package/dist/commands/index.js.map +1 -0
  198. package/dist/core/base-command.d.ts +27 -0
  199. package/dist/core/base-command.d.ts.map +1 -0
  200. package/dist/core/base-command.js +57 -0
  201. package/dist/core/base-command.js.map +1 -0
  202. package/dist/core/cli-app.d.ts +25 -0
  203. package/dist/core/cli-app.d.ts.map +1 -0
  204. package/dist/core/cli-app.js +52 -0
  205. package/dist/core/cli-app.js.map +1 -0
  206. package/dist/core/command-types.d.ts +6 -0
  207. package/dist/core/command-types.d.ts.map +1 -0
  208. package/dist/core/command-types.js +2 -0
  209. package/dist/core/command-types.js.map +1 -0
  210. package/dist/core/index.d.ts +6 -0
  211. package/dist/core/index.d.ts.map +1 -0
  212. package/dist/core/index.js +3 -0
  213. package/dist/core/index.js.map +1 -0
  214. package/dist/index.d.ts +1 -0
  215. package/dist/index.d.ts.map +1 -0
  216. package/dist/index.js +2 -0
  217. package/dist/index.js.map +1 -0
  218. package/dist/main.d.ts +3 -0
  219. package/dist/main.d.ts.map +1 -0
  220. package/dist/main.js +19 -0
  221. package/dist/main.js.map +1 -0
  222. package/package.json +53 -0
package/README.md ADDED
@@ -0,0 +1,168 @@
1
+ # template-commander
2
+
3
+ 一个基于 [commander](https://github.com/tj/commander.js) 的通用 CLI 模板项目,采用面向对象架构设计,支持快速扩展子命令。
4
+
5
+ ## 特性
6
+
7
+ - **面向对象架构** — 所有命令继承 `BaseCommand<TOptions>`,统一生命周期管理
8
+ - **Disposable 体系** — 继承自 bedrock `Disposable` 基类,自动管理资源释放
9
+ - **事件系统** — 基于 bedrock `Emitter` 提供 `onBeforeExecute` / `onAfterExecute` 等生命周期钩子
10
+ - **结构化错误处理** — 使用 `ILvErrorOr<T>` 代替 throw/reject,错误码可追溯
11
+ - **TypeScript 严格模式** — 全量 strict,类型安全
12
+ - **开发热调试** — 基于 tsx 直接运行 TS,支持 `--inspect` 调试
13
+
14
+ ## 目录结构
15
+
16
+ ```
17
+ template-commander/
18
+ ├── src/
19
+ │ ├── main.ts # 入口文件
20
+ │ ├── core/
21
+ │ │ ├── cli-app.ts # CliApp 主应用类
22
+ │ │ ├── base-command.ts # BaseCommand 抽象基类
23
+ │ │ └── command-types.ts # 命令元信息类型
24
+ │ ├── commands/
25
+ │ │ └── hello-command.ts # 示例命令
26
+ │ └── bedrock/ # 基础设施层
27
+ │ ├── dispose/ # Disposable 资源管理
28
+ │ ├── event/ # 事件发射器
29
+ │ ├── error/ # 结构化错误 (ILvErrorOr)
30
+ │ └── ...
31
+ ├── package.json
32
+ └── tsconfig.json
33
+ ```
34
+
35
+ ## 快速开始
36
+
37
+ ```bash
38
+ # 安装依赖
39
+ pnpm install
40
+
41
+ # 开发运行
42
+ pnpm dev -- --help
43
+ pnpm dev -- hello Alice
44
+ pnpm dev -- hello Alice -u
45
+
46
+ # 调试模式 (支持 Chrome DevTools / VS Code 断点)
47
+ pnpm dev:debug -- hello Alice
48
+
49
+ # 构建
50
+ pnpm build
51
+
52
+ # 运行编译产物
53
+ pnpm start -- --help
54
+ ```
55
+
56
+ ## 如何扩展新命令
57
+
58
+ 1. 在 `src/commands/` 下新建文件,创建继承 `BaseCommand<TOptions>` 的类:
59
+
60
+ ```typescript
61
+ import type { Command } from 'commander';
62
+ import { BaseCommand } from '../core/base-command.js';
63
+ import type { ICommandActionContext } from '../core/base-command.js';
64
+ import type { ICommandMeta } from '../core/command-types.js';
65
+ import type { ILvErrorOr } from '../bedrock/error/index.js';
66
+
67
+ interface IMyOptions {
68
+ verbose: boolean;
69
+ }
70
+
71
+ export class MyCommand extends BaseCommand<IMyOptions> {
72
+ protected _meta(): ICommandMeta {
73
+ return {
74
+ name: 'my-cmd',
75
+ description: '这是我的自定义命令',
76
+ aliases: ['mc'],
77
+ };
78
+ }
79
+
80
+ protected _configureArguments(cmd: Command): void {
81
+ cmd.argument('<target>', '操作目标');
82
+ }
83
+
84
+ protected _configureOptions(cmd: Command): void {
85
+ cmd.option('--verbose', '详细输出', false);
86
+ }
87
+
88
+ protected async _execute(ctx: ICommandActionContext<IMyOptions>): Promise<ILvErrorOr<void>> {
89
+ const target = ctx.args[0] as string;
90
+
91
+ if (ctx.options.verbose) {
92
+ console.log(`[verbose] target = ${target}`);
93
+ }
94
+
95
+ // 业务逻辑...
96
+
97
+ return this._makeOk();
98
+ // 或错误: return this._makeError(1001, '发生了某种错误');
99
+ }
100
+ }
101
+ ```
102
+
103
+ 2. 在 `src/main.ts` 中注册:
104
+
105
+ ```typescript
106
+ import { MyCommand } from './commands/my-command.js';
107
+
108
+ app.registerCommand(new MyCommand());
109
+ ```
110
+
111
+ 完成!新命令会自动出现在 `--help` 输出和 `help [command]` 中。
112
+
113
+ ## 架构说明
114
+
115
+ ### BaseCommand
116
+
117
+ 每个子命令需要实现:
118
+
119
+ | 方法 | 说明 |
120
+ |---|---|
121
+ | `_meta()` | 返回命令名、描述、别名 |
122
+ | `_execute(ctx)` | 命令核心逻辑,返回 `ILvErrorOr<void>` |
123
+ | `_configureOptions(cmd)` | (可选) 配置 commander 选项 |
124
+ | `_configureArguments(cmd)` | (可选) 配置 commander 参数 |
125
+
126
+ ### 生命周期事件
127
+
128
+ ```typescript
129
+ const cmd = new HelloCommand();
130
+ cmd.onBeforeExecute(() => console.log('即将执行'));
131
+ cmd.onAfterExecute((result) => {
132
+ if (result.ok) console.log('执行成功');
133
+ else console.log(`执行失败: [${result.code}] ${result.msg}`);
134
+ });
135
+ ```
136
+
137
+ ### 错误处理
138
+
139
+ 使用 `ILvErrorOr<T>` 而非 throw:
140
+
141
+ ```typescript
142
+ // 成功
143
+ return this._makeOk();
144
+
145
+ // 失败 (错误码 + 消息)
146
+ return this._makeError(1001, '文件不存在');
147
+
148
+ // 也可使用 bedrock 预定义错误
149
+ import { invalidArgumentError } from '../bedrock/error/index.js';
150
+ return invalidArgumentError('参数 name 不能为空');
151
+ ```
152
+
153
+ ## Scripts
154
+
155
+ | 脚本 | 说明 |
156
+ |---|---|
157
+ | `pnpm dev` | 使用 tsx 直接运行(开发用) |
158
+ | `pnpm dev:debug` | 启动 Node inspect 调试 |
159
+ | `pnpm build` | TypeScript 编译 |
160
+ | `pnpm start` | 运行编译后产物 |
161
+ | `pnpm clean` | 清理 dist 目录 |
162
+
163
+ ## 技术栈
164
+
165
+ - TypeScript 5.x (strict mode)
166
+ - commander 13.x
167
+ - chalk 5.x
168
+ - tsx (开发热运行)
@@ -0,0 +1,5 @@
1
+ export declare function lvAssert(expr: unknown, reason?: string): asserts expr;
2
+ export declare function lvAssertNotHere(reason?: string): never;
3
+ export declare function lvAssertNever(member: never, message?: string): never;
4
+ export declare function lvAssertNotNil<T>(val: T, reason?: string): asserts val is NonNullable<T>;
5
+ //# sourceMappingURL=assert.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assert.d.ts","sourceRoot":"","sources":["../../../src/bedrock/assert/assert.ts"],"names":[],"mappings":"AAIA,wBAAgB,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAIrE;AAED,wBAAgB,eAAe,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,CAEtD;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,SAAmB,GAAG,KAAK,CAG9E;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,IAAI,WAAW,CAAC,CAAC,CAAC,CAIxF"}
@@ -0,0 +1,21 @@
1
+ function abort(reason) {
2
+ throw new Error(`lvAssert(${reason})`);
3
+ }
4
+ export function lvAssert(expr, reason) {
5
+ if (!expr) {
6
+ abort(reason ?? '#expr is false');
7
+ }
8
+ }
9
+ export function lvAssertNotHere(reason) {
10
+ abort(reason ?? 'unreachable code flow');
11
+ }
12
+ export function lvAssertNever(member, message = 'Illegal value:') {
13
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
14
+ abort(`${message}: ${member}`);
15
+ }
16
+ export function lvAssertNotNil(val, reason) {
17
+ if (val === null || val === undefined) {
18
+ abort(reason ?? '#val is nil');
19
+ }
20
+ }
21
+ //# sourceMappingURL=assert.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assert.js","sourceRoot":"","sources":["../../../src/bedrock/assert/assert.ts"],"names":[],"mappings":"AAAA,SAAS,KAAK,CAAC,MAAc;IAC3B,MAAM,IAAI,KAAK,CAAC,YAAY,MAAM,GAAG,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAa,EAAE,MAAe;IACrD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,KAAK,CAAC,MAAM,IAAI,gBAAgB,CAAC,CAAC;IACpC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAe;IAC7C,KAAK,CAAC,MAAM,IAAI,uBAAuB,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAa,EAAE,OAAO,GAAG,gBAAgB;IACrE,4EAA4E;IAC5E,KAAK,CAAC,GAAG,OAAO,KAAK,MAAM,EAAE,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,cAAc,CAAI,GAAM,EAAE,MAAe;IACvD,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtC,KAAK,CAAC,MAAM,IAAI,aAAa,CAAC,CAAC;IACjC,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { lvAssert, lvAssertNotHere, lvAssertNever, lvAssertNotNil } from './assert';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/bedrock/assert/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,3 @@
1
+ // 提供断言能力
2
+ export { lvAssert, lvAssertNotHere, lvAssertNever, lvAssertNotNil } from './assert';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/bedrock/assert/index.ts"],"names":[],"mappings":"AAAA,SAAS;AACT,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,20 @@
1
+ export interface IBarrier {
2
+ isOpen: () => boolean;
3
+ open: () => void;
4
+ wait: () => Promise<boolean>;
5
+ }
6
+ /**
7
+ * A barrier that is initially closed and then becomes opened permanently after a certain period of
8
+ * time or when open is called explicitly
9
+ */
10
+ export declare class Barrier {
11
+ private _isOpen;
12
+ private readonly _promise;
13
+ private _completePromise;
14
+ constructor();
15
+ isOpen(): boolean;
16
+ open(): void;
17
+ wait(): Promise<boolean>;
18
+ }
19
+ export declare function makeBarrierByPromise(promise: Promise<any>, openWhenReject?: boolean): Barrier;
20
+ //# sourceMappingURL=barrier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"barrier.d.ts","sourceRoot":"","sources":["../../../src/bedrock/async/barrier.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,OAAO,CAAC;IACtB,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,IAAI,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;CAC9B;AAED;;;GAGG;AACH,qBAAa,OAAO;IAClB,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmB;IAC5C,OAAO,CAAC,gBAAgB,CAAwB;;IAShD,MAAM,IAAI,OAAO;IAIjB,IAAI,IAAI,IAAI;IAKZ,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC;CAGzB;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,cAAc,GAAE,OAAe,WAU1F"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * A barrier that is initially closed and then becomes opened permanently after a certain period of
3
+ * time or when open is called explicitly
4
+ */
5
+ export class Barrier {
6
+ _isOpen;
7
+ _promise;
8
+ _completePromise;
9
+ constructor() {
10
+ this._isOpen = false;
11
+ this._promise = new Promise((c, e) => {
12
+ this._completePromise = c;
13
+ });
14
+ }
15
+ isOpen() {
16
+ return this._isOpen;
17
+ }
18
+ open() {
19
+ this._isOpen = true;
20
+ this._completePromise(true);
21
+ }
22
+ wait() {
23
+ return this._promise;
24
+ }
25
+ }
26
+ export function makeBarrierByPromise(promise, openWhenReject = false) {
27
+ const barrier = new Barrier();
28
+ promise.then(() => barrier.open());
29
+ if (openWhenReject) {
30
+ promise.catch((err) => {
31
+ barrier.open();
32
+ throw err;
33
+ });
34
+ }
35
+ return barrier;
36
+ }
37
+ //# sourceMappingURL=barrier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"barrier.js","sourceRoot":"","sources":["../../../src/bedrock/async/barrier.ts"],"names":[],"mappings":"AAMA;;;GAGG;AACH,MAAM,OAAO,OAAO;IACV,OAAO,CAAU;IACR,QAAQ,CAAmB;IACpC,gBAAgB,CAAwB;IAEhD;QACE,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,CAAC,QAAQ,GAAG,IAAI,OAAO,CAAU,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAC5C,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;IACL,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,IAAI;QACF,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;CACF;AAED,MAAM,UAAU,oBAAoB,CAAC,OAAqB,EAAE,iBAA0B,KAAK;IACzF,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAC9B,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACnC,IAAI,cAAc,EAAE,CAAC;QACnB,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACpB,OAAO,CAAC,IAAI,EAAE,CAAC;YACf,MAAM,GAAG,CAAC;QACZ,CAAC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { type IDisposable } from '../dispose';
2
+ export interface ICancellationToken {
3
+ readonly isCancellationRequested: boolean;
4
+ readonly reason?: string;
5
+ readonly onCancellationRequested: (listener: () => any, thisArgs?: any, disposables?: IDisposable[]) => IDisposable;
6
+ }
7
+ export declare class CancellationToken {
8
+ static None: Readonly<ICancellationToken>;
9
+ static Cancelled: Readonly<ICancellationToken>;
10
+ static Make: (reason: string) => Readonly<ICancellationToken>;
11
+ }
12
+ export declare class CancellationTokenSource implements IDisposable {
13
+ private _token?;
14
+ private readonly _parentListener?;
15
+ private _abortController?;
16
+ constructor(parent?: ICancellationToken);
17
+ /**
18
+ * 传统的cancellation用法
19
+ */
20
+ get token(): ICancellationToken;
21
+ /**
22
+ * 对齐浏览器提供的abortSignal,支持给fetch、axios等传参使用
23
+ */
24
+ get signal(): AbortSignal;
25
+ cancel(reason?: string): void;
26
+ dispose(cancel?: boolean): void;
27
+ }
28
+ //# sourceMappingURL=cancellation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cancellation.d.ts","sourceRoot":"","sources":["../../../src/bedrock/async/cancellation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAS5D,MAAM,WAAW,kBAAkB;IAEjC,QAAQ,CAAC,uBAAuB,EAAE,OAAO,CAAC;IAG1C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAMzB,QAAQ,CAAC,uBAAuB,EAAE,CAChC,QAAQ,EAAE,MAAM,GAAG,EACnB,QAAQ,CAAC,EAAE,GAAG,EACd,WAAW,CAAC,EAAE,WAAW,EAAE,KACxB,WAAW,CAAC;CAClB;AAqED,qBAAa,iBAAiB;IAC5B,MAAM,CAAC,IAAI,+BAGR;IAEH,MAAM,CAAC,SAAS,+BAGb;IAEH,MAAM,CAAC,IAAI,GAAI,QAAQ,MAAM,kCAM3B;CACH;AAmBD,qBAAa,uBAAwB,YAAW,WAAW;IAEzD,OAAO,CAAC,MAAM,CAAC,CAAiC;IAEhD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAA0B;IAE3D,OAAO,CAAC,gBAAgB,CAAC,CAA8B;gBAE3C,MAAM,CAAC,EAAE,kBAAkB;IAMvC;;OAEG;IACH,IAAW,KAAK,IAAI,kBAAkB,CAKrC;IAED;;OAEG;IACH,IAAW,MAAM,IAAI,WAAW,CAS/B;IAEM,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAa7B,OAAO,CAAC,MAAM,UAAQ,GAAG,IAAI;CAWrC"}
@@ -0,0 +1,156 @@
1
+ import { EmptyDispose } from '../dispose';
2
+ import { Emitter } from '../event';
3
+ //
4
+ // 编译时常量,一个快捷的事件响应
5
+ // 用于当外界监听令牌取消时,直接触发回调
6
+ //
7
+ const shortcutEvent = Object.freeze(function (callback, context) {
8
+ const handle = setTimeout(callback.bind(context), 0);
9
+ return {
10
+ dispose() {
11
+ clearTimeout(handle);
12
+ },
13
+ };
14
+ });
15
+ //
16
+ // 可取消异步调用的令牌实现
17
+ // 默认是未取消状态,可以调用cancel进行取消
18
+ //
19
+ class MutableToken {
20
+ // 是否已经取消该异步调用
21
+ _isCancelled = false;
22
+ _emitter = null;
23
+ _reason;
24
+ get reason() {
25
+ return this._reason;
26
+ }
27
+ // 获取当前是否已经取消该异步调用
28
+ get isCancellationRequested() {
29
+ return this._isCancelled;
30
+ }
31
+ // 外界可以监听异步取消发起
32
+ get onCancellationRequested() {
33
+ if (this._isCancelled) {
34
+ return shortcutEvent;
35
+ }
36
+ if (!this._emitter) {
37
+ this._emitter = new Emitter();
38
+ }
39
+ return this._emitter.event;
40
+ }
41
+ cancel(reason) {
42
+ if (!this._isCancelled) {
43
+ this._reason = reason;
44
+ this._isCancelled = true;
45
+ if (this._emitter) {
46
+ this._emitter.fire();
47
+ this.dispose();
48
+ }
49
+ }
50
+ }
51
+ dispose() {
52
+ if (this._emitter) {
53
+ this._emitter.dispose();
54
+ this._emitter = null;
55
+ }
56
+ }
57
+ }
58
+ //
59
+ // 编译期提供的一些常量Token
60
+ // 不可修改
61
+ //
62
+ export class CancellationToken {
63
+ static None = Object.freeze({
64
+ isCancellationRequested: false,
65
+ onCancellationRequested: () => EmptyDispose,
66
+ });
67
+ static Cancelled = Object.freeze({
68
+ isCancellationRequested: true,
69
+ onCancellationRequested: shortcutEvent,
70
+ });
71
+ static Make = (reason) => {
72
+ return Object.freeze({
73
+ isCancellationRequested: true,
74
+ onCancellationRequested: shortcutEvent,
75
+ reason,
76
+ });
77
+ };
78
+ }
79
+ //
80
+ // 任何可取消的异步调用 的控制类
81
+ // 参考ICancellationToken,我们通过在异步调用的回调中添加token参数来判断异步调用的状态
82
+ // token来源于CancellationTokenSource
83
+ // CancellationTokenSource也会暴露cancel的接口
84
+ //
85
+ // 使用方式
86
+ // const tokenSource = new CancellationTokenSource();
87
+ //
88
+ // asyncCall(() => {
89
+ // if (token.isCancellationRequested) { return; } // 如果cancelled
90
+ // doSomething();
91
+ // });
92
+ //
93
+ // tokenSource.cancel(); // 因为某些情况,可能会cancel
94
+ // tokenSource.dispose(); // dispose时一定会cancel
95
+ //
96
+ export class CancellationTokenSource {
97
+ // 真正的token
98
+ _token = undefined;
99
+ // 可能存在父级CancellationTokenSource
100
+ _parentListener = undefined;
101
+ // 为了支持signal场景,所以在需要时会初始化浏览器提供的abortController原生结构
102
+ _abortController = undefined;
103
+ constructor(parent) {
104
+ // 如果存在父级,当父对象cancel时,子对象也必须cancel
105
+ // eslint-disable-next-line @typescript-eslint/unbound-method
106
+ this._parentListener = parent?.onCancellationRequested(this.cancel, this);
107
+ }
108
+ /**
109
+ * 传统的cancellation用法
110
+ */
111
+ get token() {
112
+ if (!this._token) {
113
+ this._token = new MutableToken();
114
+ }
115
+ return this._token;
116
+ }
117
+ /**
118
+ * 对齐浏览器提供的abortSignal,支持给fetch、axios等传参使用
119
+ */
120
+ get signal() {
121
+ if (this._abortController) {
122
+ return this._abortController.signal;
123
+ }
124
+ this._abortController = new AbortController();
125
+ if (this._token?.isCancellationRequested) {
126
+ this._abortController.abort();
127
+ }
128
+ return this._abortController.signal;
129
+ }
130
+ cancel(reason) {
131
+ if (!this._token) {
132
+ // 如果没有使用过token就直接cancel,那么就返回一个常量即可
133
+ this._token =
134
+ reason === undefined ? CancellationToken.Cancelled : CancellationToken.Make(reason);
135
+ }
136
+ else if (this._token instanceof MutableToken) {
137
+ this._token.cancel(reason);
138
+ }
139
+ if (this._abortController) {
140
+ this._abortController.abort(reason);
141
+ }
142
+ }
143
+ dispose(cancel = false) {
144
+ if (cancel) {
145
+ this.cancel();
146
+ }
147
+ this._parentListener?.dispose();
148
+ if (!this._token) {
149
+ this._token = CancellationToken.None;
150
+ }
151
+ else if (this._token instanceof MutableToken) {
152
+ this._token.dispose();
153
+ }
154
+ }
155
+ }
156
+ //# sourceMappingURL=cancellation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cancellation.js","sourceRoot":"","sources":["../../../src/bedrock/async/cancellation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { IDisposable } from '../dispose';
2
+ export interface IIdleDeadline {
3
+ readonly didTimeout: boolean;
4
+ timeRemaining: () => number;
5
+ }
6
+ export interface IRunWhenIdle {
7
+ (callback: (idle?: IIdleDeadline) => void, timeout?: number): IDisposable;
8
+ }
9
+ //# sourceMappingURL=idle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idle.d.ts","sourceRoot":"","sources":["../../../src/bedrock/async/idle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9C,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,aAAa,EAAE,MAAM,MAAM,CAAC;CAC7B;AAMD,MAAM,WAAW,YAAY;IAC3B,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAE,aAAa,KAAK,IAAI,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC;CAC3E"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=idle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idle.js","sourceRoot":"","sources":["../../../src/bedrock/async/idle.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ export * from './cancellation';
2
+ export * from './idle';
3
+ export * from './promise';
4
+ export { wait } from './wait';
5
+ export * from './barrier';
6
+ export * from './serial-async-task';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/bedrock/async/index.ts"],"names":[],"mappings":"AACA,cAAc,gBAAgB,CAAC;AAG/B,cAAc,QAAQ,CAAC;AAGvB,cAAc,WAAW,CAAC;AAG1B,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAG9B,cAAc,WAAW,CAAC;AAG1B,cAAc,qBAAqB,CAAC"}
@@ -0,0 +1,13 @@
1
+ // 异步任务可取消的token
2
+ export * from './cancellation';
3
+ // 闲时接口声明
4
+ export * from './idle';
5
+ // 包装后可dispose的promise能力
6
+ export * from './promise';
7
+ // 通用的wait函数,提供异步等待能力
8
+ export { wait } from './wait';
9
+ // 提供调用 open 后 resolve promise 的能力
10
+ export * from './barrier';
11
+ // 提供串行执行异步读写任务的能力
12
+ export * from './serial-async-task';
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/bedrock/async/index.ts"],"names":[],"mappings":"AAAA,gBAAgB;AAChB,cAAc,gBAAgB,CAAC;AAE/B,SAAS;AACT,cAAc,QAAQ,CAAC;AAEvB,wBAAwB;AACxB,cAAc,WAAW,CAAC;AAE1B,qBAAqB;AACrB,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAE9B,kCAAkC;AAClC,cAAc,WAAW,CAAC;AAE1B,kBAAkB;AAClB,cAAc,qBAAqB,CAAC"}
@@ -0,0 +1,59 @@
1
+ import { type ILvErrorOr, type ILvErrorRef } from '../error';
2
+ import type { ICancellationToken } from './cancellation';
3
+ /**
4
+ * 一般来说Promise常用的场景有:
5
+ * 1. 单次异步调用(new Promise)
6
+ * 2. 批量promise调用(Promise.all)
7
+ * 3. promise竞速调用(Promise.race)
8
+ *
9
+ * 但是原生能力有如下的缺陷
10
+ * 1. 不支持取消某一次promise调用
11
+ * 2. 不支持错误语义,promise.catch的重视程度比try catch还低
12
+ * 3. 超时行为需要基于race封装
13
+ *
14
+ * 针对这三点,基建侧提供了高阶的promise能力
15
+ * 1. makeCancelablePromise 返回一个可取消的promise
16
+ * const promise = makeCancelablePromise(() => { ... });
17
+ * promise.then((res) => {
18
+ * // res是一个ILvErrorRef对象
19
+ * });
20
+ * // 可以直接取消promise
21
+ * promise.cancel();
22
+ *
23
+ * 2. parallelPromise 并发执行promise,会自动观测ILvErrorRef语义
24
+ * 当单个promise出现错误返回时,promise执行失败,尽可能调用所有cancelablePromise
25
+ * 当单个promise出现reject时,promise执行失败,尽可能调用所有cancelablePromise,并且将reject继续上抛
26
+ *
27
+ * 3. makePromiseWithTimeout 让promise支持超时,可以提供默认值
28
+ *
29
+ * ——————————————————
30
+ * Promise.allSettled和Promise.any在实际使用中场景较少,暂不提供错误语义包装
31
+ */
32
+ export interface CancelablePromise<T> extends Promise<T> {
33
+ cancel: () => void;
34
+ }
35
+ /**
36
+ * 快速生成一个CancelablePromise对象
37
+ */
38
+ export declare function makeCancelablePromise<T>(callback: (token: ICancellationToken) => Promise<T | ILvErrorOr<T>>): CancelablePromise<ILvErrorOr<T>>;
39
+ /**
40
+ * 并行执行promise,当某一个失败,本次调用失败
41
+ * 本质上和Promise.all差不多,相比较之下
42
+ * 1. 包装了错误语义判断
43
+ * 2. 当失败时,会尽可能尝试cancel其他promise
44
+ *
45
+ * 注意:某一个promise失败时,会尽可能尝试调用其他promise的cancel,但不保证一定有效
46
+ * (有可能promiseA已经成功,但是primiseB在之后失败了)
47
+ */
48
+ export declare function parallelPromise(promiseList: Promise<any>[]): Promise<ILvErrorRef>;
49
+ /**
50
+ * 包装一个promise,提供超时能力
51
+ */
52
+ export declare function makePromiseWithTimeout<T>(callback: (token: ICancellationToken) => Promise<T | ILvErrorOr<T>>, timeout: number, defaultValue?: T): Promise<ILvErrorOr<T>>;
53
+ export interface Deferred<T> {
54
+ resolve: (value: T | PromiseLike<T>) => void;
55
+ reject: (reason: unknown) => void;
56
+ promise: Promise<T>;
57
+ }
58
+ export declare function defer<T = void>(): Deferred<T>;
59
+ //# sourceMappingURL=promise.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promise.d.ts","sourceRoot":"","sources":["../../../src/bedrock/async/promise.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,UAAU,EAIf,KAAK,WAAW,EAGjB,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAGzD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAKH,MAAM,WAAW,iBAAiB,CAAC,CAAC,CAAE,SAAQ,OAAO,CAAC,CAAC,CAAC;IACtD,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,EACrC,QAAQ,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,OAAO,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,GAClE,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CA6ClC;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAkCjF;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,EACtC,QAAQ,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,OAAO,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,EACnE,OAAO,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,CAAC,GACf,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAuBxB;AAID,MAAM,WAAW,QAAQ,CAAC,CAAC;IACzB,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IAC7C,MAAM,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IAClC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;CACrB;AAED,wBAAgB,KAAK,CAAC,CAAC,GAAG,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAQ7C"}