@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,240 +0,0 @@
|
|
|
1
|
-
# Getting Started with Nexus Framework
|
|
2
|
-
|
|
3
|
-
## Installation
|
|
4
|
-
|
|
5
|
-
### Prerequisites
|
|
6
|
-
|
|
7
|
-
- Node.js >= 18.0.0
|
|
8
|
-
- TypeScript >= 5.0.0
|
|
9
|
-
|
|
10
|
-
### Setup
|
|
11
|
-
|
|
12
|
-
1. **Clone or initialize your project**
|
|
13
|
-
|
|
14
|
-
```bash
|
|
15
|
-
mkdir my-nexus-app
|
|
16
|
-
cd my-nexus-app
|
|
17
|
-
npm init -y
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
2. **Install dependencies**
|
|
21
|
-
|
|
22
|
-
```bash
|
|
23
|
-
npm install typescript @types/node zod
|
|
24
|
-
npm install -D ts-node
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
3. **Configure TypeScript**
|
|
28
|
-
|
|
29
|
-
Create `tsconfig.json`:
|
|
30
|
-
|
|
31
|
-
```json
|
|
32
|
-
{
|
|
33
|
-
"compilerOptions": {
|
|
34
|
-
"target": "ES2022",
|
|
35
|
-
"module": "commonjs",
|
|
36
|
-
"strict": true,
|
|
37
|
-
"esModuleInterop": true,
|
|
38
|
-
"skipLibCheck": true,
|
|
39
|
-
"outDir": "./dist"
|
|
40
|
-
},
|
|
41
|
-
"include": ["src/**/*"]
|
|
42
|
-
}
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
## Your First Application
|
|
46
|
-
|
|
47
|
-
### Basic Server
|
|
48
|
-
|
|
49
|
-
Create `src/index.ts`:
|
|
50
|
-
|
|
51
|
-
```typescript
|
|
52
|
-
import { createApp } from './nexus';
|
|
53
|
-
|
|
54
|
-
const app = createApp();
|
|
55
|
-
|
|
56
|
-
app.get('/hello', async (ctx) => {
|
|
57
|
-
return { message: 'Hello, Nexus!' };
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
app.listen(3000, () => {
|
|
61
|
-
console.log('Server running on http://localhost:3000');
|
|
62
|
-
});
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
### Run the Application
|
|
66
|
-
|
|
67
|
-
```bash
|
|
68
|
-
npx ts-node src/index.ts
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
Visit `http://localhost:3000/hello` to see your first response!
|
|
72
|
-
|
|
73
|
-
## Core Concepts
|
|
74
|
-
|
|
75
|
-
### 1. Unified Context
|
|
76
|
-
|
|
77
|
-
Unlike Express.js which uses separate `req` and `res` objects, Nexus uses a single **Context** object:
|
|
78
|
-
|
|
79
|
-
```typescript
|
|
80
|
-
app.get('/user', async (ctx) => {
|
|
81
|
-
// Access request data
|
|
82
|
-
const userId = ctx.query.id;
|
|
83
|
-
const token = ctx.headers.authorization;
|
|
84
|
-
|
|
85
|
-
// Return response (auto-converted to JSON)
|
|
86
|
-
return { userId, authenticated: !!token };
|
|
87
|
-
});
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
### 2. Async-First
|
|
91
|
-
|
|
92
|
-
All handlers are async functions with **automatic error handling**:
|
|
93
|
-
|
|
94
|
-
```typescript
|
|
95
|
-
app.get('/user/:id', async (ctx) => {
|
|
96
|
-
// Errors are automatically caught
|
|
97
|
-
const user = await database.getUser(ctx.params.id);
|
|
98
|
-
return { user };
|
|
99
|
-
});
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
No need for try-catch or `next(error)` calls!
|
|
103
|
-
|
|
104
|
-
### 3. Type Safety
|
|
105
|
-
|
|
106
|
-
Full TypeScript support with **type inference**:
|
|
107
|
-
|
|
108
|
-
```typescript
|
|
109
|
-
import { z } from 'zod';
|
|
110
|
-
|
|
111
|
-
app.post('/users', {
|
|
112
|
-
schema: {
|
|
113
|
-
body: z.object({
|
|
114
|
-
name: z.string(),
|
|
115
|
-
email: z.string().email()
|
|
116
|
-
})
|
|
117
|
-
},
|
|
118
|
-
handler: async (ctx) => {
|
|
119
|
-
// ctx.body is typed as { name: string, email: string }
|
|
120
|
-
const user = await createUser(ctx.body);
|
|
121
|
-
return { user };
|
|
122
|
-
}
|
|
123
|
-
});
|
|
124
|
-
```
|
|
125
|
-
|
|
126
|
-
## HTTP Methods
|
|
127
|
-
|
|
128
|
-
Nexus supports all standard HTTP methods:
|
|
129
|
-
|
|
130
|
-
```typescript
|
|
131
|
-
app.get('/resource', async (ctx) => { /* ... */ });
|
|
132
|
-
app.post('/resource', async (ctx) => { /* ... */ });
|
|
133
|
-
app.put('/resource/:id', async (ctx) => { /* ... */ });
|
|
134
|
-
app.patch('/resource/:id', async (ctx) => { /* ... */ });
|
|
135
|
-
app.delete('/resource/:id', async (ctx) => { /* ... */ });
|
|
136
|
-
```
|
|
137
|
-
|
|
138
|
-
## Response Types
|
|
139
|
-
|
|
140
|
-
### JSON (Default)
|
|
141
|
-
|
|
142
|
-
```typescript
|
|
143
|
-
app.get('/data', async (ctx) => {
|
|
144
|
-
return { key: 'value' }; // Auto-serialized to JSON
|
|
145
|
-
});
|
|
146
|
-
```
|
|
147
|
-
|
|
148
|
-
### HTML
|
|
149
|
-
|
|
150
|
-
```typescript
|
|
151
|
-
app.get('/page', async (ctx) => {
|
|
152
|
-
return ctx.html('<h1>Welcome</h1>');
|
|
153
|
-
});
|
|
154
|
-
```
|
|
155
|
-
|
|
156
|
-
### Text
|
|
157
|
-
|
|
158
|
-
```typescript
|
|
159
|
-
app.get('/text', async (ctx) => {
|
|
160
|
-
return ctx.text('Plain text response');
|
|
161
|
-
});
|
|
162
|
-
```
|
|
163
|
-
|
|
164
|
-
### Redirect
|
|
165
|
-
|
|
166
|
-
```typescript
|
|
167
|
-
app.get('/old', async (ctx) => {
|
|
168
|
-
return ctx.redirect('/new', 301);
|
|
169
|
-
});
|
|
170
|
-
```
|
|
171
|
-
|
|
172
|
-
### Stream
|
|
173
|
-
|
|
174
|
-
```typescript
|
|
175
|
-
import { createReadStream } from 'fs';
|
|
176
|
-
|
|
177
|
-
app.get('/file', async (ctx) => {
|
|
178
|
-
const stream = createReadStream('./large-file.dat');
|
|
179
|
-
return ctx.stream(stream);
|
|
180
|
-
});
|
|
181
|
-
```
|
|
182
|
-
|
|
183
|
-
## Project Structure
|
|
184
|
-
|
|
185
|
-
Recommended structure for your application:
|
|
186
|
-
|
|
187
|
-
```
|
|
188
|
-
my-app/
|
|
189
|
-
├── src/
|
|
190
|
-
│ ├── index.ts # Application entry point
|
|
191
|
-
│ ├── routes/ # Route handlers
|
|
192
|
-
│ │ ├── users.ts
|
|
193
|
-
│ │ └── posts.ts
|
|
194
|
-
│ ├── middleware/ # Custom middleware
|
|
195
|
-
│ │ └── auth.ts
|
|
196
|
-
│ └── config/ # Configuration
|
|
197
|
-
│ └── app.ts
|
|
198
|
-
├── package.json
|
|
199
|
-
└── tsconfig.json
|
|
200
|
-
```
|
|
201
|
-
|
|
202
|
-
## Next Steps
|
|
203
|
-
|
|
204
|
-
- 📖 [Context Documentation](./02-context.md) - Learn about the Context API
|
|
205
|
-
- 🛤️ [Routing Guide](./03-routing.md) - Advanced routing patterns
|
|
206
|
-
- 🔌 [Middleware System](./04-middleware.md) - Create custom middleware
|
|
207
|
-
- ✅ [Validation](./05-validation.md) - Schema validation with Zod
|
|
208
|
-
- ⚡ [Performance](./07-performance.md) - Optimization features
|
|
209
|
-
|
|
210
|
-
## Quick Reference
|
|
211
|
-
|
|
212
|
-
```typescript
|
|
213
|
-
import { createApp, z, logger, cors } from './nexus';
|
|
214
|
-
|
|
215
|
-
const app = createApp({
|
|
216
|
-
debug: true,
|
|
217
|
-
contextPoolSize: 100
|
|
218
|
-
});
|
|
219
|
-
|
|
220
|
-
// Global middleware
|
|
221
|
-
app.use(logger());
|
|
222
|
-
app.use(cors());
|
|
223
|
-
|
|
224
|
-
// Routes
|
|
225
|
-
app.get('/path', handler);
|
|
226
|
-
app.post('/path', { schema, handler });
|
|
227
|
-
app.route({ method, path, handler, middlewares, schema });
|
|
228
|
-
|
|
229
|
-
// Error handling
|
|
230
|
-
app.onError((error, ctx) => {
|
|
231
|
-
return { statusCode: 500, body: 'Error' };
|
|
232
|
-
});
|
|
233
|
-
|
|
234
|
-
// Start server
|
|
235
|
-
app.listen(3000);
|
|
236
|
-
```
|
|
237
|
-
|
|
238
|
-
---
|
|
239
|
-
|
|
240
|
-
**Need help?** Check the [API Reference](./09-api-reference.md) for detailed documentation.
|
|
@@ -1,335 +0,0 @@
|
|
|
1
|
-
# Context API
|
|
2
|
-
|
|
3
|
-
## Overview
|
|
4
|
-
|
|
5
|
-
The **Context** is the heart of Nexus Framework. It replaces the traditional `req` and `res` pattern with a single, unified, immutable object that contains all request and response data.
|
|
6
|
-
|
|
7
|
-
## Why Context?
|
|
8
|
-
|
|
9
|
-
### Traditional Express.js
|
|
10
|
-
```javascript
|
|
11
|
-
app.get('/user/:id', (req, res) => {
|
|
12
|
-
const id = req.params.id;
|
|
13
|
-
const user = getUser(id);
|
|
14
|
-
res.json({ user });
|
|
15
|
-
});
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
### Nexus Framework
|
|
19
|
-
```typescript
|
|
20
|
-
app.get('/user/:id', async (ctx) => {
|
|
21
|
-
const user = await getUser(ctx.params.id);
|
|
22
|
-
return { user }; // Auto-converted to JSON
|
|
23
|
-
});
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
**Benefits:**
|
|
27
|
-
- ✅ Single source of truth
|
|
28
|
-
- ✅ Immutability enables better testing
|
|
29
|
-
- ✅ Type inference works naturally
|
|
30
|
-
- ✅ Easier to extend with custom properties
|
|
31
|
-
|
|
32
|
-
## Context Properties
|
|
33
|
-
|
|
34
|
-
### Request Data
|
|
35
|
-
|
|
36
|
-
#### `ctx.method`
|
|
37
|
-
HTTP method of the request.
|
|
38
|
-
|
|
39
|
-
```typescript
|
|
40
|
-
app.get('/info', async (ctx) => {
|
|
41
|
-
return { method: ctx.method }; // "GET"
|
|
42
|
-
});
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
#### `ctx.path`
|
|
46
|
-
Path of the request (without query string).
|
|
47
|
-
|
|
48
|
-
```typescript
|
|
49
|
-
app.get('/api/users', async (ctx) => {
|
|
50
|
-
return { path: ctx.path }; // "/api/users"
|
|
51
|
-
});
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
#### `ctx.url`
|
|
55
|
-
Full URL object.
|
|
56
|
-
|
|
57
|
-
```typescript
|
|
58
|
-
app.get('/info', async (ctx) => {
|
|
59
|
-
return {
|
|
60
|
-
host: ctx.url.host,
|
|
61
|
-
protocol: ctx.url.protocol
|
|
62
|
-
};
|
|
63
|
-
});
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
#### `ctx.params`
|
|
67
|
-
Route parameters extracted from the path.
|
|
68
|
-
|
|
69
|
-
```typescript
|
|
70
|
-
app.get('/users/:id/posts/:postId', async (ctx) => {
|
|
71
|
-
const { id, postId } = ctx.params;
|
|
72
|
-
return { userId: id, postId };
|
|
73
|
-
});
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
#### `ctx.query`
|
|
77
|
-
Query string parameters.
|
|
78
|
-
|
|
79
|
-
```typescript
|
|
80
|
-
// GET /search?q=nexus&limit=10
|
|
81
|
-
app.get('/search', async (ctx) => {
|
|
82
|
-
const { q, limit } = ctx.query;
|
|
83
|
-
return { query: q, limit: parseInt(limit) };
|
|
84
|
-
});
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
#### `ctx.body`
|
|
88
|
-
Parsed request body (POST, PUT, PATCH).
|
|
89
|
-
|
|
90
|
-
```typescript
|
|
91
|
-
app.post('/users', async (ctx) => {
|
|
92
|
-
const { name, email } = ctx.body;
|
|
93
|
-
return { received: { name, email } };
|
|
94
|
-
});
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
**Automatic parsing for:**
|
|
98
|
-
- `application/json`
|
|
99
|
-
- `application/x-www-form-urlencoded`
|
|
100
|
-
- `text/*`
|
|
101
|
-
|
|
102
|
-
#### `ctx.headers`
|
|
103
|
-
Request headers.
|
|
104
|
-
|
|
105
|
-
```typescript
|
|
106
|
-
app.get('/auth', async (ctx) => {
|
|
107
|
-
const token = ctx.headers.authorization;
|
|
108
|
-
const userAgent = ctx.headers['user-agent'];
|
|
109
|
-
return { token, userAgent };
|
|
110
|
-
});
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
#### `ctx.cookies`
|
|
114
|
-
Cookie management.
|
|
115
|
-
|
|
116
|
-
```typescript
|
|
117
|
-
app.get('/profile', async (ctx) => {
|
|
118
|
-
// Get cookie
|
|
119
|
-
const sessionId = ctx.cookies.get('session');
|
|
120
|
-
|
|
121
|
-
// Set cookie
|
|
122
|
-
ctx.cookies.set('visited', 'true', {
|
|
123
|
-
maxAge: 86400, // 1 day in seconds
|
|
124
|
-
httpOnly: true,
|
|
125
|
-
secure: true,
|
|
126
|
-
sameSite: 'strict'
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
// Delete cookie
|
|
130
|
-
ctx.cookies.delete('old-cookie');
|
|
131
|
-
|
|
132
|
-
return { sessionId };
|
|
133
|
-
});
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
## Response Methods
|
|
137
|
-
|
|
138
|
-
### `ctx.json(data)`
|
|
139
|
-
Return JSON response.
|
|
140
|
-
|
|
141
|
-
```typescript
|
|
142
|
-
app.get('/user', async (ctx) => {
|
|
143
|
-
return ctx.json({
|
|
144
|
-
name: 'John',
|
|
145
|
-
email: 'john@example.com'
|
|
146
|
-
});
|
|
147
|
-
});
|
|
148
|
-
|
|
149
|
-
// Or simply return the object (auto-converted)
|
|
150
|
-
app.get('/user', async (ctx) => {
|
|
151
|
-
return { name: 'John', email: 'john@example.com' };
|
|
152
|
-
});
|
|
153
|
-
```
|
|
154
|
-
|
|
155
|
-
### `ctx.html(content)`
|
|
156
|
-
Return HTML response.
|
|
157
|
-
|
|
158
|
-
```typescript
|
|
159
|
-
app.get('/page', async (ctx) => {
|
|
160
|
-
return ctx.html(`
|
|
161
|
-
<!DOCTYPE html>
|
|
162
|
-
<html>
|
|
163
|
-
<head><title>My Page</title></head>
|
|
164
|
-
<body><h1>Welcome!</h1></body>
|
|
165
|
-
</html>
|
|
166
|
-
`);
|
|
167
|
-
});
|
|
168
|
-
```
|
|
169
|
-
|
|
170
|
-
### `ctx.text(content)`
|
|
171
|
-
Return plain text response.
|
|
172
|
-
|
|
173
|
-
```typescript
|
|
174
|
-
app.get('/robots.txt', async (ctx) => {
|
|
175
|
-
return ctx.text('User-agent: *\nDisallow: /admin/');
|
|
176
|
-
});
|
|
177
|
-
```
|
|
178
|
-
|
|
179
|
-
### `ctx.redirect(url, status?)`
|
|
180
|
-
Redirect to another URL.
|
|
181
|
-
|
|
182
|
-
```typescript
|
|
183
|
-
app.get('/old-page', async (ctx) => {
|
|
184
|
-
return ctx.redirect('/new-page', 301); // Permanent redirect
|
|
185
|
-
});
|
|
186
|
-
|
|
187
|
-
app.get('/login', async (ctx) => {
|
|
188
|
-
return ctx.redirect('/auth/login'); // Default 302
|
|
189
|
-
});
|
|
190
|
-
```
|
|
191
|
-
|
|
192
|
-
### `ctx.stream(readable)`
|
|
193
|
-
Stream a response (for large files).
|
|
194
|
-
|
|
195
|
-
```typescript
|
|
196
|
-
import { createReadStream } from 'fs';
|
|
197
|
-
|
|
198
|
-
app.get('/download', async (ctx) => {
|
|
199
|
-
const stream = createReadStream('./large-file.zip');
|
|
200
|
-
return ctx.stream(stream);
|
|
201
|
-
});
|
|
202
|
-
```
|
|
203
|
-
|
|
204
|
-
## Response Builder
|
|
205
|
-
|
|
206
|
-
Use the response builder for custom status codes and headers:
|
|
207
|
-
|
|
208
|
-
```typescript
|
|
209
|
-
app.get('/custom', async (ctx) => {
|
|
210
|
-
return ctx.response
|
|
211
|
-
.status(201)
|
|
212
|
-
.header('X-Custom-Header', 'value')
|
|
213
|
-
.json({ created: true });
|
|
214
|
-
});
|
|
215
|
-
```
|
|
216
|
-
|
|
217
|
-
## Raw Node.js Objects
|
|
218
|
-
|
|
219
|
-
Access raw Node.js objects when needed:
|
|
220
|
-
|
|
221
|
-
```typescript
|
|
222
|
-
app.get('/raw', async (ctx) => {
|
|
223
|
-
// Access raw request
|
|
224
|
-
const req = ctx.raw.req;
|
|
225
|
-
const contentLength = req.headers['content-length'];
|
|
226
|
-
|
|
227
|
-
// Access raw response
|
|
228
|
-
const res = ctx.raw.res;
|
|
229
|
-
res.setHeader('X-Custom', 'value');
|
|
230
|
-
|
|
231
|
-
return { contentLength };
|
|
232
|
-
});
|
|
233
|
-
```
|
|
234
|
-
|
|
235
|
-
## Custom Context Properties
|
|
236
|
-
|
|
237
|
-
Middleware can add custom properties to the context:
|
|
238
|
-
|
|
239
|
-
```typescript
|
|
240
|
-
// Middleware adds user
|
|
241
|
-
const auth = async (ctx: any, next: any) => {
|
|
242
|
-
ctx.user = await authenticateUser(ctx.headers.authorization);
|
|
243
|
-
return next(ctx);
|
|
244
|
-
};
|
|
245
|
-
|
|
246
|
-
app.get('/profile', {
|
|
247
|
-
middlewares: [auth],
|
|
248
|
-
handler: async (ctx: any) => {
|
|
249
|
-
// ctx.user is now available
|
|
250
|
-
return { user: ctx.user };
|
|
251
|
-
}
|
|
252
|
-
});
|
|
253
|
-
```
|
|
254
|
-
|
|
255
|
-
For type-safe custom properties, see [Middleware Documentation](./04-middleware.md).
|
|
256
|
-
|
|
257
|
-
## Context Pooling
|
|
258
|
-
|
|
259
|
-
Nexus automatically pools context objects for performance. You don't need to do anything - it's built-in!
|
|
260
|
-
|
|
261
|
-
**Performance benefit:** ~60-80% reduction in object allocations.
|
|
262
|
-
|
|
263
|
-
```typescript
|
|
264
|
-
// Get pool statistics
|
|
265
|
-
const app = createApp();
|
|
266
|
-
// ... after some requests
|
|
267
|
-
const stats = app.getPoolStats();
|
|
268
|
-
console.log(stats);
|
|
269
|
-
// {
|
|
270
|
-
// poolSize: 50,
|
|
271
|
-
// maxSize: 100,
|
|
272
|
-
// created: 150,
|
|
273
|
-
// reused: 100,
|
|
274
|
-
// hitRate: 0.67
|
|
275
|
-
// }
|
|
276
|
-
```
|
|
277
|
-
|
|
278
|
-
## Best Practices
|
|
279
|
-
|
|
280
|
-
### ✅ DO: Return data directly
|
|
281
|
-
|
|
282
|
-
```typescript
|
|
283
|
-
app.get('/users', async (ctx) => {
|
|
284
|
-
const users = await getUsers();
|
|
285
|
-
return { users };
|
|
286
|
-
});
|
|
287
|
-
```
|
|
288
|
-
|
|
289
|
-
### ❌ DON'T: Mutate the context
|
|
290
|
-
|
|
291
|
-
```typescript
|
|
292
|
-
// BAD - context is immutable
|
|
293
|
-
app.get('/bad', async (ctx) => {
|
|
294
|
-
ctx.path = '/new-path'; // Won't work!
|
|
295
|
-
});
|
|
296
|
-
```
|
|
297
|
-
|
|
298
|
-
### ✅ DO: Use typed custom properties
|
|
299
|
-
|
|
300
|
-
```typescript
|
|
301
|
-
interface AuthContext extends Context {
|
|
302
|
-
user: User;
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
const handler = async (ctx: AuthContext) => {
|
|
306
|
-
return { userId: ctx.user.id }; // Type-safe!
|
|
307
|
-
};
|
|
308
|
-
```
|
|
309
|
-
|
|
310
|
-
### ✅ DO: Use cookies for session management
|
|
311
|
-
|
|
312
|
-
```typescript
|
|
313
|
-
app.post('/login', async (ctx) => {
|
|
314
|
-
const user = await authenticate(ctx.body);
|
|
315
|
-
|
|
316
|
-
ctx.cookies.set('session', user.sessionId, {
|
|
317
|
-
httpOnly: true,
|
|
318
|
-
secure: true,
|
|
319
|
-
sameSite: 'strict',
|
|
320
|
-
maxAge: 86400
|
|
321
|
-
});
|
|
322
|
-
|
|
323
|
-
return { success: true };
|
|
324
|
-
});
|
|
325
|
-
```
|
|
326
|
-
|
|
327
|
-
## Next Steps
|
|
328
|
-
|
|
329
|
-
- 🛤️ [Routing Guide](./03-routing.md) - Learn about routing
|
|
330
|
-
- 🔌 [Middleware](./04-middleware.md) - Extend context with middleware
|
|
331
|
-
- ✅ [Validation](./05-validation.md) - Validate context data
|
|
332
|
-
|
|
333
|
-
---
|
|
334
|
-
|
|
335
|
-
[← Getting Started](./01-getting-started.md) | [API Reference →](./09-api-reference.md)
|