import { createWriteStream } from 'fs'; import { join, dirname } from 'path'; import Busboy from 'busboy'; import mkdirp from 'mkdirp'; function formData( contType: string, options: busboy.BusboyConfig & { abortOnLimit?: boolean; tmpDir?: string; onFile?: ( fieldname: string, file: NodeJS.ReadableStream, filename: string, encoding: string, mimetype: string ) => string; onField?: (fieldname: string, value: any) => void; // eslint-disable-line @typescript-eslint/no-explicit-any filename?: (oldName: string) => string; } = {} ) { console.log('Enter form data'); options.headers = { 'content-type': contType }; return new Promise((resolve, reject) => { const busb = new Busboy(options); const ret = {}; this.bodyStream().pipe(busb); busb.on('limit', () => { if (options.abortOnLimit) { reject(Error('limit')); } }); busb.on('file', function(fieldname, file, filename, encoding, mimetype) { const value: { filePath: string|undefined, filename: string, encoding:string, mimetype: string } = { filename, encoding, mimetype, filePath: undefined }; if (typeof options.tmpDir === 'string') { if (typeof options.filename === 'function') filename = options.filename(filename); const fileToSave = join(options.tmpDir, filename); mkdirp(dirname(fileToSave)); file.pipe(createWriteStream(fileToSave)); value.filePath = fileToSave; } if (typeof options.onFile === 'function') { value.filePath = options.onFile(fieldname, file, filename, encoding, mimetype) || value.filePath; } setRetValue(ret, fieldname, value); }); busb.on('field', function(fieldname, value) { if (typeof options.onField === 'function') options.onField(fieldname, value); setRetValue(ret, fieldname, value); }); busb.on('finish', function() { resolve(ret); }); busb.on('error', reject); }); } function setRetValue( ret: { [x: string]: any }, // eslint-disable-line @typescript-eslint/no-explicit-any fieldname: string, value: { filename: string; encoding: string; mimetype: string; filePath?: string } | any // eslint-disable-line @typescript-eslint/no-explicit-any ) { if (fieldname.endsWith('[]')) { fieldname = fieldname.slice(0, fieldname.length - 2); if (Array.isArray(ret[fieldname])) { ret[fieldname].push(value); } else { ret[fieldname] = [value]; } } else { if (Array.isArray(ret[fieldname])) { ret[fieldname].push(value); } else if (ret[fieldname]) { ret[fieldname] = [ret[fieldname], value]; } else { ret[fieldname] = value; } } } export default formData;