{"version":3,"file":"body.mjs","sources":["../../src/middlewares/body.ts"],"sourcesContent":["import fse from 'fs-extra';\nimport { defaultsDeep } from 'lodash/fp';\nimport body from 'koa-body';\nimport mime from 'mime-types';\nimport type Koa from 'koa';\nimport type { Common } from '@strapi/types';\n\nexport type Config = body.IKoaBodyOptions;\n\nconst defaults = {\n  multipart: true,\n  patchKoa: true,\n};\n\nfunction ensureFileMimeType(file: any): void {\n  if (!file.type) {\n    file.type = mime.lookup(file.name) || 'application/octet-stream';\n  }\n}\n\nfunction getFiles(ctx: Koa.Context) {\n  return ctx?.request?.files?.files;\n}\n\nconst bodyMiddleware: Common.MiddlewareFactory<Config> = (config, { strapi }) => {\n  const bodyConfig: Config = defaultsDeep(defaults, config);\n\n  let gqlEndpoint: string | undefined;\n  if (strapi.plugin('graphql')) {\n    const { config: gqlConfig } = strapi.plugin('graphql');\n    gqlEndpoint = gqlConfig('endpoint');\n  }\n\n  return async (ctx, next) => {\n    // TODO: find a better way later\n    if (gqlEndpoint && ctx.url === gqlEndpoint) {\n      await next();\n    } else {\n      try {\n        await body({ patchKoa: true, ...bodyConfig })(ctx, async () => {});\n\n        const files = getFiles(ctx);\n\n        /**\n         * in case the mime-type wasn't sent, Strapi tries to guess it\n         * from the file extension, to avoid a corrupt database state\n         */\n        if (files) {\n          if (Array.isArray(files)) {\n            files.forEach(ensureFileMimeType);\n          } else {\n            ensureFileMimeType(files);\n          }\n        }\n\n        await next();\n      } catch (error) {\n        if (\n          error instanceof Error &&\n          error.message &&\n          error.message.includes('maxFileSize exceeded')\n        ) {\n          return ctx.payloadTooLarge('FileTooBig');\n        }\n\n        throw error;\n      }\n    }\n\n    const files = getFiles(ctx);\n\n    // clean any file that was uploaded\n    if (files) {\n      if (Array.isArray(files)) {\n        // not awaiting to not slow the request\n        Promise.all(files.map((file) => fse.remove(file.path)));\n      } else if (files && files.path) {\n        // not awaiting to not slow the request\n        fse.remove(files.path);\n      }\n      delete ctx.request.files;\n    }\n  };\n};\n\nexport { bodyMiddleware as body };\n"],"names":["files"],"mappings":";;;;AASA,MAAM,WAAW;AAAA,EACf,WAAW;AAAA,EACX,UAAU;AACZ;AAEA,SAAS,mBAAmB,MAAiB;AACvC,MAAA,CAAC,KAAK,MAAM;AACd,SAAK,OAAO,KAAK,OAAO,KAAK,IAAI,KAAK;AAAA,EACxC;AACF;AAEA,SAAS,SAAS,KAAkB;AAC3B,SAAA,KAAK,SAAS,OAAO;AAC9B;AAEA,MAAM,iBAAmD,CAAC,QAAQ,EAAE,aAAa;AACzE,QAAA,aAAqB,aAAa,UAAU,MAAM;AAEpD,MAAA;AACA,MAAA,OAAO,OAAO,SAAS,GAAG;AAC5B,UAAM,EAAE,QAAQ,UAAA,IAAc,OAAO,OAAO,SAAS;AACrD,kBAAc,UAAU,UAAU;AAAA,EACpC;AAEO,SAAA,OAAO,KAAK,SAAS;AAEtB,QAAA,eAAe,IAAI,QAAQ,aAAa;AAC1C,YAAM,KAAK;AAAA,IAAA,OACN;AACD,UAAA;AACI,cAAA,KAAK,EAAE,UAAU,MAAM,GAAG,WAAY,CAAA,EAAE,KAAK,YAAY;AAAA,QAAA,CAAE;AAE3DA,cAAAA,SAAQ,SAAS,GAAG;AAM1B,YAAIA,QAAO;AACL,cAAA,MAAM,QAAQA,MAAK,GAAG;AACxBA,mBAAM,QAAQ,kBAAkB;AAAA,UAAA,OAC3B;AACL,+BAAmBA,MAAK;AAAA,UAC1B;AAAA,QACF;AAEA,cAAM,KAAK;AAAA,eACJ,OAAO;AAEZ,YAAA,iBAAiB,SACjB,MAAM,WACN,MAAM,QAAQ,SAAS,sBAAsB,GAC7C;AACO,iBAAA,IAAI,gBAAgB,YAAY;AAAA,QACzC;AAEM,cAAA;AAAA,MACR;AAAA,IACF;AAEM,UAAA,QAAQ,SAAS,GAAG;AAG1B,QAAI,OAAO;AACL,UAAA,MAAM,QAAQ,KAAK,GAAG;AAEhB,gBAAA,IAAI,MAAM,IAAI,CAAC,SAAS,IAAI,OAAO,KAAK,IAAI,CAAC,CAAC;AAAA,MAAA,WAC7C,SAAS,MAAM,MAAM;AAE1B,YAAA,OAAO,MAAM,IAAI;AAAA,MACvB;AACA,aAAO,IAAI,QAAQ;AAAA,IACrB;AAAA,EAAA;AAEJ;"}