@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 ADDED
@@ -0,0 +1,152 @@
1
+ # @gravito/scaffold
2
+
3
+ Project scaffolding generators for Gravito Framework.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ bun add @gravito/scaffold
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ### With CLI (Recommended)
14
+
15
+ ```bash
16
+ npx gravito init my-app --architecture ddd
17
+ ```
18
+
19
+ ### Programmatic API
20
+
21
+ ```typescript
22
+ import { Scaffold, type ScaffoldOptions } from '@gravito/scaffold'
23
+
24
+ const options: ScaffoldOptions = {
25
+ name: 'my-app',
26
+ architecture: 'ddd',
27
+ targetPath: './my-app',
28
+ packageManager: 'bun',
29
+ }
30
+
31
+ const scaffold = new Scaffold(options)
32
+ const result = await scaffold.generate()
33
+
34
+ console.log(`Created ${result.filesCreated} files`)
35
+ ```
36
+
37
+ ## Architecture Types
38
+
39
+ | Type | Description |
40
+ |------|-------------|
41
+ | `enterprise-mvc` | Laravel-inspired MVC structure |
42
+ | `clean` | Clean Architecture with strict dependency rules |
43
+ | `ddd` | Domain-Driven Design with bounded contexts |
44
+
45
+ ## Generators
46
+
47
+ ### BaseGenerator
48
+
49
+ Abstract base class for all generators. Provides:
50
+ - Directory structure creation
51
+ - Package.json generation
52
+ - TypeScript configuration
53
+ - Environment files
54
+ - Architecture documentation
55
+
56
+ ### StubGenerator
57
+
58
+ Handlebars-based template engine with built-in helpers:
59
+
60
+ ```typescript
61
+ import { StubGenerator } from '@gravito/scaffold'
62
+
63
+ const generator = new StubGenerator()
64
+
65
+ // Register custom helper
66
+ generator.registerHelper('uppercase', (str) => str.toUpperCase())
67
+
68
+ // Render template
69
+ const result = generator.render('Hello {{uppercase name}}!', { name: 'world' })
70
+ // => "Hello WORLD!"
71
+ ```
72
+
73
+ **Built-in Helpers:**
74
+ - `pascalCase` - Convert to PascalCase
75
+ - `camelCase` - Convert to camelCase
76
+ - `kebabCase` - Convert to kebab-case
77
+ - `snakeCase` - Convert to snake_case
78
+ - `upperCase` - Convert to UPPERCASE
79
+ - `lowerCase` - Convert to lowercase
80
+ - `pluralize` - Pluralize word
81
+ - `singularize` - Singularize word
82
+
83
+ ## Extending
84
+
85
+ Create custom generators by extending `BaseGenerator`:
86
+
87
+ ```typescript
88
+ import { BaseGenerator, type GeneratorContext, type DirectoryNode } from '@gravito/scaffold'
89
+
90
+ export class MyCustomGenerator extends BaseGenerator {
91
+ getDirectoryStructure(context: GeneratorContext): DirectoryNode[] {
92
+ return [
93
+ {
94
+ type: 'directory',
95
+ name: 'src',
96
+ children: [
97
+ { type: 'file', name: 'index.ts', content: this.generateIndex(context) },
98
+ ],
99
+ },
100
+ ]
101
+ }
102
+
103
+ protected generateArchitectureDoc(context: GeneratorContext): string {
104
+ return `# ${context.name}\n\nMy custom architecture.`
105
+ }
106
+
107
+ private generateIndex(context: GeneratorContext): string {
108
+ return `console.log('Hello from ${context.name}!')`
109
+ }
110
+ }
111
+ ```
112
+
113
+ ## API Reference
114
+
115
+ ### ScaffoldOptions
116
+
117
+ ```typescript
118
+ interface ScaffoldOptions {
119
+ name: string // Project name
120
+ architecture: ArchitectureType // Architecture pattern
121
+ targetPath: string // Output directory
122
+ packageManager?: 'bun' | 'npm' | 'pnpm' | 'yarn'
123
+ skipInstall?: boolean
124
+ skipGit?: boolean
125
+ }
126
+ ```
127
+
128
+ ### ScaffoldResult
129
+
130
+ ```typescript
131
+ interface ScaffoldResult {
132
+ success: boolean
133
+ projectPath: string
134
+ filesCreated: number
135
+ errors: string[]
136
+ }
137
+ ```
138
+
139
+ ### DirectoryNode
140
+
141
+ ```typescript
142
+ interface DirectoryNode {
143
+ type: 'file' | 'directory'
144
+ name: string
145
+ content?: string // For files
146
+ children?: DirectoryNode[] // For directories
147
+ }
148
+ ```
149
+
150
+ ## License
151
+
152
+ MIT