exisjs 0.7.4 → 0.7.5
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/commands/build.d.ts +4 -2
- package/dist/cli/commands/build.d.ts.map +1 -1
- package/dist/cli/commands/build.js +80 -22
- package/dist/cli/commands/build.js.map +1 -1
- package/dist/cli/commands/dev.d.ts.map +1 -1
- package/dist/cli/commands/dev.js +121 -27
- package/dist/cli/commands/dev.js.map +1 -1
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/doctor.js +5 -2
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/generate.d.ts +1 -0
- package/dist/cli/commands/generate.d.ts.map +1 -1
- package/dist/cli/commands/generate.js +25 -0
- package/dist/cli/commands/generate.js.map +1 -1
- package/dist/cli/commands/start.d.ts.map +1 -1
- package/dist/cli/commands/start.js +17 -5
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/index.js +10 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/manifest.d.ts.map +1 -1
- package/dist/cli/manifest.js +12 -4
- package/dist/cli/manifest.js.map +1 -1
- package/dist/config/env.d.ts.map +1 -1
- package/dist/config/env.js +8 -0
- package/dist/config/env.js.map +1 -1
- package/dist/decorators/constants.d.ts +2 -0
- package/dist/decorators/constants.d.ts.map +1 -1
- package/dist/docs/content/boundaries.mdx +33 -3
- package/dist/docs/content/config.mdx +26 -0
- package/dist/docs/content/errors.mdx +38 -2
- package/dist/docs/content/requests.mdx +38 -5
- package/dist/docs/content/responses.mdx +43 -5
- package/dist/docs/content/security.mdx +17 -4
- package/dist/docs/content/structure.mdx +91 -12
- package/dist/docs/content/validation.mdx +40 -4
- package/dist/lib/start-server.js +16 -0
- package/dist/lib/start-server.js.map +1 -1
- package/dist/middleware/rate-limit.d.ts.map +1 -1
- package/dist/middleware/rate-limit.js +9 -0
- package/dist/middleware/rate-limit.js.map +1 -1
- package/dist/router/boundary.d.ts +12 -0
- package/dist/router/boundary.d.ts.map +1 -1
- package/dist/router/boundary.js.map +1 -1
- package/dist/router/route-scanner.d.ts +1 -0
- package/dist/router/route-scanner.d.ts.map +1 -1
- package/dist/router/route-scanner.js +193 -8
- package/dist/router/route-scanner.js.map +1 -1
- package/dist/router/types.d.ts +3 -1
- package/dist/router/types.d.ts.map +1 -1
- package/dist/sanitize/index.d.ts +6 -6
- package/dist/sanitize/index.d.ts.map +1 -1
- package/dist/sanitize/index.js +8 -8
- package/dist/sanitize/index.js.map +1 -1
- package/dist/server/app.d.ts +1 -0
- package/dist/server/app.d.ts.map +1 -1
- package/dist/server/app.js +4 -0
- package/dist/server/app.js.map +1 -1
- package/dist/server/engines/node-engine.d.ts.map +1 -1
- package/dist/server/engines/node-engine.js +1 -0
- package/dist/server/engines/node-engine.js.map +1 -1
- package/dist/server/request-handler.d.ts.map +1 -1
- package/dist/server/request-handler.js +15 -1
- package/dist/server/request-handler.js.map +1 -1
- package/dist/server/request.d.ts +6 -0
- package/dist/server/request.d.ts.map +1 -1
- package/dist/server/request.js +94 -33
- package/dist/server/request.js.map +1 -1
- package/dist/server/response.d.ts +3 -1
- package/dist/server/response.d.ts.map +1 -1
- package/dist/server/response.js +98 -10
- package/dist/server/response.js.map +1 -1
- package/dist/validator/tex.d.ts +7 -7
- package/dist/validator/tex.d.ts.map +1 -1
- package/dist/validator/tex.js +217 -5
- package/dist/validator/tex.js.map +1 -1
- package/package.json +8 -8
|
@@ -210,10 +210,12 @@ res.status(404)
|
|
|
210
210
|
|
|
211
211
|
## 3. Cookies
|
|
212
212
|
|
|
213
|
-
ExisJS provides native helper methods for setting and clearing cookies safely.
|
|
213
|
+
ExisJS provides native helper methods for setting and clearing cookies safely, supporting modern web standards including CHIPS (Partitioned Cookies) and Priority hints.
|
|
214
|
+
|
|
215
|
+
### Setting Cookies
|
|
214
216
|
|
|
215
217
|
```typescript
|
|
216
|
-
// Set a secure, HTTP-only cookie
|
|
218
|
+
// Set a secure, HTTP-only session cookie
|
|
217
219
|
res.cookie('session_id', '123456', {
|
|
218
220
|
maxAge: 86400, // 1 day in seconds
|
|
219
221
|
httpOnly: true,
|
|
@@ -221,15 +223,49 @@ res.cookie('session_id', '123456', {
|
|
|
221
223
|
sameSite: 'Strict'
|
|
222
224
|
})
|
|
223
225
|
|
|
224
|
-
//
|
|
226
|
+
// Cross-site embedded iframe cookie with CHIPS (Partitioned)
|
|
227
|
+
res.cookie('widget_pref', 'dark_mode', {
|
|
228
|
+
sameSite: 'None', // Automatically forces `secure: true` per modern browser specs
|
|
229
|
+
partitioned: true, // Cookies Having Independent Partitioned State (CHIPS)
|
|
230
|
+
priority: 'high', // Hints browser cookie retention under storage pressure ('low' | 'medium' | 'high')
|
|
231
|
+
path: '/'
|
|
232
|
+
})
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
#### Cookie Options Reference
|
|
236
|
+
|
|
237
|
+
| Option | Type | Default | Description |
|
|
238
|
+
| :--- | :--- | :--- | :--- |
|
|
239
|
+
| `maxAge` | `number` | `undefined` | Lifetime of the cookie in seconds (sets both `Max-Age` and computed `Expires`). |
|
|
240
|
+
| `expires` | `Date` | `undefined` | Absolute expiration date for the cookie. |
|
|
241
|
+
| `httpOnly` | `boolean` | `false` | Mitigates XSS by preventing client-side JavaScript access. |
|
|
242
|
+
| `secure` | `boolean` | `false` | Requires HTTPS. *Automatically set to `true` if `sameSite: 'None'` is provided.* |
|
|
243
|
+
| `sameSite` | `'Strict' \| 'Lax' \| 'None' \| boolean` | `undefined` | Controls cross-site request cookie inclusion. |
|
|
244
|
+
| `partitioned` | `boolean` | `false` | Enables CHIPS for third-party contexts across top-level site partitions. |
|
|
245
|
+
| `priority` | `'low' \| 'medium' \| 'high'` | `undefined` | RFC 6265bis storage priority hint when client cookie capacity is exhausted. |
|
|
246
|
+
| `path` | `string` | `'/'` | Path where the cookie is valid. |
|
|
247
|
+
| `domain` | `string` | `undefined` | Domain scope for the cookie. |
|
|
248
|
+
|
|
249
|
+
### Clearing Cookies
|
|
250
|
+
|
|
251
|
+
When clearing cookies, browsers require the matching `path` and `domain` used when the cookie was originally set:
|
|
252
|
+
|
|
253
|
+
```typescript
|
|
254
|
+
// Clear default root cookie
|
|
225
255
|
res.clearCookie('session_id')
|
|
256
|
+
|
|
257
|
+
// Clear scoped cookie matching original domain & path
|
|
258
|
+
res.clearCookie('tenant_token', {
|
|
259
|
+
path: '/api',
|
|
260
|
+
domain: '.example.com'
|
|
261
|
+
})
|
|
226
262
|
```
|
|
227
263
|
|
|
228
264
|
---
|
|
229
265
|
|
|
230
266
|
## 4. File Downloads & Streaming
|
|
231
267
|
|
|
232
|
-
ExisJS makes streaming files simple, bypassing V8 memory bottlenecks by piping native Node streams directly to the socket.
|
|
268
|
+
ExisJS makes streaming files simple, bypassing V8 memory bottlenecks by piping native Node streams directly to the socket with automated resource cleanup.
|
|
233
269
|
|
|
234
270
|
### `res.download()`
|
|
235
271
|
Automatically reads a file from disk, sets the `Content-Disposition` header to force a download in the browser, and infers the correct MIME type based on the file extension.
|
|
@@ -263,7 +299,9 @@ export default class ReportController {
|
|
|
263
299
|
```
|
|
264
300
|
|
|
265
301
|
### `res.sendStream()`
|
|
266
|
-
|
|
302
|
+
Pipe any Node.js `Readable` stream directly to the client with built-in leak prevention:
|
|
303
|
+
- **Client Disconnect Cleanup**: If the client aborts or closes the connection prematurely, the source stream is immediately destroyed (`stream.destroy()`), releasing underlying file handles or external sockets.
|
|
304
|
+
- **Unhandled Error Catching**: Errors emitted during stream consumption are trapped gracefully, preventing unhandled stream crashes.
|
|
267
305
|
|
|
268
306
|
#### Functional Paradigm
|
|
269
307
|
|
|
@@ -41,7 +41,7 @@ export default exis({
|
|
|
41
41
|
|
|
42
42
|
## 2. In-Memory Rate Limiting
|
|
43
43
|
|
|
44
|
-
The core `rateLimit` middleware provides high-performance in-memory and off-heap native rate limiting:
|
|
44
|
+
The core `rateLimit` middleware provides high-performance in-memory and off-heap native rate limiting with standard HTTP response headers:
|
|
45
45
|
|
|
46
46
|
```typescript filename="src/http/boundary.ts"
|
|
47
47
|
import { defineBoundary } from 'exisjs/router'
|
|
@@ -51,12 +51,25 @@ export const config = defineBoundary({})
|
|
|
51
51
|
|
|
52
52
|
// Apply rate limiting chain step across the boundary
|
|
53
53
|
export const limiter = rateLimit({
|
|
54
|
-
windowMs: 60 * 1000, // 1 minute
|
|
55
|
-
max: 100,
|
|
56
|
-
message: 'Too many requests from this IP, please try again after a minute'
|
|
54
|
+
windowMs: 60 * 1000, // 1 minute window
|
|
55
|
+
max: 100, // 100 requests per window
|
|
56
|
+
message: 'Too many requests from this IP, please try again after a minute',
|
|
57
|
+
keyGenerator: (req) => req.ip // Uses normalized IPv4/IPv6 client IP
|
|
57
58
|
})
|
|
58
59
|
```
|
|
59
60
|
|
|
61
|
+
### Standard Rate Limit Headers
|
|
62
|
+
|
|
63
|
+
`rateLimit` automatically emits standard IETF draft and legacy rate-limiting headers on every response:
|
|
64
|
+
|
|
65
|
+
| Header | Description | Example |
|
|
66
|
+
| :--- | :--- | :--- |
|
|
67
|
+
| `RateLimit-Limit` | Maximum request quota for the configured window. | `100` |
|
|
68
|
+
| `RateLimit-Remaining` | Remaining requests permitted within the current window. | `42` |
|
|
69
|
+
| `RateLimit-Reset` | Time remaining in seconds until the window quota resets. | `18` |
|
|
70
|
+
| `Retry-After` | Included on `429 Too Many Requests` (RFC 6585) indicating seconds to wait. | `18` |
|
|
71
|
+
| `X-RateLimit-*` | Legacy header equivalents for backwards compatibility. | `X-RateLimit-Reset: 18` |
|
|
72
|
+
|
|
60
73
|
> [!NOTE]
|
|
61
74
|
> The core `rateLimit` middleware runs using an in-memory native off-heap store. For distributed, multi-instance rate limiting backed by Redis, use `@exisjs/cache`.
|
|
62
75
|
|
|
@@ -23,6 +23,7 @@ my-backend/
|
|
|
23
23
|
├── src/
|
|
24
24
|
│ ├── http/
|
|
25
25
|
│ │ ├── server.ts # Application entry point
|
|
26
|
+
│ │ ├── error.ts # Centralized framework exception handler (onError)
|
|
26
27
|
│ │ ├── route.ts # Root routes (e.g. GET /api)
|
|
27
28
|
│ │ ├── boundary.ts # Root boundary (config + request pipeline)
|
|
28
29
|
│ │ ├── users/
|
|
@@ -72,6 +73,7 @@ Both styles are automatically detected by the route scanner, CLI manifest genera
|
|
|
72
73
|
| `schema.ts` / `*.schema.ts` | `tex` validation schemas, imported by route files. Mandatory for every route accepting input. | Handlers, routing |
|
|
73
74
|
| `service.ts` / `*.service.ts` | Business logic and data access. DI-injectable. | Routing, response shaping |
|
|
74
75
|
| `boundary.ts` / `*.boundary.ts` | Folder-scoped config + request pipeline for everything in this folder and below. | — |
|
|
76
|
+
| `error.ts` / `*.error.ts` | Centralized exception and validation error handler (`onError`). Auto-mounted by the framework. | Business logic, routes |
|
|
75
77
|
|
|
76
78
|
---
|
|
77
79
|
|
|
@@ -172,14 +174,16 @@ A `boundary.ts` applies to every route in its folder and all subfolders. It has
|
|
|
172
174
|
two independent halves:
|
|
173
175
|
|
|
174
176
|
1. **Config** — pure data, via `defineBoundary()` (functional) or `@Boundary()`
|
|
175
|
-
(OOP argument). CORS, headers, DI providers, excluded paths.
|
|
176
|
-
2. **Pipeline** — real code, auto-detected by function signature. No imports,
|
|
177
|
+
(OOP argument). CORS, headers, DI providers, excluded paths, and lifecycle hooks.
|
|
178
|
+
2. **Pipeline & Hooks** — real code, auto-detected by function signature. No imports,
|
|
177
179
|
no manual registration required.
|
|
178
180
|
|
|
179
|
-
| Signature
|
|
180
|
-
|
|
|
181
|
-
| `(req, res, next)`
|
|
182
|
-
| `(
|
|
181
|
+
| Signature | Detected as | Runs |
|
|
182
|
+
| :--- | :--- | :--- |
|
|
183
|
+
| `(req, res, next)` | Chain Step | In file/declaration order, before the route handler |
|
|
184
|
+
| `beforeHandle(req, res)` | Boundary Guard Hook | Immediately before route execution. Short-circuits on `false` or when headers sent |
|
|
185
|
+
| `afterHandle(req, res, data)` | Response Hook | Immediately after route execution. Receives returned data to transform or audit |
|
|
186
|
+
| `(ctx, next)` — default export (functional) or `handle(ctx, next)` (OOP) | Pipeline Wrapper | Around all chain steps and the nested route/boundary |
|
|
183
187
|
|
|
184
188
|
### Functional
|
|
185
189
|
|
|
@@ -190,11 +194,25 @@ import type { Request, Response, Next, BoundaryContext } from "exisjs/router";
|
|
|
190
194
|
export const config = defineBoundary({
|
|
191
195
|
cors: { origin: ["https://myapp.com"], credentials: true },
|
|
192
196
|
headers: { "X-Powered-By": "ExisJS" },
|
|
193
|
-
exclude: [{ path: "/health", method: "GET" }],
|
|
197
|
+
exclude: [{ path: "/admin/health", method: "GET" }],
|
|
198
|
+
|
|
199
|
+
// Pre-handler hook (returns false to block with 403, or sends response)
|
|
200
|
+
beforeHandle(req, res) {
|
|
201
|
+
if (req.headers["x-role"] !== "admin") {
|
|
202
|
+
res.status(403).json({ error: "Admin role required" });
|
|
203
|
+
return false;
|
|
204
|
+
}
|
|
205
|
+
},
|
|
206
|
+
|
|
207
|
+
// Post-handler hook (transforms returned payload or performs async audit)
|
|
208
|
+
afterHandle(req, res, data) {
|
|
209
|
+
res.setHeader("X-Audited-By", "AdminBoundary");
|
|
210
|
+
return { ...data, auditedAt: Date.now() };
|
|
211
|
+
},
|
|
194
212
|
});
|
|
195
213
|
|
|
196
|
-
export function
|
|
197
|
-
|
|
214
|
+
export function logStep(req: Request, res: Response, next: Next) {
|
|
215
|
+
console.log(`[Admin] ${req.method} ${req.path}`);
|
|
198
216
|
next();
|
|
199
217
|
}
|
|
200
218
|
|
|
@@ -216,14 +234,29 @@ import type { Request, Response, Next, BoundaryContext } from "exisjs/router";
|
|
|
216
234
|
@Boundary({
|
|
217
235
|
cors: { origin: ["https://myapp.com"], credentials: true },
|
|
218
236
|
headers: { "X-Powered-By": "ExisJS" },
|
|
237
|
+
exclude: ["/admin/health"],
|
|
219
238
|
})
|
|
220
239
|
export default class AdminBoundary {
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
240
|
+
// Pre-handler hook
|
|
241
|
+
beforeHandle(req: Request, res: Response) {
|
|
242
|
+
if (req.headers["x-role"] !== "admin") {
|
|
243
|
+
res.status(403).json({ error: "Admin role required" });
|
|
244
|
+
return false;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
// Post-handler hook
|
|
249
|
+
afterHandle(req: Request, res: Response, data: any) {
|
|
250
|
+
return { ...data, auditedAt: Date.now() };
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
// Chain step
|
|
254
|
+
logStep(req: Request, res: Response, next: Next) {
|
|
255
|
+
console.log(`[Admin] ${req.method} ${req.path}`);
|
|
224
256
|
next();
|
|
225
257
|
}
|
|
226
258
|
|
|
259
|
+
// Wrapper
|
|
227
260
|
async handle(ctx: BoundaryContext, next: Next) {
|
|
228
261
|
try {
|
|
229
262
|
return { success: true, data: await next() };
|
|
@@ -234,6 +267,52 @@ export default class AdminBoundary {
|
|
|
234
267
|
}
|
|
235
268
|
```
|
|
236
269
|
|
|
270
|
+
---
|
|
271
|
+
|
|
272
|
+
## `src/http/error.ts` (Framework-Level Exception Handler)
|
|
273
|
+
|
|
274
|
+
ExisJS natively discovers and mounts `src/http/error.ts` (or `error.js`) at boot. It exports an `onError(err, req, res)` handler, giving developers a single, standard place to intercept, log, and format all unhandled or validation errors without writing custom `app.onError` boilerplate inside `server.ts`.
|
|
275
|
+
|
|
276
|
+
### Functional
|
|
277
|
+
|
|
278
|
+
```typescript filename="src/http/error.ts"
|
|
279
|
+
import type { Request, Response } from "exisjs";
|
|
280
|
+
|
|
281
|
+
export function onError(err: any, req: Request, res: Response) {
|
|
282
|
+
const status = err.statusCode || err.status || 500;
|
|
283
|
+
|
|
284
|
+
// Format consistent error response across the entire API
|
|
285
|
+
res.status(status).json({
|
|
286
|
+
success: false,
|
|
287
|
+
error: {
|
|
288
|
+
message: err.message || "Internal Server Error",
|
|
289
|
+
code: err.code || "INTERNAL_SERVER_ERROR",
|
|
290
|
+
path: req.path,
|
|
291
|
+
},
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
### Class-Based (OOP)
|
|
297
|
+
|
|
298
|
+
```typescript filename="src/http/error.ts"
|
|
299
|
+
import type { Request, Response } from "exisjs";
|
|
300
|
+
|
|
301
|
+
export default class GlobalErrorHandler {
|
|
302
|
+
onError(err: any, req: Request, res: Response) {
|
|
303
|
+
const status = err.statusCode || err.status || 500;
|
|
304
|
+
res.status(status).json({
|
|
305
|
+
success: false,
|
|
306
|
+
error: {
|
|
307
|
+
message: err.message || "Internal Server Error",
|
|
308
|
+
code: err.code || "INTERNAL_ERROR",
|
|
309
|
+
path: req.path,
|
|
310
|
+
},
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
```
|
|
315
|
+
|
|
237
316
|
A nested folder's `boundary.ts` always runs _inside_ its parent's `next()` —
|
|
238
317
|
pipeline depth mirrors folder depth automatically.
|
|
239
318
|
|
|
@@ -32,13 +32,15 @@ const safeData = userSchema.parse(rawInput)
|
|
|
32
32
|
|
|
33
33
|
ExisJS supports a comprehensive set of strict validation primitives:
|
|
34
34
|
|
|
35
|
-
- `tex.string()` - String validation (supports options like `{ min: 5, max: 10 }`).
|
|
35
|
+
- `tex.string()` - String validation (supports options like `{ min: 5, max: 10, pattern: /regex/ }`).
|
|
36
36
|
- `tex.email()` - Validates standard email formatting.
|
|
37
|
-
- `tex.number()` - Strict number validation (fails if passed a string).
|
|
37
|
+
- `tex.number()` - Strict number validation (fails if passed a string unless `coerce: true`).
|
|
38
|
+
- `tex.number({ coerce: true, min: 0, max: 100 })` - Automatically coerces incoming string representations (e.g., query params) into native numbers.
|
|
38
39
|
- `tex.boolean()` - Strict boolean validation.
|
|
39
|
-
- `tex.number({ coerce: true })` - Automatically coerces incoming string representations into native JavaScript numbers.
|
|
40
40
|
- `tex.boolean({ coerce: true })` - Coerces `"true"`/`"1"` and `"false"`/`"0"` into native booleans.
|
|
41
|
-
- `tex.
|
|
41
|
+
- `tex.date()` - Strict Date instance validation.
|
|
42
|
+
- `tex.date({ coerce: true, minDate: new Date('2020-01-01'), maxDate: new Date() })` - Automatically parses ISO 8601 strings, UNIX timestamps, or date strings into native JavaScript `Date` objects with optional boundary checks.
|
|
43
|
+
- `tex.array(schema, { coerce: true, min: 1, max: 10 })` - Validates an array of items. When `{ coerce: true }` is enabled, automatically converts single items or comma-separated query strings (`"apple,banana"`) into typed arrays. Accepts primitive types, `tex.object(...)`, or shorthand plain objects `{ ... }`.
|
|
42
44
|
- `tex.object({ ... })` - Validates structured JSON objects.
|
|
43
45
|
- `tex.enum(['A', 'B'])` - Ensures the value matches one of the provided exact strings.
|
|
44
46
|
|
|
@@ -254,6 +256,40 @@ export const RegisterUserSchema = tex.object({
|
|
|
254
256
|
- **Stringified JSON Support**: When submitting `multipart/form-data`, stringified JSON arrays (e.g. `items: "[{\"sku\":\"ABC\",\"quantity\":2}]"`) or stringified objects are automatically deserialized and validated.
|
|
255
257
|
- **Type Inference**: TypeScript automatically infers the shape of array elements for both `tex.array(tex.object(...))` and `tex.array({ ... })`, ensuring full autocomplete without falling back to `never`.
|
|
256
258
|
|
|
259
|
+
### Query String Array & Date Coercion
|
|
260
|
+
|
|
261
|
+
Query strings in HTTP cannot natively represent arrays or date instances. ExisJS solves this elegantly through `{ coerce: true }`:
|
|
262
|
+
|
|
263
|
+
```typescript filename="src/http/events/route.ts"
|
|
264
|
+
import { controller, route } from 'exisjs/router'
|
|
265
|
+
import { tex } from 'exisjs/validator'
|
|
266
|
+
|
|
267
|
+
const FilterSchema = tex.object({
|
|
268
|
+
// Coerces ISO 8601 strings (?from=2026-09-01T00:00:00Z) into Date instances
|
|
269
|
+
from: tex.date({ coerce: true, optional: true }),
|
|
270
|
+
to: tex.date({ coerce: true, optional: true }),
|
|
271
|
+
|
|
272
|
+
// Coerces both comma-separated strings (?tags=tech,ai) AND repeated params (?tags=tech&tags=ai)
|
|
273
|
+
// or single values (?tags=tech -> ['tech']) into a typed array of strings
|
|
274
|
+
tags: tex.array(tex.string(), { coerce: true, optional: true }),
|
|
275
|
+
|
|
276
|
+
// Numbers within comma-separated arrays (?ids=1,2,3 -> [1, 2, 3]) are also coerced
|
|
277
|
+
ids: tex.array(tex.number({ coerce: true }), { coerce: true, optional: true })
|
|
278
|
+
})
|
|
279
|
+
|
|
280
|
+
export default controller({
|
|
281
|
+
listEvents: route.get('/events', {
|
|
282
|
+
query: FilterSchema,
|
|
283
|
+
handle({ query, res }) {
|
|
284
|
+
// query.from is Date | undefined
|
|
285
|
+
// query.tags is string[] | undefined
|
|
286
|
+
// query.ids is number[] | undefined
|
|
287
|
+
res.json({ filter: query })
|
|
288
|
+
}
|
|
289
|
+
})
|
|
290
|
+
})
|
|
291
|
+
```
|
|
292
|
+
|
|
257
293
|
---
|
|
258
294
|
|
|
259
295
|
## Pagination Schemas (`tex.pagination`)
|
package/dist/lib/start-server.js
CHANGED
|
@@ -84,6 +84,12 @@ async function start() {
|
|
|
84
84
|
const mod = await dynamicImport(url);
|
|
85
85
|
// Support declarative `export default exis({ ... })` or `@Server` classes
|
|
86
86
|
let app = mod.default || mod.app;
|
|
87
|
+
if (app &&
|
|
88
|
+
!app._isExisAppDefinition &&
|
|
89
|
+
typeof app.create !== 'function' &&
|
|
90
|
+
app.default) {
|
|
91
|
+
app = app.default;
|
|
92
|
+
}
|
|
87
93
|
let instance = null;
|
|
88
94
|
const { setActiveAppInstance } = await Promise.resolve().then(() => __importStar(require('../server/app.js')));
|
|
89
95
|
if (app && app._isExisAppDefinition) {
|
|
@@ -158,7 +164,11 @@ async function start() {
|
|
|
158
164
|
// On SIGTERM (Kubernetes, Docker stop) or SIGINT (Ctrl+C), close the
|
|
159
165
|
// server cleanly rather than hard-killing it — this allows in-flight
|
|
160
166
|
// requests to complete and prevents data loss.
|
|
167
|
+
let isShuttingDown = false;
|
|
161
168
|
const shutdown = async (signal) => {
|
|
169
|
+
if (isShuttingDown)
|
|
170
|
+
return;
|
|
171
|
+
isShuttingDown = true;
|
|
162
172
|
const isCLI = process.env.__EXIS_DEV_SERVER || process.env.__EXIS_CLI;
|
|
163
173
|
if (!isCLI) {
|
|
164
174
|
console.error(`\n[exis] ${signal} received. Shutting down gracefully...`);
|
|
@@ -179,6 +189,12 @@ async function start() {
|
|
|
179
189
|
};
|
|
180
190
|
process.once('SIGTERM', () => shutdown('SIGTERM'));
|
|
181
191
|
process.once('SIGINT', () => shutdown('SIGINT'));
|
|
192
|
+
process.on('message', (msg) => {
|
|
193
|
+
if (msg === 'shutdown' ||
|
|
194
|
+
(typeof msg === 'object' && msg?.type === 'exis:shutdown')) {
|
|
195
|
+
shutdown('IPC');
|
|
196
|
+
}
|
|
197
|
+
});
|
|
182
198
|
// ─── Dev Server Error Boundary ───────────────────────────────────────────
|
|
183
199
|
// Prevent dev server from fatally crashing on strict unhandled errors (e.g. Postgres disconnected)
|
|
184
200
|
if (process.env.__EXIS_DEV_SERVER) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start-server.js","sourceRoot":"","sources":["../../src/lib/start-server.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"start-server.js","sourceRoot":"","sources":["../../src/lib/start-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../../src/middleware/rate-limit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAA0B,OAAO,EAAE,MAAM,UAAU,CAAA;AAGxE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,MAAM,CAAA;CACxC;AAED,wBAAgB,SAAS,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,
|
|
1
|
+
{"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../../src/middleware/rate-limit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAA0B,OAAO,EAAE,MAAM,UAAU,CAAA;AAGxE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,MAAM,CAAA;CACxC;AAED,wBAAgB,SAAS,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAwFjE"}
|
|
@@ -56,9 +56,18 @@ function rateLimit(options = {}) {
|
|
|
56
56
|
fallbackHits.set(key, record);
|
|
57
57
|
currentHits = record.count;
|
|
58
58
|
}
|
|
59
|
+
const resetSeconds = Math.ceil(windowMs / 1000);
|
|
60
|
+
const resetEpochSeconds = Math.ceil((now + windowMs) / 1000);
|
|
61
|
+
// Legacy Headers
|
|
59
62
|
res.set('X-RateLimit-Limit', max.toString());
|
|
60
63
|
res.set('X-RateLimit-Remaining', Math.max(0, max - currentHits).toString());
|
|
64
|
+
res.set('X-RateLimit-Reset', resetEpochSeconds.toString());
|
|
65
|
+
// IETF Draft Standard Headers
|
|
66
|
+
res.set('RateLimit-Limit', max.toString());
|
|
67
|
+
res.set('RateLimit-Remaining', Math.max(0, max - currentHits).toString());
|
|
68
|
+
res.set('RateLimit-Reset', resetSeconds.toString());
|
|
61
69
|
if (currentHits > max) {
|
|
70
|
+
res.set('Retry-After', resetSeconds.toString());
|
|
62
71
|
return next(new errors_1.HttpError(message, statusCode, 'RATE_LIMIT_EXCEEDED'));
|
|
63
72
|
}
|
|
64
73
|
next();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../../src/middleware/rate-limit.ts"],"names":[],"mappings":";;AAWA,
|
|
1
|
+
{"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../../src/middleware/rate-limit.ts"],"names":[],"mappings":"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"}
|
|
@@ -67,7 +67,19 @@ export interface BoundaryConfig {
|
|
|
67
67
|
* Cascading metadata (e.g., OpenAPI tags, roles) applied to all routes in this directory.
|
|
68
68
|
*/
|
|
69
69
|
metadata?: Record<string, any>;
|
|
70
|
+
/**
|
|
71
|
+
* Hook executed immediately before any route handler in this boundary.
|
|
72
|
+
* Can short-circuit execution by returning `false` or sending a response directly.
|
|
73
|
+
*/
|
|
74
|
+
beforeHandle?: BoundaryBeforeHandleHook | BoundaryBeforeHandleHook[];
|
|
75
|
+
/**
|
|
76
|
+
* Hook executed immediately after a route handler in this boundary successfully returns.
|
|
77
|
+
* Receives `(req, res, data)` and can transform the outgoing payload or perform audit logging.
|
|
78
|
+
*/
|
|
79
|
+
afterHandle?: BoundaryAfterHandleHook | BoundaryAfterHandleHook[];
|
|
70
80
|
}
|
|
81
|
+
export type BoundaryBeforeHandleHook = (req: import('../types').Request<any, any, any>, res: import('../types').Response) => void | boolean | Promise<void | boolean>;
|
|
82
|
+
export type BoundaryAfterHandleHook<T = any> = (req: import('../types').Request<any, any, any>, res: import('../types').Response, data?: T) => void | any | Promise<void | any>;
|
|
71
83
|
/**
|
|
72
84
|
* Defines a boundary that acts as folder-scoped config + request pipeline for
|
|
73
85
|
* everything in this directory and subdirectories.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"boundary.d.ts","sourceRoot":"","sources":["../../src/router/boundary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAC/D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAEzD,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,OAAO,UAAU,EAAE,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;IAC9C,GAAG,EAAE,OAAO,UAAU,EAAE,QAAQ,CAAA;IAChC,GAAG,CAAC,EAAE,GAAG,CAAA;IACT,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,UAAU,EAAE,CAAA;IACtB,MAAM,CAAC,EAAE,UAAU,CAAA;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAA;IAChC;;OAEG;IACH,WAAW,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAA;IAEjC;;OAEG;IACH,IAAI,CAAC,EAAE,UAAU,GAAG,OAAO,CAAA;IAE3B;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAEhC;;OAEG;IACH,OAAO,CAAC,EAAE,CACR,OAAO,UAAU,EAAE,kBAAkB,GAAG,OAAO,UAAU,EAAE,UAAU,CACtE,EAAE,CAAA;IAEH;;;OAGG;IACH,OAAO,CAAC,EAAE,CACR,OAAO,UAAU,EAAE,kBAAkB,GAAG,OAAO,UAAU,EAAE,UAAU,CACtE,EAAE,CAAA;IAEH;;OAEG;IACH,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,kBAAkB,CAAC,GAAG,CAAC,CAAC,EAAE,CAAA;IAE/C;;OAEG;IACH,OAAO,CAAC,EAAE,CAAC,MAAM,GAAG,mBAAmB,CAAC,EAAE,CAAA;IAE1C;;OAEG;IACH,OAAO,CAAC,EAAE,GAAG,EAAE,CAAA;IAEf;;OAEG;IACH,MAAM,CAAC,EAAE,GAAG,EAAE,CAAA;IAEd;;OAEG;IACH,YAAY,CAAC,EAAE,GAAG,EAAE,CAAA;IAEpB;;;OAGG;IACH,OAAO,CAAC,EACJ,MAAM,GACN,CAAC,CAAC,GAAG,EAAE,OAAO,UAAU,EAAE,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,KAAK,MAAM,GAAG,SAAS,CAAC,CAAA;IAE5E;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"boundary.d.ts","sourceRoot":"","sources":["../../src/router/boundary.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"boundary.js","sourceRoot":"","sources":["../../src/router/boundary.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"boundary.js","sourceRoot":"","sources":["../../src/router/boundary.ts"],"names":[],"mappings":";;AAsHA,wCAEC;AAND;;;GAGG;AACH,SAAgB,cAAc,CAAC,MAAsB;IACnD,OAAO,MAAM,CAAA;AACf,CAAC"}
|
|
@@ -16,6 +16,7 @@ export declare class RouteScanner {
|
|
|
16
16
|
mountRouteFile(filePath: string, routePath: string): Promise<void>;
|
|
17
17
|
private compileFunctionalController;
|
|
18
18
|
private mountRouteWithSource;
|
|
19
|
+
private mountErrorHandler;
|
|
19
20
|
private scanDirectory;
|
|
20
21
|
}
|
|
21
22
|
//# sourceMappingURL=route-scanner.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-scanner.d.ts","sourceRoot":"","sources":["../../src/router/route-scanner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,eAAe,CAAA;AASxC,qBAAa,YAAY;IAQJ,GAAG,EAAE,GAAG;IAPpB,UAAU;kBAA+B,MAAM;gBAAU,OAAO;OAAK;IACrE,QAAQ,sBAA4B;IACpC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAO;IAC5B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;IACtB,aAAa,UAAQ;IACrB,cAAc,EAAE,KAAK,GAAG,YAAY,GAAG,IAAI,CAAO;gBAEtC,GAAG,EAAE,GAAG;IAErB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBvB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"route-scanner.d.ts","sourceRoot":"","sources":["../../src/router/route-scanner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,eAAe,CAAA;AASxC,qBAAa,YAAY;IAQJ,GAAG,EAAE,GAAG;IAPpB,UAAU;kBAA+B,MAAM;gBAAU,OAAO;OAAK;IACrE,QAAQ,sBAA4B;IACpC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAO;IAC5B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;IACtB,aAAa,UAAQ;IACrB,cAAc,EAAE,KAAK,GAAG,YAAY,GAAG,IAAI,CAAO;gBAEtC,GAAG,EAAE,GAAG;IAErB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBvB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwRnD,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAusBxE,OAAO,CAAC,2BAA2B;IA4PnC,OAAO,CAAC,oBAAoB;YA2Bd,iBAAiB;YA4EjB,aAAa;CAqC5B"}
|