From 49f3a623293af178e197f1e3339b322ebd778f54 Mon Sep 17 00:00:00 2001 From: "Cesar V. Sampaio" <37849741+cesarvspr@users.noreply.github.com> Date: Wed, 26 Oct 2022 03:30:31 -0700 Subject: [PATCH] fix(types): make definitions nodenext compatible (#396) * chore: make definitions nodenext compatible * chore: add index necessary changes --- index.d.ts | 265 ++++++++++++++++++++---------------- index.js | 10 +- test/named-import.test-d.ts | 6 + 3 files changed, 166 insertions(+), 115 deletions(-) create mode 100644 test/named-import.test-d.ts diff --git a/index.d.ts b/index.d.ts index 821bf905..2867dcb8 100644 --- a/index.d.ts +++ b/index.d.ts @@ -1,92 +1,111 @@ import { Busboy, BusboyConfig, BusboyFileStream } from "@fastify/busboy"; import { FastifyPluginCallback } from "fastify"; -import { Readable } from 'stream'; +import { Readable } from "stream"; import { FastifyErrorConstructor } from "@fastify/error"; -type MultipartHandler = ( - field: string, - file: BusboyFileStream, - filename: string, - encoding: string, - mimetype: string, -) => void; - -interface BodyEntry { - data: Buffer, - filename: string, - encoding: string, - mimetype: string, - limit: false -} - -export interface MultipartFields { - [fieldname: string]: Multipart | Multipart[] | undefined; +declare module "fastify" { + interface FastifyRequest { + isMultipart: () => boolean; + + // promise api + parts: ( + options?: Omit + ) => AsyncIterableIterator; + + // legacy + multipart: ( + handler: MultipartHandler, + next: (err: Error) => void, + options?: Omit + ) => Busboy; + + // Stream mode + file: ( + options?: Omit + ) => Promise; + files: ( + options?: Omit + ) => AsyncIterableIterator; + + // Disk mode + saveRequestFiles: ( + options?: Omit & { tmpdir?: string } + ) => Promise>; + cleanRequestFiles: () => Promise; + tmpUploads: Array | null; + } + + interface FastifyInstance { + multipartErrors: MultipartErrors; + } } -export type Multipart = MultipartFile | MultipartValue; +type FastifyMultipartPlugin = FastifyPluginCallback< + | fastifyMultipart.FastifyMultipartBaseOptions + | fastifyMultipart.FastifyMultipartOptions + | fastifyMultipart.FastifyMultipartAttachFieldsToBodyOptions +>; -export interface MultipartFile { - toBuffer: () => Promise, +type MultipartHandler = ( + field: string, file: BusboyFileStream, - fieldname: string, filename: string, encoding: string, - mimetype: string, - fields: MultipartFields -} - -export interface SavedMultipartFile extends MultipartFile { - /** - * Path to the temporary file - */ - filepath: string, -} + mimetype: string +) => void; -export interface MultipartValue { - value: T; - fieldname: string; - mimetype: string; +interface BodyEntry { + data: Buffer; + filename: string; encoding: string; - fieldnameTruncated: boolean; - valueTruncated: boolean; - fields: MultipartFields; + mimetype: string; + limit: false; } interface MultipartErrors { - PartsLimitError: FastifyErrorConstructor, - FilesLimitError: FastifyErrorConstructor, - FieldsLimitError: FastifyErrorConstructor, - PrototypeViolationError: FastifyErrorConstructor, - InvalidMultipartContentTypeError: FastifyErrorConstructor, - RequestFileTooLargeError: FastifyErrorConstructor + PartsLimitError: FastifyErrorConstructor; + FilesLimitError: FastifyErrorConstructor; + FieldsLimitError: FastifyErrorConstructor; + PrototypeViolationError: FastifyErrorConstructor; + InvalidMultipartContentTypeError: FastifyErrorConstructor; + RequestFileTooLargeError: FastifyErrorConstructor; } -declare module "fastify" { - interface FastifyRequest { - isMultipart: () => boolean; - - // promise api - parts: (options?: Omit) => AsyncIterableIterator - - // legacy - multipart: (handler: MultipartHandler, next: (err: Error) => void, options?: Omit) => Busboy; - - // Stream mode - file: (options?: Omit) => Promise - files: (options?: Omit) => AsyncIterableIterator - - // Disk mode - saveRequestFiles: (options?: Omit & { tmpdir?: string }) => Promise> - cleanRequestFiles: () => Promise - tmpUploads: Array | null - } - - interface FastifyInstance { - multipartErrors: MultipartErrors - } -} +declare namespace fastifyMultipart { + export interface SavedMultipartFile extends MultipartFile { + /** + * Path to the temporary file + */ + filepath: string; + } + + export type Multipart = MultipartFile | MultipartValue; + + export interface MultipartFile { + toBuffer: () => Promise; + file: BusboyFileStream; + fieldname: string; + filename: string; + encoding: string; + mimetype: string; + fields: MultipartFields; + } + + export interface MultipartValue { + value: T; + fieldname: string; + mimetype: string; + encoding: string; + fieldnameTruncated: boolean; + valueTruncated: boolean; + fields: MultipartFields; + } + + export interface MultipartFields { + [fieldname: string]: Multipart | Multipart[] | undefined; + } -export interface FastifyMultipartBaseOptions { + export interface FastifyMultipartBaseOptions { /** * Append the multipart parameters to the body object */ @@ -100,7 +119,7 @@ export interface FastifyMultipartBaseOptions { /** * Allow throwing error when file size limit reached. */ - throwFileSizeLimit?: boolean + throwFileSizeLimit?: boolean; /** * Detect if a Part is a file. @@ -111,64 +130,82 @@ export interface FastifyMultipartBaseOptions { * * Modify this to handle e.g. Blobs. */ - isPartAFile?: (fieldName: string | undefined, contentType: string | undefined, fileName: string | undefined) => boolean; + isPartAFile?: ( + fieldName: string | undefined, + contentType: string | undefined, + fileName: string | undefined + ) => boolean; limits?: { - /** - * Max field name size in bytes - */ - fieldNameSize?: number; - - /** - * Max field value size in bytes - */ - fieldSize?: number; - - /** - * Max number of non-file fields - */ - fields?: number; - - /** - * For multipart forms, the max file size - */ - fileSize?: number; - - /** - * Max number of file fields - */ - files?: number; - - /** - * Max number of header key=>value pairs - */ - headerPairs?: number; - } -} - -export interface FastifyMultipartOptions extends FastifyMultipartBaseOptions { + /** + * Max field name size in bytes + */ + fieldNameSize?: number; + + /** + * Max field value size in bytes + */ + fieldSize?: number; + + /** + * Max number of non-file fields + */ + fields?: number; + + /** + * For multipart forms, the max file size + */ + fileSize?: number; + + /** + * Max number of file fields + */ + files?: number; + + /** + * Max number of header key=>value pairs + */ + headerPairs?: number; + }; + } + + export interface FastifyMultipartOptions extends FastifyMultipartBaseOptions { /** * Only valid in the promise api. Append the multipart parameters to the body object. */ - attachFieldsToBody?: false + attachFieldsToBody?: false; /** * Manage the file stream like you need */ - onFile?: (fieldName: string, stream: Readable, filename: string, encoding: string, mimetype: string, body: Record) => void | Promise; -} - -export interface FastifyMultipartAttactFieldsToBodyOptions extends FastifyMultipartBaseOptions { + onFile?: ( + fieldName: string, + stream: Readable, + filename: string, + encoding: string, + mimetype: string, + body: Record + ) => void | Promise; + } + + export interface FastifyMultipartAttachFieldsToBodyOptions + extends FastifyMultipartBaseOptions { /** * Only valid in the promise api. Append the multipart parameters to the body object. */ - attachFieldsToBody: true | 'keyValues'; + attachFieldsToBody: true | "keyValues"; /** * Manage the file stream like you need */ onFile?: (part: MultipartFile) => void | Promise; + } + + export const fastifyMultipart: FastifyMultipartPlugin; + export { fastifyMultipart as default }; } +declare function fastifyMultipart( + ...params: Parameters +): ReturnType; -declare const fastifyMultipart: FastifyPluginCallback; -export default fastifyMultipart; +export = fastifyMultipart; diff --git a/index.js b/index.js index ba34a7ad..566a6015 100644 --- a/index.js +++ b/index.js @@ -575,7 +575,15 @@ function fastifyMultipart (fastify, options, done) { done() } -module.exports = fp(fastifyMultipart, { +const _fastifyMultipart = fp(fastifyMultipart, { fastify: '4.x', name: '@fastify/multipart' }) + +/** + * These export configurations enable JS and TS developers + * to consumer fastify in whatever way best suits their needs. + */ +module.exports = _fastifyMultipart +module.exports.fastifyMultipart = _fastifyMultipart +module.exports.default = _fastifyMultipart diff --git a/test/named-import.test-d.ts b/test/named-import.test-d.ts new file mode 100644 index 00000000..02084754 --- /dev/null +++ b/test/named-import.test-d.ts @@ -0,0 +1,6 @@ +import fastify from "fastify"; +import { fastifyMultipart } from ".."; + +const app = fastify(); + +app.register(fastifyMultipart);