apifox-mock-generator 1.2.0 → 1.3.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 (122) hide show
  1. package/CHANGELOG.md +73 -0
  2. package/README.md +1057 -920
  3. package/dist/package.json +4 -17
  4. package/dist/src/core/apifox-client.d.ts.map +1 -1
  5. package/dist/src/core/apifox-client.js +10 -12
  6. package/dist/src/core/apifox-client.js.map +1 -1
  7. package/dist/src/core/config-loader.d.ts.map +1 -1
  8. package/dist/src/core/config-loader.js +1 -1
  9. package/dist/src/core/config-loader.js.map +1 -1
  10. package/dist/src/core/endpoint-filter.d.ts.map +1 -1
  11. package/dist/src/core/endpoint-filter.js +26 -27
  12. package/dist/src/core/endpoint-filter.js.map +1 -1
  13. package/dist/src/core/mock-config-loader.d.ts +19 -0
  14. package/dist/src/core/mock-config-loader.d.ts.map +1 -0
  15. package/dist/src/core/mock-config-loader.js +31 -0
  16. package/dist/src/core/mock-config-loader.js.map +1 -0
  17. package/dist/src/core/openapi-converter.d.ts.map +1 -1
  18. package/dist/src/core/openapi-converter.js +11 -8
  19. package/dist/src/core/openapi-converter.js.map +1 -1
  20. package/dist/src/generators/mock-generator.d.ts +1 -1
  21. package/dist/src/generators/mock-generator.d.ts.map +1 -1
  22. package/dist/src/generators/mock-generator.js +38 -17
  23. package/dist/src/generators/mock-generator.js.map +1 -1
  24. package/dist/src/generators/templates/file-architecture.d.ts +4 -0
  25. package/dist/src/generators/templates/file-architecture.d.ts.map +1 -1
  26. package/dist/src/generators/templates/file-architecture.js +42 -5
  27. package/dist/src/generators/templates/file-architecture.js.map +1 -1
  28. package/dist/src/generators/templates/mock-template.d.ts.map +1 -1
  29. package/dist/src/generators/templates/mock-template.js +75 -62
  30. package/dist/src/generators/templates/mock-template.js.map +1 -1
  31. package/dist/src/generators/templates/type-template.d.ts +1 -1
  32. package/dist/src/generators/templates/type-template.d.ts.map +1 -1
  33. package/dist/src/generators/templates/type-template.js +314 -63
  34. package/dist/src/generators/templates/type-template.js.map +1 -1
  35. package/dist/src/generators/type-generator.d.ts.map +1 -1
  36. package/dist/src/generators/type-generator.js +24 -1
  37. package/dist/src/generators/type-generator.js.map +1 -1
  38. package/dist/src/index.d.ts.map +1 -1
  39. package/dist/src/index.js.map +1 -1
  40. package/dist/src/scripts/cli.js +8 -8
  41. package/dist/src/scripts/cli.js.map +1 -1
  42. package/dist/src/scripts/generate-mock.js +3 -1
  43. package/dist/src/scripts/generate-mock.js.map +1 -1
  44. package/dist/src/scripts/serve-mock.js +11 -12
  45. package/dist/src/scripts/serve-mock.js.map +1 -1
  46. package/dist/src/server/express-server.d.ts +2 -1
  47. package/dist/src/server/express-server.d.ts.map +1 -1
  48. package/dist/src/server/express-server.js +9 -44
  49. package/dist/src/server/express-server.js.map +1 -1
  50. package/dist/src/server/hot-reload.d.ts +2 -1
  51. package/dist/src/server/hot-reload.d.ts.map +1 -1
  52. package/dist/src/server/hot-reload.js +5 -3
  53. package/dist/src/server/hot-reload.js.map +1 -1
  54. package/dist/src/server/remote-proxy.d.ts +17 -0
  55. package/dist/src/server/remote-proxy.d.ts.map +1 -0
  56. package/dist/src/server/remote-proxy.js +45 -0
  57. package/dist/src/server/remote-proxy.js.map +1 -0
  58. package/dist/src/server/route-handler.d.ts +28 -0
  59. package/dist/src/server/route-handler.d.ts.map +1 -0
  60. package/dist/src/server/route-handler.js +110 -0
  61. package/dist/src/server/route-handler.js.map +1 -0
  62. package/dist/src/server/route-loader.d.ts +3 -2
  63. package/dist/src/server/route-loader.d.ts.map +1 -1
  64. package/dist/src/server/route-loader.js +99 -23
  65. package/dist/src/server/route-loader.js.map +1 -1
  66. package/dist/src/server/route-manager.d.ts.map +1 -1
  67. package/dist/src/server/route-manager.js.map +1 -1
  68. package/dist/src/server/route-matcher.d.ts.map +1 -1
  69. package/dist/src/server/route-matcher.js.map +1 -1
  70. package/dist/src/server/validation.d.ts.map +1 -1
  71. package/dist/src/server/validation.js.map +1 -1
  72. package/dist/src/types/index.d.ts +3 -12
  73. package/dist/src/types/index.d.ts.map +1 -1
  74. package/dist/src/types/mock/v1/auth/login/username.d.ts +7 -13
  75. package/dist/src/types/mock/v1/auth/login/username.d.ts.map +1 -1
  76. package/dist/src/types/mock/v1/auth/login/username.js.map +1 -1
  77. package/dist/src/types/mock/v1/role/list.d.ts +12 -0
  78. package/dist/src/types/mock/v1/role/list.d.ts.map +1 -1
  79. package/dist/src/types/mock/v1/role/list.js.map +1 -1
  80. package/dist/src/types/mock/v1/role/permissions.d.ts +8 -0
  81. package/dist/src/types/mock/v1/role/permissions.d.ts.map +1 -1
  82. package/dist/src/types/mock/v1/role/permissions.js.map +1 -1
  83. package/dist/src/types/mock/v1/role.d.ts +28 -0
  84. package/dist/src/types/mock/v1/role.d.ts.map +1 -1
  85. package/dist/src/types/mock/v1/role.js.map +1 -1
  86. package/dist/src/types/mock/v1/tenant/permissions.d.ts +17 -2
  87. package/dist/src/types/mock/v1/tenant/permissions.d.ts.map +1 -1
  88. package/dist/src/types/mock/v1/tenant/permissions.js.map +1 -1
  89. package/dist/src/types/mock/v1/tenant/user/list.d.ts +15 -1
  90. package/dist/src/types/mock/v1/tenant/user/list.d.ts.map +1 -1
  91. package/dist/src/types/mock/v1/tenant/user/list.js.map +1 -1
  92. package/dist/src/types/mock/v1/tenant/user/unlink.d.ts +10 -0
  93. package/dist/src/types/mock/v1/tenant/user/unlink.d.ts.map +1 -1
  94. package/dist/src/types/mock/v1/tenant/user/unlink.js.map +1 -1
  95. package/dist/src/types/mock/v1/user/info.d.ts +1 -1
  96. package/dist/src/types/mock/v1/user/permissions.d.ts +2 -2
  97. package/dist/src/types/mock/v1/user/permissions.d.ts.map +1 -1
  98. package/dist/src/types/v1/tenant/permissions.d.ts +16 -0
  99. package/dist/src/types/v1/tenant/permissions.d.ts.map +1 -0
  100. package/dist/src/types/v1/tenant/permissions.js +4 -0
  101. package/dist/src/types/v1/tenant/permissions.js.map +1 -0
  102. package/dist/src/utils/block-updater.d.ts.map +1 -1
  103. package/dist/src/utils/block-updater.js +9 -4
  104. package/dist/src/utils/block-updater.js.map +1 -1
  105. package/dist/src/utils/code-formatter.js +1 -1
  106. package/dist/src/utils/code-formatter.js.map +1 -1
  107. package/dist/src/utils/file-helper.d.ts.map +1 -1
  108. package/dist/src/utils/file-helper.js.map +1 -1
  109. package/dist/src/utils/file-operations.js.map +1 -1
  110. package/dist/src/utils/file-utils.d.ts +9 -0
  111. package/dist/src/utils/file-utils.d.ts.map +1 -0
  112. package/dist/src/utils/file-utils.js +44 -0
  113. package/dist/src/utils/file-utils.js.map +1 -0
  114. package/dist/src/utils/logger.d.ts.map +1 -1
  115. package/dist/src/utils/logger.js.map +1 -1
  116. package/dist/src/utils/path-utils.d.ts.map +1 -1
  117. package/dist/src/utils/path-utils.js.map +1 -1
  118. package/dist/src/utils/type-mapping.d.ts +2 -2
  119. package/dist/src/utils/type-mapping.d.ts.map +1 -1
  120. package/dist/src/utils/type-mapping.js +48 -6
  121. package/dist/src/utils/type-mapping.js.map +1 -1
  122. package/package.json +48 -61
@@ -1 +1 @@
1
- {"version":3,"file":"type-generator.js","sourceRoot":"","sources":["../../../src/generators/type-generator.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAC7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAA;AAGvE;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAoB,EACpB,OAAY,EACZ,SAAwB;IAExB,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAA;IAErC,MAAM,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IAE3C,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,EAAE,OAAO,IAAI,EAAE,CAAA;IACjD,IAAI,cAAc,GAAG,CAAC,CAAA;IAEtB,mBAAmB;IACnB,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,SAAS,CAAC,CAAA;IAExD,KAAK,MAAM,CAAC,SAAS,EAAE,cAAc,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC3E,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,SAAS,KAAK,CAAC,CAAA;QAElE,eAAe;QACf,KAAK,MAAM,QAAQ,IAAI,cAAc,EAAE,CAAC;YACtC,MAAM,WAAW,GAAG,wBAAwB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;YAC/D,MAAM,eAAe,GAAG,GAAG,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAA;YAE9D,qBAAqB;YACrB,MAAM,UAAU,CAAC,mBAAmB,CAClC,YAAY,EACZ,WAAW,EACX,eAAe,CAChB,CAAA;YACD,cAAc,EAAE,CAAA;QAClB,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,OAAO,YAAY,KAAK,cAAc,CAAC,MAAM,OAAO,CAAC,CAAA;IACnE,CAAC;IAED,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAA;IAC7B,MAAM,CAAC,IAAI,CAAC,OAAO,cAAc,QAAQ,CAAC,CAAA;AAC5C,CAAC"}
1
+ {"version":3,"file":"type-generator.js","sourceRoot":"","sources":["../../../src/generators/type-generator.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AAGxE;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAoB,EACpB,OAAY,EACZ,SAAwB;IAExB,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAEtC,MAAM,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAE5C,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,EAAE,OAAO,IAAI,EAAE,CAAC;IAElD,4BAA4B;IAC5B,MAAM,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAC;IAChD,KAAK,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9D,mBAAmB;QACnB,MAAM,WAAW,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;QAEnD,kCAAkC;QAClC,IAAI,UAAU,GAAG,UAAU,CAAC;QAC5B,IAAI,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YACvC,6BAA6B;YAC7B,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YAC/C,IAAI,KAAK,EAAE,CAAC;gBACV,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACzC,CAAC;iBAAM,CAAC;gBACN,qBAAqB;gBACrB,UAAU;oBACR,UAAU,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,IAAI,QAAQ,CAAC;YAC9F,CAAC;QACH,CAAC;QAED,aAAa,CAAC,GAAG,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QAC3C,aAAa;QACb,aAAa,CAAC,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAC5C,CAAC;IAED,IAAI,cAAc,GAAG,CAAC,CAAC;IAEvB,mBAAmB;IACnB,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,SAAS,CAAC,CAAC;IAEzD,KAAK,MAAM,CAAC,SAAS,EAAE,cAAc,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC3E,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,SAAS,KAAK,CAAC,CAAC;QAEnE,eAAe;QACf,KAAK,MAAM,QAAQ,IAAI,cAAc,EAAE,CAAC;YACtC,MAAM,WAAW,GAAG,wBAAwB,CAAC,QAAQ,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;YAC/E,MAAM,eAAe,GAAG,GAAG,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;YAE/D,qBAAqB;YACrB,MAAM,UAAU,CAAC,mBAAmB,CAAC,YAAY,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC;YACjF,cAAc,EAAE,CAAC;QACnB,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,OAAO,YAAY,KAAK,cAAc,CAAC,MAAM,OAAO,CAAC,CAAC;IACpE,CAAC;IAED,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAC9B,MAAM,CAAC,IAAI,CAAC,OAAO,cAAc,QAAQ,CAAC,CAAC;AAC7C,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA;AAMjC,eAAO,MAAM,OAAO,KAAc,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAMlC,eAAO,MAAM,OAAO,KAAc,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,mBAAmB;AACnB,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA;AAEjC,2BAA2B;AAC3B,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAA;AACtC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAC9C,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAA;AACtC,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,mBAAmB;AACnB,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAElC,2BAA2B;AAC3B,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;AACvC,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC"}
@@ -14,14 +14,14 @@ switch (command) {
14
14
  await import('./serve-mock.js');
15
15
  break;
16
16
  default:
17
- console.log(`
18
- Apifox Mock Generator v1.0.0
19
-
20
- 用法:
21
- apifox-mock generate 生成 Mock 和类型文件
22
- apifox-mock serve 启动 Mock 服务器
23
- apifox-mock dev 开发模式(生成 + 服务器)
24
-
17
+ console.log(`
18
+ Apifox Mock Generator v1.0.0
19
+
20
+ 用法:
21
+ apifox-mock generate 生成 Mock 和类型文件
22
+ apifox-mock serve 启动 Mock 服务器
23
+ apifox-mock dev 开发模式(生成 + 服务器)
24
+
25
25
  `);
26
26
  process.exit(command ? 1 : 0);
27
27
  }
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../src/scripts/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAE3C,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AAE/B,QAAQ,OAAO,EAAE,CAAC;IAChB,KAAK,UAAU;QACb,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAA;QAClC,MAAK;IACP,KAAK,OAAO;QACV,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAA;QAC/B,MAAK;IACP,KAAK,KAAK;QACR,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QACxB,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAA;QAClC,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAA;QAC/B,MAAK;IACP;QACE,OAAO,CAAC,GAAG,CAAC;;;;;;;;CAQf,CAAC,CAAA;QACE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AACjC,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../src/scripts/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAEhC,QAAQ,OAAO,EAAE,CAAC;IAChB,KAAK,UAAU;QACb,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QACnC,MAAM;IACR,KAAK,OAAO;QACV,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;QAChC,MAAM;IACR,KAAK,KAAK;QACR,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACzB,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QACnC,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;QAChC,MAAM;IACR;QACE,OAAO,CAAC,GAAG,CAAC;;;;;;;;CAQf,CAAC,CAAC;QACC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAClC,CAAC"}
@@ -38,7 +38,9 @@ async function main() {
38
38
  }
39
39
  catch (error) {
40
40
  // 避免重复显示错误信息
41
- if (error instanceof Error && !error.message.includes('网络连接失败') && !error.message.includes('API 请求失败')) {
41
+ if (error instanceof Error &&
42
+ !error.message.includes('网络连接失败') &&
43
+ !error.message.includes('API 请求失败')) {
42
44
  logger.error('生成失败');
43
45
  console.error(error);
44
46
  }
@@ -1 +1 @@
1
- {"version":3,"file":"generate-mock.js","sourceRoot":"","sources":["../../../src/scripts/generate-mock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAA;AACjE,OAAO,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAA;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAEnE;;GAEG;AACH,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAA;QAEjD,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAA;QAEjC,mCAAmC;QACnC,MAAM,OAAO,GAAG,MAAM,sBAAsB,CAAC,MAAM,CAAC,CAAA;QAEpD,UAAU;QACV,MAAM,YAAY,GAAG,yBAAyB,CAAC,OAAO,CAAC,CAAA;QACvD,MAAM,CAAC,OAAO,CAAC,SAAS,YAAY,CAAC,MAAM,WAAW,CAAC,CAAA;QAEvD,UAAU;QACV,MAAM,SAAS,GAAG,eAAe,CAAC,YAAY,EAAE,MAAM,CAAC,SAAS,CAAC,CAAA;QAEjE,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACrB,MAAM,aAAa,GAAG,YAAY,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,CAAA;YAC5D,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;gBACtB,MAAM,CAAC,IAAI,CAAC,mBAAmB,aAAa,MAAM,CAAC,CAAA;YACrD,CAAC;YACD,MAAM,CAAC,OAAO,CAAC,QAAQ,SAAS,CAAC,MAAM,UAAU,CAAC,CAAA;QACpD,CAAC;QAED,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAA;YACrC,OAAM;QACR,CAAC;QAED,aAAa;QACb,MAAM,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;QAEvE,SAAS;QACT,MAAM,iBAAiB,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,CAAA;QAEnD,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAA;IAEjC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,aAAa;QACb,IAAI,KAAK,YAAY,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YACvG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;YACpB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QACtB,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAA"}
1
+ {"version":3,"file":"generate-mock.js","sourceRoot":"","sources":["../../../src/scripts/generate-mock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAEpE;;GAEG;AACH,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;QAElD,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAElC,mCAAmC;QACnC,MAAM,OAAO,GAAG,MAAM,sBAAsB,CAAC,MAAM,CAAC,CAAC;QAErD,UAAU;QACV,MAAM,YAAY,GAAG,yBAAyB,CAAC,OAAO,CAAC,CAAC;QACxD,MAAM,CAAC,OAAO,CAAC,SAAS,YAAY,CAAC,MAAM,WAAW,CAAC,CAAC;QAExD,UAAU;QACV,MAAM,SAAS,GAAG,eAAe,CAAC,YAAY,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QAElE,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACrB,MAAM,aAAa,GAAG,YAAY,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;YAC7D,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;gBACtB,MAAM,CAAC,IAAI,CAAC,mBAAmB,aAAa,MAAM,CAAC,CAAC;YACtD,CAAC;YACD,MAAM,CAAC,OAAO,CAAC,QAAQ,SAAS,CAAC,MAAM,UAAU,CAAC,CAAC;QACrD,CAAC;QAED,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;YACtC,OAAO;QACT,CAAC;QAED,aAAa;QACb,MAAM,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAExE,SAAS;QACT,MAAM,iBAAiB,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QAEpD,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAClC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,aAAa;QACb,IACE,KAAK,YAAY,KAAK;YACtB,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACjC,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,EACnC,CAAC;YACD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACrB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import { logger } from '../utils/logger.js';
2
2
  import { loadConfig } from '../core/config-loader.js';
3
+ import { loadMockConfig } from '../core/mock-config-loader.js';
3
4
  import { RouteManager } from '../server/route-manager.js';
4
5
  import { loadMockRoutes } from '../server/route-loader.js';
5
6
  import { setupMockServer } from '../server/express-server.js';
@@ -9,32 +10,30 @@ import { setupHotReload } from '../server/hot-reload.js';
9
10
  */
10
11
  async function main() {
11
12
  try {
12
- const config = await loadConfig();
13
+ // 加载配置
14
+ const apifoxConfig = await loadConfig();
15
+ const mockConfig = await loadMockConfig();
13
16
  const routeManager = new RouteManager();
14
17
  logger.title('启动 Mock 服务器...');
15
18
  // 初始加载所有 Mock 路由
16
- const routes = await loadMockRoutes(config);
19
+ const routes = await loadMockRoutes(apifoxConfig, mockConfig);
17
20
  routes.forEach(route => {
18
21
  const key = `${route.method} ${route.path}`;
19
22
  routeManager.setRoute(key, route);
20
23
  });
21
24
  logger.success(`加载了 ${routes.length} 个 Mock 路由`);
22
25
  // 创建并启动服务器
23
- const app = setupMockServer(routeManager);
24
- app.listen(config.mockPort, () => {
26
+ const app = setupMockServer(routeManager, mockConfig);
27
+ app.listen(mockConfig.port, 'localhost', () => {
25
28
  logger.success(`\n🚀 Mock 服务器已启动!`);
26
- logger.info(` 地址: http://localhost:${config.mockPort}`);
27
- logger.info(` 路由数: ${routes.length}`);
28
- logger.info('\n可用的 API 接口:');
29
- routes.forEach(route => {
30
- const method = route.method.padEnd(6);
31
- console.log(` ${method} http://localhost:${config.mockPort}${route.path}`);
32
- });
29
+ logger.info(` 地址: http://localhost:${mockConfig.port}`);
30
+ logger.info(` 工作模式: ${mockConfig.model}`);
31
+ logger.info(` 目标服务器: ${mockConfig.target}`);
33
32
  logger.info('\n提示:');
34
33
  logger.info(' - 🔥 热重载已启用,修改 Mock 文件将自动生效');
35
34
  logger.info(' - 按 Ctrl+C 停止服务器\n');
36
35
  // 启动文件监听(热重载)
37
- setupHotReload(config, routeManager);
36
+ setupHotReload(apifoxConfig, routeManager, mockConfig);
38
37
  });
39
38
  }
40
39
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"serve-mock.js","sourceRoot":"","sources":["../../../src/scripts/serve-mock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAExD;;GAEG;AACH,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAA;QACjC,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAA;QAEvC,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAA;QAE9B,iBAAiB;QACjB,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,CAAA;QAC3C,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACrB,MAAM,GAAG,GAAG,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE,CAAA;YAC3C,YAAY,CAAC,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QACnC,CAAC,CAAC,CAAA;QACF,MAAM,CAAC,OAAO,CAAC,OAAO,MAAM,CAAC,MAAM,YAAY,CAAC,CAAA;QAEhD,WAAW;QACX,MAAM,GAAG,GAAG,eAAe,CAAC,YAAY,CAAC,CAAA;QAEzC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,EAAE;YAC/B,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAA;YACnC,MAAM,CAAC,IAAI,CAAC,2BAA2B,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAA;YACzD,MAAM,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,MAAM,EAAE,CAAC,CAAA;YACvC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;YAE5B,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;gBACrB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;gBACrC,OAAO,CAAC,GAAG,CAAC,MAAM,MAAM,qBAAqB,MAAM,CAAC,QAAQ,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,CAAA;YAC9E,CAAC,CAAC,CAAA;YAEF,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YACpB,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAA;YAC5C,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAA;YAEnC,cAAc;YACd,cAAc,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;QACtC,CAAC,CAAC,CAAA;IAEJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QACpB,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QACtB,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAA"}
1
+ {"version":3,"file":"serve-mock.js","sourceRoot":"","sources":["../../../src/scripts/serve-mock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEzD;;GAEG;AACH,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,OAAO;QACP,MAAM,YAAY,GAAG,MAAM,UAAU,EAAE,CAAC;QACxC,MAAM,UAAU,GAAG,MAAM,cAAc,EAAE,CAAC;QAC1C,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;QAExC,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAE/B,iBAAiB;QACjB,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;QAC9D,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACrB,MAAM,GAAG,GAAG,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YAC5C,YAAY,CAAC,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,OAAO,CAAC,OAAO,MAAM,CAAC,MAAM,YAAY,CAAC,CAAC;QAEjD,WAAW;QACX,MAAM,GAAG,GAAG,eAAe,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;QAEtD,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE;YAC5C,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;YACpC,MAAM,CAAC,IAAI,CAAC,2BAA2B,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;YAC1D,MAAM,CAAC,IAAI,CAAC,YAAY,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;YAC5C,MAAM,CAAC,IAAI,CAAC,aAAa,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;YAC9C,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACrB,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;YAC7C,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;YAEpC,cAAc;YACd,cAAc,CAAC,YAAY,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACrB,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC"}
@@ -1,7 +1,8 @@
1
1
  import express from 'express';
2
2
  import type { RouteManager } from './route-manager.js';
3
+ import type { MockConfig } from '../core/mock-config-loader.js';
3
4
  /**
4
5
  * 设置 Mock 服务器
5
6
  */
6
- export declare function setupMockServer(routeManager: RouteManager): express.Application;
7
+ export declare function setupMockServer(routeManager: RouteManager, mockConfig: MockConfig): express.Application;
7
8
  //# sourceMappingURL=express-server.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"express-server.d.ts","sourceRoot":"","sources":["../../../src/server/express-server.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAA;AAK7B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEtD;;GAEG;AACH,wBAAgB,eAAe,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAuF/E"}
1
+ {"version":3,"file":"express-server.d.ts","sourceRoot":"","sources":["../../../src/server/express-server.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAI9B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAEhE;;GAEG;AACH,wBAAgB,eAAe,CAC7B,YAAY,EAAE,YAAY,EAC1B,UAAU,EAAE,UAAU,GACrB,OAAO,CAAC,WAAW,CAiDrB"}
@@ -1,12 +1,11 @@
1
1
  import express from 'express';
2
2
  import cors from 'cors';
3
3
  import { logger } from '../utils/logger.js';
4
- import { findMatchingRoute, extractPathParams } from './route-matcher.js';
5
- import { validateRequest } from './validation.js';
4
+ import { RouteHandler } from './route-handler.js';
6
5
  /**
7
6
  * 设置 Mock 服务器
8
7
  */
9
- export function setupMockServer(routeManager) {
8
+ export function setupMockServer(routeManager, mockConfig) {
10
9
  const app = express();
11
10
  // 中间件
12
11
  app.use(cors());
@@ -18,49 +17,15 @@ export function setupMockServer(routeManager) {
18
17
  logger.info(`[${timestamp}] ${req.method} ${req.path}`);
19
18
  next();
20
19
  });
20
+ // 创建路由处理器
21
+ const routeHandler = new RouteHandler(mockConfig, routeManager);
21
22
  // 动态路由处理中间件
22
23
  app.use(async (req, res, next) => {
23
- // 尝试匹配路由
24
- const route = findMatchingRoute(routeManager.getAllRoutes(), req.method, req.path);
25
- if (!route) {
26
- return next(); // 继续到 404 处理
27
- }
28
- // 提取路径参数
29
- const params = extractPathParams(route.path, req.path);
30
- req.params = params;
31
- // 参数校验
32
- if (route.validation) {
33
- const validationError = validateRequest(req, route.validation);
34
- if (validationError) {
35
- res.status(400).json({
36
- code: 400,
37
- message: '参数校验失败',
38
- error: validationError
39
- });
40
- logger.error(`${route.method} ${route.path} -> 400 (参数校验失败: ${validationError})`);
41
- return;
42
- }
43
- }
44
- try {
45
- // 判断 response 是函数还是静态数据
46
- let responseData = typeof route.response === 'function'
47
- ? route.response(req) // 动态生成数据
48
- : route.response; // 静态数据
49
- // 处理 Promise
50
- if (responseData && typeof responseData.then === 'function') {
51
- responseData = await responseData;
52
- }
53
- // 返回 Mock 数据
54
- res.status(route.status || 200).json(responseData);
55
- logger.success(`${route.method} ${route.path} -> ${route.status || 200}`);
56
- }
57
- catch (error) {
58
- logger.error(`${route.method} ${route.path} -> 500 (${error instanceof Error ? error.message : '未知错误'})`);
59
- res.status(500).json({
60
- code: 500,
61
- message: 'Internal server error',
62
- error: error instanceof Error ? error.message : '未知错误'
63
- });
24
+ // 使用路由处理器处理请求
25
+ const handled = await routeHandler.handleRequest(req, res);
26
+ if (!handled) {
27
+ // 如果请求未被处理,继续到 404 处理
28
+ return next();
64
29
  }
65
30
  });
66
31
  // 404 处理
@@ -1 +1 @@
1
- {"version":3,"file":"express-server.js","sourceRoot":"","sources":["../../../src/server/express-server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"express-server.js","sourceRoot":"","sources":["../../../src/server/express-server.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAIlD;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,YAA0B,EAC1B,UAAsB;IAEtB,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;IAEtB,MAAM;IACN,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAChB,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACxB,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAEhD,UAAU;IACV,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QACzB,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,kBAAkB,EAAE,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,IAAI,SAAS,KAAK,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QACxD,IAAI,EAAE,CAAC;IACT,CAAC,CAAC,CAAC;IAEH,UAAU;IACV,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;IAEhE,YAAY;IACZ,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC/B,cAAc;QACd,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAE3D,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,sBAAsB;YACtB,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,SAAS;IACT,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACnB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACnB,IAAI,EAAE,GAAG;YACT,OAAO,EAAE,eAAe;YACxB,IAAI,EAAE,IAAI;SACX,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO;IACP,GAAG,CAAC,GAAG,CAAC,CAAC,GAAU,EAAE,GAAoB,EAAE,GAAqB,EAAE,IAA0B,EAAE,EAAE;QAC9F,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACtC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACnB,IAAI,EAAE,GAAG;YACT,OAAO,EAAE,uBAAuB;YAChC,IAAI,EAAE,IAAI;SACX,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -1,7 +1,8 @@
1
1
  import type { RouteManager } from './route-manager.js';
2
2
  import type { ApifoxConfig } from '../types/index.js';
3
+ import type { MockConfig } from '../core/mock-config-loader.js';
3
4
  /**
4
5
  * 设置热重载
5
6
  */
6
- export declare function setupHotReload(config: ApifoxConfig, routeManager: RouteManager): void;
7
+ export declare function setupHotReload(config: ApifoxConfig, routeManager: RouteManager, mockConfig: MockConfig): void;
7
8
  //# sourceMappingURL=hot-reload.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"hot-reload.d.ts","sourceRoot":"","sources":["../../../src/server/hot-reload.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAErD;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,GAAG,IAAI,CAsDrF"}
1
+ {"version":3,"file":"hot-reload.d.ts","sourceRoot":"","sources":["../../../src/server/hot-reload.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAEhE;;GAEG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,YAAY,EACpB,YAAY,EAAE,YAAY,EAC1B,UAAU,EAAE,UAAU,GACrB,IAAI,CAwDN"}
@@ -5,7 +5,9 @@ import { loadRouteFromFile } from './route-loader.js';
5
5
  /**
6
6
  * 设置热重载
7
7
  */
8
- export function setupHotReload(config, routeManager) {
8
+ export function setupHotReload(config, routeManager, mockConfig) {
9
+ // 暂时禁用热重载功能
10
+ return;
9
11
  const mockDir = path.resolve(config.mockDir);
10
12
  logger.info('🔥 监听 Mock 文件变化...');
11
13
  logger.info(` 监听目录: ${mockDir}`);
@@ -26,7 +28,7 @@ export function setupHotReload(config, routeManager) {
26
28
  watcher
27
29
  .on('add', async (filePath) => {
28
30
  logger.info(`📝 检测到新文件: ${path.relative(mockDir, filePath)}`);
29
- const result = await loadRouteFromFile(filePath, mockDir);
31
+ const result = await loadRouteFromFile(filePath, mockDir, config, mockConfig);
30
32
  if (result) {
31
33
  routeManager.setRoute(result.key, result.route);
32
34
  logger.success(`✓ 已加载路由: ${result.key}`);
@@ -34,7 +36,7 @@ export function setupHotReload(config, routeManager) {
34
36
  })
35
37
  .on('change', async (filePath) => {
36
38
  logger.info(`📝 文件已修改: ${path.relative(mockDir, filePath)}`);
37
- const result = await loadRouteFromFile(filePath, mockDir);
39
+ const result = await loadRouteFromFile(filePath, mockDir, config, mockConfig);
38
40
  if (result) {
39
41
  routeManager.setRoute(result.key, result.route);
40
42
  logger.success(`✓ 已更新路由: ${result.key}`);
@@ -1 +1 @@
1
- {"version":3,"file":"hot-reload.js","sourceRoot":"","sources":["../../../src/server/hot-reload.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,QAAQ,MAAM,UAAU,CAAA;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAIrD;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAAoB,EAAE,YAA0B;IAC7E,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAE5C,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAA;IACjC,MAAM,CAAC,IAAI,CAAC,YAAY,OAAO,EAAE,CAAC,CAAA;IAClC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAEf,aAAa;IACb,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;IAEzE,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,YAAY,EAAE;QAC3C,OAAO,EAAE,CAAC,aAAa,EAAE,oBAAoB,CAAC;QAC9C,UAAU,EAAE,IAAI;QAChB,aAAa,EAAE,IAAI,EAAE,SAAS;QAC9B,gBAAgB,EAAE;YAChB,kBAAkB,EAAE,GAAG;YACvB,YAAY,EAAE,GAAG;SAClB;QACD,UAAU,EAAE,KAAK;QACjB,MAAM,EAAE,IAAI;KACb,CAAC,CAAA;IAEF,OAAO;SACJ,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;QAC5B,MAAM,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAA;QAC7D,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;QACzD,IAAI,MAAM,EAAE,CAAC;YACX,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;YAC/C,MAAM,CAAC,OAAO,CAAC,YAAY,MAAM,CAAC,GAAG,EAAE,CAAC,CAAA;QAC1C,CAAC;IACH,CAAC,CAAC;SACD,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;QAC/B,MAAM,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAA;QAC5D,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;QACzD,IAAI,MAAM,EAAE,CAAC;YACX,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;YAC/C,MAAM,CAAC,OAAO,CAAC,YAAY,MAAM,CAAC,GAAG,EAAE,CAAC,CAAA;QAC1C,CAAC;IACH,CAAC,CAAC;SACD,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;QAC/B,MAAM,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAA;QAE9D,gBAAgB;QAChB,0BAA0B;QAC1B,MAAM,SAAS,GAAG,YAAY,CAAC,YAAY,EAAE,CAAA;QAC7C,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACxB,MAAM,GAAG,GAAG,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE,CAAA;YAC3C,wBAAwB;YACxB,YAAY,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;QAC/B,CAAC,CAAC,CAAA;QAEF,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;IAC5B,CAAC,CAAC;SACD,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,KAAK,EAAE,CAAC,CAAC,CAAA;AACzD,CAAC"}
1
+ {"version":3,"file":"hot-reload.js","sourceRoot":"","sources":["../../../src/server/hot-reload.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { MockConfig } from '../core/mock-config-loader.js';
2
+ /**
3
+ * 远程服务器代理
4
+ */
5
+ export declare class RemoteProxy {
6
+ private config;
7
+ constructor(config: MockConfig);
8
+ /**
9
+ * 代理请求到远程服务器
10
+ */
11
+ proxyRequest(req: any): Promise<any>;
12
+ /**
13
+ * 检查远程服务器是否已配置
14
+ */
15
+ isRemoteServerConfigured(): boolean;
16
+ }
17
+ //# sourceMappingURL=remote-proxy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-proxy.d.ts","sourceRoot":"","sources":["../../../src/server/remote-proxy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAGhE;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAa;gBAEf,MAAM,EAAE,UAAU;IAI9B;;OAEG;IACG,YAAY,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IA8B1C;;OAEG;IACH,wBAAwB,IAAI,OAAO;CAGpC"}
@@ -0,0 +1,45 @@
1
+ import { logger } from '../utils/logger.js';
2
+ /**
3
+ * 远程服务器代理
4
+ */
5
+ export class RemoteProxy {
6
+ constructor(config) {
7
+ this.config = config;
8
+ }
9
+ /**
10
+ * 代理请求到远程服务器
11
+ */
12
+ async proxyRequest(req) {
13
+ const target = this.config.target;
14
+ const remoteUrl = `${target.replace(/\/$/, '')}${req.path}`;
15
+ const queryString = new URLSearchParams(req.query).toString();
16
+ const fullUrl = queryString ? `${remoteUrl}?${queryString}` : remoteUrl;
17
+ logger.debug(`代理请求到: ${fullUrl}`);
18
+ try {
19
+ const response = await fetch(fullUrl, {
20
+ method: req.method,
21
+ headers: {
22
+ 'Content-Type': 'application/json',
23
+ ...req.headers
24
+ },
25
+ body: req.method !== 'GET' ? JSON.stringify(req.body) : undefined
26
+ });
27
+ if (!response.ok) {
28
+ throw new Error(`远程服务器响应错误: ${response.status} ${response.statusText}`);
29
+ }
30
+ const data = await response.json();
31
+ return data;
32
+ }
33
+ catch (error) {
34
+ logger.error(`代理请求失败: ${error instanceof Error ? error.message : '未知错误'}`);
35
+ throw error;
36
+ }
37
+ }
38
+ /**
39
+ * 检查远程服务器是否已配置
40
+ */
41
+ isRemoteServerConfigured() {
42
+ return !!this.config.target;
43
+ }
44
+ }
45
+ //# sourceMappingURL=remote-proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-proxy.js","sourceRoot":"","sources":["../../../src/server/remote-proxy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C;;GAEG;AACH,MAAM,OAAO,WAAW;IAGtB,YAAY,MAAkB;QAC5B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,GAAQ;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;QAClC,MAAM,SAAS,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QAC5D,MAAM,WAAW,GAAG,IAAI,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC9D,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,SAAS,IAAI,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QAExE,MAAM,CAAC,KAAK,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC;QAElC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,EAAE;gBACpC,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,GAAG,GAAG,CAAC,OAAO;iBACf;gBACD,IAAI,EAAE,GAAG,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;aAClE,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,cAAc,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;YAC1E,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,WAAW,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;YAC3E,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,wBAAwB;QACtB,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IAC9B,CAAC;CACF"}
@@ -0,0 +1,28 @@
1
+ import type { MockConfig } from '../core/mock-config-loader.js';
2
+ import type { RouteManager } from './route-manager.js';
3
+ /**
4
+ * 路由处理器 - 根据工作模式处理请求
5
+ */
6
+ export declare class RouteHandler {
7
+ private config;
8
+ private routeManager;
9
+ private remoteProxy;
10
+ constructor(config: MockConfig, routeManager: RouteManager);
11
+ /**
12
+ * 处理请求
13
+ */
14
+ handleRequest(req: any, res: any): Promise<boolean>;
15
+ /**
16
+ * 处理代理请求(纯代理模式)
17
+ */
18
+ private handleProxyRequest;
19
+ /**
20
+ * 处理 Mock 请求(纯 Mock 模式)
21
+ */
22
+ private handleMockRequest;
23
+ /**
24
+ * 执行 Mock 路由
25
+ */
26
+ private executeMockRoute;
27
+ }
28
+ //# sourceMappingURL=route-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-handler.d.ts","sourceRoot":"","sources":["../../../src/server/route-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAMvD;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,WAAW,CAAc;gBAErB,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY;IAM1D;;OAEG;IACG,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC;IAwBzD;;OAEG;YACW,kBAAkB;IAYhC;;OAEG;YACW,iBAAiB;IAW/B;;OAEG;YACW,gBAAgB;CA+C/B"}
@@ -0,0 +1,110 @@
1
+ import { RemoteProxy } from './remote-proxy.js';
2
+ import { findMatchingRoute, extractPathParams } from './route-matcher.js';
3
+ import { validateRequest } from './validation.js';
4
+ import { logger } from '../utils/logger.js';
5
+ /**
6
+ * 路由处理器 - 根据工作模式处理请求
7
+ */
8
+ export class RouteHandler {
9
+ constructor(config, routeManager) {
10
+ this.config = config;
11
+ this.routeManager = routeManager;
12
+ this.remoteProxy = new RemoteProxy(config);
13
+ }
14
+ /**
15
+ * 处理请求
16
+ */
17
+ async handleRequest(req, res) {
18
+ try {
19
+ // 检查 URL 参数中的模式覆盖
20
+ const urlMode = req.query._mock || req.query._proxy;
21
+ const effectiveMode = urlMode === '_mock' ? 'mock' : urlMode === '_proxy' ? 'proxy' : this.config.model;
22
+ // 检查 remote 参数
23
+ if (this.config.remoteTarget && req.query.remote === 'mock') {
24
+ return await this.handleMockRequest(req, res);
25
+ }
26
+ // 根据模式处理请求
27
+ if (effectiveMode === 'proxy') {
28
+ return await this.handleProxyRequest(req, res);
29
+ }
30
+ else {
31
+ return await this.handleMockRequest(req, res);
32
+ }
33
+ }
34
+ catch (error) {
35
+ logger.error(`请求处理失败: ${error instanceof Error ? error.message : '未知错误'}`);
36
+ return false;
37
+ }
38
+ }
39
+ /**
40
+ * 处理代理请求(纯代理模式)
41
+ */
42
+ async handleProxyRequest(req, res) {
43
+ try {
44
+ const proxyData = await this.remoteProxy.proxyRequest(req);
45
+ res.json(proxyData);
46
+ logger.info(`代理请求成功: ${req.method} ${req.path}`);
47
+ return true;
48
+ }
49
+ catch (error) {
50
+ logger.error(`代理请求失败: ${error instanceof Error ? error.message : '未知错误'}`);
51
+ return false;
52
+ }
53
+ }
54
+ /**
55
+ * 处理 Mock 请求(纯 Mock 模式)
56
+ */
57
+ async handleMockRequest(req, res) {
58
+ const route = findMatchingRoute(this.routeManager.getAllRoutes(), req.method, req.path);
59
+ if (!route) {
60
+ logger.warn(`Mock 模式:未找到路由 ${req.method} ${req.path}`);
61
+ return false;
62
+ }
63
+ return await this.executeMockRoute(route, req, res);
64
+ }
65
+ /**
66
+ * 执行 Mock 路由
67
+ */
68
+ async executeMockRoute(route, req, res) {
69
+ try {
70
+ // 提取路径参数
71
+ const params = extractPathParams(route.path, req.path);
72
+ req.params = params;
73
+ // 参数校验
74
+ if (route.validation) {
75
+ const validationError = validateRequest(req, route.validation);
76
+ if (validationError) {
77
+ res.status(400).json({
78
+ code: 400,
79
+ message: '参数校验失败',
80
+ error: validationError
81
+ });
82
+ logger.error(`${route.method} ${route.path} -> 400 (参数校验失败: ${validationError})`);
83
+ return true;
84
+ }
85
+ }
86
+ // 判断 response 是函数还是静态数据
87
+ let responseData = typeof route.response === 'function'
88
+ ? route.response(req) // 动态生成数据
89
+ : route.response; // 静态数据
90
+ // 处理 Promise
91
+ if (responseData && typeof responseData.then === 'function') {
92
+ responseData = await responseData;
93
+ }
94
+ // 返回 Mock 数据
95
+ res.status(route.status || 200).json(responseData);
96
+ logger.success(`${route.method} ${route.path} -> ${route.status || 200}`);
97
+ return true;
98
+ }
99
+ catch (error) {
100
+ logger.error(`${route.method} ${route.path} -> 500 (${error instanceof Error ? error.message : '未知错误'})`);
101
+ res.status(500).json({
102
+ code: 500,
103
+ message: 'Internal server error',
104
+ error: error instanceof Error ? error.message : '未知错误'
105
+ });
106
+ return true;
107
+ }
108
+ }
109
+ }
110
+ //# sourceMappingURL=route-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-handler.js","sourceRoot":"","sources":["../../../src/server/route-handler.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,13 @@
1
1
  import type { ApifoxConfig, MockRoute } from '../types/index.js';
2
+ import type { MockConfig } from '../core/mock-config-loader.js';
2
3
  /**
3
4
  * 动态扫描并加载所有 Mock 文件
4
5
  */
5
- export declare function loadMockRoutes(config: ApifoxConfig): Promise<MockRoute[]>;
6
+ export declare function loadMockRoutes(config: ApifoxConfig, mockConfig: MockConfig): Promise<MockRoute[]>;
6
7
  /**
7
8
  * 加载单个 Mock 文件的路由
8
9
  */
9
- export declare function loadRouteFromFile(filePath: string, mockDir: string): Promise<{
10
+ export declare function loadRouteFromFile(filePath: string, mockDir: string, config: ApifoxConfig, mockConfig: MockConfig): Promise<{
10
11
  key: string;
11
12
  route: MockRoute;
12
13
  } | null>;
@@ -1 +1 @@
1
- {"version":3,"file":"route-loader.d.ts","sourceRoot":"","sources":["../../../src/server/route-loader.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAOhE;;GAEG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAkE/E;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,CAAA;CAAE,GAAG,IAAI,CAAC,CA2D5H"}
1
+ {"version":3,"file":"route-loader.d.ts","sourceRoot":"","sources":["../../../src/server/route-loader.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAOhE;;GAEG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,YAAY,EACpB,UAAU,EAAE,UAAU,GACrB,OAAO,CAAC,SAAS,EAAE,CAAC,CA2FtB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,YAAY,EACpB,UAAU,EAAE,UAAU,GACrB,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,CAAA;CAAE,GAAG,IAAI,CAAC,CAmGnD"}