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.
- package/LICENSE +21 -0
- package/Program/package.json +6 -0
- package/README.md +365 -0
- package/api/AdminApi/package.json +6 -0
- package/api/ApiErrors/package.json +6 -0
- package/api/ApiSchemas/package.json +6 -0
- package/api/Conversions/package.json +6 -0
- package/api/ImpostersGroup/package.json +6 -0
- package/api/ImpostersHandlers/package.json +6 -0
- package/api/SystemGroup/package.json +6 -0
- package/api/SystemHandlers/package.json +6 -0
- package/bin/imposters +47 -0
- package/cli/Commands/package.json +6 -0
- package/cli/ConfigLoader/package.json +6 -0
- package/client/HandlerHttpClient/package.json +6 -0
- package/client/ImpostersClient/package.json +6 -0
- package/client/testing/package.json +6 -0
- package/dist/cjs/Program.js +4 -0
- package/dist/cjs/Program.js.map +1 -0
- package/dist/cjs/api/AdminApi.js +11 -0
- package/dist/cjs/api/AdminApi.js.map +1 -0
- package/dist/cjs/api/ApiErrors.js +30 -0
- package/dist/cjs/api/ApiErrors.js.map +1 -0
- package/dist/cjs/api/ApiSchemas.js +36 -0
- package/dist/cjs/api/ApiSchemas.js.map +1 -0
- package/dist/cjs/api/Conversions.js +41 -0
- package/dist/cjs/api/Conversions.js.map +1 -0
- package/dist/cjs/api/ImpostersGroup.js +37 -0
- package/dist/cjs/api/ImpostersGroup.js.map +1 -0
- package/dist/cjs/api/ImpostersHandlers.js +361 -0
- package/dist/cjs/api/ImpostersHandlers.js.map +1 -0
- package/dist/cjs/api/SystemGroup.js +12 -0
- package/dist/cjs/api/SystemGroup.js.map +1 -0
- package/dist/cjs/api/SystemHandlers.js +74 -0
- package/dist/cjs/api/SystemHandlers.js.map +1 -0
- package/dist/cjs/cli/Commands.js +104 -0
- package/dist/cjs/cli/Commands.js.map +1 -0
- package/dist/cjs/cli/ConfigLoader.js +34 -0
- package/dist/cjs/cli/ConfigLoader.js.map +1 -0
- package/dist/cjs/client/HandlerHttpClient.js +50 -0
- package/dist/cjs/client/HandlerHttpClient.js.map +1 -0
- package/dist/cjs/client/ImpostersClient.js +20 -0
- package/dist/cjs/client/ImpostersClient.js.map +1 -0
- package/dist/cjs/client/index.js +57 -0
- package/dist/cjs/client/index.js.map +1 -0
- package/dist/cjs/client/testing.js +94 -0
- package/dist/cjs/client/testing.js.map +1 -0
- package/dist/cjs/domain/imposter.js +125 -0
- package/dist/cjs/domain/imposter.js.map +1 -0
- package/dist/cjs/domain/route.js +185 -0
- package/dist/cjs/domain/route.js.map +1 -0
- package/dist/cjs/index.js +106 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/layers/ApiLayer.js +18 -0
- package/dist/cjs/layers/ApiLayer.js.map +1 -0
- package/dist/cjs/layers/MainLayer.js +27 -0
- package/dist/cjs/layers/MainLayer.js.map +1 -0
- package/dist/cjs/matching/ExpressionEvaluator.js +103 -0
- package/dist/cjs/matching/ExpressionEvaluator.js.map +1 -0
- package/dist/cjs/matching/RequestMatcher.js +145 -0
- package/dist/cjs/matching/RequestMatcher.js.map +1 -0
- package/dist/cjs/matching/ResponseGenerator.js +80 -0
- package/dist/cjs/matching/ResponseGenerator.js.map +1 -0
- package/dist/cjs/matching/TemplateEngine.js +55 -0
- package/dist/cjs/matching/TemplateEngine.js.map +1 -0
- package/dist/cjs/repositories/ImposterRepository.js +118 -0
- package/dist/cjs/repositories/ImposterRepository.js.map +1 -0
- package/dist/cjs/schemas/ConfigFileSchema.js +44 -0
- package/dist/cjs/schemas/ConfigFileSchema.js.map +1 -0
- package/dist/cjs/schemas/ImposterSchema.js +202 -0
- package/dist/cjs/schemas/ImposterSchema.js.map +1 -0
- package/dist/cjs/schemas/RequestLogSchema.js +51 -0
- package/dist/cjs/schemas/RequestLogSchema.js.map +1 -0
- package/dist/cjs/schemas/StubSchema.js +84 -0
- package/dist/cjs/schemas/StubSchema.js.map +1 -0
- package/dist/cjs/schemas/common.js +67 -0
- package/dist/cjs/schemas/common.js.map +1 -0
- package/dist/cjs/server/AdminServer.js +36 -0
- package/dist/cjs/server/AdminServer.js.map +1 -0
- package/dist/cjs/server/BunServer.js +13 -0
- package/dist/cjs/server/BunServer.js.map +1 -0
- package/dist/cjs/server/FiberManager.js +21 -0
- package/dist/cjs/server/FiberManager.js.map +1 -0
- package/dist/cjs/server/ImposterServer.js +234 -0
- package/dist/cjs/server/ImposterServer.js.map +1 -0
- package/dist/cjs/services/AppConfig.js +18 -0
- package/dist/cjs/services/AppConfig.js.map +1 -0
- package/dist/cjs/services/MetricsService.js +113 -0
- package/dist/cjs/services/MetricsService.js.map +1 -0
- package/dist/cjs/services/PortAllocator.js +50 -0
- package/dist/cjs/services/PortAllocator.js.map +1 -0
- package/dist/cjs/services/ProxyService.js +109 -0
- package/dist/cjs/services/ProxyService.js.map +1 -0
- package/dist/cjs/services/RequestLogger.js +60 -0
- package/dist/cjs/services/RequestLogger.js.map +1 -0
- package/dist/cjs/services/Uuid.js +10 -0
- package/dist/cjs/services/Uuid.js.map +1 -0
- package/dist/cjs/services/UuidLive.js +16 -0
- package/dist/cjs/services/UuidLive.js.map +1 -0
- package/dist/cjs/ui/UiRouter.js +242 -0
- package/dist/cjs/ui/UiRouter.js.map +1 -0
- package/dist/cjs/ui/admin/AdminLayout.js +36 -0
- package/dist/cjs/ui/admin/AdminLayout.js.map +1 -0
- package/dist/cjs/ui/admin/AdminUiRouter.js +155 -0
- package/dist/cjs/ui/admin/AdminUiRouter.js.map +1 -0
- package/dist/cjs/ui/admin/pages/AdminDashboard.js +55 -0
- package/dist/cjs/ui/admin/pages/AdminDashboard.js.map +1 -0
- package/dist/cjs/ui/admin/partials.js +64 -0
- package/dist/cjs/ui/admin/partials.js.map +1 -0
- package/dist/cjs/ui/html.js +42 -0
- package/dist/cjs/ui/html.js.map +1 -0
- package/dist/cjs/ui/layout.js +39 -0
- package/dist/cjs/ui/layout.js.map +1 -0
- package/dist/cjs/ui/pages/dashboard.js +51 -0
- package/dist/cjs/ui/pages/dashboard.js.map +1 -0
- package/dist/cjs/ui/pages/request-detail.js +119 -0
- package/dist/cjs/ui/pages/request-detail.js.map +1 -0
- package/dist/cjs/ui/pages/requests.js +120 -0
- package/dist/cjs/ui/pages/requests.js.map +1 -0
- package/dist/cjs/ui/pages/stubs.js +46 -0
- package/dist/cjs/ui/pages/stubs.js.map +1 -0
- package/dist/cjs/ui/partials.js +104 -0
- package/dist/cjs/ui/partials.js.map +1 -0
- package/dist/dts/Program.d.ts +2 -0
- package/dist/dts/Program.d.ts.map +1 -0
- package/dist/dts/api/AdminApi.d.ts +490 -0
- package/dist/dts/api/AdminApi.d.ts.map +1 -0
- package/dist/dts/api/ApiErrors.d.ts +26 -0
- package/dist/dts/api/ApiErrors.d.ts.map +1 -0
- package/dist/dts/api/ApiSchemas.d.ts +36 -0
- package/dist/dts/api/ApiSchemas.d.ts.map +1 -0
- package/dist/dts/api/Conversions.d.ts +7 -0
- package/dist/dts/api/Conversions.d.ts.map +1 -0
- package/dist/dts/api/ImpostersGroup.d.ts +448 -0
- package/dist/dts/api/ImpostersGroup.d.ts.map +1 -0
- package/dist/dts/api/ImpostersHandlers.d.ts +9 -0
- package/dist/dts/api/ImpostersHandlers.d.ts.map +1 -0
- package/dist/dts/api/SystemGroup.d.ts +46 -0
- package/dist/dts/api/SystemGroup.d.ts.map +1 -0
- package/dist/dts/api/SystemHandlers.d.ts +4 -0
- package/dist/dts/api/SystemHandlers.d.ts.map +1 -0
- package/dist/dts/cli/Commands.d.ts +4 -0
- package/dist/dts/cli/Commands.d.ts.map +1 -0
- package/dist/dts/cli/ConfigLoader.d.ts +13 -0
- package/dist/dts/cli/ConfigLoader.d.ts.map +1 -0
- package/dist/dts/client/HandlerHttpClient.d.ts +5 -0
- package/dist/dts/client/HandlerHttpClient.d.ts.map +1 -0
- package/dist/dts/client/ImpostersClient.d.ts +1868 -0
- package/dist/dts/client/ImpostersClient.d.ts.map +1 -0
- package/dist/dts/client/index.d.ts +6 -0
- package/dist/dts/client/index.d.ts.map +1 -0
- package/dist/dts/client/testing.d.ts +35 -0
- package/dist/dts/client/testing.d.ts.map +1 -0
- package/dist/dts/domain/imposter.d.ts +123 -0
- package/dist/dts/domain/imposter.d.ts.map +1 -0
- package/dist/dts/domain/route.d.ts +128 -0
- package/dist/dts/domain/route.d.ts.map +1 -0
- package/dist/dts/index.d.ts +60 -0
- package/dist/dts/index.d.ts.map +1 -0
- package/dist/dts/layers/ApiLayer.d.ts +3 -0
- package/dist/dts/layers/ApiLayer.d.ts.map +1 -0
- package/dist/dts/layers/MainLayer.d.ts +3 -0
- package/dist/dts/layers/MainLayer.d.ts.map +1 -0
- package/dist/dts/matching/ExpressionEvaluator.d.ts +11 -0
- package/dist/dts/matching/ExpressionEvaluator.d.ts.map +1 -0
- package/dist/dts/matching/RequestMatcher.d.ts +13 -0
- package/dist/dts/matching/RequestMatcher.d.ts.map +1 -0
- package/dist/dts/matching/ResponseGenerator.d.ts +9 -0
- package/dist/dts/matching/ResponseGenerator.d.ts.map +1 -0
- package/dist/dts/matching/TemplateEngine.d.ts +4 -0
- package/dist/dts/matching/TemplateEngine.d.ts.map +1 -0
- package/dist/dts/repositories/ImposterRepository.d.ts +33 -0
- package/dist/dts/repositories/ImposterRepository.d.ts.map +1 -0
- package/dist/dts/schemas/ConfigFileSchema.d.ts +142 -0
- package/dist/dts/schemas/ConfigFileSchema.d.ts.map +1 -0
- package/dist/dts/schemas/ImposterSchema.d.ts +368 -0
- package/dist/dts/schemas/ImposterSchema.d.ts.map +1 -0
- package/dist/dts/schemas/RequestLogSchema.d.ts +36 -0
- package/dist/dts/schemas/RequestLogSchema.d.ts.map +1 -0
- package/dist/dts/schemas/StubSchema.d.ts +112 -0
- package/dist/dts/schemas/StubSchema.d.ts.map +1 -0
- package/dist/dts/schemas/common.d.ts +56 -0
- package/dist/dts/schemas/common.d.ts.map +1 -0
- package/dist/dts/server/AdminServer.d.ts +11 -0
- package/dist/dts/server/AdminServer.d.ts.map +1 -0
- package/dist/dts/server/BunServer.d.ts +17 -0
- package/dist/dts/server/BunServer.d.ts.map +1 -0
- package/dist/dts/server/FiberManager.d.ts +12 -0
- package/dist/dts/server/FiberManager.d.ts.map +1 -0
- package/dist/dts/server/ImposterServer.d.ts +29 -0
- package/dist/dts/server/ImposterServer.d.ts.map +1 -0
- package/dist/dts/services/AppConfig.d.ts +14 -0
- package/dist/dts/services/AppConfig.d.ts.map +1 -0
- package/dist/dts/services/MetricsService.d.ts +26 -0
- package/dist/dts/services/MetricsService.d.ts.map +1 -0
- package/dist/dts/services/PortAllocator.d.ts +29 -0
- package/dist/dts/services/PortAllocator.d.ts.map +1 -0
- package/dist/dts/services/ProxyService.d.ts +24 -0
- package/dist/dts/services/ProxyService.d.ts.map +1 -0
- package/dist/dts/services/RequestLogger.d.ts +23 -0
- package/dist/dts/services/RequestLogger.d.ts.map +1 -0
- package/dist/dts/services/Uuid.d.ts +9 -0
- package/dist/dts/services/Uuid.d.ts.map +1 -0
- package/dist/dts/services/UuidLive.d.ts +4 -0
- package/dist/dts/services/UuidLive.d.ts.map +1 -0
- package/dist/dts/ui/UiRouter.d.ts +15 -0
- package/dist/dts/ui/UiRouter.d.ts.map +1 -0
- package/dist/dts/ui/admin/AdminLayout.d.ts +7 -0
- package/dist/dts/ui/admin/AdminLayout.d.ts.map +1 -0
- package/dist/dts/ui/admin/AdminUiRouter.d.ts +6 -0
- package/dist/dts/ui/admin/AdminUiRouter.d.ts.map +1 -0
- package/dist/dts/ui/admin/pages/AdminDashboard.d.ts +7 -0
- package/dist/dts/ui/admin/pages/AdminDashboard.d.ts.map +1 -0
- package/dist/dts/ui/admin/partials.d.ts +14 -0
- package/dist/dts/ui/admin/partials.d.ts.map +1 -0
- package/dist/dts/ui/html.d.ts +12 -0
- package/dist/dts/ui/html.d.ts.map +1 -0
- package/dist/dts/ui/layout.d.ts +9 -0
- package/dist/dts/ui/layout.d.ts.map +1 -0
- package/dist/dts/ui/pages/dashboard.d.ts +10 -0
- package/dist/dts/ui/pages/dashboard.d.ts.map +1 -0
- package/dist/dts/ui/pages/request-detail.d.ts +11 -0
- package/dist/dts/ui/pages/request-detail.d.ts.map +1 -0
- package/dist/dts/ui/pages/requests.d.ts +15 -0
- package/dist/dts/ui/pages/requests.d.ts.map +1 -0
- package/dist/dts/ui/pages/stubs.d.ts +8 -0
- package/dist/dts/ui/pages/stubs.d.ts.map +1 -0
- package/dist/dts/ui/partials.d.ts +13 -0
- package/dist/dts/ui/partials.d.ts.map +1 -0
- package/dist/esm/Program.js +2 -0
- package/dist/esm/Program.js.map +1 -0
- package/dist/esm/api/AdminApi.js +5 -0
- package/dist/esm/api/AdminApi.js.map +1 -0
- package/dist/esm/api/ApiErrors.js +20 -0
- package/dist/esm/api/ApiErrors.js.map +1 -0
- package/dist/esm/api/ApiSchemas.js +29 -0
- package/dist/esm/api/ApiSchemas.js.map +1 -0
- package/dist/esm/api/Conversions.js +32 -0
- package/dist/esm/api/Conversions.js.map +1 -0
- package/dist/esm/api/ImpostersGroup.js +30 -0
- package/dist/esm/api/ImpostersGroup.js.map +1 -0
- package/dist/esm/api/ImpostersHandlers.js +354 -0
- package/dist/esm/api/ImpostersHandlers.js.map +1 -0
- package/dist/esm/api/SystemGroup.js +6 -0
- package/dist/esm/api/SystemGroup.js.map +1 -0
- package/dist/esm/api/SystemHandlers.js +67 -0
- package/dist/esm/api/SystemHandlers.js.map +1 -0
- package/dist/esm/cli/Commands.js +98 -0
- package/dist/esm/cli/Commands.js.map +1 -0
- package/dist/esm/cli/ConfigLoader.js +25 -0
- package/dist/esm/cli/ConfigLoader.js.map +1 -0
- package/dist/esm/client/HandlerHttpClient.js +42 -0
- package/dist/esm/client/HandlerHttpClient.js.map +1 -0
- package/dist/esm/client/ImpostersClient.js +10 -0
- package/dist/esm/client/ImpostersClient.js.map +1 -0
- package/dist/esm/client/index.js +4 -0
- package/dist/esm/client/index.js.map +1 -0
- package/dist/esm/client/testing.js +86 -0
- package/dist/esm/client/testing.js.map +1 -0
- package/dist/esm/domain/imposter.js +103 -0
- package/dist/esm/domain/imposter.js.map +1 -0
- package/dist/esm/domain/route.js +164 -0
- package/dist/esm/domain/route.js.map +1 -0
- package/dist/esm/index.js +60 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/layers/ApiLayer.js +11 -0
- package/dist/esm/layers/ApiLayer.js.map +1 -0
- package/dist/esm/layers/MainLayer.js +20 -0
- package/dist/esm/layers/MainLayer.js.map +1 -0
- package/dist/esm/matching/ExpressionEvaluator.js +94 -0
- package/dist/esm/matching/ExpressionEvaluator.js.map +1 -0
- package/dist/esm/matching/RequestMatcher.js +135 -0
- package/dist/esm/matching/RequestMatcher.js.map +1 -0
- package/dist/esm/matching/ResponseGenerator.js +71 -0
- package/dist/esm/matching/ResponseGenerator.js.map +1 -0
- package/dist/esm/matching/TemplateEngine.js +47 -0
- package/dist/esm/matching/TemplateEngine.js.map +1 -0
- package/dist/esm/package.json +4 -0
- package/dist/esm/repositories/ImposterRepository.js +110 -0
- package/dist/esm/repositories/ImposterRepository.js.map +1 -0
- package/dist/esm/schemas/ConfigFileSchema.js +37 -0
- package/dist/esm/schemas/ConfigFileSchema.js.map +1 -0
- package/dist/esm/schemas/ImposterSchema.js +195 -0
- package/dist/esm/schemas/ImposterSchema.js.map +1 -0
- package/dist/esm/schemas/RequestLogSchema.js +44 -0
- package/dist/esm/schemas/RequestLogSchema.js.map +1 -0
- package/dist/esm/schemas/StubSchema.js +77 -0
- package/dist/esm/schemas/StubSchema.js.map +1 -0
- package/dist/esm/schemas/common.js +59 -0
- package/dist/esm/schemas/common.js.map +1 -0
- package/dist/esm/server/AdminServer.js +27 -0
- package/dist/esm/server/AdminServer.js.map +1 -0
- package/dist/esm/server/BunServer.js +6 -0
- package/dist/esm/server/BunServer.js.map +1 -0
- package/dist/esm/server/FiberManager.js +14 -0
- package/dist/esm/server/FiberManager.js.map +1 -0
- package/dist/esm/server/ImposterServer.js +225 -0
- package/dist/esm/server/ImposterServer.js.map +1 -0
- package/dist/esm/services/AppConfig.js +11 -0
- package/dist/esm/services/AppConfig.js.map +1 -0
- package/dist/esm/services/MetricsService.js +105 -0
- package/dist/esm/services/MetricsService.js.map +1 -0
- package/dist/esm/services/PortAllocator.js +41 -0
- package/dist/esm/services/PortAllocator.js.map +1 -0
- package/dist/esm/services/ProxyService.js +101 -0
- package/dist/esm/services/ProxyService.js.map +1 -0
- package/dist/esm/services/RequestLogger.js +53 -0
- package/dist/esm/services/RequestLogger.js.map +1 -0
- package/dist/esm/services/Uuid.js +3 -0
- package/dist/esm/services/Uuid.js.map +1 -0
- package/dist/esm/services/UuidLive.js +9 -0
- package/dist/esm/services/UuidLive.js.map +1 -0
- package/dist/esm/ui/UiRouter.js +235 -0
- package/dist/esm/ui/UiRouter.js.map +1 -0
- package/dist/esm/ui/admin/AdminLayout.js +29 -0
- package/dist/esm/ui/admin/AdminLayout.js.map +1 -0
- package/dist/esm/ui/admin/AdminUiRouter.js +148 -0
- package/dist/esm/ui/admin/AdminUiRouter.js.map +1 -0
- package/dist/esm/ui/admin/pages/AdminDashboard.js +48 -0
- package/dist/esm/ui/admin/pages/AdminDashboard.js.map +1 -0
- package/dist/esm/ui/admin/partials.js +54 -0
- package/dist/esm/ui/admin/partials.js.map +1 -0
- package/dist/esm/ui/html.js +32 -0
- package/dist/esm/ui/html.js.map +1 -0
- package/dist/esm/ui/layout.js +32 -0
- package/dist/esm/ui/layout.js.map +1 -0
- package/dist/esm/ui/pages/dashboard.js +44 -0
- package/dist/esm/ui/pages/dashboard.js.map +1 -0
- package/dist/esm/ui/pages/request-detail.js +112 -0
- package/dist/esm/ui/pages/request-detail.js.map +1 -0
- package/dist/esm/ui/pages/requests.js +112 -0
- package/dist/esm/ui/pages/requests.js.map +1 -0
- package/dist/esm/ui/pages/stubs.js +39 -0
- package/dist/esm/ui/pages/stubs.js.map +1 -0
- package/dist/esm/ui/partials.js +91 -0
- package/dist/esm/ui/partials.js.map +1 -0
- package/domain/imposter/package.json +6 -0
- package/domain/route/package.json +6 -0
- package/layers/ApiLayer/package.json +6 -0
- package/layers/MainLayer/package.json +6 -0
- package/matching/ExpressionEvaluator/package.json +6 -0
- package/matching/RequestMatcher/package.json +6 -0
- package/matching/ResponseGenerator/package.json +6 -0
- package/matching/TemplateEngine/package.json +6 -0
- package/package.json +435 -0
- package/repositories/ImposterRepository/package.json +6 -0
- package/schemas/ConfigFileSchema/package.json +6 -0
- package/schemas/ImposterSchema/package.json +6 -0
- package/schemas/RequestLogSchema/package.json +6 -0
- package/schemas/StubSchema/package.json +6 -0
- package/schemas/common/package.json +6 -0
- package/server/AdminServer/package.json +6 -0
- package/server/BunServer/package.json +6 -0
- package/server/FiberManager/package.json +6 -0
- package/server/ImposterServer/package.json +6 -0
- package/services/AppConfig/package.json +6 -0
- package/services/MetricsService/package.json +6 -0
- package/services/PortAllocator/package.json +6 -0
- package/services/ProxyService/package.json +6 -0
- package/services/RequestLogger/package.json +6 -0
- package/services/Uuid/package.json +6 -0
- package/services/UuidLive/package.json +6 -0
- package/src/Program.ts +1 -0
- package/src/api/AdminApi.ts +7 -0
- package/src/api/ApiErrors.ts +20 -0
- package/src/api/ApiSchemas.ts +36 -0
- package/src/api/Conversions.ts +34 -0
- package/src/api/ImpostersGroup.ts +103 -0
- package/src/api/ImpostersHandlers.ts +387 -0
- package/src/api/SystemGroup.ts +12 -0
- package/src/api/SystemHandlers.ts +76 -0
- package/src/cli/Commands.ts +119 -0
- package/src/cli/ConfigLoader.ts +41 -0
- package/src/client/HandlerHttpClient.ts +50 -0
- package/src/client/ImpostersClient.ts +21 -0
- package/src/client/index.ts +9 -0
- package/src/client/testing.ts +105 -0
- package/src/domain/imposter.ts +186 -0
- package/src/domain/route.ts +255 -0
- package/src/index.ts +153 -0
- package/src/layers/ApiLayer.ts +21 -0
- package/src/layers/MainLayer.ts +43 -0
- package/src/matching/ExpressionEvaluator.ts +102 -0
- package/src/matching/RequestMatcher.ts +162 -0
- package/src/matching/ResponseGenerator.ts +86 -0
- package/src/matching/TemplateEngine.ts +54 -0
- package/src/repositories/ImposterRepository.ts +145 -0
- package/src/schemas/ConfigFileSchema.ts +32 -0
- package/src/schemas/ImposterSchema.ts +232 -0
- package/src/schemas/RequestLogSchema.ts +38 -0
- package/src/schemas/StubSchema.ts +90 -0
- package/src/schemas/common.ts +95 -0
- package/src/server/AdminServer.ts +22 -0
- package/src/server/BunServer.ts +19 -0
- package/src/server/FiberManager.ts +25 -0
- package/src/server/ImposterServer.ts +244 -0
- package/src/services/AppConfig.ts +22 -0
- package/src/services/MetricsService.ts +157 -0
- package/src/services/PortAllocator.ts +68 -0
- package/src/services/ProxyService.ts +139 -0
- package/src/services/RequestLogger.ts +87 -0
- package/src/services/Uuid.ts +9 -0
- package/src/services/UuidLive.ts +9 -0
- package/src/types/bun.d.ts +6 -0
- package/src/ui/UiRouter.ts +278 -0
- package/src/ui/admin/AdminLayout.ts +36 -0
- package/src/ui/admin/AdminUiRouter.ts +170 -0
- package/src/ui/admin/pages/AdminDashboard.ts +54 -0
- package/src/ui/admin/partials.ts +83 -0
- package/src/ui/html.ts +37 -0
- package/src/ui/layout.ts +44 -0
- package/src/ui/pages/dashboard.ts +64 -0
- package/src/ui/pages/request-detail.ts +142 -0
- package/src/ui/pages/requests.ts +141 -0
- package/src/ui/pages/stubs.ts +52 -0
- package/src/ui/partials.ts +133 -0
- package/ui/UiRouter/package.json +6 -0
- package/ui/admin/AdminLayout/package.json +6 -0
- package/ui/admin/AdminUiRouter/package.json +6 -0
- package/ui/admin/pages/AdminDashboard/package.json +6 -0
- package/ui/admin/partials/package.json +6 -0
- package/ui/html/package.json +6 -0
- package/ui/layout/package.json +6 -0
- package/ui/pages/dashboard/package.json +6 -0
- package/ui/pages/requests/package.json +6 -0
- 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 →</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">← 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 @@
|
|
|
1
|
+
{"version":3,"file":"Program.d.ts","sourceRoot":"","sources":["../../src/Program.ts"],"names":[],"mappings":"AAAA,OAAO,mBAAmB,CAAA"}
|