@gravito/scaffold 4.0.0 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -24,6 +24,8 @@ interface ProfileConfig {
24
24
  };
25
25
  /** List of enabled features and orbits. */
26
26
  features: string[];
27
+ /** Workers configuration level for job queue system */
28
+ workers?: 'basic' | 'advanced' | 'production';
27
29
  }
28
30
  /**
29
31
  * ProfileResolver manages the resolution of project profiles and feature add-ons.
@@ -204,6 +206,8 @@ interface ScaffoldOptions {
204
206
  targetDir: string;
205
207
  /** The primary architectural pattern to apply. */
206
208
  architecture: ArchitectureType;
209
+ /** For DDD architecture: the module template type. @default 'simple' */
210
+ dddModuleType?: 'simple' | 'advanced' | 'cqrs-query';
207
211
  /** Preferred package manager for dependency installation. @default 'bun' */
208
212
  packageManager?: 'bun' | 'npm' | 'yarn' | 'pnpm';
209
213
  /** Whether to run `git init` in the target directory. @default true */
@@ -374,6 +378,13 @@ declare class CleanArchitectureGenerator extends BaseGenerator {
374
378
  * - Each context has Domain, Application, Infrastructure, UserInterface layers
375
379
  */
376
380
 
381
+ /**
382
+ * DDD Module Type options
383
+ * - simple: Basic CRUD structure
384
+ * - advanced: Complete Event Sourcing with Aggregates, Events, EventStore, and EventApplier
385
+ * - cqrs-query: CQRS Query Side with Read Models, Event Projectors, Query Services
386
+ */
387
+ type DddModuleType = 'simple' | 'advanced' | 'cqrs-query';
377
388
  /**
378
389
  * DddGenerator implements the full Domain-Driven Design (DDD) architectural pattern.
379
390
  *
@@ -381,18 +392,36 @@ declare class CleanArchitectureGenerator extends BaseGenerator {
381
392
  * Value Objects, Domain Events, and a Shared Kernel. It is ideal for complex
382
393
  * enterprise applications with rich business logic.
383
394
  *
395
+ * Supports multiple module templates:
396
+ * - **simple**: Basic DDD structure with CRUD operations
397
+ * - **advanced**: Complete Event Sourcing with Aggregate Roots, Domain Events, EventStore
398
+ * - **cqrs-query**: CQRS read-side with Event Projectors and denormalized Read Models
399
+ *
384
400
  * @public
385
401
  * @since 3.0.0
386
402
  */
387
403
  declare class DddGenerator extends BaseGenerator {
388
404
  private moduleGenerator;
405
+ private advancedModuleGenerator;
406
+ private cqrsQueryModuleGenerator;
389
407
  private sharedKernelGenerator;
390
408
  private bootstrapGenerator;
409
+ private moduleType;
391
410
  constructor(config: GeneratorConfig);
411
+ /**
412
+ * Set the module type for generated modules
413
+ * @param type - 'simple' for basic CRUD, 'advanced' for Event Sourcing, 'cqrs-query' for CQRS Read Side
414
+ * @default 'simple'
415
+ */
416
+ setModuleType(type: DddModuleType): void;
392
417
  get architectureType(): "ddd";
393
418
  get displayName(): string;
394
419
  get description(): string;
395
420
  getDirectoryStructure(context: GeneratorContext): DirectoryNode[];
421
+ /**
422
+ * Get the active module generator type
423
+ */
424
+ private getModuleGenerator;
396
425
  /**
397
426
  * Override package.json for DDD architecture (uses main.ts instead of bootstrap.ts)
398
427
  */
@@ -400,6 +429,207 @@ declare class DddGenerator extends BaseGenerator {
400
429
  protected generateArchitectureDoc(context: GeneratorContext): string;
401
430
  }
402
431
 
432
+ /**
433
+ * AdvancedModuleGenerator - 進階 DDD 模組生成器(Event Sourcing)
434
+ *
435
+ * 為 Bounded Context 生成完整的 Event Sourcing 架構:
436
+ * - Aggregate Root(聚合根)
437
+ * - Domain Events(領域事件,支援版本管理)
438
+ * - Event Store(InMemory + Database 實現)
439
+ * - EventApplier(純函式事件應用)
440
+ * - EventDeserializer(事件反序列化)
441
+ * - 自動化的測試框架
442
+ *
443
+ * 使用場景:
444
+ * ```bash
445
+ * bun run scaffold Payment --type advanced
446
+ * # 生成完整的 Payment 模組,包含 Event Sourcing 支援
447
+ * ```
448
+ */
449
+
450
+ declare class AdvancedModuleGenerator {
451
+ /**
452
+ * 生成進階 DDD 模組結構(Event Sourcing)
453
+ *
454
+ * 生成檔案:
455
+ * - Domain/AggregateRoots/{Name}.ts
456
+ * - Domain/Events/{Name}*Event.ts(3 個事件示例)
457
+ * - Domain/Services/{Name}EventApplier.ts
458
+ * - Domain/Repositories/I{Name}EventStore.ts
459
+ * - Domain/ValueObjects/{Name}Status.ts
460
+ * - Infrastructure/EventStore/InMemory{Name}EventStore.ts
461
+ * - Infrastructure/EventStore/Database{Name}EventStore.ts
462
+ * - Infrastructure/EventStore/{Name}EventDeserializer.ts
463
+ * - Application/Services/Create{Name}Service.ts
464
+ * - 完整的測試框架
465
+ */
466
+ generate(moduleName: string, _context: GeneratorContext): DirectoryNode;
467
+ private generateAggregateRoot;
468
+ private generateEvent;
469
+ private generateStatusValueObject;
470
+ private generateIdValueObject;
471
+ private generateEventApplier;
472
+ private generateEventStoreInterface;
473
+ private generateInMemoryEventStore;
474
+ private generateDatabaseEventStore;
475
+ private generateEventDeserializer;
476
+ private generateApplicationService;
477
+ private generateDTO;
478
+ private generateController;
479
+ private generateRoutes;
480
+ private generateModuleIndex;
481
+ private toKebabCase;
482
+ private toSnakeCase;
483
+ }
484
+
485
+ /**
486
+ * CQRSQueryModuleGenerator - CQRS 查詢側模組生成器
487
+ *
488
+ * 為查詢側(讀端)生成完整的 CQRS 架構:
489
+ * - Read Model(讀模型,查詢優化的數據結構)
490
+ * - Event Projector(事件投影器,將事件轉化為讀模型)
491
+ * - Query Service(查詢服務,提供查詢接口)
492
+ * - Event Subscriber(事件訂閱器,監聽並投影事件)
493
+ * - HTTP Controllers(查詢端點)
494
+ *
495
+ * 與 Phase 2a AdvancedModuleGenerator 配合使用:
496
+ * - Phase 2a: 寫側(事件溯源)
497
+ * - Phase 2b: 讀側(CQRS 投影) ← 本生成器
498
+ *
499
+ * 使用場景:
500
+ * ```bash
501
+ * bun run scaffold WalletBalance --type cqrs-query
502
+ * # 生成完整的查詢模組,訂閱來自 PSC 模組的事件
503
+ *
504
+ * bun run scaffold MemberStats --type cqrs-query
505
+ * # 生成會員統計查詢模組,訂閱來自 MOC 模組的事件
506
+ * ```
507
+ */
508
+
509
+ interface CQRSQueryConfig {
510
+ moduleName: string;
511
+ modulePrefix?: string;
512
+ description?: string;
513
+ readModel: {
514
+ fields: FieldDefinition[];
515
+ primaryKey: string;
516
+ indexes?: string[];
517
+ };
518
+ events: {
519
+ subscribedEvents: EventMapping[];
520
+ };
521
+ queries?: {
522
+ methods: QueryMethodDefinition[];
523
+ };
524
+ cache?: {
525
+ enabled: boolean;
526
+ ttl?: number;
527
+ };
528
+ }
529
+ interface FieldDefinition {
530
+ name: string;
531
+ type: 'string' | 'number' | 'boolean' | 'date' | 'decimal';
532
+ description?: string;
533
+ indexed?: boolean;
534
+ }
535
+ interface EventMapping {
536
+ eventType: string;
537
+ eventClass: string;
538
+ handlerMethod: string;
539
+ updates: FieldUpdate[];
540
+ }
541
+ interface FieldUpdate {
542
+ fieldName: string;
543
+ operation: 'set' | 'add' | 'increment';
544
+ }
545
+ interface QueryMethodDefinition {
546
+ name: string;
547
+ parameters: QueryParameter[];
548
+ returnType: string;
549
+ description?: string;
550
+ }
551
+ interface QueryParameter {
552
+ name: string;
553
+ type: string;
554
+ required?: boolean;
555
+ }
556
+ /**
557
+ * CQRS 查詢側模組生成器
558
+ * 生成完整的查詢端(讀側)模組架構
559
+ */
560
+ declare class CQRSQueryModuleGenerator {
561
+ /**
562
+ * 生成 CQRS 查詢側模組結構
563
+ *
564
+ * 生成檔案:
565
+ * - Domain/ReadModels/{Name}ReadModel.ts
566
+ * - Domain/Projectors/{Name}EventProjector.ts
567
+ * - Application/Services/Query{Name}Service.ts
568
+ * - Application/DTOs/{Name}ReadDTO.ts
569
+ * - Infrastructure/Subscribers/{Name}ProjectionSubscriber.ts
570
+ * - Infrastructure/Cache/{Name}ReadModelCache.ts
571
+ * - Presentation/Controllers/{Name}QueryController.ts
572
+ * - index.ts
573
+ *
574
+ * @param moduleName - 模組名稱(例:'Wallet')
575
+ * @param _context - 生成器上下文(當前未使用,預留供未來擴展)
576
+ * @returns 模組目錄結構
577
+ */
578
+ generate(moduleName: string, _context: GeneratorContext): DirectoryNode;
579
+ /**
580
+ * 生成讀模型檔案
581
+ */
582
+ private generateReadModel;
583
+ /**
584
+ * 生成事件投影器檔案
585
+ */
586
+ private generateProjector;
587
+ /**
588
+ * 生成查詢服務檔案
589
+ */
590
+ private generateQueryService;
591
+ /**
592
+ * 生成查詢 DTO 檔案
593
+ */
594
+ private generateQueryDTO;
595
+ /**
596
+ * 生成倉庫介面
597
+ */
598
+ private generateRepositoryInterface;
599
+ /**
600
+ * 生成倉庫實現
601
+ */
602
+ private generateRepositoryImplementation;
603
+ /**
604
+ * 生成事件訂閱器
605
+ */
606
+ private generateSubscriber;
607
+ /**
608
+ * 生成快取層
609
+ */
610
+ private generateCache;
611
+ /**
612
+ * 生成 HTTP 控制器
613
+ */
614
+ private generateController;
615
+ /**
616
+ * 生成路由檔案
617
+ */
618
+ private generateRoutes;
619
+ /**
620
+ * 生成模組索引檔案
621
+ */
622
+ private generateIndex;
623
+ /**
624
+ * 將字符串轉換為 kebab-case
625
+ */
626
+ private toKebabCase;
627
+ /**
628
+ * 將字符串轉換為 snake_case
629
+ */
630
+ private toSnakeCase;
631
+ }
632
+
403
633
  /**
404
634
  * EnterpriseMvcGenerator - Enterprise MVC Architecture Generator
405
635
  *
@@ -466,10 +696,15 @@ declare class SatelliteGenerator extends BaseGenerator {
466
696
  get displayName(): string;
467
697
  get description(): string;
468
698
  getDirectoryStructure(context: GeneratorContext): DirectoryNode[];
469
- private generateEntity;
699
+ private generateIdValueObject;
700
+ private generateAggregate;
701
+ private generateCreatedEvent;
470
702
  private generateRepositoryInterface;
471
703
  private generateUseCase;
472
704
  private generateAtlasRepository;
705
+ private generateUnitTest;
706
+ private generateIntegrationTest;
707
+ private generateController;
473
708
  private generateEntryPoint;
474
709
  private generateManifest;
475
710
  protected generatePackageJson(context: GeneratorContext): string;
@@ -669,7 +904,8 @@ declare class Scaffold {
669
904
  */
670
905
  create(options: ScaffoldOptions): Promise<ScaffoldResult>;
671
906
  /**
672
- * Create a generator for the specified architecture.
907
+ * Create a generator for the specified architecture with options.
908
+ * @param options - Scaffold options including architecture type and module type for DDD
673
909
  */
674
910
  private createGenerator;
675
911
  /**
@@ -684,4 +920,4 @@ declare class Scaffold {
684
920
  generateProvider(_targetDir: string, _providerName: string): Promise<ScaffoldResult>;
685
921
  }
686
922
 
687
- export { type ArchitectureType, BaseGenerator, CleanArchitectureGenerator, DddGenerator, DependencyValidator, type DetectedEnvironment, EnterpriseMvcGenerator, EnvironmentDetector, FileMerger, type GeneratorConfig, type GeneratorContext, type LockFile, LockGenerator, type PackageJson, type ProfileConfig, ProfileResolver, type ProfileType, SatelliteGenerator, Scaffold, type ScaffoldOptions, type StubConfig, StubGenerator, type StubVariables, type ValidationResult };
923
+ export { AdvancedModuleGenerator, type ArchitectureType, BaseGenerator, type CQRSQueryConfig, CQRSQueryModuleGenerator, CleanArchitectureGenerator, DddGenerator, type DddModuleType, DependencyValidator, type DetectedEnvironment, EnterpriseMvcGenerator, EnvironmentDetector, FileMerger, type GeneratorConfig, type GeneratorContext, type LockFile, LockGenerator, type PackageJson, type ProfileConfig, ProfileResolver, type ProfileType, SatelliteGenerator, Scaffold, type ScaffoldOptions, type StubConfig, StubGenerator, type StubVariables, type ValidationResult };