@engjts/nexus 0.1.7 → 0.1.9
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/advanced/playground/generatePlaygroundHTML.d.ts.map +1 -1
- package/dist/advanced/playground/generatePlaygroundHTML.js +107 -0
- package/dist/advanced/playground/generatePlaygroundHTML.js.map +1 -1
- package/dist/advanced/playground/playground.d.ts +19 -0
- package/dist/advanced/playground/playground.d.ts.map +1 -1
- package/dist/advanced/playground/playground.js +70 -0
- package/dist/advanced/playground/playground.js.map +1 -1
- package/dist/advanced/playground/types.d.ts +20 -0
- package/dist/advanced/playground/types.d.ts.map +1 -1
- package/dist/core/application.d.ts +14 -0
- package/dist/core/application.d.ts.map +1 -1
- package/dist/core/application.js +173 -71
- package/dist/core/application.js.map +1 -1
- package/dist/core/context-pool.d.ts +2 -13
- package/dist/core/context-pool.d.ts.map +1 -1
- package/dist/core/context-pool.js +7 -45
- package/dist/core/context-pool.js.map +1 -1
- package/dist/core/context.d.ts +108 -5
- package/dist/core/context.d.ts.map +1 -1
- package/dist/core/context.js +449 -53
- package/dist/core/context.js.map +1 -1
- package/dist/core/index.d.ts +1 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +9 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/middleware.d.ts +6 -0
- package/dist/core/middleware.d.ts.map +1 -1
- package/dist/core/middleware.js +83 -84
- package/dist/core/middleware.js.map +1 -1
- package/dist/core/performance/fast-json.d.ts +149 -0
- package/dist/core/performance/fast-json.d.ts.map +1 -0
- package/dist/core/performance/fast-json.js +473 -0
- package/dist/core/performance/fast-json.js.map +1 -0
- package/dist/core/router/file-router.d.ts +20 -7
- package/dist/core/router/file-router.d.ts.map +1 -1
- package/dist/core/router/file-router.js +41 -13
- package/dist/core/router/file-router.js.map +1 -1
- package/dist/core/router/index.d.ts +6 -0
- package/dist/core/router/index.d.ts.map +1 -1
- package/dist/core/router/index.js +33 -6
- package/dist/core/router/index.js.map +1 -1
- package/dist/core/router/radix-tree.d.ts +4 -1
- package/dist/core/router/radix-tree.d.ts.map +1 -1
- package/dist/core/router/radix-tree.js +7 -3
- package/dist/core/router/radix-tree.js.map +1 -1
- package/dist/core/serializer.d.ts +251 -0
- package/dist/core/serializer.d.ts.map +1 -0
- package/dist/core/serializer.js +290 -0
- package/dist/core/serializer.js.map +1 -0
- package/dist/core/types.d.ts +39 -1
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -2
- package/dist/index.js.map +1 -1
- package/package.json +3 -1
- package/documentation/01-getting-started.md +0 -240
- package/documentation/02-context.md +0 -335
- package/documentation/03-routing.md +0 -397
- package/documentation/04-middleware.md +0 -483
- package/documentation/05-validation.md +0 -514
- package/documentation/06-error-handling.md +0 -465
- package/documentation/07-performance.md +0 -364
- package/documentation/08-adapters.md +0 -470
- package/documentation/09-api-reference.md +0 -548
- package/documentation/10-examples.md +0 -582
- package/documentation/11-deployment.md +0 -477
- package/documentation/12-sentry.md +0 -620
- package/documentation/13-sentry-data-storage.md +0 -996
- package/documentation/14-sentry-data-reference.md +0 -457
- package/documentation/15-sentry-summary.md +0 -409
- package/documentation/16-alerts-system.md +0 -745
- package/documentation/17-alert-adapters.md +0 -696
- package/documentation/18-alerts-implementation-summary.md +0 -385
- package/documentation/19-class-based-routing.md +0 -840
- package/documentation/20-websocket-realtime.md +0 -813
- package/documentation/21-cache-system.md +0 -510
- package/documentation/22-job-queue.md +0 -772
- package/documentation/23-sentry-plugin.md +0 -551
- package/documentation/24-testing-utilities.md +0 -1287
- package/documentation/25-api-versioning.md +0 -533
- package/documentation/26-context-store.md +0 -607
- package/documentation/27-dependency-injection.md +0 -329
- package/documentation/28-lifecycle-hooks.md +0 -521
- package/documentation/29-package-structure.md +0 -196
- package/documentation/30-plugin-system.md +0 -414
- package/documentation/31-jwt-authentication.md +0 -597
- package/documentation/32-cli.md +0 -268
- package/documentation/ALERTS-COMPLETE-SUMMARY.md +0 -429
- package/documentation/ALERTS-INDEX.md +0 -330
- package/documentation/ALERTS-QUICK-REFERENCE.md +0 -286
- package/documentation/README.md +0 -178
- package/documentation/index.html +0 -34
- package/modern_framework_paper.md +0 -1870
- package/public/css/style.css +0 -87
- package/public/index.html +0 -34
- package/public/js/app.js +0 -27
- package/src/advanced/cache/InMemoryCacheStore.ts +0 -68
- package/src/advanced/cache/MultiTierCache.ts +0 -194
- package/src/advanced/cache/RedisCacheStore.ts +0 -341
- package/src/advanced/cache/index.ts +0 -5
- package/src/advanced/cache/types.ts +0 -40
- package/src/advanced/graphql/SimpleDataLoader.ts +0 -42
- package/src/advanced/graphql/index.ts +0 -22
- package/src/advanced/graphql/server.ts +0 -252
- package/src/advanced/graphql/types.ts +0 -42
- package/src/advanced/jobs/InMemoryQueueStore.ts +0 -68
- package/src/advanced/jobs/JobQueue.ts +0 -556
- package/src/advanced/jobs/RedisQueueStore.ts +0 -367
- package/src/advanced/jobs/index.ts +0 -5
- package/src/advanced/jobs/types.ts +0 -70
- package/src/advanced/observability/APMManager.ts +0 -163
- package/src/advanced/observability/AlertManager.ts +0 -109
- package/src/advanced/observability/MetricRegistry.ts +0 -151
- package/src/advanced/observability/ObservabilityCenter.ts +0 -304
- package/src/advanced/observability/StructuredLogger.ts +0 -154
- package/src/advanced/observability/TracingManager.ts +0 -117
- package/src/advanced/observability/adapters.ts +0 -304
- package/src/advanced/observability/createObservabilityMiddleware.ts +0 -63
- package/src/advanced/observability/index.ts +0 -11
- package/src/advanced/observability/types.ts +0 -174
- package/src/advanced/playground/extractPathParams.ts +0 -6
- package/src/advanced/playground/generateFieldExample.ts +0 -31
- package/src/advanced/playground/generatePlaygroundHTML.ts +0 -1849
- package/src/advanced/playground/generateSummary.ts +0 -19
- package/src/advanced/playground/getTagFromPath.ts +0 -9
- package/src/advanced/playground/index.ts +0 -8
- package/src/advanced/playground/playground.ts +0 -170
- package/src/advanced/playground/types.ts +0 -20
- package/src/advanced/playground/zodToExample.ts +0 -16
- package/src/advanced/playground/zodToParams.ts +0 -15
- package/src/advanced/postman/buildAuth.ts +0 -31
- package/src/advanced/postman/buildBody.ts +0 -15
- package/src/advanced/postman/buildQueryParams.ts +0 -27
- package/src/advanced/postman/buildRequestItem.ts +0 -36
- package/src/advanced/postman/buildResponses.ts +0 -11
- package/src/advanced/postman/buildUrl.ts +0 -33
- package/src/advanced/postman/capitalize.ts +0 -4
- package/src/advanced/postman/generateCollection.ts +0 -59
- package/src/advanced/postman/generateEnvironment.ts +0 -34
- package/src/advanced/postman/generateExampleFromZod.ts +0 -21
- package/src/advanced/postman/generateFieldExample.ts +0 -45
- package/src/advanced/postman/generateName.ts +0 -20
- package/src/advanced/postman/generateUUID.ts +0 -11
- package/src/advanced/postman/getTagFromPath.ts +0 -10
- package/src/advanced/postman/index.ts +0 -28
- package/src/advanced/postman/postman.ts +0 -156
- package/src/advanced/postman/slugify.ts +0 -7
- package/src/advanced/postman/types.ts +0 -140
- package/src/advanced/realtime/index.ts +0 -18
- package/src/advanced/realtime/websocket.ts +0 -231
- package/src/advanced/sentry/index.ts +0 -1236
- package/src/advanced/sentry/types.ts +0 -355
- package/src/advanced/static/generateDirectoryListing.ts +0 -47
- package/src/advanced/static/generateETag.ts +0 -7
- package/src/advanced/static/getMimeType.ts +0 -9
- package/src/advanced/static/index.ts +0 -32
- package/src/advanced/static/isSafePath.ts +0 -13
- package/src/advanced/static/publicDir.ts +0 -21
- package/src/advanced/static/serveStatic.ts +0 -225
- package/src/advanced/static/spa.ts +0 -24
- package/src/advanced/static/types.ts +0 -159
- package/src/advanced/swagger/SwaggerGenerator.ts +0 -66
- package/src/advanced/swagger/buildOperation.ts +0 -61
- package/src/advanced/swagger/buildParameters.ts +0 -61
- package/src/advanced/swagger/buildRequestBody.ts +0 -21
- package/src/advanced/swagger/buildResponses.ts +0 -54
- package/src/advanced/swagger/capitalize.ts +0 -5
- package/src/advanced/swagger/convertPath.ts +0 -9
- package/src/advanced/swagger/createSwagger.ts +0 -12
- package/src/advanced/swagger/generateOperationId.ts +0 -21
- package/src/advanced/swagger/generateSpec.ts +0 -105
- package/src/advanced/swagger/generateSummary.ts +0 -24
- package/src/advanced/swagger/generateSwaggerUI.ts +0 -70
- package/src/advanced/swagger/generateThemeCss.ts +0 -53
- package/src/advanced/swagger/index.ts +0 -25
- package/src/advanced/swagger/swagger.ts +0 -237
- package/src/advanced/swagger/types.ts +0 -206
- package/src/advanced/swagger/zodFieldToOpenAPI.ts +0 -94
- package/src/advanced/swagger/zodSchemaToOpenAPI.ts +0 -50
- package/src/advanced/swagger/zodToOpenAPI.ts +0 -22
- package/src/advanced/testing/factory.ts +0 -509
- package/src/advanced/testing/harness.ts +0 -612
- package/src/advanced/testing/index.ts +0 -430
- package/src/advanced/testing/load-test.ts +0 -618
- package/src/advanced/testing/mock-server.ts +0 -498
- package/src/advanced/testing/mock.ts +0 -670
- package/src/cli/bin.ts +0 -9
- package/src/cli/cli.ts +0 -158
- package/src/cli/commands/add.ts +0 -178
- package/src/cli/commands/build.ts +0 -73
- package/src/cli/commands/create.ts +0 -166
- package/src/cli/commands/dev.ts +0 -85
- package/src/cli/commands/generate.ts +0 -99
- package/src/cli/commands/help.ts +0 -95
- package/src/cli/commands/init.ts +0 -91
- package/src/cli/commands/version.ts +0 -38
- package/src/cli/index.ts +0 -6
- package/src/cli/templates/generators.ts +0 -359
- package/src/cli/templates/index.ts +0 -680
- package/src/cli/utils/exec.ts +0 -52
- package/src/cli/utils/file-system.ts +0 -78
- package/src/cli/utils/logger.ts +0 -111
- package/src/core/adapter.ts +0 -88
- package/src/core/application.ts +0 -1335
- package/src/core/context-pool.ts +0 -127
- package/src/core/context.ts +0 -412
- package/src/core/index.ts +0 -80
- package/src/core/middleware.ts +0 -262
- package/src/core/performance/buffer-pool.ts +0 -108
- package/src/core/performance/middleware-optimizer.ts +0 -162
- package/src/core/plugin/PluginManager.ts +0 -435
- package/src/core/plugin/builder.ts +0 -358
- package/src/core/plugin/index.ts +0 -50
- package/src/core/plugin/types.ts +0 -214
- package/src/core/router/file-router.ts +0 -594
- package/src/core/router/index.ts +0 -227
- package/src/core/router/radix-tree.ts +0 -226
- package/src/core/store/index.ts +0 -30
- package/src/core/store/registry.ts +0 -178
- package/src/core/store/request-store.ts +0 -240
- package/src/core/store/types.ts +0 -233
- package/src/core/types.ts +0 -574
- package/src/database/adapter.ts +0 -35
- package/src/database/adapters/index.ts +0 -1
- package/src/database/adapters/mysql.ts +0 -669
- package/src/database/database.ts +0 -70
- package/src/database/dialect.ts +0 -388
- package/src/database/index.ts +0 -12
- package/src/database/migrations.ts +0 -86
- package/src/database/optimizer.ts +0 -125
- package/src/database/query-builder.ts +0 -404
- package/src/database/realtime.ts +0 -53
- package/src/database/schema.ts +0 -71
- package/src/database/transactions.ts +0 -56
- package/src/database/types.ts +0 -87
- package/src/deployment/cluster.ts +0 -471
- package/src/deployment/config.ts +0 -454
- package/src/deployment/docker.ts +0 -599
- package/src/deployment/graceful-shutdown.ts +0 -373
- package/src/deployment/index.ts +0 -56
- package/src/index.ts +0 -264
- package/src/security/adapter.ts +0 -318
- package/src/security/auth/JWTPlugin.ts +0 -234
- package/src/security/auth/JWTProvider.ts +0 -316
- package/src/security/auth/adapter.ts +0 -12
- package/src/security/auth/jwt.ts +0 -234
- package/src/security/auth/middleware.ts +0 -188
- package/src/security/csrf.ts +0 -220
- package/src/security/headers.ts +0 -108
- package/src/security/index.ts +0 -60
- package/src/security/rate-limit/adapter.ts +0 -7
- package/src/security/rate-limit/memory.ts +0 -108
- package/src/security/rate-limit/middleware.ts +0 -181
- package/src/security/sanitization.ts +0 -75
- package/src/security/types.ts +0 -240
- package/src/security/utils.ts +0 -52
- package/tsconfig.json +0 -39
|
@@ -1,680 +0,0 @@
|
|
|
1
|
-
export class ProjectTemplates {
|
|
2
|
-
constructor(private projectName: string) {}
|
|
3
|
-
|
|
4
|
-
getTemplate(type: string): Record<string, string> {
|
|
5
|
-
switch (type) {
|
|
6
|
-
case 'api':
|
|
7
|
-
return this.getApiTemplate();
|
|
8
|
-
case 'fullstack':
|
|
9
|
-
return this.getFullstackTemplate();
|
|
10
|
-
case 'basic':
|
|
11
|
-
default:
|
|
12
|
-
return this.getBasicTemplate();
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
private getBasicTemplate(): Record<string, string> {
|
|
17
|
-
return {
|
|
18
|
-
'package.json': this.getPackageJson('basic'),
|
|
19
|
-
'tsconfig.json': this.getTsConfig(),
|
|
20
|
-
'.gitignore': this.getGitIgnore(),
|
|
21
|
-
'.env.example': this.getEnvExample(),
|
|
22
|
-
'README.md': this.getReadme(),
|
|
23
|
-
'src/index.ts': this.getBasicEntry(),
|
|
24
|
-
'src/routes/index.ts': this.getBasicRoutes(),
|
|
25
|
-
};
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
private getApiTemplate(): Record<string, string> {
|
|
29
|
-
return {
|
|
30
|
-
'package.json': this.getPackageJson('api'),
|
|
31
|
-
'tsconfig.json': this.getTsConfig(),
|
|
32
|
-
'.gitignore': this.getGitIgnore(),
|
|
33
|
-
'.env.example': this.getEnvExample('api'),
|
|
34
|
-
'README.md': this.getReadme(),
|
|
35
|
-
'src/index.ts': this.getApiEntry(),
|
|
36
|
-
'src/routes/index.ts': this.getApiRoutes(),
|
|
37
|
-
'src/routes/users.ts': this.getUserRoutes(),
|
|
38
|
-
'src/middleware/auth.ts': this.getAuthMiddleware(),
|
|
39
|
-
'src/middleware/logger.ts': this.getLoggerMiddleware(),
|
|
40
|
-
'src/services/user.service.ts': this.getUserService(),
|
|
41
|
-
'src/validators/user.validator.ts': this.getUserValidator(),
|
|
42
|
-
'src/types/index.ts': this.getTypes(),
|
|
43
|
-
};
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
private getFullstackTemplate(): Record<string, string> {
|
|
47
|
-
return {
|
|
48
|
-
...this.getApiTemplate(),
|
|
49
|
-
'public/index.html': this.getPublicHtml(),
|
|
50
|
-
'public/css/style.css': this.getPublicCss(),
|
|
51
|
-
'public/js/app.js': this.getPublicJs(),
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
private getPackageJson(type: string): string {
|
|
56
|
-
const scripts: Record<string, string> = {
|
|
57
|
-
dev: 'tsx watch src/index.ts',
|
|
58
|
-
build: 'tsc',
|
|
59
|
-
start: 'node dist/index.js',
|
|
60
|
-
test: 'jest',
|
|
61
|
-
};
|
|
62
|
-
|
|
63
|
-
const dependencies: Record<string, string> = {
|
|
64
|
-
'@engjts/nexus': '^0.1.3',
|
|
65
|
-
zod: '^3.22.4',
|
|
66
|
-
ws: '^8.16.0',
|
|
67
|
-
};
|
|
68
|
-
|
|
69
|
-
const devDependencies: Record<string, string> = {
|
|
70
|
-
'@types/node': '^20.10.0',
|
|
71
|
-
'@types/ws': '^8.18.1',
|
|
72
|
-
typescript: '^5.3.3',
|
|
73
|
-
tsx: '^4.7.0',
|
|
74
|
-
};
|
|
75
|
-
|
|
76
|
-
if (type === 'api' || type === 'fullstack') {
|
|
77
|
-
devDependencies['@types/jest'] = '^29.5.11';
|
|
78
|
-
devDependencies['jest'] = '^29.7.0';
|
|
79
|
-
devDependencies['ts-jest'] = '^29.1.1';
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
return JSON.stringify(
|
|
83
|
-
{
|
|
84
|
-
name: this.projectName,
|
|
85
|
-
version: '0.1.0',
|
|
86
|
-
description: `${this.projectName} - Powered by Nexus`,
|
|
87
|
-
main: 'dist/index.js',
|
|
88
|
-
scripts,
|
|
89
|
-
keywords: ['nexus', 'api', 'typescript'],
|
|
90
|
-
author: '',
|
|
91
|
-
license: 'MIT',
|
|
92
|
-
dependencies,
|
|
93
|
-
devDependencies,
|
|
94
|
-
},
|
|
95
|
-
null,
|
|
96
|
-
2
|
|
97
|
-
);
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
private getTsConfig(): string {
|
|
101
|
-
return JSON.stringify(
|
|
102
|
-
{
|
|
103
|
-
compilerOptions: {
|
|
104
|
-
target: 'ES2022',
|
|
105
|
-
module: 'NodeNext',
|
|
106
|
-
moduleResolution: 'NodeNext',
|
|
107
|
-
lib: ['ES2022'],
|
|
108
|
-
outDir: './dist',
|
|
109
|
-
rootDir: './src',
|
|
110
|
-
strict: true,
|
|
111
|
-
esModuleInterop: true,
|
|
112
|
-
skipLibCheck: true,
|
|
113
|
-
forceConsistentCasingInFileNames: true,
|
|
114
|
-
resolveJsonModule: true,
|
|
115
|
-
declaration: true,
|
|
116
|
-
declarationMap: true,
|
|
117
|
-
sourceMap: true,
|
|
118
|
-
},
|
|
119
|
-
include: ['src/**/*'],
|
|
120
|
-
exclude: ['node_modules', 'dist'],
|
|
121
|
-
},
|
|
122
|
-
null,
|
|
123
|
-
2
|
|
124
|
-
);
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
private getGitIgnore(): string {
|
|
128
|
-
return `# Dependencies
|
|
129
|
-
node_modules/
|
|
130
|
-
|
|
131
|
-
# Build output
|
|
132
|
-
dist/
|
|
133
|
-
|
|
134
|
-
# Environment files
|
|
135
|
-
.env
|
|
136
|
-
.env.local
|
|
137
|
-
.env.*.local
|
|
138
|
-
|
|
139
|
-
# IDE
|
|
140
|
-
.vscode/
|
|
141
|
-
.idea/
|
|
142
|
-
*.swp
|
|
143
|
-
*.swo
|
|
144
|
-
|
|
145
|
-
# OS
|
|
146
|
-
.DS_Store
|
|
147
|
-
Thumbs.db
|
|
148
|
-
|
|
149
|
-
# Logs
|
|
150
|
-
logs/
|
|
151
|
-
*.log
|
|
152
|
-
npm-debug.log*
|
|
153
|
-
yarn-debug.log*
|
|
154
|
-
yarn-error.log*
|
|
155
|
-
|
|
156
|
-
# Test coverage
|
|
157
|
-
coverage/
|
|
158
|
-
|
|
159
|
-
# Misc
|
|
160
|
-
*.tsbuildinfo
|
|
161
|
-
`;
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
private getEnvExample(type = 'basic'): string {
|
|
165
|
-
let env = `# Server
|
|
166
|
-
PORT=3000
|
|
167
|
-
HOST=localhost
|
|
168
|
-
NODE_ENV=development
|
|
169
|
-
`;
|
|
170
|
-
|
|
171
|
-
if (type === 'api') {
|
|
172
|
-
env += `
|
|
173
|
-
# Database
|
|
174
|
-
DATABASE_URL=mysql://user:password@localhost:3306/dbname
|
|
175
|
-
|
|
176
|
-
# JWT
|
|
177
|
-
JWT_SECRET=your-super-secret-jwt-key
|
|
178
|
-
JWT_EXPIRES_IN=7d
|
|
179
|
-
|
|
180
|
-
# Rate Limiting
|
|
181
|
-
RATE_LIMIT_MAX=100
|
|
182
|
-
RATE_LIMIT_WINDOW_MS=60000
|
|
183
|
-
`;
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
return env;
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
private getReadme(): string {
|
|
190
|
-
return `# ${this.projectName}
|
|
191
|
-
|
|
192
|
-
A web application built with [Nexus](https://github.com/engjts/nexus) - Async-First Web Framework.
|
|
193
|
-
|
|
194
|
-
## Getting Started
|
|
195
|
-
|
|
196
|
-
### Prerequisites
|
|
197
|
-
|
|
198
|
-
- Node.js 18+
|
|
199
|
-
- npm/yarn/pnpm
|
|
200
|
-
|
|
201
|
-
### Installation
|
|
202
|
-
|
|
203
|
-
\`\`\`bash
|
|
204
|
-
npm install
|
|
205
|
-
\`\`\`
|
|
206
|
-
|
|
207
|
-
### Development
|
|
208
|
-
|
|
209
|
-
\`\`\`bash
|
|
210
|
-
npm run dev
|
|
211
|
-
\`\`\`
|
|
212
|
-
|
|
213
|
-
### Build
|
|
214
|
-
|
|
215
|
-
\`\`\`bash
|
|
216
|
-
npm run build
|
|
217
|
-
\`\`\`
|
|
218
|
-
|
|
219
|
-
### Production
|
|
220
|
-
|
|
221
|
-
\`\`\`bash
|
|
222
|
-
npm start
|
|
223
|
-
\`\`\`
|
|
224
|
-
|
|
225
|
-
## Project Structure
|
|
226
|
-
|
|
227
|
-
\`\`\`
|
|
228
|
-
src/
|
|
229
|
-
├── index.ts # Application entry point
|
|
230
|
-
├── routes/ # Route handlers
|
|
231
|
-
├── middleware/ # Custom middleware
|
|
232
|
-
├── services/ # Business logic
|
|
233
|
-
├── validators/ # Request validation
|
|
234
|
-
└── types/ # TypeScript types
|
|
235
|
-
\`\`\`
|
|
236
|
-
|
|
237
|
-
## Features
|
|
238
|
-
|
|
239
|
-
- ⚡ Async-first design
|
|
240
|
-
- 🔒 Built-in security
|
|
241
|
-
- 📝 Type-safe with TypeScript
|
|
242
|
-
- 🚀 High performance
|
|
243
|
-
- 🧩 Modular architecture
|
|
244
|
-
|
|
245
|
-
## License
|
|
246
|
-
|
|
247
|
-
MIT
|
|
248
|
-
`;
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
private getBasicEntry(): string {
|
|
252
|
-
return `import { Nexus } from '@engjts/nexus';
|
|
253
|
-
import { routes } from './routes';
|
|
254
|
-
|
|
255
|
-
const app = new Nexus();
|
|
256
|
-
|
|
257
|
-
// Register routes
|
|
258
|
-
app.use(routes);
|
|
259
|
-
|
|
260
|
-
// Start server
|
|
261
|
-
const PORT = process.env.PORT || 3000;
|
|
262
|
-
|
|
263
|
-
app.listen(PORT, () => {
|
|
264
|
-
console.log(\`🚀 Server running at http://localhost:\${PORT}\`);
|
|
265
|
-
});
|
|
266
|
-
`;
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
private getBasicRoutes(): string {
|
|
270
|
-
return `import { Router } from '@engjts/nexus';
|
|
271
|
-
|
|
272
|
-
export const routes = new Router();
|
|
273
|
-
|
|
274
|
-
routes.get('/', async () => {
|
|
275
|
-
return {
|
|
276
|
-
message: 'Welcome to Nexus!',
|
|
277
|
-
version: '1.0.0',
|
|
278
|
-
};
|
|
279
|
-
});
|
|
280
|
-
|
|
281
|
-
routes.get('/health', async () => {
|
|
282
|
-
return {
|
|
283
|
-
status: 'ok',
|
|
284
|
-
timestamp: new Date().toISOString(),
|
|
285
|
-
};
|
|
286
|
-
});
|
|
287
|
-
`;
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
private getApiEntry(): string {
|
|
291
|
-
return `import { Nexus, errorHandler } from '@engjts/nexus';
|
|
292
|
-
import { routes } from './routes';
|
|
293
|
-
import { loggerMiddleware } from './middleware/logger';
|
|
294
|
-
|
|
295
|
-
const app = new Nexus();
|
|
296
|
-
|
|
297
|
-
// Global middleware
|
|
298
|
-
app.use(loggerMiddleware);
|
|
299
|
-
|
|
300
|
-
// Register routes
|
|
301
|
-
app.use(routes);
|
|
302
|
-
|
|
303
|
-
// Error handling
|
|
304
|
-
app.use(errorHandler);
|
|
305
|
-
|
|
306
|
-
// Start server
|
|
307
|
-
const PORT = process.env.PORT || 3000;
|
|
308
|
-
|
|
309
|
-
app.listen(PORT, () => {
|
|
310
|
-
console.log(\`🚀 API Server running at http://localhost:\${PORT}\`);
|
|
311
|
-
console.log(\`📚 Environment: \${process.env.NODE_ENV || 'development'}\`);
|
|
312
|
-
});
|
|
313
|
-
`;
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
private getApiRoutes(): string {
|
|
317
|
-
return `import { Router } from '@engjts/nexus';
|
|
318
|
-
import { userRoutes } from './users';
|
|
319
|
-
|
|
320
|
-
export const routes = new Router();
|
|
321
|
-
|
|
322
|
-
// Health check
|
|
323
|
-
routes.get('/health', async () => {
|
|
324
|
-
return {
|
|
325
|
-
status: 'ok',
|
|
326
|
-
timestamp: new Date().toISOString(),
|
|
327
|
-
uptime: process.uptime(),
|
|
328
|
-
};
|
|
329
|
-
});
|
|
330
|
-
|
|
331
|
-
// API info
|
|
332
|
-
routes.get('/api', async () => {
|
|
333
|
-
return {
|
|
334
|
-
name: 'API',
|
|
335
|
-
version: '1.0.0',
|
|
336
|
-
endpoints: ['/api/users', '/health'],
|
|
337
|
-
};
|
|
338
|
-
});
|
|
339
|
-
|
|
340
|
-
// Mount user routes
|
|
341
|
-
routes.group('/api/users', userRoutes);
|
|
342
|
-
`;
|
|
343
|
-
}
|
|
344
|
-
|
|
345
|
-
private getUserRoutes(): string {
|
|
346
|
-
return `import { Router, HttpError } from '@engjts/nexus';
|
|
347
|
-
import { UserService } from '../services/user.service';
|
|
348
|
-
import { createUserSchema, updateUserSchema } from '../validators/user.validator';
|
|
349
|
-
|
|
350
|
-
export const userRoutes = new Router();
|
|
351
|
-
const userService = new UserService();
|
|
352
|
-
|
|
353
|
-
// GET /api/users
|
|
354
|
-
userRoutes.get('/', async () => {
|
|
355
|
-
const users = await userService.findAll();
|
|
356
|
-
return { users };
|
|
357
|
-
});
|
|
358
|
-
|
|
359
|
-
// GET /api/users/:id
|
|
360
|
-
userRoutes.get('/:id', async (ctx) => {
|
|
361
|
-
const { id } = ctx.params;
|
|
362
|
-
const user = await userService.findById(id);
|
|
363
|
-
|
|
364
|
-
if (!user) {
|
|
365
|
-
throw new HttpError(404, 'User not found');
|
|
366
|
-
}
|
|
367
|
-
|
|
368
|
-
return { user };
|
|
369
|
-
});
|
|
370
|
-
|
|
371
|
-
// POST /api/users
|
|
372
|
-
userRoutes.post('/', async (ctx) => {
|
|
373
|
-
const body = await ctx.body();
|
|
374
|
-
const validated = createUserSchema.parse(body);
|
|
375
|
-
|
|
376
|
-
const user = await userService.create(validated);
|
|
377
|
-
return { status: 201, data: { user } };
|
|
378
|
-
});
|
|
379
|
-
|
|
380
|
-
// PUT /api/users/:id
|
|
381
|
-
userRoutes.put('/:id', async (ctx) => {
|
|
382
|
-
const { id } = ctx.params;
|
|
383
|
-
const body = await ctx.body();
|
|
384
|
-
const validated = updateUserSchema.parse(body);
|
|
385
|
-
|
|
386
|
-
const user = await userService.update(id, validated);
|
|
387
|
-
|
|
388
|
-
if (!user) {
|
|
389
|
-
throw new HttpError(404, 'User not found');
|
|
390
|
-
}
|
|
391
|
-
|
|
392
|
-
return { user };
|
|
393
|
-
});
|
|
394
|
-
|
|
395
|
-
// DELETE /api/users/:id
|
|
396
|
-
userRoutes.delete('/:id', async (ctx) => {
|
|
397
|
-
const { id } = ctx.params;
|
|
398
|
-
const deleted = await userService.delete(id);
|
|
399
|
-
|
|
400
|
-
if (!deleted) {
|
|
401
|
-
throw new HttpError(404, 'User not found');
|
|
402
|
-
}
|
|
403
|
-
|
|
404
|
-
return { message: 'User deleted successfully' };
|
|
405
|
-
});
|
|
406
|
-
`;
|
|
407
|
-
}
|
|
408
|
-
|
|
409
|
-
private getAuthMiddleware(): string {
|
|
410
|
-
return `import { Middleware, Context, HttpError } from '@engjts/nexus';
|
|
411
|
-
|
|
412
|
-
export const authMiddleware: Middleware = async (ctx: Context, next) => {
|
|
413
|
-
const authHeader = ctx.headers.get('authorization');
|
|
414
|
-
|
|
415
|
-
if (!authHeader || !authHeader.startsWith('Bearer ')) {
|
|
416
|
-
throw new HttpError(401, 'Unauthorized');
|
|
417
|
-
}
|
|
418
|
-
|
|
419
|
-
const token = authHeader.slice(7);
|
|
420
|
-
|
|
421
|
-
try {
|
|
422
|
-
// TODO: Verify JWT token
|
|
423
|
-
// const payload = await verifyToken(token);
|
|
424
|
-
// ctx.set('user', payload);
|
|
425
|
-
|
|
426
|
-
return next();
|
|
427
|
-
} catch (error) {
|
|
428
|
-
throw new HttpError(401, 'Invalid token');
|
|
429
|
-
}
|
|
430
|
-
};
|
|
431
|
-
`;
|
|
432
|
-
}
|
|
433
|
-
|
|
434
|
-
private getLoggerMiddleware(): string {
|
|
435
|
-
return `import { Middleware, Context } from '@engjts/nexus';
|
|
436
|
-
|
|
437
|
-
export const loggerMiddleware: Middleware = async (ctx: Context, next) => {
|
|
438
|
-
const start = Date.now();
|
|
439
|
-
const { method, path } = ctx;
|
|
440
|
-
|
|
441
|
-
console.log(\`→ \${method} \${path}\`);
|
|
442
|
-
|
|
443
|
-
const response = await next();
|
|
444
|
-
|
|
445
|
-
const duration = Date.now() - start;
|
|
446
|
-
console.log(\`← \${method} \${path} \${duration}ms\`);
|
|
447
|
-
|
|
448
|
-
return response;
|
|
449
|
-
};
|
|
450
|
-
`;
|
|
451
|
-
}
|
|
452
|
-
|
|
453
|
-
private getUserService(): string {
|
|
454
|
-
return `import { User, CreateUserDto, UpdateUserDto } from '../types';
|
|
455
|
-
|
|
456
|
-
// In-memory storage for demo purposes
|
|
457
|
-
const users: Map<string, User> = new Map();
|
|
458
|
-
let idCounter = 1;
|
|
459
|
-
|
|
460
|
-
export class UserService {
|
|
461
|
-
async findAll(): Promise<User[]> {
|
|
462
|
-
return Array.from(users.values());
|
|
463
|
-
}
|
|
464
|
-
|
|
465
|
-
async findById(id: string): Promise<User | null> {
|
|
466
|
-
return users.get(id) || null;
|
|
467
|
-
}
|
|
468
|
-
|
|
469
|
-
async create(data: CreateUserDto): Promise<User> {
|
|
470
|
-
const id = String(idCounter++);
|
|
471
|
-
const user: User = {
|
|
472
|
-
id,
|
|
473
|
-
...data,
|
|
474
|
-
createdAt: new Date(),
|
|
475
|
-
updatedAt: new Date(),
|
|
476
|
-
};
|
|
477
|
-
|
|
478
|
-
users.set(id, user);
|
|
479
|
-
return user;
|
|
480
|
-
}
|
|
481
|
-
|
|
482
|
-
async update(id: string, data: UpdateUserDto): Promise<User | null> {
|
|
483
|
-
const user = users.get(id);
|
|
484
|
-
|
|
485
|
-
if (!user) {
|
|
486
|
-
return null;
|
|
487
|
-
}
|
|
488
|
-
|
|
489
|
-
const updatedUser: User = {
|
|
490
|
-
...user,
|
|
491
|
-
...data,
|
|
492
|
-
updatedAt: new Date(),
|
|
493
|
-
};
|
|
494
|
-
|
|
495
|
-
users.set(id, updatedUser);
|
|
496
|
-
return updatedUser;
|
|
497
|
-
}
|
|
498
|
-
|
|
499
|
-
async delete(id: string): Promise<boolean> {
|
|
500
|
-
return users.delete(id);
|
|
501
|
-
}
|
|
502
|
-
}
|
|
503
|
-
`;
|
|
504
|
-
}
|
|
505
|
-
|
|
506
|
-
private getUserValidator(): string {
|
|
507
|
-
return `import { z } from 'zod';
|
|
508
|
-
|
|
509
|
-
export const createUserSchema = z.object({
|
|
510
|
-
name: z.string().min(2).max(100),
|
|
511
|
-
email: z.string().email(),
|
|
512
|
-
password: z.string().min(8),
|
|
513
|
-
});
|
|
514
|
-
|
|
515
|
-
export const updateUserSchema = z.object({
|
|
516
|
-
name: z.string().min(2).max(100).optional(),
|
|
517
|
-
email: z.string().email().optional(),
|
|
518
|
-
});
|
|
519
|
-
|
|
520
|
-
export type CreateUserInput = z.infer<typeof createUserSchema>;
|
|
521
|
-
export type UpdateUserInput = z.infer<typeof updateUserSchema>;
|
|
522
|
-
`;
|
|
523
|
-
}
|
|
524
|
-
|
|
525
|
-
private getTypes(): string {
|
|
526
|
-
return `export interface User {
|
|
527
|
-
id: string;
|
|
528
|
-
name: string;
|
|
529
|
-
email: string;
|
|
530
|
-
createdAt: Date;
|
|
531
|
-
updatedAt: Date;
|
|
532
|
-
}
|
|
533
|
-
|
|
534
|
-
export interface CreateUserDto {
|
|
535
|
-
name: string;
|
|
536
|
-
email: string;
|
|
537
|
-
password: string;
|
|
538
|
-
}
|
|
539
|
-
|
|
540
|
-
export interface UpdateUserDto {
|
|
541
|
-
name?: string;
|
|
542
|
-
email?: string;
|
|
543
|
-
}
|
|
544
|
-
|
|
545
|
-
export interface ApiResponse<T> {
|
|
546
|
-
data?: T;
|
|
547
|
-
error?: string;
|
|
548
|
-
message?: string;
|
|
549
|
-
}
|
|
550
|
-
`;
|
|
551
|
-
}
|
|
552
|
-
|
|
553
|
-
private getPublicHtml(): string {
|
|
554
|
-
return `<!DOCTYPE html>
|
|
555
|
-
<html lang="en">
|
|
556
|
-
<head>
|
|
557
|
-
<meta charset="UTF-8">
|
|
558
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
559
|
-
<title>${this.projectName}</title>
|
|
560
|
-
<link rel="stylesheet" href="/css/style.css">
|
|
561
|
-
</head>
|
|
562
|
-
<body>
|
|
563
|
-
<div id="app">
|
|
564
|
-
<header>
|
|
565
|
-
<h1>${this.projectName}</h1>
|
|
566
|
-
<p>Powered by Nexus Framework</p>
|
|
567
|
-
</header>
|
|
568
|
-
|
|
569
|
-
<main>
|
|
570
|
-
<section class="hero">
|
|
571
|
-
<h2>Welcome to your new project!</h2>
|
|
572
|
-
<p>Start building amazing things.</p>
|
|
573
|
-
</section>
|
|
574
|
-
</main>
|
|
575
|
-
|
|
576
|
-
<footer>
|
|
577
|
-
<p>© ${new Date().getFullYear()} ${this.projectName}</p>
|
|
578
|
-
</footer>
|
|
579
|
-
</div>
|
|
580
|
-
|
|
581
|
-
<script src="/js/app.js"></script>
|
|
582
|
-
</body>
|
|
583
|
-
</html>
|
|
584
|
-
`;
|
|
585
|
-
}
|
|
586
|
-
|
|
587
|
-
private getPublicCss(): string {
|
|
588
|
-
return `* {
|
|
589
|
-
margin: 0;
|
|
590
|
-
padding: 0;
|
|
591
|
-
box-sizing: border-box;
|
|
592
|
-
}
|
|
593
|
-
|
|
594
|
-
:root {
|
|
595
|
-
--primary: #3b82f6;
|
|
596
|
-
--primary-dark: #2563eb;
|
|
597
|
-
--text: #1f2937;
|
|
598
|
-
--text-light: #6b7280;
|
|
599
|
-
--bg: #ffffff;
|
|
600
|
-
--bg-alt: #f9fafb;
|
|
601
|
-
}
|
|
602
|
-
|
|
603
|
-
body {
|
|
604
|
-
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;
|
|
605
|
-
line-height: 1.6;
|
|
606
|
-
color: var(--text);
|
|
607
|
-
background: var(--bg);
|
|
608
|
-
}
|
|
609
|
-
|
|
610
|
-
#app {
|
|
611
|
-
min-height: 100vh;
|
|
612
|
-
display: flex;
|
|
613
|
-
flex-direction: column;
|
|
614
|
-
}
|
|
615
|
-
|
|
616
|
-
header {
|
|
617
|
-
background: var(--primary);
|
|
618
|
-
color: white;
|
|
619
|
-
padding: 2rem;
|
|
620
|
-
text-align: center;
|
|
621
|
-
}
|
|
622
|
-
|
|
623
|
-
header h1 {
|
|
624
|
-
font-size: 2rem;
|
|
625
|
-
margin-bottom: 0.5rem;
|
|
626
|
-
}
|
|
627
|
-
|
|
628
|
-
header p {
|
|
629
|
-
opacity: 0.9;
|
|
630
|
-
}
|
|
631
|
-
|
|
632
|
-
main {
|
|
633
|
-
flex: 1;
|
|
634
|
-
padding: 2rem;
|
|
635
|
-
max-width: 1200px;
|
|
636
|
-
margin: 0 auto;
|
|
637
|
-
width: 100%;
|
|
638
|
-
}
|
|
639
|
-
|
|
640
|
-
.hero {
|
|
641
|
-
text-align: center;
|
|
642
|
-
padding: 4rem 2rem;
|
|
643
|
-
background: var(--bg-alt);
|
|
644
|
-
border-radius: 8px;
|
|
645
|
-
margin-top: 2rem;
|
|
646
|
-
}
|
|
647
|
-
|
|
648
|
-
.hero h2 {
|
|
649
|
-
font-size: 2.5rem;
|
|
650
|
-
margin-bottom: 1rem;
|
|
651
|
-
color: var(--primary);
|
|
652
|
-
}
|
|
653
|
-
|
|
654
|
-
footer {
|
|
655
|
-
background: var(--bg-alt);
|
|
656
|
-
padding: 1.5rem;
|
|
657
|
-
text-align: center;
|
|
658
|
-
color: var(--text-light);
|
|
659
|
-
}
|
|
660
|
-
`;
|
|
661
|
-
}
|
|
662
|
-
|
|
663
|
-
private getPublicJs(): string {
|
|
664
|
-
return `// App initialization
|
|
665
|
-
document.addEventListener('DOMContentLoaded', () => {
|
|
666
|
-
console.log('${this.projectName} initialized!');
|
|
667
|
-
|
|
668
|
-
// Fetch API health
|
|
669
|
-
fetch('/health')
|
|
670
|
-
.then(res => res.json())
|
|
671
|
-
.then(data => {
|
|
672
|
-
console.log('API Status:', data);
|
|
673
|
-
})
|
|
674
|
-
.catch(err => {
|
|
675
|
-
console.error('API Error:', err);
|
|
676
|
-
});
|
|
677
|
-
});
|
|
678
|
-
`;
|
|
679
|
-
}
|
|
680
|
-
}
|
package/src/cli/utils/exec.ts
DELETED
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
import { exec, spawn } from 'child_process';
|
|
2
|
-
import { promisify } from 'util';
|
|
3
|
-
|
|
4
|
-
const execAsync = promisify(exec);
|
|
5
|
-
|
|
6
|
-
export interface ExecResult {
|
|
7
|
-
stdout: string;
|
|
8
|
-
stderr: string;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export async function executeCommand(
|
|
12
|
-
command: string,
|
|
13
|
-
cwd?: string
|
|
14
|
-
): Promise<ExecResult> {
|
|
15
|
-
return execAsync(command, { cwd });
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export function spawnCommand(
|
|
19
|
-
command: string,
|
|
20
|
-
args: string[],
|
|
21
|
-
options: {
|
|
22
|
-
cwd?: string;
|
|
23
|
-
stdio?: 'inherit' | 'pipe';
|
|
24
|
-
env?: NodeJS.ProcessEnv;
|
|
25
|
-
} = {}
|
|
26
|
-
): Promise<number> {
|
|
27
|
-
return new Promise((resolve, reject) => {
|
|
28
|
-
const proc = spawn(command, args, {
|
|
29
|
-
cwd: options.cwd,
|
|
30
|
-
stdio: options.stdio || 'inherit',
|
|
31
|
-
env: { ...process.env, ...options.env },
|
|
32
|
-
shell: true,
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
proc.on('close', (code) => {
|
|
36
|
-
resolve(code || 0);
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
proc.on('error', (error) => {
|
|
40
|
-
reject(error);
|
|
41
|
-
});
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
export async function checkCommandExists(command: string): Promise<boolean> {
|
|
46
|
-
try {
|
|
47
|
-
await execAsync(`which ${command}`);
|
|
48
|
-
return true;
|
|
49
|
-
} catch {
|
|
50
|
-
return false;
|
|
51
|
-
}
|
|
52
|
-
}
|