UNPKG

integreat-adapter-form

Version:

application/x-www-form-urlencoded adapter for Integreat

80 lines 2.37 kB
import { isObject } from './is.js'; const parseObject = (value) => { try { return JSON.parse(value); } catch { return value; } }; const fixLineBreak = (value) => value.replace(/%0D%0A/g, '%0A'); const parseValue = (value) => typeof value === 'string' ? parseObject(decodeURIComponent(fixLineBreak(value)).replace(/\+/g, ' ')) : ''; function prepareKeyPart(part) { if (part === ']') { return ''; } const num = Number.parseInt(part, 10); return Number.isNaN(num) ? part.endsWith(']') ? part.slice(0, -1) : part : num; } function parseKey(key) { return key.split('[').map(prepareKeyPart); } function ensureArray(value) { return Array.isArray(value) ? value : value === undefined ? [] : [value]; } function ensureObject(value) { return isObject(value) ? value : {}; } function setOnArray(target, key, restKeys, value) { const nextTarget = typeof key === 'number' ? target[key] : undefined; const nextValue = setOnTarget(nextTarget, restKeys, value); if (typeof key === 'number') { target[key] = nextValue; return target; } else { return [...target, nextValue]; } } function setOnObject(target, key, restKeys, value) { const nextTarget = target[key]; const nextValue = setOnTarget(nextTarget, restKeys, value); return { ...target, [key]: nextValue }; } function setOnTarget(target, keys, value) { if (keys.length === 0) { return value; } const [key, ...restKeys] = keys; const isArr = key === '' || typeof key === 'number'; return isArr ? setOnArray(ensureArray(target), key === '' ? undefined : key, restKeys, value) : setOnObject(ensureObject(target), key, restKeys, value); } function reducePair(target, [key, value]) { const [firstKey, ...restKeys] = parseKey(key); if (typeof firstKey === 'string') { return setOnObject(ensureObject(target), firstKey, restKeys, parseValue(value)); } else { return {}; } } export default function parseFormData(data) { if (typeof data === 'string') { return data .split('&') .map((pair) => pair.split('=')) .reduce(reducePair, undefined); } else { return undefined; } } //# sourceMappingURL=parseFormData.js.map