@zintrust/core 0.1.0 → 0.1.2
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 +214 -0
- package/bin/zintrust.d.ts.map +1 -1
- package/bin/zintrust.js +18 -1
- package/package.json +4 -34
- package/public/index.html +535 -0
- package/src/boot/Application.d.ts.map +1 -1
- package/src/boot/Application.js +46 -3
- package/src/boot/Server.d.ts.map +1 -1
- package/src/boot/Server.js +3 -4
- package/src/boot/bootstrap.js +77 -6
- package/src/builder/BundleOptimizer.d.ts.map +1 -1
- package/src/builder/BundleOptimizer.js +25 -29
- package/src/cache/Cache.d.ts.map +1 -1
- package/src/cache/Cache.js +4 -2
- package/src/cache/drivers/KVDriver.d.ts.map +1 -1
- package/src/cache/drivers/KVDriver.js +8 -7
- package/src/cache/drivers/MemoryDriver.d.ts.map +1 -1
- package/src/cache/drivers/MemoryDriver.js +5 -0
- package/src/cache/drivers/RedisDriver.js +1 -1
- package/src/cli/BaseCommand.d.ts +2 -2
- package/src/cli/BaseCommand.d.ts.map +1 -1
- package/src/cli/BaseCommand.js +2 -1
- package/src/cli/CLI.d.ts.map +1 -1
- package/src/cli/CLI.js +22 -18
- package/src/cli/ErrorHandler.d.ts.map +1 -1
- package/src/cli/ErrorHandler.js +2 -4
- package/src/cli/commands/AddCommand.d.ts +81 -0
- package/src/cli/commands/AddCommand.d.ts.map +1 -1
- package/src/cli/commands/AddCommand.js +24 -5
- package/src/cli/commands/ConfigCommand.d.ts.map +1 -1
- package/src/cli/commands/ConfigCommand.js +59 -25
- package/src/cli/commands/D1MigrateCommand.d.ts +4 -0
- package/src/cli/commands/D1MigrateCommand.d.ts.map +1 -1
- package/src/cli/commands/D1MigrateCommand.js +6 -4
- package/src/cli/commands/FixCommand.d.ts.map +1 -1
- package/src/cli/commands/FixCommand.js +3 -15
- package/src/cli/commands/LogsCleanupCommand.d.ts +6 -0
- package/src/cli/commands/LogsCleanupCommand.d.ts.map +1 -0
- package/src/cli/commands/LogsCleanupCommand.js +20 -0
- package/src/cli/commands/LogsCommand.d.ts.map +1 -1
- package/src/cli/commands/LogsCommand.js +4 -6
- package/src/cli/commands/MakeMailTemplateCommand.d.ts +10 -0
- package/src/cli/commands/MakeMailTemplateCommand.d.ts.map +1 -0
- package/src/cli/commands/MakeMailTemplateCommand.js +74 -0
- package/src/cli/commands/MakeNotificationTemplateCommand.d.ts +10 -0
- package/src/cli/commands/MakeNotificationTemplateCommand.d.ts.map +1 -0
- package/src/cli/commands/MakeNotificationTemplateCommand.js +113 -0
- package/src/cli/commands/MigrateCommand.d.ts.map +1 -1
- package/src/cli/commands/MigrateCommand.js +3 -3
- package/src/cli/commands/NewCommand.d.ts +4 -0
- package/src/cli/commands/NewCommand.d.ts.map +1 -1
- package/src/cli/commands/NewCommand.js +34 -19
- package/src/cli/commands/PluginCommand.d.ts.map +1 -1
- package/src/cli/commands/PluginCommand.js +8 -4
- package/src/cli/commands/PrepareCommand.d.ts.map +1 -1
- package/src/cli/commands/PrepareCommand.js +1 -1
- package/src/cli/commands/QACommand.d.ts.map +1 -1
- package/src/cli/commands/QACommand.js +16 -26
- package/src/cli/commands/SecretsCommand.d.ts +16 -0
- package/src/cli/commands/SecretsCommand.d.ts.map +1 -0
- package/src/cli/commands/SecretsCommand.js +91 -0
- package/src/cli/commands/StartCommand.d.ts.map +1 -1
- package/src/cli/commands/StartCommand.js +2 -2
- package/src/cli/commands/TemplatesCommand.d.ts +3 -0
- package/src/cli/commands/TemplatesCommand.d.ts.map +1 -0
- package/src/cli/commands/TemplatesCommand.js +65 -0
- package/src/cli/commands/index.d.ts +5 -0
- package/src/cli/commands/index.d.ts.map +1 -1
- package/src/cli/commands/index.js +5 -0
- package/src/cli/config/ConfigManager.js +1 -1
- package/src/cli/index.d.ts +2 -1
- package/src/cli/index.d.ts.map +1 -1
- package/src/cli/index.js +2 -1
- package/src/cli/scaffolding/ControllerGenerator.d.ts.map +1 -1
- package/src/cli/scaffolding/ControllerGenerator.js +11 -10
- package/src/cli/scaffolding/FeatureScaffolder.js +4 -4
- package/src/cli/scaffolding/FileGenerator.js +1 -1
- package/src/cli/scaffolding/MigrationGenerator.d.ts.map +1 -1
- package/src/cli/scaffolding/MigrationGenerator.js +10 -9
- package/src/cli/scaffolding/ModelGenerator.d.ts.map +1 -1
- package/src/cli/scaffolding/ModelGenerator.js +11 -10
- package/src/cli/scaffolding/ProjectScaffolder.d.ts.map +1 -1
- package/src/cli/scaffolding/ProjectScaffolder.js +61 -11
- package/src/cli/scaffolding/ResponseFactoryGenerator.d.ts.map +1 -1
- package/src/cli/scaffolding/ResponseFactoryGenerator.js +2 -1
- package/src/cli/scaffolding/RouteGenerator.d.ts.map +1 -1
- package/src/cli/scaffolding/RouteGenerator.js +15 -14
- package/src/cli/scaffolding/SeederGenerator.js +1 -1
- package/src/cli/scaffolding/ServiceIntegrationTestGenerator.d.ts.map +1 -1
- package/src/cli/scaffolding/ServiceIntegrationTestGenerator.js +7 -6
- package/src/cli/scaffolding/ServiceRequestFactoryGenerator.d.ts +1 -1
- package/src/cli/scaffolding/ServiceRequestFactoryGenerator.d.ts.map +1 -1
- package/src/cli/scaffolding/ServiceRequestFactoryGenerator.js +2 -2
- package/src/cli/scaffolding/ServiceScaffolder.d.ts.map +1 -1
- package/src/cli/scaffolding/ServiceScaffolder.js +13 -12
- package/src/cli/scaffolding/TemplateEngine.d.ts +10 -3
- package/src/cli/scaffolding/TemplateEngine.d.ts.map +1 -1
- package/src/cli/scaffolding/TemplateEngine.js +15 -285
- package/src/cli/scaffolding/TemplateGenerator.d.ts +40 -0
- package/src/cli/scaffolding/TemplateGenerator.d.ts.map +1 -0
- package/src/cli/scaffolding/TemplateGenerator.js +172 -0
- package/src/cli/scaffolding/index.d.ts +1 -0
- package/src/cli/scaffolding/index.d.ts.map +1 -1
- package/src/cli/scaffolding/index.js +1 -0
- package/src/cli/utils/spawn.js +1 -1
- package/src/common/AwsSigV4.d.ts +41 -0
- package/src/common/AwsSigV4.d.ts.map +1 -0
- package/src/common/AwsSigV4.js +69 -0
- package/src/common/index.d.ts +39 -0
- package/src/common/index.d.ts.map +1 -1
- package/src/common/index.js +101 -8
- package/src/common/uuid.d.ts +3 -0
- package/src/common/uuid.d.ts.map +1 -0
- package/src/common/uuid.js +30 -0
- package/src/config/FileLogWriter.d.ts +22 -0
- package/src/config/FileLogWriter.d.ts.map +1 -0
- package/src/config/FileLogWriter.js +192 -0
- package/src/config/SecretsManager.d.ts.map +1 -1
- package/src/config/SecretsManager.js +26 -0
- package/src/config/StartupConfigValidator.d.ts +15 -0
- package/src/config/StartupConfigValidator.d.ts.map +1 -0
- package/src/config/StartupConfigValidator.js +86 -0
- package/src/config/app.d.ts +2 -1
- package/src/config/app.d.ts.map +1 -1
- package/src/config/app.js +65 -15
- package/src/config/broadcast.d.ts +47 -0
- package/src/config/broadcast.d.ts.map +1 -0
- package/src/config/broadcast.js +54 -0
- package/src/config/cache.d.ts +13 -17
- package/src/config/cache.d.ts.map +1 -1
- package/src/config/cache.js +9 -11
- package/src/config/cloudflare.d.ts +26 -0
- package/src/config/cloudflare.d.ts.map +1 -0
- package/src/config/cloudflare.js +38 -0
- package/src/config/env.d.ts +6 -0
- package/src/config/env.d.ts.map +1 -1
- package/src/config/env.js +6 -0
- package/src/config/index.d.ts +52 -28
- package/src/config/index.d.ts.map +1 -1
- package/src/config/index.js +3 -0
- package/src/config/logger.d.ts +2 -0
- package/src/config/logger.d.ts.map +1 -1
- package/src/config/logger.js +270 -11
- package/src/config/logging/HttpLogger.d.ts +23 -0
- package/src/config/logging/HttpLogger.d.ts.map +1 -0
- package/src/config/logging/HttpLogger.js +93 -0
- package/src/config/logging/KvLogger.d.ts +22 -0
- package/src/config/logging/KvLogger.d.ts.map +1 -0
- package/src/config/logging/KvLogger.js +143 -0
- package/src/config/logging/SlackLogger.d.ts +23 -0
- package/src/config/logging/SlackLogger.d.ts.map +1 -0
- package/src/config/logging/SlackLogger.js +119 -0
- package/src/config/mail.d.ts +81 -0
- package/src/config/mail.d.ts.map +1 -0
- package/src/config/mail.js +73 -0
- package/src/config/middleware.d.ts +8 -0
- package/src/config/middleware.d.ts.map +1 -0
- package/src/config/middleware.js +18 -0
- package/src/config/notification.d.ts +62 -0
- package/src/config/notification.d.ts.map +1 -0
- package/src/config/notification.js +43 -0
- package/src/config/security.d.ts.map +1 -1
- package/src/config/security.js +2 -2
- package/src/config/startup.d.ts +23 -0
- package/src/config/startup.d.ts.map +1 -0
- package/src/config/startup.js +15 -0
- package/src/config/storage.d.ts +21 -35
- package/src/config/storage.d.ts.map +1 -1
- package/src/config/storage.js +57 -37
- package/src/database/migrations/index.d.ts +1 -1
- package/src/database/migrations/index.d.ts.map +1 -1
- package/src/database/migrations/index.js +2 -1
- package/src/features/Queue.js +1 -25
- package/src/functions/lambda.d.ts.map +1 -1
- package/src/functions/lambda.js +6 -1
- package/src/health/RuntimeHealthProbes.d.ts +13 -0
- package/src/health/RuntimeHealthProbes.d.ts.map +1 -0
- package/src/health/RuntimeHealthProbes.js +62 -0
- package/src/health/StartupHealthChecks.d.ts +26 -0
- package/src/health/StartupHealthChecks.d.ts.map +1 -0
- package/src/health/StartupHealthChecks.js +124 -0
- package/src/http/ErrorResponse.d.ts +28 -0
- package/src/http/ErrorResponse.d.ts.map +1 -0
- package/src/http/ErrorResponse.js +42 -0
- package/src/http/Kernel.d.ts +5 -0
- package/src/http/Kernel.d.ts.map +1 -1
- package/src/http/Kernel.js +96 -30
- package/src/http/Request.d.ts +1 -1
- package/src/http/Request.d.ts.map +1 -1
- package/src/http/RequestContext.d.ts +20 -0
- package/src/http/RequestContext.d.ts.map +1 -0
- package/src/http/RequestContext.js +77 -0
- package/src/index.d.ts +9 -1
- package/src/index.d.ts.map +1 -1
- package/src/index.js +8 -2
- package/src/microservices/MicroserviceBootstrap.d.ts.map +1 -1
- package/src/microservices/MicroserviceBootstrap.js +6 -5
- package/src/microservices/MicroserviceManager.d.ts.map +1 -1
- package/src/microservices/MicroserviceManager.js +7 -5
- package/src/microservices/PostgresAdapter.d.ts.map +1 -1
- package/src/microservices/PostgresAdapter.js +7 -4
- package/src/microservices/ServiceBundler.d.ts.map +1 -1
- package/src/microservices/ServiceBundler.js +3 -1
- package/src/microservices/ServiceHealthMonitor.d.ts.map +1 -1
- package/src/microservices/ServiceHealthMonitor.js +7 -3
- package/src/middleware/CsrfMiddleware.d.ts.map +1 -1
- package/src/middleware/CsrfMiddleware.js +2 -19
- package/src/middleware/ErrorHandlerMiddleware.d.ts +6 -0
- package/src/middleware/ErrorHandlerMiddleware.d.ts.map +1 -0
- package/src/middleware/ErrorHandlerMiddleware.js +33 -0
- package/src/middleware/LoggingMiddleware.d.ts +9 -0
- package/src/middleware/LoggingMiddleware.d.ts.map +1 -0
- package/src/middleware/LoggingMiddleware.js +36 -0
- package/src/middleware/index.d.ts +2 -0
- package/src/middleware/index.d.ts.map +1 -1
- package/src/middleware/index.js +2 -0
- package/src/node-singletons/async_hooks.d.ts +9 -0
- package/src/node-singletons/async_hooks.d.ts.map +1 -0
- package/src/node-singletons/async_hooks.js +8 -0
- 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 +2 -2
- package/src/node-singletons/http.d.ts +1 -1
- package/src/node-singletons/http.d.ts.map +1 -1
- package/src/node-singletons/http.js +1 -1
- package/src/node-singletons/index.d.ts +4 -0
- package/src/node-singletons/index.d.ts.map +1 -1
- package/src/node-singletons/index.js +4 -0
- package/src/node-singletons/net.d.ts +9 -0
- package/src/node-singletons/net.d.ts.map +1 -0
- package/src/node-singletons/net.js +8 -0
- package/src/node-singletons/os.d.ts +3 -3
- package/src/node-singletons/os.d.ts.map +1 -1
- package/src/node-singletons/os.js +3 -4
- package/src/node-singletons/path.d.ts +3 -1
- package/src/node-singletons/path.d.ts.map +1 -1
- package/src/node-singletons/path.js +3 -1
- package/src/node-singletons/perf-hooks.d.ts +3 -1
- package/src/node-singletons/perf-hooks.d.ts.map +1 -1
- package/src/node-singletons/perf-hooks.js +3 -1
- package/src/node-singletons/process.d.ts +23 -0
- package/src/node-singletons/process.d.ts.map +1 -0
- package/src/node-singletons/process.js +8 -0
- package/src/node-singletons/readline.d.ts +3 -3
- package/src/node-singletons/readline.d.ts.map +1 -1
- package/src/node-singletons/readline.js +3 -4
- package/src/node-singletons/tls.d.ts +9 -0
- package/src/node-singletons/tls.d.ts.map +1 -0
- package/src/node-singletons/tls.js +8 -0
- package/src/node-singletons/url.d.ts +3 -1
- package/src/node-singletons/url.d.ts.map +1 -1
- package/src/node-singletons/url.js +3 -1
- package/src/orm/ConnectionManager.d.ts +6 -1
- package/src/orm/ConnectionManager.d.ts.map +1 -1
- package/src/orm/ConnectionManager.js +14 -0
- package/src/orm/DatabaseAdapter.d.ts +6 -0
- package/src/orm/DatabaseAdapter.d.ts.map +1 -1
- package/src/orm/QueryBuilder.d.ts +8 -1
- package/src/orm/QueryBuilder.d.ts.map +1 -1
- package/src/orm/QueryBuilder.js +188 -28
- package/src/orm/adapters/D1Adapter.d.ts.map +1 -1
- package/src/orm/adapters/D1Adapter.js +18 -12
- package/src/orm/adapters/MySQLAdapter.d.ts.map +1 -1
- package/src/orm/adapters/MySQLAdapter.js +4 -0
- package/src/orm/adapters/PostgreSQLAdapter.d.ts.map +1 -1
- package/src/orm/adapters/PostgreSQLAdapter.js +4 -0
- package/src/orm/adapters/SQLServerAdapter.d.ts.map +1 -1
- package/src/orm/adapters/SQLServerAdapter.js +4 -0
- package/src/orm/adapters/SQLiteAdapter.d.ts.map +1 -1
- package/src/orm/adapters/SQLiteAdapter.js +4 -0
- package/src/performance/Benchmark.d.ts.map +1 -1
- package/src/performance/Benchmark.js +3 -0
- package/src/performance/CodeGenerationBenchmark.js +3 -3
- package/src/performance/Optimizer.d.ts +1 -1
- package/src/performance/Optimizer.d.ts.map +1 -1
- package/src/performance/Optimizer.js +157 -80
- package/src/performance/establish-baseline.js +3 -3
- package/src/runtime/PluginManager.d.ts +3 -1
- package/src/runtime/PluginManager.d.ts.map +1 -1
- package/src/runtime/PluginManager.js +124 -28
- package/src/runtime/RuntimeDetector.d.ts.map +1 -1
- package/src/runtime/RuntimeDetector.js +47 -5
- package/src/runtime/adapters/CloudflareAdapter.js +2 -2
- package/src/runtime/adapters/DenoAdapter.js +9 -7
- package/src/runtime/adapters/FargateAdapter.d.ts.map +1 -1
- package/src/runtime/adapters/FargateAdapter.js +4 -3
- package/src/runtime/adapters/LambdaAdapter.d.ts.map +1 -1
- package/src/runtime/adapters/LambdaAdapter.js +4 -2
- package/src/runtime/adapters/NodeServerAdapter.d.ts.map +1 -1
- package/src/runtime/adapters/NodeServerAdapter.js +7 -6
- package/src/scheduler/ScheduleRunner.d.ts +18 -0
- package/src/scheduler/ScheduleRunner.d.ts.map +1 -0
- package/src/scheduler/ScheduleRunner.js +155 -0
- package/src/scheduler/index.d.ts +3 -0
- package/src/scheduler/index.d.ts.map +1 -0
- package/src/scheduler/index.js +1 -0
- package/src/scheduler/types.d.ts +16 -0
- package/src/scheduler/types.d.ts.map +1 -0
- package/src/scheduler/types.js +4 -0
- package/src/schedules/index.d.ts +2 -0
- package/src/schedules/index.d.ts.map +1 -0
- package/src/schedules/index.js +1 -0
- package/src/schedules/log-cleanup.d.ts +4 -0
- package/src/schedules/log-cleanup.d.ts.map +1 -0
- package/src/schedules/log-cleanup.js +18 -0
- package/src/scripts/GenerateEnvArtifacts.d.ts +13 -0
- package/src/scripts/GenerateEnvArtifacts.d.ts.map +1 -0
- package/src/scripts/GenerateEnvArtifacts.js +171 -0
- package/src/scripts/TemplateSync.js +109 -70
- package/src/security/CsrfTokenManager.js +1 -1
- package/src/security/Encryptor.js +1 -1
- package/src/security/Hash.d.ts +14 -0
- package/src/security/Hash.d.ts.map +1 -0
- package/src/security/Hash.js +81 -0
- package/src/security/StartupSecretValidation.d.ts +20 -0
- package/src/security/StartupSecretValidation.d.ts.map +1 -0
- package/src/security/StartupSecretValidation.js +61 -0
- package/src/security/UrlValidator.d.ts +0 -1
- package/src/security/UrlValidator.d.ts.map +1 -1
- package/src/security/UrlValidator.js +1 -2
- package/src/security/Xss.d.ts +14 -0
- package/src/security/Xss.d.ts.map +1 -0
- package/src/security/Xss.js +57 -0
- package/src/security/XssProtection.d.ts.map +1 -1
- package/src/security/XssProtection.js +150 -16
- package/src/templates/adapters/MySQLAdapter.ts.tpl +5 -0
- package/src/templates/adapters/PostgreSQLAdapter.ts.tpl +5 -0
- package/src/templates/adapters/SQLServerAdapter.ts.tpl +5 -0
- package/src/templates/adapters/SQLiteAdapter.ts.tpl +5 -0
- package/src/templates/features/Queue.ts.tpl +1 -29
- package/src/templates/project/basic/.env.example.tpl +48 -0
- package/src/templates/project/basic/.env.tpl +89 -94
- package/src/templates/project/basic/app/Toolkit/Broadcast/sendBroadcast.ts.tpl +7 -0
- package/src/templates/project/basic/app/Toolkit/Mail/sendWelcomeEmail.ts.tpl +30 -0
- package/src/templates/project/basic/app/Toolkit/Notification/sendSlackNotification.ts.tpl +10 -0
- package/src/templates/project/basic/app/Toolkit/Notification/sendSms.ts.tpl +13 -0
- package/src/templates/project/basic/config/FileLogWriter.ts.tpl +240 -0
- package/src/templates/project/basic/config/SecretsManager.ts.tpl +32 -1
- package/src/templates/project/basic/config/StartupConfigValidator.ts.tpl +151 -0
- package/src/templates/project/basic/config/app.ts.tpl +84 -15
- package/src/templates/project/basic/config/broadcast.ts.tpl +97 -0
- package/src/templates/project/basic/config/cache.ts.tpl +19 -23
- package/src/templates/project/basic/config/cloudflare.ts.tpl +57 -0
- package/src/templates/project/basic/config/env.ts.tpl +7 -1
- package/src/templates/project/basic/config/index.ts.tpl +3 -0
- package/src/templates/project/basic/config/logger.ts.tpl +301 -11
- package/src/templates/project/basic/config/logging/HttpLogger.ts.tpl +121 -0
- package/src/templates/project/basic/config/logging/KvLogger.ts.tpl +181 -0
- package/src/templates/project/basic/config/logging/SlackLogger.ts.tpl +156 -0
- package/src/templates/project/basic/config/mail.ts.tpl +141 -0
- package/src/templates/project/basic/config/middleware.ts.tpl +27 -0
- package/src/templates/project/basic/config/notification.ts.tpl +86 -0
- package/src/templates/project/basic/config/security.ts.tpl +4 -5
- package/src/templates/project/basic/config/startup.ts.tpl +27 -0
- package/src/templates/project/basic/config/storage.ts.tpl +77 -42
- package/src/templates/project/basic/database/migrations/index.ts.tpl +1 -1
- package/src/templates/project/basic/package.json.tpl +1 -1
- package/src/templates/project/basic/routes/api.ts.tpl +9 -37
- package/src/templates/project/basic/routes/broadcast.ts.tpl +32 -0
- package/src/templates/project/basic/routes/health.ts.tpl +134 -0
- package/src/templates/project/basic/src/index.ts.tpl +38 -11
- package/src/templates/project/basic/template.json +3 -0
- package/src/toolkit/Secrets/EnvFile.d.ts +15 -0
- package/src/toolkit/Secrets/EnvFile.d.ts.map +1 -0
- package/src/toolkit/Secrets/EnvFile.js +63 -0
- package/src/toolkit/Secrets/Manifest.d.ts +24 -0
- package/src/toolkit/Secrets/Manifest.d.ts.map +1 -0
- package/src/toolkit/Secrets/Manifest.js +71 -0
- package/src/toolkit/Secrets/index.d.ts +42 -0
- package/src/toolkit/Secrets/index.d.ts.map +1 -0
- package/src/toolkit/Secrets/index.js +119 -0
- package/src/toolkit/Secrets/providers/AwsSecretsManager.d.ts +14 -0
- package/src/toolkit/Secrets/providers/AwsSecretsManager.d.ts.map +1 -0
- package/src/toolkit/Secrets/providers/AwsSecretsManager.js +131 -0
- package/src/toolkit/Secrets/providers/CloudflareKv.d.ts +9 -0
- package/src/toolkit/Secrets/providers/CloudflareKv.d.ts.map +1 -0
- package/src/toolkit/Secrets/providers/CloudflareKv.js +73 -0
- package/src/tools/broadcast/Broadcast.d.ts +7 -0
- package/src/tools/broadcast/Broadcast.d.ts.map +1 -0
- package/src/tools/broadcast/Broadcast.js +37 -0
- package/src/tools/broadcast/drivers/BaseDriver.d.ts +5 -0
- package/src/tools/broadcast/drivers/BaseDriver.d.ts.map +1 -0
- package/src/tools/broadcast/drivers/BaseDriver.js +8 -0
- package/src/tools/broadcast/drivers/InMemory.d.ts +18 -0
- package/src/tools/broadcast/drivers/InMemory.d.ts.map +1 -0
- package/src/tools/broadcast/drivers/InMemory.js +16 -0
- package/src/tools/broadcast/drivers/Pusher.d.ts +8 -0
- package/src/tools/broadcast/drivers/Pusher.d.ts.map +1 -0
- package/src/tools/broadcast/drivers/Pusher.js +75 -0
- package/src/tools/broadcast/drivers/Redis.d.ts +19 -0
- package/src/tools/broadcast/drivers/Redis.d.ts.map +1 -0
- package/src/tools/broadcast/drivers/Redis.js +73 -0
- package/src/tools/broadcast/drivers/RedisHttps.d.ts +14 -0
- package/src/tools/broadcast/drivers/RedisHttps.d.ts.map +1 -0
- package/src/tools/broadcast/drivers/RedisHttps.js +50 -0
- package/src/tools/broadcast/index.d.ts +7 -0
- package/src/tools/broadcast/index.d.ts.map +1 -0
- package/src/tools/broadcast/index.js +6 -0
- package/src/tools/http/Http.d.ts +51 -0
- package/src/tools/http/Http.d.ts.map +1 -0
- package/src/tools/http/Http.js +171 -0
- package/src/tools/http/HttpResponse.d.ts +32 -0
- package/src/tools/http/HttpResponse.d.ts.map +1 -0
- package/src/tools/http/HttpResponse.js +80 -0
- package/src/tools/http/index.d.ts +15 -0
- package/src/tools/http/index.d.ts.map +1 -0
- package/src/tools/http/index.js +9 -0
- package/src/tools/mail/Mail.d.ts +22 -0
- package/src/tools/mail/Mail.d.ts.map +1 -0
- package/src/tools/mail/Mail.js +105 -0
- package/src/tools/mail/attachments.d.ts +23 -0
- package/src/tools/mail/attachments.d.ts.map +1 -0
- package/src/tools/mail/attachments.js +26 -0
- package/src/tools/mail/drivers/BaseDriver.d.ts +5 -0
- package/src/tools/mail/drivers/BaseDriver.d.ts.map +1 -0
- package/src/tools/mail/drivers/BaseDriver.js +8 -0
- package/src/tools/mail/drivers/Mailgun.d.ts +31 -0
- package/src/tools/mail/drivers/Mailgun.d.ts.map +1 -0
- package/src/tools/mail/drivers/Mailgun.js +81 -0
- package/src/tools/mail/drivers/SendGrid.d.ts +29 -0
- package/src/tools/mail/drivers/SendGrid.d.ts.map +1 -0
- package/src/tools/mail/drivers/SendGrid.js +57 -0
- package/src/tools/mail/drivers/Ses.d.ts +24 -0
- package/src/tools/mail/drivers/Ses.d.ts.map +1 -0
- package/src/tools/mail/drivers/Ses.js +116 -0
- package/src/tools/mail/drivers/Smtp.d.ts +38 -0
- package/src/tools/mail/drivers/Smtp.d.ts.map +1 -0
- package/src/tools/mail/drivers/Smtp.js +327 -0
- package/src/tools/mail/templates/index.d.ts +27 -0
- package/src/tools/mail/templates/index.d.ts.map +1 -0
- package/src/tools/mail/templates/index.js +35 -0
- package/src/tools/mail/templates/markdown/index.d.ts +17 -0
- package/src/tools/mail/templates/markdown/index.d.ts.map +1 -0
- package/src/tools/mail/templates/markdown/index.js +49 -0
- package/src/tools/mail/templates/markdown/registry.d.ts +15 -0
- package/src/tools/mail/templates/markdown/registry.d.ts.map +1 -0
- package/src/tools/mail/templates/markdown/registry.js +34 -0
- package/src/tools/mail/templates/markdown/validator.d.ts +16 -0
- package/src/tools/mail/templates/markdown/validator.d.ts.map +1 -0
- package/src/tools/mail/templates/markdown/validator.js +24 -0
- package/src/tools/mail/testing.d.ts +41 -0
- package/src/tools/mail/testing.d.ts.map +1 -0
- package/src/tools/mail/testing.js +34 -0
- package/src/tools/notification/Driver.d.ts +11 -0
- package/src/tools/notification/Driver.d.ts.map +1 -0
- package/src/tools/notification/Driver.js +1 -0
- package/src/tools/notification/Notification.d.ts +11 -0
- package/src/tools/notification/Notification.d.ts.map +1 -0
- package/src/tools/notification/Notification.js +11 -0
- package/src/tools/notification/Registry.d.ts +10 -0
- package/src/tools/notification/Registry.d.ts.map +1 -0
- package/src/tools/notification/Registry.js +22 -0
- package/src/tools/notification/Service.d.ts +6 -0
- package/src/tools/notification/Service.d.ts.map +1 -0
- package/src/tools/notification/Service.js +18 -0
- package/src/tools/notification/config.d.ts +5 -0
- package/src/tools/notification/config.d.ts.map +1 -0
- package/src/tools/notification/config.js +5 -0
- package/src/tools/notification/drivers/BaseDriver.d.ts +5 -0
- package/src/tools/notification/drivers/BaseDriver.d.ts.map +1 -0
- package/src/tools/notification/drivers/BaseDriver.js +8 -0
- package/src/tools/notification/drivers/Console.d.ts +7 -0
- package/src/tools/notification/drivers/Console.d.ts.map +1 -0
- package/src/tools/notification/drivers/Console.js +13 -0
- package/src/tools/notification/drivers/Slack.d.ts +16 -0
- package/src/tools/notification/drivers/Slack.d.ts.map +1 -0
- package/src/tools/notification/drivers/Slack.js +24 -0
- package/src/tools/notification/drivers/Termii.d.ts +10 -0
- package/src/tools/notification/drivers/Termii.d.ts.map +1 -0
- package/src/tools/notification/drivers/Termii.js +47 -0
- package/src/tools/notification/drivers/Twilio.d.ts +21 -0
- package/src/tools/notification/drivers/Twilio.d.ts.map +1 -0
- package/src/tools/notification/drivers/Twilio.js +48 -0
- package/src/tools/notification/templates/markdown/index.d.ts +15 -0
- package/src/tools/notification/templates/markdown/index.d.ts.map +1 -0
- package/src/tools/notification/templates/markdown/index.js +38 -0
- package/src/tools/notification/templates/markdown/registry.d.ts +15 -0
- package/src/tools/notification/templates/markdown/registry.d.ts.map +1 -0
- package/src/tools/notification/templates/markdown/registry.js +36 -0
- package/src/tools/notification/testing.d.ts +19 -0
- package/src/tools/notification/testing.d.ts.map +1 -0
- package/src/tools/notification/testing.js +35 -0
- package/src/tools/notification/testingHelpers.d.ts +12 -0
- package/src/tools/notification/testingHelpers.d.ts.map +1 -0
- package/src/tools/notification/testingHelpers.js +32 -0
- package/src/tools/queue/Queue.d.ts +23 -0
- package/src/tools/queue/Queue.d.ts.map +1 -0
- package/src/tools/queue/Queue.js +38 -0
- package/src/tools/queue/drivers/InMemory.d.ts +10 -0
- package/src/tools/queue/drivers/InMemory.d.ts.map +1 -0
- package/src/tools/queue/drivers/InMemory.js +55 -0
- package/src/tools/queue/drivers/Redis.d.ts +10 -0
- package/src/tools/queue/drivers/Redis.d.ts.map +1 -0
- package/src/tools/queue/drivers/Redis.js +91 -0
- package/src/tools/storage/drivers/Gcs.d.ts +20 -0
- package/src/tools/storage/drivers/Gcs.d.ts.map +1 -0
- package/src/tools/storage/drivers/Gcs.js +152 -0
- package/src/tools/storage/drivers/Local.d.ts +17 -0
- package/src/tools/storage/drivers/Local.d.ts.map +1 -0
- package/src/tools/storage/drivers/Local.js +63 -0
- package/src/tools/storage/drivers/R2.d.ts +20 -0
- package/src/tools/storage/drivers/R2.d.ts.map +1 -0
- package/src/tools/storage/drivers/R2.js +73 -0
- package/src/tools/storage/drivers/S3.d.ts +26 -0
- package/src/tools/storage/drivers/S3.d.ts.map +1 -0
- package/src/tools/storage/drivers/S3.js +258 -0
- package/src/tools/storage/index.d.ts +24 -0
- package/src/tools/storage/index.d.ts.map +1 -0
- package/src/tools/storage/index.js +112 -0
- package/src/tools/storage/testing.d.ts +23 -0
- package/src/tools/storage/testing.d.ts.map +1 -0
- package/src/tools/storage/testing.js +52 -0
- package/src/tools/templates/MarkdownRenderer.d.ts +14 -0
- package/src/tools/templates/MarkdownRenderer.d.ts.map +1 -0
- package/src/tools/templates/MarkdownRenderer.js +300 -0
- package/src/tools/templates/index.d.ts +5 -0
- package/src/tools/templates/index.d.ts.map +1 -0
- package/src/tools/templates/index.js +4 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { ErrorFactory } from '../../../exceptions/ZintrustError';
|
|
2
|
+
import { createHash, createHmac } from '../../../node-singletons/crypto';
|
|
3
|
+
const md5Hex = (data) => createHash('md5').update(data).digest('hex');
|
|
4
|
+
const buildQueryString = (params) => {
|
|
5
|
+
const keys = Object.keys(params).sort((a, b) => a.localeCompare(b));
|
|
6
|
+
return keys
|
|
7
|
+
.map((key) => `${encodeURIComponent(key)}=${encodeURIComponent(params[key] ?? '')}`)
|
|
8
|
+
.join('&');
|
|
9
|
+
};
|
|
10
|
+
const buildBaseUrl = (cluster) => {
|
|
11
|
+
const normalized = cluster.trim();
|
|
12
|
+
if (normalized === '')
|
|
13
|
+
return 'https://api.pusherapp.com';
|
|
14
|
+
return `https://api-${normalized}.pusher.com`;
|
|
15
|
+
};
|
|
16
|
+
const ensureConfig = (config) => {
|
|
17
|
+
if (config.appId.trim() === '') {
|
|
18
|
+
throw ErrorFactory.createConfigError('Pusher broadcast misconfigured: PUSHER_APP_ID is required');
|
|
19
|
+
}
|
|
20
|
+
if (config.key.trim() === '') {
|
|
21
|
+
throw ErrorFactory.createConfigError('Pusher broadcast misconfigured: PUSHER_APP_KEY is required');
|
|
22
|
+
}
|
|
23
|
+
if (config.secret.trim() === '') {
|
|
24
|
+
throw ErrorFactory.createConfigError('Pusher broadcast misconfigured: PUSHER_APP_SECRET is required');
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
const signRequest = (params) => {
|
|
28
|
+
const stringToSign = `${params.method}\n${params.path}\n${params.queryString}`;
|
|
29
|
+
return createHmac('sha256', params.secret).update(stringToSign).digest('hex');
|
|
30
|
+
};
|
|
31
|
+
export const PusherDriver = Object.freeze({
|
|
32
|
+
async send(config, channel, event, data) {
|
|
33
|
+
ensureConfig(config);
|
|
34
|
+
const payload = {
|
|
35
|
+
name: event,
|
|
36
|
+
channels: [channel],
|
|
37
|
+
data: JSON.stringify(data ?? null),
|
|
38
|
+
};
|
|
39
|
+
const body = JSON.stringify(payload);
|
|
40
|
+
const path = `/apps/${config.appId}/events`;
|
|
41
|
+
const authTimestamp = String(Math.floor(Date.now() / 1000));
|
|
42
|
+
const queryParams = {
|
|
43
|
+
auth_key: config.key,
|
|
44
|
+
auth_timestamp: authTimestamp,
|
|
45
|
+
auth_version: '1.0',
|
|
46
|
+
body_md5: md5Hex(body),
|
|
47
|
+
};
|
|
48
|
+
const queryString = buildQueryString(queryParams);
|
|
49
|
+
const authSignature = signRequest({ method: 'POST', path, secret: config.secret, queryString });
|
|
50
|
+
const baseUrl = buildBaseUrl(config.cluster);
|
|
51
|
+
const url = `${baseUrl}${path}?${queryString}&auth_signature=${authSignature}`;
|
|
52
|
+
const res = await fetch(url, {
|
|
53
|
+
method: 'POST',
|
|
54
|
+
headers: {
|
|
55
|
+
'content-type': 'application/json',
|
|
56
|
+
},
|
|
57
|
+
body,
|
|
58
|
+
});
|
|
59
|
+
if (!res.ok) {
|
|
60
|
+
let responseBody;
|
|
61
|
+
try {
|
|
62
|
+
responseBody = await res.text();
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
responseBody = undefined;
|
|
66
|
+
}
|
|
67
|
+
throw ErrorFactory.createTryCatchError(`Pusher broadcast request failed (${res.status})`, {
|
|
68
|
+
status: res.status,
|
|
69
|
+
body: responseBody,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
return { ok: true };
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
export default PusherDriver;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export type IRedisPublishClient = {
|
|
2
|
+
connect?: () => Promise<void>;
|
|
3
|
+
publish(channel: string, message: string): Promise<number>;
|
|
4
|
+
};
|
|
5
|
+
export type RedisBroadcastDriverConfig = {
|
|
6
|
+
driver: 'redis';
|
|
7
|
+
host: string;
|
|
8
|
+
port: number;
|
|
9
|
+
password: string;
|
|
10
|
+
channelPrefix: string;
|
|
11
|
+
};
|
|
12
|
+
export declare const RedisDriver: {
|
|
13
|
+
readonly send: (config: RedisBroadcastDriverConfig, channel: string, event: string, data: unknown) => Promise<{
|
|
14
|
+
ok: boolean;
|
|
15
|
+
published: number;
|
|
16
|
+
}>;
|
|
17
|
+
};
|
|
18
|
+
export default RedisDriver;
|
|
19
|
+
//# sourceMappingURL=Redis.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Redis.d.ts","sourceRoot":"","sources":["../../../../../src/tools/broadcast/drivers/Redis.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC5D,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAiBF,eAAO,MAAM,WAAW;4BAsDD,0BAA0B,WAAW,MAAM,SAAS,MAAM,QAAQ,OAAO;;;;CAmB5F,CAAC;AAEL,eAAe,WAAW,CAAC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { ErrorFactory } from '../../../exceptions/ZintrustError';
|
|
2
|
+
const buildRedisUrl = (config) => {
|
|
3
|
+
const host = (config.host ?? '').trim();
|
|
4
|
+
const port = Number(config.port);
|
|
5
|
+
if (!host)
|
|
6
|
+
throw ErrorFactory.createConfigError('Redis broadcast driver requires host');
|
|
7
|
+
if (!Number.isFinite(port) || port <= 0) {
|
|
8
|
+
throw ErrorFactory.createConfigError('Redis broadcast driver requires a valid port');
|
|
9
|
+
}
|
|
10
|
+
const password = (config.password ?? '').trim();
|
|
11
|
+
const authPart = password ? `:${encodeURIComponent(password)}@` : '';
|
|
12
|
+
return `redis://${authPart}${host}:${port}`;
|
|
13
|
+
};
|
|
14
|
+
export const RedisDriver = (() => {
|
|
15
|
+
let client = null;
|
|
16
|
+
let connected = false;
|
|
17
|
+
const ensureClient = async (config) => {
|
|
18
|
+
// Always validate config even if a client is already cached
|
|
19
|
+
const url = buildRedisUrl(config);
|
|
20
|
+
if (connected && client !== null)
|
|
21
|
+
return client;
|
|
22
|
+
// Import lazily so package is optional for environments that don't use Redis
|
|
23
|
+
try {
|
|
24
|
+
const mod = (await import('redis'));
|
|
25
|
+
client = mod.createClient({ url });
|
|
26
|
+
if (typeof client.connect === 'function') {
|
|
27
|
+
try {
|
|
28
|
+
await client.connect();
|
|
29
|
+
connected = true;
|
|
30
|
+
}
|
|
31
|
+
catch (err) {
|
|
32
|
+
connected = false;
|
|
33
|
+
throw ErrorFactory.createTryCatchError('Redis broadcast driver failed to connect', err);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
connected = true;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
const globalFake = globalThis
|
|
42
|
+
.__fakeRedisClient;
|
|
43
|
+
if (globalFake === undefined) {
|
|
44
|
+
throw ErrorFactory.createConfigError("Redis broadcast driver requires the 'redis' package or a test fake client set in globalThis.__fakeRedisClient");
|
|
45
|
+
}
|
|
46
|
+
client = globalFake;
|
|
47
|
+
connected = true;
|
|
48
|
+
}
|
|
49
|
+
if (client === null)
|
|
50
|
+
throw ErrorFactory.createConfigError('Redis client could not be initialized');
|
|
51
|
+
return client;
|
|
52
|
+
};
|
|
53
|
+
const normalizePrefix = (value) => {
|
|
54
|
+
const prefix = (value ?? '').trim();
|
|
55
|
+
return prefix || 'broadcast:';
|
|
56
|
+
};
|
|
57
|
+
return {
|
|
58
|
+
async send(config, channel, event, data) {
|
|
59
|
+
const cli = await ensureClient(config);
|
|
60
|
+
const fullChannel = `${normalizePrefix(config.channelPrefix)}${channel}`;
|
|
61
|
+
let message;
|
|
62
|
+
try {
|
|
63
|
+
message = JSON.stringify({ event, data });
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
throw ErrorFactory.createTryCatchError('Failed to serialize broadcast payload', err);
|
|
67
|
+
}
|
|
68
|
+
const published = await cli.publish(fullChannel, message);
|
|
69
|
+
return { ok: true, published };
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
})();
|
|
73
|
+
export default RedisDriver;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type RedisHttpsBroadcastDriverConfig = {
|
|
2
|
+
driver: 'redishttps';
|
|
3
|
+
endpoint: string;
|
|
4
|
+
token: string;
|
|
5
|
+
channelPrefix: string;
|
|
6
|
+
};
|
|
7
|
+
export declare const RedisHttpsDriver: Readonly<{
|
|
8
|
+
send(config: RedisHttpsBroadcastDriverConfig, channel: string, event: string, data: unknown): Promise<{
|
|
9
|
+
ok: boolean;
|
|
10
|
+
published: number | undefined;
|
|
11
|
+
}>;
|
|
12
|
+
}>;
|
|
13
|
+
export default RedisHttpsDriver;
|
|
14
|
+
//# sourceMappingURL=RedisHttps.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RedisHttps.d.ts","sourceRoot":"","sources":["../../../../../src/tools/broadcast/drivers/RedisHttps.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,+BAA+B,GAAG;IAC5C,MAAM,EAAE,YAAY,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAsBF,eAAO,MAAM,gBAAgB;iBAEjB,+BAA+B,WAC9B,MAAM,SACR,MAAM,QACP,OAAO;;;;EAmCf,CAAC;AAEH,eAAe,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { Env } from '../../../config/env';
|
|
2
|
+
import { ErrorFactory } from '../../../exceptions/ZintrustError';
|
|
3
|
+
import { HttpClient } from '../../http/Http';
|
|
4
|
+
const normalizePrefix = (value) => {
|
|
5
|
+
const prefix = (value ?? '').trim();
|
|
6
|
+
return prefix || 'broadcast:';
|
|
7
|
+
};
|
|
8
|
+
const validateConfig = (config) => {
|
|
9
|
+
const endpoint = (config.endpoint ?? '').trim();
|
|
10
|
+
const token = (config.token ?? '').trim();
|
|
11
|
+
if (!endpoint) {
|
|
12
|
+
throw ErrorFactory.createConfigError('Redis HTTPS broadcast driver requires REDIS_HTTPS_ENDPOINT');
|
|
13
|
+
}
|
|
14
|
+
if (!token) {
|
|
15
|
+
throw ErrorFactory.createConfigError('Redis HTTPS broadcast driver requires REDIS_HTTPS_TOKEN');
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
export const RedisHttpsDriver = Object.freeze({
|
|
19
|
+
async send(config, channel, event, data) {
|
|
20
|
+
validateConfig(config);
|
|
21
|
+
let message;
|
|
22
|
+
try {
|
|
23
|
+
message = JSON.stringify({ event, data });
|
|
24
|
+
}
|
|
25
|
+
catch (err) {
|
|
26
|
+
throw ErrorFactory.createTryCatchError('Failed to serialize broadcast payload', err);
|
|
27
|
+
}
|
|
28
|
+
const fullChannel = `${normalizePrefix(config.channelPrefix)}${channel}`;
|
|
29
|
+
const timeout = Env.getInt('REDIS_HTTPS_TIMEOUT', 5000);
|
|
30
|
+
const response = await HttpClient.post(config.endpoint, {
|
|
31
|
+
command: 'PUBLISH',
|
|
32
|
+
channel: fullChannel,
|
|
33
|
+
message,
|
|
34
|
+
})
|
|
35
|
+
.withAuth(config.token)
|
|
36
|
+
.withTimeout(timeout)
|
|
37
|
+
.send();
|
|
38
|
+
response.throwIfServerError();
|
|
39
|
+
response.throwIfClientError();
|
|
40
|
+
const published = (() => {
|
|
41
|
+
const trimmed = response.body.trim();
|
|
42
|
+
const asNum = Number(trimmed);
|
|
43
|
+
if (!Number.isFinite(asNum))
|
|
44
|
+
return undefined;
|
|
45
|
+
return asNum;
|
|
46
|
+
})();
|
|
47
|
+
return { ok: true, published };
|
|
48
|
+
},
|
|
49
|
+
});
|
|
50
|
+
export default RedisHttpsDriver;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { Broadcast } from './Broadcast';
|
|
2
|
+
export { BaseDriver } from './drivers/BaseDriver';
|
|
3
|
+
export { InMemoryDriver } from './drivers/InMemory';
|
|
4
|
+
export { PusherDriver } from './drivers/Pusher';
|
|
5
|
+
export { RedisDriver } from './drivers/Redis';
|
|
6
|
+
export { RedisHttpsDriver } from './drivers/RedisHttps';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/tools/broadcast/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { Broadcast } from './Broadcast';
|
|
2
|
+
export { BaseDriver } from './drivers/BaseDriver';
|
|
3
|
+
export { InMemoryDriver } from './drivers/InMemory';
|
|
4
|
+
export { PusherDriver } from './drivers/Pusher';
|
|
5
|
+
export { RedisDriver } from './drivers/Redis';
|
|
6
|
+
export { RedisHttpsDriver } from './drivers/RedisHttps';
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Http Client - Fluent HTTP request builder
|
|
3
|
+
* Laravel-style HTTP client for making authenticated requests
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* await HttpClient.get('https://api.example.com/users').withAuth(token).send();
|
|
7
|
+
* await HttpClient.post('https://api.example.com/users', data).withTimeout(5000).send();
|
|
8
|
+
*/
|
|
9
|
+
import { type IHttpResponse } from './HttpResponse';
|
|
10
|
+
export type { IHttpResponse } from './HttpResponse';
|
|
11
|
+
/**
|
|
12
|
+
* HTTP Request builder interface
|
|
13
|
+
*/
|
|
14
|
+
export interface IHttpRequest {
|
|
15
|
+
withHeader(name: string, value: string): IHttpRequest;
|
|
16
|
+
withHeaders(headers: Record<string, string>): IHttpRequest;
|
|
17
|
+
withAuth(token: string, scheme?: 'Bearer' | 'Basic'): IHttpRequest;
|
|
18
|
+
withBasicAuth(username: string, password: string): IHttpRequest;
|
|
19
|
+
withTimeout(ms: number): IHttpRequest;
|
|
20
|
+
asJson(): IHttpRequest;
|
|
21
|
+
asForm(): IHttpRequest;
|
|
22
|
+
send(): Promise<IHttpResponse>;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* HTTP Client - Sealed namespace for making HTTP requests
|
|
26
|
+
* Provides Laravel-style fluent API
|
|
27
|
+
*/
|
|
28
|
+
export declare const HttpClient: Readonly<{
|
|
29
|
+
/**
|
|
30
|
+
* Make GET request
|
|
31
|
+
*/
|
|
32
|
+
get(url: string): IHttpRequest;
|
|
33
|
+
/**
|
|
34
|
+
* Make POST request
|
|
35
|
+
*/
|
|
36
|
+
post(url: string, data?: Record<string, unknown>): IHttpRequest;
|
|
37
|
+
/**
|
|
38
|
+
* Make PUT request
|
|
39
|
+
*/
|
|
40
|
+
put(url: string, data?: Record<string, unknown>): IHttpRequest;
|
|
41
|
+
/**
|
|
42
|
+
* Make PATCH request
|
|
43
|
+
*/
|
|
44
|
+
patch(url: string, data?: Record<string, unknown>): IHttpRequest;
|
|
45
|
+
/**
|
|
46
|
+
* Make DELETE request
|
|
47
|
+
*/
|
|
48
|
+
delete(url: string, data?: Record<string, unknown>): IHttpRequest;
|
|
49
|
+
}>;
|
|
50
|
+
export default HttpClient;
|
|
51
|
+
//# sourceMappingURL=Http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Http.d.ts","sourceRoot":"","sources":["../../../../src/tools/http/Http.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,EAAsB,KAAK,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAElF,YAAY,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,YAAY,CAAC;IACtD,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,YAAY,CAAC;IAC3D,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,YAAY,CAAC;IACnE,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,YAAY,CAAC;IAChE,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,CAAC;IACtC,MAAM,IAAI,YAAY,CAAC;IACvB,MAAM,IAAI,YAAY,CAAC;IACvB,IAAI,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC;CAChC;AAiJD;;;GAGG;AACH,eAAO,MAAM,UAAU;IACrB;;OAEG;aACM,MAAM,GAAG,YAAY;IAI9B;;OAEG;cACO,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,YAAY;IAQ/D;;OAEG;aACM,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,YAAY;IAQ9D;;OAEG;eACQ,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,YAAY;IAQhE;;OAEG;gBACS,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,YAAY;EAOjE,CAAC;AAEH,eAAe,UAAU,CAAC"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Http Client - Fluent HTTP request builder
|
|
3
|
+
* Laravel-style HTTP client for making authenticated requests
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* await HttpClient.get('https://api.example.com/users').withAuth(token).send();
|
|
7
|
+
* await HttpClient.post('https://api.example.com/users', data).withTimeout(5000).send();
|
|
8
|
+
*/
|
|
9
|
+
import { Env } from '../../config/env';
|
|
10
|
+
import { Logger } from '../../config/logger';
|
|
11
|
+
import { ErrorFactory } from '../../exceptions/ZintrustError';
|
|
12
|
+
import { createHttpResponse } from './HttpResponse';
|
|
13
|
+
/**
|
|
14
|
+
* Perform the actual request for a given state. Separated to keep the builder small
|
|
15
|
+
*/
|
|
16
|
+
async function performRequest(state) {
|
|
17
|
+
const timeout = state.timeout ?? Env.getInt('HTTP_TIMEOUT', 30000);
|
|
18
|
+
const controller = new AbortController();
|
|
19
|
+
let timeoutId;
|
|
20
|
+
if (timeout > 0) {
|
|
21
|
+
timeoutId = globalThis.setTimeout(() => controller.abort(), timeout);
|
|
22
|
+
}
|
|
23
|
+
const buildInit = () => {
|
|
24
|
+
const init = {
|
|
25
|
+
method: state.method,
|
|
26
|
+
headers: state.headers,
|
|
27
|
+
signal: controller.signal,
|
|
28
|
+
};
|
|
29
|
+
if (state.body !== undefined &&
|
|
30
|
+
state.body !== null &&
|
|
31
|
+
['POST', 'PUT', 'PATCH'].includes(state.method)) {
|
|
32
|
+
init.body = state.body;
|
|
33
|
+
}
|
|
34
|
+
return init;
|
|
35
|
+
};
|
|
36
|
+
try {
|
|
37
|
+
const init = buildInit();
|
|
38
|
+
const startTime = Date.now();
|
|
39
|
+
const response = await globalThis.fetch(state.url, init);
|
|
40
|
+
const responseBody = await response.text();
|
|
41
|
+
const duration = Date.now() - startTime;
|
|
42
|
+
Logger.debug(`HTTP ${state.method} ${state.url}`, {
|
|
43
|
+
status: response.status,
|
|
44
|
+
duration: `${duration}ms`,
|
|
45
|
+
size: responseBody.length,
|
|
46
|
+
});
|
|
47
|
+
return createHttpResponse(response, responseBody);
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
if (error instanceof Error && error.name === 'AbortError') {
|
|
51
|
+
throw ErrorFactory.createConnectionError(`HTTP request timeout after ${timeout}ms`, {
|
|
52
|
+
url: state.url,
|
|
53
|
+
method: state.method,
|
|
54
|
+
timeout,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
throw ErrorFactory.createTryCatchError(`HTTP request failed: ${error.message}`, {
|
|
58
|
+
url: state.url,
|
|
59
|
+
method: state.method,
|
|
60
|
+
error: error instanceof Error ? error.message : String(error),
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
finally {
|
|
64
|
+
if (timeoutId !== undefined) {
|
|
65
|
+
globalThis.clearTimeout(timeoutId);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Create request builder with fluent API
|
|
71
|
+
*/
|
|
72
|
+
const createRequestBuilder = (method, url, initialBody) => {
|
|
73
|
+
const state = {
|
|
74
|
+
method,
|
|
75
|
+
url,
|
|
76
|
+
headers: {
|
|
77
|
+
'User-Agent': 'Zintrust/1.0',
|
|
78
|
+
},
|
|
79
|
+
body: initialBody ? JSON.stringify(initialBody) : undefined,
|
|
80
|
+
};
|
|
81
|
+
const self = {
|
|
82
|
+
withHeader(name, value) {
|
|
83
|
+
state.headers[name] = value;
|
|
84
|
+
return self;
|
|
85
|
+
},
|
|
86
|
+
withHeaders(headers) {
|
|
87
|
+
Object.assign(state.headers, headers);
|
|
88
|
+
return self;
|
|
89
|
+
},
|
|
90
|
+
withAuth(token, scheme = 'Bearer') {
|
|
91
|
+
state.headers['Authorization'] = `${scheme} ${token}`;
|
|
92
|
+
return self;
|
|
93
|
+
},
|
|
94
|
+
withBasicAuth(username, password) {
|
|
95
|
+
const credentials = Buffer.from(`${username}:${password}`).toString('base64');
|
|
96
|
+
state.headers['Authorization'] = `Basic ${credentials}`;
|
|
97
|
+
return self;
|
|
98
|
+
},
|
|
99
|
+
withTimeout(ms) {
|
|
100
|
+
state.timeout = ms;
|
|
101
|
+
return self;
|
|
102
|
+
},
|
|
103
|
+
asJson() {
|
|
104
|
+
state.contentType = 'json';
|
|
105
|
+
state.headers['Content-Type'] = 'application/json';
|
|
106
|
+
return self;
|
|
107
|
+
},
|
|
108
|
+
asForm() {
|
|
109
|
+
state.contentType = 'form';
|
|
110
|
+
state.headers['Content-Type'] = 'application/x-www-form-urlencoded';
|
|
111
|
+
return self;
|
|
112
|
+
},
|
|
113
|
+
async send() {
|
|
114
|
+
return performRequest(state);
|
|
115
|
+
},
|
|
116
|
+
};
|
|
117
|
+
return self;
|
|
118
|
+
};
|
|
119
|
+
/**
|
|
120
|
+
* HTTP Client - Sealed namespace for making HTTP requests
|
|
121
|
+
* Provides Laravel-style fluent API
|
|
122
|
+
*/
|
|
123
|
+
export const HttpClient = Object.freeze({
|
|
124
|
+
/**
|
|
125
|
+
* Make GET request
|
|
126
|
+
*/
|
|
127
|
+
get(url) {
|
|
128
|
+
return createRequestBuilder('GET', url);
|
|
129
|
+
},
|
|
130
|
+
/**
|
|
131
|
+
* Make POST request
|
|
132
|
+
*/
|
|
133
|
+
post(url, data) {
|
|
134
|
+
const builder = createRequestBuilder('POST', url, data);
|
|
135
|
+
if (data) {
|
|
136
|
+
builder.asJson();
|
|
137
|
+
}
|
|
138
|
+
return builder;
|
|
139
|
+
},
|
|
140
|
+
/**
|
|
141
|
+
* Make PUT request
|
|
142
|
+
*/
|
|
143
|
+
put(url, data) {
|
|
144
|
+
const builder = createRequestBuilder('PUT', url, data);
|
|
145
|
+
if (data) {
|
|
146
|
+
builder.asJson();
|
|
147
|
+
}
|
|
148
|
+
return builder;
|
|
149
|
+
},
|
|
150
|
+
/**
|
|
151
|
+
* Make PATCH request
|
|
152
|
+
*/
|
|
153
|
+
patch(url, data) {
|
|
154
|
+
const builder = createRequestBuilder('PATCH', url, data);
|
|
155
|
+
if (data) {
|
|
156
|
+
builder.asJson();
|
|
157
|
+
}
|
|
158
|
+
return builder;
|
|
159
|
+
},
|
|
160
|
+
/**
|
|
161
|
+
* Make DELETE request
|
|
162
|
+
*/
|
|
163
|
+
delete(url, data) {
|
|
164
|
+
const builder = createRequestBuilder('DELETE', url, data);
|
|
165
|
+
if (data) {
|
|
166
|
+
builder.asJson();
|
|
167
|
+
}
|
|
168
|
+
return builder;
|
|
169
|
+
},
|
|
170
|
+
});
|
|
171
|
+
export default HttpClient;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HttpResponse - Response wrapper with utility methods
|
|
3
|
+
* Provides convenient access to response status, headers, body, and parsed JSON
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* HTTP Response interface for convenience methods
|
|
7
|
+
*/
|
|
8
|
+
export interface IHttpResponse {
|
|
9
|
+
status: number;
|
|
10
|
+
headers: Record<string, string>;
|
|
11
|
+
body: string;
|
|
12
|
+
json<T = unknown>(): T;
|
|
13
|
+
text(): string;
|
|
14
|
+
ok: boolean;
|
|
15
|
+
successful: boolean;
|
|
16
|
+
failed: boolean;
|
|
17
|
+
serverError: boolean;
|
|
18
|
+
clientError: boolean;
|
|
19
|
+
header(name: string): string | undefined;
|
|
20
|
+
hasHeader(name: string): boolean;
|
|
21
|
+
throwIfServerError(): IHttpResponse;
|
|
22
|
+
throwIfClientError(): IHttpResponse;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Create HTTP response from fetch Response
|
|
26
|
+
*/
|
|
27
|
+
export declare const createHttpResponse: (response: Response, body: string) => IHttpResponse;
|
|
28
|
+
declare const _default: {
|
|
29
|
+
createHttpResponse: (response: Response, body: string) => IHttpResponse;
|
|
30
|
+
};
|
|
31
|
+
export default _default;
|
|
32
|
+
//# sourceMappingURL=HttpResponse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HttpResponse.d.ts","sourceRoot":"","sources":["../../../../src/tools/http/HttpResponse.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,CAAC,GAAG,OAAO,KAAK,CAAC,CAAC;IACvB,IAAI,IAAI,MAAM,CAAC;IACf,EAAE,EAAE,OAAO,CAAC;IACZ,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACzC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IACjC,kBAAkB,IAAI,aAAa,CAAC;IACpC,kBAAkB,IAAI,aAAa,CAAC;CACrC;AAED;;GAEG;AACH,eAAO,MAAM,kBAAkB,GAAI,UAAU,QAAQ,EAAE,MAAM,MAAM,KAAG,aAmFrE,CAAC;;mCAnF2C,QAAQ,QAAQ,MAAM,KAAG,aAAa;;AAqFnF,wBAEE"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HttpResponse - Response wrapper with utility methods
|
|
3
|
+
* Provides convenient access to response status, headers, body, and parsed JSON
|
|
4
|
+
*/
|
|
5
|
+
import { ErrorFactory } from '../../exceptions/ZintrustError';
|
|
6
|
+
/**
|
|
7
|
+
* Create HTTP response from fetch Response
|
|
8
|
+
*/
|
|
9
|
+
export const createHttpResponse = (response, body) => {
|
|
10
|
+
const statusCode = response.status;
|
|
11
|
+
const headers = Object.fromEntries(response.headers.entries());
|
|
12
|
+
const lowerHeaders = Object.fromEntries(Object.entries(headers).map(([key, value]) => [key.toLowerCase(), value]));
|
|
13
|
+
return {
|
|
14
|
+
get status() {
|
|
15
|
+
return statusCode;
|
|
16
|
+
},
|
|
17
|
+
get headers() {
|
|
18
|
+
return headers;
|
|
19
|
+
},
|
|
20
|
+
get body() {
|
|
21
|
+
return body;
|
|
22
|
+
},
|
|
23
|
+
json() {
|
|
24
|
+
try {
|
|
25
|
+
return JSON.parse(body);
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
throw ErrorFactory.createValidationError('Failed to parse JSON response', {
|
|
29
|
+
body: body.substring(0, 200), // Truncate for logging
|
|
30
|
+
error: error instanceof Error ? error.message : String(error),
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
text() {
|
|
35
|
+
return body;
|
|
36
|
+
},
|
|
37
|
+
get ok() {
|
|
38
|
+
return response.ok;
|
|
39
|
+
},
|
|
40
|
+
get successful() {
|
|
41
|
+
return statusCode >= 200 && statusCode < 300;
|
|
42
|
+
},
|
|
43
|
+
get failed() {
|
|
44
|
+
return !this.successful;
|
|
45
|
+
},
|
|
46
|
+
get serverError() {
|
|
47
|
+
return statusCode >= 500;
|
|
48
|
+
},
|
|
49
|
+
get clientError() {
|
|
50
|
+
return statusCode >= 400 && statusCode < 500;
|
|
51
|
+
},
|
|
52
|
+
header(name) {
|
|
53
|
+
return lowerHeaders[name.toLowerCase()];
|
|
54
|
+
},
|
|
55
|
+
hasHeader(name) {
|
|
56
|
+
return name.toLowerCase() in lowerHeaders;
|
|
57
|
+
},
|
|
58
|
+
throwIfServerError() {
|
|
59
|
+
if (this.serverError) {
|
|
60
|
+
throw ErrorFactory.createTryCatchError(`HTTP server error: ${this.status}`, {
|
|
61
|
+
status: this.status,
|
|
62
|
+
body: this.body.substring(0, 200),
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
return this;
|
|
66
|
+
},
|
|
67
|
+
throwIfClientError() {
|
|
68
|
+
if (this.clientError) {
|
|
69
|
+
throw ErrorFactory.createTryCatchError(`HTTP client error: ${this.status}`, {
|
|
70
|
+
status: this.status,
|
|
71
|
+
body: this.body.substring(0, 200),
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
return this;
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
};
|
|
78
|
+
export default {
|
|
79
|
+
createHttpResponse,
|
|
80
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP Client Tools - Export all HTTP utilities
|
|
3
|
+
*/
|
|
4
|
+
declare const _default: Readonly<{
|
|
5
|
+
HttpClient: Readonly<{
|
|
6
|
+
get(url: string): import("./Http").IHttpRequest;
|
|
7
|
+
post(url: string, data?: Record<string, unknown>): import("./Http").IHttpRequest;
|
|
8
|
+
put(url: string, data?: Record<string, unknown>): import("./Http").IHttpRequest;
|
|
9
|
+
patch(url: string, data?: Record<string, unknown>): import("./Http").IHttpRequest;
|
|
10
|
+
delete(url: string, data?: Record<string, unknown>): import("./Http").IHttpRequest;
|
|
11
|
+
}>;
|
|
12
|
+
createHttpResponse: (response: Response, body: string) => import("./HttpResponse").IHttpResponse;
|
|
13
|
+
}>;
|
|
14
|
+
export default _default;
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/tools/http/index.ts"],"names":[],"mappings":"AAAA;;GAEG;;;;;;;;;;;AAKH,wBAGG"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type AttachmentInput } from './attachments';
|
|
2
|
+
export type SendMailInput = {
|
|
3
|
+
to: string | string[];
|
|
4
|
+
subject: string;
|
|
5
|
+
text: string;
|
|
6
|
+
html?: string;
|
|
7
|
+
from?: {
|
|
8
|
+
address?: string;
|
|
9
|
+
name?: string;
|
|
10
|
+
};
|
|
11
|
+
attachments?: AttachmentInput[];
|
|
12
|
+
};
|
|
13
|
+
export type SendMailResult = {
|
|
14
|
+
ok: boolean;
|
|
15
|
+
driver: 'sendgrid' | 'disabled' | 'smtp' | 'ses' | 'mailgun';
|
|
16
|
+
messageId?: string;
|
|
17
|
+
};
|
|
18
|
+
export declare const Mail: Readonly<{
|
|
19
|
+
send(input: SendMailInput): Promise<SendMailResult>;
|
|
20
|
+
}>;
|
|
21
|
+
export default Mail;
|
|
22
|
+
//# sourceMappingURL=Mail.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Mail.d.ts","sourceRoot":"","sources":["../../../../src/tools/mail/Mail.ts"],"names":[],"mappings":"AAQA,OAAO,EAAsB,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAG7E,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE;QACL,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IACF,WAAW,CAAC,EAAE,eAAe,EAAE,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,UAAU,GAAG,UAAU,GAAG,MAAM,GAAG,KAAK,GAAG,SAAS,CAAC;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAkIF,eAAO,MAAM,IAAI;gBACG,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;EAqBzD,CAAC;AAEH,eAAe,IAAI,CAAC"}
|