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.
- package/dist/cli/commands/generate.d.ts +4 -0
- package/dist/cli/commands/generate.d.ts.map +1 -1
- package/dist/cli/commands/generate.js +227 -14
- package/dist/cli/commands/generate.js.map +1 -1
- package/dist/cli/index.js +8 -4
- package/dist/cli/index.js.map +1 -1
- package/dist/config/config.js +1 -1
- package/dist/config/config.js.map +1 -1
- package/dist/database/index.d.ts +4 -0
- package/dist/database/index.d.ts.map +1 -0
- package/dist/database/index.js +20 -0
- package/dist/database/index.js.map +1 -0
- package/dist/database/lifecycle.d.ts +52 -0
- package/dist/database/lifecycle.d.ts.map +1 -0
- package/dist/database/lifecycle.js +122 -0
- package/dist/database/lifecycle.js.map +1 -0
- package/dist/database/mongoose.d.ts +47 -0
- package/dist/database/mongoose.d.ts.map +1 -0
- package/dist/database/mongoose.js +44 -0
- package/dist/database/mongoose.js.map +1 -0
- package/dist/database/transaction.d.ts +39 -0
- package/dist/database/transaction.d.ts.map +1 -0
- package/dist/database/transaction.js +99 -0
- package/dist/database/transaction.js.map +1 -0
- 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/middleware.d.ts +10 -0
- package/dist/decorators/middleware.d.ts.map +1 -1
- package/dist/decorators/middleware.js +27 -0
- package/dist/decorators/middleware.js.map +1 -1
- package/dist/decorators/upload.d.ts +37 -0
- package/dist/decorators/upload.d.ts.map +1 -0
- package/dist/decorators/upload.js +78 -0
- package/dist/decorators/upload.js.map +1 -0
- package/dist/docs/content/cli/commands.mdx +4 -3
- package/dist/docs/content/config.mdx +1 -1
- package/dist/docs/content/errors.mdx +43 -9
- package/dist/docs/content/middleware.mdx +138 -0
- package/dist/docs/content/providers.mdx +89 -0
- package/dist/docs/content/requests.mdx +153 -64
- package/dist/docs/content/responses.mdx +56 -1
- package/dist/docs/content/routing.mdx +117 -0
- package/dist/docs/content/validation.mdx +92 -7
- package/dist/docs/reference/database.mdx +152 -0
- package/dist/docs/reference/decorators.mdx +4 -0
- package/dist/docs/reference/error.mdx +3 -1
- package/dist/docs/reference/middleware.mdx +84 -2
- package/dist/docs/reference/router.mdx +4 -2
- package/dist/docs/reference/validator.mdx +43 -5
- package/dist/error/errors.d.ts +10 -0
- package/dist/error/errors.d.ts.map +1 -1
- package/dist/error/errors.js +156 -25
- package/dist/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 +3 -1
- package/dist/error/index.js.map +1 -1
- package/dist/middleware/index.d.ts +2 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +18 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/middleware.d.ts +13 -0
- package/dist/middleware/middleware.d.ts.map +1 -1
- package/dist/middleware/middleware.js +22 -2
- package/dist/middleware/middleware.js.map +1 -1
- package/dist/middleware/security.d.ts +13 -3
- package/dist/middleware/security.d.ts.map +1 -1
- package/dist/middleware/security.js +98 -14
- package/dist/middleware/security.js.map +1 -1
- package/dist/middleware/upload.d.ts +82 -0
- package/dist/middleware/upload.d.ts.map +1 -0
- package/dist/middleware/upload.js +387 -0
- package/dist/middleware/upload.js.map +1 -0
- package/dist/router/index.d.ts +3 -1
- package/dist/router/index.d.ts.map +1 -1
- package/dist/router/index.js +6 -1
- package/dist/router/index.js.map +1 -1
- package/dist/router/route-builder.d.ts +11 -2
- package/dist/router/route-builder.d.ts.map +1 -1
- package/dist/router/route-builder.js.map +1 -1
- package/dist/router/route-scanner.d.ts.map +1 -1
- package/dist/router/route-scanner.js +26 -0
- package/dist/router/route-scanner.js.map +1 -1
- package/dist/router/router.d.ts.map +1 -1
- package/dist/router/router.js +58 -2
- package/dist/router/router.js.map +1 -1
- package/dist/router/types.d.ts +30 -0
- package/dist/router/types.d.ts.map +1 -1
- package/dist/server/request.d.ts +5 -0
- package/dist/server/request.d.ts.map +1 -1
- package/dist/server/request.js +32 -4
- package/dist/server/request.js.map +1 -1
- package/dist/testing/mocks.d.ts +3 -1
- package/dist/testing/mocks.d.ts.map +1 -1
- package/dist/testing/mocks.js +7 -1
- package/dist/testing/mocks.js.map +1 -1
- package/dist/validator/index.d.ts +1 -1
- package/dist/validator/index.d.ts.map +1 -1
- package/dist/validator/index.js +3 -1
- package/dist/validator/index.js.map +1 -1
- package/dist/validator/tex-types.d.ts +5 -1
- package/dist/validator/tex-types.d.ts.map +1 -1
- package/dist/validator/tex-types.js +4 -0
- package/dist/validator/tex-types.js.map +1 -1
- package/dist/validator/tex.d.ts +38 -0
- package/dist/validator/tex.d.ts.map +1 -1
- package/dist/validator/tex.js +126 -17
- package/dist/validator/tex.js.map +1 -1
- 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(
|
|
161
|
-
const options = typeof
|
|
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
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
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
|
-
|
|
174
|
-
|
|
175
|
-
|
|
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
|