feat(frontend): created utilities for serializing and deserializing form states

pull/85/head
Samuel Rowe 3 years ago
parent 7a635229ac
commit ec6be9e431

@ -17,10 +17,98 @@ export const pruneArray = <T>(array: (T | undefined)[]): T[] | undefined => {
return result as T[];
};
export const pruneObject = <T>(object: T): unknown | undefined => {
export const pruneObject = <T, R = T>(object: T): R | undefined => {
const result = lodash.pickBy(object ?? {}, (value) => value !== undefined);
if (Object.keys(result).length === 0) {
return undefined;
}
return result as unknown;
return result as unknown as R;
};
export const pruneString = (value?: string): string | undefined => {
if (!value) {
return undefined;
}
return value;
};
export const splitKVPairs = (
text: string,
seperator: string,
optional = true
): [string, string] => {
const firstIndex = text.indexOf(seperator);
if (firstIndex < 0) {
if (optional) {
return [text, ""];
} else {
throw new Error("Malformed document!");
}
}
const key = text.substring(0, firstIndex);
const value = text.substring(firstIndex + 1);
return [key, value];
};
export type TTransformFunction = (
item: string,
index: number
) => Record<string, any>;
export const loadObjectOrArrayAsObject = (
transform: TTransformFunction,
object?: any
): any => {
if (!object) {
return undefined;
}
if (Array.isArray(object)) {
return object.map(transform);
}
return object;
};
export const loadArrayAsObject = (
transform: TTransformFunction,
array?: string[]
) => {
if (!array) {
return undefined;
}
if (!Array.isArray(array)) {
throw new Error("Malformed document. Expected an array at this point.");
}
return array.map(transform);
};
export const extractObjectOrArray = (
seperator: string,
keyName: string,
valueName: string,
object: any
): any =>
loadObjectOrArrayAsObject((item: string) => {
const [key, value] = splitKVPairs(item, seperator);
return {
[keyName]: key,
[valueName]: value
};
}, object);
export const extractArray = (
seperator: string,
keyName: string,
valueName: string,
object: any
): any =>
loadArrayAsObject((item: string) => {
const [key, value] = splitKVPairs(item, seperator);
return {
[keyName]: key,
[valueName]: value
};
}, object);

Loading…
Cancel
Save