exisjs 0.5.12 → 0.6.1
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/README.md +1 -1
- package/dist/auth/jwt.d.ts +1 -1
- package/dist/auth/jwt.js +1 -1
- package/dist/auth/oauth/middleware.js +1 -1
- package/dist/auth/rbac.js +1 -1
- package/dist/cli/commands/build.d.ts.map +1 -1
- package/dist/cli/commands/build.js +9 -1
- 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 +69 -5
- package/dist/cli/commands/dev.js.map +1 -1
- package/dist/cli/commands/exports.js +2 -2
- package/dist/cli/commands/exports.js.map +1 -1
- package/dist/cli/commands/generate.d.ts +22 -1
- package/dist/cli/commands/generate.d.ts.map +1 -1
- package/dist/cli/commands/generate.js +110 -52
- package/dist/cli/commands/generate.js.map +1 -1
- package/dist/cli/commands/test.js +2 -2
- package/dist/cli/commands/test.js.map +1 -1
- package/dist/cli/index.js +53 -24
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/routes.js +1 -1
- package/dist/cli/routes.js.map +1 -1
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js.map +1 -0
- package/dist/config/env.d.ts.map +1 -0
- package/dist/config/env.js.map +1 -0
- package/dist/config/index.d.ts +1 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +3 -2
- package/dist/config/index.js.map +1 -1
- package/dist/config/types.d.ts +98 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +3 -0
- package/dist/config/types.js.map +1 -0
- package/dist/cron/scheduler.d.ts.map +1 -1
- package/dist/cron/scheduler.js +3 -1
- package/dist/cron/scheduler.js.map +1 -1
- package/dist/database/adapters/mysql.d.ts +1 -1
- package/dist/database/adapters/mysql.js +1 -1
- package/dist/database/adapters/postgres.d.ts +1 -1
- package/dist/database/adapters/postgres.js +1 -1
- package/dist/database/adapters/sqlite.d.ts +1 -1
- package/dist/database/adapters/sqlite.js +1 -1
- package/dist/database/manager.d.ts +28 -1
- package/dist/database/manager.d.ts.map +1 -1
- package/dist/database/manager.js +69 -1
- package/dist/database/manager.js.map +1 -1
- package/dist/database/query-builder.d.ts +6 -0
- package/dist/database/query-builder.d.ts.map +1 -1
- package/dist/database/query-builder.js +56 -5
- package/dist/database/query-builder.js.map +1 -1
- package/dist/database/sql/index.d.ts +18 -0
- package/dist/database/sql/index.d.ts.map +1 -0
- package/dist/database/sql/index.js +74 -0
- package/dist/database/sql/index.js.map +1 -0
- package/dist/database/sql/schema.d.ts +38 -0
- package/dist/database/sql/schema.d.ts.map +1 -0
- package/dist/database/sql/schema.js +80 -0
- package/dist/database/sql/schema.js.map +1 -0
- package/dist/database/synchronizer.d.ts +12 -0
- package/dist/database/synchronizer.d.ts.map +1 -0
- package/dist/database/synchronizer.js +82 -0
- package/dist/database/synchronizer.js.map +1 -0
- package/dist/decorators/core/engine.d.ts +43 -0
- package/dist/decorators/core/engine.d.ts.map +1 -0
- package/dist/decorators/core/engine.js +77 -0
- package/dist/decorators/core/engine.js.map +1 -0
- package/dist/decorators/core/index.d.ts +3 -0
- package/dist/decorators/core/index.d.ts.map +1 -0
- package/dist/decorators/core/index.js +19 -0
- package/dist/decorators/core/index.js.map +1 -0
- package/dist/decorators/core/metadata.d.ts +23 -0
- package/dist/decorators/core/metadata.d.ts.map +1 -0
- package/dist/decorators/core/metadata.js +42 -0
- package/dist/decorators/core/metadata.js.map +1 -0
- package/dist/decorators/core.d.ts.map +1 -1
- package/dist/decorators/core.js +36 -49
- package/dist/decorators/core.js.map +1 -1
- package/dist/decorators/index.d.ts +1 -0
- package/dist/decorators/index.d.ts.map +1 -1
- package/dist/decorators/index.js +1 -0
- package/dist/decorators/index.js.map +1 -1
- package/dist/decorators/params.d.ts.map +1 -1
- package/dist/decorators/params.js +12 -14
- package/dist/decorators/params.js.map +1 -1
- package/dist/decorators/routing.d.ts.map +1 -1
- package/dist/decorators/routing.js +4 -6
- package/dist/decorators/routing.js.map +1 -1
- package/dist/dev/dep-graph.d.ts.map +1 -0
- package/dist/dev/dep-graph.js.map +1 -0
- package/dist/{server/dev-error-overlay.d.ts → dev/error-overlay.d.ts} +1 -1
- package/dist/dev/error-overlay.d.ts.map +1 -0
- package/dist/{server/dev-error-overlay.js → dev/error-overlay.js} +1 -1
- package/dist/dev/error-overlay.js.map +1 -0
- package/dist/dev/hot-reload.d.ts.map +1 -0
- package/dist/{server → dev}/hot-reload.js +14 -7
- package/dist/dev/hot-reload.js.map +1 -0
- package/dist/docs/ARCHITECTURE.md +5 -5
- package/dist/docs/content/controllers.mdx +1 -1
- package/dist/docs/content/cron.mdx +1 -1
- package/dist/docs/content/database.mdx +141 -72
- package/dist/docs/content/errors.mdx +1 -1
- package/dist/docs/content/gateways.mdx +1 -1
- package/dist/docs/content/providers.mdx +1 -1
- package/dist/docs/content/queues.mdx +2 -2
- package/dist/docs/content/structure.mdx +71 -21
- package/dist/docs/content/testing.mdx +2 -2
- package/dist/docs/integrations/openai.mdx +1 -1
- package/dist/docs/integrations/resend.mdx +1 -1
- package/dist/docs/integrations/s3.mdx +1 -1
- package/dist/docs/reference/cache.mdx +1 -1
- package/dist/docs/reference/config.mdx +2 -2
- package/dist/docs/reference/di.mdx +2 -2
- package/dist/docs/reference/middleware.mdx +4 -4
- package/dist/docs/reference/router.mdx +1 -1
- package/dist/docs/reference/validator.mdx +2 -2
- package/dist/{utils → error}/errors.d.ts.map +1 -1
- package/dist/{utils → error}/errors.js.map +1 -1
- package/dist/error/index.d.ts +1 -1
- package/dist/error/index.d.ts.map +1 -1
- package/dist/error/index.js +1 -1
- package/dist/error/index.js.map +1 -1
- package/dist/index.d.ts +3 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -13
- package/dist/index.js.map +1 -1
- package/dist/lib/start-repl.js +3 -5
- package/dist/lib/start-repl.js.map +1 -1
- package/dist/lib/start-server.js +5 -7
- package/dist/lib/start-server.js.map +1 -1
- package/dist/middleware/backpressure.js +1 -1
- package/dist/middleware/ip-filter.js +1 -1
- package/dist/middleware/middleware.d.ts +1 -1
- package/dist/middleware/middleware.d.ts.map +1 -1
- package/dist/middleware/middleware.js +1 -1
- package/dist/middleware/middleware.js.map +1 -1
- package/dist/middleware/rate-limit.js +1 -1
- package/dist/middleware/security.js +1 -1
- package/dist/observability/metrics.d.ts +2 -2
- package/dist/observability/metrics.d.ts.map +1 -1
- package/dist/observability/metrics.js +1 -1
- package/dist/observability/metrics.js.map +1 -1
- package/dist/observability/prometheus.d.ts +1 -1
- package/dist/observability/prometheus.js +1 -1
- package/dist/{utils/plugin.d.ts → plugin/define.d.ts} +1 -1
- package/dist/plugin/define.d.ts.map +1 -0
- package/dist/{utils/plugin.js → plugin/define.js} +1 -1
- package/dist/plugin/define.js.map +1 -0
- package/dist/plugin/index.d.ts +1 -1
- package/dist/plugin/index.d.ts.map +1 -1
- package/dist/plugin/index.js +2 -2
- package/dist/plugin/index.js.map +1 -1
- package/dist/{server/plugin-manager.d.ts → plugin/manager.d.ts} +2 -2
- package/dist/plugin/manager.d.ts.map +1 -0
- package/dist/{server/plugin-manager.js → plugin/manager.js} +1 -1
- package/dist/plugin/manager.js.map +1 -0
- package/dist/plugin/types.d.ts +23 -0
- package/dist/plugin/types.d.ts.map +1 -0
- package/dist/plugin/types.js +3 -0
- package/dist/plugin/types.js.map +1 -0
- package/dist/{server/queue-manager.d.ts → queue/manager.d.ts} +2 -2
- package/dist/queue/manager.d.ts.map +1 -0
- package/dist/{server/queue-manager.js → queue/manager.js} +1 -1
- package/dist/queue/manager.js.map +1 -0
- package/dist/{server → router}/controller-registrar.d.ts +1 -1
- package/dist/{server → router}/controller-registrar.d.ts.map +1 -1
- package/dist/{server → router}/controller-registrar.js +12 -3
- package/dist/router/controller-registrar.js.map +1 -0
- package/dist/router/index.d.ts +3 -3
- package/dist/router/index.js +5 -5
- package/dist/router/index.js.map +1 -1
- package/dist/{server/route.d.ts → router/route-builder.d.ts} +3 -3
- package/dist/router/route-builder.d.ts.map +1 -0
- package/dist/{server/route.js → router/route-builder.js} +1 -1
- package/dist/router/route-builder.js.map +1 -0
- package/dist/{server → router}/route-scanner.d.ts +2 -1
- package/dist/router/route-scanner.d.ts.map +1 -0
- package/dist/{server → router}/route-scanner.js +83 -13
- package/dist/router/route-scanner.js.map +1 -0
- package/dist/router/types.d.ts +89 -0
- package/dist/router/types.d.ts.map +1 -0
- package/dist/router/types.js +3 -0
- package/dist/router/types.js.map +1 -0
- package/dist/sanitize/index.d.ts +2 -2
- package/dist/sanitize/index.js +3 -3
- package/dist/sanitize/sanitize.d.ts.map +1 -0
- package/dist/sanitize/sanitize.js.map +1 -0
- package/dist/server/app.d.ts +7 -7
- package/dist/server/app.d.ts.map +1 -1
- package/dist/server/app.js +12 -12
- package/dist/server/app.js.map +1 -1
- package/dist/server/bootstrapper.d.ts.map +1 -1
- package/dist/server/bootstrapper.js +12 -0
- package/dist/server/bootstrapper.js.map +1 -1
- package/dist/server/request-handler.js +1 -1
- package/dist/server/request.js +1 -1
- package/dist/testing/mocks.d.ts.map +1 -1
- package/dist/testing/mocks.js +5 -0
- package/dist/testing/mocks.js.map +1 -1
- package/dist/types.d.ts +3 -203
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +17 -0
- package/dist/types.js.map +1 -1
- package/dist/validator/index.d.ts +2 -2
- package/dist/validator/index.d.ts.map +1 -1
- package/dist/validator/index.js +1 -1
- package/dist/validator/index.js.map +1 -1
- package/dist/validator/validator.d.ts.map +1 -0
- package/dist/validator/validator.js.map +1 -0
- package/dist/{server/ws-orchestrator.d.ts → websocket/orchestrator.d.ts} +2 -2
- package/dist/websocket/orchestrator.d.ts.map +1 -0
- package/dist/{server/ws-orchestrator.js → websocket/orchestrator.js} +3 -3
- package/dist/websocket/orchestrator.js.map +1 -0
- package/package.json +11 -3
- package/dist/server/controller-registrar.js.map +0 -1
- package/dist/server/dep-graph.d.ts.map +0 -1
- package/dist/server/dep-graph.js.map +0 -1
- package/dist/server/dev-error-overlay.d.ts.map +0 -1
- package/dist/server/dev-error-overlay.js.map +0 -1
- package/dist/server/hot-reload.d.ts.map +0 -1
- package/dist/server/hot-reload.js.map +0 -1
- package/dist/server/plugin-manager.d.ts.map +0 -1
- package/dist/server/plugin-manager.js.map +0 -1
- package/dist/server/queue-manager.d.ts.map +0 -1
- package/dist/server/queue-manager.js.map +0 -1
- package/dist/server/route-scanner.d.ts.map +0 -1
- package/dist/server/route-scanner.js.map +0 -1
- package/dist/server/route.d.ts.map +0 -1
- package/dist/server/route.js.map +0 -1
- package/dist/server/ws-orchestrator.d.ts.map +0 -1
- package/dist/server/ws-orchestrator.js.map +0 -1
- package/dist/utils/config.d.ts.map +0 -1
- package/dist/utils/config.js.map +0 -1
- package/dist/utils/env.d.ts.map +0 -1
- package/dist/utils/env.js.map +0 -1
- package/dist/utils/plugin.d.ts.map +0 -1
- package/dist/utils/plugin.js.map +0 -1
- package/dist/utils/sanitize.d.ts.map +0 -1
- package/dist/utils/sanitize.js.map +0 -1
- package/dist/utils/validator.d.ts.map +0 -1
- package/dist/utils/validator.js.map +0 -1
- /package/dist/{utils → config}/config.d.ts +0 -0
- /package/dist/{utils → config}/config.js +0 -0
- /package/dist/{utils → config}/env.d.ts +0 -0
- /package/dist/{utils → config}/env.js +0 -0
- /package/dist/{server → dev}/dep-graph.d.ts +0 -0
- /package/dist/{server → dev}/dep-graph.js +0 -0
- /package/dist/{server → dev}/hot-reload.d.ts +0 -0
- /package/dist/{utils → error}/errors.d.ts +0 -0
- /package/dist/{utils → error}/errors.js +0 -0
- /package/dist/{utils → sanitize}/sanitize.d.ts +0 -0
- /package/dist/{utils → sanitize}/sanitize.js +0 -0
- /package/dist/{utils → validator}/validator.d.ts +0 -0
- /package/dist/{utils → validator}/validator.js +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dep-graph.js","sourceRoot":"","sources":["../../src/dev/dep-graph.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-overlay.d.ts","sourceRoot":"","sources":["../../src/dev/error-overlay.ts"],"names":[],"mappings":"AA8FA,wBAAgB,cAAc,CAAC,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CA4BnE;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAavE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-overlay.js","sourceRoot":"","sources":["../../src/dev/error-overlay.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hot-reload.d.ts","sourceRoot":"","sources":["../../src/dev/hot-reload.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAsB9C,UAAU,kBAAkB;IAC1B,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC7B,UAAU,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAClE,UAAU,EAAE,MAAM,IAAI,CAAA;CACvB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,UAAU,CAAwD;IAC1E,OAAO,CAAC,UAAU,CAAY;IAC9B,OAAO,CAAC,OAAO,CAA4C;IAC3D,OAAO,CAAC,QAAQ,CAAiC;gBAErC,IAAI,EAAE,kBAAkB;IAQ9B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA+C5B,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,aAAa;YAKP,gBAAgB;YA6BhB,YAAY;YAyCZ,SAAS;IAiCvB,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,mBAAmB;IAoCrB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAM5B"}
|
|
@@ -38,8 +38,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
39
|
exports.HotReloader = void 0;
|
|
40
40
|
const node_path_1 = __importDefault(require("node:path"));
|
|
41
|
-
const
|
|
42
|
-
const dep_graph_1 = require("
|
|
41
|
+
const error_overlay_1 = require("../dev/error-overlay");
|
|
42
|
+
const dep_graph_1 = require("../dev/dep-graph");
|
|
43
43
|
const c = {
|
|
44
44
|
green: '\x1b[32m',
|
|
45
45
|
cyan: '\x1b[36m',
|
|
@@ -49,6 +49,13 @@ const c = {
|
|
|
49
49
|
bold: '\x1b[1m',
|
|
50
50
|
reset: '\x1b[0m',
|
|
51
51
|
};
|
|
52
|
+
function ts() {
|
|
53
|
+
const now = new Date();
|
|
54
|
+
const h = String(now.getHours()).padStart(2, '0');
|
|
55
|
+
const m = String(now.getMinutes()).padStart(2, '0');
|
|
56
|
+
const s = String(now.getSeconds()).padStart(2, '0');
|
|
57
|
+
return `${c.gray}[${h}:${m}:${s}]${c.reset}`;
|
|
58
|
+
}
|
|
52
59
|
class HotReloader {
|
|
53
60
|
constructor(opts) {
|
|
54
61
|
this.watcher = null;
|
|
@@ -157,10 +164,10 @@ class HotReloader {
|
|
|
157
164
|
const relative = node_path_1.default
|
|
158
165
|
.relative(process.cwd(), normalized)
|
|
159
166
|
.replace(/\\/g, '/');
|
|
160
|
-
console.log(
|
|
167
|
+
console.log(`${ts()} ${c.green}HMR:${c.reset} Reloaded ${c.cyan}${relative}${c.reset} in ${elapsed}ms`);
|
|
161
168
|
}
|
|
162
169
|
catch (err) {
|
|
163
|
-
(0,
|
|
170
|
+
(0, error_overlay_1.formatDevError)(err, normalized);
|
|
164
171
|
}
|
|
165
172
|
}
|
|
166
173
|
async handleAdd(filePath) {
|
|
@@ -184,10 +191,10 @@ class HotReloader {
|
|
|
184
191
|
const relative = node_path_1.default
|
|
185
192
|
.relative(process.cwd(), normalized)
|
|
186
193
|
.replace(/\\/g, '/');
|
|
187
|
-
console.log(
|
|
194
|
+
console.log(`${ts()} ${c.green}HMR:${c.reset} Added route ${c.cyan}${relative}${c.reset} → ${c.yellow}${routePath}${c.reset}`);
|
|
188
195
|
}
|
|
189
196
|
catch (err) {
|
|
190
|
-
(0,
|
|
197
|
+
(0, error_overlay_1.formatDevError)(err, normalized);
|
|
191
198
|
}
|
|
192
199
|
}
|
|
193
200
|
handleDelete(filePath) {
|
|
@@ -198,7 +205,7 @@ class HotReloader {
|
|
|
198
205
|
const relative = node_path_1.default
|
|
199
206
|
.relative(process.cwd(), normalized)
|
|
200
207
|
.replace(/\\/g, '/');
|
|
201
|
-
console.log(
|
|
208
|
+
console.log(`${ts()} ${c.red}HMR:${c.reset} Removed route ${c.cyan}${relative}${c.reset} (${removed} handler${removed > 1 ? 's' : ''})`);
|
|
202
209
|
}
|
|
203
210
|
}
|
|
204
211
|
invalidateCache(filePath) {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hot-reload.js","sourceRoot":"","sources":["../../src/dev/hot-reload.ts"],"names":[],"mappings":"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"}
|
|
@@ -117,7 +117,7 @@ Test coverage here is dense and correctness-focused (string/number/boolean/objec
|
|
|
117
117
|
The framework achieves production optimizations directly within its core engine rather than relying on brittle post-processing build scripts:
|
|
118
118
|
|
|
119
119
|
- **AOT Routing (O(1) Boot Time)** — During `exis build`, `manifest.ts` generates a `.exis/routes-manifest.js` file. In production, `RouteScanner` detects this manifest and uses it to load routes instantly, skipping the expensive `fs.readdir` recursive scan entirely.
|
|
120
|
-
- **JIT Fast JSON Serialization** — During route registration at boot time, the `Router` checks if `fast-json-stringify` is installed. If a route has an ExisJS `v` response schema, the router automatically converts it to JSON Schema via `.toOpenApi()` and compiles an
|
|
120
|
+
- **JIT Fast JSON Serialization** — During route registration at boot time, the `Router` checks if `fast-json-stringify` is installed. If a route has an ExisJS `v` response schema, the router automatically converts it to JSON Schema via `.toOpenApi()` and compiles an optimized serializer Just-In-Time, attaching it to the route's response handler (`res._serializer`). This eliminates the need to precompile serializers to disk.
|
|
121
121
|
|
|
122
122
|
---
|
|
123
123
|
|
|
@@ -129,7 +129,7 @@ The framework achieves production optimizations directly within its core engine
|
|
|
129
129
|
|
|
130
130
|
- **Redis driver** (`queue/drivers/RedisDriver.ts`): pending jobs live in a Redis **sorted set** (`{prefix}:{name}:pending`, score = ready-at timestamp) with payloads stored separately in a **hash** (`{prefix}:{name}:payloads`). `enqueue()` uses a Lua script for atomic `ZADD` + `HSET` (with an optional max-queue-size check baked into the same script for backpressure). `poll()` atomically pops the earliest-ready job via `ZRANGEBYSCORE` + moves it to a `processing` zset with a visibility-timeout score, using another Lua script. `sweep()` periodically requeues anything left in `processing` past its visibility timeout (crash recovery for workers that died mid-job).
|
|
131
131
|
- **Memory driver** (`queue/drivers/MemoryDriver.ts`): the same conceptual model (pending list, processing list, sweep-based recovery) implemented with in-process arrays instead of Redis — correctly mirrors the Redis driver's semantics for single-process/dev use.
|
|
132
|
-
- **Job execution:** `ExisWorker` (`queue/worker.ts`) polls continuously (`setImmediate`-chained, with backoff on connection errors), and for jobs with a `filePath` (rather than an inline `handler`), dispatches execution to a `ThreadPool` (`threads/pool.ts`) — a
|
|
132
|
+
- **Job execution:** `ExisWorker` (`queue/worker.ts`) polls continuously (`setImmediate`-chained, with backoff on connection errors), and for jobs with a `filePath` (rather than an inline `handler`), dispatches execution to a `ThreadPool` (`threads/pool.ts`) — a integrated `worker_threads` pool — so CPU-heavy job handlers don't block the main event loop.
|
|
133
133
|
|
|
134
134
|
**Retry behavior:** on failure, `attemptsMade` increments and the job is requeued (with optional exponential/fixed backoff) if under `maxAttempts`; once attempts are exhausted, the job is moved to a dead-letter queue (`{prefix}:{name}:dead` in Redis, or a `deadLetter` list in Memory) and an `onJobFailedPermanently` hook is fired, ensuring no data is lost for permanently failed jobs.
|
|
135
135
|
|
|
@@ -170,7 +170,7 @@ The framework achieves production optimizations directly within its core engine
|
|
|
170
170
|
|
|
171
171
|
**What it is:** An optional high-throughput backend that swaps Node's native HTTP server for `uWebSockets.js`, auto-detected if installed (or forced via `server: 'uws'` config).
|
|
172
172
|
|
|
173
|
-
**How it's implemented:** `uws-adapter.ts` provides `UwsIncomingMessage`/`UwsServerResponse` shims that emulate the subset of Node's `IncomingMessage`/`ServerResponse` interface the rest of the framework depends on. Response writes use `res.cork()` to batch header/status/body into a single write. The shim correctly emulates asynchronous Node stream semantics (e.g., buffered `data`/`end` events delivered via microtasks for late listener registration), making it a robust and
|
|
173
|
+
**How it's implemented:** `uws-adapter.ts` provides `UwsIncomingMessage`/`UwsServerResponse` shims that emulate the subset of Node's `IncomingMessage`/`ServerResponse` interface the rest of the framework depends on. Response writes use `res.cork()` to batch header/status/body into a single write. The shim correctly emulates asynchronous Node stream semantics (e.g., buffered `data`/`end` events delivered via microtasks for late listener registration), making it a robust and efficient drop-in replacement.
|
|
174
174
|
|
|
175
175
|
---
|
|
176
176
|
|
|
@@ -245,7 +245,7 @@ The framework achieves production optimizations directly within its core engine
|
|
|
245
245
|
|
|
246
246
|
## 20. Security Middleware Suite
|
|
247
247
|
|
|
248
|
-
Split by actual strength, not lumped together as one "
|
|
248
|
+
Split by actual strength, not lumped together as one "Security Suite":
|
|
249
249
|
|
|
250
250
|
### 20a. Solid, standard-pattern implementations 🟢
|
|
251
251
|
|
|
@@ -291,7 +291,7 @@ Split by actual strength, not lumped together as one "Advanced Security Suite":
|
|
|
291
291
|
|
|
292
292
|
## 24. Native Test Runner Integration 🟢
|
|
293
293
|
|
|
294
|
-
**What it is:** A
|
|
294
|
+
**What it is:** A integrated test runner built on `node:test`, with a custom Jest/Vitest-style terminal reporter, a Jest-compatible `expect()` assertion library, and `createTestContext()` for booting a full `App` (DI container, database connections) inside tests without mocking.
|
|
295
295
|
|
|
296
296
|
**How it's implemented:** `testing/reporter.mts` consumes `node:test`'s async iterable of `TestEvent`s and renders grouped, colorized, file-scoped PASS/FAIL output with a Jest-style failure summary — genuinely nicer than raw TAP output. `testing/expect.ts` implements the common Jest matcher surface (`toBe`, `toEqual`, `toMatchObject`, `toHaveBeenCalledWith`, `resolves`/`rejects`, etc.) on top of `node:assert`. `createTestContext()` (`testing/index.ts`) wires `before`/`after` hooks that boot the app, and on teardown, correctly awaits and closes Mongoose, Redis, and Prisma connections if detected in use.
|
|
297
297
|
|
|
@@ -153,7 +153,7 @@ export default class UsersController {
|
|
|
153
153
|
}
|
|
154
154
|
```
|
|
155
155
|
|
|
156
|
-
##
|
|
156
|
+
## Extended Features
|
|
157
157
|
|
|
158
158
|
ExisJS provides routing enhancements like Subdomain Routing, Redirects, and Passthrough Responses. These are supported across both paradigms.
|
|
159
159
|
|
|
@@ -65,7 +65,7 @@ This guarantees that **your cron job will only execute exactly once per minute**
|
|
|
65
65
|
|
|
66
66
|
## 3. Supported Cron Syntax
|
|
67
67
|
|
|
68
|
-
ExisJS implements a
|
|
68
|
+
ExisJS implements a integrated cron parser that supports all standard operations:
|
|
69
69
|
|
|
70
70
|
- `*` - Any value (e.g., run every minute)
|
|
71
71
|
- `,` - Value list (e.g., `1,15,30` to run on the 1st, 15th, and 30th minute)
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: "Database Layer"
|
|
3
|
-
description: "ExisJS includes a built-in,
|
|
3
|
+
description: "ExisJS includes a built-in, efficient database layer with native support for PostgreSQL, MySQL, SQLite, and MongoDB, plus a powerful SQL-First auto-sync engine."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Database Layer
|
|
7
7
|
|
|
8
|
-
Unlike other Node.js frameworks that rely entirely on third-party ORMs like Prisma or TypeORM, **ExisJS ships with a fully integrated,
|
|
8
|
+
Unlike other Node.js frameworks that rely entirely on third-party ORMs like Prisma or TypeORM, **ExisJS ships with a fully integrated, efficient Database Layer.**
|
|
9
9
|
|
|
10
|
-
This provides a massive advantage in developer experience and reliability, as connections, query generation, and migrations are orchestrated directly by the framework.
|
|
10
|
+
This provides a massive advantage in developer experience and reliability, as connections, query generation, schema synchronization, and migrations are orchestrated directly by the framework.
|
|
11
11
|
|
|
12
12
|
<Info title="Functional vs OOP">
|
|
13
13
|
ExisJS natively supports both a **Functional Paradigm** and a **Class-Based OOP Paradigm** (for dependency injection and decorators). The database layer is seamlessly accessible through both approaches.
|
|
@@ -15,19 +15,23 @@ ExisJS natively supports both a **Functional Paradigm** and a **Class-Based OOP
|
|
|
15
15
|
|
|
16
16
|
## Setup and Connection
|
|
17
17
|
|
|
18
|
-
You configure your database connections directly in your application entry point (`server.ts`). ExisJS manages their lifecycle (including graceful shutdown) automatically.
|
|
19
|
-
|
|
20
18
|
#### Functional Paradigm
|
|
21
19
|
```typescript filename="src/http/server.ts"
|
|
22
|
-
import { exis
|
|
20
|
+
import { exis } from 'exisjs'
|
|
21
|
+
import { createDatabase } from 'exisjs/database'
|
|
22
|
+
import { userTable, leadCustomerTable } from '../database/schema'
|
|
23
23
|
|
|
24
24
|
export default exis({
|
|
25
25
|
async onStart(app) {
|
|
26
26
|
const database = createDatabase({
|
|
27
27
|
dialect: 'postgres',
|
|
28
28
|
url: process.env.DATABASE_URL,
|
|
29
|
+
autoSync: true // Enables automatic schema synchronization!
|
|
29
30
|
})
|
|
30
31
|
|
|
32
|
+
// Register schemas for Auto-Sync
|
|
33
|
+
database.registerSchema([userTable, leadCustomerTable])
|
|
34
|
+
|
|
31
35
|
// Connect on boot
|
|
32
36
|
await database.connect()
|
|
33
37
|
}
|
|
@@ -37,7 +41,8 @@ export default exis({
|
|
|
37
41
|
#### Class-Based (OOP) Paradigm
|
|
38
42
|
```typescript filename="src/http/server.ts"
|
|
39
43
|
import { Server } from 'exisjs/decorators'
|
|
40
|
-
import { createDatabase } from 'exisjs'
|
|
44
|
+
import { createDatabase } from 'exisjs/database'
|
|
45
|
+
import { userTable, leadCustomerTable } from '../database/schema'
|
|
41
46
|
|
|
42
47
|
@Server()
|
|
43
48
|
export default class RootServer {
|
|
@@ -45,33 +50,66 @@ export default class RootServer {
|
|
|
45
50
|
const database = createDatabase({
|
|
46
51
|
dialect: 'postgres',
|
|
47
52
|
url: process.env.DATABASE_URL,
|
|
53
|
+
autoSync: true
|
|
48
54
|
})
|
|
49
55
|
|
|
50
|
-
|
|
56
|
+
database.registerSchema([userTable, leadCustomerTable])
|
|
51
57
|
await database.connect()
|
|
52
58
|
}
|
|
53
59
|
}
|
|
54
60
|
```
|
|
55
61
|
|
|
56
|
-
##
|
|
62
|
+
## SQL-First Schema Definition
|
|
57
63
|
|
|
58
|
-
ExisJS
|
|
64
|
+
ExisJS provides a strictly-typed, modern **SQL-First Schema API**. Instead of writing raw SQL migration files, you define your tables in TypeScript. When `autoSync` is enabled, ExisJS will read these definitions, diff them against your live PostgreSQL database, and automatically run `CREATE TABLE` and `ALTER TABLE` for you!
|
|
59
65
|
|
|
60
|
-
|
|
61
|
-
|
|
66
|
+
```typescript filename="src/database/schema.ts"
|
|
67
|
+
import { table, uuid, text, jsonb, timestamptz, boolean } from 'exisjs/database/sql'
|
|
68
|
+
|
|
69
|
+
export const userTable = table('user', {
|
|
70
|
+
user_id: uuid('user_id').primaryKey().default('gen_random_uuid()'),
|
|
71
|
+
name: text('name').notNull(),
|
|
72
|
+
phone: text('phone').unique().notNull(),
|
|
73
|
+
email: text('email').unique().notNull(),
|
|
74
|
+
address: jsonb('address'),
|
|
75
|
+
date_of_birth: timestamptz('date_of_birth'),
|
|
76
|
+
role: text('role').notNull(),
|
|
77
|
+
password_hash: text('password_hash').notNull(),
|
|
78
|
+
created_at: timestamptz('created_at').default('NOW()')
|
|
79
|
+
})
|
|
80
|
+
|
|
81
|
+
export const leadCustomerTable = table('leadCustomer', {
|
|
82
|
+
record_id: uuid('record_id').primaryKey().default('gen_random_uuid()'),
|
|
83
|
+
name: text('name').notNull(),
|
|
84
|
+
email: text('email'),
|
|
85
|
+
is_customer: boolean('is_customer').default('false'),
|
|
86
|
+
// Perfect, strict SQL Foreign Key References!
|
|
87
|
+
assigned_to: uuid('assigned_to').references(() => userTable.user_id),
|
|
88
|
+
})
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## Querying
|
|
92
|
+
|
|
93
|
+
ExisJS supports **two ways** to query your database. You can use the traditional string-based builder, or the new fully-typed SQL-First builder.
|
|
62
94
|
|
|
95
|
+
### Method A: Typed SQL-First Querying (Recommended)
|
|
96
|
+
This method gives you 100% type safety and auto-complete for your columns.
|
|
97
|
+
|
|
98
|
+
#### Functional Paradigm
|
|
63
99
|
```typescript filename="src/http/users/route.ts"
|
|
64
100
|
import { controller, route } from 'exisjs/router'
|
|
65
|
-
import { db } from 'exisjs'
|
|
101
|
+
import { db } from 'exisjs/database'
|
|
102
|
+
import { eq } from 'exisjs/database/sql'
|
|
103
|
+
import { userTable } from '@/database/schema'
|
|
66
104
|
|
|
67
105
|
export default controller({
|
|
68
106
|
list: route.get('/', {
|
|
69
107
|
async handle() {
|
|
70
|
-
//
|
|
71
|
-
const users = await db
|
|
72
|
-
.select(
|
|
73
|
-
.
|
|
74
|
-
.
|
|
108
|
+
// Fully typed! Auto-complete knows userTable has name, email, etc.
|
|
109
|
+
const users = await db
|
|
110
|
+
.select(userTable.user_id.name, userTable.name.name, userTable.email.name)
|
|
111
|
+
.from(userTable)
|
|
112
|
+
.where(eq(userTable.role, 'admin'))
|
|
75
113
|
.limit(10)
|
|
76
114
|
.rows()
|
|
77
115
|
|
|
@@ -81,69 +119,61 @@ export default controller({
|
|
|
81
119
|
|
|
82
120
|
create: route.post('/', {
|
|
83
121
|
async handle({ req }) {
|
|
84
|
-
const { name, email } = req.body
|
|
85
|
-
|
|
86
|
-
// Insert a new row
|
|
87
|
-
const result = await db.table('users').insert({
|
|
88
|
-
name,
|
|
89
|
-
email,
|
|
90
|
-
role: 'user'
|
|
91
|
-
}).execute()
|
|
122
|
+
const { name, email, phone, password_hash } = req.body
|
|
92
123
|
|
|
93
|
-
|
|
124
|
+
const result = await db
|
|
125
|
+
.insert(userTable)
|
|
126
|
+
.values({ name, email, phone, role: 'user', password_hash })
|
|
127
|
+
.returning(userTable.user_id.name)
|
|
128
|
+
.execute()
|
|
129
|
+
|
|
130
|
+
return { id: result.rows[0].user_id }
|
|
94
131
|
}
|
|
95
132
|
})
|
|
96
133
|
})
|
|
97
134
|
```
|
|
98
135
|
|
|
99
136
|
#### Class-Based (OOP) Paradigm
|
|
100
|
-
In the OOP paradigm, it is highly recommended to abstract database calls into `@Injectable()` services and inject them into your `@Controller()`.
|
|
101
|
-
|
|
102
137
|
```typescript filename="src/http/users/service.ts"
|
|
103
138
|
import { Injectable } from 'exisjs/decorators'
|
|
104
|
-
import { db } from 'exisjs'
|
|
139
|
+
import { db } from 'exisjs/database'
|
|
140
|
+
import { eq } from 'exisjs/database/sql'
|
|
141
|
+
import { userTable } from '@/database/schema'
|
|
105
142
|
|
|
106
143
|
@Injectable()
|
|
107
144
|
export class UsersService {
|
|
108
145
|
async getAdmins() {
|
|
109
|
-
return await db
|
|
110
|
-
.select(
|
|
111
|
-
.
|
|
112
|
-
.
|
|
146
|
+
return await db
|
|
147
|
+
.select(userTable.user_id.name, userTable.name.name, userTable.email.name)
|
|
148
|
+
.from(userTable)
|
|
149
|
+
.where(eq(userTable.role, 'admin'))
|
|
113
150
|
.limit(10)
|
|
114
151
|
.rows()
|
|
115
152
|
}
|
|
116
153
|
|
|
117
|
-
async createUser(data:
|
|
118
|
-
const result = await db
|
|
119
|
-
|
|
120
|
-
role: 'user'
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
154
|
+
async createUser(data: any) {
|
|
155
|
+
const result = await db
|
|
156
|
+
.insert(userTable)
|
|
157
|
+
.values({ ...data, role: 'user' })
|
|
158
|
+
.returning(userTable.user_id.name)
|
|
159
|
+
.execute()
|
|
160
|
+
|
|
161
|
+
return { id: result.rows[0].user_id }
|
|
124
162
|
}
|
|
125
163
|
}
|
|
126
164
|
```
|
|
127
165
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
import { UsersService } from './service'
|
|
131
|
-
|
|
132
|
-
@Controller()
|
|
133
|
-
export default class UsersController {
|
|
134
|
-
// ExisJS automatically injects the service!
|
|
135
|
-
constructor(private usersService: UsersService) {}
|
|
136
|
-
|
|
137
|
-
@Get('/')
|
|
138
|
-
async list() {
|
|
139
|
-
return await this.usersService.getAdmins()
|
|
140
|
-
}
|
|
166
|
+
### Method B: String-Based Query Builder
|
|
167
|
+
If you don't want to define schema files, you can still use the raw string builder.
|
|
141
168
|
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
169
|
+
```typescript
|
|
170
|
+
// Query multiple rows
|
|
171
|
+
const users = await db.table('users')
|
|
172
|
+
.select('id', 'name', 'email')
|
|
173
|
+
.where('role', '=', 'admin')
|
|
174
|
+
.orderBy('created_at', 'desc')
|
|
175
|
+
.limit(10)
|
|
176
|
+
.rows()
|
|
147
177
|
```
|
|
148
178
|
|
|
149
179
|
## Transactions
|
|
@@ -151,43 +181,36 @@ export default class UsersController {
|
|
|
151
181
|
ExisJS makes it trivial to perform safe database transactions. If the callback throws an error, the transaction is automatically rolled back.
|
|
152
182
|
|
|
153
183
|
```typescript
|
|
154
|
-
import { db } from 'exisjs'
|
|
184
|
+
import { db } from 'exisjs/database'
|
|
155
185
|
|
|
156
186
|
await db.transaction(async (tx) => {
|
|
157
187
|
// Deduct from inventory
|
|
158
188
|
await tx.execute(
|
|
159
|
-
'UPDATE inventory SET stock = stock -
|
|
189
|
+
'UPDATE inventory SET stock = stock - $1 WHERE id = $2',
|
|
160
190
|
[1, itemId]
|
|
161
191
|
)
|
|
162
192
|
|
|
163
193
|
// Create order record
|
|
164
194
|
await tx.execute(
|
|
165
|
-
'INSERT INTO orders (user_id, item_id) VALUES (
|
|
195
|
+
'INSERT INTO orders (user_id, item_id) VALUES ($1, $2)',
|
|
166
196
|
[userId, itemId]
|
|
167
197
|
)
|
|
168
198
|
})
|
|
169
199
|
```
|
|
170
200
|
|
|
171
|
-
##
|
|
201
|
+
## Manual Migrations (Optional)
|
|
172
202
|
|
|
173
|
-
|
|
203
|
+
If you prefer to write raw SQL instead of using the Auto-Sync engine, ExisJS still includes a built-in migration tracker.
|
|
174
204
|
|
|
175
205
|
```typescript
|
|
176
|
-
import { db } from 'exisjs'
|
|
206
|
+
import { db } from 'exisjs/database'
|
|
177
207
|
|
|
178
208
|
const migrator = db.getMigrator({ directory: './migrations' })
|
|
179
209
|
|
|
180
210
|
// Apply all pending migrations
|
|
181
211
|
await migrator.up()
|
|
182
|
-
|
|
183
|
-
// Rollback the last batch of migrations
|
|
184
|
-
await migrator.down()
|
|
185
|
-
|
|
186
|
-
// Check the status of all migrations
|
|
187
|
-
const status = await migrator.status()
|
|
188
212
|
```
|
|
189
213
|
|
|
190
|
-
### Creating a Migration
|
|
191
214
|
A migration file simply exports `up` and `down` methods. You write raw SQL inside them for ultimate control.
|
|
192
215
|
|
|
193
216
|
```typescript filename="migrations/001_create_users.ts"
|
|
@@ -207,3 +230,49 @@ module.exports = {
|
|
|
207
230
|
},
|
|
208
231
|
}
|
|
209
232
|
```
|
|
233
|
+
|
|
234
|
+
## API Reference
|
|
235
|
+
|
|
236
|
+
To maintain a clean namespace, ExisJS separates the core database manager from the SQL schema utilities.
|
|
237
|
+
|
|
238
|
+
### Core Database (`exisjs/database`)
|
|
239
|
+
Imports related to connection management, raw queries, and migrations.
|
|
240
|
+
|
|
241
|
+
- `db` - The global singleton database manager.
|
|
242
|
+
- `createDatabase` - Factory to instantiate a new database connection.
|
|
243
|
+
- `DatabaseManager` - The underlying class for `db`.
|
|
244
|
+
- `Migrator` - The migration engine class.
|
|
245
|
+
- `QueryBuilder` - The base query builder class.
|
|
246
|
+
|
|
247
|
+
### SQL-First Schema & Queries (`exisjs/database/sql`)
|
|
248
|
+
Imports related to defining tables, column types, and writing fluent queries.
|
|
249
|
+
|
|
250
|
+
**Table Builder:**
|
|
251
|
+
- `table` - Define a new SQL-first table.
|
|
252
|
+
|
|
253
|
+
**Column Types:**
|
|
254
|
+
- `uuid`
|
|
255
|
+
- `text`
|
|
256
|
+
- `varchar`
|
|
257
|
+
- `integer`
|
|
258
|
+
- `serial`
|
|
259
|
+
- `bigint`
|
|
260
|
+
- `numeric`
|
|
261
|
+
- `real`
|
|
262
|
+
- `boolean`
|
|
263
|
+
- `json`
|
|
264
|
+
- `jsonb`
|
|
265
|
+
- `timestamp`
|
|
266
|
+
- `timestamptz`
|
|
267
|
+
- `date`
|
|
268
|
+
|
|
269
|
+
**Condition Operators (for `.where()`):**
|
|
270
|
+
- `eq` (Equal: `=`)
|
|
271
|
+
- `ne` (Not Equal: `!=`)
|
|
272
|
+
- `gt` (Greater Than: `>`)
|
|
273
|
+
- `gte` (Greater Than or Equal: `>=`)
|
|
274
|
+
- `lt` (Less Than: `<`)
|
|
275
|
+
- `lte` (Less Than or Equal: `<=`)
|
|
276
|
+
- `isNull` (IS NULL)
|
|
277
|
+
- `isNotNull` (IS NOT NULL)
|
|
278
|
+
- `inArray` (IN)
|
|
@@ -123,7 +123,7 @@ To keep your codebase clean and consistent, use this decision tree when deciding
|
|
|
123
123
|
4. **Is it standard 4-arg middleware from the Express ecosystem?**
|
|
124
124
|
👉 **Use `app.use(errorHandler)`** (where `errorHandler = (err, req, res, next) => {}`). ExisJS supports standard Connect/Express error middleware natively.
|
|
125
125
|
|
|
126
|
-
##
|
|
126
|
+
## Extended Error Handling
|
|
127
127
|
|
|
128
128
|
ExisJS provides mechanisms for granular error handling.
|
|
129
129
|
|
|
@@ -193,7 +193,7 @@ src/
|
|
|
193
193
|
└── route.ts <-- Runs last (Only if both gateways succeed!)
|
|
194
194
|
```
|
|
195
195
|
|
|
196
|
-
##
|
|
196
|
+
## Extended Features
|
|
197
197
|
|
|
198
198
|
Gateways provide features to manage cross-cutting concerns like Exception Filters or Guards for an entire folder.
|
|
199
199
|
|
|
@@ -67,7 +67,7 @@ export default class UsersController {
|
|
|
67
67
|
ExisJS utilizes a runtime container system. By default, ExisJS does not aggressively use `reflect-metadata` for automatic constructor injection (unlike NestJS) to maintain a minimal footprint. The `inject()` function is the primary and recommended way to resolve dependencies.
|
|
68
68
|
</Info>
|
|
69
69
|
|
|
70
|
-
###
|
|
70
|
+
### Extended: Manual Resolution
|
|
71
71
|
If you are operating completely outside of an ExisJS controller or route (for example, in a background worker, CRON job, or a raw script like a database seeder), you can manually resolve dependencies as an escape hatch via the app container:
|
|
72
72
|
|
|
73
73
|
```typescript filename="scripts/seed.ts"
|
|
@@ -146,7 +146,7 @@ export default class UsersController {
|
|
|
146
146
|
}
|
|
147
147
|
```
|
|
148
148
|
|
|
149
|
-
##
|
|
149
|
+
## Extended Options
|
|
150
150
|
|
|
151
151
|
When enqueuing a job, or setting `defaultOptions` in your job definitions, you can configure:
|
|
152
152
|
|
|
@@ -169,7 +169,7 @@ The in-memory driver is designed for development, testing, or simple single-node
|
|
|
169
169
|
### The Redis Driver (`redis`)
|
|
170
170
|
Designed for horizontal scale, the Redis driver powers distributed clusters.
|
|
171
171
|
- **Atomic Operations**: Uses Lua scripts (`EVAL`) to atomically pop jobs from a pending `ZSET` (sorted set) into a processing state.
|
|
172
|
-
- **
|
|
172
|
+
- **integrated Core**: It dynamically requires `ioredis` only if used, keeping the core framework lightweight.
|
|
173
173
|
- **Cluster Safe**: All jobs for a specific topic map to consistent Redis hash slots.
|
|
174
174
|
|
|
175
175
|
### The Sweeper
|