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
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.helmet = helmet;
7
7
  exports.csrf = csrf;
8
8
  exports.timeout = timeout;
9
+ exports.routeTimeout = routeTimeout;
9
10
  exports.hpp = hpp;
10
11
  exports.mongoSanitize = mongoSanitize;
11
12
  exports.dbSanitize = dbSanitize;
@@ -156,26 +157,109 @@ function csrf(options) {
156
157
  }
157
158
  /**
158
159
  * Times out the request if the response hasn't been sent within the specified ms.
160
+ * Defaults to 60,000ms (60 seconds) to accommodate cloud storage, AI/LLM streaming,
161
+ * and heavy asset uploads.
159
162
  */
160
- function timeout(ms) {
161
- const options = typeof ms === 'number' ? { ms } : ms;
163
+ function timeout(msOrOptions) {
164
+ const options = typeof msOrOptions === 'number'
165
+ ? { ms: msOrOptions }
166
+ : { ms: 60000, ...msOrOptions };
167
+ const defaultMs = options.ms ?? 60000;
168
+ const statusCode = options.statusCode ?? 503;
169
+ const message = options.message || 'Request timeout';
162
170
  return (req, res, next) => {
163
- const timer = setTimeout(() => {
164
- if (!res.headersSent) {
165
- res.status(503).json({
166
- success: false,
167
- error: {
168
- code: 'TIMEOUT',
169
- message: options.message || 'Request timeout',
170
- },
171
- });
171
+ // Check exclusions
172
+ if (options.exclude) {
173
+ if (typeof options.exclude === 'function' && options.exclude(req)) {
174
+ return next();
172
175
  }
173
- }, options.ms);
174
- res.raw.on('finish', () => clearTimeout(timer));
175
- res.raw.on('close', () => clearTimeout(timer));
176
+ if (Array.isArray(options.exclude)) {
177
+ const path = req.path || req.url || '/';
178
+ const isExcluded = options.exclude.some((pattern) => typeof pattern === 'string'
179
+ ? path.startsWith(pattern)
180
+ : pattern.test(path));
181
+ if (isExcluded)
182
+ return next();
183
+ }
184
+ }
185
+ let timer = null;
186
+ const setTimer = (currentMs) => {
187
+ if (timer)
188
+ clearTimeout(timer);
189
+ timer = setTimeout(() => {
190
+ if (!res.headersSent) {
191
+ res.status(statusCode).json({
192
+ success: false,
193
+ error: {
194
+ code: 'TIMEOUT',
195
+ message,
196
+ },
197
+ });
198
+ }
199
+ }, currentMs);
200
+ if (typeof timer.unref === 'function') {
201
+ timer.unref();
202
+ }
203
+ };
204
+ // Attach dynamic timeout adjustment to req
205
+ const setTimeoutFn = (newMs) => {
206
+ if (newMs <= 0) {
207
+ if (timer)
208
+ clearTimeout(timer);
209
+ timer = null;
210
+ }
211
+ else {
212
+ setTimer(newMs);
213
+ }
214
+ return req;
215
+ };
216
+ const clearTimeoutFn = () => {
217
+ if (timer)
218
+ clearTimeout(timer);
219
+ timer = null;
220
+ return req;
221
+ };
222
+ req.setTimeout = setTimeoutFn;
223
+ req.clearTimeout = clearTimeoutFn;
224
+ req._timeoutSetter = setTimeoutFn;
225
+ req._timeoutClearer = clearTimeoutFn;
226
+ setTimer(defaultMs);
227
+ res.raw.on('finish', () => {
228
+ if (timer)
229
+ clearTimeout(timer);
230
+ });
231
+ res.raw.on('close', () => {
232
+ if (timer)
233
+ clearTimeout(timer);
234
+ });
176
235
  next();
177
236
  };
178
237
  }
238
+ /**
239
+ * Route-level timeout override middleware.
240
+ * If a global timeout is already active on req, seamlessly updates the timer to the route's custom duration.
241
+ * If no global timeout is installed, mounts an isolated timeout lifecycle for this endpoint.
242
+ */
243
+ function routeTimeout(msOrOptions) {
244
+ const options = typeof msOrOptions === 'number'
245
+ ? { ms: msOrOptions }
246
+ : { ms: 60000, ...msOrOptions };
247
+ const ms = options.ms ?? 60000;
248
+ return (req, res, next) => {
249
+ if (typeof req._timeoutSetter === 'function') {
250
+ if (ms <= 0) {
251
+ req.clearTimeout?.();
252
+ }
253
+ else {
254
+ req.setTimeout(ms);
255
+ }
256
+ next();
257
+ }
258
+ else {
259
+ timeout(options)(req, res, next);
260
+ }
261
+ };
262
+ }
179
263
  // ─── HTTP Parameter Pollution (HPP) ───────────────────────────────────────────
180
264
  function hpp() {
181
265
  return async (req, res, next) => {
@@ -1 +1 @@
1
- {"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/middleware/security.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/middleware/security.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ import type { Handler } from '../types';
2
+ export interface FileUploadLimits {
3
+ fileSize?: number;
4
+ files?: number;
5
+ fields?: number;
6
+ parts?: number;
7
+ }
8
+ export interface FileUploadOptions {
9
+ /** Single field name to match */
10
+ field?: string;
11
+ /** Multiple fields configuration */
12
+ fields?: {
13
+ name: string;
14
+ maxCount?: number;
15
+ }[];
16
+ /** Maximum number of files to accept */
17
+ maxCount?: number;
18
+ /** Disk directory to automatically save uploaded files to */
19
+ dest?: string;
20
+ /** Destination mode: 'memory' | 'disk' | 'stream' or directory path */
21
+ destination?: 'memory' | 'disk' | 'stream' | string;
22
+ /** Storage mode: 'memory' | 'disk' */
23
+ storage?: 'memory' | 'disk';
24
+ /** Maximum file size as number (bytes) or string (e.g. '10MB', '500KB') */
25
+ maxSize?: number | string;
26
+ /** Size and file count limits */
27
+ limits?: FileUploadLimits;
28
+ /** Allowed MIME types (e.g. ['image/jpeg', 'image/png'] or ['image/*']) */
29
+ allowedMimeTypes?: string[];
30
+ /** Alias for allowedMimeTypes */
31
+ mimeTypes?: string[];
32
+ /** Custom filter predicate to allow or reject a file */
33
+ fileFilter?: (file: {
34
+ fieldname: string;
35
+ filename: string;
36
+ mimetype: string;
37
+ }) => boolean | Promise<boolean>;
38
+ }
39
+ export declare function parseSizeToBytes(size: string | number | undefined): number | undefined;
40
+ /**
41
+ * Native first-party multipart file upload middleware.
42
+ * Supports memory buffering, disk saving, MIME validation, and Multer-like ergonomics.
43
+ *
44
+ * Examples:
45
+ * ```ts
46
+ * route.post('/avatar', fileUpload.single('avatar'), (req, res) => {
47
+ * res.json({ file: req.file })
48
+ * })
49
+ *
50
+ * route.post('/photos', fileUpload.array('photos', 5), (req, res) => {
51
+ * res.json({ files: req.files })
52
+ * })
53
+ * ```
54
+ */
55
+ export declare function fileUpload(rawOptions?: FileUploadOptions): Handler;
56
+ export declare namespace fileUpload {
57
+ var single: (fieldName: string, options?: Omit<FileUploadOptions, "field">) => Handler;
58
+ var array: (fieldName: string, maxCount?: number, options?: Omit<FileUploadOptions, "field" | "maxCount">) => Handler;
59
+ var fields: (fields: {
60
+ name: string;
61
+ maxCount?: number;
62
+ }[], options?: Omit<FileUploadOptions, "fields">) => Handler;
63
+ var any: (options?: FileUploadOptions) => Handler;
64
+ var none: (options?: FileUploadOptions) => Handler;
65
+ var fromExpress: typeof import("./upload").fromExpress;
66
+ }
67
+ /**
68
+ * Seamlessly run any standard Express/Connect middleware (e.g. Multer, Passport)
69
+ * in ExisJS with automatic synchronization of `req.file`, `req.files`, and `req.body`.
70
+ *
71
+ * Example:
72
+ * ```ts
73
+ * import multer from 'multer'
74
+ * const upload = multer({ dest: './uploads' })
75
+ *
76
+ * route.post('/avatar', fromExpress(upload.single('avatar')), (req, res) => {
77
+ * res.json({ file: req.file })
78
+ * })
79
+ * ```
80
+ */
81
+ export declare function fromExpress(expressMiddleware: (req: any, res: any, next: (err?: any) => void) => void): Handler;
82
+ //# sourceMappingURL=upload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../src/middleware/upload.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EAKR,MAAM,UAAU,CAAA;AAOjB,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,iCAAiC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,oCAAoC;IACpC,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IAC9C,wCAAwC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,6DAA6D;IAC7D,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,uEAAuE;IACvE,WAAW,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAA;IACnD,sCAAsC;IACtC,OAAO,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAA;IAC3B,2EAA2E;IAC3E,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACzB,iCAAiC;IACjC,MAAM,CAAC,EAAE,gBAAgB,CAAA;IACzB,2EAA2E;IAC3E,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC3B,iCAAiC;IACjC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;IACpB,wDAAwD;IACxD,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE;QAClB,SAAS,EAAE,MAAM,CAAA;QACjB,QAAQ,EAAE,MAAM,CAAA;QAChB,QAAQ,EAAE,MAAM,CAAA;KACjB,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CACjC;AAED,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAChC,MAAM,GAAG,SAAS,CAmBpB;AAWD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,UAAU,CAAC,UAAU,GAAE,iBAAsB,GAAG,OAAO,CA2PtE;yBA3Pe,UAAU;4BA+Pb,MAAM,YACP,IAAI,CAAC,iBAAiB,EAAE,OAAO,CAAC,KACzC,OAAO;2BAMG,MAAM,aACN,MAAM,YACP,IAAI,CAAC,iBAAiB,EAAE,OAAO,GAAG,UAAU,CAAC,KACtD,OAAO;yBAMA;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,YACnC,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CAAC,KAC1C,OAAO;wBAK2B,iBAAiB,KAAG,OAAO;yBAK1B,iBAAiB,KAAG,OAAO;;;AAWjE;;;;;;;;;;;;;GAaG;AACH,wBAAgB,WAAW,CACzB,iBAAiB,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,KAAK,IAAI,KAAK,IAAI,GACzE,OAAO,CA2CT"}
@@ -0,0 +1,387 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.parseSizeToBytes = parseSizeToBytes;
37
+ exports.fileUpload = fileUpload;
38
+ exports.fromExpress = fromExpress;
39
+ const errors_1 = require("../error/errors");
40
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
41
+ const busboy = require('busboy');
42
+ const path = __importStar(require("node:path"));
43
+ const fs = __importStar(require("node:fs/promises"));
44
+ function parseSizeToBytes(size) {
45
+ if (typeof size === 'number')
46
+ return size;
47
+ if (!size || typeof size !== 'string')
48
+ return undefined;
49
+ const match = size.trim().match(/^(\d+(?:\.\d+)?)\s*(b|kb|mb|gb|tb)?$/i);
50
+ if (!match)
51
+ return undefined;
52
+ const val = parseFloat(match[1]);
53
+ const unit = (match[2] || 'b').toLowerCase();
54
+ switch (unit) {
55
+ case 'kb':
56
+ return Math.round(val * 1024);
57
+ case 'mb':
58
+ return Math.round(val * 1024 * 1024);
59
+ case 'gb':
60
+ return Math.round(val * 1024 * 1024 * 1024);
61
+ case 'tb':
62
+ return Math.round(val * 1024 * 1024 * 1024 * 1024);
63
+ default:
64
+ return Math.round(val);
65
+ }
66
+ }
67
+ function matchesMime(mimetype, pattern) {
68
+ if (pattern === '*' || pattern === '*/*')
69
+ return true;
70
+ if (pattern.endsWith('/*')) {
71
+ const prefix = pattern.slice(0, pattern.indexOf('/*'));
72
+ return mimetype.startsWith(prefix + '/');
73
+ }
74
+ return mimetype.toLowerCase() === pattern.toLowerCase();
75
+ }
76
+ /**
77
+ * Native first-party multipart file upload middleware.
78
+ * Supports memory buffering, disk saving, MIME validation, and Multer-like ergonomics.
79
+ *
80
+ * Examples:
81
+ * ```ts
82
+ * route.post('/avatar', fileUpload.single('avatar'), (req, res) => {
83
+ * res.json({ file: req.file })
84
+ * })
85
+ *
86
+ * route.post('/photos', fileUpload.array('photos', 5), (req, res) => {
87
+ * res.json({ files: req.files })
88
+ * })
89
+ * ```
90
+ */
91
+ function fileUpload(rawOptions = {}) {
92
+ const options = { ...rawOptions };
93
+ const parsedSize = parseSizeToBytes(options.maxSize);
94
+ if (parsedSize && (!options.limits || !options.limits.fileSize)) {
95
+ options.limits = {
96
+ ...(options.limits || {}),
97
+ fileSize: parsedSize,
98
+ };
99
+ }
100
+ if (options.destination &&
101
+ !options.dest &&
102
+ options.destination !== 'memory' &&
103
+ options.destination !== 'stream') {
104
+ options.dest = options.destination;
105
+ }
106
+ if (options.destination === 'memory' || options.storage === 'memory') {
107
+ delete options.dest;
108
+ }
109
+ if (options.mimeTypes && !options.allowedMimeTypes) {
110
+ options.allowedMimeTypes = options.mimeTypes;
111
+ }
112
+ return (req, res, next) => {
113
+ const contentType = req.get('content-type') || '';
114
+ if (!contentType.includes('multipart/form-data')) {
115
+ return next();
116
+ }
117
+ if (!contentType.includes('boundary=')) {
118
+ return next(errors_1.HttpError.badRequest('Missing multipart boundary. Ensure you are not manually overriding the Content-Type header in your client.'));
119
+ }
120
+ return new Promise((resolve) => {
121
+ let settled = false;
122
+ const done = (err) => {
123
+ if (settled)
124
+ return;
125
+ settled = true;
126
+ if (err) {
127
+ next(err);
128
+ }
129
+ else {
130
+ next();
131
+ }
132
+ resolve();
133
+ };
134
+ const bbLimits = {};
135
+ if (options.limits?.fileSize)
136
+ bbLimits.fileSize = options.limits.fileSize;
137
+ if (options.limits?.files)
138
+ bbLimits.files = options.limits.files;
139
+ if (options.maxCount)
140
+ bbLimits.files = options.maxCount;
141
+ if (options.limits?.fields)
142
+ bbLimits.fields = options.limits.fields;
143
+ if (options.limits?.parts)
144
+ bbLimits.parts = options.limits.parts;
145
+ const fieldsMap = {};
146
+ const collectedFiles = [];
147
+ let hasLimitError = false;
148
+ let limitErrorMessage = '';
149
+ let filterError = null;
150
+ try {
151
+ const bb = busboy({
152
+ headers: req.raw.headers,
153
+ limits: Object.keys(bbLimits).length > 0 ? bbLimits : undefined,
154
+ });
155
+ bb.on('field', (name, val) => {
156
+ fieldsMap[name] = val;
157
+ });
158
+ bb.on('filesLimit', () => {
159
+ hasLimitError = true;
160
+ limitErrorMessage = `Exceeded maximum file upload limit`;
161
+ });
162
+ bb.on('file', (name, fileStream, info) => {
163
+ const filename = info.filename || 'unknown';
164
+ const mimetype = info.mimeType || 'application/octet-stream';
165
+ // Verify field restriction if single field configured
166
+ if (options.field && name !== options.field) {
167
+ fileStream.resume(); // Drain stream
168
+ return;
169
+ }
170
+ // Verify field restriction if fields array configured
171
+ if (options.fields) {
172
+ const fieldConfig = options.fields.find((f) => f.name === name);
173
+ if (!fieldConfig) {
174
+ fileStream.resume(); // Drain
175
+ return;
176
+ }
177
+ if (fieldConfig.maxCount) {
178
+ const currentCount = collectedFiles.filter((f) => f.fieldname === name).length;
179
+ if (currentCount >= fieldConfig.maxCount) {
180
+ fileStream.resume();
181
+ hasLimitError = true;
182
+ limitErrorMessage = `Field '${name}' exceeded maxCount of ${fieldConfig.maxCount}`;
183
+ return;
184
+ }
185
+ }
186
+ }
187
+ // Validate MIME type
188
+ if (options.allowedMimeTypes &&
189
+ options.allowedMimeTypes.length > 0) {
190
+ const isAllowed = options.allowedMimeTypes.some((pattern) => matchesMime(mimetype, pattern));
191
+ if (!isAllowed) {
192
+ fileStream.resume();
193
+ filterError = errors_1.HttpError.badRequest(`File '${filename}' has invalid MIME type '${mimetype}'. Allowed: ${options.allowedMimeTypes.join(', ')}`);
194
+ return;
195
+ }
196
+ }
197
+ // Validate custom filter
198
+ if (options.fileFilter) {
199
+ try {
200
+ const allowed = options.fileFilter({
201
+ fieldname: name,
202
+ filename,
203
+ mimetype,
204
+ });
205
+ if (!allowed) {
206
+ fileStream.resume();
207
+ return;
208
+ }
209
+ }
210
+ catch (err) {
211
+ fileStream.resume();
212
+ filterError =
213
+ err instanceof Error ? err : new Error(String(err));
214
+ return;
215
+ }
216
+ }
217
+ let fileTruncated = false;
218
+ fileStream.on('limit', () => {
219
+ fileTruncated = true;
220
+ hasLimitError = true;
221
+ const limit = options.limits?.fileSize;
222
+ limitErrorMessage = limit
223
+ ? `File '${filename}' exceeds size limit of ${limit} bytes`
224
+ : `File '${filename}' exceeds size limit`;
225
+ });
226
+ const chunks = [];
227
+ let size = 0;
228
+ fileStream.on('data', (chunk) => {
229
+ chunks.push(chunk);
230
+ size += chunk.length;
231
+ });
232
+ fileStream.on('end', () => {
233
+ if (fileTruncated)
234
+ return;
235
+ const data = Buffer.concat(chunks);
236
+ const fileItem = {
237
+ fieldname: name,
238
+ filename,
239
+ mimetype,
240
+ data,
241
+ buffer: data, // Multer compatibility
242
+ size,
243
+ saveToDisk: async (destDir) => {
244
+ await fs.mkdir(destDir, { recursive: true });
245
+ const ext = path.extname(filename);
246
+ const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1e9);
247
+ const finalName = `${name}-${uniqueSuffix}${ext}`;
248
+ const destPath = path.join(destDir, finalName);
249
+ await fs.writeFile(destPath, data);
250
+ fileItem.path = destPath;
251
+ return destPath;
252
+ },
253
+ };
254
+ collectedFiles.push(fileItem);
255
+ });
256
+ });
257
+ bb.on('finish', async () => {
258
+ if (filterError) {
259
+ return done(filterError);
260
+ }
261
+ if (hasLimitError) {
262
+ return done(errors_1.HttpError.payloadTooLarge(limitErrorMessage));
263
+ }
264
+ // Auto-save to destination if dest option is set
265
+ if (options.dest && collectedFiles.length > 0) {
266
+ try {
267
+ await fs.mkdir(options.dest, { recursive: true });
268
+ for (const file of collectedFiles) {
269
+ await file.saveToDisk(options.dest);
270
+ }
271
+ }
272
+ catch (err) {
273
+ return done(err);
274
+ }
275
+ }
276
+ // Attach to request
277
+ req.files = collectedFiles;
278
+ if (collectedFiles.length > 0) {
279
+ if (options.field) {
280
+ const matched = collectedFiles.find((f) => f.fieldname === options.field);
281
+ req.file = matched || collectedFiles[0];
282
+ }
283
+ else {
284
+ req.file = collectedFiles[0];
285
+ }
286
+ }
287
+ req.body = { ...(req.body || {}), ...fieldsMap };
288
+ done();
289
+ });
290
+ bb.on('error', (err) => {
291
+ done(errors_1.HttpError.badRequest(err.message || 'Failed to parse multipart upload'));
292
+ });
293
+ req.raw.pipe(bb);
294
+ }
295
+ catch (err) {
296
+ done(err);
297
+ }
298
+ });
299
+ };
300
+ }
301
+ /** Accept a single file with the given field name */
302
+ fileUpload.single = function (fieldName, options) {
303
+ return fileUpload({ ...options, field: fieldName, maxCount: 1 });
304
+ };
305
+ /** Accept multiple files under a single field name */
306
+ fileUpload.array = function (fieldName, maxCount, options) {
307
+ return fileUpload({ ...options, field: fieldName, maxCount });
308
+ };
309
+ /** Accept a mixture of files specified by fields array */
310
+ fileUpload.fields = function (fields, options) {
311
+ return fileUpload({ ...options, fields });
312
+ };
313
+ /** Accept all files that arrive on the multipart request */
314
+ fileUpload.any = function (options) {
315
+ return fileUpload(options);
316
+ };
317
+ /** Accept only text fields, reject any uploaded files */
318
+ fileUpload.none = function (options) {
319
+ return fileUpload({
320
+ ...options,
321
+ fileFilter: () => {
322
+ throw errors_1.HttpError.badRequest('Multipart files are not accepted on this route');
323
+ },
324
+ });
325
+ };
326
+ /**
327
+ * Seamlessly run any standard Express/Connect middleware (e.g. Multer, Passport)
328
+ * in ExisJS with automatic synchronization of `req.file`, `req.files`, and `req.body`.
329
+ *
330
+ * Example:
331
+ * ```ts
332
+ * import multer from 'multer'
333
+ * const upload = multer({ dest: './uploads' })
334
+ *
335
+ * route.post('/avatar', fromExpress(upload.single('avatar')), (req, res) => {
336
+ * res.json({ file: req.file })
337
+ * })
338
+ * ```
339
+ */
340
+ function fromExpress(expressMiddleware) {
341
+ return (req, res, next) => {
342
+ const rawReq = req.raw;
343
+ const rawRes = res.raw;
344
+ rawReq.params = req.params;
345
+ rawReq.query = req.query;
346
+ rawReq.headers = req.headers;
347
+ expressMiddleware(rawReq, rawRes, (err) => {
348
+ if (err)
349
+ return next(err);
350
+ // Bridge Multer properties back onto ExisRequest
351
+ if (rawReq.file) {
352
+ req.file = rawReq.file;
353
+ if (!req.files)
354
+ req.files = [];
355
+ if (!req.files.includes(rawReq.file))
356
+ req.files.push(rawReq.file);
357
+ }
358
+ if (rawReq.files) {
359
+ if (Array.isArray(rawReq.files)) {
360
+ req.files = rawReq.files;
361
+ if (rawReq.files.length > 0 && !req.file) {
362
+ req.file = rawReq.files[0];
363
+ }
364
+ }
365
+ else if (typeof rawReq.files === 'object') {
366
+ // Flatten dictionary of arrays e.g. { avatar: [file], cover: [file] }
367
+ const flatList = [];
368
+ for (const list of Object.values(rawReq.files)) {
369
+ if (Array.isArray(list))
370
+ flatList.push(...list);
371
+ }
372
+ req.files = flatList;
373
+ if (flatList.length > 0 && !req.file) {
374
+ req.file = flatList[0];
375
+ }
376
+ }
377
+ }
378
+ if (rawReq.body && typeof rawReq.body === 'object') {
379
+ req.body = { ...(req.body || {}), ...rawReq.body };
380
+ }
381
+ next();
382
+ });
383
+ };
384
+ }
385
+ /** Alias to fromExpress for Multer convenience */
386
+ fileUpload.fromExpress = fromExpress;
387
+ //# sourceMappingURL=upload.js.map