@zintrust/core 0.1.22 → 0.1.23
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 +1 -1
- package/bin/z.js +1 -1
- package/bin/zin.d.ts +1 -1
- package/bin/zin.js +1 -1
- package/bin/zintrust-main.d.ts +1 -1
- package/bin/zintrust-main.js +2 -2
- package/bin/zintrust-microservices.d.ts +1 -1
- package/bin/zintrust-microservices.js +1 -1
- package/bin/zintrust.d.ts +1 -1
- package/bin/zintrust.js +1 -1
- package/bin/zt.d.ts +1 -1
- package/bin/zt.js +1 -1
- package/package.json +2 -3
- package/public/index.html +3 -3
- package/routes/api.js +1 -1
- package/routes/health.d.ts +3 -4
- package/routes/health.d.ts.map +1 -1
- package/routes/health.js +3 -125
- package/src/boot/Application.d.ts.map +1 -1
- package/src/boot/Application.js +11 -22
- package/src/boot/bootstrap.d.ts +1 -1
- package/src/boot/bootstrap.js +48 -7
- package/src/builder/BundleOptimizer.d.ts +1 -1
- package/src/builder/BundleOptimizer.js +1 -1
- package/src/cache/drivers/KVRemoteDriver.d.ts +1 -1
- package/src/cache/drivers/KVRemoteDriver.js +1 -1
- package/src/cli/CLI.d.ts.map +1 -1
- package/src/cli/CLI.js +15 -1
- package/src/cli/ErrorHandler.js +3 -3
- package/src/cli/commands/AddCommand.d.ts +1 -1
- package/src/cli/commands/AddCommand.d.ts.map +1 -1
- package/src/cli/commands/AddCommand.js +1 -1
- package/src/cli/commands/DbSeedCommand.js +1 -1
- package/src/cli/commands/MakeMailTemplateCommand.js +2 -1
- package/src/cli/commands/MakeNotificationTemplateCommand.js +2 -1
- package/src/cli/commands/MigrateWorkerCommand.d.ts +9 -0
- package/src/cli/commands/MigrateWorkerCommand.d.ts.map +1 -0
- package/src/cli/commands/MigrateWorkerCommand.js +182 -0
- package/src/cli/commands/NewCommand.d.ts +1 -1
- package/src/cli/commands/NewCommand.d.ts.map +1 -1
- package/src/cli/commands/NewCommand.js +21 -7
- package/src/cli/commands/PublishCommand.d.ts +5 -0
- package/src/cli/commands/PublishCommand.d.ts.map +1 -0
- package/src/cli/commands/PublishCommand.js +54 -0
- package/src/cli/commands/QACommand.js +4 -4
- package/src/cli/commands/ResourceControlCommand.d.ts +6 -0
- package/src/cli/commands/ResourceControlCommand.d.ts.map +1 -0
- package/src/cli/commands/ResourceControlCommand.js +43 -0
- package/src/cli/commands/SimulateCommand.d.ts +1 -1
- package/src/cli/commands/SimulateCommand.js +4 -4
- package/src/cli/commands/StartCommand.d.ts.map +1 -1
- package/src/cli/commands/StartCommand.js +19 -7
- package/src/cli/commands/UpgradeCommand.d.ts +1 -1
- package/src/cli/commands/UpgradeCommand.js +2 -2
- package/src/cli/commands/WorkerCommands.d.ts +17 -0
- package/src/cli/commands/WorkerCommands.d.ts.map +1 -0
- package/src/cli/commands/WorkerCommands.js +264 -0
- package/src/cli/commands/index.d.ts +2 -0
- package/src/cli/commands/index.d.ts.map +1 -1
- package/src/cli/commands/index.js +2 -0
- package/src/cli/config/ConfigSchema.d.ts +1 -1
- package/src/cli/config/ConfigSchema.d.ts.map +1 -1
- package/src/cli/config/ConfigSchema.js +4 -3
- package/src/cli/scaffolding/ProjectScaffolder.js +5 -5
- package/src/cli/scaffolding/RouteGenerator.d.ts.map +1 -1
- package/src/cli/scaffolding/RouteGenerator.js +21 -2
- package/src/cli/scaffolding/TemplateEngine.js +1 -1
- package/src/cli/utils/EnvFileLoader.d.ts.map +1 -1
- package/src/common/ExternalServiceUtils.d.ts +63 -0
- package/src/common/ExternalServiceUtils.d.ts.map +1 -0
- package/src/common/ExternalServiceUtils.js +116 -0
- package/src/common/HealthRoutes.d.ts +10 -0
- package/src/common/HealthRoutes.d.ts.map +1 -0
- package/src/common/HealthRoutes.js +114 -0
- package/src/config/SecretsManager.d.ts.map +1 -1
- package/src/config/SecretsManager.js +2 -1
- package/src/config/app.d.ts +2 -1
- package/src/config/app.d.ts.map +1 -1
- package/src/config/app.js +98 -52
- package/src/config/broadcast.d.ts.map +1 -1
- package/src/config/broadcast.js +1 -1
- package/src/config/cache.d.ts.map +1 -1
- package/src/config/cache.js +2 -2
- package/src/config/database.d.ts.map +1 -1
- package/src/config/database.js +24 -5
- package/src/config/env.d.ts +43 -1
- package/src/config/env.d.ts.map +1 -1
- package/src/config/env.js +68 -21
- package/src/config/index.d.ts +10 -1
- package/src/config/index.d.ts.map +1 -1
- package/src/config/index.js +1 -0
- package/src/config/mail.d.ts.map +1 -1
- package/src/config/mail.js +3 -3
- package/src/config/middleware.d.ts.map +1 -1
- package/src/config/middleware.js +1 -1
- package/src/config/notification.d.ts.map +1 -1
- package/src/config/notification.js +2 -2
- package/src/config/queue.d.ts +14 -0
- package/src/config/queue.d.ts.map +1 -1
- package/src/config/queue.js +61 -36
- package/src/config/security.js +2 -2
- package/src/config/storage.d.ts.map +1 -1
- package/src/config/storage.js +1 -1
- package/src/config/type.d.ts +111 -0
- package/src/config/type.d.ts.map +1 -1
- package/src/config/workers.d.ts +13 -0
- package/src/config/workers.d.ts.map +1 -0
- package/src/config/workers.js +173 -0
- package/src/database/Paginator.d.ts +37 -0
- package/src/database/Paginator.d.ts.map +1 -0
- package/src/database/Paginator.js +81 -0
- package/src/exceptions/ZintrustError.d.ts +5 -2
- package/src/exceptions/ZintrustError.d.ts.map +1 -1
- package/src/exceptions/ZintrustError.js +6 -2
- package/src/features/Auth.d.ts +1 -1
- package/src/features/Auth.d.ts.map +1 -1
- package/src/features/Auth.js +3 -2
- package/src/features/Queue.d.ts.map +1 -1
- package/src/features/Queue.js +0 -2
- package/src/index.d.ts +15 -5
- package/src/index.d.ts.map +1 -1
- package/src/index.js +24 -3
- package/src/microservices/MicroserviceBootstrap.d.ts.map +1 -1
- package/src/microservices/MicroserviceBootstrap.js +3 -1
- package/src/microservices/MicroserviceGenerator.js +4 -4
- package/src/microservices/MicroserviceManager.d.ts +1 -1
- package/src/microservices/MicroserviceManager.js +1 -1
- package/src/middleware/RateLimiter.d.ts.map +1 -1
- package/src/middleware/RateLimiter.js +4 -3
- package/src/node-singletons/crypto.d.ts +1 -1
- package/src/node-singletons/crypto.d.ts.map +1 -1
- package/src/node-singletons/crypto.js +1 -1
- package/src/node-singletons/os.d.ts +10 -1
- package/src/node-singletons/os.d.ts.map +1 -1
- package/src/node-singletons/os.js +10 -1
- package/src/openapi/OpenApiGenerator.js +2 -2
- package/src/orm/ConnectionManager.d.ts +1 -1
- package/src/orm/ConnectionManager.d.ts.map +1 -1
- package/src/orm/ConnectionManager.js +37 -19
- package/src/orm/Model.d.ts +8 -1
- package/src/orm/Model.d.ts.map +1 -1
- package/src/orm/Model.js +85 -24
- package/src/orm/QueryBuilder.d.ts +12 -2
- package/src/orm/QueryBuilder.d.ts.map +1 -1
- package/src/orm/QueryBuilder.js +438 -38
- package/src/orm/Relationships.d.ts +61 -1
- package/src/orm/Relationships.d.ts.map +1 -1
- package/src/orm/Relationships.js +190 -0
- package/src/orm/adapters/D1RemoteAdapter.d.ts +1 -1
- package/src/orm/adapters/D1RemoteAdapter.js +1 -1
- package/src/performance/Optimizer.d.ts.map +1 -1
- package/src/performance/Optimizer.js +2 -4
- package/src/routing/CoreRoutes.d.ts +1 -1
- package/src/routing/CoreRoutes.d.ts.map +1 -1
- package/src/routing/CoreRoutes.js +2 -116
- package/src/routing/error.d.ts.map +1 -1
- package/src/routing/error.js +3 -2
- package/src/routing/publicRoot.d.ts.map +1 -1
- package/src/routing/publicRoot.js +4 -2
- package/src/runtime/PluginAutoImports.d.ts.map +1 -1
- package/src/runtime/PluginAutoImports.js +20 -4
- package/src/runtime/PluginManager.d.ts.map +1 -1
- package/src/runtime/PluginManager.js +23 -6
- package/src/runtime/RuntimeAdapter.d.ts +3 -3
- package/src/runtime/RuntimeAdapter.d.ts.map +1 -1
- package/src/runtime/StartupConfigFileRegistry.d.ts +2 -1
- package/src/runtime/StartupConfigFileRegistry.d.ts.map +1 -1
- package/src/runtime/StartupConfigFileRegistry.js +2 -1
- package/src/runtime/adapters/CloudflareAdapter.d.ts.map +1 -1
- package/src/runtime/adapters/CloudflareAdapter.js +1 -1
- package/src/runtime/adapters/DenoAdapter.d.ts.map +1 -1
- package/src/runtime/adapters/DenoAdapter.js +1 -1
- package/src/runtime/adapters/FargateAdapter.d.ts +2 -2
- package/src/runtime/adapters/FargateAdapter.d.ts.map +1 -1
- package/src/runtime/adapters/FargateAdapter.js +1 -1
- package/src/runtime/adapters/LambdaAdapter.d.ts +1 -1
- package/src/runtime/adapters/LambdaAdapter.d.ts.map +1 -1
- package/src/runtime/adapters/LambdaAdapter.js +6 -4
- package/src/runtime/adapters/NodeServerAdapter.js +1 -1
- package/src/scripts/GenerateEnvArtifacts.js +1 -1
- package/src/security/SignedRequest.js +1 -1
- package/src/security/StartupSecretValidation.d.ts.map +1 -1
- package/src/security/StartupSecretValidation.js +7 -1
- package/src/start.d.ts.map +1 -1
- package/src/start.js +0 -2
- package/src/templates/features/Auth.ts.tpl +4 -4
- package/src/templates/project/basic/README.md.tpl +1 -1
- package/src/templates/project/basic/app/Middleware/index.ts.tpl +1 -1
- package/src/templates/project/basic/config/notification.ts.tpl +1 -1
- package/src/templates/project/basic/routes/api.ts.tpl +1 -3
- package/src/templates/project/basic/src/index.ts.tpl +1 -1
- package/src/templates/project/basic/src/zintrust.plugins.ts.tpl +1 -1
- package/src/templates/project/basic/template.json +1 -1
- package/src/toolkit/Secrets/index.d.ts.map +1 -1
- package/src/toolkit/Secrets/index.js +13 -9
- package/src/toolkit/Secrets/providers/AwsSecretsManager.d.ts.map +1 -1
- package/src/toolkit/Secrets/providers/AwsSecretsManager.js +20 -7
- package/src/toolkit/Secrets/providers/CloudflareKv.d.ts.map +1 -1
- package/src/toolkit/Secrets/providers/CloudflareKv.js +19 -6
- package/src/tools/http/Http.js +1 -1
- package/src/tools/mail/drivers/Ses.d.ts.map +1 -1
- package/src/tools/mail/drivers/Ses.js +5 -4
- package/src/tools/mail/templates/index.js +2 -2
- package/src/tools/notification/drivers/Termii.d.ts.map +1 -1
- package/src/tools/notification/drivers/Termii.js +6 -17
- package/src/tools/notification/testingHelpers.d.ts.map +1 -1
- package/src/tools/queue/Queue.d.ts.map +1 -1
- package/src/tools/queue/Queue.js +3 -5
- package/src/tools/queue/drivers/Redis.d.ts.map +1 -1
- package/src/tools/queue/drivers/Redis.js +7 -1
- package/src/tools/storage/drivers/S3.d.ts.map +1 -1
- package/src/tools/storage/drivers/S3.js +16 -3
- package/src/routes/health.d.ts +0 -2
- package/src/routes/health.d.ts.map +0 -1
- package/src/routes/health.js +0 -1
- package/src/runtime/RuntimeDetector.d.ts +0 -15
- package/src/runtime/RuntimeDetector.d.ts.map +0 -1
- package/src/runtime/RuntimeDetector.js +0 -271
- package/src/templates/project/basic/routes/health.ts.tpl +0 -143
- package/src/templates/project/basic/routes/metrics.ts.tpl +0 -22
- package/src/workers/BroadcastWorker.d.ts +0 -22
- package/src/workers/BroadcastWorker.d.ts.map +0 -1
- package/src/workers/BroadcastWorker.js +0 -24
- package/src/workers/NotificationWorker.d.ts +0 -22
- package/src/workers/NotificationWorker.d.ts.map +0 -1
- package/src/workers/NotificationWorker.js +0 -23
- package/src/workers/createQueueWorker.d.ts +0 -24
- package/src/workers/createQueueWorker.d.ts.map +0 -1
- package/src/workers/createQueueWorker.js +0 -114
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DenoAdapter.d.ts","sourceRoot":"","sources":["../../../../src/runtime/adapters/DenoAdapter.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,aAAa,EAGb,cAAc,
|
|
1
|
+
{"version":3,"file":"DenoAdapter.d.ts","sourceRoot":"","sources":["../../../../src/runtime/adapters/DenoAdapter.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,aAAa,EAGb,cAAc,EACf,MAAM,yBAAyB,CAAC;AAGjC;;;GAGG;AACH,eAAO,MAAM,WAAW;IACtB;;OAEG;mBACY,aAAa,GAAG,cAAc,GAAG;QAC9C,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;KAC1D;IAwDD;;OAEG;yBAEQ,cAAc,SACjB,MAAM,SACN,MAAM,GACX,OAAO,CAAC,IAAI,CAAC;IAQhB;;OAEG;aACY,OAAO,CAAC,OAAO,CAAC;IAK/B;;OAEG;mBACY,MAAM,iBAAiB,MAAM,GAAG,MAAM;IAKrD;;OAEG;2BACoB,OAAO;EAI9B,CAAC"}
|
|
@@ -176,7 +176,7 @@ function getDenoEnvironment() {
|
|
|
176
176
|
// @ts-ignore - Deno.env is available in Deno runtime
|
|
177
177
|
const env = (typeof Deno === 'undefined' ? {} : (Deno.env.toObject?.() ?? {}));
|
|
178
178
|
return {
|
|
179
|
-
nodeEnv: env['DENO_ENV'] ?? 'production',
|
|
179
|
+
nodeEnv: (env['DENO_ENV'] ?? 'production'),
|
|
180
180
|
runtime: 'deno',
|
|
181
181
|
dbConnection: env['DB_CONNECTION'] ?? 'postgresql',
|
|
182
182
|
dbHost: env['DB_HOST'],
|
|
@@ -2,7 +2,7 @@ import { type IncomingMessage, type Server, type ServerResponse } from '../../no
|
|
|
2
2
|
import type { AdapterConfig, RuntimeAdapter } from '../RuntimeAdapter';
|
|
3
3
|
export interface FargateEnvironment {
|
|
4
4
|
[key: string]: unknown;
|
|
5
|
-
nodeEnv:
|
|
5
|
+
nodeEnv: NodeJS.ProcessEnv['NODE_ENV'];
|
|
6
6
|
runtime: string;
|
|
7
7
|
dbConnection: string;
|
|
8
8
|
dbHost: string | undefined;
|
|
@@ -17,7 +17,7 @@ export declare function createFargateAdapter(config: AdapterConfig): RuntimeAdap
|
|
|
17
17
|
stop(): Promise<void>;
|
|
18
18
|
};
|
|
19
19
|
/**
|
|
20
|
-
* Fargate/Container adapter for running
|
|
20
|
+
* Fargate/Container adapter for running ZinTrust in AWS Fargate, Cloud Run, or Docker
|
|
21
21
|
* Wraps existing Node.js HTTP server for container orchestration
|
|
22
22
|
* Sealed namespace for immutability
|
|
23
23
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FargateAdapter.d.ts","sourceRoot":"","sources":["../../../../src/runtime/adapters/FargateAdapter.ts"],"names":[],"mappings":"AAUA,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,MAAM,EACX,KAAK,cAAc,EACpB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EACV,aAAa,EAGb,cAAc,EACf,MAAM,yBAAyB,CAAC;AAEjC,MAAM,WAAW,kBAAkB;IACjC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"FargateAdapter.d.ts","sourceRoot":"","sources":["../../../../src/runtime/adapters/FargateAdapter.ts"],"names":[],"mappings":"AAUA,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,MAAM,EACX,KAAK,cAAc,EACpB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EACV,aAAa,EAGb,cAAc,EACf,MAAM,yBAAyB,CAAC;AAEjC,MAAM,WAAW,kBAAkB;IACjC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,iBAAiB,GAAG,CAC9B,eAAe,EAAE,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,KAAK,IAAI,KACjE,MAAM,CAAC;AAEZ,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa,GAAG,cAAc,GAAG;IAC5E,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB,CA0DA;AAED;;;;GAIG;AACH,eAAO,MAAM,cAAc;;EAEzB,CAAC;AAEH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,mBAAmB,EAC1B,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,EAC/B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,aAAa,GAAE,iBAAgC,GAC9C,OAAO,CAAC,IAAI,CAAC,CAgBf;AAED,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,mBAAmB,EAC1B,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,GAC9B,OAAO,CAAC,IAAI,CAAC,CAgBf;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAgB1F;AAED,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,EAC/B,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,GAClB,OAAO,CAAC,IAAI,CAAC,CAuBf;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,CAIpD;AAED,wBAAgB,0BAA0B,IAAI,aAAa,CAAC,QAAQ,CAAC,CAUpE"}
|
|
@@ -56,7 +56,7 @@ export function createFargateAdapter(config) {
|
|
|
56
56
|
};
|
|
57
57
|
}
|
|
58
58
|
/**
|
|
59
|
-
* Fargate/Container adapter for running
|
|
59
|
+
* Fargate/Container adapter for running ZinTrust in AWS Fargate, Cloud Run, or Docker
|
|
60
60
|
* Wraps existing Node.js HTTP server for container orchestration
|
|
61
61
|
* Sealed namespace for immutability
|
|
62
62
|
*/
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { AdapterConfig, RuntimeAdapter } from '../RuntimeAdapter';
|
|
2
2
|
/**
|
|
3
3
|
* AWS Lambda adapter for API Gateway and ALB events
|
|
4
|
-
* Converts Lambda events to standard HTTP format for
|
|
4
|
+
* Converts Lambda events to standard HTTP format for ZinTrust framework
|
|
5
5
|
* Sealed namespace for immutability
|
|
6
6
|
*/
|
|
7
7
|
export declare const LambdaAdapter: Readonly<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LambdaAdapter.d.ts","sourceRoot":"","sources":["../../../../src/runtime/adapters/LambdaAdapter.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EACV,aAAa,EAGb,cAAc,
|
|
1
|
+
{"version":3,"file":"LambdaAdapter.d.ts","sourceRoot":"","sources":["../../../../src/runtime/adapters/LambdaAdapter.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EACV,aAAa,EAGb,cAAc,EACf,MAAM,yBAAyB,CAAC;AAGjC;;;;GAIG;AACH,eAAO,MAAM,aAAa;IACxB;;OAEG;mBACY,aAAa,GAAG,cAAc;EA8D7C,CAAC"}
|
|
@@ -7,7 +7,7 @@ import { IncomingMessage, ServerResponse, } from '../../node-singletons/http.js'
|
|
|
7
7
|
import { ErrorResponse, HttpResponse } from '../RuntimeAdapter.js';
|
|
8
8
|
/**
|
|
9
9
|
* AWS Lambda adapter for API Gateway and ALB events
|
|
10
|
-
* Converts Lambda events to standard HTTP format for
|
|
10
|
+
* Converts Lambda events to standard HTTP format for ZinTrust framework
|
|
11
11
|
* Sealed namespace for immutability
|
|
12
12
|
*/
|
|
13
13
|
export const LambdaAdapter = Object.freeze({
|
|
@@ -75,7 +75,7 @@ async function handleLambdaRequest(adapter, config, event, _context) {
|
|
|
75
75
|
}));
|
|
76
76
|
}, timeout);
|
|
77
77
|
try {
|
|
78
|
-
// Process request through
|
|
78
|
+
// Process request through ZinTrust handler
|
|
79
79
|
await config.handler(req, res, body);
|
|
80
80
|
}
|
|
81
81
|
finally {
|
|
@@ -95,8 +95,10 @@ async function handleLambdaRequest(adapter, config, event, _context) {
|
|
|
95
95
|
}
|
|
96
96
|
catch (error) {
|
|
97
97
|
Logger.error('Lambda handler error', error);
|
|
98
|
-
const nodeEnv = typeof Env.NODE_ENV === 'string' && Env.NODE_ENV !== ''
|
|
99
|
-
|
|
98
|
+
const nodeEnv = typeof Env.NODE_ENV === 'string' && String(Env.NODE_ENV) !== ''
|
|
99
|
+
? Env.NODE_ENV
|
|
100
|
+
: 'development';
|
|
101
|
+
const includeDetails = nodeEnv === 'development' || String(nodeEnv) === 'dev';
|
|
100
102
|
const errorResponse = ErrorResponse.create(500, 'Internal Server Error', includeDetails ? { message: error.message } : undefined);
|
|
101
103
|
return errorResponse.toResponse();
|
|
102
104
|
}
|
|
@@ -112,7 +112,7 @@ const renderEnvDts = (keys) => {
|
|
|
112
112
|
return `declare namespace NodeJS {\n interface ProcessEnv {\n NODE_ENV: 'development' | 'production' | 'testing' | undefined;\n\n${lines}\n }\n}\n`;
|
|
113
113
|
};
|
|
114
114
|
const renderEnvExample = (keys) => {
|
|
115
|
-
const header = `#
|
|
115
|
+
const header = `# ZinTrust Framework - Environment Configuration\n# Generated by src/scripts/GenerateEnvArtifacts.ts\n# Copy this file to .env and configure for your environment\n\n`;
|
|
116
116
|
const sortedKeys = keys.toSorted((a, b) => a.localeCompare(b));
|
|
117
117
|
const body = sortedKeys
|
|
118
118
|
.filter((k) => k !== 'NODE_ENV')
|
|
@@ -18,7 +18,7 @@ const timingSafeEquals = (a, b) => {
|
|
|
18
18
|
const getCrypto = () => {
|
|
19
19
|
if (typeof crypto === 'undefined' || crypto.subtle === undefined) {
|
|
20
20
|
// Some runtimes (or test environments) may not expose WebCrypto.
|
|
21
|
-
// Keep this as a typed
|
|
21
|
+
// Keep this as a typed ZinTrust error to satisfy lint rules.
|
|
22
22
|
throw ErrorFactory.createSecurityError('WebCrypto is not available in this runtime');
|
|
23
23
|
}
|
|
24
24
|
return crypto;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StartupSecretValidation.d.ts","sourceRoot":"","sources":["../../../src/security/StartupSecretValidation.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,MAAM,MAAM,4BAA4B,GAAG;IACzC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG;IAC1C,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,4BAA4B,EAAE,CAAC;CACxC,CAAC;
|
|
1
|
+
{"version":3,"file":"StartupSecretValidation.d.ts","sourceRoot":"","sources":["../../../src/security/StartupSecretValidation.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,MAAM,MAAM,4BAA4B,GAAG;IACzC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG;IAC1C,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,4BAA4B,EAAE,CAAC;CACxC,CAAC;AAgHF,eAAO,MAAM,uBAAuB;gBACtB,6BAA6B;mBAiB1B,IAAI;EAQnB,CAAC;AAEH,eAAe,uBAAuB,CAAC"}
|
|
@@ -25,8 +25,14 @@ const validateJwtSecret = () => {
|
|
|
25
25
|
return null;
|
|
26
26
|
try {
|
|
27
27
|
const secret = securityConfig.jwt.secret.trim();
|
|
28
|
+
const appKey = (Env.APP_KEY ?? '').trim();
|
|
28
29
|
if (secret.length === 0) {
|
|
29
|
-
|
|
30
|
+
if (appKey.length > 0)
|
|
31
|
+
return null;
|
|
32
|
+
return {
|
|
33
|
+
key: 'JWT_SECRET',
|
|
34
|
+
message: 'JWT_SECRET must be set when JWT is enabled (or provide APP_KEY)',
|
|
35
|
+
};
|
|
30
36
|
}
|
|
31
37
|
return null;
|
|
32
38
|
}
|
package/src/start.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/start.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/start.ts"],"names":[],"mappings":"AAsBA,eAAO,MAAM,UAAU,GAAI,eAAe,MAAM,KAAG,OAYlD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,KAAK,QAAa,OAAO,CAAC,IAAI,CAO1C,CAAC;AAEF;;GAEG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAEhD,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEpE;;GAEG;AACH,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAElD;;GAEG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC"}
|
package/src/start.js
CHANGED
|
@@ -36,14 +36,12 @@ export const isNodeMain = (importMetaUrl) => {
|
|
|
36
36
|
* This uses a non-literal dynamic import so Worker bundlers don't pull Node-only modules.
|
|
37
37
|
*/
|
|
38
38
|
export const start = async () => {
|
|
39
|
-
/* c8 ignore start */
|
|
40
39
|
if (!isNodeRuntime())
|
|
41
40
|
return;
|
|
42
41
|
// Compiled output places bootstrap at `dist/src/boot/bootstrap.js`.
|
|
43
42
|
// This file compiles to `dist/src/start.js`, so relative import is stable.
|
|
44
43
|
// In unit tests, importing bootstrap has heavy side effects (starts server + exits).
|
|
45
44
|
await import('./boot/' + 'bootstrap.js');
|
|
46
|
-
/* c8 ignore stop */
|
|
47
45
|
};
|
|
48
46
|
/**
|
|
49
47
|
* Cloudflare Workers entry (module worker style).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// TEMPLATE_START
|
|
2
2
|
import * as bcrypt from 'bcrypt';
|
|
3
|
-
import
|
|
3
|
+
import jwt, { type Secret, type SignOptions } from 'jsonwebtoken';
|
|
4
4
|
|
|
5
5
|
export const Auth = Object.freeze({
|
|
6
6
|
/**
|
|
@@ -27,14 +27,14 @@ export const Auth = Object.freeze({
|
|
|
27
27
|
expiresIn: NonNullable<SignOptions['expiresIn']> = '1h'
|
|
28
28
|
): string {
|
|
29
29
|
const options: SignOptions = { expiresIn };
|
|
30
|
-
return sign(payload, secret, options);
|
|
30
|
+
return jwt.sign(payload, secret, options);
|
|
31
31
|
},
|
|
32
32
|
|
|
33
33
|
/**
|
|
34
34
|
* Verify a JWT token
|
|
35
35
|
*/
|
|
36
36
|
verifyToken<T>(token: string, secret: Secret): T {
|
|
37
|
-
return verify(token, secret) as T;
|
|
37
|
+
return jwt.verify(token, secret) as T;
|
|
38
38
|
},
|
|
39
39
|
});
|
|
40
|
-
// TEMPLATE_END
|
|
40
|
+
// TEMPLATE_END
|
|
@@ -17,7 +17,7 @@ export default {
|
|
|
17
17
|
termii: {
|
|
18
18
|
driver: 'termii' as const,
|
|
19
19
|
apiKey: Env.get('TERMII_API_KEY', ''),
|
|
20
|
-
sender: Env.get('TERMII_SENDER', '
|
|
20
|
+
sender: Env.get('TERMII_SENDER', 'ZinTrust'),
|
|
21
21
|
endpoint: Env.get('TERMII_ENDPOINT', 'https://api.termii.com/sms/send'),
|
|
22
22
|
},
|
|
23
23
|
twilio: {
|
|
@@ -8,7 +8,6 @@ import { UserQueryBuilderController } from '@app/Controllers/UserQueryBuilderCon
|
|
|
8
8
|
import { Env , Router } from '@zintrust/core';
|
|
9
9
|
import type { MiddlewareKey , IRouter , IResponse, IRequest} from '@zintrust/core';
|
|
10
10
|
import { registerBroadcastRoutes } from '@routes/broadcast';
|
|
11
|
-
import { registerHealthRoutes } from '@routes/health';
|
|
12
11
|
import { registerStorageRoutes } from '@routes/storage';
|
|
13
12
|
|
|
14
13
|
export function registerRoutes(router: IRouter): void {
|
|
@@ -24,7 +23,6 @@ export function registerRoutes(router: IRouter): void {
|
|
|
24
23
|
*/
|
|
25
24
|
function registerPublicRoutes(router: IRouter): void {
|
|
26
25
|
registerRootRoute(router);
|
|
27
|
-
registerHealthRoutes(router);
|
|
28
26
|
registerBroadcastRoutes(router);
|
|
29
27
|
registerStorageRoutes(router);
|
|
30
28
|
}
|
|
@@ -32,7 +30,7 @@ function registerPublicRoutes(router: IRouter): void {
|
|
|
32
30
|
function registerRootRoute(router: IRouter): void {
|
|
33
31
|
Router.get(router, '/', async (_req: IRequest, res:IResponse) => {
|
|
34
32
|
res.json({
|
|
35
|
-
framework: '
|
|
33
|
+
framework: 'ZinTrust Framework',
|
|
36
34
|
app_name: Env.APP_NAME,
|
|
37
35
|
version: '0.1.0',
|
|
38
36
|
env: Env.NODE_ENV ?? 'development',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/toolkit/Secrets/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/toolkit/Secrets/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,EAAY,KAAK,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAI/E,YAAY,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAErE,MAAM,MAAM,WAAW,GAAG;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAC/B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAC/B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,EAAE,mBAAmB,CAAC;CAChC,CAAC;AA+GF,eAAO,MAAM,cAAc;kBACL,WAAW,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;kBAe1D,WAAW,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;oBAiB7D,aAAa,GAAG;QAC9B,QAAQ,EAAE,mBAAmB,CAAC;QAC9B,EAAE,EAAE,OAAO,CAAC;QACZ,OAAO,EAAE,MAAM,EAAE,CAAC;KACnB;EAMD,CAAC;AAEH,eAAe,cAAc,CAAC"}
|
|
@@ -4,19 +4,26 @@
|
|
|
4
4
|
* Internal framework module intended for CLI usage.
|
|
5
5
|
* It may use Node APIs (via node-singletons) and should not be used by runtime apps.
|
|
6
6
|
*/
|
|
7
|
+
import { Env } from '../../config/env.js';
|
|
7
8
|
import { ErrorFactory } from '../../exceptions/ZintrustError.js';
|
|
8
9
|
import { EnvFile } from '../Secrets/EnvFile.js';
|
|
9
10
|
import { Manifest } from '../Secrets/Manifest.js';
|
|
10
11
|
import { AwsSecretsManager } from '../Secrets/providers/AwsSecretsManager.js';
|
|
11
12
|
import { CloudflareKv } from '../Secrets/providers/CloudflareKv.js';
|
|
13
|
+
const resolveDefaultEnvFile = () => Env.ZINTRUST_ENV_FILE;
|
|
14
|
+
const resolveDefaultManifest = () => Env.ZINTRUST_SECRETS_MANIFEST;
|
|
15
|
+
const resolveDefaultInFile = () => Env.ZINTRUST_ENV_IN_FILE;
|
|
16
|
+
const resolveSecretsProvider = () => {
|
|
17
|
+
return Env.ZINTRUST_SECRETS_PROVIDER;
|
|
18
|
+
};
|
|
12
19
|
const resolveProvider = (provider) => {
|
|
13
20
|
if (provider === 'aws' || provider === 'cloudflare')
|
|
14
21
|
return provider;
|
|
15
22
|
throw ErrorFactory.createCliError('Missing/invalid provider. Use --provider aws|cloudflare or set ZINTRUST_SECRETS_PROVIDER.');
|
|
16
23
|
};
|
|
17
|
-
const resolveOutFile = (outFile) => outFile ??
|
|
18
|
-
const resolveManifestPath = (manifestPath) => manifestPath ??
|
|
19
|
-
const resolveInFile = (inFile) => inFile ??
|
|
24
|
+
const resolveOutFile = (outFile) => outFile ?? resolveDefaultEnvFile();
|
|
25
|
+
const resolveManifestPath = (manifestPath) => manifestPath ?? resolveDefaultManifest();
|
|
26
|
+
const resolveInFile = (inFile) => inFile ?? resolveDefaultInFile();
|
|
20
27
|
const pullAws = async (manifest) => {
|
|
21
28
|
const client = AwsSecretsManager.createFromEnv();
|
|
22
29
|
const entries = Object.entries(manifest.keys).filter(([, spec]) => spec.aws !== undefined);
|
|
@@ -85,8 +92,7 @@ const pushCloudflare = async (manifest, env, dryRun) => {
|
|
|
85
92
|
};
|
|
86
93
|
export const SecretsToolkit = Object.freeze({
|
|
87
94
|
async pull(options) {
|
|
88
|
-
const provider = resolveProvider(options.provider ??
|
|
89
|
-
process.env['ZINTRUST_SECRETS_PROVIDER']);
|
|
95
|
+
const provider = resolveProvider(options.provider ?? resolveSecretsProvider());
|
|
90
96
|
const outFile = resolveOutFile(options.outFile);
|
|
91
97
|
const manifestPath = resolveManifestPath(options.manifestPath);
|
|
92
98
|
const manifest = await Manifest.load({ cwd: options.cwd, path: manifestPath, provider });
|
|
@@ -97,8 +103,7 @@ export const SecretsToolkit = Object.freeze({
|
|
|
97
103
|
return { outFile, keys: Object.keys(resolved) };
|
|
98
104
|
},
|
|
99
105
|
async push(options) {
|
|
100
|
-
const provider = resolveProvider(options.provider ??
|
|
101
|
-
process.env['ZINTRUST_SECRETS_PROVIDER']);
|
|
106
|
+
const provider = resolveProvider(options.provider ?? resolveSecretsProvider());
|
|
102
107
|
const inFile = resolveInFile(options.inFile);
|
|
103
108
|
const manifestPath = resolveManifestPath(options.manifestPath);
|
|
104
109
|
const manifest = await Manifest.load({ cwd: options.cwd, path: manifestPath, provider });
|
|
@@ -110,8 +115,7 @@ export const SecretsToolkit = Object.freeze({
|
|
|
110
115
|
return { inFile, keys };
|
|
111
116
|
},
|
|
112
117
|
doctor(options) {
|
|
113
|
-
const provider = resolveProvider(options.provider ??
|
|
114
|
-
process.env['ZINTRUST_SECRETS_PROVIDER']);
|
|
118
|
+
const provider = resolveProvider(options.provider ?? resolveSecretsProvider());
|
|
115
119
|
const missing = provider === 'aws' ? AwsSecretsManager.doctorEnv() : CloudflareKv.doctorEnv();
|
|
116
120
|
return { provider, ok: missing.length === 0, missing };
|
|
117
121
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AwsSecretsManager.d.ts","sourceRoot":"","sources":["../../../../../src/toolkit/Secrets/providers/AwsSecretsManager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AwsSecretsManager.d.ts","sourceRoot":"","sources":["../../../../../src/toolkit/Secrets/providers/AwsSecretsManager.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,cAAc,GAAG;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAqHF,eAAO,MAAM,iBAAiB;qBACX;QACf,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;QACzE,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;KAC9D;iBAsDY,MAAM,EAAE;EAcrB,CAAC;AAEH,eAAe,iBAAiB,CAAC"}
|
|
@@ -1,6 +1,19 @@
|
|
|
1
1
|
import { AwsSigV4 } from '../../../common/index.js';
|
|
2
|
+
import { Env } from '../../../config/env.js';
|
|
2
3
|
import { ErrorFactory } from '../../../exceptions/ZintrustError.js';
|
|
3
4
|
const sha256Hex = (data) => AwsSigV4.sha256Hex(data);
|
|
5
|
+
const readEnvString = (key) => {
|
|
6
|
+
const anyEnv = Env;
|
|
7
|
+
const fromEnv = typeof anyEnv.get === 'function' ? anyEnv.get(key, '') : '';
|
|
8
|
+
if (typeof fromEnv === 'string' && fromEnv.trim() !== '')
|
|
9
|
+
return fromEnv;
|
|
10
|
+
if (typeof process !== 'undefined') {
|
|
11
|
+
const raw = process.env?.[key];
|
|
12
|
+
if (typeof raw === 'string')
|
|
13
|
+
return raw;
|
|
14
|
+
}
|
|
15
|
+
return fromEnv ?? '';
|
|
16
|
+
};
|
|
4
17
|
const buildAuthorization = (params) => {
|
|
5
18
|
const canonicalUri = '/';
|
|
6
19
|
const canonicalQueryString = '';
|
|
@@ -78,10 +91,10 @@ const requestAwsSecretsManager = async (region, credentials, target, body) => {
|
|
|
78
91
|
};
|
|
79
92
|
export const AwsSecretsManager = Object.freeze({
|
|
80
93
|
createFromEnv() {
|
|
81
|
-
const region =
|
|
82
|
-
const accessKeyId =
|
|
83
|
-
const secretAccessKey =
|
|
84
|
-
const sessionToken =
|
|
94
|
+
const region = readEnvString('AWS_REGION') || readEnvString('AWS_DEFAULT_REGION');
|
|
95
|
+
const accessKeyId = readEnvString('AWS_ACCESS_KEY_ID');
|
|
96
|
+
const secretAccessKey = readEnvString('AWS_SECRET_ACCESS_KEY');
|
|
97
|
+
const sessionToken = readEnvString('AWS_SESSION_TOKEN') || undefined;
|
|
85
98
|
if (region.trim() === '' || accessKeyId.trim() === '' || secretAccessKey.trim() === '') {
|
|
86
99
|
throw ErrorFactory.createCliError('AWS credentials missing: set AWS_REGION, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY');
|
|
87
100
|
}
|
|
@@ -116,13 +129,13 @@ export const AwsSecretsManager = Object.freeze({
|
|
|
116
129
|
},
|
|
117
130
|
doctorEnv() {
|
|
118
131
|
const missing = [];
|
|
119
|
-
const region = (
|
|
132
|
+
const region = (readEnvString('AWS_REGION') || readEnvString('AWS_DEFAULT_REGION')).trim();
|
|
120
133
|
if (region === '')
|
|
121
134
|
missing.push('AWS_REGION');
|
|
122
|
-
const accessKeyId = (
|
|
135
|
+
const accessKeyId = readEnvString('AWS_ACCESS_KEY_ID').trim();
|
|
123
136
|
if (accessKeyId === '')
|
|
124
137
|
missing.push('AWS_ACCESS_KEY_ID');
|
|
125
|
-
const secretAccessKey = (
|
|
138
|
+
const secretAccessKey = readEnvString('AWS_SECRET_ACCESS_KEY').trim();
|
|
126
139
|
if (secretAccessKey === '')
|
|
127
140
|
missing.push('AWS_SECRET_ACCESS_KEY');
|
|
128
141
|
return missing;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CloudflareKv.d.ts","sourceRoot":"","sources":["../../../../../src/toolkit/Secrets/providers/CloudflareKv.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"CloudflareKv.d.ts","sourceRoot":"","sources":["../../../../../src/toolkit/Secrets/providers/CloudflareKv.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,YAAY;qBACN;QACf,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;QACxE,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;KAC/E;iBAiFY,MAAM,EAAE;EAgBrB,CAAC;AAEH,eAAe,YAAY,CAAC"}
|
|
@@ -1,9 +1,22 @@
|
|
|
1
|
+
import { Env } from '../../../config/env.js';
|
|
1
2
|
import { ErrorFactory } from '../../../exceptions/ZintrustError.js';
|
|
2
3
|
export const CloudflareKv = Object.freeze({
|
|
3
4
|
createFromEnv() {
|
|
4
|
-
const
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
const readEnvString = (key) => {
|
|
6
|
+
const anyEnv = Env;
|
|
7
|
+
const fromEnv = typeof anyEnv.get === 'function' ? anyEnv.get(key, '') : '';
|
|
8
|
+
if (typeof fromEnv === 'string' && fromEnv.trim() !== '')
|
|
9
|
+
return fromEnv;
|
|
10
|
+
if (typeof process !== 'undefined') {
|
|
11
|
+
const raw = process.env?.[key];
|
|
12
|
+
if (typeof raw === 'string')
|
|
13
|
+
return raw;
|
|
14
|
+
}
|
|
15
|
+
return fromEnv ?? '';
|
|
16
|
+
};
|
|
17
|
+
const accountId = readEnvString('CLOUDFLARE_ACCOUNT_ID');
|
|
18
|
+
const apiToken = readEnvString('CLOUDFLARE_API_TOKEN');
|
|
19
|
+
const defaultNamespaceId = readEnvString('CLOUDFLARE_KV_NAMESPACE_ID');
|
|
7
20
|
if (accountId.trim() === '' || apiToken.trim() === '') {
|
|
8
21
|
throw ErrorFactory.createCliError('Cloudflare credentials missing: set CLOUDFLARE_ACCOUNT_ID, CLOUDFLARE_API_TOKEN');
|
|
9
22
|
}
|
|
@@ -58,13 +71,13 @@ export const CloudflareKv = Object.freeze({
|
|
|
58
71
|
},
|
|
59
72
|
doctorEnv() {
|
|
60
73
|
const missing = [];
|
|
61
|
-
const accountId = (
|
|
74
|
+
const accountId = (Env.get?.('CLOUDFLARE_ACCOUNT_ID', '') ?? Env.CLOUDFLARE_ACCOUNT_ID).trim();
|
|
62
75
|
if (accountId === '')
|
|
63
76
|
missing.push('CLOUDFLARE_ACCOUNT_ID');
|
|
64
|
-
const apiToken = (
|
|
77
|
+
const apiToken = (Env.get?.('CLOUDFLARE_API_TOKEN', '') ?? Env.CLOUDFLARE_API_TOKEN).trim();
|
|
65
78
|
if (apiToken === '')
|
|
66
79
|
missing.push('CLOUDFLARE_API_TOKEN');
|
|
67
|
-
const namespaceId = (
|
|
80
|
+
const namespaceId = (Env.get?.('CLOUDFLARE_KV_NAMESPACE_ID', '') ?? Env.CLOUDFLARE_KV_NAMESPACE_ID).trim();
|
|
68
81
|
if (namespaceId === '')
|
|
69
82
|
missing.push('CLOUDFLARE_KV_NAMESPACE_ID');
|
|
70
83
|
return missing;
|
package/src/tools/http/Http.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Ses.d.ts","sourceRoot":"","sources":["../../../../../src/tools/mail/drivers/Ses.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Ses.d.ts","sourceRoot":"","sources":["../../../../../src/tools/mail/drivers/Ses.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,SAAS,GAAG;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACtB,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,EAAE,EAAE,OAAO,CAAC;IACZ,QAAQ,EAAE,KAAK,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAsGF,eAAO,MAAM,SAAS;iBACD,SAAS,WAAW,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;EAgDxE,CAAC;AAEH,eAAe,SAAS,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { readEnvString } from '../../../common/ExternalServiceUtils.js';
|
|
1
2
|
import { AwsSigV4 } from '../../../common/index.js';
|
|
2
3
|
import { ErrorFactory } from '../../../exceptions/ZintrustError.js';
|
|
3
4
|
const sha256Hex = (data) => AwsSigV4.sha256Hex(data);
|
|
@@ -33,10 +34,10 @@ const ensureRegion = (config) => {
|
|
|
33
34
|
return region;
|
|
34
35
|
};
|
|
35
36
|
const ensureCredentials = () => {
|
|
36
|
-
const accessKeyId =
|
|
37
|
-
const secretAccessKey =
|
|
38
|
-
const sessionToken =
|
|
39
|
-
if (accessKeyId.
|
|
37
|
+
const accessKeyId = readEnvString('AWS_ACCESS_KEY_ID');
|
|
38
|
+
const secretAccessKey = readEnvString('AWS_SECRET_ACCESS_KEY');
|
|
39
|
+
const sessionToken = readEnvString('AWS_SESSION_TOKEN') ?? undefined;
|
|
40
|
+
if (accessKeyId.length === 0 || secretAccessKey.length === 0) {
|
|
40
41
|
throw ErrorFactory.createConfigError('SES: missing AWS credentials (set AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY)');
|
|
41
42
|
}
|
|
42
43
|
return { accessKeyId, secretAccessKey, sessionToken };
|
|
@@ -28,8 +28,8 @@ export const MailTemplates = Object.freeze({
|
|
|
28
28
|
// Example template. Apps can add their own workflows under app/Toolkit/Mail.
|
|
29
29
|
welcome: Object.freeze({
|
|
30
30
|
subject: 'Welcome, {{name}}!',
|
|
31
|
-
text: 'Hi {{name}},\n\nWelcome to
|
|
32
|
-
html: '<p>Hi {{name}},</p><p>Welcome to
|
|
31
|
+
text: 'Hi {{name}},\n\nWelcome to ZinTrust.',
|
|
32
|
+
html: '<p>Hi {{name}},</p><p>Welcome to ZinTrust.</p>',
|
|
33
33
|
}),
|
|
34
34
|
}),
|
|
35
35
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Termii.d.ts","sourceRoot":"","sources":["../../../../../src/tools/notification/drivers/Termii.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Termii.d.ts","sourceRoot":"","sources":["../../../../../src/tools/notification/drivers/Termii.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,eAAO,MAAM,YAAY;oBACD,MAAM,WAAW,MAAM,YAAW,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;EA+B/E,CAAC;AAEH,eAAe,YAAY,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { readEnvString, safeFetch, validateRequiredParams } from '../../../common/ExternalServiceUtils.js';
|
|
1
2
|
import { ErrorFactory } from '../../../exceptions/ZintrustError.js';
|
|
2
3
|
/**
|
|
3
4
|
* Termii SMS Driver (skeleton)
|
|
@@ -6,14 +7,9 @@ import { ErrorFactory } from '../../../exceptions/ZintrustError.js';
|
|
|
6
7
|
*/
|
|
7
8
|
export const TermiiDriver = Object.freeze({
|
|
8
9
|
async send(recipient, message, options = {}) {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
if (!message || typeof message !== 'string') {
|
|
13
|
-
throw ErrorFactory.createValidationError('Message body is required');
|
|
14
|
-
}
|
|
15
|
-
const apiKey = process.env['TERMII_API_KEY'] ?? '';
|
|
16
|
-
const sender = process.env['TERMII_SENDER'] ?? 'Zintrust';
|
|
10
|
+
validateRequiredParams({ recipient, message }, ['recipient', 'message']);
|
|
11
|
+
const apiKey = readEnvString('TERMII_API_KEY');
|
|
12
|
+
const sender = readEnvString('TERMII_SENDER');
|
|
17
13
|
if (!apiKey) {
|
|
18
14
|
throw ErrorFactory.createConfigError('TERMII_API_KEY is not configured');
|
|
19
15
|
}
|
|
@@ -24,22 +20,15 @@ export const TermiiDriver = Object.freeze({
|
|
|
24
20
|
api_key: apiKey,
|
|
25
21
|
...options,
|
|
26
22
|
};
|
|
27
|
-
// Use
|
|
23
|
+
// Use shared fetch wrapper
|
|
28
24
|
const url = 'https://api.termii.com/sms/send';
|
|
29
|
-
const res = await
|
|
25
|
+
const res = await safeFetch(url, {
|
|
30
26
|
method: 'POST',
|
|
31
27
|
headers: {
|
|
32
28
|
'Content-Type': 'application/json',
|
|
33
29
|
},
|
|
34
30
|
body: JSON.stringify(payload),
|
|
35
31
|
});
|
|
36
|
-
if (!res.ok) {
|
|
37
|
-
const txt = await res.text().catch(() => '');
|
|
38
|
-
throw ErrorFactory.createTryCatchError(`Termii request failed (${res.status})`, {
|
|
39
|
-
status: res.status,
|
|
40
|
-
body: txt,
|
|
41
|
-
});
|
|
42
|
-
}
|
|
43
32
|
const json = await res.json().catch(() => ({}));
|
|
44
33
|
return json;
|
|
45
34
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testingHelpers.d.ts","sourceRoot":"","sources":["../../../../src/tools/notification/testingHelpers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"testingHelpers.d.ts","sourceRoot":"","sources":["../../../../src/tools/notification/testingHelpers.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,aAAa,GACxB,aAA0B,EAC1B,OAAM,OAA0B,KAC/B;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,IAAI,CAAA;CA2B3C,CAAC;;0CA5BM,OAAO,KACZ;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,IAAI,CAAA;KAAE;;AA6B9C,wBAAiC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Queue.d.ts","sourceRoot":"","sources":["../../../../src/tools/queue/Queue.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Queue.d.ts","sourceRoot":"","sources":["../../../../src/tools/queue/Queue.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,YAAY,CAAC,CAAC,GAAG,OAAO,IAAI;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,CAAC,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAErF,UAAU,YAAY;IACpB,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACjE,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IAC1E,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACvC,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACrC;AAID,eAAO,MAAM,KAAK;mBACD,MAAM,UAAU,YAAY;aAIlC,IAAI;eAIF,MAAM,GAAG,YAAY;YAUlB,CAAC,mBAAmB,MAAM,WAAW,CAAC,eAAe,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAK7E,CAAC,mBACN,MAAM,eACA,MAAM,GAClB,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;eAKtB,MAAM,MAAM,MAAM,eAAe,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;kBAKpD,MAAM,eAAe,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;iBAK9C,MAAM,eAAe,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;EAI9D,CAAC;AAEH,eAAe,KAAK,CAAC"}
|
package/src/tools/queue/Queue.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { Env } from '../../config/env.js';
|
|
1
2
|
import { ErrorFactory } from '../../exceptions/ZintrustError.js';
|
|
2
3
|
const drivers = new Map();
|
|
3
4
|
export const Queue = Object.freeze({
|
|
@@ -8,11 +9,8 @@ export const Queue = Object.freeze({
|
|
|
8
9
|
drivers.clear();
|
|
9
10
|
},
|
|
10
11
|
get(name) {
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
process.env['QUEUE_DRIVER'] ??
|
|
14
|
-
'inmemory')
|
|
15
|
-
.toString()
|
|
12
|
+
const resolved = (name ?? Env.QUEUE_CONNECTION) || Env.QUEUE_DRIVER || 'inmemory';
|
|
13
|
+
const driverName = (resolved !== null && resolved !== undefined ? String(resolved) : 'inmemory')
|
|
16
14
|
.trim()
|
|
17
15
|
.toLowerCase();
|
|
18
16
|
const driver = drivers.get(driverName);
|