apifox-workspace-mcp 2.0.8 → 2.1.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 (63) hide show
  1. package/dist/core/cache/unified-cache-manager.d.ts +60 -2
  2. package/dist/core/cache/unified-cache-manager.d.ts.map +1 -1
  3. package/dist/core/cache/unified-cache-manager.js +167 -2
  4. package/dist/core/cache/unified-cache-manager.js.map +1 -1
  5. package/dist/core/client/mcp-bridge.d.ts +8 -0
  6. package/dist/core/client/mcp-bridge.d.ts.map +1 -1
  7. package/dist/core/client/mcp-bridge.js +86 -0
  8. package/dist/core/client/mcp-bridge.js.map +1 -1
  9. package/dist/core/config/manager.d.ts +23 -0
  10. package/dist/core/config/manager.d.ts.map +1 -1
  11. package/dist/core/config/manager.js +90 -1
  12. package/dist/core/config/manager.js.map +1 -1
  13. package/dist/core/generator/artifact.d.ts +2 -0
  14. package/dist/core/generator/artifact.d.ts.map +1 -1
  15. package/dist/core/generator/artifact.js +70 -6
  16. package/dist/core/generator/artifact.js.map +1 -1
  17. package/dist/core/generator/cursor-rules-loader.d.ts +34 -0
  18. package/dist/core/generator/cursor-rules-loader.d.ts.map +1 -0
  19. package/dist/core/generator/cursor-rules-loader.js +147 -0
  20. package/dist/core/generator/cursor-rules-loader.js.map +1 -0
  21. package/dist/core/generator/index.d.ts +3 -0
  22. package/dist/core/generator/index.d.ts.map +1 -1
  23. package/dist/core/generator/index.js +2 -0
  24. package/dist/core/generator/index.js.map +1 -1
  25. package/dist/core/generator/type-transformer.d.ts +18 -0
  26. package/dist/core/generator/type-transformer.d.ts.map +1 -0
  27. package/dist/core/generator/type-transformer.js +103 -0
  28. package/dist/core/generator/type-transformer.js.map +1 -0
  29. package/dist/core/parser/index.d.ts +1 -1
  30. package/dist/core/parser/index.d.ts.map +1 -1
  31. package/dist/core/parser/index.js +1 -1
  32. package/dist/core/parser/index.js.map +1 -1
  33. package/dist/core/parser/llms.d.ts +12 -0
  34. package/dist/core/parser/llms.d.ts.map +1 -1
  35. package/dist/core/parser/llms.js +24 -0
  36. package/dist/core/parser/llms.js.map +1 -1
  37. package/dist/lib/env.d.ts.map +1 -1
  38. package/dist/lib/env.js.map +1 -1
  39. package/dist/server/handlers/generate-artifacts.d.ts.map +1 -1
  40. package/dist/server/handlers/generate-artifacts.js +22 -31
  41. package/dist/server/handlers/generate-artifacts.js.map +1 -1
  42. package/dist/server/handlers/get-interface-detail.d.ts.map +1 -1
  43. package/dist/server/handlers/get-interface-detail.js +41 -66
  44. package/dist/server/handlers/get-interface-detail.js.map +1 -1
  45. package/dist/server/handlers/index.d.ts +1 -0
  46. package/dist/server/handlers/index.d.ts.map +1 -1
  47. package/dist/server/handlers/index.js +1 -0
  48. package/dist/server/handlers/index.js.map +1 -1
  49. package/dist/server/handlers/list-project-interfaces.d.ts.map +1 -1
  50. package/dist/server/handlers/list-project-interfaces.js +23 -14
  51. package/dist/server/handlers/list-project-interfaces.js.map +1 -1
  52. package/dist/server/handlers/parse-and-add-project.js +9 -9
  53. package/dist/server/handlers/parse-and-add-project.js.map +1 -1
  54. package/dist/server/handlers/query-interfaces.d.ts.map +1 -1
  55. package/dist/server/handlers/query-interfaces.js +12 -0
  56. package/dist/server/handlers/query-interfaces.js.map +1 -1
  57. package/dist/server/handlers/refresh-project-cache.d.ts +22 -0
  58. package/dist/server/handlers/refresh-project-cache.d.ts.map +1 -0
  59. package/dist/server/handlers/refresh-project-cache.js +45 -0
  60. package/dist/server/handlers/refresh-project-cache.js.map +1 -0
  61. package/dist/server/index.js +32 -4
  62. package/dist/server/index.js.map +1 -1
  63. package/package.json +4 -4
@@ -1,13 +1,84 @@
1
+ import { existsSync, readFileSync } from 'fs';
2
+ import { homedir } from 'os';
3
+ import { join, resolve } from 'path';
4
+ import { DEFAULT_SERVER_NAME } from '../../lib/env.js';
1
5
  /**
2
6
  * 配置管理器
3
7
  * 负责从环境变量中获取配置信息
4
8
  * APIFOX_ACCESS_TOKEN 和 APIFOX_API_BASE_URL 从环境变量中获取(MCP Server 的 env 配置)
9
+ * 缓存配置从 MCP 配置文件中读取(.cursor/mcp.json)
5
10
  */
6
11
  export class ConfigManager {
7
12
  projectRoot;
13
+ cacheConfig = null;
8
14
  constructor(projectRoot) {
9
15
  this.projectRoot = projectRoot;
10
- // projectRoot 保留用于未来可能的扩展,当前不使用
16
+ this.loadCacheConfig();
17
+ }
18
+ /**
19
+ * 从 MCP 配置文件中读取缓存配置
20
+ * 复用 src/lib/env.ts 的配置读取逻辑,但只读取 cache 字段
21
+ */
22
+ loadCacheConfig() {
23
+ const candidatePaths = this.buildCandidatePaths();
24
+ for (const path of candidatePaths) {
25
+ if (!path || !existsSync(path)) {
26
+ continue;
27
+ }
28
+ try {
29
+ const file = readFileSync(path, 'utf-8');
30
+ const config = JSON.parse(file);
31
+ const serverConfig = this.pickServerConfig(config, DEFAULT_SERVER_NAME);
32
+ if (serverConfig?.cache) {
33
+ this.cacheConfig = {
34
+ defaultTTL: serverConfig.cache.defaultTTL ?? 86400, // 默认 24 小时
35
+ projectTTL: serverConfig.cache.projectTTL ?? {},
36
+ };
37
+ break; // 找到第一个有效配置后停止
38
+ }
39
+ }
40
+ catch {
41
+ // 忽略解析错误,继续尝试下一个配置文件
42
+ }
43
+ }
44
+ // 如果没有找到配置,使用默认值
45
+ if (!this.cacheConfig) {
46
+ this.cacheConfig = {
47
+ defaultTTL: 86400,
48
+ projectTTL: {},
49
+ };
50
+ }
51
+ }
52
+ /**
53
+ * 复用 src/lib/env.ts 的路径构建逻辑
54
+ */
55
+ buildCandidatePaths() {
56
+ const paths = new Set();
57
+ if (this.projectRoot) {
58
+ paths.add(resolve(this.projectRoot, '.cursor', 'mcp.json'));
59
+ }
60
+ if (process.env.APIFOX_MCP_CONFIG_PATH) {
61
+ paths.add(resolve(process.env.APIFOX_MCP_CONFIG_PATH));
62
+ }
63
+ paths.add(join(homedir(), '.cursor', 'mcp.json'));
64
+ return Array.from(paths);
65
+ }
66
+ /**
67
+ * 复用 src/lib/env.ts 的服务器配置选择逻辑
68
+ */
69
+ pickServerConfig(config, serverName) {
70
+ if (!config?.mcpServers) {
71
+ return null;
72
+ }
73
+ if (config.mcpServers[serverName]) {
74
+ return config.mcpServers[serverName];
75
+ }
76
+ // 回退:寻找 command 中包含 apifox 的 server
77
+ const fallback = Object.values(config.mcpServers).find((server) => !!server &&
78
+ typeof server === 'object' &&
79
+ typeof server.command === 'string' &&
80
+ server.command.includes('apifox'));
81
+ return fallback ?? null;
11
82
  }
12
83
  /**
13
84
  * 从环境变量中获取 APIFOX_ACCESS_TOKEN
@@ -30,5 +101,23 @@ export class ConfigManager {
30
101
  const trimmed = baseUrl.trim();
31
102
  return trimmed.length > 0 ? trimmed : null;
32
103
  }
104
+ /**
105
+ * 获取项目的 TTL(优先使用项目特定 TTL,否则使用通用 TTL)
106
+ */
107
+ getProjectTTL(projectId) {
108
+ if (!this.cacheConfig) {
109
+ return 86400; // 默认值
110
+ }
111
+ return this.cacheConfig.projectTTL[projectId] ?? this.cacheConfig.defaultTTL;
112
+ }
113
+ /**
114
+ * 获取默认 TTL
115
+ */
116
+ getDefaultTTL() {
117
+ if (!this.cacheConfig) {
118
+ return 86400; // 默认值
119
+ }
120
+ return this.cacheConfig.defaultTTL;
121
+ }
33
122
  }
34
123
  //# sourceMappingURL=manager.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/core/config/manager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,OAAO,aAAa;IACJ;IAApB,YAAoB,WAAmB;QAAnB,gBAAW,GAAX,WAAW,CAAQ;QACrC,gCAAgC;IAClC,CAAC;IAED;;;OAGG;IACH,cAAc;QACZ,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;QAE9C,6BAA6B;QAC7B,OAAO,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IACrD,CAAC;IAED;;;OAGG;IACH,aAAa;QACX,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;QAChD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAC/B,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7C,CAAC;CACF"}
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/core/config/manager.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,8 @@ export interface ArtifactInput {
10
10
  response?: ApiResponseSpec;
11
11
  };
12
12
  baseUrl?: string;
13
+ projectRoot?: string;
14
+ rawTypeCode?: string;
13
15
  }
14
16
  export interface GeneratedArtifact {
15
17
  title: string;
@@ -1 +1 @@
1
- {"version":3,"file":"artifact.d.ts","sourceRoot":"","sources":["../../../src/core/generator/artifact.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAIvE,MAAM,WAAW,aAAa;IAC5B,eAAe,EAAE;QACf,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,OAAO,CAAC,EAAE,cAAc,CAAC;QACzB,QAAQ,CAAC,EAAE,eAAe,CAAC;KAC5B,CAAC;IACF,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,WAAW,GAAG,kBAAkB,GAAG,cAAc,CAAC;AAE1F,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,aAAa,GAAG,iBAAiB,CAW9F"}
1
+ {"version":3,"file":"artifact.d.ts","sourceRoot":"","sources":["../../../src/core/generator/artifact.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAMvE,MAAM,WAAW,aAAa;IAC5B,eAAe,EAAE;QACf,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,OAAO,CAAC,EAAE,cAAc,CAAC;QACzB,QAAQ,CAAC,EAAE,eAAe,CAAC;KAC5B,CAAC;IACF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,WAAW,GAAG,kBAAkB,GAAG,cAAc,CAAC;AAE1F,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,aAAa,GAAG,iBAAiB,CAW9F"}
@@ -1,3 +1,5 @@
1
+ import { transformTypeNames } from './type-transformer.js';
2
+ import { loadCursorRules, applyCursorRules } from './cursor-rules-loader.js';
1
3
  export function generateArtifact(type, payload) {
2
4
  switch (type) {
3
5
  case 'mock_data':
@@ -11,22 +13,84 @@ export function generateArtifact(type, payload) {
11
13
  }
12
14
  }
13
15
  function generateTsTypes(payload) {
14
- const { interfaceDetail } = payload;
16
+ const { interfaceDetail, rawTypeCode, projectRoot } = payload;
15
17
  const name = interfaceDetail.name ?? 'Unknown';
16
- const requestName = `${pascalCase(name)}Request`;
17
- const responseName = `${pascalCase(name)}Response`;
18
- const requestType = jsonToTypescript((interfaceDetail.request?.body?.json ?? {}));
19
- const responseType = jsonToTypescript((interfaceDetail.response?.body?.json ?? {}));
20
- const content = `// ${name}
18
+ let content;
19
+ // 如果提供了原始类型代码(从官方 MCP Server 获取),使用它
20
+ if (rawTypeCode) {
21
+ // 1. 语义化改造
22
+ content = transformTypeNames(rawTypeCode, interfaceDetail);
23
+ // 2. 应用 Cursor Rules(如果项目根目录存在)
24
+ if (projectRoot) {
25
+ const rules = loadCursorRules(projectRoot);
26
+ if (rules) {
27
+ // 对类型名称应用规则(这里简化处理,实际可能需要更复杂的 AST 解析)
28
+ // 暂时只对整体代码进行基本处理
29
+ content = applyTypeNamingRules(content, rules, interfaceDetail);
30
+ }
31
+ }
32
+ }
33
+ else {
34
+ // 使用原有逻辑生成类型
35
+ const requestName = `${pascalCase(name)}Request`;
36
+ const responseName = `${pascalCase(name)}Response`;
37
+ const requestType = jsonToTypescript((interfaceDetail.request?.body?.json ?? {}));
38
+ const responseType = jsonToTypescript((interfaceDetail.response?.body?.json ?? {}));
39
+ content = `// ${name}
21
40
  export interface ${requestName} ${requestType || '{}'}
22
41
 
23
42
  export interface ${responseName} ${responseType || '{}'}
24
43
  `;
44
+ // 应用 Cursor Rules(如果项目根目录存在)
45
+ if (projectRoot) {
46
+ const rules = loadCursorRules(projectRoot);
47
+ if (rules) {
48
+ const transformedRequestName = applyCursorRules(requestName, rules, true);
49
+ const transformedResponseName = applyCursorRules(responseName, rules, false);
50
+ content = content.replace(requestName, transformedRequestName);
51
+ content = content.replace(responseName, transformedResponseName);
52
+ }
53
+ }
54
+ }
25
55
  return {
26
56
  title: `${name} 类型定义`,
27
57
  content,
28
58
  };
29
59
  }
60
+ /**
61
+ * 应用类型命名规则到类型代码
62
+ * @param typeCode 类型代码
63
+ * @param rules 命名规则
64
+ * @param interfaceDetail 接口详情
65
+ * @returns 应用规则后的类型代码
66
+ */
67
+ function applyTypeNamingRules(typeCode, rules, interfaceDetail) {
68
+ if (!rules) {
69
+ return typeCode;
70
+ }
71
+ // 这里可以进行更复杂的 AST 解析和替换
72
+ // 目前先进行简单的字符串替换
73
+ let transformedCode = typeCode;
74
+ // 替换通用类型名称
75
+ if (rules.forbiddenNames) {
76
+ for (const forbidden of rules.forbiddenNames) {
77
+ const regex = new RegExp(`\\b${forbidden}\\b`, 'g');
78
+ if (regex.test(transformedCode)) {
79
+ // 生成替代名称
80
+ const replacement = generateReplacementName(interfaceDetail, forbidden);
81
+ transformedCode = transformedCode.replace(regex, replacement);
82
+ }
83
+ }
84
+ }
85
+ return transformedCode;
86
+ }
87
+ /**
88
+ * 生成替代名称
89
+ */
90
+ function generateReplacementName(interfaceDetail, _originalName) {
91
+ const semanticName = pascalCase(interfaceDetail.name || 'Api');
92
+ return semanticName;
93
+ }
30
94
  function generateMockData(payload) {
31
95
  const { interfaceDetail } = payload;
32
96
  const name = interfaceDetail.name ?? 'Unknown';
@@ -1 +1 @@
1
- {"version":3,"file":"artifact.js","sourceRoot":"","sources":["../../../src/core/generator/artifact.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"artifact.js","sourceRoot":"","sources":["../../../src/core/generator/artifact.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AA0B7E,MAAM,UAAU,gBAAgB,CAAC,IAAkB,EAAE,OAAsB;IACzE,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,WAAW;YACd,OAAO,gBAAgB,CAAC,OAAO,CAAC,CAAC;QACnC,KAAK,kBAAkB;YACrB,OAAO,sBAAsB,CAAC,OAAO,CAAC,CAAC;QACzC,KAAK,cAAc;YACjB,OAAO,kBAAkB,CAAC,OAAO,CAAC,CAAC;QACrC;YACE,OAAO,eAAe,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,OAAsB;IAC7C,MAAM,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;IAC9D,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,IAAI,SAAS,CAAC;IAE/C,IAAI,OAAe,CAAC;IAEpB,qCAAqC;IACrC,IAAI,WAAW,EAAE,CAAC;QAChB,WAAW;QACX,OAAO,GAAG,kBAAkB,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;QAE3D,gCAAgC;QAChC,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,KAAK,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;YAC3C,IAAI,KAAK,EAAE,CAAC;gBACV,sCAAsC;gBACtC,iBAAiB;gBACjB,OAAO,GAAG,oBAAoB,CAAC,OAAO,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC;YAClE,CAAC;QACH,CAAC;IACH,CAAC;SAAM,CAAC;QACN,aAAa;QACb,MAAM,WAAW,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;QACjD,MAAM,YAAY,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC;QAEnD,MAAM,WAAW,GAAG,gBAAgB,CAAC,CAAC,eAAe,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE,CAAc,CAAC,CAAC;QAC/F,MAAM,YAAY,GAAG,gBAAgB,CACnC,CAAC,eAAe,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE,CAAc,CAC1D,CAAC;QAEF,OAAO,GAAG,MAAM,IAAI;mBACL,WAAW,IAAI,WAAW,IAAI,IAAI;;mBAElC,YAAY,IAAI,YAAY,IAAI,IAAI;CACtD,CAAC;QAEE,6BAA6B;QAC7B,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,KAAK,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;YAC3C,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,sBAAsB,GAAG,gBAAgB,CAAC,WAAW,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;gBAC1E,MAAM,uBAAuB,GAAG,gBAAgB,CAAC,YAAY,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;gBAC7E,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,sBAAsB,CAAC,CAAC;gBAC/D,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,uBAAuB,CAAC,CAAC;YACnE,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,KAAK,EAAE,GAAG,IAAI,OAAO;QACrB,OAAO;KACR,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,SAAS,oBAAoB,CAC3B,QAAgB,EAChB,KAAyC,EACzC,eAAiD;IAEjD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,uBAAuB;IACvB,gBAAgB;IAChB,IAAI,eAAe,GAAG,QAAQ,CAAC;IAE/B,WAAW;IACX,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;QACzB,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;YAC7C,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,MAAM,SAAS,KAAK,EAAE,GAAG,CAAC,CAAC;YACpD,IAAI,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC;gBAChC,SAAS;gBACT,MAAM,WAAW,GAAG,uBAAuB,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC;gBACxE,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;YAChE,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,eAAe,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,SAAS,uBAAuB,CAC9B,eAAiD,EACjD,aAAqB;IAErB,MAAM,YAAY,GAAG,UAAU,CAAC,eAAe,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC;IAC/D,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAsB;IAC9C,MAAM,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC;IACpC,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,IAAI,SAAS,CAAC;IAC/C,MAAM,QAAQ,GACZ,eAAe,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI;QACpC,eAAe,CAAC,QAAQ,EAAE,OAAO;QACjC,sBAAsB,CAAC,eAAe,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAClD,OAAO;QACL,KAAK,EAAE,GAAG,IAAI,UAAU;QACxB,OAAO;KACR,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAAC,OAAsB;IACpD,MAAM,EAAE,eAAe,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAC7C,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,IAAI,SAAS,CAAC;IAC/C,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,IAAI,KAAK,CAAC;IAC/C,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,IAAI,GAAG,CAAC;IACzC,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,WAAW,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;IACjD,MAAM,YAAY,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC;IACnD,MAAM,GAAG,GAAG,GAAG,OAAO,IAAI,yBAAyB,GAAG,IAAI,EAAE,CAAC;IAE7D,MAAM,OAAO,GAAG;;wBAEM,MAAM,aAAa,WAAW,cAAc,YAAY;yCACvC,YAAY;YACzC,GAAG;eACA,MAAM;;;;;CAKpB,CAAC;IACA,OAAO;QACL,KAAK,EAAE,GAAG,IAAI,OAAO;QACrB,OAAO;KACR,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAsB;IAChD,MAAM,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC;IACpC,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,IAAI,SAAS,CAAC;IAC/C,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,IAAI,KAAK,CAAC;IAC/C,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,IAAI,GAAG,CAAC;IACzC,MAAM,YAAY,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC;IAEnD,MAAM,OAAO,GAAG;;YAEN,IAAI;;;SAGP,MAAM,CAAC,WAAW,EAAE,KAAK,IAAI;;;;kBAIpB,YAAY;;;;CAI7B,CAAC;IACA,OAAO;QACL,KAAK,EAAE,GAAG,IAAI,OAAO;QACrB,OAAO;KACR,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAe;IACvC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1C,CAAC;IACD,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;YACxD,MAAM,QAAQ,GAAG,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3C,OAAO,GAAG,GAAG,GAAG,QAAQ,KAAK,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC;QAC1D,CAAC,CAAC,CAAC;QACH,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5D,CAAC;IACD,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAClB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,OAAO,IAAI,CAAC;AACrB,CAAC;AAED,SAAS,sBAAsB,CAAC,MAA2D;IACzF,OAAO;QACL,OAAO,EAAE,qCAAqC;QAC9C,WAAW,EAAE,MAAM,CAAC,EAAE;KACvB,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,KAAa;IAC9B,OAAO,KAAK;SACT,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;SAC3D,OAAO,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAC/B,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACxD,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Cursor Rules 加载器
3
+ * 读取并解析项目中的 .cursorrules 文件,提取类型命名规范
4
+ */
5
+ /**
6
+ * 类型命名规范
7
+ */
8
+ export interface TypeNamingRules {
9
+ /** 接口命名风格 */
10
+ interfaceStyle?: 'PascalCase' | 'camelCase' | 'snake_case' | 'kebab-case';
11
+ /** 请求类型后缀 */
12
+ requestSuffix?: string;
13
+ /** 响应类型后缀 */
14
+ responseSuffix?: string;
15
+ /** 禁止使用的通用名称 */
16
+ forbiddenNames?: string[];
17
+ /** 优先使用的业务语义 */
18
+ preferredSemantics?: string[];
19
+ }
20
+ /**
21
+ * 从项目根目录读取 Cursor Rules
22
+ * @param projectRoot 项目根目录
23
+ * @returns 类型命名规范,如果文件不存在或解析失败则返回 null
24
+ */
25
+ export declare function loadCursorRules(projectRoot: string): TypeNamingRules | null;
26
+ /**
27
+ * 应用 Cursor Rules 到类型名称
28
+ * @param typeName 原始类型名称
29
+ * @param rules 类型命名规范
30
+ * @param isRequest 是否为请求类型
31
+ * @returns 格式化后的类型名称
32
+ */
33
+ export declare function applyCursorRules(typeName: string, rules: TypeNamingRules | null, isRequest?: boolean): string;
34
+ //# sourceMappingURL=cursor-rules-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor-rules-loader.d.ts","sourceRoot":"","sources":["../../../src/core/generator/cursor-rules-loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,aAAa;IACb,cAAc,CAAC,EAAE,YAAY,GAAG,WAAW,GAAG,YAAY,GAAG,YAAY,CAAC;IAC1E,aAAa;IACb,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa;IACb,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB;IAChB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,gBAAgB;IAChB,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC/B;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAiB3E;AAuDD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,eAAe,GAAG,IAAI,EAC7B,SAAS,GAAE,OAAe,GACzB,MAAM,CAkCR"}
@@ -0,0 +1,147 @@
1
+ /**
2
+ * Cursor Rules 加载器
3
+ * 读取并解析项目中的 .cursorrules 文件,提取类型命名规范
4
+ */
5
+ import { readFileSync, existsSync } from 'fs';
6
+ import { join } from 'path';
7
+ import { logger } from '../../lib/logger.js';
8
+ /**
9
+ * 从项目根目录读取 Cursor Rules
10
+ * @param projectRoot 项目根目录
11
+ * @returns 类型命名规范,如果文件不存在或解析失败则返回 null
12
+ */
13
+ export function loadCursorRules(projectRoot) {
14
+ const rulesFilePath = join(projectRoot, '.cursorrules');
15
+ if (!existsSync(rulesFilePath)) {
16
+ logger.debug(`[cursor-rules] 未找到 .cursorrules 文件: ${rulesFilePath}`);
17
+ return null;
18
+ }
19
+ try {
20
+ const content = readFileSync(rulesFilePath, 'utf-8');
21
+ return parseCursorRules(content);
22
+ }
23
+ catch (error) {
24
+ logger.warn(`[cursor-rules] 读取 .cursorrules 文件失败: ${error instanceof Error ? error.message : String(error)}`);
25
+ return null;
26
+ }
27
+ }
28
+ /**
29
+ * 解析 Cursor Rules 内容
30
+ * @param content .cursorrules 文件内容
31
+ * @returns 类型命名规范
32
+ */
33
+ function parseCursorRules(content) {
34
+ const rules = {};
35
+ // 解析接口命名风格
36
+ const interfaceStyleMatch = content.match(/(?:interface|type|命名).*?(?:style|风格).*?[::]\s*(PascalCase|camelCase|snake_case|kebab-case)/i);
37
+ if (interfaceStyleMatch) {
38
+ rules.interfaceStyle = interfaceStyleMatch[1];
39
+ }
40
+ // 解析请求类型后缀
41
+ const requestSuffixMatch = content.match(/(?:request|请求).*?(?:suffix|后缀).*?[::]\s*(\w+)/i);
42
+ if (requestSuffixMatch) {
43
+ rules.requestSuffix = requestSuffixMatch[1];
44
+ }
45
+ // 解析响应类型后缀
46
+ const responseSuffixMatch = content.match(/(?:response|响应).*?(?:suffix|后缀).*?[::]\s*(\w+)/i);
47
+ if (responseSuffixMatch) {
48
+ rules.responseSuffix = responseSuffixMatch[1];
49
+ }
50
+ // 解析禁止使用的名称
51
+ const forbiddenMatch = content.match(/(?:forbidden|禁止|避免).*?(?:name|名称).*?[::]\s*([^\n]+)/i);
52
+ if (forbiddenMatch) {
53
+ rules.forbiddenNames = forbiddenMatch[1]
54
+ .split(/[,,、]/)
55
+ .map((n) => n.trim())
56
+ .filter((n) => n.length > 0);
57
+ }
58
+ // 解析优先使用的业务语义
59
+ const preferredMatch = content.match(/(?:preferred|优先|推荐).*?(?:semantic|语义).*?[::]\s*([^\n]+)/i);
60
+ if (preferredMatch) {
61
+ rules.preferredSemantics = preferredMatch[1]
62
+ .split(/[,,、]/)
63
+ .map((s) => s.trim())
64
+ .filter((s) => s.length > 0);
65
+ }
66
+ return rules;
67
+ }
68
+ /**
69
+ * 应用 Cursor Rules 到类型名称
70
+ * @param typeName 原始类型名称
71
+ * @param rules 类型命名规范
72
+ * @param isRequest 是否为请求类型
73
+ * @returns 格式化后的类型名称
74
+ */
75
+ export function applyCursorRules(typeName, rules, isRequest = false) {
76
+ if (!rules) {
77
+ return typeName;
78
+ }
79
+ let formattedName = typeName;
80
+ // 应用命名风格
81
+ if (rules.interfaceStyle) {
82
+ formattedName = applyNamingStyle(formattedName, rules.interfaceStyle);
83
+ }
84
+ // 应用后缀
85
+ if (isRequest && rules.requestSuffix) {
86
+ if (!formattedName.endsWith(rules.requestSuffix)) {
87
+ formattedName = formattedName + rules.requestSuffix;
88
+ }
89
+ }
90
+ else if (!isRequest && rules.responseSuffix) {
91
+ if (!formattedName.endsWith(rules.responseSuffix)) {
92
+ formattedName = formattedName + rules.responseSuffix;
93
+ }
94
+ }
95
+ // 检查禁止使用的名称
96
+ if (rules.forbiddenNames) {
97
+ for (const forbidden of rules.forbiddenNames) {
98
+ if (formattedName.includes(forbidden)) {
99
+ logger.warn(`[cursor-rules] 类型名称包含禁止使用的名称: ${forbidden}`);
100
+ // 可以在这里进行替换或警告
101
+ }
102
+ }
103
+ }
104
+ return formattedName;
105
+ }
106
+ /**
107
+ * 应用命名风格
108
+ * @param name 原始名称
109
+ * @param style 命名风格
110
+ * @returns 格式化后的名称
111
+ */
112
+ function applyNamingStyle(name, style) {
113
+ switch (style) {
114
+ case 'PascalCase':
115
+ return pascalCase(name);
116
+ case 'camelCase':
117
+ return camelCase(name);
118
+ case 'snake_case':
119
+ return snakeCase(name);
120
+ case 'kebab-case':
121
+ return kebabCase(name);
122
+ default:
123
+ return name;
124
+ }
125
+ }
126
+ function pascalCase(input) {
127
+ return input
128
+ .replace(/[^a-zA-Z0-9]+(.)/g, (_, chr) => chr.toUpperCase())
129
+ .replace(/^[a-z]/, (chr) => chr.toUpperCase());
130
+ }
131
+ function camelCase(input) {
132
+ const pascal = pascalCase(input);
133
+ return pascal.charAt(0).toLowerCase() + pascal.slice(1);
134
+ }
135
+ function snakeCase(input) {
136
+ return input
137
+ .replace(/([A-Z])/g, '_$1')
138
+ .toLowerCase()
139
+ .replace(/^_/, '');
140
+ }
141
+ function kebabCase(input) {
142
+ return input
143
+ .replace(/([A-Z])/g, '-$1')
144
+ .toLowerCase()
145
+ .replace(/^-/, '');
146
+ }
147
+ //# sourceMappingURL=cursor-rules-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor-rules-loader.js","sourceRoot":"","sources":["../../../src/core/generator/cursor-rules-loader.ts"],"names":[],"mappings":"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"}
@@ -3,4 +3,7 @@
3
3
  */
4
4
  export { generateArtifact } from './artifact.js';
5
5
  export type { ArtifactInput, GeneratedArtifact, ArtifactType } from './artifact.js';
6
+ export { transformTypeNames } from './type-transformer.js';
7
+ export { loadCursorRules, applyCursorRules } from './cursor-rules-loader.js';
8
+ export type { TypeNamingRules } from './cursor-rules-loader.js';
6
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/generator/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/generator/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AACpF,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC7E,YAAY,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC"}
@@ -2,4 +2,6 @@
2
2
  * 生成器模块
3
3
  */
4
4
  export { generateArtifact } from './artifact.js';
5
+ export { transformTypeNames } from './type-transformer.js';
6
+ export { loadCursorRules, applyCursorRules } from './cursor-rules-loader.js';
5
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/generator/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/generator/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * 类型名称语义化转换器
3
+ * 将通用类型名称(如 "ApifoxModel")转换为语义化名称(如 "CreateOrderRequest")
4
+ */
5
+ /**
6
+ * 转换类型定义中的类型名称
7
+ * @param typeCode 原始类型代码
8
+ * @param interfaceDetail 接口详情(name 等字段可能为 undefined)
9
+ * @returns 转换后的类型代码
10
+ */
11
+ export declare function transformTypeNames(typeCode: string, interfaceDetail: {
12
+ id: string;
13
+ name?: string;
14
+ method?: string;
15
+ path?: string;
16
+ description?: string;
17
+ }): string;
18
+ //# sourceMappingURL=type-transformer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-transformer.d.ts","sourceRoot":"","sources":["../../../src/core/generator/type-transformer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE;IACf,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GACA,MAAM,CAcR"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * 类型名称语义化转换器
3
+ * 将通用类型名称(如 "ApifoxModel")转换为语义化名称(如 "CreateOrderRequest")
4
+ */
5
+ /**
6
+ * 转换类型定义中的类型名称
7
+ * @param typeCode 原始类型代码
8
+ * @param interfaceDetail 接口详情(name 等字段可能为 undefined)
9
+ * @returns 转换后的类型代码
10
+ */
11
+ export function transformTypeNames(typeCode, interfaceDetail) {
12
+ // 提取接口的语义化名称
13
+ const semanticName = generateSemanticName(interfaceDetail);
14
+ // 替换通用类型名称
15
+ let transformedCode = typeCode;
16
+ // 替换 "ApifoxModel" 为语义化名称
17
+ transformedCode = transformedCode.replace(/ApifoxModel/g, semanticName);
18
+ // 替换其他通用类型名称(如果它们出现在不合适的位置)
19
+ // 这里可以根据实际需要进行更复杂的替换逻辑
20
+ return transformedCode;
21
+ }
22
+ /**
23
+ * 根据接口信息生成语义化名称
24
+ * @param interfaceDetail 接口详情(name 等字段可能为 undefined)
25
+ * @returns 语义化名称(PascalCase)
26
+ */
27
+ function generateSemanticName(interfaceDetail) {
28
+ const { name, method, path } = interfaceDetail;
29
+ // 从接口名称提取关键词
30
+ const nameKeywords = extractKeywords(name || '');
31
+ // 从路径提取关键词
32
+ const pathKeywords = extractKeywords(path || '');
33
+ // 根据 HTTP 方法确定操作类型
34
+ const operationType = getOperationType(method || 'GET');
35
+ // 组合生成语义化名称
36
+ let semanticName = '';
37
+ if (nameKeywords.length > 0) {
38
+ // 优先使用接口名称中的关键词
39
+ semanticName = nameKeywords.join('');
40
+ }
41
+ else if (pathKeywords.length > 0) {
42
+ // 其次使用路径中的关键词
43
+ semanticName = pathKeywords.join('');
44
+ }
45
+ else {
46
+ // 最后使用默认名称
47
+ semanticName = 'Api';
48
+ }
49
+ // 添加操作类型前缀(如果需要)
50
+ if (operationType && !semanticName.toLowerCase().includes(operationType.toLowerCase())) {
51
+ semanticName = operationType + semanticName;
52
+ }
53
+ return pascalCase(semanticName);
54
+ }
55
+ /**
56
+ * 从文本中提取关键词
57
+ * @param text 文本
58
+ * @returns 关键词数组(已转换为 PascalCase)
59
+ */
60
+ function extractKeywords(text) {
61
+ // 移除特殊字符,保留中英文、数字
62
+ const cleaned = text.replace(/[^\u4e00-\u9fa5a-zA-Z0-9\s]/g, ' ');
63
+ // 分割为单词
64
+ const words = cleaned
65
+ .split(/\s+/)
66
+ .filter((w) => w.length > 0)
67
+ .map((w) => pascalCase(w));
68
+ return words;
69
+ }
70
+ /**
71
+ * 根据 HTTP 方法确定操作类型
72
+ * @param method HTTP 方法
73
+ * @returns 操作类型(如 "Create", "Update", "Get" 等)
74
+ */
75
+ function getOperationType(method) {
76
+ const upperMethod = method.toUpperCase();
77
+ const operationMap = {
78
+ GET: 'Get',
79
+ POST: 'Create',
80
+ PUT: 'Update',
81
+ PATCH: 'Update',
82
+ DELETE: 'Delete',
83
+ };
84
+ return operationMap[upperMethod] || '';
85
+ }
86
+ /**
87
+ * 转换为 PascalCase
88
+ * @param input 输入字符串
89
+ * @returns PascalCase 字符串
90
+ */
91
+ function pascalCase(input) {
92
+ if (!input)
93
+ return '';
94
+ // 处理中文:直接返回(中文通常不需要转换)
95
+ if (/[\u4e00-\u9fa5]/.test(input)) {
96
+ return input;
97
+ }
98
+ // 处理英文:转换为 PascalCase
99
+ return input
100
+ .replace(/[^a-zA-Z0-9]+(.)/g, (_, chr) => chr.toUpperCase())
101
+ .replace(/^[a-z]/, (chr) => chr.toUpperCase());
102
+ }
103
+ //# sourceMappingURL=type-transformer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-transformer.js","sourceRoot":"","sources":["../../../src/core/generator/type-transformer.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,7 @@
3
3
  */
4
4
  export { isValidApifoxUrl, parseApifoxUrl, ShareLinkType } from './url.js';
5
5
  export type { ParsedUrl } from './url.js';
6
- export { parseLlmsContent, fetchAndParseLlms } from './llms.js';
6
+ export { parseLlmsContent, fetchAndParseLlms, fetchAndParseLlmsWithHash, calculateLlmsHash, } from './llms.js';
7
7
  export type { ParsedInterface } from './llms.js';
8
8
  export { parseInterfaceFromMd } from './md-parser.js';
9
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/parser/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC3E,YAAY,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAChE,YAAY,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/parser/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC3E,YAAY,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,yBAAyB,EACzB,iBAAiB,GAClB,MAAM,WAAW,CAAC;AACnB,YAAY,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -2,6 +2,6 @@
2
2
  * 解析器模块
3
3
  */
4
4
  export { isValidApifoxUrl, parseApifoxUrl, ShareLinkType } from './url.js';
5
- export { parseLlmsContent, fetchAndParseLlms } from './llms.js';
5
+ export { parseLlmsContent, fetchAndParseLlms, fetchAndParseLlmsWithHash, calculateLlmsHash, } from './llms.js';
6
6
  export { parseInterfaceFromMd } from './md-parser.js';
7
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/parser/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE3E,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAEhE,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/parser/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE3E,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,yBAAyB,EACzB,iBAAiB,GAClB,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC"}