{"version":3,"sources":["../../../src/server/lib/patch-set-header.ts"],"sourcesContent":["import { getRequestMeta, type NextIncomingMessage } from '../request-meta'\n\nconst PATCHED_SET_HEADER = Symbol('next.patchSetHeaderWithCookieSupport')\n\ntype PatchableResponse = {\n  setHeader(key: string, value: string | string[]): PatchableResponse\n  headersSent?: boolean\n  [PATCHED_SET_HEADER]?: true\n}\n\n/**\n * Ensure cookies set in middleware are merged and not overridden by API\n * routes/getServerSideProps.\n *\n * @param req Incoming request\n * @param res Outgoing response\n */\nexport function patchSetHeaderWithCookieSupport(\n  req: NextIncomingMessage,\n  res: PatchableResponse\n) {\n  if (res[PATCHED_SET_HEADER]) {\n    return\n  }\n\n  const setHeader = res.setHeader.bind(res)\n\n  Object.defineProperty(res, PATCHED_SET_HEADER, {\n    value: true,\n  })\n\n  res.setHeader = (\n    name: string,\n    value: string | string[]\n  ): PatchableResponse => {\n    // When renders /_error after page is failed, it could attempt to set\n    // headers after headers.\n    if ('headersSent' in res && res.headersSent) {\n      return res\n    }\n\n    if (name.toLowerCase() === 'set-cookie') {\n      const middlewareValue = getRequestMeta(req, 'middlewareCookie')\n\n      if (\n        !middlewareValue ||\n        !Array.isArray(value) ||\n        !value.every((item, idx) => item === middlewareValue[idx])\n      ) {\n        value = [\n          // TODO: (wyattjoh) find out why this is called multiple times resulting in duplicate cookies being added\n          ...new Set([\n            ...(middlewareValue || []),\n            ...(typeof value === 'string'\n              ? [value]\n              : Array.isArray(value)\n                ? value\n                : []),\n          ]),\n        ]\n      }\n    }\n\n    return setHeader(name, value)\n  }\n}\n"],"names":["patchSetHeaderWithCookieSupport","PATCHED_SET_HEADER","Symbol","req","res","setHeader","bind","Object","defineProperty","value","name","headersSent","toLowerCase","middlewareValue","getRequestMeta","Array","isArray","every","item","idx","Set"],"mappings":";;;;+BAiBgBA;;;eAAAA;;;6BAjByC;AAEzD,MAAMC,qBAAqBC,OAAO;AAe3B,SAASF,gCACdG,GAAwB,EACxBC,GAAsB;IAEtB,IAAIA,GAAG,CAACH,mBAAmB,EAAE;QAC3B;IACF;IAEA,MAAMI,YAAYD,IAAIC,SAAS,CAACC,IAAI,CAACF;IAErCG,OAAOC,cAAc,CAACJ,KAAKH,oBAAoB;QAC7CQ,OAAO;IACT;IAEAL,IAAIC,SAAS,GAAG,CACdK,MACAD;QAEA,qEAAqE;QACrE,yBAAyB;QACzB,IAAI,iBAAiBL,OAAOA,IAAIO,WAAW,EAAE;YAC3C,OAAOP;QACT;QAEA,IAAIM,KAAKE,WAAW,OAAO,cAAc;YACvC,MAAMC,kBAAkBC,IAAAA,2BAAc,EAACX,KAAK;YAE5C,IACE,CAACU,mBACD,CAACE,MAAMC,OAAO,CAACP,UACf,CAACA,MAAMQ,KAAK,CAAC,CAACC,MAAMC,MAAQD,SAASL,eAAe,CAACM,IAAI,GACzD;gBACAV,QAAQ;oBACN,yGAAyG;uBACtG,IAAIW,IAAI;2BACLP,mBAAmB,EAAE;2BACrB,OAAOJ,UAAU,WACjB;4BAACA;yBAAM,GACPM,MAAMC,OAAO,CAACP,SACZA,QACA,EAAE;qBACT;iBACF;YACH;QACF;QAEA,OAAOJ,UAAUK,MAAMD;IACzB;AACF","ignoreList":[0]}