@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/README.md +30 -6
- package/dist/index.cjs +404 -67
- package/dist/index.d.ts +239 -3
- package/dist/index.js +404 -67
- package/package.json +5 -2
- package/dist/index.d.cts +0 -687
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
|
|
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 };
|