create-velox-app 0.4.2 → 0.4.4
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.js +0 -0
- package/dist/index.js +21 -14
- package/dist/index.js.map +1 -1
- package/dist/templates/auth.d.ts +6 -3
- package/dist/templates/auth.d.ts.map +1 -1
- package/dist/templates/auth.js +56 -1110
- package/dist/templates/auth.js.map +1 -1
- package/dist/templates/compiler.d.ts +68 -0
- package/dist/templates/compiler.d.ts.map +1 -0
- package/dist/templates/compiler.js +149 -0
- package/dist/templates/compiler.js.map +1 -0
- package/dist/templates/default.d.ts +5 -2
- package/dist/templates/default.d.ts.map +1 -1
- package/dist/templates/default.js +51 -508
- package/dist/templates/default.js.map +1 -1
- package/dist/templates/index.d.ts.map +1 -1
- package/dist/templates/index.js +19 -10
- package/dist/templates/index.js.map +1 -1
- package/dist/templates/placeholders.d.ts +70 -0
- package/dist/templates/placeholders.d.ts.map +1 -0
- package/dist/templates/placeholders.js +145 -0
- package/dist/templates/placeholders.js.map +1 -0
- package/dist/templates/shared/index.d.ts +9 -0
- package/dist/templates/shared/index.d.ts.map +1 -0
- package/dist/templates/shared/index.js +9 -0
- package/dist/templates/shared/index.js.map +1 -0
- package/dist/templates/shared/root.d.ts +14 -0
- package/dist/templates/shared/root.d.ts.map +1 -0
- package/dist/templates/shared/root.js +43 -0
- package/dist/templates/shared/root.js.map +1 -0
- package/dist/templates/shared/web-base.d.ts +18 -0
- package/dist/templates/shared/web-base.d.ts.map +1 -0
- package/dist/templates/shared/web-base.js +63 -0
- package/dist/templates/shared/web-base.js.map +1 -0
- package/dist/templates/shared/web-styles.d.ts +10 -0
- package/dist/templates/shared/web-styles.d.ts.map +1 -0
- package/dist/templates/shared/web-styles.js +26 -0
- package/dist/templates/shared/web-styles.js.map +1 -0
- package/dist/templates/shared.d.ts +3 -14
- package/dist/templates/shared.d.ts.map +1 -1
- package/dist/templates/shared.js +7 -290
- package/dist/templates/shared.js.map +1 -1
- package/dist/templates/source/api/config/app.d.ts +13 -0
- package/dist/templates/source/api/config/app.d.ts.map +1 -0
- package/dist/templates/source/api/config/app.js +14 -0
- package/dist/templates/source/api/config/app.js.map +1 -0
- package/dist/templates/source/api/config/auth.d.ts +34 -0
- package/dist/templates/source/api/config/auth.d.ts.map +1 -0
- package/dist/templates/source/api/config/auth.js +165 -0
- package/dist/templates/source/api/config/auth.js.map +1 -0
- package/dist/templates/source/api/config/index.auth.d.ts +6 -0
- package/dist/templates/source/api/config/index.auth.d.ts.map +1 -0
- package/dist/templates/source/api/config/index.auth.js +6 -0
- package/dist/templates/source/api/config/index.auth.js.map +1 -0
- package/dist/templates/source/api/config/index.default.d.ts +5 -0
- package/dist/templates/source/api/config/index.default.d.ts.map +1 -0
- package/dist/templates/source/api/config/index.default.js +5 -0
- package/dist/templates/source/api/config/index.default.js.map +1 -0
- package/dist/templates/source/api/database/index.d.ts +9 -0
- package/dist/templates/source/api/database/index.d.ts.map +1 -0
- package/dist/templates/source/api/database/index.js +18 -0
- package/dist/templates/source/api/database/index.js.map +1 -0
- package/dist/templates/source/api/index.auth.d.ts +5 -0
- package/dist/templates/source/api/index.auth.d.ts.map +1 -0
- package/dist/templates/source/api/index.auth.js +59 -0
- package/dist/templates/source/api/index.auth.js.map +1 -0
- package/dist/templates/source/api/index.default.d.ts +5 -0
- package/dist/templates/source/api/index.default.d.ts.map +1 -0
- package/dist/templates/source/api/index.default.js +56 -0
- package/dist/templates/source/api/index.default.js.map +1 -0
- package/dist/templates/source/api/prisma.config.d.ts +9 -0
- package/dist/templates/source/api/prisma.config.d.ts.map +1 -0
- package/dist/templates/source/api/prisma.config.js +15 -0
- package/dist/templates/source/api/prisma.config.js.map +1 -0
- package/dist/templates/source/api/procedures/auth.d.ts +14 -0
- package/dist/templates/source/api/procedures/auth.d.ts.map +1 -0
- package/dist/templates/source/api/procedures/auth.js +221 -0
- package/dist/templates/source/api/procedures/auth.js.map +1 -0
- package/dist/templates/source/api/procedures/health.d.ts +5 -0
- package/dist/templates/source/api/procedures/health.d.ts.map +1 -0
- package/dist/templates/source/api/procedures/health.js +21 -0
- package/dist/templates/source/api/procedures/health.js.map +1 -0
- package/dist/templates/source/api/procedures/index.auth.d.ts +7 -0
- package/dist/templates/source/api/procedures/index.auth.d.ts.map +1 -0
- package/dist/templates/source/api/procedures/index.auth.js +7 -0
- package/dist/templates/source/api/procedures/index.auth.js.map +1 -0
- package/dist/templates/source/api/procedures/index.default.d.ts +6 -0
- package/dist/templates/source/api/procedures/index.default.d.ts.map +1 -0
- package/dist/templates/source/api/procedures/index.default.js +6 -0
- package/dist/templates/source/api/procedures/index.default.js.map +1 -0
- package/dist/templates/source/api/procedures/users.auth.d.ts +7 -0
- package/dist/templates/source/api/procedures/users.auth.d.ts.map +1 -0
- package/dist/templates/source/api/procedures/users.auth.js +111 -0
- package/dist/templates/source/api/procedures/users.auth.js.map +1 -0
- package/dist/templates/source/api/procedures/users.default.d.ts +5 -0
- package/dist/templates/source/api/procedures/users.default.d.ts.map +1 -0
- package/dist/templates/source/api/procedures/users.default.js +86 -0
- package/dist/templates/source/api/procedures/users.default.js.map +1 -0
- package/dist/templates/source/api/schemas/index.d.ts +5 -0
- package/dist/templates/source/api/schemas/index.d.ts.map +1 -0
- package/dist/templates/source/api/schemas/index.js +5 -0
- package/dist/templates/source/api/schemas/index.js.map +1 -0
- package/dist/templates/source/api/schemas/user.d.ts +11 -0
- package/dist/templates/source/api/schemas/user.d.ts.map +1 -0
- package/dist/templates/source/api/schemas/user.js +20 -0
- package/dist/templates/source/api/schemas/user.js.map +1 -0
- package/dist/templates/source/api/tsup.config.d.ts +3 -0
- package/dist/templates/source/api/tsup.config.d.ts.map +1 -0
- package/dist/templates/source/api/tsup.config.js +10 -0
- package/dist/templates/source/api/tsup.config.js.map +1 -0
- package/dist/templates/source/web/main.d.ts +9 -0
- package/dist/templates/source/web/main.d.ts.map +1 -0
- package/dist/templates/source/web/main.js +27 -0
- package/dist/templates/source/web/main.js.map +1 -0
- package/dist/templates/source/web/routes/__root.d.ts +2 -0
- package/dist/templates/source/web/routes/__root.d.ts.map +1 -0
- package/dist/templates/source/web/routes/__root.js +28 -0
- package/dist/templates/source/web/routes/__root.js.map +1 -0
- package/dist/templates/source/web/routes/about.d.ts +2 -0
- package/dist/templates/source/web/routes/about.d.ts.map +1 -0
- package/dist/templates/source/web/routes/about.js +33 -0
- package/dist/templates/source/web/routes/about.js.map +1 -0
- package/dist/templates/source/web/routes/index.auth.d.ts +2 -0
- package/dist/templates/source/web/routes/index.auth.d.ts.map +1 -0
- package/dist/templates/source/web/routes/index.auth.js +159 -0
- package/dist/templates/source/web/routes/index.auth.js.map +1 -0
- package/dist/templates/source/web/routes/index.default.d.ts +2 -0
- package/dist/templates/source/web/routes/index.default.d.ts.map +1 -0
- package/dist/templates/source/web/routes/index.default.js +60 -0
- package/dist/templates/source/web/routes/index.default.js.map +1 -0
- package/dist/templates/source/web/vite.config.d.ts +3 -0
- package/dist/templates/source/web/vite.config.d.ts.map +1 -0
- package/dist/templates/source/web/vite.config.js +22 -0
- package/dist/templates/source/web/vite.config.js.map +1 -0
- package/package.json +11 -9
- package/src/templates/source/api/config/app.ts +13 -0
- package/src/templates/source/api/config/auth.ts +202 -0
- package/src/templates/source/api/config/database.ts +22 -0
- package/src/templates/source/api/env.auth +22 -0
- package/src/templates/source/api/env.default +13 -0
- package/src/templates/source/api/index.auth.ts +30 -0
- package/src/templates/source/api/index.default.ts +27 -0
- package/src/templates/source/api/package.auth.json +40 -0
- package/src/templates/source/api/package.default.json +38 -0
- package/src/templates/source/api/prisma/schema.auth.prisma +30 -0
- package/src/templates/source/api/prisma/schema.default.prisma +28 -0
- package/src/templates/source/api/prisma.config.ts +15 -0
- package/src/templates/source/api/procedures/auth.ts +285 -0
- package/src/templates/source/api/procedures/health.ts +24 -0
- package/src/templates/source/api/procedures/users.auth.ts +170 -0
- package/src/templates/source/api/procedures/users.default.ts +119 -0
- package/src/templates/source/api/schemas/user.ts +29 -0
- package/src/templates/source/api/tsconfig.json +12 -0
- package/src/templates/source/api/tsup.config.ts +10 -0
- package/src/templates/source/root/CLAUDE.auth.md +148 -0
- package/src/templates/source/root/CLAUDE.default.md +128 -0
- package/src/templates/source/root/README.md +72 -0
- package/src/templates/source/root/gitignore +37 -0
- package/src/templates/source/root/package.json +17 -0
- package/src/templates/source/root/pnpm-workspace.yaml +2 -0
- package/src/templates/source/root/tsconfig.json +19 -0
- package/src/templates/source/web/App.module.css +282 -0
- package/src/templates/source/web/favicon.svg +12 -0
- package/src/templates/source/web/index.html +13 -0
- package/src/templates/source/web/main.tsx +38 -0
- package/src/templates/source/web/package.json +26 -0
- package/src/templates/source/web/routes/__root.tsx +31 -0
- package/src/templates/source/web/routes/about.tsx +36 -0
- package/src/templates/source/web/routes/index.auth.tsx +230 -0
- package/src/templates/source/web/routes/index.default.tsx +79 -0
- package/src/templates/source/web/styles/global.css +90 -0
- package/src/templates/source/web/tsconfig.json +24 -0
- package/src/templates/source/web/vite.config.ts +22 -0
- package/LICENSE +0 -21
package/dist/templates/shared.js
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Shared Template
|
|
2
|
+
* Shared Template Constants
|
|
3
3
|
*
|
|
4
|
-
* Common
|
|
4
|
+
* Common constants used across all templates.
|
|
5
5
|
*/
|
|
6
|
+
import { createRequire } from 'node:module';
|
|
7
|
+
// Read version from package.json dynamically
|
|
8
|
+
const require = createRequire(import.meta.url);
|
|
9
|
+
const packageJson = require('../../package.json');
|
|
6
10
|
// ============================================================================
|
|
7
11
|
// Version Constant
|
|
8
12
|
// ============================================================================
|
|
@@ -10,292 +14,5 @@
|
|
|
10
14
|
* VeloxTS framework version for generated projects.
|
|
11
15
|
* This is automatically updated during releases via changesets.
|
|
12
16
|
*/
|
|
13
|
-
export const VELOXTS_VERSION = '0.
|
|
14
|
-
// ============================================================================
|
|
15
|
-
// TypeScript Config
|
|
16
|
-
// ============================================================================
|
|
17
|
-
export function generateTsConfig() {
|
|
18
|
-
return JSON.stringify({
|
|
19
|
-
$schema: 'https://json.schemastore.org/tsconfig',
|
|
20
|
-
compilerOptions: {
|
|
21
|
-
target: 'ES2022',
|
|
22
|
-
module: 'ES2022',
|
|
23
|
-
moduleResolution: 'bundler',
|
|
24
|
-
lib: ['ES2022'],
|
|
25
|
-
strict: true,
|
|
26
|
-
esModuleInterop: true,
|
|
27
|
-
skipLibCheck: true,
|
|
28
|
-
resolveJsonModule: true,
|
|
29
|
-
allowSyntheticDefaultImports: true,
|
|
30
|
-
forceConsistentCasingInFileNames: true,
|
|
31
|
-
isolatedModules: true,
|
|
32
|
-
noUnusedLocals: true,
|
|
33
|
-
noUnusedParameters: true,
|
|
34
|
-
noFallthroughCasesInSwitch: true,
|
|
35
|
-
declaration: false,
|
|
36
|
-
declarationMap: false,
|
|
37
|
-
rootDir: './src',
|
|
38
|
-
outDir: './dist',
|
|
39
|
-
},
|
|
40
|
-
include: ['src/**/*'],
|
|
41
|
-
exclude: ['node_modules', 'dist', '**/*.test.ts', '**/*.spec.ts'],
|
|
42
|
-
}, null, 2);
|
|
43
|
-
}
|
|
44
|
-
// ============================================================================
|
|
45
|
-
// tsup Config
|
|
46
|
-
// ============================================================================
|
|
47
|
-
export function generateTsupConfig() {
|
|
48
|
-
return `import { defineConfig } from 'tsup';
|
|
49
|
-
|
|
50
|
-
export default defineConfig({
|
|
51
|
-
entry: ['src/index.ts'],
|
|
52
|
-
format: ['esm'],
|
|
53
|
-
target: 'node18',
|
|
54
|
-
clean: true,
|
|
55
|
-
dts: false,
|
|
56
|
-
sourcemap: true,
|
|
57
|
-
});
|
|
58
|
-
`;
|
|
59
|
-
}
|
|
60
|
-
// ============================================================================
|
|
61
|
-
// Environment Files
|
|
62
|
-
// ============================================================================
|
|
63
|
-
export function generateGitignore() {
|
|
64
|
-
return `# Dependencies
|
|
65
|
-
node_modules/
|
|
66
|
-
|
|
67
|
-
# Build output
|
|
68
|
-
dist/
|
|
69
|
-
*.tsbuildinfo
|
|
70
|
-
|
|
71
|
-
# Environment variables
|
|
72
|
-
.env
|
|
73
|
-
.env.local
|
|
74
|
-
|
|
75
|
-
# Database
|
|
76
|
-
*.db
|
|
77
|
-
*.db-journal
|
|
78
|
-
|
|
79
|
-
# Generated Prisma client
|
|
80
|
-
src/generated/
|
|
81
|
-
|
|
82
|
-
# Logs
|
|
83
|
-
logs/
|
|
84
|
-
*.log
|
|
85
|
-
|
|
86
|
-
# OS
|
|
87
|
-
.DS_Store
|
|
88
|
-
Thumbs.db
|
|
89
|
-
|
|
90
|
-
# IDE
|
|
91
|
-
.vscode/
|
|
92
|
-
.idea/
|
|
93
|
-
*.swp
|
|
94
|
-
*.swo
|
|
95
|
-
|
|
96
|
-
# Turbo
|
|
97
|
-
.turbo/
|
|
98
|
-
`;
|
|
99
|
-
}
|
|
100
|
-
// ============================================================================
|
|
101
|
-
// Prisma Config (Prisma 7.x)
|
|
102
|
-
// ============================================================================
|
|
103
|
-
export function generatePrismaConfig() {
|
|
104
|
-
return `/**
|
|
105
|
-
* Prisma Configuration (Prisma 7.x)
|
|
106
|
-
*
|
|
107
|
-
* Database URL is now configured here instead of schema.prisma.
|
|
108
|
-
* See: https://www.prisma.io/docs/orm/more/upgrade-guides/upgrading-versions/upgrading-to-prisma-7
|
|
109
|
-
*/
|
|
110
|
-
|
|
111
|
-
import 'dotenv/config';
|
|
112
|
-
import { defineConfig } from 'prisma/config';
|
|
113
|
-
|
|
114
|
-
export default defineConfig({
|
|
115
|
-
earlyAccess: true,
|
|
116
|
-
schema: './prisma/schema.prisma',
|
|
117
|
-
datasource: {
|
|
118
|
-
url: process.env.DATABASE_URL!,
|
|
119
|
-
},
|
|
120
|
-
});
|
|
121
|
-
`;
|
|
122
|
-
}
|
|
123
|
-
// ============================================================================
|
|
124
|
-
// Config Files
|
|
125
|
-
// ============================================================================
|
|
126
|
-
export function generateConfigIndex() {
|
|
127
|
-
return `/**
|
|
128
|
-
* Configuration Exports
|
|
129
|
-
*/
|
|
130
|
-
|
|
131
|
-
export * from './app.js';
|
|
132
|
-
`;
|
|
133
|
-
}
|
|
134
|
-
export function generateConfigApp() {
|
|
135
|
-
return `/**
|
|
136
|
-
* Application Configuration
|
|
137
|
-
*/
|
|
138
|
-
|
|
139
|
-
export interface AppConfig {
|
|
140
|
-
port: number;
|
|
141
|
-
host: string;
|
|
142
|
-
logger: boolean;
|
|
143
|
-
apiPrefix: string;
|
|
144
|
-
env: 'development' | 'production' | 'test';
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
export function createConfig(): AppConfig {
|
|
148
|
-
return {
|
|
149
|
-
port: Number(process.env.PORT) || 3210,
|
|
150
|
-
host: process.env.HOST || '0.0.0.0',
|
|
151
|
-
logger: process.env.LOG_LEVEL !== 'silent',
|
|
152
|
-
apiPrefix: process.env.API_PREFIX || '/api',
|
|
153
|
-
env: (process.env.NODE_ENV as AppConfig['env']) || 'development',
|
|
154
|
-
};
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
export const config = createConfig();
|
|
158
|
-
`;
|
|
159
|
-
}
|
|
160
|
-
// ============================================================================
|
|
161
|
-
// Health Procedures
|
|
162
|
-
// ============================================================================
|
|
163
|
-
export function generateHealthProcedures() {
|
|
164
|
-
return `/**
|
|
165
|
-
* Health Check Procedures
|
|
166
|
-
*/
|
|
167
|
-
|
|
168
|
-
import { VELOX_VERSION, defineProcedures, procedure, z } from '@veloxts/velox';
|
|
169
|
-
|
|
170
|
-
export const healthProcedures = defineProcedures('health', {
|
|
171
|
-
getHealth: procedure()
|
|
172
|
-
.rest({ method: 'GET', path: '/health' })
|
|
173
|
-
.output(
|
|
174
|
-
z.object({
|
|
175
|
-
status: z.literal('ok'),
|
|
176
|
-
version: z.string(),
|
|
177
|
-
timestamp: z.string().datetime(),
|
|
178
|
-
uptime: z.number(),
|
|
179
|
-
})
|
|
180
|
-
)
|
|
181
|
-
.query(async () => ({
|
|
182
|
-
status: 'ok' as const,
|
|
183
|
-
version: VELOX_VERSION,
|
|
184
|
-
timestamp: new Date().toISOString(),
|
|
185
|
-
uptime: process.uptime(),
|
|
186
|
-
})),
|
|
187
|
-
});
|
|
188
|
-
`;
|
|
189
|
-
}
|
|
190
|
-
// ============================================================================
|
|
191
|
-
// Static Files
|
|
192
|
-
// ============================================================================
|
|
193
|
-
export function generateIndexHtml() {
|
|
194
|
-
return `<!DOCTYPE html>
|
|
195
|
-
<html lang="en">
|
|
196
|
-
<head>
|
|
197
|
-
<meta charset="UTF-8">
|
|
198
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
199
|
-
<title>VeloxTS App</title>
|
|
200
|
-
<style>
|
|
201
|
-
* { box-sizing: border-box; margin: 0; padding: 0; }
|
|
202
|
-
body { font-family: system-ui, sans-serif; background: #f5f5f5; padding: 20px; }
|
|
203
|
-
.container { max-width: 800px; margin: 0 auto; }
|
|
204
|
-
h1 { margin-bottom: 20px; color: #333; }
|
|
205
|
-
.card { background: white; border-radius: 8px; padding: 20px; margin-bottom: 20px; box-shadow: 0 1px 3px rgba(0,0,0,0.1); }
|
|
206
|
-
.card h2 { margin-bottom: 15px; color: #555; font-size: 1.1rem; }
|
|
207
|
-
button { background: #007bff; color: white; border: none; padding: 8px 16px; border-radius: 4px; cursor: pointer; }
|
|
208
|
-
button:hover { background: #0056b3; }
|
|
209
|
-
</style>
|
|
210
|
-
</head>
|
|
211
|
-
<body>
|
|
212
|
-
<div class="container">
|
|
213
|
-
<h1>Welcome to VeloxTS</h1>
|
|
214
|
-
<div class="card">
|
|
215
|
-
<h2>Your app is running!</h2>
|
|
216
|
-
<p>Visit <code>/api/health</code> to check the API status.</p>
|
|
217
|
-
<p>Visit <code>/api/users</code> to see the users endpoint.</p>
|
|
218
|
-
</div>
|
|
219
|
-
</div>
|
|
220
|
-
</body>
|
|
221
|
-
</html>
|
|
222
|
-
`;
|
|
223
|
-
}
|
|
224
|
-
// ============================================================================
|
|
225
|
-
// README
|
|
226
|
-
// ============================================================================
|
|
227
|
-
export function generateReadme(config) {
|
|
228
|
-
return `# ${config.projectName}
|
|
229
|
-
|
|
230
|
-
A VeloxTS application - TypeScript full-stack framework.
|
|
231
|
-
|
|
232
|
-
## Getting Started
|
|
233
|
-
|
|
234
|
-
### Install Dependencies
|
|
235
|
-
|
|
236
|
-
\`\`\`bash
|
|
237
|
-
${config.packageManager} install
|
|
238
|
-
\`\`\`
|
|
239
|
-
|
|
240
|
-
### Setup Database
|
|
241
|
-
|
|
242
|
-
\`\`\`bash
|
|
243
|
-
${config.packageManager} db:push
|
|
244
|
-
\`\`\`
|
|
245
|
-
|
|
246
|
-
### Start Development Server
|
|
247
|
-
|
|
248
|
-
\`\`\`bash
|
|
249
|
-
${config.packageManager} dev
|
|
250
|
-
\`\`\`
|
|
251
|
-
|
|
252
|
-
The app will start at http://localhost:3210
|
|
253
|
-
|
|
254
|
-
## Project Structure
|
|
255
|
-
|
|
256
|
-
\`\`\`
|
|
257
|
-
src/
|
|
258
|
-
├── config/ # Application configuration
|
|
259
|
-
├── database/ # Database client
|
|
260
|
-
├── procedures/ # API procedures (business logic)
|
|
261
|
-
├── schemas/ # Zod validation schemas
|
|
262
|
-
└── index.ts # Application entry point
|
|
263
|
-
\`\`\`
|
|
264
|
-
|
|
265
|
-
## Available Scripts
|
|
266
|
-
|
|
267
|
-
- \`${config.packageManager} dev\` - Start development server with hot reload
|
|
268
|
-
- \`${config.packageManager} build\` - Build for production
|
|
269
|
-
- \`${config.packageManager} start\` - Start production server
|
|
270
|
-
- \`${config.packageManager} db:push\` - Sync database schema
|
|
271
|
-
- \`${config.packageManager} db:studio\` - Open Prisma Studio
|
|
272
|
-
|
|
273
|
-
## Learn More
|
|
274
|
-
|
|
275
|
-
- [VeloxTS Documentation](https://veloxts.dev)
|
|
276
|
-
- [TypeScript](https://www.typescriptlang.org/)
|
|
277
|
-
- [Fastify](https://fastify.dev/)
|
|
278
|
-
- [Prisma](https://www.prisma.io/)
|
|
279
|
-
|
|
280
|
-
## License
|
|
281
|
-
|
|
282
|
-
MIT
|
|
283
|
-
`;
|
|
284
|
-
}
|
|
285
|
-
// ============================================================================
|
|
286
|
-
// Shared Files Generator
|
|
287
|
-
// ============================================================================
|
|
288
|
-
export function generateSharedFiles(config) {
|
|
289
|
-
return [
|
|
290
|
-
{ path: 'tsconfig.json', content: generateTsConfig() },
|
|
291
|
-
{ path: 'tsup.config.ts', content: generateTsupConfig() },
|
|
292
|
-
{ path: '.gitignore', content: generateGitignore() },
|
|
293
|
-
{ path: 'prisma.config.ts', content: generatePrismaConfig() },
|
|
294
|
-
{ path: 'README.md', content: generateReadme(config) },
|
|
295
|
-
{ path: 'src/config/index.ts', content: generateConfigIndex() },
|
|
296
|
-
{ path: 'src/config/app.ts', content: generateConfigApp() },
|
|
297
|
-
{ path: 'src/procedures/health.ts', content: generateHealthProcedures() },
|
|
298
|
-
{ path: 'public/index.html', content: generateIndexHtml() },
|
|
299
|
-
];
|
|
300
|
-
}
|
|
17
|
+
export const VELOXTS_VERSION = packageJson.version ?? '0.0.0-unknown';
|
|
301
18
|
//# sourceMappingURL=shared.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/templates/shared.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/templates/shared.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,6CAA6C;AAC7C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,WAAW,GAAG,OAAO,CAAC,oBAAoB,CAAwB,CAAC;AAEzE,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAW,WAAW,CAAC,OAAO,IAAI,eAAe,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Application Configuration
|
|
3
|
+
*/
|
|
4
|
+
export interface AppConfig {
|
|
5
|
+
port: number;
|
|
6
|
+
host: string;
|
|
7
|
+
logger: boolean;
|
|
8
|
+
apiPrefix: string;
|
|
9
|
+
env: 'development' | 'production' | 'test';
|
|
10
|
+
}
|
|
11
|
+
export declare function createConfig(): AppConfig;
|
|
12
|
+
export declare const config: AppConfig;
|
|
13
|
+
//# sourceMappingURL=app.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../../../src/templates/source/api/config/app.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,aAAa,GAAG,YAAY,GAAG,MAAM,CAAC;CAC5C;AAED,wBAAgB,YAAY,IAAI,SAAS,CAQxC;AAED,eAAO,MAAM,MAAM,WAAiB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Application Configuration
|
|
3
|
+
*/
|
|
4
|
+
export function createConfig() {
|
|
5
|
+
return {
|
|
6
|
+
port: Number(process.env.PORT) || __API_PORT__,
|
|
7
|
+
host: process.env.HOST || '0.0.0.0',
|
|
8
|
+
logger: process.env.LOG_LEVEL !== 'silent',
|
|
9
|
+
apiPrefix: process.env.API_PREFIX || '/api',
|
|
10
|
+
env: process.env.NODE_ENV || 'development',
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export const config = createConfig();
|
|
14
|
+
//# sourceMappingURL=app.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../../../../src/templates/source/api/config/app.ts"],"names":[],"mappings":"AAAA;;GAEG;AAUH,MAAM,UAAU,YAAY;IAC1B,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,YAAY;QAC9C,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,SAAS;QACnC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,QAAQ;QAC1C,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,MAAM;QAC3C,GAAG,EAAG,OAAO,CAAC,GAAG,CAAC,QAA6B,IAAI,aAAa;KACjE,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authentication Configuration
|
|
3
|
+
*
|
|
4
|
+
* JWT-based authentication configuration.
|
|
5
|
+
*
|
|
6
|
+
* SECURITY: JWT secrets are required from environment variables.
|
|
7
|
+
* The app will fail to start in production without them.
|
|
8
|
+
*/
|
|
9
|
+
import type { AuthPluginOptions } from '@veloxts/velox';
|
|
10
|
+
/**
|
|
11
|
+
* In-memory token revocation store.
|
|
12
|
+
*
|
|
13
|
+
* PRODUCTION NOTE: Replace with Redis or database-backed store for:
|
|
14
|
+
* - Persistence across server restarts
|
|
15
|
+
* - Horizontal scaling (multiple server instances)
|
|
16
|
+
*/
|
|
17
|
+
declare class InMemoryTokenStore {
|
|
18
|
+
private revokedTokens;
|
|
19
|
+
private usedRefreshTokens;
|
|
20
|
+
private cleanupInterval;
|
|
21
|
+
constructor();
|
|
22
|
+
revoke(jti: string, expiresInMs?: number): void;
|
|
23
|
+
isRevoked(jti: string): boolean;
|
|
24
|
+
markRefreshTokenUsed(jti: string, userId: string): void;
|
|
25
|
+
isRefreshTokenUsed(jti: string): string | undefined;
|
|
26
|
+
revokeAllUserTokens(userId: string): void;
|
|
27
|
+
private cleanup;
|
|
28
|
+
}
|
|
29
|
+
export declare const tokenStore: InMemoryTokenStore;
|
|
30
|
+
export declare function parseUserRoles(rolesJson: string | null): string[];
|
|
31
|
+
export declare function createAuthConfig(): AuthPluginOptions;
|
|
32
|
+
export declare const authConfig: AuthPluginOptions;
|
|
33
|
+
export {};
|
|
34
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../../../src/templates/source/api/config/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAgExD;;;;;;GAMG;AACH,cAAM,kBAAkB;IACtB,OAAO,CAAC,aAAa,CAAkC;IACvD,OAAO,CAAC,iBAAiB,CAAkC;IAC3D,OAAO,CAAC,eAAe,CAA+B;;IAMtD,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,GAAE,MAAgC,GAAG,IAAI;IAIxE,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAU/B,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAKvD,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAInD,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAOzC,OAAO,CAAC,OAAO;CAQhB;AAED,eAAO,MAAM,UAAU,oBAA2B,CAAC;AAQnD,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,EAAE,CAkBjE;AAyBD,wBAAgB,gBAAgB,IAAI,iBAAiB,CAmBpD;AAED,eAAO,MAAM,UAAU,mBAAqB,CAAC"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authentication Configuration
|
|
3
|
+
*
|
|
4
|
+
* JWT-based authentication configuration.
|
|
5
|
+
*
|
|
6
|
+
* SECURITY: JWT secrets are required from environment variables.
|
|
7
|
+
* The app will fail to start in production without them.
|
|
8
|
+
*/
|
|
9
|
+
import { prisma } from '../database/index.js';
|
|
10
|
+
// ============================================================================
|
|
11
|
+
// Environment Variable Validation
|
|
12
|
+
// ============================================================================
|
|
13
|
+
/**
|
|
14
|
+
* Gets required JWT secrets from environment variables.
|
|
15
|
+
* Throws a clear error in production if secrets are not configured.
|
|
16
|
+
*/
|
|
17
|
+
function getRequiredSecrets() {
|
|
18
|
+
const jwtSecret = process.env.JWT_SECRET;
|
|
19
|
+
const refreshSecret = process.env.JWT_REFRESH_SECRET;
|
|
20
|
+
const isDevelopment = process.env.NODE_ENV !== 'production';
|
|
21
|
+
if (!jwtSecret || !refreshSecret) {
|
|
22
|
+
if (isDevelopment) {
|
|
23
|
+
console.warn('\n' +
|
|
24
|
+
'='.repeat(70) +
|
|
25
|
+
'\n' +
|
|
26
|
+
' WARNING: JWT secrets not configured!\n' +
|
|
27
|
+
' Using temporary development secrets. DO NOT USE IN PRODUCTION!\n' +
|
|
28
|
+
'\n' +
|
|
29
|
+
' To configure secrets, add to .env:\n' +
|
|
30
|
+
' JWT_SECRET=<generate with: openssl rand -base64 64>\n' +
|
|
31
|
+
' JWT_REFRESH_SECRET=<generate with: openssl rand -base64 64>\n' +
|
|
32
|
+
'='.repeat(70) +
|
|
33
|
+
'\n');
|
|
34
|
+
return {
|
|
35
|
+
jwtSecret: jwtSecret || `dev-only-jwt-secret-${Math.random().toString(36).substring(2).repeat(4)}`,
|
|
36
|
+
refreshSecret: refreshSecret ||
|
|
37
|
+
`dev-only-refresh-secret-${Math.random().toString(36).substring(2).repeat(4)}`,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
throw new Error('\n' +
|
|
41
|
+
'CRITICAL: JWT secrets are required but not configured.\n' +
|
|
42
|
+
'\n' +
|
|
43
|
+
'Required environment variables:\n' +
|
|
44
|
+
' - JWT_SECRET: Secret for signing access tokens (64+ characters)\n' +
|
|
45
|
+
' - JWT_REFRESH_SECRET: Secret for signing refresh tokens (64+ characters)\n' +
|
|
46
|
+
'\n' +
|
|
47
|
+
'Generate secure secrets with:\n' +
|
|
48
|
+
' openssl rand -base64 64\n' +
|
|
49
|
+
'\n' +
|
|
50
|
+
'Add them to your environment or .env file before starting the server.\n');
|
|
51
|
+
}
|
|
52
|
+
return { jwtSecret, refreshSecret };
|
|
53
|
+
}
|
|
54
|
+
// ============================================================================
|
|
55
|
+
// Token Revocation Store
|
|
56
|
+
// ============================================================================
|
|
57
|
+
/**
|
|
58
|
+
* In-memory token revocation store.
|
|
59
|
+
*
|
|
60
|
+
* PRODUCTION NOTE: Replace with Redis or database-backed store for:
|
|
61
|
+
* - Persistence across server restarts
|
|
62
|
+
* - Horizontal scaling (multiple server instances)
|
|
63
|
+
*/
|
|
64
|
+
class InMemoryTokenStore {
|
|
65
|
+
revokedTokens = new Map();
|
|
66
|
+
usedRefreshTokens = new Map();
|
|
67
|
+
cleanupInterval = null;
|
|
68
|
+
constructor() {
|
|
69
|
+
this.cleanupInterval = setInterval(() => this.cleanup(), 5 * 60 * 1000);
|
|
70
|
+
}
|
|
71
|
+
revoke(jti, expiresInMs = 7 * 24 * 60 * 60 * 1000) {
|
|
72
|
+
this.revokedTokens.set(jti, Date.now() + expiresInMs);
|
|
73
|
+
}
|
|
74
|
+
isRevoked(jti) {
|
|
75
|
+
const expiry = this.revokedTokens.get(jti);
|
|
76
|
+
if (!expiry)
|
|
77
|
+
return false;
|
|
78
|
+
if (Date.now() > expiry) {
|
|
79
|
+
this.revokedTokens.delete(jti);
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
markRefreshTokenUsed(jti, userId) {
|
|
85
|
+
this.usedRefreshTokens.set(jti, userId);
|
|
86
|
+
setTimeout(() => this.usedRefreshTokens.delete(jti), 7 * 24 * 60 * 60 * 1000);
|
|
87
|
+
}
|
|
88
|
+
isRefreshTokenUsed(jti) {
|
|
89
|
+
return this.usedRefreshTokens.get(jti);
|
|
90
|
+
}
|
|
91
|
+
revokeAllUserTokens(userId) {
|
|
92
|
+
console.warn(`[Security] Token reuse detected for user ${userId}. ` +
|
|
93
|
+
'All tokens should be revoked. Implement proper user->token mapping for production.');
|
|
94
|
+
}
|
|
95
|
+
cleanup() {
|
|
96
|
+
const now = Date.now();
|
|
97
|
+
for (const [jti, expiry] of this.revokedTokens.entries()) {
|
|
98
|
+
if (now > expiry) {
|
|
99
|
+
this.revokedTokens.delete(jti);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
export const tokenStore = new InMemoryTokenStore();
|
|
105
|
+
// ============================================================================
|
|
106
|
+
// Role Parsing
|
|
107
|
+
// ============================================================================
|
|
108
|
+
const ALLOWED_ROLES = ['user', 'admin', 'moderator', 'editor'];
|
|
109
|
+
export function parseUserRoles(rolesJson) {
|
|
110
|
+
if (!rolesJson)
|
|
111
|
+
return ['user'];
|
|
112
|
+
try {
|
|
113
|
+
const parsed = JSON.parse(rolesJson);
|
|
114
|
+
if (!Array.isArray(parsed)) {
|
|
115
|
+
return ['user'];
|
|
116
|
+
}
|
|
117
|
+
const validRoles = parsed
|
|
118
|
+
.filter((role) => typeof role === 'string')
|
|
119
|
+
.filter((role) => ALLOWED_ROLES.includes(role));
|
|
120
|
+
return validRoles.length > 0 ? validRoles : ['user'];
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
return ['user'];
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// ============================================================================
|
|
127
|
+
// User Loader
|
|
128
|
+
// ============================================================================
|
|
129
|
+
async function userLoader(userId) {
|
|
130
|
+
const user = await prisma.user.findUnique({
|
|
131
|
+
where: { id: userId },
|
|
132
|
+
});
|
|
133
|
+
if (!user)
|
|
134
|
+
return null;
|
|
135
|
+
return {
|
|
136
|
+
id: user.id,
|
|
137
|
+
email: user.email,
|
|
138
|
+
name: user.name,
|
|
139
|
+
roles: parseUserRoles(user.roles),
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
// ============================================================================
|
|
143
|
+
// Auth Configuration
|
|
144
|
+
// ============================================================================
|
|
145
|
+
export function createAuthConfig() {
|
|
146
|
+
const { jwtSecret, refreshSecret } = getRequiredSecrets();
|
|
147
|
+
return {
|
|
148
|
+
jwt: {
|
|
149
|
+
secret: jwtSecret,
|
|
150
|
+
refreshSecret: refreshSecret,
|
|
151
|
+
accessTokenExpiry: '15m',
|
|
152
|
+
refreshTokenExpiry: '7d',
|
|
153
|
+
issuer: 'velox-app',
|
|
154
|
+
audience: 'velox-app-client',
|
|
155
|
+
},
|
|
156
|
+
userLoader,
|
|
157
|
+
isTokenRevoked: async (jti) => tokenStore.isRevoked(jti),
|
|
158
|
+
rateLimit: {
|
|
159
|
+
max: 100,
|
|
160
|
+
windowMs: 60000,
|
|
161
|
+
},
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
export const authConfig = createAuthConfig();
|
|
165
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../../../src/templates/source/api/config/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.auth.d.ts","sourceRoot":"","sources":["../../../../../src/templates/source/api/config/index.auth.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.auth.js","sourceRoot":"","sources":["../../../../../src/templates/source/api/config/index.auth.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.default.d.ts","sourceRoot":"","sources":["../../../../../src/templates/source/api/config/index.default.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,UAAU,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.default.js","sourceRoot":"","sources":["../../../../../src/templates/source/api/config/index.default.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,UAAU,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/templates/source/api/database/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAeH,eAAO,MAAM,MAAM,KAAgC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database Client (Prisma 7.x)
|
|
3
|
+
*
|
|
4
|
+
* Prisma 7 requires:
|
|
5
|
+
* - Generated client from custom output path
|
|
6
|
+
* - Driver adapter for database connections
|
|
7
|
+
*/
|
|
8
|
+
import { PrismaBetterSqlite3 } from '@prisma/adapter-better-sqlite3';
|
|
9
|
+
import { PrismaClient } from '../generated/prisma/client.js';
|
|
10
|
+
// Validate DATABASE_URL is set
|
|
11
|
+
if (!process.env.DATABASE_URL) {
|
|
12
|
+
throw new Error('DATABASE_URL environment variable is required');
|
|
13
|
+
}
|
|
14
|
+
// Create SQLite adapter with database URL from environment
|
|
15
|
+
const adapter = new PrismaBetterSqlite3({ url: process.env.DATABASE_URL });
|
|
16
|
+
// Export configured Prisma client
|
|
17
|
+
export const prisma = new PrismaClient({ adapter });
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/templates/source/api/database/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAErE,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAE7D,+BAA+B;AAC/B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC9B,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;AACnE,CAAC;AAED,2DAA2D;AAC3D,MAAM,OAAO,GAAG,IAAI,mBAAmB,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC;AAE3E,kCAAkC;AAClC,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.auth.d.ts","sourceRoot":"","sources":["../../../../src/templates/source/api/index.auth.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,eAAe,CAAC"}
|