@gravito/scaffold 1.0.0-beta.1

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.
@@ -0,0 +1,462 @@
1
+ import Handlebars from 'handlebars';
2
+
3
+ /**
4
+ * Architecture types supported by the scaffolding system.
5
+ */
6
+ type ArchitectureType = 'enterprise-mvc' | 'clean' | 'ddd';
7
+ /**
8
+ * Options for scaffolding a new project.
9
+ */
10
+ interface ScaffoldOptions {
11
+ /**
12
+ * Project name
13
+ */
14
+ name: string;
15
+ /**
16
+ * Target directory (absolute path)
17
+ */
18
+ targetDir: string;
19
+ /**
20
+ * Architecture type
21
+ */
22
+ architecture: ArchitectureType;
23
+ /**
24
+ * Package manager to use
25
+ * @default 'bun'
26
+ */
27
+ packageManager?: 'bun' | 'npm' | 'yarn' | 'pnpm';
28
+ /**
29
+ * Whether to initialize git
30
+ * @default true
31
+ */
32
+ initGit?: boolean;
33
+ /**
34
+ * Whether to install dependencies
35
+ * @default true
36
+ */
37
+ installDeps?: boolean;
38
+ /**
39
+ * Additional context variables for templates
40
+ */
41
+ context?: Record<string, unknown>;
42
+ }
43
+ /**
44
+ * Result of scaffolding operation.
45
+ */
46
+ interface ScaffoldResult {
47
+ success: boolean;
48
+ targetDir: string;
49
+ filesCreated: string[];
50
+ errors?: string[];
51
+ }
52
+ /**
53
+ * Directory structure node.
54
+ */
55
+ interface DirectoryNode {
56
+ type: 'file' | 'directory';
57
+ name: string;
58
+ content?: string;
59
+ template?: string;
60
+ children?: DirectoryNode[];
61
+ }
62
+
63
+ /**
64
+ * StubGenerator - Abstract template processor for generating code files.
65
+ *
66
+ * Provides a flexible system for processing stub templates with Handlebars,
67
+ * enabling extensible code generation for any file type.
68
+ *
69
+ * @example
70
+ * ```typescript
71
+ * const generator = new StubGenerator({
72
+ * stubsDir: './stubs',
73
+ * outputDir: './src',
74
+ * });
75
+ *
76
+ * await generator.generate('controller.stub', 'Controllers/UserController.ts', {
77
+ * name: 'User',
78
+ * namespace: 'App\\Controllers',
79
+ * });
80
+ * ```
81
+ */
82
+
83
+ /**
84
+ * Variables passed to stub templates.
85
+ */
86
+ interface StubVariables {
87
+ [key: string]: unknown;
88
+ }
89
+ /**
90
+ * Configuration for StubGenerator.
91
+ */
92
+ interface StubConfig {
93
+ /**
94
+ * Directory containing stub templates
95
+ */
96
+ stubsDir: string;
97
+ /**
98
+ * Output directory for generated files
99
+ */
100
+ outputDir: string;
101
+ /**
102
+ * Default variables applied to all templates
103
+ */
104
+ defaultVariables?: StubVariables;
105
+ /**
106
+ * Custom Handlebars helpers
107
+ */
108
+ helpers?: Record<string, Handlebars.HelperDelegate>;
109
+ }
110
+ declare class StubGenerator {
111
+ private config;
112
+ private handlebars;
113
+ constructor(config: StubConfig);
114
+ /**
115
+ * Register built-in Handlebars helpers.
116
+ */
117
+ private registerBuiltinHelpers;
118
+ /**
119
+ * Generate a file from a stub template.
120
+ *
121
+ * @param stubName - Name of the stub file (relative to stubsDir)
122
+ * @param outputPath - Output path (relative to outputDir)
123
+ * @param variables - Template variables
124
+ * @returns Path to the generated file
125
+ */
126
+ generate(stubName: string, outputPath: string, variables?: StubVariables): Promise<string>;
127
+ /**
128
+ * Generate multiple files from a stub template.
129
+ *
130
+ * @param stubName - Name of the stub file
131
+ * @param outputs - Array of [outputPath, variables] tuples
132
+ * @returns Array of generated file paths
133
+ */
134
+ generateMany(stubName: string, outputs: [string, StubVariables][]): Promise<string[]>;
135
+ /**
136
+ * Render a template string directly.
137
+ *
138
+ * @param template - Template string
139
+ * @param variables - Template variables
140
+ * @returns Rendered content
141
+ */
142
+ render(template: string, variables?: StubVariables): string;
143
+ /**
144
+ * Register a custom Handlebars helper.
145
+ *
146
+ * @param name - Helper name
147
+ * @param helper - Helper function
148
+ */
149
+ registerHelper(name: string, helper: Handlebars.HelperDelegate): void;
150
+ /**
151
+ * Register a Handlebars partial.
152
+ *
153
+ * @param name - Partial name
154
+ * @param partial - Partial template string
155
+ */
156
+ registerPartial(name: string, partial: string): void;
157
+ }
158
+
159
+ /**
160
+ * BaseGenerator - Abstract base class for architecture generators.
161
+ *
162
+ * Provides common functionality for generating project structures,
163
+ * including directory creation, file generation, and context management.
164
+ */
165
+
166
+ /**
167
+ * Context passed to generators during scaffolding.
168
+ */
169
+ interface GeneratorContext {
170
+ /**
171
+ * Project name
172
+ */
173
+ name: string;
174
+ /**
175
+ * Project name in various cases
176
+ */
177
+ namePascalCase: string;
178
+ nameCamelCase: string;
179
+ nameSnakeCase: string;
180
+ nameKebabCase: string;
181
+ /**
182
+ * Target directory
183
+ */
184
+ targetDir: string;
185
+ /**
186
+ * Architecture type
187
+ */
188
+ architecture: ArchitectureType;
189
+ /**
190
+ * Package manager
191
+ */
192
+ packageManager: 'bun' | 'npm' | 'yarn' | 'pnpm';
193
+ /**
194
+ * Current year (for license headers)
195
+ */
196
+ year: string;
197
+ /**
198
+ * Current date
199
+ */
200
+ date: string;
201
+ /**
202
+ * Additional custom context
203
+ */
204
+ [key: string]: unknown;
205
+ }
206
+ /**
207
+ * Configuration for generators.
208
+ */
209
+ interface GeneratorConfig {
210
+ /**
211
+ * Directory containing stub templates
212
+ */
213
+ templatesDir: string;
214
+ /**
215
+ * Verbose logging
216
+ */
217
+ verbose?: boolean;
218
+ }
219
+ /**
220
+ * Abstract base class for architecture generators.
221
+ */
222
+ declare abstract class BaseGenerator {
223
+ protected config: GeneratorConfig;
224
+ protected stubGenerator: StubGenerator;
225
+ protected filesCreated: string[];
226
+ constructor(config: GeneratorConfig);
227
+ /**
228
+ * Get the architecture type this generator handles.
229
+ */
230
+ abstract get architectureType(): ArchitectureType;
231
+ /**
232
+ * Get the display name for this architecture.
233
+ */
234
+ abstract get displayName(): string;
235
+ /**
236
+ * Get the description for this architecture.
237
+ */
238
+ abstract get description(): string;
239
+ /**
240
+ * Get the directory structure for this architecture.
241
+ */
242
+ abstract getDirectoryStructure(context: GeneratorContext): DirectoryNode[];
243
+ /**
244
+ * Generate the project scaffold.
245
+ *
246
+ * @param context - Generator context
247
+ * @returns Array of created file paths
248
+ */
249
+ generate(context: GeneratorContext): Promise<string[]>;
250
+ /**
251
+ * Create directory structure recursively.
252
+ */
253
+ protected createStructure(basePath: string, nodes: DirectoryNode[], context: GeneratorContext): Promise<void>;
254
+ /**
255
+ * Generate common files (package.json, .env, etc.)
256
+ */
257
+ protected generateCommonFiles(context: GeneratorContext): Promise<void>;
258
+ /**
259
+ * Write a file and track it.
260
+ */
261
+ protected writeFile(basePath: string, relativePath: string, content: string): Promise<void>;
262
+ /**
263
+ * Generate package.json content.
264
+ */
265
+ protected generatePackageJson(context: GeneratorContext): string;
266
+ /**
267
+ * Generate .env.example content.
268
+ */
269
+ protected generateEnvExample(context: GeneratorContext): string;
270
+ /**
271
+ * Generate .gitignore content.
272
+ */
273
+ protected generateGitignore(): string;
274
+ /**
275
+ * Generate tsconfig.json content.
276
+ */
277
+ protected generateTsConfig(): string;
278
+ /**
279
+ * Generate ARCHITECTURE.md content.
280
+ * Override in subclasses for architecture-specific docs.
281
+ */
282
+ protected abstract generateArchitectureDoc(context: GeneratorContext): string;
283
+ /**
284
+ * Log a message if verbose mode is enabled.
285
+ */
286
+ protected log(message: string): void;
287
+ /**
288
+ * Create generator context from options.
289
+ */
290
+ static createContext(name: string, targetDir: string, architecture: ArchitectureType, packageManager?: 'bun' | 'npm' | 'yarn' | 'pnpm', extra?: Record<string, unknown>): GeneratorContext;
291
+ }
292
+
293
+ /**
294
+ * CleanArchitectureGenerator - Clean Architecture Generator
295
+ *
296
+ * Generates a structure following Uncle Bob's Clean Architecture:
297
+ * - Domain: Entities, Value Objects, Interfaces (pure business logic)
298
+ * - Application: Use Cases, DTOs
299
+ * - Infrastructure: Database, External Services
300
+ * - Interface: HTTP Controllers, Presenters
301
+ */
302
+
303
+ declare class CleanArchitectureGenerator extends BaseGenerator {
304
+ get architectureType(): "clean";
305
+ get displayName(): string;
306
+ get description(): string;
307
+ getDirectoryStructure(context: GeneratorContext): DirectoryNode[];
308
+ private generateAppConfig;
309
+ private generateDatabaseConfig;
310
+ private generateAuthConfig;
311
+ private generateCacheConfig;
312
+ private generateLoggingConfig;
313
+ private generateBaseEntity;
314
+ private generateUserEntity;
315
+ private generateBaseValueObject;
316
+ private generateEmailValueObject;
317
+ private generateUserRepositoryInterface;
318
+ private generateDomainException;
319
+ private generateCreateUserUseCase;
320
+ private generateGetUserUseCase;
321
+ private generateUserDTO;
322
+ private generateMailServiceInterface;
323
+ private generateUserRepository;
324
+ private generateMailService;
325
+ private generateAppServiceProvider;
326
+ private generateRepositoryServiceProvider;
327
+ private generateUserController;
328
+ private generateApiRoutes;
329
+ private generateUserPresenter;
330
+ private generateBootstrap;
331
+ protected generateArchitectureDoc(context: GeneratorContext): string;
332
+ }
333
+
334
+ /**
335
+ * DddGenerator - Domain-Driven Design Architecture Generator
336
+ *
337
+ * Generates a DDD structure with:
338
+ * - Bounded Contexts (e.g., Ordering, Catalog, Identity)
339
+ * - Shared Kernel for cross-context concerns
340
+ * - Each context has Domain, Application, Infrastructure, UserInterface layers
341
+ */
342
+
343
+ declare class DddGenerator extends BaseGenerator {
344
+ get architectureType(): "ddd";
345
+ get displayName(): string;
346
+ get description(): string;
347
+ getDirectoryStructure(context: GeneratorContext): DirectoryNode[];
348
+ private generateBootstrapDirectory;
349
+ private generateShared;
350
+ private generateModule;
351
+ private generateBootstrapApp;
352
+ private generateProvidersRegistry;
353
+ private generateEventsRegistry;
354
+ private generateRoutesRegistry;
355
+ private generateMainEntry;
356
+ private generateModulesConfig;
357
+ private generateModuleServiceProvider;
358
+ /**
359
+ * Override package.json for DDD architecture (uses main.ts instead of bootstrap.ts)
360
+ */
361
+ protected generatePackageJson(context: GeneratorContext): string;
362
+ private generateAppConfig;
363
+ private generateDatabaseConfig;
364
+ private generateCacheConfig;
365
+ private generateLoggingConfig;
366
+ private generateIdValueObject;
367
+ private generateMoneyValueObject;
368
+ private generateEmailValueObject;
369
+ private generateDomainEvent;
370
+ private generateAggregateRoot;
371
+ private generateEntity;
372
+ private generateValueObject;
373
+ private generateEventDispatcher;
374
+ private generateAggregate;
375
+ private generateAggregateStatus;
376
+ private generateCreatedEvent;
377
+ private generateRepositoryInterface;
378
+ private generateCommand;
379
+ private generateCommandHandler;
380
+ private generateQuery;
381
+ private generateQueryHandler;
382
+ private generateDTO;
383
+ private generateRepository;
384
+ private generateExceptionHandler;
385
+ protected generateArchitectureDoc(context: GeneratorContext): string;
386
+ }
387
+
388
+ /**
389
+ * EnterpriseMvcGenerator - Enterprise MVC Architecture Generator
390
+ *
391
+ * Generates a Laravel-inspired MVC structure with:
392
+ * - Controllers for HTTP handling
393
+ * - Services for business logic
394
+ * - Repositories for data persistence
395
+ * - Http/Kernel for middleware management
396
+ */
397
+
398
+ declare class EnterpriseMvcGenerator extends BaseGenerator {
399
+ get architectureType(): "enterprise-mvc";
400
+ get displayName(): string;
401
+ get description(): string;
402
+ getDirectoryStructure(context: GeneratorContext): DirectoryNode[];
403
+ private generateAppConfig;
404
+ private generateDatabaseConfig;
405
+ private generateAuthConfig;
406
+ private generateCacheConfig;
407
+ private generateLoggingConfig;
408
+ private generateHttpKernel;
409
+ private generateBaseController;
410
+ private generateHomeController;
411
+ private generateAuthMiddleware;
412
+ private generateAppServiceProvider;
413
+ private generateRouteServiceProvider;
414
+ private generateExceptionHandler;
415
+ private generateBootstrap;
416
+ private generateRoutes;
417
+ protected generateArchitectureDoc(context: GeneratorContext): string;
418
+ }
419
+
420
+ /**
421
+ * Scaffold - Main API for project scaffolding
422
+ *
423
+ * Provides a unified interface for generating project structures
424
+ * with different architectural patterns.
425
+ */
426
+
427
+ declare class Scaffold {
428
+ private templatesDir;
429
+ private verbose;
430
+ constructor(options?: {
431
+ templatesDir?: string;
432
+ verbose?: boolean;
433
+ });
434
+ /**
435
+ * Get all available architecture types.
436
+ */
437
+ getArchitectureTypes(): Array<{
438
+ type: ArchitectureType;
439
+ name: string;
440
+ description: string;
441
+ }>;
442
+ /**
443
+ * Create a new project scaffold.
444
+ */
445
+ create(options: ScaffoldOptions): Promise<ScaffoldResult>;
446
+ /**
447
+ * Create a generator for the specified architecture.
448
+ */
449
+ private createGenerator;
450
+ /**
451
+ * Generate a single module (for DDD bounded context).
452
+ */
453
+ generateModule(_targetDir: string, _moduleName: string, _options?: {
454
+ architecture?: ArchitectureType;
455
+ }): Promise<ScaffoldResult>;
456
+ /**
457
+ * Generate a service provider.
458
+ */
459
+ generateProvider(_targetDir: string, _providerName: string): Promise<ScaffoldResult>;
460
+ }
461
+
462
+ export { type ArchitectureType, BaseGenerator, CleanArchitectureGenerator, DddGenerator, EnterpriseMvcGenerator, type GeneratorConfig, type GeneratorContext, Scaffold, type ScaffoldOptions, type StubConfig, StubGenerator, type StubVariables };