@zintrust/core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/z.d.ts +7 -0
- package/bin/z.d.ts.map +1 -0
- package/bin/z.js +6 -0
- package/bin/zin.d.ts +7 -0
- package/bin/zin.d.ts.map +1 -0
- package/bin/zin.js +6 -0
- package/bin/zintrust-microservices.d.ts +7 -0
- package/bin/zintrust-microservices.d.ts.map +1 -0
- package/bin/zintrust-microservices.js +165 -0
- package/bin/zintrust.d.ts +9 -0
- package/bin/zintrust.d.ts.map +1 -0
- package/bin/zintrust.js +51 -0
- package/bin/zt.d.ts +7 -0
- package/bin/zt.d.ts.map +1 -0
- package/bin/zt.js +6 -0
- package/package.json +80 -0
- package/src/boot/Application.d.ts +31 -0
- package/src/boot/Application.d.ts.map +1 -0
- package/src/boot/Application.js +159 -0
- package/src/boot/Server.d.ts +23 -0
- package/src/boot/Server.d.ts.map +1 -0
- package/src/boot/Server.js +236 -0
- package/src/boot/bootstrap.d.ts +7 -0
- package/src/boot/bootstrap.d.ts.map +1 -0
- package/src/boot/bootstrap.js +64 -0
- package/src/builder/BundleOptimizer.d.ts +42 -0
- package/src/builder/BundleOptimizer.d.ts.map +1 -0
- package/src/builder/BundleOptimizer.js +356 -0
- package/src/cache/Cache.d.ts +26 -0
- package/src/cache/Cache.d.ts.map +1 -0
- package/src/cache/Cache.js +89 -0
- package/src/cache/CacheDriver.d.ts +28 -0
- package/src/cache/CacheDriver.d.ts.map +1 -0
- package/src/cache/CacheDriver.js +6 -0
- package/src/cache/drivers/KVDriver.d.ts +12 -0
- package/src/cache/drivers/KVDriver.d.ts.map +1 -0
- package/src/cache/drivers/KVDriver.js +54 -0
- package/src/cache/drivers/MemoryDriver.d.ts +12 -0
- package/src/cache/drivers/MemoryDriver.d.ts.map +1 -0
- package/src/cache/drivers/MemoryDriver.js +50 -0
- package/src/cache/drivers/MongoDriver.d.ts +17 -0
- package/src/cache/drivers/MongoDriver.d.ts.map +1 -0
- package/src/cache/drivers/MongoDriver.js +80 -0
- package/src/cache/drivers/RedisDriver.d.ts +12 -0
- package/src/cache/drivers/RedisDriver.d.ts.map +1 -0
- package/src/cache/drivers/RedisDriver.js +79 -0
- package/src/cli/BaseCommand.d.ts +39 -0
- package/src/cli/BaseCommand.d.ts.map +1 -0
- package/src/cli/BaseCommand.js +58 -0
- package/src/cli/CLI.d.ts +21 -0
- package/src/cli/CLI.d.ts.map +1 -0
- package/src/cli/CLI.js +203 -0
- package/src/cli/ErrorHandler.d.ts +23 -0
- package/src/cli/ErrorHandler.d.ts.map +1 -0
- package/src/cli/ErrorHandler.js +95 -0
- package/src/cli/PromptHelper.d.ts +47 -0
- package/src/cli/PromptHelper.d.ts.map +1 -0
- package/src/cli/PromptHelper.js +155 -0
- package/src/cli/commands/AddCommand.d.ts +15 -0
- package/src/cli/commands/AddCommand.d.ts.map +1 -0
- package/src/cli/commands/AddCommand.js +817 -0
- package/src/cli/commands/ConfigCommand.d.ts +15 -0
- package/src/cli/commands/ConfigCommand.d.ts.map +1 -0
- package/src/cli/commands/ConfigCommand.js +273 -0
- package/src/cli/commands/D1MigrateCommand.d.ts +15 -0
- package/src/cli/commands/D1MigrateCommand.d.ts.map +1 -0
- package/src/cli/commands/D1MigrateCommand.js +73 -0
- package/src/cli/commands/DebugCommand.d.ts +15 -0
- package/src/cli/commands/DebugCommand.d.ts.map +1 -0
- package/src/cli/commands/DebugCommand.js +52 -0
- package/src/cli/commands/FixCommand.d.ts +15 -0
- package/src/cli/commands/FixCommand.d.ts.map +1 -0
- package/src/cli/commands/FixCommand.js +80 -0
- package/src/cli/commands/KeyGenerateCommand.d.ts +9 -0
- package/src/cli/commands/KeyGenerateCommand.d.ts.map +1 -0
- package/src/cli/commands/KeyGenerateCommand.js +76 -0
- package/src/cli/commands/LogsCommand.d.ts +19 -0
- package/src/cli/commands/LogsCommand.d.ts.map +1 -0
- package/src/cli/commands/LogsCommand.js +185 -0
- package/src/cli/commands/MigrateCommand.d.ts +15 -0
- package/src/cli/commands/MigrateCommand.d.ts.map +1 -0
- package/src/cli/commands/MigrateCommand.js +56 -0
- package/src/cli/commands/NewCommand.d.ts +32 -0
- package/src/cli/commands/NewCommand.d.ts.map +1 -0
- package/src/cli/commands/NewCommand.js +280 -0
- package/src/cli/commands/PluginCommand.d.ts +9 -0
- package/src/cli/commands/PluginCommand.d.ts.map +1 -0
- package/src/cli/commands/PluginCommand.js +94 -0
- package/src/cli/commands/PrepareCommand.d.ts +8 -0
- package/src/cli/commands/PrepareCommand.d.ts.map +1 -0
- package/src/cli/commands/PrepareCommand.js +51 -0
- package/src/cli/commands/QACommand.d.ts +33 -0
- package/src/cli/commands/QACommand.d.ts.map +1 -0
- package/src/cli/commands/QACommand.js +490 -0
- package/src/cli/commands/SimulateCommand.d.ts +12 -0
- package/src/cli/commands/SimulateCommand.d.ts.map +1 -0
- package/src/cli/commands/SimulateCommand.js +79 -0
- package/src/cli/commands/StartCommand.d.ts +5 -0
- package/src/cli/commands/StartCommand.d.ts.map +1 -0
- package/src/cli/commands/StartCommand.js +227 -0
- package/src/cli/commands/index.d.ts +11 -0
- package/src/cli/commands/index.d.ts.map +1 -0
- package/src/cli/commands/index.js +10 -0
- package/src/cli/config/ConfigManager.d.ts +42 -0
- package/src/cli/config/ConfigManager.d.ts.map +1 -0
- package/src/cli/config/ConfigManager.js +175 -0
- package/src/cli/config/ConfigSchema.d.ts +195 -0
- package/src/cli/config/ConfigSchema.d.ts.map +1 -0
- package/src/cli/config/ConfigSchema.js +171 -0
- package/src/cli/config/ConfigValidator.d.ts +41 -0
- package/src/cli/config/ConfigValidator.d.ts.map +1 -0
- package/src/cli/config/ConfigValidator.js +200 -0
- package/src/cli/config/index.d.ts +8 -0
- package/src/cli/config/index.d.ts.map +1 -0
- package/src/cli/config/index.js +7 -0
- package/src/cli/debug/Dashboard.d.ts +34 -0
- package/src/cli/debug/Dashboard.d.ts.map +1 -0
- package/src/cli/debug/Dashboard.js +152 -0
- package/src/cli/index.d.ts +14 -0
- package/src/cli/index.d.ts.map +1 -0
- package/src/cli/index.js +14 -0
- package/src/cli/logger/Logger.d.ts +43 -0
- package/src/cli/logger/Logger.d.ts.map +1 -0
- package/src/cli/logger/Logger.js +137 -0
- package/src/cli/scaffolding/ControllerGenerator.d.ts +44 -0
- package/src/cli/scaffolding/ControllerGenerator.d.ts.map +1 -0
- package/src/cli/scaffolding/ControllerGenerator.js +540 -0
- package/src/cli/scaffolding/FactoryGenerator.d.ts +47 -0
- package/src/cli/scaffolding/FactoryGenerator.d.ts.map +1 -0
- package/src/cli/scaffolding/FactoryGenerator.js +356 -0
- package/src/cli/scaffolding/FeatureScaffolder.d.ts +40 -0
- package/src/cli/scaffolding/FeatureScaffolder.d.ts.map +1 -0
- package/src/cli/scaffolding/FeatureScaffolder.js +747 -0
- package/src/cli/scaffolding/FileGenerator.d.ts +31 -0
- package/src/cli/scaffolding/FileGenerator.d.ts.map +1 -0
- package/src/cli/scaffolding/FileGenerator.js +222 -0
- package/src/cli/scaffolding/MigrationGenerator.d.ts +35 -0
- package/src/cli/scaffolding/MigrationGenerator.d.ts.map +1 -0
- package/src/cli/scaffolding/MigrationGenerator.js +257 -0
- package/src/cli/scaffolding/ModelGenerator.d.ts +81 -0
- package/src/cli/scaffolding/ModelGenerator.d.ts.map +1 -0
- package/src/cli/scaffolding/ModelGenerator.js +249 -0
- package/src/cli/scaffolding/ProjectScaffolder.d.ts +66 -0
- package/src/cli/scaffolding/ProjectScaffolder.d.ts.map +1 -0
- package/src/cli/scaffolding/ProjectScaffolder.js +439 -0
- package/src/cli/scaffolding/RequestFactoryGenerator.d.ts +50 -0
- package/src/cli/scaffolding/RequestFactoryGenerator.d.ts.map +1 -0
- package/src/cli/scaffolding/RequestFactoryGenerator.js +465 -0
- package/src/cli/scaffolding/ResponseFactoryGenerator.d.ts +43 -0
- package/src/cli/scaffolding/ResponseFactoryGenerator.d.ts.map +1 -0
- package/src/cli/scaffolding/ResponseFactoryGenerator.js +321 -0
- package/src/cli/scaffolding/RouteGenerator.d.ts +66 -0
- package/src/cli/scaffolding/RouteGenerator.d.ts.map +1 -0
- package/src/cli/scaffolding/RouteGenerator.js +306 -0
- package/src/cli/scaffolding/SeederGenerator.d.ts +47 -0
- package/src/cli/scaffolding/SeederGenerator.d.ts.map +1 -0
- package/src/cli/scaffolding/SeederGenerator.js +286 -0
- package/src/cli/scaffolding/ServiceIntegrationTestGenerator.d.ts +40 -0
- package/src/cli/scaffolding/ServiceIntegrationTestGenerator.d.ts.map +1 -0
- package/src/cli/scaffolding/ServiceIntegrationTestGenerator.js +267 -0
- package/src/cli/scaffolding/ServiceRequestFactoryGenerator.d.ts +45 -0
- package/src/cli/scaffolding/ServiceRequestFactoryGenerator.d.ts.map +1 -0
- package/src/cli/scaffolding/ServiceRequestFactoryGenerator.js +397 -0
- package/src/cli/scaffolding/ServiceScaffolder.d.ts +45 -0
- package/src/cli/scaffolding/ServiceScaffolder.d.ts.map +1 -0
- package/src/cli/scaffolding/ServiceScaffolder.js +367 -0
- package/src/cli/scaffolding/TemplateEngine.d.ts +35 -0
- package/src/cli/scaffolding/TemplateEngine.d.ts.map +1 -0
- package/src/cli/scaffolding/TemplateEngine.js +379 -0
- package/src/cli/scaffolding/WorkflowGenerator.d.ts +31 -0
- package/src/cli/scaffolding/WorkflowGenerator.d.ts.map +1 -0
- package/src/cli/scaffolding/WorkflowGenerator.js +193 -0
- package/src/cli/scaffolding/index.d.ts +34 -0
- package/src/cli/scaffolding/index.d.ts.map +1 -0
- package/src/cli/scaffolding/index.js +18 -0
- package/src/cli/utils/DistPackager.d.ts +8 -0
- package/src/cli/utils/DistPackager.d.ts.map +1 -0
- package/src/cli/utils/DistPackager.js +94 -0
- package/src/cli/utils/EnvFileLoader.d.ts +21 -0
- package/src/cli/utils/EnvFileLoader.d.ts.map +1 -0
- package/src/cli/utils/EnvFileLoader.js +166 -0
- package/src/cli/utils/spawn.d.ts +11 -0
- package/src/cli/utils/spawn.d.ts.map +1 -0
- package/src/cli/utils/spawn.js +81 -0
- package/src/common/index.d.ts +87 -0
- package/src/common/index.d.ts.map +1 -0
- package/src/common/index.js +207 -0
- package/src/config/SecretsManager.d.ts +122 -0
- package/src/config/SecretsManager.d.ts.map +1 -0
- package/src/config/SecretsManager.js +328 -0
- package/src/config/app.d.ts +56 -0
- package/src/config/app.d.ts.map +1 -0
- package/src/config/app.js +77 -0
- package/src/config/cache.d.ts +76 -0
- package/src/config/cache.d.ts.map +1 -0
- package/src/config/cache.js +62 -0
- package/src/config/constants.d.ts +108 -0
- package/src/config/constants.d.ts.map +1 -0
- package/src/config/constants.js +64 -0
- package/src/config/database.d.ts +122 -0
- package/src/config/database.d.ts.map +1 -0
- package/src/config/database.js +89 -0
- package/src/config/env.d.ts +56 -0
- package/src/config/env.d.ts.map +1 -0
- package/src/config/env.js +133 -0
- package/src/config/features.d.ts +27 -0
- package/src/config/features.d.ts.map +1 -0
- package/src/config/features.js +49 -0
- package/src/config/index.d.ts +554 -0
- package/src/config/index.d.ts.map +1 -0
- package/src/config/index.js +31 -0
- package/src/config/logger.d.ts +17 -0
- package/src/config/logger.d.ts.map +1 -0
- package/src/config/logger.js +77 -0
- package/src/config/microservices.d.ts +88 -0
- package/src/config/microservices.d.ts.map +1 -0
- package/src/config/microservices.js +90 -0
- package/src/config/queue.d.ts +107 -0
- package/src/config/queue.d.ts.map +1 -0
- package/src/config/queue.js +74 -0
- package/src/config/security.d.ts +108 -0
- package/src/config/security.d.ts.map +1 -0
- package/src/config/security.js +134 -0
- package/src/config/storage.d.ts +105 -0
- package/src/config/storage.d.ts.map +1 -0
- package/src/config/storage.js +79 -0
- package/src/container/ServiceContainer.d.ts +25 -0
- package/src/container/ServiceContainer.d.ts.map +1 -0
- package/src/container/ServiceContainer.js +75 -0
- package/src/database/migrations/index.d.ts +2 -0
- package/src/database/migrations/index.d.ts.map +1 -0
- package/src/database/migrations/index.js +1 -0
- package/src/exceptions/ZintrustError.d.ts +88 -0
- package/src/exceptions/ZintrustError.d.ts.map +1 -0
- package/src/exceptions/ZintrustError.js +110 -0
- package/src/features/Auth.d.ts +20 -0
- package/src/features/Auth.d.ts.map +1 -0
- package/src/features/Auth.js +32 -0
- package/src/features/Queue.d.ts +21 -0
- package/src/features/Queue.d.ts.map +1 -0
- package/src/features/Queue.js +59 -0
- package/src/functions/cloudflare.d.ts +5 -0
- package/src/functions/cloudflare.d.ts.map +1 -0
- package/src/functions/cloudflare.js +34 -0
- package/src/functions/deno.d.ts +3 -0
- package/src/functions/deno.d.ts.map +1 -0
- package/src/functions/deno.js +31 -0
- package/src/functions/lambda.d.ts +2 -0
- package/src/functions/lambda.d.ts.map +1 -0
- package/src/functions/lambda.js +32 -0
- package/src/http/Controller.d.ts +20 -0
- package/src/http/Controller.d.ts.map +1 -0
- package/src/http/Controller.js +46 -0
- package/src/http/Kernel.d.ts +24 -0
- package/src/http/Kernel.d.ts.map +1 -0
- package/src/http/Kernel.js +72 -0
- package/src/http/Request.d.ts +36 -0
- package/src/http/Request.d.ts.map +1 -0
- package/src/http/Request.js +142 -0
- package/src/http/Response.d.ts +32 -0
- package/src/http/Response.d.ts.map +1 -0
- package/src/http/Response.js +70 -0
- package/src/index.d.ts +43 -0
- package/src/index.d.ts.map +1 -0
- package/src/index.js +37 -0
- package/src/microservices/MicroserviceBootstrap.d.ts +75 -0
- package/src/microservices/MicroserviceBootstrap.d.ts.map +1 -0
- package/src/microservices/MicroserviceBootstrap.js +285 -0
- package/src/microservices/MicroserviceGenerator.d.ts +27 -0
- package/src/microservices/MicroserviceGenerator.d.ts.map +1 -0
- package/src/microservices/MicroserviceGenerator.js +436 -0
- package/src/microservices/MicroserviceManager.d.ts +68 -0
- package/src/microservices/MicroserviceManager.d.ts.map +1 -0
- package/src/microservices/MicroserviceManager.js +266 -0
- package/src/microservices/PostgresAdapter.d.ts +90 -0
- package/src/microservices/PostgresAdapter.d.ts.map +1 -0
- package/src/microservices/PostgresAdapter.js +286 -0
- package/src/microservices/RequestTracingMiddleware.d.ts +41 -0
- package/src/microservices/RequestTracingMiddleware.d.ts.map +1 -0
- package/src/microservices/RequestTracingMiddleware.js +122 -0
- package/src/microservices/ServiceAuthMiddleware.d.ts +58 -0
- package/src/microservices/ServiceAuthMiddleware.d.ts.map +1 -0
- package/src/microservices/ServiceAuthMiddleware.js +240 -0
- package/src/microservices/ServiceBundler.d.ts +45 -0
- package/src/microservices/ServiceBundler.d.ts.map +1 -0
- package/src/microservices/ServiceBundler.js +297 -0
- package/src/microservices/ServiceHealthMonitor.d.ts +96 -0
- package/src/microservices/ServiceHealthMonitor.d.ts.map +1 -0
- package/src/microservices/ServiceHealthMonitor.js +379 -0
- package/src/middleware/CsrfMiddleware.d.ts +19 -0
- package/src/middleware/CsrfMiddleware.d.ts.map +1 -0
- package/src/middleware/CsrfMiddleware.js +121 -0
- package/src/middleware/MiddlewareStack.d.ts +27 -0
- package/src/middleware/MiddlewareStack.d.ts.map +1 -0
- package/src/middleware/MiddlewareStack.js +43 -0
- package/src/middleware/RateLimiter.d.ts +22 -0
- package/src/middleware/RateLimiter.d.ts.map +1 -0
- package/src/middleware/RateLimiter.js +72 -0
- package/src/middleware/SecurityMiddleware.d.ts +33 -0
- package/src/middleware/SecurityMiddleware.d.ts.map +1 -0
- package/src/middleware/SecurityMiddleware.js +106 -0
- package/src/middleware/index.d.ts +9 -0
- package/src/middleware/index.d.ts.map +1 -0
- package/src/middleware/index.js +8 -0
- package/src/node-singletons/child-process.d.ts +7 -0
- package/src/node-singletons/child-process.d.ts.map +1 -0
- package/src/node-singletons/child-process.js +6 -0
- package/src/node-singletons/crypto.d.ts +7 -0
- package/src/node-singletons/crypto.d.ts.map +1 -0
- package/src/node-singletons/crypto.js +6 -0
- package/src/node-singletons/events.d.ts +7 -0
- package/src/node-singletons/events.d.ts.map +1 -0
- package/src/node-singletons/events.js +6 -0
- package/src/node-singletons/fs.d.ts +12 -0
- package/src/node-singletons/fs.d.ts.map +1 -0
- package/src/node-singletons/fs.js +14 -0
- package/src/node-singletons/http.d.ts +8 -0
- package/src/node-singletons/http.d.ts.map +1 -0
- package/src/node-singletons/http.js +6 -0
- package/src/node-singletons/index.d.ts +30 -0
- package/src/node-singletons/index.d.ts.map +1 -0
- package/src/node-singletons/index.js +31 -0
- package/src/node-singletons/os.d.ts +9 -0
- package/src/node-singletons/os.d.ts.map +1 -0
- package/src/node-singletons/os.js +9 -0
- package/src/node-singletons/path.d.ts +7 -0
- package/src/node-singletons/path.d.ts.map +1 -0
- package/src/node-singletons/path.js +6 -0
- package/src/node-singletons/perf-hooks.d.ts +7 -0
- package/src/node-singletons/perf-hooks.d.ts.map +1 -0
- package/src/node-singletons/perf-hooks.js +6 -0
- package/src/node-singletons/readline.d.ts +10 -0
- package/src/node-singletons/readline.d.ts.map +1 -0
- package/src/node-singletons/readline.js +9 -0
- package/src/node-singletons/url.d.ts +7 -0
- package/src/node-singletons/url.d.ts.map +1 -0
- package/src/node-singletons/url.js +6 -0
- package/src/orm/ConnectionManager.d.ts +118 -0
- package/src/orm/ConnectionManager.d.ts.map +1 -0
- package/src/orm/ConnectionManager.js +401 -0
- package/src/orm/Database.d.ts +31 -0
- package/src/orm/Database.d.ts.map +1 -0
- package/src/orm/Database.js +163 -0
- package/src/orm/DatabaseAdapter.d.ts +96 -0
- package/src/orm/DatabaseAdapter.d.ts.map +1 -0
- package/src/orm/DatabaseAdapter.js +40 -0
- package/src/orm/Model.d.ts +91 -0
- package/src/orm/Model.d.ts.map +1 -0
- package/src/orm/Model.js +206 -0
- package/src/orm/QueryBuilder.d.ts +52 -0
- package/src/orm/QueryBuilder.d.ts.map +1 -0
- package/src/orm/QueryBuilder.js +134 -0
- package/src/orm/Relationships.d.ts +53 -0
- package/src/orm/Relationships.d.ts.map +1 -0
- package/src/orm/Relationships.js +98 -0
- package/src/orm/Schema.d.ts +123 -0
- package/src/orm/Schema.d.ts.map +1 -0
- package/src/orm/Schema.js +169 -0
- package/src/orm/adapters/D1Adapter.d.ts +15 -0
- package/src/orm/adapters/D1Adapter.d.ts.map +1 -0
- package/src/orm/adapters/D1Adapter.js +125 -0
- package/src/orm/adapters/MySQLAdapter.d.ts +16 -0
- package/src/orm/adapters/MySQLAdapter.d.ts.map +1 -0
- package/src/orm/adapters/MySQLAdapter.js +87 -0
- package/src/orm/adapters/PostgreSQLAdapter.d.ts +16 -0
- package/src/orm/adapters/PostgreSQLAdapter.d.ts.map +1 -0
- package/src/orm/adapters/PostgreSQLAdapter.js +87 -0
- package/src/orm/adapters/SQLServerAdapter.d.ts +16 -0
- package/src/orm/adapters/SQLServerAdapter.d.ts.map +1 -0
- package/src/orm/adapters/SQLServerAdapter.js +81 -0
- package/src/orm/adapters/SQLiteAdapter.d.ts +11 -0
- package/src/orm/adapters/SQLiteAdapter.d.ts.map +1 -0
- package/src/orm/adapters/SQLiteAdapter.js +131 -0
- package/src/performance/Benchmark.d.ts +87 -0
- package/src/performance/Benchmark.d.ts.map +1 -0
- package/src/performance/Benchmark.js +304 -0
- package/src/performance/CodeGenerationBenchmark.d.ts +23 -0
- package/src/performance/CodeGenerationBenchmark.d.ts.map +1 -0
- package/src/performance/CodeGenerationBenchmark.js +249 -0
- package/src/performance/Optimizer.d.ts +99 -0
- package/src/performance/Optimizer.d.ts.map +1 -0
- package/src/performance/Optimizer.js +396 -0
- package/src/performance/establish-baseline.d.ts +9 -0
- package/src/performance/establish-baseline.d.ts.map +1 -0
- package/src/performance/establish-baseline.js +55 -0
- package/src/profiling/MemoryProfiler.d.ts +32 -0
- package/src/profiling/MemoryProfiler.d.ts.map +1 -0
- package/src/profiling/MemoryProfiler.js +84 -0
- package/src/profiling/N1Detector.d.ts +16 -0
- package/src/profiling/N1Detector.d.ts.map +1 -0
- package/src/profiling/N1Detector.js +120 -0
- package/src/profiling/QueryLogger.d.ts +107 -0
- package/src/profiling/QueryLogger.d.ts.map +1 -0
- package/src/profiling/QueryLogger.js +148 -0
- package/src/profiling/RequestProfiler.d.ts +30 -0
- package/src/profiling/RequestProfiler.d.ts.map +1 -0
- package/src/profiling/RequestProfiler.js +94 -0
- package/src/profiling/types.d.ts +77 -0
- package/src/profiling/types.d.ts.map +1 -0
- package/src/profiling/types.js +5 -0
- package/src/routing/Router.d.ts +52 -0
- package/src/routing/Router.d.ts.map +1 -0
- package/src/routing/Router.js +191 -0
- package/src/runtime/PluginManager.d.ts +30 -0
- package/src/runtime/PluginManager.d.ts.map +1 -0
- package/src/runtime/PluginManager.js +197 -0
- package/src/runtime/PluginRegistry.d.ts +22 -0
- package/src/runtime/PluginRegistry.d.ts.map +1 -0
- package/src/runtime/PluginRegistry.js +93 -0
- package/src/runtime/RuntimeAdapter.d.ts +126 -0
- package/src/runtime/RuntimeAdapter.d.ts.map +1 -0
- package/src/runtime/RuntimeAdapter.js +127 -0
- package/src/runtime/RuntimeDetector.d.ts +15 -0
- package/src/runtime/RuntimeDetector.d.ts.map +1 -0
- package/src/runtime/RuntimeDetector.js +219 -0
- package/src/runtime/adapters/CloudflareAdapter.d.ts +43 -0
- package/src/runtime/adapters/CloudflareAdapter.d.ts.map +1 -0
- package/src/runtime/adapters/CloudflareAdapter.js +175 -0
- package/src/runtime/adapters/DenoAdapter.d.ts +30 -0
- package/src/runtime/adapters/DenoAdapter.d.ts.map +1 -0
- package/src/runtime/adapters/DenoAdapter.js +191 -0
- package/src/runtime/adapters/FargateAdapter.d.ts +40 -0
- package/src/runtime/adapters/FargateAdapter.d.ts.map +1 -0
- package/src/runtime/adapters/FargateAdapter.js +156 -0
- package/src/runtime/adapters/LambdaAdapter.d.ts +13 -0
- package/src/runtime/adapters/LambdaAdapter.d.ts.map +1 -0
- package/src/runtime/adapters/LambdaAdapter.js +302 -0
- package/src/runtime/adapters/NodeServerAdapter.d.ts +16 -0
- package/src/runtime/adapters/NodeServerAdapter.d.ts.map +1 -0
- package/src/runtime/adapters/NodeServerAdapter.js +199 -0
- package/src/scripts/TemplateSync.d.ts +7 -0
- package/src/scripts/TemplateSync.d.ts.map +1 -0
- package/src/scripts/TemplateSync.js +234 -0
- package/src/security/CsrfTokenManager.d.ts +28 -0
- package/src/security/CsrfTokenManager.d.ts.map +1 -0
- package/src/security/CsrfTokenManager.js +78 -0
- package/src/security/Encryptor.d.ts +15 -0
- package/src/security/Encryptor.d.ts.map +1 -0
- package/src/security/Encryptor.js +142 -0
- package/src/security/JwtManager.d.ts +41 -0
- package/src/security/JwtManager.d.ts.map +1 -0
- package/src/security/JwtManager.js +229 -0
- package/src/security/UrlValidator.d.ts +21 -0
- package/src/security/UrlValidator.d.ts.map +1 -0
- package/src/security/UrlValidator.js +42 -0
- package/src/security/XssProtection.d.ts +24 -0
- package/src/security/XssProtection.d.ts.map +1 -0
- package/src/security/XssProtection.js +133 -0
- package/src/templates/TemplateRegistry.d.ts +40 -0
- package/src/templates/TemplateRegistry.d.ts.map +1 -0
- package/src/templates/TemplateRegistry.js +78 -0
- package/src/templates/TemplateRegistry.ts +91 -0
- package/src/templates/adapters/MySQLAdapter.ts.tpl +97 -0
- package/src/templates/adapters/PostgreSQLAdapter.ts.tpl +101 -0
- package/src/templates/adapters/SQLServerAdapter.ts.tpl +95 -0
- package/src/templates/adapters/SQLiteAdapter.ts.tpl +189 -0
- package/src/templates/features/Auth.ts.tpl +40 -0
- package/src/templates/features/Queue.ts.tpl +75 -0
- package/src/templates/project/basic/.env.example.tpl +26 -0
- package/src/templates/project/basic/.env.tpl +164 -0
- package/src/templates/project/basic/README.md.tpl +13 -0
- package/src/templates/project/basic/app/Controllers/UserController.ts.tpl +155 -0
- package/src/templates/project/basic/app/Middleware/ProfilerMiddleware.ts.tpl +55 -0
- package/src/templates/project/basic/app/Middleware/index.ts.tpl +304 -0
- package/src/templates/project/basic/app/Models/Post.ts.tpl +30 -0
- package/src/templates/project/basic/app/Models/User.ts.tpl +53 -0
- package/src/templates/project/basic/config/SecretsManager.ts.tpl +453 -0
- package/src/templates/project/basic/config/app.ts.tpl +97 -0
- package/src/templates/project/basic/config/cache.ts.tpl +117 -0
- package/src/templates/project/basic/config/constants.ts.tpl +70 -0
- package/src/templates/project/basic/config/database.ts.tpl +152 -0
- package/src/templates/project/basic/config/env.ts.tpl +148 -0
- package/src/templates/project/basic/config/features.ts.tpl +57 -0
- package/src/templates/project/basic/config/index.ts.tpl +36 -0
- package/src/templates/project/basic/config/logger.ts.tpl +95 -0
- package/src/templates/project/basic/config/microservices.ts.tpl +104 -0
- package/src/templates/project/basic/config/queue.ts.tpl +134 -0
- package/src/templates/project/basic/config/security.ts.tpl +149 -0
- package/src/templates/project/basic/config/storage.ts.tpl +136 -0
- package/src/templates/project/basic/database/factories/.gitkeep.tpl +0 -0
- package/src/templates/project/basic/database/migrations/.gitkeep.tpl +0 -0
- package/src/templates/project/basic/database/migrations/index.ts.tpl +2 -0
- package/src/templates/project/basic/database/seeders/.gitkeep.tpl +0 -0
- package/src/templates/project/basic/package.json.tpl +22 -0
- package/src/templates/project/basic/routes/api.ts.tpl +135 -0
- package/src/templates/project/basic/src/index.ts.tpl +49 -0
- package/src/templates/project/basic/template.json +17 -0
- package/src/templates/project/basic/tsconfig.json.tpl +20 -0
- package/src/validation/ValidationError.d.ts +42 -0
- package/src/validation/ValidationError.d.ts.map +1 -0
- package/src/validation/ValidationError.js +53 -0
- package/src/validation/Validator.d.ts +60 -0
- package/src/validation/Validator.d.ts.map +1 -0
- package/src/validation/Validator.js +190 -0
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Template Sync Script
|
|
3
|
+
* Synchronizes base framework files to .tpl templates when checksums change
|
|
4
|
+
* Runs during npm run build
|
|
5
|
+
*/
|
|
6
|
+
import { TemplateRegistry } from '../templates/TemplateRegistry.js';
|
|
7
|
+
import { Logger } from '../config/logger';
|
|
8
|
+
import { ErrorFactory } from '../exceptions/ZintrustError';
|
|
9
|
+
import * as crypto from '../node-singletons/crypto';
|
|
10
|
+
import fs from '../node-singletons/fs';
|
|
11
|
+
import { fileURLToPath } from '../node-singletons/url';
|
|
12
|
+
import * as path from 'node:path';
|
|
13
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
14
|
+
const __dirname = path.dirname(__filename);
|
|
15
|
+
const ROOT_DIR = path.resolve(__dirname, '../../');
|
|
16
|
+
/**
|
|
17
|
+
* Calculate SHA1 hash of file content
|
|
18
|
+
*/
|
|
19
|
+
function hashFile(filePath) {
|
|
20
|
+
try {
|
|
21
|
+
const content = fs.readFileSync(filePath, 'utf8');
|
|
22
|
+
return crypto.createHash('sha1').update(content).digest('hex'); // NOSONAR;
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
Logger.error(`Error reading file ${filePath}`, error);
|
|
26
|
+
throw ErrorFactory.createTryCatchError(`Failed to read file: ${filePath}`, error);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Extract content between TEMPLATE_START and TEMPLATE_END markers
|
|
31
|
+
*/
|
|
32
|
+
function extractTemplateContent(filePath) {
|
|
33
|
+
try {
|
|
34
|
+
const content = fs.readFileSync(filePath, 'utf8');
|
|
35
|
+
const startMarker = '// TEMPLATE_START';
|
|
36
|
+
const endMarker = '// TEMPLATE_END';
|
|
37
|
+
const startIdx = content.indexOf(startMarker);
|
|
38
|
+
const endIdx = content.indexOf(endMarker);
|
|
39
|
+
if (startIdx === -1 || endIdx === -1) {
|
|
40
|
+
Logger.warn(`Template markers not found in ${filePath}`);
|
|
41
|
+
return content;
|
|
42
|
+
}
|
|
43
|
+
// Extract from after START marker to before END marker (inclusive of END comment)
|
|
44
|
+
return content.substring(startIdx, endIdx + endMarker.length);
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
Logger.error(`Error extracting template from ${filePath}`, error);
|
|
48
|
+
throw ErrorFactory.createTryCatchError(`Failed to extract template from: ${filePath}`, error);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Ensure directory exists, create if needed
|
|
53
|
+
*/
|
|
54
|
+
function ensureDir(dirPath) {
|
|
55
|
+
if (!fs.existsSync(dirPath)) {
|
|
56
|
+
fs.mkdirSync(dirPath, { recursive: true });
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
const shouldSkipEntry = (name) => {
|
|
60
|
+
return (name === 'node_modules' ||
|
|
61
|
+
name === 'dist' ||
|
|
62
|
+
name === 'coverage' ||
|
|
63
|
+
name === '.git' ||
|
|
64
|
+
name === '.DS_Store');
|
|
65
|
+
};
|
|
66
|
+
const listFilesRecursive = (baseDirAbs) => {
|
|
67
|
+
const out = [];
|
|
68
|
+
const walk = (dirAbs) => {
|
|
69
|
+
const entries = fs.readdirSync(dirAbs, { withFileTypes: true });
|
|
70
|
+
for (const entry of entries) {
|
|
71
|
+
if (shouldSkipEntry(entry.name))
|
|
72
|
+
continue;
|
|
73
|
+
const abs = path.join(dirAbs, entry.name);
|
|
74
|
+
if (entry.isDirectory()) {
|
|
75
|
+
walk(abs);
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
if (!entry.isFile())
|
|
79
|
+
continue;
|
|
80
|
+
out.push({ absPath: abs, relPath: path.relative(baseDirAbs, abs) });
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
walk(baseDirAbs);
|
|
84
|
+
return out;
|
|
85
|
+
};
|
|
86
|
+
const syncProjectTemplateDir = (params) => {
|
|
87
|
+
const baseDirAbs = path.join(ROOT_DIR, params.baseDirRel);
|
|
88
|
+
const templateDirAbs = path.join(ROOT_DIR, params.templateDirRel);
|
|
89
|
+
if (!fs.existsSync(baseDirAbs)) {
|
|
90
|
+
Logger.warn(`⚠️ Base directory not found: ${params.baseDirRel}`);
|
|
91
|
+
return { updated: 0, skipped: 0, total: 0 };
|
|
92
|
+
}
|
|
93
|
+
const files = listFilesRecursive(baseDirAbs);
|
|
94
|
+
let updated = 0;
|
|
95
|
+
let skipped = 0;
|
|
96
|
+
for (const file of files) {
|
|
97
|
+
const baseKey = `${params.baseDirRel}/${file.relPath}`;
|
|
98
|
+
const currentHash = hashFile(file.absPath);
|
|
99
|
+
const storedHash = params.checksums[baseKey];
|
|
100
|
+
const outRel = `${file.relPath}.tpl`;
|
|
101
|
+
const outAbs = path.join(templateDirAbs, outRel);
|
|
102
|
+
if (currentHash === storedHash && fs.existsSync(outAbs)) {
|
|
103
|
+
skipped++;
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
const raw = fs.readFileSync(file.absPath, 'utf8');
|
|
107
|
+
const transformed = typeof params.transformContent === 'function'
|
|
108
|
+
? params.transformContent(file.relPath, raw)
|
|
109
|
+
: raw;
|
|
110
|
+
ensureDir(path.dirname(outAbs));
|
|
111
|
+
fs.writeFileSync(outAbs, transformed, 'utf8');
|
|
112
|
+
params.checksums[baseKey] = currentHash;
|
|
113
|
+
updated++;
|
|
114
|
+
}
|
|
115
|
+
if (files.length > 0) {
|
|
116
|
+
Logger.info(`✓ ${params.description} (updated: ${updated}, skipped: ${skipped}, total: ${files.length})`);
|
|
117
|
+
}
|
|
118
|
+
return { updated, skipped, total: files.length };
|
|
119
|
+
};
|
|
120
|
+
/**
|
|
121
|
+
* Load existing checksums from JSON file
|
|
122
|
+
*/
|
|
123
|
+
function loadChecksums() {
|
|
124
|
+
const checksumPath = path.join(ROOT_DIR, '.template-checksums.json');
|
|
125
|
+
if (fs.existsSync(checksumPath)) {
|
|
126
|
+
try {
|
|
127
|
+
const content = fs.readFileSync(checksumPath, 'utf8');
|
|
128
|
+
return JSON.parse(content);
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
Logger.error('Could not parse .template-checksums.json, starting fresh', error);
|
|
132
|
+
return {};
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return {};
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Save checksums to JSON file
|
|
139
|
+
*/
|
|
140
|
+
function saveChecksums(checksums) {
|
|
141
|
+
const checksumPath = path.join(ROOT_DIR, '.template-checksums.json');
|
|
142
|
+
fs.writeFileSync(checksumPath, JSON.stringify(checksums, null, 2));
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Main sync function
|
|
146
|
+
*/
|
|
147
|
+
// eslint-disable-next-line @typescript-eslint/require-await
|
|
148
|
+
async function syncTemplates() {
|
|
149
|
+
Logger.info('🔄 Syncing templates...\n');
|
|
150
|
+
const checksums = loadChecksums();
|
|
151
|
+
const mappings = TemplateRegistry.getMappings();
|
|
152
|
+
let updated = 0;
|
|
153
|
+
let skipped = 0;
|
|
154
|
+
for (const mapping of mappings) {
|
|
155
|
+
const basePath = path.join(ROOT_DIR, mapping.basePath);
|
|
156
|
+
const templatePath = path.join(ROOT_DIR, mapping.templatePath);
|
|
157
|
+
// Check if base file exists
|
|
158
|
+
if (!fs.existsSync(basePath)) {
|
|
159
|
+
Logger.warn(`⚠️ Base file not found: ${mapping.basePath}`);
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
// Calculate current hash
|
|
163
|
+
const currentHash = hashFile(basePath);
|
|
164
|
+
const storedHash = checksums[mapping.basePath];
|
|
165
|
+
// Check if update is needed
|
|
166
|
+
if (currentHash === storedHash && fs.existsSync(templatePath)) {
|
|
167
|
+
Logger.info(`✓ ${mapping.description} (in sync)`);
|
|
168
|
+
skipped++;
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
// Extract and write template
|
|
172
|
+
try {
|
|
173
|
+
const templateContent = extractTemplateContent(basePath);
|
|
174
|
+
ensureDir(path.dirname(templatePath));
|
|
175
|
+
fs.writeFileSync(templatePath, templateContent, 'utf8');
|
|
176
|
+
// Update checksum
|
|
177
|
+
checksums[mapping.basePath] = currentHash;
|
|
178
|
+
Logger.info(`✓ Updated: ${mapping.description}`);
|
|
179
|
+
updated++;
|
|
180
|
+
}
|
|
181
|
+
catch (error) {
|
|
182
|
+
Logger.error(`❌ Failed to sync ${mapping.basePath}:`, error);
|
|
183
|
+
process.exit(1);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
// Sync starter project templates (basic) from base framework folders.
|
|
187
|
+
// Spec: app/* -> app/*, src/config/* -> config/*, src/database/* -> database/*, routes/* -> routes/*
|
|
188
|
+
// plus .env (generated from .env.example with sensitive values blanked).
|
|
189
|
+
Logger.info('');
|
|
190
|
+
Logger.info('🔄 Syncing starter project templates (basic)...');
|
|
191
|
+
const projectRoot = 'src/templates/project/basic';
|
|
192
|
+
const s1 = syncProjectTemplateDir({
|
|
193
|
+
checksums,
|
|
194
|
+
baseDirRel: 'app',
|
|
195
|
+
templateDirRel: `${projectRoot}/app`,
|
|
196
|
+
description: 'Starter project app/*',
|
|
197
|
+
});
|
|
198
|
+
const s2 = syncProjectTemplateDir({
|
|
199
|
+
checksums,
|
|
200
|
+
baseDirRel: 'src/config',
|
|
201
|
+
templateDirRel: `${projectRoot}/config`,
|
|
202
|
+
description: 'Starter project config/* (from src/config/*)',
|
|
203
|
+
});
|
|
204
|
+
const s3 = syncProjectTemplateDir({
|
|
205
|
+
checksums,
|
|
206
|
+
baseDirRel: 'src/database',
|
|
207
|
+
templateDirRel: `${projectRoot}/database`,
|
|
208
|
+
description: 'Starter project database/* (from src/database/*)',
|
|
209
|
+
});
|
|
210
|
+
const s4 = syncProjectTemplateDir({
|
|
211
|
+
checksums,
|
|
212
|
+
baseDirRel: 'routes',
|
|
213
|
+
templateDirRel: `${projectRoot}/routes`,
|
|
214
|
+
description: 'Starter project routes/*',
|
|
215
|
+
});
|
|
216
|
+
const s5 = { updated: 0, skipped: 0 };
|
|
217
|
+
updated += s1.updated + s2.updated + s3.updated + s4.updated + s5.updated;
|
|
218
|
+
skipped += s1.skipped + s2.skipped + s3.skipped + s4.skipped + s5.skipped;
|
|
219
|
+
// Save updated checksums
|
|
220
|
+
saveChecksums(checksums);
|
|
221
|
+
// Summary
|
|
222
|
+
Logger.info(`\n📦 Template sync complete`);
|
|
223
|
+
Logger.info(` Updated: ${updated}`);
|
|
224
|
+
Logger.info(` Skipped: ${skipped}`);
|
|
225
|
+
Logger.info(` Total: ${mappings.length + s1.total + s2.total + s3.total + s4.total}\n`);
|
|
226
|
+
}
|
|
227
|
+
// Run sync
|
|
228
|
+
try {
|
|
229
|
+
await syncTemplates();
|
|
230
|
+
}
|
|
231
|
+
catch (error) {
|
|
232
|
+
Logger.error('Template sync failed', error);
|
|
233
|
+
process.exit(1);
|
|
234
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CSRF Token Manager
|
|
3
|
+
* Generate, validate, and bind CSRF tokens to sessions
|
|
4
|
+
*/
|
|
5
|
+
export interface CsrfTokenData {
|
|
6
|
+
token: string;
|
|
7
|
+
sessionId: string;
|
|
8
|
+
createdAt: Date;
|
|
9
|
+
expiresAt: Date;
|
|
10
|
+
}
|
|
11
|
+
export interface ICsrfTokenManager {
|
|
12
|
+
generateToken(sessionId: string): string;
|
|
13
|
+
validateToken(sessionId: string, token: string): boolean;
|
|
14
|
+
invalidateToken(sessionId: string): void;
|
|
15
|
+
getTokenData(sessionId: string): CsrfTokenData | null;
|
|
16
|
+
refreshToken(sessionId: string): string | null;
|
|
17
|
+
cleanup(): number;
|
|
18
|
+
clear(): void;
|
|
19
|
+
getTokenCount(): number;
|
|
20
|
+
}
|
|
21
|
+
export interface CsrfTokenManagerType {
|
|
22
|
+
create(): ICsrfTokenManager;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* CsrfTokenManager namespace - sealed for immutability
|
|
26
|
+
*/
|
|
27
|
+
export declare const CsrfTokenManager: CsrfTokenManagerType;
|
|
28
|
+
//# sourceMappingURL=CsrfTokenManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CsrfTokenManager.d.ts","sourceRoot":"","sources":["../../../src/security/CsrfTokenManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;IACzC,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IACzD,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAAC;IACtD,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC/C,OAAO,IAAI,MAAM,CAAC;IAClB,KAAK,IAAI,IAAI,CAAC;IACd,aAAa,IAAI,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,IAAI,iBAAiB,CAAC;CAC7B;AAoED;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,oBAE7B,CAAC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CSRF Token Manager
|
|
3
|
+
* Generate, validate, and bind CSRF tokens to sessions
|
|
4
|
+
*/
|
|
5
|
+
import { Env } from '../config/env';
|
|
6
|
+
import { randomBytes } from 'node:crypto';
|
|
7
|
+
/**
|
|
8
|
+
* Create a new CSRF token manager instance
|
|
9
|
+
*/
|
|
10
|
+
const create = () => {
|
|
11
|
+
const tokens = new Map();
|
|
12
|
+
const tokenLength = Env.TOKEN_LENGTH; // 256 bits
|
|
13
|
+
const tokenTtl = Env.TOKEN_TTL; // 1 hour in milliseconds
|
|
14
|
+
return {
|
|
15
|
+
generateToken(sessionId) {
|
|
16
|
+
tokens.delete(sessionId);
|
|
17
|
+
const token = randomBytes(tokenLength).toString('hex');
|
|
18
|
+
const now = new Date();
|
|
19
|
+
const expiresAt = new Date(now.getTime() + tokenTtl);
|
|
20
|
+
const tokenData = { token, sessionId, createdAt: now, expiresAt };
|
|
21
|
+
tokens.set(sessionId, tokenData);
|
|
22
|
+
return token;
|
|
23
|
+
},
|
|
24
|
+
validateToken(sessionId, token) {
|
|
25
|
+
const tokenData = tokens.get(sessionId);
|
|
26
|
+
if (!tokenData)
|
|
27
|
+
return false;
|
|
28
|
+
const isValid = tokenData.token === token;
|
|
29
|
+
const isExpired = new Date() > tokenData.expiresAt;
|
|
30
|
+
if (isExpired) {
|
|
31
|
+
tokens.delete(sessionId);
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
return isValid;
|
|
35
|
+
},
|
|
36
|
+
invalidateToken(sessionId) {
|
|
37
|
+
tokens.delete(sessionId);
|
|
38
|
+
},
|
|
39
|
+
getTokenData(sessionId) {
|
|
40
|
+
return tokens.get(sessionId) ?? null;
|
|
41
|
+
},
|
|
42
|
+
refreshToken(sessionId) {
|
|
43
|
+
const tokenData = tokens.get(sessionId);
|
|
44
|
+
if (!tokenData)
|
|
45
|
+
return null;
|
|
46
|
+
const isExpired = new Date() > tokenData.expiresAt;
|
|
47
|
+
if (isExpired) {
|
|
48
|
+
tokens.delete(sessionId);
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
tokenData.expiresAt = new Date(Date.now() + tokenTtl);
|
|
52
|
+
return tokenData.token;
|
|
53
|
+
},
|
|
54
|
+
cleanup() {
|
|
55
|
+
let removed = 0;
|
|
56
|
+
const now = new Date();
|
|
57
|
+
for (const [sessionId, tokenData] of tokens.entries()) {
|
|
58
|
+
if (now > tokenData.expiresAt) {
|
|
59
|
+
tokens.delete(sessionId);
|
|
60
|
+
removed++;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return removed;
|
|
64
|
+
},
|
|
65
|
+
clear() {
|
|
66
|
+
tokens.clear();
|
|
67
|
+
},
|
|
68
|
+
getTokenCount() {
|
|
69
|
+
return tokens.size;
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
};
|
|
73
|
+
/**
|
|
74
|
+
* CsrfTokenManager namespace - sealed for immutability
|
|
75
|
+
*/
|
|
76
|
+
export const CsrfTokenManager = Object.freeze({
|
|
77
|
+
create,
|
|
78
|
+
});
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Encryptor
|
|
3
|
+
* Password hashing with dual support: PBKDF2 (default) and optional bcrypt
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Hash algorithm selector
|
|
7
|
+
*/
|
|
8
|
+
export type HashAlgorithm = 'pbkdf2' | 'bcrypt';
|
|
9
|
+
export interface IEncryptor {
|
|
10
|
+
hash(password: string): Promise<string>;
|
|
11
|
+
verify(password: string, hash: string): Promise<boolean>;
|
|
12
|
+
getAlgorithm(): HashAlgorithm;
|
|
13
|
+
}
|
|
14
|
+
export declare const Encryptor: IEncryptor;
|
|
15
|
+
//# sourceMappingURL=Encryptor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Encryptor.d.ts","sourceRoot":"","sources":["../../../src/security/Encryptor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,QAAQ,CAAC;AA2HhD,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACxC,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACzD,YAAY,IAAI,aAAa,CAAC;CAC/B;AAuCD,eAAO,MAAM,SAAS,EAAE,UAItB,CAAC"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Encryptor
|
|
3
|
+
* Password hashing with dual support: PBKDF2 (default) and optional bcrypt
|
|
4
|
+
*/
|
|
5
|
+
import { Logger } from '../config/logger';
|
|
6
|
+
import { ErrorFactory } from '../exceptions/ZintrustError';
|
|
7
|
+
import { pbkdf2Sync, randomBytes } from 'node:crypto';
|
|
8
|
+
function isBcryptModule(value) {
|
|
9
|
+
if (typeof value !== 'object' || value === null)
|
|
10
|
+
return false;
|
|
11
|
+
const record = value;
|
|
12
|
+
return typeof record['hash'] === 'function' && typeof record['compare'] === 'function';
|
|
13
|
+
}
|
|
14
|
+
let algorithm = 'pbkdf2';
|
|
15
|
+
let bcrypt;
|
|
16
|
+
let loadingPromise;
|
|
17
|
+
async function loadBcrypt() {
|
|
18
|
+
try {
|
|
19
|
+
const imported = await import('bcrypt');
|
|
20
|
+
const module = imported;
|
|
21
|
+
const candidate = module.default ?? module;
|
|
22
|
+
if (!isBcryptModule(candidate)) {
|
|
23
|
+
throw ErrorFactory.createConfigError('Invalid bcrypt module shape');
|
|
24
|
+
}
|
|
25
|
+
bcrypt = candidate;
|
|
26
|
+
algorithm = 'bcrypt';
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
Logger.error('bcrypt not installed, falling back to PBKDF2', error);
|
|
30
|
+
ErrorFactory.createSecurityError('bcrypt not installed, falling back to PBKDF2', error);
|
|
31
|
+
// bcrypt not installed, will use PBKDF2
|
|
32
|
+
algorithm = 'pbkdf2';
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async function ensureLoaded() {
|
|
36
|
+
if (bcrypt !== undefined)
|
|
37
|
+
return;
|
|
38
|
+
if (loadingPromise !== undefined)
|
|
39
|
+
return loadingPromise;
|
|
40
|
+
loadingPromise = loadBcrypt();
|
|
41
|
+
return loadingPromise;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Timing-safe string comparison
|
|
45
|
+
*/
|
|
46
|
+
function timingSafeEquals(a, b) {
|
|
47
|
+
if (a.length !== b.length) {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
let result = 0;
|
|
51
|
+
for (let i = 0; i < a.length; i++) {
|
|
52
|
+
result |= (a.codePointAt(i) ?? 0) ^ (b.codePointAt(i) ?? 0);
|
|
53
|
+
}
|
|
54
|
+
return result === 0;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Hash with PBKDF2 (default)
|
|
58
|
+
*/
|
|
59
|
+
function hashPbkdf2(password) {
|
|
60
|
+
const iterations = 600000; // OWASP recommended for SHA-256
|
|
61
|
+
const salt = randomBytes(32).toString('hex');
|
|
62
|
+
const keyLength = 64;
|
|
63
|
+
const digest = 'sha256';
|
|
64
|
+
const hash = pbkdf2Sync(password, salt, iterations, keyLength, digest).toString('hex');
|
|
65
|
+
// Format: algorithm$iterations$salt$hash
|
|
66
|
+
return `pbkdf2$${iterations}$${salt}$${hash}`;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Verify PBKDF2 hash
|
|
70
|
+
*/
|
|
71
|
+
function verifyPbkdf2(password, passwordHash) {
|
|
72
|
+
const parts = passwordHash.split('$');
|
|
73
|
+
const iterationsStr = parts[1];
|
|
74
|
+
const salt = parts[2];
|
|
75
|
+
const storedHash = parts[3];
|
|
76
|
+
if (iterationsStr === undefined || salt === undefined || storedHash === undefined) {
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
try {
|
|
80
|
+
const iterations = Number.parseInt(iterationsStr, 10);
|
|
81
|
+
const keyLength = 64;
|
|
82
|
+
const digest = 'sha256';
|
|
83
|
+
const computed = pbkdf2Sync(password, salt, iterations, keyLength, digest).toString('hex');
|
|
84
|
+
return timingSafeEquals(computed, storedHash);
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
Logger.error('PBKDF2 verification failed', error);
|
|
88
|
+
ErrorFactory.createSecurityError('PBKDF2 verification failed', error);
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Hash with bcrypt
|
|
94
|
+
*/
|
|
95
|
+
async function hashBcrypt(bcryptModule, password) {
|
|
96
|
+
const rounds = 12;
|
|
97
|
+
return bcryptModule.hash(password, rounds);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Verify bcrypt hash
|
|
101
|
+
*/
|
|
102
|
+
async function verifyBcrypt(bcryptModule, password, passwordHash) {
|
|
103
|
+
return bcryptModule.compare(password, passwordHash);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Encryptor handles password hashing and verification
|
|
107
|
+
* Refactored to Functional Object pattern
|
|
108
|
+
*/
|
|
109
|
+
const hash = async (password) => {
|
|
110
|
+
await ensureLoaded();
|
|
111
|
+
if (algorithm === 'bcrypt' && bcrypt !== undefined) {
|
|
112
|
+
return hashBcrypt(bcrypt, password);
|
|
113
|
+
}
|
|
114
|
+
return hashPbkdf2(password);
|
|
115
|
+
};
|
|
116
|
+
/**
|
|
117
|
+
* Verify password against hash
|
|
118
|
+
*/
|
|
119
|
+
const verify = async (password, passwordHash) => {
|
|
120
|
+
await ensureLoaded();
|
|
121
|
+
// Detect hash format
|
|
122
|
+
if (passwordHash.startsWith('$2')) {
|
|
123
|
+
// bcrypt hash format
|
|
124
|
+
if (bcrypt !== undefined) {
|
|
125
|
+
return verifyBcrypt(bcrypt, password, passwordHash);
|
|
126
|
+
}
|
|
127
|
+
throw ErrorFactory.createConfigError('bcrypt not available to verify hash');
|
|
128
|
+
}
|
|
129
|
+
// PBKDF2 hash format (algorithm$iterations$salt$hash)
|
|
130
|
+
return verifyPbkdf2(password, passwordHash);
|
|
131
|
+
};
|
|
132
|
+
/**
|
|
133
|
+
* Get current algorithm
|
|
134
|
+
*/
|
|
135
|
+
const getAlgorithm = () => {
|
|
136
|
+
return algorithm;
|
|
137
|
+
};
|
|
138
|
+
export const Encryptor = Object.freeze({
|
|
139
|
+
hash,
|
|
140
|
+
verify,
|
|
141
|
+
getAlgorithm,
|
|
142
|
+
});
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JWT Manager
|
|
3
|
+
* JSON Web Token generation, verification, and claims management
|
|
4
|
+
* Uses native Node.js crypto module (zero external dependencies)
|
|
5
|
+
*/
|
|
6
|
+
export type JwtAlgorithm = 'HS256' | 'HS512' | 'RS256';
|
|
7
|
+
export interface JwtPayload {
|
|
8
|
+
sub?: string;
|
|
9
|
+
iss?: string;
|
|
10
|
+
aud?: string;
|
|
11
|
+
exp?: number;
|
|
12
|
+
iat?: number;
|
|
13
|
+
nbf?: number;
|
|
14
|
+
jti?: string;
|
|
15
|
+
[key: string]: unknown;
|
|
16
|
+
}
|
|
17
|
+
export interface JwtOptions {
|
|
18
|
+
algorithm?: JwtAlgorithm;
|
|
19
|
+
expiresIn?: number;
|
|
20
|
+
issuer?: string;
|
|
21
|
+
audience?: string;
|
|
22
|
+
subject?: string;
|
|
23
|
+
jwtId?: string;
|
|
24
|
+
}
|
|
25
|
+
export interface IJwtManager {
|
|
26
|
+
setHmacSecret(secret: string): void;
|
|
27
|
+
setRsaKeys(privateKey: string, publicKey: string): void;
|
|
28
|
+
sign(payload: JwtPayload, options?: JwtOptions): string;
|
|
29
|
+
verify(token: string, algorithm?: JwtAlgorithm): JwtPayload;
|
|
30
|
+
decode(token: string): JwtPayload;
|
|
31
|
+
signRsa(message: string): string;
|
|
32
|
+
generateJwtId(): string;
|
|
33
|
+
}
|
|
34
|
+
export interface JwtManagerType {
|
|
35
|
+
create(): IJwtManager;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* JwtManager namespace - sealed for immutability
|
|
39
|
+
*/
|
|
40
|
+
export declare const JwtManager: JwtManagerType;
|
|
41
|
+
//# sourceMappingURL=JwtManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JwtManager.d.ts","sourceRoot":"","sources":["../../../src/security/JwtManager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AAEvD,MAAM,WAAW,UAAU;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,CAAC,EAAE,YAAY,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACxD,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC;IACxD,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,YAAY,GAAG,UAAU,CAAC;IAC5D,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAAC;IAClC,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IACjC,aAAa,IAAI,MAAM,CAAC;CACzB;AAQD,MAAM,WAAW,cAAc;IAC7B,MAAM,IAAI,WAAW,CAAC;CACvB;AAsCD;;GAEG;AACH,eAAO,MAAM,UAAU,EAAE,cAEvB,CAAC"}
|