@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.
- package/README.md +152 -0
- package/dist/index.cjs +3269 -0
- package/dist/index.d.cts +462 -0
- package/dist/index.d.ts +462 -0
- package/dist/index.js +3227 -0
- package/package.json +48 -0
package/dist/index.d.cts
ADDED
|
@@ -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 };
|