{"version":3,"sources":["../src/index.ts"],"sourcesContent":["const UNSAFE_KEYS = new Set([\"__proto__\", \"prototype\", \"constructor\"]);\nconst MAX_ARRAY_INDEX = 10_000;\nconst PART = /[^.\\[\\]]+|\\[([^\\]]*)\\]/g;\n\nconst parsePath = (key: string): string[] => {\n  const parts: string[] = [];\n  for (const match of key.matchAll(PART)) {\n    const part = match[1] ?? match[0];\n    if (part) parts.push(part);\n  }\n  return parts;\n};\n\nexport const toJSON = function (formData: FormData): Record<string, any> {\n  const object: Record<string, any> = {};\n\n  formData.forEach((value, key) => {\n    const parts = parsePath(key);\n    if (parts.some((part) => UNSAFE_KEYS.has(part))) return;\n    let current = object;\n\n    parts.forEach((part, index) => {\n      const isLast = index === parts.length - 1;\n      const nextPart = parts[index + 1];\n      const nextIndex = Number(nextPart);\n      const isNextArray =\n        !isLast &&\n        Number.isInteger(nextIndex) &&\n        nextIndex >= 0 &&\n        nextIndex <= MAX_ARRAY_INDEX;\n\n      if (isLast) {\n        const existing = current[part];\n        if (Array.isArray(existing)) {\n          existing.push(value);\n        } else if (\n          existing !== undefined &&\n          !(typeof existing === \"object\" && existing.constructor === Object)\n        ) {\n          // A second plain occurrence of the same key (e.g. a checkbox\n          // group): promote to an array instead of overwriting, matching\n          // how repeated form fields are parsed server-side.\n          current[part] = [existing, value];\n        } else {\n          current[part] = value;\n        }\n      } else {\n        if (isNextArray) {\n          if (!Array.isArray(current[part])) {\n            current[part] = [];\n          }\n          current = current[part];\n        } else {\n          if (!(typeof current[part] === \"object\" && current[part] !== null)) {\n            current[part] = {};\n          }\n          current = current[part];\n        }\n      }\n    });\n  });\n\n  return object;\n};\n\n/* Default export must stay: some consumers import this module as a\n   single default value and call `.toJSON` off it rather than\n   destructuring the named export. */\nexport default { toJSON };\n"],"mappings":";AAAA,IAAM,cAAc,oBAAI,IAAI,CAAC,aAAa,aAAa,aAAa,CAAC;AACrE,IAAM,kBAAkB;AACxB,IAAM,OAAO;AAEb,IAAM,YAAY,CAAC,QAA0B;AAC3C,QAAM,QAAkB,CAAC;AACzB,aAAW,SAAS,IAAI,SAAS,IAAI,GAAG;AACtC,UAAM,OAAO,MAAM,CAAC,KAAK,MAAM,CAAC;AAChC,QAAI,KAAM,OAAM,KAAK,IAAI;AAAA,EAC3B;AACA,SAAO;AACT;AAEO,IAAM,SAAS,SAAU,UAAyC;AACvE,QAAM,SAA8B,CAAC;AAErC,WAAS,QAAQ,CAAC,OAAO,QAAQ;AAC/B,UAAM,QAAQ,UAAU,GAAG;AAC3B,QAAI,MAAM,KAAK,CAAC,SAAS,YAAY,IAAI,IAAI,CAAC,EAAG;AACjD,QAAI,UAAU;AAEd,UAAM,QAAQ,CAAC,MAAM,UAAU;AAC7B,YAAM,SAAS,UAAU,MAAM,SAAS;AACxC,YAAM,WAAW,MAAM,QAAQ,CAAC;AAChC,YAAM,YAAY,OAAO,QAAQ;AACjC,YAAM,cACJ,CAAC,UACD,OAAO,UAAU,SAAS,KAC1B,aAAa,KACb,aAAa;AAEf,UAAI,QAAQ;AACV,cAAM,WAAW,QAAQ,IAAI;AAC7B,YAAI,MAAM,QAAQ,QAAQ,GAAG;AAC3B,mBAAS,KAAK,KAAK;AAAA,QACrB,WACE,aAAa,UACb,EAAE,OAAO,aAAa,YAAY,SAAS,gBAAgB,SAC3D;AAIA,kBAAQ,IAAI,IAAI,CAAC,UAAU,KAAK;AAAA,QAClC,OAAO;AACL,kBAAQ,IAAI,IAAI;AAAA,QAClB;AAAA,MACF,OAAO;AACL,YAAI,aAAa;AACf,cAAI,CAAC,MAAM,QAAQ,QAAQ,IAAI,CAAC,GAAG;AACjC,oBAAQ,IAAI,IAAI,CAAC;AAAA,UACnB;AACA,oBAAU,QAAQ,IAAI;AAAA,QACxB,OAAO;AACL,cAAI,EAAE,OAAO,QAAQ,IAAI,MAAM,YAAY,QAAQ,IAAI,MAAM,OAAO;AAClE,oBAAQ,IAAI,IAAI,CAAC;AAAA,UACnB;AACA,oBAAU,QAAQ,IAAI;AAAA,QACxB;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,SAAO;AACT;AAKA,IAAO,gBAAQ,EAAE,OAAO;","names":[]}