@c9up/ream 0.1.3
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/README.md +70 -0
- package/dist/Application.d.ts +71 -0
- package/dist/Application.d.ts.map +1 -0
- package/dist/Application.js +151 -0
- package/dist/Application.js.map +1 -0
- package/dist/Codemods.d.ts +16 -0
- package/dist/Codemods.d.ts.map +1 -0
- package/dist/Codemods.js +277 -0
- package/dist/Codemods.js.map +1 -0
- package/dist/ConfigLoader.d.ts +29 -0
- package/dist/ConfigLoader.d.ts.map +1 -0
- package/dist/ConfigLoader.js +43 -0
- package/dist/ConfigLoader.js.map +1 -0
- package/dist/ErrorBoundary.d.ts +51 -0
- package/dist/ErrorBoundary.d.ts.map +1 -0
- package/dist/ErrorBoundary.js +122 -0
- package/dist/ErrorBoundary.js.map +1 -0
- package/dist/GracefulShutdown.d.ts +28 -0
- package/dist/GracefulShutdown.d.ts.map +1 -0
- package/dist/GracefulShutdown.js +55 -0
- package/dist/GracefulShutdown.js.map +1 -0
- package/dist/HealthCheck.d.ts +42 -0
- package/dist/HealthCheck.d.ts.map +1 -0
- package/dist/HealthCheck.js +65 -0
- package/dist/HealthCheck.js.map +1 -0
- package/dist/HotReload.d.ts +28 -0
- package/dist/HotReload.d.ts.map +1 -0
- package/dist/HotReload.js +60 -0
- package/dist/HotReload.js.map +1 -0
- package/dist/HttpKernel.d.ts +62 -0
- package/dist/HttpKernel.d.ts.map +1 -0
- package/dist/HttpKernel.js +210 -0
- package/dist/HttpKernel.js.map +1 -0
- package/dist/Ignitor.d.ts +195 -0
- package/dist/Ignitor.d.ts.map +1 -0
- package/dist/Ignitor.js +505 -0
- package/dist/Ignitor.js.map +1 -0
- package/dist/Provider.d.ts +54 -0
- package/dist/Provider.d.ts.map +1 -0
- package/dist/Provider.js +37 -0
- package/dist/Provider.js.map +1 -0
- package/dist/bodyparser/BodyParserMiddleware.d.ts +38 -0
- package/dist/bodyparser/BodyParserMiddleware.d.ts.map +1 -0
- package/dist/bodyparser/BodyParserMiddleware.js +143 -0
- package/dist/bodyparser/BodyParserMiddleware.js.map +1 -0
- package/dist/bodyparser/MultipartFile.d.ts +77 -0
- package/dist/bodyparser/MultipartFile.d.ts.map +1 -0
- package/dist/bodyparser/MultipartFile.js +138 -0
- package/dist/bodyparser/MultipartFile.js.map +1 -0
- package/dist/bodyparser/parseSize.d.ts +6 -0
- package/dist/bodyparser/parseSize.d.ts.map +1 -0
- package/dist/bodyparser/parseSize.js +21 -0
- package/dist/bodyparser/parseSize.js.map +1 -0
- package/dist/bootstrap/hyper-server.d.ts +27 -0
- package/dist/bootstrap/hyper-server.d.ts.map +1 -0
- package/dist/bootstrap/hyper-server.js +63 -0
- package/dist/bootstrap/hyper-server.js.map +1 -0
- package/dist/console/CommandRunner.d.ts +18 -0
- package/dist/console/CommandRunner.d.ts.map +1 -0
- package/dist/console/CommandRunner.js +65 -0
- package/dist/console/CommandRunner.js.map +1 -0
- package/dist/container/Container.d.ts +60 -0
- package/dist/container/Container.d.ts.map +1 -0
- package/dist/container/Container.js +329 -0
- package/dist/container/Container.js.map +1 -0
- package/dist/container/types.d.ts +25 -0
- package/dist/container/types.d.ts.map +1 -0
- package/dist/container/types.js +6 -0
- package/dist/container/types.js.map +1 -0
- package/dist/decorators/Lazy.d.ts +19 -0
- package/dist/decorators/Lazy.d.ts.map +1 -0
- package/dist/decorators/Lazy.js +53 -0
- package/dist/decorators/Lazy.js.map +1 -0
- package/dist/decorators/Service.d.ts +48 -0
- package/dist/decorators/Service.d.ts.map +1 -0
- package/dist/decorators/Service.js +70 -0
- package/dist/decorators/Service.js.map +1 -0
- package/dist/errors/FuzzyMatcher.d.ts +41 -0
- package/dist/errors/FuzzyMatcher.d.ts.map +1 -0
- package/dist/errors/FuzzyMatcher.js +81 -0
- package/dist/errors/FuzzyMatcher.js.map +1 -0
- package/dist/errors/ModuleErrors.d.ts +41 -0
- package/dist/errors/ModuleErrors.d.ts.map +1 -0
- package/dist/errors/ModuleErrors.js +65 -0
- package/dist/errors/ModuleErrors.js.map +1 -0
- package/dist/errors/PipelineStageError.d.ts +31 -0
- package/dist/errors/PipelineStageError.d.ts.map +1 -0
- package/dist/errors/PipelineStageError.js +77 -0
- package/dist/errors/PipelineStageError.js.map +1 -0
- package/dist/errors/ReamError.d.ts +50 -0
- package/dist/errors/ReamError.d.ts.map +1 -0
- package/dist/errors/ReamError.js +108 -0
- package/dist/errors/ReamError.js.map +1 -0
- package/dist/events/Emitter.d.ts +124 -0
- package/dist/events/Emitter.d.ts.map +1 -0
- package/dist/events/Emitter.js +271 -0
- package/dist/events/Emitter.js.map +1 -0
- package/dist/events/EventsProvider.d.ts +28 -0
- package/dist/events/EventsProvider.d.ts.map +1 -0
- package/dist/events/EventsProvider.js +36 -0
- package/dist/events/EventsProvider.js.map +1 -0
- package/dist/events/config.d.ts +8 -0
- package/dist/events/config.d.ts.map +1 -0
- package/dist/events/config.js +4 -0
- package/dist/events/config.js.map +1 -0
- package/dist/events/configure.d.ts +10 -0
- package/dist/events/configure.d.ts.map +1 -0
- package/dist/events/configure.js +11 -0
- package/dist/events/configure.js.map +1 -0
- package/dist/events/helix/helpers.d.ts +62 -0
- package/dist/events/helix/helpers.d.ts.map +1 -0
- package/dist/events/helix/helpers.js +187 -0
- package/dist/events/helix/helpers.js.map +1 -0
- package/dist/events/index.d.ts +17 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/index.js +15 -0
- package/dist/events/index.js.map +1 -0
- package/dist/events/native.d.ts +21 -0
- package/dist/events/native.d.ts.map +1 -0
- package/dist/events/native.js +17 -0
- package/dist/events/native.js.map +1 -0
- package/dist/events/services/main.d.ts +18 -0
- package/dist/events/services/main.d.ts.map +1 -0
- package/dist/events/services/main.js +31 -0
- package/dist/events/services/main.js.map +1 -0
- package/dist/events/testing/FakeBus.d.ts +66 -0
- package/dist/events/testing/FakeBus.d.ts.map +1 -0
- package/dist/events/testing/FakeBus.js +356 -0
- package/dist/events/testing/FakeBus.js.map +1 -0
- package/dist/graphql/GraphQLEngine.d.ts +69 -0
- package/dist/graphql/GraphQLEngine.d.ts.map +1 -0
- package/dist/graphql/GraphQLEngine.js +309 -0
- package/dist/graphql/GraphQLEngine.js.map +1 -0
- package/dist/graphql/GraphQLProvider.d.ts +32 -0
- package/dist/graphql/GraphQLProvider.d.ts.map +1 -0
- package/dist/graphql/GraphQLProvider.js +49 -0
- package/dist/graphql/GraphQLProvider.js.map +1 -0
- package/dist/helpers/base64.d.ts +40 -0
- package/dist/helpers/base64.d.ts.map +1 -0
- package/dist/helpers/base64.js +70 -0
- package/dist/helpers/base64.js.map +1 -0
- package/dist/helpers/index.d.ts +7 -0
- package/dist/helpers/index.d.ts.map +1 -0
- package/dist/helpers/index.js +5 -0
- package/dist/helpers/index.js.map +1 -0
- package/dist/helpers/is.d.ts +101 -0
- package/dist/helpers/is.d.ts.map +1 -0
- package/dist/helpers/is.js +151 -0
- package/dist/helpers/is.js.map +1 -0
- package/dist/helpers/napi-loader.d.ts +46 -0
- package/dist/helpers/napi-loader.d.ts.map +1 -0
- package/dist/helpers/napi-loader.js +69 -0
- package/dist/helpers/napi-loader.js.map +1 -0
- package/dist/helpers/safeEqual.d.ts +9 -0
- package/dist/helpers/safeEqual.d.ts.map +1 -0
- package/dist/helpers/safeEqual.js +16 -0
- package/dist/helpers/safeEqual.js.map +1 -0
- package/dist/helpers/string.d.ts +161 -0
- package/dist/helpers/string.d.ts.map +1 -0
- package/dist/helpers/string.js +429 -0
- package/dist/helpers/string.js.map +1 -0
- package/dist/helpers/types.d.ts +83 -0
- package/dist/helpers/types.d.ts.map +1 -0
- package/dist/helpers/types.js +6 -0
- package/dist/helpers/types.js.map +1 -0
- package/dist/http/Exception.d.ts +103 -0
- package/dist/http/Exception.d.ts.map +1 -0
- package/dist/http/Exception.js +228 -0
- package/dist/http/Exception.js.map +1 -0
- package/dist/http/HttpContext.d.ts +69 -0
- package/dist/http/HttpContext.d.ts.map +1 -0
- package/dist/http/HttpContext.js +55 -0
- package/dist/http/HttpContext.js.map +1 -0
- package/dist/http/RedirectBuilder.d.ts +31 -0
- package/dist/http/RedirectBuilder.d.ts.map +1 -0
- package/dist/http/RedirectBuilder.js +75 -0
- package/dist/http/RedirectBuilder.js.map +1 -0
- package/dist/http/Request.d.ts +160 -0
- package/dist/http/Request.d.ts.map +1 -0
- package/dist/http/Request.js +484 -0
- package/dist/http/Request.js.map +1 -0
- package/dist/http/Response.d.ts +114 -0
- package/dist/http/Response.d.ts.map +1 -0
- package/dist/http/Response.js +303 -0
- package/dist/http/Response.js.map +1 -0
- package/dist/http/SseStream.d.ts +89 -0
- package/dist/http/SseStream.d.ts.map +1 -0
- package/dist/http/SseStream.js +228 -0
- package/dist/http/SseStream.js.map +1 -0
- package/dist/http/urlDecode.d.ts +8 -0
- package/dist/http/urlDecode.d.ts.map +1 -0
- package/dist/http/urlDecode.js +18 -0
- package/dist/http/urlDecode.js.map +1 -0
- package/dist/index.d.ts +92 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +67 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/Pipeline.d.ts +36 -0
- package/dist/middleware/Pipeline.d.ts.map +1 -0
- package/dist/middleware/Pipeline.js +104 -0
- package/dist/middleware/Pipeline.js.map +1 -0
- package/dist/openapi/OpenApiGenerator.d.ts +58 -0
- package/dist/openapi/OpenApiGenerator.d.ts.map +1 -0
- package/dist/openapi/OpenApiGenerator.js +192 -0
- package/dist/openapi/OpenApiGenerator.js.map +1 -0
- package/dist/openapi/OpenApiMiddleware.d.ts +24 -0
- package/dist/openapi/OpenApiMiddleware.d.ts.map +1 -0
- package/dist/openapi/OpenApiMiddleware.js +78 -0
- package/dist/openapi/OpenApiMiddleware.js.map +1 -0
- package/dist/openapi/OpenApiProvider.d.ts +36 -0
- package/dist/openapi/OpenApiProvider.d.ts.map +1 -0
- package/dist/openapi/OpenApiProvider.js +42 -0
- package/dist/openapi/OpenApiProvider.js.map +1 -0
- package/dist/resources/ApiResource.d.ts +45 -0
- package/dist/resources/ApiResource.d.ts.map +1 -0
- package/dist/resources/ApiResource.js +58 -0
- package/dist/resources/ApiResource.js.map +1 -0
- package/dist/router/Router.d.ts +205 -0
- package/dist/router/Router.d.ts.map +1 -0
- package/dist/router/Router.js +552 -0
- package/dist/router/Router.js.map +1 -0
- package/dist/rpc/RpcProvider.d.ts +34 -0
- package/dist/rpc/RpcProvider.d.ts.map +1 -0
- package/dist/rpc/RpcProvider.js +37 -0
- package/dist/rpc/RpcProvider.js.map +1 -0
- package/dist/rpc/RpcRouter.d.ts +61 -0
- package/dist/rpc/RpcRouter.d.ts.map +1 -0
- package/dist/rpc/RpcRouter.js +187 -0
- package/dist/rpc/RpcRouter.js.map +1 -0
- package/dist/scheduler/Schedule.d.ts +53 -0
- package/dist/scheduler/Schedule.d.ts.map +1 -0
- package/dist/scheduler/Schedule.js +76 -0
- package/dist/scheduler/Schedule.js.map +1 -0
- package/dist/scheduler/ScheduleProvider.d.ts +56 -0
- package/dist/scheduler/ScheduleProvider.d.ts.map +1 -0
- package/dist/scheduler/ScheduleProvider.js +145 -0
- package/dist/scheduler/ScheduleProvider.js.map +1 -0
- package/dist/scheduler/Scheduler.d.ts +209 -0
- package/dist/scheduler/Scheduler.d.ts.map +1 -0
- package/dist/scheduler/Scheduler.js +432 -0
- package/dist/scheduler/Scheduler.js.map +1 -0
- package/dist/scheduler/index.d.ts +14 -0
- package/dist/scheduler/index.d.ts.map +1 -0
- package/dist/scheduler/index.js +6 -0
- package/dist/scheduler/index.js.map +1 -0
- package/dist/scheduler/locks/LockBackend.d.ts +37 -0
- package/dist/scheduler/locks/LockBackend.d.ts.map +1 -0
- package/dist/scheduler/locks/LockBackend.js +13 -0
- package/dist/scheduler/locks/LockBackend.js.map +1 -0
- package/dist/scheduler/locks/MemoryLockBackend.d.ts +39 -0
- package/dist/scheduler/locks/MemoryLockBackend.d.ts.map +1 -0
- package/dist/scheduler/locks/MemoryLockBackend.js +71 -0
- package/dist/scheduler/locks/MemoryLockBackend.js.map +1 -0
- package/dist/scheduler/observability/ErrorReporter.d.ts +15 -0
- package/dist/scheduler/observability/ErrorReporter.d.ts.map +1 -0
- package/dist/scheduler/observability/ErrorReporter.js +13 -0
- package/dist/scheduler/observability/ErrorReporter.js.map +1 -0
- package/dist/scheduler/observability/ScheduleEvent.d.ts +57 -0
- package/dist/scheduler/observability/ScheduleEvent.d.ts.map +1 -0
- package/dist/scheduler/observability/ScheduleEvent.js +12 -0
- package/dist/scheduler/observability/ScheduleEvent.js.map +1 -0
- package/dist/scheduler/observability/ScheduleEventSink.d.ts +20 -0
- package/dist/scheduler/observability/ScheduleEventSink.d.ts.map +1 -0
- package/dist/scheduler/observability/ScheduleEventSink.js +17 -0
- package/dist/scheduler/observability/ScheduleEventSink.js.map +1 -0
- package/dist/scheduler/observability/StatsTracker.d.ts +50 -0
- package/dist/scheduler/observability/StatsTracker.d.ts.map +1 -0
- package/dist/scheduler/observability/StatsTracker.js +96 -0
- package/dist/scheduler/observability/StatsTracker.js.map +1 -0
- package/dist/security/CookieSigner.d.ts +13 -0
- package/dist/security/CookieSigner.d.ts.map +1 -0
- package/dist/security/CookieSigner.js +51 -0
- package/dist/security/CookieSigner.js.map +1 -0
- package/dist/security/SignedUrl.d.ts +17 -0
- package/dist/security/SignedUrl.d.ts.map +1 -0
- package/dist/security/SignedUrl.js +63 -0
- package/dist/security/SignedUrl.js.map +1 -0
- package/dist/security/crypto.d.ts +25 -0
- package/dist/security/crypto.d.ts.map +1 -0
- package/dist/security/crypto.js +82 -0
- package/dist/security/crypto.js.map +1 -0
- package/dist/server/HyperServer.d.ts +64 -0
- package/dist/server/HyperServer.d.ts.map +1 -0
- package/dist/server/HyperServer.js +54 -0
- package/dist/server/HyperServer.js.map +1 -0
- package/dist/server/Server.d.ts +68 -0
- package/dist/server/Server.d.ts.map +1 -0
- package/dist/server/Server.js +113 -0
- package/dist/server/Server.js.map +1 -0
- package/dist/services/app.d.ts +14 -0
- package/dist/services/app.d.ts.map +1 -0
- package/dist/services/app.js +27 -0
- package/dist/services/app.js.map +1 -0
- package/dist/services/router.d.ts +21 -0
- package/dist/services/router.d.ts.map +1 -0
- package/dist/services/router.js +36 -0
- package/dist/services/router.js.map +1 -0
- package/dist/services/server.d.ts +16 -0
- package/dist/services/server.d.ts.map +1 -0
- package/dist/services/server.js +32 -0
- package/dist/services/server.js.map +1 -0
- package/dist/session/Session.d.ts +88 -0
- package/dist/session/Session.d.ts.map +1 -0
- package/dist/session/Session.js +186 -0
- package/dist/session/Session.js.map +1 -0
- package/dist/session/SessionMiddleware.d.ts +16 -0
- package/dist/session/SessionMiddleware.d.ts.map +1 -0
- package/dist/session/SessionMiddleware.js +132 -0
- package/dist/session/SessionMiddleware.js.map +1 -0
- package/dist/session/drivers/CookieDriver.d.ts +17 -0
- package/dist/session/drivers/CookieDriver.d.ts.map +1 -0
- package/dist/session/drivers/CookieDriver.js +42 -0
- package/dist/session/drivers/CookieDriver.js.map +1 -0
- package/dist/session/drivers/MemoryDriver.d.ts +9 -0
- package/dist/session/drivers/MemoryDriver.d.ts.map +1 -0
- package/dist/session/drivers/MemoryDriver.js +24 -0
- package/dist/session/drivers/MemoryDriver.js.map +1 -0
- package/dist/storage/S3Driver.d.ts +27 -0
- package/dist/storage/S3Driver.d.ts.map +1 -0
- package/dist/storage/S3Driver.js +135 -0
- package/dist/storage/S3Driver.js.map +1 -0
- package/dist/storage/StaticMiddleware.d.ts +27 -0
- package/dist/storage/StaticMiddleware.d.ts.map +1 -0
- package/dist/storage/StaticMiddleware.js +153 -0
- package/dist/storage/StaticMiddleware.js.map +1 -0
- package/dist/storage/StaticProvider.d.ts +26 -0
- package/dist/storage/StaticProvider.d.ts.map +1 -0
- package/dist/storage/StaticProvider.js +31 -0
- package/dist/storage/StaticProvider.js.map +1 -0
- package/dist/storage/StorageManager.d.ts +31 -0
- package/dist/storage/StorageManager.d.ts.map +1 -0
- package/dist/storage/StorageManager.js +120 -0
- package/dist/storage/StorageManager.js.map +1 -0
- package/dist/testing/RequestBuilder.d.ts +67 -0
- package/dist/testing/RequestBuilder.d.ts.map +1 -0
- package/dist/testing/RequestBuilder.js +202 -0
- package/dist/testing/RequestBuilder.js.map +1 -0
- package/dist/testing/TestClient.d.ts +96 -0
- package/dist/testing/TestClient.d.ts.map +1 -0
- package/dist/testing/TestClient.js +263 -0
- package/dist/testing/TestClient.js.map +1 -0
- package/dist/types/helpers.d.ts +47 -0
- package/dist/types/helpers.d.ts.map +1 -0
- package/dist/types/helpers.js +5 -0
- package/dist/types/helpers.js.map +1 -0
- package/events.darwin-arm64.node +0 -0
- package/events.darwin-x64.node +0 -0
- package/events.linux-arm64-gnu.node +0 -0
- package/events.linux-x64-gnu.node +0 -0
- package/events.win32-x64-msvc.node +0 -0
- package/index.darwin-arm64.node +0 -0
- package/index.darwin-x64.node +0 -0
- package/index.linux-arm64-gnu.node +0 -0
- package/index.linux-x64-gnu.node +0 -0
- package/index.win32-x64-msvc.node +0 -0
- package/package.json +106 -0
- package/scheduler.darwin-arm64.node +0 -0
- package/scheduler.darwin-x64.node +0 -0
- package/scheduler.linux-arm64-gnu.node +0 -0
- package/scheduler.linux-x64-gnu.node +0 -0
- package/scheduler.win32-x64-msvc.node +0 -0
- package/scripts/copy-napi.mjs +113 -0
- package/src/Application.ts +177 -0
- package/src/Codemods.ts +343 -0
- package/src/ConfigLoader.ts +49 -0
- package/src/ErrorBoundary.ts +157 -0
- package/src/GracefulShutdown.ts +80 -0
- package/src/HealthCheck.ts +96 -0
- package/src/HotReload.ts +78 -0
- package/src/HttpKernel.ts +305 -0
- package/src/Ignitor.ts +656 -0
- package/src/Provider.ts +74 -0
- package/src/bodyparser/BodyParserMiddleware.ts +183 -0
- package/src/bodyparser/MultipartFile.ts +181 -0
- package/src/bodyparser/parseSize.ts +19 -0
- package/src/bootstrap/hyper-server.ts +78 -0
- package/src/console/CommandRunner.ts +82 -0
- package/src/container/Container.ts +383 -0
- package/src/container/types.ts +30 -0
- package/src/decorators/Lazy.ts +57 -0
- package/src/decorators/Service.ts +85 -0
- package/src/errors/FuzzyMatcher.ts +93 -0
- package/src/errors/ModuleErrors.ts +73 -0
- package/src/errors/PipelineStageError.ts +97 -0
- package/src/errors/ReamError.ts +138 -0
- package/src/events/Emitter.ts +333 -0
- package/src/events/EventsProvider.ts +58 -0
- package/src/events/config.ts +10 -0
- package/src/events/configure.ts +19 -0
- package/src/events/helix/helpers.ts +260 -0
- package/src/events/index.ts +22 -0
- package/src/events/native.ts +37 -0
- package/src/events/services/main.ts +39 -0
- package/src/events/testing/FakeBus.ts +420 -0
- package/src/graphql/GraphQLEngine.ts +421 -0
- package/src/graphql/GraphQLProvider.ts +59 -0
- package/src/helpers/base64.ts +72 -0
- package/src/helpers/index.ts +6 -0
- package/src/helpers/is.ts +162 -0
- package/src/helpers/napi-loader.ts +106 -0
- package/src/helpers/safeEqual.ts +15 -0
- package/src/helpers/string.ts +469 -0
- package/src/helpers/types.ts +100 -0
- package/src/http/Exception.ts +272 -0
- package/src/http/HttpContext.ts +108 -0
- package/src/http/RedirectBuilder.ts +89 -0
- package/src/http/Request.ts +540 -0
- package/src/http/Response.ts +351 -0
- package/src/http/SseStream.ts +250 -0
- package/src/http/urlDecode.ts +18 -0
- package/src/index.ts +263 -0
- package/src/middleware/Pipeline.ts +136 -0
- package/src/openapi/OpenApiGenerator.ts +254 -0
- package/src/openapi/OpenApiMiddleware.ts +101 -0
- package/src/openapi/OpenApiProvider.ts +67 -0
- package/src/resources/ApiResource.ts +79 -0
- package/src/router/Router.ts +733 -0
- package/src/rpc/RpcProvider.ts +54 -0
- package/src/rpc/RpcRouter.ts +243 -0
- package/src/scheduler/Schedule.ts +96 -0
- package/src/scheduler/ScheduleProvider.ts +177 -0
- package/src/scheduler/Scheduler.ts +601 -0
- package/src/scheduler/index.ts +24 -0
- package/src/scheduler/locks/LockBackend.ts +38 -0
- package/src/scheduler/locks/MemoryLockBackend.ts +85 -0
- package/src/scheduler/observability/ErrorReporter.ts +13 -0
- package/src/scheduler/observability/ScheduleEvent.ts +61 -0
- package/src/scheduler/observability/ScheduleEventSink.ts +21 -0
- package/src/scheduler/observability/StatsTracker.ts +134 -0
- package/src/security/CookieSigner.ts +54 -0
- package/src/security/SignedUrl.ts +71 -0
- package/src/security/crypto.ts +98 -0
- package/src/server/HyperServer.ts +121 -0
- package/src/server/Server.ts +147 -0
- package/src/services/app.ts +34 -0
- package/src/services/router.ts +44 -0
- package/src/services/server.ts +40 -0
- package/src/session/Session.ts +231 -0
- package/src/session/SessionMiddleware.ts +153 -0
- package/src/session/drivers/CookieDriver.ts +48 -0
- package/src/session/drivers/MemoryDriver.ts +29 -0
- package/src/storage/S3Driver.ts +171 -0
- package/src/storage/StaticMiddleware.ts +182 -0
- package/src/storage/StaticProvider.ts +40 -0
- package/src/storage/StorageManager.ts +142 -0
- package/src/testing/RequestBuilder.ts +275 -0
- package/src/testing/TestClient.ts +344 -0
- package/src/types/helpers.ts +52 -0
- package/swcrc.app.json +17 -0
- package/tsconfig.app.json +21 -0
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GraphQLEngine — schema-first GraphQL with Rust query validation.
|
|
3
|
+
*
|
|
4
|
+
* - Schema parsed from .graphql files at boot
|
|
5
|
+
* - Queries validated by Rust before NAPI crossing (when available)
|
|
6
|
+
* - Resolvers are IoC-injected controller-like classes
|
|
7
|
+
* - @Guard/@Role enforced per TOP-LEVEL resolver field (nested fields are
|
|
8
|
+
* projected from the resolver's return value, not independently resolved —
|
|
9
|
+
* so they carry no per-field guard; don't return guarded data from an
|
|
10
|
+
* unguarded resolver and rely on a nested field guard to hide it).
|
|
11
|
+
* - The response is pruned to the client's selection set, so a resolver may
|
|
12
|
+
* safely return a rich object (e.g. an ORM entity): fields the client did
|
|
13
|
+
* not select are dropped before serialization.
|
|
14
|
+
* - Zero non-null assertions — types guaranteed by schema validation
|
|
15
|
+
*
|
|
16
|
+
* Usage:
|
|
17
|
+
* const engine = new GraphQLEngine({ schemaPath: './app/graphql/schema.graphql' })
|
|
18
|
+
* engine.resolver('Query', 'tasks', TaskResolver, 'tasks')
|
|
19
|
+
* engine.resolver('Mutation', 'createTask', TaskResolver, 'createTask', { guard: 'jwt', role: 'cs_member' })
|
|
20
|
+
*
|
|
21
|
+
* @implements MISS-28
|
|
22
|
+
*/
|
|
23
|
+
import * as fs from 'node:fs';
|
|
24
|
+
import { loadNapi } from '../helpers/napi-loader.js';
|
|
25
|
+
let graphqlNativeCache;
|
|
26
|
+
/**
|
|
27
|
+
* Lazily load the Rust GraphQL parser from the `index` NAPI binary. There is no
|
|
28
|
+
* TS fallback — when Rust exists, the engine is full-Rust. `loadNapi` throws a
|
|
29
|
+
* typed `ReamError` if the native module is missing.
|
|
30
|
+
*/
|
|
31
|
+
function graphqlNative() {
|
|
32
|
+
if (graphqlNativeCache === undefined) {
|
|
33
|
+
graphqlNativeCache = loadNapi({
|
|
34
|
+
binaryName: 'index',
|
|
35
|
+
callerMetaUrl: import.meta.url,
|
|
36
|
+
errorCodePrefix: 'GRAPHQL',
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
return graphqlNativeCache;
|
|
40
|
+
}
|
|
41
|
+
const OPERATION_TYPE = {
|
|
42
|
+
query: 'Query',
|
|
43
|
+
mutation: 'Mutation',
|
|
44
|
+
subscription: 'Subscription',
|
|
45
|
+
};
|
|
46
|
+
/** Map a Rust `ParsedField` (sub_fields) onto the engine's `SelectionField` (selection). */
|
|
47
|
+
function mapRustField(f) {
|
|
48
|
+
return {
|
|
49
|
+
name: f.name,
|
|
50
|
+
alias: f.alias ?? undefined,
|
|
51
|
+
args: f.args,
|
|
52
|
+
selection: f.sub_fields.map(mapRustField),
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
export class GraphQLEngine {
|
|
56
|
+
#schemaSource;
|
|
57
|
+
#resolvers = new Map();
|
|
58
|
+
#container;
|
|
59
|
+
path;
|
|
60
|
+
#playground;
|
|
61
|
+
constructor(config) {
|
|
62
|
+
if (!fs.existsSync(config.schemaPath)) {
|
|
63
|
+
throw new Error(`GraphQL schema not found: ${config.schemaPath}`);
|
|
64
|
+
}
|
|
65
|
+
this.#schemaSource = fs.readFileSync(config.schemaPath, 'utf8');
|
|
66
|
+
this.path = config.path ?? '/graphql';
|
|
67
|
+
this.#playground = config.playground ?? process.env.NODE_ENV !== 'production';
|
|
68
|
+
}
|
|
69
|
+
/** Set IoC container for resolver instantiation. */
|
|
70
|
+
useContainer(container) {
|
|
71
|
+
this.#container = container;
|
|
72
|
+
}
|
|
73
|
+
/** Register a resolver for a type.field. */
|
|
74
|
+
resolver(typeName, fieldName, handlerClass, methodName, options) {
|
|
75
|
+
const key = `${typeName}.${fieldName}`;
|
|
76
|
+
this.#resolvers.set(key, {
|
|
77
|
+
typeName,
|
|
78
|
+
fieldName,
|
|
79
|
+
handlerClass,
|
|
80
|
+
methodName,
|
|
81
|
+
options: options ?? {},
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
/** Handle a GraphQL HTTP request. */
|
|
85
|
+
async handle(ctx) {
|
|
86
|
+
const method = ctx.request.method();
|
|
87
|
+
// Playground
|
|
88
|
+
if (method === 'GET' && this.#playground) {
|
|
89
|
+
ctx.response.header('Content-Type', 'text/html');
|
|
90
|
+
ctx.response.status(200).send(this.#renderPlayground());
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
if (method !== 'POST') {
|
|
94
|
+
ctx.response.status(405).json({ errors: [{ message: 'Method not allowed' }] });
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
const rawBody = ctx.request.body();
|
|
98
|
+
const body = parseGraphQLBody(rawBody);
|
|
99
|
+
if (!body) {
|
|
100
|
+
ctx.response.status(400).json({ errors: [{ message: 'Missing or invalid query' }] });
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
try {
|
|
104
|
+
const result = await this.#execute(body, ctx);
|
|
105
|
+
ctx.response.status(200).json(result);
|
|
106
|
+
}
|
|
107
|
+
catch (err) {
|
|
108
|
+
const message = process.env.NODE_ENV !== 'production' && err instanceof Error
|
|
109
|
+
? err.message
|
|
110
|
+
: 'Internal server error';
|
|
111
|
+
ctx.response.status(500).json({ errors: [{ message }] });
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/** Execute a GraphQL query against registered resolvers. */
|
|
115
|
+
async #execute(request, ctx) {
|
|
116
|
+
// Parse the query to extract operation type and fields
|
|
117
|
+
const parsed = this.#parseQuery(request.query);
|
|
118
|
+
if (parsed.errors) {
|
|
119
|
+
return { errors: parsed.errors };
|
|
120
|
+
}
|
|
121
|
+
const data = {};
|
|
122
|
+
const errors = [];
|
|
123
|
+
for (const field of parsed.fields) {
|
|
124
|
+
const outcome = await this.#resolveField(field, parsed.typeName, request, ctx);
|
|
125
|
+
if (outcome.ok) {
|
|
126
|
+
data[field.alias ?? field.name] = outcome.value;
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
errors.push(outcome.error);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return {
|
|
133
|
+
data: Object.keys(data).length > 0 ? data : undefined,
|
|
134
|
+
errors: errors.length > 0 ? errors : undefined,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
/** Resolve one selection field: lookup → guards → invoke → prune. */
|
|
138
|
+
async #resolveField(field, typeName, request, ctx) {
|
|
139
|
+
const key = `${typeName}.${field.name}`;
|
|
140
|
+
const entry = this.#resolvers.get(key);
|
|
141
|
+
if (!entry) {
|
|
142
|
+
return {
|
|
143
|
+
ok: false,
|
|
144
|
+
error: { message: `No resolver for ${key}`, path: [field.name] },
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
const guardError = this.#enforceGuards(entry.options, ctx);
|
|
148
|
+
if (guardError) {
|
|
149
|
+
return { ok: false, error: { message: guardError, path: [field.name] } };
|
|
150
|
+
}
|
|
151
|
+
try {
|
|
152
|
+
// Resolve handler via IoC or direct instantiation.
|
|
153
|
+
const instance = this.#container
|
|
154
|
+
? this.#container.make(entry.handlerClass)
|
|
155
|
+
: new entry.handlerClass();
|
|
156
|
+
const handler = instance[entry.methodName];
|
|
157
|
+
if (typeof handler !== 'function') {
|
|
158
|
+
return {
|
|
159
|
+
ok: false,
|
|
160
|
+
error: {
|
|
161
|
+
message: `Resolver method ${entry.methodName} not found`,
|
|
162
|
+
path: [field.name],
|
|
163
|
+
},
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
const args = this.#buildArgs(field, request.variables);
|
|
167
|
+
const result = await handler.call(instance, null, args, ctx);
|
|
168
|
+
// Prune to the client's selection set: a resolver returning a rich
|
|
169
|
+
// object (ORM entity, etc.) must not leak fields the client did not
|
|
170
|
+
// ask for. Empty selection (scalar field) returns the value as-is.
|
|
171
|
+
return { ok: true, value: pruneToSelection(result, field.selection) };
|
|
172
|
+
}
|
|
173
|
+
catch (err) {
|
|
174
|
+
const msg = err instanceof Error ? err.message : 'Resolver error';
|
|
175
|
+
return { ok: false, error: { message: msg, path: [field.name] } };
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Build the resolver argument bag: `$variable` references resolve against
|
|
180
|
+
* `request.variables`, then any unreferenced variables are merged in.
|
|
181
|
+
*/
|
|
182
|
+
#buildArgs(field, variables) {
|
|
183
|
+
const args = {};
|
|
184
|
+
for (const [k, v] of Object.entries(field.args)) {
|
|
185
|
+
if (typeof v === 'string' && v.startsWith('$') && variables) {
|
|
186
|
+
args[k] = variables[v.slice(1)];
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
args[k] = v;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
if (variables) {
|
|
193
|
+
for (const [k, v] of Object.entries(variables)) {
|
|
194
|
+
if (!(k in args))
|
|
195
|
+
args[k] = v;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return args;
|
|
199
|
+
}
|
|
200
|
+
/** Enforce guard/role/permission on a resolver. */
|
|
201
|
+
#enforceGuards(options, ctx) {
|
|
202
|
+
const guards = [...(options.guards ?? []), ...(options.guard ? [options.guard] : [])];
|
|
203
|
+
const roles = [...(options.roles ?? []), ...(options.role ? [options.role] : [])];
|
|
204
|
+
const permissions = options.permissions ?? [];
|
|
205
|
+
const needsAuth = guards.length > 0 || roles.length > 0 || permissions.length > 0;
|
|
206
|
+
if (needsAuth && !ctx.auth?.authenticated) {
|
|
207
|
+
return 'Unauthorized';
|
|
208
|
+
}
|
|
209
|
+
if (roles.length > 0) {
|
|
210
|
+
const userRoles = ctx.auth?.roles ?? [];
|
|
211
|
+
if (!roles.some((r) => userRoles.includes(r))) {
|
|
212
|
+
return 'Insufficient role';
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
if (permissions.length > 0) {
|
|
216
|
+
const userPerms = ctx.auth?.permissions ?? [];
|
|
217
|
+
if (!permissions.every((p) => userPerms.includes(p))) {
|
|
218
|
+
return 'Insufficient permissions';
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
return null;
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Parse a GraphQL query via the Rust `ream-graphql` crate (operation type +
|
|
225
|
+
* fields with arguments). Spec-compliant; invalid queries return errors.
|
|
226
|
+
*/
|
|
227
|
+
#parseQuery(query) {
|
|
228
|
+
// Full-Rust: the spec-compliant `ream-graphql` parser (graphql-parser
|
|
229
|
+
// crate) rejects invalid queries before any resolver runs. No TS fallback —
|
|
230
|
+
// ream ships the native binary, so when Rust exists the engine is Rust.
|
|
231
|
+
const raw = JSON.parse(graphqlNative().graphqlParse(query));
|
|
232
|
+
const typeName = OPERATION_TYPE[raw.operation_type] ?? 'Query';
|
|
233
|
+
if (raw.errors.length > 0) {
|
|
234
|
+
return { typeName, fields: [], errors: raw.errors.map((message) => ({ message })) };
|
|
235
|
+
}
|
|
236
|
+
return { typeName, fields: raw.fields.map(mapRustField) };
|
|
237
|
+
}
|
|
238
|
+
#renderPlayground() {
|
|
239
|
+
return `<!DOCTYPE html>
|
|
240
|
+
<html>
|
|
241
|
+
<head>
|
|
242
|
+
<title>GraphQL Playground</title>
|
|
243
|
+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/graphiql@3/graphiql.min.css" />
|
|
244
|
+
</head>
|
|
245
|
+
<body style="margin:0;overflow:hidden">
|
|
246
|
+
<div id="graphiql" style="height:100vh"></div>
|
|
247
|
+
<script crossorigin src="https://cdn.jsdelivr.net/npm/react@18/umd/react.production.min.js"></script>
|
|
248
|
+
<script crossorigin src="https://cdn.jsdelivr.net/npm/react-dom@18/umd/react-dom.production.min.js"></script>
|
|
249
|
+
<script crossorigin src="https://cdn.jsdelivr.net/npm/graphiql@3/graphiql.min.js"></script>
|
|
250
|
+
<script>
|
|
251
|
+
const root = ReactDOM.createRoot(document.getElementById('graphiql'));
|
|
252
|
+
root.render(React.createElement(GraphiQL, {
|
|
253
|
+
fetcher: GraphiQL.createFetcher({ url: ${JSON.stringify(this.path)} }),
|
|
254
|
+
}));
|
|
255
|
+
</script>
|
|
256
|
+
</body>
|
|
257
|
+
</html>`;
|
|
258
|
+
}
|
|
259
|
+
/** Get the raw schema source for introspection. */
|
|
260
|
+
getSchemaSource() {
|
|
261
|
+
return this.#schemaSource;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
/** Parse and validate an unknown request body as a GraphQL request object. */
|
|
265
|
+
function parseGraphQLBody(body) {
|
|
266
|
+
if (!body || typeof body !== 'object' || Array.isArray(body))
|
|
267
|
+
return null;
|
|
268
|
+
// After typeof check, body is a non-null non-array object; index via 'in' narrowing
|
|
269
|
+
const q = 'query' in body ? body.query : undefined;
|
|
270
|
+
if (typeof q !== 'string')
|
|
271
|
+
return null;
|
|
272
|
+
let variables;
|
|
273
|
+
if ('variables' in body &&
|
|
274
|
+
body.variables !== null &&
|
|
275
|
+
typeof body.variables === 'object' &&
|
|
276
|
+
!Array.isArray(body.variables)) {
|
|
277
|
+
// biome-ignore lint/suspicious/noExplicitAny: narrowed to non-null non-array object above; branded as Record for safe spreading
|
|
278
|
+
variables = body.variables;
|
|
279
|
+
}
|
|
280
|
+
const rawOpName = 'operationName' in body ? body.operationName : undefined;
|
|
281
|
+
const operationName = typeof rawOpName === 'string' ? rawOpName : undefined;
|
|
282
|
+
return { query: q, variables, operationName };
|
|
283
|
+
}
|
|
284
|
+
function isRecord(v) {
|
|
285
|
+
return typeof v === 'object' && v !== null && !Array.isArray(v);
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Project a resolver result onto the client's selection set. A field with an
|
|
289
|
+
* empty selection (a scalar leaf) is returned untouched; an object is reduced
|
|
290
|
+
* to only the selected keys (recursing into nested selections); an array maps
|
|
291
|
+
* the projection over its items. This is what stops a resolver that returns a
|
|
292
|
+
* rich object (ORM entity, etc.) from leaking unselected fields.
|
|
293
|
+
*/
|
|
294
|
+
export function pruneToSelection(value, selection) {
|
|
295
|
+
if (selection.length === 0)
|
|
296
|
+
return value;
|
|
297
|
+
if (Array.isArray(value))
|
|
298
|
+
return value.map((v) => pruneToSelection(v, selection));
|
|
299
|
+
if (!isRecord(value))
|
|
300
|
+
return value;
|
|
301
|
+
const out = {};
|
|
302
|
+
for (const field of selection) {
|
|
303
|
+
if (field.name in value) {
|
|
304
|
+
out[field.alias ?? field.name] = pruneToSelection(value[field.name], field.selection);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
return out;
|
|
308
|
+
}
|
|
309
|
+
//# sourceMappingURL=GraphQLEngine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GraphQLEngine.js","sourceRoot":"","sources":["../../src/graphql/GraphQLEngine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `GraphQLProvider` — wires the GraphQL gateway into the Ream pipeline.
|
|
3
|
+
*
|
|
4
|
+
* Opt-in: does nothing unless `config.graphql.schemaPath` is set (or an engine
|
|
5
|
+
* is injected for tests). When configured:
|
|
6
|
+
* - `register()` — construct a `GraphQLEngine` from `config.graphql`, give it
|
|
7
|
+
* the IoC container for resolver DI, and bind it under the `'graphql'` token:
|
|
8
|
+
*
|
|
9
|
+
* const gql = app.container.make<GraphQLEngine>('graphql')
|
|
10
|
+
* gql.resolver('Query', 'tasks', TaskResolver, 'tasks')
|
|
11
|
+
*
|
|
12
|
+
* - `boot()` — mount the engine at `engine.path` (default `/graphql`) for both
|
|
13
|
+
* GET (playground/introspection) and POST (queries).
|
|
14
|
+
*
|
|
15
|
+
* @implements Story 24.5
|
|
16
|
+
*/
|
|
17
|
+
import type { AppContext } from '../Provider.js';
|
|
18
|
+
import { Provider } from '../Provider.js';
|
|
19
|
+
import { GraphQLEngine } from './GraphQLEngine.js';
|
|
20
|
+
export interface GraphQLProviderOptions {
|
|
21
|
+
/** Override the `GraphQLEngine` instance — used by tests. */
|
|
22
|
+
engine?: GraphQLEngine;
|
|
23
|
+
}
|
|
24
|
+
export declare class GraphQLProvider extends Provider {
|
|
25
|
+
#private;
|
|
26
|
+
constructor(app: AppContext, options?: GraphQLProviderOptions);
|
|
27
|
+
/** The wired engine, or undefined when GraphQL is not configured. */
|
|
28
|
+
get engine(): GraphQLEngine | undefined;
|
|
29
|
+
register(): void;
|
|
30
|
+
boot(): Promise<void>;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=GraphQLProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GraphQLProvider.d.ts","sourceRoot":"","sources":["../../src/graphql/GraphQLProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAEzC,OAAO,EAAsB,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAEtE,MAAM,WAAW,sBAAsB;IACrC,6DAA6D;IAC7D,MAAM,CAAC,EAAE,aAAa,CAAA;CACvB;AAED,qBAAa,eAAgB,SAAQ,QAAQ;;gBAG/B,GAAG,EAAE,UAAU,EAAE,OAAO,GAAE,sBAA2B;IAKjE,qEAAqE;IACrE,IAAI,MAAM,IAAI,aAAa,GAAG,SAAS,CAEtC;IAEQ,QAAQ,IAAI,IAAI;IASV,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CASrC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `GraphQLProvider` — wires the GraphQL gateway into the Ream pipeline.
|
|
3
|
+
*
|
|
4
|
+
* Opt-in: does nothing unless `config.graphql.schemaPath` is set (or an engine
|
|
5
|
+
* is injected for tests). When configured:
|
|
6
|
+
* - `register()` — construct a `GraphQLEngine` from `config.graphql`, give it
|
|
7
|
+
* the IoC container for resolver DI, and bind it under the `'graphql'` token:
|
|
8
|
+
*
|
|
9
|
+
* const gql = app.container.make<GraphQLEngine>('graphql')
|
|
10
|
+
* gql.resolver('Query', 'tasks', TaskResolver, 'tasks')
|
|
11
|
+
*
|
|
12
|
+
* - `boot()` — mount the engine at `engine.path` (default `/graphql`) for both
|
|
13
|
+
* GET (playground/introspection) and POST (queries).
|
|
14
|
+
*
|
|
15
|
+
* @implements Story 24.5
|
|
16
|
+
*/
|
|
17
|
+
import { Provider } from '../Provider.js';
|
|
18
|
+
import { GraphQLEngine } from './GraphQLEngine.js';
|
|
19
|
+
export class GraphQLProvider extends Provider {
|
|
20
|
+
#engine;
|
|
21
|
+
constructor(app, options = {}) {
|
|
22
|
+
super(app);
|
|
23
|
+
this.#engine = options.engine;
|
|
24
|
+
}
|
|
25
|
+
/** The wired engine, or undefined when GraphQL is not configured. */
|
|
26
|
+
get engine() {
|
|
27
|
+
return this.#engine;
|
|
28
|
+
}
|
|
29
|
+
register() {
|
|
30
|
+
const config = this.app.config.get('graphql');
|
|
31
|
+
const engine = this.#engine ?? (config?.schemaPath ? new GraphQLEngine(config) : undefined);
|
|
32
|
+
if (!engine)
|
|
33
|
+
return; // GraphQL not configured — opt-out.
|
|
34
|
+
engine.useContainer(this.app.container);
|
|
35
|
+
this.#engine = engine;
|
|
36
|
+
this.app.container.singleton('graphql', () => engine);
|
|
37
|
+
}
|
|
38
|
+
async boot() {
|
|
39
|
+
const engine = this.#engine;
|
|
40
|
+
if (!engine)
|
|
41
|
+
return;
|
|
42
|
+
const router = this.app.container.make('router');
|
|
43
|
+
// GraphQLEngine.handle() serves the playground on GET and executes queries
|
|
44
|
+
// on POST, so mount the same path for both verbs.
|
|
45
|
+
router.get(engine.path, (ctx) => engine.handle(ctx));
|
|
46
|
+
router.post(engine.path, (ctx) => engine.handle(ctx));
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=GraphQLProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GraphQLProvider.js","sourceRoot":"","sources":["../../src/graphql/GraphQLProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAEzC,OAAO,EAAsB,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAOtE,MAAM,OAAO,eAAgB,SAAQ,QAAQ;IAC3C,OAAO,CAAgB;IAEvB,YAAY,GAAe,EAAE,UAAkC,EAAE;QAC/D,KAAK,CAAC,GAAG,CAAC,CAAA;QACV,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,MAAM,CAAA;IAC/B,CAAC;IAED,qEAAqE;IACrE,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAEQ,QAAQ;QACf,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAgB,SAAS,CAAC,CAAA;QAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;QAC3F,IAAI,CAAC,MAAM;YAAE,OAAM,CAAC,oCAAoC;QACxD,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QACvC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAA;QACrB,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,CAAA;IACvD,CAAC;IAEQ,KAAK,CAAC,IAAI;QACjB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAA;QAC3B,IAAI,CAAC,MAAM;YAAE,OAAM;QACnB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAS,QAAQ,CAAC,CAAA;QACxD,2EAA2E;QAC3E,kDAAkD;QAClD,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;QACpD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;IACvD,CAAC;CACF"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Encode a string or Buffer to standard base64.
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* base64.encode('hello') // 'aGVsbG8='
|
|
6
|
+
*/
|
|
7
|
+
declare function encode(value: string | Buffer): string;
|
|
8
|
+
/**
|
|
9
|
+
* Decode a standard base64 string. Returns null on invalid input unless strict mode,
|
|
10
|
+
* in which case it throws.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* base64.decode('aGVsbG8=') // 'hello'
|
|
14
|
+
* base64.decode('!!!') // null
|
|
15
|
+
*/
|
|
16
|
+
declare function decode(value: string, encoding?: BufferEncoding, strict?: boolean): string | null;
|
|
17
|
+
/**
|
|
18
|
+
* Encode a string or Buffer to base64url (no padding, uses - and _ instead of + and /).
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* base64.urlEncode('hello') // 'aGVsbG8'
|
|
22
|
+
*/
|
|
23
|
+
declare function urlEncode(value: string | Buffer): string;
|
|
24
|
+
/**
|
|
25
|
+
* Decode a base64url string. Returns null on invalid input unless strict mode,
|
|
26
|
+
* in which case it throws.
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* base64.urlDecode('aGVsbG8') // 'hello'
|
|
30
|
+
* base64.urlDecode('!!!') // null
|
|
31
|
+
*/
|
|
32
|
+
declare function urlDecode(value: string, encoding?: BufferEncoding, strict?: boolean): string | null;
|
|
33
|
+
export declare const base64: {
|
|
34
|
+
encode: typeof encode;
|
|
35
|
+
decode: typeof decode;
|
|
36
|
+
urlEncode: typeof urlEncode;
|
|
37
|
+
urlDecode: typeof urlDecode;
|
|
38
|
+
};
|
|
39
|
+
export {};
|
|
40
|
+
//# sourceMappingURL=base64.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base64.d.ts","sourceRoot":"","sources":["../../src/helpers/base64.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,iBAAS,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAG9C;AAED;;;;;;;GAOG;AACH,iBAAS,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,GAAE,cAAwB,EAAE,MAAM,UAAQ,GAAG,MAAM,GAAG,IAAI,CAWhG;AAED;;;;;GAKG;AACH,iBAAS,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAGjD;AAED;;;;;;;GAOG;AACH,iBAAS,SAAS,CAChB,KAAK,EAAE,MAAM,EACb,QAAQ,GAAE,cAAwB,EAClC,MAAM,UAAQ,GACb,MAAM,GAAG,IAAI,CAWf;AAED,eAAO,MAAM,MAAM;;;;;CAA2C,CAAA"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
const STANDARD_B64_RE = /^[A-Za-z0-9+/]*={0,2}$/;
|
|
2
|
+
const URL_B64_RE = /^[A-Za-z0-9_-]*$/;
|
|
3
|
+
/**
|
|
4
|
+
* Encode a string or Buffer to standard base64.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* base64.encode('hello') // 'aGVsbG8='
|
|
8
|
+
*/
|
|
9
|
+
function encode(value) {
|
|
10
|
+
const buf = typeof value === 'string' ? Buffer.from(value, 'utf-8') : value;
|
|
11
|
+
return buf.toString('base64');
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Decode a standard base64 string. Returns null on invalid input unless strict mode,
|
|
15
|
+
* in which case it throws.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* base64.decode('aGVsbG8=') // 'hello'
|
|
19
|
+
* base64.decode('!!!') // null
|
|
20
|
+
*/
|
|
21
|
+
function decode(value, encoding = 'utf-8', strict = false) {
|
|
22
|
+
if (!STANDARD_B64_RE.test(value)) {
|
|
23
|
+
if (strict)
|
|
24
|
+
throw new Error(`Invalid base64 string: ${value}`);
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
try {
|
|
28
|
+
return Buffer.from(value, 'base64').toString(encoding);
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
if (strict)
|
|
32
|
+
throw new Error(`Failed to decode base64 string: ${value}`);
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Encode a string or Buffer to base64url (no padding, uses - and _ instead of + and /).
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* base64.urlEncode('hello') // 'aGVsbG8'
|
|
41
|
+
*/
|
|
42
|
+
function urlEncode(value) {
|
|
43
|
+
const buf = typeof value === 'string' ? Buffer.from(value, 'utf-8') : value;
|
|
44
|
+
return buf.toString('base64url');
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Decode a base64url string. Returns null on invalid input unless strict mode,
|
|
48
|
+
* in which case it throws.
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* base64.urlDecode('aGVsbG8') // 'hello'
|
|
52
|
+
* base64.urlDecode('!!!') // null
|
|
53
|
+
*/
|
|
54
|
+
function urlDecode(value, encoding = 'utf-8', strict = false) {
|
|
55
|
+
if (!URL_B64_RE.test(value)) {
|
|
56
|
+
if (strict)
|
|
57
|
+
throw new Error(`Invalid base64url string: ${value}`);
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
try {
|
|
61
|
+
return Buffer.from(value, 'base64url').toString(encoding);
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
if (strict)
|
|
65
|
+
throw new Error(`Failed to decode base64url string: ${value}`);
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
export const base64 = { encode, decode, urlEncode, urlDecode };
|
|
70
|
+
//# sourceMappingURL=base64.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base64.js","sourceRoot":"","sources":["../../src/helpers/base64.ts"],"names":[],"mappings":"AAAA,MAAM,eAAe,GAAG,wBAAwB,CAAA;AAChD,MAAM,UAAU,GAAG,kBAAkB,CAAA;AAErC;;;;;GAKG;AACH,SAAS,MAAM,CAAC,KAAsB;IACpC,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;IAC3E,OAAO,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;AAC/B,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,MAAM,CAAC,KAAa,EAAE,WAA2B,OAAO,EAAE,MAAM,GAAG,KAAK;IAC/E,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACjC,IAAI,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,KAAK,EAAE,CAAC,CAAA;QAC9D,OAAO,IAAI,CAAA;IACb,CAAC;IACD,IAAI,CAAC;QACH,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,KAAK,EAAE,CAAC,CAAA;QACvE,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAS,SAAS,CAAC,KAAsB;IACvC,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;IAC3E,OAAO,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;AAClC,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,SAAS,CAChB,KAAa,EACb,WAA2B,OAAO,EAClC,MAAM,GAAG,KAAK;IAEd,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,IAAI,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,KAAK,EAAE,CAAC,CAAA;QACjE,OAAO,IAAI,CAAA;IACb,CAAC;IACD,IAAI,CAAC;QACH,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,KAAK,EAAE,CAAC,CAAA;QAC1E,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,CAAA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { base64 } from './base64.js';
|
|
2
|
+
export type * from './is.js';
|
|
3
|
+
export { default as is } from './is.js';
|
|
4
|
+
export { safeEqual } from './safeEqual.js';
|
|
5
|
+
export { default as string } from './string.js';
|
|
6
|
+
export type * from './types.js';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/helpers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,mBAAmB,SAAS,CAAA;AAC5B,OAAO,EAAE,OAAO,IAAI,EAAE,EAAE,MAAM,SAAS,CAAA;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,aAAa,CAAA;AAC/C,mBAAmB,YAAY,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/helpers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,OAAO,EAAE,OAAO,IAAI,EAAE,EAAE,MAAM,SAAS,CAAA;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,aAAa,CAAA"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Returns true if value is a string.
|
|
3
|
+
* @example isString('hi') // true
|
|
4
|
+
*/
|
|
5
|
+
export declare function isString(v: unknown): v is string;
|
|
6
|
+
/**
|
|
7
|
+
* Returns true if value is a finite number (excludes NaN).
|
|
8
|
+
* @example isNumber(42) // true; isNumber(NaN) // false
|
|
9
|
+
*/
|
|
10
|
+
export declare function isNumber(v: unknown): v is number;
|
|
11
|
+
/**
|
|
12
|
+
* Returns true if value is a boolean.
|
|
13
|
+
* @example isBoolean(true) // true
|
|
14
|
+
*/
|
|
15
|
+
export declare function isBoolean(v: unknown): v is boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Returns true if value is a callable function.
|
|
18
|
+
* @example isFunction(() => {}) // true
|
|
19
|
+
*/
|
|
20
|
+
export declare function isFunction(v: unknown): v is (...args: unknown[]) => unknown;
|
|
21
|
+
/**
|
|
22
|
+
* Returns true if value is a non-null object.
|
|
23
|
+
* @example isObject({}) // true; isObject(null) // false
|
|
24
|
+
*/
|
|
25
|
+
export declare function isObject(v: unknown): v is object;
|
|
26
|
+
/**
|
|
27
|
+
* Returns true if value is a plain object (non-null, non-array, prototype is Object or null).
|
|
28
|
+
* @example isPlainObject({ a: 1 }) // true; isPlainObject([]) // false
|
|
29
|
+
*/
|
|
30
|
+
export declare function isPlainObject(v: unknown): v is Record<string, unknown>;
|
|
31
|
+
/**
|
|
32
|
+
* Returns true if value is an array.
|
|
33
|
+
* @example isArray([1, 2]) // true
|
|
34
|
+
*/
|
|
35
|
+
export declare function isArray<T = unknown>(v: unknown): v is T[];
|
|
36
|
+
/**
|
|
37
|
+
* Returns true if value has a thenable interface (is a Promise or promise-like).
|
|
38
|
+
* @example isPromise(Promise.resolve()) // true
|
|
39
|
+
*/
|
|
40
|
+
export declare function isPromise<T = unknown>(v: unknown): v is Promise<T>;
|
|
41
|
+
/**
|
|
42
|
+
* Returns true if value is null.
|
|
43
|
+
* @example isNull(null) // true
|
|
44
|
+
*/
|
|
45
|
+
export declare function isNull(v: unknown): v is null;
|
|
46
|
+
/**
|
|
47
|
+
* Returns true if value is undefined.
|
|
48
|
+
* @example isUndefined(undefined) // true
|
|
49
|
+
*/
|
|
50
|
+
export declare function isUndefined(v: unknown): v is undefined;
|
|
51
|
+
/**
|
|
52
|
+
* Returns true if value is null or undefined.
|
|
53
|
+
* @example isNullOrUndefined(null) // true; isNullOrUndefined(undefined) // true
|
|
54
|
+
*/
|
|
55
|
+
export declare function isNullOrUndefined(v: unknown): v is null | undefined;
|
|
56
|
+
/**
|
|
57
|
+
* Returns true if value is a Node.js Buffer.
|
|
58
|
+
* @example isBuffer(Buffer.from('hi')) // true
|
|
59
|
+
*/
|
|
60
|
+
export declare function isBuffer(v: unknown): v is Buffer;
|
|
61
|
+
/**
|
|
62
|
+
* Returns true if value is a Date object.
|
|
63
|
+
* @example isDate(new Date()) // true
|
|
64
|
+
*/
|
|
65
|
+
export declare function isDate(v: unknown): v is Date;
|
|
66
|
+
/**
|
|
67
|
+
* Returns true if value is a RegExp.
|
|
68
|
+
* @example isRegExp(/foo/) // true
|
|
69
|
+
*/
|
|
70
|
+
export declare function isRegExp(v: unknown): v is RegExp;
|
|
71
|
+
/**
|
|
72
|
+
* Returns true if value is an Error instance.
|
|
73
|
+
* @example isError(new Error()) // true
|
|
74
|
+
*/
|
|
75
|
+
export declare function isError(v: unknown): v is Error;
|
|
76
|
+
/**
|
|
77
|
+
* Returns true for null, undefined, empty string, empty array, empty plain object,
|
|
78
|
+
* empty Map, or empty Set.
|
|
79
|
+
* @example isEmpty('') // true; isEmpty([]) // true; isEmpty({}) // true
|
|
80
|
+
*/
|
|
81
|
+
export declare function isEmpty(v: unknown): boolean;
|
|
82
|
+
declare const is: {
|
|
83
|
+
isString: typeof isString;
|
|
84
|
+
isNumber: typeof isNumber;
|
|
85
|
+
isBoolean: typeof isBoolean;
|
|
86
|
+
isFunction: typeof isFunction;
|
|
87
|
+
isObject: typeof isObject;
|
|
88
|
+
isPlainObject: typeof isPlainObject;
|
|
89
|
+
isArray: typeof isArray;
|
|
90
|
+
isPromise: typeof isPromise;
|
|
91
|
+
isNull: typeof isNull;
|
|
92
|
+
isUndefined: typeof isUndefined;
|
|
93
|
+
isNullOrUndefined: typeof isNullOrUndefined;
|
|
94
|
+
isBuffer: typeof isBuffer;
|
|
95
|
+
isDate: typeof isDate;
|
|
96
|
+
isRegExp: typeof isRegExp;
|
|
97
|
+
isError: typeof isError;
|
|
98
|
+
isEmpty: typeof isEmpty;
|
|
99
|
+
};
|
|
100
|
+
export default is;
|
|
101
|
+
//# sourceMappingURL=is.d.ts.map
|