@nocobase/app-server 0.11.1-alpha.4 → 2.0.0-beta.1
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 +295 -0
- package/dist/application/index.d.ts +128 -0
- package/dist/application/index.d.ts.map +1 -0
- package/dist/application/index.js +386 -0
- package/dist/application/index.js.map +1 -0
- package/dist/caching/config.d.ts +2 -0
- package/dist/caching/config.d.ts.map +1 -0
- package/dist/caching/config.js +2 -0
- package/dist/caching/config.js.map +1 -0
- package/dist/caching/index.d.ts +5 -0
- package/dist/caching/index.d.ts.map +1 -0
- package/dist/caching/index.js +4 -0
- package/dist/caching/index.js.map +1 -0
- package/dist/caching/provider.d.ts +8 -0
- package/dist/caching/provider.d.ts.map +1 -0
- package/dist/caching/provider.js +14 -0
- package/dist/caching/provider.js.map +1 -0
- package/dist/caching/token.d.ts +4 -0
- package/dist/caching/token.d.ts.map +1 -0
- package/dist/caching/token.js +3 -0
- package/dist/caching/token.js.map +1 -0
- package/dist/config/app-config-types.d.ts +44 -0
- package/dist/config/app-config-types.d.ts.map +1 -0
- package/dist/config/app-config-types.js +2 -0
- package/dist/config/app-config-types.js.map +1 -0
- package/dist/config/app-config.d.ts +60 -0
- package/dist/config/app-config.d.ts.map +1 -0
- package/dist/config/app-config.js +247 -0
- package/dist/config/app-config.js.map +1 -0
- package/dist/config/context.d.ts +3 -0
- package/dist/config/context.d.ts.map +1 -0
- package/dist/config/context.js +7 -0
- package/dist/config/context.js.map +1 -0
- package/dist/config/define-app-config.d.ts +71 -0
- package/dist/config/define-app-config.d.ts.map +1 -0
- package/dist/config/define-app-config.js +48 -0
- package/dist/config/define-app-config.js.map +1 -0
- package/dist/config/index.d.ts +13 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +11 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/not-configured.d.ts +23 -0
- package/dist/config/not-configured.d.ts.map +1 -0
- package/dist/config/not-configured.js +31 -0
- package/dist/config/not-configured.js.map +1 -0
- package/dist/config/paths.d.ts +27 -0
- package/dist/config/paths.d.ts.map +1 -0
- package/dist/config/paths.js +27 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/config/placeholder-secret.d.ts +19 -0
- package/dist/config/placeholder-secret.d.ts.map +1 -0
- package/dist/config/placeholder-secret.js +26 -0
- package/dist/config/placeholder-secret.js.map +1 -0
- package/dist/config/runtime-environment.d.ts +11 -0
- package/dist/config/runtime-environment.d.ts.map +1 -0
- package/dist/config/runtime-environment.js +20 -0
- package/dist/config/runtime-environment.js.map +1 -0
- package/dist/config/types.d.ts +12 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +2 -0
- package/dist/config/types.js.map +1 -0
- package/dist/config/validation.d.ts +36 -0
- package/dist/config/validation.d.ts.map +1 -0
- package/dist/config/validation.js +186 -0
- package/dist/config/validation.js.map +1 -0
- package/dist/config/variables.d.ts +57 -0
- package/dist/config/variables.d.ts.map +1 -0
- package/dist/config/variables.js +89 -0
- package/dist/config/variables.js.map +1 -0
- package/dist/database/collections-artifact.d.ts +99 -0
- package/dist/database/collections-artifact.d.ts.map +1 -0
- package/dist/database/collections-artifact.js +397 -0
- package/dist/database/collections-artifact.js.map +1 -0
- package/dist/database/collections-directory.d.ts +36 -0
- package/dist/database/collections-directory.d.ts.map +1 -0
- package/dist/database/collections-directory.js +115 -0
- package/dist/database/collections-directory.js.map +1 -0
- package/dist/database/collections-doctor.d.ts +43 -0
- package/dist/database/collections-doctor.d.ts.map +1 -0
- package/dist/database/collections-doctor.js +88 -0
- package/dist/database/collections-doctor.js.map +1 -0
- package/dist/database/connection-check.d.ts +25 -0
- package/dist/database/connection-check.d.ts.map +1 -0
- package/dist/database/connection-check.js +65 -0
- package/dist/database/connection-check.js.map +1 -0
- package/dist/database/connection-selection.d.ts +16 -0
- package/dist/database/connection-selection.d.ts.map +1 -0
- package/dist/database/connection-selection.js +30 -0
- package/dist/database/connection-selection.js.map +1 -0
- package/dist/database/define-app-database-config.d.ts +49 -0
- package/dist/database/define-app-database-config.d.ts.map +1 -0
- package/dist/database/define-app-database-config.js +73 -0
- package/dist/database/define-app-database-config.js.map +1 -0
- package/dist/database/environment.d.ts +11 -0
- package/dist/database/environment.d.ts.map +1 -0
- package/dist/database/environment.js +49 -0
- package/dist/database/environment.js.map +1 -0
- package/dist/database/index.d.ts +17 -0
- package/dist/database/index.d.ts.map +1 -0
- package/dist/database/index.js +16 -0
- package/dist/database/index.js.map +1 -0
- package/dist/database/manager.d.ts +16 -0
- package/dist/database/manager.d.ts.map +1 -0
- package/dist/database/manager.js +83 -0
- package/dist/database/manager.js.map +1 -0
- package/dist/database/migrator.d.ts +88 -0
- package/dist/database/migrator.d.ts.map +1 -0
- package/dist/database/migrator.js +143 -0
- package/dist/database/migrator.js.map +1 -0
- package/dist/database/ownership.d.ts +6 -0
- package/dist/database/ownership.d.ts.map +1 -0
- package/dist/database/ownership.js +50 -0
- package/dist/database/ownership.js.map +1 -0
- package/dist/database/plan.d.ts +36 -0
- package/dist/database/plan.d.ts.map +1 -0
- package/dist/database/plan.js +136 -0
- package/dist/database/plan.js.map +1 -0
- package/dist/database/provider.d.ts +43 -0
- package/dist/database/provider.d.ts.map +1 -0
- package/dist/database/provider.js +171 -0
- package/dist/database/provider.js.map +1 -0
- package/dist/database/resolve-config.d.ts +42 -0
- package/dist/database/resolve-config.d.ts.map +1 -0
- package/dist/database/resolve-config.js +118 -0
- package/dist/database/resolve-config.js.map +1 -0
- package/dist/database/seeder.d.ts +50 -0
- package/dist/database/seeder.d.ts.map +1 -0
- package/dist/database/seeder.js +117 -0
- package/dist/database/seeder.js.map +1 -0
- package/dist/database/storage.d.ts +10 -0
- package/dist/database/storage.d.ts.map +1 -0
- package/dist/database/storage.js +37 -0
- package/dist/database/storage.js.map +1 -0
- package/dist/database/task-config.d.ts +7 -0
- package/dist/database/task-config.d.ts.map +1 -0
- package/dist/database/task-config.js +19 -0
- package/dist/database/task-config.js.map +1 -0
- package/dist/database/task-container.d.ts +3 -0
- package/dist/database/task-container.d.ts.map +1 -0
- package/dist/database/task-container.js +34 -0
- package/dist/database/task-container.js.map +1 -0
- package/dist/database/tasks.d.ts +104 -0
- package/dist/database/tasks.d.ts.map +1 -0
- package/dist/database/tasks.js +350 -0
- package/dist/database/tasks.js.map +1 -0
- package/dist/database/types.d.ts +92 -0
- package/dist/database/types.d.ts.map +1 -0
- package/dist/database/types.js +2 -0
- package/dist/database/types.js.map +1 -0
- package/dist/drive/config.d.ts +2 -0
- package/dist/drive/config.d.ts.map +1 -0
- package/dist/drive/config.js +2 -0
- package/dist/drive/config.js.map +1 -0
- package/dist/drive/index.d.ts +5 -0
- package/dist/drive/index.d.ts.map +1 -0
- package/dist/drive/index.js +4 -0
- package/dist/drive/index.js.map +1 -0
- package/dist/drive/provider.d.ts +9 -0
- package/dist/drive/provider.d.ts.map +1 -0
- package/dist/drive/provider.js +22 -0
- package/dist/drive/provider.js.map +1 -0
- package/dist/drive/token.d.ts +4 -0
- package/dist/drive/token.d.ts.map +1 -0
- package/dist/drive/token.js +3 -0
- package/dist/drive/token.js.map +1 -0
- package/dist/i18n/index.d.ts +37 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +44 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/id-generator/config.d.ts +2 -0
- package/dist/id-generator/config.d.ts.map +1 -0
- package/dist/id-generator/config.js +2 -0
- package/dist/id-generator/config.js.map +1 -0
- package/dist/id-generator/index.d.ts +5 -0
- package/dist/id-generator/index.d.ts.map +1 -0
- package/dist/id-generator/index.js +4 -0
- package/dist/id-generator/index.js.map +1 -0
- package/dist/id-generator/provider.d.ts +7 -0
- package/dist/id-generator/provider.d.ts.map +1 -0
- package/dist/id-generator/provider.js +11 -0
- package/dist/id-generator/provider.js.map +1 -0
- package/dist/id-generator/token.d.ts +4 -0
- package/dist/id-generator/token.d.ts.map +1 -0
- package/dist/id-generator/token.js +3 -0
- package/dist/id-generator/token.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/jobs/config.d.ts +2 -0
- package/dist/jobs/config.d.ts.map +1 -0
- package/dist/jobs/config.js +2 -0
- package/dist/jobs/config.js.map +1 -0
- package/dist/jobs/index.d.ts +4 -0
- package/dist/jobs/index.d.ts.map +1 -0
- package/dist/jobs/index.js +4 -0
- package/dist/jobs/index.js.map +1 -0
- package/dist/jobs/provider.d.ts +23 -0
- package/dist/jobs/provider.d.ts.map +1 -0
- package/dist/jobs/provider.js +55 -0
- package/dist/jobs/provider.js.map +1 -0
- package/dist/jobs/token.d.ts +8 -0
- package/dist/jobs/token.d.ts.map +1 -0
- package/dist/jobs/token.js +7 -0
- package/dist/jobs/token.js.map +1 -0
- package/dist/logging/config.d.ts +16 -0
- package/dist/logging/config.d.ts.map +1 -0
- package/dist/logging/config.js +26 -0
- package/dist/logging/config.js.map +1 -0
- package/dist/logging/index.d.ts +5 -0
- package/dist/logging/index.d.ts.map +1 -0
- package/dist/logging/index.js +5 -0
- package/dist/logging/index.js.map +1 -0
- package/dist/logging/middleware.d.ts +13 -0
- package/dist/logging/middleware.d.ts.map +1 -0
- package/dist/logging/middleware.js +128 -0
- package/dist/logging/middleware.js.map +1 -0
- package/dist/logging/provider.d.ts +9 -0
- package/dist/logging/provider.d.ts.map +1 -0
- package/dist/logging/provider.js +95 -0
- package/dist/logging/provider.js.map +1 -0
- package/dist/logging/token.d.ts +4 -0
- package/dist/logging/token.d.ts.map +1 -0
- package/dist/logging/token.js +3 -0
- package/dist/logging/token.js.map +1 -0
- package/dist/node/config.d.ts +6 -0
- package/dist/node/config.d.ts.map +1 -0
- package/dist/node/config.js +2 -0
- package/dist/node/config.js.map +1 -0
- package/dist/node/index.d.ts +6 -0
- package/dist/node/index.d.ts.map +1 -0
- package/dist/node/index.js +6 -0
- package/dist/node/index.js.map +1 -0
- package/dist/node/not-configured-message.d.ts +10 -0
- package/dist/node/not-configured-message.d.ts.map +1 -0
- package/dist/node/not-configured-message.js +24 -0
- package/dist/node/not-configured-message.js.map +1 -0
- package/dist/node/proxy.d.ts +25 -0
- package/dist/node/proxy.d.ts.map +1 -0
- package/dist/node/proxy.js +229 -0
- package/dist/node/proxy.js.map +1 -0
- package/dist/node/runtime.d.ts +45 -0
- package/dist/node/runtime.d.ts.map +1 -0
- package/dist/node/runtime.js +176 -0
- package/dist/node/runtime.js.map +1 -0
- package/dist/node/scope.d.ts +55 -0
- package/dist/node/scope.d.ts.map +1 -0
- package/dist/node/scope.js +115 -0
- package/dist/node/scope.js.map +1 -0
- package/dist/node/server.d.ts +80 -0
- package/dist/node/server.d.ts.map +1 -0
- package/dist/node/server.js +283 -0
- package/dist/node/server.js.map +1 -0
- package/dist/plugins/define.d.ts +4 -0
- package/dist/plugins/define.d.ts.map +1 -0
- package/dist/plugins/define.js +45 -0
- package/dist/plugins/define.js.map +1 -0
- package/dist/plugins/index.d.ts +27 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +4 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/inspect.d.ts +79 -0
- package/dist/plugins/inspect.d.ts.map +1 -0
- package/dist/plugins/inspect.js +142 -0
- package/dist/plugins/inspect.js.map +1 -0
- package/dist/plugins/resolve.d.ts +14 -0
- package/dist/plugins/resolve.d.ts.map +1 -0
- package/dist/plugins/resolve.js +101 -0
- package/dist/plugins/resolve.js.map +1 -0
- package/dist/plugins/types.d.ts +91 -0
- package/dist/plugins/types.d.ts.map +1 -0
- package/dist/plugins/types.js +2 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/proxy/http-proxy.d.ts +8 -0
- package/dist/proxy/http-proxy.d.ts.map +1 -0
- package/dist/proxy/http-proxy.js +59 -0
- package/dist/proxy/http-proxy.js.map +1 -0
- package/dist/proxy/index.d.ts +3 -0
- package/dist/proxy/index.d.ts.map +1 -0
- package/dist/proxy/index.js +3 -0
- package/dist/proxy/index.js.map +1 -0
- package/dist/proxy/origin.d.ts +12 -0
- package/dist/proxy/origin.d.ts.map +1 -0
- package/dist/proxy/origin.js +61 -0
- package/dist/proxy/origin.js.map +1 -0
- package/dist/queue/config.d.ts +4 -0
- package/dist/queue/config.d.ts.map +1 -0
- package/dist/queue/config.js +2 -0
- package/dist/queue/config.js.map +1 -0
- package/dist/queue/index.d.ts +4 -0
- package/dist/queue/index.d.ts.map +1 -0
- package/dist/queue/index.js +4 -0
- package/dist/queue/index.js.map +1 -0
- package/dist/queue/provider.d.ts +24 -0
- package/dist/queue/provider.d.ts.map +1 -0
- package/dist/queue/provider.js +57 -0
- package/dist/queue/provider.js.map +1 -0
- package/dist/queue/token.d.ts +9 -0
- package/dist/queue/token.d.ts.map +1 -0
- package/dist/queue/token.js +8 -0
- package/dist/queue/token.js.map +1 -0
- package/dist/realtime/index.d.ts +6 -0
- package/dist/realtime/index.d.ts.map +1 -0
- package/dist/realtime/index.js +6 -0
- package/dist/realtime/index.js.map +1 -0
- package/dist/realtime/provider.d.ts +10 -0
- package/dist/realtime/provider.d.ts.map +1 -0
- package/dist/realtime/provider.js +19 -0
- package/dist/realtime/provider.js.map +1 -0
- package/dist/realtime/service.d.ts +9 -0
- package/dist/realtime/service.d.ts.map +1 -0
- package/dist/realtime/service.js +347 -0
- package/dist/realtime/service.js.map +1 -0
- package/dist/realtime/types.d.ts +74 -0
- package/dist/realtime/types.d.ts.map +1 -0
- package/dist/realtime/types.js +4 -0
- package/dist/realtime/types.js.map +1 -0
- package/dist/realtime/websocket.d.ts +7 -0
- package/dist/realtime/websocket.d.ts.map +1 -0
- package/dist/realtime/websocket.js +57 -0
- package/dist/realtime/websocket.js.map +1 -0
- package/dist/router/api-error.d.ts +171 -0
- package/dist/router/api-error.d.ts.map +1 -0
- package/dist/router/api-error.js +291 -0
- package/dist/router/api-error.js.map +1 -0
- package/dist/router/api-limits.d.ts +80 -0
- package/dist/router/api-limits.d.ts.map +1 -0
- package/dist/router/api-limits.js +281 -0
- package/dist/router/api-limits.js.map +1 -0
- package/dist/router/cli/derive.d.ts +32 -0
- package/dist/router/cli/derive.d.ts.map +1 -0
- package/dist/router/cli/derive.js +548 -0
- package/dist/router/cli/derive.js.map +1 -0
- package/dist/router/cli/index.d.ts +6 -0
- package/dist/router/cli/index.d.ts.map +1 -0
- package/dist/router/cli/index.js +6 -0
- package/dist/router/cli/index.js.map +1 -0
- package/dist/router/cli/reference.d.ts +9 -0
- package/dist/router/cli/reference.d.ts.map +1 -0
- package/dist/router/cli/reference.js +64 -0
- package/dist/router/cli/reference.js.map +1 -0
- package/dist/router/cli/routes.d.ts +9 -0
- package/dist/router/cli/routes.d.ts.map +1 -0
- package/dist/router/cli/routes.js +228 -0
- package/dist/router/cli/routes.js.map +1 -0
- package/dist/router/cli/service.d.ts +50 -0
- package/dist/router/cli/service.d.ts.map +1 -0
- package/dist/router/cli/service.js +104 -0
- package/dist/router/cli/service.js.map +1 -0
- package/dist/router/cli/types.d.ts +278 -0
- package/dist/router/cli/types.d.ts.map +1 -0
- package/dist/router/cli/types.js +18 -0
- package/dist/router/cli/types.js.map +1 -0
- package/dist/router/duplicate-routes.d.ts +25 -0
- package/dist/router/duplicate-routes.d.ts.map +1 -0
- package/dist/router/duplicate-routes.js +51 -0
- package/dist/router/duplicate-routes.js.map +1 -0
- package/dist/router/health.d.ts +7 -0
- package/dist/router/health.d.ts.map +1 -0
- package/dist/router/health.js +48 -0
- package/dist/router/health.js.map +1 -0
- package/dist/router/index.d.ts +26 -0
- package/dist/router/index.d.ts.map +1 -0
- package/dist/router/index.js +29 -0
- package/dist/router/index.js.map +1 -0
- package/dist/router/openapi/components.d.ts +24 -0
- package/dist/router/openapi/components.d.ts.map +1 -0
- package/dist/router/openapi/components.js +128 -0
- package/dist/router/openapi/components.js.map +1 -0
- package/dist/router/openapi/declared.d.ts +19 -0
- package/dist/router/openapi/declared.d.ts.map +1 -0
- package/dist/router/openapi/declared.js +46 -0
- package/dist/router/openapi/declared.js.map +1 -0
- package/dist/router/openapi/describe.d.ts +82 -0
- package/dist/router/openapi/describe.d.ts.map +1 -0
- package/dist/router/openapi/describe.js +207 -0
- package/dist/router/openapi/describe.js.map +1 -0
- package/dist/router/openapi/docs-routes.d.ts +10 -0
- package/dist/router/openapi/docs-routes.d.ts.map +1 -0
- package/dist/router/openapi/docs-routes.js +157 -0
- package/dist/router/openapi/docs-routes.js.map +1 -0
- package/dist/router/openapi/document.d.ts +151 -0
- package/dist/router/openapi/document.d.ts.map +1 -0
- package/dist/router/openapi/document.js +471 -0
- package/dist/router/openapi/document.js.map +1 -0
- package/dist/router/openapi/index.d.ts +7 -0
- package/dist/router/openapi/index.d.ts.map +1 -0
- package/dist/router/openapi/index.js +7 -0
- package/dist/router/openapi/index.js.map +1 -0
- package/dist/router/openapi/repository-document.d.ts +30 -0
- package/dist/router/openapi/repository-document.d.ts.map +1 -0
- package/dist/router/openapi/repository-document.js +812 -0
- package/dist/router/openapi/repository-document.js.map +1 -0
- package/dist/router/openapi/schema.d.ts +30 -0
- package/dist/router/openapi/schema.d.ts.map +1 -0
- package/dist/router/openapi/schema.js +301 -0
- package/dist/router/openapi/schema.js.map +1 -0
- package/dist/router/openapi/service.d.ts +101 -0
- package/dist/router/openapi/service.d.ts.map +1 -0
- package/dist/router/openapi/service.js +162 -0
- package/dist/router/openapi/service.js.map +1 -0
- package/dist/router/repository-constraints.d.ts +15 -0
- package/dist/router/repository-constraints.d.ts.map +1 -0
- package/dist/router/repository-constraints.js +14 -0
- package/dist/router/repository-constraints.js.map +1 -0
- package/dist/router/repository-routes.d.ts +90 -0
- package/dist/router/repository-routes.d.ts.map +1 -0
- package/dist/router/repository-routes.js +452 -0
- package/dist/router/repository-routes.js.map +1 -0
- package/dist/router/routes.d.ts +24 -0
- package/dist/router/routes.d.ts.map +1 -0
- package/dist/router/routes.js +19 -0
- package/dist/router/routes.js.map +1 -0
- package/dist/runtime/application.d.ts +8 -0
- package/dist/runtime/application.d.ts.map +1 -0
- package/dist/runtime/application.js +22 -0
- package/dist/runtime/application.js.map +1 -0
- package/dist/runtime/definition.d.ts +50 -0
- package/dist/runtime/definition.d.ts.map +1 -0
- package/dist/runtime/definition.js +82 -0
- package/dist/runtime/definition.js.map +1 -0
- package/dist/runtime/index.d.ts +8 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +7 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/lifecycle.d.ts +29 -0
- package/dist/runtime/lifecycle.d.ts.map +1 -0
- package/dist/runtime/lifecycle.js +104 -0
- package/dist/runtime/lifecycle.js.map +1 -0
- package/dist/runtime/mount.d.ts +4 -0
- package/dist/runtime/mount.d.ts.map +1 -0
- package/dist/runtime/mount.js +47 -0
- package/dist/runtime/mount.js.map +1 -0
- package/dist/runtime/scope.d.ts +29 -0
- package/dist/runtime/scope.d.ts.map +1 -0
- package/dist/runtime/scope.js +48 -0
- package/dist/runtime/scope.js.map +1 -0
- package/dist/runtime/types.d.ts +55 -0
- package/dist/runtime/types.d.ts.map +1 -0
- package/dist/runtime/types.js +2 -0
- package/dist/runtime/types.js.map +1 -0
- package/dist/sample-data/index.d.ts +3 -0
- package/dist/sample-data/index.d.ts.map +1 -0
- package/dist/sample-data/index.js +3 -0
- package/dist/sample-data/index.js.map +1 -0
- package/dist/sample-data/registry.d.ts +4 -0
- package/dist/sample-data/registry.d.ts.map +1 -0
- package/dist/sample-data/registry.js +74 -0
- package/dist/sample-data/registry.js.map +1 -0
- package/dist/sample-data/token.d.ts +64 -0
- package/dist/sample-data/token.d.ts.map +1 -0
- package/dist/sample-data/token.js +7 -0
- package/dist/sample-data/token.js.map +1 -0
- package/dist/secrets/config.d.ts +15 -0
- package/dist/secrets/config.d.ts.map +1 -0
- package/dist/secrets/config.js +43 -0
- package/dist/secrets/config.js.map +1 -0
- package/dist/secrets/index.d.ts +6 -0
- package/dist/secrets/index.d.ts.map +1 -0
- package/dist/secrets/index.js +6 -0
- package/dist/secrets/index.js.map +1 -0
- package/dist/secrets/provider.d.ts +7 -0
- package/dist/secrets/provider.d.ts.map +1 -0
- package/dist/secrets/provider.js +10 -0
- package/dist/secrets/provider.js.map +1 -0
- package/dist/secrets/service.d.ts +64 -0
- package/dist/secrets/service.d.ts.map +1 -0
- package/dist/secrets/service.js +47 -0
- package/dist/secrets/service.js.map +1 -0
- package/dist/secrets/table-store.d.ts +34 -0
- package/dist/secrets/table-store.d.ts.map +1 -0
- package/dist/secrets/table-store.js +118 -0
- package/dist/secrets/table-store.js.map +1 -0
- package/dist/secrets/token.d.ts +4 -0
- package/dist/secrets/token.d.ts.map +1 -0
- package/dist/secrets/token.js +3 -0
- package/dist/secrets/token.js.map +1 -0
- package/dist/session/config.d.ts +10 -0
- package/dist/session/config.d.ts.map +1 -0
- package/dist/session/config.js +2 -0
- package/dist/session/config.js.map +1 -0
- package/dist/session/index.d.ts +4 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +4 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/provider.d.ts +26 -0
- package/dist/session/provider.d.ts.map +1 -0
- package/dist/session/provider.js +69 -0
- package/dist/session/provider.js.map +1 -0
- package/dist/session/token.d.ts +4 -0
- package/dist/session/token.d.ts.map +1 -0
- package/dist/session/token.js +3 -0
- package/dist/session/token.js.map +1 -0
- package/dist/spa/config.d.ts +5 -0
- package/dist/spa/config.d.ts.map +1 -0
- package/dist/spa/config.js +2 -0
- package/dist/spa/config.js.map +1 -0
- package/dist/spa/content-types.d.ts +2 -0
- package/dist/spa/content-types.d.ts.map +1 -0
- package/dist/spa/content-types.js +25 -0
- package/dist/spa/content-types.js.map +1 -0
- package/dist/spa/index.d.ts +9 -0
- package/dist/spa/index.d.ts.map +1 -0
- package/dist/spa/index.js +9 -0
- package/dist/spa/index.js.map +1 -0
- package/dist/spa/provider.d.ts +13 -0
- package/dist/spa/provider.d.ts.map +1 -0
- package/dist/spa/provider.js +90 -0
- package/dist/spa/provider.js.map +1 -0
- package/dist/spa/routes.d.ts +4 -0
- package/dist/spa/routes.d.ts.map +1 -0
- package/dist/spa/routes.js +58 -0
- package/dist/spa/routes.js.map +1 -0
- package/dist/spa/runtime-html.d.ts +14 -0
- package/dist/spa/runtime-html.d.ts.map +1 -0
- package/dist/spa/runtime-html.js +85 -0
- package/dist/spa/runtime-html.js.map +1 -0
- package/dist/spa/serve-index.d.ts +9 -0
- package/dist/spa/serve-index.d.ts.map +1 -0
- package/dist/spa/serve-index.js +12 -0
- package/dist/spa/serve-index.js.map +1 -0
- package/dist/spa/static-assets.d.ts +7 -0
- package/dist/spa/static-assets.d.ts.map +1 -0
- package/dist/spa/static-assets.js +90 -0
- package/dist/spa/static-assets.js.map +1 -0
- package/dist/spa/types.d.ts +23 -0
- package/dist/spa/types.d.ts.map +1 -0
- package/dist/spa/types.js +2 -0
- package/dist/spa/types.js.map +1 -0
- package/dist/support/index.d.ts +4 -0
- package/dist/support/index.d.ts.map +1 -0
- package/dist/support/index.js +4 -0
- package/dist/support/index.js.map +1 -0
- package/dist/support/paths.d.ts +10 -0
- package/dist/support/paths.d.ts.map +1 -0
- package/dist/support/paths.js +25 -0
- package/dist/support/paths.js.map +1 -0
- package/dist/support/redirects.d.ts +3 -0
- package/dist/support/redirects.d.ts.map +1 -0
- package/dist/support/redirects.js +48 -0
- package/dist/support/redirects.js.map +1 -0
- package/dist/support/requests.d.ts +2 -0
- package/dist/support/requests.d.ts.map +1 -0
- package/dist/support/requests.js +13 -0
- package/dist/support/requests.js.map +1 -0
- package/dist/swagger-ui/LICENSE +202 -0
- package/dist/swagger-ui/NOTICE +2 -0
- package/dist/swagger-ui/favicon-16x16.png +0 -0
- package/dist/swagger-ui/favicon-32x32.png +0 -0
- package/dist/swagger-ui/swagger-ui-bundle.js +2 -0
- package/dist/swagger-ui/swagger-ui-bundle.js.LICENSE.txt +129 -0
- package/dist/swagger-ui/swagger-ui.css +3 -0
- package/dist/websocket.d.ts +61 -0
- package/dist/websocket.d.ts.map +1 -0
- package/dist/websocket.js +371 -0
- package/dist/websocket.js.map +1 -0
- package/package.json +193 -12
- package/LICENSE +0 -661
- package/lib/config/cache.d.ts +0 -2
- package/lib/config/cache.js +0 -16
- package/lib/config/database.d.ts +0 -3
- package/lib/config/database.js +0 -25
- package/lib/config/index.d.ts +0 -10
- package/lib/config/index.js +0 -20
- package/lib/config/logger.d.ts +0 -3
- package/lib/config/logger.js +0 -11
- package/lib/config/plugins.d.ts +0 -3
- package/lib/config/plugins.js +0 -8
- package/lib/config/resourcer.d.ts +0 -4
- package/lib/config/resourcer.js +0 -10
- package/lib/index.d.ts +0 -3
- package/lib/index.js +0 -21
- package/src/config/cache.ts +0 -5
- package/src/config/database.ts +0 -21
- package/src/config/index.ts +0 -13
- package/src/config/logger.ts +0 -6
- package/src/config/plugins.ts +0 -3
- package/src/config/resourcer.ts +0 -3
- package/src/index.ts +0 -10
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import type { Context, MiddlewareHandler, NotFoundHandler } from 'hono';
|
|
2
|
+
import type { ContentfulStatusCode } from 'hono/utils/http-status';
|
|
3
|
+
/**
|
|
4
|
+
* The error categories an `/api` response may report, with the HTTP status each one maps to. The names and mapping are
|
|
5
|
+
* Google's canonical error codes (AIP-193), so a client branches on a fixed, documented set rather than on whatever
|
|
6
|
+
* each plugin invents. `reason` carries the plugin-specific detail.
|
|
7
|
+
*/
|
|
8
|
+
export declare const apiErrorStatusCodes: {
|
|
9
|
+
readonly INVALID_ARGUMENT: 400;
|
|
10
|
+
readonly FAILED_PRECONDITION: 400;
|
|
11
|
+
readonly OUT_OF_RANGE: 400;
|
|
12
|
+
readonly UNAUTHENTICATED: 401;
|
|
13
|
+
readonly PERMISSION_DENIED: 403;
|
|
14
|
+
readonly NOT_FOUND: 404;
|
|
15
|
+
readonly ALREADY_EXISTS: 409;
|
|
16
|
+
readonly ABORTED: 409;
|
|
17
|
+
readonly RESOURCE_EXHAUSTED: 429;
|
|
18
|
+
readonly INTERNAL: 500;
|
|
19
|
+
readonly UNIMPLEMENTED: 501;
|
|
20
|
+
readonly UNAVAILABLE: 503;
|
|
21
|
+
readonly DEADLINE_EXCEEDED: 504;
|
|
22
|
+
};
|
|
23
|
+
export type ApiErrorStatus = keyof typeof apiErrorStatusCodes;
|
|
24
|
+
/** The error reasons and domain the framework itself reports. Plugins use their own domain and reasons. */
|
|
25
|
+
export declare const appErrorDomain = "app";
|
|
26
|
+
export interface ApiLocalizedMessage {
|
|
27
|
+
readonly locale: string;
|
|
28
|
+
readonly message: string;
|
|
29
|
+
}
|
|
30
|
+
/** One invalid field in a request, as AIP-193's `BadRequest.FieldViolation`. */
|
|
31
|
+
export interface ApiFieldViolation {
|
|
32
|
+
/** Path to the field, such as `releaseId` or `items[2].name`. */
|
|
33
|
+
readonly field: string;
|
|
34
|
+
readonly description: string;
|
|
35
|
+
readonly reason?: string;
|
|
36
|
+
}
|
|
37
|
+
export interface ApiErrorOptions {
|
|
38
|
+
readonly status: ApiErrorStatus;
|
|
39
|
+
/** What went wrong, in UPPER_SNAKE_CASE, unique within `domain`. Clients branch on `reason`, never on `message`. */
|
|
40
|
+
readonly reason: string;
|
|
41
|
+
/** Who defined `reason`: the plugin's URL namespace, such as `hub`, or `app` for the framework. */
|
|
42
|
+
readonly domain: string;
|
|
43
|
+
/** Developer-facing English description. Never shown to end users and never relied on by clients. */
|
|
44
|
+
readonly message: string;
|
|
45
|
+
/** User-facing text already translated by the handler. */
|
|
46
|
+
readonly localizedMessage?: ApiLocalizedMessage;
|
|
47
|
+
readonly fieldViolations?: readonly ApiFieldViolation[];
|
|
48
|
+
/** Further machine-readable facts about this occurrence. Values must be JSON-serializable. */
|
|
49
|
+
readonly metadata?: Readonly<Record<string, unknown>>;
|
|
50
|
+
/**
|
|
51
|
+
* The HTTP status to answer with when a protocol requires one the status table does not produce, such as 413 or
|
|
52
|
+
* 415. Leave unset otherwise: the status from `status` is what clients expect.
|
|
53
|
+
*/
|
|
54
|
+
readonly httpStatus?: ContentfulStatusCode;
|
|
55
|
+
readonly cause?: unknown;
|
|
56
|
+
}
|
|
57
|
+
export interface ApiErrorPayload {
|
|
58
|
+
readonly code: number;
|
|
59
|
+
readonly status: ApiErrorStatus;
|
|
60
|
+
readonly reason: string;
|
|
61
|
+
readonly domain: string;
|
|
62
|
+
readonly message: string;
|
|
63
|
+
readonly localizedMessage?: ApiLocalizedMessage;
|
|
64
|
+
readonly fieldViolations?: readonly ApiFieldViolation[];
|
|
65
|
+
readonly metadata?: Readonly<Record<string, unknown>>;
|
|
66
|
+
readonly requestId?: string;
|
|
67
|
+
}
|
|
68
|
+
/** The body of every failed `/api` response. */
|
|
69
|
+
export interface ApiErrorBody {
|
|
70
|
+
readonly error: ApiErrorPayload;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* An error a route throws to answer with the standard `/api` error body.
|
|
74
|
+
*
|
|
75
|
+
* ```ts
|
|
76
|
+
* throw new ApiError({ status: 'NOT_FOUND', reason: 'APP_NOT_FOUND', domain: 'hub', message: `App ${id} was not found.` });
|
|
77
|
+
* ```
|
|
78
|
+
*/
|
|
79
|
+
export declare class ApiError extends Error {
|
|
80
|
+
/** The HTTP status of the response. */
|
|
81
|
+
readonly code: ContentfulStatusCode;
|
|
82
|
+
readonly status: ApiErrorStatus;
|
|
83
|
+
readonly reason: string;
|
|
84
|
+
readonly domain: string;
|
|
85
|
+
readonly localizedMessage: ApiLocalizedMessage | undefined;
|
|
86
|
+
readonly fieldViolations: readonly ApiFieldViolation[] | undefined;
|
|
87
|
+
readonly metadata: Readonly<Record<string, unknown>> | undefined;
|
|
88
|
+
constructor(options: ApiErrorOptions);
|
|
89
|
+
toPayload(requestId?: string): ApiErrorPayload;
|
|
90
|
+
}
|
|
91
|
+
/** The canonical status for an HTTP status code, for errors raised as bare HTTP statuses. */
|
|
92
|
+
export declare function apiErrorStatusFromHttp(code: number): ApiErrorStatus;
|
|
93
|
+
/**
|
|
94
|
+
* The `ApiError` for an error the framework recognizes, or `undefined` for one it does not:
|
|
95
|
+
*
|
|
96
|
+
* - an `ApiError` as it is;
|
|
97
|
+
* - Hono's `HTTPException`, and any error that carries a 4xx `status` the way Hono's `getResponse()` convention does
|
|
98
|
+
* (such as `AuthorizationDeniedError`), with their status and message, and a string `reason` and `domain` on such an
|
|
99
|
+
* error kept too;
|
|
100
|
+
* - a `RepositoryError` whose `status` is not `INTERNAL` (a refused write, a missing record, a version conflict), with
|
|
101
|
+
* that status, its code as `reason`, domain `app`, and its `path` and `details` as `metadata`. One that is the
|
|
102
|
+
* server's own fault, such as an invalid Policy, is not recognized.
|
|
103
|
+
*/
|
|
104
|
+
export declare function recognizeApiError(error: unknown): ApiError | undefined;
|
|
105
|
+
/**
|
|
106
|
+
* Convert anything a route threw into an `ApiError`: what `recognizeApiError` recognizes, and anything else as an
|
|
107
|
+
* unexpected failure answered with a 500 that reveals nothing about its cause.
|
|
108
|
+
*/
|
|
109
|
+
export declare function toApiError(error: unknown): ApiError;
|
|
110
|
+
export declare function apiErrorBody(error: ApiError, requestId?: string): ApiErrorBody;
|
|
111
|
+
/**
|
|
112
|
+
* The `onError` for a plugin's router: it answers every error `recognizeApiError` recognizes in the standard body and
|
|
113
|
+
* rethrows the rest, so an enclosing router can still translate it and the application answers an unexpected failure
|
|
114
|
+
* with an opaque 500. A router that translates its own domain errors does that first and then delegates here. Install
|
|
115
|
+
* it even though the application renders the same errors: a router tested on a bare Hono has no `/api` handler.
|
|
116
|
+
*/
|
|
117
|
+
export declare function apiErrorHandler(error: unknown, context: Context): Response;
|
|
118
|
+
export declare const apiNotFoundHandler: NotFoundHandler;
|
|
119
|
+
/** One problem a schema reported, as zod and Standard Schema issues are shaped. */
|
|
120
|
+
export interface ApiInputIssue {
|
|
121
|
+
readonly path: readonly PropertyKey[];
|
|
122
|
+
readonly message: string;
|
|
123
|
+
readonly code?: string;
|
|
124
|
+
}
|
|
125
|
+
/** A schema with zod's `safeParse`, matched by shape so the framework does not depend on a zod version. */
|
|
126
|
+
export interface ApiInputSchema<T> {
|
|
127
|
+
safeParse(value: unknown): {
|
|
128
|
+
readonly success: true;
|
|
129
|
+
readonly data: T;
|
|
130
|
+
} | {
|
|
131
|
+
readonly success: false;
|
|
132
|
+
readonly error: {
|
|
133
|
+
readonly issues: readonly ApiInputIssue[];
|
|
134
|
+
};
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Validate request input against a schema, returning the parsed value or throwing a 400 `INVALID_ARGUMENT` that names
|
|
139
|
+
* every invalid field. Use it inside Hono's `validator()` so handlers read only `context.req.valid(...)`.
|
|
140
|
+
*
|
|
141
|
+
* Superseded by `apiValidator(target, schema)`, which answers the same error and also declares the schema in the API
|
|
142
|
+
* document. Routes not yet migrated keep working with this.
|
|
143
|
+
*/
|
|
144
|
+
export declare function parseApiInput<T>(schema: ApiInputSchema<T>, value: unknown): T;
|
|
145
|
+
/**
|
|
146
|
+
* The 400 `INVALID_ARGUMENT` with reason `INVALID_INPUT` and one field violation per issue that every input validator
|
|
147
|
+
* answers. A path segment may be a key or a Standard Schema `{ key }` segment; a `code` on an issue, as zod sets one,
|
|
148
|
+
* becomes the violation's `reason`.
|
|
149
|
+
*/
|
|
150
|
+
export declare function invalidApiInputError(issues: readonly ApiInputIssueLike[]): ApiError;
|
|
151
|
+
/** An issue as zod and Standard Schema report one, whose path segments may be keys or `{ key }` objects. */
|
|
152
|
+
export interface ApiInputIssueLike {
|
|
153
|
+
readonly message: string;
|
|
154
|
+
readonly path?: readonly (PropertyKey | {
|
|
155
|
+
readonly key: PropertyKey;
|
|
156
|
+
})[] | undefined;
|
|
157
|
+
}
|
|
158
|
+
export declare const requestIdHeader = "x-request-id";
|
|
159
|
+
declare module 'hono' {
|
|
160
|
+
interface ContextVariableMap {
|
|
161
|
+
requestId: string;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* The id of the current request: an `x-request-id` the caller sent, when it is short and plain enough to log safely,
|
|
166
|
+
* otherwise a new UUID. The first call per request decides it, so the request log and the response always agree.
|
|
167
|
+
*/
|
|
168
|
+
export declare function getRequestId(context: Context): string;
|
|
169
|
+
/** Echo the request id in the `x-request-id` response header, so a user reporting a failure can quote it. */
|
|
170
|
+
export declare function requestIdMiddleware(): MiddlewareHandler;
|
|
171
|
+
//# sourceMappingURL=api-error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-error.d.ts","sourceRoot":"","sources":["../../src/router/api-error.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { RepositoryError } from '@nocobase/db';
|
|
3
|
+
import { createMiddleware } from 'hono/factory';
|
|
4
|
+
import { HTTPException } from 'hono/http-exception';
|
|
5
|
+
/**
|
|
6
|
+
* The error categories an `/api` response may report, with the HTTP status each one maps to. The names and mapping are
|
|
7
|
+
* Google's canonical error codes (AIP-193), so a client branches on a fixed, documented set rather than on whatever
|
|
8
|
+
* each plugin invents. `reason` carries the plugin-specific detail.
|
|
9
|
+
*/
|
|
10
|
+
export const apiErrorStatusCodes = Object.freeze({
|
|
11
|
+
INVALID_ARGUMENT: 400,
|
|
12
|
+
FAILED_PRECONDITION: 400,
|
|
13
|
+
OUT_OF_RANGE: 400,
|
|
14
|
+
UNAUTHENTICATED: 401,
|
|
15
|
+
PERMISSION_DENIED: 403,
|
|
16
|
+
NOT_FOUND: 404,
|
|
17
|
+
ALREADY_EXISTS: 409,
|
|
18
|
+
ABORTED: 409,
|
|
19
|
+
RESOURCE_EXHAUSTED: 429,
|
|
20
|
+
INTERNAL: 500,
|
|
21
|
+
UNIMPLEMENTED: 501,
|
|
22
|
+
UNAVAILABLE: 503,
|
|
23
|
+
DEADLINE_EXCEEDED: 504,
|
|
24
|
+
});
|
|
25
|
+
/** The error reasons and domain the framework itself reports. Plugins use their own domain and reasons. */
|
|
26
|
+
export const appErrorDomain = 'app';
|
|
27
|
+
/**
|
|
28
|
+
* An error a route throws to answer with the standard `/api` error body.
|
|
29
|
+
*
|
|
30
|
+
* ```ts
|
|
31
|
+
* throw new ApiError({ status: 'NOT_FOUND', reason: 'APP_NOT_FOUND', domain: 'hub', message: `App ${id} was not found.` });
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export class ApiError extends Error {
|
|
35
|
+
/** The HTTP status of the response. */
|
|
36
|
+
code;
|
|
37
|
+
status;
|
|
38
|
+
reason;
|
|
39
|
+
domain;
|
|
40
|
+
localizedMessage;
|
|
41
|
+
fieldViolations;
|
|
42
|
+
metadata;
|
|
43
|
+
constructor(options) {
|
|
44
|
+
super(options.message, options.cause === undefined ? undefined : { cause: options.cause });
|
|
45
|
+
this.name = 'ApiError';
|
|
46
|
+
this.code = options.httpStatus ?? apiErrorStatusCodes[options.status];
|
|
47
|
+
this.status = options.status;
|
|
48
|
+
this.reason = options.reason;
|
|
49
|
+
this.domain = options.domain;
|
|
50
|
+
this.localizedMessage = options.localizedMessage;
|
|
51
|
+
this.fieldViolations = options.fieldViolations;
|
|
52
|
+
this.metadata = options.metadata;
|
|
53
|
+
}
|
|
54
|
+
toPayload(requestId) {
|
|
55
|
+
return {
|
|
56
|
+
code: this.code,
|
|
57
|
+
status: this.status,
|
|
58
|
+
reason: this.reason,
|
|
59
|
+
domain: this.domain,
|
|
60
|
+
message: this.message,
|
|
61
|
+
...(this.localizedMessage
|
|
62
|
+
? { localizedMessage: this.localizedMessage }
|
|
63
|
+
: {}),
|
|
64
|
+
...(this.fieldViolations?.length
|
|
65
|
+
? { fieldViolations: this.fieldViolations }
|
|
66
|
+
: {}),
|
|
67
|
+
...(this.metadata ? { metadata: this.metadata } : {}),
|
|
68
|
+
...(requestId ? { requestId } : {}),
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
const statusByHttpCode = {
|
|
73
|
+
400: 'INVALID_ARGUMENT',
|
|
74
|
+
401: 'UNAUTHENTICATED',
|
|
75
|
+
403: 'PERMISSION_DENIED',
|
|
76
|
+
404: 'NOT_FOUND',
|
|
77
|
+
409: 'ABORTED',
|
|
78
|
+
413: 'INVALID_ARGUMENT',
|
|
79
|
+
415: 'INVALID_ARGUMENT',
|
|
80
|
+
429: 'RESOURCE_EXHAUSTED',
|
|
81
|
+
501: 'UNIMPLEMENTED',
|
|
82
|
+
503: 'UNAVAILABLE',
|
|
83
|
+
504: 'DEADLINE_EXCEEDED',
|
|
84
|
+
};
|
|
85
|
+
/** The canonical status for an HTTP status code, for errors raised as bare HTTP statuses. */
|
|
86
|
+
export function apiErrorStatusFromHttp(code) {
|
|
87
|
+
return (statusByHttpCode[code] ?? (code >= 500 ? 'INTERNAL' : 'FAILED_PRECONDITION'));
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* The `ApiError` for an error the framework recognizes, or `undefined` for one it does not:
|
|
91
|
+
*
|
|
92
|
+
* - an `ApiError` as it is;
|
|
93
|
+
* - Hono's `HTTPException`, and any error that carries a 4xx `status` the way Hono's `getResponse()` convention does
|
|
94
|
+
* (such as `AuthorizationDeniedError`), with their status and message, and a string `reason` and `domain` on such an
|
|
95
|
+
* error kept too;
|
|
96
|
+
* - a `RepositoryError` whose `status` is not `INTERNAL` (a refused write, a missing record, a version conflict), with
|
|
97
|
+
* that status, its code as `reason`, domain `app`, and its `path` and `details` as `metadata`. One that is the
|
|
98
|
+
* server's own fault, such as an invalid Policy, is not recognized.
|
|
99
|
+
*/
|
|
100
|
+
export function recognizeApiError(error) {
|
|
101
|
+
if (error instanceof ApiError)
|
|
102
|
+
return error;
|
|
103
|
+
if (error instanceof HTTPException) {
|
|
104
|
+
return new ApiError({
|
|
105
|
+
status: apiErrorStatusFromHttp(error.status),
|
|
106
|
+
reason: `HTTP_${error.status}`,
|
|
107
|
+
domain: appErrorDomain,
|
|
108
|
+
message: error.message || `Request failed with status ${error.status}.`,
|
|
109
|
+
httpStatus: error.status,
|
|
110
|
+
cause: error,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
const repositoryError = repositoryApiError(error);
|
|
114
|
+
if (repositoryError)
|
|
115
|
+
return repositoryError;
|
|
116
|
+
const statusError = readStatusError(error);
|
|
117
|
+
if (statusError) {
|
|
118
|
+
return new ApiError({
|
|
119
|
+
status: apiErrorStatusFromHttp(statusError.status),
|
|
120
|
+
reason: statusError.reason ?? `HTTP_${statusError.status}`,
|
|
121
|
+
domain: statusError.domain ?? appErrorDomain,
|
|
122
|
+
message: statusError.message,
|
|
123
|
+
httpStatus: statusError.status,
|
|
124
|
+
cause: error,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
return undefined;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Convert anything a route threw into an `ApiError`: what `recognizeApiError` recognizes, and anything else as an
|
|
131
|
+
* unexpected failure answered with a 500 that reveals nothing about its cause.
|
|
132
|
+
*/
|
|
133
|
+
export function toApiError(error) {
|
|
134
|
+
return (recognizeApiError(error) ??
|
|
135
|
+
new ApiError({
|
|
136
|
+
status: 'INTERNAL',
|
|
137
|
+
reason: 'INTERNAL_ERROR',
|
|
138
|
+
domain: appErrorDomain,
|
|
139
|
+
message: 'Internal server error.',
|
|
140
|
+
cause: error,
|
|
141
|
+
}));
|
|
142
|
+
}
|
|
143
|
+
function readStatusError(error) {
|
|
144
|
+
if (!(error instanceof Error) || !('status' in error))
|
|
145
|
+
return undefined;
|
|
146
|
+
const { status } = error;
|
|
147
|
+
if (typeof status !== 'number' || status < 400 || status > 499)
|
|
148
|
+
return undefined;
|
|
149
|
+
const fields = error;
|
|
150
|
+
return {
|
|
151
|
+
status,
|
|
152
|
+
message: error.message,
|
|
153
|
+
...(typeof fields.reason === 'string' ? { reason: fields.reason } : {}),
|
|
154
|
+
...(typeof fields.domain === 'string' ? { domain: fields.domain } : {}),
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
export function apiErrorBody(error, requestId) {
|
|
158
|
+
return { error: error.toPayload(requestId) };
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Answer with the standard error body for `error`, carrying the request's id; anything unrecognized is an opaque 500.
|
|
162
|
+
* Framework-internal: plugins answer through `apiErrorHandler`, which rethrows what it does not recognize.
|
|
163
|
+
*/
|
|
164
|
+
function apiErrorResponse(context, error) {
|
|
165
|
+
const apiError = toApiError(error);
|
|
166
|
+
return context.json(apiErrorBody(apiError, getRequestId(context)), apiError.code);
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* The `onError` for a plugin's router: it answers every error `recognizeApiError` recognizes in the standard body and
|
|
170
|
+
* rethrows the rest, so an enclosing router can still translate it and the application answers an unexpected failure
|
|
171
|
+
* with an opaque 500. A router that translates its own domain errors does that first and then delegates here. Install
|
|
172
|
+
* it even though the application renders the same errors: a router tested on a bare Hono has no `/api` handler.
|
|
173
|
+
*/
|
|
174
|
+
export function apiErrorHandler(error, context) {
|
|
175
|
+
const known = recognizeApiError(error);
|
|
176
|
+
if (known)
|
|
177
|
+
return apiErrorResponse(context, known);
|
|
178
|
+
throw error;
|
|
179
|
+
}
|
|
180
|
+
export const apiNotFoundHandler = (context) => apiErrorResponse(context, new ApiError({
|
|
181
|
+
status: 'NOT_FOUND',
|
|
182
|
+
reason: 'ROUTE_NOT_FOUND',
|
|
183
|
+
domain: appErrorDomain,
|
|
184
|
+
message: `No API route matches ${context.req.method} ${context.req.path}.`,
|
|
185
|
+
}));
|
|
186
|
+
/**
|
|
187
|
+
* Validate request input against a schema, returning the parsed value or throwing a 400 `INVALID_ARGUMENT` that names
|
|
188
|
+
* every invalid field. Use it inside Hono's `validator()` so handlers read only `context.req.valid(...)`.
|
|
189
|
+
*
|
|
190
|
+
* Superseded by `apiValidator(target, schema)`, which answers the same error and also declares the schema in the API
|
|
191
|
+
* document. Routes not yet migrated keep working with this.
|
|
192
|
+
*/
|
|
193
|
+
export function parseApiInput(schema, value) {
|
|
194
|
+
const result = schema.safeParse(value);
|
|
195
|
+
if (result.success)
|
|
196
|
+
return result.data;
|
|
197
|
+
throw invalidApiInputError(result.error.issues);
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* The 400 `INVALID_ARGUMENT` with reason `INVALID_INPUT` and one field violation per issue that every input validator
|
|
201
|
+
* answers. A path segment may be a key or a Standard Schema `{ key }` segment; a `code` on an issue, as zod sets one,
|
|
202
|
+
* becomes the violation's `reason`.
|
|
203
|
+
*/
|
|
204
|
+
export function invalidApiInputError(issues) {
|
|
205
|
+
return new ApiError({
|
|
206
|
+
status: 'INVALID_ARGUMENT',
|
|
207
|
+
reason: 'INVALID_INPUT',
|
|
208
|
+
domain: appErrorDomain,
|
|
209
|
+
message: 'The request contains invalid fields.',
|
|
210
|
+
fieldViolations: issues.map((issue) => {
|
|
211
|
+
const code = issue.code;
|
|
212
|
+
return {
|
|
213
|
+
field: (issue.path ?? [])
|
|
214
|
+
.map((segment) => typeof segment === 'object' && segment !== null
|
|
215
|
+
? String(segment.key)
|
|
216
|
+
: String(segment))
|
|
217
|
+
.join('.'),
|
|
218
|
+
description: issue.message,
|
|
219
|
+
...(typeof code === 'string' && code ? { reason: code } : {}),
|
|
220
|
+
};
|
|
221
|
+
}),
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
export const requestIdHeader = 'x-request-id';
|
|
225
|
+
const maxRequestIdLength = 255;
|
|
226
|
+
const requestIdPattern = /^[\w\-=.]+$/;
|
|
227
|
+
/**
|
|
228
|
+
* The id of the current request: an `x-request-id` the caller sent, when it is short and plain enough to log safely,
|
|
229
|
+
* otherwise a new UUID. The first call per request decides it, so the request log and the response always agree.
|
|
230
|
+
*/
|
|
231
|
+
export function getRequestId(context) {
|
|
232
|
+
const existing = context.get('requestId');
|
|
233
|
+
if (existing)
|
|
234
|
+
return existing;
|
|
235
|
+
const incoming = context.req.header(requestIdHeader);
|
|
236
|
+
const requestId = incoming &&
|
|
237
|
+
incoming.length <= maxRequestIdLength &&
|
|
238
|
+
requestIdPattern.test(incoming)
|
|
239
|
+
? incoming
|
|
240
|
+
: randomUUID();
|
|
241
|
+
context.set('requestId', requestId);
|
|
242
|
+
return requestId;
|
|
243
|
+
}
|
|
244
|
+
/** Echo the request id in the `x-request-id` response header, so a user reporting a failure can quote it. */
|
|
245
|
+
export function requestIdMiddleware() {
|
|
246
|
+
return createMiddleware(async (context, next) => {
|
|
247
|
+
const requestId = getRequestId(context);
|
|
248
|
+
await next();
|
|
249
|
+
try {
|
|
250
|
+
context.res.headers.set(requestIdHeader, requestId);
|
|
251
|
+
}
|
|
252
|
+
catch {
|
|
253
|
+
// A response passed through from upstream can carry immutable headers.
|
|
254
|
+
context.res = new Response(context.res.body, context.res);
|
|
255
|
+
context.res.headers.set(requestIdHeader, requestId);
|
|
256
|
+
}
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* The standard API error for a Repository error the caller may see, or `undefined` for one that is the server's own
|
|
261
|
+
* fault and must surface as an opaque 500. The error's own `status` decides which, so a code added to the Repository
|
|
262
|
+
* needs nothing here. Any route that lets a Repository error propagate answers this way.
|
|
263
|
+
*/
|
|
264
|
+
function repositoryApiError(error) {
|
|
265
|
+
if (!(error instanceof RepositoryError) || error.status === 'INTERNAL')
|
|
266
|
+
return undefined;
|
|
267
|
+
const field = error.path?.map(String).join('.');
|
|
268
|
+
return new ApiError({
|
|
269
|
+
status: error.status,
|
|
270
|
+
reason: error.code,
|
|
271
|
+
domain: appErrorDomain,
|
|
272
|
+
message: error.message,
|
|
273
|
+
...(error.status === 'INVALID_ARGUMENT' && field
|
|
274
|
+
? {
|
|
275
|
+
fieldViolations: [
|
|
276
|
+
{ field, description: error.message, reason: error.code },
|
|
277
|
+
],
|
|
278
|
+
}
|
|
279
|
+
: {}),
|
|
280
|
+
...(error.path === undefined && error.details === undefined
|
|
281
|
+
? {}
|
|
282
|
+
: {
|
|
283
|
+
metadata: {
|
|
284
|
+
...(error.path === undefined ? {} : { path: error.path }),
|
|
285
|
+
...(error.details === undefined ? {} : { details: error.details }),
|
|
286
|
+
},
|
|
287
|
+
}),
|
|
288
|
+
cause: error,
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
//# sourceMappingURL=api-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-error.js","sourceRoot":"","sources":["../../src/router/api-error.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import type { Hono, MiddlewareHandler } from 'hono';
|
|
2
|
+
import { type AppConfigDefinition, type AppConfigFactory, type ConfigValidator } from '../config/define-app-config.js';
|
|
3
|
+
/** A duration: a number of milliseconds, or a string such as `500ms`, `30s`, `1m` or `1h`. */
|
|
4
|
+
export type ApiDuration = number | string;
|
|
5
|
+
/** A size: a number of bytes, or a string such as `512kb`, `10mb` or `1gb` (powers of 1024). */
|
|
6
|
+
export type ApiSize = number | string;
|
|
7
|
+
export interface ApiRateLimitConfig {
|
|
8
|
+
/** How many requests one client may make per `window`. */
|
|
9
|
+
readonly max: number;
|
|
10
|
+
readonly window: ApiDuration;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* The `api` section: limits the application applies to every `/api` request, ahead of any route. Each one is off while
|
|
14
|
+
* it is unset, and nothing is installed for it.
|
|
15
|
+
*/
|
|
16
|
+
export interface ApiConfig {
|
|
17
|
+
/** The largest request body any `/api` route accepts. Routes still set their own, usually smaller, limit. */
|
|
18
|
+
readonly bodyLimit?: ApiSize | null;
|
|
19
|
+
/** How long a handler may take to produce its response. A streaming response that has started is not cut off. */
|
|
20
|
+
readonly timeout?: ApiDuration | null;
|
|
21
|
+
/** Requests per client per window, counted in this process. */
|
|
22
|
+
readonly rateLimit?: ApiRateLimitConfig | null;
|
|
23
|
+
}
|
|
24
|
+
/** The `api` section with every value resolved to a number. */
|
|
25
|
+
export interface ResolvedApiLimits {
|
|
26
|
+
readonly bodyLimitBytes?: number;
|
|
27
|
+
readonly timeoutMs?: number;
|
|
28
|
+
readonly rateLimit?: {
|
|
29
|
+
readonly max: number;
|
|
30
|
+
readonly windowMs: number;
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/** Milliseconds for a duration such as `30s`; a bare number, or a string of digits, is milliseconds. */
|
|
34
|
+
export declare function parseApiDuration(value: unknown, name: string): number;
|
|
35
|
+
/** Bytes for a size such as `10mb`; a bare number, or a string of digits, is bytes. */
|
|
36
|
+
export declare function parseApiSize(value: unknown, name: string): number;
|
|
37
|
+
/** Resolves the `api` section, throwing on the first malformed value. An unset or `null` value stays off. */
|
|
38
|
+
export declare function resolveApiLimits(config: ApiConfig | undefined): ResolvedApiLimits;
|
|
39
|
+
/** The rules the `api` section is held to, run at start, on reload and by `config check`. */
|
|
40
|
+
export declare const validateApiConfig: ConfigValidator<ApiConfig>;
|
|
41
|
+
/**
|
|
42
|
+
* Declares the `api` section with the framework's validation and environment variables, in place of
|
|
43
|
+
* `defineAppConfig`. Every limit defaults to off. A `validate` given here runs after the framework's own.
|
|
44
|
+
*/
|
|
45
|
+
export declare function defineApiConfig(definition?: Partial<AppConfigDefinition<ApiConfig>>): AppConfigFactory<ApiConfig>;
|
|
46
|
+
export interface InstallApiLimitsOptions {
|
|
47
|
+
/** The clock the rate limiter reads, for tests. */
|
|
48
|
+
readonly now?: () => number;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Installs the configured limits on the `/api` router, in the order a request meets them: the rate limit, before any
|
|
52
|
+
* work is done for a client already over it; then the deadline, which also covers reading the body; then the body
|
|
53
|
+
* ceiling. Nothing is installed for a limit that is not configured. Call it after the request id middleware, so every
|
|
54
|
+
* refusal carries the request's id, and before any route.
|
|
55
|
+
*/
|
|
56
|
+
export declare function installApiLimits(api: Hono, config: ApiConfig | undefined, options?: InstallApiLimitsOptions): void;
|
|
57
|
+
/** Refuses a body over `maxBytes` with `413 BODY_TOO_LARGE`, whether it declares its length or streams it. */
|
|
58
|
+
export declare function apiBodyLimitMiddleware(maxBytes: number): MiddlewareHandler;
|
|
59
|
+
/**
|
|
60
|
+
* Answers `503 REQUEST_TIMEOUT` when the handler has not returned its response within `timeoutMs`.
|
|
61
|
+
*
|
|
62
|
+
* The deadline covers the time until the response object exists, not the time spent sending it, so a streaming
|
|
63
|
+
* response that has started runs to its end. The handler itself cannot be cancelled and keeps running after the
|
|
64
|
+
* deadline; what it eventually returns or throws is discarded.
|
|
65
|
+
*/
|
|
66
|
+
export declare function apiTimeoutMiddleware(timeoutMs: number): MiddlewareHandler;
|
|
67
|
+
/**
|
|
68
|
+
* Counts requests per client in fixed windows and answers `429 RATE_LIMITED`, with `Retry-After` in seconds, once a
|
|
69
|
+
* client exceeds `max` in its current window.
|
|
70
|
+
*
|
|
71
|
+
* The client is the address of the connection, read from the Node.js server bindings. The signed-in user is not known
|
|
72
|
+
* at this point: authentication runs inside the routes that need it. A request whose address is unknown, such as one an
|
|
73
|
+
* in-process Hub forwards, is not counted. Counters live in this process, so each instance of a multi-instance
|
|
74
|
+
* deployment counts on its own.
|
|
75
|
+
*/
|
|
76
|
+
export declare function apiRateLimitMiddleware(limit: {
|
|
77
|
+
readonly max: number;
|
|
78
|
+
readonly windowMs: number;
|
|
79
|
+
}, options?: InstallApiLimitsOptions): MiddlewareHandler;
|
|
80
|
+
//# sourceMappingURL=api-limits.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-limits.d.ts","sourceRoot":"","sources":["../../src/router/api-limits.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,IAAI,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAI7D,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACrB,MAAM,gCAAgC,CAAC;AAIxC,8FAA8F;AAC9F,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,CAAC;AAE1C,gGAAgG;AAChG,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;AAEtC,MAAM,WAAW,kBAAkB;IACjC,0DAA0D;IAC1D,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;CAC9B;AAED;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,6GAA6G;IAC7G,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACpC,iHAAiH;IACjH,QAAQ,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IACtC,+DAA+D;IAC/D,QAAQ,CAAC,SAAS,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;CAChD;AAED,+DAA+D;AAC/D,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;CAC1E;AAgBD,wGAAwG;AACxG,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAOrE;AAED,uFAAuF;AACvF,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAOjE;AAkCD,6GAA6G;AAC7G,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,SAAS,GAAG,SAAS,GAC5B,iBAAiB,CAanB;AAgBD,6FAA6F;AAC7F,eAAO,MAAM,iBAAiB,EAAE,eAAe,CAAC,SAAS,CAkDxD,CAAC;AAgBF;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,UAAU,GAAE,OAAO,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAM,GACvD,gBAAgB,CAAC,SAAS,CAAC,CAa7B;AAKD,MAAM,WAAW,uBAAuB;IACtC,mDAAmD;IACnD,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CAC7B;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,IAAI,EACT,MAAM,EAAE,SAAS,GAAG,SAAS,EAC7B,OAAO,GAAE,uBAA4B,GACpC,IAAI,CAQN;AAED,8GAA8G;AAC9G,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,CAe1E;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,iBAAiB,CA6BzE;AAUD;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE;IAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,EAC1D,OAAO,GAAE,uBAA4B,GACpC,iBAAiB,CAuCnB"}
|