@lucaapp/service-utils 1.59.6 → 1.60.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.
@@ -167,6 +167,41 @@ async function stream2buffer(stream) {
167
167
  stream.on('error', error => reject(error));
168
168
  });
169
169
  }
170
+ function handleMultipleFileUpload(request) {
171
+ return new Promise((resolve, reject) => {
172
+ const bb = (0, busboy_1.default)({
173
+ headers: request.headers,
174
+ defCharset: 'utf8',
175
+ limits: {
176
+ fileSize: 20 * 1024 * 1024, // 20 mb per file
177
+ files: 10,
178
+ },
179
+ });
180
+ const files = [];
181
+ bb.once('error', error => {
182
+ reject(error);
183
+ });
184
+ bb.on('file', async (fieldname, fileStream, filename) => {
185
+ const { encoding, mimeType: mimetype, filename: name } = filename;
186
+ const originalName = Buffer.from(name, 'latin1').toString('utf8');
187
+ const fileBuffer = await stream2buffer(fileStream);
188
+ const file = {
189
+ buffer: fileBuffer,
190
+ originalname: originalName,
191
+ encoding,
192
+ mimetype,
193
+ size: fileBuffer.length,
194
+ fieldname: fieldname,
195
+ filename: name,
196
+ };
197
+ files.push(file);
198
+ });
199
+ bb.once('finish', () => {
200
+ resolve(files);
201
+ });
202
+ request.pipe(bb);
203
+ });
204
+ }
170
205
  function handleFileUpload(request) {
171
206
  return new Promise((resolve, reject) => {
172
207
  const bb = (0, busboy_1.default)({
@@ -234,10 +269,16 @@ new Promise(async (resolve) => {
234
269
  request.headers['content-type']?.includes('multipart/form-data')) {
235
270
  file = await handleFileUpload(request);
236
271
  }
272
+ let files = undefined;
273
+ if (middleware.options.config?.isFilesUpload &&
274
+ request.headers['content-type']?.includes('multipart/form-data')) {
275
+ files = await handleMultipleFileUpload(request);
276
+ }
237
277
  // if the header is multipart we should return a buffer with the content
238
278
  const handlerRequest = {
239
279
  body: handlerRequestBody,
240
280
  ...(file && { file }),
281
+ ...(files && { files }),
241
282
  params: handlerRequestParams,
242
283
  query: handlerRequestQuery,
243
284
  headers: handlerRequestHeaders,
@@ -27,6 +27,7 @@ export type MiddlewareHandler<TResponseSchema, TRequestBodySchema, TRequestParam
27
27
  path: string;
28
28
  method: string;
29
29
  file?: FileUpload;
30
+ files?: FileUpload[];
30
31
  }, send: (response: ExtractZodOutput<ArrayToUnion<TResponseSchema>>) => void, next: (context?: ZodSchemaOuput<TContextSchema>) => void) => Promise<void>;
31
32
  export type MiddlewareOptions<TResponseSchemas extends ReadonlyArray<EndpointResponseSchema>, TRequestBodySchema, TRequestParamsSchema, TRequestQuerySchema, TRequestHeadersSchema, TContextSchema> = {
32
33
  schemas?: {
@@ -39,6 +40,7 @@ export type MiddlewareOptions<TResponseSchemas extends ReadonlyArray<EndpointRes
39
40
  responses: TResponseSchemas;
40
41
  config?: {
41
42
  isFileUpload?: boolean;
43
+ isFilesUpload?: boolean;
42
44
  };
43
45
  errors?: Record<string, number>;
44
46
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lucaapp/service-utils",
3
- "version": "1.59.6",
3
+ "version": "1.60.0",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "files": [
@@ -65,7 +65,7 @@
65
65
  "prettier": "2.7.1",
66
66
  "semantic-release": "^19.0.3",
67
67
  "semantic-release-monorepo": "^7.0.5",
68
- "sqlite3": "5.0.4",
68
+ "sqlite3": "5.1.1",
69
69
  "supertest": "^6.3.3",
70
70
  "typescript": "5.5.3",
71
71
  "vite-tsconfig-paths": "4.3.2",
@@ -78,6 +78,7 @@
78
78
  "braces": "3.0.3",
79
79
  "send": "0.19.0",
80
80
  "rollup": "4.22.4",
81
- "cookie": ">= 0.7.0"
81
+ "cookie": ">= 0.7.0",
82
+ "string-width": "4.2.3"
82
83
  }
83
84
  }