@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.
- package/dist/_virtual/_rollupPluginBabelHelpers.js +164 -0
- package/dist/_virtual/_rollupPluginBabelHelpers.js.map +1 -0
- package/dist/agents/app.js +335 -0
- package/dist/agents/app.js.map +1 -0
- package/dist/agents/common.js +483 -0
- package/dist/agents/common.js.map +1 -0
- package/dist/agents/custom.js +16 -0
- package/dist/agents/custom.js.map +1 -0
- package/dist/agents/index.js +38 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/knowledges/knowledge-base.js +579 -0
- package/dist/agents/knowledges/knowledge-base.js.map +1 -0
- package/dist/agents/knowledges/knowledge-node.js +228 -0
- package/dist/agents/knowledges/knowledge-node.js.map +1 -0
- package/dist/agents/knowledges/types.js +105 -0
- package/dist/agents/knowledges/types.js.map +1 -0
- package/dist/agents/utils/config.js +229 -0
- package/dist/agents/utils/config.js.map +1 -0
- package/dist/agents/workspace/coding-manager.js +20 -0
- package/dist/agents/workspace/coding-manager.js.map +1 -0
- package/dist/agents/workspace/components-manager.js +113 -0
- package/dist/agents/workspace/components-manager.js.map +1 -0
- package/dist/agents/workspace/outline-focus.js +167 -0
- package/dist/agents/workspace/outline-focus.js.map +1 -0
- package/dist/agents/workspace/outline-info.js +430 -0
- package/dist/agents/workspace/outline-info.js.map +1 -0
- package/dist/agents/workspace/page-tree-generator.js +70 -0
- package/dist/agents/workspace/page-tree-generator.js.map +1 -0
- package/dist/agents/workspace/workspace.js +251 -0
- package/dist/agents/workspace/workspace.js.map +1 -0
- package/dist/agents/workspace-by-knowledges/providers/component-docs-provider.js +100 -0
- package/dist/agents/workspace-by-knowledges/providers/component-docs-provider.js.map +1 -0
- package/dist/agents/workspace-by-knowledges/providers/focus-info-provider.js +120 -0
- package/dist/agents/workspace-by-knowledges/providers/focus-info-provider.js.map +1 -0
- package/dist/agents/workspace-by-knowledges/providers/project-info-provider.js +146 -0
- package/dist/agents/workspace-by-knowledges/providers/project-info-provider.js.map +1 -0
- package/dist/agents/workspace-by-knowledges/test.js +242 -0
- package/dist/agents/workspace-by-knowledges/test.js.map +1 -0
- package/dist/agents/workspace-by-knowledges/utils/components-manager.js +132 -0
- package/dist/agents/workspace-by-knowledges/utils/components-manager.js.map +1 -0
- package/dist/agents/workspace-by-knowledges/utils/outline-focus.js +167 -0
- package/dist/agents/workspace-by-knowledges/utils/outline-focus.js.map +1 -0
- package/dist/agents/workspace-by-knowledges/utils/outline-info.js +430 -0
- package/dist/agents/workspace-by-knowledges/utils/outline-info.js.map +1 -0
- package/dist/agents/workspace-by-knowledges/workspace.js +169 -0
- package/dist/agents/workspace-by-knowledges/workspace.js.map +1 -0
- package/dist/api/cloud-components.js +85 -0
- package/dist/api/cloud-components.js.map +1 -0
- package/dist/api-record-replay/manager.js +168 -0
- package/dist/api-record-replay/manager.js.map +1 -0
- package/{src/api-record-replay/recorder.ts → dist/api-record-replay/recorder.js} +22 -32
- package/dist/api-record-replay/recorder.js.map +1 -0
- package/dist/api-record-replay/replayer.js +136 -0
- package/dist/api-record-replay/replayer.js.map +1 -0
- package/dist/components/attachments/index.js +124 -0
- package/dist/components/attachments/index.js.map +1 -0
- package/dist/components/attachments/index.less.js +8 -0
- package/dist/components/attachments/index.less.js.map +1 -0
- package/dist/components/icons/index.js +112 -0
- package/dist/components/icons/index.js.map +1 -0
- package/dist/components/icons/index.less.js +8 -0
- package/dist/components/icons/index.less.js.map +1 -0
- package/dist/components/mention/index.js +19 -0
- package/dist/components/mention/index.js.map +1 -0
- package/dist/components/mention/index.less.js +8 -0
- package/dist/components/mention/index.less.js.map +1 -0
- package/dist/components/messages/index.js +429 -0
- package/dist/components/messages/index.js.map +1 -0
- package/dist/components/messages/index.less.js +8 -0
- package/dist/components/messages/index.less.js.map +1 -0
- package/dist/components/sender/index.js +244 -0
- package/dist/components/sender/index.js.map +1 -0
- package/dist/components/sender/index.less.js +8 -0
- package/dist/components/sender/index.less.js.map +1 -0
- package/dist/context/RequestStatusTracker.js +44 -0
- package/dist/context/RequestStatusTracker.js.map +1 -0
- package/dist/context/index.js +45 -0
- package/dist/context/index.js.map +1 -0
- package/dist/data.js +4 -0
- package/dist/data.js.map +1 -0
- package/dist/index.js +306 -0
- package/dist/index.js.map +1 -0
- package/dist/plugin-ai/node_modules/style-inject/dist/style-inject.es.js +27 -0
- package/dist/plugin-ai/node_modules/style-inject/dist/style-inject.es.js.map +1 -0
- package/dist/plugin-ai/package.json.js +8 -0
- package/dist/plugin-ai/package.json.js.map +1 -0
- package/dist/plugin-ai/test/index.js +206 -0
- package/dist/plugin-ai/test/index.js.map +1 -0
- package/dist/preset/createTemplates.js +29 -0
- package/dist/preset/createTemplates.js.map +1 -0
- package/dist/preset/index.js +13 -0
- package/dist/preset/index.js.map +1 -0
- package/dist/preset/prompts.js +34 -0
- package/dist/preset/prompts.js.map +1 -0
- package/{src/preset/user.ts → dist/preset/user.js} +4 -3
- package/dist/preset/user.js.map +1 -0
- package/dist/requestAsStream.js +269 -0
- package/dist/requestAsStream.js.map +1 -0
- package/dist/rxai/node_modules/idb/build/index.js +277 -0
- package/dist/rxai/node_modules/idb/build/index.js.map +1 -0
- package/dist/rxai/src/agent/base.js +16 -0
- package/dist/rxai/src/agent/base.js.map +1 -0
- package/dist/rxai/src/agent/planning.js +1076 -0
- package/dist/rxai/src/agent/planning.js.map +1 -0
- package/dist/rxai/src/agent/rxai.js +254 -0
- package/dist/rxai/src/agent/rxai.js.map +1 -0
- package/dist/rxai/src/error/base.js +39 -0
- package/dist/rxai/src/error/base.js.map +1 -0
- package/dist/rxai/src/prompt/base.js +11 -0
- package/dist/rxai/src/prompt/base.js.map +1 -0
- package/dist/rxai/src/prompt/planning.js +23 -0
- package/dist/rxai/src/prompt/planning.js.map +1 -0
- package/dist/rxai/src/prompt/tool.js +14 -0
- package/dist/rxai/src/prompt/tool.js.map +1 -0
- package/dist/rxai/src/request/request.js +123 -0
- package/dist/rxai/src/request/request.js.map +1 -0
- package/dist/rxai/src/tool/getHistoryRecords.js +65 -0
- package/dist/rxai/src/tool/getHistoryRecords.js.map +1 -0
- package/dist/rxai/src/tool/util.js +424 -0
- package/dist/rxai/src/tool/util.js.map +1 -0
- package/dist/rxai/src/utils/events.js +43 -0
- package/dist/rxai/src/utils/events.js.map +1 -0
- package/dist/rxai/src/utils/idb.js +240 -0
- package/dist/rxai/src/utils/idb.js.map +1 -0
- package/dist/rxai/src/utils/retry.js +32 -0
- package/dist/rxai/src/utils/retry.js.map +1 -0
- package/dist/rxai/src/utils/uuid.js +7 -0
- package/dist/rxai/src/utils/uuid.js.map +1 -0
- package/dist/startView/components/header/header.js +12 -0
- package/dist/startView/components/header/header.js.map +1 -0
- package/dist/startView/components/header/header.less.js +8 -0
- package/dist/startView/components/header/header.less.js.map +1 -0
- package/dist/startView/index.js +62 -0
- package/dist/startView/index.js.map +1 -0
- package/dist/startView/index.less.js +8 -0
- package/dist/startView/index.less.js.map +1 -0
- package/dist/tools/analyze-and-expand-prd.js +116 -0
- package/dist/tools/analyze-and-expand-prd.js.map +1 -0
- package/dist/tools/analyze-requirement-and-components.js +208 -0
- package/dist/tools/analyze-requirement-and-components.js.map +1 -0
- package/dist/tools/answer.js +33 -0
- package/dist/tools/answer.js.map +1 -0
- package/dist/tools/build-process.js +550 -0
- package/dist/tools/build-process.js.map +1 -0
- package/dist/tools/coding-subagent-as-tool.js +101 -0
- package/dist/tools/coding-subagent-as-tool.js.map +1 -0
- package/dist/tools/generate-ui-content.js +528 -0
- package/dist/tools/generate-ui-content.js.map +1 -0
- package/dist/tools/index.js +31 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/open-dsl.js +49 -0
- package/dist/tools/open-dsl.js.map +1 -0
- package/dist/tools/refactor-ui-content.js +292 -0
- package/dist/tools/refactor-ui-content.js.map +1 -0
- package/dist/tools/utils.js +832 -0
- package/dist/tools/utils.js.map +1 -0
- package/dist/types/index.js +8 -0
- package/dist/types/index.js.map +1 -0
- package/dist/view/components/header/header.js +59 -0
- package/dist/view/components/header/header.js.map +1 -0
- package/dist/view/components/header/header.less.js +8 -0
- package/dist/view/components/header/header.less.js.map +1 -0
- package/dist/view/index.js +184 -0
- package/dist/view/index.js.map +1 -0
- package/dist/view/index.less.js +8 -0
- package/dist/view/index.less.js.map +1 -0
- package/package.json +28 -6
- package/src/agents/app.ts +0 -301
- package/src/agents/common.ts +0 -471
- package/src/agents/custom.ts +0 -14
- package/src/agents/index.ts +0 -37
- package/src/agents/knowledges/README.md +0 -614
- package/src/agents/knowledges/SUMMARY.md +0 -527
- package/src/agents/knowledges/index.ts +0 -8
- package/src/agents/knowledges/knowledge-base.ts +0 -565
- package/src/agents/knowledges/knowledge-node.ts +0 -266
- package/src/agents/knowledges/types.ts +0 -208
- package/src/agents/utils/config.ts +0 -427
- package/src/agents/workspace/coding-manager.ts +0 -31
- package/src/agents/workspace/components-manager.ts +0 -124
- package/src/agents/workspace/outline-focus.ts +0 -188
- package/src/agents/workspace/outline-info.ts +0 -520
- package/src/agents/workspace/page-tree-generator.ts +0 -83
- package/src/agents/workspace/workspace.ts +0 -319
- package/src/agents/workspace-by-knowledges/MIGRATION.md +0 -568
- package/src/agents/workspace-by-knowledges/README.md +0 -521
- package/src/agents/workspace-by-knowledges/index.ts +0 -11
- package/src/agents/workspace-by-knowledges/providers/component-docs-provider.ts +0 -92
- package/src/agents/workspace-by-knowledges/providers/focus-info-provider.ts +0 -131
- package/src/agents/workspace-by-knowledges/providers/index.ts +0 -8
- package/src/agents/workspace-by-knowledges/providers/project-info-provider.ts +0 -151
- package/src/agents/workspace-by-knowledges/test.ts +0 -240
- package/src/agents/workspace-by-knowledges/types.ts +0 -56
- package/src/agents/workspace-by-knowledges/utils/components-manager.ts +0 -145
- package/src/agents/workspace-by-knowledges/utils/index.ts +0 -8
- package/src/agents/workspace-by-knowledges/utils/outline-focus.ts +0 -178
- package/src/agents/workspace-by-knowledges/utils/outline-info.ts +0 -521
- package/src/agents/workspace-by-knowledges/workspace.ts +0 -166
- package/src/api/cloud-components.ts +0 -129
- package/src/api-record-replay/README.md +0 -187
- package/src/api-record-replay/index.ts +0 -11
- package/src/api-record-replay/manager.ts +0 -168
- package/src/api-record-replay/replayer.ts +0 -148
- package/src/components/attachments/index.less +0 -117
- package/src/components/attachments/index.tsx +0 -136
- package/src/components/icons/index.less +0 -8
- package/src/components/icons/index.tsx +0 -44
- package/src/components/index.less +0 -34
- package/src/components/mention/index.less +0 -23
- package/src/components/mention/index.tsx +0 -19
- package/src/components/messages/index.less +0 -1013
- package/src/components/messages/index.tsx +0 -519
- package/src/components/sender/index.less +0 -203
- package/src/components/sender/index.tsx +0 -298
- package/src/components/types.ts +0 -31
- package/src/constants/index.ts +0 -8
- package/src/context/RequestStatusTracker.ts +0 -50
- package/src/context/index.ts +0 -83
- package/src/data.ts +0 -5
- package/src/global.d.ts +0 -100
- package/src/index.tsx +0 -264
- package/src/mock.ts +0 -1267
- package/src/preset/agents.ts +0 -380
- package/src/preset/createTemplates.ts +0 -25
- package/src/preset/index.ts +0 -12
- package/src/preset/prompts.ts +0 -235
- package/src/preset/requestAsStream.ts +0 -246
- package/src/startView/components/header/header.less +0 -17
- package/src/startView/components/header/header.tsx +0 -15
- package/src/startView/components/index.ts +0 -1
- package/src/startView/index.less +0 -34
- package/src/startView/index.tsx +0 -61
- package/src/tools/analyze-and-expand-prd.ts +0 -272
- package/src/tools/analyze-requirement-and-components.ts +0 -589
- package/src/tools/answer.ts +0 -59
- package/src/tools/build-process.ts +0 -1174
- package/src/tools/coding-subagent-as-tool.ts +0 -119
- package/src/tools/generate-ui-content.ts +0 -1083
- package/src/tools/index.ts +0 -28
- package/src/tools/open-dsl.ts +0 -69
- package/src/tools/refactor-ui-content.ts +0 -801
- package/src/tools/type.d.ts +0 -12
- package/src/tools/utils.ts +0 -914
- package/src/types/index.ts +0 -4
- package/src/view/components/header/header.less +0 -51
- package/src/view/components/header/header.tsx +0 -60
- package/src/view/components/index.ts +0 -1
- package/src/view/index.less +0 -5
- 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;;;;"}
|