imposters 0.1.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 (426) hide show
  1. package/LICENSE +21 -0
  2. package/Program/package.json +6 -0
  3. package/README.md +365 -0
  4. package/api/AdminApi/package.json +6 -0
  5. package/api/ApiErrors/package.json +6 -0
  6. package/api/ApiSchemas/package.json +6 -0
  7. package/api/Conversions/package.json +6 -0
  8. package/api/ImpostersGroup/package.json +6 -0
  9. package/api/ImpostersHandlers/package.json +6 -0
  10. package/api/SystemGroup/package.json +6 -0
  11. package/api/SystemHandlers/package.json +6 -0
  12. package/bin/imposters +47 -0
  13. package/cli/Commands/package.json +6 -0
  14. package/cli/ConfigLoader/package.json +6 -0
  15. package/client/HandlerHttpClient/package.json +6 -0
  16. package/client/ImpostersClient/package.json +6 -0
  17. package/client/testing/package.json +6 -0
  18. package/dist/cjs/Program.js +4 -0
  19. package/dist/cjs/Program.js.map +1 -0
  20. package/dist/cjs/api/AdminApi.js +11 -0
  21. package/dist/cjs/api/AdminApi.js.map +1 -0
  22. package/dist/cjs/api/ApiErrors.js +30 -0
  23. package/dist/cjs/api/ApiErrors.js.map +1 -0
  24. package/dist/cjs/api/ApiSchemas.js +36 -0
  25. package/dist/cjs/api/ApiSchemas.js.map +1 -0
  26. package/dist/cjs/api/Conversions.js +41 -0
  27. package/dist/cjs/api/Conversions.js.map +1 -0
  28. package/dist/cjs/api/ImpostersGroup.js +37 -0
  29. package/dist/cjs/api/ImpostersGroup.js.map +1 -0
  30. package/dist/cjs/api/ImpostersHandlers.js +361 -0
  31. package/dist/cjs/api/ImpostersHandlers.js.map +1 -0
  32. package/dist/cjs/api/SystemGroup.js +12 -0
  33. package/dist/cjs/api/SystemGroup.js.map +1 -0
  34. package/dist/cjs/api/SystemHandlers.js +74 -0
  35. package/dist/cjs/api/SystemHandlers.js.map +1 -0
  36. package/dist/cjs/cli/Commands.js +104 -0
  37. package/dist/cjs/cli/Commands.js.map +1 -0
  38. package/dist/cjs/cli/ConfigLoader.js +34 -0
  39. package/dist/cjs/cli/ConfigLoader.js.map +1 -0
  40. package/dist/cjs/client/HandlerHttpClient.js +50 -0
  41. package/dist/cjs/client/HandlerHttpClient.js.map +1 -0
  42. package/dist/cjs/client/ImpostersClient.js +20 -0
  43. package/dist/cjs/client/ImpostersClient.js.map +1 -0
  44. package/dist/cjs/client/index.js +57 -0
  45. package/dist/cjs/client/index.js.map +1 -0
  46. package/dist/cjs/client/testing.js +94 -0
  47. package/dist/cjs/client/testing.js.map +1 -0
  48. package/dist/cjs/domain/imposter.js +125 -0
  49. package/dist/cjs/domain/imposter.js.map +1 -0
  50. package/dist/cjs/domain/route.js +185 -0
  51. package/dist/cjs/domain/route.js.map +1 -0
  52. package/dist/cjs/index.js +106 -0
  53. package/dist/cjs/index.js.map +1 -0
  54. package/dist/cjs/layers/ApiLayer.js +18 -0
  55. package/dist/cjs/layers/ApiLayer.js.map +1 -0
  56. package/dist/cjs/layers/MainLayer.js +27 -0
  57. package/dist/cjs/layers/MainLayer.js.map +1 -0
  58. package/dist/cjs/matching/ExpressionEvaluator.js +103 -0
  59. package/dist/cjs/matching/ExpressionEvaluator.js.map +1 -0
  60. package/dist/cjs/matching/RequestMatcher.js +145 -0
  61. package/dist/cjs/matching/RequestMatcher.js.map +1 -0
  62. package/dist/cjs/matching/ResponseGenerator.js +80 -0
  63. package/dist/cjs/matching/ResponseGenerator.js.map +1 -0
  64. package/dist/cjs/matching/TemplateEngine.js +55 -0
  65. package/dist/cjs/matching/TemplateEngine.js.map +1 -0
  66. package/dist/cjs/repositories/ImposterRepository.js +118 -0
  67. package/dist/cjs/repositories/ImposterRepository.js.map +1 -0
  68. package/dist/cjs/schemas/ConfigFileSchema.js +44 -0
  69. package/dist/cjs/schemas/ConfigFileSchema.js.map +1 -0
  70. package/dist/cjs/schemas/ImposterSchema.js +202 -0
  71. package/dist/cjs/schemas/ImposterSchema.js.map +1 -0
  72. package/dist/cjs/schemas/RequestLogSchema.js +51 -0
  73. package/dist/cjs/schemas/RequestLogSchema.js.map +1 -0
  74. package/dist/cjs/schemas/StubSchema.js +84 -0
  75. package/dist/cjs/schemas/StubSchema.js.map +1 -0
  76. package/dist/cjs/schemas/common.js +67 -0
  77. package/dist/cjs/schemas/common.js.map +1 -0
  78. package/dist/cjs/server/AdminServer.js +36 -0
  79. package/dist/cjs/server/AdminServer.js.map +1 -0
  80. package/dist/cjs/server/BunServer.js +13 -0
  81. package/dist/cjs/server/BunServer.js.map +1 -0
  82. package/dist/cjs/server/FiberManager.js +21 -0
  83. package/dist/cjs/server/FiberManager.js.map +1 -0
  84. package/dist/cjs/server/ImposterServer.js +234 -0
  85. package/dist/cjs/server/ImposterServer.js.map +1 -0
  86. package/dist/cjs/services/AppConfig.js +18 -0
  87. package/dist/cjs/services/AppConfig.js.map +1 -0
  88. package/dist/cjs/services/MetricsService.js +113 -0
  89. package/dist/cjs/services/MetricsService.js.map +1 -0
  90. package/dist/cjs/services/PortAllocator.js +50 -0
  91. package/dist/cjs/services/PortAllocator.js.map +1 -0
  92. package/dist/cjs/services/ProxyService.js +109 -0
  93. package/dist/cjs/services/ProxyService.js.map +1 -0
  94. package/dist/cjs/services/RequestLogger.js +60 -0
  95. package/dist/cjs/services/RequestLogger.js.map +1 -0
  96. package/dist/cjs/services/Uuid.js +10 -0
  97. package/dist/cjs/services/Uuid.js.map +1 -0
  98. package/dist/cjs/services/UuidLive.js +16 -0
  99. package/dist/cjs/services/UuidLive.js.map +1 -0
  100. package/dist/cjs/ui/UiRouter.js +242 -0
  101. package/dist/cjs/ui/UiRouter.js.map +1 -0
  102. package/dist/cjs/ui/admin/AdminLayout.js +36 -0
  103. package/dist/cjs/ui/admin/AdminLayout.js.map +1 -0
  104. package/dist/cjs/ui/admin/AdminUiRouter.js +155 -0
  105. package/dist/cjs/ui/admin/AdminUiRouter.js.map +1 -0
  106. package/dist/cjs/ui/admin/pages/AdminDashboard.js +55 -0
  107. package/dist/cjs/ui/admin/pages/AdminDashboard.js.map +1 -0
  108. package/dist/cjs/ui/admin/partials.js +64 -0
  109. package/dist/cjs/ui/admin/partials.js.map +1 -0
  110. package/dist/cjs/ui/html.js +42 -0
  111. package/dist/cjs/ui/html.js.map +1 -0
  112. package/dist/cjs/ui/layout.js +39 -0
  113. package/dist/cjs/ui/layout.js.map +1 -0
  114. package/dist/cjs/ui/pages/dashboard.js +51 -0
  115. package/dist/cjs/ui/pages/dashboard.js.map +1 -0
  116. package/dist/cjs/ui/pages/request-detail.js +119 -0
  117. package/dist/cjs/ui/pages/request-detail.js.map +1 -0
  118. package/dist/cjs/ui/pages/requests.js +120 -0
  119. package/dist/cjs/ui/pages/requests.js.map +1 -0
  120. package/dist/cjs/ui/pages/stubs.js +46 -0
  121. package/dist/cjs/ui/pages/stubs.js.map +1 -0
  122. package/dist/cjs/ui/partials.js +104 -0
  123. package/dist/cjs/ui/partials.js.map +1 -0
  124. package/dist/dts/Program.d.ts +2 -0
  125. package/dist/dts/Program.d.ts.map +1 -0
  126. package/dist/dts/api/AdminApi.d.ts +490 -0
  127. package/dist/dts/api/AdminApi.d.ts.map +1 -0
  128. package/dist/dts/api/ApiErrors.d.ts +26 -0
  129. package/dist/dts/api/ApiErrors.d.ts.map +1 -0
  130. package/dist/dts/api/ApiSchemas.d.ts +36 -0
  131. package/dist/dts/api/ApiSchemas.d.ts.map +1 -0
  132. package/dist/dts/api/Conversions.d.ts +7 -0
  133. package/dist/dts/api/Conversions.d.ts.map +1 -0
  134. package/dist/dts/api/ImpostersGroup.d.ts +448 -0
  135. package/dist/dts/api/ImpostersGroup.d.ts.map +1 -0
  136. package/dist/dts/api/ImpostersHandlers.d.ts +9 -0
  137. package/dist/dts/api/ImpostersHandlers.d.ts.map +1 -0
  138. package/dist/dts/api/SystemGroup.d.ts +46 -0
  139. package/dist/dts/api/SystemGroup.d.ts.map +1 -0
  140. package/dist/dts/api/SystemHandlers.d.ts +4 -0
  141. package/dist/dts/api/SystemHandlers.d.ts.map +1 -0
  142. package/dist/dts/cli/Commands.d.ts +4 -0
  143. package/dist/dts/cli/Commands.d.ts.map +1 -0
  144. package/dist/dts/cli/ConfigLoader.d.ts +13 -0
  145. package/dist/dts/cli/ConfigLoader.d.ts.map +1 -0
  146. package/dist/dts/client/HandlerHttpClient.d.ts +5 -0
  147. package/dist/dts/client/HandlerHttpClient.d.ts.map +1 -0
  148. package/dist/dts/client/ImpostersClient.d.ts +1868 -0
  149. package/dist/dts/client/ImpostersClient.d.ts.map +1 -0
  150. package/dist/dts/client/index.d.ts +6 -0
  151. package/dist/dts/client/index.d.ts.map +1 -0
  152. package/dist/dts/client/testing.d.ts +35 -0
  153. package/dist/dts/client/testing.d.ts.map +1 -0
  154. package/dist/dts/domain/imposter.d.ts +123 -0
  155. package/dist/dts/domain/imposter.d.ts.map +1 -0
  156. package/dist/dts/domain/route.d.ts +128 -0
  157. package/dist/dts/domain/route.d.ts.map +1 -0
  158. package/dist/dts/index.d.ts +60 -0
  159. package/dist/dts/index.d.ts.map +1 -0
  160. package/dist/dts/layers/ApiLayer.d.ts +3 -0
  161. package/dist/dts/layers/ApiLayer.d.ts.map +1 -0
  162. package/dist/dts/layers/MainLayer.d.ts +3 -0
  163. package/dist/dts/layers/MainLayer.d.ts.map +1 -0
  164. package/dist/dts/matching/ExpressionEvaluator.d.ts +11 -0
  165. package/dist/dts/matching/ExpressionEvaluator.d.ts.map +1 -0
  166. package/dist/dts/matching/RequestMatcher.d.ts +13 -0
  167. package/dist/dts/matching/RequestMatcher.d.ts.map +1 -0
  168. package/dist/dts/matching/ResponseGenerator.d.ts +9 -0
  169. package/dist/dts/matching/ResponseGenerator.d.ts.map +1 -0
  170. package/dist/dts/matching/TemplateEngine.d.ts +4 -0
  171. package/dist/dts/matching/TemplateEngine.d.ts.map +1 -0
  172. package/dist/dts/repositories/ImposterRepository.d.ts +33 -0
  173. package/dist/dts/repositories/ImposterRepository.d.ts.map +1 -0
  174. package/dist/dts/schemas/ConfigFileSchema.d.ts +142 -0
  175. package/dist/dts/schemas/ConfigFileSchema.d.ts.map +1 -0
  176. package/dist/dts/schemas/ImposterSchema.d.ts +368 -0
  177. package/dist/dts/schemas/ImposterSchema.d.ts.map +1 -0
  178. package/dist/dts/schemas/RequestLogSchema.d.ts +36 -0
  179. package/dist/dts/schemas/RequestLogSchema.d.ts.map +1 -0
  180. package/dist/dts/schemas/StubSchema.d.ts +112 -0
  181. package/dist/dts/schemas/StubSchema.d.ts.map +1 -0
  182. package/dist/dts/schemas/common.d.ts +56 -0
  183. package/dist/dts/schemas/common.d.ts.map +1 -0
  184. package/dist/dts/server/AdminServer.d.ts +11 -0
  185. package/dist/dts/server/AdminServer.d.ts.map +1 -0
  186. package/dist/dts/server/BunServer.d.ts +17 -0
  187. package/dist/dts/server/BunServer.d.ts.map +1 -0
  188. package/dist/dts/server/FiberManager.d.ts +12 -0
  189. package/dist/dts/server/FiberManager.d.ts.map +1 -0
  190. package/dist/dts/server/ImposterServer.d.ts +29 -0
  191. package/dist/dts/server/ImposterServer.d.ts.map +1 -0
  192. package/dist/dts/services/AppConfig.d.ts +14 -0
  193. package/dist/dts/services/AppConfig.d.ts.map +1 -0
  194. package/dist/dts/services/MetricsService.d.ts +26 -0
  195. package/dist/dts/services/MetricsService.d.ts.map +1 -0
  196. package/dist/dts/services/PortAllocator.d.ts +29 -0
  197. package/dist/dts/services/PortAllocator.d.ts.map +1 -0
  198. package/dist/dts/services/ProxyService.d.ts +24 -0
  199. package/dist/dts/services/ProxyService.d.ts.map +1 -0
  200. package/dist/dts/services/RequestLogger.d.ts +23 -0
  201. package/dist/dts/services/RequestLogger.d.ts.map +1 -0
  202. package/dist/dts/services/Uuid.d.ts +9 -0
  203. package/dist/dts/services/Uuid.d.ts.map +1 -0
  204. package/dist/dts/services/UuidLive.d.ts +4 -0
  205. package/dist/dts/services/UuidLive.d.ts.map +1 -0
  206. package/dist/dts/ui/UiRouter.d.ts +15 -0
  207. package/dist/dts/ui/UiRouter.d.ts.map +1 -0
  208. package/dist/dts/ui/admin/AdminLayout.d.ts +7 -0
  209. package/dist/dts/ui/admin/AdminLayout.d.ts.map +1 -0
  210. package/dist/dts/ui/admin/AdminUiRouter.d.ts +6 -0
  211. package/dist/dts/ui/admin/AdminUiRouter.d.ts.map +1 -0
  212. package/dist/dts/ui/admin/pages/AdminDashboard.d.ts +7 -0
  213. package/dist/dts/ui/admin/pages/AdminDashboard.d.ts.map +1 -0
  214. package/dist/dts/ui/admin/partials.d.ts +14 -0
  215. package/dist/dts/ui/admin/partials.d.ts.map +1 -0
  216. package/dist/dts/ui/html.d.ts +12 -0
  217. package/dist/dts/ui/html.d.ts.map +1 -0
  218. package/dist/dts/ui/layout.d.ts +9 -0
  219. package/dist/dts/ui/layout.d.ts.map +1 -0
  220. package/dist/dts/ui/pages/dashboard.d.ts +10 -0
  221. package/dist/dts/ui/pages/dashboard.d.ts.map +1 -0
  222. package/dist/dts/ui/pages/request-detail.d.ts +11 -0
  223. package/dist/dts/ui/pages/request-detail.d.ts.map +1 -0
  224. package/dist/dts/ui/pages/requests.d.ts +15 -0
  225. package/dist/dts/ui/pages/requests.d.ts.map +1 -0
  226. package/dist/dts/ui/pages/stubs.d.ts +8 -0
  227. package/dist/dts/ui/pages/stubs.d.ts.map +1 -0
  228. package/dist/dts/ui/partials.d.ts +13 -0
  229. package/dist/dts/ui/partials.d.ts.map +1 -0
  230. package/dist/esm/Program.js +2 -0
  231. package/dist/esm/Program.js.map +1 -0
  232. package/dist/esm/api/AdminApi.js +5 -0
  233. package/dist/esm/api/AdminApi.js.map +1 -0
  234. package/dist/esm/api/ApiErrors.js +20 -0
  235. package/dist/esm/api/ApiErrors.js.map +1 -0
  236. package/dist/esm/api/ApiSchemas.js +29 -0
  237. package/dist/esm/api/ApiSchemas.js.map +1 -0
  238. package/dist/esm/api/Conversions.js +32 -0
  239. package/dist/esm/api/Conversions.js.map +1 -0
  240. package/dist/esm/api/ImpostersGroup.js +30 -0
  241. package/dist/esm/api/ImpostersGroup.js.map +1 -0
  242. package/dist/esm/api/ImpostersHandlers.js +354 -0
  243. package/dist/esm/api/ImpostersHandlers.js.map +1 -0
  244. package/dist/esm/api/SystemGroup.js +6 -0
  245. package/dist/esm/api/SystemGroup.js.map +1 -0
  246. package/dist/esm/api/SystemHandlers.js +67 -0
  247. package/dist/esm/api/SystemHandlers.js.map +1 -0
  248. package/dist/esm/cli/Commands.js +98 -0
  249. package/dist/esm/cli/Commands.js.map +1 -0
  250. package/dist/esm/cli/ConfigLoader.js +25 -0
  251. package/dist/esm/cli/ConfigLoader.js.map +1 -0
  252. package/dist/esm/client/HandlerHttpClient.js +42 -0
  253. package/dist/esm/client/HandlerHttpClient.js.map +1 -0
  254. package/dist/esm/client/ImpostersClient.js +10 -0
  255. package/dist/esm/client/ImpostersClient.js.map +1 -0
  256. package/dist/esm/client/index.js +4 -0
  257. package/dist/esm/client/index.js.map +1 -0
  258. package/dist/esm/client/testing.js +86 -0
  259. package/dist/esm/client/testing.js.map +1 -0
  260. package/dist/esm/domain/imposter.js +103 -0
  261. package/dist/esm/domain/imposter.js.map +1 -0
  262. package/dist/esm/domain/route.js +164 -0
  263. package/dist/esm/domain/route.js.map +1 -0
  264. package/dist/esm/index.js +60 -0
  265. package/dist/esm/index.js.map +1 -0
  266. package/dist/esm/layers/ApiLayer.js +11 -0
  267. package/dist/esm/layers/ApiLayer.js.map +1 -0
  268. package/dist/esm/layers/MainLayer.js +20 -0
  269. package/dist/esm/layers/MainLayer.js.map +1 -0
  270. package/dist/esm/matching/ExpressionEvaluator.js +94 -0
  271. package/dist/esm/matching/ExpressionEvaluator.js.map +1 -0
  272. package/dist/esm/matching/RequestMatcher.js +135 -0
  273. package/dist/esm/matching/RequestMatcher.js.map +1 -0
  274. package/dist/esm/matching/ResponseGenerator.js +71 -0
  275. package/dist/esm/matching/ResponseGenerator.js.map +1 -0
  276. package/dist/esm/matching/TemplateEngine.js +47 -0
  277. package/dist/esm/matching/TemplateEngine.js.map +1 -0
  278. package/dist/esm/package.json +4 -0
  279. package/dist/esm/repositories/ImposterRepository.js +110 -0
  280. package/dist/esm/repositories/ImposterRepository.js.map +1 -0
  281. package/dist/esm/schemas/ConfigFileSchema.js +37 -0
  282. package/dist/esm/schemas/ConfigFileSchema.js.map +1 -0
  283. package/dist/esm/schemas/ImposterSchema.js +195 -0
  284. package/dist/esm/schemas/ImposterSchema.js.map +1 -0
  285. package/dist/esm/schemas/RequestLogSchema.js +44 -0
  286. package/dist/esm/schemas/RequestLogSchema.js.map +1 -0
  287. package/dist/esm/schemas/StubSchema.js +77 -0
  288. package/dist/esm/schemas/StubSchema.js.map +1 -0
  289. package/dist/esm/schemas/common.js +59 -0
  290. package/dist/esm/schemas/common.js.map +1 -0
  291. package/dist/esm/server/AdminServer.js +27 -0
  292. package/dist/esm/server/AdminServer.js.map +1 -0
  293. package/dist/esm/server/BunServer.js +6 -0
  294. package/dist/esm/server/BunServer.js.map +1 -0
  295. package/dist/esm/server/FiberManager.js +14 -0
  296. package/dist/esm/server/FiberManager.js.map +1 -0
  297. package/dist/esm/server/ImposterServer.js +225 -0
  298. package/dist/esm/server/ImposterServer.js.map +1 -0
  299. package/dist/esm/services/AppConfig.js +11 -0
  300. package/dist/esm/services/AppConfig.js.map +1 -0
  301. package/dist/esm/services/MetricsService.js +105 -0
  302. package/dist/esm/services/MetricsService.js.map +1 -0
  303. package/dist/esm/services/PortAllocator.js +41 -0
  304. package/dist/esm/services/PortAllocator.js.map +1 -0
  305. package/dist/esm/services/ProxyService.js +101 -0
  306. package/dist/esm/services/ProxyService.js.map +1 -0
  307. package/dist/esm/services/RequestLogger.js +53 -0
  308. package/dist/esm/services/RequestLogger.js.map +1 -0
  309. package/dist/esm/services/Uuid.js +3 -0
  310. package/dist/esm/services/Uuid.js.map +1 -0
  311. package/dist/esm/services/UuidLive.js +9 -0
  312. package/dist/esm/services/UuidLive.js.map +1 -0
  313. package/dist/esm/ui/UiRouter.js +235 -0
  314. package/dist/esm/ui/UiRouter.js.map +1 -0
  315. package/dist/esm/ui/admin/AdminLayout.js +29 -0
  316. package/dist/esm/ui/admin/AdminLayout.js.map +1 -0
  317. package/dist/esm/ui/admin/AdminUiRouter.js +148 -0
  318. package/dist/esm/ui/admin/AdminUiRouter.js.map +1 -0
  319. package/dist/esm/ui/admin/pages/AdminDashboard.js +48 -0
  320. package/dist/esm/ui/admin/pages/AdminDashboard.js.map +1 -0
  321. package/dist/esm/ui/admin/partials.js +54 -0
  322. package/dist/esm/ui/admin/partials.js.map +1 -0
  323. package/dist/esm/ui/html.js +32 -0
  324. package/dist/esm/ui/html.js.map +1 -0
  325. package/dist/esm/ui/layout.js +32 -0
  326. package/dist/esm/ui/layout.js.map +1 -0
  327. package/dist/esm/ui/pages/dashboard.js +44 -0
  328. package/dist/esm/ui/pages/dashboard.js.map +1 -0
  329. package/dist/esm/ui/pages/request-detail.js +112 -0
  330. package/dist/esm/ui/pages/request-detail.js.map +1 -0
  331. package/dist/esm/ui/pages/requests.js +112 -0
  332. package/dist/esm/ui/pages/requests.js.map +1 -0
  333. package/dist/esm/ui/pages/stubs.js +39 -0
  334. package/dist/esm/ui/pages/stubs.js.map +1 -0
  335. package/dist/esm/ui/partials.js +91 -0
  336. package/dist/esm/ui/partials.js.map +1 -0
  337. package/domain/imposter/package.json +6 -0
  338. package/domain/route/package.json +6 -0
  339. package/layers/ApiLayer/package.json +6 -0
  340. package/layers/MainLayer/package.json +6 -0
  341. package/matching/ExpressionEvaluator/package.json +6 -0
  342. package/matching/RequestMatcher/package.json +6 -0
  343. package/matching/ResponseGenerator/package.json +6 -0
  344. package/matching/TemplateEngine/package.json +6 -0
  345. package/package.json +435 -0
  346. package/repositories/ImposterRepository/package.json +6 -0
  347. package/schemas/ConfigFileSchema/package.json +6 -0
  348. package/schemas/ImposterSchema/package.json +6 -0
  349. package/schemas/RequestLogSchema/package.json +6 -0
  350. package/schemas/StubSchema/package.json +6 -0
  351. package/schemas/common/package.json +6 -0
  352. package/server/AdminServer/package.json +6 -0
  353. package/server/BunServer/package.json +6 -0
  354. package/server/FiberManager/package.json +6 -0
  355. package/server/ImposterServer/package.json +6 -0
  356. package/services/AppConfig/package.json +6 -0
  357. package/services/MetricsService/package.json +6 -0
  358. package/services/PortAllocator/package.json +6 -0
  359. package/services/ProxyService/package.json +6 -0
  360. package/services/RequestLogger/package.json +6 -0
  361. package/services/Uuid/package.json +6 -0
  362. package/services/UuidLive/package.json +6 -0
  363. package/src/Program.ts +1 -0
  364. package/src/api/AdminApi.ts +7 -0
  365. package/src/api/ApiErrors.ts +20 -0
  366. package/src/api/ApiSchemas.ts +36 -0
  367. package/src/api/Conversions.ts +34 -0
  368. package/src/api/ImpostersGroup.ts +103 -0
  369. package/src/api/ImpostersHandlers.ts +387 -0
  370. package/src/api/SystemGroup.ts +12 -0
  371. package/src/api/SystemHandlers.ts +76 -0
  372. package/src/cli/Commands.ts +119 -0
  373. package/src/cli/ConfigLoader.ts +41 -0
  374. package/src/client/HandlerHttpClient.ts +50 -0
  375. package/src/client/ImpostersClient.ts +21 -0
  376. package/src/client/index.ts +9 -0
  377. package/src/client/testing.ts +105 -0
  378. package/src/domain/imposter.ts +186 -0
  379. package/src/domain/route.ts +255 -0
  380. package/src/index.ts +153 -0
  381. package/src/layers/ApiLayer.ts +21 -0
  382. package/src/layers/MainLayer.ts +43 -0
  383. package/src/matching/ExpressionEvaluator.ts +102 -0
  384. package/src/matching/RequestMatcher.ts +162 -0
  385. package/src/matching/ResponseGenerator.ts +86 -0
  386. package/src/matching/TemplateEngine.ts +54 -0
  387. package/src/repositories/ImposterRepository.ts +145 -0
  388. package/src/schemas/ConfigFileSchema.ts +32 -0
  389. package/src/schemas/ImposterSchema.ts +232 -0
  390. package/src/schemas/RequestLogSchema.ts +38 -0
  391. package/src/schemas/StubSchema.ts +90 -0
  392. package/src/schemas/common.ts +95 -0
  393. package/src/server/AdminServer.ts +22 -0
  394. package/src/server/BunServer.ts +19 -0
  395. package/src/server/FiberManager.ts +25 -0
  396. package/src/server/ImposterServer.ts +244 -0
  397. package/src/services/AppConfig.ts +22 -0
  398. package/src/services/MetricsService.ts +157 -0
  399. package/src/services/PortAllocator.ts +68 -0
  400. package/src/services/ProxyService.ts +139 -0
  401. package/src/services/RequestLogger.ts +87 -0
  402. package/src/services/Uuid.ts +9 -0
  403. package/src/services/UuidLive.ts +9 -0
  404. package/src/types/bun.d.ts +6 -0
  405. package/src/ui/UiRouter.ts +278 -0
  406. package/src/ui/admin/AdminLayout.ts +36 -0
  407. package/src/ui/admin/AdminUiRouter.ts +170 -0
  408. package/src/ui/admin/pages/AdminDashboard.ts +54 -0
  409. package/src/ui/admin/partials.ts +83 -0
  410. package/src/ui/html.ts +37 -0
  411. package/src/ui/layout.ts +44 -0
  412. package/src/ui/pages/dashboard.ts +64 -0
  413. package/src/ui/pages/request-detail.ts +142 -0
  414. package/src/ui/pages/requests.ts +141 -0
  415. package/src/ui/pages/stubs.ts +52 -0
  416. package/src/ui/partials.ts +133 -0
  417. package/ui/UiRouter/package.json +6 -0
  418. package/ui/admin/AdminLayout/package.json +6 -0
  419. package/ui/admin/AdminUiRouter/package.json +6 -0
  420. package/ui/admin/pages/AdminDashboard/package.json +6 -0
  421. package/ui/admin/partials/package.json +6 -0
  422. package/ui/html/package.json +6 -0
  423. package/ui/layout/package.json +6 -0
  424. package/ui/pages/dashboard/package.json +6 -0
  425. package/ui/pages/requests/package.json +6 -0
  426. package/ui/pages/stubs/package.json +6 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html.js","names":["escapeHtml","s","replaceAll","exports","SafeHtml","value","constructor","raw","html","strings","values","result","i","length","v","String"],"sources":["../../../src/ui/html.ts"],"sourcesContent":[null],"mappings":";;;;;;AAAA;AACO,MAAMA,UAAU,GAAIC,CAAS,IAClCA,CAAC,CACEC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CACxBA,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CACvBA,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CACvBA,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,CAC1BA,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC;AAE7B;AAAAC,OAAA,CAAAH,UAAA,GAAAA,UAAA;AACM,MAAOI,QAAQ;EACEC,KAAA;EAArBC,YAAqBD,KAAa;IAAb,KAAAA,KAAK,GAALA,KAAK;EAAW;;AAGvC;AAAAF,OAAA,CAAAC,QAAA,GAAAA,QAAA;AACO,MAAMG,GAAG,GAAIN,CAAS,IAAe,IAAIG,QAAQ,CAACH,CAAC,CAAC;AAE3D;AAAAE,OAAA,CAAAI,GAAA,GAAAA,GAAA;AACO,MAAMC,IAAI,GAAGA,CAACC,OAA6B,EAAE,GAAGC,MAAsB,KAAc;EACzF,IAAIC,MAAM,GAAG,EAAE;EACf,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGH,OAAO,CAACI,MAAM,EAAED,CAAC,EAAE,EAAE;IACvCD,MAAM,IAAIF,OAAO,CAACG,CAAC,CAAC;IACpB,IAAIA,CAAC,GAAGF,MAAM,CAACG,MAAM,EAAE;MACrB,MAAMC,CAAC,GAAGJ,MAAM,CAACE,CAAC,CAAC;MACnB,IAAIE,CAAC,YAAYV,QAAQ,EAAE;QACzBO,MAAM,IAAIG,CAAC,CAACT,KAAK;MACnB,CAAC,MAAM,IAAIS,CAAC,IAAI,IAAI,EAAE;QACpBH,MAAM,IAAI,EAAE;MACd,CAAC,MAAM,IAAI,OAAOG,CAAC,KAAK,QAAQ,EAAE;QAChCH,MAAM,IAAIX,UAAU,CAACc,CAAC,CAAC;MACzB,CAAC,MAAM;QACLH,MAAM,IAAIX,UAAU,CAACe,MAAM,CAACD,CAAC,CAAC,CAAC;MACjC;IACF;EACF;EACA,OAAO,IAAIV,QAAQ,CAACO,MAAM,CAAC;AAC7B,CAAC;AAAAR,OAAA,CAAAK,IAAA,GAAAA,IAAA","ignoreList":[]}
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.layout = void 0;
7
+ var _html = require("./html");
8
+ const navTab = (label, href, active) => active ? (0, _html.html)`<a href="${href}" class="px-4 py-2 bg-white text-indigo-700 rounded-t font-semibold border-b-2 border-indigo-600">${label}</a>` : (0, _html.html)`<a href="${href}" class="px-4 py-2 text-gray-300 hover:text-white hover:bg-indigo-500 rounded-t">${label}</a>`;
9
+ const layout = (opts, content) => (0, _html.html)`<!DOCTYPE html>
10
+ <html lang="en">
11
+ <head>
12
+ <meta charset="utf-8">
13
+ <meta name="viewport" content="width=device-width, initial-scale=1">
14
+ <title>${opts.title}</title>
15
+ <script src="https://cdn.tailwindcss.com"></script>
16
+ <script src="https://unpkg.com/htmx.org@2.0.4"></script>
17
+ </head>
18
+ <body class="bg-gray-50 min-h-screen">
19
+ <nav class="bg-indigo-700 text-white shadow-md">
20
+ <div class="max-w-5xl mx-auto px-4 py-3 flex items-center justify-between">
21
+ <div>
22
+ <span class="text-indigo-200 text-sm font-medium mr-2">Imposters</span>
23
+ <span class="text-lg font-bold">${opts.imposterName}</span>
24
+ <span class="ml-2 text-indigo-200 text-sm">port ${String(opts.port)}</span>
25
+ </div>
26
+ <div class="flex gap-1">
27
+ ${navTab("Dashboard", "/_admin", opts.activeTab === "dashboard")}
28
+ ${navTab("Stubs", "/_admin/stubs", opts.activeTab === "stubs")}
29
+ ${navTab("Requests", "/_admin/requests", opts.activeTab === "requests")}
30
+ </div>
31
+ </div>
32
+ </nav>
33
+ <main class="max-w-5xl mx-auto px-4 py-6">
34
+ ${(0, _html.raw)(content.value)}
35
+ </main>
36
+ </body>
37
+ </html>`;
38
+ exports.layout = layout;
39
+ //# sourceMappingURL=layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.js","names":["_html","require","navTab","label","href","active","html","layout","opts","content","title","imposterName","String","port","activeTab","raw","value","exports"],"sources":["../../../src/ui/layout.ts"],"sourcesContent":[null],"mappings":";;;;;;AAAA,IAAAA,KAAA,GAAAC,OAAA;AASA,MAAMC,MAAM,GAAGA,CAACC,KAAa,EAAEC,IAAY,EAAEC,MAAe,KAC1DA,MAAM,GACF,IAAAC,UAAI,aAAYF,IAAI,qGAAqGD,KAAK,MAAM,GACpI,IAAAG,UAAI,aAAYF,IAAI,oFAAoFD,KAAK,MAAM;AAElH,MAAMI,MAAM,GAAGA,CAACC,IAAgB,EAAEC,OAAiB,KACxD,IAAAH,UAAI;;;;;WAKKE,IAAI,CAACE,KAAK;;;;;;;;;0CASqBF,IAAI,CAACG,YAAY;0DACDC,MAAM,CAACJ,IAAI,CAACK,IAAI,CAAC;;;UAGjEX,MAAM,CAAC,WAAW,EAAE,SAAS,EAAEM,IAAI,CAACM,SAAS,KAAK,WAAW,CAAC;UAC9DZ,MAAM,CAAC,OAAO,EAAE,eAAe,EAAEM,IAAI,CAACM,SAAS,KAAK,OAAO,CAAC;UAC5DZ,MAAM,CAAC,UAAU,EAAE,kBAAkB,EAAEM,IAAI,CAACM,SAAS,KAAK,UAAU,CAAC;;;;;MAKzE,IAAAC,SAAG,EAACN,OAAO,CAACO,KAAK,CAAC;;;QAGhB;AAAAC,OAAA,CAAAV,MAAA,GAAAA,MAAA","ignoreList":[]}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.dashboardPage = void 0;
7
+ var _html = require("../html");
8
+ var _layout = require("../layout");
9
+ var _partials = require("../partials");
10
+ const statCard = (label, value, color) => (0, _html.html)`<div class="bg-white rounded-lg shadow p-4">
11
+ <div class="text-sm text-gray-500">${label}</div>
12
+ <div class="text-2xl font-bold ${color}">${value}</div>
13
+ </div>`;
14
+ const dashboardPage = data => {
15
+ const statusColor = data.config.status === "running" ? "text-green-600" : "text-gray-500";
16
+ const content = (0, _html.html)`
17
+ <div class="grid grid-cols-2 md:grid-cols-4 gap-4 mb-6">
18
+ ${statCard("Status", data.config.status, statusColor)}
19
+ ${statCard("Port", String(data.config.port), "text-gray-800")}
20
+ ${statCard("Stubs", String(data.stubCount), "text-indigo-600")}
21
+ ${statCard("Requests", String(data.requestCount), "text-indigo-600")}
22
+ </div>
23
+
24
+ <div class="bg-white rounded-lg shadow">
25
+ <h2 class="text-lg font-semibold px-4 pt-4 pb-2">
26
+ <a href="/_admin/requests" class="hover:text-indigo-600">Recent Requests &rarr;</a>
27
+ </h2>
28
+ ${data.recentRequests.length === 0 ? (0, _html.html)`<p class="px-4 pb-4 text-gray-400">No requests yet.</p>` : (0, _html.html)`<table class="w-full text-left">
29
+ <thead>
30
+ <tr class="text-xs text-gray-500 uppercase border-b">
31
+ <th class="py-2 px-3">Time</th>
32
+ <th class="py-2 px-3">Method</th>
33
+ <th class="py-2 px-3">Path</th>
34
+ <th class="py-2 px-3">Status</th>
35
+ <th class="py-2 px-3">Stub</th>
36
+ <th class="py-2 px-3">Duration</th>
37
+ <th class="py-2 px-3"></th>
38
+ </tr>
39
+ </thead>
40
+ <tbody>${(0, _html.raw)((0, _partials.requestTablePartial)(data.recentRequests).value)}</tbody>
41
+ </table>`}
42
+ </div>`;
43
+ return (0, _layout.layout)({
44
+ title: `${data.config.name} — Dashboard`,
45
+ imposterName: data.config.name,
46
+ port: data.config.port,
47
+ activeTab: "dashboard"
48
+ }, content);
49
+ };
50
+ exports.dashboardPage = dashboardPage;
51
+ //# sourceMappingURL=dashboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.js","names":["_html","require","_layout","_partials","statCard","label","value","color","html","dashboardPage","data","statusColor","config","status","content","String","port","stubCount","requestCount","recentRequests","length","raw","requestTablePartial","layout","title","name","imposterName","activeTab","exports"],"sources":["../../../../src/ui/pages/dashboard.ts"],"sourcesContent":[null],"mappings":";;;;;;AAEA,IAAAA,KAAA,GAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AACA,IAAAE,SAAA,GAAAF,OAAA;AASA,MAAMG,QAAQ,GAAGA,CAACC,KAAa,EAAEC,KAAa,EAAEC,KAAa,KAC3D,IAAAC,UAAI;yCACmCH,KAAK;qCACTE,KAAK,KAAKD,KAAK;SAC3C;AAEF,MAAMG,aAAa,GAAIC,IAAmB,IAAI;EACnD,MAAMC,WAAW,GAAGD,IAAI,CAACE,MAAM,CAACC,MAAM,KAAK,SAAS,GAAG,gBAAgB,GAAG,eAAe;EAEzF,MAAMC,OAAO,GAAG,IAAAN,UAAI;;QAEdJ,QAAQ,CAAC,QAAQ,EAAEM,IAAI,CAACE,MAAM,CAACC,MAAM,EAAEF,WAAW,CAAC;QACnDP,QAAQ,CAAC,MAAM,EAAEW,MAAM,CAACL,IAAI,CAACE,MAAM,CAACI,IAAI,CAAC,EAAE,eAAe,CAAC;QAC3DZ,QAAQ,CAAC,OAAO,EAAEW,MAAM,CAACL,IAAI,CAACO,SAAS,CAAC,EAAE,iBAAiB,CAAC;QAC5Db,QAAQ,CAAC,UAAU,EAAEW,MAAM,CAACL,IAAI,CAACQ,YAAY,CAAC,EAAE,iBAAiB,CAAC;;;;;;;QAQtER,IAAI,CAACS,cAAc,CAACC,MAAM,KAAK,CAAC,GAC5B,IAAAZ,UAAI,0DAAyD,GAC7D,IAAAA,UAAI;;;;;;;;;;;;qBAYS,IAAAa,SAAG,EAAC,IAAAC,6BAAmB,EAACZ,IAAI,CAACS,cAAc,CAAC,CAACb,KAAK,CAAC;mBAEtE;WACS;EAET,OAAO,IAAAiB,cAAM,EACX;IACEC,KAAK,EAAE,GAAGd,IAAI,CAACE,MAAM,CAACa,IAAI,cAAc;IACxCC,YAAY,EAAEhB,IAAI,CAACE,MAAM,CAACa,IAAI;IAC9BT,IAAI,EAAEN,IAAI,CAACE,MAAM,CAACI,IAAI;IACtBW,SAAS,EAAE;GACZ,EACDb,OAAO,CACR;AACH,CAAC;AAAAc,OAAA,CAAAnB,aAAA,GAAAA,aAAA","ignoreList":[]}
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.requestDetailPage = void 0;
7
+ var _html = require("../html");
8
+ var _layout = require("../layout");
9
+ var _partials = require("../partials");
10
+ const formatTimestamp = ts => {
11
+ try {
12
+ const d = typeof ts.epochMillis === "bigint" ? new Date(Number(ts.epochMillis)) : new Date(String(ts));
13
+ return d.toISOString();
14
+ } catch {
15
+ return String(ts);
16
+ }
17
+ };
18
+ const formatBody = body => {
19
+ if (body === undefined || body === null) return "(empty)";
20
+ if (typeof body === "string") {
21
+ try {
22
+ return JSON.stringify(JSON.parse(body), null, 2);
23
+ } catch {
24
+ return body;
25
+ }
26
+ }
27
+ return JSON.stringify(body, null, 2);
28
+ };
29
+ const headersTable = headers => {
30
+ const entries = Object.entries(headers);
31
+ if (entries.length === 0) return (0, _html.html)`<p class="text-gray-400 text-sm italic">No headers</p>`;
32
+ const rows = entries.map(([k, v]) => (0, _html.html)`<tr class="border-t"><td class="py-1 px-2 text-xs font-mono font-semibold text-gray-600">${k}</td><td class="py-1 px-2 text-xs font-mono">${v}</td></tr>`);
33
+ return (0, _html.html)`<table class="w-full"><tbody>${rows.reduce((a, r) => (0, _html.html)`${a}${r}`, (0, _html.html)``)}</tbody></table>`;
34
+ };
35
+ const queryTable = query => {
36
+ const entries = Object.entries(query);
37
+ if (entries.length === 0) return (0, _html.html)`<p class="text-gray-400 text-sm italic">No query parameters</p>`;
38
+ const rows = entries.map(([k, v]) => (0, _html.html)`<tr class="border-t"><td class="py-1 px-2 text-xs font-mono font-semibold text-gray-600">${k}</td><td class="py-1 px-2 text-xs font-mono">${v}</td></tr>`);
39
+ return (0, _html.html)`<table class="w-full"><tbody>${rows.reduce((a, r) => (0, _html.html)`${a}${r}`, (0, _html.html)``)}</tbody></table>`;
40
+ };
41
+ const requestDetailPage = data => {
42
+ const {
43
+ entry,
44
+ matchedStub
45
+ } = data;
46
+ const timestamp = formatTimestamp(entry.timestamp);
47
+ const reqBody = formatBody(entry.request.body);
48
+ const respBody = formatBody(entry.response.body);
49
+ const respHeaders = entry.response.headers ?? {};
50
+ const content = (0, _html.html)`
51
+ <div class="mb-4">
52
+ <a href="/_admin/requests" class="text-indigo-600 hover:underline text-sm">&larr; Back to Requests</a>
53
+ <span class="text-gray-400 mx-2">/</span>
54
+ <span class="text-sm text-gray-500">Request ${entry.id}</span>
55
+ </div>
56
+
57
+ <div class="bg-white rounded-lg shadow p-4 mb-6">
58
+ <div class="flex items-center gap-3 mb-3">
59
+ ${(0, _partials.methodBadge)(entry.request.method)}
60
+ <span class="font-mono text-lg">${entry.request.path}</span>
61
+ ${(0, _partials.statusBadge)(entry.response.status)}
62
+ <span class="text-sm text-gray-500">${String(entry.duration)}ms</span>
63
+ </div>
64
+ <div class="text-sm text-gray-500">
65
+ <span>Timestamp: ${timestamp}</span>
66
+ ${entry.response.matchedStubId ? (0, _html.html)`<span class="ml-4">Matched Stub: <span class="font-mono text-indigo-600">${entry.response.matchedStubId}</span></span>` : (0, _html.html)`<span class="ml-4 text-orange-500">No matching stub</span>`}
67
+ </div>
68
+ </div>
69
+
70
+ <div class="grid grid-cols-1 md:grid-cols-2 gap-6 mb-6">
71
+ <div>
72
+ <h3 class="text-lg font-semibold mb-3">Request</h3>
73
+ <div class="bg-white rounded-lg shadow p-4 space-y-3">
74
+ <div>
75
+ <h4 class="text-sm font-medium text-gray-700 mb-1">Headers</h4>
76
+ ${headersTable(entry.request.headers)}
77
+ </div>
78
+ <div>
79
+ <h4 class="text-sm font-medium text-gray-700 mb-1">Query Parameters</h4>
80
+ ${queryTable(entry.request.query)}
81
+ </div>
82
+ <div>
83
+ <h4 class="text-sm font-medium text-gray-700 mb-1">Body</h4>
84
+ <pre class="bg-gray-50 border rounded p-2 text-xs font-mono overflow-x-auto whitespace-pre-wrap max-h-64 overflow-y-auto">${reqBody}</pre>
85
+ </div>
86
+ </div>
87
+ </div>
88
+
89
+ <div>
90
+ <h3 class="text-lg font-semibold mb-3">Response</h3>
91
+ <div class="bg-white rounded-lg shadow p-4 space-y-3">
92
+ <div class="flex items-center gap-2">
93
+ ${(0, _partials.statusBadge)(entry.response.status)}
94
+ </div>
95
+ <div>
96
+ <h4 class="text-sm font-medium text-gray-700 mb-1">Headers</h4>
97
+ ${headersTable(respHeaders)}
98
+ </div>
99
+ <div>
100
+ <h4 class="text-sm font-medium text-gray-700 mb-1">Body</h4>
101
+ <pre class="bg-gray-50 border rounded p-2 text-xs font-mono overflow-x-auto whitespace-pre-wrap max-h-64 overflow-y-auto">${respBody}</pre>
102
+ </div>
103
+ </div>
104
+ </div>
105
+ </div>
106
+
107
+ ${matchedStub !== null ? (0, _html.html)`<div>
108
+ <h3 class="text-lg font-semibold mb-3">Matched Stub</h3>
109
+ ${(0, _html.raw)((0, _partials.stubCardPartial)(matchedStub).value)}
110
+ </div>` : (0, _html.html)``}`;
111
+ return (0, _layout.layout)({
112
+ title: `${data.config.name} — Request ${entry.id}`,
113
+ imposterName: data.config.name,
114
+ port: data.config.port,
115
+ activeTab: "requests"
116
+ }, content);
117
+ };
118
+ exports.requestDetailPage = requestDetailPage;
119
+ //# sourceMappingURL=request-detail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-detail.js","names":["_html","require","_layout","_partials","formatTimestamp","ts","d","epochMillis","Date","Number","String","toISOString","formatBody","body","undefined","JSON","stringify","parse","headersTable","headers","entries","Object","length","html","rows","map","k","v","reduce","a","r","queryTable","query","requestDetailPage","data","entry","matchedStub","timestamp","reqBody","request","respBody","response","respHeaders","content","id","methodBadge","method","path","statusBadge","status","duration","matchedStubId","raw","stubCardPartial","value","layout","title","config","name","imposterName","port","activeTab","exports"],"sources":["../../../../src/ui/pages/request-detail.ts"],"sourcesContent":[null],"mappings":";;;;;;AAGA,IAAAA,KAAA,GAAAC,OAAA;AAEA,IAAAC,OAAA,GAAAD,OAAA;AACA,IAAAE,SAAA,GAAAF,OAAA;AAQA,MAAMG,eAAe,GAAIC,EAAW,IAAY;EAC9C,IAAI;IACF,MAAMC,CAAC,GAAG,OAAQD,EAA8B,CAACE,WAAW,KAAK,QAAQ,GACrE,IAAIC,IAAI,CAACC,MAAM,CAAEJ,EAA8B,CAACE,WAAW,CAAC,CAAC,GAC7D,IAAIC,IAAI,CAACE,MAAM,CAACL,EAAE,CAAC,CAAC;IACxB,OAAOC,CAAC,CAACK,WAAW,EAAE;EACxB,CAAC,CAAC,MAAM;IACN,OAAOD,MAAM,CAACL,EAAE,CAAC;EACnB;AACF,CAAC;AAED,MAAMO,UAAU,GAAIC,IAAa,IAAY;EAC3C,IAAIA,IAAI,KAAKC,SAAS,IAAID,IAAI,KAAK,IAAI,EAAE,OAAO,SAAS;EACzD,IAAI,OAAOA,IAAI,KAAK,QAAQ,EAAE;IAC5B,IAAI;MACF,OAAOE,IAAI,CAACC,SAAS,CAACD,IAAI,CAACE,KAAK,CAACJ,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC,CAAC,MAAM;MACN,OAAOA,IAAI;IACb;EACF;EACA,OAAOE,IAAI,CAACC,SAAS,CAACH,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;AACtC,CAAC;AAED,MAAMK,YAAY,GAAIC,OAA+B,IAAc;EACjE,MAAMC,OAAO,GAAGC,MAAM,CAACD,OAAO,CAACD,OAAO,CAAC;EACvC,IAAIC,OAAO,CAACE,MAAM,KAAK,CAAC,EAAE,OAAO,IAAAC,UAAI,yDAAwD;EAC7F,MAAMC,IAAI,GAAGJ,OAAO,CAACK,GAAG,CAAC,CAAC,CAACC,CAAC,EAAEC,CAAC,CAAC,KAC9B,IAAAJ,UAAI,6FAA4FG,CAAC,gDAAgDC,CAAC,YAAY,CAC/J;EACD,OAAO,IAAAJ,UAAI,iCAAgCC,IAAI,CAACI,MAAM,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAK,IAAAP,UAAI,IAAGM,CAAC,GAAGC,CAAC,EAAE,EAAE,IAAAP,UAAI,GAAE,CAAC,kBAAkB;AAC5G,CAAC;AAED,MAAMQ,UAAU,GAAIC,KAA6B,IAAc;EAC7D,MAAMZ,OAAO,GAAGC,MAAM,CAACD,OAAO,CAACY,KAAK,CAAC;EACrC,IAAIZ,OAAO,CAACE,MAAM,KAAK,CAAC,EAAE,OAAO,IAAAC,UAAI,kEAAiE;EACtG,MAAMC,IAAI,GAAGJ,OAAO,CAACK,GAAG,CAAC,CAAC,CAACC,CAAC,EAAEC,CAAC,CAAC,KAC9B,IAAAJ,UAAI,6FAA4FG,CAAC,gDAAgDC,CAAC,YAAY,CAC/J;EACD,OAAO,IAAAJ,UAAI,iCAAgCC,IAAI,CAACI,MAAM,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAK,IAAAP,UAAI,IAAGM,CAAC,GAAGC,CAAC,EAAE,EAAE,IAAAP,UAAI,GAAE,CAAC,kBAAkB;AAC5G,CAAC;AAEM,MAAMU,iBAAiB,GAAIC,IAAuB,IAAc;EACrE,MAAM;IAAEC,KAAK;IAAEC;EAAW,CAAE,GAAGF,IAAI;EACnC,MAAMG,SAAS,GAAGjC,eAAe,CAAC+B,KAAK,CAACE,SAAS,CAAC;EAClD,MAAMC,OAAO,GAAG1B,UAAU,CAACuB,KAAK,CAACI,OAAO,CAAC1B,IAAI,CAAC;EAC9C,MAAM2B,QAAQ,GAAG5B,UAAU,CAACuB,KAAK,CAACM,QAAQ,CAAC5B,IAAI,CAAC;EAChD,MAAM6B,WAAW,GAAGP,KAAK,CAACM,QAAQ,CAACtB,OAAO,IAAI,EAAE;EAEhD,MAAMwB,OAAO,GAAG,IAAApB,UAAI;;;;oDAI8BY,KAAK,CAACS,EAAE;;;;;UAKlD,IAAAC,qBAAW,EAACV,KAAK,CAACI,OAAO,CAACO,MAAM,CAAC;0CACDX,KAAK,CAACI,OAAO,CAACQ,IAAI;UAClD,IAAAC,qBAAW,EAACb,KAAK,CAACM,QAAQ,CAACQ,MAAM,CAAC;8CACEvC,MAAM,CAACyB,KAAK,CAACe,QAAQ,CAAC;;;2BAGzCb,SAAS;UAEhCF,KAAK,CAACM,QAAQ,CAACU,aAAa,GACxB,IAAA5B,UAAI,6EAA4EY,KAAK,CAACM,QAAQ,CAACU,aAAa,gBAAgB,GAC5H,IAAA5B,UAAI,6DACV;;;;;;;;;;cAUYL,YAAY,CAACiB,KAAK,CAACI,OAAO,CAACpB,OAAiC,CAAC;;;;cAI7DY,UAAU,CAACI,KAAK,CAACI,OAAO,CAACP,KAA+B,CAAC;;;;wIAIiEM,OAAO;;;;;;;;;cASjI,IAAAU,qBAAW,EAACb,KAAK,CAACM,QAAQ,CAACQ,MAAM,CAAC;;;;cAIlC/B,YAAY,CAACwB,WAAqC,CAAC;;;;wIAIuEF,QAAQ;;;;;;MAO5IJ,WAAW,KAAK,IAAI,GAChB,IAAAb,UAAI;;YAEA,IAAA6B,SAAG,EAAC,IAAAC,yBAAe,EAACjB,WAAW,CAAC,CAACkB,KAAK,CAAC;eACpC,GACP,IAAA/B,UAAI,GACV,EAAE;EAEF,OAAO,IAAAgC,cAAM,EACX;IACEC,KAAK,EAAE,GAAGtB,IAAI,CAACuB,MAAM,CAACC,IAAI,cAAcvB,KAAK,CAACS,EAAE,EAAE;IAClDe,YAAY,EAAEzB,IAAI,CAACuB,MAAM,CAACC,IAAI;IAC9BE,IAAI,EAAE1B,IAAI,CAACuB,MAAM,CAACG,IAAI;IACtBC,SAAS,EAAE;GACZ,EACDlB,OAAO,CACR;AACH,CAAC;AAAAmB,OAAA,CAAA7B,iBAAA,GAAAA,iBAAA","ignoreList":[]}
@@ -0,0 +1,120 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.testResultPartial = exports.requestsPage = void 0;
7
+ var _html = require("../html");
8
+ var _layout = require("../layout");
9
+ var _partials = require("../partials");
10
+ const testRequestForm = _port => (0, _html.html)`<details class="bg-white rounded-lg shadow p-4 mb-6">
11
+ <summary class="text-lg font-semibold cursor-pointer">Send Test Request</summary>
12
+ <form hx-post="/_admin/requests/test" hx-target="#test-result" hx-swap="innerHTML" class="mt-3 space-y-3">
13
+ <div class="grid grid-cols-2 gap-3">
14
+ <div>
15
+ <label class="block text-sm font-medium text-gray-700 mb-1">Method</label>
16
+ <select name="method" class="w-full border rounded p-2 text-sm">
17
+ <option value="GET">GET</option>
18
+ <option value="POST">POST</option>
19
+ <option value="PUT">PUT</option>
20
+ <option value="PATCH">PATCH</option>
21
+ <option value="DELETE">DELETE</option>
22
+ <option value="HEAD">HEAD</option>
23
+ <option value="OPTIONS">OPTIONS</option>
24
+ </select>
25
+ </div>
26
+ <div>
27
+ <label class="block text-sm font-medium text-gray-700 mb-1">Path</label>
28
+ <input name="path" type="text" value="/" class="w-full border rounded p-2 text-sm font-mono" placeholder="/api/test" />
29
+ </div>
30
+ </div>
31
+ <div>
32
+ <label class="block text-sm font-medium text-gray-700 mb-1">Content-Type</label>
33
+ <select name="contentType" class="w-full border rounded p-2 text-sm">
34
+ <option value="application/json">application/json</option>
35
+ <option value="text/plain">text/plain</option>
36
+ <option value="application/x-www-form-urlencoded">application/x-www-form-urlencoded</option>
37
+ <option value="application/xml">application/xml</option>
38
+ </select>
39
+ </div>
40
+ <div>
41
+ <label class="block text-sm font-medium text-gray-700 mb-1">Headers (one per line: Key: Value)</label>
42
+ <textarea name="headers" rows="2" class="w-full border rounded p-2 text-sm font-mono" placeholder="Authorization: Bearer token123"></textarea>
43
+ </div>
44
+ <div>
45
+ <label class="block text-sm font-medium text-gray-700 mb-1">Body</label>
46
+ <textarea name="body" rows="3" class="w-full border rounded p-2 text-sm font-mono" placeholder='{"key": "value"}'></textarea>
47
+ </div>
48
+ <button type="submit" class="bg-indigo-600 text-white px-4 py-2 rounded hover:bg-indigo-700 text-sm">Send Request</button>
49
+ </form>
50
+ <div id="test-result" class="mt-3"></div>
51
+ </details>`;
52
+ const filterBar = () => (0, _html.html)`<div class="bg-white rounded-lg shadow p-4 mb-6">
53
+ <form hx-get="/_admin/requests/list" hx-target="#request-table-body" hx-swap="innerHTML" class="flex flex-wrap gap-3 items-end">
54
+ <div>
55
+ <label class="block text-xs text-gray-500 mb-1">Method</label>
56
+ <select name="method" class="border rounded p-1.5 text-sm">
57
+ <option value="">All</option>
58
+ <option value="GET">GET</option>
59
+ <option value="POST">POST</option>
60
+ <option value="PUT">PUT</option>
61
+ <option value="PATCH">PATCH</option>
62
+ <option value="DELETE">DELETE</option>
63
+ </select>
64
+ </div>
65
+ <div>
66
+ <label class="block text-xs text-gray-500 mb-1">Path</label>
67
+ <input name="path" type="text" class="border rounded p-1.5 text-sm font-mono w-40" placeholder="/api/..." />
68
+ </div>
69
+ <div>
70
+ <label class="block text-xs text-gray-500 mb-1">Status</label>
71
+ <input name="status" type="text" class="border rounded p-1.5 text-sm font-mono w-20" placeholder="200" />
72
+ </div>
73
+ <button type="submit" class="bg-indigo-600 text-white px-3 py-1.5 rounded hover:bg-indigo-700 text-sm">Filter</button>
74
+ <button type="button" hx-delete="/_admin/requests" hx-target="#request-table-body" hx-swap="innerHTML" hx-confirm="Clear all request logs?" class="bg-red-50 text-red-600 border border-red-200 px-3 py-1.5 rounded hover:bg-red-100 text-sm ml-auto">Clear Log</button>
75
+ </form>
76
+ </div>`;
77
+ const requestsPage = data => {
78
+ const content = (0, _html.html)`
79
+ ${testRequestForm(data.config.port)}
80
+ ${filterBar()}
81
+ <div class="bg-white rounded-lg shadow overflow-x-auto">
82
+ <table class="w-full text-left">
83
+ <thead>
84
+ <tr class="text-xs text-gray-500 uppercase border-b">
85
+ <th class="py-2 px-3">Time</th>
86
+ <th class="py-2 px-3">Method</th>
87
+ <th class="py-2 px-3">Path</th>
88
+ <th class="py-2 px-3">Status</th>
89
+ <th class="py-2 px-3">Stub</th>
90
+ <th class="py-2 px-3">Duration</th>
91
+ <th class="py-2 px-3"></th>
92
+ </tr>
93
+ </thead>
94
+ <tbody id="request-table-body">
95
+ ${(0, _html.raw)((0, _partials.requestTablePartial)(data.entries.slice().reverse()).value)}
96
+ </tbody>
97
+ </table>
98
+ </div>`;
99
+ return (0, _layout.layout)({
100
+ title: `${data.config.name} — Requests`,
101
+ imposterName: data.config.name,
102
+ port: data.config.port,
103
+ activeTab: "requests"
104
+ }, content);
105
+ };
106
+ exports.requestsPage = requestsPage;
107
+ const testResultPartial = result => {
108
+ const headerRows = Object.entries(result.headers).map(([k, v]) => (0, _html.html)`<tr class="border-t"><td class="py-1 px-2 text-xs font-mono text-gray-600">${k}</td><td class="py-1 px-2 text-xs font-mono">${v}</td></tr>`);
109
+ return (0, _html.html)`<div class="bg-gray-50 rounded p-3 border">
110
+ <div class="flex items-center gap-3 mb-2">
111
+ <span class="font-semibold text-sm">Response</span>
112
+ ${(0, _partials.statusBadge)(result.status)}
113
+ <span class="text-xs text-gray-500">${String(result.duration)}ms</span>
114
+ </div>
115
+ ${headerRows.length > 0 ? (0, _html.html)`<table class="w-full mb-2"><thead><tr class="text-xs text-gray-500"><th class="text-left px-2">Header</th><th class="text-left px-2">Value</th></tr></thead><tbody>${headerRows.reduce((a, r) => (0, _html.html)`${a}${r}`, (0, _html.html)``)}</tbody></table>` : (0, _html.html)``}
116
+ <pre class="bg-white border rounded p-2 text-xs font-mono overflow-x-auto whitespace-pre-wrap max-h-64 overflow-y-auto">${result.body || "(empty body)"}</pre>
117
+ </div>`;
118
+ };
119
+ exports.testResultPartial = testResultPartial;
120
+ //# sourceMappingURL=requests.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requests.js","names":["_html","require","_layout","_partials","testRequestForm","_port","html","filterBar","requestsPage","data","content","config","port","raw","requestTablePartial","entries","slice","reverse","value","layout","title","name","imposterName","activeTab","exports","testResultPartial","result","headerRows","Object","headers","map","k","v","statusBadge","status","String","duration","length","reduce","a","r","body"],"sources":["../../../../src/ui/pages/requests.ts"],"sourcesContent":[null],"mappings":";;;;;;AAEA,IAAAA,KAAA,GAAAC,OAAA;AAEA,IAAAC,OAAA,GAAAD,OAAA;AACA,IAAAE,SAAA,GAAAF,OAAA;AAOA,MAAMG,eAAe,GAAIC,KAAa,IACpC,IAAAC,UAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAyCO;AAEb,MAAMC,SAAS,GAAGA,CAAA,KAChB,IAAAD,UAAI;;;;;;;;;;;;;;;;;;;;;;;;SAwBG;AAEF,MAAME,YAAY,GAAIC,IAAsB,IAAc;EAC/D,MAAMC,OAAO,GAAG,IAAAJ,UAAI;MAChBF,eAAe,CAACK,IAAI,CAACE,MAAM,CAACC,IAAI,CAAC;MACjCL,SAAS,EAAE;;;;;;;;;;;;;;;YAeL,IAAAM,SAAG,EAAC,IAAAC,6BAAmB,EAACL,IAAI,CAACM,OAAO,CAACC,KAAK,EAAE,CAACC,OAAO,EAAE,CAAC,CAACC,KAAK,CAAC;;;WAG/D;EAET,OAAO,IAAAC,cAAM,EACX;IACEC,KAAK,EAAE,GAAGX,IAAI,CAACE,MAAM,CAACU,IAAI,aAAa;IACvCC,YAAY,EAAEb,IAAI,CAACE,MAAM,CAACU,IAAI;IAC9BT,IAAI,EAAEH,IAAI,CAACE,MAAM,CAACC,IAAI;IACtBW,SAAS,EAAE;GACZ,EACDb,OAAO,CACR;AACH,CAAC;AAAAc,OAAA,CAAAhB,YAAA,GAAAA,YAAA;AAEM,MAAMiB,iBAAiB,GAC5BC,MAA2F,IAC/E;EACZ,MAAMC,UAAU,GAAGC,MAAM,CAACb,OAAO,CAACW,MAAM,CAACG,OAAO,CAAC,CAACC,GAAG,CAAC,CAAC,CAACC,CAAC,EAAEC,CAAC,CAAC,KAC3D,IAAA1B,UAAI,+EAA8EyB,CAAC,gDAAgDC,CAAC,YAAY,CACjJ;EACD,OAAO,IAAA1B,UAAI;;;QAGL,IAAA2B,qBAAW,EAACP,MAAM,CAACQ,MAAM,CAAC;4CACUC,MAAM,CAACT,MAAM,CAACU,QAAQ,CAAC;;MAG/DT,UAAU,CAACU,MAAM,GAAG,CAAC,GACjB,IAAA/B,UAAI,uKACJqB,UAAU,CAACW,MAAM,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAK,IAAAlC,UAAI,IAAGiC,CAAC,GAAGC,CAAC,EAAE,EAAE,IAAAlC,UAAI,GAAE,CACpD,kBAAkB,GAChB,IAAAA,UAAI,GACV;8HAEEoB,MAAM,CAACe,IAAI,IAAI,cACjB;SACO;AACT,CAAC;AAAAjB,OAAA,CAAAC,iBAAA,GAAAA,iBAAA","ignoreList":[]}
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.stubsPage = void 0;
7
+ var _html = require("../html");
8
+ var _layout = require("../layout");
9
+ var _partials = require("../partials");
10
+ const addStubForm = () => (0, _html.html)`<div class="bg-white rounded-lg shadow p-4 mb-6">
11
+ <h2 class="text-lg font-semibold mb-3">Add Stub</h2>
12
+ <form hx-post="/_admin/stubs" hx-target="#stub-list" hx-swap="innerHTML" hx-on::after-request="if(event.detail.successful) this.reset()">
13
+ <div class="mb-3">
14
+ <label class="block text-sm font-medium text-gray-700 mb-1">Predicates (JSON array)</label>
15
+ <textarea name="predicates" rows="3" class="w-full border rounded p-2 font-mono text-sm" placeholder="[]">[]</textarea>
16
+ </div>
17
+ <div class="mb-3">
18
+ <label class="block text-sm font-medium text-gray-700 mb-1">Responses (JSON array, at least 1)</label>
19
+ <textarea name="responses" rows="4" class="w-full border rounded p-2 font-mono text-sm" placeholder='[{"status": 200, "body": {}}]'></textarea>
20
+ </div>
21
+ <div class="mb-3">
22
+ <label class="block text-sm font-medium text-gray-700 mb-1">Response Mode</label>
23
+ <select name="responseMode" class="border rounded p-2 text-sm">
24
+ <option value="sequential">sequential</option>
25
+ <option value="random">random</option>
26
+ <option value="repeat">repeat</option>
27
+ </select>
28
+ </div>
29
+ <button type="submit" class="bg-indigo-600 text-white px-4 py-2 rounded hover:bg-indigo-700 text-sm">Add Stub</button>
30
+ </form>
31
+ </div>`;
32
+ const stubsPage = data => {
33
+ const content = (0, _html.html)`
34
+ ${addStubForm()}
35
+ <div id="stub-list">
36
+ ${(0, _html.raw)((0, _partials.stubListPartial)(data.stubs).value)}
37
+ </div>`;
38
+ return (0, _layout.layout)({
39
+ title: `${data.config.name} — Stubs`,
40
+ imposterName: data.config.name,
41
+ port: data.config.port,
42
+ activeTab: "stubs"
43
+ }, content);
44
+ };
45
+ exports.stubsPage = stubsPage;
46
+ //# sourceMappingURL=stubs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stubs.js","names":["_html","require","_layout","_partials","addStubForm","html","stubsPage","data","content","raw","stubListPartial","stubs","value","layout","title","config","name","imposterName","port","activeTab","exports"],"sources":["../../../../src/ui/pages/stubs.ts"],"sourcesContent":[null],"mappings":";;;;;;AAEA,IAAAA,KAAA,GAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AACA,IAAAE,SAAA,GAAAF,OAAA;AAOA,MAAMG,WAAW,GAAGA,CAAA,KAClB,IAAAC,UAAI;;;;;;;;;;;;;;;;;;;;;SAqBG;AAEF,MAAMC,SAAS,GAAIC,IAAmB,IAAI;EAC/C,MAAMC,OAAO,GAAG,IAAAH,UAAI;MAChBD,WAAW,EAAE;;QAEX,IAAAK,SAAG,EAAC,IAAAC,yBAAe,EAACH,IAAI,CAACI,KAAK,CAAC,CAACC,KAAK,CAAC;WACnC;EAET,OAAO,IAAAC,cAAM,EACX;IACEC,KAAK,EAAE,GAAGP,IAAI,CAACQ,MAAM,CAACC,IAAI,UAAU;IACpCC,YAAY,EAAEV,IAAI,CAACQ,MAAM,CAACC,IAAI;IAC9BE,IAAI,EAAEX,IAAI,CAACQ,MAAM,CAACG,IAAI;IACtBC,SAAS,EAAE;GACZ,EACDX,OAAO,CACR;AACH,CAAC;AAAAY,OAAA,CAAAd,SAAA,GAAAA,SAAA","ignoreList":[]}
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.stubListPartial = exports.stubCardPartial = exports.statusBadge = exports.requestTablePartial = exports.methodBadge = exports.errorPartial = exports.emptyStubMessage = void 0;
7
+ var _html = require("./html");
8
+ const predicateSummary = stub => {
9
+ if (stub.predicates.length === 0) return "catch-all (no predicates)";
10
+ return stub.predicates.map(p => `${p.field} ${p.operator} ${JSON.stringify(p.value)}`).join(" AND ");
11
+ };
12
+ const formatJson = value => JSON.stringify(value, null, 2);
13
+ const responseDetail = (r, index, total) => {
14
+ const label = total > 1 ? `Response ${String(index + 1)}/${String(total)}` : "Response";
15
+ const headers = r.headers ? Object.entries(r.headers).map(([k, v]) => `${k}: ${v}`).join(", ") : null;
16
+ return (0, _html.html)`<div class="bg-gray-50 rounded p-3 mb-2 text-sm">
17
+ <div class="flex items-center gap-2 mb-1">
18
+ <span class="font-medium text-gray-700">${label}</span>
19
+ <span class="px-1.5 py-0.5 rounded text-xs font-mono bg-indigo-100 text-indigo-700">${String(r.status)}</span>
20
+ ${r.delay !== undefined ? (0, _html.html)`<span class="text-xs text-gray-400">delay ${String(r.delay)}ms</span>` : (0, _html.html)``}
21
+ </div>
22
+ ${headers !== null ? (0, _html.html)`<div class="text-xs text-gray-500 mb-1">Headers: ${headers}</div>` : (0, _html.html)``}
23
+ ${r.body !== undefined ? (0, _html.html)`<pre class="mt-1 bg-white border rounded p-2 text-xs font-mono overflow-x-auto whitespace-pre-wrap">${formatJson(r.body)}</pre>` : (0, _html.html)`<div class="text-xs text-gray-400 italic">no body</div>`}
24
+ </div>`;
25
+ };
26
+ const stubCardPartial = stub => {
27
+ const responsesHtml = stub.responses.map((r, i) => responseDetail(r, i, stub.responses.length)).reduce((acc, r) => (0, _html.html)`${acc}${r}`, (0, _html.html)``);
28
+ return (0, _html.html)`<div class="bg-white rounded-lg shadow p-4 mb-3" id="stub-${stub.id}">
29
+ <div class="flex items-center justify-between mb-2">
30
+ <div>
31
+ <span class="font-mono text-sm text-indigo-600 font-semibold">${stub.id}</span>
32
+ <span class="ml-2 text-xs bg-gray-100 text-gray-600 px-2 py-0.5 rounded">${stub.responseMode}</span>
33
+ </div>
34
+ <div class="flex gap-2">
35
+ <button
36
+ hx-delete="/_admin/stubs/${stub.id}"
37
+ hx-target="#stub-list"
38
+ hx-swap="innerHTML"
39
+ hx-confirm="Delete this stub?"
40
+ class="text-red-500 hover:text-red-700 text-sm">Delete</button>
41
+ </div>
42
+ </div>
43
+ <div class="text-sm text-gray-600 mb-2">
44
+ <span class="font-medium">Predicates:</span> ${predicateSummary(stub)}
45
+ </div>
46
+ <div>
47
+ ${responsesHtml}
48
+ </div>
49
+ </div>`;
50
+ };
51
+ exports.stubCardPartial = stubCardPartial;
52
+ const stubListPartial = stubs => {
53
+ if (stubs.length === 0) {
54
+ return emptyStubMessage();
55
+ }
56
+ return stubs.reduce((acc, stub) => (0, _html.html)`${acc}${stubCardPartial(stub)}`, (0, _html.html)``);
57
+ };
58
+ exports.stubListPartial = stubListPartial;
59
+ const emptyStubMessage = () => (0, _html.html)`<p class="text-gray-400 text-center py-8">No stubs configured. Add one above.</p>`;
60
+ exports.emptyStubMessage = emptyStubMessage;
61
+ const errorPartial = message => (0, _html.html)`<div class="bg-red-50 border border-red-200 text-red-700 rounded p-3 mb-3">${message}</div>`;
62
+ exports.errorPartial = errorPartial;
63
+ const methodBadge = method => {
64
+ const colors = {
65
+ GET: "bg-green-100 text-green-700",
66
+ POST: "bg-blue-100 text-blue-700",
67
+ PUT: "bg-orange-100 text-orange-700",
68
+ PATCH: "bg-yellow-100 text-yellow-700",
69
+ DELETE: "bg-red-100 text-red-700",
70
+ HEAD: "bg-gray-100 text-gray-700",
71
+ OPTIONS: "bg-purple-100 text-purple-700"
72
+ };
73
+ const color = colors[method.toUpperCase()] ?? "bg-gray-100 text-gray-600";
74
+ return (0, _html.html)`<span class="px-1.5 py-0.5 rounded text-xs font-mono font-semibold ${color}">${method.toUpperCase()}</span>`;
75
+ };
76
+ exports.methodBadge = methodBadge;
77
+ const statusBadge = status => {
78
+ let color;
79
+ if (status < 300) color = "bg-green-100 text-green-700";else if (status < 400) color = "bg-yellow-100 text-yellow-700";else if (status < 500) color = "bg-orange-100 text-orange-700";else color = "bg-red-100 text-red-700";
80
+ return (0, _html.html)`<span class="px-1.5 py-0.5 rounded text-xs font-mono font-semibold ${color}">${String(status)}</span>`;
81
+ };
82
+ exports.statusBadge = statusBadge;
83
+ const requestTablePartial = (entries, opts) => {
84
+ if (entries.length === 0) {
85
+ return (0, _html.html)`<tr><td colspan="7" class="text-center py-4 text-gray-400">No requests recorded.</td></tr>`;
86
+ }
87
+ const rows = entries.map(entry => {
88
+ const d = new Date(Number(entry.timestamp.epochMillis));
89
+ const time = `${String(d.getHours()).padStart(2, "0")}:${String(d.getMinutes()).padStart(2, "0")}:${String(d.getSeconds()).padStart(2, "0")}`;
90
+ const stubId = entry.response.matchedStubId ?? "-";
91
+ const rowContent = (0, _html.html)`
92
+ <td class="py-2 px-3 text-xs text-gray-500">${time}</td>
93
+ <td class="py-2 px-3">${methodBadge(entry.request.method)}</td>
94
+ <td class="py-2 px-3 font-mono text-sm">${entry.request.path}</td>
95
+ <td class="py-2 px-3">${statusBadge(entry.response.status)}</td>
96
+ <td class="py-2 px-3 text-xs text-gray-500 font-mono">${stubId}</td>
97
+ <td class="py-2 px-3 text-sm text-gray-500">${String(entry.duration)}ms</td>
98
+ <td class="py-2 px-3">${opts?.linkToDetail !== false ? (0, _html.html)`<a href="/_admin/requests/${entry.id}" class="text-indigo-600 hover:underline text-sm">detail</a>` : (0, _html.html)``}</td>`;
99
+ return (0, _html.html)`<tr class="border-t hover:bg-gray-50">${rowContent}</tr>`;
100
+ });
101
+ return rows.reduce((acc, r) => (0, _html.html)`${acc}${r}`, (0, _html.html)``);
102
+ };
103
+ exports.requestTablePartial = requestTablePartial;
104
+ //# sourceMappingURL=partials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"partials.js","names":["_html","require","predicateSummary","stub","predicates","length","map","p","field","operator","JSON","stringify","value","join","formatJson","responseDetail","r","index","total","label","String","headers","Object","entries","k","v","html","status","delay","undefined","body","stubCardPartial","responsesHtml","responses","i","reduce","acc","id","responseMode","exports","stubListPartial","stubs","emptyStubMessage","errorPartial","message","methodBadge","method","colors","GET","POST","PUT","PATCH","DELETE","HEAD","OPTIONS","color","toUpperCase","statusBadge","requestTablePartial","opts","rows","entry","d","Date","Number","timestamp","epochMillis","time","getHours","padStart","getMinutes","getSeconds","stubId","response","matchedStubId","rowContent","request","path","duration","linkToDetail"],"sources":["../../../src/ui/partials.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ import "./cli/Commands.js";
2
+ //# sourceMappingURL=Program.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Program.d.ts","sourceRoot":"","sources":["../../src/Program.ts"],"names":[],"mappings":"AAAA,OAAO,mBAAmB,CAAA"}