@engjts/nexus 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/README.md +164 -0
- package/dist/advanced/cache/InMemoryCacheStore.d.ts +18 -0
- package/dist/advanced/cache/InMemoryCacheStore.d.ts.map +1 -0
- package/dist/advanced/cache/InMemoryCacheStore.js +60 -0
- package/dist/advanced/cache/InMemoryCacheStore.js.map +1 -0
- package/dist/advanced/cache/MultiTierCache.d.ts +55 -0
- package/dist/advanced/cache/MultiTierCache.d.ts.map +1 -0
- package/dist/advanced/cache/MultiTierCache.js +159 -0
- package/dist/advanced/cache/MultiTierCache.js.map +1 -0
- package/dist/advanced/cache/RedisCacheStore.d.ts +153 -0
- package/dist/advanced/cache/RedisCacheStore.d.ts.map +1 -0
- package/dist/advanced/cache/RedisCacheStore.js +247 -0
- package/dist/advanced/cache/RedisCacheStore.js.map +1 -0
- package/dist/advanced/cache/index.d.ts +6 -0
- package/dist/advanced/cache/index.d.ts.map +1 -0
- package/dist/advanced/cache/index.js +26 -0
- package/dist/advanced/cache/index.js.map +1 -0
- package/dist/advanced/cache/types.d.ts +35 -0
- package/dist/advanced/cache/types.d.ts.map +1 -0
- package/dist/advanced/cache/types.js +3 -0
- package/dist/advanced/cache/types.js.map +1 -0
- package/dist/advanced/graphql/SimpleDataLoader.d.ts +8 -0
- package/dist/advanced/graphql/SimpleDataLoader.d.ts.map +1 -0
- package/dist/advanced/graphql/SimpleDataLoader.js +43 -0
- package/dist/advanced/graphql/SimpleDataLoader.js.map +1 -0
- package/dist/advanced/graphql/index.d.ts +15 -0
- package/dist/advanced/graphql/index.d.ts.map +1 -0
- package/dist/advanced/graphql/index.js +19 -0
- package/dist/advanced/graphql/index.js.map +1 -0
- package/dist/advanced/graphql/server.d.ts +23 -0
- package/dist/advanced/graphql/server.d.ts.map +1 -0
- package/dist/advanced/graphql/server.js +208 -0
- package/dist/advanced/graphql/server.js.map +1 -0
- package/dist/advanced/graphql/types.d.ts +45 -0
- package/dist/advanced/graphql/types.d.ts.map +1 -0
- package/dist/advanced/graphql/types.js +3 -0
- package/dist/advanced/graphql/types.js.map +1 -0
- package/dist/advanced/jobs/InMemoryQueueStore.d.ts +14 -0
- package/dist/advanced/jobs/InMemoryQueueStore.d.ts.map +1 -0
- package/dist/advanced/jobs/InMemoryQueueStore.js +59 -0
- package/dist/advanced/jobs/InMemoryQueueStore.js.map +1 -0
- package/dist/advanced/jobs/JobQueue.d.ts +178 -0
- package/dist/advanced/jobs/JobQueue.d.ts.map +1 -0
- package/dist/advanced/jobs/JobQueue.js +440 -0
- package/dist/advanced/jobs/JobQueue.js.map +1 -0
- package/dist/advanced/jobs/RedisQueueStore.d.ts +157 -0
- package/dist/advanced/jobs/RedisQueueStore.d.ts.map +1 -0
- package/dist/advanced/jobs/RedisQueueStore.js +264 -0
- package/dist/advanced/jobs/RedisQueueStore.js.map +1 -0
- package/dist/advanced/jobs/index.d.ts +6 -0
- package/dist/advanced/jobs/index.d.ts.map +1 -0
- package/dist/advanced/jobs/index.js +26 -0
- package/dist/advanced/jobs/index.js.map +1 -0
- package/dist/advanced/jobs/types.d.ts +64 -0
- package/dist/advanced/jobs/types.d.ts.map +1 -0
- package/dist/advanced/jobs/types.js +3 -0
- package/dist/advanced/jobs/types.js.map +1 -0
- package/dist/advanced/observability/APMManager.d.ts +64 -0
- package/dist/advanced/observability/APMManager.d.ts.map +1 -0
- package/dist/advanced/observability/APMManager.js +150 -0
- package/dist/advanced/observability/APMManager.js.map +1 -0
- package/dist/advanced/observability/AlertManager.d.ts +30 -0
- package/dist/advanced/observability/AlertManager.d.ts.map +1 -0
- package/dist/advanced/observability/AlertManager.js +98 -0
- package/dist/advanced/observability/AlertManager.js.map +1 -0
- package/dist/advanced/observability/MetricRegistry.d.ts +37 -0
- package/dist/advanced/observability/MetricRegistry.d.ts.map +1 -0
- package/dist/advanced/observability/MetricRegistry.js +129 -0
- package/dist/advanced/observability/MetricRegistry.js.map +1 -0
- package/dist/advanced/observability/ObservabilityCenter.d.ts +113 -0
- package/dist/advanced/observability/ObservabilityCenter.d.ts.map +1 -0
- package/dist/advanced/observability/ObservabilityCenter.js +266 -0
- package/dist/advanced/observability/ObservabilityCenter.js.map +1 -0
- package/dist/advanced/observability/StructuredLogger.d.ts +25 -0
- package/dist/advanced/observability/StructuredLogger.d.ts.map +1 -0
- package/dist/advanced/observability/StructuredLogger.js +137 -0
- package/dist/advanced/observability/StructuredLogger.js.map +1 -0
- package/dist/advanced/observability/TracingManager.d.ts +31 -0
- package/dist/advanced/observability/TracingManager.d.ts.map +1 -0
- package/dist/advanced/observability/TracingManager.js +105 -0
- package/dist/advanced/observability/TracingManager.js.map +1 -0
- package/dist/advanced/observability/adapters.d.ts +134 -0
- package/dist/advanced/observability/adapters.d.ts.map +1 -0
- package/dist/advanced/observability/adapters.js +257 -0
- package/dist/advanced/observability/adapters.js.map +1 -0
- package/dist/advanced/observability/createObservabilityMiddleware.d.ts +8 -0
- package/dist/advanced/observability/createObservabilityMiddleware.d.ts.map +1 -0
- package/dist/advanced/observability/createObservabilityMiddleware.js +46 -0
- package/dist/advanced/observability/createObservabilityMiddleware.js.map +1 -0
- package/dist/advanced/observability/index.d.ts +2 -0
- package/dist/advanced/observability/index.d.ts.map +1 -0
- package/dist/advanced/observability/index.js +13 -0
- package/dist/advanced/observability/index.js.map +1 -0
- package/dist/advanced/observability/types.d.ts +182 -0
- package/dist/advanced/observability/types.d.ts.map +1 -0
- package/dist/advanced/observability/types.js +3 -0
- package/dist/advanced/observability/types.js.map +1 -0
- package/dist/advanced/playground/extractPathParams.d.ts +4 -0
- package/dist/advanced/playground/extractPathParams.d.ts.map +1 -0
- package/dist/advanced/playground/extractPathParams.js +8 -0
- package/dist/advanced/playground/extractPathParams.js.map +1 -0
- package/dist/advanced/playground/generateFieldExample.d.ts +2 -0
- package/dist/advanced/playground/generateFieldExample.d.ts.map +1 -0
- package/dist/advanced/playground/generateFieldExample.js +40 -0
- package/dist/advanced/playground/generateFieldExample.js.map +1 -0
- package/dist/advanced/playground/generatePlaygroundHTML.d.ts +3 -0
- package/dist/advanced/playground/generatePlaygroundHTML.d.ts.map +1 -0
- package/dist/advanced/playground/generatePlaygroundHTML.js +1848 -0
- package/dist/advanced/playground/generatePlaygroundHTML.js.map +1 -0
- package/dist/advanced/playground/generateSummary.d.ts +3 -0
- package/dist/advanced/playground/generateSummary.d.ts.map +1 -0
- package/dist/advanced/playground/generateSummary.js +19 -0
- package/dist/advanced/playground/generateSummary.js.map +1 -0
- package/dist/advanced/playground/getTagFromPath.d.ts +2 -0
- package/dist/advanced/playground/getTagFromPath.d.ts.map +1 -0
- package/dist/advanced/playground/getTagFromPath.js +11 -0
- package/dist/advanced/playground/getTagFromPath.js.map +1 -0
- package/dist/advanced/playground/index.d.ts +7 -0
- package/dist/advanced/playground/index.d.ts.map +1 -0
- package/dist/advanced/playground/index.js +10 -0
- package/dist/advanced/playground/index.js.map +1 -0
- package/dist/advanced/playground/playground.d.ts +4 -0
- package/dist/advanced/playground/playground.d.ts.map +1 -0
- package/dist/advanced/playground/playground.js +139 -0
- package/dist/advanced/playground/playground.js.map +1 -0
- package/dist/advanced/playground/types.d.ts +18 -0
- package/dist/advanced/playground/types.d.ts.map +1 -0
- package/dist/advanced/playground/types.js +3 -0
- package/dist/advanced/playground/types.js.map +1 -0
- package/dist/advanced/playground/zodToExample.d.ts +2 -0
- package/dist/advanced/playground/zodToExample.d.ts.map +1 -0
- package/dist/advanced/playground/zodToExample.js +22 -0
- package/dist/advanced/playground/zodToExample.js.map +1 -0
- package/dist/advanced/playground/zodToParams.d.ts +5 -0
- package/dist/advanced/playground/zodToParams.d.ts.map +1 -0
- package/dist/advanced/playground/zodToParams.js +18 -0
- package/dist/advanced/playground/zodToParams.js.map +1 -0
- package/dist/advanced/postman/buildAuth.d.ts +3 -0
- package/dist/advanced/postman/buildAuth.d.ts.map +1 -0
- package/dist/advanced/postman/buildAuth.js +32 -0
- package/dist/advanced/postman/buildAuth.js.map +1 -0
- package/dist/advanced/postman/buildBody.d.ts +3 -0
- package/dist/advanced/postman/buildBody.d.ts.map +1 -0
- package/dist/advanced/postman/buildBody.js +15 -0
- package/dist/advanced/postman/buildBody.js.map +1 -0
- package/dist/advanced/postman/buildQueryParams.d.ts +3 -0
- package/dist/advanced/postman/buildQueryParams.d.ts.map +1 -0
- package/dist/advanced/postman/buildQueryParams.js +26 -0
- package/dist/advanced/postman/buildQueryParams.js.map +1 -0
- package/dist/advanced/postman/buildRequestItem.d.ts +3 -0
- package/dist/advanced/postman/buildRequestItem.d.ts.map +1 -0
- package/dist/advanced/postman/buildRequestItem.js +33 -0
- package/dist/advanced/postman/buildRequestItem.js.map +1 -0
- package/dist/advanced/postman/buildResponses.d.ts +3 -0
- package/dist/advanced/postman/buildResponses.d.ts.map +1 -0
- package/dist/advanced/postman/buildResponses.js +12 -0
- package/dist/advanced/postman/buildResponses.js.map +1 -0
- package/dist/advanced/postman/buildUrl.d.ts +3 -0
- package/dist/advanced/postman/buildUrl.d.ts.map +1 -0
- package/dist/advanced/postman/buildUrl.js +30 -0
- package/dist/advanced/postman/buildUrl.js.map +1 -0
- package/dist/advanced/postman/capitalize.d.ts +2 -0
- package/dist/advanced/postman/capitalize.d.ts.map +1 -0
- package/dist/advanced/postman/capitalize.js +7 -0
- package/dist/advanced/postman/capitalize.js.map +1 -0
- package/dist/advanced/postman/generateCollection.d.ts +3 -0
- package/dist/advanced/postman/generateCollection.d.ts.map +1 -0
- package/dist/advanced/postman/generateCollection.js +50 -0
- package/dist/advanced/postman/generateCollection.js.map +1 -0
- package/dist/advanced/postman/generateEnvironment.d.ts +3 -0
- package/dist/advanced/postman/generateEnvironment.d.ts.map +1 -0
- package/dist/advanced/postman/generateEnvironment.js +33 -0
- package/dist/advanced/postman/generateEnvironment.js.map +1 -0
- package/dist/advanced/postman/generateExampleFromZod.d.ts +2 -0
- package/dist/advanced/postman/generateExampleFromZod.d.ts.map +1 -0
- package/dist/advanced/postman/generateExampleFromZod.js +22 -0
- package/dist/advanced/postman/generateExampleFromZod.js.map +1 -0
- package/dist/advanced/postman/generateFieldExample.d.ts +2 -0
- package/dist/advanced/postman/generateFieldExample.d.ts.map +1 -0
- package/dist/advanced/postman/generateFieldExample.js +55 -0
- package/dist/advanced/postman/generateFieldExample.js.map +1 -0
- package/dist/advanced/postman/generateName.d.ts +3 -0
- package/dist/advanced/postman/generateName.d.ts.map +1 -0
- package/dist/advanced/postman/generateName.js +19 -0
- package/dist/advanced/postman/generateName.js.map +1 -0
- package/dist/advanced/postman/generateUUID.d.ts +2 -0
- package/dist/advanced/postman/generateUUID.d.ts.map +1 -0
- package/dist/advanced/postman/generateUUID.js +14 -0
- package/dist/advanced/postman/generateUUID.js.map +1 -0
- package/dist/advanced/postman/getTagFromPath.d.ts +2 -0
- package/dist/advanced/postman/getTagFromPath.d.ts.map +1 -0
- package/dist/advanced/postman/getTagFromPath.js +12 -0
- package/dist/advanced/postman/getTagFromPath.js.map +1 -0
- package/dist/advanced/postman/index.d.ts +28 -0
- package/dist/advanced/postman/index.d.ts.map +1 -0
- package/dist/advanced/postman/index.js +30 -0
- package/dist/advanced/postman/index.js.map +1 -0
- package/dist/advanced/postman/postman.d.ts +7 -0
- package/dist/advanced/postman/postman.d.ts.map +1 -0
- package/dist/advanced/postman/postman.js +138 -0
- package/dist/advanced/postman/postman.js.map +1 -0
- package/dist/advanced/postman/slugify.d.ts +2 -0
- package/dist/advanced/postman/slugify.d.ts.map +1 -0
- package/dist/advanced/postman/slugify.js +10 -0
- package/dist/advanced/postman/slugify.js.map +1 -0
- package/dist/advanced/postman/types.d.ts +133 -0
- package/dist/advanced/postman/types.d.ts.map +1 -0
- package/dist/advanced/postman/types.js +3 -0
- package/dist/advanced/postman/types.js.map +1 -0
- package/dist/advanced/realtime/index.d.ts +13 -0
- package/dist/advanced/realtime/index.d.ts.map +1 -0
- package/dist/advanced/realtime/index.js +17 -0
- package/dist/advanced/realtime/index.js.map +1 -0
- package/dist/advanced/realtime/websocket.d.ts +60 -0
- package/dist/advanced/realtime/websocket.d.ts.map +1 -0
- package/dist/advanced/realtime/websocket.js +197 -0
- package/dist/advanced/realtime/websocket.js.map +1 -0
- package/dist/advanced/sentry/index.d.ts +287 -0
- package/dist/advanced/sentry/index.d.ts.map +1 -0
- package/dist/advanced/sentry/index.js +1002 -0
- package/dist/advanced/sentry/index.js.map +1 -0
- package/dist/advanced/sentry/types.d.ts +298 -0
- package/dist/advanced/sentry/types.d.ts.map +1 -0
- package/dist/advanced/sentry/types.js +6 -0
- package/dist/advanced/sentry/types.js.map +1 -0
- package/dist/advanced/static/generateDirectoryListing.d.ts +5 -0
- package/dist/advanced/static/generateDirectoryListing.d.ts.map +1 -0
- package/dist/advanced/static/generateDirectoryListing.js +44 -0
- package/dist/advanced/static/generateDirectoryListing.js.map +1 -0
- package/dist/advanced/static/generateETag.d.ts +8 -0
- package/dist/advanced/static/generateETag.d.ts.map +1 -0
- package/dist/advanced/static/generateETag.js +10 -0
- package/dist/advanced/static/generateETag.js.map +1 -0
- package/dist/advanced/static/getMimeType.d.ts +5 -0
- package/dist/advanced/static/getMimeType.d.ts.map +1 -0
- package/dist/advanced/static/getMimeType.js +11 -0
- package/dist/advanced/static/getMimeType.js.map +1 -0
- package/dist/advanced/static/index.d.ts +30 -0
- package/dist/advanced/static/index.d.ts.map +1 -0
- package/dist/advanced/static/index.js +33 -0
- package/dist/advanced/static/index.js.map +1 -0
- package/dist/advanced/static/isSafePath.d.ts +5 -0
- package/dist/advanced/static/isSafePath.d.ts.map +1 -0
- package/dist/advanced/static/isSafePath.js +14 -0
- package/dist/advanced/static/isSafePath.js.map +1 -0
- package/dist/advanced/static/publicDir.d.ts +12 -0
- package/dist/advanced/static/publicDir.d.ts.map +1 -0
- package/dist/advanced/static/publicDir.js +22 -0
- package/dist/advanced/static/publicDir.js.map +1 -0
- package/dist/advanced/static/serveStatic.d.ts +7 -0
- package/dist/advanced/static/serveStatic.d.ts.map +1 -0
- package/dist/advanced/static/serveStatic.js +198 -0
- package/dist/advanced/static/serveStatic.js.map +1 -0
- package/dist/advanced/static/spa.d.ts +14 -0
- package/dist/advanced/static/spa.d.ts.map +1 -0
- package/dist/advanced/static/spa.js +23 -0
- package/dist/advanced/static/spa.js.map +1 -0
- package/dist/advanced/static/types.d.ts +78 -0
- package/dist/advanced/static/types.d.ts.map +1 -0
- package/dist/advanced/static/types.js +67 -0
- package/dist/advanced/static/types.js.map +1 -0
- package/dist/advanced/swagger/SwaggerGenerator.d.ts +19 -0
- package/dist/advanced/swagger/SwaggerGenerator.d.ts.map +1 -0
- package/dist/advanced/swagger/SwaggerGenerator.js +59 -0
- package/dist/advanced/swagger/SwaggerGenerator.js.map +1 -0
- package/dist/advanced/swagger/buildOperation.d.ts +6 -0
- package/dist/advanced/swagger/buildOperation.d.ts.map +1 -0
- package/dist/advanced/swagger/buildOperation.js +54 -0
- package/dist/advanced/swagger/buildOperation.js.map +1 -0
- package/dist/advanced/swagger/buildParameters.d.ts +6 -0
- package/dist/advanced/swagger/buildParameters.d.ts.map +1 -0
- package/dist/advanced/swagger/buildParameters.js +57 -0
- package/dist/advanced/swagger/buildParameters.js.map +1 -0
- package/dist/advanced/swagger/buildRequestBody.d.ts +7 -0
- package/dist/advanced/swagger/buildRequestBody.d.ts.map +1 -0
- package/dist/advanced/swagger/buildRequestBody.js +19 -0
- package/dist/advanced/swagger/buildRequestBody.js.map +1 -0
- package/dist/advanced/swagger/buildResponses.d.ts +7 -0
- package/dist/advanced/swagger/buildResponses.d.ts.map +1 -0
- package/dist/advanced/swagger/buildResponses.js +48 -0
- package/dist/advanced/swagger/buildResponses.js.map +1 -0
- package/dist/advanced/swagger/capitalize.d.ts +2 -0
- package/dist/advanced/swagger/capitalize.d.ts.map +1 -0
- package/dist/advanced/swagger/capitalize.js +7 -0
- package/dist/advanced/swagger/capitalize.js.map +1 -0
- package/dist/advanced/swagger/convertPath.d.ts +6 -0
- package/dist/advanced/swagger/convertPath.d.ts.map +1 -0
- package/dist/advanced/swagger/convertPath.js +11 -0
- package/dist/advanced/swagger/convertPath.js.map +1 -0
- package/dist/advanced/swagger/createSwagger.d.ts +8 -0
- package/dist/advanced/swagger/createSwagger.d.ts.map +1 -0
- package/dist/advanced/swagger/createSwagger.js +12 -0
- package/dist/advanced/swagger/createSwagger.js.map +1 -0
- package/dist/advanced/swagger/generateOperationId.d.ts +6 -0
- package/dist/advanced/swagger/generateOperationId.d.ts.map +1 -0
- package/dist/advanced/swagger/generateOperationId.js +20 -0
- package/dist/advanced/swagger/generateOperationId.js.map +1 -0
- package/dist/advanced/swagger/generateSpec.d.ts +6 -0
- package/dist/advanced/swagger/generateSpec.d.ts.map +1 -0
- package/dist/advanced/swagger/generateSpec.js +85 -0
- package/dist/advanced/swagger/generateSpec.js.map +1 -0
- package/dist/advanced/swagger/generateSummary.d.ts +6 -0
- package/dist/advanced/swagger/generateSummary.d.ts.map +1 -0
- package/dist/advanced/swagger/generateSummary.js +22 -0
- package/dist/advanced/swagger/generateSummary.js.map +1 -0
- package/dist/advanced/swagger/generateSwaggerUI.d.ts +6 -0
- package/dist/advanced/swagger/generateSwaggerUI.d.ts.map +1 -0
- package/dist/advanced/swagger/generateSwaggerUI.js +69 -0
- package/dist/advanced/swagger/generateSwaggerUI.js.map +1 -0
- package/dist/advanced/swagger/generateThemeCss.d.ts +6 -0
- package/dist/advanced/swagger/generateThemeCss.d.ts.map +1 -0
- package/dist/advanced/swagger/generateThemeCss.js +53 -0
- package/dist/advanced/swagger/generateThemeCss.js.map +1 -0
- package/dist/advanced/swagger/index.d.ts +23 -0
- package/dist/advanced/swagger/index.d.ts.map +1 -0
- package/dist/advanced/swagger/index.js +26 -0
- package/dist/advanced/swagger/index.js.map +1 -0
- package/dist/advanced/swagger/swagger.d.ts +36 -0
- package/dist/advanced/swagger/swagger.d.ts.map +1 -0
- package/dist/advanced/swagger/swagger.js +198 -0
- package/dist/advanced/swagger/swagger.js.map +1 -0
- package/dist/advanced/swagger/types.d.ts +210 -0
- package/dist/advanced/swagger/types.d.ts.map +1 -0
- package/dist/advanced/swagger/types.js +3 -0
- package/dist/advanced/swagger/types.js.map +1 -0
- package/dist/advanced/swagger/zodFieldToOpenAPI.d.ts +6 -0
- package/dist/advanced/swagger/zodFieldToOpenAPI.d.ts.map +1 -0
- package/dist/advanced/swagger/zodFieldToOpenAPI.js +86 -0
- package/dist/advanced/swagger/zodFieldToOpenAPI.js.map +1 -0
- package/dist/advanced/swagger/zodSchemaToOpenAPI.d.ts +6 -0
- package/dist/advanced/swagger/zodSchemaToOpenAPI.d.ts.map +1 -0
- package/dist/advanced/swagger/zodSchemaToOpenAPI.js +44 -0
- package/dist/advanced/swagger/zodSchemaToOpenAPI.js.map +1 -0
- package/dist/advanced/swagger/zodToOpenAPI.d.ts +6 -0
- package/dist/advanced/swagger/zodToOpenAPI.d.ts.map +1 -0
- package/dist/advanced/swagger/zodToOpenAPI.js +22 -0
- package/dist/advanced/swagger/zodToOpenAPI.js.map +1 -0
- package/dist/advanced/testing/factory.d.ts +206 -0
- package/dist/advanced/testing/factory.d.ts.map +1 -0
- package/dist/advanced/testing/factory.js +433 -0
- package/dist/advanced/testing/factory.js.map +1 -0
- package/dist/advanced/testing/harness.d.ts +181 -0
- package/dist/advanced/testing/harness.d.ts.map +1 -0
- package/dist/advanced/testing/harness.js +481 -0
- package/dist/advanced/testing/harness.js.map +1 -0
- package/dist/advanced/testing/index.d.ts +235 -0
- package/dist/advanced/testing/index.d.ts.map +1 -0
- package/dist/advanced/testing/index.js +306 -0
- package/dist/advanced/testing/index.js.map +1 -0
- package/dist/advanced/testing/load-test.d.ts +148 -0
- package/dist/advanced/testing/load-test.d.ts.map +1 -0
- package/dist/advanced/testing/load-test.js +490 -0
- package/dist/advanced/testing/load-test.js.map +1 -0
- package/dist/advanced/testing/mock-server.d.ts +166 -0
- package/dist/advanced/testing/mock-server.d.ts.map +1 -0
- package/dist/advanced/testing/mock-server.js +424 -0
- package/dist/advanced/testing/mock-server.js.map +1 -0
- package/dist/advanced/testing/mock.d.ts +248 -0
- package/dist/advanced/testing/mock.d.ts.map +1 -0
- package/dist/advanced/testing/mock.js +549 -0
- package/dist/advanced/testing/mock.js.map +1 -0
- package/dist/cli/bin.d.ts +3 -0
- package/dist/cli/bin.d.ts.map +1 -0
- package/dist/cli/bin.js +10 -0
- package/dist/cli/bin.js.map +1 -0
- package/dist/cli/cli.d.ts +24 -0
- package/dist/cli/cli.d.ts.map +1 -0
- package/dist/cli/cli.js +131 -0
- package/dist/cli/cli.js.map +1 -0
- package/dist/cli/commands/build.d.ts +20 -0
- package/dist/cli/commands/build.d.ts.map +1 -0
- package/dist/cli/commands/build.js +63 -0
- package/dist/cli/commands/build.js.map +1 -0
- package/dist/cli/commands/create.d.ts +13 -0
- package/dist/cli/commands/create.d.ts.map +1 -0
- package/dist/cli/commands/create.js +142 -0
- package/dist/cli/commands/create.js.map +1 -0
- package/dist/cli/commands/dev.d.ts +15 -0
- package/dist/cli/commands/dev.d.ts.map +1 -0
- package/dist/cli/commands/dev.js +77 -0
- package/dist/cli/commands/dev.js.map +1 -0
- package/dist/cli/commands/generate.d.ts +13 -0
- package/dist/cli/commands/generate.d.ts.map +1 -0
- package/dist/cli/commands/generate.js +80 -0
- package/dist/cli/commands/generate.js.map +1 -0
- package/dist/cli/commands/help.d.ts +13 -0
- package/dist/cli/commands/help.d.ts.map +1 -0
- package/dist/cli/commands/help.js +83 -0
- package/dist/cli/commands/help.js.map +1 -0
- package/dist/cli/commands/init.d.ts +11 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +76 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/version.d.ts +9 -0
- package/dist/cli/commands/version.d.ts.map +1 -0
- package/dist/cli/commands/version.js +35 -0
- package/dist/cli/commands/version.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +7 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/templates/generators.d.ts +22 -0
- package/dist/cli/templates/generators.d.ts.map +1 -0
- package/dist/cli/templates/generators.js +282 -0
- package/dist/cli/templates/generators.js.map +1 -0
- package/dist/cli/templates/index.d.ts +27 -0
- package/dist/cli/templates/index.d.ts.map +1 -0
- package/dist/cli/templates/index.js +651 -0
- package/dist/cli/templates/index.js.map +1 -0
- package/dist/cli/utils/exec.d.ts +12 -0
- package/dist/cli/utils/exec.d.ts.map +1 -0
- package/dist/cli/utils/exec.js +37 -0
- package/dist/cli/utils/exec.js.map +1 -0
- package/dist/cli/utils/file-system.d.ts +15 -0
- package/dist/cli/utils/file-system.d.ts.map +1 -0
- package/dist/cli/utils/file-system.js +105 -0
- package/dist/cli/utils/file-system.js.map +1 -0
- package/dist/cli/utils/logger.d.ts +40 -0
- package/dist/cli/utils/logger.d.ts.map +1 -0
- package/dist/cli/utils/logger.js +100 -0
- package/dist/cli/utils/logger.js.map +1 -0
- package/dist/core/adapter.d.ts +73 -0
- package/dist/core/adapter.d.ts.map +1 -0
- package/dist/core/adapter.js +27 -0
- package/dist/core/adapter.js.map +1 -0
- package/dist/core/application.d.ts +540 -0
- package/dist/core/application.d.ts.map +1 -0
- package/dist/core/application.js +1111 -0
- package/dist/core/application.js.map +1 -0
- package/dist/core/context-pool.d.ts +52 -0
- package/dist/core/context-pool.d.ts.map +1 -0
- package/dist/core/context-pool.js +111 -0
- package/dist/core/context-pool.js.map +1 -0
- package/dist/core/context.d.ts +148 -0
- package/dist/core/context.d.ts.map +1 -0
- package/dist/core/context.js +367 -0
- package/dist/core/context.js.map +1 -0
- package/dist/core/index.d.ts +23 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +77 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/middleware.d.ts +49 -0
- package/dist/core/middleware.d.ts.map +1 -0
- package/dist/core/middleware.js +215 -0
- package/dist/core/middleware.js.map +1 -0
- package/dist/core/performance/buffer-pool.d.ts +47 -0
- package/dist/core/performance/buffer-pool.d.ts.map +1 -0
- package/dist/core/performance/buffer-pool.js +97 -0
- package/dist/core/performance/buffer-pool.js.map +1 -0
- package/dist/core/performance/jit-compiler.d.ts +73 -0
- package/dist/core/performance/jit-compiler.d.ts.map +1 -0
- package/dist/core/performance/jit-compiler.js +145 -0
- package/dist/core/performance/jit-compiler.js.map +1 -0
- package/dist/core/performance/middleware-optimizer.d.ts +73 -0
- package/dist/core/performance/middleware-optimizer.d.ts.map +1 -0
- package/dist/core/performance/middleware-optimizer.js +138 -0
- package/dist/core/performance/middleware-optimizer.js.map +1 -0
- package/dist/core/plugin/PluginManager.d.ts +93 -0
- package/dist/core/plugin/PluginManager.d.ts.map +1 -0
- package/dist/core/plugin/PluginManager.js +351 -0
- package/dist/core/plugin/PluginManager.js.map +1 -0
- package/dist/core/plugin/builder.d.ts +192 -0
- package/dist/core/plugin/builder.d.ts.map +1 -0
- package/dist/core/plugin/builder.js +319 -0
- package/dist/core/plugin/builder.js.map +1 -0
- package/dist/core/plugin/index.d.ts +31 -0
- package/dist/core/plugin/index.d.ts.map +1 -0
- package/dist/core/plugin/index.js +41 -0
- package/dist/core/plugin/index.js.map +1 -0
- package/dist/core/plugin/types.d.ts +184 -0
- package/dist/core/plugin/types.d.ts.map +1 -0
- package/dist/core/plugin/types.js +17 -0
- package/dist/core/plugin/types.js.map +1 -0
- package/dist/core/router/file-router.d.ts +173 -0
- package/dist/core/router/file-router.d.ts.map +1 -0
- package/dist/core/router/file-router.js +498 -0
- package/dist/core/router/file-router.js.map +1 -0
- package/dist/core/router/index.d.ts +44 -0
- package/dist/core/router/index.d.ts.map +1 -0
- package/dist/core/router/index.js +145 -0
- package/dist/core/router/index.js.map +1 -0
- package/dist/core/router/radix-tree.d.ts +69 -0
- package/dist/core/router/radix-tree.d.ts.map +1 -0
- package/dist/core/router/radix-tree.js +196 -0
- package/dist/core/router/radix-tree.js.map +1 -0
- package/dist/core/store/index.d.ts +15 -0
- package/dist/core/store/index.d.ts.map +1 -0
- package/dist/core/store/index.js +23 -0
- package/dist/core/store/index.js.map +1 -0
- package/dist/core/store/registry.d.ts +80 -0
- package/dist/core/store/registry.d.ts.map +1 -0
- package/dist/core/store/registry.js +156 -0
- package/dist/core/store/registry.js.map +1 -0
- package/dist/core/store/request-store.d.ts +138 -0
- package/dist/core/store/request-store.d.ts.map +1 -0
- package/dist/core/store/request-store.js +209 -0
- package/dist/core/store/request-store.js.map +1 -0
- package/dist/core/store/types.d.ts +140 -0
- package/dist/core/store/types.d.ts.map +1 -0
- package/dist/core/store/types.js +176 -0
- package/dist/core/store/types.js.map +1 -0
- package/dist/core/types.d.ts +470 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +106 -0
- package/dist/core/types.js.map +1 -0
- package/dist/database/adapter.d.ts +32 -0
- package/dist/database/adapter.d.ts.map +1 -0
- package/dist/database/adapter.js +3 -0
- package/dist/database/adapter.js.map +1 -0
- package/dist/database/adapters/index.d.ts +2 -0
- package/dist/database/adapters/index.d.ts.map +1 -0
- package/dist/database/adapters/index.js +18 -0
- package/dist/database/adapters/index.js.map +1 -0
- package/dist/database/adapters/mysql.d.ts +160 -0
- package/dist/database/adapters/mysql.d.ts.map +1 -0
- package/dist/database/adapters/mysql.js +501 -0
- package/dist/database/adapters/mysql.js.map +1 -0
- package/dist/database/database.d.ts +27 -0
- package/dist/database/database.d.ts.map +1 -0
- package/dist/database/database.js +59 -0
- package/dist/database/database.js.map +1 -0
- package/dist/database/dialect.d.ts +110 -0
- package/dist/database/dialect.d.ts.map +1 -0
- package/dist/database/dialect.js +269 -0
- package/dist/database/dialect.js.map +1 -0
- package/dist/database/index.d.ts +12 -0
- package/dist/database/index.d.ts.map +1 -0
- package/dist/database/index.js +28 -0
- package/dist/database/index.js.map +1 -0
- package/dist/database/migrations.d.ts +22 -0
- package/dist/database/migrations.d.ts.map +1 -0
- package/dist/database/migrations.js +73 -0
- package/dist/database/migrations.js.map +1 -0
- package/dist/database/optimizer.d.ts +25 -0
- package/dist/database/optimizer.d.ts.map +1 -0
- package/dist/database/optimizer.js +97 -0
- package/dist/database/optimizer.js.map +1 -0
- package/dist/database/query-builder.d.ts +49 -0
- package/dist/database/query-builder.d.ts.map +1 -0
- package/dist/database/query-builder.js +319 -0
- package/dist/database/query-builder.js.map +1 -0
- package/dist/database/realtime.d.ts +24 -0
- package/dist/database/realtime.d.ts.map +1 -0
- package/dist/database/realtime.js +38 -0
- package/dist/database/realtime.js.map +1 -0
- package/dist/database/schema.d.ts +27 -0
- package/dist/database/schema.d.ts.map +1 -0
- package/dist/database/schema.js +47 -0
- package/dist/database/schema.js.map +1 -0
- package/dist/database/transactions.d.ts +13 -0
- package/dist/database/transactions.d.ts.map +1 -0
- package/dist/database/transactions.js +51 -0
- package/dist/database/transactions.js.map +1 -0
- package/dist/database/types.d.ts +68 -0
- package/dist/database/types.d.ts.map +1 -0
- package/dist/database/types.js +3 -0
- package/dist/database/types.js.map +1 -0
- package/dist/deployment/cluster.d.ts +161 -0
- package/dist/deployment/cluster.d.ts.map +1 -0
- package/dist/deployment/cluster.js +336 -0
- package/dist/deployment/cluster.js.map +1 -0
- package/dist/deployment/config.d.ts +209 -0
- package/dist/deployment/config.d.ts.map +1 -0
- package/dist/deployment/config.js +263 -0
- package/dist/deployment/config.js.map +1 -0
- package/dist/deployment/docker.d.ts +168 -0
- package/dist/deployment/docker.d.ts.map +1 -0
- package/dist/deployment/docker.js +437 -0
- package/dist/deployment/docker.js.map +1 -0
- package/dist/deployment/graceful-shutdown.d.ts +130 -0
- package/dist/deployment/graceful-shutdown.d.ts.map +1 -0
- package/dist/deployment/graceful-shutdown.js +271 -0
- package/dist/deployment/graceful-shutdown.js.map +1 -0
- package/dist/deployment/index.d.ts +14 -0
- package/dist/deployment/index.d.ts.map +1 -0
- package/dist/deployment/index.js +33 -0
- package/dist/deployment/index.js.map +1 -0
- package/dist/index.d.ts +39 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +174 -0
- package/dist/index.js.map +1 -0
- package/dist/security/adapter.d.ts +144 -0
- package/dist/security/adapter.d.ts.map +1 -0
- package/dist/security/adapter.js +159 -0
- package/dist/security/adapter.js.map +1 -0
- package/dist/security/auth/JWTPlugin.d.ts +105 -0
- package/dist/security/auth/JWTPlugin.d.ts.map +1 -0
- package/dist/security/auth/JWTPlugin.js +146 -0
- package/dist/security/auth/JWTPlugin.js.map +1 -0
- package/dist/security/auth/JWTProvider.d.ts +104 -0
- package/dist/security/auth/JWTProvider.d.ts.map +1 -0
- package/dist/security/auth/JWTProvider.js +288 -0
- package/dist/security/auth/JWTProvider.js.map +1 -0
- package/dist/security/auth/adapter.d.ts +8 -0
- package/dist/security/auth/adapter.d.ts.map +1 -0
- package/dist/security/auth/adapter.js +29 -0
- package/dist/security/auth/adapter.js.map +1 -0
- package/dist/security/auth/jwt.d.ts +55 -0
- package/dist/security/auth/jwt.d.ts.map +1 -0
- package/dist/security/auth/jwt.js +198 -0
- package/dist/security/auth/jwt.js.map +1 -0
- package/dist/security/auth/middleware.d.ts +64 -0
- package/dist/security/auth/middleware.d.ts.map +1 -0
- package/dist/security/auth/middleware.js +161 -0
- package/dist/security/auth/middleware.js.map +1 -0
- package/dist/security/csrf.d.ts +41 -0
- package/dist/security/csrf.d.ts.map +1 -0
- package/dist/security/csrf.js +185 -0
- package/dist/security/csrf.js.map +1 -0
- package/dist/security/headers.d.ts +34 -0
- package/dist/security/headers.d.ts.map +1 -0
- package/dist/security/headers.js +95 -0
- package/dist/security/headers.js.map +1 -0
- package/dist/security/index.d.ts +19 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +65 -0
- package/dist/security/index.js.map +1 -0
- package/dist/security/rate-limit/adapter.d.ts +7 -0
- package/dist/security/rate-limit/adapter.d.ts.map +1 -0
- package/dist/security/rate-limit/adapter.js +8 -0
- package/dist/security/rate-limit/adapter.js.map +1 -0
- package/dist/security/rate-limit/memory.d.ts +28 -0
- package/dist/security/rate-limit/memory.d.ts.map +1 -0
- package/dist/security/rate-limit/memory.js +85 -0
- package/dist/security/rate-limit/memory.js.map +1 -0
- package/dist/security/rate-limit/middleware.d.ts +32 -0
- package/dist/security/rate-limit/middleware.d.ts.map +1 -0
- package/dist/security/rate-limit/middleware.js +159 -0
- package/dist/security/rate-limit/middleware.js.map +1 -0
- package/dist/security/sanitization.d.ts +29 -0
- package/dist/security/sanitization.d.ts.map +1 -0
- package/dist/security/sanitization.js +66 -0
- package/dist/security/sanitization.js.map +1 -0
- package/dist/security/types.d.ts +205 -0
- package/dist/security/types.d.ts.map +1 -0
- package/dist/security/types.js +8 -0
- package/dist/security/types.js.map +1 -0
- package/dist/security/utils.d.ts +19 -0
- package/dist/security/utils.d.ts.map +1 -0
- package/dist/security/utils.js +43 -0
- package/dist/security/utils.js.map +1 -0
- package/documentation/01-getting-started.md +240 -0
- package/documentation/02-context.md +335 -0
- package/documentation/03-routing.md +397 -0
- package/documentation/04-middleware.md +483 -0
- package/documentation/05-validation.md +514 -0
- package/documentation/06-error-handling.md +465 -0
- package/documentation/07-performance.md +364 -0
- package/documentation/08-adapters.md +470 -0
- package/documentation/09-api-reference.md +548 -0
- package/documentation/10-examples.md +582 -0
- package/documentation/11-deployment.md +477 -0
- package/documentation/12-sentry.md +620 -0
- package/documentation/13-sentry-data-storage.md +996 -0
- package/documentation/14-sentry-data-reference.md +457 -0
- package/documentation/15-sentry-summary.md +409 -0
- package/documentation/16-alerts-system.md +745 -0
- package/documentation/17-alert-adapters.md +696 -0
- package/documentation/18-alerts-implementation-summary.md +385 -0
- package/documentation/19-class-based-routing.md +840 -0
- package/documentation/20-websocket-realtime.md +813 -0
- package/documentation/21-cache-system.md +510 -0
- package/documentation/22-job-queue.md +772 -0
- package/documentation/23-sentry-plugin.md +551 -0
- package/documentation/24-testing-utilities.md +1287 -0
- package/documentation/25-api-versioning.md +533 -0
- package/documentation/26-context-store.md +607 -0
- package/documentation/27-dependency-injection.md +329 -0
- package/documentation/28-lifecycle-hooks.md +521 -0
- package/documentation/29-package-structure.md +196 -0
- package/documentation/30-plugin-system.md +414 -0
- package/documentation/31-jwt-authentication.md +597 -0
- package/documentation/32-cli.md +268 -0
- package/documentation/ALERTS-COMPLETE-SUMMARY.md +429 -0
- package/documentation/ALERTS-INDEX.md +330 -0
- package/documentation/ALERTS-QUICK-REFERENCE.md +286 -0
- package/documentation/README.md +178 -0
- package/documentation/index.html +34 -0
- package/modern_framework_paper.md +1870 -0
- package/package.json +178 -0
- package/public/css/style.css +87 -0
- package/public/index.html +34 -0
- package/public/js/app.js +27 -0
- package/src/advanced/cache/InMemoryCacheStore.ts +68 -0
- package/src/advanced/cache/MultiTierCache.ts +194 -0
- package/src/advanced/cache/RedisCacheStore.ts +341 -0
- package/src/advanced/cache/index.ts +5 -0
- package/src/advanced/cache/types.ts +40 -0
- package/src/advanced/graphql/SimpleDataLoader.ts +42 -0
- package/src/advanced/graphql/index.ts +22 -0
- package/src/advanced/graphql/server.ts +252 -0
- package/src/advanced/graphql/types.ts +42 -0
- package/src/advanced/jobs/InMemoryQueueStore.ts +68 -0
- package/src/advanced/jobs/JobQueue.ts +556 -0
- package/src/advanced/jobs/RedisQueueStore.ts +367 -0
- package/src/advanced/jobs/index.ts +5 -0
- package/src/advanced/jobs/types.ts +70 -0
- package/src/advanced/observability/APMManager.ts +163 -0
- package/src/advanced/observability/AlertManager.ts +109 -0
- package/src/advanced/observability/MetricRegistry.ts +151 -0
- package/src/advanced/observability/ObservabilityCenter.ts +304 -0
- package/src/advanced/observability/StructuredLogger.ts +154 -0
- package/src/advanced/observability/TracingManager.ts +117 -0
- package/src/advanced/observability/adapters.ts +304 -0
- package/src/advanced/observability/createObservabilityMiddleware.ts +63 -0
- package/src/advanced/observability/index.ts +11 -0
- package/src/advanced/observability/types.ts +174 -0
- package/src/advanced/playground/extractPathParams.ts +6 -0
- package/src/advanced/playground/generateFieldExample.ts +31 -0
- package/src/advanced/playground/generatePlaygroundHTML.ts +1849 -0
- package/src/advanced/playground/generateSummary.ts +19 -0
- package/src/advanced/playground/getTagFromPath.ts +9 -0
- package/src/advanced/playground/index.ts +8 -0
- package/src/advanced/playground/playground.ts +170 -0
- package/src/advanced/playground/types.ts +20 -0
- package/src/advanced/playground/zodToExample.ts +16 -0
- package/src/advanced/playground/zodToParams.ts +15 -0
- package/src/advanced/postman/buildAuth.ts +31 -0
- package/src/advanced/postman/buildBody.ts +15 -0
- package/src/advanced/postman/buildQueryParams.ts +27 -0
- package/src/advanced/postman/buildRequestItem.ts +36 -0
- package/src/advanced/postman/buildResponses.ts +11 -0
- package/src/advanced/postman/buildUrl.ts +33 -0
- package/src/advanced/postman/capitalize.ts +4 -0
- package/src/advanced/postman/generateCollection.ts +59 -0
- package/src/advanced/postman/generateEnvironment.ts +34 -0
- package/src/advanced/postman/generateExampleFromZod.ts +21 -0
- package/src/advanced/postman/generateFieldExample.ts +45 -0
- package/src/advanced/postman/generateName.ts +20 -0
- package/src/advanced/postman/generateUUID.ts +11 -0
- package/src/advanced/postman/getTagFromPath.ts +10 -0
- package/src/advanced/postman/index.ts +28 -0
- package/src/advanced/postman/postman.ts +156 -0
- package/src/advanced/postman/slugify.ts +7 -0
- package/src/advanced/postman/types.ts +140 -0
- package/src/advanced/realtime/index.ts +18 -0
- package/src/advanced/realtime/websocket.ts +211 -0
- package/src/advanced/sentry/index.ts +1236 -0
- package/src/advanced/sentry/types.ts +355 -0
- package/src/advanced/static/generateDirectoryListing.ts +47 -0
- package/src/advanced/static/generateETag.ts +7 -0
- package/src/advanced/static/getMimeType.ts +9 -0
- package/src/advanced/static/index.ts +32 -0
- package/src/advanced/static/isSafePath.ts +13 -0
- package/src/advanced/static/publicDir.ts +21 -0
- package/src/advanced/static/serveStatic.ts +225 -0
- package/src/advanced/static/spa.ts +24 -0
- package/src/advanced/static/types.ts +159 -0
- package/src/advanced/swagger/SwaggerGenerator.ts +66 -0
- package/src/advanced/swagger/buildOperation.ts +61 -0
- package/src/advanced/swagger/buildParameters.ts +61 -0
- package/src/advanced/swagger/buildRequestBody.ts +21 -0
- package/src/advanced/swagger/buildResponses.ts +54 -0
- package/src/advanced/swagger/capitalize.ts +5 -0
- package/src/advanced/swagger/convertPath.ts +9 -0
- package/src/advanced/swagger/createSwagger.ts +12 -0
- package/src/advanced/swagger/generateOperationId.ts +21 -0
- package/src/advanced/swagger/generateSpec.ts +105 -0
- package/src/advanced/swagger/generateSummary.ts +24 -0
- package/src/advanced/swagger/generateSwaggerUI.ts +70 -0
- package/src/advanced/swagger/generateThemeCss.ts +53 -0
- package/src/advanced/swagger/index.ts +25 -0
- package/src/advanced/swagger/swagger.ts +237 -0
- package/src/advanced/swagger/types.ts +206 -0
- package/src/advanced/swagger/zodFieldToOpenAPI.ts +94 -0
- package/src/advanced/swagger/zodSchemaToOpenAPI.ts +50 -0
- package/src/advanced/swagger/zodToOpenAPI.ts +22 -0
- package/src/advanced/testing/factory.ts +509 -0
- package/src/advanced/testing/harness.ts +612 -0
- package/src/advanced/testing/index.ts +430 -0
- package/src/advanced/testing/load-test.ts +618 -0
- package/src/advanced/testing/mock-server.ts +498 -0
- package/src/advanced/testing/mock.ts +670 -0
- package/src/cli/bin.ts +9 -0
- package/src/cli/cli.ts +155 -0
- package/src/cli/commands/build.ts +73 -0
- package/src/cli/commands/create.ts +166 -0
- package/src/cli/commands/dev.ts +85 -0
- package/src/cli/commands/generate.ts +97 -0
- package/src/cli/commands/help.ts +95 -0
- package/src/cli/commands/init.ts +91 -0
- package/src/cli/commands/version.ts +38 -0
- package/src/cli/index.ts +6 -0
- package/src/cli/templates/generators.ts +309 -0
- package/src/cli/templates/index.ts +679 -0
- package/src/cli/utils/exec.ts +52 -0
- package/src/cli/utils/file-system.ts +78 -0
- package/src/cli/utils/logger.ts +111 -0
- package/src/core/adapter.ts +88 -0
- package/src/core/application.ts +1283 -0
- package/src/core/context-pool.ts +127 -0
- package/src/core/context.ts +412 -0
- package/src/core/index.ts +80 -0
- package/src/core/middleware.ts +262 -0
- package/src/core/performance/buffer-pool.ts +108 -0
- package/src/core/performance/middleware-optimizer.ts +162 -0
- package/src/core/plugin/PluginManager.ts +435 -0
- package/src/core/plugin/builder.ts +358 -0
- package/src/core/plugin/index.ts +50 -0
- package/src/core/plugin/types.ts +214 -0
- package/src/core/router/file-router.ts +594 -0
- package/src/core/router/index.ts +182 -0
- package/src/core/router/radix-tree.ts +226 -0
- package/src/core/store/index.ts +30 -0
- package/src/core/store/registry.ts +178 -0
- package/src/core/store/request-store.ts +240 -0
- package/src/core/store/types.ts +233 -0
- package/src/core/types.ts +574 -0
- package/src/database/adapter.ts +35 -0
- package/src/database/adapters/index.ts +1 -0
- package/src/database/adapters/mysql.ts +669 -0
- package/src/database/database.ts +70 -0
- package/src/database/dialect.ts +388 -0
- package/src/database/index.ts +12 -0
- package/src/database/migrations.ts +86 -0
- package/src/database/optimizer.ts +125 -0
- package/src/database/query-builder.ts +404 -0
- package/src/database/realtime.ts +53 -0
- package/src/database/schema.ts +71 -0
- package/src/database/transactions.ts +56 -0
- package/src/database/types.ts +87 -0
- package/src/deployment/cluster.ts +471 -0
- package/src/deployment/config.ts +454 -0
- package/src/deployment/docker.ts +599 -0
- package/src/deployment/graceful-shutdown.ts +373 -0
- package/src/deployment/index.ts +56 -0
- package/src/index.ts +264 -0
- package/src/security/adapter.ts +318 -0
- package/src/security/auth/JWTPlugin.ts +234 -0
- package/src/security/auth/JWTProvider.ts +316 -0
- package/src/security/auth/adapter.ts +12 -0
- package/src/security/auth/jwt.ts +234 -0
- package/src/security/auth/middleware.ts +188 -0
- package/src/security/csrf.ts +220 -0
- package/src/security/headers.ts +108 -0
- package/src/security/index.ts +60 -0
- package/src/security/rate-limit/adapter.ts +7 -0
- package/src/security/rate-limit/memory.ts +108 -0
- package/src/security/rate-limit/middleware.ts +181 -0
- package/src/security/sanitization.ts +75 -0
- package/src/security/types.ts +240 -0
- package/src/security/utils.ts +52 -0
- package/tsconfig.json +39 -0
|
@@ -0,0 +1,1111 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Main application class
|
|
4
|
+
* Orchestrates all framework components
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.Application = void 0;
|
|
8
|
+
exports.createApp = createApp;
|
|
9
|
+
const http_1 = require("http");
|
|
10
|
+
const router_1 = require("./router");
|
|
11
|
+
const context_pool_1 = require("./context-pool");
|
|
12
|
+
const middleware_1 = require("./middleware");
|
|
13
|
+
const types_1 = require("./types");
|
|
14
|
+
const adapter_1 = require("./adapter");
|
|
15
|
+
const plugin_1 = require("./plugin");
|
|
16
|
+
const file_router_1 = require("./router/file-router");
|
|
17
|
+
const createObservabilityMiddleware_1 = require("../advanced/observability/createObservabilityMiddleware");
|
|
18
|
+
const ObservabilityCenter_1 = require("../advanced/observability/ObservabilityCenter");
|
|
19
|
+
const deployment_1 = require("../deployment");
|
|
20
|
+
const websocket_1 = require("../advanced/realtime/websocket");
|
|
21
|
+
const store_1 = require("./store");
|
|
22
|
+
/**
|
|
23
|
+
* Default error handler
|
|
24
|
+
*/
|
|
25
|
+
const defaultErrorHandler = (error, ctx) => {
|
|
26
|
+
// Only log unexpected errors, not intentional ones (returned from handler)
|
|
27
|
+
if (!error._isIntentional) {
|
|
28
|
+
console.error('Unhandled error:', error);
|
|
29
|
+
console.error('Path:', ctx.path, 'Method:', ctx.method);
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
statusCode: 500,
|
|
33
|
+
headers: { 'Content-Type': 'application/json' },
|
|
34
|
+
body: JSON.stringify({
|
|
35
|
+
error: error.message || 'Internal Server Error',
|
|
36
|
+
stack: process.env.NODE_ENV === 'development' && !error._isIntentional ? error.stack : undefined
|
|
37
|
+
})
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Application class
|
|
42
|
+
*/
|
|
43
|
+
class Application {
|
|
44
|
+
router;
|
|
45
|
+
contextPool;
|
|
46
|
+
middlewareExecutor;
|
|
47
|
+
globalMiddlewares = [];
|
|
48
|
+
errorHandler;
|
|
49
|
+
server;
|
|
50
|
+
config;
|
|
51
|
+
adapters;
|
|
52
|
+
shutdownManager;
|
|
53
|
+
clusterManager;
|
|
54
|
+
fallbackHandler;
|
|
55
|
+
wsGateway;
|
|
56
|
+
// Dependency injection container
|
|
57
|
+
dependencies = {};
|
|
58
|
+
// Versioning properties
|
|
59
|
+
versioningConfig;
|
|
60
|
+
registeredVersions = new Set();
|
|
61
|
+
// Store registry for ContextStore system
|
|
62
|
+
storeRegistry;
|
|
63
|
+
// Plugin manager for advanced plugins
|
|
64
|
+
pluginManager;
|
|
65
|
+
// Lifecycle hooks
|
|
66
|
+
lifecycleHooks = {};
|
|
67
|
+
constructor(config = {}) {
|
|
68
|
+
this.config = {
|
|
69
|
+
contextPoolSize: 100,
|
|
70
|
+
enableJIT: true,
|
|
71
|
+
debug: false,
|
|
72
|
+
logRequests: true,
|
|
73
|
+
...config
|
|
74
|
+
};
|
|
75
|
+
this.router = new router_1.Router();
|
|
76
|
+
this.contextPool = new context_pool_1.ContextPool(this.config.contextPoolSize);
|
|
77
|
+
this.middlewareExecutor = new middleware_1.MiddlewareExecutor();
|
|
78
|
+
this.errorHandler = config.onError || defaultErrorHandler;
|
|
79
|
+
this.adapters = new adapter_1.AdapterRegistry();
|
|
80
|
+
this.storeRegistry = new store_1.StoreRegistry({ debug: config.debug });
|
|
81
|
+
this.pluginManager = new plugin_1.PluginManager(this, { debug: config.debug });
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Register lifecycle hooks for request processing
|
|
85
|
+
* Hooks are called at specific points during request lifecycle
|
|
86
|
+
*
|
|
87
|
+
* @example
|
|
88
|
+
* ```typescript
|
|
89
|
+
* app.hooks({
|
|
90
|
+
* onRequest: async (ctx) => {
|
|
91
|
+
* ctx.requestId = crypto.randomUUID();
|
|
92
|
+
* console.log(`[${ctx.requestId}] ${ctx.method} ${ctx.path}`);
|
|
93
|
+
* },
|
|
94
|
+
*
|
|
95
|
+
* beforeValidation: async (ctx) => {
|
|
96
|
+
* // Transform raw body before validation
|
|
97
|
+
* if (ctx.body?.data) {
|
|
98
|
+
* ctx.body = ctx.body.data;
|
|
99
|
+
* }
|
|
100
|
+
* },
|
|
101
|
+
*
|
|
102
|
+
* afterValidation: async (ctx) => {
|
|
103
|
+
* // Check authorization after body is validated
|
|
104
|
+
* if (!ctx.headers.authorization) {
|
|
105
|
+
* return ctx.response.status(401).json({ error: 'Unauthorized' });
|
|
106
|
+
* }
|
|
107
|
+
* },
|
|
108
|
+
*
|
|
109
|
+
* beforeHandler: async (ctx) => {
|
|
110
|
+
* // Load user from session
|
|
111
|
+
* ctx.user = await getUserFromToken(ctx.headers.authorization);
|
|
112
|
+
* },
|
|
113
|
+
*
|
|
114
|
+
* afterHandler: async (ctx, result) => {
|
|
115
|
+
* // Add metadata to all responses
|
|
116
|
+
* return { ...result, timestamp: Date.now(), requestId: ctx.requestId };
|
|
117
|
+
* },
|
|
118
|
+
*
|
|
119
|
+
* onError: async (ctx, error) => {
|
|
120
|
+
* // Log errors to external service
|
|
121
|
+
* await logToSentry(error, { requestId: ctx.requestId });
|
|
122
|
+
* },
|
|
123
|
+
*
|
|
124
|
+
* onResponse: async (ctx, response) => {
|
|
125
|
+
* console.log(`[${ctx.requestId}] Response: ${response.statusCode}`);
|
|
126
|
+
* }
|
|
127
|
+
* });
|
|
128
|
+
* ```
|
|
129
|
+
*/
|
|
130
|
+
hooks(hooks) {
|
|
131
|
+
this.lifecycleHooks = { ...this.lifecycleHooks, ...hooks };
|
|
132
|
+
return this;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Set a fallback handler for unmatched routes (e.g., static files)
|
|
136
|
+
* Called before returning 404
|
|
137
|
+
*/
|
|
138
|
+
setFallbackHandler(handler) {
|
|
139
|
+
this.fallbackHandler = handler;
|
|
140
|
+
return this;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Provide dependencies for injection into route handlers
|
|
144
|
+
* Dependencies are available via the second parameter in handlers
|
|
145
|
+
*
|
|
146
|
+
* @example
|
|
147
|
+
* ```typescript
|
|
148
|
+
* const db = new Database();
|
|
149
|
+
* const cache = new Redis();
|
|
150
|
+
* const mailer = new Mailer();
|
|
151
|
+
*
|
|
152
|
+
* const app = createApp()
|
|
153
|
+
* .provide({ db, cache, mailer });
|
|
154
|
+
*
|
|
155
|
+
* // Use with inject option
|
|
156
|
+
* app.get('/users', {
|
|
157
|
+
* inject: ['db', 'cache'],
|
|
158
|
+
* handler: async (ctx, { db, cache }) => {
|
|
159
|
+
* // db and cache are fully typed!
|
|
160
|
+
* const users = await db.query('SELECT * FROM users');
|
|
161
|
+
* await cache.set('users', users);
|
|
162
|
+
* return { users };
|
|
163
|
+
* }
|
|
164
|
+
* });
|
|
165
|
+
*
|
|
166
|
+
* // Or access all dependencies
|
|
167
|
+
* app.get('/mail', async (ctx, deps) => {
|
|
168
|
+
* await deps.mailer.send({ to: 'user@example.com', subject: 'Hello' });
|
|
169
|
+
* return { sent: true };
|
|
170
|
+
* });
|
|
171
|
+
* ```
|
|
172
|
+
*/
|
|
173
|
+
provide(deps) {
|
|
174
|
+
this.dependencies = { ...this.dependencies, ...deps };
|
|
175
|
+
return this;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Get a specific dependency by name
|
|
179
|
+
*
|
|
180
|
+
* @example
|
|
181
|
+
* ```typescript
|
|
182
|
+
* const db = app.getDep('db');
|
|
183
|
+
* ```
|
|
184
|
+
*/
|
|
185
|
+
getDep(name) {
|
|
186
|
+
return this.dependencies[name];
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Get all registered dependencies
|
|
190
|
+
*/
|
|
191
|
+
getDeps() {
|
|
192
|
+
return this.dependencies;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Configure API versioning
|
|
196
|
+
*
|
|
197
|
+
* @example
|
|
198
|
+
* ```typescript
|
|
199
|
+
* app.configVersions({
|
|
200
|
+
* strategies: ['header', 'query'],
|
|
201
|
+
* header: 'api-version',
|
|
202
|
+
* queryParam: 'v',
|
|
203
|
+
* defaultVersion: 'v1',
|
|
204
|
+
* register: ['v1', 'v2']
|
|
205
|
+
* });
|
|
206
|
+
*
|
|
207
|
+
* // Route tanpa prefix → otomatis jadi /{defaultVersion}/login
|
|
208
|
+
* app.post('/login', handler);
|
|
209
|
+
*
|
|
210
|
+
* // Route dengan prefix explicit
|
|
211
|
+
* app.post('/v2/login', handler);
|
|
212
|
+
* ```
|
|
213
|
+
*/
|
|
214
|
+
configVersions(config) {
|
|
215
|
+
this.versioningConfig = {
|
|
216
|
+
header: 'api-version',
|
|
217
|
+
queryParam: 'v',
|
|
218
|
+
...config
|
|
219
|
+
};
|
|
220
|
+
// Register all versions
|
|
221
|
+
config.register.forEach(v => this.registeredVersions.add(v));
|
|
222
|
+
return this;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Check if a path starts with a registered version prefix
|
|
226
|
+
*/
|
|
227
|
+
hasVersionPrefix(path) {
|
|
228
|
+
const segment = path.split('/').filter(Boolean)[0];
|
|
229
|
+
if (segment && this.registeredVersions.has(segment)) {
|
|
230
|
+
return segment;
|
|
231
|
+
}
|
|
232
|
+
return null;
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Resolve version from request context
|
|
236
|
+
*/
|
|
237
|
+
resolveVersion(ctx) {
|
|
238
|
+
if (!this.versioningConfig) {
|
|
239
|
+
return { version: '', basePath: ctx.path, source: 'default' };
|
|
240
|
+
}
|
|
241
|
+
const { strategies, header, queryParam, defaultVersion } = this.versioningConfig;
|
|
242
|
+
// 1. Check path strategy: /v1/login
|
|
243
|
+
if (strategies.includes('path')) {
|
|
244
|
+
const versionPrefix = this.hasVersionPrefix(ctx.path);
|
|
245
|
+
if (versionPrefix) {
|
|
246
|
+
const basePath = ctx.path.replace(new RegExp(`^/${versionPrefix}`), '') || '/';
|
|
247
|
+
return { version: versionPrefix, basePath, source: 'path' };
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
// 2. Check header strategy
|
|
251
|
+
if (strategies.includes('header') && header) {
|
|
252
|
+
const headerValue = ctx.headers[header] || ctx.headers[header.toLowerCase()];
|
|
253
|
+
const version = Array.isArray(headerValue) ? headerValue[0] : headerValue;
|
|
254
|
+
if (version && this.registeredVersions.has(version)) {
|
|
255
|
+
return { version, basePath: ctx.path, source: 'header' };
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
// 3. Check query strategy
|
|
259
|
+
if (strategies.includes('query') && queryParam) {
|
|
260
|
+
const queryVersion = ctx.query?.[queryParam];
|
|
261
|
+
const version = Array.isArray(queryVersion) ? queryVersion[0] : queryVersion;
|
|
262
|
+
if (version && this.registeredVersions.has(version)) {
|
|
263
|
+
return { version, basePath: ctx.path, source: 'query' };
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
// 4. Default version
|
|
267
|
+
return { version: defaultVersion, basePath: ctx.path, source: 'default' };
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Build versioned path for route registration
|
|
271
|
+
*/
|
|
272
|
+
buildVersionedPath(path) {
|
|
273
|
+
if (!this.versioningConfig)
|
|
274
|
+
return path;
|
|
275
|
+
// If path already has version prefix, return as-is
|
|
276
|
+
if (this.hasVersionPrefix(path)) {
|
|
277
|
+
return path;
|
|
278
|
+
}
|
|
279
|
+
// Add default version prefix
|
|
280
|
+
const normalizedPath = path.startsWith('/') ? path : `/${path}`;
|
|
281
|
+
return `/${this.versioningConfig.defaultVersion}${normalizedPath}`;
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Add global middleware
|
|
285
|
+
*/
|
|
286
|
+
use(middleware) {
|
|
287
|
+
this.globalMiddlewares.push(middleware);
|
|
288
|
+
return this;
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Register ContextStore classes
|
|
292
|
+
* Stores are singleton instances accessible via ctx.store(StoreClass)
|
|
293
|
+
*
|
|
294
|
+
* @example
|
|
295
|
+
* ```typescript
|
|
296
|
+
* class UserStore extends ContextStore<UserState> {
|
|
297
|
+
* protected initial() { return { users: [], loading: false }; }
|
|
298
|
+
*
|
|
299
|
+
* async fetchUsers() {
|
|
300
|
+
* this.update({ loading: true });
|
|
301
|
+
* const users = await api.getUsers();
|
|
302
|
+
* this.set({ users, loading: false });
|
|
303
|
+
* }
|
|
304
|
+
* }
|
|
305
|
+
*
|
|
306
|
+
* const app = createApp();
|
|
307
|
+
* app.stores([UserStore, ProductStore]);
|
|
308
|
+
*
|
|
309
|
+
* app.get('/users', async (ctx) => {
|
|
310
|
+
* const userStore = ctx.store(UserStore);
|
|
311
|
+
* return { users: userStore.state.users };
|
|
312
|
+
* });
|
|
313
|
+
* ```
|
|
314
|
+
*/
|
|
315
|
+
stores(storeClasses) {
|
|
316
|
+
this.storeRegistry.registerAll(storeClasses);
|
|
317
|
+
return this;
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Register a single ContextStore class
|
|
321
|
+
*
|
|
322
|
+
* @example
|
|
323
|
+
* ```typescript
|
|
324
|
+
* app.store(UserStore);
|
|
325
|
+
* ```
|
|
326
|
+
*/
|
|
327
|
+
store(StoreClass) {
|
|
328
|
+
this.storeRegistry.register(StoreClass);
|
|
329
|
+
return this;
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* Get a store instance directly from application level
|
|
333
|
+
* Useful for accessing stores outside of request context
|
|
334
|
+
*
|
|
335
|
+
* @example
|
|
336
|
+
* ```typescript
|
|
337
|
+
* const userStore = app.getStore(UserStore);
|
|
338
|
+
* userStore.listen((state) => console.log('Users updated:', state));
|
|
339
|
+
* ```
|
|
340
|
+
*/
|
|
341
|
+
getStore(StoreClass) {
|
|
342
|
+
return this.storeRegistry.get(StoreClass);
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* Get the store registry for advanced usage
|
|
346
|
+
*/
|
|
347
|
+
getStoreRegistry() {
|
|
348
|
+
return this.storeRegistry;
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Register a route
|
|
352
|
+
*/
|
|
353
|
+
route(config) {
|
|
354
|
+
this.router.addRoute(config);
|
|
355
|
+
return this;
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* Convenience: GET route
|
|
359
|
+
* Supports both function-style and class-based routing
|
|
360
|
+
*
|
|
361
|
+
* @example
|
|
362
|
+
* ```typescript
|
|
363
|
+
* // Function style (with dependencies)
|
|
364
|
+
* app.get('/users', async (ctx, { db }) => ({ users: await db.getUsers() }));
|
|
365
|
+
*
|
|
366
|
+
* // Config style with inject
|
|
367
|
+
* app.get('/users', {
|
|
368
|
+
* inject: ['db', 'cache'],
|
|
369
|
+
* handler: async (ctx, { db, cache }) => ({ users: [] }),
|
|
370
|
+
* meta: {...}
|
|
371
|
+
* });
|
|
372
|
+
*
|
|
373
|
+
* // Class-based style
|
|
374
|
+
* app.get(new UserListRoute());
|
|
375
|
+
* ```
|
|
376
|
+
*/
|
|
377
|
+
get(pathOrRoute, handlerOrConfig) {
|
|
378
|
+
// Class-based routing
|
|
379
|
+
if (typeof pathOrRoute === 'object' && ('pathName' in pathOrRoute || 'handler' in pathOrRoute)) {
|
|
380
|
+
return this.registerClassRoute('GET', pathOrRoute);
|
|
381
|
+
}
|
|
382
|
+
return this.registerVersionedRoute('GET', pathOrRoute, handlerOrConfig);
|
|
383
|
+
}
|
|
384
|
+
/**
|
|
385
|
+
* Convenience: POST route
|
|
386
|
+
* Supports both function-style and class-based routing
|
|
387
|
+
*/
|
|
388
|
+
post(pathOrRoute, handlerOrConfig) {
|
|
389
|
+
// Class-based routing
|
|
390
|
+
if (typeof pathOrRoute === 'object' && ('pathName' in pathOrRoute || 'handler' in pathOrRoute)) {
|
|
391
|
+
return this.registerClassRoute('POST', pathOrRoute);
|
|
392
|
+
}
|
|
393
|
+
return this.registerVersionedRoute('POST', pathOrRoute, handlerOrConfig);
|
|
394
|
+
}
|
|
395
|
+
/**
|
|
396
|
+
* Convenience: PUT route
|
|
397
|
+
* Supports both function-style and class-based routing
|
|
398
|
+
*/
|
|
399
|
+
put(pathOrRoute, handlerOrConfig) {
|
|
400
|
+
// Class-based routing
|
|
401
|
+
if (typeof pathOrRoute === 'object' && ('pathName' in pathOrRoute || 'handler' in pathOrRoute)) {
|
|
402
|
+
return this.registerClassRoute('PUT', pathOrRoute);
|
|
403
|
+
}
|
|
404
|
+
return this.registerVersionedRoute('PUT', pathOrRoute, handlerOrConfig);
|
|
405
|
+
}
|
|
406
|
+
/**
|
|
407
|
+
* Convenience: DELETE route
|
|
408
|
+
* Supports both function-style and class-based routing
|
|
409
|
+
*/
|
|
410
|
+
delete(pathOrRoute, handlerOrConfig) {
|
|
411
|
+
// Class-based routing
|
|
412
|
+
if (typeof pathOrRoute === 'object' && ('pathName' in pathOrRoute || 'handler' in pathOrRoute)) {
|
|
413
|
+
return this.registerClassRoute('DELETE', pathOrRoute);
|
|
414
|
+
}
|
|
415
|
+
return this.registerVersionedRoute('DELETE', pathOrRoute, handlerOrConfig);
|
|
416
|
+
}
|
|
417
|
+
/**
|
|
418
|
+
* Convenience: PATCH route
|
|
419
|
+
* Supports both function-style and class-based routing
|
|
420
|
+
*/
|
|
421
|
+
patch(pathOrRoute, handlerOrConfig) {
|
|
422
|
+
// Class-based routing
|
|
423
|
+
if (typeof pathOrRoute === 'object' && ('pathName' in pathOrRoute || 'handler' in pathOrRoute)) {
|
|
424
|
+
return this.registerClassRoute('PATCH', pathOrRoute);
|
|
425
|
+
}
|
|
426
|
+
return this.registerVersionedRoute('PATCH', pathOrRoute, handlerOrConfig);
|
|
427
|
+
}
|
|
428
|
+
/**
|
|
429
|
+
* Register a versioned route (internal)
|
|
430
|
+
*/
|
|
431
|
+
registerVersionedRoute(method, path, handlerOrConfig) {
|
|
432
|
+
// Build versioned path if versioning is configured
|
|
433
|
+
const versionedPath = this.buildVersionedPath(path);
|
|
434
|
+
if (typeof handlerOrConfig === 'function') {
|
|
435
|
+
// Function handler - wrap to inject all dependencies
|
|
436
|
+
const originalHandler = handlerOrConfig;
|
|
437
|
+
const deps = this.dependencies;
|
|
438
|
+
const wrappedHandler = async (ctx) => originalHandler(ctx, deps);
|
|
439
|
+
this.router.addRoute({ method, path: versionedPath, handler: wrappedHandler });
|
|
440
|
+
}
|
|
441
|
+
else if (handlerOrConfig) {
|
|
442
|
+
// Config object with possible inject option
|
|
443
|
+
const config = handlerOrConfig;
|
|
444
|
+
const originalHandler = config.handler;
|
|
445
|
+
const allDeps = this.dependencies;
|
|
446
|
+
const injectKeys = config.inject;
|
|
447
|
+
// Create wrapped handler that injects dependencies
|
|
448
|
+
const wrappedHandler = async (ctx) => {
|
|
449
|
+
let injectedDeps;
|
|
450
|
+
if (injectKeys && injectKeys.length > 0) {
|
|
451
|
+
// Only inject specified dependencies
|
|
452
|
+
injectedDeps = {};
|
|
453
|
+
for (const key of injectKeys) {
|
|
454
|
+
injectedDeps[key] = allDeps[key];
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
else {
|
|
458
|
+
// Inject all dependencies
|
|
459
|
+
injectedDeps = allDeps;
|
|
460
|
+
}
|
|
461
|
+
return originalHandler(ctx, injectedDeps);
|
|
462
|
+
};
|
|
463
|
+
this.router.addRoute({
|
|
464
|
+
method,
|
|
465
|
+
path: versionedPath,
|
|
466
|
+
handler: wrappedHandler,
|
|
467
|
+
middlewares: config.middlewares,
|
|
468
|
+
schema: config.schema,
|
|
469
|
+
meta: config.meta
|
|
470
|
+
});
|
|
471
|
+
}
|
|
472
|
+
return this;
|
|
473
|
+
}
|
|
474
|
+
/**
|
|
475
|
+
* Register a class-based route with lifecycle hooks support and dependency injection
|
|
476
|
+
*/
|
|
477
|
+
registerClassRoute(method, route) {
|
|
478
|
+
// ⚠️ ENFORCE: Route class MUST extend Route abstract class
|
|
479
|
+
if (!(route instanceof types_1.Route)) {
|
|
480
|
+
const className = route.constructor?.name || 'Unknown';
|
|
481
|
+
throw new Error(`Route class "${className}" must extend the Route abstract class.\n` +
|
|
482
|
+
`Example:\n` +
|
|
483
|
+
` import { Route } from 'nexus';\n` +
|
|
484
|
+
` class ${className} extends Route {\n` +
|
|
485
|
+
` pathName = '/your/path';\n` +
|
|
486
|
+
` async handler(ctx) { ... }\n` +
|
|
487
|
+
` }`);
|
|
488
|
+
}
|
|
489
|
+
if (!route.pathName) {
|
|
490
|
+
throw new Error(`Route class must have a pathName property when using manual registration. ` +
|
|
491
|
+
`Use app.useFileRoutes() for file-based routing without pathName.`);
|
|
492
|
+
}
|
|
493
|
+
// Determine the handler - either the handler method or the method-specific handler
|
|
494
|
+
let originalHandler = route.handler;
|
|
495
|
+
if (!originalHandler && typeof route[method] === 'function') {
|
|
496
|
+
originalHandler = route[method].bind(route);
|
|
497
|
+
}
|
|
498
|
+
if (!originalHandler) {
|
|
499
|
+
throw new Error(`Route class must have a handler method or a ${method} method.`);
|
|
500
|
+
}
|
|
501
|
+
// Wrap handler with lifecycle hooks if route extends Route class
|
|
502
|
+
const routeInstance = route;
|
|
503
|
+
const hasHooks = typeof routeInstance.onBefore === 'function' ||
|
|
504
|
+
typeof routeInstance.onAfter === 'function' ||
|
|
505
|
+
typeof routeInstance.onError === 'function';
|
|
506
|
+
// Capture dependencies for injection
|
|
507
|
+
const deps = this.dependencies;
|
|
508
|
+
let finalHandler;
|
|
509
|
+
if (hasHooks) {
|
|
510
|
+
const boundOriginalHandler = originalHandler.bind(route);
|
|
511
|
+
const onBefore = routeInstance.onBefore?.bind(route);
|
|
512
|
+
const onAfter = routeInstance.onAfter?.bind(route);
|
|
513
|
+
const onError = routeInstance.onError?.bind(route);
|
|
514
|
+
finalHandler = async (ctx) => {
|
|
515
|
+
try {
|
|
516
|
+
// Run onBefore hook (with deps)
|
|
517
|
+
if (onBefore) {
|
|
518
|
+
const beforeResult = await onBefore(ctx, deps);
|
|
519
|
+
// If onBefore returns a value (not undefined), skip handler
|
|
520
|
+
if (beforeResult !== undefined) {
|
|
521
|
+
return beforeResult;
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
// Run the main handler with dependencies
|
|
525
|
+
let result = await boundOriginalHandler(ctx, deps);
|
|
526
|
+
// Run onAfter hook (with deps)
|
|
527
|
+
if (onAfter) {
|
|
528
|
+
result = await onAfter(ctx, result, deps);
|
|
529
|
+
}
|
|
530
|
+
return result;
|
|
531
|
+
}
|
|
532
|
+
catch (error) {
|
|
533
|
+
// Run onError hook if defined (with deps)
|
|
534
|
+
if (onError) {
|
|
535
|
+
return await onError(ctx, error, deps);
|
|
536
|
+
}
|
|
537
|
+
// Re-throw if no onError handler
|
|
538
|
+
throw error;
|
|
539
|
+
}
|
|
540
|
+
};
|
|
541
|
+
}
|
|
542
|
+
else {
|
|
543
|
+
// No hooks - just wrap with dependency injection
|
|
544
|
+
const boundHandler = originalHandler.bind(route);
|
|
545
|
+
finalHandler = async (ctx) => boundHandler(ctx, deps);
|
|
546
|
+
}
|
|
547
|
+
const config = {
|
|
548
|
+
method,
|
|
549
|
+
path: route.pathName,
|
|
550
|
+
handler: finalHandler,
|
|
551
|
+
schema: route.schema?.(),
|
|
552
|
+
meta: route.meta?.(),
|
|
553
|
+
middlewares: route.middlewares?.()
|
|
554
|
+
};
|
|
555
|
+
this.router.addRoute(config);
|
|
556
|
+
return this;
|
|
557
|
+
}
|
|
558
|
+
/**
|
|
559
|
+
* Register a WebSocket route
|
|
560
|
+
*
|
|
561
|
+
* @example
|
|
562
|
+
* ```typescript
|
|
563
|
+
* app.ws('/ws/chat', {
|
|
564
|
+
* auth: async (ctx) => validateToken(ctx.query.token),
|
|
565
|
+
* onConnect: async (socket, ctx) => {
|
|
566
|
+
* console.log('User connected:', ctx.user);
|
|
567
|
+
* },
|
|
568
|
+
* onMessage: async (socket, message, ctx) => {
|
|
569
|
+
* socket.send(JSON.stringify({ echo: message }));
|
|
570
|
+
* },
|
|
571
|
+
* onClose: async (socket, ctx) => {
|
|
572
|
+
* console.log('User disconnected');
|
|
573
|
+
* }
|
|
574
|
+
* });
|
|
575
|
+
* ```
|
|
576
|
+
*/
|
|
577
|
+
ws(path, config) {
|
|
578
|
+
if (!this.wsGateway) {
|
|
579
|
+
this.wsGateway = new websocket_1.WebSocketGateway();
|
|
580
|
+
}
|
|
581
|
+
this.wsGateway.register(path, config);
|
|
582
|
+
return this;
|
|
583
|
+
}
|
|
584
|
+
/**
|
|
585
|
+
* Get the WebSocket gateway for advanced usage (rooms, broadcast, etc.)
|
|
586
|
+
*
|
|
587
|
+
* @example
|
|
588
|
+
* ```typescript
|
|
589
|
+
* const ws = app.getWebSocket();
|
|
590
|
+
* ws.broadcast('room-name', { type: 'notification', message: 'Hello!' });
|
|
591
|
+
* ws.joinRoom('room-name', socket);
|
|
592
|
+
* ```
|
|
593
|
+
*/
|
|
594
|
+
getWebSocket() {
|
|
595
|
+
return this.wsGateway;
|
|
596
|
+
}
|
|
597
|
+
/**
|
|
598
|
+
* Use file-based routing (Next.js style)
|
|
599
|
+
*
|
|
600
|
+
* Automatically scans a directory and registers routes based on file/folder structure.
|
|
601
|
+
* Supports dynamic parameters [id], catch-all [...slug], and nested routes.
|
|
602
|
+
*
|
|
603
|
+
* @example
|
|
604
|
+
* ```typescript
|
|
605
|
+
* // Folder structure:
|
|
606
|
+
* // routes/
|
|
607
|
+
* // api/
|
|
608
|
+
* // users/
|
|
609
|
+
* // index.ts → GET/POST /api/users
|
|
610
|
+
* // [id]/
|
|
611
|
+
* // index.ts → GET/PUT/DELETE /api/users/:id
|
|
612
|
+
* // posts.ts → GET /api/users/:id/posts
|
|
613
|
+
*
|
|
614
|
+
* const app = createApp();
|
|
615
|
+
*
|
|
616
|
+
* await app.useFileRoutes({
|
|
617
|
+
* dir: './src/routes',
|
|
618
|
+
* prefix: '',
|
|
619
|
+
* debug: true
|
|
620
|
+
* });
|
|
621
|
+
*
|
|
622
|
+
* app.listen(3000);
|
|
623
|
+
* ```
|
|
624
|
+
*
|
|
625
|
+
* Route file format (function-style):
|
|
626
|
+
* ```typescript
|
|
627
|
+
* // routes/api/users/index.ts
|
|
628
|
+
* import { Context } from '@engjts/nexus';
|
|
629
|
+
*
|
|
630
|
+
* export async function GET(ctx: Context) {
|
|
631
|
+
* return ctx.json({ users: [] });
|
|
632
|
+
* }
|
|
633
|
+
*
|
|
634
|
+
* export async function POST(ctx: Context) {
|
|
635
|
+
* const body = ctx.body;
|
|
636
|
+
* return ctx.json({ created: body }, 201);
|
|
637
|
+
* }
|
|
638
|
+
*
|
|
639
|
+
* export const schema = { body: z.object({ name: z.string() }) };
|
|
640
|
+
* export const meta = { summary: 'User endpoints', tags: ['Users'] };
|
|
641
|
+
* ```
|
|
642
|
+
*
|
|
643
|
+
* Route file format (class-style):
|
|
644
|
+
* ```typescript
|
|
645
|
+
* // routes/api/users/[id]/index.ts
|
|
646
|
+
* import { RouteBase, Context } from '@engjts/nexus';
|
|
647
|
+
*
|
|
648
|
+
* export default class UserRoute implements RouteBase {
|
|
649
|
+
* method = ['GET', 'PUT', 'DELETE'] as const;
|
|
650
|
+
*
|
|
651
|
+
* async GET(ctx: Context) {
|
|
652
|
+
* return ctx.json({ user: { id: ctx.params.id } });
|
|
653
|
+
* }
|
|
654
|
+
*
|
|
655
|
+
* async PUT(ctx: Context) {
|
|
656
|
+
* return ctx.json({ updated: true });
|
|
657
|
+
* }
|
|
658
|
+
*
|
|
659
|
+
* async DELETE(ctx: Context) {
|
|
660
|
+
* return ctx.json({ deleted: true });
|
|
661
|
+
* }
|
|
662
|
+
* }
|
|
663
|
+
* ```
|
|
664
|
+
*/
|
|
665
|
+
async useFileRoutes(options) {
|
|
666
|
+
const router = new file_router_1.FileRouter(options);
|
|
667
|
+
await router.register(this);
|
|
668
|
+
return this;
|
|
669
|
+
}
|
|
670
|
+
/**
|
|
671
|
+
* Set custom error handler
|
|
672
|
+
*/
|
|
673
|
+
onError(handler) {
|
|
674
|
+
this.errorHandler = handler;
|
|
675
|
+
return this;
|
|
676
|
+
}
|
|
677
|
+
/**
|
|
678
|
+
* Install a plugin (supports both legacy and new plugin formats)
|
|
679
|
+
*
|
|
680
|
+
* @example
|
|
681
|
+
* ```typescript
|
|
682
|
+
* // Legacy plugin
|
|
683
|
+
* app.plugin({ name: 'my-plugin', version: '1.0.0', install: (app) => {} });
|
|
684
|
+
*
|
|
685
|
+
* // New advanced plugin
|
|
686
|
+
* const authPlugin = definePlugin('auth')
|
|
687
|
+
* .version('1.0.0')
|
|
688
|
+
* .config<{ secret: string }>()
|
|
689
|
+
* .register(ctx => ctx.app.use(jwtMiddleware))
|
|
690
|
+
* .build();
|
|
691
|
+
*
|
|
692
|
+
* app.plugin(authPlugin, { secret: 'my-secret' });
|
|
693
|
+
* ```
|
|
694
|
+
*/
|
|
695
|
+
plugin(plugin, config) {
|
|
696
|
+
// Check if it's a legacy Plugin with install method directly on app
|
|
697
|
+
if ('install' in plugin && !('meta' in plugin)) {
|
|
698
|
+
// Legacy format - call install directly
|
|
699
|
+
plugin.install(this);
|
|
700
|
+
}
|
|
701
|
+
else {
|
|
702
|
+
// New plugin format - use PluginManager
|
|
703
|
+
this.pluginManager.add(plugin, config);
|
|
704
|
+
}
|
|
705
|
+
return this;
|
|
706
|
+
}
|
|
707
|
+
/**
|
|
708
|
+
* Get the plugin manager for advanced plugin operations
|
|
709
|
+
*
|
|
710
|
+
* @example
|
|
711
|
+
* ```typescript
|
|
712
|
+
* const pm = app.getPluginManager();
|
|
713
|
+
*
|
|
714
|
+
* // Check if plugin exists
|
|
715
|
+
* if (pm.has('auth-plugin')) {
|
|
716
|
+
* const authApi = pm.getExports<AuthAPI>('auth-plugin');
|
|
717
|
+
* authApi.verify(token);
|
|
718
|
+
* }
|
|
719
|
+
*
|
|
720
|
+
* // Listen to plugin events
|
|
721
|
+
* pm.on('plugin:ready', (meta) => {
|
|
722
|
+
* console.log(`Plugin ${meta.name} is ready`);
|
|
723
|
+
* });
|
|
724
|
+
* ```
|
|
725
|
+
*/
|
|
726
|
+
getPluginManager() {
|
|
727
|
+
return this.pluginManager;
|
|
728
|
+
}
|
|
729
|
+
/**
|
|
730
|
+
* Get exports from a specific plugin
|
|
731
|
+
* Shorthand for getPluginManager().getExports()
|
|
732
|
+
*/
|
|
733
|
+
getPluginExports(pluginName) {
|
|
734
|
+
return this.pluginManager.getExports(pluginName);
|
|
735
|
+
}
|
|
736
|
+
/**
|
|
737
|
+
* Check if a plugin is installed
|
|
738
|
+
*/
|
|
739
|
+
hasPlugin(name) {
|
|
740
|
+
return this.pluginManager.has(name);
|
|
741
|
+
}
|
|
742
|
+
/**
|
|
743
|
+
* Register an adapter
|
|
744
|
+
*/
|
|
745
|
+
adapter(name, adapter) {
|
|
746
|
+
this.adapters.register(name, adapter);
|
|
747
|
+
return this;
|
|
748
|
+
}
|
|
749
|
+
/**
|
|
750
|
+
* Enable built-in observability (metrics, tracing, health checks)
|
|
751
|
+
* with safe, configurable endpoints.
|
|
752
|
+
*/
|
|
753
|
+
observe(options = {}) {
|
|
754
|
+
const center = new ObservabilityCenter_1.ObservabilityCenter(options);
|
|
755
|
+
// Attach middleware for metrics/tracing/logging
|
|
756
|
+
this.use((0, createObservabilityMiddleware_1.createObservabilityMiddleware)(center, options));
|
|
757
|
+
const existingRoutes = this.router.getRoutes();
|
|
758
|
+
// Metrics endpoint (default: /__nexus/metrics)
|
|
759
|
+
const metricsEnabled = options.metrics?.enabled ?? true;
|
|
760
|
+
if (metricsEnabled) {
|
|
761
|
+
const metricsPath = options.metrics?.endpoint ?? '/__nexus/metrics';
|
|
762
|
+
this.ensureNoRouteConflict('GET', metricsPath, existingRoutes);
|
|
763
|
+
this.get(metricsPath, async (ctx) => center.metricsHandler()(ctx));
|
|
764
|
+
}
|
|
765
|
+
// Health endpoint (default: /__nexus/health)
|
|
766
|
+
if (options.health) {
|
|
767
|
+
const healthPath = options.health.endpoint ?? '/__nexus/health';
|
|
768
|
+
this.ensureNoRouteConflict('GET', healthPath, existingRoutes);
|
|
769
|
+
this.get(healthPath, async (ctx) => center.healthHandler()(ctx));
|
|
770
|
+
}
|
|
771
|
+
return this;
|
|
772
|
+
}
|
|
773
|
+
ensureNoRouteConflict(method, path, routes) {
|
|
774
|
+
const conflict = routes.some(r => r.method === method && r.path === path);
|
|
775
|
+
if (conflict) {
|
|
776
|
+
throw new Error(`Observability endpoint conflict for ${method} ${path}. ` +
|
|
777
|
+
'Silakan override endpoint melalui konfigurasi observability (metrics.endpoint / health.endpoint).');
|
|
778
|
+
}
|
|
779
|
+
}
|
|
780
|
+
/**
|
|
781
|
+
* Get an adapter
|
|
782
|
+
*/
|
|
783
|
+
getAdapter(name) {
|
|
784
|
+
return this.adapters.get(name);
|
|
785
|
+
}
|
|
786
|
+
/**
|
|
787
|
+
* Initialize all plugins (must be called before listen/start)
|
|
788
|
+
* This runs: configure → register → boot lifecycle phases
|
|
789
|
+
*
|
|
790
|
+
* @example
|
|
791
|
+
* ```typescript
|
|
792
|
+
* const app = createApp()
|
|
793
|
+
* .plugin(authPlugin, { secret: 'xxx' })
|
|
794
|
+
* .plugin(dbPlugin, { url: 'postgres://...' });
|
|
795
|
+
*
|
|
796
|
+
* // Initialize all plugins
|
|
797
|
+
* await app.initialize();
|
|
798
|
+
*
|
|
799
|
+
* // Start the server
|
|
800
|
+
* app.listen(3000);
|
|
801
|
+
* ```
|
|
802
|
+
*/
|
|
803
|
+
async initialize() {
|
|
804
|
+
await this.pluginManager.initialize();
|
|
805
|
+
return this;
|
|
806
|
+
}
|
|
807
|
+
/**
|
|
808
|
+
* Start the HTTP server
|
|
809
|
+
*/
|
|
810
|
+
listen(port, callback) {
|
|
811
|
+
this.server = (0, http_1.createServer)(async (req, res) => {
|
|
812
|
+
await this.handleRequest(req, res);
|
|
813
|
+
});
|
|
814
|
+
// Attach graceful shutdown if enabled
|
|
815
|
+
if (this.shutdownManager) {
|
|
816
|
+
this.shutdownManager.attach(this.server);
|
|
817
|
+
}
|
|
818
|
+
// Attach WebSocket gateway if any ws routes registered
|
|
819
|
+
if (this.wsGateway) {
|
|
820
|
+
this.wsGateway.attach(this.server);
|
|
821
|
+
}
|
|
822
|
+
this.server.listen(port, () => {
|
|
823
|
+
// Notify plugins that server is ready
|
|
824
|
+
this.pluginManager.notifyReady().catch(err => {
|
|
825
|
+
console.error('[PluginManager] Error in ready phase:', err);
|
|
826
|
+
});
|
|
827
|
+
callback?.();
|
|
828
|
+
});
|
|
829
|
+
return this.server;
|
|
830
|
+
}
|
|
831
|
+
/**
|
|
832
|
+
* Start the server (alias for listen with modern options)
|
|
833
|
+
*/
|
|
834
|
+
start(options) {
|
|
835
|
+
if (typeof options === 'number') {
|
|
836
|
+
return this.listen(options);
|
|
837
|
+
}
|
|
838
|
+
this.server = (0, http_1.createServer)(async (req, res) => {
|
|
839
|
+
await this.handleRequest(req, res);
|
|
840
|
+
});
|
|
841
|
+
// Attach graceful shutdown if enabled
|
|
842
|
+
if (this.shutdownManager) {
|
|
843
|
+
this.shutdownManager.attach(this.server);
|
|
844
|
+
}
|
|
845
|
+
// Attach WebSocket gateway if any ws routes registered
|
|
846
|
+
if (this.wsGateway) {
|
|
847
|
+
this.wsGateway.attach(this.server);
|
|
848
|
+
}
|
|
849
|
+
const { port, host = '0.0.0.0', callback } = options;
|
|
850
|
+
this.server.listen(port, host, () => {
|
|
851
|
+
// Notify plugins that server is ready
|
|
852
|
+
this.pluginManager.notifyReady().catch(err => {
|
|
853
|
+
console.error('[PluginManager] Error in ready phase:', err);
|
|
854
|
+
});
|
|
855
|
+
callback?.();
|
|
856
|
+
});
|
|
857
|
+
return this.server;
|
|
858
|
+
}
|
|
859
|
+
/**
|
|
860
|
+
* Handle incoming HTTP request
|
|
861
|
+
*/
|
|
862
|
+
async handleRequest(req, res) {
|
|
863
|
+
let ctx = null;
|
|
864
|
+
let response = null;
|
|
865
|
+
try {
|
|
866
|
+
// Acquire context from pool
|
|
867
|
+
ctx = await this.contextPool.acquire(req, res);
|
|
868
|
+
// Inject store registry into context
|
|
869
|
+
if ('setStoreRegistry' in ctx && typeof ctx.setStoreRegistry === 'function') {
|
|
870
|
+
ctx.setStoreRegistry(this.storeRegistry);
|
|
871
|
+
}
|
|
872
|
+
// Set debug mode for request stores
|
|
873
|
+
if ('setDebugMode' in ctx && typeof ctx.setDebugMode === 'function') {
|
|
874
|
+
ctx.setDebugMode(this.config.debug ?? false);
|
|
875
|
+
}
|
|
876
|
+
// === HOOK: onRequest ===
|
|
877
|
+
if (this.lifecycleHooks.onRequest) {
|
|
878
|
+
const hookResult = await this.lifecycleHooks.onRequest(ctx);
|
|
879
|
+
if (this.isResponse(hookResult)) {
|
|
880
|
+
await this.sendResponse(res, hookResult, ctx);
|
|
881
|
+
return;
|
|
882
|
+
}
|
|
883
|
+
}
|
|
884
|
+
// Apply versioning if configured
|
|
885
|
+
let matchPath = ctx.path;
|
|
886
|
+
if (this.versioningConfig) {
|
|
887
|
+
const { version, basePath, source } = this.resolveVersion(ctx);
|
|
888
|
+
ctx.version = version;
|
|
889
|
+
ctx.versionSource = source;
|
|
890
|
+
// For header/query strategy, rewrite path to versioned path
|
|
891
|
+
if (source === 'header' || source === 'query' || source === 'default') {
|
|
892
|
+
matchPath = `/${version}${basePath.startsWith('/') ? basePath : '/' + basePath}`;
|
|
893
|
+
}
|
|
894
|
+
if (this.config.debug) {
|
|
895
|
+
console.log(`[Versioning] ${source} → ${version}, path: ${ctx.path} → ${matchPath}`);
|
|
896
|
+
}
|
|
897
|
+
}
|
|
898
|
+
// Find matching route
|
|
899
|
+
const match = this.router.match(ctx.method, matchPath);
|
|
900
|
+
if (!match) {
|
|
901
|
+
// Try fallback handler (e.g., static files)
|
|
902
|
+
if (this.fallbackHandler) {
|
|
903
|
+
const fallbackResponse = await this.fallbackHandler(ctx, this.dependencies);
|
|
904
|
+
await this.sendResponse(res, fallbackResponse, ctx);
|
|
905
|
+
return;
|
|
906
|
+
}
|
|
907
|
+
// 404 Not Found
|
|
908
|
+
await this.sendResponse(res, {
|
|
909
|
+
statusCode: 404,
|
|
910
|
+
headers: { 'Content-Type': 'application/json' },
|
|
911
|
+
body: JSON.stringify({ error: 'Not Found' })
|
|
912
|
+
}, ctx);
|
|
913
|
+
return;
|
|
914
|
+
}
|
|
915
|
+
// Set route params
|
|
916
|
+
if ('setParams' in ctx && typeof ctx.setParams === 'function') {
|
|
917
|
+
ctx.setParams(match.params);
|
|
918
|
+
}
|
|
919
|
+
else {
|
|
920
|
+
ctx.params = match.params;
|
|
921
|
+
}
|
|
922
|
+
// Combine global and route-specific middleware
|
|
923
|
+
const allMiddlewares = [...this.globalMiddlewares, ...match.middlewares];
|
|
924
|
+
// Execute middleware chain and handler with hooks
|
|
925
|
+
response = await this.middlewareExecutor.executeWithHooks(ctx, allMiddlewares, match.handler, this.lifecycleHooks, this.dependencies);
|
|
926
|
+
// === HOOK: onResponse ===
|
|
927
|
+
if (this.lifecycleHooks.onResponse) {
|
|
928
|
+
const hookResult = await this.lifecycleHooks.onResponse(ctx, response);
|
|
929
|
+
if (this.isResponse(hookResult)) {
|
|
930
|
+
response = hookResult;
|
|
931
|
+
}
|
|
932
|
+
}
|
|
933
|
+
// Send response
|
|
934
|
+
await this.sendResponse(res, response, ctx);
|
|
935
|
+
}
|
|
936
|
+
catch (error) {
|
|
937
|
+
// === HOOK: onError ===
|
|
938
|
+
if (ctx && this.lifecycleHooks.onError) {
|
|
939
|
+
try {
|
|
940
|
+
const hookResult = await this.lifecycleHooks.onError(ctx, error);
|
|
941
|
+
if (this.isResponse(hookResult)) {
|
|
942
|
+
await this.sendResponse(res, hookResult, ctx);
|
|
943
|
+
return;
|
|
944
|
+
}
|
|
945
|
+
}
|
|
946
|
+
catch (hookError) {
|
|
947
|
+
// Hook itself threw an error, continue to default error handler
|
|
948
|
+
console.error('onError hook failed:', hookError);
|
|
949
|
+
}
|
|
950
|
+
}
|
|
951
|
+
// Handle errors with default error handler
|
|
952
|
+
try {
|
|
953
|
+
const errorResponse = await this.errorHandler(error, ctx);
|
|
954
|
+
// === HOOK: onResponse (for error responses) ===
|
|
955
|
+
if (ctx && this.lifecycleHooks.onResponse) {
|
|
956
|
+
const hookResult = await this.lifecycleHooks.onResponse(ctx, errorResponse);
|
|
957
|
+
if (this.isResponse(hookResult)) {
|
|
958
|
+
await this.sendResponse(res, hookResult, ctx);
|
|
959
|
+
return;
|
|
960
|
+
}
|
|
961
|
+
}
|
|
962
|
+
await this.sendResponse(res, errorResponse, ctx);
|
|
963
|
+
}
|
|
964
|
+
catch (handlerError) {
|
|
965
|
+
// Fallback error response
|
|
966
|
+
res.writeHead(500, { 'Content-Type': 'text/plain' });
|
|
967
|
+
res.end('Internal Server Error');
|
|
968
|
+
}
|
|
969
|
+
}
|
|
970
|
+
finally {
|
|
971
|
+
// Dispose request-scoped stores
|
|
972
|
+
if (ctx && 'disposeRequestStores' in ctx && typeof ctx.disposeRequestStores === 'function') {
|
|
973
|
+
ctx.disposeRequestStores();
|
|
974
|
+
}
|
|
975
|
+
// Release context back to pool
|
|
976
|
+
if (ctx) {
|
|
977
|
+
this.contextPool.release(ctx);
|
|
978
|
+
}
|
|
979
|
+
}
|
|
980
|
+
}
|
|
981
|
+
/**
|
|
982
|
+
* Check if value is a Response object
|
|
983
|
+
*/
|
|
984
|
+
isResponse(value) {
|
|
985
|
+
return (value &&
|
|
986
|
+
typeof value === 'object' &&
|
|
987
|
+
'statusCode' in value &&
|
|
988
|
+
'headers' in value &&
|
|
989
|
+
'body' in value);
|
|
990
|
+
}
|
|
991
|
+
/**
|
|
992
|
+
* Send HTTP response
|
|
993
|
+
*/
|
|
994
|
+
async sendResponse(res, response, ctx) {
|
|
995
|
+
// Set status code
|
|
996
|
+
res.statusCode = response.statusCode;
|
|
997
|
+
// Set headers
|
|
998
|
+
for (const [key, value] of Object.entries(response.headers)) {
|
|
999
|
+
if (value !== undefined) {
|
|
1000
|
+
res.setHeader(key, value);
|
|
1001
|
+
}
|
|
1002
|
+
}
|
|
1003
|
+
// Set cookies
|
|
1004
|
+
if ('getSetCookieHeaders' in ctx && typeof ctx.getSetCookieHeaders === 'function') {
|
|
1005
|
+
const setCookies = ctx.getSetCookieHeaders();
|
|
1006
|
+
if (setCookies.length > 0) {
|
|
1007
|
+
res.setHeader('Set-Cookie', setCookies);
|
|
1008
|
+
}
|
|
1009
|
+
}
|
|
1010
|
+
// Send body or stream
|
|
1011
|
+
if (response.stream) {
|
|
1012
|
+
response.stream.pipe(res);
|
|
1013
|
+
}
|
|
1014
|
+
else {
|
|
1015
|
+
res.end(response.body);
|
|
1016
|
+
}
|
|
1017
|
+
}
|
|
1018
|
+
/**
|
|
1019
|
+
* Get all registered routes
|
|
1020
|
+
*/
|
|
1021
|
+
getRoutes() {
|
|
1022
|
+
return this.router.getRoutes();
|
|
1023
|
+
}
|
|
1024
|
+
/**
|
|
1025
|
+
* Get context pool statistics
|
|
1026
|
+
*/
|
|
1027
|
+
getPoolStats() {
|
|
1028
|
+
return this.contextPool.getStats();
|
|
1029
|
+
}
|
|
1030
|
+
/**
|
|
1031
|
+
* Close the server
|
|
1032
|
+
*/
|
|
1033
|
+
close(callback) {
|
|
1034
|
+
if (this.server) {
|
|
1035
|
+
this.server.close(callback);
|
|
1036
|
+
}
|
|
1037
|
+
}
|
|
1038
|
+
/**
|
|
1039
|
+
* Enable graceful shutdown for zero-downtime deployments
|
|
1040
|
+
*/
|
|
1041
|
+
gracefulShutdown(options = {}) {
|
|
1042
|
+
this.shutdownManager = new deployment_1.GracefulShutdownManager({
|
|
1043
|
+
verbose: this.config.debug,
|
|
1044
|
+
...options
|
|
1045
|
+
});
|
|
1046
|
+
return this;
|
|
1047
|
+
}
|
|
1048
|
+
/**
|
|
1049
|
+
* Add a shutdown hook (e.g., closing database connections)
|
|
1050
|
+
*/
|
|
1051
|
+
onShutdown(name, handler, priority) {
|
|
1052
|
+
if (!this.shutdownManager) {
|
|
1053
|
+
this.gracefulShutdown();
|
|
1054
|
+
}
|
|
1055
|
+
this.shutdownManager.addHook({ name, handler, priority });
|
|
1056
|
+
return this;
|
|
1057
|
+
}
|
|
1058
|
+
/**
|
|
1059
|
+
* Initiate graceful shutdown programmatically
|
|
1060
|
+
*/
|
|
1061
|
+
async shutdown() {
|
|
1062
|
+
// Shutdown all plugins first
|
|
1063
|
+
await this.pluginManager.shutdown();
|
|
1064
|
+
// Dispose all stores
|
|
1065
|
+
this.storeRegistry.dispose();
|
|
1066
|
+
if (this.shutdownManager) {
|
|
1067
|
+
await this.shutdownManager.shutdown();
|
|
1068
|
+
}
|
|
1069
|
+
else {
|
|
1070
|
+
this.close();
|
|
1071
|
+
}
|
|
1072
|
+
}
|
|
1073
|
+
/**
|
|
1074
|
+
* Check if shutdown is in progress
|
|
1075
|
+
*/
|
|
1076
|
+
isShuttingDown() {
|
|
1077
|
+
return this.shutdownManager?.isInShutdown() ?? false;
|
|
1078
|
+
}
|
|
1079
|
+
/**
|
|
1080
|
+
* Get the shutdown manager for advanced usage
|
|
1081
|
+
*/
|
|
1082
|
+
getShutdownManager() {
|
|
1083
|
+
return this.shutdownManager;
|
|
1084
|
+
}
|
|
1085
|
+
/**
|
|
1086
|
+
* Start the application with clustering support
|
|
1087
|
+
* @param options Cluster options
|
|
1088
|
+
* @param startFn Function to start the server (called in each worker)
|
|
1089
|
+
*/
|
|
1090
|
+
cluster(options = {}) {
|
|
1091
|
+
this.clusterManager = new deployment_1.ClusterManager({
|
|
1092
|
+
verbose: this.config.debug,
|
|
1093
|
+
...options
|
|
1094
|
+
});
|
|
1095
|
+
return this.clusterManager;
|
|
1096
|
+
}
|
|
1097
|
+
/**
|
|
1098
|
+
* Get the cluster manager
|
|
1099
|
+
*/
|
|
1100
|
+
getClusterManager() {
|
|
1101
|
+
return this.clusterManager;
|
|
1102
|
+
}
|
|
1103
|
+
}
|
|
1104
|
+
exports.Application = Application;
|
|
1105
|
+
/**
|
|
1106
|
+
* Factory function to create an application
|
|
1107
|
+
*/
|
|
1108
|
+
function createApp(config) {
|
|
1109
|
+
return new Application(config);
|
|
1110
|
+
}
|
|
1111
|
+
//# sourceMappingURL=application.js.map
|