exisjs 0.7.3 → 0.7.4

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 (111) hide show
  1. package/dist/cli/commands/generate.d.ts +4 -0
  2. package/dist/cli/commands/generate.d.ts.map +1 -1
  3. package/dist/cli/commands/generate.js +227 -14
  4. package/dist/cli/commands/generate.js.map +1 -1
  5. package/dist/cli/index.js +8 -4
  6. package/dist/cli/index.js.map +1 -1
  7. package/dist/config/config.js +1 -1
  8. package/dist/config/config.js.map +1 -1
  9. package/dist/database/index.d.ts +4 -0
  10. package/dist/database/index.d.ts.map +1 -0
  11. package/dist/database/index.js +20 -0
  12. package/dist/database/index.js.map +1 -0
  13. package/dist/database/lifecycle.d.ts +52 -0
  14. package/dist/database/lifecycle.d.ts.map +1 -0
  15. package/dist/database/lifecycle.js +122 -0
  16. package/dist/database/lifecycle.js.map +1 -0
  17. package/dist/database/mongoose.d.ts +47 -0
  18. package/dist/database/mongoose.d.ts.map +1 -0
  19. package/dist/database/mongoose.js +44 -0
  20. package/dist/database/mongoose.js.map +1 -0
  21. package/dist/database/transaction.d.ts +39 -0
  22. package/dist/database/transaction.d.ts.map +1 -0
  23. package/dist/database/transaction.js +99 -0
  24. package/dist/database/transaction.js.map +1 -0
  25. package/dist/decorators/index.d.ts +1 -0
  26. package/dist/decorators/index.d.ts.map +1 -1
  27. package/dist/decorators/index.js +1 -0
  28. package/dist/decorators/index.js.map +1 -1
  29. package/dist/decorators/middleware.d.ts +10 -0
  30. package/dist/decorators/middleware.d.ts.map +1 -1
  31. package/dist/decorators/middleware.js +27 -0
  32. package/dist/decorators/middleware.js.map +1 -1
  33. package/dist/decorators/upload.d.ts +37 -0
  34. package/dist/decorators/upload.d.ts.map +1 -0
  35. package/dist/decorators/upload.js +78 -0
  36. package/dist/decorators/upload.js.map +1 -0
  37. package/dist/docs/content/cli/commands.mdx +4 -3
  38. package/dist/docs/content/config.mdx +1 -1
  39. package/dist/docs/content/errors.mdx +43 -9
  40. package/dist/docs/content/middleware.mdx +138 -0
  41. package/dist/docs/content/providers.mdx +89 -0
  42. package/dist/docs/content/requests.mdx +153 -64
  43. package/dist/docs/content/responses.mdx +56 -1
  44. package/dist/docs/content/routing.mdx +117 -0
  45. package/dist/docs/content/validation.mdx +92 -7
  46. package/dist/docs/reference/database.mdx +152 -0
  47. package/dist/docs/reference/decorators.mdx +4 -0
  48. package/dist/docs/reference/error.mdx +3 -1
  49. package/dist/docs/reference/middleware.mdx +84 -2
  50. package/dist/docs/reference/router.mdx +4 -2
  51. package/dist/docs/reference/validator.mdx +43 -5
  52. package/dist/error/errors.d.ts +10 -0
  53. package/dist/error/errors.d.ts.map +1 -1
  54. package/dist/error/errors.js +156 -25
  55. package/dist/error/errors.js.map +1 -1
  56. package/dist/error/index.d.ts +1 -1
  57. package/dist/error/index.d.ts.map +1 -1
  58. package/dist/error/index.js +3 -1
  59. package/dist/error/index.js.map +1 -1
  60. package/dist/middleware/index.d.ts +2 -0
  61. package/dist/middleware/index.d.ts.map +1 -0
  62. package/dist/middleware/index.js +18 -0
  63. package/dist/middleware/index.js.map +1 -0
  64. package/dist/middleware/middleware.d.ts +13 -0
  65. package/dist/middleware/middleware.d.ts.map +1 -1
  66. package/dist/middleware/middleware.js +22 -2
  67. package/dist/middleware/middleware.js.map +1 -1
  68. package/dist/middleware/security.d.ts +13 -3
  69. package/dist/middleware/security.d.ts.map +1 -1
  70. package/dist/middleware/security.js +98 -14
  71. package/dist/middleware/security.js.map +1 -1
  72. package/dist/middleware/upload.d.ts +82 -0
  73. package/dist/middleware/upload.d.ts.map +1 -0
  74. package/dist/middleware/upload.js +387 -0
  75. package/dist/middleware/upload.js.map +1 -0
  76. package/dist/router/index.d.ts +3 -1
  77. package/dist/router/index.d.ts.map +1 -1
  78. package/dist/router/index.js +6 -1
  79. package/dist/router/index.js.map +1 -1
  80. package/dist/router/route-builder.d.ts +11 -2
  81. package/dist/router/route-builder.d.ts.map +1 -1
  82. package/dist/router/route-builder.js.map +1 -1
  83. package/dist/router/route-scanner.d.ts.map +1 -1
  84. package/dist/router/route-scanner.js +26 -0
  85. package/dist/router/route-scanner.js.map +1 -1
  86. package/dist/router/router.d.ts.map +1 -1
  87. package/dist/router/router.js +58 -2
  88. package/dist/router/router.js.map +1 -1
  89. package/dist/router/types.d.ts +30 -0
  90. package/dist/router/types.d.ts.map +1 -1
  91. package/dist/server/request.d.ts +5 -0
  92. package/dist/server/request.d.ts.map +1 -1
  93. package/dist/server/request.js +32 -4
  94. package/dist/server/request.js.map +1 -1
  95. package/dist/testing/mocks.d.ts +3 -1
  96. package/dist/testing/mocks.d.ts.map +1 -1
  97. package/dist/testing/mocks.js +7 -1
  98. package/dist/testing/mocks.js.map +1 -1
  99. package/dist/validator/index.d.ts +1 -1
  100. package/dist/validator/index.d.ts.map +1 -1
  101. package/dist/validator/index.js +3 -1
  102. package/dist/validator/index.js.map +1 -1
  103. package/dist/validator/tex-types.d.ts +5 -1
  104. package/dist/validator/tex-types.d.ts.map +1 -1
  105. package/dist/validator/tex-types.js +4 -0
  106. package/dist/validator/tex-types.js.map +1 -1
  107. package/dist/validator/tex.d.ts +38 -0
  108. package/dist/validator/tex.d.ts.map +1 -1
  109. package/dist/validator/tex.js +126 -17
  110. package/dist/validator/tex.js.map +1 -1
  111. package/package.json +5 -1
@@ -0,0 +1,122 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DatabaseManager = void 0;
4
+ exports.registerDatabase = registerDatabase;
5
+ /**
6
+ * Universal Database Manager for ExisJS.
7
+ * Manages connections, graceful shutdown, and health checks for any database
8
+ * (Mongoose, Prisma, Drizzle, PostgreSQL, MySQL, SQLite, Redis).
9
+ */
10
+ class DatabaseManager {
11
+ /**
12
+ * Registers a database connection lifecycle with the framework.
13
+ */
14
+ static register(db) {
15
+ this.databases.set(db.name, db);
16
+ this.ensureShutdownHooks();
17
+ }
18
+ /**
19
+ * Connects all registered databases.
20
+ */
21
+ static async connectAll() {
22
+ for (const [name, db] of this.databases) {
23
+ try {
24
+ await db.connect();
25
+ }
26
+ catch (err) {
27
+ throw new Error(`[ExisJS Database] Failed to connect database "${name}": ${err.message}`, { cause: err });
28
+ }
29
+ }
30
+ }
31
+ /**
32
+ * Disconnects all registered databases gracefully.
33
+ */
34
+ static async disconnectAll() {
35
+ const disconnectPromises = Array.from(this.databases.values()).map(async (db) => {
36
+ try {
37
+ await db.disconnect();
38
+ }
39
+ catch (err) {
40
+ console.error(`[ExisJS Database] Error disconnecting "${db.name}":`, err);
41
+ }
42
+ });
43
+ await Promise.allSettled(disconnectPromises);
44
+ }
45
+ /**
46
+ * Checks the health of all registered databases.
47
+ */
48
+ static async checkHealth() {
49
+ const results = {};
50
+ let allHealthy = true;
51
+ for (const [name, db] of this.databases) {
52
+ const start = Date.now();
53
+ try {
54
+ if (!db.isHealthy) {
55
+ results[name] = { name, status: 'connected', latencyMs: 0 };
56
+ continue;
57
+ }
58
+ const healthRes = await db.isHealthy();
59
+ const latencyMs = Date.now() - start;
60
+ if (typeof healthRes === 'boolean') {
61
+ results[name] = {
62
+ name,
63
+ status: healthRes ? 'connected' : 'disconnected',
64
+ latencyMs,
65
+ };
66
+ if (!healthRes)
67
+ allHealthy = false;
68
+ }
69
+ else {
70
+ results[name] = {
71
+ latencyMs,
72
+ ...healthRes,
73
+ name: healthRes.name || name,
74
+ };
75
+ if (healthRes.status !== 'connected')
76
+ allHealthy = false;
77
+ }
78
+ }
79
+ catch (err) {
80
+ allHealthy = false;
81
+ results[name] = {
82
+ name,
83
+ status: 'error',
84
+ latencyMs: Date.now() - start,
85
+ error: err.message,
86
+ };
87
+ }
88
+ }
89
+ return {
90
+ healthy: allHealthy,
91
+ databases: results,
92
+ };
93
+ }
94
+ /**
95
+ * Clears registered databases (useful for testing).
96
+ */
97
+ static clear() {
98
+ this.databases.clear();
99
+ }
100
+ static ensureShutdownHooks() {
101
+ if (this.isShutdownHookRegistered)
102
+ return;
103
+ this.isShutdownHookRegistered = true;
104
+ const shutdownHandler = async () => {
105
+ await DatabaseManager.disconnectAll();
106
+ };
107
+ if (typeof process !== 'undefined' && typeof process.on === 'function') {
108
+ process.once('SIGINT', shutdownHandler);
109
+ process.once('SIGTERM', shutdownHandler);
110
+ }
111
+ }
112
+ }
113
+ exports.DatabaseManager = DatabaseManager;
114
+ DatabaseManager.databases = new Map();
115
+ DatabaseManager.isShutdownHookRegistered = false;
116
+ /**
117
+ * Convenience helper to register database lifecycle hooks.
118
+ */
119
+ function registerDatabase(db) {
120
+ DatabaseManager.register(db);
121
+ }
122
+ //# sourceMappingURL=lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/database/lifecycle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Options for findOneAndUpdate / findByIdAndUpdate in modern Mongoose (8 & 9).
3
+ */
4
+ export interface ModernUpdateOptions {
5
+ upsert?: boolean;
6
+ returnDocument?: 'before' | 'after';
7
+ /** Legacy option mapped to returnDocument: 'after' */
8
+ new?: boolean;
9
+ lean?: boolean;
10
+ runValidators?: boolean;
11
+ session?: any;
12
+ select?: any;
13
+ populate?: any;
14
+ sort?: any;
15
+ [key: string]: any;
16
+ }
17
+ /**
18
+ * Normalizes findOneAndUpdate / findByIdAndUpdate options for modern Mongoose.
19
+ * Automatically maps legacy `{ new: true }` to `{ returnDocument: 'after' }`
20
+ * to prevent deprecation warnings in Mongoose 9 while preserving backward compatibility.
21
+ *
22
+ * Example:
23
+ * ```ts
24
+ * const user = await User.findOneAndUpdate(
25
+ * { email },
26
+ * { $set: { lastLogin: new Date() } },
27
+ * modernUpdateOptions({ upsert: true, new: true })
28
+ * )
29
+ * ```
30
+ */
31
+ export declare function modernUpdateOptions<T extends ModernUpdateOptions>(options?: T): T & {
32
+ returnDocument?: 'before' | 'after';
33
+ };
34
+ export interface MongoPoolConfig {
35
+ maxPoolSize?: number;
36
+ minPoolSize?: number;
37
+ serverSelectionTimeoutMS?: number;
38
+ socketTimeoutMS?: number;
39
+ heartbeatFrequencyMS?: number;
40
+ autoIndex?: boolean;
41
+ }
42
+ /**
43
+ * Generates recommended, production-hardened connection pool options
44
+ * for MongoDB / Mongoose in cloud environments (Atlas, AWS, GCP, Azure).
45
+ */
46
+ export declare function mongoPoolOptions(overrides?: MongoPoolConfig): MongoPoolConfig;
47
+ //# sourceMappingURL=mongoose.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mongoose.d.ts","sourceRoot":"","sources":["../../src/database/mongoose.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,cAAc,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAA;IACnC,sDAAsD;IACtD,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,OAAO,CAAC,EAAE,GAAG,CAAA;IACb,MAAM,CAAC,EAAE,GAAG,CAAA;IACZ,QAAQ,CAAC,EAAE,GAAG,CAAA;IACd,IAAI,CAAC,EAAE,GAAG,CAAA;IACV,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CACnB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,mBAAmB,EAC/D,OAAO,GAAE,CAAW,GACnB,CAAC,GAAG;IAAE,cAAc,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAA;CAAE,CAU7C;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,wBAAwB,CAAC,EAAE,MAAM,CAAA;IACjC,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,GAAE,eAAoB,GAC9B,eAAe,CAUjB"}
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.modernUpdateOptions = modernUpdateOptions;
4
+ exports.mongoPoolOptions = mongoPoolOptions;
5
+ /**
6
+ * Normalizes findOneAndUpdate / findByIdAndUpdate options for modern Mongoose.
7
+ * Automatically maps legacy `{ new: true }` to `{ returnDocument: 'after' }`
8
+ * to prevent deprecation warnings in Mongoose 9 while preserving backward compatibility.
9
+ *
10
+ * Example:
11
+ * ```ts
12
+ * const user = await User.findOneAndUpdate(
13
+ * { email },
14
+ * { $set: { lastLogin: new Date() } },
15
+ * modernUpdateOptions({ upsert: true, new: true })
16
+ * )
17
+ * ```
18
+ */
19
+ function modernUpdateOptions(options = {}) {
20
+ const normalized = { ...options };
21
+ if (normalized.new === true && !normalized.returnDocument) {
22
+ normalized.returnDocument = 'after';
23
+ }
24
+ else if (normalized.new === false && !normalized.returnDocument) {
25
+ normalized.returnDocument = 'before';
26
+ }
27
+ return normalized;
28
+ }
29
+ /**
30
+ * Generates recommended, production-hardened connection pool options
31
+ * for MongoDB / Mongoose in cloud environments (Atlas, AWS, GCP, Azure).
32
+ */
33
+ function mongoPoolOptions(overrides = {}) {
34
+ return {
35
+ maxPoolSize: 10,
36
+ minPoolSize: 2,
37
+ serverSelectionTimeoutMS: 5000,
38
+ socketTimeoutMS: 45000,
39
+ heartbeatFrequencyMS: 10000,
40
+ autoIndex: process.env.NODE_ENV !== 'production',
41
+ ...overrides,
42
+ };
43
+ }
44
+ //# sourceMappingURL=mongoose.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mongoose.js","sourceRoot":"","sources":["../../src/database/mongoose.ts"],"names":[],"mappings":";;AA+BA,kDAYC;AAeD,4CAYC;AArDD;;;;;;;;;;;;;GAaG;AACH,SAAgB,mBAAmB,CACjC,UAAa,EAAO;IAEpB,MAAM,UAAU,GAAQ,EAAE,GAAG,OAAO,EAAE,CAAA;IAEtC,IAAI,UAAU,CAAC,GAAG,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC;QAC1D,UAAU,CAAC,cAAc,GAAG,OAAO,CAAA;IACrC,CAAC;SAAM,IAAI,UAAU,CAAC,GAAG,KAAK,KAAK,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC;QAClE,UAAU,CAAC,cAAc,GAAG,QAAQ,CAAA;IACtC,CAAC;IAED,OAAO,UAAU,CAAA;AACnB,CAAC;AAWD;;;GAGG;AACH,SAAgB,gBAAgB,CAC9B,YAA6B,EAAE;IAE/B,OAAO;QACL,WAAW,EAAE,EAAE;QACf,WAAW,EAAE,CAAC;QACd,wBAAwB,EAAE,IAAI;QAC9B,eAAe,EAAE,KAAK;QACtB,oBAAoB,EAAE,KAAK;QAC3B,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY;QAChD,GAAG,SAAS;KACb,CAAA;AACH,CAAC"}
@@ -0,0 +1,39 @@
1
+ export interface TransactionOptions {
2
+ maxRetries?: number;
3
+ timeoutMs?: number;
4
+ readPreference?: string;
5
+ readConcern?: string | {
6
+ level: string;
7
+ };
8
+ writeConcern?: {
9
+ w: number | string;
10
+ j?: boolean;
11
+ wtimeout?: number;
12
+ };
13
+ }
14
+ /**
15
+ * Universal transaction runner for ExisJS.
16
+ *
17
+ * Automatically detects whether client is Mongoose, MongoDB, Prisma, or Drizzle/SQL,
18
+ * runs the operation within an ACID transaction, commits on success, and rolls back on error.
19
+ *
20
+ * Example with Mongoose:
21
+ * ```ts
22
+ * const result = await withTransaction(mongoose, async (session) => {
23
+ * const order = await Order.create([{ userId, total }], { session })
24
+ * await Inventory.updateOne({ _id: itemId }, { $inc: { stock: -1 } }, { session })
25
+ * return order[0]
26
+ * })
27
+ * ```
28
+ *
29
+ * Example with Prisma:
30
+ * ```ts
31
+ * const result = await withTransaction(prisma, async (tx) => {
32
+ * const user = await tx.user.create({ data: { email } })
33
+ * await tx.profile.create({ data: { userId: user.id } })
34
+ * return user
35
+ * })
36
+ * ```
37
+ */
38
+ export declare function withTransaction<T>(clientOrConnection: any, callback: (sessionOrTx: any) => Promise<T>, options?: TransactionOptions): Promise<T>;
39
+ //# sourceMappingURL=transaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../../src/database/transaction.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IACjC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,WAAW,CAAC,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAA;IACxC,YAAY,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,CAAC,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CACtE;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,eAAe,CAAC,CAAC,EACrC,kBAAkB,EAAE,GAAG,EACvB,QAAQ,EAAE,CAAC,WAAW,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,EAC1C,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,CAAC,CAAC,CA+EZ"}
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.withTransaction = withTransaction;
4
+ /**
5
+ * Universal transaction runner for ExisJS.
6
+ *
7
+ * Automatically detects whether client is Mongoose, MongoDB, Prisma, or Drizzle/SQL,
8
+ * runs the operation within an ACID transaction, commits on success, and rolls back on error.
9
+ *
10
+ * Example with Mongoose:
11
+ * ```ts
12
+ * const result = await withTransaction(mongoose, async (session) => {
13
+ * const order = await Order.create([{ userId, total }], { session })
14
+ * await Inventory.updateOne({ _id: itemId }, { $inc: { stock: -1 } }, { session })
15
+ * return order[0]
16
+ * })
17
+ * ```
18
+ *
19
+ * Example with Prisma:
20
+ * ```ts
21
+ * const result = await withTransaction(prisma, async (tx) => {
22
+ * const user = await tx.user.create({ data: { email } })
23
+ * await tx.profile.create({ data: { userId: user.id } })
24
+ * return user
25
+ * })
26
+ * ```
27
+ */
28
+ async function withTransaction(clientOrConnection, callback, options = {}) {
29
+ if (!clientOrConnection) {
30
+ throw new Error('[ExisJS Transaction] A valid database client or connection is required');
31
+ }
32
+ // 1. Prisma Client Interop (client.$transaction)
33
+ if (typeof clientOrConnection.$transaction === 'function') {
34
+ return clientOrConnection.$transaction(async (tx) => {
35
+ return callback(tx);
36
+ }, options);
37
+ }
38
+ // 2. Drizzle / Knex / Generic SQL Interop (client.transaction)
39
+ if (typeof clientOrConnection.transaction === 'function') {
40
+ return clientOrConnection.transaction(async (tx) => {
41
+ return callback(tx);
42
+ });
43
+ }
44
+ // 3. Mongoose / MongoDB Driver Interop (startSession)
45
+ const getSessionFn = clientOrConnection.startSession ||
46
+ clientOrConnection.connection?.startSession ||
47
+ clientOrConnection.client?.startSession;
48
+ if (typeof getSessionFn === 'function') {
49
+ const sessionTarget = clientOrConnection.startSession
50
+ ? clientOrConnection
51
+ : clientOrConnection.connection?.startSession
52
+ ? clientOrConnection.connection
53
+ : clientOrConnection.client;
54
+ const session = await sessionTarget.startSession(options);
55
+ // Use built-in session.withTransaction if available (handles automatic retries for transient errors)
56
+ if (typeof session.withTransaction === 'function') {
57
+ try {
58
+ let result;
59
+ await session.withTransaction(async () => {
60
+ result = await callback(session);
61
+ }, options);
62
+ return result;
63
+ }
64
+ finally {
65
+ await session.endSession();
66
+ }
67
+ }
68
+ // Manual startTransaction / commit / abort fallback
69
+ try {
70
+ session.startTransaction();
71
+ const result = await callback(session);
72
+ await session.commitTransaction();
73
+ return result;
74
+ }
75
+ catch (err) {
76
+ try {
77
+ await session.abortTransaction();
78
+ }
79
+ catch {
80
+ /* ignore abort error and bubble original */
81
+ }
82
+ throw err;
83
+ }
84
+ finally {
85
+ try {
86
+ await session.endSession();
87
+ }
88
+ catch {
89
+ /* ignore endSession cleanup error */
90
+ }
91
+ }
92
+ }
93
+ // 4. If callback was passed directly or connection is already a session
94
+ if (typeof clientOrConnection.commitTransaction === 'function') {
95
+ return callback(clientOrConnection);
96
+ }
97
+ throw new Error('[ExisJS Transaction] Provided database client does not support transactions (missing startSession, $transaction, or transaction method)');
98
+ }
99
+ //# sourceMappingURL=transaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transaction.js","sourceRoot":"","sources":["../../src/database/transaction.ts"],"names":[],"mappings":";;AAgCA,0CAmFC;AA3GD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACI,KAAK,UAAU,eAAe,CACnC,kBAAuB,EACvB,QAA0C,EAC1C,UAA8B,EAAE;IAEhC,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CACb,wEAAwE,CACzE,CAAA;IACH,CAAC;IAED,iDAAiD;IACjD,IAAI,OAAO,kBAAkB,CAAC,YAAY,KAAK,UAAU,EAAE,CAAC;QAC1D,OAAO,kBAAkB,CAAC,YAAY,CAAC,KAAK,EAAE,EAAO,EAAE,EAAE;YACvD,OAAO,QAAQ,CAAC,EAAE,CAAC,CAAA;QACrB,CAAC,EAAE,OAAO,CAAC,CAAA;IACb,CAAC;IAED,+DAA+D;IAC/D,IAAI,OAAO,kBAAkB,CAAC,WAAW,KAAK,UAAU,EAAE,CAAC;QACzD,OAAO,kBAAkB,CAAC,WAAW,CAAC,KAAK,EAAE,EAAO,EAAE,EAAE;YACtD,OAAO,QAAQ,CAAC,EAAE,CAAC,CAAA;QACrB,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,sDAAsD;IACtD,MAAM,YAAY,GAChB,kBAAkB,CAAC,YAAY;QAC/B,kBAAkB,CAAC,UAAU,EAAE,YAAY;QAC3C,kBAAkB,CAAC,MAAM,EAAE,YAAY,CAAA;IAEzC,IAAI,OAAO,YAAY,KAAK,UAAU,EAAE,CAAC;QACvC,MAAM,aAAa,GAAG,kBAAkB,CAAC,YAAY;YACnD,CAAC,CAAC,kBAAkB;YACpB,CAAC,CAAC,kBAAkB,CAAC,UAAU,EAAE,YAAY;gBAC3C,CAAC,CAAC,kBAAkB,CAAC,UAAU;gBAC/B,CAAC,CAAC,kBAAkB,CAAC,MAAM,CAAA;QAE/B,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,YAAY,CAAC,OAAO,CAAC,CAAA;QAEzD,qGAAqG;QACrG,IAAI,OAAO,OAAO,CAAC,eAAe,KAAK,UAAU,EAAE,CAAC;YAClD,IAAI,CAAC;gBACH,IAAI,MAAS,CAAA;gBACb,MAAM,OAAO,CAAC,eAAe,CAAC,KAAK,IAAI,EAAE;oBACvC,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAA;gBAClC,CAAC,EAAE,OAAO,CAAC,CAAA;gBACX,OAAO,MAAO,CAAA;YAChB,CAAC;oBAAS,CAAC;gBACT,MAAM,OAAO,CAAC,UAAU,EAAE,CAAA;YAC5B,CAAC;QACH,CAAC;QAED,oDAAoD;QACpD,IAAI,CAAC;YACH,OAAO,CAAC,gBAAgB,EAAE,CAAA;YAC1B,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAA;YACtC,MAAM,OAAO,CAAC,iBAAiB,EAAE,CAAA;YACjC,OAAO,MAAM,CAAA;QACf,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC;gBACH,MAAM,OAAO,CAAC,gBAAgB,EAAE,CAAA;YAClC,CAAC;YAAC,MAAM,CAAC;gBACP,4CAA4C;YAC9C,CAAC;YACD,MAAM,GAAG,CAAA;QACX,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC;gBACH,MAAM,OAAO,CAAC,UAAU,EAAE,CAAA;YAC5B,CAAC;YAAC,MAAM,CAAC;gBACP,qCAAqC;YACvC,CAAC;QACH,CAAC;IACH,CAAC;IAED,wEAAwE;IACxE,IAAI,OAAO,kBAAkB,CAAC,iBAAiB,KAAK,UAAU,EAAE,CAAC;QAC/D,OAAO,QAAQ,CAAC,kBAAkB,CAAC,CAAA;IACrC,CAAC;IAED,MAAM,IAAI,KAAK,CACb,yIAAyI,CAC1I,CAAA;AACH,CAAC"}
@@ -5,4 +5,5 @@ export * from './routing';
5
5
  export * from './params';
6
6
  export * from './middleware';
7
7
  export * from './response';
8
+ export * from './upload';
8
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/decorators/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,QAAQ,CAAA;AACtB,cAAc,cAAc,CAAA;AAC5B,cAAc,WAAW,CAAA;AACzB,cAAc,UAAU,CAAA;AACxB,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/decorators/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,QAAQ,CAAA;AACtB,cAAc,cAAc,CAAA;AAC5B,cAAc,WAAW,CAAA;AACzB,cAAc,UAAU,CAAA;AACxB,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAC1B,cAAc,UAAU,CAAA"}
@@ -21,4 +21,5 @@ __exportStar(require("./routing"), exports);
21
21
  __exportStar(require("./params"), exports);
22
22
  __exportStar(require("./middleware"), exports);
23
23
  __exportStar(require("./response"), exports);
24
+ __exportStar(require("./upload"), exports);
24
25
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/decorators/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8CAA2B;AAC3B,yCAAsB;AACtB,+CAA4B;AAC5B,4CAAyB;AACzB,2CAAwB;AACxB,+CAA4B;AAC5B,6CAA0B"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/decorators/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8CAA2B;AAC3B,yCAAsB;AACtB,+CAA4B;AAC5B,4CAAyB;AACzB,2CAAwB;AACxB,+CAA4B;AAC5B,6CAA0B;AAC1B,2CAAwB"}
@@ -34,4 +34,14 @@ export declare function UseFilters(...filters: any[]): any;
34
34
  * checkout() {}
35
35
  */
36
36
  export declare function Idempotent(options?: import('../middleware/idempotency').IdempotentOptions): any;
37
+ /**
38
+ * Route-Level Timeout Decorator.
39
+ * Configures an explicit timeout override for a long-running endpoint.
40
+ *
41
+ * Example:
42
+ * @Post('/heavy-task')
43
+ * @Timeout(120000)
44
+ * heavyTask() {}
45
+ */
46
+ export declare function Timeout(msOrOptions: number | import('../middleware/security').TimeoutOptions): any;
37
47
  //# sourceMappingURL=middleware.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/decorators/middleware.ts"],"names":[],"mappings":"AAkCA;;;;;;;;;;;;GAYG;AACH,wBAAgB,GAAG,CAAC,GAAG,KAAK,EAAE,GAAG,EAAE,GAAG,GAAG,CAsFxC;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,GAAG,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,CAE/C;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,YAAY,EAAE,GAAG,EAAE,GAAG,GAAG,CAE3D;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,GAAG,GAAG,CAEjD;AAED;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CACxB,OAAO,GAAE,OAAO,2BAA2B,EAAE,iBAAsB,GAClE,GAAG,CA8BL"}
1
+ {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/decorators/middleware.ts"],"names":[],"mappings":"AAkCA;;;;;;;;;;;;GAYG;AACH,wBAAgB,GAAG,CAAC,GAAG,KAAK,EAAE,GAAG,EAAE,GAAG,GAAG,CAsFxC;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,GAAG,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,CAE/C;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,YAAY,EAAE,GAAG,EAAE,GAAG,GAAG,CAE3D;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,GAAG,GAAG,CAEjD;AAED;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CACxB,OAAO,GAAE,OAAO,2BAA2B,EAAE,iBAAsB,GAClE,GAAG,CA8BL;AAED;;;;;;;;GAQG;AACH,wBAAgB,OAAO,CACrB,WAAW,EAAE,MAAM,GAAG,OAAO,wBAAwB,EAAE,cAAc,GACpE,GAAG,CA4BL"}
@@ -38,6 +38,7 @@ exports.UseGuards = UseGuards;
38
38
  exports.UseInterceptors = UseInterceptors;
39
39
  exports.UseFilters = UseFilters;
40
40
  exports.Idempotent = Idempotent;
41
+ exports.Timeout = Timeout;
41
42
  const constants_1 = require("./constants");
42
43
  const metadata_1 = require("./core/metadata");
43
44
  /**
@@ -190,4 +191,30 @@ function Idempotent(options = {}) {
190
191
  methodMiddlewares.push(middlewareProxy);
191
192
  };
192
193
  }
194
+ /**
195
+ * Route-Level Timeout Decorator.
196
+ * Configures an explicit timeout override for a long-running endpoint.
197
+ *
198
+ * Example:
199
+ * @Post('/heavy-task')
200
+ * @Timeout(120000)
201
+ * heavyTask() {}
202
+ */
203
+ function Timeout(msOrOptions) {
204
+ return function (target, contextOrPropertyKey, descriptor) {
205
+ const isStandard = typeof contextOrPropertyKey === 'object' && contextOrPropertyKey !== null;
206
+ const fn = isStandard
207
+ ? target
208
+ : descriptor
209
+ ? descriptor.value
210
+ : target[contextOrPropertyKey];
211
+ const methodMiddlewares = metadata_1.MetadataEngine.init(fn, constants_1.METHOD_MIDDLEWARES, []);
212
+ const middlewareProxy = async (req, res, next) => {
213
+ const { routeTimeout } = await Promise.resolve().then(() => __importStar(require('../middleware/security')));
214
+ const handler = routeTimeout(msOrOptions);
215
+ return handler(req, res, next);
216
+ };
217
+ methodMiddlewares.unshift(middlewareProxy);
218
+ };
219
+ }
193
220
  //# sourceMappingURL=middleware.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/decorators/middleware.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/decorators/middleware.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import { type FileUploadOptions } from '../middleware/upload';
2
+ /**
3
+ * Method or parameter decorator for file uploads.
4
+ *
5
+ * When used on a controller method:
6
+ * Automatically applies the multipart file upload middleware for that route before execution.
7
+ * ```ts
8
+ * @Post('/avatar')
9
+ * @Upload('avatar')
10
+ * uploadAvatar(@UploadedFile() file: ExisFile) {
11
+ * return { filename: file.filename }
12
+ * }
13
+ * ```
14
+ *
15
+ * When used on a method parameter:
16
+ * Injects the uploaded file (alias for `@UploadedFile`).
17
+ * ```ts
18
+ * @Post('/avatar')
19
+ * @UseUpload({ field: 'avatar' })
20
+ * uploadAvatar(@Upload('avatar') file: ExisFile) {
21
+ * return { filename: file.filename }
22
+ * }
23
+ * ```
24
+ */
25
+ export declare function Upload(fieldNameOrOptions?: string | FileUploadOptions): any;
26
+ /**
27
+ * Explicit method decorator for file upload middleware.
28
+ *
29
+ * Example:
30
+ * ```ts
31
+ * @Post('/gallery')
32
+ * @UseUpload({ field: 'photos', maxCount: 10, dest: './uploads' })
33
+ * uploadGallery(@UploadedFiles() photos: ExisFile[]) {}
34
+ * ```
35
+ */
36
+ export declare function UseUpload(options?: FileUploadOptions): any;
37
+ //# sourceMappingURL=upload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../src/decorators/upload.ts"],"names":[],"mappings":"AAEA,OAAO,EAAc,KAAK,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAEzE;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,MAAM,CAAC,kBAAkB,CAAC,EAAE,MAAM,GAAG,iBAAiB,GAAG,GAAG,CAiD3E;AAED;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,GAAG,CAE1D"}
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Upload = Upload;
4
+ exports.UseUpload = UseUpload;
5
+ const constants_1 = require("./constants");
6
+ const metadata_1 = require("./core/metadata");
7
+ const upload_1 = require("../middleware/upload");
8
+ /**
9
+ * Method or parameter decorator for file uploads.
10
+ *
11
+ * When used on a controller method:
12
+ * Automatically applies the multipart file upload middleware for that route before execution.
13
+ * ```ts
14
+ * @Post('/avatar')
15
+ * @Upload('avatar')
16
+ * uploadAvatar(@UploadedFile() file: ExisFile) {
17
+ * return { filename: file.filename }
18
+ * }
19
+ * ```
20
+ *
21
+ * When used on a method parameter:
22
+ * Injects the uploaded file (alias for `@UploadedFile`).
23
+ * ```ts
24
+ * @Post('/avatar')
25
+ * @UseUpload({ field: 'avatar' })
26
+ * uploadAvatar(@Upload('avatar') file: ExisFile) {
27
+ * return { filename: file.filename }
28
+ * }
29
+ * ```
30
+ */
31
+ function Upload(fieldNameOrOptions) {
32
+ const options = typeof fieldNameOrOptions === 'string'
33
+ ? { field: fieldNameOrOptions }
34
+ : fieldNameOrOptions || {};
35
+ const uploadMiddleware = options.field
36
+ ? upload_1.fileUpload.single(options.field, options)
37
+ : options.fields
38
+ ? upload_1.fileUpload.fields(options.fields, options)
39
+ : (0, upload_1.fileUpload)(options);
40
+ return function (target, propertyKey, descriptorOrIndex) {
41
+ const isParam = typeof descriptorOrIndex === 'number' ||
42
+ (propertyKey &&
43
+ typeof propertyKey === 'object' &&
44
+ propertyKey.kind === 'parameter');
45
+ if (isParam) {
46
+ // Parameter decorator
47
+ const parameterIndex = typeof descriptorOrIndex === 'number'
48
+ ? descriptorOrIndex
49
+ : propertyKey.index;
50
+ const fn = target[propertyKey] || target;
51
+ const paramMeta = metadata_1.MetadataEngine.init(fn, constants_1.PARAM_METADATA_PROP, []);
52
+ paramMeta[parameterIndex] = {
53
+ type: 'uploadedFile',
54
+ name: options.field,
55
+ pipes: [],
56
+ };
57
+ return;
58
+ }
59
+ // Method decorator
60
+ const fn = descriptorOrIndex?.value || target[propertyKey] || target;
61
+ const methodMiddlewares = metadata_1.MetadataEngine.init(fn, constants_1.METHOD_MIDDLEWARES, []);
62
+ methodMiddlewares.push(uploadMiddleware);
63
+ };
64
+ }
65
+ /**
66
+ * Explicit method decorator for file upload middleware.
67
+ *
68
+ * Example:
69
+ * ```ts
70
+ * @Post('/gallery')
71
+ * @UseUpload({ field: 'photos', maxCount: 10, dest: './uploads' })
72
+ * uploadGallery(@UploadedFiles() photos: ExisFile[]) {}
73
+ * ```
74
+ */
75
+ function UseUpload(options) {
76
+ return Upload(options);
77
+ }
78
+ //# sourceMappingURL=upload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.js","sourceRoot":"","sources":["../../src/decorators/upload.ts"],"names":[],"mappings":";;AA2BA,wBAiDC;AAYD,8BAEC;AA1FD,2CAAqE;AACrE,8CAAgD;AAChD,iDAAyE;AAEzE;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,SAAgB,MAAM,CAAC,kBAA+C;IACpE,MAAM,OAAO,GACX,OAAO,kBAAkB,KAAK,QAAQ;QACpC,CAAC,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE;QAC/B,CAAC,CAAC,kBAAkB,IAAI,EAAE,CAAA;IAE9B,MAAM,gBAAgB,GAAG,OAAO,CAAC,KAAK;QACpC,CAAC,CAAC,mBAAU,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC;QAC3C,CAAC,CAAC,OAAO,CAAC,MAAM;YACd,CAAC,CAAC,mBAAU,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC;YAC5C,CAAC,CAAC,IAAA,mBAAU,EAAC,OAAO,CAAC,CAAA;IAEzB,OAAO,UACL,MAAW,EACX,WAAmC,EACnC,iBAAuB;QAEvB,MAAM,OAAO,GACX,OAAO,iBAAiB,KAAK,QAAQ;YACrC,CAAC,WAAW;gBACV,OAAO,WAAW,KAAK,QAAQ;gBAC/B,WAAW,CAAC,IAAI,KAAK,WAAW,CAAC,CAAA;QAErC,IAAI,OAAO,EAAE,CAAC;YACZ,sBAAsB;YACtB,MAAM,cAAc,GAClB,OAAO,iBAAiB,KAAK,QAAQ;gBACnC,CAAC,CAAC,iBAAiB;gBACnB,CAAC,CAAC,WAAW,CAAC,KAAK,CAAA;YAEvB,MAAM,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,MAAM,CAAA;YACxC,MAAM,SAAS,GAAG,yBAAc,CAAC,IAAI,CAAQ,EAAE,EAAE,+BAAmB,EAAE,EAAE,CAAC,CAAA;YACzE,SAAS,CAAC,cAAc,CAAC,GAAG;gBAC1B,IAAI,EAAE,cAAc;gBACpB,IAAI,EAAE,OAAO,CAAC,KAAK;gBACnB,KAAK,EAAE,EAAE;aACV,CAAA;YACD,OAAM;QACR,CAAC;QAED,mBAAmB;QACnB,MAAM,EAAE,GAAG,iBAAiB,EAAE,KAAK,IAAI,MAAM,CAAC,WAAW,CAAC,IAAI,MAAM,CAAA;QACpE,MAAM,iBAAiB,GAAG,yBAAc,CAAC,IAAI,CAC3C,EAAE,EACF,8BAAkB,EAClB,EAAE,CACH,CAAA;QACD,iBAAiB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;IAC1C,CAAC,CAAA;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,SAAgB,SAAS,CAAC,OAA2B;IACnD,OAAO,MAAM,CAAC,OAAO,CAAC,CAAA;AACxB,CAAC"}
@@ -92,10 +92,11 @@ $ npx exisjs g <type> <name> [options]
92
92
 
93
93
  | Schematic | Alias | Description | Output Path |
94
94
  | :--- | :--- | :--- | :--- |
95
- | `resource` | | Complete domain slice (`schema.ts`, `service.ts`, `route.ts` or feature-prefixed named files) | `src/http/<name>/` |
95
+ | `crud` | `resource` | Full 4-file CRUD slice (`schema.ts`, `service.ts`, `route.ts`, and `model.ts` entity), 100% database-agnostic | `src/http/<name>/` & `src/models/` |
96
+ | `model` | | Standalone database-agnostic TypeScript entity and input types | `src/models/<Name>.ts` |
96
97
  | `route` | `r`, `c`, `controller` | HTTP route file | `src/http/<name>/route.ts` |
97
- | `service` | `s` | Injectable service / business logic | `src/http/<name>/service.ts` |
98
- | `schema` | `sc` | Validation schemas powered by `tex` | `src/http/<name>/schema.ts` |
98
+ | `service` | `s` | Injectable service / business logic with pagination helpers | `src/http/<name>/service.ts` |
99
+ | `schema` | `sc` | Validation schemas powered by `tex` (includes pagination) | `src/http/<name>/schema.ts` |
99
100
  | `boundary` | `b` | Folder-scoped configuration and request pipeline | `src/http/<name>/boundary.ts` |
100
101
  | `plugin` | `p` | Distributable plugin module | `src/plugins/<name>.ts` |
101
102
  | `middleware` | `m` | Standalone middleware handler | `src/middleware/<name>.ts` |
@@ -155,7 +155,7 @@ Here is a full breakdown of the configuration schema:
155
155
 
156
156
  ### Performance & Security
157
157
 
158
- - `bodyLimit` _(number)_: The maximum allowed size (in bytes) for incoming request bodies. (Default: `1MB`)
158
+ - `bodyLimit` _(number)_: The maximum allowed size (in bytes) for incoming request bodies. (Default: `10MB` / `10485760` bytes, raising HTTP 413 `PayloadTooLargeError` when exceeded)
159
159
  - `trustProxy` _(boolean | number)_: If true, respects `X-Forwarded-For` and `X-Forwarded-Host` headers (essential for apps deployed behind NGINX, Cloudflare, or AWS ELB). If a number, trusts that many hops.
160
160
  - `keepAlive` _(object | boolean)_: Tunes the Keep-Alive timeout and Header timeout limits.
161
161
  - `workers` _(number | 'safe' | 'max')_: Number of CPU workers for cluster mode. Defaults to 1. 'safe' caps to 2. 'max' uses all available cores.