@sixthsummit/ship-api 0.0.0-stage → 4.1.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/CHANGELOG.md +605 -0
- package/LICENSE +202 -0
- package/NOTICE +4 -0
- package/README.md +58 -2
- package/cli/commands/add.js +537 -0
- package/cli/commands/contract.js +2 -0
- package/cli/commands/create.js +250 -0
- package/cli/commands/dev.js +227 -0
- package/cli/commands/doctor.js +286 -0
- package/cli/commands/generate.js +937 -0
- package/cli/commands/graph.js +2 -0
- package/cli/commands/migrate-orm.js +1171 -0
- package/cli/commands/update.js +37 -0
- package/cli/ship-api.js +285 -0
- package/lib/app/auth/AuthProvider.d.ts +91 -0
- package/lib/app/auth/AuthProvider.d.ts.map +1 -0
- package/lib/app/auth/AuthProvider.js +13 -0
- package/lib/app/auth/AuthProvider.js.map +1 -0
- package/lib/app/auth/adapters/firebase.d.ts +79 -0
- package/lib/app/auth/adapters/firebase.d.ts.map +1 -0
- package/lib/app/auth/adapters/firebase.js +122 -0
- package/lib/app/auth/adapters/firebase.js.map +1 -0
- package/lib/app/auth/adapters/jwtCookie.d.ts +55 -0
- package/lib/app/auth/adapters/jwtCookie.d.ts.map +1 -0
- package/lib/app/auth/adapters/jwtCookie.js +120 -0
- package/lib/app/auth/adapters/jwtCookie.js.map +1 -0
- package/lib/app/auth/index.d.ts +8 -0
- package/lib/app/auth/index.d.ts.map +1 -0
- package/lib/app/auth/index.js +7 -0
- package/lib/app/auth/index.js.map +1 -0
- package/lib/app/auth/jwt/AuthFlow.d.ts +94 -0
- package/lib/app/auth/jwt/AuthFlow.d.ts.map +1 -0
- package/lib/app/auth/jwt/AuthFlow.js +127 -0
- package/lib/app/auth/jwt/AuthFlow.js.map +1 -0
- package/lib/app/auth/jwt/DrizzleRefreshTokenStore.d.ts +80 -0
- package/lib/app/auth/jwt/DrizzleRefreshTokenStore.d.ts.map +1 -0
- package/lib/app/auth/jwt/DrizzleRefreshTokenStore.js +134 -0
- package/lib/app/auth/jwt/DrizzleRefreshTokenStore.js.map +1 -0
- package/lib/app/auth/jwt/JwtSigner.d.ts +123 -0
- package/lib/app/auth/jwt/JwtSigner.d.ts.map +1 -0
- package/lib/app/auth/jwt/JwtSigner.js +118 -0
- package/lib/app/auth/jwt/JwtSigner.js.map +1 -0
- package/lib/app/auth/jwt/RefreshTokenStore.d.ts +97 -0
- package/lib/app/auth/jwt/RefreshTokenStore.d.ts.map +1 -0
- package/lib/app/auth/jwt/RefreshTokenStore.js +122 -0
- package/lib/app/auth/jwt/RefreshTokenStore.js.map +1 -0
- package/lib/app/auth/permissionDefinition.d.ts +20 -0
- package/lib/app/auth/permissionDefinition.d.ts.map +1 -0
- package/lib/app/auth/permissionDefinition.js +2 -0
- package/lib/app/auth/permissionDefinition.js.map +1 -0
- package/lib/app/context/RequestContext.d.ts +59 -0
- package/lib/app/context/RequestContext.d.ts.map +1 -0
- package/lib/app/context/RequestContext.js +25 -0
- package/lib/app/context/RequestContext.js.map +1 -0
- package/lib/app/db/QueryOptions.d.ts +82 -0
- package/lib/app/db/QueryOptions.d.ts.map +1 -0
- package/lib/app/db/QueryOptions.js +37 -0
- package/lib/app/db/QueryOptions.js.map +1 -0
- package/lib/app/db/baseFields.d.ts +60 -0
- package/lib/app/db/baseFields.d.ts.map +1 -0
- package/lib/app/db/baseFields.js +54 -0
- package/lib/app/db/baseFields.js.map +1 -0
- package/lib/app/db/buildWhere.d.ts +22 -0
- package/lib/app/db/buildWhere.d.ts.map +1 -0
- package/lib/app/db/buildWhere.js +75 -0
- package/lib/app/db/buildWhere.js.map +1 -0
- package/lib/app/db/client.d.ts +111 -0
- package/lib/app/db/client.d.ts.map +1 -0
- package/lib/app/db/client.js +99 -0
- package/lib/app/db/client.js.map +1 -0
- package/lib/app/db/tenantScoped.d.ts +59 -0
- package/lib/app/db/tenantScoped.d.ts.map +1 -0
- package/lib/app/db/tenantScoped.js +54 -0
- package/lib/app/db/tenantScoped.js.map +1 -0
- package/lib/app/db/transaction.d.ts +58 -0
- package/lib/app/db/transaction.d.ts.map +1 -0
- package/lib/app/db/transaction.js +106 -0
- package/lib/app/db/transaction.js.map +1 -0
- package/lib/app/health/HealthCheck.d.ts +121 -0
- package/lib/app/health/HealthCheck.d.ts.map +1 -0
- package/lib/app/health/HealthCheck.js +151 -0
- package/lib/app/health/HealthCheck.js.map +1 -0
- package/lib/app/health/redisHealthCheck.d.ts +14 -0
- package/lib/app/health/redisHealthCheck.d.ts.map +1 -0
- package/lib/app/health/redisHealthCheck.js +21 -0
- package/lib/app/health/redisHealthCheck.js.map +1 -0
- package/lib/app/lifecycle/Bootstrapper.d.ts +92 -0
- package/lib/app/lifecycle/Bootstrapper.d.ts.map +1 -0
- package/lib/app/lifecycle/Bootstrapper.js +99 -0
- package/lib/app/lifecycle/Bootstrapper.js.map +1 -0
- package/lib/app/registry/routes.d.ts +89 -0
- package/lib/app/registry/routes.d.ts.map +1 -0
- package/lib/app/registry/routes.js +72 -0
- package/lib/app/registry/routes.js.map +1 -0
- package/lib/app/services/DrizzleEntityService.d.ts +123 -0
- package/lib/app/services/DrizzleEntityService.d.ts.map +1 -0
- package/lib/app/services/DrizzleEntityService.js +342 -0
- package/lib/app/services/DrizzleEntityService.js.map +1 -0
- package/lib/app/services/RedisProvider.d.ts +52 -0
- package/lib/app/services/RedisProvider.d.ts.map +1 -0
- package/lib/app/services/RedisProvider.js +75 -0
- package/lib/app/services/RedisProvider.js.map +1 -0
- package/lib/app/services/cache/Cache.d.ts +70 -0
- package/lib/app/services/cache/Cache.d.ts.map +1 -0
- package/lib/app/services/cache/Cache.js +18 -0
- package/lib/app/services/cache/Cache.js.map +1 -0
- package/lib/app/services/cache/InMemoryCache.d.ts +35 -0
- package/lib/app/services/cache/InMemoryCache.d.ts.map +1 -0
- package/lib/app/services/cache/InMemoryCache.js +76 -0
- package/lib/app/services/cache/InMemoryCache.js.map +1 -0
- package/lib/app/services/cache/RedisCache.d.ts +99 -0
- package/lib/app/services/cache/RedisCache.d.ts.map +1 -0
- package/lib/app/services/cache/RedisCache.js +150 -0
- package/lib/app/services/cache/RedisCache.js.map +1 -0
- package/lib/app/services/cache/cached.d.ts +30 -0
- package/lib/app/services/cache/cached.d.ts.map +1 -0
- package/lib/app/services/cache/cached.js +38 -0
- package/lib/app/services/cache/cached.js.map +1 -0
- package/lib/app/services/cache/index.d.ts +5 -0
- package/lib/app/services/cache/index.d.ts.map +1 -0
- package/lib/app/services/cache/index.js +4 -0
- package/lib/app/services/cache/index.js.map +1 -0
- package/lib/app/services/cron/defineCron.d.ts +57 -0
- package/lib/app/services/cron/defineCron.d.ts.map +1 -0
- package/lib/app/services/cron/defineCron.js +15 -0
- package/lib/app/services/cron/defineCron.js.map +1 -0
- package/lib/app/services/cron/index.d.ts +2 -0
- package/lib/app/services/cron/index.d.ts.map +1 -0
- package/lib/app/services/cron/index.js +2 -0
- package/lib/app/services/cron/index.js.map +1 -0
- package/lib/app/services/hooks/LifecycleHooks.d.ts +61 -0
- package/lib/app/services/hooks/LifecycleHooks.d.ts.map +1 -0
- package/lib/app/services/hooks/LifecycleHooks.js +85 -0
- package/lib/app/services/hooks/LifecycleHooks.js.map +1 -0
- package/lib/app/services/jobs/JobsManager.d.ts +67 -0
- package/lib/app/services/jobs/JobsManager.d.ts.map +1 -0
- package/lib/app/services/jobs/JobsManager.js +121 -0
- package/lib/app/services/jobs/JobsManager.js.map +1 -0
- package/lib/app/services/jobs/bullBoard.d.ts +72 -0
- package/lib/app/services/jobs/bullBoard.d.ts.map +1 -0
- package/lib/app/services/jobs/bullBoard.js +96 -0
- package/lib/app/services/jobs/bullBoard.js.map +1 -0
- package/lib/app/services/jobs/defineJob.d.ts +81 -0
- package/lib/app/services/jobs/defineJob.d.ts.map +1 -0
- package/lib/app/services/jobs/defineJob.js +49 -0
- package/lib/app/services/jobs/defineJob.js.map +1 -0
- package/lib/app/services/jobs/index.d.ts +4 -0
- package/lib/app/services/jobs/index.d.ts.map +1 -0
- package/lib/app/services/jobs/index.js +4 -0
- package/lib/app/services/jobs/index.js.map +1 -0
- package/lib/app/services/rateLimit/InMemorySlidingWindowBackend.d.ts +23 -0
- package/lib/app/services/rateLimit/InMemorySlidingWindowBackend.d.ts.map +1 -0
- package/lib/app/services/rateLimit/InMemorySlidingWindowBackend.js +51 -0
- package/lib/app/services/rateLimit/InMemorySlidingWindowBackend.js.map +1 -0
- package/lib/app/services/rateLimit/RateLimitBackend.d.ts +41 -0
- package/lib/app/services/rateLimit/RateLimitBackend.d.ts.map +1 -0
- package/lib/app/services/rateLimit/RateLimitBackend.js +19 -0
- package/lib/app/services/rateLimit/RateLimitBackend.js.map +1 -0
- package/lib/app/services/rateLimit/RedisSlidingWindowBackend.d.ts +16 -0
- package/lib/app/services/rateLimit/RedisSlidingWindowBackend.d.ts.map +1 -0
- package/lib/app/services/rateLimit/RedisSlidingWindowBackend.js +80 -0
- package/lib/app/services/rateLimit/RedisSlidingWindowBackend.js.map +1 -0
- package/lib/app/services/rateLimit/index.d.ts +4 -0
- package/lib/app/services/rateLimit/index.d.ts.map +1 -0
- package/lib/app/services/rateLimit/index.js +3 -0
- package/lib/app/services/rateLimit/index.js.map +1 -0
- package/lib/app/services/storage/DiskStorageAdapter.d.ts +62 -0
- package/lib/app/services/storage/DiskStorageAdapter.d.ts.map +1 -0
- package/lib/app/services/storage/DiskStorageAdapter.js +295 -0
- package/lib/app/services/storage/DiskStorageAdapter.js.map +1 -0
- package/lib/app/services/storage/GCSStorageAdapter.d.ts +44 -0
- package/lib/app/services/storage/GCSStorageAdapter.d.ts.map +1 -0
- package/lib/app/services/storage/GCSStorageAdapter.js +133 -0
- package/lib/app/services/storage/GCSStorageAdapter.js.map +1 -0
- package/lib/app/services/storage/S3StorageAdapter.d.ts +57 -0
- package/lib/app/services/storage/S3StorageAdapter.d.ts.map +1 -0
- package/lib/app/services/storage/S3StorageAdapter.js +162 -0
- package/lib/app/services/storage/S3StorageAdapter.js.map +1 -0
- package/lib/app/services/storage/StorageService.d.ts +88 -0
- package/lib/app/services/storage/StorageService.d.ts.map +1 -0
- package/lib/app/services/storage/StorageService.js +18 -0
- package/lib/app/services/storage/StorageService.js.map +1 -0
- package/lib/app/services/storage/index.d.ts +5 -0
- package/lib/app/services/storage/index.d.ts.map +1 -0
- package/lib/app/services/storage/index.js +4 -0
- package/lib/app/services/storage/index.js.map +1 -0
- package/lib/app/utils/ContextValidators.d.ts +46 -0
- package/lib/app/utils/ContextValidators.d.ts.map +1 -0
- package/lib/app/utils/ContextValidators.js +81 -0
- package/lib/app/utils/ContextValidators.js.map +1 -0
- package/lib/app/utils/defineEnv.d.ts +80 -0
- package/lib/app/utils/defineEnv.d.ts.map +1 -0
- package/lib/app/utils/defineEnv.js +95 -0
- package/lib/app/utils/defineEnv.js.map +1 -0
- package/lib/client.d.ts +139 -0
- package/lib/client.d.ts.map +1 -0
- package/lib/client.js +98 -0
- package/lib/client.js.map +1 -0
- package/lib/contract/application.d.ts +3 -0
- package/lib/contract/application.d.ts.map +1 -0
- package/lib/contract/application.js +2 -0
- package/lib/contract/application.js.map +1 -0
- package/lib/contract/client.d.ts +3 -0
- package/lib/contract/client.d.ts.map +1 -0
- package/lib/contract/client.js +3 -0
- package/lib/contract/client.js.map +1 -0
- package/lib/contract/index.d.ts +3 -0
- package/lib/contract/index.d.ts.map +1 -0
- package/lib/contract/index.js +3 -0
- package/lib/contract/index.js.map +1 -0
- package/lib/contract/manifest.d.ts +3 -0
- package/lib/contract/manifest.d.ts.map +1 -0
- package/lib/contract/manifest.js +2 -0
- package/lib/contract/manifest.js.map +1 -0
- package/lib/contract/openapi.d.ts +3 -0
- package/lib/contract/openapi.d.ts.map +1 -0
- package/lib/contract/openapi.js +3 -0
- package/lib/contract/openapi.js.map +1 -0
- package/lib/contract/project.d.ts +3 -0
- package/lib/contract/project.d.ts.map +1 -0
- package/lib/contract/project.js +3 -0
- package/lib/contract/project.js.map +1 -0
- package/lib/contract/schema.d.ts +3 -0
- package/lib/contract/schema.d.ts.map +1 -0
- package/lib/contract/schema.js +3 -0
- package/lib/contract/schema.js.map +1 -0
- package/lib/drizzle/index.d.ts +3 -0
- package/lib/drizzle/index.d.ts.map +1 -0
- package/lib/drizzle/index.js +3 -0
- package/lib/drizzle/index.js.map +1 -0
- package/lib/hono/auth.d.ts +6 -0
- package/lib/hono/auth.d.ts.map +1 -0
- package/lib/hono/auth.js +54 -0
- package/lib/hono/auth.js.map +1 -0
- package/lib/hono/index.d.ts +4 -0
- package/lib/hono/index.d.ts.map +1 -0
- package/lib/hono/index.js +4 -0
- package/lib/hono/index.js.map +1 -0
- package/lib/http/app/createApp.d.ts +132 -0
- package/lib/http/app/createApp.d.ts.map +1 -0
- package/lib/http/app/createApp.js +215 -0
- package/lib/http/app/createApp.js.map +1 -0
- package/lib/http/app/devRoutes.d.ts +31 -0
- package/lib/http/app/devRoutes.d.ts.map +1 -0
- package/lib/http/app/devRoutes.js +145 -0
- package/lib/http/app/devRoutes.js.map +1 -0
- package/lib/http/app/errors.d.ts +45 -0
- package/lib/http/app/errors.d.ts.map +1 -0
- package/lib/http/app/errors.js +93 -0
- package/lib/http/app/errors.js.map +1 -0
- package/lib/http/app/health.d.ts +66 -0
- package/lib/http/app/health.d.ts.map +1 -0
- package/lib/http/app/health.js +104 -0
- package/lib/http/app/health.js.map +1 -0
- package/lib/http/errors/AppError.d.ts +10 -0
- package/lib/http/errors/AppError.d.ts.map +1 -0
- package/lib/http/errors/AppError.js +19 -0
- package/lib/http/errors/AppError.js.map +1 -0
- package/lib/http/errors/AuthenticationError.d.ts +8 -0
- package/lib/http/errors/AuthenticationError.d.ts.map +1 -0
- package/lib/http/errors/AuthenticationError.js +10 -0
- package/lib/http/errors/AuthenticationError.js.map +1 -0
- package/lib/http/errors/AuthorizationError.d.ts +8 -0
- package/lib/http/errors/AuthorizationError.d.ts.map +1 -0
- package/lib/http/errors/AuthorizationError.js +10 -0
- package/lib/http/errors/AuthorizationError.js.map +1 -0
- package/lib/http/errors/BadRequestError.d.ts +8 -0
- package/lib/http/errors/BadRequestError.d.ts.map +1 -0
- package/lib/http/errors/BadRequestError.js +10 -0
- package/lib/http/errors/BadRequestError.js.map +1 -0
- package/lib/http/errors/ConflictError.d.ts +8 -0
- package/lib/http/errors/ConflictError.d.ts.map +1 -0
- package/lib/http/errors/ConflictError.js +10 -0
- package/lib/http/errors/ConflictError.js.map +1 -0
- package/lib/http/errors/InternalServerError.d.ts +8 -0
- package/lib/http/errors/InternalServerError.d.ts.map +1 -0
- package/lib/http/errors/InternalServerError.js +10 -0
- package/lib/http/errors/InternalServerError.js.map +1 -0
- package/lib/http/errors/NotFoundError.d.ts +8 -0
- package/lib/http/errors/NotFoundError.d.ts.map +1 -0
- package/lib/http/errors/NotFoundError.js +10 -0
- package/lib/http/errors/NotFoundError.js.map +1 -0
- package/lib/http/errors/RateLimitError.d.ts +13 -0
- package/lib/http/errors/RateLimitError.d.ts.map +1 -0
- package/lib/http/errors/RateLimitError.js +16 -0
- package/lib/http/errors/RateLimitError.js.map +1 -0
- package/lib/http/errors/ServiceUnavailableError.d.ts +8 -0
- package/lib/http/errors/ServiceUnavailableError.d.ts.map +1 -0
- package/lib/http/errors/ServiceUnavailableError.js +10 -0
- package/lib/http/errors/ServiceUnavailableError.js.map +1 -0
- package/lib/http/errors/ValidationError.d.ts +9 -0
- package/lib/http/errors/ValidationError.d.ts.map +1 -0
- package/lib/http/errors/ValidationError.js +12 -0
- package/lib/http/errors/ValidationError.js.map +1 -0
- package/lib/http/errors/index.d.ts +11 -0
- package/lib/http/errors/index.d.ts.map +1 -0
- package/lib/http/errors/index.js +12 -0
- package/lib/http/errors/index.js.map +1 -0
- package/lib/http/middleware/apiKey.d.ts +9 -0
- package/lib/http/middleware/apiKey.d.ts.map +1 -0
- package/lib/http/middleware/apiKey.js +71 -0
- package/lib/http/middleware/apiKey.js.map +1 -0
- package/lib/http/middleware/csrf.d.ts +63 -0
- package/lib/http/middleware/csrf.d.ts.map +1 -0
- package/lib/http/middleware/csrf.js +169 -0
- package/lib/http/middleware/csrf.js.map +1 -0
- package/lib/http/middleware/httpLogger.d.ts +39 -0
- package/lib/http/middleware/httpLogger.d.ts.map +1 -0
- package/lib/http/middleware/httpLogger.js +118 -0
- package/lib/http/middleware/httpLogger.js.map +1 -0
- package/lib/http/middleware/idempotency.d.ts +48 -0
- package/lib/http/middleware/idempotency.d.ts.map +1 -0
- package/lib/http/middleware/idempotency.js +180 -0
- package/lib/http/middleware/idempotency.js.map +1 -0
- package/lib/http/middleware/rateLimit.d.ts +105 -0
- package/lib/http/middleware/rateLimit.d.ts.map +1 -0
- package/lib/http/middleware/rateLimit.js +84 -0
- package/lib/http/middleware/rateLimit.js.map +1 -0
- package/lib/http/middleware/requireAuth.d.ts +58 -0
- package/lib/http/middleware/requireAuth.d.ts.map +1 -0
- package/lib/http/middleware/requireAuth.js +63 -0
- package/lib/http/middleware/requireAuth.js.map +1 -0
- package/lib/http/middleware/requirePermission.d.ts +23 -0
- package/lib/http/middleware/requirePermission.d.ts.map +1 -0
- package/lib/http/middleware/requirePermission.js +50 -0
- package/lib/http/middleware/requirePermission.js.map +1 -0
- package/lib/http/middleware/resolveTenant.d.ts +41 -0
- package/lib/http/middleware/resolveTenant.d.ts.map +1 -0
- package/lib/http/middleware/resolveTenant.js +17 -0
- package/lib/http/middleware/resolveTenant.js.map +1 -0
- package/lib/http/streaming/sse.d.ts +31 -0
- package/lib/http/streaming/sse.d.ts.map +1 -0
- package/lib/http/streaming/sse.js +11 -0
- package/lib/http/streaming/sse.js.map +1 -0
- package/lib/http/streaming/streamLLM.d.ts +94 -0
- package/lib/http/streaming/streamLLM.d.ts.map +1 -0
- package/lib/http/streaming/streamLLM.js +94 -0
- package/lib/http/streaming/streamLLM.js.map +1 -0
- package/lib/http/utils/authCookies.d.ts +74 -0
- package/lib/http/utils/authCookies.d.ts.map +1 -0
- package/lib/http/utils/authCookies.js +102 -0
- package/lib/http/utils/authCookies.js.map +1 -0
- package/lib/http/utils/clientIp.d.ts +85 -0
- package/lib/http/utils/clientIp.d.ts.map +1 -0
- package/lib/http/utils/clientIp.js +249 -0
- package/lib/http/utils/clientIp.js.map +1 -0
- package/lib/http/utils/index.d.ts +4 -0
- package/lib/http/utils/index.d.ts.map +1 -0
- package/lib/http/utils/index.js +5 -0
- package/lib/http/utils/index.js.map +1 -0
- package/lib/http/utils/metaTags.d.ts +49 -0
- package/lib/http/utils/metaTags.d.ts.map +1 -0
- package/lib/http/utils/metaTags.js +32 -0
- package/lib/http/utils/metaTags.js.map +1 -0
- package/lib/http/utils/publicSuffix.d.ts +34 -0
- package/lib/http/utils/publicSuffix.d.ts.map +1 -0
- package/lib/http/utils/publicSuffix.js +276 -0
- package/lib/http/utils/publicSuffix.js.map +1 -0
- package/lib/http/utils/uploads.d.ts +92 -0
- package/lib/http/utils/uploads.d.ts.map +1 -0
- package/lib/http/utils/uploads.js +126 -0
- package/lib/http/utils/uploads.js.map +1 -0
- package/lib/http/utils/validate.d.ts +41 -0
- package/lib/http/utils/validate.d.ts.map +1 -0
- package/lib/http/utils/validate.js +55 -0
- package/lib/http/utils/validate.js.map +1 -0
- package/lib/http/utils/webhooks.d.ts +63 -0
- package/lib/http/utils/webhooks.d.ts.map +1 -0
- package/lib/http/utils/webhooks.js +133 -0
- package/lib/http/utils/webhooks.js.map +1 -0
- package/lib/http/ws/auth.d.ts +46 -0
- package/lib/http/ws/auth.d.ts.map +1 -0
- package/lib/http/ws/auth.js +123 -0
- package/lib/http/ws/auth.js.map +1 -0
- package/lib/index.d.ts +80 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +61 -0
- package/lib/index.js.map +1 -0
- package/lib/kernel/index.d.ts +3 -0
- package/lib/kernel/index.d.ts.map +1 -0
- package/lib/kernel/index.js +3 -0
- package/lib/kernel/index.js.map +1 -0
- package/lib/libraries/.gitkeep +0 -0
- package/lib/libraries/ai/CHANGELOG.md +17 -0
- package/lib/libraries/ai/README.md +164 -0
- package/lib/libraries/ai/adapters/AnthropicAdapter.ts +382 -0
- package/lib/libraries/ai/adapters/LLMProvider.ts +76 -0
- package/lib/libraries/ai/adapters/OpenAIAdapter.ts +466 -0
- package/lib/libraries/ai/experimental/index.ts +20 -0
- package/lib/libraries/ai/index.ts +128 -0
- package/lib/libraries/ai/library.json +19 -0
- package/lib/libraries/ai/loop/agentLoop.ts +377 -0
- package/lib/libraries/ai/prompts/definePrompt.ts +0 -0
- package/lib/libraries/ai/rag/retrieveAndAnswer.ts +177 -0
- package/lib/libraries/ai/streaming/streamLLM.ts +94 -0
- package/lib/libraries/ai/structured/completeStructured.ts +143 -0
- package/lib/libraries/ai/tokens/Tokenizer.ts +216 -0
- package/lib/libraries/ai/tools/defineTool.ts +208 -0
- package/lib/libraries/ai/types.ts +260 -0
- package/lib/libraries/chunking/ChunkingService.ts +103 -0
- package/lib/libraries/chunking/README.md +104 -0
- package/lib/libraries/chunking/docs/api-reference.md +549 -0
- package/lib/libraries/chunking/docs/best-practices.md +321 -0
- package/lib/libraries/chunking/docs/code-organization.md +538 -0
- package/lib/libraries/chunking/docs/configuration.md +418 -0
- package/lib/libraries/chunking/docs/index.md +236 -0
- package/lib/libraries/chunking/docs/quick-start.md +298 -0
- package/lib/libraries/chunking/docs/strategies.md +407 -0
- package/lib/libraries/chunking/docs/summary.md +258 -0
- package/lib/libraries/chunking/docs/troubleshooting.md +527 -0
- package/lib/libraries/chunking/index.ts +17 -0
- package/lib/libraries/chunking/library.json +16 -0
- package/lib/libraries/chunking/strategies/ChunkingStrategy.ts +13 -0
- package/lib/libraries/chunking/strategies/FixedLengthChunkingStrategy.ts +88 -0
- package/lib/libraries/chunking/strategies/SemanticChunkingStrategy.ts +389 -0
- package/lib/libraries/chunking/strategies/SlidingWindowChunkingStrategy.ts +258 -0
- package/lib/libraries/chunking/types/index.ts +63 -0
- package/lib/libraries/email/EmailService.ts +591 -0
- package/lib/libraries/email/README.md +777 -0
- package/lib/libraries/email/TemplateRegistry.ts +148 -0
- package/lib/libraries/email/TemplateRenderer.ts +273 -0
- package/lib/libraries/email/index.ts +4 -0
- package/lib/libraries/email/initializeEmailService.ts +60 -0
- package/lib/libraries/email/library.json +12 -0
- package/lib/libraries/email/types/EmailAddress.ts +4 -0
- package/lib/libraries/email/types/EmailAttachment.ts +11 -0
- package/lib/libraries/email/types/EmailTag.ts +9 -0
- package/lib/libraries/email/types/EmailTemplate.ts +124 -0
- package/lib/libraries/email/types/SendBatchEmailsOptions.ts +9 -0
- package/lib/libraries/email/types/SendBatchEmailsResult.ts +9 -0
- package/lib/libraries/email/types/SendEmailOptions.ts +33 -0
- package/lib/libraries/email/types/SendEmailResult.ts +9 -0
- package/lib/libraries/email/types/index.ts +8 -0
- package/lib/libraries/weaviate/QueryBuilder.ts +292 -0
- package/lib/libraries/weaviate/README.md +284 -0
- package/lib/libraries/weaviate/Weaviate.ts +1419 -0
- package/lib/libraries/weaviate/WeaviateConfig.ts +268 -0
- package/lib/libraries/weaviate/docs/.gitkeep +1 -0
- package/lib/libraries/weaviate/docs/API_REFERENCE.md +1067 -0
- package/lib/libraries/weaviate/docs/CONFIGURATION.md +320 -0
- package/lib/libraries/weaviate/docs/ERROR_HANDLING.md +271 -0
- package/lib/libraries/weaviate/docs/MULTI_TENANCY.md +348 -0
- package/lib/libraries/weaviate/docs/PERFORMANCE.md +602 -0
- package/lib/libraries/weaviate/docs/PLUGIN_DEVELOPMENT.md +547 -0
- package/lib/libraries/weaviate/docs/QUICK_START.md +443 -0
- package/lib/libraries/weaviate/docs/README.md +269 -0
- package/lib/libraries/weaviate/docs/SCHEMA_GUIDE.md +630 -0
- package/lib/libraries/weaviate/docs/WEAVIATE_README.md +520 -0
- package/lib/libraries/weaviate/errors/WeaviateError.ts +92 -0
- package/lib/libraries/weaviate/errors/index.ts +1 -0
- package/lib/libraries/weaviate/index.ts +35 -0
- package/lib/libraries/weaviate/library.json +26 -0
- package/lib/libraries/weaviate/plugins/index.ts +2 -0
- package/lib/libraries/weaviate/schemas/SchemaRegistry.ts +284 -0
- package/lib/libraries/weaviate/schemas/index.ts +2 -0
- package/lib/libraries/weaviate/types/BM25SearchOptions.ts +9 -0
- package/lib/libraries/weaviate/types/ExtendedWeaviateClient.ts +7 -0
- package/lib/libraries/weaviate/types/HybridSearchOptions.ts +11 -0
- package/lib/libraries/weaviate/types/MultiTenancy.ts +81 -0
- package/lib/libraries/weaviate/types/Plugin.ts +17 -0
- package/lib/libraries/weaviate/types/SchemaConfig.ts +25 -0
- package/lib/libraries/weaviate/types/SearchMethod.ts +8 -0
- package/lib/libraries/weaviate/types/SearchOptions.ts +16 -0
- package/lib/libraries/weaviate/types/SearchRequest.ts +19 -0
- package/lib/libraries/weaviate/types/SearchResult.ts +16 -0
- package/lib/libraries/weaviate/types/SearchableField.ts +87 -0
- package/lib/libraries/weaviate/types/VectorIndexConfig.ts +19 -0
- package/lib/libraries/weaviate/types/VectorSearchOptions.ts +18 -0
- package/lib/libraries/weaviate/types/VectorizerConfig.ts +8 -0
- package/lib/libraries/weaviate/types/index.ts +29 -0
- package/lib/libraries/weaviate/utils/TenantContextManager.ts +94 -0
- package/lib/modules/accounts/index.ts +47 -0
- package/lib/modules/accounts/module.json +15 -0
- package/lib/modules/accounts/permissions.ts +33 -0
- package/lib/modules/accounts/routes.ts +200 -0
- package/lib/modules/accounts/schema.ts +219 -0
- package/lib/modules/accounts/services/AccountService.ts +44 -0
- package/lib/modules/accounts/validation/schemas.ts +70 -0
- package/lib/modules/oauth/adapters/GmailOAuthAdapter.ts +35 -0
- package/lib/modules/oauth/adapters/GoogleOAuthAdapter.ts +278 -0
- package/lib/modules/oauth/adapters/MicrosoftOAuthAdapter.ts +269 -0
- package/lib/modules/oauth/adapters/MockOAuthAdapter.ts +138 -0
- package/lib/modules/oauth/adapters/OAuthAdapter.ts +211 -0
- package/lib/modules/oauth/adapters/OAuthAdapterRegistry.ts +77 -0
- package/lib/modules/oauth/adapters/OutlookOAuthAdapter.ts +38 -0
- package/lib/modules/oauth/index.ts +79 -0
- package/lib/modules/oauth/module.json +23 -0
- package/lib/modules/oauth/permissions.ts +39 -0
- package/lib/modules/oauth/routes.ts +497 -0
- package/lib/modules/oauth/schema.ts +127 -0
- package/lib/modules/oauth/services/OAuthConnectionService.ts +147 -0
- package/lib/modules/oauth/state.ts +234 -0
- package/lib/modules/oauth/stateJtiCache.ts +85 -0
- package/lib/modules/oauth/verifyIdToken.ts +178 -0
- package/lib/modules/outbox/EventEmitter.ts +106 -0
- package/lib/modules/outbox/OutboxDrainer.ts +163 -0
- package/lib/modules/outbox/handlers/EventHandler.ts +115 -0
- package/lib/modules/outbox/index.ts +43 -0
- package/lib/modules/outbox/module.json +15 -0
- package/lib/modules/outbox/permissions.ts +36 -0
- package/lib/modules/outbox/routes.ts +219 -0
- package/lib/modules/outbox/schema.ts +207 -0
- package/lib/modules/outbox/services/OutboxEventService.ts +223 -0
- package/lib/observability/logger.d.ts +30 -0
- package/lib/observability/logger.d.ts.map +1 -0
- package/lib/observability/logger.js +110 -0
- package/lib/observability/logger.js.map +1 -0
- package/lib/observability/metrics.d.ts +3 -0
- package/lib/observability/metrics.d.ts.map +1 -0
- package/lib/observability/metrics.js +3 -0
- package/lib/observability/metrics.js.map +1 -0
- package/lib/observability/otel.d.ts +3 -0
- package/lib/observability/otel.d.ts.map +1 -0
- package/lib/observability/otel.js +3 -0
- package/lib/observability/otel.js.map +1 -0
- package/lib/observability/safeErrorFields.d.ts +14 -0
- package/lib/observability/safeErrorFields.d.ts.map +1 -0
- package/lib/observability/safeErrorFields.js +14 -0
- package/lib/observability/safeErrorFields.js.map +1 -0
- package/lib/observability/tracing.d.ts +3 -0
- package/lib/observability/tracing.d.ts.map +1 -0
- package/lib/observability/tracing.js +3 -0
- package/lib/observability/tracing.js.map +1 -0
- package/lib/package.json +4 -0
- package/lib/testing.d.ts +3 -0
- package/lib/testing.d.ts.map +1 -0
- package/lib/testing.js +3 -0
- package/lib/testing.js.map +1 -0
- package/package.json +193 -3
- package/templates/default/.claude/agents/qa-brief.md +106 -0
- package/templates/default/.claude/commands/sherpa-brief.md +23 -0
- package/templates/default/.cursor/rules/api.mdc +80 -0
- package/templates/default/.cursor/rules/commits.mdc +88 -0
- package/templates/default/.cursor/rules/security.mdc +92 -0
- package/templates/default/.cursor/rules/testing.mdc +123 -0
- package/templates/default/.cursor/rules/typescript.mdc +86 -0
- package/templates/default/.env.example +79 -0
- package/templates/default/.github/workflows/sherpa-brief.yml +180 -0
- package/templates/default/AGENTS.md +166 -0
- package/templates/default/CLAUDE.md +17 -0
- package/templates/default/README.md +97 -0
- package/templates/default/_gitignore +27 -0
- package/templates/default/docker-compose.yml +83 -0
- package/templates/default/drizzle.config.ts +34 -0
- package/templates/default/eslint.config.mjs +106 -0
- package/templates/default/package.json +57 -0
- package/templates/default/ship-api.config.ts +21 -0
- package/templates/default/src/client.ts +34 -0
- package/templates/default/src/config/modules.ts +23 -0
- package/templates/default/src/db/schema.ts +26 -0
- package/templates/default/src/environment.ts +81 -0
- package/templates/default/src/index.test.ts +53 -0
- package/templates/default/src/index.ts +11 -0
- package/templates/default/src/instrumentation.ts +13 -0
- package/templates/default/src/server.ts +90 -0
- package/templates/default/tsconfig.json +24 -0
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import { Hono } from "hono";
|
|
2
|
+
import { cors } from "hono/cors";
|
|
3
|
+
import { routeRegistry, } from "../../app/registry/routes.js";
|
|
4
|
+
import { AUTH_META, getMetaTag, IDEMPOTENCY_META, PERMISSION_META, RATE_LIMIT_META, SCHEMA_META, } from "../utils/metaTags.js";
|
|
5
|
+
import { registerHealthRoutes } from "./health.js";
|
|
6
|
+
/**
|
|
7
|
+
* `Hono<AppEnv>` factory with route-method interception.
|
|
8
|
+
*
|
|
9
|
+
* Every `app.get/post/put/patch/delete` call is wrapped: the wrapper walks
|
|
10
|
+
* the passed handlers, reads any framework metadata tags, pushes a
|
|
11
|
+
* `RouteEntry` to the registry, then delegates to Hono's real method.
|
|
12
|
+
*
|
|
13
|
+
* User code looks identical to plain Hono — no `defineRoute` ceremony, no
|
|
14
|
+
* decorators, no codegen. The metadata is captured invisibly.
|
|
15
|
+
*
|
|
16
|
+
* Routes registered without `validate` / `requireAuth` are still captured —
|
|
17
|
+
* just schema-less / anonymous, which is *correct*: agents see exactly what's
|
|
18
|
+
* there, including unprotected endpoints (which the `ship-reviewer` agent
|
|
19
|
+
* can flag as convention violations).
|
|
20
|
+
*/
|
|
21
|
+
export function createApp(opts = {}) {
|
|
22
|
+
const registry = opts.registry ?? routeRegistry;
|
|
23
|
+
const app = new Hono();
|
|
24
|
+
if (opts.cors) {
|
|
25
|
+
validateCorsOptions(opts.cors);
|
|
26
|
+
const corsOpts = {
|
|
27
|
+
origin: opts.cors.origin,
|
|
28
|
+
};
|
|
29
|
+
if (opts.cors.allowMethods)
|
|
30
|
+
corsOpts.allowMethods = Array.from(opts.cors.allowMethods);
|
|
31
|
+
if (opts.cors.allowHeaders)
|
|
32
|
+
corsOpts.allowHeaders = Array.from(opts.cors.allowHeaders);
|
|
33
|
+
if (opts.cors.exposeHeaders)
|
|
34
|
+
corsOpts.exposeHeaders = Array.from(opts.cors.exposeHeaders);
|
|
35
|
+
if (opts.cors.maxAge !== undefined)
|
|
36
|
+
corsOpts.maxAge = opts.cors.maxAge;
|
|
37
|
+
if (opts.cors.credentials !== undefined)
|
|
38
|
+
corsOpts.credentials = opts.cors.credentials;
|
|
39
|
+
app.use("*", cors(corsOpts));
|
|
40
|
+
}
|
|
41
|
+
// Mounted before route interception (so they stay out of the route
|
|
42
|
+
// registry) and before any consumer middleware (Hono runs handlers in
|
|
43
|
+
// registration order and these respond without calling `next`).
|
|
44
|
+
if (opts.health !== false) {
|
|
45
|
+
registerHealthRoutes(app, opts.health ?? {});
|
|
46
|
+
}
|
|
47
|
+
interceptRouteMethods(app, registry);
|
|
48
|
+
return app;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* `Hono<AppEnv>` factory for a **module sub-app** — the building block of the
|
|
52
|
+
* v4 mount-at-root composition.
|
|
53
|
+
*
|
|
54
|
+
* A module's `defineXxxRoutes(createModuleApp("xxx"), deps)` builds its own
|
|
55
|
+
* bounded route chain on a fresh app, which the consumer mounts onto the root
|
|
56
|
+
* with `root.route("/", buildXxxApp(deps))`. Splitting each module into its
|
|
57
|
+
* own sub-app (rather than chaining every module's routes onto one app) keeps
|
|
58
|
+
* each TypeScript route-type instantiation bounded, so the `hc()` typed client
|
|
59
|
+
* scales to many modules without `tsc` blowing its instantiation budget.
|
|
60
|
+
*
|
|
61
|
+
* Identical to `createApp` except:
|
|
62
|
+
* - it wires **no CORS** and is not meant to be the server root (global
|
|
63
|
+
* cross-cutting middleware — `cors`, `httpLogger`, `registerErrorHandlers`
|
|
64
|
+
* — belong on the root app the sub-app is mounted onto, never here);
|
|
65
|
+
* - every captured `RouteEntry` is stamped with `module`, lighting up the
|
|
66
|
+
* Module column in `/dev/routes` and the `module` filter in `list_routes`;
|
|
67
|
+
* - `app.onError`, `app.notFound`, and global `app.use("*", …)` are
|
|
68
|
+
* **guarded** — they throw at dev time, because a sub-app error/not-found
|
|
69
|
+
* handler silently shadows the root's uniform AppError shape and global
|
|
70
|
+
* sub-app middleware breaks the root-wraps-everything ordering. (Per-route
|
|
71
|
+
* middleware — `requireAuth`/`requirePermission`/`validate` passed as route
|
|
72
|
+
* handlers — and **path-scoped** `app.use("/x/*", …)` are still allowed.)
|
|
73
|
+
*
|
|
74
|
+
* Because module sub-apps register their **absolute** paths (`/accounts`,
|
|
75
|
+
* `/accounts/:id`) and are mounted at the root (`route("/", …)`), the registry
|
|
76
|
+
* records the same absolute paths it always has — `execute_route`,
|
|
77
|
+
* `find_route_collisions`, and `/dev/routes` need no prefix math.
|
|
78
|
+
*/
|
|
79
|
+
export function createModuleApp(moduleName, opts = {}) {
|
|
80
|
+
const registry = opts.registry ?? routeRegistry;
|
|
81
|
+
const app = new Hono();
|
|
82
|
+
interceptRouteMethods(app, registry, moduleName);
|
|
83
|
+
guardCrossCuttingMethods(app, moduleName);
|
|
84
|
+
return app;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Make a module sub-app fail fast when a developer reaches for a cross-cutting
|
|
88
|
+
* concern that belongs on the root. `onError` / `notFound` / global `use("*")`
|
|
89
|
+
* all "work" on a sub-app but silently break the contract — a sub-app
|
|
90
|
+
* `onError` shadows `registerErrorHandlers`' uniform error shape, and global
|
|
91
|
+
* sub-app middleware doesn't wrap sibling modules. We throw at dev time so the
|
|
92
|
+
* mistake surfaces as a clear error, not a production surprise.
|
|
93
|
+
*
|
|
94
|
+
* Hono reads the stored `errorHandler` / `notFoundHandler` properties at
|
|
95
|
+
* request time (never the public methods), and `.route()` merges a sub-app's
|
|
96
|
+
* pre-built routes without calling these — so overriding the methods only
|
|
97
|
+
* intercepts the developer's call, never Hono's internals.
|
|
98
|
+
*/
|
|
99
|
+
function guardCrossCuttingMethods(app, moduleName) {
|
|
100
|
+
const reject = (method, why) => {
|
|
101
|
+
throw new Error(`createModuleApp("${moduleName}"): ${method} is not allowed on a module sub-app — ${why} ` +
|
|
102
|
+
`Put it on the root app you mount this sub-app onto (the one from ` +
|
|
103
|
+
`\`createApp(...)\`, mounted via \`root.route("/", build${capitalize(moduleName)}App(deps))\`), not here.`);
|
|
104
|
+
};
|
|
105
|
+
const methods = app;
|
|
106
|
+
methods.onError = () => reject("app.onError(...)", "a sub-app error handler silently shadows the root's uniform AppError JSON shape (registerErrorHandlers).");
|
|
107
|
+
methods.notFound = () => reject("app.notFound(...)", "a sub-app not-found handler shadows the root's 404 handling.");
|
|
108
|
+
const originalUse = app.use.bind(app);
|
|
109
|
+
methods.use = (...args) => {
|
|
110
|
+
// Global middleware = path-less (`use(mw)`) or wildcard (`use("*", mw)`).
|
|
111
|
+
// That's the cross-cutting footgun; path-scoped `use("/x/*", mw)` is fine.
|
|
112
|
+
const first = args[0];
|
|
113
|
+
if (typeof first !== "string" || first === "*") {
|
|
114
|
+
reject('app.use("*", ...)', "cross-cutting middleware (httpLogger/request-context, cors) must wrap every module from the root.");
|
|
115
|
+
}
|
|
116
|
+
return originalUse(...args);
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
function capitalize(s) {
|
|
120
|
+
return s.length === 0 ? s : s[0].toUpperCase() + s.slice(1);
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Wrap `app.get/post/put/patch/delete` so each registration pushes a
|
|
124
|
+
* `RouteEntry` to `registry` before delegating to Hono's real method. When
|
|
125
|
+
* `moduleName` is supplied (sub-apps via `createModuleApp`) the entry is
|
|
126
|
+
* tagged with it. User code looks like plain Hono — the capture is invisible.
|
|
127
|
+
*/
|
|
128
|
+
function interceptRouteMethods(app, registry, moduleName) {
|
|
129
|
+
const methods = [
|
|
130
|
+
{ name: "get", verb: "GET" },
|
|
131
|
+
{ name: "post", verb: "POST" },
|
|
132
|
+
{ name: "put", verb: "PUT" },
|
|
133
|
+
{ name: "patch", verb: "PATCH" },
|
|
134
|
+
{ name: "delete", verb: "DELETE" },
|
|
135
|
+
];
|
|
136
|
+
for (const { name, verb } of methods) {
|
|
137
|
+
const original = app[name].bind(app);
|
|
138
|
+
app[name] = (path, ...handlers) => {
|
|
139
|
+
const entry = buildRouteEntry(verb, path, handlers);
|
|
140
|
+
if (moduleName !== undefined)
|
|
141
|
+
entry.module = moduleName;
|
|
142
|
+
registry.add(entry);
|
|
143
|
+
// Hono's overloaded `app.METHOD` accepts varargs of MiddlewareHandler
|
|
144
|
+
// followed by the final handler. Forward as-is.
|
|
145
|
+
return original(path, ...handlers);
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Reject the `origin: '*'` + `credentials: true` combo at construction
|
|
151
|
+
* time. This combination is invalid per the CORS spec — browsers
|
|
152
|
+
* refuse it — but the framework defends against it explicitly so a
|
|
153
|
+
* misconfigured deployment fails on boot rather than at runtime when
|
|
154
|
+
* a non-compliant HTTP client (or a tool that ignores the response
|
|
155
|
+
* `Access-Control-*` headers) reveals the bypass.
|
|
156
|
+
*/
|
|
157
|
+
function validateCorsOptions(opts) {
|
|
158
|
+
if (opts.credentials !== true)
|
|
159
|
+
return;
|
|
160
|
+
const origin = opts.origin;
|
|
161
|
+
if (origin === "*") {
|
|
162
|
+
throw new Error("createApp: cors.origin: '*' is incompatible with credentials: true. " +
|
|
163
|
+
"Pass an explicit allowlist (string[] of origins) instead.");
|
|
164
|
+
}
|
|
165
|
+
if (Array.isArray(origin) && origin.length === 1 && origin[0] === "*") {
|
|
166
|
+
throw new Error("createApp: cors.origin: ['*'] is incompatible with credentials: true. " +
|
|
167
|
+
"Pass an explicit allowlist (string[] of origins) instead.");
|
|
168
|
+
}
|
|
169
|
+
if (Array.isArray(origin) && origin.includes("*")) {
|
|
170
|
+
throw new Error("createApp: cors.origin contains '*' alongside other entries, which " +
|
|
171
|
+
"is ambiguous under credentials: true. Pass only explicit origins.");
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
function buildRouteEntry(method, path, handlers) {
|
|
175
|
+
const entry = {
|
|
176
|
+
method,
|
|
177
|
+
path,
|
|
178
|
+
auth: { required: false },
|
|
179
|
+
permissions: [],
|
|
180
|
+
schemas: {},
|
|
181
|
+
};
|
|
182
|
+
for (const handler of handlers) {
|
|
183
|
+
const schema = getMetaTag(handler, SCHEMA_META);
|
|
184
|
+
if (schema)
|
|
185
|
+
entry.schemas[schema.target] = schema.schema;
|
|
186
|
+
const auth = getMetaTag(handler, AUTH_META);
|
|
187
|
+
if (auth) {
|
|
188
|
+
entry.auth = {
|
|
189
|
+
required: auth.required,
|
|
190
|
+
provider: auth.providerName,
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
const permission = getMetaTag(handler, PERMISSION_META);
|
|
194
|
+
if (permission) {
|
|
195
|
+
// Multiple `requirePermission(...)` middlewares on one route → union.
|
|
196
|
+
for (const slug of permission.permissions) {
|
|
197
|
+
if (!entry.permissions.includes(slug))
|
|
198
|
+
entry.permissions.push(slug);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
const rateLimit = getMetaTag(handler, RATE_LIMIT_META);
|
|
202
|
+
if (rateLimit) {
|
|
203
|
+
entry.rateLimit = {
|
|
204
|
+
windowMs: rateLimit.windowMs,
|
|
205
|
+
max: rateLimit.max,
|
|
206
|
+
scope: rateLimit.scope,
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
const idempotency = getMetaTag(handler, IDEMPOTENCY_META);
|
|
210
|
+
if (idempotency)
|
|
211
|
+
entry.idempotent = true;
|
|
212
|
+
}
|
|
213
|
+
return entry;
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=createApp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createApp.js","sourceRoot":"","sources":["../../../src/http/app/createApp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { Hono } from "hono";
|
|
2
|
+
import { type RouteRegistry } from "../../app/registry/routes.js";
|
|
3
|
+
/**
|
|
4
|
+
* `registerDevRoutes(app, opts?)` — mounts `/dev/routes` (HTML index) +
|
|
5
|
+
* `/dev/routes.json` (JSON dump) backed by the framework `RouteRegistry`.
|
|
6
|
+
*
|
|
7
|
+
* Recovers the human-discoverability we deliberately gave up by deferring
|
|
8
|
+
* Scalar `/docs` / OpenAPI to v4.x. For internal devs joining the project
|
|
9
|
+
* mid-stream the HTML index is "what routes does this app actually serve,
|
|
10
|
+
* with what auth requirements, with what request schemas?" — answered
|
|
11
|
+
* from runtime data, never stale.
|
|
12
|
+
*
|
|
13
|
+
* **Production safety**: gated by `opts.enabled` (default true only when
|
|
14
|
+
* `WORKER_MODE === "local"` or `NODE_ENV` is `local` / `dev` / `development`).
|
|
15
|
+
* Pass `enabled: true` to force-enable in other environments — e.g.,
|
|
16
|
+
* staging behind an admin gateway. Production should NOT enable this; the
|
|
17
|
+
* registry data is purely useful, not authenticated.
|
|
18
|
+
*/
|
|
19
|
+
export interface RegisterDevRoutesOptions {
|
|
20
|
+
/** Override the default registry. */
|
|
21
|
+
registry?: RouteRegistry;
|
|
22
|
+
/**
|
|
23
|
+
* Force enable / disable. Default: enabled when `WORKER_MODE === "local"`
|
|
24
|
+
* or `NODE_ENV` is `local` / `dev` / `development`.
|
|
25
|
+
*/
|
|
26
|
+
enabled?: boolean;
|
|
27
|
+
/** Mount path prefix. Default `""` (routes at `/dev/routes` + `/dev/routes.json`). */
|
|
28
|
+
prefix?: string;
|
|
29
|
+
}
|
|
30
|
+
export declare function registerDevRoutes(app: Hono, opts?: RegisterDevRoutesOptions): void;
|
|
31
|
+
//# sourceMappingURL=devRoutes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"devRoutes.d.ts","sourceRoot":"","sources":["../../../src/http/app/devRoutes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,EAGL,KAAK,aAAa,EACnB,MAAM,8BAA8B,CAAC;AAEtC;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,WAAW,wBAAwB;IACvC,qCAAqC;IACrC,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,sFAAsF;IACtF,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAwID,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,GAAE,wBAA6B,GAAG,IAAI,CAkBtF"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { routeRegistry as defaultRegistry, } from "../../app/registry/routes.js";
|
|
2
|
+
function isDevEnvByDefault() {
|
|
3
|
+
if (process.env.WORKER_MODE === "local")
|
|
4
|
+
return true;
|
|
5
|
+
const env = process.env.NODE_ENV ?? "";
|
|
6
|
+
return env === "local" || env === "dev" || env === "development";
|
|
7
|
+
}
|
|
8
|
+
const STYLE = `
|
|
9
|
+
* { box-sizing: border-box; }
|
|
10
|
+
body { font: 14px/1.5 ui-sans-serif, system-ui, sans-serif; margin: 24px; color: #111; }
|
|
11
|
+
h1 { font-size: 18px; margin: 0 0 16px; }
|
|
12
|
+
table { width: 100%; border-collapse: collapse; font-size: 13px; }
|
|
13
|
+
th, td { text-align: left; padding: 8px 10px; border-bottom: 1px solid #e5e5e5; vertical-align: top; }
|
|
14
|
+
th { background: #f7f7f7; font-weight: 600; }
|
|
15
|
+
tr:hover { background: #fafafa; }
|
|
16
|
+
.method { display: inline-block; padding: 2px 6px; border-radius: 3px; font-weight: 600; font-size: 11px; color: #fff; }
|
|
17
|
+
.m-GET { background: #2962ff; }
|
|
18
|
+
.m-POST { background: #00897b; }
|
|
19
|
+
.m-PUT { background: #ef6c00; }
|
|
20
|
+
.m-PATCH { background: #6a1b9a; }
|
|
21
|
+
.m-DELETE { background: #c62828; }
|
|
22
|
+
.m-WS { background: #455a64; }
|
|
23
|
+
.m-OPTIONS, .m-HEAD { background: #757575; }
|
|
24
|
+
.path { font-family: ui-monospace, "SF Mono", Menlo, monospace; }
|
|
25
|
+
.tag { display: inline-block; padding: 1px 6px; margin-right: 4px; border-radius: 3px; background: #eef; color: #335; font-size: 11px; }
|
|
26
|
+
.deprecated { opacity: 0.55; }
|
|
27
|
+
.muted { color: #888; }
|
|
28
|
+
.empty { padding: 24px; text-align: center; color: #888; }
|
|
29
|
+
small.summary { color: #555; }
|
|
30
|
+
`;
|
|
31
|
+
function escapeHtml(s) {
|
|
32
|
+
return s
|
|
33
|
+
.replace(/&/g, "&")
|
|
34
|
+
.replace(/</g, "<")
|
|
35
|
+
.replace(/>/g, ">")
|
|
36
|
+
.replace(/"/g, """)
|
|
37
|
+
.replace(/'/g, "'");
|
|
38
|
+
}
|
|
39
|
+
function methodClass(method) {
|
|
40
|
+
return `m-${escapeHtml(method)}`;
|
|
41
|
+
}
|
|
42
|
+
function renderEntry(entry) {
|
|
43
|
+
const method = `<span class="method ${methodClass(entry.method)}">${escapeHtml(entry.method)}</span>`;
|
|
44
|
+
const path = `<span class="path">${escapeHtml(entry.path)}</span>`;
|
|
45
|
+
const module = entry.module ? escapeHtml(entry.module) : `<span class="muted">—</span>`;
|
|
46
|
+
const auth = entry.auth.required
|
|
47
|
+
? `<strong>required</strong>${entry.auth.provider ? ` <span class="muted">(${escapeHtml(entry.auth.provider)})</span>` : ""}`
|
|
48
|
+
: `<span class="muted">none</span>`;
|
|
49
|
+
const permissions = entry.permissions.length === 0
|
|
50
|
+
? `<span class="muted">—</span>`
|
|
51
|
+
: entry.permissions.map((p) => `<span class="tag">${escapeHtml(p)}</span>`).join("");
|
|
52
|
+
const schemas = Object.keys(entry.schemas)
|
|
53
|
+
.filter((k) => Boolean(entry.schemas[k]))
|
|
54
|
+
.map((k) => `<span class="tag">${escapeHtml(k)}</span>`)
|
|
55
|
+
.join("");
|
|
56
|
+
const policy = [];
|
|
57
|
+
if (entry.rateLimit) {
|
|
58
|
+
policy.push(`<span class="tag">rate-limit ${entry.rateLimit.max}/${Math.round(entry.rateLimit.windowMs / 1000)}s</span>`);
|
|
59
|
+
}
|
|
60
|
+
if (entry.idempotent)
|
|
61
|
+
policy.push(`<span class="tag">idempotent</span>`);
|
|
62
|
+
if (entry.deprecated)
|
|
63
|
+
policy.push(`<span class="tag" style="background:#fdd;color:#900">deprecated</span>`);
|
|
64
|
+
const rowClass = entry.deprecated ? "deprecated" : "";
|
|
65
|
+
return `<tr class="${rowClass}">
|
|
66
|
+
<td>${method}</td>
|
|
67
|
+
<td>${path}</td>
|
|
68
|
+
<td>${module}</td>
|
|
69
|
+
<td>${auth}</td>
|
|
70
|
+
<td>${permissions || `<span class="muted">—</span>`}</td>
|
|
71
|
+
<td>${schemas || `<span class="muted">—</span>`}</td>
|
|
72
|
+
<td>${policy.join(" ") || `<span class="muted">—</span>`}</td>
|
|
73
|
+
</tr>`;
|
|
74
|
+
}
|
|
75
|
+
function renderHtml(entries) {
|
|
76
|
+
const summary = `${entries.length} route${entries.length === 1 ? "" : "s"} registered`;
|
|
77
|
+
const rows = entries.length === 0
|
|
78
|
+
? `<tr><td colspan="7" class="empty">No routes registered yet.</td></tr>`
|
|
79
|
+
: entries.map(renderEntry).join("\n");
|
|
80
|
+
return `<!doctype html>
|
|
81
|
+
<html lang="en">
|
|
82
|
+
<head>
|
|
83
|
+
<meta charset="utf-8">
|
|
84
|
+
<title>ShipAPI · /dev/routes</title>
|
|
85
|
+
<style>${STYLE}</style>
|
|
86
|
+
</head>
|
|
87
|
+
<body>
|
|
88
|
+
<h1>Routes <small class="summary">— ${summary}</small></h1>
|
|
89
|
+
<table>
|
|
90
|
+
<thead>
|
|
91
|
+
<tr>
|
|
92
|
+
<th>Method</th><th>Path</th><th>Module</th><th>Auth</th>
|
|
93
|
+
<th>Permissions</th><th>Schemas</th><th>Policy</th>
|
|
94
|
+
</tr>
|
|
95
|
+
</thead>
|
|
96
|
+
<tbody>${rows}</tbody>
|
|
97
|
+
</table>
|
|
98
|
+
</body>
|
|
99
|
+
</html>`;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Convert Zod schemas to JSON Schema for the JSON dump so external tooling
|
|
103
|
+
* (the MCP server, generated SDKs, dev-time debug consumers) can introspect
|
|
104
|
+
* request shapes without a Zod runtime. Uses Zod v4's native
|
|
105
|
+
* `z.toJSONSchema()` (the older `zod-to-json-schema` package doesn't
|
|
106
|
+
* understand Zod v4's internal schema shape). Failed conversions degrade
|
|
107
|
+
* to a presence flag so a malformed schema doesn't break the whole route.
|
|
108
|
+
*/
|
|
109
|
+
async function serializeSchemasForJson(entries) {
|
|
110
|
+
const { z } = await import("zod");
|
|
111
|
+
return entries.map((e) => {
|
|
112
|
+
const out = {};
|
|
113
|
+
for (const [key, schema] of Object.entries(e.schemas)) {
|
|
114
|
+
if (!schema)
|
|
115
|
+
continue;
|
|
116
|
+
try {
|
|
117
|
+
out[key] = z.toJSONSchema(schema);
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
// Schema couldn't be serialized (unsupported types, recursion);
|
|
121
|
+
// surface as a presence flag so consumers know it exists.
|
|
122
|
+
out[key] = { _present: true };
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return { ...e, schemas: out };
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
export function registerDevRoutes(app, opts = {}) {
|
|
129
|
+
const enabled = opts.enabled ?? isDevEnvByDefault();
|
|
130
|
+
if (!enabled)
|
|
131
|
+
return; // intentionally a no-op so production deploys don't expose the route table
|
|
132
|
+
const registry = opts.registry ?? defaultRegistry;
|
|
133
|
+
const prefix = opts.prefix ?? "";
|
|
134
|
+
app.get(`${prefix}/dev/routes`, (c) => {
|
|
135
|
+
const entries = registry.list();
|
|
136
|
+
const html = renderHtml(entries);
|
|
137
|
+
return c.html(html);
|
|
138
|
+
});
|
|
139
|
+
app.get(`${prefix}/dev/routes.json`, async (c) => {
|
|
140
|
+
const entries = registry.list();
|
|
141
|
+
const routes = await serializeSchemasForJson(entries);
|
|
142
|
+
return c.json({ ok: true, count: entries.length, routes });
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=devRoutes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"devRoutes.js","sourceRoot":"","sources":["../../../src/http/app/devRoutes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { Env, Hono } from "hono";
|
|
2
|
+
import { logger as defaultLogger } from "../../observability/logger.js";
|
|
3
|
+
/**
|
|
4
|
+
* `registerErrorHandlers(app, opts?)` — wires `app.onError` and `app.notFound`
|
|
5
|
+
* so AppError throws from anywhere in the request chain produce a consistent
|
|
6
|
+
* JSON shape. Replaces v3's `ErrorHandlerMiddleware`.
|
|
7
|
+
*
|
|
8
|
+
* Response shape (matches v3 for transition compat):
|
|
9
|
+
* {
|
|
10
|
+
* success: false,
|
|
11
|
+
* error: { code, message, details? },
|
|
12
|
+
* stack?: string, // development only
|
|
13
|
+
* name?: string, // development only
|
|
14
|
+
* }
|
|
15
|
+
*
|
|
16
|
+
* - `AppError` subclasses → status from `error.statusCode`, `code` from
|
|
17
|
+
* `error.code`. `ValidationError.details` flows through.
|
|
18
|
+
* - `HTTPException` (Hono native) → its status + a generic "HTTP_<status>"
|
|
19
|
+
* code; lets framework code throw `HTTPException` without having to
|
|
20
|
+
* wrap in AppError.
|
|
21
|
+
* - Anything else → 500 with `INTERNAL_SERVER_ERROR`. The original message
|
|
22
|
+
* is logged but NOT exposed (avoid leaking internals to clients).
|
|
23
|
+
*
|
|
24
|
+
* 404s are routed through `app.notFound`, which throws a `NotFoundError`
|
|
25
|
+
* so the same handler shape applies.
|
|
26
|
+
*/
|
|
27
|
+
export interface ErrorResponseShape {
|
|
28
|
+
success: false;
|
|
29
|
+
error: {
|
|
30
|
+
code: string;
|
|
31
|
+
message: string;
|
|
32
|
+
details?: unknown;
|
|
33
|
+
};
|
|
34
|
+
stack?: string;
|
|
35
|
+
name?: string;
|
|
36
|
+
}
|
|
37
|
+
export interface RegisterErrorHandlersOptions {
|
|
38
|
+
/** Override the framework default pino logger. */
|
|
39
|
+
logger?: typeof defaultLogger;
|
|
40
|
+
/** Force dev-mode debug fields (`stack`, `name`) in responses. Default
|
|
41
|
+
* is `process.env.NODE_ENV === "development"`. */
|
|
42
|
+
exposeStack?: boolean;
|
|
43
|
+
}
|
|
44
|
+
export declare function registerErrorHandlers<E extends Env>(app: Hono<E>, opts?: RegisterErrorHandlersOptions): void;
|
|
45
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/http/app/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAGtC,OAAO,EAAE,MAAM,IAAI,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAKxE;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,CAAC;IACF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,4BAA4B;IAC3C,kDAAkD;IAClD,MAAM,CAAC,EAAE,OAAO,aAAa,CAAC;IAC9B;uDACmD;IACnD,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AA4BD,wBAAgB,qBAAqB,CAAC,CAAC,SAAS,GAAG,EACjD,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,EACZ,IAAI,GAAE,4BAAiC,GACtC,IAAI,CAqEN"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { HTTPException } from "hono/http-exception";
|
|
2
|
+
import { logger as defaultLogger } from "../../observability/logger.js";
|
|
3
|
+
import { AppError } from "../errors/AppError.js";
|
|
4
|
+
import { NotFoundError } from "../errors/NotFoundError.js";
|
|
5
|
+
import { ValidationError } from "../errors/ValidationError.js";
|
|
6
|
+
function isDevelopment() {
|
|
7
|
+
return process.env.NODE_ENV === "development";
|
|
8
|
+
}
|
|
9
|
+
function buildResponse(err, exposeStack) {
|
|
10
|
+
const body = {
|
|
11
|
+
success: false,
|
|
12
|
+
error: {
|
|
13
|
+
code: err.code,
|
|
14
|
+
message: err.message,
|
|
15
|
+
},
|
|
16
|
+
};
|
|
17
|
+
if (err instanceof ValidationError && err.details !== undefined) {
|
|
18
|
+
body.error.details = err.details;
|
|
19
|
+
}
|
|
20
|
+
if (exposeStack) {
|
|
21
|
+
body.stack = err.stack;
|
|
22
|
+
body.name = err.name;
|
|
23
|
+
}
|
|
24
|
+
return body;
|
|
25
|
+
}
|
|
26
|
+
// Generic over the `Hono<E>` Env so consumers can pass a typed app
|
|
27
|
+
// (e.g. `Hono<AppEnv>`) without a cast. The error-handler logic only
|
|
28
|
+
// reads from `c.req` and `c.error` — nothing that depends on a
|
|
29
|
+
// specific Env shape — so widening the parameter is safe.
|
|
30
|
+
export function registerErrorHandlers(app, opts = {}) {
|
|
31
|
+
const log = opts.logger ?? defaultLogger;
|
|
32
|
+
const exposeStack = opts.exposeStack ?? isDevelopment();
|
|
33
|
+
app.notFound((c) => {
|
|
34
|
+
const path = c.req.path;
|
|
35
|
+
const method = c.req.method;
|
|
36
|
+
const err = new NotFoundError(`Route ${method} ${path} not found`);
|
|
37
|
+
const body = buildResponse(err, exposeStack);
|
|
38
|
+
return c.json(body, err.statusCode);
|
|
39
|
+
});
|
|
40
|
+
app.onError((err, c) => {
|
|
41
|
+
if (err instanceof AppError) {
|
|
42
|
+
// Operational errors are expected — log at warn (4xx) or error (5xx).
|
|
43
|
+
const fields = {
|
|
44
|
+
method: c.req.method,
|
|
45
|
+
path: c.req.path,
|
|
46
|
+
status: err.statusCode,
|
|
47
|
+
code: err.code,
|
|
48
|
+
err,
|
|
49
|
+
};
|
|
50
|
+
if (err.statusCode >= 500)
|
|
51
|
+
log.error(fields, "http.error");
|
|
52
|
+
else
|
|
53
|
+
log.warn(fields, "http.error");
|
|
54
|
+
const body = buildResponse(err, exposeStack);
|
|
55
|
+
return c.json(body, err.statusCode);
|
|
56
|
+
}
|
|
57
|
+
if (err instanceof HTTPException) {
|
|
58
|
+
// Hono native — thrown by router (e.g., `c.throw(403)`).
|
|
59
|
+
const body = {
|
|
60
|
+
success: false,
|
|
61
|
+
error: {
|
|
62
|
+
code: `HTTP_${err.status}`,
|
|
63
|
+
message: err.message || `HTTP ${err.status}`,
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
if (exposeStack) {
|
|
67
|
+
body.stack = err.stack;
|
|
68
|
+
body.name = err.name;
|
|
69
|
+
}
|
|
70
|
+
log.warn({ method: c.req.method, path: c.req.path, status: err.status }, "http.error");
|
|
71
|
+
return c.json(body, err.status);
|
|
72
|
+
}
|
|
73
|
+
// Unknown error — log full details, return safe 500 to client.
|
|
74
|
+
log.error({
|
|
75
|
+
method: c.req.method,
|
|
76
|
+
path: c.req.path,
|
|
77
|
+
err,
|
|
78
|
+
}, "http.error.unhandled");
|
|
79
|
+
const body = {
|
|
80
|
+
success: false,
|
|
81
|
+
error: {
|
|
82
|
+
code: "INTERNAL_SERVER_ERROR",
|
|
83
|
+
message: "An unexpected error occurred",
|
|
84
|
+
},
|
|
85
|
+
};
|
|
86
|
+
if (exposeStack && err instanceof Error) {
|
|
87
|
+
body.stack = err.stack;
|
|
88
|
+
body.name = err.name;
|
|
89
|
+
}
|
|
90
|
+
return c.json(body, 500);
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/http/app/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import type { Hono } from "hono";
|
|
2
|
+
import { type HealthCheckRegistry } from "../../app/health/HealthCheck.js";
|
|
3
|
+
/**
|
|
4
|
+
* `registerHealthRoutes(app, opts?)` — wires `/livez` and `/readyz`.
|
|
5
|
+
*
|
|
6
|
+
* `createApp()` calls this for you (opt out with `createApp({ health: false })`),
|
|
7
|
+
* so most apps never call it directly. Calling it on an app that already has
|
|
8
|
+
* the routes mounts nothing (see below).
|
|
9
|
+
*
|
|
10
|
+
* - `GET /livez` always 200 with `{ ok: true }`. Process up. Used by the
|
|
11
|
+
* orchestrator's restart trigger.
|
|
12
|
+
* - `GET /readyz` runs every check in the registry. 200 with
|
|
13
|
+
* `{ ok: true, checks: [{ name, ok, latencyMs }] }` when all pass; 503 with
|
|
14
|
+
* the same shape (and `ok: false` plus a generic per-check `error` of
|
|
15
|
+
* `"timeout"` or `"unavailable"`) when any fail. The raw error never reaches
|
|
16
|
+
* the response body — the endpoint is unauthenticated and database errors
|
|
17
|
+
* can name hosts and users. Failures are logged server-side at warn level
|
|
18
|
+
* with the check name, the `error` string a check returned (as `reason`,
|
|
19
|
+
* truncated), and for a thrown error its `code` / `name` / `syscall` only.
|
|
20
|
+
*
|
|
21
|
+
* There is deliberately no `/healthz`: Google Cloud Run's front end intercepts
|
|
22
|
+
* that path and it never reaches the container.
|
|
23
|
+
*
|
|
24
|
+
* Replaces v3's `InitHealthCheckRoute` + `InitWarmupCheckRoute`. The
|
|
25
|
+
* dual-endpoint pattern is the Kubernetes / GCP / Fly convention.
|
|
26
|
+
*/
|
|
27
|
+
export interface RegisterHealthRoutesOptions {
|
|
28
|
+
/**
|
|
29
|
+
* Registry to query. Defaults to the framework-wide singleton — modules
|
|
30
|
+
* register their checks against it via `healthCheckRegistry.add(...)`.
|
|
31
|
+
*/
|
|
32
|
+
registry?: HealthCheckRegistry;
|
|
33
|
+
/** Override the per-check timeout used by `/readyz`. Default 3_000 ms. */
|
|
34
|
+
readyzTimeoutMs?: number;
|
|
35
|
+
/** Mount path prefix. Default `""` (routes mount at `/livez` + `/readyz`). */
|
|
36
|
+
prefix?: string;
|
|
37
|
+
}
|
|
38
|
+
/** One entry of the public `/readyz` body. */
|
|
39
|
+
export interface ReadyzCheck {
|
|
40
|
+
name: string;
|
|
41
|
+
ok: boolean;
|
|
42
|
+
latencyMs: number;
|
|
43
|
+
/** Present only when `ok` is false. Never the raw error text. */
|
|
44
|
+
error?: "timeout" | "unavailable";
|
|
45
|
+
}
|
|
46
|
+
export interface ReadyzBody {
|
|
47
|
+
ok: boolean;
|
|
48
|
+
checks: ReadyzCheck[];
|
|
49
|
+
}
|
|
50
|
+
/** Whether `/livez` + `/readyz` are already mounted on this app instance. */
|
|
51
|
+
export declare function hasHealthRoutes(app: object): boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Mount `/livez` + `/readyz` on `app`, once per app instance.
|
|
54
|
+
*
|
|
55
|
+
* On an app that already has them (every `createApp()` app unless it passed
|
|
56
|
+
* `health: false`), this never mounts a second copy and never throws. A
|
|
57
|
+
* `registry` or `readyzTimeoutMs` passed to the later call is applied to the
|
|
58
|
+
* routes already mounted, so an app that wires its own registry this way keeps
|
|
59
|
+
* the readiness checks it had before `createApp` mounted the routes. That late
|
|
60
|
+
* configuration is deprecated: it logs a warning once per app, and will be
|
|
61
|
+
* removed in the next major version — pass it to `createApp({ health })`. A
|
|
62
|
+
* different `prefix` cannot be honoured without mounting again; it is ignored
|
|
63
|
+
* with a warning (configure it with `createApp({ health: { prefix } })`).
|
|
64
|
+
*/
|
|
65
|
+
export declare function registerHealthRoutes(app: Hono, opts?: RegisterHealthRoutesOptions): void;
|
|
66
|
+
//# sourceMappingURL=health.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../../src/http/app/health.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,EAGL,KAAK,mBAAmB,EACzB,MAAM,iCAAiC,CAAC;AAOzC;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,MAAM,WAAW,2BAA2B;IAC1C;;;OAGG;IACH,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAC/B,0EAA0E;IAC1E,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,8EAA8E;IAC9E,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,8CAA8C;AAC9C,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,OAAO,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,iEAAiE;IACjE,KAAK,CAAC,EAAE,SAAS,GAAG,aAAa,CAAC;CACnC;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB;AAcD,6EAA6E;AAC7E,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,GAAE,2BAAgC,GAAG,IAAI,CA4C5F"}
|