@eggjs/multipart 5.0.0-beta.19 → 5.0.0-beta.21
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/app/extend/context.d.ts +93 -97
- package/dist/app/extend/context.js +268 -194
- package/dist/app/middleware/multipart.d.ts +3 -6
- package/dist/app/middleware/multipart.js +17 -14
- package/dist/app/schedule/clean_tmpdir.d.ts +21 -27
- package/dist/app/schedule/clean_tmpdir.js +53 -56
- package/dist/app.d.ts +5 -9
- package/dist/app.js +17 -20
- package/dist/config/config.default.d.ts +82 -85
- package/dist/config/config.default.js +25 -27
- package/dist/index.d.ts +3 -1
- package/dist/index.js +3 -2
- package/dist/lib/LimitError.d.ts +4 -7
- package/dist/lib/LimitError.js +12 -15
- package/dist/lib/MultipartFileTooLargeError.d.ts +5 -8
- package/dist/lib/MultipartFileTooLargeError.js +14 -17
- package/dist/lib/utils.d.ts +4 -8
- package/dist/lib/utils.js +88 -68
- package/dist/types.d.ts +21 -23
- package/dist/types.js +2 -1
- package/package.json +6 -6
package/dist/lib/utils.js
CHANGED
|
@@ -1,71 +1,91 @@
|
|
|
1
|
-
import path from
|
|
2
|
-
import assert from
|
|
3
|
-
import bytes from
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import assert from 'node:assert';
|
|
3
|
+
import bytes from 'bytes';
|
|
4
|
+
export const whitelist = [
|
|
5
|
+
// images
|
|
6
|
+
'.jpg',
|
|
7
|
+
'.jpeg', // image/jpeg
|
|
8
|
+
'.png', // image/png, image/x-png
|
|
9
|
+
'.gif', // image/gif
|
|
10
|
+
'.bmp', // image/bmp
|
|
11
|
+
'.wbmp', // image/vnd.wap.wbmp
|
|
12
|
+
'.webp',
|
|
13
|
+
'.tif',
|
|
14
|
+
'.psd',
|
|
15
|
+
// text
|
|
16
|
+
'.svg',
|
|
17
|
+
'.js',
|
|
18
|
+
'.jsx',
|
|
19
|
+
'.json',
|
|
20
|
+
'.css',
|
|
21
|
+
'.less',
|
|
22
|
+
'.html',
|
|
23
|
+
'.htm',
|
|
24
|
+
'.xml',
|
|
25
|
+
// tar
|
|
26
|
+
'.zip',
|
|
27
|
+
'.gz',
|
|
28
|
+
'.tgz',
|
|
29
|
+
'.gzip',
|
|
30
|
+
// video
|
|
31
|
+
'.mp3',
|
|
32
|
+
'.mp4',
|
|
33
|
+
'.avi',
|
|
32
34
|
];
|
|
33
|
-
function humanizeBytes(size) {
|
|
34
|
-
|
|
35
|
-
|
|
35
|
+
export function humanizeBytes(size) {
|
|
36
|
+
if (typeof size === 'number') {
|
|
37
|
+
return size;
|
|
38
|
+
}
|
|
39
|
+
return bytes(size);
|
|
36
40
|
}
|
|
37
|
-
function normalizeOptions(options) {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
41
|
+
export function normalizeOptions(options) {
|
|
42
|
+
// make sure to cast the value of config **Size to number
|
|
43
|
+
options.fileSize = humanizeBytes(options.fileSize);
|
|
44
|
+
options.fieldSize = humanizeBytes(options.fieldSize);
|
|
45
|
+
options.fieldNameSize = humanizeBytes(options.fieldNameSize);
|
|
46
|
+
// validate mode
|
|
47
|
+
options.mode = options.mode || 'stream';
|
|
48
|
+
assert(['stream', 'file'].includes(options.mode), `Expect mode to be 'stream' or 'file', but got '${options.mode}'`);
|
|
49
|
+
if (options.mode === 'file') {
|
|
50
|
+
assert(!options.fileModeMatch, '`fileModeMatch` options only work on stream mode, please remove it');
|
|
51
|
+
}
|
|
52
|
+
// normalize whitelist
|
|
53
|
+
if (Array.isArray(options.whitelist)) {
|
|
54
|
+
options.whitelist = options.whitelist.map(extname => extname.toLowerCase());
|
|
55
|
+
}
|
|
56
|
+
// normalize fileExtensions
|
|
57
|
+
if (Array.isArray(options.fileExtensions)) {
|
|
58
|
+
options.fileExtensions = options.fileExtensions.map(extname => {
|
|
59
|
+
return extname.startsWith('.') || extname === '' ? extname.toLowerCase() : `.${extname.toLowerCase()}`;
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
function checkExt(fileName) {
|
|
63
|
+
if (typeof options.whitelist === 'function') {
|
|
64
|
+
return options.whitelist(fileName);
|
|
65
|
+
}
|
|
66
|
+
const extname = path.extname(fileName).toLowerCase();
|
|
67
|
+
if (Array.isArray(options.whitelist)) {
|
|
68
|
+
return options.whitelist.includes(extname);
|
|
69
|
+
}
|
|
70
|
+
// only if user don't provide whitelist, we will use default whitelist + fileExtensions
|
|
71
|
+
return whitelist.includes(extname) || options.fileExtensions.includes(extname);
|
|
72
|
+
}
|
|
73
|
+
options.checkFile = (_fieldName, fileStream, fileName) => {
|
|
74
|
+
// just ignore, if no file
|
|
75
|
+
if (!fileStream || !fileName)
|
|
76
|
+
return;
|
|
77
|
+
try {
|
|
78
|
+
if (!checkExt(fileName)) {
|
|
79
|
+
const err = new Error('Invalid filename: ' + fileName);
|
|
80
|
+
Reflect.set(err, 'status', 400);
|
|
81
|
+
return err;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
err.status = 400;
|
|
86
|
+
return err;
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
return options;
|
|
68
90
|
}
|
|
69
|
-
|
|
70
|
-
//#endregion
|
|
71
|
-
export { humanizeBytes, normalizeOptions, whitelist };
|
|
91
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUM3QixPQUFPLE1BQU0sTUFBTSxhQUFhLENBQUM7QUFFakMsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBRzFCLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRztJQUN2QixTQUFTO0lBQ1QsTUFBTTtJQUNOLE9BQU8sRUFBRSxhQUFhO0lBQ3RCLE1BQU0sRUFBRSx5QkFBeUI7SUFDakMsTUFBTSxFQUFFLFlBQVk7SUFDcEIsTUFBTSxFQUFFLFlBQVk7SUFDcEIsT0FBTyxFQUFFLHFCQUFxQjtJQUM5QixPQUFPO0lBQ1AsTUFBTTtJQUNOLE1BQU07SUFDTixPQUFPO0lBQ1AsTUFBTTtJQUNOLEtBQUs7SUFDTCxNQUFNO0lBQ04sT0FBTztJQUNQLE1BQU07SUFDTixPQUFPO0lBQ1AsT0FBTztJQUNQLE1BQU07SUFDTixNQUFNO0lBQ04sTUFBTTtJQUNOLE1BQU07SUFDTixLQUFLO0lBQ0wsTUFBTTtJQUNOLE9BQU87SUFDUCxRQUFRO0lBQ1IsTUFBTTtJQUNOLE1BQU07SUFDTixNQUFNO0NBQ1AsQ0FBQztBQUVGLE1BQU0sVUFBVSxhQUFhLENBQUMsSUFBcUI7SUFDakQsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM3QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQVcsQ0FBQztBQUMvQixDQUFDO0FBRUQsTUFBTSxVQUFVLGdCQUFnQixDQUFDLE9BQXdCO0lBQ3ZELHlEQUF5RDtJQUN6RCxPQUFPLENBQUMsUUFBUSxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbkQsT0FBTyxDQUFDLFNBQVMsR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FB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
|
package/dist/types.d.ts
CHANGED
|
@@ -1,24 +1,22 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
//#region src/types.d.ts
|
|
1
|
+
import type { MultipartConfig } from './config/config.default.ts';
|
|
2
|
+
import type { EggFile, MultipartFileStream, MultipartOptions } from './app/extend/context.ts';
|
|
5
3
|
declare module 'egg' {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
}
|
|
4
|
+
interface EggAppConfig {
|
|
5
|
+
/**
|
|
6
|
+
* multipart parser options
|
|
7
|
+
* @member Config#multipart
|
|
8
|
+
*/
|
|
9
|
+
multipart: MultipartConfig;
|
|
10
|
+
}
|
|
11
|
+
interface Request {
|
|
12
|
+
/**
|
|
13
|
+
* Files Object Array
|
|
14
|
+
*/
|
|
15
|
+
files?: EggFile[];
|
|
16
|
+
}
|
|
17
|
+
interface Context {
|
|
18
|
+
saveRequestFiles(options?: MultipartOptions): Promise<void>;
|
|
19
|
+
getFileStream(options?: MultipartOptions): Promise<MultipartFileStream>;
|
|
20
|
+
cleanupRequestFiles(files?: EggFile[]): Promise<void>;
|
|
21
|
+
}
|
|
22
|
+
}
|
package/dist/types.js
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@eggjs/multipart",
|
|
3
|
-
"version": "5.0.0-beta.
|
|
3
|
+
"version": "5.0.0-beta.21",
|
|
4
4
|
"description": "multipart plugin for egg",
|
|
5
5
|
"eggPlugin": {
|
|
6
6
|
"name": "multipart",
|
|
@@ -52,7 +52,7 @@
|
|
|
52
52
|
"egg-path-matching": "^2.0.0"
|
|
53
53
|
},
|
|
54
54
|
"peerDependencies": {
|
|
55
|
-
"egg": "4.1.0-beta.
|
|
55
|
+
"egg": "4.1.0-beta.21"
|
|
56
56
|
},
|
|
57
57
|
"devDependencies": {
|
|
58
58
|
"@types/bytes": "^3.1.5",
|
|
@@ -64,9 +64,9 @@
|
|
|
64
64
|
"typescript": "^5.9.3",
|
|
65
65
|
"urllib": "^4.8.2",
|
|
66
66
|
"vitest": "4.0.0-beta.16",
|
|
67
|
-
"@eggjs/
|
|
68
|
-
"@eggjs/schedule": "6.0.0-beta.
|
|
69
|
-
"@eggjs/
|
|
67
|
+
"@eggjs/mock": "7.0.0-beta.21",
|
|
68
|
+
"@eggjs/schedule": "6.0.0-beta.21",
|
|
69
|
+
"@eggjs/tsconfig": "3.1.0-beta.21"
|
|
70
70
|
},
|
|
71
71
|
"files": [
|
|
72
72
|
"dist"
|
|
@@ -75,7 +75,7 @@
|
|
|
75
75
|
"module": "./dist/index.js",
|
|
76
76
|
"types": "./dist/index.d.ts",
|
|
77
77
|
"scripts": {
|
|
78
|
-
"build": "tsdown",
|
|
78
|
+
"build": "tsdown && rimraf dist && tsc -b --clean && tsc",
|
|
79
79
|
"typecheck": "tsc --noEmit",
|
|
80
80
|
"lint": "oxlint --type-aware",
|
|
81
81
|
"lint:fix": "npm run lint -- --fix",
|