apifox-mock-generator 1.4.6 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (339) hide show
  1. package/CHANGELOG.md +103 -0
  2. package/README.md +1 -1
  3. package/dist/package.json +22 -4
  4. package/dist/src/application/use-cases/fetch-apifox-data.use-case.d.ts +19 -0
  5. package/dist/src/application/use-cases/fetch-apifox-data.use-case.d.ts.map +1 -0
  6. package/dist/src/application/use-cases/fetch-apifox-data.use-case.js +29 -0
  7. package/dist/src/application/use-cases/fetch-apifox-data.use-case.js.map +1 -0
  8. package/dist/src/application/use-cases/generate-mock.use-case.d.ts +22 -0
  9. package/dist/src/application/use-cases/generate-mock.use-case.d.ts.map +1 -0
  10. package/dist/src/application/use-cases/generate-mock.use-case.js +42 -0
  11. package/dist/src/application/use-cases/generate-mock.use-case.js.map +1 -0
  12. package/dist/src/application/use-cases/generate-types.use-case.d.ts +22 -0
  13. package/dist/src/application/use-cases/generate-types.use-case.d.ts.map +1 -0
  14. package/dist/src/application/use-cases/generate-types.use-case.js +42 -0
  15. package/dist/src/application/use-cases/generate-types.use-case.js.map +1 -0
  16. package/dist/src/application/use-cases/index.d.ts +8 -0
  17. package/dist/src/application/use-cases/index.d.ts.map +1 -0
  18. package/dist/src/application/use-cases/index.js +8 -0
  19. package/dist/src/application/use-cases/index.js.map +1 -0
  20. package/dist/src/application/use-cases/serve-mock.use-case.d.ts +26 -0
  21. package/dist/src/application/use-cases/serve-mock.use-case.d.ts.map +1 -0
  22. package/dist/src/application/use-cases/serve-mock.use-case.js +103 -0
  23. package/dist/src/application/use-cases/serve-mock.use-case.js.map +1 -0
  24. package/dist/src/core/apifox-client.d.ts +5 -1
  25. package/dist/src/core/apifox-client.d.ts.map +1 -1
  26. package/dist/src/core/apifox-client.js +8 -102
  27. package/dist/src/core/apifox-client.js.map +1 -1
  28. package/dist/src/core/config-loader.d.ts.map +1 -1
  29. package/dist/src/core/config-loader.js +17 -5
  30. package/dist/src/core/config-loader.js.map +1 -1
  31. package/dist/src/core/container-setup.d.ts +9 -0
  32. package/dist/src/core/container-setup.d.ts.map +1 -0
  33. package/dist/src/core/container-setup.js +64 -0
  34. package/dist/src/core/container-setup.js.map +1 -0
  35. package/dist/src/core/container.d.ts +42 -0
  36. package/dist/src/core/container.d.ts.map +1 -0
  37. package/dist/src/core/container.js +70 -0
  38. package/dist/src/core/container.js.map +1 -0
  39. package/dist/src/core/endpoint-filter.d.ts +10 -0
  40. package/dist/src/core/endpoint-filter.d.ts.map +1 -1
  41. package/dist/src/core/endpoint-filter.js +22 -95
  42. package/dist/src/core/endpoint-filter.js.map +1 -1
  43. package/dist/src/core/error-codes.d.ts +22 -0
  44. package/dist/src/core/error-codes.d.ts.map +1 -0
  45. package/dist/src/core/error-codes.js +31 -0
  46. package/dist/src/core/error-codes.js.map +1 -0
  47. package/dist/src/core/error-handler.d.ts +8 -0
  48. package/dist/src/core/error-handler.d.ts.map +1 -0
  49. package/dist/src/core/error-handler.js +45 -0
  50. package/dist/src/core/error-handler.js.map +1 -0
  51. package/dist/src/core/errors.d.ts +49 -0
  52. package/dist/src/core/errors.d.ts.map +1 -0
  53. package/dist/src/core/errors.js +70 -0
  54. package/dist/src/core/errors.js.map +1 -0
  55. package/dist/src/core/mock-config-loader.d.ts.map +1 -1
  56. package/dist/src/core/mock-config-loader.js +24 -7
  57. package/dist/src/core/mock-config-loader.js.map +1 -1
  58. package/dist/src/core/openapi-converter.d.ts +5 -1
  59. package/dist/src/core/openapi-converter.d.ts.map +1 -1
  60. package/dist/src/core/openapi-converter.js +11 -34
  61. package/dist/src/core/openapi-converter.js.map +1 -1
  62. package/dist/src/core/service-keys.d.ts +39 -0
  63. package/dist/src/core/service-keys.d.ts.map +1 -0
  64. package/dist/src/core/service-keys.js +43 -0
  65. package/dist/src/core/service-keys.js.map +1 -0
  66. package/dist/src/domain/entities/api-endpoint.entity.d.ts +57 -0
  67. package/dist/src/domain/entities/api-endpoint.entity.d.ts.map +1 -0
  68. package/dist/src/domain/entities/api-endpoint.entity.js +87 -0
  69. package/dist/src/domain/entities/api-endpoint.entity.js.map +1 -0
  70. package/dist/src/domain/entities/index.d.ts +6 -0
  71. package/dist/src/domain/entities/index.d.ts.map +1 -0
  72. package/dist/src/domain/entities/index.js +6 -0
  73. package/dist/src/domain/entities/index.js.map +1 -0
  74. package/dist/src/domain/entities/mock-route.entity.d.ts +41 -0
  75. package/dist/src/domain/entities/mock-route.entity.d.ts.map +1 -0
  76. package/dist/src/domain/entities/mock-route.entity.js +82 -0
  77. package/dist/src/domain/entities/mock-route.entity.js.map +1 -0
  78. package/dist/src/domain/interfaces/apifox-client.interface.d.ts +14 -0
  79. package/dist/src/domain/interfaces/apifox-client.interface.d.ts.map +1 -0
  80. package/dist/src/domain/interfaces/apifox-client.interface.js +2 -0
  81. package/dist/src/domain/interfaces/apifox-client.interface.js.map +1 -0
  82. package/dist/src/domain/interfaces/file-system.interface.d.ts +46 -0
  83. package/dist/src/domain/interfaces/file-system.interface.d.ts.map +1 -0
  84. package/dist/src/domain/interfaces/file-system.interface.js +2 -0
  85. package/dist/src/domain/interfaces/file-system.interface.js.map +1 -0
  86. package/dist/src/domain/interfaces/generator.interface.d.ts +24 -0
  87. package/dist/src/domain/interfaces/generator.interface.d.ts.map +1 -0
  88. package/dist/src/domain/interfaces/generator.interface.js +2 -0
  89. package/dist/src/domain/interfaces/generator.interface.js.map +1 -0
  90. package/dist/src/domain/interfaces/http-client.interface.d.ts +54 -0
  91. package/dist/src/domain/interfaces/http-client.interface.d.ts.map +1 -0
  92. package/dist/src/domain/interfaces/http-client.interface.js +2 -0
  93. package/dist/src/domain/interfaces/http-client.interface.js.map +1 -0
  94. package/dist/src/domain/interfaces/index.d.ts +11 -0
  95. package/dist/src/domain/interfaces/index.d.ts.map +1 -0
  96. package/dist/src/domain/interfaces/index.js +11 -0
  97. package/dist/src/domain/interfaces/index.js.map +1 -0
  98. package/dist/src/domain/interfaces/logger.interface.d.ts +36 -0
  99. package/dist/src/domain/interfaces/logger.interface.d.ts.map +1 -0
  100. package/dist/src/domain/interfaces/logger.interface.js +2 -0
  101. package/dist/src/domain/interfaces/logger.interface.js.map +1 -0
  102. package/dist/src/domain/interfaces/remote-proxy.interface.d.ts +26 -0
  103. package/dist/src/domain/interfaces/remote-proxy.interface.d.ts.map +1 -0
  104. package/dist/src/domain/interfaces/remote-proxy.interface.js +2 -0
  105. package/dist/src/domain/interfaces/remote-proxy.interface.js.map +1 -0
  106. package/dist/src/domain/interfaces/route-manager.interface.d.ts +34 -0
  107. package/dist/src/domain/interfaces/route-manager.interface.d.ts.map +1 -0
  108. package/dist/src/domain/interfaces/route-manager.interface.js +2 -0
  109. package/dist/src/domain/interfaces/route-manager.interface.js.map +1 -0
  110. package/dist/src/domain/interfaces.d.ts +239 -0
  111. package/dist/src/domain/interfaces.d.ts.map +1 -0
  112. package/dist/src/domain/interfaces.js +2 -0
  113. package/dist/src/domain/interfaces.js.map +1 -0
  114. package/dist/src/domain/services/endpoint-filter.service.d.ts +52 -0
  115. package/dist/src/domain/services/endpoint-filter.service.d.ts.map +1 -0
  116. package/dist/src/domain/services/endpoint-filter.service.js +150 -0
  117. package/dist/src/domain/services/endpoint-filter.service.js.map +1 -0
  118. package/dist/src/domain/services/index.d.ts +7 -0
  119. package/dist/src/domain/services/index.d.ts.map +1 -0
  120. package/dist/src/domain/services/index.js +7 -0
  121. package/dist/src/domain/services/index.js.map +1 -0
  122. package/dist/src/domain/services/openapi-converter.service.d.ts +15 -0
  123. package/dist/src/domain/services/openapi-converter.service.d.ts.map +1 -0
  124. package/dist/src/domain/services/openapi-converter.service.js +74 -0
  125. package/dist/src/domain/services/openapi-converter.service.js.map +1 -0
  126. package/dist/src/domain/services/route-matcher.service.d.ts +38 -0
  127. package/dist/src/domain/services/route-matcher.service.d.ts.map +1 -0
  128. package/dist/src/domain/services/route-matcher.service.js +61 -0
  129. package/dist/src/domain/services/route-matcher.service.js.map +1 -0
  130. package/dist/src/generators/mock-generator.d.ts +2 -1
  131. package/dist/src/generators/mock-generator.d.ts.map +1 -1
  132. package/dist/src/generators/mock-generator.js +13 -8
  133. package/dist/src/generators/mock-generator.js.map +1 -1
  134. package/dist/src/generators/templates/type-template.d.ts +2 -1
  135. package/dist/src/generators/templates/type-template.d.ts.map +1 -1
  136. package/dist/src/generators/templates/type-template.js +72 -48
  137. package/dist/src/generators/templates/type-template.js.map +1 -1
  138. package/dist/src/generators/type-generator.d.ts +2 -1
  139. package/dist/src/generators/type-generator.d.ts.map +1 -1
  140. package/dist/src/generators/type-generator.js +1 -1
  141. package/dist/src/generators/type-generator.js.map +1 -1
  142. package/dist/src/index.d.ts +1 -1
  143. package/dist/src/index.d.ts.map +1 -1
  144. package/dist/src/index.js +1 -1
  145. package/dist/src/index.js.map +1 -1
  146. package/dist/src/infrastructure/apifox/apifox-client.impl.d.ts +22 -0
  147. package/dist/src/infrastructure/apifox/apifox-client.impl.d.ts.map +1 -0
  148. package/dist/src/infrastructure/apifox/apifox-client.impl.js +135 -0
  149. package/dist/src/infrastructure/apifox/apifox-client.impl.js.map +1 -0
  150. package/dist/src/infrastructure/file-system/file-system.impl.d.ts +15 -0
  151. package/dist/src/infrastructure/file-system/file-system.impl.d.ts.map +1 -0
  152. package/dist/src/infrastructure/file-system/file-system.impl.js +45 -0
  153. package/dist/src/infrastructure/file-system/file-system.impl.js.map +1 -0
  154. package/dist/src/infrastructure/http/axios-client.impl.d.ts +19 -0
  155. package/dist/src/infrastructure/http/axios-client.impl.d.ts.map +1 -0
  156. package/dist/src/infrastructure/http/axios-client.impl.js +59 -0
  157. package/dist/src/infrastructure/http/axios-client.impl.js.map +1 -0
  158. package/dist/src/infrastructure/logger/console-logger.impl.d.ts +15 -0
  159. package/dist/src/infrastructure/logger/console-logger.impl.d.ts.map +1 -0
  160. package/dist/src/infrastructure/logger/console-logger.impl.js +30 -0
  161. package/dist/src/infrastructure/logger/console-logger.impl.js.map +1 -0
  162. package/dist/src/infrastructure/route-manager/route-manager.impl.d.ts +14 -0
  163. package/dist/src/infrastructure/route-manager/route-manager.impl.d.ts.map +1 -0
  164. package/dist/src/infrastructure/route-manager/route-manager.impl.js +25 -0
  165. package/dist/src/infrastructure/route-manager/route-manager.impl.js.map +1 -0
  166. package/dist/src/infrastructure/server/hot-reload.d.ts +8 -0
  167. package/dist/src/infrastructure/server/hot-reload.d.ts.map +1 -0
  168. package/dist/src/infrastructure/server/hot-reload.js +132 -0
  169. package/dist/src/infrastructure/server/hot-reload.js.map +1 -0
  170. package/dist/src/infrastructure/server/remote-proxy.d.ts +22 -0
  171. package/dist/src/infrastructure/server/remote-proxy.d.ts.map +1 -0
  172. package/dist/src/infrastructure/server/remote-proxy.js +82 -0
  173. package/dist/src/infrastructure/server/remote-proxy.js.map +1 -0
  174. package/dist/src/infrastructure/server/route-loader.d.ts +18 -0
  175. package/dist/src/infrastructure/server/route-loader.d.ts.map +1 -0
  176. package/dist/src/infrastructure/server/route-loader.js +256 -0
  177. package/dist/src/infrastructure/server/route-loader.js.map +1 -0
  178. package/dist/src/presentation/http/express-server.d.ts +8 -0
  179. package/dist/src/presentation/http/express-server.d.ts.map +1 -0
  180. package/dist/src/presentation/http/express-server.js +65 -0
  181. package/dist/src/presentation/http/express-server.js.map +1 -0
  182. package/dist/src/presentation/http/middleware/error-handler.middleware.d.ts +9 -0
  183. package/dist/src/presentation/http/middleware/error-handler.middleware.d.ts.map +1 -0
  184. package/dist/src/presentation/http/middleware/error-handler.middleware.js +31 -0
  185. package/dist/src/presentation/http/middleware/error-handler.middleware.js.map +1 -0
  186. package/dist/src/presentation/http/route-handler.d.ts +38 -0
  187. package/dist/src/presentation/http/route-handler.d.ts.map +1 -0
  188. package/dist/src/presentation/http/route-handler.js +237 -0
  189. package/dist/src/presentation/http/route-handler.js.map +1 -0
  190. package/dist/src/presentation/http/validation.d.ts +25 -0
  191. package/dist/src/presentation/http/validation.d.ts.map +1 -0
  192. package/dist/src/presentation/http/validation.js +131 -0
  193. package/dist/src/presentation/http/validation.js.map +1 -0
  194. package/dist/src/scripts/cli.js +1 -1
  195. package/dist/src/scripts/cli.js.map +1 -1
  196. package/dist/src/scripts/generate-mock.js +15 -35
  197. package/dist/src/scripts/generate-mock.js.map +1 -1
  198. package/dist/src/scripts/serve-mock.js +9 -87
  199. package/dist/src/scripts/serve-mock.js.map +1 -1
  200. package/dist/src/server/express-server.d.ts +2 -2
  201. package/dist/src/server/express-server.d.ts.map +1 -1
  202. package/dist/src/server/express-server.js +16 -1
  203. package/dist/src/server/express-server.js.map +1 -1
  204. package/dist/src/server/hot-reload.d.ts +2 -2
  205. package/dist/src/server/hot-reload.d.ts.map +1 -1
  206. package/dist/src/server/hot-reload.js.map +1 -1
  207. package/dist/src/server/remote-proxy.d.ts +2 -2
  208. package/dist/src/server/remote-proxy.d.ts.map +1 -1
  209. package/dist/src/server/remote-proxy.js +13 -1
  210. package/dist/src/server/remote-proxy.js.map +1 -1
  211. package/dist/src/server/route-handler.d.ts +5 -3
  212. package/dist/src/server/route-handler.d.ts.map +1 -1
  213. package/dist/src/server/route-handler.js +15 -9
  214. package/dist/src/server/route-handler.js.map +1 -1
  215. package/dist/src/server/route-matcher.d.ts.map +1 -1
  216. package/dist/src/server/route-matcher.js +3 -1
  217. package/dist/src/server/route-matcher.js.map +1 -1
  218. package/dist/src/server/validation.d.ts +20 -1
  219. package/dist/src/server/validation.d.ts.map +1 -1
  220. package/dist/src/server/validation.js +25 -13
  221. package/dist/src/server/validation.js.map +1 -1
  222. package/dist/src/types/index.d.ts +21 -6
  223. package/dist/src/types/index.d.ts.map +1 -1
  224. package/dist/src/types/mock/list.d.ts +13 -0
  225. package/dist/src/types/mock/list.d.ts.map +1 -0
  226. package/dist/src/types/mock/list.js +4 -0
  227. package/dist/src/types/mock/list.js.map +1 -0
  228. package/dist/src/types/mock/v1/auth/login/username.d.ts +1 -1
  229. package/dist/src/types/mock/v1/auth/login/username.d.ts.map +1 -1
  230. package/dist/src/types/mock/v1/dict/data/default.d.ts +25 -0
  231. package/dist/src/types/mock/v1/dict/data/default.d.ts.map +1 -0
  232. package/dist/src/types/mock/v1/dict/data/default.js +4 -0
  233. package/dist/src/types/mock/v1/dict/data/default.js.map +1 -0
  234. package/dist/src/types/mock/v1/dict/data/order.d.ts +25 -0
  235. package/dist/src/types/mock/v1/dict/data/order.d.ts.map +1 -0
  236. package/dist/src/types/mock/v1/dict/data/order.js +4 -0
  237. package/dist/src/types/mock/v1/dict/data/order.js.map +1 -0
  238. package/dist/src/types/mock/v1/dict/data/pagedList.d.ts +62 -0
  239. package/dist/src/types/mock/v1/dict/data/pagedList.d.ts.map +1 -0
  240. package/dist/src/types/mock/v1/dict/data/pagedList.js +4 -0
  241. package/dist/src/types/mock/v1/dict/data/pagedList.js.map +1 -0
  242. package/dist/src/types/mock/v1/dict/data.d.ts +82 -0
  243. package/dist/src/types/mock/v1/dict/data.d.ts.map +1 -0
  244. package/dist/src/types/mock/v1/dict/data.js +4 -0
  245. package/dist/src/types/mock/v1/dict/data.js.map +1 -0
  246. package/dist/src/types/mock/v1/dict/pagedList.d.ts +54 -0
  247. package/dist/src/types/mock/v1/dict/pagedList.d.ts.map +1 -0
  248. package/dist/src/types/mock/v1/dict/pagedList.js +4 -0
  249. package/dist/src/types/mock/v1/dict/pagedList.js.map +1 -0
  250. package/dist/src/types/mock/v1/dict.d.ts +80 -0
  251. package/dist/src/types/mock/v1/dict.d.ts.map +1 -0
  252. package/dist/src/types/mock/v1/dict.js +4 -0
  253. package/dist/src/types/mock/v1/dict.js.map +1 -0
  254. package/dist/src/types/mock/v1/file/download.d.ts +23 -0
  255. package/dist/src/types/mock/v1/file/download.d.ts.map +1 -0
  256. package/dist/src/types/mock/v1/file/download.js +4 -0
  257. package/dist/src/types/mock/v1/file/download.js.map +1 -0
  258. package/dist/src/types/mock/v1/file/pagedList.d.ts +62 -0
  259. package/dist/src/types/mock/v1/file/pagedList.d.ts.map +1 -0
  260. package/dist/src/types/mock/v1/file/pagedList.js +4 -0
  261. package/dist/src/types/mock/v1/file/pagedList.js.map +1 -0
  262. package/dist/src/types/mock/v1/file.d.ts +56 -0
  263. package/dist/src/types/mock/v1/file.d.ts.map +1 -0
  264. package/dist/src/types/mock/v1/file.js +4 -0
  265. package/dist/src/types/mock/v1/file.js.map +1 -0
  266. package/dist/src/types/mock/v1/internal/getToken.d.ts +32 -0
  267. package/dist/src/types/mock/v1/internal/getToken.d.ts.map +1 -0
  268. package/dist/src/types/mock/v1/internal/getToken.js +4 -0
  269. package/dist/src/types/mock/v1/internal/getToken.js.map +1 -0
  270. package/dist/src/types/mock/v1/internal/user/unlock.d.ts +23 -0
  271. package/dist/src/types/mock/v1/internal/user/unlock.d.ts.map +1 -0
  272. package/dist/src/types/mock/v1/internal/user/unlock.js +4 -0
  273. package/dist/src/types/mock/v1/internal/user/unlock.js.map +1 -0
  274. package/dist/src/types/mock/v1/role/disabled.d.ts +25 -0
  275. package/dist/src/types/mock/v1/role/disabled.d.ts.map +1 -0
  276. package/dist/src/types/mock/v1/role/disabled.js +4 -0
  277. package/dist/src/types/mock/v1/role/disabled.js.map +1 -0
  278. package/dist/src/types/mock/v1/role/pagedList.d.ts +2 -2
  279. package/dist/src/types/mock/v1/role/pagedList.d.ts.map +1 -1
  280. package/dist/src/types/mock/v1/role.d.ts +31 -29
  281. package/dist/src/types/mock/v1/role.d.ts.map +1 -1
  282. package/dist/src/types/mock/v1/role.js.map +1 -1
  283. package/dist/src/types/mock/v1/tenant/permission/tree.d.ts +2 -2
  284. package/dist/src/types/mock/v1/tenant/permission/tree.d.ts.map +1 -1
  285. package/dist/src/types/mock/v1/tenant/user/link.d.ts +23 -0
  286. package/dist/src/types/mock/v1/tenant/user/link.d.ts.map +1 -0
  287. package/dist/src/types/mock/v1/tenant/user/link.js +4 -0
  288. package/dist/src/types/mock/v1/tenant/user/link.js.map +1 -0
  289. package/dist/src/types/mock/v1/tenant/user/pagedList.d.ts +8 -0
  290. package/dist/src/types/mock/v1/tenant/user/pagedList.d.ts.map +1 -1
  291. package/dist/src/types/mock/v1/tenant/user/pagedList.js.map +1 -1
  292. package/dist/src/types/mock/v1/tenant/user.d.ts +19 -0
  293. package/dist/src/types/mock/v1/tenant/user.d.ts.map +1 -1
  294. package/dist/src/types/mock/v1/tenant/user.js.map +1 -1
  295. package/dist/src/types/mock/v1/user/exportData.d.ts +25 -0
  296. package/dist/src/types/mock/v1/user/exportData.d.ts.map +1 -0
  297. package/dist/src/types/mock/v1/user/exportData.js +4 -0
  298. package/dist/src/types/mock/v1/user/exportData.js.map +1 -0
  299. package/dist/src/types/mock/v1/user/importData.d.ts +13 -0
  300. package/dist/src/types/mock/v1/user/importData.d.ts.map +1 -0
  301. package/dist/src/types/mock/v1/user/importData.js +4 -0
  302. package/dist/src/types/mock/v1/user/importData.js.map +1 -0
  303. package/dist/src/types/mock/v1/user/info.d.ts +0 -30
  304. package/dist/src/types/mock/v1/user/info.d.ts.map +1 -1
  305. package/dist/src/types/mock/v1/user/info.js.map +1 -1
  306. package/dist/src/types/mock/v1/user/permission/tree.d.ts +4 -2
  307. package/dist/src/types/mock/v1/user/permission/tree.d.ts.map +1 -1
  308. package/dist/src/types/mock/v1/user/permission/tree.js.map +1 -1
  309. package/dist/src/types/mock/v1/user.d.ts +0 -106
  310. package/dist/src/types/mock/v1/user.d.ts.map +1 -1
  311. package/dist/src/types/mock/v1/user.js +1 -1
  312. package/dist/src/types/mock/v1/user.js.map +1 -1
  313. package/dist/src/types/openapi.d.ts +426 -0
  314. package/dist/src/types/openapi.d.ts.map +1 -0
  315. package/dist/src/types/openapi.js +23 -0
  316. package/dist/src/types/openapi.js.map +1 -0
  317. package/dist/src/utils/block-updater.d.ts.map +1 -1
  318. package/dist/src/utils/block-updater.js +5 -4
  319. package/dist/src/utils/block-updater.js.map +1 -1
  320. package/dist/src/utils/code-formatter.d.ts.map +1 -1
  321. package/dist/src/utils/code-formatter.js +2 -0
  322. package/dist/src/utils/code-formatter.js.map +1 -1
  323. package/dist/src/utils/file-helper.d.ts +7 -7
  324. package/dist/src/utils/file-helper.d.ts.map +1 -1
  325. package/dist/src/utils/file-helper.js +11 -8
  326. package/dist/src/utils/file-helper.js.map +1 -1
  327. package/dist/src/utils/file-operations.d.ts +1 -1
  328. package/dist/src/utils/file-operations.d.ts.map +1 -1
  329. package/dist/src/utils/file-operations.js.map +1 -1
  330. package/dist/src/utils/file-utils.d.ts +3 -2
  331. package/dist/src/utils/file-utils.d.ts.map +1 -1
  332. package/dist/src/utils/file-utils.js +1 -1
  333. package/dist/src/utils/file-utils.js.map +1 -1
  334. package/dist/src/utils/path-utils.js.map +1 -1
  335. package/dist/src/utils/type-mapping.d.ts +9 -2
  336. package/dist/src/utils/type-mapping.d.ts.map +1 -1
  337. package/dist/src/utils/type-mapping.js +42 -35
  338. package/dist/src/utils/type-mapping.js.map +1 -1
  339. package/package.json +22 -4
package/CHANGELOG.md CHANGED
@@ -5,6 +5,109 @@
5
5
  格式基于 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.0.0/),
6
6
  版本号遵循 [语义化版本](https://semver.org/lang/zh-CN/)。
7
7
 
8
+ ## [2.0.0] - 2026-01-08
9
+
10
+ ### 🎯 重大更新
11
+
12
+ 这是一个重大版本更新,引入了全新的架构设计和多项核心功能改进。
13
+
14
+ ### ✨ 新增功能
15
+
16
+ #### 🏗️ 项目架构重构
17
+
18
+ - **依赖注入容器** - 引入依赖注入(DI)容器,优化服务注册和解析
19
+ - 实现基于接口的服务注册机制,提升代码解耦和可测试性
20
+ - 支持服务标识符常量管理,统一服务注册和解析
21
+ - 提供容器设置和初始化功能,简化依赖管理
22
+
23
+ - **用例模式(Use Cases)** - 新增多个用例类,负责处理核心业务逻辑
24
+ - `FetchApifoxDataUseCase` - 处理从 Apifox 获取 OpenAPI 文档
25
+ - `GenerateMockUseCase` - 处理 Mock 文件生成
26
+ - `GenerateTypesUseCase` - 处理 TypeScript 类型生成
27
+ - `ServeMockUseCase` - 处理 Mock 服务器启动
28
+ - 每个用例专注于单一职责,提升代码可维护性
29
+
30
+ - **领域驱动设计(DDD)架构** - 重构项目结构,采用分层架构
31
+ - **domain/** - 领域层:实体、服务接口、业务逻辑
32
+ - **application/** - 应用层:用例实现
33
+ - **infrastructure/** - 基础设施层:具体实现(文件系统、日志、HTTP 客户端等)
34
+ - **presentation/** - 表现层:HTTP 服务器、中间件等
35
+ - 清晰的层次划分,提升代码组织性和可维护性
36
+
37
+ - **统一文件系统接口** - 实现统一的文件系统操作接口
38
+ - 新增 `IFileSystem` 接口和 `FileSystemImpl` 实现
39
+ - 替代原有的分散文件操作工具,统一文件操作方式
40
+ - 支持依赖注入,便于测试和替换
41
+
42
+ #### 🛡️ 统一错误处理机制
43
+
44
+ - **错误类体系** - 新增统一的错误处理类
45
+ - `ApifoxError` - 基础错误类
46
+ - `ConfigError` - 配置错误类
47
+ - `NetworkError` - 网络错误类
48
+ - `ApifoxApiError` - Apifox API 错误类
49
+ - 所有错误类支持详细的错误信息和建议
50
+
51
+ - **错误码系统** - 引入错误码常量定义
52
+ - 统一的错误码管理(`ERROR_CODES`)
53
+ - 错误码到 HTTP 状态码的映射(`ERROR_TO_HTTP_STATUS`)
54
+ - 便于错误管理和调试
55
+
56
+ - **错误处理中间件** - 新增 Express 错误处理中间件
57
+ - 统一的错误响应格式
58
+ - 自动转换错误码为 HTTP 状态码
59
+ - 提供详细的错误信息和建议
60
+
61
+ #### 📝 类型安全增强
62
+
63
+ - **OpenAPI 类型定义** - 引入完整的 OpenAPI 类型定义
64
+ - `OpenAPIDocument` - OpenAPI 文档类型
65
+ - `OpenAPISchema` - Schema 类型定义
66
+ - 将多个函数的参数和返回值类型从 `any` 修改为具体的 OpenAPI 类型
67
+ - 提升类型安全,减少类型不匹配的风险
68
+
69
+ #### 🧪 测试支持
70
+
71
+ - **E2E 测试框架** - 新增端到端测试支持
72
+ - 使用 Vitest 作为测试框架
73
+ - 支持配置测试、生成文件测试、Mock 服务器测试
74
+ - 提供测试辅助工具和帮助函数
75
+ - 新增测试脚本:`test:e2e`、`test:e2e:config`、`test:e2e:mock`
76
+
77
+ ### 🔄 重构改进
78
+
79
+ - **路由管理器重构** - 将路由管理器迁移到基础设施层
80
+ - 实现 `IRouteManager` 接口
81
+ - 支持依赖注入,便于测试和替换
82
+
83
+ - **日志系统重构** - 重构日志系统为接口实现
84
+ - 新增 `ILogger` 接口和 `ConsoleLoggerImpl` 实现
85
+ - 支持依赖注入,便于替换日志实现
86
+
87
+ - **服务接口抽象** - 新增多个服务接口
88
+ - `IApifoxClient` - Apifox 客户端接口
89
+ - `IRouteManager` - 路由管理器接口
90
+ - `IFileSystem` - 文件系统接口
91
+ - `ILogger` - 日志接口
92
+ - `IHttpClient` - HTTP 客户端接口
93
+
94
+ - **代码组织优化** - 优化代码组织结构
95
+ - 多个模块文件路径发生变化(内部重构,不影响用户使用)
96
+ - `src/server/` → `src/infrastructure/server/` 或 `src/presentation/http/`
97
+ - `src/utils/logger.ts` → `src/infrastructure/logger/console-logger.impl.ts`
98
+ - `src/utils/file-operations.ts` → `src/infrastructure/file-system/file-system.impl.ts`
99
+ - 移除不再使用的代码和模块
100
+ - 统一导出文件,简化导入路径
101
+ - 提升代码整洁度和可维护性
102
+ - 注意:这些是内部重构,用户通过配置文件(`apifox.config.json`、`mock.config.js`)和命令行工具使用,不受影响
103
+
104
+ ### 📖 文档更新
105
+
106
+ - **架构设计文档** - 新增架构设计文档(`doc/ARCHITECTURE_DESIGN.md`)
107
+ - 提供项目整体结构说明
108
+ - 详细的功能模块介绍
109
+ - 依赖注入使用指南
110
+
8
111
  ## [1.4.6] - 2025-12-09
9
112
 
10
113
  ### 🐛 修复
package/README.md CHANGED
@@ -69,7 +69,7 @@ export default {
69
69
  // 本地服务的端口
70
70
  port: 10000,
71
71
  // 默认代理至系统测试环境, 请配置本地host
72
- target: 'http://36.133.230.52:9101',
72
+ target: 'http://172.24.7.99:8082',
73
73
  // 开始remote参数, 通过url中remote=xxx来代理多个后端地址, 需要mock直接在url中设置remote=mock即可
74
74
  remoteTarget: true,
75
75
  // 按接口粒度控制 Mock/Proxy(可选)
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "apifox-mock-generator",
3
- "version": "1.4.6",
3
+ "version": "2.0.0",
4
4
  "description": "从Apifox拉取API接口并生成本地mock和TypeScript类型文件,并提供mock服务器",
5
5
  "main": "dist/src/index.js",
6
6
  "type": "module",
@@ -15,10 +15,26 @@
15
15
  "dev:generate": "tsx src/scripts/generate-mock.ts",
16
16
  "dev:serve": "tsx src/scripts/serve-mock.ts",
17
17
  "dev:full": "npm run dev:generate && npm run dev:serve",
18
+ "test:e2e": "vitest run tests/e2e",
19
+ "test:e2e:config": "vitest run tests/e2e/apifox-config.e2e.test.ts tests/e2e/generated-files.e2e.test.ts",
20
+ "test:e2e:mock": "vitest run tests/e2e/mock-config.e2e.test.ts tests/e2e/mock-server.e2e.test.ts",
18
21
  "prepublishOnly": "npm run build"
19
22
  },
20
- "files": ["dist", "README.md", "LICENSE", "CHANGELOG.md"],
21
- "keywords": ["apifox", "mock", "api", "typescript", "mock-server", "openapi", "code-generator"],
23
+ "files": [
24
+ "dist",
25
+ "README.md",
26
+ "LICENSE",
27
+ "CHANGELOG.md"
28
+ ],
29
+ "keywords": [
30
+ "apifox",
31
+ "mock",
32
+ "api",
33
+ "typescript",
34
+ "mock-server",
35
+ "openapi",
36
+ "code-generator"
37
+ ],
22
38
  "author": "liujun",
23
39
  "license": "MIT",
24
40
  "repository": {
@@ -42,8 +58,10 @@
42
58
  "eslint-plugin-unicorn": "^61.0.2",
43
59
  "eslint-plugin-vue": "^10.5.1",
44
60
  "glob": "^11.0.3",
61
+ "puppeteer": "^24.34.0",
45
62
  "tsx": "^4.7.0",
46
- "typescript": "^5.3.3"
63
+ "typescript": "^5.3.3",
64
+ "vitest": "^1.0.0"
47
65
  },
48
66
  "peerDependencies": {
49
67
  "lodash": "^4.17.21",
@@ -0,0 +1,19 @@
1
+ import type { IApifoxClient, ILogger } from '../../domain/interfaces.js';
2
+ import type { ApifoxConfig } from '../../types/index.js';
3
+ import type { OpenAPIDocument } from '../../types/openapi.js';
4
+ /**
5
+ * 获取 Apifox 数据用例
6
+ * 负责从 Apifox 获取 OpenAPI 文档
7
+ */
8
+ export declare class FetchApifoxDataUseCase {
9
+ private readonly apifoxClient;
10
+ private readonly logger;
11
+ constructor(apifoxClient: IApifoxClient, logger: ILogger);
12
+ /**
13
+ * 执行用例
14
+ * @param config Apifox 配置
15
+ * @returns OpenAPI 文档
16
+ */
17
+ execute(config: ApifoxConfig): Promise<OpenAPIDocument>;
18
+ }
19
+ //# sourceMappingURL=fetch-apifox-data.use-case.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch-apifox-data.use-case.d.ts","sourceRoot":"","sources":["../../../../src/application/use-cases/fetch-apifox-data.use-case.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D;;;GAGG;AACH,qBAAa,sBAAsB;IAE/B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,YAAY,EAAE,aAAa,EAC3B,MAAM,EAAE,OAAO;IAGlC;;;;OAIG;IACG,OAAO,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC;CAmB9D"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * 获取 Apifox 数据用例
3
+ * 负责从 Apifox 获取 OpenAPI 文档
4
+ */
5
+ export class FetchApifoxDataUseCase {
6
+ constructor(apifoxClient, logger) {
7
+ this.apifoxClient = apifoxClient;
8
+ this.logger = logger;
9
+ }
10
+ /**
11
+ * 执行用例
12
+ * @param config Apifox 配置
13
+ * @returns OpenAPI 文档
14
+ */
15
+ async execute(config) {
16
+ this.logger.info('从 Apifox 拉取 API 数据...');
17
+ try {
18
+ const openapi = await this.apifoxClient.fetchOpenAPI(config);
19
+ const endpointCount = Object.keys(openapi.paths || {}).length;
20
+ this.logger.success(`✓ 从 Apifox 拉取成功(${endpointCount} 个接口)`);
21
+ return openapi;
22
+ }
23
+ catch (error) {
24
+ this.logger.error(`❌ 拉取失败: ${error instanceof Error ? error.message : '未知错误'}`);
25
+ throw error;
26
+ }
27
+ }
28
+ }
29
+ //# sourceMappingURL=fetch-apifox-data.use-case.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch-apifox-data.use-case.js","sourceRoot":"","sources":["../../../../src/application/use-cases/fetch-apifox-data.use-case.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,MAAM,OAAO,sBAAsB;IACjC,YACmB,YAA2B,EAC3B,MAAe;QADf,iBAAY,GAAZ,YAAY,CAAe;QAC3B,WAAM,GAAN,MAAM,CAAS;IAC/B,CAAC;IAEJ;;;;OAIG;IACH,KAAK,CAAC,OAAO,CAAC,MAAoB;QAChC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAE1C,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YAE7D,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;YAC9D,IAAI,CAAC,MAAM,CAAC,OAAO,CACjB,mBAAmB,aAAa,OAAO,CACxC,CAAC;YAEF,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,WAAW,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,CAC7D,CAAC;YACF,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,22 @@
1
+ import type { ILogger } from '../../domain/interfaces.js';
2
+ import type { ApifoxConfig } from '../../types/index.js';
3
+ import type { OpenAPIDocument } from '../../types/openapi.js';
4
+ import { EndpointFilterService } from '../../domain/services/endpoint-filter.service.js';
5
+ import { OpenAPIConverterService } from '../../domain/services/openapi-converter.service.js';
6
+ /**
7
+ * 生成 Mock 用例
8
+ * 负责生成 Mock 文件
9
+ */
10
+ export declare class GenerateMockUseCase {
11
+ private readonly endpointFilter;
12
+ private readonly openapiConverter;
13
+ private readonly logger;
14
+ constructor(endpointFilter: EndpointFilterService, openapiConverter: OpenAPIConverterService, logger: ILogger);
15
+ /**
16
+ * 执行用例
17
+ * @param config Apifox 配置
18
+ * @param openapi OpenAPI 文档
19
+ */
20
+ execute(config: ApifoxConfig, openapi: OpenAPIDocument): Promise<void>;
21
+ }
22
+ //# sourceMappingURL=generate-mock.use-case.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-mock.use-case.d.ts","sourceRoot":"","sources":["../../../../src/application/use-cases/generate-mock.use-case.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,kDAAkD,CAAC;AACzF,OAAO,EAAE,uBAAuB,EAAE,MAAM,oDAAoD,CAAC;AAI7F;;;GAGG;AACH,qBAAa,mBAAmB;IAE5B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAFN,cAAc,EAAE,qBAAqB,EACrC,gBAAgB,EAAE,uBAAuB,EACzC,MAAM,EAAE,OAAO;IAGlC;;;;OAIG;IACG,OAAO,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;CA+B7E"}
@@ -0,0 +1,42 @@
1
+ import { generateMockFiles } from '../../generators/mock-generator.js';
2
+ /**
3
+ * 生成 Mock 用例
4
+ * 负责生成 Mock 文件
5
+ */
6
+ export class GenerateMockUseCase {
7
+ constructor(endpointFilter, openapiConverter, logger) {
8
+ this.endpointFilter = endpointFilter;
9
+ this.openapiConverter = openapiConverter;
10
+ this.logger = logger;
11
+ }
12
+ /**
13
+ * 执行用例
14
+ * @param config Apifox 配置
15
+ * @param openapi OpenAPI 文档
16
+ */
17
+ async execute(config, openapi) {
18
+ this.logger.title('生成 Mock 文件...');
19
+ // 转换为端点实体
20
+ const allEndpoints = this.openapiConverter.convert(openapi);
21
+ this.logger.success(`✓ 解析到 ${allEndpoints.length} 个 API 接口`);
22
+ // 应用过滤(转换为普通对象以兼容现有生成器)
23
+ const filteredEndpoints = this.endpointFilter.filter(allEndpoints, config.apiFilter);
24
+ if (config.apiFilter) {
25
+ const filteredCount = allEndpoints.length - filteredEndpoints.length;
26
+ if (filteredCount > 0) {
27
+ this.logger.info(` 应用客户端筛选规则,过滤掉 ${filteredCount} 个接口`);
28
+ }
29
+ this.logger.success(`✓ 保留 ${filteredEndpoints.length} 个接口用于生成`);
30
+ }
31
+ if (filteredEndpoints.length === 0) {
32
+ this.logger.warn('没有匹配的 API 接口,请检查筛选规则配置');
33
+ return;
34
+ }
35
+ // 转换为普通对象以兼容现有生成器
36
+ const endpoints = filteredEndpoints.map(e => e.toJSON());
37
+ // 生成 Mock 文件
38
+ await generateMockFiles(config, endpoints, openapi.components?.schemas);
39
+ this.logger.success('✓ Mock 文件生成完成');
40
+ }
41
+ }
42
+ //# sourceMappingURL=generate-mock.use-case.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-mock.use-case.js","sourceRoot":"","sources":["../../../../src/application/use-cases/generate-mock.use-case.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAGvE;;;GAGG;AACH,MAAM,OAAO,mBAAmB;IAC9B,YACmB,cAAqC,EACrC,gBAAyC,EACzC,MAAe;QAFf,mBAAc,GAAd,cAAc,CAAuB;QACrC,qBAAgB,GAAhB,gBAAgB,CAAyB;QACzC,WAAM,GAAN,MAAM,CAAS;IAC/B,CAAC;IAEJ;;;;OAIG;IACH,KAAK,CAAC,OAAO,CAAC,MAAoB,EAAE,OAAwB;QAC1D,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAEnC,UAAU;QACV,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC5D,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,YAAY,CAAC,MAAM,WAAW,CAAC,CAAC;QAE7D,wBAAwB;QACxB,MAAM,iBAAiB,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QAErF,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACrB,MAAM,aAAa,GAAG,YAAY,CAAC,MAAM,GAAG,iBAAiB,CAAC,MAAM,CAAC;YACrE,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;gBACtB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,mBAAmB,aAAa,MAAM,CAAC,CAAC;YAC3D,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,iBAAiB,CAAC,MAAM,UAAU,CAAC,CAAC;QAClE,CAAC;QAED,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;YAC3C,OAAO;QACT,CAAC;QAED,kBAAkB;QAClB,MAAM,SAAS,GAAkB,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QAExE,aAAa;QACb,MAAM,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAExE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IACvC,CAAC;CACF"}
@@ -0,0 +1,22 @@
1
+ import type { ILogger } from '../../domain/interfaces.js';
2
+ import type { ApifoxConfig } from '../../types/index.js';
3
+ import type { OpenAPIDocument } from '../../types/openapi.js';
4
+ import { EndpointFilterService } from '../../domain/services/endpoint-filter.service.js';
5
+ import { OpenAPIConverterService } from '../../domain/services/openapi-converter.service.js';
6
+ /**
7
+ * 生成类型用例
8
+ * 负责生成 TypeScript 类型文件
9
+ */
10
+ export declare class GenerateTypesUseCase {
11
+ private readonly endpointFilter;
12
+ private readonly openapiConverter;
13
+ private readonly logger;
14
+ constructor(endpointFilter: EndpointFilterService, openapiConverter: OpenAPIConverterService, logger: ILogger);
15
+ /**
16
+ * 执行用例
17
+ * @param config Apifox 配置
18
+ * @param openapi OpenAPI 文档
19
+ */
20
+ execute(config: ApifoxConfig, openapi: OpenAPIDocument): Promise<void>;
21
+ }
22
+ //# sourceMappingURL=generate-types.use-case.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-types.use-case.d.ts","sourceRoot":"","sources":["../../../../src/application/use-cases/generate-types.use-case.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,kDAAkD,CAAC;AACzF,OAAO,EAAE,uBAAuB,EAAE,MAAM,oDAAoD,CAAC;AAI7F;;;GAGG;AACH,qBAAa,oBAAoB;IAE7B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAFN,cAAc,EAAE,qBAAqB,EACrC,gBAAgB,EAAE,uBAAuB,EACzC,MAAM,EAAE,OAAO;IAGlC;;;;OAIG;IACG,OAAO,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;CA+B7E"}
@@ -0,0 +1,42 @@
1
+ import { generateTypeFiles } from '../../generators/type-generator.js';
2
+ /**
3
+ * 生成类型用例
4
+ * 负责生成 TypeScript 类型文件
5
+ */
6
+ export class GenerateTypesUseCase {
7
+ constructor(endpointFilter, openapiConverter, logger) {
8
+ this.endpointFilter = endpointFilter;
9
+ this.openapiConverter = openapiConverter;
10
+ this.logger = logger;
11
+ }
12
+ /**
13
+ * 执行用例
14
+ * @param config Apifox 配置
15
+ * @param openapi OpenAPI 文档
16
+ */
17
+ async execute(config, openapi) {
18
+ this.logger.title('生成 TypeScript 类型文件...');
19
+ // 转换为端点实体
20
+ const allEndpoints = this.openapiConverter.convert(openapi);
21
+ this.logger.success(`✓ 解析到 ${allEndpoints.length} 个 API 接口`);
22
+ // 应用过滤(转换为普通对象以兼容现有生成器)
23
+ const filteredEndpoints = this.endpointFilter.filter(allEndpoints, config.apiFilter);
24
+ if (config.apiFilter) {
25
+ const filteredCount = allEndpoints.length - filteredEndpoints.length;
26
+ if (filteredCount > 0) {
27
+ this.logger.info(` 应用客户端筛选规则,过滤掉 ${filteredCount} 个接口`);
28
+ }
29
+ this.logger.success(`✓ 保留 ${filteredEndpoints.length} 个接口用于生成`);
30
+ }
31
+ if (filteredEndpoints.length === 0) {
32
+ this.logger.warn('没有匹配的 API 接口,请检查筛选规则配置');
33
+ return;
34
+ }
35
+ // 转换为普通对象以兼容现有生成器
36
+ const endpoints = filteredEndpoints.map(e => e.toJSON());
37
+ // 生成类型文件
38
+ await generateTypeFiles(config, openapi, endpoints);
39
+ this.logger.success('✓ 类型文件生成完成');
40
+ }
41
+ }
42
+ //# sourceMappingURL=generate-types.use-case.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-types.use-case.js","sourceRoot":"","sources":["../../../../src/application/use-cases/generate-types.use-case.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAGvE;;;GAGG;AACH,MAAM,OAAO,oBAAoB;IAC/B,YACmB,cAAqC,EACrC,gBAAyC,EACzC,MAAe;QAFf,mBAAc,GAAd,cAAc,CAAuB;QACrC,qBAAgB,GAAhB,gBAAgB,CAAyB;QACzC,WAAM,GAAN,MAAM,CAAS;IAC/B,CAAC;IAEJ;;;;OAIG;IACH,KAAK,CAAC,OAAO,CAAC,MAAoB,EAAE,OAAwB;QAC1D,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAE3C,UAAU;QACV,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC5D,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,YAAY,CAAC,MAAM,WAAW,CAAC,CAAC;QAE7D,wBAAwB;QACxB,MAAM,iBAAiB,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QAErF,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACrB,MAAM,aAAa,GAAG,YAAY,CAAC,MAAM,GAAG,iBAAiB,CAAC,MAAM,CAAC;YACrE,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;gBACtB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,mBAAmB,aAAa,MAAM,CAAC,CAAC;YAC3D,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,iBAAiB,CAAC,MAAM,UAAU,CAAC,CAAC;QAClE,CAAC;QAED,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;YAC3C,OAAO;QACT,CAAC;QAED,kBAAkB;QAClB,MAAM,SAAS,GAAkB,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QAExE,SAAS;QACT,MAAM,iBAAiB,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QAEpD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IACpC,CAAC;CACF"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * 用例统一导出
3
+ */
4
+ export * from './fetch-apifox-data.use-case.js';
5
+ export * from './generate-mock.use-case.js';
6
+ export * from './generate-types.use-case.js';
7
+ export * from './serve-mock.use-case.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/application/use-cases/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,0BAA0B,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * 用例统一导出
3
+ */
4
+ export * from './fetch-apifox-data.use-case.js';
5
+ export * from './generate-mock.use-case.js';
6
+ export * from './generate-types.use-case.js';
7
+ export * from './serve-mock.use-case.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/application/use-cases/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,0BAA0B,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { ILogger } from '../../domain/interfaces.js';
2
+ import type { ApifoxConfig } from '../../types/index.js';
3
+ import type { MockConfig } from '../../core/mock-config-loader.js';
4
+ /**
5
+ * 启动 Mock 服务器用例
6
+ * 负责启动 Mock 服务器并加载路由
7
+ *
8
+ * 注意:这里暂时直接使用 RouteManager 类,因为现有代码依赖具体类型
9
+ * Phase 4 中将重构服务器代码以使用接口
10
+ */
11
+ export declare class ServeMockUseCase {
12
+ private readonly logger;
13
+ constructor(logger: ILogger);
14
+ /**
15
+ * 检查并清理端口占用
16
+ * @param port 端口号
17
+ */
18
+ checkAndCleanPort(port: number): Promise<void>;
19
+ /**
20
+ * 执行用例
21
+ * @param apifoxConfig Apifox 配置
22
+ * @param mockConfig Mock 配置
23
+ */
24
+ execute(apifoxConfig: ApifoxConfig, mockConfig: MockConfig): Promise<void>;
25
+ }
26
+ //# sourceMappingURL=serve-mock.use-case.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve-mock.use-case.d.ts","sourceRoot":"","sources":["../../../../src/application/use-cases/serve-mock.use-case.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAUnE;;;;;;GAMG;AACH,qBAAa,gBAAgB;IACf,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,OAAO;IAG5C;;;OAGG;IACG,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoCpD;;;;OAIG;IACG,OAAO,CACX,YAAY,EAAE,YAAY,EAC1B,UAAU,EAAE,UAAU,GACrB,OAAO,CAAC,IAAI,CAAC;CA6CjB"}
@@ -0,0 +1,103 @@
1
+ import { RouteManagerImpl } from '../../infrastructure/route-manager/route-manager.impl.js';
2
+ import { loadMockRoutes } from '../../infrastructure/server/route-loader.js';
3
+ import { setupMockServer } from '../../presentation/http/express-server.js';
4
+ import { setupHotReload } from '../../infrastructure/server/hot-reload.js';
5
+ import { exec } from 'child_process';
6
+ import { promisify } from 'util';
7
+ const execAsync = promisify(exec);
8
+ /**
9
+ * 启动 Mock 服务器用例
10
+ * 负责启动 Mock 服务器并加载路由
11
+ *
12
+ * 注意:这里暂时直接使用 RouteManager 类,因为现有代码依赖具体类型
13
+ * Phase 4 中将重构服务器代码以使用接口
14
+ */
15
+ export class ServeMockUseCase {
16
+ constructor(logger) {
17
+ this.logger = logger;
18
+ }
19
+ /**
20
+ * 检查并清理端口占用
21
+ * @param port 端口号
22
+ */
23
+ async checkAndCleanPort(port) {
24
+ try {
25
+ const { stdout } = await execAsync(`netstat -ano | findstr :${port}`);
26
+ if (stdout.trim()) {
27
+ this.logger.warn(`端口 ${port} 被占用,正在清理...`);
28
+ const lines = stdout.trim().split('\n');
29
+ const pids = new Set();
30
+ lines.forEach(line => {
31
+ const parts = line.trim().split(/\s+/);
32
+ if (parts.length >= 5) {
33
+ const pid = parts[parts.length - 1];
34
+ if (pid && pid !== '0') {
35
+ pids.add(pid);
36
+ }
37
+ }
38
+ });
39
+ for (const pid of pids) {
40
+ try {
41
+ await execAsync(`taskkill /F /PID ${pid}`);
42
+ this.logger.success(`✓ 已清理进程 ${pid}`);
43
+ }
44
+ catch (error) {
45
+ this.logger.warn(`无法清理进程 ${pid}: ${error}`);
46
+ }
47
+ }
48
+ // 等待端口释放
49
+ await new Promise(resolve => setTimeout(resolve, 1000));
50
+ }
51
+ }
52
+ catch (error) {
53
+ // 端口未被占用,这是正常情况
54
+ }
55
+ }
56
+ /**
57
+ * 执行用例
58
+ * @param apifoxConfig Apifox 配置
59
+ * @param mockConfig Mock 配置
60
+ */
61
+ async execute(apifoxConfig, mockConfig) {
62
+ // 检查并清理端口占用
63
+ await this.checkAndCleanPort(mockConfig.port);
64
+ this.logger.title('启动 Mock 服务器...');
65
+ // 初始加载所有 Mock 路由
66
+ const routes = await loadMockRoutes(apifoxConfig, mockConfig);
67
+ const routeManager = new RouteManagerImpl();
68
+ routes.forEach(route => {
69
+ const key = `${route.method} ${route.path}`;
70
+ routeManager.setRoute(key, route);
71
+ });
72
+ this.logger.success(`加载了 ${routes.length} 个 Mock 路由`);
73
+ // 创建并启动服务器
74
+ const app = setupMockServer(routeManager, mockConfig);
75
+ app.listen(mockConfig.port, 'localhost', () => {
76
+ this.logger.success(`\n🚀 Mock 服务器已启动!`);
77
+ this.logger.info(` 🌐 地址: http://localhost:${mockConfig.port}`);
78
+ this.logger.info(` ⚙️ 工作模式: ${mockConfig.model}`);
79
+ if (mockConfig.model === 'mock') {
80
+ // 纯 mock 模式:只在存在 proxyRoutes 时提示目标服务器
81
+ if (mockConfig.proxyRoutes?.length) {
82
+ this.logger.info(` 🎯 目标服务器: ${mockConfig.target}`);
83
+ }
84
+ this.logger.info(` 📁 Mock 目录: ${apifoxConfig.mockDir}`);
85
+ this.logger.info(` 📊 已加载路由: ${routes.length} 个`);
86
+ }
87
+ else {
88
+ // 纯 proxy 模式:仅在存在 mockRoutes 时提示本地 Mock 目录和路由数
89
+ this.logger.info(` 🎯 目标服务器: ${mockConfig.target}`);
90
+ if (mockConfig.mockRoutes?.length) {
91
+ this.logger.info(` 📁 Mock 目录: ${apifoxConfig.mockDir}`);
92
+ this.logger.info(` 📊 已加载路由: ${routes.length} 个`);
93
+ }
94
+ }
95
+ this.logger.info('\n💡 提示:');
96
+ this.logger.info(' - 🔥 热重载已启用,修改 Mock 文件将自动生效');
97
+ this.logger.info(' - 🛑 按 Ctrl+C 停止服务器\n');
98
+ // 启动文件监听(热重载)
99
+ setupHotReload(apifoxConfig, routeManager, mockConfig);
100
+ });
101
+ }
102
+ }
103
+ //# sourceMappingURL=serve-mock.use-case.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve-mock.use-case.js","sourceRoot":"","sources":["../../../../src/application/use-cases/serve-mock.use-case.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,10 @@
1
1
  import type { ApifoxConfig } from '../types/index.js';
2
+ import type { OpenAPIDocument } from '../types/openapi.js';
2
3
  /**
3
4
  * 从 Apifox 拉取 OpenAPI 数据
5
+ *
6
+ * @deprecated 此函数已废弃,请使用 IApifoxClient 接口
7
+ * 此函数现在内部调用新的 ApifoxClientImpl 实现
4
8
  */
5
- export declare function fetchOpenAPIFromApifox(config: ApifoxConfig): Promise<any>;
9
+ export declare function fetchOpenAPIFromApifox(config: ApifoxConfig): Promise<OpenAPIDocument>;
6
10
  //# sourceMappingURL=apifox-client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"apifox-client.d.ts","sourceRoot":"","sources":["../../../src/core/apifox-client.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,CAkC/E"}
1
+ {"version":3,"file":"apifox-client.d.ts","sourceRoot":"","sources":["../../../src/core/apifox-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAK3D;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC,CAI3F"}