{"version":3,"file":"requests.cjs","names":[],"sources":["../../src/utils/requests.ts"],"sourcesContent":["/**\n * Safely read a Response/Request body with sensible defaults:\n * - clones the response/request to avoid consuming the original response/request\n * - Skips GET/HEAD\n * - Tries JSON first regardless of content-type\n * - Falls back to text and optionally parses when it \"looks\" like JSON\n */\nexport async function readBody<T extends Response | Request>(\n  r: T,\n): Promise<unknown> {\n  // skip GET/HEAD requests (unchanged)\n  const method = \"method\" in r ? r.method.toUpperCase() : undefined;\n  if (method === \"GET\" || method === \"HEAD\") {\n    return undefined;\n  }\n\n  // no body at all → undefined (unchanged)\n  if (!(\"body\" in r) || r.body == null) {\n    return undefined;\n  }\n\n  // 1) try JSON (unchanged)\n  try {\n    return await r.clone().json();\n  } catch {\n    // 2) try text (unchanged + your whitespace/JSON-heuristic)\n    try {\n      const text = await r.clone().text();\n      const trimmed = text.trim();\n\n      if (trimmed.length === 0) return text;\n\n      if (trimmed.startsWith(\"{\") || trimmed.startsWith(\"[\")) {\n        try {\n          return JSON.parse(trimmed);\n        } catch {\n          return text;\n        }\n      }\n      return text;\n    } catch {\n      // 3) FINAL FALLBACK: manual read that accepts string or bytes\n      try {\n        const c = r.clone();\n        const stream: ReadableStream | null = c.body ?? null;\n        if (!stream) return undefined;\n\n        const reader = stream.getReader();\n        const decoder = new TextDecoder();\n        let out = \"\";\n\n        while (true) {\n          const { done, value } = await reader.read();\n          if (done) break;\n          if (typeof value === \"string\") {\n            out += value; // accept string chunks\n          } else {\n            out += decoder.decode(value, { stream: true }); // bytes\n          }\n        }\n        out += decoder.decode(); // flush\n\n        const trimmed = out.trim();\n        if (trimmed.length === 0) return out;\n\n        if (trimmed.startsWith(\"{\") || trimmed.startsWith(\"[\")) {\n          try {\n            return JSON.parse(trimmed);\n          } catch {\n            return out;\n          }\n        }\n        return out;\n      } catch {\n        return undefined; // same \"give up\" behavior you had\n      }\n    }\n  }\n}\n"],"mappings":";;;;;;;;;AAOA,eAAsB,SACpB,GACkB;CAElB,MAAM,SAAS,YAAY,IAAI,EAAE,OAAO,aAAa,GAAG;AACxD,KAAI,WAAW,SAAS,WAAW,OACjC;AAIF,KAAI,EAAE,UAAU,MAAM,EAAE,QAAQ,KAC9B;AAIF,KAAI;AACF,SAAO,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB;AAEN,MAAI;GACF,MAAM,OAAO,MAAM,EAAE,OAAO,CAAC,MAAM;GACnC,MAAM,UAAU,KAAK,MAAM;AAE3B,OAAI,QAAQ,WAAW,EAAG,QAAO;AAEjC,OAAI,QAAQ,WAAW,IAAI,IAAI,QAAQ,WAAW,IAAI,CACpD,KAAI;AACF,WAAO,KAAK,MAAM,QAAQ;WACpB;AACN,WAAO;;AAGX,UAAO;UACD;AAEN,OAAI;IAEF,MAAM,SADI,EAAE,OAAO,CACqB,QAAQ;AAChD,QAAI,CAAC,OAAQ,QAAO;IAEpB,MAAM,SAAS,OAAO,WAAW;IACjC,MAAM,UAAU,IAAI,aAAa;IACjC,IAAI,MAAM;AAEV,WAAO,MAAM;KACX,MAAM,EAAE,MAAM,UAAU,MAAM,OAAO,MAAM;AAC3C,SAAI,KAAM;AACV,SAAI,OAAO,UAAU,SACnB,QAAO;SAEP,QAAO,QAAQ,OAAO,OAAO,EAAE,QAAQ,MAAM,CAAC;;AAGlD,WAAO,QAAQ,QAAQ;IAEvB,MAAM,UAAU,IAAI,MAAM;AAC1B,QAAI,QAAQ,WAAW,EAAG,QAAO;AAEjC,QAAI,QAAQ,WAAW,IAAI,IAAI,QAAQ,WAAW,IAAI,CACpD,KAAI;AACF,YAAO,KAAK,MAAM,QAAQ;YACpB;AACN,YAAO;;AAGX,WAAO;WACD;AACN"}