{"version":3,"file":"koa.mjs","sources":["../../../src/services/server/koa.ts"],"sourcesContent":["import { isNil, camelCase } from 'lodash/fp';\nimport Koa from 'koa';\nimport createError from 'http-errors';\nimport delegate from 'delegates';\nimport statuses from 'statuses';\nimport { formatHttpError } from '../errors';\n\ndeclare module 'koa' {\n  interface BaseResponse {\n    send: (data: any, status?: number) => void;\n    created: (data: any) => void;\n    deleted: (data: any) => void;\n    _explicitStatus: boolean;\n    [key: string]: (message: string, details?: unknown) => void;\n  }\n}\n\nconst addCustomMethods = (app: Koa) => {\n  const delegator = delegate(app.context, 'response');\n\n  /* errors */\n  statuses.codes\n    .filter((code) => code >= 400 && code < 600)\n    .forEach((code) => {\n      const name = statuses(code);\n\n      const camelCasedName = camelCase(name);\n      app.response[camelCasedName] = function responseCode(message = name, details = {}) {\n        const httpError = createError(code, message, { details });\n        const { status, body } = formatHttpError(httpError);\n        this.status = status;\n        this.body = body;\n      };\n      delegator.method(camelCasedName);\n    });\n\n  /* send, created, deleted */\n  app.response.send = function send(data, status = 200) {\n    this.status = status;\n    this.body = data;\n  };\n\n  app.response.created = function created(data) {\n    this.status = 201;\n    this.body = data;\n  };\n\n  app.response.deleted = function deleted(data) {\n    if (isNil(data)) {\n      this.status = 204;\n    } else {\n      this.status = 200;\n      this.body = data;\n    }\n  };\n\n  delegator.method('send').method('created').method('deleted');\n\n  return app;\n};\n\nconst createKoaApp = ({ proxy, keys }: { proxy: boolean; keys: string[] }) => {\n  const app = new Koa({ proxy });\n  app.keys = keys;\n\n  addCustomMethods(app);\n\n  return app;\n};\n\nexport default createKoaApp;\n"],"names":["addCustomMethods","app","delegator","delegate","context","statuses","codes","filter","code","forEach","name","camelCasedName","camelCase","response","responseCode","message","details","httpError","createError","status","body","formatHttpError","method","send","data","created","deleted","isNil","createKoaApp","proxy","keys","Koa"],"mappings":";;;;;;;AAiBA,MAAMA,mBAAmB,CAACC,GAAAA,GAAAA;AACxB,IAAA,MAAMC,SAAAA,GAAYC,QAAAA,CAASF,GAAAA,CAAIG,OAAO,EAAE,UAAA,CAAA;AAExC,iBACAC,QAAAA,CAASC,KAAK,CACXC,MAAM,CAAC,CAACC,IAAAA,GAASA,IAAAA,IAAQ,GAAA,IAAOA,IAAAA,GAAO,GAAA,CAAA,CACvCC,OAAO,CAAC,CAACD,IAAAA,GAAAA;AACR,QAAA,MAAME,OAAOL,QAAAA,CAASG,IAAAA,CAAAA;AAEtB,QAAA,MAAMG,iBAAiBC,SAAAA,CAAUF,IAAAA,CAAAA;QACjCT,GAAAA,CAAIY,QAAQ,CAACF,cAAAA,CAAe,GAAG,SAASG,YAAAA,CAAaC,OAAAA,GAAUL,IAAI,EAAEM,OAAAA,GAAU,EAAE,EAAA;YAC/E,MAAMC,SAAAA,GAAYC,WAAAA,CAAYV,IAAAA,EAAMO,OAAAA,EAAS;AAAEC,gBAAAA;AAAQ,aAAA,CAAA;AACvD,YAAA,MAAM,EAAEG,MAAM,EAAEC,IAAI,EAAE,GAAGC,eAAAA,CAAgBJ,SAAAA,CAAAA;YACzC,IAAI,CAACE,MAAM,GAAGA,MAAAA;YACd,IAAI,CAACC,IAAI,GAAGA,IAAAA;AACd,QAAA,CAAA;AACAlB,QAAAA,SAAAA,CAAUoB,MAAM,CAACX,cAAAA,CAAAA;AACnB,IAAA,CAAA,CAAA;iCAGFV,GAAAA,CAAIY,QAAQ,CAACU,IAAI,GAAG,SAASA,IAAAA,CAAKC,IAAI,EAAEL,MAAAA,GAAS,GAAG,EAAA;QAClD,IAAI,CAACA,MAAM,GAAGA,MAAAA;QACd,IAAI,CAACC,IAAI,GAAGI,IAAAA;AACd,IAAA,CAAA;AAEAvB,IAAAA,GAAAA,CAAIY,QAAQ,CAACY,OAAO,GAAG,SAASA,QAAQD,IAAI,EAAA;QAC1C,IAAI,CAACL,MAAM,GAAG,GAAA;QACd,IAAI,CAACC,IAAI,GAAGI,IAAAA;AACd,IAAA,CAAA;AAEAvB,IAAAA,GAAAA,CAAIY,QAAQ,CAACa,OAAO,GAAG,SAASA,QAAQF,IAAI,EAAA;AAC1C,QAAA,IAAIG,MAAMH,IAAAA,CAAAA,EAAO;YACf,IAAI,CAACL,MAAM,GAAG,GAAA;QAChB,CAAA,MAAO;YACL,IAAI,CAACA,MAAM,GAAG,GAAA;YACd,IAAI,CAACC,IAAI,GAAGI,IAAAA;AACd,QAAA;AACF,IAAA,CAAA;AAEAtB,IAAAA,SAAAA,CAAUoB,MAAM,CAAC,MAAA,CAAA,CAAQA,MAAM,CAAC,SAAA,CAAA,CAAWA,MAAM,CAAC,SAAA,CAAA;IAElD,OAAOrB,GAAAA;AACT,CAAA;AAEA,MAAM2B,eAAe,CAAC,EAAEC,KAAK,EAAEC,IAAI,EAAsC,GAAA;IACvE,MAAM7B,GAAAA,GAAM,IAAI8B,GAAAA,CAAI;AAAEF,QAAAA;AAAM,KAAA,CAAA;AAC5B5B,IAAAA,GAAAA,CAAI6B,IAAI,GAAGA,IAAAA;IAEX9B,gBAAAA,CAAiBC,GAAAA,CAAAA;IAEjB,OAAOA,GAAAA;AACT;;;;"}