@mybricks/plugin-ai 0.0.2 → 0.0.3

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 (249) hide show
  1. package/dist/_virtual/_rollupPluginBabelHelpers.js +164 -0
  2. package/dist/_virtual/_rollupPluginBabelHelpers.js.map +1 -0
  3. package/dist/agents/app.js +335 -0
  4. package/dist/agents/app.js.map +1 -0
  5. package/dist/agents/common.js +483 -0
  6. package/dist/agents/common.js.map +1 -0
  7. package/dist/agents/custom.js +16 -0
  8. package/dist/agents/custom.js.map +1 -0
  9. package/dist/agents/index.js +38 -0
  10. package/dist/agents/index.js.map +1 -0
  11. package/dist/agents/knowledges/knowledge-base.js +579 -0
  12. package/dist/agents/knowledges/knowledge-base.js.map +1 -0
  13. package/dist/agents/knowledges/knowledge-node.js +228 -0
  14. package/dist/agents/knowledges/knowledge-node.js.map +1 -0
  15. package/dist/agents/knowledges/types.js +105 -0
  16. package/dist/agents/knowledges/types.js.map +1 -0
  17. package/dist/agents/utils/config.js +229 -0
  18. package/dist/agents/utils/config.js.map +1 -0
  19. package/dist/agents/workspace/coding-manager.js +20 -0
  20. package/dist/agents/workspace/coding-manager.js.map +1 -0
  21. package/dist/agents/workspace/components-manager.js +113 -0
  22. package/dist/agents/workspace/components-manager.js.map +1 -0
  23. package/dist/agents/workspace/outline-focus.js +167 -0
  24. package/dist/agents/workspace/outline-focus.js.map +1 -0
  25. package/dist/agents/workspace/outline-info.js +430 -0
  26. package/dist/agents/workspace/outline-info.js.map +1 -0
  27. package/dist/agents/workspace/page-tree-generator.js +70 -0
  28. package/dist/agents/workspace/page-tree-generator.js.map +1 -0
  29. package/dist/agents/workspace/workspace.js +251 -0
  30. package/dist/agents/workspace/workspace.js.map +1 -0
  31. package/dist/agents/workspace-by-knowledges/providers/component-docs-provider.js +100 -0
  32. package/dist/agents/workspace-by-knowledges/providers/component-docs-provider.js.map +1 -0
  33. package/dist/agents/workspace-by-knowledges/providers/focus-info-provider.js +120 -0
  34. package/dist/agents/workspace-by-knowledges/providers/focus-info-provider.js.map +1 -0
  35. package/dist/agents/workspace-by-knowledges/providers/project-info-provider.js +146 -0
  36. package/dist/agents/workspace-by-knowledges/providers/project-info-provider.js.map +1 -0
  37. package/dist/agents/workspace-by-knowledges/test.js +242 -0
  38. package/dist/agents/workspace-by-knowledges/test.js.map +1 -0
  39. package/dist/agents/workspace-by-knowledges/utils/components-manager.js +132 -0
  40. package/dist/agents/workspace-by-knowledges/utils/components-manager.js.map +1 -0
  41. package/dist/agents/workspace-by-knowledges/utils/outline-focus.js +167 -0
  42. package/dist/agents/workspace-by-knowledges/utils/outline-focus.js.map +1 -0
  43. package/dist/agents/workspace-by-knowledges/utils/outline-info.js +430 -0
  44. package/dist/agents/workspace-by-knowledges/utils/outline-info.js.map +1 -0
  45. package/dist/agents/workspace-by-knowledges/workspace.js +169 -0
  46. package/dist/agents/workspace-by-knowledges/workspace.js.map +1 -0
  47. package/dist/api/cloud-components.js +85 -0
  48. package/dist/api/cloud-components.js.map +1 -0
  49. package/dist/api-record-replay/manager.js +168 -0
  50. package/dist/api-record-replay/manager.js.map +1 -0
  51. package/{src/api-record-replay/recorder.ts → dist/api-record-replay/recorder.js} +22 -32
  52. package/dist/api-record-replay/recorder.js.map +1 -0
  53. package/dist/api-record-replay/replayer.js +136 -0
  54. package/dist/api-record-replay/replayer.js.map +1 -0
  55. package/dist/components/attachments/index.js +124 -0
  56. package/dist/components/attachments/index.js.map +1 -0
  57. package/dist/components/attachments/index.less.js +8 -0
  58. package/dist/components/attachments/index.less.js.map +1 -0
  59. package/dist/components/icons/index.js +112 -0
  60. package/dist/components/icons/index.js.map +1 -0
  61. package/dist/components/icons/index.less.js +8 -0
  62. package/dist/components/icons/index.less.js.map +1 -0
  63. package/dist/components/mention/index.js +19 -0
  64. package/dist/components/mention/index.js.map +1 -0
  65. package/dist/components/mention/index.less.js +8 -0
  66. package/dist/components/mention/index.less.js.map +1 -0
  67. package/dist/components/messages/index.js +429 -0
  68. package/dist/components/messages/index.js.map +1 -0
  69. package/dist/components/messages/index.less.js +8 -0
  70. package/dist/components/messages/index.less.js.map +1 -0
  71. package/dist/components/sender/index.js +244 -0
  72. package/dist/components/sender/index.js.map +1 -0
  73. package/dist/components/sender/index.less.js +8 -0
  74. package/dist/components/sender/index.less.js.map +1 -0
  75. package/dist/context/RequestStatusTracker.js +44 -0
  76. package/dist/context/RequestStatusTracker.js.map +1 -0
  77. package/dist/context/index.js +45 -0
  78. package/dist/context/index.js.map +1 -0
  79. package/dist/data.js +4 -0
  80. package/dist/data.js.map +1 -0
  81. package/dist/index.js +306 -0
  82. package/dist/index.js.map +1 -0
  83. package/dist/plugin-ai/node_modules/style-inject/dist/style-inject.es.js +27 -0
  84. package/dist/plugin-ai/node_modules/style-inject/dist/style-inject.es.js.map +1 -0
  85. package/dist/plugin-ai/package.json.js +8 -0
  86. package/dist/plugin-ai/package.json.js.map +1 -0
  87. package/dist/plugin-ai/test/index.js +206 -0
  88. package/dist/plugin-ai/test/index.js.map +1 -0
  89. package/dist/preset/createTemplates.js +29 -0
  90. package/dist/preset/createTemplates.js.map +1 -0
  91. package/dist/preset/index.js +13 -0
  92. package/dist/preset/index.js.map +1 -0
  93. package/dist/preset/prompts.js +34 -0
  94. package/dist/preset/prompts.js.map +1 -0
  95. package/{src/preset/user.ts → dist/preset/user.js} +4 -3
  96. package/dist/preset/user.js.map +1 -0
  97. package/dist/requestAsStream.js +269 -0
  98. package/dist/requestAsStream.js.map +1 -0
  99. package/dist/rxai/node_modules/idb/build/index.js +277 -0
  100. package/dist/rxai/node_modules/idb/build/index.js.map +1 -0
  101. package/dist/rxai/src/agent/base.js +16 -0
  102. package/dist/rxai/src/agent/base.js.map +1 -0
  103. package/dist/rxai/src/agent/planning.js +1076 -0
  104. package/dist/rxai/src/agent/planning.js.map +1 -0
  105. package/dist/rxai/src/agent/rxai.js +254 -0
  106. package/dist/rxai/src/agent/rxai.js.map +1 -0
  107. package/dist/rxai/src/error/base.js +39 -0
  108. package/dist/rxai/src/error/base.js.map +1 -0
  109. package/dist/rxai/src/prompt/base.js +11 -0
  110. package/dist/rxai/src/prompt/base.js.map +1 -0
  111. package/dist/rxai/src/prompt/planning.js +23 -0
  112. package/dist/rxai/src/prompt/planning.js.map +1 -0
  113. package/dist/rxai/src/prompt/tool.js +14 -0
  114. package/dist/rxai/src/prompt/tool.js.map +1 -0
  115. package/dist/rxai/src/request/request.js +123 -0
  116. package/dist/rxai/src/request/request.js.map +1 -0
  117. package/dist/rxai/src/tool/getHistoryRecords.js +65 -0
  118. package/dist/rxai/src/tool/getHistoryRecords.js.map +1 -0
  119. package/dist/rxai/src/tool/util.js +424 -0
  120. package/dist/rxai/src/tool/util.js.map +1 -0
  121. package/dist/rxai/src/utils/events.js +43 -0
  122. package/dist/rxai/src/utils/events.js.map +1 -0
  123. package/dist/rxai/src/utils/idb.js +240 -0
  124. package/dist/rxai/src/utils/idb.js.map +1 -0
  125. package/dist/rxai/src/utils/retry.js +32 -0
  126. package/dist/rxai/src/utils/retry.js.map +1 -0
  127. package/dist/rxai/src/utils/uuid.js +7 -0
  128. package/dist/rxai/src/utils/uuid.js.map +1 -0
  129. package/dist/startView/components/header/header.js +12 -0
  130. package/dist/startView/components/header/header.js.map +1 -0
  131. package/dist/startView/components/header/header.less.js +8 -0
  132. package/dist/startView/components/header/header.less.js.map +1 -0
  133. package/dist/startView/index.js +62 -0
  134. package/dist/startView/index.js.map +1 -0
  135. package/dist/startView/index.less.js +8 -0
  136. package/dist/startView/index.less.js.map +1 -0
  137. package/dist/tools/analyze-and-expand-prd.js +116 -0
  138. package/dist/tools/analyze-and-expand-prd.js.map +1 -0
  139. package/dist/tools/analyze-requirement-and-components.js +208 -0
  140. package/dist/tools/analyze-requirement-and-components.js.map +1 -0
  141. package/dist/tools/answer.js +33 -0
  142. package/dist/tools/answer.js.map +1 -0
  143. package/dist/tools/build-process.js +550 -0
  144. package/dist/tools/build-process.js.map +1 -0
  145. package/dist/tools/coding-subagent-as-tool.js +101 -0
  146. package/dist/tools/coding-subagent-as-tool.js.map +1 -0
  147. package/dist/tools/generate-ui-content.js +528 -0
  148. package/dist/tools/generate-ui-content.js.map +1 -0
  149. package/dist/tools/index.js +31 -0
  150. package/dist/tools/index.js.map +1 -0
  151. package/dist/tools/open-dsl.js +49 -0
  152. package/dist/tools/open-dsl.js.map +1 -0
  153. package/dist/tools/refactor-ui-content.js +292 -0
  154. package/dist/tools/refactor-ui-content.js.map +1 -0
  155. package/dist/tools/utils.js +832 -0
  156. package/dist/tools/utils.js.map +1 -0
  157. package/dist/types/index.js +8 -0
  158. package/dist/types/index.js.map +1 -0
  159. package/dist/view/components/header/header.js +59 -0
  160. package/dist/view/components/header/header.js.map +1 -0
  161. package/dist/view/components/header/header.less.js +8 -0
  162. package/dist/view/components/header/header.less.js.map +1 -0
  163. package/dist/view/index.js +184 -0
  164. package/dist/view/index.js.map +1 -0
  165. package/dist/view/index.less.js +8 -0
  166. package/dist/view/index.less.js.map +1 -0
  167. package/package.json +28 -6
  168. package/src/agents/app.ts +0 -301
  169. package/src/agents/common.ts +0 -471
  170. package/src/agents/custom.ts +0 -14
  171. package/src/agents/index.ts +0 -37
  172. package/src/agents/knowledges/README.md +0 -614
  173. package/src/agents/knowledges/SUMMARY.md +0 -527
  174. package/src/agents/knowledges/index.ts +0 -8
  175. package/src/agents/knowledges/knowledge-base.ts +0 -565
  176. package/src/agents/knowledges/knowledge-node.ts +0 -266
  177. package/src/agents/knowledges/types.ts +0 -208
  178. package/src/agents/utils/config.ts +0 -427
  179. package/src/agents/workspace/coding-manager.ts +0 -31
  180. package/src/agents/workspace/components-manager.ts +0 -124
  181. package/src/agents/workspace/outline-focus.ts +0 -188
  182. package/src/agents/workspace/outline-info.ts +0 -520
  183. package/src/agents/workspace/page-tree-generator.ts +0 -83
  184. package/src/agents/workspace/workspace.ts +0 -319
  185. package/src/agents/workspace-by-knowledges/MIGRATION.md +0 -568
  186. package/src/agents/workspace-by-knowledges/README.md +0 -521
  187. package/src/agents/workspace-by-knowledges/index.ts +0 -11
  188. package/src/agents/workspace-by-knowledges/providers/component-docs-provider.ts +0 -92
  189. package/src/agents/workspace-by-knowledges/providers/focus-info-provider.ts +0 -131
  190. package/src/agents/workspace-by-knowledges/providers/index.ts +0 -8
  191. package/src/agents/workspace-by-knowledges/providers/project-info-provider.ts +0 -151
  192. package/src/agents/workspace-by-knowledges/test.ts +0 -240
  193. package/src/agents/workspace-by-knowledges/types.ts +0 -56
  194. package/src/agents/workspace-by-knowledges/utils/components-manager.ts +0 -145
  195. package/src/agents/workspace-by-knowledges/utils/index.ts +0 -8
  196. package/src/agents/workspace-by-knowledges/utils/outline-focus.ts +0 -178
  197. package/src/agents/workspace-by-knowledges/utils/outline-info.ts +0 -521
  198. package/src/agents/workspace-by-knowledges/workspace.ts +0 -166
  199. package/src/api/cloud-components.ts +0 -129
  200. package/src/api-record-replay/README.md +0 -187
  201. package/src/api-record-replay/index.ts +0 -11
  202. package/src/api-record-replay/manager.ts +0 -168
  203. package/src/api-record-replay/replayer.ts +0 -148
  204. package/src/components/attachments/index.less +0 -117
  205. package/src/components/attachments/index.tsx +0 -136
  206. package/src/components/icons/index.less +0 -8
  207. package/src/components/icons/index.tsx +0 -44
  208. package/src/components/index.less +0 -34
  209. package/src/components/mention/index.less +0 -23
  210. package/src/components/mention/index.tsx +0 -19
  211. package/src/components/messages/index.less +0 -1013
  212. package/src/components/messages/index.tsx +0 -519
  213. package/src/components/sender/index.less +0 -203
  214. package/src/components/sender/index.tsx +0 -298
  215. package/src/components/types.ts +0 -31
  216. package/src/constants/index.ts +0 -8
  217. package/src/context/RequestStatusTracker.ts +0 -50
  218. package/src/context/index.ts +0 -83
  219. package/src/data.ts +0 -5
  220. package/src/global.d.ts +0 -100
  221. package/src/index.tsx +0 -264
  222. package/src/mock.ts +0 -1267
  223. package/src/preset/agents.ts +0 -380
  224. package/src/preset/createTemplates.ts +0 -25
  225. package/src/preset/index.ts +0 -12
  226. package/src/preset/prompts.ts +0 -235
  227. package/src/preset/requestAsStream.ts +0 -246
  228. package/src/startView/components/header/header.less +0 -17
  229. package/src/startView/components/header/header.tsx +0 -15
  230. package/src/startView/components/index.ts +0 -1
  231. package/src/startView/index.less +0 -34
  232. package/src/startView/index.tsx +0 -61
  233. package/src/tools/analyze-and-expand-prd.ts +0 -272
  234. package/src/tools/analyze-requirement-and-components.ts +0 -589
  235. package/src/tools/answer.ts +0 -59
  236. package/src/tools/build-process.ts +0 -1174
  237. package/src/tools/coding-subagent-as-tool.ts +0 -119
  238. package/src/tools/generate-ui-content.ts +0 -1083
  239. package/src/tools/index.ts +0 -28
  240. package/src/tools/open-dsl.ts +0 -69
  241. package/src/tools/refactor-ui-content.ts +0 -801
  242. package/src/tools/type.d.ts +0 -12
  243. package/src/tools/utils.ts +0 -914
  244. package/src/types/index.ts +0 -4
  245. package/src/view/components/header/header.less +0 -51
  246. package/src/view/components/header/header.tsx +0 -60
  247. package/src/view/components/index.ts +0 -1
  248. package/src/view/index.less +0 -5
  249. package/src/view/index.tsx +0 -168
@@ -0,0 +1,424 @@
1
+ /**
2
+ * 解析代码块字符串,提取文件信息和内容
3
+ * @param {string} content - 包含代码块的字符串
4
+ * @returns {Array} 解析结果数组
5
+ */
6
+ function parseFileBlocks(content) {
7
+ var results = [];
8
+ var currentIndex = 0;
9
+ var resultParts = [];
10
+ while (currentIndex < content.length) {
11
+ // 查找代码块开始标记,支持多种格式和容错
12
+ var startPattern = /```(?:(\w+)(?:\s+(.+?))?)?\s*\n/g;
13
+ startPattern.lastIndex = currentIndex;
14
+ var startMatch = startPattern.exec(content);
15
+ if (!startMatch) {
16
+ // 把剩余内容原样追加
17
+ resultParts.push(content.slice(currentIndex));
18
+ break; // 没有更多代码块
19
+ }
20
+ var [startFullMatch, language, attributesPart] = startMatch;
21
+ var contentStartIndex = startMatch.index + startFullMatch.length;
22
+
23
+ // 先把代码块开始前的普通文本追加到结果
24
+ resultParts.push(content.slice(currentIndex, startMatch.index));
25
+
26
+ // 解析文件名,采用严格模式,宁可不要也不要误匹配
27
+ var fileName = "";
28
+ if (attributesPart) {
29
+ fileName = extractFileNameStrict(attributesPart);
30
+ }
31
+
32
+ // 在“代码块内容”片段中查找结束标记:支持“开头处 \s*```”或“换行后 \s*```”
33
+ var restContent = content.substring(contentStartIndex);
34
+ var endPattern = /(?:^\s*```|\n\s*```)/;
35
+ var endMatch = endPattern.exec(restContent);
36
+ var blockContent = void 0;
37
+ var isComplete = void 0;
38
+ if (endMatch) {
39
+ // 找到结束标记:取标记前的内容并去除首尾空白(空内容即得空字符串)
40
+ blockContent = restContent.substring(0, endMatch.index).trim();
41
+ isComplete = true;
42
+ currentIndex = contentStartIndex + endMatch.index + endMatch[0].length;
43
+ } else {
44
+ // 没有找到结束标记,取到字符串末尾并去除尾部残留的 ``` 行
45
+ blockContent = restContent.replace(/\n\s*```\s*$/, "").trim();
46
+ isComplete = false;
47
+ currentIndex = content.length;
48
+ }
49
+
50
+ // 生成文件名和解析文件信息
51
+ var finalFileName = fileName || "";
52
+ var name = "";
53
+ var extension = "";
54
+ if (finalFileName) {
55
+ // 有明确的文件名
56
+ var lastDotIndex = finalFileName.lastIndexOf(".");
57
+ name = lastDotIndex !== -1 ? finalFileName.substring(0, lastDotIndex) : finalFileName;
58
+ extension = lastDotIndex !== -1 ? finalFileName.substring(lastDotIndex + 1) : "";
59
+ } else {
60
+ // 没有明确文件名时生成默认文件名
61
+ if (language) {
62
+ var extensionMap = {
63
+ javascript: "js",
64
+ typescript: "ts",
65
+ python: "py",
66
+ java: "java",
67
+ html: "html",
68
+ css: "css",
69
+ json: "json",
70
+ xml: "xml",
71
+ yaml: "yml",
72
+ yml: "yml",
73
+ markdown: "md",
74
+ md: "md",
75
+ shell: "sh",
76
+ bash: "sh",
77
+ sql: "sql",
78
+ php: "php",
79
+ ruby: "rb",
80
+ go: "go",
81
+ rust: "rs",
82
+ swift: "swift",
83
+ kotlin: "kt"
84
+ };
85
+ extension = extensionMap[language.toLowerCase()] || language;
86
+ finalFileName = "code_block_".concat(results.length + 1, ".").concat(extension);
87
+ name = "code_block_".concat(results.length + 1);
88
+ } else {
89
+ finalFileName = "code_block_".concat(results.length + 1, ".txt");
90
+ name = "code_block_".concat(results.length + 1);
91
+ extension = "txt";
92
+ }
93
+ }
94
+ if (startMatch) {
95
+ startMatch.index;
96
+ }
97
+ if (endMatch) {
98
+ endMatch.index;
99
+ }
100
+
101
+ // 用 fileName 作为占位符替换整个代码块
102
+ resultParts.push(finalFileName);
103
+ results.push({
104
+ fileName: finalFileName,
105
+ name: name,
106
+ extension: extension,
107
+ language: language || "",
108
+ content: blockContent,
109
+ isComplete: isComplete
110
+ });
111
+ }
112
+ var resultContent = resultParts.join("");
113
+ return {
114
+ content: resultContent,
115
+ files: results
116
+ };
117
+ }
118
+
119
+ /**
120
+ * 严格模式提取文件名 - 只从明确的属性中提取,绝不误匹配内容
121
+ * @param {string} attributesPart - 属性部分字符串
122
+ * @returns {string} 提取到的文件名
123
+ */
124
+ function extractFileNameStrict(attributesPart) {
125
+ if (!attributesPart) return "";
126
+
127
+ // 只匹配明确的 file= 或 title= 属性格式
128
+
129
+ // 模式1: file="filename" 或 title="filename" (标准双引号)
130
+ var match = attributesPart.match(/^(?:file|title)="([^"]+)"$/i);
131
+ if (match && match[1]) {
132
+ return cleanFileName(match[1]);
133
+ }
134
+
135
+ // 模式2: file='filename' 或 title='filename' (标准单引号)
136
+ match = attributesPart.match(/^(?:file|title)='([^']+)'$/i);
137
+ if (match && match[1]) {
138
+ return cleanFileName(match[1]);
139
+ }
140
+
141
+ // 模式3: file=filename 或 title=filename (无引号,但必须是单个词)
142
+ match = attributesPart.match(/^(?:file|title)=([^\s"']+)$/i);
143
+ if (match && match[1]) {
144
+ return cleanFileName(match[1]);
145
+ }
146
+
147
+ // 模式4: 处理复杂引号情况,但要非常小心
148
+ // 只处理明确以 file=" 或 title=" 开头的情况
149
+ if (/^(?:file|title)="/i.test(attributesPart)) {
150
+ // 提取从第一个引号到最后一个引号之间的内容
151
+ var startMatch = attributesPart.match(/^(?:file|title)="(.*)$/i);
152
+ if (startMatch && startMatch[1]) {
153
+ var fileName = startMatch[1];
154
+
155
+ // 如果以引号结尾,去掉最后的引号
156
+ if (fileName.endsWith('"')) {
157
+ fileName = fileName.slice(0, -1);
158
+ }
159
+
160
+ // 只有当提取的内容看起来像文件名时才返回
161
+ if (fileName && (fileName.includes(".") || fileName.length < 50)) {
162
+ return cleanFileName(fileName);
163
+ }
164
+ }
165
+ }
166
+
167
+ // 模式5: 处理单引号的复杂情况
168
+ if (/^(?:file|title)='/i.test(attributesPart)) {
169
+ var _startMatch = attributesPart.match(/^(?:file|title)='(.*)$/i);
170
+ if (_startMatch && _startMatch[1]) {
171
+ var _fileName = _startMatch[1];
172
+ if (_fileName.endsWith("'")) {
173
+ _fileName = _fileName.slice(0, -1);
174
+ }
175
+ if (_fileName && (_fileName.includes(".") || _fileName.length < 50)) {
176
+ return cleanFileName(_fileName);
177
+ }
178
+ }
179
+ }
180
+
181
+ // 如果都不匹配,返回空字符串,宁可不要也不误匹配
182
+ return "";
183
+ }
184
+
185
+ /**
186
+ * 清理文件名中的无效字符
187
+ * @param {string} fileName - 原始文件名
188
+ * @returns {string} 清理后的文件名
189
+ */
190
+ function cleanFileName(fileName) {
191
+ if (!fileName) return "";
192
+ fileName = fileName.trim();
193
+
194
+ // 如果文件名过长,可能是误匹配的内容,返回空
195
+ if (fileName.length > 100) {
196
+ return "";
197
+ }
198
+
199
+ // 清理无效字符,保留引号
200
+ fileName = fileName.replace(/[<>:|?*]/g, "_");
201
+ if (!fileName || fileName.replace(/_/g, "") === "") {
202
+ return "";
203
+ }
204
+ return fileName;
205
+ }
206
+
207
+ // /**
208
+ // * 测试用例函数
209
+ // */
210
+ // function testParseFileBlocks() {
211
+ // console.log("开始测试 parseFileBlocks 函数...\n");
212
+
213
+ // const testCases = [
214
+ // {
215
+ // name: "标准格式 - file属性",
216
+ // input: `这是一些文本
217
+ // \`\`\`javascript file="app.js"
218
+ // console.log("Hello World");
219
+ // \`\`\`
220
+ // 更多文本`,
221
+ // expected: {
222
+ // filesCount: 1,
223
+ // fileName: "app.js",
224
+ // language: "javascript",
225
+ // isComplete: true,
226
+ // },
227
+ // },
228
+ // {
229
+ // name: "标准格式 - title属性",
230
+ // input: `\`\`\`python title="main.py"
231
+ // print("Hello Python")
232
+ // \`\`\``,
233
+ // expected: {
234
+ // filesCount: 1,
235
+ // fileName: "main.py",
236
+ // language: "python",
237
+ // isComplete: true,
238
+ // },
239
+ // },
240
+ // {
241
+ // name: "容错测试 - 引号不匹配1",
242
+ // input: `\`\`\`typescript title="这是"我的.ts"
243
+ // export function test() {}
244
+ // \`\`\``,
245
+ // expected: {
246
+ // filesCount: 1,
247
+ // fileName: `这是"我的.ts`,
248
+ // language: "typescript",
249
+ // isComplete: true,
250
+ // },
251
+ // },
252
+ // {
253
+ // name: "容错测试 - 引号不匹配2",
254
+ // input: `\`\`\`css title="这是"我的页面".css"
255
+ // body { margin: 0; }
256
+ // \`\`\``,
257
+ // expected: {
258
+ // filesCount: 1,
259
+ // fileName: `这是"我的页面".css`,
260
+ // language: "css",
261
+ // isComplete: true,
262
+ // },
263
+ // },
264
+ // {
265
+ // name: "容错测试 - 单引号格式",
266
+ // input: `\`\`\`html file='index.html'
267
+ // <h1>Hello</h1>
268
+ // \`\`\``,
269
+ // expected: {
270
+ // filesCount: 1,
271
+ // fileName: "index.html",
272
+ // language: "html",
273
+ // isComplete: true,
274
+ // },
275
+ // },
276
+ // {
277
+ // name: "容错测试 - 无引号格式",
278
+ // input: `\`\`\`json file=config.json
279
+ // {"name": "test"}
280
+ // \`\`\``,
281
+ // expected: {
282
+ // filesCount: 1,
283
+ // fileName: "config.json",
284
+ // language: "json",
285
+ // isComplete: true,
286
+ // },
287
+ // },
288
+ // {
289
+ // name: "无文件名 - 自动生成",
290
+ // input: `\`\`\`javascript
291
+ // function hello() {
292
+ // return "world";
293
+ // }
294
+ // \`\`\``,
295
+ // expected: {
296
+ // filesCount: 1,
297
+ // fileName: "code_block_1.js",
298
+ // language: "javascript",
299
+ // isComplete: true,
300
+ // },
301
+ // },
302
+ // {
303
+ // name: "无语言无文件名",
304
+ // input: `\`\`\`
305
+ // some plain text
306
+ // \`\`\``,
307
+ // expected: {
308
+ // filesCount: 1,
309
+ // fileName: "code_block_1.txt",
310
+ // language: "",
311
+ // isComplete: true,
312
+ // },
313
+ // },
314
+ // {
315
+ // name: "不完整代码块",
316
+ // input: `\`\`\`python title="incomplete.py"
317
+ // print("This is incomplete"`,
318
+ // expected: {
319
+ // filesCount: 1,
320
+ // fileName: "incomplete.py",
321
+ // language: "python",
322
+ // isComplete: false,
323
+ // },
324
+ // },
325
+ // {
326
+ // name: "容错测试 - 复杂引号错误",
327
+ // input: `\`\`\`typescript title="complex"file"name.ts"
328
+ // interface User {
329
+ // name: string;
330
+ // }
331
+ // \`\`\``,
332
+ // expected: {
333
+ // filesCount: 1,
334
+ // fileName: "complex", // 应该提取到第一个引号内的内容
335
+ // language: "typescript",
336
+ // isComplete: true,
337
+ // },
338
+ // },
339
+ // {
340
+ // name: "容错测试 - 特殊字符清理",
341
+ // input: `\`\`\`java file="Test<>:|?.java"
342
+ // public class Test {}
343
+ // \`\`\``,
344
+ // expected: {
345
+ // filesCount: 1,
346
+ // fileName: "Test_____.java", // 特殊字符被替换为下划线
347
+ // language: "java",
348
+ // isComplete: true,
349
+ // },
350
+ // },
351
+ // ];
352
+
353
+ // let passedTests = 0;
354
+ // const totalTests = testCases.length;
355
+
356
+ // testCases.forEach((testCase, index) => {
357
+ // console.log(`测试 ${index + 1}: ${testCase.name}`);
358
+
359
+ // try {
360
+ // const result = parseFileBlocks(testCase.input);
361
+
362
+ // // 检查文件数量
363
+ // const filesCountMatch =
364
+ // result.files.length === testCase.expected.filesCount;
365
+
366
+ // // 检查第一个文件的属性
367
+ // const firstFile = result.files[0];
368
+ // const fileNameMatch = firstFile?.fileName === testCase.expected.fileName;
369
+ // const languageMatch = firstFile?.language === testCase.expected.language;
370
+ // const isCompleteMatch =
371
+ // firstFile?.isComplete === testCase.expected.isComplete;
372
+
373
+ // const allMatch =
374
+ // filesCountMatch && fileNameMatch && languageMatch && isCompleteMatch;
375
+
376
+ // if (allMatch) {
377
+ // console.log("✅ 通过");
378
+ // passedTests++;
379
+ // } else {
380
+ // console.log("❌ 失败");
381
+ // console.log(" 期望:", testCase.expected);
382
+ // console.log(" 实际:", {
383
+ // filesCount: result.files.length,
384
+ // fileName: firstFile?.fileName,
385
+ // language: firstFile?.language,
386
+ // isComplete: firstFile?.isComplete,
387
+ // });
388
+ // }
389
+
390
+ // // 显示解析结果的详细信息
391
+ // console.log(" 解析结果:", {
392
+ // cleanedContentLength: result.content.length,
393
+ // filesCount: result.files.length,
394
+ // files: result.files.map((f) => ({
395
+ // fileName: f.fileName,
396
+ // name: f.name,
397
+ // extension: f.extension,
398
+ // language: f.language,
399
+ // contentLength: f.content.length,
400
+ // content: f.content,
401
+ // isComplete: f.isComplete,
402
+ // })),
403
+ // });
404
+ // } catch (error) {
405
+ // console.log("❌ 执行错误:", error.message);
406
+ // }
407
+
408
+ // console.log("");
409
+ // });
410
+
411
+ // console.log(`测试完成: ${passedTests}/${totalTests} 通过`);
412
+
413
+ // if (passedTests === totalTests) {
414
+ // console.log("🎉 所有测试通过!");
415
+ // } else {
416
+ // console.log(`⚠️ 有 ${totalTests - passedTests} 个测试失败`);
417
+ // }
418
+ // }
419
+
420
+ // // 运行测试(取消注释下面这行来执行测试)
421
+ // testParseFileBlocks();
422
+
423
+ export { parseFileBlocks };
424
+ //# sourceMappingURL=util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.js","sources":["../../../../../rxai/src/tool/util.ts"],"sourcesContent":["/**\n * 解析代码块字符串,提取文件信息和内容\n * @param {string} content - 包含代码块的字符串\n * @returns {Array} 解析结果数组\n */\nexport function parseFileBlocks(content: string) {\n const results = [];\n let currentIndex = 0;\n const resultParts: string[] = [];\n\n while (currentIndex < content.length) {\n // 查找代码块开始标记,支持多种格式和容错\n const startPattern = /```(?:(\\w+)(?:\\s+(.+?))?)?\\s*\\n/g;\n startPattern.lastIndex = currentIndex;\n\n const startMatch = startPattern.exec(content);\n if (!startMatch) {\n // 把剩余内容原样追加\n resultParts.push(content.slice(currentIndex));\n break; // 没有更多代码块\n }\n\n const [startFullMatch, language, attributesPart] = startMatch;\n const contentStartIndex = startMatch.index + startFullMatch.length;\n\n // 先把代码块开始前的普通文本追加到结果\n resultParts.push(content.slice(currentIndex, startMatch.index));\n\n // 解析文件名,采用严格模式,宁可不要也不要误匹配\n let fileName = \"\";\n if (attributesPart) {\n fileName = extractFileNameStrict(attributesPart);\n }\n\n // 在“代码块内容”片段中查找结束标记:支持“开头处 \\s*```”或“换行后 \\s*```”\n const restContent = content.substring(contentStartIndex);\n const endPattern = /(?:^\\s*```|\\n\\s*```)/;\n const endMatch = endPattern.exec(restContent);\n let blockContent: string;\n let isComplete: boolean;\n\n if (endMatch) {\n // 找到结束标记:取标记前的内容并去除首尾空白(空内容即得空字符串)\n blockContent = restContent.substring(0, endMatch.index).trim();\n isComplete = true;\n currentIndex = contentStartIndex + endMatch.index + endMatch[0].length;\n } else {\n // 没有找到结束标记,取到字符串末尾并去除尾部残留的 ``` 行\n blockContent = restContent.replace(/\\n\\s*```\\s*$/, \"\").trim();\n isComplete = false;\n currentIndex = content.length;\n }\n\n // 生成文件名和解析文件信息\n let finalFileName = fileName || \"\";\n let name = \"\";\n let extension = \"\";\n\n if (finalFileName) {\n // 有明确的文件名\n const lastDotIndex = finalFileName.lastIndexOf(\".\");\n name =\n lastDotIndex !== -1\n ? finalFileName.substring(0, lastDotIndex)\n : finalFileName;\n extension =\n lastDotIndex !== -1 ? finalFileName.substring(lastDotIndex + 1) : \"\";\n } else {\n // 没有明确文件名时生成默认文件名\n if (language) {\n const extensionMap: { [key: string]: string } = {\n javascript: \"js\",\n typescript: \"ts\",\n python: \"py\",\n java: \"java\",\n html: \"html\",\n css: \"css\",\n json: \"json\",\n xml: \"xml\",\n yaml: \"yml\",\n yml: \"yml\",\n markdown: \"md\",\n md: \"md\",\n shell: \"sh\",\n bash: \"sh\",\n sql: \"sql\",\n php: \"php\",\n ruby: \"rb\",\n go: \"go\",\n rust: \"rs\",\n swift: \"swift\",\n kotlin: \"kt\",\n };\n\n extension = extensionMap[language.toLowerCase()] || language;\n finalFileName = `code_block_${results.length + 1}.${extension}`;\n name = `code_block_${results.length + 1}`;\n } else {\n finalFileName = `code_block_${results.length + 1}.txt`;\n name = `code_block_${results.length + 1}`;\n extension = \"txt\";\n }\n }\n\n let startIndex = -1;\n if (startMatch) {\n startIndex = startMatch.index;\n }\n\n let endIndex = undefined;\n if (endMatch) {\n endIndex = endMatch.index;\n }\n\n // 用 fileName 作为占位符替换整个代码块\n resultParts.push(finalFileName);\n\n results.push({\n fileName: finalFileName,\n name: name,\n extension: extension,\n language: language || \"\",\n content: blockContent,\n isComplete: isComplete,\n });\n }\n\n const resultContent = resultParts.join(\"\");\n\n return {\n content: resultContent,\n files: results,\n };\n}\n\n/**\n * 严格模式提取文件名 - 只从明确的属性中提取,绝不误匹配内容\n * @param {string} attributesPart - 属性部分字符串\n * @returns {string} 提取到的文件名\n */\nfunction extractFileNameStrict(attributesPart: string): string {\n if (!attributesPart) return \"\";\n\n // 只匹配明确的 file= 或 title= 属性格式\n\n // 模式1: file=\"filename\" 或 title=\"filename\" (标准双引号)\n let match = attributesPart.match(/^(?:file|title)=\"([^\"]+)\"$/i);\n if (match && match[1]) {\n return cleanFileName(match[1]);\n }\n\n // 模式2: file='filename' 或 title='filename' (标准单引号)\n match = attributesPart.match(/^(?:file|title)='([^']+)'$/i);\n if (match && match[1]) {\n return cleanFileName(match[1]);\n }\n\n // 模式3: file=filename 或 title=filename (无引号,但必须是单个词)\n match = attributesPart.match(/^(?:file|title)=([^\\s\"']+)$/i);\n if (match && match[1]) {\n return cleanFileName(match[1]);\n }\n\n // 模式4: 处理复杂引号情况,但要非常小心\n // 只处理明确以 file=\" 或 title=\" 开头的情况\n if (/^(?:file|title)=\"/i.test(attributesPart)) {\n // 提取从第一个引号到最后一个引号之间的内容\n const startMatch = attributesPart.match(/^(?:file|title)=\"(.*)$/i);\n if (startMatch && startMatch[1]) {\n let fileName = startMatch[1];\n\n // 如果以引号结尾,去掉最后的引号\n if (fileName.endsWith('\"')) {\n fileName = fileName.slice(0, -1);\n }\n\n // 只有当提取的内容看起来像文件名时才返回\n if (fileName && (fileName.includes(\".\") || fileName.length < 50)) {\n return cleanFileName(fileName);\n }\n }\n }\n\n // 模式5: 处理单引号的复杂情况\n if (/^(?:file|title)='/i.test(attributesPart)) {\n const startMatch = attributesPart.match(/^(?:file|title)='(.*)$/i);\n if (startMatch && startMatch[1]) {\n let fileName = startMatch[1];\n\n if (fileName.endsWith(\"'\")) {\n fileName = fileName.slice(0, -1);\n }\n\n if (fileName && (fileName.includes(\".\") || fileName.length < 50)) {\n return cleanFileName(fileName);\n }\n }\n }\n\n // 如果都不匹配,返回空字符串,宁可不要也不误匹配\n return \"\";\n}\n\n/**\n * 清理文件名中的无效字符\n * @param {string} fileName - 原始文件名\n * @returns {string} 清理后的文件名\n */\nfunction cleanFileName(fileName: string): string {\n if (!fileName) return \"\";\n\n fileName = fileName.trim();\n\n // 如果文件名过长,可能是误匹配的内容,返回空\n if (fileName.length > 100) {\n return \"\";\n }\n\n // 清理无效字符,保留引号\n fileName = fileName.replace(/[<>:|?*]/g, \"_\");\n\n if (!fileName || fileName.replace(/_/g, \"\") === \"\") {\n return \"\";\n }\n\n return fileName;\n}\n\n// /**\n// * 测试用例函数\n// */\n// function testParseFileBlocks() {\n// console.log(\"开始测试 parseFileBlocks 函数...\\n\");\n\n// const testCases = [\n// {\n// name: \"标准格式 - file属性\",\n// input: `这是一些文本\n// \\`\\`\\`javascript file=\"app.js\"\n// console.log(\"Hello World\");\n// \\`\\`\\`\n// 更多文本`,\n// expected: {\n// filesCount: 1,\n// fileName: \"app.js\",\n// language: \"javascript\",\n// isComplete: true,\n// },\n// },\n// {\n// name: \"标准格式 - title属性\",\n// input: `\\`\\`\\`python title=\"main.py\"\n// print(\"Hello Python\")\n// \\`\\`\\``,\n// expected: {\n// filesCount: 1,\n// fileName: \"main.py\",\n// language: \"python\",\n// isComplete: true,\n// },\n// },\n// {\n// name: \"容错测试 - 引号不匹配1\",\n// input: `\\`\\`\\`typescript title=\"这是\"我的.ts\"\n// export function test() {}\n// \\`\\`\\``,\n// expected: {\n// filesCount: 1,\n// fileName: `这是\"我的.ts`,\n// language: \"typescript\",\n// isComplete: true,\n// },\n// },\n// {\n// name: \"容错测试 - 引号不匹配2\",\n// input: `\\`\\`\\`css title=\"这是\"我的页面\".css\"\n// body { margin: 0; }\n// \\`\\`\\``,\n// expected: {\n// filesCount: 1,\n// fileName: `这是\"我的页面\".css`,\n// language: \"css\",\n// isComplete: true,\n// },\n// },\n// {\n// name: \"容错测试 - 单引号格式\",\n// input: `\\`\\`\\`html file='index.html'\n// <h1>Hello</h1>\n// \\`\\`\\``,\n// expected: {\n// filesCount: 1,\n// fileName: \"index.html\",\n// language: \"html\",\n// isComplete: true,\n// },\n// },\n// {\n// name: \"容错测试 - 无引号格式\",\n// input: `\\`\\`\\`json file=config.json\n// {\"name\": \"test\"}\n// \\`\\`\\``,\n// expected: {\n// filesCount: 1,\n// fileName: \"config.json\",\n// language: \"json\",\n// isComplete: true,\n// },\n// },\n// {\n// name: \"无文件名 - 自动生成\",\n// input: `\\`\\`\\`javascript\n// function hello() {\n// return \"world\";\n// }\n// \\`\\`\\``,\n// expected: {\n// filesCount: 1,\n// fileName: \"code_block_1.js\",\n// language: \"javascript\",\n// isComplete: true,\n// },\n// },\n// {\n// name: \"无语言无文件名\",\n// input: `\\`\\`\\`\n// some plain text\n// \\`\\`\\``,\n// expected: {\n// filesCount: 1,\n// fileName: \"code_block_1.txt\",\n// language: \"\",\n// isComplete: true,\n// },\n// },\n// {\n// name: \"不完整代码块\",\n// input: `\\`\\`\\`python title=\"incomplete.py\"\n// print(\"This is incomplete\"`,\n// expected: {\n// filesCount: 1,\n// fileName: \"incomplete.py\",\n// language: \"python\",\n// isComplete: false,\n// },\n// },\n// {\n// name: \"容错测试 - 复杂引号错误\",\n// input: `\\`\\`\\`typescript title=\"complex\"file\"name.ts\"\n// interface User {\n// name: string;\n// }\n// \\`\\`\\``,\n// expected: {\n// filesCount: 1,\n// fileName: \"complex\", // 应该提取到第一个引号内的内容\n// language: \"typescript\",\n// isComplete: true,\n// },\n// },\n// {\n// name: \"容错测试 - 特殊字符清理\",\n// input: `\\`\\`\\`java file=\"Test<>:|?.java\"\n// public class Test {}\n// \\`\\`\\``,\n// expected: {\n// filesCount: 1,\n// fileName: \"Test_____.java\", // 特殊字符被替换为下划线\n// language: \"java\",\n// isComplete: true,\n// },\n// },\n// ];\n\n// let passedTests = 0;\n// const totalTests = testCases.length;\n\n// testCases.forEach((testCase, index) => {\n// console.log(`测试 ${index + 1}: ${testCase.name}`);\n\n// try {\n// const result = parseFileBlocks(testCase.input);\n\n// // 检查文件数量\n// const filesCountMatch =\n// result.files.length === testCase.expected.filesCount;\n\n// // 检查第一个文件的属性\n// const firstFile = result.files[0];\n// const fileNameMatch = firstFile?.fileName === testCase.expected.fileName;\n// const languageMatch = firstFile?.language === testCase.expected.language;\n// const isCompleteMatch =\n// firstFile?.isComplete === testCase.expected.isComplete;\n\n// const allMatch =\n// filesCountMatch && fileNameMatch && languageMatch && isCompleteMatch;\n\n// if (allMatch) {\n// console.log(\"✅ 通过\");\n// passedTests++;\n// } else {\n// console.log(\"❌ 失败\");\n// console.log(\" 期望:\", testCase.expected);\n// console.log(\" 实际:\", {\n// filesCount: result.files.length,\n// fileName: firstFile?.fileName,\n// language: firstFile?.language,\n// isComplete: firstFile?.isComplete,\n// });\n// }\n\n// // 显示解析结果的详细信息\n// console.log(\" 解析结果:\", {\n// cleanedContentLength: result.content.length,\n// filesCount: result.files.length,\n// files: result.files.map((f) => ({\n// fileName: f.fileName,\n// name: f.name,\n// extension: f.extension,\n// language: f.language,\n// contentLength: f.content.length,\n// content: f.content,\n// isComplete: f.isComplete,\n// })),\n// });\n// } catch (error) {\n// console.log(\"❌ 执行错误:\", error.message);\n// }\n\n// console.log(\"\");\n// });\n\n// console.log(`测试完成: ${passedTests}/${totalTests} 通过`);\n\n// if (passedTests === totalTests) {\n// console.log(\"🎉 所有测试通过!\");\n// } else {\n// console.log(`⚠️ 有 ${totalTests - passedTests} 个测试失败`);\n// }\n// }\n\n// // 运行测试(取消注释下面这行来执行测试)\n// testParseFileBlocks();\n"],"names":["parseFileBlocks","content","results","currentIndex","resultParts","length","startPattern","lastIndex","startMatch","exec","push","slice","startFullMatch","language","attributesPart","contentStartIndex","index","fileName","extractFileNameStrict","restContent","substring","endPattern","endMatch","blockContent","isComplete","trim","replace","finalFileName","name","extension","lastDotIndex","lastIndexOf","extensionMap","javascript","typescript","python","java","html","css","json","xml","yaml","yml","markdown","md","shell","bash","sql","php","ruby","go","rust","swift","kotlin","toLowerCase","concat","resultContent","join","files","match","cleanFileName","test","endsWith","includes"],"mappings":"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CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;;;"}
@@ -0,0 +1,43 @@
1
+ import { defineProperty as _defineProperty } from '../../../_virtual/_rollupPluginBabelHelpers.js';
2
+
3
+ var EMPTY_CACHE = Symbol("EMPTY_CACHE");
4
+ class Events {
5
+ constructor() {
6
+ _defineProperty(this, "events", new Map());
7
+ }
8
+ /** 获取event,不存在默认创建 */
9
+ getEvent(key) {
10
+ var event = this.events.get(key);
11
+ if (!event) {
12
+ this.events.set(key, event = {
13
+ cache: EMPTY_CACHE,
14
+ handles: new Set()
15
+ });
16
+ }
17
+ return event;
18
+ }
19
+
20
+ /** 注册 */
21
+ on(key, handle) {
22
+ var immediate = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
23
+ var event = this.getEvent(key);
24
+ if (immediate && event.cache !== EMPTY_CACHE) {
25
+ handle(event.cache);
26
+ }
27
+ event.handles.add(handle);
28
+ return () => {
29
+ this.off(key, handle);
30
+ };
31
+ }
32
+ off(key, handle) {
33
+ this.getEvent(key).handles.delete(handle);
34
+ }
35
+ emit(key, value) {
36
+ var event = this.getEvent(key);
37
+ event.cache = value;
38
+ event.handles.forEach(handle => handle(value));
39
+ }
40
+ }
41
+
42
+ export { Events };
43
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sources":["../../../../../rxai/src/utils/events.ts"],"sourcesContent":["type Handle<T> = (params: T) => void;\n\nconst EMPTY_CACHE = Symbol(\"EMPTY_CACHE\");\n\nclass Events<TMap extends object> {\n private events = new Map<\n keyof TMap,\n {\n cache: typeof EMPTY_CACHE | TMap[keyof TMap];\n handles: Set<Handle<TMap[keyof TMap]>>;\n }\n >();\n\n /** 获取event,不存在默认创建 */\n getEvent<K extends keyof TMap>(key: K) {\n let event = this.events.get(key);\n if (!event) {\n this.events.set(\n key,\n (event = { cache: EMPTY_CACHE, handles: new Set() }),\n );\n }\n return event;\n }\n\n /** 注册 */\n on<K extends keyof TMap>(\n key: K,\n handle: Handle<TMap[K]>,\n immediate: boolean = true,\n ) {\n const event = this.getEvent(key);\n if (immediate && event.cache !== EMPTY_CACHE) {\n handle(event.cache as TMap[K]);\n }\n event.handles.add(handle as Handle<TMap[keyof TMap]>);\n\n return () => {\n this.off(key, handle);\n };\n }\n\n off<K extends keyof TMap>(key: K, handle: Handle<TMap[K]>) {\n this.getEvent(key).handles.delete(handle as Handle<TMap[keyof TMap]>);\n }\n\n emit<K extends keyof TMap>(key: K, value: TMap[K]) {\n const event = this.getEvent(key);\n event.cache = value;\n event.handles.forEach((handle) => handle(value));\n }\n}\n\nexport { Events };\n"],"names":["EMPTY_CACHE","Symbol","Events","constructor","_defineProperty","Map","getEvent","key","event","events","get","set","cache","handles","Set","on","handle","immediate","arguments","length","undefined","add","off","delete","emit","value","forEach"],"mappings":";;AAEA,IAAMA,WAAW,GAAGC,MAAM,CAAC,aAAa,CAAC;AAEzC,MAAMC,MAAM,CAAsB;EAAAC,WAAAA,GAAA;AAAAC,IAAAA,eAAA,CAAA,IAAA,EAAA,QAAA,EACf,IAAIC,GAAG,EAMrB,CAAA;AAAA,EAAA;AAEH;EACAC,QAAQA,CAAuBC,GAAM,EAAE;IACrC,IAAIC,KAAK,GAAG,IAAI,CAACC,MAAM,CAACC,GAAG,CAACH,GAAG,CAAC;IAChC,IAAI,CAACC,KAAK,EAAE;MACV,IAAI,CAACC,MAAM,CAACE,GAAG,CACbJ,GAAG,EACFC,KAAK,GAAG;AAAEI,QAAAA,KAAK,EAAEZ,WAAW;QAAEa,OAAO,EAAE,IAAIC,GAAG;AAAG,OACpD,CAAC;AACH,IAAA;AACA,IAAA,OAAON,KAAK;AACd,EAAA;;AAEA;AACAO,EAAAA,EAAEA,CACAR,GAAM,EACNS,MAAuB,EAEvB;AAAA,IAAA,IADAC,SAAkB,GAAAC,SAAA,CAAAC,MAAA,GAAA,CAAA,IAAAD,SAAA,CAAA,CAAA,CAAA,KAAAE,SAAA,GAAAF,SAAA,CAAA,CAAA,CAAA,GAAG,IAAI;AAEzB,IAAA,IAAMV,KAAK,GAAG,IAAI,CAACF,QAAQ,CAACC,GAAG,CAAC;AAChC,IAAA,IAAIU,SAAS,IAAIT,KAAK,CAACI,KAAK,KAAKZ,WAAW,EAAE;AAC5CgB,MAAAA,MAAM,CAACR,KAAK,CAACI,KAAgB,CAAC;AAChC,IAAA;AACAJ,IAAAA,KAAK,CAACK,OAAO,CAACQ,GAAG,CAACL,MAAkC,CAAC;AAErD,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,CAACM,GAAG,CAACf,GAAG,EAAES,MAAM,CAAC;IACvB,CAAC;AACH,EAAA;AAEAM,EAAAA,GAAGA,CAAuBf,GAAM,EAAES,MAAuB,EAAE;IACzD,IAAI,CAACV,QAAQ,CAACC,GAAG,CAAC,CAACM,OAAO,CAACU,MAAM,CAACP,MAAkC,CAAC;AACvE,EAAA;AAEAQ,EAAAA,IAAIA,CAAuBjB,GAAM,EAAEkB,KAAc,EAAE;AACjD,IAAA,IAAMjB,KAAK,GAAG,IAAI,CAACF,QAAQ,CAACC,GAAG,CAAC;IAChCC,KAAK,CAACI,KAAK,GAAGa,KAAK;IACnBjB,KAAK,CAACK,OAAO,CAACa,OAAO,CAAEV,MAAM,IAAKA,MAAM,CAACS,KAAK,CAAC,CAAC;AAClD,EAAA;AACF;;;;"}