@zintrust/core 0.1.4 → 0.1.6
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 +2 -2
- package/bin/z.d.ts.map +1 -1
- package/bin/z.js +3 -2
- package/bin/zin.d.ts +2 -2
- package/bin/zin.d.ts.map +1 -1
- package/bin/zin.js +3 -2
- package/bin/zintrust-main.d.ts +9 -0
- package/bin/zintrust-main.d.ts.map +1 -0
- package/bin/zintrust-main.js +101 -0
- package/bin/zintrust-microservices.js +7 -7
- package/bin/zintrust.d.ts +5 -4
- package/bin/zintrust.d.ts.map +1 -1
- package/bin/zintrust.js +7 -87
- package/bin/zt.d.ts +2 -2
- package/bin/zt.d.ts.map +1 -1
- package/bin/zt.js +3 -2
- package/package.json +13 -3
- package/public/index.html +4 -0
- package/src/boot/Application.js +13 -13
- package/src/boot/Server.d.ts.map +1 -1
- package/src/boot/Server.js +47 -39
- package/src/boot/bootstrap.js +71 -36
- package/src/builder/BundleOptimizer.js +3 -3
- package/src/cache/Cache.js +6 -6
- package/src/cache/drivers/KVDriver.js +2 -2
- package/src/cache/drivers/MongoDriver.js +3 -3
- package/src/cache/drivers/RedisDriver.js +3 -3
- package/src/cli/BaseCommand.d.ts +2 -0
- package/src/cli/BaseCommand.d.ts.map +1 -1
- package/src/cli/BaseCommand.js +12 -2
- package/src/cli/CLI.js +23 -23
- package/src/cli/ErrorHandler.d.ts.map +1 -1
- package/src/cli/ErrorHandler.js +14 -8
- package/src/cli/commands/AddCommand.js +15 -15
- package/src/cli/commands/ConfigCommand.js +6 -6
- package/src/cli/commands/D1MigrateCommand.js +6 -6
- package/src/cli/commands/DebugCommand.js +3 -3
- package/src/cli/commands/FixCommand.js +5 -5
- package/src/cli/commands/KeyGenerateCommand.js +5 -5
- package/src/cli/commands/LogsCleanupCommand.js +2 -2
- package/src/cli/commands/LogsCommand.js +6 -6
- package/src/cli/commands/MakeMailTemplateCommand.d.ts.map +1 -1
- package/src/cli/commands/MakeMailTemplateCommand.js +8 -7
- package/src/cli/commands/MakeNotificationTemplateCommand.d.ts.map +1 -1
- package/src/cli/commands/MakeNotificationTemplateCommand.js +8 -7
- package/src/cli/commands/MigrateCommand.js +2 -2
- package/src/cli/commands/NewCommand.js +11 -11
- package/src/cli/commands/PluginCommand.js +3 -3
- package/src/cli/commands/PrepareCommand.js +6 -6
- package/src/cli/commands/QACommand.js +8 -8
- package/src/cli/commands/SecretsCommand.js +3 -3
- package/src/cli/commands/SimulateCommand.js +6 -6
- package/src/cli/commands/StartCommand.js +7 -7
- package/src/cli/commands/TemplatesCommand.js +5 -5
- package/src/cli/commands/index.js +12 -12
- package/src/cli/config/ConfigManager.js +5 -5
- package/src/cli/config/ConfigValidator.js +1 -1
- package/src/cli/config/index.js +3 -3
- package/src/cli/debug/Dashboard.js +3 -3
- package/src/cli/index.js +10 -10
- package/src/cli/logger/Logger.js +2 -2
- package/src/cli/scaffolding/ControllerGenerator.d.ts.map +1 -1
- package/src/cli/scaffolding/ControllerGenerator.js +48 -64
- package/src/cli/scaffolding/FactoryGenerator.js +6 -6
- package/src/cli/scaffolding/FeatureScaffolder.js +8 -8
- package/src/cli/scaffolding/FileGenerator.js +4 -4
- package/src/cli/scaffolding/MigrationGenerator.js +4 -4
- package/src/cli/scaffolding/ModelGenerator.js +5 -5
- package/src/cli/scaffolding/ProjectScaffolder.d.ts.map +1 -1
- package/src/cli/scaffolding/ProjectScaffolder.js +78 -15
- package/src/cli/scaffolding/RequestFactoryGenerator.js +5 -5
- package/src/cli/scaffolding/ResponseFactoryGenerator.js +5 -5
- package/src/cli/scaffolding/RouteGenerator.js +4 -4
- package/src/cli/scaffolding/SeederGenerator.js +7 -7
- package/src/cli/scaffolding/ServiceIntegrationTestGenerator.js +5 -5
- package/src/cli/scaffolding/ServiceRequestFactoryGenerator.js +4 -4
- package/src/cli/scaffolding/ServiceScaffolder.d.ts.map +1 -1
- package/src/cli/scaffolding/ServiceScaffolder.js +24 -23
- package/src/cli/scaffolding/TemplateEngine.d.ts.map +1 -1
- package/src/cli/scaffolding/TemplateEngine.js +0 -2
- package/src/cli/scaffolding/TemplateGenerator.js +4 -4
- package/src/cli/scaffolding/WorkflowGenerator.js +4 -4
- package/src/cli/scaffolding/index.js +16 -16
- package/src/cli/utils/DistPackager.js +4 -4
- package/src/cli/utils/EnvFileLoader.js +2 -2
- package/src/cli/utils/spawn.d.ts.map +1 -1
- package/src/cli/utils/spawn.js +18 -7
- package/src/common/AwsSigV4.js +1 -1
- package/src/common/index.js +5 -5
- package/src/common/uuid.js +2 -2
- package/src/config/FileLogWriter.js +4 -4
- package/src/config/SecretsManager.d.ts +1 -42
- package/src/config/SecretsManager.d.ts.map +1 -1
- package/src/config/SecretsManager.js +2 -2
- package/src/config/StartupConfigValidator.d.ts +1 -9
- package/src/config/StartupConfigValidator.d.ts.map +1 -1
- package/src/config/StartupConfigValidator.js +115 -22
- package/src/config/app.d.ts +1 -1
- package/src/config/app.d.ts.map +1 -1
- package/src/config/app.js +1 -1
- package/src/config/broadcast.d.ts +1 -26
- package/src/config/broadcast.d.ts.map +1 -1
- package/src/config/broadcast.js +1 -1
- package/src/config/cache.d.ts +1 -22
- package/src/config/cache.d.ts.map +1 -1
- package/src/config/cache.js +1 -1
- package/src/config/cloudflare.d.ts +1 -13
- package/src/config/cloudflare.d.ts.map +1 -1
- package/src/config/database.d.ts +2 -47
- package/src/config/database.d.ts.map +1 -1
- package/src/config/database.js +1 -1
- package/src/config/env.d.ts.map +1 -1
- package/src/config/env.js +6 -2
- package/src/config/features.js +2 -2
- package/src/config/index.d.ts +10 -287
- package/src/config/index.d.ts.map +1 -1
- package/src/config/index.js +16 -16
- package/src/config/logger.d.ts.map +1 -1
- package/src/config/logger.js +10 -8
- package/src/config/logging/HttpLogger.js +4 -4
- package/src/config/logging/KvLogger.js +2 -2
- package/src/config/logging/SlackLogger.js +3 -3
- package/src/config/mail.d.ts +1 -27
- package/src/config/mail.d.ts.map +1 -1
- package/src/config/mail.js +1 -1
- package/src/config/microservices.js +1 -1
- package/src/config/middleware.d.ts +2 -6
- package/src/config/middleware.d.ts.map +1 -1
- package/src/config/middleware.js +5 -5
- package/src/config/notification.d.ts +0 -21
- package/src/config/notification.d.ts.map +1 -1
- package/src/config/notification.js +1 -1
- package/src/config/queue.d.ts +1 -39
- package/src/config/queue.d.ts.map +1 -1
- package/src/config/queue.js +1 -1
- package/src/config/security.d.ts +12 -0
- package/src/config/security.d.ts.map +1 -1
- package/src/config/security.js +17 -5
- package/src/config/startup.d.ts +2 -0
- package/src/config/startup.d.ts.map +1 -1
- package/src/config/startup.js +2 -1
- package/src/config/storage.d.ts +1 -48
- package/src/config/storage.d.ts.map +1 -1
- package/src/config/storage.js +1 -1
- package/src/config/type.d.ts +335 -0
- package/src/config/type.d.ts.map +1 -0
- package/src/config/type.js +1 -0
- package/src/container/ServiceContainer.js +1 -1
- package/src/exceptions/ZintrustError.js +1 -1
- package/src/features/Queue.js +2 -2
- package/src/functions/cloudflare.js +4 -4
- package/src/functions/deno.js +4 -4
- package/src/functions/lambda.js +4 -4
- package/src/health/RuntimeHealthProbes.js +3 -3
- package/src/health/StartupHealthChecks.js +9 -9
- package/src/http/Kernel.js +10 -10
- package/src/http/RequestContext.js +2 -2
- package/src/http/Response.js +1 -1
- package/src/index.d.ts +36 -1
- package/src/index.d.ts.map +1 -1
- package/src/index.js +69 -36
- package/src/microservices/MicroserviceBootstrap.js +5 -5
- package/src/microservices/MicroserviceGenerator.js +10 -10
- package/src/microservices/MicroserviceManager.js +4 -4
- package/src/microservices/PostgresAdapter.js +3 -3
- package/src/microservices/RequestTracingMiddleware.js +3 -3
- package/src/microservices/ServiceAuthMiddleware.js +3 -3
- package/src/microservices/ServiceBundler.js +3 -3
- package/src/microservices/ServiceHealthMonitor.js +2 -2
- package/src/middleware/CsrfMiddleware.js +3 -3
- package/src/middleware/ErrorHandlerMiddleware.js +4 -4
- package/src/middleware/LoggingMiddleware.js +3 -3
- package/src/middleware/RateLimiter.js +1 -1
- package/src/middleware/index.js +6 -6
- package/src/node-singletons/http.d.ts +2 -2
- package/src/node-singletons/http.d.ts.map +1 -1
- package/src/node-singletons/http.js +1 -1
- package/src/node-singletons/index.js +14 -14
- package/src/node-singletons/path.d.ts +1 -1
- package/src/node.d.ts +5 -0
- package/src/node.d.ts.map +1 -0
- package/src/node.js +4 -0
- package/src/orm/ConnectionManager.js +3 -3
- package/src/orm/Database.js +8 -8
- package/src/orm/Model.js +5 -5
- package/src/orm/QueryBuilder.js +1 -1
- package/src/orm/Relationships.js +1 -1
- package/src/orm/adapters/D1Adapter.js +5 -5
- package/src/orm/adapters/MySQLAdapter.d.ts.map +1 -1
- package/src/orm/adapters/MySQLAdapter.js +4 -6
- package/src/orm/adapters/PostgreSQLAdapter.d.ts.map +1 -1
- package/src/orm/adapters/PostgreSQLAdapter.js +4 -6
- package/src/orm/adapters/SQLServerAdapter.d.ts.map +1 -1
- package/src/orm/adapters/SQLServerAdapter.js +4 -6
- package/src/orm/adapters/SQLiteAdapter.d.ts.map +1 -1
- package/src/orm/adapters/SQLiteAdapter.js +5 -7
- package/src/performance/CodeGenerationBenchmark.js +5 -5
- package/src/performance/Optimizer.js +3 -3
- package/src/performance/establish-baseline.js +4 -4
- package/src/profiling/RequestProfiler.js +4 -4
- package/src/runtime/PluginManager.js +8 -8
- package/src/runtime/RuntimeDetector.d.ts.map +1 -1
- package/src/runtime/RuntimeDetector.js +22 -12
- package/src/runtime/adapters/CloudflareAdapter.js +3 -3
- package/src/runtime/adapters/DenoAdapter.js +2 -2
- package/src/runtime/adapters/FargateAdapter.js +4 -4
- package/src/runtime/adapters/LambdaAdapter.js +4 -4
- package/src/runtime/adapters/NodeServerAdapter.js +4 -4
- package/src/scheduler/ScheduleRunner.js +2 -2
- package/src/scheduler/index.js +1 -1
- package/src/schedules/index.js +1 -1
- package/src/schedules/log-cleanup.js +2 -2
- package/src/scripts/GenerateEnvArtifacts.js +4 -4
- package/src/scripts/TemplateSync.js +8 -6
- package/src/security/CsrfTokenManager.js +2 -2
- package/src/security/Encryptor.js +3 -3
- package/src/security/Hash.js +2 -2
- package/src/security/JwtManager.js +2 -2
- package/src/security/StartupSecretValidation.js +4 -4
- package/src/security/UrlValidator.js +1 -1
- package/src/security/Xss.js +1 -1
- package/src/security/XssProtection.d.ts.map +1 -1
- package/src/security/XssProtection.js +8 -3
- package/src/templates/adapters/MySQLAdapter.ts.tpl +0 -2
- package/src/templates/adapters/PostgreSQLAdapter.ts.tpl +0 -3
- package/src/templates/adapters/SQLServerAdapter.ts.tpl +0 -2
- package/src/templates/adapters/SQLiteAdapter.ts.tpl +0 -2
- package/src/templates/project/basic/.env.tpl +8 -1
- package/src/templates/project/basic/app/Controllers/UserController.ts.tpl +3 -2
- package/src/templates/project/basic/app/Middleware/ProfilerMiddleware.ts.tpl +3 -2
- package/src/templates/project/basic/app/Middleware/index.ts.tpl +8 -14
- package/src/templates/project/basic/app/Models/Post.ts.tpl +2 -1
- package/src/templates/project/basic/app/Models/User.ts.tpl +1 -1
- package/src/templates/project/basic/app/Toolkit/Broadcast/sendBroadcast.ts.tpl +1 -1
- package/src/templates/project/basic/app/Toolkit/Mail/sendWelcomeEmail.ts.tpl +1 -1
- package/src/templates/project/basic/app/Toolkit/Notification/sendSlackNotification.ts.tpl +1 -1
- package/src/templates/project/basic/app/Toolkit/Notification/sendSms.ts.tpl +1 -1
- package/src/templates/project/basic/config/FileLogWriter.ts.tpl +2 -4
- package/src/templates/project/basic/config/SecretsManager.ts.tpl +6 -39
- package/src/templates/project/basic/config/StartupConfigValidator.ts.tpl +154 -37
- package/src/templates/project/basic/config/app.ts.tpl +1 -5
- package/src/templates/project/basic/config/broadcast.ts.tpl +6 -36
- package/src/templates/project/basic/config/cache.ts.tpl +1 -42
- package/src/templates/project/basic/config/cloudflare.ts.tpl +1 -15
- package/src/templates/project/basic/config/database.ts.tpl +5 -51
- package/src/templates/project/basic/config/env.ts.tpl +6 -7
- package/src/templates/project/basic/config/features.ts.tpl +1 -1
- package/src/templates/project/basic/config/index.ts.tpl +1 -1
- package/src/templates/project/basic/config/logger.ts.tpl +3 -1
- package/src/templates/project/basic/config/logging/HttpLogger.ts.tpl +1 -1
- package/src/templates/project/basic/config/logging/KvLogger.ts.tpl +1 -1
- package/src/templates/project/basic/config/logging/SlackLogger.ts.tpl +1 -1
- package/src/templates/project/basic/config/mail.ts.tpl +1 -57
- package/src/templates/project/basic/config/microservices.ts.tpl +1 -1
- package/src/templates/project/basic/config/middleware.ts.tpl +2 -6
- package/src/templates/project/basic/config/notification.ts.tpl +1 -36
- package/src/templates/project/basic/config/queue.ts.tpl +1 -49
- package/src/templates/project/basic/config/security.ts.tpl +13 -1
- package/src/templates/project/basic/config/startup.ts.tpl +2 -0
- package/src/templates/project/basic/config/storage.ts.tpl +6 -54
- package/src/templates/project/basic/config/type.ts.tpl +414 -0
- package/src/templates/project/basic/package.json.tpl +1 -0
- package/src/templates/project/basic/routes/api.ts.tpl +1 -1
- package/src/templates/project/basic/routes/broadcast.ts.tpl +1 -1
- package/src/templates/project/basic/routes/health.ts.tpl +1 -1
- package/src/templates/project/basic/routes/storage.ts.tpl +1 -1
- package/src/templates/project/basic/src/index.ts.tpl +49 -41
- package/src/templates/project/basic/template.json +1 -1
- package/src/templates/project/basic/tsconfig.json.tpl +3 -1
- package/src/toolkit/Secrets/EnvFile.js +3 -3
- package/src/toolkit/Secrets/Manifest.js +3 -3
- package/src/toolkit/Secrets/index.js +5 -5
- package/src/toolkit/Secrets/providers/AwsSecretsManager.js +2 -2
- package/src/toolkit/Secrets/providers/CloudflareKv.js +1 -1
- package/src/tools/broadcast/Broadcast.js +6 -6
- package/src/tools/broadcast/drivers/BaseDriver.js +1 -1
- package/src/tools/broadcast/drivers/Pusher.d.ts +1 -1
- package/src/tools/broadcast/drivers/Pusher.d.ts.map +1 -1
- package/src/tools/broadcast/drivers/Pusher.js +2 -2
- package/src/tools/broadcast/drivers/Redis.js +1 -1
- package/src/tools/broadcast/drivers/RedisHttps.js +3 -3
- package/src/tools/broadcast/index.js +6 -6
- package/src/tools/http/Http.js +4 -4
- package/src/tools/http/HttpResponse.js +1 -1
- package/src/tools/http/index.js +2 -2
- package/src/tools/mail/Mail.js +8 -8
- package/src/tools/mail/attachments.js +1 -1
- package/src/tools/mail/drivers/BaseDriver.js +1 -1
- package/src/tools/mail/drivers/Mailgun.js +1 -1
- package/src/tools/mail/drivers/SendGrid.js +1 -1
- package/src/tools/mail/drivers/Ses.js +2 -2
- package/src/tools/mail/drivers/Smtp.js +4 -4
- package/src/tools/mail/templates/markdown/index.js +3 -3
- package/src/tools/mail/templates/markdown/registry.js +5 -5
- package/src/tools/mail/templates/markdown/validator.js +1 -1
- package/src/tools/mail/testing.js +1 -1
- package/src/tools/notification/Notification.js +1 -1
- package/src/tools/notification/Registry.js +3 -3
- package/src/tools/notification/Service.js +3 -3
- package/src/tools/notification/config.js +1 -1
- package/src/tools/notification/drivers/BaseDriver.js +1 -1
- package/src/tools/notification/drivers/Slack.js +1 -1
- package/src/tools/notification/drivers/Termii.js +1 -1
- package/src/tools/notification/drivers/Twilio.js +1 -1
- package/src/tools/notification/templates/markdown/index.js +3 -3
- package/src/tools/notification/templates/markdown/registry.js +5 -5
- package/src/tools/notification/testing.js +1 -1
- package/src/tools/notification/testingHelpers.js +2 -2
- package/src/tools/queue/Queue.js +1 -1
- package/src/tools/queue/drivers/InMemory.js +1 -1
- package/src/tools/queue/drivers/Redis.js +2 -2
- package/src/tools/storage/LocalSignedUrl.js +2 -2
- package/src/tools/storage/drivers/Gcs.js +1 -1
- package/src/tools/storage/drivers/Local.js +5 -5
- package/src/tools/storage/drivers/R2.js +2 -2
- package/src/tools/storage/drivers/S3.js +3 -3
- package/src/tools/storage/index.js +6 -6
- package/src/tools/storage/testing.js +1 -1
- package/src/tools/templates/MarkdownRenderer.js +2 -2
- package/src/tools/templates/index.js +1 -1
- package/src/validation/Validator.js +3 -3
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
* MigrationGenerator - Generate database migrations
|
|
3
3
|
* Creates migration files for schema changes
|
|
4
4
|
*/
|
|
5
|
-
import { FileGenerator } from '../scaffolding/FileGenerator';
|
|
6
|
-
import { CommonUtils } from '../../common/index';
|
|
7
|
-
import { Logger } from '../../config/logger';
|
|
8
|
-
import * as path from '../../node-singletons/path';
|
|
5
|
+
import { FileGenerator } from '../scaffolding/FileGenerator.js';
|
|
6
|
+
import { CommonUtils } from '../../common/index.js';
|
|
7
|
+
import { Logger } from '../../config/logger.js';
|
|
8
|
+
import * as path from '../../node-singletons/path.js';
|
|
9
9
|
/**
|
|
10
10
|
* Validate migration options
|
|
11
11
|
*/
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
* ModelGenerator - Generate ORM model files
|
|
3
3
|
* Creates type-safe model modules with relationships and validation
|
|
4
4
|
*/
|
|
5
|
-
import { FileGenerator } from '../scaffolding/FileGenerator';
|
|
6
|
-
import { CommonUtils } from '../../common/index';
|
|
7
|
-
import { Logger } from '../../config/logger';
|
|
8
|
-
import * as path from '../../node-singletons/path';
|
|
5
|
+
import { FileGenerator } from '../scaffolding/FileGenerator.js';
|
|
6
|
+
import { CommonUtils } from '../../common/index.js';
|
|
7
|
+
import { Logger } from '../../config/logger.js';
|
|
8
|
+
import * as path from '../../node-singletons/path.js';
|
|
9
9
|
/**
|
|
10
10
|
* Validate model options
|
|
11
11
|
*/
|
|
@@ -84,7 +84,7 @@ function buildModelCode(options) {
|
|
|
84
84
|
* Auto-generated model file
|
|
85
85
|
*/
|
|
86
86
|
|
|
87
|
-
import {
|
|
87
|
+
import { type IModel, Model } from '@zintrust/core';
|
|
88
88
|
|
|
89
89
|
export const ${options.name} = Object.freeze(
|
|
90
90
|
Model.define({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProjectScaffolder.d.ts","sourceRoot":"","sources":["../../../../src/cli/scaffolding/ProjectScaffolder.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"ProjectScaffolder.d.ts","sourceRoot":"","sources":["../../../../src/cli/scaffolding/ProjectScaffolder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,cAAc,GAAG,sBAAsB,CAAC;AAEpD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,KAAK,CAAC;CACf;AAED,MAAM,WAAW,kBAAkB;IACjC,cAAc,CAAC,OAAO,EAAE,sBAAsB,GAAG,IAAI,CAAC;IACtD,YAAY,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,eAAe,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAAC;IACpE,cAAc,IAAI,MAAM,CAAC;IACzB,sBAAsB,IAAI,OAAO,CAAC;IAClC,iBAAiB,IAAI,MAAM,CAAC;IAC5B,WAAW,CAAC,OAAO,CAAC,EAAE,sBAAsB,GAAG,MAAM,CAAC;IACtD,gBAAgB,IAAI,OAAO,CAAC;IAC5B,aAAa,IAAI,OAAO,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;CAC3E;AAwaD,wBAAgB,qBAAqB,IAAI,MAAM,EAAE,CAEhD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAsBrE;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG;IAChE,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,CAsBA;AA0ID;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,WAAW,GAAE,MAAsB,GAAG,kBAAkB,CAsB/F;AAED,wBAAsB,eAAe,CACnC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,qBAAqB,CAAC,CAEhC;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB;;;;;;EAM5B,CAAC"}
|
|
@@ -2,10 +2,21 @@
|
|
|
2
2
|
* Project Scaffolder - New project generation
|
|
3
3
|
* Handles directory structure and boilerplate file creation
|
|
4
4
|
*/
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import fs from '../../node-singletons/fs';
|
|
8
|
-
import * as path from '../../node-singletons/path';
|
|
5
|
+
import { Logger } from '../../config/logger.js';
|
|
6
|
+
import { randomBytes } from '../../node-singletons/crypto.js';
|
|
7
|
+
import fs from '../../node-singletons/fs.js';
|
|
8
|
+
import * as path from '../../node-singletons/path.js';
|
|
9
|
+
import { fileURLToPath } from '../../node-singletons/url.js';
|
|
10
|
+
const loadCoreVersion = () => {
|
|
11
|
+
try {
|
|
12
|
+
const packageUrl = new URL('../../../package.json', import.meta.url);
|
|
13
|
+
const packageJson = JSON.parse(fs.readFileSync(packageUrl, 'utf-8'));
|
|
14
|
+
return typeof packageJson.version === 'string' ? packageJson.version : '0.0.0';
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return '0.0.0';
|
|
18
|
+
}
|
|
19
|
+
};
|
|
9
20
|
const createDirectories = (projectPath, directories) => {
|
|
10
21
|
let count = 0;
|
|
11
22
|
if (!fs.existsSync(projectPath)) {
|
|
@@ -99,13 +110,19 @@ const createEnvFile = (projectPath, variables) => {
|
|
|
99
110
|
const name = typeof variables['projectName'] === 'string' ? variables['projectName'] : 'zintrust-app';
|
|
100
111
|
const port = Number(variables['port'] ?? 3000);
|
|
101
112
|
const database = typeof variables['database'] === 'string' ? variables['database'] : 'sqlite';
|
|
113
|
+
// Generate a secure APP_KEY (32 bytes = 256-bit, base64 encoded)
|
|
114
|
+
const appKeyBytes = randomBytes(32);
|
|
115
|
+
const appKey = appKeyBytes.toString('base64');
|
|
102
116
|
const baseLines = [
|
|
103
117
|
'NODE_ENV=development',
|
|
118
|
+
'STARTUP_REQUIRE_ENV=true',
|
|
104
119
|
`APP_NAME=${name}`,
|
|
120
|
+
'HOST=localhost',
|
|
121
|
+
`PORT=${port}`,
|
|
105
122
|
`APP_PORT=${port}`,
|
|
106
123
|
'APP_DEBUG=true',
|
|
107
|
-
//
|
|
108
|
-
|
|
124
|
+
// Auto-generated secure key for storage signing and encryption
|
|
125
|
+
`APP_KEY=${appKey}`,
|
|
109
126
|
`DB_CONNECTION=${database}`,
|
|
110
127
|
];
|
|
111
128
|
const dbLines = (() => {
|
|
@@ -119,7 +136,8 @@ const createEnvFile = (projectPath, variables) => {
|
|
|
119
136
|
];
|
|
120
137
|
}
|
|
121
138
|
if (database === 'sqlite') {
|
|
122
|
-
|
|
139
|
+
// Provide both DB_DATABASE (used by the framework) and DB_PATH (common alias)
|
|
140
|
+
return ['DB_DATABASE=./database.sqlite', 'DB_PATH=./database.sqlite'];
|
|
123
141
|
}
|
|
124
142
|
return [];
|
|
125
143
|
})();
|
|
@@ -127,7 +145,8 @@ const createEnvFile = (projectPath, variables) => {
|
|
|
127
145
|
'',
|
|
128
146
|
'# Logging',
|
|
129
147
|
'LOG_LEVEL=debug',
|
|
130
|
-
'LOG_CHANNEL=
|
|
148
|
+
'LOG_CHANNEL=console',
|
|
149
|
+
'LOG_FORMAT=json',
|
|
131
150
|
'',
|
|
132
151
|
'# Auth / Security',
|
|
133
152
|
'JWT_SECRET=',
|
|
@@ -156,9 +175,9 @@ const createEnvFile = (projectPath, variables) => {
|
|
|
156
175
|
}
|
|
157
176
|
};
|
|
158
177
|
const getProjectTemplatesRoot = () => {
|
|
159
|
-
const thisDir = esmDirname(import.meta.url);
|
|
160
178
|
// src/cli/scaffolding/ -> src/templates/project/
|
|
161
|
-
|
|
179
|
+
const templatesUrl = new URL('../../templates/project', import.meta.url);
|
|
180
|
+
return fileURLToPath(templatesUrl);
|
|
162
181
|
};
|
|
163
182
|
const listTemplateFilesRecursive = (dirPath) => {
|
|
164
183
|
const entries = fs.readdirSync(dirPath, { withFileTypes: true });
|
|
@@ -204,12 +223,54 @@ const resolveTemplateMetadata = (templateName, meta, fallback) => {
|
|
|
204
223
|
const loadTemplateFiles = (templateDir) => {
|
|
205
224
|
const files = {};
|
|
206
225
|
const allFiles = listTemplateFilesRecursive(templateDir);
|
|
226
|
+
const allowedConfigFiles = new Set([
|
|
227
|
+
'config/broadcast.ts',
|
|
228
|
+
'config/cache.ts',
|
|
229
|
+
'config/database.ts',
|
|
230
|
+
'config/logging/HttpLogger.ts',
|
|
231
|
+
'config/mail.ts',
|
|
232
|
+
'config/notification.ts',
|
|
233
|
+
'config/queue.ts',
|
|
234
|
+
'config/storage.ts',
|
|
235
|
+
]);
|
|
236
|
+
const isENOENT = (error) => error !== null &&
|
|
237
|
+
typeof error === 'object' &&
|
|
238
|
+
'code' in error &&
|
|
239
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
240
|
+
error.code === 'ENOENT';
|
|
241
|
+
const normalizeRelPath = (relPath) => relPath.replaceAll('\\', '/');
|
|
242
|
+
const getOutputRelPath = (relPath) => relPath.endsWith('.tpl') ? relPath.slice(0, -'.tpl'.length) : relPath;
|
|
243
|
+
const shouldIncludeTemplateFile = (relPath) => {
|
|
244
|
+
if (relPath === 'template.json')
|
|
245
|
+
return false;
|
|
246
|
+
const normalized = normalizeRelPath(relPath);
|
|
247
|
+
if (!normalized.startsWith('config/'))
|
|
248
|
+
return true;
|
|
249
|
+
// Starter apps should only ship app-level config modules.
|
|
250
|
+
// Core/framework config internals (e.g. config/logging/*) remain core-owned.
|
|
251
|
+
const outputRel = normalizeRelPath(getOutputRelPath(relPath));
|
|
252
|
+
return allowedConfigFiles.has(outputRel);
|
|
253
|
+
};
|
|
254
|
+
const readUtf8FileOrUndefined = (absPath) => {
|
|
255
|
+
try {
|
|
256
|
+
return fs.readFileSync(absPath, 'utf8');
|
|
257
|
+
}
|
|
258
|
+
catch (error) {
|
|
259
|
+
// Some tests temporarily create/delete template files in parallel; if a file
|
|
260
|
+
// disappears between directory listing and read, skip it.
|
|
261
|
+
if (isENOENT(error))
|
|
262
|
+
return undefined;
|
|
263
|
+
throw error;
|
|
264
|
+
}
|
|
265
|
+
};
|
|
207
266
|
for (const absPath of allFiles) {
|
|
208
267
|
const rel = path.relative(templateDir, absPath);
|
|
209
|
-
if (rel
|
|
268
|
+
if (!shouldIncludeTemplateFile(rel))
|
|
269
|
+
continue;
|
|
270
|
+
const content = readUtf8FileOrUndefined(absPath);
|
|
271
|
+
if (content === undefined)
|
|
210
272
|
continue;
|
|
211
|
-
const
|
|
212
|
-
const outputRel = rel.endsWith('.tpl') ? rel.slice(0, -'.tpl'.length) : rel;
|
|
273
|
+
const outputRel = getOutputRelPath(rel);
|
|
213
274
|
files[outputRel] = content;
|
|
214
275
|
}
|
|
215
276
|
return files;
|
|
@@ -233,10 +294,10 @@ const BASIC_TEMPLATE = {
|
|
|
233
294
|
name: 'basic',
|
|
234
295
|
description: 'Basic Zintrust project structure',
|
|
235
296
|
directories: [
|
|
297
|
+
'config',
|
|
236
298
|
'app/Controllers',
|
|
237
299
|
'app/Middleware',
|
|
238
300
|
'app/Models',
|
|
239
|
-
'config',
|
|
240
301
|
'database/migrations',
|
|
241
302
|
'database/seeders',
|
|
242
303
|
'logs',
|
|
@@ -289,7 +350,7 @@ const FULLSTACK_TEMPLATE = {
|
|
|
289
350
|
'app/Controllers',
|
|
290
351
|
'app/Middleware',
|
|
291
352
|
'app/Models',
|
|
292
|
-
|
|
353
|
+
// Starter projects should not include framework config internals.
|
|
293
354
|
'database/migrations',
|
|
294
355
|
'database/seeders',
|
|
295
356
|
'logs',
|
|
@@ -366,6 +427,7 @@ const prepareContext = (state, options) => {
|
|
|
366
427
|
database: options.database ?? 'sqlite',
|
|
367
428
|
template: state.templateName,
|
|
368
429
|
migrationTimestamp,
|
|
430
|
+
coreVersion: loadCoreVersion(),
|
|
369
431
|
};
|
|
370
432
|
};
|
|
371
433
|
const createDirectoriesForState = (state) => {
|
|
@@ -384,6 +446,7 @@ const createFilesForState = (state) => {
|
|
|
384
446
|
files['.gitignore'] = `node_modules/
|
|
385
447
|
dist/
|
|
386
448
|
.env
|
|
449
|
+
.env.*
|
|
387
450
|
.env.local
|
|
388
451
|
.DS_Store
|
|
389
452
|
coverage/
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
* Request Factory Generator - Phase 6.3
|
|
3
3
|
* Generates request/input DTO factories with built-in validation
|
|
4
4
|
*/
|
|
5
|
-
import { FileGenerator } from '../scaffolding/FileGenerator';
|
|
6
|
-
import { Logger } from '../../config/logger';
|
|
7
|
-
import { ErrorFactory } from '../../exceptions/ZintrustError';
|
|
8
|
-
import { fsPromises as fs } from '../../node-singletons/fs';
|
|
9
|
-
import * as path from '../../node-singletons/path';
|
|
5
|
+
import { FileGenerator } from '../scaffolding/FileGenerator.js';
|
|
6
|
+
import { Logger } from '../../config/logger.js';
|
|
7
|
+
import { ErrorFactory } from '../../exceptions/ZintrustError.js';
|
|
8
|
+
import { fsPromises as fs } from '../../node-singletons/fs.js';
|
|
9
|
+
import * as path from '../../node-singletons/path.js';
|
|
10
10
|
/**
|
|
11
11
|
* Validate request factory options
|
|
12
12
|
*/
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
* Response Factory Generator - Phase 7
|
|
3
3
|
* Generates response/output DTO factories with built-in validation
|
|
4
4
|
*/
|
|
5
|
-
import { FileGenerator } from '../scaffolding/FileGenerator';
|
|
6
|
-
import { Logger } from '../../config/logger';
|
|
7
|
-
import { ErrorFactory } from '../../exceptions/ZintrustError';
|
|
8
|
-
import { fsPromises as fs } from '../../node-singletons/fs';
|
|
9
|
-
import * as path from '../../node-singletons/path';
|
|
5
|
+
import { FileGenerator } from '../scaffolding/FileGenerator.js';
|
|
6
|
+
import { Logger } from '../../config/logger.js';
|
|
7
|
+
import { ErrorFactory } from '../../exceptions/ZintrustError.js';
|
|
8
|
+
import { fsPromises as fs } from '../../node-singletons/fs.js';
|
|
9
|
+
import * as path from '../../node-singletons/path.js';
|
|
10
10
|
/**
|
|
11
11
|
* Validate response factory options
|
|
12
12
|
*/
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
* RouteGenerator - Generate route files
|
|
3
3
|
* Creates route definitions with middleware and parameters
|
|
4
4
|
*/
|
|
5
|
-
import { FileGenerator } from '../scaffolding/FileGenerator';
|
|
6
|
-
import { Logger } from '../../config/logger';
|
|
7
|
-
import * as path from '../../node-singletons/path';
|
|
5
|
+
import { FileGenerator } from '../scaffolding/FileGenerator.js';
|
|
6
|
+
import { Logger } from '../../config/logger.js';
|
|
7
|
+
import * as path from '../../node-singletons/path.js';
|
|
8
8
|
/**
|
|
9
9
|
* Validate route options
|
|
10
10
|
*/
|
|
@@ -93,7 +93,7 @@ ${routeRegistration}
|
|
|
93
93
|
* Build import statements
|
|
94
94
|
*/
|
|
95
95
|
function buildImports(options) {
|
|
96
|
-
const imports = ['import { Router } from "../../routing/Router";'];
|
|
96
|
+
const imports = ['import { Router } from "../../routing/Router.js";'];
|
|
97
97
|
// Collect unique controllers
|
|
98
98
|
const controllers = new Set();
|
|
99
99
|
for (const route of options.routes) {
|
|
@@ -3,12 +3,12 @@
|
|
|
3
3
|
* Generates database seeders for populating development/staging databases
|
|
4
4
|
* Uses factory generators for consistent data generation
|
|
5
5
|
*/
|
|
6
|
-
import { FileGenerator } from '../scaffolding/FileGenerator';
|
|
7
|
-
import { CommonUtils } from '../../common/index';
|
|
8
|
-
import { Logger } from '../../config/logger';
|
|
9
|
-
import { ErrorFactory } from '../../exceptions/ZintrustError';
|
|
10
|
-
import { fsPromises as fs } from '../../node-singletons/fs';
|
|
11
|
-
import * as path from '../../node-singletons/path';
|
|
6
|
+
import { FileGenerator } from '../scaffolding/FileGenerator.js';
|
|
7
|
+
import { CommonUtils } from '../../common/index.js';
|
|
8
|
+
import { Logger } from '../../config/logger.js';
|
|
9
|
+
import { ErrorFactory } from '../../exceptions/ZintrustError.js';
|
|
10
|
+
import { fsPromises as fs } from '../../node-singletons/fs.js';
|
|
11
|
+
import * as path from '../../node-singletons/path.js';
|
|
12
12
|
/**
|
|
13
13
|
* Seeder Generator - Creates database seeders using factory classes
|
|
14
14
|
* Enables rapid database population for development and staging
|
|
@@ -213,7 +213,7 @@ function buildSeederResetMethod(options) {
|
|
|
213
213
|
*/
|
|
214
214
|
function buildImports(options) {
|
|
215
215
|
const factoryName = getFactoryName(options);
|
|
216
|
-
return `import { Logger } from '../../config/logger';
|
|
216
|
+
return `import { Logger } from '../../config/logger.js';
|
|
217
217
|
import { ${factoryName} } from '@database/factories/${factoryName}';
|
|
218
218
|
import { ${options.modelName} } from '@app/Models/${options.modelName}';`;
|
|
219
219
|
}
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
* Service Integration Test Generator
|
|
3
3
|
* Generates integration tests for service-to-service communication
|
|
4
4
|
*/
|
|
5
|
-
import { FileGenerator } from '../scaffolding/FileGenerator';
|
|
6
|
-
import { CommonUtils } from '../../common/index';
|
|
7
|
-
import { Logger } from '../../config/logger';
|
|
8
|
-
import * as path from '../../node-singletons/path';
|
|
5
|
+
import { FileGenerator } from '../scaffolding/FileGenerator.js';
|
|
6
|
+
import { CommonUtils } from '../../common/index.js';
|
|
7
|
+
import { Logger } from '../../config/logger.js';
|
|
8
|
+
import * as path from '../../node-singletons/path.js';
|
|
9
9
|
/**
|
|
10
10
|
* Validate integration test options
|
|
11
11
|
*/
|
|
@@ -71,7 +71,7 @@ function buildTestCode(options) {
|
|
|
71
71
|
*/
|
|
72
72
|
|
|
73
73
|
import { describe, it, expect, beforeAll, afterAll, vi } from 'vitest';
|
|
74
|
-
import { ErrorFactory } from '../../exceptions/ZintrustError';
|
|
74
|
+
import { ErrorFactory } from '../../exceptions/ZintrustError.js';
|
|
75
75
|
|
|
76
76
|
interface ServiceConfig {
|
|
77
77
|
baseUrl: string;
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
* ServiceRequestFactoryGenerator - Generate inter-service request factories
|
|
3
3
|
* Creates type-safe factories for testing service-to-service API calls
|
|
4
4
|
*/
|
|
5
|
-
import { FileGenerator } from '../scaffolding/FileGenerator';
|
|
6
|
-
import { CommonUtils } from '../../common/index';
|
|
7
|
-
import { Logger } from '../../config/logger';
|
|
8
|
-
import * as path from '../../node-singletons/path';
|
|
5
|
+
import { FileGenerator } from '../scaffolding/FileGenerator.js';
|
|
6
|
+
import { CommonUtils } from '../../common/index.js';
|
|
7
|
+
import { Logger } from '../../config/logger.js';
|
|
8
|
+
import * as path from '../../node-singletons/path.js';
|
|
9
9
|
/**
|
|
10
10
|
* Validate options
|
|
11
11
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ServiceScaffolder.d.ts","sourceRoot":"","sources":["../../../../src/cli/scaffolding/ServiceScaffolder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC;IACjC,IAAI,CAAC,EAAE,SAAS,GAAG,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAC;IAC7C,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AAEH;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,cAAc,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAuB7F;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,MAAM,CAGnF;AAED;;GAEG;AAEH,wBAAgB,QAAQ,CACtB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,qBAAqB,CAAC,CA+ChC;
|
|
1
|
+
{"version":3,"file":"ServiceScaffolder.d.ts","sourceRoot":"","sources":["../../../../src/cli/scaffolding/ServiceScaffolder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC;IACjC,IAAI,CAAC,EAAE,SAAS,GAAG,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAC;IAC7C,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AAEH;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,cAAc,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAuB7F;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,MAAM,CAGnF;AAED;;GAEG;AAEH,wBAAgB,QAAQ,CACtB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,qBAAqB,CAAC,CA+ChC;AA6SD,eAAO,MAAM,iBAAiB;;;;EAI5B,CAAC"}
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
* ServiceScaffolder - Generate microservices within a project
|
|
3
3
|
* Creates service structure with controllers, models, routes, and config
|
|
4
4
|
*/
|
|
5
|
-
import { FileGenerator } from '../scaffolding/FileGenerator';
|
|
6
|
-
import { Logger } from '../../config/logger';
|
|
7
|
-
import * as path from '../../node-singletons/path';
|
|
5
|
+
import { FileGenerator } from '../scaffolding/FileGenerator.js';
|
|
6
|
+
import { Logger } from '../../config/logger.js';
|
|
7
|
+
import * as path from '../../node-singletons/path.js';
|
|
8
8
|
/**
|
|
9
9
|
* ServiceScaffolder generates microservices with all necessary files
|
|
10
10
|
*/
|
|
@@ -97,6 +97,7 @@ function createServiceDirectories(servicePath) {
|
|
|
97
97
|
'src/middleware',
|
|
98
98
|
'src/migrations',
|
|
99
99
|
'src/factories',
|
|
100
|
+
'routes',
|
|
100
101
|
];
|
|
101
102
|
for (const dir of dirs) {
|
|
102
103
|
FileGenerator.createDirectory(path.join(servicePath, dir));
|
|
@@ -110,7 +111,7 @@ function createServiceFiles(servicePath, options) {
|
|
|
110
111
|
const files = [
|
|
111
112
|
{ path: 'service.config.json', content: generateServiceConfig(options) },
|
|
112
113
|
{ path: 'src/index.ts', content: generateServiceIndex(options) },
|
|
113
|
-
{ path: '
|
|
114
|
+
{ path: 'routes/api.ts', content: generateServiceRoutes(options) },
|
|
114
115
|
{ path: 'src/controllers/ExampleController.ts', content: generateExampleController(options) },
|
|
115
116
|
{ path: 'src/models/Example.ts', content: generateExampleModel(options) },
|
|
116
117
|
{ path: '.env', content: generateServiceEnv(options) },
|
|
@@ -161,24 +162,26 @@ function generateServiceIndex(options) {
|
|
|
161
162
|
* Auth: ${options.auth ?? 'api-key'}
|
|
162
163
|
*/
|
|
163
164
|
|
|
164
|
-
import { Application } from '
|
|
165
|
-
import {
|
|
166
|
-
import {
|
|
167
|
-
import {
|
|
168
|
-
import
|
|
169
|
-
import * as path from '../../node-singletons/path';
|
|
165
|
+
import { Application, Server } from '@zintrust/core';
|
|
166
|
+
import { Logger } from '../../config/logger.js';
|
|
167
|
+
import { Env } from '../../config/env.js';
|
|
168
|
+
import { esmDirname } from '../../common/index.js';
|
|
169
|
+
import * as path from '../../node-singletons/path.js';
|
|
170
170
|
|
|
171
171
|
const __dirname = esmDirname(import.meta.url);
|
|
172
|
-
const app = new Application(path.join(__dirname, '..'));
|
|
173
172
|
const port = Env.getInt('${options.name?.toUpperCase()}_PORT', ${options.port ?? 3001});
|
|
174
173
|
|
|
175
|
-
|
|
176
|
-
const
|
|
177
|
-
|
|
174
|
+
async function start(): Promise<void> {
|
|
175
|
+
const app = Application.create(path.join(__dirname, '..'));
|
|
176
|
+
await app.boot();
|
|
177
|
+
|
|
178
|
+
const server = Server.create(app, port);
|
|
179
|
+
await server.listen();
|
|
180
|
+
|
|
178
181
|
Logger.info(\`${options.name} service running on port \${port}\`);
|
|
179
|
-
}
|
|
182
|
+
}
|
|
180
183
|
|
|
181
|
-
|
|
184
|
+
await start();
|
|
182
185
|
`;
|
|
183
186
|
}
|
|
184
187
|
/**
|
|
@@ -189,11 +192,11 @@ function generateServiceRoutes(options) {
|
|
|
189
192
|
* ${options.name} Service Routes
|
|
190
193
|
*/
|
|
191
194
|
|
|
192
|
-
import { Router } from '
|
|
195
|
+
import { Router, type IRouter } from '@zintrust/core';
|
|
193
196
|
|
|
194
|
-
export function registerRoutes(router:
|
|
197
|
+
export function registerRoutes(router: IRouter): void {
|
|
195
198
|
// Example route
|
|
196
|
-
|
|
199
|
+
Router.get(router, '/', (_req, res) => {
|
|
197
200
|
res.json({ message: '${options.name} service' });
|
|
198
201
|
});
|
|
199
202
|
}
|
|
@@ -208,9 +211,7 @@ function generateExampleController(options) {
|
|
|
208
211
|
* Example Controller for ${options.name} Service
|
|
209
212
|
*/
|
|
210
213
|
|
|
211
|
-
import { IRequest } from '
|
|
212
|
-
import { IResponse } from '../../http/Response';
|
|
213
|
-
import { Controller } from '../../http/Controller';
|
|
214
|
+
import { type IRequest, type IResponse, Controller } from '@zintrust/core';
|
|
214
215
|
|
|
215
216
|
export const ${className} = {
|
|
216
217
|
...Controller,
|
|
@@ -263,7 +264,7 @@ function generateExampleModel(options) {
|
|
|
263
264
|
* Example Model for ${options.name} Service
|
|
264
265
|
*/
|
|
265
266
|
|
|
266
|
-
import { Model } from '
|
|
267
|
+
import { Model } from '@zintrust/core';
|
|
267
268
|
|
|
268
269
|
export const Example = Model.define({
|
|
269
270
|
table: '${options.name}',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TemplateEngine.d.ts","sourceRoot":"","sources":["../../../../src/cli/scaffolding/TemplateEngine.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,iBAAiB;IAChC,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;CACtD;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAmDD;;GAEG;AACH,eAAO,MAAM,cAAc;sBAjDM,MAAM,aAAa,iBAAiB,KAAG,MAAM;6BAA7C,MAAM,aAAa,iBAAiB,KAAG,MAAM;0BAA7C,MAAM,aAAa,iBAAiB,KAAG,MAAM;6BAiBpE,iBAAiB,YACf,iBAAiB,KAC1B,iBAAiB;4BASmB,MAAM,KAAG,OAAO;gCASZ,MAAM,KAAG,MAAM,EAAE;EAmB1D,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,
|
|
1
|
+
{"version":3,"file":"TemplateEngine.d.ts","sourceRoot":"","sources":["../../../../src/cli/scaffolding/TemplateEngine.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,iBAAiB;IAChC,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;CACtD;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAmDD;;GAEG;AACH,eAAO,MAAM,cAAc;sBAjDM,MAAM,aAAa,iBAAiB,KAAG,MAAM;6BAA7C,MAAM,aAAa,iBAAiB,KAAG,MAAM;0BAA7C,MAAM,aAAa,iBAAiB,KAAG,MAAM;6BAiBpE,iBAAiB,YACf,iBAAiB,KAC1B,iBAAiB;4BASmB,MAAM,KAAG,OAAO;gCASZ,MAAM,KAAG,MAAM,EAAE;EAmB1D,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CA8CvD,CAAC"}
|
|
@@ -70,7 +70,6 @@ export const BUILT_IN_TEMPLATES = {
|
|
|
70
70
|
'routes',
|
|
71
71
|
'tests/unit',
|
|
72
72
|
'tests/integration',
|
|
73
|
-
'config',
|
|
74
73
|
'database/migrations',
|
|
75
74
|
'database/seeders',
|
|
76
75
|
],
|
|
@@ -95,7 +94,6 @@ export const BUILT_IN_TEMPLATES = {
|
|
|
95
94
|
'routes',
|
|
96
95
|
'tests/unit',
|
|
97
96
|
'tests/integration',
|
|
98
|
-
'config',
|
|
99
97
|
'database/migrations',
|
|
100
98
|
'database/seeders',
|
|
101
99
|
'services',
|
|
@@ -6,10 +6,10 @@
|
|
|
6
6
|
* - Generates into application folders (default: src/mail/markdown and src/notification/markdown)
|
|
7
7
|
* - Uses FileGenerator for consistent file I/O + logging
|
|
8
8
|
*/
|
|
9
|
-
import { FileGenerator } from '../scaffolding/FileGenerator';
|
|
10
|
-
import { Logger } from '../../config/logger';
|
|
11
|
-
import { ErrorFactory } from '../../exceptions/ZintrustError';
|
|
12
|
-
import * as path from '../../node-singletons/path';
|
|
9
|
+
import { FileGenerator } from '../scaffolding/FileGenerator.js';
|
|
10
|
+
import { Logger } from '../../config/logger.js';
|
|
11
|
+
import { ErrorFactory } from '../../exceptions/ZintrustError.js';
|
|
12
|
+
import * as path from '../../node-singletons/path.js';
|
|
13
13
|
const normalizeList = (items) => {
|
|
14
14
|
const out = [];
|
|
15
15
|
for (const raw of items) {
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
* Workflow Generator
|
|
3
3
|
* Generates GitHub Actions workflows for deployment and CI/CD
|
|
4
4
|
*/
|
|
5
|
-
import { FileGenerator } from '../scaffolding/FileGenerator';
|
|
6
|
-
import { Logger } from '../../config/logger';
|
|
7
|
-
import { fsPromises as fs } from '../../node-singletons/fs';
|
|
8
|
-
import * as path from '../../node-singletons/path';
|
|
5
|
+
import { FileGenerator } from '../scaffolding/FileGenerator.js';
|
|
6
|
+
import { Logger } from '../../config/logger.js';
|
|
7
|
+
import { fsPromises as fs } from '../../node-singletons/fs.js';
|
|
8
|
+
import * as path from '../../node-singletons/path.js';
|
|
9
9
|
/**
|
|
10
10
|
* Generate a deployment workflow
|
|
11
11
|
*/
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Scaffolding Module Exports
|
|
3
3
|
*/
|
|
4
|
-
export { ControllerGenerator } from '../scaffolding/ControllerGenerator';
|
|
5
|
-
export { FactoryGenerator } from '../scaffolding/FactoryGenerator';
|
|
6
|
-
export { FeatureScaffolder } from '../scaffolding/FeatureScaffolder';
|
|
7
|
-
export { FileGenerator } from '../scaffolding/FileGenerator';
|
|
8
|
-
export { MigrationGenerator } from '../scaffolding/MigrationGenerator';
|
|
9
|
-
export { ModelGenerator } from '../scaffolding/ModelGenerator';
|
|
10
|
-
export { ProjectScaffolder } from '../scaffolding/ProjectScaffolder';
|
|
11
|
-
export { RequestFactoryGenerator } from '../scaffolding/RequestFactoryGenerator';
|
|
12
|
-
export { ResponseFactoryGenerator } from '../scaffolding/ResponseFactoryGenerator';
|
|
13
|
-
export { RouteGenerator } from '../scaffolding/RouteGenerator';
|
|
14
|
-
export { SeederGenerator } from '../scaffolding/SeederGenerator';
|
|
15
|
-
export { ServiceIntegrationTestGenerator } from '../scaffolding/ServiceIntegrationTestGenerator';
|
|
16
|
-
export { ServiceRequestFactoryGenerator } from '../scaffolding/ServiceRequestFactoryGenerator';
|
|
17
|
-
export { ServiceScaffolder } from '../scaffolding/ServiceScaffolder';
|
|
18
|
-
export { BUILT_IN_TEMPLATES, TemplateEngine } from '../scaffolding/TemplateEngine';
|
|
19
|
-
export { TemplateGenerator } from '../scaffolding/TemplateGenerator';
|
|
4
|
+
export { ControllerGenerator } from '../scaffolding/ControllerGenerator.js';
|
|
5
|
+
export { FactoryGenerator } from '../scaffolding/FactoryGenerator.js';
|
|
6
|
+
export { FeatureScaffolder } from '../scaffolding/FeatureScaffolder.js';
|
|
7
|
+
export { FileGenerator } from '../scaffolding/FileGenerator.js';
|
|
8
|
+
export { MigrationGenerator } from '../scaffolding/MigrationGenerator.js';
|
|
9
|
+
export { ModelGenerator } from '../scaffolding/ModelGenerator.js';
|
|
10
|
+
export { ProjectScaffolder } from '../scaffolding/ProjectScaffolder.js';
|
|
11
|
+
export { RequestFactoryGenerator } from '../scaffolding/RequestFactoryGenerator.js';
|
|
12
|
+
export { ResponseFactoryGenerator } from '../scaffolding/ResponseFactoryGenerator.js';
|
|
13
|
+
export { RouteGenerator } from '../scaffolding/RouteGenerator.js';
|
|
14
|
+
export { SeederGenerator } from '../scaffolding/SeederGenerator.js';
|
|
15
|
+
export { ServiceIntegrationTestGenerator } from '../scaffolding/ServiceIntegrationTestGenerator.js';
|
|
16
|
+
export { ServiceRequestFactoryGenerator } from '../scaffolding/ServiceRequestFactoryGenerator.js';
|
|
17
|
+
export { ServiceScaffolder } from '../scaffolding/ServiceScaffolder.js';
|
|
18
|
+
export { BUILT_IN_TEMPLATES, TemplateEngine } from '../scaffolding/TemplateEngine.js';
|
|
19
|
+
export { TemplateGenerator } from '../scaffolding/TemplateGenerator.js';
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { Logger } from '../../config/logger';
|
|
2
|
-
import { ErrorFactory } from '../../exceptions/ZintrustError';
|
|
3
|
-
import fs from '../../node-singletons/fs';
|
|
4
|
-
import * as path from '../../node-singletons/path';
|
|
1
|
+
import { Logger } from '../../config/logger.js';
|
|
2
|
+
import { ErrorFactory } from '../../exceptions/ZintrustError.js';
|
|
3
|
+
import fs from '../../node-singletons/fs.js';
|
|
4
|
+
import * as path from '../../node-singletons/path.js';
|
|
5
5
|
const readRootPackageJson = (rootPath) => {
|
|
6
6
|
const rootPackageJsonPath = path.join(rootPath, 'package.json');
|
|
7
7
|
if (!fs.existsSync(rootPackageJsonPath)) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { existsSync, readFileSync } from '../../node-singletons/fs';
|
|
2
|
-
import { join } from '../../node-singletons/path';
|
|
1
|
+
import { existsSync, readFileSync } from '../../node-singletons/fs.js';
|
|
2
|
+
import { join } from '../../node-singletons/path.js';
|
|
3
3
|
const normalizeAppMode = (value) => {
|
|
4
4
|
const normalized = value.trim().toLowerCase();
|
|
5
5
|
if (normalized === 'production' || normalized === 'pro' || normalized === 'prod')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spawn.d.ts","sourceRoot":"","sources":["../../../../src/cli/utils/spawn.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AA8BD,eAAO,MAAM,SAAS;wBACM,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"spawn.d.ts","sourceRoot":"","sources":["../../../../src/cli/utils/spawn.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AA8BD,eAAO,MAAM,SAAS;wBACM,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;EAwE7D,CAAC"}
|
package/src/cli/utils/spawn.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { appConfig } from '../../config/app';
|
|
2
|
-
import { ErrorFactory } from '../../exceptions/ZintrustError';
|
|
3
|
-
import { spawn } from '../../node-singletons/child-process';
|
|
4
|
-
import { existsSync } from '../../node-singletons/fs';
|
|
5
|
-
import * as path from '../../node-singletons/path';
|
|
1
|
+
import { appConfig } from '../../config/app.js';
|
|
2
|
+
import { ErrorFactory } from '../../exceptions/ZintrustError.js';
|
|
3
|
+
import { spawn } from '../../node-singletons/child-process.js';
|
|
4
|
+
import { existsSync } from '../../node-singletons/fs.js';
|
|
5
|
+
import * as path from '../../node-singletons/path.js';
|
|
6
6
|
const getExitCode = (exitCode, signal) => {
|
|
7
7
|
if (typeof exitCode === 'number')
|
|
8
8
|
return exitCode;
|
|
@@ -38,13 +38,24 @@ export const SpawnUtil = Object.freeze({
|
|
|
38
38
|
env: input.env ?? appConfig.getSafeEnv(),
|
|
39
39
|
stdio: 'inherit',
|
|
40
40
|
});
|
|
41
|
-
|
|
41
|
+
// In interactive shells, the foreground process group already receives SIGINT
|
|
42
|
+
// (and often SIGTERM) so forwarding can cause duplicates. `tsx watch` is
|
|
43
|
+
// especially sensitive here and can print "Previous process hasn't exited yet. Force killing...".
|
|
44
|
+
const forwardSignals = typeof input.forwardSignals === 'boolean' ? input.forwardSignals : !process.stdin.isTTY;
|
|
42
45
|
const forwardSignal = (signal) => {
|
|
43
46
|
try {
|
|
44
47
|
child.kill(signal);
|
|
45
48
|
}
|
|
46
49
|
catch (error) {
|
|
47
|
-
|
|
50
|
+
const wrapped = ErrorFactory.createTryCatchError('Failed to forward signal to child process', error);
|
|
51
|
+
// Best-effort logging; then rethrow (tests/assertions rely on this behavior).
|
|
52
|
+
try {
|
|
53
|
+
process.stderr.write(`${String(wrapped.message)}\n`);
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
// ignore
|
|
57
|
+
}
|
|
58
|
+
throw wrapped;
|
|
48
59
|
}
|
|
49
60
|
};
|
|
50
61
|
const onSigint = () => forwardSignal('SIGINT');
|
package/src/common/AwsSigV4.js
CHANGED