create-velox-app 0.2.0 → 0.2.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/dist/cli.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * create-velox-app CLI entry point
4
+ *
5
+ * Executable entry point for the project scaffolder.
6
+ * Handles command-line arguments and initiates the scaffolding process.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;GAKG"}
package/dist/cli.js ADDED
@@ -0,0 +1,65 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * create-velox-app CLI entry point
4
+ *
5
+ * Executable entry point for the project scaffolder.
6
+ * Handles command-line arguments and initiates the scaffolding process.
7
+ */
8
+ import { CREATE_VERSION, createVeloxApp } from './index.js';
9
+ // ============================================================================
10
+ // Help & Version
11
+ // ============================================================================
12
+ const HELP_TEXT = `
13
+ create-velox-app v${CREATE_VERSION}
14
+
15
+ Usage:
16
+ npx create-velox-app [project-name]
17
+ pnpm create velox-app [project-name]
18
+
19
+ Options:
20
+ -h, --help Show this help message
21
+ -v, --version Show version number
22
+
23
+ Examples:
24
+ npx create-velox-app my-app
25
+ npx create-velox-app # Interactive mode
26
+ `;
27
+ // ============================================================================
28
+ // Main Entry Point
29
+ // ============================================================================
30
+ /**
31
+ * Parse arguments and run scaffolder
32
+ */
33
+ async function main() {
34
+ try {
35
+ // Get arguments
36
+ const args = process.argv.slice(2);
37
+ // Handle --help
38
+ if (args.includes('-h') || args.includes('--help')) {
39
+ console.log(HELP_TEXT);
40
+ process.exit(0);
41
+ }
42
+ // Handle --version
43
+ if (args.includes('-v') || args.includes('--version')) {
44
+ console.log(CREATE_VERSION);
45
+ process.exit(0);
46
+ }
47
+ // Get project name (first non-flag argument)
48
+ const projectName = args.find((arg) => !arg.startsWith('-'));
49
+ // Run scaffolder
50
+ await createVeloxApp(projectName);
51
+ }
52
+ catch (error) {
53
+ // Handle unexpected errors
54
+ if (error instanceof Error) {
55
+ console.error(`\nError: ${error.message}`);
56
+ }
57
+ else {
58
+ console.error('\nAn unexpected error occurred');
59
+ }
60
+ process.exit(1);
61
+ }
62
+ }
63
+ // Run the CLI
64
+ main();
65
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;GAKG;AAEH,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5D,+EAA+E;AAC/E,iBAAiB;AACjB,+EAA+E;AAE/E,MAAM,SAAS,GAAG;oBACE,cAAc;;;;;;;;;;;;;CAajC,CAAC;AAEF,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E;;GAEG;AACH,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,gBAAgB;QAChB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAEnC,gBAAgB;QAChB,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,mBAAmB;QACnB,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YACtD,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YAC5B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,6CAA6C;QAC7C,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;QAE7D,iBAAiB;QACjB,MAAM,cAAc,CAAC,WAAW,CAAC,CAAC;IACpC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,2BAA2B;QAC3B,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,YAAY,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,cAAc;AACd,IAAI,EAAE,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * create-velox-app - Project scaffolding tool
3
+ *
4
+ * CLI tool for bootstrapping new VeloxTS applications with a default template.
5
+ * Provides an interactive setup experience similar to create-next-app.
6
+ */
7
+ export declare const CREATE_VERSION = "0.1.0";
8
+ /**
9
+ * Main scaffolding function that creates a new VeloxTS project
10
+ */
11
+ export declare function createVeloxApp(initialProjectName?: string): Promise<void>;
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAmCH,eAAO,MAAM,cAAc,UAAU,CAAC;AAgBtC;;GAEG;AACH,wBAAsB,cAAc,CAAC,kBAAkB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA0C/E"}
package/dist/index.js ADDED
@@ -0,0 +1,286 @@
1
+ /**
2
+ * create-velox-app - Project scaffolding tool
3
+ *
4
+ * CLI tool for bootstrapping new VeloxTS applications with a default template.
5
+ * Provides an interactive setup experience similar to create-next-app.
6
+ */
7
+ import { execSync } from 'node:child_process';
8
+ import fs from 'node:fs/promises';
9
+ import path from 'node:path';
10
+ import * as p from '@clack/prompts';
11
+ import pc from 'picocolors';
12
+ import { generateConfigApp, generateConfigIndex, generateDatabaseIndex, generateEnvExample, generateGitignore, generateHealthProcedures, generateIndexHtml, generateIndexTs, generatePackageJson, generatePrismaConfig, generatePrismaSchema, generateProceduresIndex, generateReadme, generateSchemasIndex, generateTsConfig, generateTsupConfig, generateUserProcedures, generateUserSchema, } from './templates.js';
13
+ // ============================================================================
14
+ // Constants
15
+ // ============================================================================
16
+ export const CREATE_VERSION = '0.1.0';
17
+ // ============================================================================
18
+ // Main Scaffolder
19
+ // ============================================================================
20
+ /**
21
+ * Main scaffolding function that creates a new VeloxTS project
22
+ */
23
+ export async function createVeloxApp(initialProjectName) {
24
+ // Print welcome banner
25
+ console.log('');
26
+ p.intro(pc.cyan(pc.bold('create-velox-app')));
27
+ try {
28
+ // Collect project configuration
29
+ const config = await promptProjectConfig(initialProjectName);
30
+ // Validate project directory doesn't exist
31
+ await validateProjectDirectory(config.directory);
32
+ // Create project structure
33
+ await createProjectStructure(config);
34
+ // Install dependencies
35
+ await installDependencies(config);
36
+ // Generate Prisma client
37
+ await generatePrismaClient(config);
38
+ // Initialize git
39
+ await initializeGit(config);
40
+ // Print success message
41
+ printSuccessMessage(config);
42
+ p.outro(pc.green('Done! Your VeloxTS app is ready.'));
43
+ }
44
+ catch (error) {
45
+ // Handle cancellation
46
+ if (error === Symbol.for('clack.cancel') || error.message === 'canceled') {
47
+ p.cancel('Setup cancelled');
48
+ process.exit(0);
49
+ }
50
+ // Handle other errors
51
+ p.cancel('Setup failed');
52
+ if (error instanceof Error) {
53
+ console.error(pc.red(`\nError: ${error.message}`));
54
+ }
55
+ process.exit(1);
56
+ }
57
+ }
58
+ // ============================================================================
59
+ // Configuration Prompts
60
+ // ============================================================================
61
+ /**
62
+ * Prompt user for project configuration
63
+ */
64
+ async function promptProjectConfig(initialName) {
65
+ // Project name
66
+ const name = initialName
67
+ ? initialName
68
+ : await p.text({
69
+ message: 'What is your project named?',
70
+ placeholder: 'my-velox-app',
71
+ validate: (value) => {
72
+ if (!value)
73
+ return 'Project name is required';
74
+ if (!/^[a-z0-9-]+$/.test(value)) {
75
+ return 'Use lowercase letters, numbers, and hyphens only';
76
+ }
77
+ return undefined;
78
+ },
79
+ });
80
+ if (p.isCancel(name)) {
81
+ throw new Error('canceled');
82
+ }
83
+ // Validate project name format
84
+ if (typeof name === 'string' && !/^[a-z0-9-]+$/.test(name)) {
85
+ throw new Error('Project name must use lowercase letters, numbers, and hyphens only');
86
+ }
87
+ // Detect package manager
88
+ const packageManager = detectPackageManager();
89
+ return {
90
+ name: name,
91
+ directory: path.resolve(process.cwd(), name),
92
+ packageManager,
93
+ };
94
+ }
95
+ /**
96
+ * Detect which package manager is being used
97
+ */
98
+ function detectPackageManager() {
99
+ const userAgent = process.env.npm_config_user_agent || '';
100
+ if (userAgent.includes('pnpm'))
101
+ return 'pnpm';
102
+ if (userAgent.includes('yarn'))
103
+ return 'yarn';
104
+ return 'npm';
105
+ }
106
+ // ============================================================================
107
+ // Project Creation
108
+ // ============================================================================
109
+ /**
110
+ * Validate that project directory doesn't already exist
111
+ */
112
+ async function validateProjectDirectory(directory) {
113
+ try {
114
+ await fs.access(directory);
115
+ throw new Error(`Directory ${path.basename(directory)} already exists`);
116
+ }
117
+ catch (error) {
118
+ // Directory doesn't exist - this is what we want
119
+ if (error.code !== 'ENOENT') {
120
+ throw error;
121
+ }
122
+ }
123
+ }
124
+ /**
125
+ * Create the complete project structure with all files
126
+ */
127
+ async function createProjectStructure(config) {
128
+ const spinner = p.spinner();
129
+ spinner.start('Creating project files');
130
+ try {
131
+ // Create directory structure
132
+ await fs.mkdir(config.directory, { recursive: true });
133
+ await fs.mkdir(path.join(config.directory, 'src'), { recursive: true });
134
+ await fs.mkdir(path.join(config.directory, 'src', 'config'), { recursive: true });
135
+ await fs.mkdir(path.join(config.directory, 'src', 'database'), { recursive: true });
136
+ await fs.mkdir(path.join(config.directory, 'src', 'procedures'), { recursive: true });
137
+ await fs.mkdir(path.join(config.directory, 'src', 'schemas'), { recursive: true });
138
+ await fs.mkdir(path.join(config.directory, 'prisma'), { recursive: true });
139
+ await fs.mkdir(path.join(config.directory, 'public'), { recursive: true });
140
+ // Template data
141
+ const template = {
142
+ projectName: config.name,
143
+ packageManager: config.packageManager,
144
+ };
145
+ // Write root files
146
+ await fs.writeFile(path.join(config.directory, 'package.json'), generatePackageJson(template));
147
+ await fs.writeFile(path.join(config.directory, 'tsconfig.json'), generateTsConfig());
148
+ await fs.writeFile(path.join(config.directory, 'tsup.config.ts'), generateTsupConfig());
149
+ await fs.writeFile(path.join(config.directory, '.env.example'), generateEnvExample());
150
+ await fs.writeFile(path.join(config.directory, '.env'), generateEnvExample());
151
+ await fs.writeFile(path.join(config.directory, '.gitignore'), generateGitignore());
152
+ await fs.writeFile(path.join(config.directory, 'README.md'), generateReadme(config.name));
153
+ // Write Prisma files
154
+ await fs.writeFile(path.join(config.directory, 'prisma', 'schema.prisma'), generatePrismaSchema());
155
+ await fs.writeFile(path.join(config.directory, 'prisma.config.ts'), generatePrismaConfig());
156
+ // Write source files
157
+ await fs.writeFile(path.join(config.directory, 'src', 'index.ts'), generateIndexTs());
158
+ // Write config files
159
+ await fs.writeFile(path.join(config.directory, 'src', 'config', 'index.ts'), generateConfigIndex());
160
+ await fs.writeFile(path.join(config.directory, 'src', 'config', 'app.ts'), generateConfigApp());
161
+ // Write database files
162
+ await fs.writeFile(path.join(config.directory, 'src', 'database', 'index.ts'), generateDatabaseIndex());
163
+ // Write procedure files
164
+ await fs.writeFile(path.join(config.directory, 'src', 'procedures', 'index.ts'), generateProceduresIndex());
165
+ await fs.writeFile(path.join(config.directory, 'src', 'procedures', 'health.ts'), generateHealthProcedures());
166
+ await fs.writeFile(path.join(config.directory, 'src', 'procedures', 'users.ts'), generateUserProcedures());
167
+ // Write schema files
168
+ await fs.writeFile(path.join(config.directory, 'src', 'schemas', 'index.ts'), generateSchemasIndex());
169
+ await fs.writeFile(path.join(config.directory, 'src', 'schemas', 'user.ts'), generateUserSchema());
170
+ // Write public files
171
+ await fs.writeFile(path.join(config.directory, 'public', 'index.html'), generateIndexHtml());
172
+ spinner.stop('Project files created');
173
+ }
174
+ catch (error) {
175
+ spinner.stop('Failed to create project files');
176
+ throw error;
177
+ }
178
+ }
179
+ // ============================================================================
180
+ // Dependency Installation
181
+ // ============================================================================
182
+ /**
183
+ * Install project dependencies using the detected package manager
184
+ */
185
+ async function installDependencies(config) {
186
+ const spinner = p.spinner();
187
+ spinner.start('Installing dependencies');
188
+ try {
189
+ const installCommand = getInstallCommand(config.packageManager);
190
+ execSync(installCommand, {
191
+ cwd: config.directory,
192
+ stdio: 'ignore',
193
+ });
194
+ spinner.stop('Dependencies installed');
195
+ }
196
+ catch (error) {
197
+ spinner.stop('Failed to install dependencies');
198
+ throw error;
199
+ }
200
+ }
201
+ /**
202
+ * Get the install command for the package manager
203
+ */
204
+ function getInstallCommand(packageManager) {
205
+ switch (packageManager) {
206
+ case 'pnpm':
207
+ return 'pnpm install';
208
+ case 'yarn':
209
+ return 'yarn install';
210
+ default:
211
+ return 'npm install';
212
+ }
213
+ }
214
+ // ============================================================================
215
+ // Prisma Client Generation
216
+ // ============================================================================
217
+ /**
218
+ * Generate Prisma client after dependencies are installed
219
+ */
220
+ async function generatePrismaClient(config) {
221
+ const spinner = p.spinner();
222
+ spinner.start('Generating Prisma client');
223
+ try {
224
+ execSync('npx prisma generate', {
225
+ cwd: config.directory,
226
+ stdio: 'ignore',
227
+ });
228
+ spinner.stop('Prisma client generated');
229
+ }
230
+ catch (error) {
231
+ spinner.stop('Failed to generate Prisma client');
232
+ throw error;
233
+ }
234
+ }
235
+ // ============================================================================
236
+ // Git Initialization
237
+ // ============================================================================
238
+ /**
239
+ * Initialize git repository
240
+ */
241
+ async function initializeGit(config) {
242
+ const spinner = p.spinner();
243
+ spinner.start('Initializing git repository');
244
+ try {
245
+ execSync('git init', {
246
+ cwd: config.directory,
247
+ stdio: 'ignore',
248
+ });
249
+ execSync('git add .', {
250
+ cwd: config.directory,
251
+ stdio: 'ignore',
252
+ });
253
+ execSync('git commit -m "Initial commit from create-velox-app"', {
254
+ cwd: config.directory,
255
+ stdio: 'ignore',
256
+ });
257
+ spinner.stop('Git repository initialized');
258
+ }
259
+ catch (_error) {
260
+ // Git init is optional - don't fail if it doesn't work
261
+ spinner.stop('Skipped git initialization');
262
+ }
263
+ }
264
+ // ============================================================================
265
+ // Success Message
266
+ // ============================================================================
267
+ /**
268
+ * Print success message with next steps
269
+ */
270
+ function printSuccessMessage(config) {
271
+ const cdCommand = `cd ${config.name}`;
272
+ const devCommand = `${config.packageManager} dev`;
273
+ const dbCommand = `${config.packageManager} db:push`;
274
+ console.log('');
275
+ console.log(pc.green(` Success! Created ${pc.bold(config.name)}`));
276
+ console.log('');
277
+ console.log(' Next steps:');
278
+ console.log('');
279
+ console.log(` ${pc.cyan(cdCommand)}`);
280
+ console.log(` ${pc.cyan(dbCommand)}${pc.dim(' # Setup database')}`);
281
+ console.log(` ${pc.cyan(devCommand)}${pc.dim(' # Start dev server')}`);
282
+ console.log('');
283
+ console.log(` Your app will be available at ${pc.cyan('http://localhost:3210')}`);
284
+ console.log('');
285
+ }
286
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Template Generation Functions
3
+ *
4
+ * Generates all files needed for a new VeloxTS project.
5
+ * Templates are based on the playground app structure.
6
+ */
7
+ /**
8
+ * VeloxTS framework version for generated projects.
9
+ * This is automatically updated during releases via changesets.
10
+ */
11
+ export declare const VELOXTS_VERSION = "0.1.0";
12
+ export interface ProjectTemplate {
13
+ projectName: string;
14
+ packageManager: 'npm' | 'pnpm' | 'yarn';
15
+ }
16
+ export declare function generatePackageJson(template: ProjectTemplate): string;
17
+ export declare function generateTsConfig(): string;
18
+ export declare function generateTsupConfig(): string;
19
+ export declare function generateEnvExample(): string;
20
+ export declare function generateGitignore(): string;
21
+ export declare function generatePrismaSchema(): string;
22
+ export declare function generatePrismaConfig(): string;
23
+ export declare function generateIndexTs(): string;
24
+ export declare function generateConfigIndex(): string;
25
+ export declare function generateConfigApp(): string;
26
+ export declare function generateDatabaseIndex(): string;
27
+ export declare function generateProceduresIndex(): string;
28
+ export declare function generateHealthProcedures(): string;
29
+ export declare function generateUserProcedures(): string;
30
+ export declare function generateSchemasIndex(): string;
31
+ export declare function generateUserSchema(): string;
32
+ export declare function generateIndexHtml(): string;
33
+ export declare function generateReadme(projectName: string): string;
34
+ //# sourceMappingURL=templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH;;;GAGG;AACH,eAAO,MAAM,eAAe,UAAU,CAAC;AAMvC,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;CACzC;AAMD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,CAuCrE;AAMD,wBAAgB,gBAAgB,IAAI,MAAM,CA8BzC;AAMD,wBAAgB,kBAAkB,IAAI,MAAM,CAY3C;AAMD,wBAAgB,kBAAkB,IAAI,MAAM,CAe3C;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAoC1C;AAMD,wBAAgB,oBAAoB,IAAI,MAAM,CA8B7C;AAMD,wBAAgB,oBAAoB,IAAI,MAAM,CAmB7C;AAMD,wBAAgB,eAAe,IAAI,MAAM,CAiFxC;AAED,wBAAgB,mBAAmB,IAAI,MAAM,CAO5C;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAyB1C;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAwB9C;AAED,wBAAgB,uBAAuB,IAAI,MAAM,CAQhD;AAED,wBAAgB,wBAAwB,IAAI,MAAM,CA4BjD;AAED,wBAAgB,sBAAsB,IAAI,MAAM,CA4F/C;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAO7C;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAyB3C;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CA8B1C;AAED,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAyD1D"}
@@ -0,0 +1,611 @@
1
+ /**
2
+ * Template Generation Functions
3
+ *
4
+ * Generates all files needed for a new VeloxTS project.
5
+ * Templates are based on the playground app structure.
6
+ */
7
+ // ============================================================================
8
+ // Version Constant
9
+ // ============================================================================
10
+ /**
11
+ * VeloxTS framework version for generated projects.
12
+ * This is automatically updated during releases via changesets.
13
+ */
14
+ export const VELOXTS_VERSION = '0.1.0';
15
+ // ============================================================================
16
+ // Package.json Template
17
+ // ============================================================================
18
+ export function generatePackageJson(template) {
19
+ return JSON.stringify({
20
+ name: template.projectName,
21
+ version: '0.1.0',
22
+ description: 'A VeloxTS application',
23
+ type: 'module',
24
+ main: 'dist/index.js',
25
+ scripts: {
26
+ build: 'tsup',
27
+ start: 'node dist/index.js',
28
+ dev: 'tsx watch src/index.ts',
29
+ 'type-check': 'tsc --noEmit',
30
+ clean: 'rm -rf dist tsconfig.tsbuildinfo',
31
+ 'db:generate': 'prisma generate',
32
+ 'db:push': 'prisma db push',
33
+ 'db:studio': 'prisma studio',
34
+ },
35
+ dependencies: {
36
+ '@fastify/static': '^8.3.0',
37
+ '@prisma/adapter-better-sqlite3': '^7.1.0',
38
+ '@prisma/client': '^7.1.0',
39
+ '@veloxts/core': `^${VELOXTS_VERSION}`,
40
+ '@veloxts/orm': `^${VELOXTS_VERSION}`,
41
+ '@veloxts/router': `^${VELOXTS_VERSION}`,
42
+ '@veloxts/validation': `^${VELOXTS_VERSION}`,
43
+ dotenv: '^17.2.3',
44
+ zod: '^3.24.4',
45
+ },
46
+ devDependencies: {
47
+ prisma: '^7.1.0',
48
+ tsup: '^8.5.1',
49
+ tsx: '^4.21.0',
50
+ typescript: '^5.9.3',
51
+ },
52
+ }, null, 2);
53
+ }
54
+ // ============================================================================
55
+ // TypeScript Config
56
+ // ============================================================================
57
+ export function generateTsConfig() {
58
+ return JSON.stringify({
59
+ $schema: 'https://json.schemastore.org/tsconfig',
60
+ compilerOptions: {
61
+ target: 'ES2022',
62
+ module: 'ES2022',
63
+ moduleResolution: 'bundler',
64
+ lib: ['ES2022'],
65
+ strict: true,
66
+ esModuleInterop: true,
67
+ skipLibCheck: true,
68
+ resolveJsonModule: true,
69
+ allowSyntheticDefaultImports: true,
70
+ forceConsistentCasingInFileNames: true,
71
+ isolatedModules: true,
72
+ noUnusedLocals: true,
73
+ noUnusedParameters: true,
74
+ noFallthroughCasesInSwitch: true,
75
+ declaration: false,
76
+ declarationMap: false,
77
+ rootDir: './src',
78
+ outDir: './dist',
79
+ },
80
+ include: ['src/**/*'],
81
+ exclude: ['node_modules', 'dist', '**/*.test.ts', '**/*.spec.ts'],
82
+ }, null, 2);
83
+ }
84
+ // ============================================================================
85
+ // tsup Config
86
+ // ============================================================================
87
+ export function generateTsupConfig() {
88
+ return `import { defineConfig } from 'tsup';
89
+
90
+ export default defineConfig({
91
+ entry: ['src/index.ts'],
92
+ format: ['esm'],
93
+ target: 'node18',
94
+ clean: true,
95
+ dts: false,
96
+ sourcemap: true,
97
+ });
98
+ `;
99
+ }
100
+ // ============================================================================
101
+ // Environment Files
102
+ // ============================================================================
103
+ export function generateEnvExample() {
104
+ return `# Database URL
105
+ # SQLite (local development):
106
+ DATABASE_URL="file:./dev.db"
107
+ # PostgreSQL (production):
108
+ # DATABASE_URL="postgresql://user:password@localhost:5432/myapp"
109
+
110
+ # Server Configuration
111
+ PORT=3210
112
+ HOST=0.0.0.0
113
+ NODE_ENV=development
114
+
115
+ # API Configuration
116
+ API_PREFIX=/api
117
+ `;
118
+ }
119
+ export function generateGitignore() {
120
+ return `# Dependencies
121
+ node_modules/
122
+
123
+ # Build output
124
+ dist/
125
+ *.tsbuildinfo
126
+
127
+ # Environment variables
128
+ .env
129
+ .env.local
130
+
131
+ # Database
132
+ *.db
133
+ *.db-journal
134
+
135
+ # Generated Prisma client
136
+ src/generated/
137
+
138
+ # Logs
139
+ logs/
140
+ *.log
141
+
142
+ # OS
143
+ .DS_Store
144
+ Thumbs.db
145
+
146
+ # IDE
147
+ .vscode/
148
+ .idea/
149
+ *.swp
150
+ *.swo
151
+
152
+ # Turbo
153
+ .turbo/
154
+ `;
155
+ }
156
+ // ============================================================================
157
+ // Prisma Schema
158
+ // ============================================================================
159
+ export function generatePrismaSchema() {
160
+ return `// Prisma Schema
161
+ //
162
+ // This schema defines the database structure.
163
+ // Using SQLite for simplicity - easily swap to PostgreSQL for production.
164
+
165
+ generator client {
166
+ provider = "prisma-client"
167
+ output = "../src/generated/prisma"
168
+ }
169
+
170
+ datasource db {
171
+ provider = "sqlite"
172
+ }
173
+
174
+ // ============================================================================
175
+ // User Model
176
+ // ============================================================================
177
+
178
+ /// User model for basic CRUD demonstration
179
+ model User {
180
+ id String @id @default(uuid())
181
+ name String
182
+ email String @unique
183
+ createdAt DateTime @default(now())
184
+ updatedAt DateTime @updatedAt
185
+
186
+ @@map("users")
187
+ }
188
+ `;
189
+ }
190
+ // ============================================================================
191
+ // Prisma Config (Prisma 7.x)
192
+ // ============================================================================
193
+ export function generatePrismaConfig() {
194
+ return `/**
195
+ * Prisma Configuration (Prisma 7.x)
196
+ *
197
+ * Database URL is now configured here instead of schema.prisma.
198
+ * See: https://www.prisma.io/docs/orm/more/upgrade-guides/upgrading-versions/upgrading-to-prisma-7
199
+ */
200
+
201
+ import 'dotenv/config';
202
+ import { defineConfig } from 'prisma/config';
203
+
204
+ export default defineConfig({
205
+ earlyAccess: true,
206
+ schema: './prisma/schema.prisma',
207
+ datasource: {
208
+ url: process.env.DATABASE_URL!,
209
+ },
210
+ });
211
+ `;
212
+ }
213
+ // ============================================================================
214
+ // Source Files
215
+ // ============================================================================
216
+ export function generateIndexTs() {
217
+ return `/**
218
+ * Application Entry Point
219
+ */
220
+
221
+ import 'dotenv/config';
222
+
223
+ import fastifyStatic from '@fastify/static';
224
+ import { createVeloxApp, VELOX_VERSION } from '@veloxts/core';
225
+ import { createDatabasePlugin } from '@veloxts/orm';
226
+ import { createRoutesRegistrar, getRouteSummary } from '@veloxts/router';
227
+ import path from 'node:path';
228
+
229
+ import { config } from './config/index.js';
230
+ import { prisma } from './database/index.js';
231
+ import { healthProcedures, userProcedures } from './procedures/index.js';
232
+
233
+ // ============================================================================
234
+ // Application Bootstrap
235
+ // ============================================================================
236
+
237
+ async function createApp() {
238
+ const app = await createVeloxApp({
239
+ port: config.port,
240
+ host: config.host,
241
+ logger: config.logger,
242
+ });
243
+
244
+ // Register database plugin
245
+ await app.use(createDatabasePlugin({ client: prisma }));
246
+
247
+ // Register static file serving for frontend
248
+ await app.server.register(fastifyStatic, {
249
+ root: path.join(process.cwd(), 'public'),
250
+ prefix: '/',
251
+ });
252
+
253
+ // Register REST API routes
254
+ const collections = [userProcedures, healthProcedures];
255
+ app.routes(createRoutesRegistrar(collections, { prefix: config.apiPrefix }));
256
+
257
+ return { app, collections };
258
+ }
259
+
260
+ function printBanner(collections: Parameters<typeof getRouteSummary>[0]) {
261
+ const divider = '═'.repeat(50);
262
+
263
+ console.log(\`\\n\${divider}\`);
264
+ console.log(\` VeloxTS Application v\${VELOX_VERSION}\`);
265
+ console.log(\` Environment: \${config.env}\`);
266
+ console.log(divider);
267
+
268
+ // Print registered routes
269
+ const routes = getRouteSummary(collections);
270
+ console.log('\\n📍 Registered Routes:\\n');
271
+
272
+ for (const route of routes) {
273
+ const method = route.method.padEnd(6);
274
+ const path = route.path.padEnd(25);
275
+ console.log(\` \${method} \${path} → \${route.namespace}.\${route.procedure}\`);
276
+ }
277
+
278
+ console.log(\`\\n\${divider}\`);
279
+ console.log(\` Frontend: http://localhost:\${config.port}\`);
280
+ console.log(\` REST API: http://localhost:\${config.port}\${config.apiPrefix}\`);
281
+ console.log(\`\${divider}\\n\`);
282
+ }
283
+
284
+ async function main() {
285
+ try {
286
+ const { app, collections } = await createApp();
287
+ await app.start();
288
+ printBanner(collections);
289
+ } catch (error) {
290
+ console.error('Failed to start application:', error);
291
+ process.exit(1);
292
+ }
293
+ }
294
+
295
+ main();
296
+ `;
297
+ }
298
+ export function generateConfigIndex() {
299
+ return `/**
300
+ * Configuration Exports
301
+ */
302
+
303
+ export * from './app.js';
304
+ `;
305
+ }
306
+ export function generateConfigApp() {
307
+ return `/**
308
+ * Application Configuration
309
+ */
310
+
311
+ export interface AppConfig {
312
+ port: number;
313
+ host: string;
314
+ logger: boolean;
315
+ apiPrefix: string;
316
+ env: 'development' | 'production' | 'test';
317
+ }
318
+
319
+ export function createConfig(): AppConfig {
320
+ return {
321
+ port: Number(process.env.PORT) || 3210,
322
+ host: process.env.HOST || '0.0.0.0',
323
+ logger: process.env.LOG_LEVEL !== 'silent',
324
+ apiPrefix: process.env.API_PREFIX || '/api',
325
+ env: (process.env.NODE_ENV as AppConfig['env']) || 'development',
326
+ };
327
+ }
328
+
329
+ export const config = createConfig();
330
+ `;
331
+ }
332
+ export function generateDatabaseIndex() {
333
+ return `/**
334
+ * Database Client (Prisma 7.x)
335
+ *
336
+ * Prisma 7 requires:
337
+ * - Generated client from custom output path
338
+ * - Driver adapter for database connections
339
+ */
340
+
341
+ import { PrismaBetterSqlite3 } from '@prisma/adapter-better-sqlite3';
342
+
343
+ import { PrismaClient } from '../generated/prisma/client.js';
344
+
345
+ // Validate DATABASE_URL is set
346
+ if (!process.env.DATABASE_URL) {
347
+ throw new Error('DATABASE_URL environment variable is required');
348
+ }
349
+
350
+ // Create SQLite adapter with database URL from environment
351
+ const adapter = new PrismaBetterSqlite3({ url: process.env.DATABASE_URL });
352
+
353
+ // Export configured Prisma client
354
+ export const prisma = new PrismaClient({ adapter });
355
+ `;
356
+ }
357
+ export function generateProceduresIndex() {
358
+ return `/**
359
+ * Procedure Exports
360
+ */
361
+
362
+ export * from './health.js';
363
+ export * from './users.js';
364
+ `;
365
+ }
366
+ export function generateHealthProcedures() {
367
+ return `/**
368
+ * Health Check Procedures
369
+ */
370
+
371
+ import { VELOX_VERSION } from '@veloxts/core';
372
+ import { defineProcedures, procedure } from '@veloxts/router';
373
+ import { z } from 'zod';
374
+
375
+ export const healthProcedures = defineProcedures('health', {
376
+ getHealth: procedure()
377
+ .rest({ method: 'GET', path: '/health' })
378
+ .output(
379
+ z.object({
380
+ status: z.literal('ok'),
381
+ version: z.string(),
382
+ timestamp: z.string().datetime(),
383
+ uptime: z.number(),
384
+ })
385
+ )
386
+ .query(async () => ({
387
+ status: 'ok' as const,
388
+ version: VELOX_VERSION,
389
+ timestamp: new Date().toISOString(),
390
+ uptime: process.uptime(),
391
+ })),
392
+ });
393
+ `;
394
+ }
395
+ export function generateUserProcedures() {
396
+ return `/**
397
+ * User Procedures
398
+ */
399
+
400
+ import { defineProcedures, procedure } from '@veloxts/router';
401
+ import { paginationInputSchema } from '@veloxts/validation';
402
+ import { z } from 'zod';
403
+
404
+ import { CreateUserInput, UserSchema } from '../schemas/user.js';
405
+
406
+ // Database types
407
+ interface DbUser {
408
+ id: string;
409
+ name: string;
410
+ email: string;
411
+ createdAt: Date;
412
+ updatedAt: Date;
413
+ }
414
+
415
+ interface DbClient {
416
+ user: {
417
+ findUnique: (args: { where: { id: string } }) => Promise<DbUser | null>;
418
+ findMany: (args?: { skip?: number; take?: number }) => Promise<DbUser[]>;
419
+ create: (args: { data: { name: string; email: string } }) => Promise<DbUser>;
420
+ count: () => Promise<number>;
421
+ };
422
+ }
423
+
424
+ function getDb(ctx: { db: unknown }): DbClient {
425
+ return ctx.db as DbClient;
426
+ }
427
+
428
+ function toUserResponse(dbUser: DbUser) {
429
+ return {
430
+ id: dbUser.id,
431
+ name: dbUser.name,
432
+ email: dbUser.email,
433
+ createdAt: dbUser.createdAt.toISOString(),
434
+ updatedAt: dbUser.updatedAt.toISOString(),
435
+ };
436
+ }
437
+
438
+ export const userProcedures = defineProcedures('users', {
439
+ getUser: procedure()
440
+ .input(z.object({ id: z.string().uuid() }))
441
+ .output(UserSchema.nullable())
442
+ .query(async ({ input, ctx }) => {
443
+ const db = getDb(ctx);
444
+ const user = await db.user.findUnique({ where: { id: input.id } });
445
+ return user ? toUserResponse(user) : null;
446
+ }),
447
+
448
+ listUsers: procedure()
449
+ .input(paginationInputSchema.optional())
450
+ .output(
451
+ z.object({
452
+ data: z.array(UserSchema),
453
+ meta: z.object({
454
+ page: z.number(),
455
+ limit: z.number(),
456
+ total: z.number(),
457
+ }),
458
+ })
459
+ )
460
+ .query(async ({ input, ctx }) => {
461
+ const db = getDb(ctx);
462
+ const page = input?.page ?? 1;
463
+ const limit = input?.limit ?? 10;
464
+ const skip = (page - 1) * limit;
465
+
466
+ const [dbUsers, total] = await Promise.all([
467
+ db.user.findMany({ skip, take: limit }),
468
+ db.user.count(),
469
+ ]);
470
+
471
+ return {
472
+ data: dbUsers.map(toUserResponse),
473
+ meta: { page, limit, total },
474
+ };
475
+ }),
476
+
477
+ createUser: procedure()
478
+ .input(CreateUserInput)
479
+ .output(UserSchema)
480
+ .mutation(async ({ input, ctx }) => {
481
+ const db = getDb(ctx);
482
+ const user = await db.user.create({ data: input });
483
+ return toUserResponse(user);
484
+ }),
485
+ });
486
+ `;
487
+ }
488
+ export function generateSchemasIndex() {
489
+ return `/**
490
+ * Schema Exports
491
+ */
492
+
493
+ export * from './user.js';
494
+ `;
495
+ }
496
+ export function generateUserSchema() {
497
+ return `/**
498
+ * User Schemas
499
+ */
500
+
501
+ import { createIdSchema, emailSchema } from '@veloxts/validation';
502
+ import { z } from 'zod';
503
+
504
+ export const UserSchema = z.object({
505
+ id: createIdSchema('uuid'),
506
+ name: z.string().min(1).max(100),
507
+ email: emailSchema,
508
+ createdAt: z.coerce.date().transform((d) => d.toISOString()),
509
+ updatedAt: z.coerce.date().transform((d) => d.toISOString()),
510
+ });
511
+
512
+ export type User = z.infer<typeof UserSchema>;
513
+
514
+ export const CreateUserInput = z.object({
515
+ name: z.string().min(1).max(100),
516
+ email: emailSchema,
517
+ });
518
+
519
+ export type CreateUserData = z.infer<typeof CreateUserInput>;
520
+ `;
521
+ }
522
+ export function generateIndexHtml() {
523
+ return `<!DOCTYPE html>
524
+ <html lang="en">
525
+ <head>
526
+ <meta charset="UTF-8">
527
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
528
+ <title>VeloxTS App</title>
529
+ <style>
530
+ * { box-sizing: border-box; margin: 0; padding: 0; }
531
+ body { font-family: system-ui, sans-serif; background: #f5f5f5; padding: 20px; }
532
+ .container { max-width: 800px; margin: 0 auto; }
533
+ h1 { margin-bottom: 20px; color: #333; }
534
+ .card { background: white; border-radius: 8px; padding: 20px; margin-bottom: 20px; box-shadow: 0 1px 3px rgba(0,0,0,0.1); }
535
+ .card h2 { margin-bottom: 15px; color: #555; font-size: 1.1rem; }
536
+ button { background: #007bff; color: white; border: none; padding: 8px 16px; border-radius: 4px; cursor: pointer; }
537
+ button:hover { background: #0056b3; }
538
+ </style>
539
+ </head>
540
+ <body>
541
+ <div class="container">
542
+ <h1>Welcome to VeloxTS</h1>
543
+ <div class="card">
544
+ <h2>Your app is running!</h2>
545
+ <p>Visit <code>/api/health</code> to check the API status.</p>
546
+ <p>Visit <code>/api/users</code> to see the users endpoint.</p>
547
+ </div>
548
+ </div>
549
+ </body>
550
+ </html>
551
+ `;
552
+ }
553
+ export function generateReadme(projectName) {
554
+ return `# ${projectName}
555
+
556
+ A VeloxTS application - TypeScript full-stack framework.
557
+
558
+ ## Getting Started
559
+
560
+ ### Install Dependencies
561
+
562
+ \`\`\`bash
563
+ pnpm install
564
+ \`\`\`
565
+
566
+ ### Setup Database
567
+
568
+ \`\`\`bash
569
+ pnpm db:push
570
+ \`\`\`
571
+
572
+ ### Start Development Server
573
+
574
+ \`\`\`bash
575
+ pnpm dev
576
+ \`\`\`
577
+
578
+ The app will start at http://localhost:3210
579
+
580
+ ## Project Structure
581
+
582
+ \`\`\`
583
+ src/
584
+ ├── config/ # Application configuration
585
+ ├── database/ # Database client
586
+ ├── procedures/ # API procedures (business logic)
587
+ ├── schemas/ # Zod validation schemas
588
+ └── index.ts # Application entry point
589
+ \`\`\`
590
+
591
+ ## Available Scripts
592
+
593
+ - \`pnpm dev\` - Start development server with hot reload
594
+ - \`pnpm build\` - Build for production
595
+ - \`pnpm start\` - Start production server
596
+ - \`pnpm db:push\` - Sync database schema
597
+ - \`pnpm db:studio\` - Open Prisma Studio
598
+
599
+ ## Learn More
600
+
601
+ - [VeloxTS Documentation](https://veloxts.dev)
602
+ - [TypeScript](https://www.typescriptlang.org/)
603
+ - [Fastify](https://fastify.dev/)
604
+ - [Prisma](https://www.prisma.io/)
605
+
606
+ ## License
607
+
608
+ MIT
609
+ `;
610
+ }
611
+ //# sourceMappingURL=templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-velox-app",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "description": "Project scaffolder for VeloxTS framework",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",