integreat-adapter-form
Version:
application/x-www-form-urlencoded adapter for Integreat
80 lines • 2.37 kB
JavaScript
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