@zintrust/core 0.1.18 → 0.1.20
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 +16 -10
- package/bin/zintrust-main.d.ts.map +1 -1
- package/bin/zintrust-main.js +9 -0
- package/package.json +11 -2
- package/public/error-pages/404.html +145 -0
- package/public/error-pages/500.html +266 -0
- package/public/error-pages/error.css +628 -0
- package/public/error-pages/error.js +428 -0
- package/public/index.html +1 -1
- package/public/zintrust.svg +30 -0
- package/routes/api.d.ts +7 -0
- package/routes/api.d.ts.map +1 -0
- package/routes/api.js +115 -0
- package/routes/broadcast.d.ts +9 -0
- package/routes/broadcast.d.ts.map +1 -0
- package/routes/broadcast.js +27 -0
- package/routes/health.d.ts +7 -0
- package/routes/health.d.ts.map +1 -0
- package/routes/health.js +127 -0
- package/routes/metrics.d.ts +9 -0
- package/routes/metrics.d.ts.map +1 -0
- package/routes/metrics.js +20 -0
- package/routes/openapi.d.ts +9 -0
- package/routes/openapi.d.ts.map +1 -0
- package/routes/openapi.js +76 -0
- package/routes/storage.d.ts +4 -0
- package/routes/storage.d.ts.map +1 -0
- package/routes/storage.js +35 -0
- package/src/boot/Application.d.ts +2 -2
- package/src/boot/Application.d.ts.map +1 -1
- package/src/boot/Application.js +18 -3
- package/src/boot/Server.d.ts +3 -2
- package/src/boot/Server.d.ts.map +1 -1
- package/src/boot/Server.js +39 -165
- package/src/boot/bootstrap.js +1 -1
- package/src/cache/Cache.d.ts +1 -1
- package/src/cache/Cache.d.ts.map +1 -1
- package/src/cache/CacheDriver.d.ts +4 -0
- package/src/cache/CacheDriver.d.ts.map +1 -1
- package/src/cache/drivers/KVDriver.d.ts +1 -1
- package/src/cache/drivers/KVDriver.d.ts.map +1 -1
- package/src/cache/drivers/MemoryDriver.d.ts +1 -1
- package/src/cache/drivers/MemoryDriver.d.ts.map +1 -1
- package/src/cache/drivers/MemoryDriver.js +16 -0
- package/src/cache/drivers/MongoDriver.d.ts +1 -1
- package/src/cache/drivers/MongoDriver.d.ts.map +1 -1
- package/src/cache/drivers/RedisDriver.d.ts +1 -1
- package/src/cache/drivers/RedisDriver.d.ts.map +1 -1
- package/src/cli/CLI.d.ts.map +1 -1
- package/src/cli/CLI.js +12 -4
- package/src/cli/PromptHelper.d.ts.map +1 -1
- package/src/cli/PromptHelper.js +4 -3
- package/src/cli/commands/AddCommand.d.ts +2 -2
- package/src/cli/commands/AddCommand.d.ts.map +1 -1
- package/src/cli/commands/AddCommand.js +135 -58
- package/src/cli/commands/ConfigCommand.d.ts +1 -1
- package/src/cli/commands/ConfigCommand.d.ts.map +1 -1
- package/src/cli/commands/CreateCommand.d.ts +15 -0
- package/src/cli/commands/CreateCommand.d.ts.map +1 -0
- package/src/cli/commands/CreateCommand.js +143 -0
- package/src/cli/commands/D1MigrateCommand.d.ts +1 -1
- package/src/cli/commands/D1MigrateCommand.d.ts.map +1 -1
- package/src/cli/commands/D1MigrateCommand.js +16 -20
- package/src/cli/commands/DbSeedCommand.d.ts +9 -0
- package/src/cli/commands/DbSeedCommand.d.ts.map +1 -0
- package/src/cli/commands/DbSeedCommand.js +171 -0
- package/src/cli/commands/DebugCommand.d.ts +1 -1
- package/src/cli/commands/DebugCommand.d.ts.map +1 -1
- package/src/cli/commands/FixCommand.d.ts +1 -1
- package/src/cli/commands/FixCommand.d.ts.map +1 -1
- package/src/cli/commands/JwtDevCommand.d.ts +8 -0
- package/src/cli/commands/JwtDevCommand.d.ts.map +1 -0
- package/src/cli/commands/JwtDevCommand.js +114 -0
- package/src/cli/commands/KeyGenerateCommand.d.ts +1 -1
- package/src/cli/commands/KeyGenerateCommand.d.ts.map +1 -1
- package/src/cli/commands/LogsCommand.d.ts +2 -2
- package/src/cli/commands/LogsCommand.d.ts.map +1 -1
- package/src/cli/commands/LogsCommand.js +36 -2
- package/src/cli/commands/MakeMailTemplateCommand.d.ts +1 -1
- package/src/cli/commands/MakeMailTemplateCommand.d.ts.map +1 -1
- package/src/cli/commands/MakeNotificationTemplateCommand.d.ts +1 -1
- package/src/cli/commands/MakeNotificationTemplateCommand.d.ts.map +1 -1
- package/src/cli/commands/MigrateCommand.d.ts +1 -1
- package/src/cli/commands/MigrateCommand.d.ts.map +1 -1
- package/src/cli/commands/MigrateCommand.js +291 -35
- package/src/cli/commands/NewCommand.d.ts +2 -2
- package/src/cli/commands/NewCommand.d.ts.map +1 -1
- package/src/cli/commands/NewCommand.js +38 -13
- package/src/cli/commands/PluginCommand.d.ts +1 -1
- package/src/cli/commands/PluginCommand.d.ts.map +1 -1
- package/src/cli/commands/PrepareCommand.d.ts +1 -1
- package/src/cli/commands/PrepareCommand.d.ts.map +1 -1
- package/src/cli/commands/QACommand.d.ts +2 -2
- package/src/cli/commands/QACommand.d.ts.map +1 -1
- package/src/cli/commands/RoutesCommand.d.ts +10 -0
- package/src/cli/commands/RoutesCommand.d.ts.map +1 -0
- package/src/cli/commands/RoutesCommand.js +242 -0
- package/src/cli/commands/SimulateCommand.d.ts +1 -1
- package/src/cli/commands/SimulateCommand.d.ts.map +1 -1
- package/src/cli/commands/SimulateCommand.js +1 -1
- package/src/cli/commands/StartCommand.d.ts.map +1 -1
- package/src/cli/commands/StartCommand.js +90 -3
- package/src/cli/commands/UpgradeCommand.d.ts +16 -0
- package/src/cli/commands/UpgradeCommand.d.ts.map +1 -0
- package/src/cli/commands/UpgradeCommand.js +107 -0
- package/src/cli/commands/index.d.ts +3 -0
- package/src/cli/commands/index.d.ts.map +1 -1
- package/src/cli/commands/index.js +3 -0
- package/src/cli/commands/runner/index.d.ts +3 -0
- package/src/cli/commands/runner/index.d.ts.map +1 -0
- package/src/cli/commands/runner/index.js +139 -0
- package/src/cli/config/ConfigManager.d.ts +1 -1
- package/src/cli/config/ConfigManager.d.ts.map +1 -1
- package/src/cli/config/ConfigValidator.d.ts +1 -1
- package/src/cli/config/ConfigValidator.d.ts.map +1 -1
- package/src/cli/config/ConfigValidator.js +1 -1
- package/src/cli/d1/D1SqlMigrations.d.ts +20 -0
- package/src/cli/d1/D1SqlMigrations.d.ts.map +1 -0
- package/src/cli/d1/D1SqlMigrations.js +224 -0
- package/src/cli/d1/WranglerConfig.d.ts +4 -0
- package/src/cli/d1/WranglerConfig.d.ts.map +1 -0
- package/src/cli/d1/WranglerConfig.js +122 -0
- package/src/cli/d1/WranglerD1.d.ts +11 -0
- package/src/cli/d1/WranglerD1.d.ts.map +1 -0
- package/src/cli/d1/WranglerD1.js +16 -0
- package/src/cli/env/EnvFileBackfill.d.ts +10 -0
- package/src/cli/env/EnvFileBackfill.d.ts.map +1 -0
- package/src/cli/env/EnvFileBackfill.js +64 -0
- package/src/cli/scaffolding/ControllerGenerator.d.ts.map +1 -1
- package/src/cli/scaffolding/ControllerGenerator.js +72 -22
- package/src/cli/scaffolding/FactoryGenerator.d.ts.map +1 -1
- package/src/cli/scaffolding/FactoryGenerator.js +3 -1
- package/src/cli/scaffolding/GovernanceScaffolder.d.ts +23 -0
- package/src/cli/scaffolding/GovernanceScaffolder.d.ts.map +1 -0
- package/src/cli/scaffolding/GovernanceScaffolder.js +327 -0
- package/src/cli/scaffolding/MigrationGenerator.d.ts +10 -0
- package/src/cli/scaffolding/MigrationGenerator.d.ts.map +1 -1
- package/src/cli/scaffolding/MigrationGenerator.js +137 -51
- package/src/cli/scaffolding/ProjectScaffolder.d.ts.map +1 -1
- package/src/cli/scaffolding/ProjectScaffolder.js +54 -59
- package/src/cli/scaffolding/RouteGenerator.d.ts.map +1 -1
- package/src/cli/scaffolding/RouteGenerator.js +79 -43
- package/src/cli/scaffolding/SeederGenerator.d.ts +5 -0
- package/src/cli/scaffolding/SeederGenerator.d.ts.map +1 -1
- package/src/cli/scaffolding/SeederGenerator.js +63 -15
- package/src/cli/scaffolding/ServiceScaffolder.d.ts.map +1 -1
- package/src/cli/scaffolding/ServiceScaffolder.js +24 -3
- package/src/cli/scaffolding/index.d.ts +2 -0
- package/src/cli/scaffolding/index.d.ts.map +1 -1
- package/src/cli/scaffolding/index.js +1 -0
- package/src/cli/utils/DistPackager.d.ts.map +1 -1
- package/src/cli/utils/DistPackager.js +8 -0
- package/src/common/index.d.ts +8 -0
- package/src/common/index.d.ts.map +1 -1
- package/src/common/index.js +28 -0
- package/src/common/utility.d.ts +38 -0
- package/src/common/utility.d.ts.map +1 -0
- package/src/common/utility.js +101 -0
- package/src/config/FileLogWriter.d.ts +2 -1
- package/src/config/FileLogWriter.d.ts.map +1 -1
- package/src/config/FileLogWriter.js +83 -2
- package/src/config/app.d.ts.map +1 -1
- package/src/config/app.js +3 -1
- package/src/config/broadcast.d.ts +1 -1
- package/src/config/broadcast.d.ts.map +1 -1
- package/src/config/broadcast.js +1 -1
- package/src/config/cache.d.ts +1 -1
- package/src/config/cache.d.ts.map +1 -1
- package/src/config/cloudflare.d.ts +1 -1
- package/src/config/cloudflare.d.ts.map +1 -1
- package/src/config/database.d.ts +7 -1
- package/src/config/database.d.ts.map +1 -1
- package/src/config/database.js +99 -7
- package/src/config/env.d.ts +6 -0
- package/src/config/env.d.ts.map +1 -1
- package/src/config/env.js +7 -0
- package/src/config/index.d.ts +8 -2
- package/src/config/index.d.ts.map +1 -1
- package/src/config/logging/KvLogger.js +1 -1
- package/src/config/logging/SlackLogger.js +2 -2
- package/src/config/middleware.d.ts +22 -2
- package/src/config/middleware.d.ts.map +1 -1
- package/src/config/middleware.js +179 -11
- package/src/config/notification.js +1 -1
- package/src/config/security.d.ts +1 -1
- package/src/config/security.js +1 -1
- package/src/config/storage.js +1 -1
- package/src/config/type.d.ts +8 -2
- package/src/config/type.d.ts.map +1 -1
- package/src/events/EventDispatcher.d.ts.map +1 -1
- package/src/events/EventDispatcher.js +6 -4
- package/src/exceptions/ZintrustError.d.ts +7 -0
- package/src/exceptions/ZintrustError.d.ts.map +1 -1
- package/src/exceptions/ZintrustError.js +56 -0
- package/src/features/Auth.d.ts +1 -1
- package/src/features/Auth.d.ts.map +1 -1
- package/src/features/Auth.js +3 -3
- package/src/features/Queue.js +1 -1
- package/src/functions/cloudflare.d.ts.map +1 -1
- package/src/functions/cloudflare.js +3 -14
- package/src/functions/deno.d.ts.map +1 -1
- package/src/functions/deno.js +3 -14
- package/src/functions/lambda.d.ts.map +1 -1
- package/src/functions/lambda.js +3 -14
- package/src/health/StartupHealthChecks.js +1 -1
- package/src/http/Controller.d.ts +2 -2
- package/src/http/Controller.d.ts.map +1 -1
- package/src/http/FileUpload.d.ts +68 -0
- package/src/http/FileUpload.d.ts.map +1 -0
- package/src/http/FileUpload.js +120 -0
- package/src/http/Kernel.d.ts +5 -5
- package/src/http/Kernel.d.ts.map +1 -1
- package/src/http/Kernel.js +139 -23
- package/src/http/Request.d.ts +20 -1
- package/src/http/Request.d.ts.map +1 -1
- package/src/http/Request.js +23 -0
- package/src/http/RequestContext.d.ts +6 -0
- package/src/http/RequestContext.d.ts.map +1 -1
- package/src/http/RequestContext.js +77 -1
- package/src/http/Response.d.ts +1 -1
- package/src/http/Response.d.ts.map +1 -1
- package/src/http/ValidationHelper.d.ts +78 -0
- package/src/http/ValidationHelper.d.ts.map +1 -0
- package/src/http/ValidationHelper.js +121 -0
- package/src/http/error-pages/ErrorPageRenderer.d.ts +17 -0
- package/src/http/error-pages/ErrorPageRenderer.d.ts.map +1 -0
- package/src/http/error-pages/ErrorPageRenderer.js +88 -0
- package/src/http/middleware/BodyParsingMiddleware.d.ts +12 -0
- package/src/http/middleware/BodyParsingMiddleware.d.ts.map +1 -0
- package/src/http/middleware/BodyParsingMiddleware.js +251 -0
- package/src/http/middleware/FileUploadMiddleware.d.ts +12 -0
- package/src/http/middleware/FileUploadMiddleware.d.ts.map +1 -0
- package/src/http/middleware/FileUploadMiddleware.js +74 -0
- package/src/http/parsers/BodyParsers.d.ts +32 -0
- package/src/http/parsers/BodyParsers.d.ts.map +1 -0
- package/src/http/parsers/BodyParsers.js +159 -0
- package/src/http/parsers/MultipartParser.d.ts +33 -0
- package/src/http/parsers/MultipartParser.d.ts.map +1 -0
- package/src/http/parsers/MultipartParser.js +129 -0
- package/src/http/parsers/MultipartParserRegistry.d.ts +34 -0
- package/src/http/parsers/MultipartParserRegistry.d.ts.map +1 -0
- package/src/http/parsers/MultipartParserRegistry.js +20 -0
- package/src/http/validated.d.ts +12 -0
- package/src/http/validated.d.ts.map +1 -0
- package/src/http/validated.js +41 -0
- package/src/index.d.ts +65 -7
- package/src/index.d.ts.map +1 -1
- package/src/index.js +59 -5
- package/src/microservices/RequestTracingMiddleware.d.ts +2 -2
- package/src/microservices/RequestTracingMiddleware.d.ts.map +1 -1
- package/src/microservices/RequestTracingMiddleware.js +3 -0
- package/src/microservices/ServiceAuthMiddleware.d.ts +2 -2
- package/src/microservices/ServiceAuthMiddleware.d.ts.map +1 -1
- package/src/middleware/AuthMiddleware.d.ts +10 -0
- package/src/middleware/AuthMiddleware.d.ts.map +1 -0
- package/src/middleware/AuthMiddleware.js +16 -0
- package/src/middleware/CsrfMiddleware.d.ts +11 -1
- package/src/middleware/CsrfMiddleware.d.ts.map +1 -1
- package/src/middleware/CsrfMiddleware.js +33 -0
- package/src/middleware/JwtAuthMiddleware.d.ts +11 -0
- package/src/middleware/JwtAuthMiddleware.d.ts.map +1 -0
- package/src/middleware/JwtAuthMiddleware.js +73 -0
- package/src/middleware/LoggingMiddleware.d.ts.map +1 -1
- package/src/middleware/LoggingMiddleware.js +8 -3
- package/src/middleware/MiddlewareStack.d.ts +2 -2
- package/src/middleware/MiddlewareStack.d.ts.map +1 -1
- package/src/middleware/RateLimiter.d.ts +2 -2
- package/src/middleware/RateLimiter.d.ts.map +1 -1
- package/src/middleware/RateLimiter.js +26 -1
- package/src/middleware/SanitizeBodyMiddleware.d.ts +12 -0
- package/src/middleware/SanitizeBodyMiddleware.d.ts.map +1 -0
- package/src/middleware/SanitizeBodyMiddleware.js +31 -0
- package/src/middleware/SecurityMiddleware.d.ts +1 -1
- package/src/middleware/SecurityMiddleware.d.ts.map +1 -1
- package/src/middleware/SessionMiddleware.d.ts +1 -1
- package/src/middleware/SessionMiddleware.d.ts.map +1 -1
- package/src/middleware/ValidationMiddleware.d.ts +25 -0
- package/src/middleware/ValidationMiddleware.d.ts.map +1 -0
- package/src/middleware/ValidationMiddleware.js +251 -0
- package/src/migrations/MigrationDiscovery.d.ts +5 -0
- package/src/migrations/MigrationDiscovery.d.ts.map +1 -0
- package/src/migrations/MigrationDiscovery.js +16 -0
- package/src/migrations/MigrationLoader.d.ts +5 -0
- package/src/migrations/MigrationLoader.d.ts.map +1 -0
- package/src/migrations/MigrationLoader.js +43 -0
- package/src/migrations/MigrationLock.d.ts +4 -0
- package/src/migrations/MigrationLock.d.ts.map +1 -0
- package/src/migrations/MigrationLock.js +33 -0
- package/src/migrations/Migrator.d.ts +23 -0
- package/src/migrations/Migrator.d.ts.map +1 -0
- package/src/migrations/Migrator.js +4 -0
- package/src/migrations/MigratorFactory.d.ts +25 -0
- package/src/migrations/MigratorFactory.d.ts.map +1 -0
- package/src/migrations/MigratorFactory.js +323 -0
- package/src/migrations/schema/Blueprint.d.ts +5 -0
- package/src/migrations/schema/Blueprint.d.ts.map +1 -0
- package/src/migrations/schema/Blueprint.js +189 -0
- package/src/migrations/schema/Schema.d.ts +8 -0
- package/src/migrations/schema/Schema.d.ts.map +1 -0
- package/src/migrations/schema/Schema.js +141 -0
- package/src/migrations/schema/SchemaCompiler.d.ts +20 -0
- package/src/migrations/schema/SchemaCompiler.d.ts.map +1 -0
- package/src/migrations/schema/SchemaCompiler.js +262 -0
- package/src/migrations/schema/index.d.ts +5 -0
- package/src/migrations/schema/index.d.ts.map +1 -0
- package/src/migrations/schema/index.js +3 -0
- package/src/migrations/schema/types.d.ts +86 -0
- package/src/migrations/schema/types.d.ts.map +1 -0
- package/src/migrations/schema/types.js +1 -0
- package/src/migrations/types.d.ts +45 -0
- package/src/migrations/types.d.ts.map +1 -0
- package/src/migrations/types.js +1 -0
- package/src/node-singletons/crypto.d.ts +1 -1
- package/src/node-singletons/crypto.d.ts.map +1 -1
- package/src/node-singletons/crypto.js +1 -1
- package/src/node-singletons/fs.d.ts +2 -2
- package/src/node-singletons/fs.d.ts.map +1 -1
- package/src/node-singletons/fs.js +1 -1
- package/src/node-singletons/util.d.ts +6 -0
- package/src/node-singletons/util.d.ts.map +1 -0
- package/src/node-singletons/util.js +5 -0
- package/src/node.d.ts +2 -0
- package/src/node.d.ts.map +1 -1
- package/src/node.js +7 -0
- package/src/observability/OpenTelemetry.d.ts +62 -0
- package/src/observability/OpenTelemetry.d.ts.map +1 -0
- package/src/observability/OpenTelemetry.js +167 -0
- package/src/observability/PrometheusMetrics.d.ts +25 -0
- package/src/observability/PrometheusMetrics.d.ts.map +1 -0
- package/src/observability/PrometheusMetrics.js +114 -0
- package/src/openapi/OpenApiGenerator.d.ts +68 -0
- package/src/openapi/OpenApiGenerator.d.ts.map +1 -0
- package/src/openapi/OpenApiGenerator.js +287 -0
- package/src/orm/Database.d.ts +4 -2
- package/src/orm/Database.d.ts.map +1 -1
- package/src/orm/Database.js +142 -29
- package/src/orm/DatabaseAdapter.d.ts +13 -0
- package/src/orm/DatabaseAdapter.d.ts.map +1 -1
- package/src/orm/DatabaseAdapterRegistry.d.ts.map +1 -1
- package/src/orm/DatabaseAdapterRegistry.js +3 -1
- package/src/orm/DatabaseRuntimeRegistration.d.ts.map +1 -1
- package/src/orm/DatabaseRuntimeRegistration.js +4 -0
- package/src/orm/Model.d.ts +30 -2
- package/src/orm/Model.d.ts.map +1 -1
- package/src/orm/Model.js +255 -62
- package/src/orm/QueryBuilder.d.ts +22 -1
- package/src/orm/QueryBuilder.d.ts.map +1 -1
- package/src/orm/QueryBuilder.js +405 -95
- package/src/orm/Relationships.d.ts +7 -1
- package/src/orm/Relationships.d.ts.map +1 -1
- package/src/orm/Relationships.js +18 -0
- package/src/orm/SchemaCompiler.d.ts +9 -0
- package/src/orm/SchemaCompiler.d.ts.map +1 -0
- package/src/orm/SchemaCompiler.js +145 -0
- package/src/orm/adapters/D1Adapter.d.ts +1 -1
- package/src/orm/adapters/D1Adapter.d.ts.map +1 -1
- package/src/orm/adapters/MySQLAdapter.d.ts +1 -1
- package/src/orm/adapters/MySQLAdapter.d.ts.map +1 -1
- package/src/orm/adapters/MySQLAdapter.js +88 -69
- package/src/orm/adapters/PostgreSQLAdapter.d.ts +1 -1
- package/src/orm/adapters/PostgreSQLAdapter.d.ts.map +1 -1
- package/src/orm/adapters/PostgreSQLAdapter.js +88 -69
- package/src/orm/adapters/SQLServerAdapter.d.ts +1 -1
- package/src/orm/adapters/SQLServerAdapter.d.ts.map +1 -1
- package/src/orm/adapters/SQLiteAdapter.d.ts +1 -1
- package/src/orm/adapters/SQLiteAdapter.d.ts.map +1 -1
- package/src/orm/adapters/SQLiteAdapter.js +63 -3
- package/src/orm/maintenance/SqliteMaintenance.d.ts +5 -0
- package/src/orm/maintenance/SqliteMaintenance.d.ts.map +1 -0
- package/src/orm/maintenance/SqliteMaintenance.js +14 -0
- package/src/orm/migrations/MigrationStore.d.ts +38 -0
- package/src/orm/migrations/MigrationStore.d.ts.map +1 -0
- package/src/orm/migrations/MigrationStore.js +157 -0
- package/src/performance/CodeGenerationBenchmark.d.ts.map +1 -1
- package/src/performance/Optimizer.d.ts +1 -0
- package/src/performance/Optimizer.d.ts.map +1 -1
- package/src/performance/Optimizer.js +37 -3
- package/src/profiling/MemoryProfiler.d.ts +1 -1
- package/src/profiling/MemoryProfiler.d.ts.map +1 -1
- package/src/profiling/N1Detector.d.ts +1 -1
- package/src/profiling/N1Detector.d.ts.map +1 -1
- package/src/profiling/QueryLogger.d.ts +1 -1
- package/src/profiling/QueryLogger.d.ts.map +1 -1
- package/src/profiling/RequestProfiler.d.ts +3 -3
- package/src/profiling/RequestProfiler.d.ts.map +1 -1
- package/src/routes/api.d.ts +2 -0
- package/src/routes/api.d.ts.map +1 -0
- package/src/routes/api.js +1 -0
- package/src/routes/broadcast.d.ts +2 -0
- package/src/routes/broadcast.d.ts.map +1 -0
- package/src/routes/broadcast.js +1 -0
- package/src/routes/health.d.ts +2 -0
- package/src/routes/health.d.ts.map +1 -0
- package/src/routes/health.js +1 -0
- package/src/routes/metrics.d.ts +2 -0
- package/src/routes/metrics.d.ts.map +1 -0
- package/src/routes/metrics.js +1 -0
- package/src/routes/storage.d.ts +2 -0
- package/src/routes/storage.d.ts.map +1 -0
- package/src/routes/storage.js +1 -0
- package/src/routing/CoreRoutes.d.ts +12 -0
- package/src/routing/CoreRoutes.d.ts.map +1 -0
- package/src/routing/CoreRoutes.js +151 -0
- package/src/routing/RouteRegistry.d.ts +39 -0
- package/src/routing/RouteRegistry.d.ts.map +1 -0
- package/src/routing/RouteRegistry.js +44 -0
- package/src/routing/Router.d.ts +26 -9
- package/src/routing/Router.d.ts.map +1 -1
- package/src/routing/Router.js +79 -35
- package/src/routing/common.d.ts +15 -0
- package/src/routing/common.d.ts.map +1 -0
- package/src/routing/common.js +47 -0
- package/src/routing/doc.d.ts +28 -0
- package/src/routing/doc.d.ts.map +1 -0
- package/src/routing/doc.js +95 -0
- package/src/routing/error.d.ts +21 -0
- package/src/routing/error.d.ts.map +1 -0
- package/src/routing/error.js +126 -0
- package/src/routing/errorPages.d.ts +14 -0
- package/src/routing/errorPages.d.ts.map +1 -0
- package/src/routing/errorPages.js +103 -0
- package/src/routing/publicRoot.d.ts +18 -0
- package/src/routing/publicRoot.d.ts.map +1 -0
- package/src/routing/publicRoot.js +49 -0
- package/src/runtime/PluginAutoImports.d.ts +21 -0
- package/src/runtime/PluginAutoImports.d.ts.map +1 -0
- package/src/runtime/PluginAutoImports.js +59 -0
- package/src/runtime/PluginManager.d.ts +1 -5
- package/src/runtime/PluginManager.d.ts.map +1 -1
- package/src/runtime/PluginManager.js +25 -18
- package/src/runtime/RuntimeAdapter.d.ts.map +1 -1
- package/src/runtime/RuntimeAdapter.js +20 -1
- package/src/runtime/RuntimeDetector.d.ts +1 -1
- package/src/runtime/RuntimeDetector.d.ts.map +1 -1
- package/src/runtime/adapters/CloudflareAdapter.d.ts +1 -1
- package/src/runtime/adapters/CloudflareAdapter.d.ts.map +1 -1
- package/src/runtime/adapters/CloudflareAdapter.js +1 -1
- package/src/runtime/adapters/DenoAdapter.d.ts +1 -1
- package/src/runtime/adapters/DenoAdapter.d.ts.map +1 -1
- package/src/runtime/adapters/DenoAdapter.js +3 -3
- package/src/runtime/adapters/LambdaAdapter.d.ts +1 -1
- package/src/runtime/adapters/LambdaAdapter.d.ts.map +1 -1
- package/src/runtime/adapters/LambdaAdapter.js +1 -1
- package/src/runtime/adapters/NodeServerAdapter.d.ts +1 -1
- package/src/runtime/adapters/NodeServerAdapter.d.ts.map +1 -1
- package/src/runtime/getKernel.d.ts +9 -0
- package/src/runtime/getKernel.d.ts.map +1 -0
- package/src/runtime/getKernel.js +27 -0
- package/src/scripts/TemplateImportsCheck.js +47 -7
- package/src/scripts/TemplateSync.js +92 -20
- package/src/security/Encryptor.d.ts.map +1 -1
- package/src/security/Encryptor.js +64 -7
- package/src/security/JwtManager.d.ts +1 -0
- package/src/security/JwtManager.d.ts.map +1 -1
- package/src/security/JwtManager.js +33 -0
- package/src/security/Sanitizer.d.ts +76 -0
- package/src/security/Sanitizer.d.ts.map +1 -0
- package/src/security/Sanitizer.js +412 -0
- package/src/security/TokenRevocation.d.ts +7 -0
- package/src/security/TokenRevocation.d.ts.map +1 -0
- package/src/security/TokenRevocation.js +57 -0
- package/src/seeders/SeederDiscovery.d.ts +5 -0
- package/src/seeders/SeederDiscovery.d.ts.map +1 -0
- package/src/seeders/SeederDiscovery.js +21 -0
- package/src/seeders/SeederLoader.d.ts +5 -0
- package/src/seeders/SeederLoader.d.ts.map +1 -0
- package/src/seeders/SeederLoader.js +60 -0
- package/src/seeders/types.d.ts +18 -0
- package/src/seeders/types.d.ts.map +1 -0
- package/src/seeders/types.js +1 -0
- package/src/session/SessionManager.js +1 -1
- package/src/start.d.ts +21 -0
- package/src/start.d.ts.map +1 -0
- package/src/start.js +60 -0
- package/src/templates/adapters/MySQLAdapter.ts.tpl +109 -85
- package/src/templates/adapters/PostgreSQLAdapter.ts.tpl +129 -88
- package/src/templates/adapters/SQLServerAdapter.ts.tpl +5 -9
- package/src/templates/adapters/SQLiteAdapter.ts.tpl +78 -11
- package/src/templates/features/Queue.ts.tpl +2 -2
- package/src/templates/project/basic/app/Controllers/AuthController.ts.tpl +217 -0
- package/src/templates/project/basic/app/Controllers/UserController.ts.tpl +3 -16
- package/src/templates/project/basic/app/Middleware/ProfilerMiddleware.ts.tpl +1 -3
- package/src/templates/project/basic/app/Middleware/index.ts.tpl +3 -8
- package/src/templates/project/basic/app/Models/Post.ts.tpl +2 -3
- package/src/templates/project/basic/app/Models/User.ts.tpl +1 -1
- package/src/templates/project/basic/app/Types/controller.ts.tpl +46 -0
- package/src/templates/project/basic/config/FileLogWriter.ts.tpl +5 -236
- package/src/templates/project/basic/config/SecretsManager.ts.tpl +13 -450
- package/src/templates/project/basic/config/StartupConfigValidator.ts.tpl +9 -268
- package/src/templates/project/basic/config/app.ts.tpl +13 -153
- package/src/templates/project/basic/config/broadcast.ts.tpl +15 -129
- package/src/templates/project/basic/config/cache.ts.tpl +15 -92
- package/src/templates/project/basic/config/cloudflare.ts.tpl +4 -39
- package/src/templates/project/basic/config/constants.ts.tpl +9 -65
- package/src/templates/project/basic/config/database.ts.tpl +29 -116
- package/src/templates/project/basic/config/env.ts.tpl +5 -169
- package/src/templates/project/basic/config/features.ts.tpl +6 -54
- package/src/templates/project/basic/config/index.ts.tpl +27 -24
- package/src/templates/project/basic/config/logger.ts.tpl +5 -381
- package/src/templates/project/basic/config/logging/HttpLogger.ts.tpl +1 -1
- package/src/templates/project/basic/config/logging/KvLogger.ts.tpl +2 -2
- package/src/templates/project/basic/config/logging/SlackLogger.ts.tpl +1 -1
- package/src/templates/project/basic/config/mail.ts.tpl +15 -115
- package/src/templates/project/basic/config/microservices.ts.tpl +11 -97
- package/src/templates/project/basic/config/middleware.ts.tpl +27 -18
- package/src/templates/project/basic/config/notification.ts.tpl +14 -127
- package/src/templates/project/basic/config/queue.ts.tpl +16 -79
- package/src/templates/project/basic/config/security.ts.tpl +11 -163
- package/src/templates/project/basic/config/startup.ts.tpl +10 -21
- package/src/templates/project/basic/config/storage.ts.tpl +15 -133
- package/src/templates/project/basic/config/type.ts.tpl +33 -441
- package/src/templates/project/basic/database/factories/UserFactory.ts.tpl +80 -0
- package/src/templates/project/basic/database/migrations/create_tasks_table.ts.tpl +28 -0
- package/src/templates/project/basic/database/migrations/create_users_table.ts.tpl +29 -0
- package/src/templates/project/basic/database/seeders/DatabaseSeeder.ts.tpl +19 -0
- package/src/templates/project/basic/database/seeders/UserSeeder.ts.tpl +18 -0
- package/src/templates/project/basic/database/seeders/index.ts.tpl +2 -0
- package/src/templates/project/basic/package.json.tpl +1 -1
- package/src/templates/project/basic/routes/api.ts.tpl +74 -36
- package/src/templates/project/basic/routes/health.ts.tpl +1 -6
- package/src/templates/project/basic/routes/metrics.ts.tpl +22 -0
- package/src/templates/project/basic/src/index.ts.tpl +7 -80
- package/src/templates/project/basic/tsconfig.json.tpl +12 -13
- package/src/testing/TestEnvironment.d.ts +40 -0
- package/src/testing/TestEnvironment.d.ts.map +1 -0
- package/src/testing/TestEnvironment.js +141 -0
- package/src/testing/TestHttp.d.ts +29 -0
- package/src/testing/TestHttp.d.ts.map +1 -0
- package/src/testing/TestHttp.js +96 -0
- package/src/testing/index.d.ts +5 -0
- package/src/testing/index.d.ts.map +1 -0
- package/src/testing/index.js +2 -0
- package/src/time/DateTime.d.ts +181 -0
- package/src/time/DateTime.d.ts.map +1 -0
- package/src/time/DateTime.js +300 -0
- package/src/time/index.d.ts +7 -0
- package/src/time/index.d.ts.map +1 -0
- package/src/time/index.js +5 -0
- package/src/tools/http/Http.d.ts.map +1 -1
- package/src/tools/http/Http.js +4 -0
- package/src/tools/mail/drivers/Smtp.js +1 -1
- package/src/tools/queue/drivers/InMemory.d.ts +1 -1
- package/src/tools/queue/drivers/InMemory.d.ts.map +1 -1
- package/src/tools/queue/drivers/InMemory.js +1 -1
- package/src/tools/queue/drivers/Redis.d.ts +1 -1
- package/src/tools/queue/drivers/Redis.d.ts.map +1 -1
- package/src/tools/queue/drivers/Redis.js +1 -1
- package/src/validation/ValidationError.d.ts.map +1 -1
- package/src/validation/ValidationError.js +4 -2
- package/src/validation/Validator.d.ts +49 -16
- package/src/validation/Validator.d.ts.map +1 -1
- package/src/validation/Validator.js +307 -5
- package/src/common/uuid.d.ts +0 -3
- package/src/common/uuid.d.ts.map +0 -1
- package/src/common/uuid.js +0 -30
- package/src/templates/project/basic/.env.example.tpl +0 -74
- package/src/templates/project/basic/.env.tpl +0 -166
- package/src/templates/project/basic/database/migrations/index.ts.tpl +0 -2
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { generateUuid } from '../common/
|
|
1
|
+
import { generateUuid } from '../common/utility.js';
|
|
2
2
|
const createFallbackStorage = () => {
|
|
3
3
|
let store;
|
|
4
4
|
return {
|
|
@@ -30,6 +30,52 @@ const getHeaderString = (req, name) => {
|
|
|
30
30
|
const value = req.getHeader(name);
|
|
31
31
|
return typeof value === 'string' ? value : undefined;
|
|
32
32
|
};
|
|
33
|
+
const extractTraceIdFromTraceparent = (traceparent) => {
|
|
34
|
+
if (typeof traceparent !== 'string')
|
|
35
|
+
return undefined;
|
|
36
|
+
const trimmed = traceparent.trim();
|
|
37
|
+
if (trimmed === '')
|
|
38
|
+
return undefined;
|
|
39
|
+
// W3C traceparent: version-traceid-spanid-flags
|
|
40
|
+
// Example: 00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01
|
|
41
|
+
const parts = trimmed.split('-');
|
|
42
|
+
if (parts.length !== 4)
|
|
43
|
+
return undefined;
|
|
44
|
+
const traceId = parts[1] ?? '';
|
|
45
|
+
if (/^[0-9a-f]{32}$/i.test(traceId) === false)
|
|
46
|
+
return undefined;
|
|
47
|
+
// Disallow all-zero traceId
|
|
48
|
+
if (/^0{32}$/i.test(traceId))
|
|
49
|
+
return undefined;
|
|
50
|
+
return traceId.toLowerCase();
|
|
51
|
+
};
|
|
52
|
+
const getTraceIdFromMicroserviceTraceContext = (req) => {
|
|
53
|
+
const anyReq = req;
|
|
54
|
+
const trace = anyReq.context?.['trace'];
|
|
55
|
+
if (typeof trace !== 'object' || trace === null)
|
|
56
|
+
return undefined;
|
|
57
|
+
const traceId = trace.traceId;
|
|
58
|
+
return typeof traceId === 'string' && traceId.trim() !== '' ? traceId : undefined;
|
|
59
|
+
};
|
|
60
|
+
const getOptionalContextString = (req, key) => {
|
|
61
|
+
const anyReq = req;
|
|
62
|
+
const value = anyReq.context?.[key];
|
|
63
|
+
if (typeof value === 'string')
|
|
64
|
+
return value;
|
|
65
|
+
if (typeof value === 'number')
|
|
66
|
+
return String(value);
|
|
67
|
+
return undefined;
|
|
68
|
+
};
|
|
69
|
+
const setContextField = (req, field, value) => {
|
|
70
|
+
req.context ??= {};
|
|
71
|
+
if (typeof value === 'string' && value.trim() !== '') {
|
|
72
|
+
req.context[field] = value;
|
|
73
|
+
}
|
|
74
|
+
const ctx = RequestContext.get(req);
|
|
75
|
+
if (ctx) {
|
|
76
|
+
ctx[field] = value;
|
|
77
|
+
}
|
|
78
|
+
};
|
|
33
79
|
const STORAGE_PROMISE = resolveStorage();
|
|
34
80
|
export const RequestContext = Object.freeze({
|
|
35
81
|
async run(context, callback) {
|
|
@@ -44,14 +90,29 @@ export const RequestContext = Object.freeze({
|
|
|
44
90
|
req.context ??= {};
|
|
45
91
|
const requestIdFromHeader = getHeaderString(req, 'x-request-id');
|
|
46
92
|
const requestId = requestIdFromHeader ?? generateUuid();
|
|
93
|
+
const traceId = extractTraceIdFromTraceparent(getHeaderString(req, 'traceparent')) ??
|
|
94
|
+
getHeaderString(req, 'x-trace-id') ??
|
|
95
|
+
getTraceIdFromMicroserviceTraceContext(req) ??
|
|
96
|
+
getOptionalContextString(req, 'traceId');
|
|
97
|
+
const userId = getOptionalContextString(req, 'userId');
|
|
98
|
+
const tenantId = getOptionalContextString(req, 'tenantId');
|
|
47
99
|
const ctx = {
|
|
48
100
|
requestId,
|
|
101
|
+
traceId,
|
|
102
|
+
userId,
|
|
103
|
+
tenantId,
|
|
49
104
|
startTime: Date.now(),
|
|
50
105
|
method: req.getMethod(),
|
|
51
106
|
path: req.getPath(),
|
|
52
107
|
userAgent: getHeaderString(req, 'user-agent'),
|
|
53
108
|
};
|
|
54
109
|
req.context['requestId'] = requestId;
|
|
110
|
+
if (traceId !== undefined)
|
|
111
|
+
req.context['traceId'] = traceId;
|
|
112
|
+
if (userId !== undefined)
|
|
113
|
+
req.context['userId'] = userId;
|
|
114
|
+
if (tenantId !== undefined)
|
|
115
|
+
req.context['tenantId'] = tenantId;
|
|
55
116
|
req.context['requestContext'] = ctx;
|
|
56
117
|
return ctx;
|
|
57
118
|
},
|
|
@@ -59,6 +120,12 @@ export const RequestContext = Object.freeze({
|
|
|
59
120
|
req.context ??= {};
|
|
60
121
|
req.context['requestContext'] = context;
|
|
61
122
|
req.context['requestId'] = context.requestId;
|
|
123
|
+
if (context.traceId !== undefined)
|
|
124
|
+
req.context['traceId'] = context.traceId;
|
|
125
|
+
if (context.userId !== undefined)
|
|
126
|
+
req.context['userId'] = context.userId;
|
|
127
|
+
if (context.tenantId !== undefined)
|
|
128
|
+
req.context['tenantId'] = context.tenantId;
|
|
62
129
|
},
|
|
63
130
|
get(req) {
|
|
64
131
|
const anyReq = req;
|
|
@@ -73,5 +140,14 @@ export const RequestContext = Object.freeze({
|
|
|
73
140
|
duration,
|
|
74
141
|
};
|
|
75
142
|
},
|
|
143
|
+
setUserId(req, userId) {
|
|
144
|
+
setContextField(req, 'userId', userId);
|
|
145
|
+
},
|
|
146
|
+
setTenantId(req, tenantId) {
|
|
147
|
+
setContextField(req, 'tenantId', tenantId);
|
|
148
|
+
},
|
|
149
|
+
setTraceId(req, traceId) {
|
|
150
|
+
setContextField(req, 'traceId', traceId);
|
|
151
|
+
},
|
|
76
152
|
});
|
|
77
153
|
export default RequestContext;
|
package/src/http/Response.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Response - HTTP Response wrapper
|
|
3
3
|
* Wraps Node.js ServerResponse with additional utilities
|
|
4
4
|
*/
|
|
5
|
-
import * as http from '../node-singletons/http';
|
|
5
|
+
import type * as http from '../node-singletons/http';
|
|
6
6
|
export interface IResponse {
|
|
7
7
|
status(code: number): IResponse;
|
|
8
8
|
setStatus(code: number): IResponse;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Response.d.ts","sourceRoot":"","sources":["../../../src/http/Response.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,IAAI,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"Response.d.ts","sourceRoot":"","sources":["../../../src/http/Response.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,KAAK,IAAI,MAAM,uBAAuB,CAAC;AAEnD,MAAM,WAAW,SAAS;IACxB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,SAAS,IAAI,MAAM,CAAC;IACpB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;IAC7D,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;IACvD,IAAI,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IAC1B,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjD,MAAM,IAAI,IAAI,CAAC,cAAc,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED;;;GAGG;AACH,eAAO,MAAM,QAAQ;IACnB;;OAEG;gBACS,IAAI,CAAC,cAAc,GAAG,SAAS;EA0D3C,CAAC;AAEH,eAAe,QAAQ,CAAC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validation Helper
|
|
3
|
+
* Utilities for working with validated request data
|
|
4
|
+
*/
|
|
5
|
+
import type { IRequest } from './Request';
|
|
6
|
+
/**
|
|
7
|
+
* Extract validated body from request
|
|
8
|
+
* Returns the validated body if present, undefined otherwise
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* const body = getValidatedBody(req);
|
|
13
|
+
* if (!body) {
|
|
14
|
+
* Logger.error('Validation middleware not configured');
|
|
15
|
+
* return res.setStatus(500).json({ error: 'Internal server error' });
|
|
16
|
+
* }
|
|
17
|
+
* const email = getString(body['email']);
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export declare function getValidatedBody<T = Record<string, unknown>>(req: IRequest): T | undefined;
|
|
21
|
+
/**
|
|
22
|
+
* Check if request has a validated body
|
|
23
|
+
* Type guard for validated body existence
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```typescript
|
|
27
|
+
* if (!hasValidatedBody(req)) {
|
|
28
|
+
* Logger.error('Validation middleware not configured');
|
|
29
|
+
* return res.setStatus(500).json({ error: 'Internal server error' });
|
|
30
|
+
* }
|
|
31
|
+
* const body = getValidatedBody(req)!; // Safe to use non-null assertion
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export declare function hasValidatedBody(req: IRequest): boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Extract validated body or throw error
|
|
37
|
+
* Throws if validation middleware is not properly configured
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* ```typescript
|
|
41
|
+
* try {
|
|
42
|
+
* const body = requireValidatedBody(req);
|
|
43
|
+
* const email = getString(body['email']);
|
|
44
|
+
* } catch (error) {
|
|
45
|
+
* Logger.error('Validation middleware error', error);
|
|
46
|
+
* return res.setStatus(500).json({ error: 'Internal server error' });
|
|
47
|
+
* }
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
50
|
+
export declare function requireValidatedBody<T = Record<string, unknown>>(req: IRequest): T;
|
|
51
|
+
/**
|
|
52
|
+
* Extract validated query parameters from request
|
|
53
|
+
* Returns the validated query if present, undefined otherwise
|
|
54
|
+
*/
|
|
55
|
+
export declare function getValidatedQuery<T = Record<string, unknown>>(req: IRequest): T | undefined;
|
|
56
|
+
/**
|
|
57
|
+
* Extract validated route parameters from request
|
|
58
|
+
* Returns the validated params if present, undefined otherwise
|
|
59
|
+
*/
|
|
60
|
+
export declare function getValidatedParams<T = Record<string, unknown>>(req: IRequest): T | undefined;
|
|
61
|
+
/**
|
|
62
|
+
* Extract validated headers from request
|
|
63
|
+
* Returns the validated headers if present, undefined otherwise
|
|
64
|
+
*/
|
|
65
|
+
export declare function getValidatedHeaders<T = Record<string, unknown>>(req: IRequest): T | undefined;
|
|
66
|
+
/**
|
|
67
|
+
* Validation Helper - Sealed namespace
|
|
68
|
+
*/
|
|
69
|
+
export declare const ValidationHelper: Readonly<{
|
|
70
|
+
getValidatedBody: typeof getValidatedBody;
|
|
71
|
+
hasValidatedBody: typeof hasValidatedBody;
|
|
72
|
+
requireValidatedBody: typeof requireValidatedBody;
|
|
73
|
+
getValidatedQuery: typeof getValidatedQuery;
|
|
74
|
+
getValidatedParams: typeof getValidatedParams;
|
|
75
|
+
getValidatedHeaders: typeof getValidatedHeaders;
|
|
76
|
+
}>;
|
|
77
|
+
export default ValidationHelper;
|
|
78
|
+
//# sourceMappingURL=ValidationHelper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ValidationHelper.d.ts","sourceRoot":"","sources":["../../../src/http/ValidationHelper.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAa9C;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,QAAQ,GAAG,CAAC,GAAG,SAAS,CAK1F;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAKvD;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,QAAQ,GAAG,CAAC,CAQlF;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,QAAQ,GAAG,CAAC,GAAG,SAAS,CAK3F;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,QAAQ,GAAG,CAAC,GAAG,SAAS,CAK5F;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,QAAQ,GAAG,CAAC,GAAG,SAAS,CAK7F;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB;;;;;;;EAO3B,CAAC;AAEH,eAAe,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validation Helper
|
|
3
|
+
* Utilities for working with validated request data
|
|
4
|
+
*/
|
|
5
|
+
import { ErrorFactory } from '../exceptions/ZintrustError.js';
|
|
6
|
+
const getValidated = (req) => {
|
|
7
|
+
return req.validated;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Extract validated body from request
|
|
11
|
+
* Returns the validated body if present, undefined otherwise
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```typescript
|
|
15
|
+
* const body = getValidatedBody(req);
|
|
16
|
+
* if (!body) {
|
|
17
|
+
* Logger.error('Validation middleware not configured');
|
|
18
|
+
* return res.setStatus(500).json({ error: 'Internal server error' });
|
|
19
|
+
* }
|
|
20
|
+
* const email = getString(body['email']);
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export function getValidatedBody(req) {
|
|
24
|
+
const validated = getValidated(req);
|
|
25
|
+
if (validated === undefined)
|
|
26
|
+
return undefined;
|
|
27
|
+
if (validated.body === undefined)
|
|
28
|
+
return undefined;
|
|
29
|
+
return validated.body;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Check if request has a validated body
|
|
33
|
+
* Type guard for validated body existence
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```typescript
|
|
37
|
+
* if (!hasValidatedBody(req)) {
|
|
38
|
+
* Logger.error('Validation middleware not configured');
|
|
39
|
+
* return res.setStatus(500).json({ error: 'Internal server error' });
|
|
40
|
+
* }
|
|
41
|
+
* const body = getValidatedBody(req)!; // Safe to use non-null assertion
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
export function hasValidatedBody(req) {
|
|
45
|
+
const validated = getValidated(req);
|
|
46
|
+
if (validated === undefined)
|
|
47
|
+
return false;
|
|
48
|
+
if (validated.body === undefined)
|
|
49
|
+
return false;
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Extract validated body or throw error
|
|
54
|
+
* Throws if validation middleware is not properly configured
|
|
55
|
+
*
|
|
56
|
+
* @example
|
|
57
|
+
* ```typescript
|
|
58
|
+
* try {
|
|
59
|
+
* const body = requireValidatedBody(req);
|
|
60
|
+
* const email = getString(body['email']);
|
|
61
|
+
* } catch (error) {
|
|
62
|
+
* Logger.error('Validation middleware error', error);
|
|
63
|
+
* return res.setStatus(500).json({ error: 'Internal server error' });
|
|
64
|
+
* }
|
|
65
|
+
* ```
|
|
66
|
+
*/
|
|
67
|
+
export function requireValidatedBody(req) {
|
|
68
|
+
const body = getValidatedBody(req);
|
|
69
|
+
if (body === undefined) {
|
|
70
|
+
throw ErrorFactory.createValidationError('Validation middleware did not populate req.validated.body');
|
|
71
|
+
}
|
|
72
|
+
return body;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Extract validated query parameters from request
|
|
76
|
+
* Returns the validated query if present, undefined otherwise
|
|
77
|
+
*/
|
|
78
|
+
export function getValidatedQuery(req) {
|
|
79
|
+
const validated = getValidated(req);
|
|
80
|
+
if (validated === undefined)
|
|
81
|
+
return undefined;
|
|
82
|
+
if (validated.query === undefined)
|
|
83
|
+
return undefined;
|
|
84
|
+
return validated.query;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Extract validated route parameters from request
|
|
88
|
+
* Returns the validated params if present, undefined otherwise
|
|
89
|
+
*/
|
|
90
|
+
export function getValidatedParams(req) {
|
|
91
|
+
const validated = getValidated(req);
|
|
92
|
+
if (validated === undefined)
|
|
93
|
+
return undefined;
|
|
94
|
+
if (validated.params === undefined)
|
|
95
|
+
return undefined;
|
|
96
|
+
return validated.params;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Extract validated headers from request
|
|
100
|
+
* Returns the validated headers if present, undefined otherwise
|
|
101
|
+
*/
|
|
102
|
+
export function getValidatedHeaders(req) {
|
|
103
|
+
const validated = getValidated(req);
|
|
104
|
+
if (validated === undefined)
|
|
105
|
+
return undefined;
|
|
106
|
+
if (validated.headers === undefined)
|
|
107
|
+
return undefined;
|
|
108
|
+
return validated.headers;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Validation Helper - Sealed namespace
|
|
112
|
+
*/
|
|
113
|
+
export const ValidationHelper = Object.freeze({
|
|
114
|
+
getValidatedBody,
|
|
115
|
+
hasValidatedBody,
|
|
116
|
+
requireValidatedBody,
|
|
117
|
+
getValidatedQuery,
|
|
118
|
+
getValidatedParams,
|
|
119
|
+
getValidatedHeaders,
|
|
120
|
+
});
|
|
121
|
+
export default ValidationHelper;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { IRequest } from '../Request';
|
|
2
|
+
type RenderInput = {
|
|
3
|
+
statusCode: number;
|
|
4
|
+
errorName: string;
|
|
5
|
+
errorMessage: string;
|
|
6
|
+
requestPath: string;
|
|
7
|
+
stackPretty?: string;
|
|
8
|
+
stackRaw?: string;
|
|
9
|
+
requestPretty?: string;
|
|
10
|
+
requestRaw?: string;
|
|
11
|
+
};
|
|
12
|
+
export declare const ErrorPageRenderer: Readonly<{
|
|
13
|
+
shouldSendHtml(request: IRequest): boolean;
|
|
14
|
+
renderHtml(publicRoot: string, input: RenderInput): string | undefined;
|
|
15
|
+
}>;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=ErrorPageRenderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ErrorPageRenderer.d.ts","sourceRoot":"","sources":["../../../../src/http/error-pages/ErrorPageRenderer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAM9C,KAAK,WAAW,GAAG;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AA2EF,eAAO,MAAM,iBAAiB;4BACJ,QAAQ,GAAG,OAAO;2BAInB,MAAM,SAAS,WAAW,GAAG,MAAM,GAAG,SAAS;EAUtE,CAAC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { ErrorFactory } from '../../exceptions/ZintrustError.js';
|
|
2
|
+
import * as fs from '../../node-singletons/fs.js';
|
|
3
|
+
import * as path from '../../node-singletons/path.js';
|
|
4
|
+
const escapeHtml = (value) => {
|
|
5
|
+
return value
|
|
6
|
+
.replaceAll('&', '&')
|
|
7
|
+
.replaceAll('<', '<')
|
|
8
|
+
.replaceAll('>', '>')
|
|
9
|
+
.replaceAll('"', '"')
|
|
10
|
+
.replaceAll("'", ''');
|
|
11
|
+
};
|
|
12
|
+
const getAcceptHeader = (request) => {
|
|
13
|
+
const accept = request.getHeader('accept');
|
|
14
|
+
if (typeof accept === 'string')
|
|
15
|
+
return accept;
|
|
16
|
+
if (Array.isArray(accept))
|
|
17
|
+
return accept.join(',');
|
|
18
|
+
return '';
|
|
19
|
+
};
|
|
20
|
+
const prefersHtml = (request) => {
|
|
21
|
+
if (request.getPath().startsWith('/api'))
|
|
22
|
+
return false;
|
|
23
|
+
const accept = getAcceptHeader(request).toLowerCase();
|
|
24
|
+
if (accept === '')
|
|
25
|
+
return false;
|
|
26
|
+
// Browser Accept values almost always include one of these.
|
|
27
|
+
return accept.includes('text/html') || accept.includes('application/xhtml+xml');
|
|
28
|
+
};
|
|
29
|
+
const prefersJson = (request) => {
|
|
30
|
+
if (request.getPath().startsWith('/api'))
|
|
31
|
+
return true;
|
|
32
|
+
const accept = getAcceptHeader(request).toLowerCase();
|
|
33
|
+
// If the client explicitly accepts HTML, treat it as an HTML preference.
|
|
34
|
+
if (accept.includes('text/html') || accept.includes('application/xhtml+xml'))
|
|
35
|
+
return false;
|
|
36
|
+
if (accept.includes('application/json'))
|
|
37
|
+
return true;
|
|
38
|
+
// Default to JSON when the client doesn't express a preference.
|
|
39
|
+
return accept === '' || accept.includes('*/*');
|
|
40
|
+
};
|
|
41
|
+
const interpolate = (template, data) => {
|
|
42
|
+
return template
|
|
43
|
+
.replaceAll('{{statusCode}}', escapeHtml(String(data.statusCode)))
|
|
44
|
+
.replaceAll('{{errorName}}', escapeHtml(data.errorName))
|
|
45
|
+
.replaceAll('{{errorMessage}}', escapeHtml(data.errorMessage))
|
|
46
|
+
.replaceAll('{{requestPath}}', escapeHtml(data.requestPath))
|
|
47
|
+
.replaceAll('{{stackPretty}}', escapeHtml(data.stackPretty ?? ''))
|
|
48
|
+
.replaceAll('{{stackRaw}}', escapeHtml(data.stackRaw ?? ''))
|
|
49
|
+
.replaceAll('{{requestPretty}}', escapeHtml(data.requestPretty ?? ''))
|
|
50
|
+
.replaceAll('{{requestRaw}}', escapeHtml(data.requestRaw ?? ''));
|
|
51
|
+
};
|
|
52
|
+
const resolveTemplatePath = (publicRoot, templateName) => {
|
|
53
|
+
return path.join(publicRoot, 'error-pages', `${templateName}.html`);
|
|
54
|
+
};
|
|
55
|
+
const safeReadTemplate = (filePath) => {
|
|
56
|
+
try {
|
|
57
|
+
if (!fs.existsSync(filePath))
|
|
58
|
+
return undefined;
|
|
59
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
60
|
+
return typeof content === 'string' && content.length > 0 ? content : undefined;
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
ErrorFactory.createTryCatchError(`Failed to read error page template: ${filePath}`, error);
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
const toTemplateName = (statusCode) => {
|
|
68
|
+
if (statusCode === 404)
|
|
69
|
+
return '404';
|
|
70
|
+
if (statusCode === 500)
|
|
71
|
+
return '500';
|
|
72
|
+
return undefined;
|
|
73
|
+
};
|
|
74
|
+
export const ErrorPageRenderer = Object.freeze({
|
|
75
|
+
shouldSendHtml(request) {
|
|
76
|
+
return prefersHtml(request) && !prefersJson(request);
|
|
77
|
+
},
|
|
78
|
+
renderHtml(publicRoot, input) {
|
|
79
|
+
const templateName = toTemplateName(input.statusCode);
|
|
80
|
+
if (templateName === undefined)
|
|
81
|
+
return undefined;
|
|
82
|
+
const templatePath = resolveTemplatePath(publicRoot, templateName);
|
|
83
|
+
const template = safeReadTemplate(templatePath);
|
|
84
|
+
if (template === undefined)
|
|
85
|
+
return undefined;
|
|
86
|
+
return interpolate(template, input);
|
|
87
|
+
},
|
|
88
|
+
});
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Content Type Detection & Body Parsing Middleware
|
|
3
|
+
* Detects content-type and parses non-JSON request bodies
|
|
4
|
+
*/
|
|
5
|
+
import type { Middleware } from '../../middleware/MiddlewareStack';
|
|
6
|
+
/**
|
|
7
|
+
* Body parsing middleware
|
|
8
|
+
* Automatically detects content-type and parses non-JSON bodies
|
|
9
|
+
*/
|
|
10
|
+
export declare const bodyParsingMiddleware: Middleware;
|
|
11
|
+
export default bodyParsingMiddleware;
|
|
12
|
+
//# sourceMappingURL=BodyParsingMiddleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BodyParsingMiddleware.d.ts","sourceRoot":"","sources":["../../../../src/http/middleware/BodyParsingMiddleware.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAqO9D;;;GAGG;AACH,eAAO,MAAM,qBAAqB,EAAE,UAgDnC,CAAC;AAEF,eAAe,qBAAqB,CAAC"}
|