pipework 0.152.0 → 0.154.0
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/CHANGELOG.md +8 -0
- package/dist/async/steps/graph.d.ts.map +1 -1
- package/dist/async/steps/graph.js +23 -18
- package/dist/async/steps/graph.js.map +1 -1
- package/dist/async/steps/index.d.ts +1 -1
- package/dist/async/steps/index.d.ts.map +1 -1
- package/dist/async/steps/table.d.ts +2 -2
- package/dist/async/steps/types.d.ts +15 -0
- package/dist/async/steps/types.d.ts.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/request/di/builder.d.ts +21 -5
- package/dist/request/di/builder.d.ts.map +1 -1
- package/dist/request/di/builder.js.map +1 -1
- package/dist/request/di/types.d.ts +45 -6
- package/dist/request/di/types.d.ts.map +1 -1
- package/dist/request/http/server.d.ts.map +1 -1
- package/dist/request/http/server.js +42 -8
- package/dist/request/http/server.js.map +1 -1
- package/dist/request/http/sniff.d.ts +21 -0
- package/dist/request/http/sniff.d.ts.map +1 -0
- package/dist/request/http/sniff.js +145 -0
- package/dist/request/http/sniff.js.map +1 -0
- package/dist/request/http/upload.d.ts +21 -13
- package/dist/request/http/upload.d.ts.map +1 -1
- package/dist/request/http/upload.js +128 -40
- package/dist/request/http/upload.js.map +1 -1
- package/package.json +1 -1
|
@@ -8,28 +8,36 @@ export declare const MULTIPART_FIELD_LIMIT: number;
|
|
|
8
8
|
export declare function uploadBodyLimit(config: UploadConfig): number;
|
|
9
9
|
/** `type/subtype` of a Content-Type value, lowercased and without parameters. */
|
|
10
10
|
export declare function mediaTypeOf(value: string | undefined): string;
|
|
11
|
-
/** True when `mediaType` matches an allowed entry
|
|
11
|
+
/** True when `mediaType` matches an allowed entry: exactly, by `type/*`, or by a star on each side of the slash (any non-empty type). */
|
|
12
12
|
export declare function mediaTypeAllowed(allowed: readonly string[], mediaType: string): boolean;
|
|
13
|
+
/** True for a 413 or 415 pipework raised for a file, as opposed to one a handler threw. */
|
|
14
|
+
export declare function isUploadRefusal(error: unknown): error is PayloadTooLargeError | UnsupportedMediaTypeError;
|
|
15
|
+
/** What pipework knows of the file at the moment it refuses it. */
|
|
16
|
+
export interface UploadTrack {
|
|
17
|
+
declaredType: string;
|
|
18
|
+
extension: string | null;
|
|
19
|
+
filename: string | null;
|
|
20
|
+
detectedType: string | null;
|
|
21
|
+
bytesRead: number;
|
|
22
|
+
}
|
|
23
|
+
export declare function newUploadTrack(): UploadTrack;
|
|
13
24
|
/**
|
|
14
|
-
* Refuses
|
|
15
|
-
*
|
|
16
|
-
*
|
|
25
|
+
* Refuses a multipart route's request that is not `multipart/form-data`, from
|
|
26
|
+
* its headers alone. A protocol error: no file is involved. Binary routes have
|
|
27
|
+
* no header check; their type is settled from the bytes.
|
|
17
28
|
*/
|
|
18
|
-
export declare function checkUploadHeaders(config: UploadConfig, headers: Record<string, string | string[] | undefined>): UnsupportedMediaTypeError |
|
|
29
|
+
export declare function checkUploadHeaders(config: UploadConfig, headers: Record<string, string | string[] | undefined>): UnsupportedMediaTypeError | null;
|
|
19
30
|
/**
|
|
20
31
|
* Passes `source` through, erroring with a 413 once more than `maxBytes` have
|
|
21
32
|
* passed. A failure of `source` becomes the failure of the returned stream.
|
|
22
33
|
*/
|
|
23
|
-
export declare function limitStream(source: Readable, maxBytes: number, mapError?: (e: unknown) => Error, onUnfinished?: () => Error): Readable;
|
|
24
|
-
/** Starts a binary upload: the request payload as a size-limited stream. */
|
|
25
|
-
export declare function binaryUpload(req: FastifyRequest, maxBytes: number): BinaryUpload;
|
|
34
|
+
export declare function limitStream(source: Readable, maxBytes: number, mapError?: (e: unknown) => Error, onUnfinished?: () => Error, track?: UploadTrack): Readable;
|
|
26
35
|
/**
|
|
27
|
-
*
|
|
28
|
-
*
|
|
36
|
+
* Starts an upload: refuses a declared length over the limit, builds the size-
|
|
37
|
+
* limited file stream, reads its first bytes to settle the media type, and
|
|
38
|
+
* refuses a type outside the route's list. `track` follows what is learned.
|
|
29
39
|
*/
|
|
30
|
-
export declare function
|
|
31
|
-
kind: 'multipart';
|
|
32
|
-
}>): Promise<MultipartUpload>;
|
|
40
|
+
export declare function startUpload(req: FastifyRequest, config: UploadConfig, track: UploadTrack): Promise<BinaryUpload | MultipartUpload>;
|
|
33
41
|
/**
|
|
34
42
|
* Ends an upload after its handler: a stream not read to the end is destroyed.
|
|
35
43
|
* Returns true when the body was left incomplete, so the caller closes the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../../src/request/http/upload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAa,MAAM,aAAa,CAAA;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../../src/request/http/upload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAa,MAAM,aAAa,CAAA;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAEjF,OAAO,EAA4C,oBAAoB,EAAE,yBAAyB,EAAmB,MAAM,4BAA4B,CAAA;AAEvJ,uDAAuD;AACvD,eAAO,MAAM,qBAAqB,QAAY,CAAA;AAG9C,yFAAyF;AACzF,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAG5D;AAED,iFAAiF;AACjF,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAG7D;AAED,yIAAyI;AACzI,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAQvF;AASD,2FAA2F;AAC3F,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,oBAAoB,GAAG,yBAAyB,CAEzG;AAED,mEAAmE;AACnE,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,wBAAgB,cAAc,IAAI,WAAW,CAE5C;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,GAAG,yBAAyB,GAAG,IAAI,CAWjJ;AAWD;;;GAGG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,QAAQ,EAChB,QAAQ,EAAE,MAAM,EAChB,QAAQ,GAAE,CAAC,CAAC,EAAE,OAAO,KAAK,KAAyB,EACnD,YAAY,CAAC,EAAE,MAAM,KAAK,EAC1B,KAAK,CAAC,EAAE,WAAW,GAClB,QAAQ,CA0BV;AA4FD;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,GAAG,eAAe,CAAC,CAmBxI;AAyCD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,OAAO,CAMlE"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Readable, Transform } from 'node:stream';
|
|
2
|
+
import { resolveMediaType, SNIFF_BYTES } from './sniff.js';
|
|
2
3
|
import { isPipeworkError, MalformedMultipartError, PayloadTooLargeError, UnsupportedMediaTypeError, ValidationError } from '../../core/errors/index.js';
|
|
3
4
|
/** Largest accepted multipart text field, in bytes. */
|
|
4
5
|
export const MULTIPART_FIELD_LIMIT = 64 * 1024;
|
|
@@ -15,36 +16,52 @@ export function mediaTypeOf(value) {
|
|
|
15
16
|
return '';
|
|
16
17
|
return (value.split(';')[0] ?? '').trim().toLowerCase();
|
|
17
18
|
}
|
|
18
|
-
/** True when `mediaType` matches an allowed entry
|
|
19
|
+
/** True when `mediaType` matches an allowed entry: exactly, by `type/*`, or by a star on each side of the slash (any non-empty type). */
|
|
19
20
|
export function mediaTypeAllowed(allowed, mediaType) {
|
|
20
21
|
if (mediaType === '')
|
|
21
22
|
return false;
|
|
22
23
|
for (const entry of allowed) {
|
|
23
24
|
const a = entry.trim().toLowerCase();
|
|
24
|
-
if (a === mediaType)
|
|
25
|
+
if (a === mediaType || a === '*/*')
|
|
25
26
|
return true;
|
|
26
27
|
if (a.endsWith('/*') && mediaType.startsWith(a.slice(0, -1)))
|
|
27
28
|
return true;
|
|
28
29
|
}
|
|
29
30
|
return false;
|
|
30
31
|
}
|
|
32
|
+
const pipeworkRefusals = new WeakSet();
|
|
33
|
+
function refusal(error) {
|
|
34
|
+
pipeworkRefusals.add(error);
|
|
35
|
+
return error;
|
|
36
|
+
}
|
|
37
|
+
/** True for a 413 or 415 pipework raised for a file, as opposed to one a handler threw. */
|
|
38
|
+
export function isUploadRefusal(error) {
|
|
39
|
+
return typeof error === 'object' && error !== null && pipeworkRefusals.has(error);
|
|
40
|
+
}
|
|
41
|
+
export function newUploadTrack() {
|
|
42
|
+
return { declaredType: '', extension: null, filename: null, detectedType: null, bytesRead: 0 };
|
|
43
|
+
}
|
|
31
44
|
/**
|
|
32
|
-
* Refuses
|
|
33
|
-
*
|
|
34
|
-
*
|
|
45
|
+
* Refuses a multipart route's request that is not `multipart/form-data`, from
|
|
46
|
+
* its headers alone. A protocol error: no file is involved. Binary routes have
|
|
47
|
+
* no header check; their type is settled from the bytes.
|
|
35
48
|
*/
|
|
36
49
|
export function checkUploadHeaders(config, headers) {
|
|
50
|
+
if (config.kind === 'binary')
|
|
51
|
+
return null;
|
|
37
52
|
const contentType = headers['content-type'];
|
|
38
53
|
const mediaType = mediaTypeOf(Array.isArray(contentType) ? contentType[0] : contentType);
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
54
|
+
if (mediaType === 'multipart/form-data')
|
|
55
|
+
return null;
|
|
56
|
+
return new UnsupportedMediaTypeError(mediaType === ''
|
|
57
|
+
? 'This route needs a Content-Type; accepted: multipart/form-data'
|
|
58
|
+
: `Media type ${mediaType} is not accepted; accepted: multipart/form-data`, { accepted: ['multipart/form-data'] });
|
|
59
|
+
}
|
|
60
|
+
/** 413 when the request declares a length over what the route may receive. */
|
|
61
|
+
function checkDeclaredLength(config, headers) {
|
|
45
62
|
const declared = Number(headers['content-length']);
|
|
46
63
|
if (headers['content-length'] !== undefined && Number.isFinite(declared) && declared > uploadBodyLimit(config)) {
|
|
47
|
-
return new PayloadTooLargeError(`Request body is ${declared} bytes; the limit is ${config.maxBytes}`, { maxBytes: config.maxBytes });
|
|
64
|
+
return refusal(new PayloadTooLargeError(`Request body is ${declared} bytes; the limit is ${config.maxBytes}`, { maxBytes: config.maxBytes }));
|
|
48
65
|
}
|
|
49
66
|
return null;
|
|
50
67
|
}
|
|
@@ -52,14 +69,16 @@ export function checkUploadHeaders(config, headers) {
|
|
|
52
69
|
* Passes `source` through, erroring with a 413 once more than `maxBytes` have
|
|
53
70
|
* passed. A failure of `source` becomes the failure of the returned stream.
|
|
54
71
|
*/
|
|
55
|
-
export function limitStream(source, maxBytes, mapError = (e) => e, onUnfinished) {
|
|
72
|
+
export function limitStream(source, maxBytes, mapError = (e) => e, onUnfinished, track) {
|
|
56
73
|
let seen = 0;
|
|
57
74
|
const counter = new Transform({
|
|
58
75
|
transform(chunk, _enc, cb) {
|
|
59
76
|
seen += chunk.length;
|
|
77
|
+
if (track !== undefined)
|
|
78
|
+
track.bytesRead = seen;
|
|
60
79
|
if (seen > maxBytes) {
|
|
61
80
|
source.unpipe(counter);
|
|
62
|
-
cb(new PayloadTooLargeError(`Upload is over the limit of ${maxBytes} bytes`, { maxBytes }));
|
|
81
|
+
cb(refusal(new PayloadTooLargeError(`Upload is over the limit of ${maxBytes} bytes`, { maxBytes })));
|
|
63
82
|
return;
|
|
64
83
|
}
|
|
65
84
|
cb(null, chunk);
|
|
@@ -84,7 +103,7 @@ export function limitStream(source, maxBytes, mapError = (e) => e, onUnfinished)
|
|
|
84
103
|
function toUploadError(e) {
|
|
85
104
|
const code = e?.code;
|
|
86
105
|
if (code === 'FST_REQ_FILE_TOO_LARGE')
|
|
87
|
-
return new PayloadTooLargeError('Uploaded file is over the size limit');
|
|
106
|
+
return refusal(new PayloadTooLargeError('Uploaded file is over the size limit'));
|
|
88
107
|
return asMalformedMultipart(e);
|
|
89
108
|
}
|
|
90
109
|
/** A parser failure becomes a 400; errors that already carry a status are kept. */
|
|
@@ -97,31 +116,101 @@ function asMalformedMultipart(e) {
|
|
|
97
116
|
const message = e instanceof Error ? e.message : String(e);
|
|
98
117
|
return new MalformedMultipartError(undefined, { cause: message });
|
|
99
118
|
}
|
|
100
|
-
/**
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
const
|
|
105
|
-
const
|
|
106
|
-
return
|
|
107
|
-
stream: limitStream(source, maxBytes),
|
|
108
|
-
mediaType: mediaTypeOf(req.headers['content-type']),
|
|
109
|
-
length: length !== null && Number.isFinite(length) ? length : null,
|
|
110
|
-
};
|
|
119
|
+
/** Lowercase text after the last dot of a filename; null without a filename or a dot. */
|
|
120
|
+
function extensionOf(filename) {
|
|
121
|
+
if (filename === null)
|
|
122
|
+
return null;
|
|
123
|
+
const dot = filename.lastIndexOf('.');
|
|
124
|
+
const ext = dot < 0 ? '' : filename.slice(dot + 1).toLowerCase();
|
|
125
|
+
return ext === '' ? null : ext;
|
|
111
126
|
}
|
|
112
127
|
/**
|
|
113
|
-
* Reads
|
|
114
|
-
*
|
|
128
|
+
* Reads up to SNIFF_BYTES from `source`, then returns them with a stream that
|
|
129
|
+
* yields them again followed by the rest of `source`, byte for byte. Nothing
|
|
130
|
+
* further is buffered. A failure of `source` while reading the head is thrown.
|
|
131
|
+
*/
|
|
132
|
+
async function withHead(source) {
|
|
133
|
+
const it = source[Symbol.asyncIterator]();
|
|
134
|
+
const chunks = [];
|
|
135
|
+
let length = 0;
|
|
136
|
+
let ended = false;
|
|
137
|
+
while (length < SNIFF_BYTES) {
|
|
138
|
+
const next = await it.next();
|
|
139
|
+
if (next.done === true) {
|
|
140
|
+
ended = true;
|
|
141
|
+
break;
|
|
142
|
+
}
|
|
143
|
+
chunks.push(next.value);
|
|
144
|
+
length += next.value.length;
|
|
145
|
+
}
|
|
146
|
+
const all = Buffer.concat(chunks);
|
|
147
|
+
async function* rejoin() {
|
|
148
|
+
try {
|
|
149
|
+
if (all.length > 0)
|
|
150
|
+
yield all;
|
|
151
|
+
while (!ended) {
|
|
152
|
+
const next = await it.next();
|
|
153
|
+
if (next.done === true)
|
|
154
|
+
return;
|
|
155
|
+
yield next.value;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
finally {
|
|
159
|
+
source.destroy();
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
const stream = Readable.from(rejoin(), { objectMode: false });
|
|
163
|
+
stream.on('close', () => source.destroy());
|
|
164
|
+
return { head: all.subarray(0, SNIFF_BYTES), stream };
|
|
165
|
+
}
|
|
166
|
+
/** Reads the head of `limited`, settles the file's type and refuses a type outside the route's list. */
|
|
167
|
+
async function sniffFile(config, limited, declaredType, filename, track) {
|
|
168
|
+
const extension = extensionOf(filename);
|
|
169
|
+
track.declaredType = declaredType;
|
|
170
|
+
track.filename = filename;
|
|
171
|
+
track.extension = extension;
|
|
172
|
+
const { head, stream } = await withHead(limited);
|
|
173
|
+
const { detectedType, mediaType } = resolveMediaType({ head, declared: declaredType, extension });
|
|
174
|
+
track.detectedType = detectedType;
|
|
175
|
+
if (!mediaTypeAllowed(config.mediaTypes, mediaType)) {
|
|
176
|
+
stream.destroy();
|
|
177
|
+
throw refusal(new UnsupportedMediaTypeError(`File media type is not accepted (detected ${detectedType ?? 'none'}, declared ${declaredType === '' ? 'none' : declaredType}); accepted: ${config.mediaTypes.join(', ')}`, { accepted: config.mediaTypes, detectedType, declaredType }));
|
|
178
|
+
}
|
|
179
|
+
return { stream, mediaType, detectedType, declaredType, extension };
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Starts an upload: refuses a declared length over the limit, builds the size-
|
|
183
|
+
* limited file stream, reads its first bytes to settle the media type, and
|
|
184
|
+
* refuses a type outside the route's list. `track` follows what is learned.
|
|
115
185
|
*/
|
|
116
|
-
export async function
|
|
186
|
+
export async function startUpload(req, config, track) {
|
|
187
|
+
if (config.kind === 'binary') {
|
|
188
|
+
track.declaredType = mediaTypeOf(req.headers['content-type']);
|
|
189
|
+
const tooLarge = checkDeclaredLength(config, req.headers);
|
|
190
|
+
if (tooLarge !== null)
|
|
191
|
+
throw tooLarge;
|
|
192
|
+
const body = req.body;
|
|
193
|
+
const source = body instanceof Readable ? body : Readable.from([]);
|
|
194
|
+
const declared = req.headers['content-length'];
|
|
195
|
+
const length = declared === undefined ? null : Number(declared);
|
|
196
|
+
const file = await sniffFile(config, limitStream(source, config.maxBytes, undefined, undefined, track), track.declaredType, null, track);
|
|
197
|
+
return { ...file, length: length !== null && Number.isFinite(length) ? length : null };
|
|
198
|
+
}
|
|
199
|
+
const tooLarge = checkDeclaredLength(config, req.headers);
|
|
200
|
+
if (tooLarge !== null)
|
|
201
|
+
throw tooLarge;
|
|
117
202
|
try {
|
|
118
|
-
return await readMultipart(req, config);
|
|
203
|
+
return await readMultipart(req, config, track);
|
|
119
204
|
}
|
|
120
205
|
catch (e) {
|
|
121
206
|
throw asMalformedMultipart(e);
|
|
122
207
|
}
|
|
123
208
|
}
|
|
124
|
-
|
|
209
|
+
/**
|
|
210
|
+
* Reads a multipart body up to its file part: the text fields before it, then
|
|
211
|
+
* the file as a size-limited stream. Nothing after the file part is read.
|
|
212
|
+
*/
|
|
213
|
+
async function readMultipart(req, config, track) {
|
|
125
214
|
const allowedFields = new Set(config.fields ?? []);
|
|
126
215
|
const fields = {};
|
|
127
216
|
for await (const part of req.parts()) {
|
|
@@ -139,17 +228,16 @@ async function readMultipart(req, config) {
|
|
|
139
228
|
part.file.resume();
|
|
140
229
|
throw new ValidationError({ [part.fieldname]: ['Unexpected file field'] }, `Unexpected file field "${part.fieldname}"; the file goes in "${config.file}"`);
|
|
141
230
|
}
|
|
142
|
-
const
|
|
143
|
-
|
|
231
|
+
const filename = part.filename === '' ? null : part.filename;
|
|
232
|
+
const limited = limitStream(part.file, config.maxBytes, toUploadError, () => new MalformedMultipartError(undefined, { cause: 'The body ended before the file part was closed' }), track);
|
|
233
|
+
try {
|
|
234
|
+
const file = await sniffFile(config, limited, mediaTypeOf(part.mimetype), filename, track);
|
|
235
|
+
return { ...file, filename, fields };
|
|
236
|
+
}
|
|
237
|
+
catch (e) {
|
|
144
238
|
part.file.resume();
|
|
145
|
-
throw
|
|
239
|
+
throw e;
|
|
146
240
|
}
|
|
147
|
-
return {
|
|
148
|
-
stream: limitStream(part.file, config.maxBytes, toUploadError, () => new MalformedMultipartError(undefined, { cause: 'The body ended before the file part was closed' })),
|
|
149
|
-
mediaType,
|
|
150
|
-
filename: part.filename === '' ? null : part.filename,
|
|
151
|
-
fields,
|
|
152
|
-
};
|
|
153
241
|
}
|
|
154
242
|
throw new ValidationError({ [config.file]: ['Required'] }, `The form has no file part named "${config.file}"`);
|
|
155
243
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upload.js","sourceRoot":"","sources":["../../../src/request/http/upload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAGjD,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAEvJ,uDAAuD;AACvD,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,GAAG,IAAI,CAAA;AAC9C,MAAM,kBAAkB,GAAG,EAAE,GAAG,IAAI,CAAA;AAEpC,yFAAyF;AACzF,MAAM,UAAU,eAAe,CAAC,MAAoB;IAClD,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,QAAQ,CAAA;IACpD,OAAO,MAAM,CAAC,QAAQ,GAAG,kBAAkB,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,qBAAqB,CAAA;AACpG,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,WAAW,CAAC,KAAyB;IACnD,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,CAAA;IAClC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;AACzD,CAAC;AAED,
|
|
1
|
+
{"version":3,"file":"upload.js","sourceRoot":"","sources":["../../../src/request/http/upload.ts"],"names":[],"mappings":"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"}
|