exisjs 0.7.1 → 0.7.3

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.
Files changed (109) hide show
  1. package/dist/cli/commands/build.d.ts.map +1 -1
  2. package/dist/cli/commands/build.js +10 -0
  3. package/dist/cli/commands/build.js.map +1 -1
  4. package/dist/cli/commands/doctor.d.ts +2 -0
  5. package/dist/cli/commands/doctor.d.ts.map +1 -0
  6. package/dist/cli/commands/doctor.js +258 -0
  7. package/dist/cli/commands/doctor.js.map +1 -0
  8. package/dist/cli/commands/generate.d.ts +7 -1
  9. package/dist/cli/commands/generate.d.ts.map +1 -1
  10. package/dist/cli/commands/generate.js +26 -19
  11. package/dist/cli/commands/generate.js.map +1 -1
  12. package/dist/cli/index.js +15 -1
  13. package/dist/cli/index.js.map +1 -1
  14. package/dist/cli/manifest.d.ts.map +1 -1
  15. package/dist/cli/manifest.js +3 -1
  16. package/dist/cli/manifest.js.map +1 -1
  17. package/dist/cli/resolve-aliases.d.ts +12 -0
  18. package/dist/cli/resolve-aliases.d.ts.map +1 -1
  19. package/dist/cli/resolve-aliases.js +119 -45
  20. package/dist/cli/resolve-aliases.js.map +1 -1
  21. package/dist/cli/routes.d.ts +8 -1
  22. package/dist/cli/routes.d.ts.map +1 -1
  23. package/dist/cli/routes.js +96 -47
  24. package/dist/cli/routes.js.map +1 -1
  25. package/dist/config/config.d.ts +2 -1
  26. package/dist/config/config.d.ts.map +1 -1
  27. package/dist/config/config.js +1 -0
  28. package/dist/config/config.js.map +1 -1
  29. package/dist/config/index.d.ts +1 -0
  30. package/dist/config/index.d.ts.map +1 -1
  31. package/dist/config/index.js +6 -1
  32. package/dist/config/index.js.map +1 -1
  33. package/dist/config/types.d.ts +4 -1
  34. package/dist/config/types.d.ts.map +1 -1
  35. package/dist/docs/content/cli/commands.mdx +36 -3
  36. package/dist/docs/content/cli/overview.mdx +1 -0
  37. package/dist/docs/content/config.mdx +8 -1
  38. package/dist/docs/content/errors.mdx +14 -14
  39. package/dist/docs/content/responses.mdx +106 -0
  40. package/dist/docs/content/routing.mdx +20 -15
  41. package/dist/docs/content/security.mdx +6 -1
  42. package/dist/docs/content/structure.mdx +12 -6
  43. package/dist/lib/start-server.js +8 -0
  44. package/dist/lib/start-server.js.map +1 -1
  45. package/dist/middleware/compression.d.ts.map +1 -1
  46. package/dist/middleware/compression.js +20 -5
  47. package/dist/middleware/compression.js.map +1 -1
  48. package/dist/middleware/middleware.d.ts +3 -0
  49. package/dist/middleware/middleware.d.ts.map +1 -1
  50. package/dist/middleware/middleware.js +112 -46
  51. package/dist/middleware/middleware.js.map +1 -1
  52. package/dist/middleware/security.d.ts.map +1 -1
  53. package/dist/middleware/security.js +55 -10
  54. package/dist/middleware/security.js.map +1 -1
  55. package/dist/router/boundary.d.ts +5 -1
  56. package/dist/router/boundary.d.ts.map +1 -1
  57. package/dist/router/boundary.js.map +1 -1
  58. package/dist/router/index.d.ts +2 -0
  59. package/dist/router/index.d.ts.map +1 -1
  60. package/dist/router/index.js +5 -1
  61. package/dist/router/index.js.map +1 -1
  62. package/dist/router/route-builder.d.ts +25 -19
  63. package/dist/router/route-builder.d.ts.map +1 -1
  64. package/dist/router/route-builder.js.map +1 -1
  65. package/dist/router/route-scanner.d.ts.map +1 -1
  66. package/dist/router/route-scanner.js +48 -15
  67. package/dist/router/route-scanner.js.map +1 -1
  68. package/dist/router/router.d.ts.map +1 -1
  69. package/dist/router/router.js +9 -2
  70. package/dist/router/router.js.map +1 -1
  71. package/dist/sanitize/index.d.ts +9 -9
  72. package/dist/sanitize/index.d.ts.map +1 -1
  73. package/dist/sanitize/index.js +19 -10
  74. package/dist/sanitize/index.js.map +1 -1
  75. package/dist/sanitize/sanitize.d.ts +11 -11
  76. package/dist/sanitize/sanitize.d.ts.map +1 -1
  77. package/dist/sanitize/sanitize.js +22 -13
  78. package/dist/sanitize/sanitize.js.map +1 -1
  79. package/dist/server/app.d.ts.map +1 -1
  80. package/dist/server/app.js +18 -0
  81. package/dist/server/app.js.map +1 -1
  82. package/dist/server/response.d.ts +27 -0
  83. package/dist/server/response.d.ts.map +1 -1
  84. package/dist/server/response.js +109 -4
  85. package/dist/server/response.js.map +1 -1
  86. package/dist/server/sse.d.ts +82 -0
  87. package/dist/server/sse.d.ts.map +1 -0
  88. package/dist/server/sse.js +216 -0
  89. package/dist/server/sse.js.map +1 -0
  90. package/dist/testing/client.d.ts.map +1 -1
  91. package/dist/testing/client.js +33 -5
  92. package/dist/testing/client.js.map +1 -1
  93. package/dist/testing/index.d.ts +1 -1
  94. package/dist/testing/index.d.ts.map +1 -1
  95. package/dist/testing/index.js +2 -1
  96. package/dist/testing/index.js.map +1 -1
  97. package/dist/types.d.ts +1 -0
  98. package/dist/types.d.ts.map +1 -1
  99. package/dist/types.js +1 -0
  100. package/dist/types.js.map +1 -1
  101. package/dist/validator/index.d.ts +2 -0
  102. package/dist/validator/index.d.ts.map +1 -1
  103. package/dist/validator/index.js.map +1 -1
  104. package/dist/validator/tex-types.d.ts +2 -2
  105. package/dist/validator/tex-types.d.ts.map +1 -1
  106. package/dist/validator/tex.d.ts.map +1 -1
  107. package/dist/validator/tex.js +1 -0
  108. package/dist/validator/tex.js.map +1 -1
  109. package/package.json +1 -1
@@ -1,4 +1,5 @@
1
1
  export type { ExisConfig } from '../types';
2
2
  export { defineConfig, mergeConfig, loadConfig, defaultConfig } from './config';
3
+ export { loadEnv, processEnv, resetEnv, parseEnv } from './env';
3
4
  export * from './constants';
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAC1C,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAC/E,cAAc,aAAa,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAC1C,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAC/E,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAC/D,cAAc,aAAa,CAAA"}
@@ -14,11 +14,16 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.defaultConfig = exports.loadConfig = exports.mergeConfig = exports.defineConfig = void 0;
17
+ exports.parseEnv = exports.resetEnv = exports.processEnv = exports.loadEnv = exports.defaultConfig = exports.loadConfig = exports.mergeConfig = exports.defineConfig = void 0;
18
18
  var config_1 = require("./config");
19
19
  Object.defineProperty(exports, "defineConfig", { enumerable: true, get: function () { return config_1.defineConfig; } });
20
20
  Object.defineProperty(exports, "mergeConfig", { enumerable: true, get: function () { return config_1.mergeConfig; } });
21
21
  Object.defineProperty(exports, "loadConfig", { enumerable: true, get: function () { return config_1.loadConfig; } });
22
22
  Object.defineProperty(exports, "defaultConfig", { enumerable: true, get: function () { return config_1.defaultConfig; } });
23
+ var env_1 = require("./env");
24
+ Object.defineProperty(exports, "loadEnv", { enumerable: true, get: function () { return env_1.loadEnv; } });
25
+ Object.defineProperty(exports, "processEnv", { enumerable: true, get: function () { return env_1.processEnv; } });
26
+ Object.defineProperty(exports, "resetEnv", { enumerable: true, get: function () { return env_1.resetEnv; } });
27
+ Object.defineProperty(exports, "parseEnv", { enumerable: true, get: function () { return env_1.parseEnv; } });
23
28
  __exportStar(require("./constants"), exports);
24
29
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AACA,mCAA+E;AAAtE,sGAAA,YAAY,OAAA;AAAE,qGAAA,WAAW,OAAA;AAAE,oGAAA,UAAU,OAAA;AAAE,uGAAA,aAAa,OAAA;AAC7D,8CAA2B"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AACA,mCAA+E;AAAtE,sGAAA,YAAY,OAAA;AAAE,qGAAA,WAAW,OAAA;AAAE,oGAAA,UAAU,OAAA;AAAE,uGAAA,aAAa,OAAA;AAC7D,6BAA+D;AAAtD,8FAAA,OAAO,OAAA;AAAE,iGAAA,UAAU,OAAA;AAAE,+FAAA,QAAQ,OAAA;AAAE,+FAAA,QAAQ,OAAA;AAChD,8CAA2B"}
@@ -1,7 +1,9 @@
1
1
  import type { ExisPlugin } from '../plugin/types';
2
2
  import type { SslConfig } from '../types';
3
+ export type CorsOriginCallback = (err: Error | null, allow?: boolean) => void;
4
+ export type CorsOriginFn = (origin: string, callback?: CorsOriginCallback) => boolean | Promise<boolean> | void;
3
5
  export interface CorsConfig {
4
- origin?: boolean | string | RegExp | (string | RegExp)[] | ((origin: string) => boolean);
6
+ origin?: boolean | string | RegExp | (string | RegExp)[] | CorsOriginFn;
5
7
  methods?: string[];
6
8
  allowedHeaders?: string[];
7
9
  exposedHeaders?: string[];
@@ -78,6 +80,7 @@ export interface ExisConfig {
78
80
  };
79
81
  debugRouting?: boolean;
80
82
  asyncContext?: boolean;
83
+ transformResponse?: boolean | ((data: any, req: any, res: any) => any);
81
84
  /**
82
85
  * Defines the HTTP server backend.
83
86
  * 'node' uses the native Node.js HTTP module.
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"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"}
@@ -85,13 +85,14 @@ $ npx exisjs g <type> <name> [options]
85
85
 
86
86
  | Option | Description |
87
87
  | :--- | :--- |
88
+ | `-n, --named` | Names generated files using the feature prefix (e.g. `<name>.route.ts`, `<name>.schema.ts`, `<name>.service.ts`). |
88
89
  | `--oop` | Generates using Class-Based (OOP) decorators instead of Functional syntax. |
89
90
 
90
91
  **Supported Schematics**
91
92
 
92
93
  | Schematic | Alias | Description | Output Path |
93
94
  | :--- | :--- | :--- | :--- |
94
- | `resource` | | Complete domain slice (`schema.ts`, `service.ts`, `boundary.ts`, `route.ts`) | `src/http/<name>/` |
95
+ | `resource` | | Complete domain slice (`schema.ts`, `service.ts`, `route.ts` or feature-prefixed named files) | `src/http/<name>/` |
95
96
  | `route` | `r`, `c`, `controller` | HTTP route file | `src/http/<name>/route.ts` |
96
97
  | `service` | `s` | Injectable service / business logic | `src/http/<name>/service.ts` |
97
98
  | `schema` | `sc` | Validation schemas powered by `tex` | `src/http/<name>/schema.ts` |
@@ -104,7 +105,7 @@ $ npx exisjs g <type> <name> [options]
104
105
 
105
106
  ### `exisjs routes`
106
107
 
107
- Analyzes and prints the application routing table to the terminal.
108
+ Analyzes and prints the application routing table to the terminal in an interactive, formatted grid with method badges and dynamic parameter highlighting.
108
109
 
109
110
  ```bash
110
111
  $ npx exisjs routes [options]
@@ -114,7 +115,17 @@ $ npx exisjs routes [options]
114
115
 
115
116
  | Option | Description |
116
117
  | :--- | :--- |
117
- | `-e, --entry <file>` | Custom entry file path to bootstrap the app from. |
118
+ | `-e, --entry <file>` | Custom entry file path to bootstrap the app from (default: `src/http/server.ts`). |
119
+ | `-m, --method <method>` | Filter endpoints by HTTP method (e.g. `GET`, `POST`, `PUT`, `DELETE`). |
120
+ | `-f, --filter <keyword>` | Filter endpoints matching path, method, or source file keyword. |
121
+ | `--json` | Output the parsed routes and middleware metadata directly as structured JSON. |
122
+
123
+ **Features**
124
+ - **Method Badges**: Visually styled badges (`GET`, `POST`, `PUT`, `PATCH`, `DEL`, `ALL`).
125
+ - **Parameter Highlighting**: Dynamically distinguishes path parameters (`:id`, `*slug`).
126
+ - **Middleware Counting**: Displays total attached middleware / boundary steps.
127
+ - **Source Resolution**: Displays relative file source path (e.g. `src/http/users/user.route.ts`).
128
+ - **Summary Metrics**: Displays total endpoint counts and method breakdown.
118
129
 
119
130
  ---
120
131
 
@@ -155,6 +166,12 @@ $ npx exisjs repl [options]
155
166
  $ npx exisjs console [options]
156
167
  ```
157
168
 
169
+ **Options**
170
+
171
+ | Option | Description |
172
+ | :--- | :--- |
173
+ | `-e, --entry <file>` | Custom entry file path to bootstrap the REPL context. |
174
+
158
175
  ---
159
176
 
160
177
  ### `exisjs exports`
@@ -174,3 +191,19 @@ Displays runtime environment, Node.js version, platform, architecture, and ExisJ
174
191
  ```bash
175
192
  $ npx exisjs info
176
193
  ```
194
+
195
+ ---
196
+
197
+ ### `exisjs doctor`
198
+
199
+ Performs an end-to-end diagnostic audit of the local project environment, verifying Node.js version compatibility, native Rust hardware acceleration (`@exisjs/rs`), `tsconfig.json` strictness, entry-point resolution, route naming patterns, and file-system route counts.
200
+
201
+ ```bash
202
+ $ npx exisjs doctor
203
+ ```
204
+
205
+ **Diagnostic Checks**
206
+ - **Runtime**: Validates Node.js engine compatibility (v18+ recommended for N-API and worker thread pools).
207
+ - **Native Engine**: Verifies `@exisjs/rs` compiled native binaries are active for hardware-accelerated radix tree traversal, off-heap caching, and native JSON serialization.
208
+ - **Project Configuration**: Checks `package.json` root and `tsconfig.json` strict mode.
209
+ - **Routes & Pipeline**: Confirms application entry point (`src/http/server.ts`), discovers active route slices, and flags non-standard or orphan file naming conventions.
@@ -79,4 +79,5 @@ $ npx exisjs g r users --oop
79
79
  | `repl` | `console` | Starts an interactive Node.js REPL loaded with the application context. |
80
80
  | `exports` | | Displays all available `@exisjs` and `exisjs/*` subpath exports. |
81
81
  | `info` | | Displays system, Node.js, and ExisJS runtime information. |
82
+ | `doctor` | | Performs system, native Rust acceleration, TypeScript, and routing diagnostics. |
82
83
  | `init` | | Initializes a new ExisJS application in the current directory. |
@@ -140,7 +140,14 @@ Here is a full breakdown of the configuration schema:
140
140
 
141
141
  ### Global Middleware
142
142
 
143
- - `cors` _(object | boolean)_: Global CORS policy configuration (`origin`, `methods`, `credentials`, etc.).
143
+ - `cors` _(object | boolean)_: Global CORS policy configuration. Supports:
144
+ - Exact string origins (e.g. `'https://example.com'` or `'*'`).
145
+ - Regular expressions (e.g. `/localhost:\d+/`).
146
+ - Arrays mixing strings and regexes (`['https://app.example.com', /https:\/\/.*\.domain\.com/']`).
147
+ - Dynamic callbacks: `(origin, cb) => ...` or async functions: `async (origin) => boolean` for multi-tenant setups.
148
+ - `transformResponse` _(boolean | function)_: Automatically wraps all successful handler responses into a standardized envelope:
149
+ - When `true`: `{ success: true, data: ..., timestamp: ... }` (matching `HttpError`'s `{ success: false, error: ... }`).
150
+ - When a function: `(data, req, res) => ({ ... })` to provide your own custom envelope.
144
151
  - `helmet` _(object | boolean)_: Automatically secures your app with standard HTTP headers. (Enabled by default).
145
152
  - `compression` _(object | boolean)_: Enables Gzip/Brotli compression for all HTTP responses.
146
153
  - `logger` _(object | boolean)_: Configures the internal Pino-based logger (`level`, `pretty`).
@@ -247,8 +247,8 @@ You can use the `metrics` middleware to track request durations and counts.
247
247
 
248
248
  ### Functional Paradigm
249
249
 
250
- ```typescript filename="src/http/gateway.ts"
251
- import { defineGateway } from 'exisjs/router'
250
+ ```typescript filename="src/http/boundary.ts"
251
+ import { defineBoundary } from 'exisjs/router'
252
252
  import { metrics } from 'exisjs/observability'
253
253
 
254
254
  const myPrometheusAdapter = {
@@ -261,15 +261,15 @@ const myPrometheusAdapter = {
261
261
  }
262
262
  }
263
263
 
264
- export default defineGateway({
264
+ export const config = defineBoundary({
265
265
  middleware: [metrics(myPrometheusAdapter)]
266
266
  })
267
267
  ```
268
268
 
269
269
  ### Class-Based (OOP) Paradigm
270
270
 
271
- ```typescript filename="src/http/gateway.ts"
272
- import { Gateway } from 'exisjs/decorators'
271
+ ```typescript filename="src/http/boundary.ts"
272
+ import { Boundary } from 'exisjs/decorators'
273
273
  import { metrics } from 'exisjs/observability'
274
274
 
275
275
  const myPrometheusAdapter = {
@@ -280,10 +280,10 @@ const myPrometheusAdapter = {
280
280
  }
281
281
  }
282
282
 
283
- @Gateway({
283
+ @Boundary({
284
284
  middleware: [metrics(myPrometheusAdapter)]
285
285
  })
286
- export default class RootGateway {}
286
+ export default class RootBoundary {}
287
287
  ```
288
288
 
289
289
  *Note: ExisJS normalizes dynamic paths (e.g., turning `/users/123` into `/users/:id`) to prevent metrics cardinality issues.*
@@ -294,8 +294,8 @@ ExisJS seamlessly integrates with OpenTelemetry (OTel) via the `tracing` middlew
294
294
 
295
295
  ### Functional Paradigm
296
296
 
297
- ```typescript filename="src/http/gateway.ts"
298
- import { defineGateway } from 'exisjs/router'
297
+ ```typescript filename="src/http/boundary.ts"
298
+ import { defineBoundary } from 'exisjs/router'
299
299
  import { tracing } from 'exisjs/observability'
300
300
 
301
301
  const myOtelAdapter = {
@@ -312,15 +312,15 @@ const myOtelAdapter = {
312
312
  }
313
313
  }
314
314
 
315
- export default defineGateway({
315
+ export const config = defineBoundary({
316
316
  middleware: [tracing(myOtelAdapter)]
317
317
  })
318
318
  ```
319
319
 
320
320
  ### Class-Based (OOP) Paradigm
321
321
 
322
- ```typescript filename="src/http/gateway.ts"
323
- import { Gateway } from 'exisjs/decorators'
322
+ ```typescript filename="src/http/boundary.ts"
323
+ import { Boundary } from 'exisjs/decorators'
324
324
  import { tracing } from 'exisjs/observability'
325
325
 
326
326
  const myOtelAdapter = {
@@ -335,10 +335,10 @@ const myOtelAdapter = {
335
335
  }
336
336
  }
337
337
 
338
- @Gateway({
338
+ @Boundary({
339
339
  middleware: [tracing(myOtelAdapter)]
340
340
  })
341
- export default class RootGateway {}
341
+ export default class RootBoundary {}
342
342
  ```
343
343
 
344
344
  By providing these standard interfaces natively, your application metrics and traces are bound to the ExisJS router lifecycle.
@@ -269,3 +269,109 @@ ExisJS features native, automatic ETag generation.
269
269
  If the client sends an `If-None-Match` header matching the ETag of the current response, ExisJS will immediately abort serialization and send a `304 Not Modified` header with an empty body, saving bandwidth and CPU cycles.
270
270
 
271
271
  *Note: ETag generation is disabled by default, but can be enabled globally in your `exis()` config, or manually per-route via `res.etagEnabled = true`.*
272
+
273
+ ---
274
+
275
+ ## 7. Server-Sent Events (SSE) & AI Streaming
276
+
277
+ ExisJS provides a first-class `res.sse()` method for real-time live events and AI chat completions (OpenAI, Anthropic, Ollama, LangChain).
278
+
279
+ When called, `res.sse()` automatically configures and flushes the required HTTP headers:
280
+ - `Content-Type: text/event-stream; charset=utf-8`
281
+ - `Cache-Control: no-cache, no-transform`
282
+ - `Connection: keep-alive`
283
+ - `X-Accel-Buffering: no` (disables NGINX proxy buffering)
284
+
285
+ You can import `SSEStream`, `formatSSEEvent`, `SSEMessage`, and `SSEOptions` from `exisjs/router`.
286
+
287
+ ### Basic SSE Stream
288
+
289
+ #### Functional Paradigm
290
+
291
+ ```typescript filename="src/http/events/route.ts"
292
+ import { controller, route } from 'exisjs/router'
293
+
294
+ export default controller({
295
+ liveEvents: route.get('/', {
296
+ handle(req, res) {
297
+ // Initialize the stream (heartbeat ping every 15s by default)
298
+ const sse = res.sse()
299
+
300
+ sse.send({ event: 'connected', data: { timestamp: Date.now() } })
301
+
302
+ const interval = setInterval(() => {
303
+ sse.send({ event: 'price-update', data: { symbol: 'BTC', price: 95000 } })
304
+ }, 1000)
305
+
306
+ // Automatically clean up intervals when the client disconnects or closes the tab
307
+ sse.onClose(() => {
308
+ clearInterval(interval)
309
+ })
310
+ }
311
+ })
312
+ })
313
+ ```
314
+
315
+ #### Class-Based (OOP) Paradigm
316
+
317
+ ```typescript filename="src/http/events/route.ts"
318
+ import { Controller, Get, Res } from 'exisjs/decorators'
319
+ import type { Response } from 'exisjs/router'
320
+
321
+ @Controller()
322
+ export default class EventsController {
323
+ @Get('/events')
324
+ streamEvents(@Res() res: Response) {
325
+ const sse = res.sse()
326
+
327
+ sse.send({ event: 'connected', data: { status: 'ok' } })
328
+
329
+ sse.onClose(() => {
330
+ console.log('Client disconnected from SSE stream')
331
+ })
332
+ }
333
+ }
334
+ ```
335
+
336
+ ### AI / LLM Streaming with `sse.pipeFrom()`
337
+
338
+ You can directly stream chunks from any `AsyncIterable` (such as the OpenAI SDK or custom generators) using `sse.pipeFrom()`:
339
+
340
+ ```typescript filename="src/http/ai/route.ts"
341
+ import { controller, route } from 'exisjs/router'
342
+
343
+ export default controller({
344
+ chat: route.post('/', {
345
+ handle(req, res) {
346
+ res.sse(async (sse) => {
347
+ // Stream directly from an async generator or AI SDK
348
+ async function* generateTokens() {
349
+ yield 'Hello'
350
+ yield ' from'
351
+ yield ' ExisJS'
352
+ yield ' AI streaming!'
353
+ }
354
+
355
+ await sse.pipeFrom(generateTokens(), (token) => ({
356
+ event: 'delta',
357
+ data: { text: token }
358
+ }))
359
+
360
+ sse.close()
361
+ })
362
+ }
363
+ })
364
+ })
365
+ ```
366
+
367
+ ### SSE Options & Methods
368
+
369
+ - `res.sse(options?)`: Options include:
370
+ - `heartbeat`: Heartbeat interval in milliseconds (default: `15000`). Pass `false` to disable.
371
+ - `heartbeatComment`: Custom comment string for keep-alive pings (default: `": ping\n\n"`).
372
+ - `headers`: Additional custom HTTP headers.
373
+ - `sse.send(message)`: Sends an event. Accepts string, number, object (auto JSON-stringified), or `{ event, data, id, retry }`.
374
+ - `sse.comment(text)`: Sends a raw SSE comment line (e.g. `: ping\n\n`) without triggering client-side event listeners.
375
+ - `sse.onClose(callback)`: Registers a callback fired when the client disconnects.
376
+ - `sse.close()`: Gracefully terminates the stream and closes the HTTP response.
377
+
@@ -15,11 +15,11 @@ ExisJS natively supports both a **Functional Paradigm** and a **Class-Based OOP
15
15
 
16
16
  ExisJS uses **folder-based file-system routing** instead of programmatic route declaration in a single entry file.
17
17
 
18
- For a folder to become an accessible API endpoint, it must contain a `route.ts` file that exports a route definition.
18
+ For a folder to become an accessible API endpoint, it must contain a `route.ts` or `<feature>.route.ts` (e.g. `user.route.ts`) file that exports a route definition.
19
19
 
20
20
  In addition to `route.ts`, the ExisJS router utilizes two other special gatekeeper files:
21
21
  - **`server.ts`**: Placed at the root of your `http` directory, it is the entry point that boots your application, registers global plugins, and connects to databases.
22
- - **`gateway.ts`**: Can be placed in any folder. It acts as a gatekeeper, automatically applying middleware, CORS, headers, and dependencies to *all* routes within its directory and subdirectories.
22
+ - **`boundary.ts`** (or `*.boundary.ts`): Can be placed in any folder. It acts as a gatekeeper and request pipeline, automatically configuring middleware, CORS, headers, and dependencies for *all* routes within its directory and subdirectories.
23
23
 
24
24
  ### Routing Conventions
25
25
 
@@ -38,9 +38,9 @@ The `server.ts` file acts as the root configuration for your application. It pro
38
38
  import { exis } from 'exisjs'
39
39
 
40
40
  export default exis({
41
- async onStart(app) {
42
- // Boot your database here!
43
- }
41
+ providers: [
42
+ ['LoggerService', { useValue: console }]
43
+ ]
44
44
  })
45
45
  ```
46
46
 
@@ -59,27 +59,27 @@ export default class RootServer {
59
59
  }
60
60
  ```
61
61
 
62
- ### Folder Gateways (`gateway.ts`)
62
+ ### Folder Boundaries (`boundary.ts`)
63
63
 
64
- Gateways apply configurations to all routes in their directory and subdirectories.
64
+ Boundaries apply configurations, security policies, and request pipelines to all routes in their directory and subdirectories.
65
65
 
66
66
  #### Functional Paradigm
67
- ```typescript filename="src/http/admin/gateway.ts"
68
- import { defineGateway } from 'exisjs/router'
67
+ ```typescript filename="src/http/admin/boundary.ts"
68
+ import { defineBoundary } from 'exisjs/router'
69
69
 
70
- export default defineGateway({
70
+ export const config = defineBoundary({
71
71
  headers: { 'X-Admin-Area': 'true' }
72
72
  })
73
73
  ```
74
74
 
75
75
  #### Class-Based (OOP) Paradigm
76
- ```typescript filename="src/http/admin/gateway.ts"
77
- import { Gateway } from 'exisjs/decorators'
76
+ ```typescript filename="src/http/admin/boundary.ts"
77
+ import { Boundary } from 'exisjs/decorators'
78
78
 
79
- @Gateway({
79
+ @Boundary({
80
80
  headers: { 'X-Admin-Area': 'true' }
81
81
  })
82
- export default class AdminGateway {}
82
+ export default class AdminBoundary {}
83
83
  ```
84
84
 
85
85
  ### Route Definitions (`route.ts`)
@@ -264,13 +264,18 @@ export default controller({
264
264
  }),
265
265
  getSingle: route.get('/:id', {
266
266
  handle({ params }) {
267
+ // params.id is automatically inferred as string with full autocomplete!
267
268
  const { id } = params
268
- return { message: \`Fetching user \${id}\` }
269
+ return { message: `Fetching user ${id}` }
269
270
  }
270
271
  })
271
272
  })
272
273
  ```
273
274
 
275
+ <Info title="Automatic Route Parameter Type Inference">
276
+ In ExisJS v0.7+, paths with named parameters like `route.get('/users/:userId/posts/:postId', ...)` automatically parse the path string literal to infer `params: { userId: string; postId: string }` on the `handle` context. No manual casting or boilerplate interfaces required.
277
+ </Info>
278
+
274
279
 
275
280
  #### Class-Based (OOP) Paradigm
276
281
 
@@ -16,18 +16,23 @@ The following security middlewares are available from `exisjs/middleware` and ca
16
16
  - `helmet(options?)`: Sets 14+ secure HTTP headers (Strict-Transport-Security, X-Content-Type-Options: nosniff, X-Frame-Options: DENY, and CSP).
17
17
  - `csrf(options)`: Enforces the Signed Double Submit Cookie pattern to protect state-changing requests (POST, PUT, DELETE) from CSRF attacks.
18
18
  - `hpp()`: Protects against HTTP Parameter Pollution attacks by ensuring array query parameters/form fields are safely handled.
19
+ - `mongoSanitize()`: Strips MongoDB operator keys (keys starting with `$` or containing `.`) from `req.body`, `req.query`, and `req.params`.
19
20
  - `dbSanitize(options?)`: Protects against NoSQL query operator injection (`$where` and other malicious keys) before reaching database layers.
20
21
  - `timeout(ms)`: Automatically terminates requests that exceed the specified timeout limit, returning a 503 response.
21
22
 
23
+ > [!TIP]
24
+ > Security middlewares like `hpp()`, `mongoSanitize()`, and `dbSanitize()` automatically synchronize with the request body parser. If registered globally before route handlers, they safely await the body and sanitize it deterministically without runtime crashes.
25
+
22
26
  ```typescript filename="src/http/server.ts"
23
27
  import { exis } from 'exisjs'
24
- import { helmet, csrf, timeout, hpp } from 'exisjs/middleware'
28
+ import { helmet, csrf, timeout, hpp, mongoSanitize } from 'exisjs/middleware'
25
29
 
26
30
  export default exis({
27
31
  async onStart(app) {
28
32
  app.use(helmet())
29
33
  app.use(timeout(10000))
30
34
  app.use(hpp())
35
+ app.use(mongoSanitize())
31
36
  }
32
37
  })
33
38
  ```
@@ -60,12 +60,18 @@ my-backend/
60
60
  A file's name declares its role. Functional vs. class-based (OOP) only changes
61
61
  _syntax_, never _responsibility_.
62
62
 
63
- | File | Role | Never contains |
64
- | ------------- | ---------------------------------------------------------------------------------------------------- | -------------------------------- |
65
- | `route.ts` | Binds a URL + method to a handler. | Business logic, validation logic |
66
- | `schema.ts` | `tex` validation schemas, imported by `route.ts`. Mandatory for every `route.ts` that accepts input. | Handlers, routing |
67
- | `service.ts` | Business logic and data access. DI-injectable. | Routing, response shaping |
68
- | `boundary.ts` | Folder-scoped config + request pipeline for everything in this folder and below. | — |
63
+ ExisJS supports two naming conventions seamlessly:
64
+ 1. **Standard Flat Names** (default): `route.ts`, `schema.ts`, `service.ts`, `boundary.ts`.
65
+ 2. **Feature-Prefixed Named Files**: `<name>.route.ts`, `<name>.schema.ts`, `<name>.service.ts`, `<name>.boundary.ts` (e.g., `user.route.ts`, `user.schema.ts`, `user.service.ts`).
66
+
67
+ Both styles are automatically detected by the route scanner, CLI manifest generator, and development watcher with 100% parity.
68
+
69
+ | File Pattern | Role | Never contains |
70
+ | :--- | :--- | :--- |
71
+ | `route.ts` / `*.route.ts` | Binds a URL + method to a handler. | Business logic, validation logic |
72
+ | `schema.ts` / `*.schema.ts` | `tex` validation schemas, imported by route files. Mandatory for every route accepting input. | Handlers, routing |
73
+ | `service.ts` / `*.service.ts` | Business logic and data access. DI-injectable. | Routing, response shaping |
74
+ | `boundary.ts` / `*.boundary.ts` | Folder-scoped config + request pipeline for everything in this folder and below. | — |
69
75
 
70
76
  ---
71
77
 
@@ -61,6 +61,14 @@ async function start() {
61
61
  // 1. Load .env files so process.env is populated
62
62
  const { loadEnv } = await Promise.resolve().then(() => __importStar(require('../config/env.js')));
63
63
  loadEnv(cwd);
64
+ // Register path aliases loader
65
+ try {
66
+ const { registerPathAliasLoader } = await Promise.resolve().then(() => __importStar(require('../cli/resolve-aliases.js')));
67
+ registerPathAliasLoader(cwd);
68
+ }
69
+ catch {
70
+ // ignore
71
+ }
64
72
  // 2. Auto-load Environment variables validation file if it exists
65
73
  const envFiles = [
66
74
  path.join(cwd, 'src', 'config', 'env.ts'),
@@ -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":"compression.d.ts","sourceRoot":"","sources":["../../src/middleware/compression.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAqB,MAAM,UAAU,CAAA;AAE1D;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,IAAI,OAAO,CAiFrC"}
1
+ {"version":3,"file":"compression.d.ts","sourceRoot":"","sources":["../../src/middleware/compression.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAqB,MAAM,UAAU,CAAA;AAE1D;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,IAAI,OAAO,CAgGrC"}
@@ -59,21 +59,36 @@ function compression() {
59
59
  res.raw.setHeader('Vary', 'Accept-Encoding');
60
60
  // Remove Content-Length since compressed size will differ
61
61
  res.raw.removeHeader('Content-Length');
62
- // Compress synchronously for small-to-medium payloads to avoid extra async overhead
62
+ // Compress using hardware-accelerated Rust engine (@exisjs/rs) if available, with graceful zlib fallback
63
63
  let compressed;
64
64
  try {
65
65
  if (selectedEncoding === 'br') {
66
- compressed = node_zlib_1.default.brotliCompressSync(buf);
66
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
67
+ const rs = require('@exisjs/rs');
68
+ compressed =
69
+ typeof rs.brotliCompress === 'function'
70
+ ? rs.brotliCompress(buf)
71
+ : node_zlib_1.default.brotliCompressSync(buf);
67
72
  }
68
73
  else if (selectedEncoding === 'gzip') {
69
- compressed = node_zlib_1.default.gzipSync(buf);
74
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
75
+ const rs = require('@exisjs/rs');
76
+ compressed =
77
+ typeof rs.gzipCompress === 'function'
78
+ ? rs.gzipCompress(buf)
79
+ : node_zlib_1.default.gzipSync(buf);
70
80
  }
71
81
  else {
72
- compressed = node_zlib_1.default.deflateSync(buf);
82
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
83
+ const rs = require('@exisjs/rs');
84
+ compressed =
85
+ typeof rs.deflateCompress === 'function'
86
+ ? rs.deflateCompress(buf)
87
+ : node_zlib_1.default.deflateSync(buf);
73
88
  }
74
89
  }
75
90
  catch {
76
- // If compression fails, send uncompressed
91
+ // If native or zlib compression fails, send uncompressed
77
92
  originalEnd(data);
78
93
  return;
79
94
  }
@@ -1 +1 @@
1
- {"version":3,"file":"compression.js","sourceRoot":"","sources":["../../src/middleware/compression.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"compression.js","sourceRoot":"","sources":["../../src/middleware/compression.ts"],"names":[],"mappings":"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"}
@@ -18,6 +18,9 @@ export * from './guard';
18
18
  export * from './pipe';
19
19
  export declare function serveStatic(root: string, options?: {
20
20
  maxAge?: number;
21
+ etag?: boolean;
22
+ brotli?: boolean;
23
+ gzip?: boolean;
21
24
  }): Handler;
22
25
  export interface ValidateSchema {
23
26
  body?: TexEngine<any>;