export opaque type BackingFormData = {
data: FormData,
keyPointer: number,
keys: null | Array<string>,
};
export function peekBackingEntry(backingStore: BackingFormData): string | void {
let keys = backingStore.keys;
if (keys === null) {
keys = backingStore.keys = Array.from(backingStore.data.keys());
backingStore.keyPointer = 0;
}
return keys[backingStore.keyPointer];
}
export function advanceBackingEntryIterator(
backingStore: BackingFormData,
): void {
backingStore.keyPointer++;
}
export function consumeBackingEntry(
backingStore: BackingFormData,
key: string,
): void {
backingStore.data.delete(key);
backingStore.keyPointer++;
}
export function appendBackingEntry(
backingStore: BackingFormData,
key: string,
value: FormDataEntryValue,
): void {
backingStore.data.append(key, value);
let keys = backingStore.keys;
if (keys === null) {
keys = backingStore.keys = Array.from(backingStore.data.keys());
backingStore.keyPointer = 0;
} else {
keys.push(key);
}
}
export function appendBackingFile(
backingStore: BackingFormData,
key: string,
value: Blob,
filename: string,
): void {
backingStore.data.append(key, value, filename);
let keys = backingStore.keys;
if (keys === null) {
keys = backingStore.keys = Array.from(backingStore.data.keys());
backingStore.keyPointer = 0;
} else {
keys.push(key);
}
}
export function getBackingEntry(
backingStore: BackingFormData,
key: string,
): ?FormDataEntryValue {
return backingStore.data.get(key);
}
export function getAllBackingEntries(
backingStore: BackingFormData,
key: string,
): Array<FormDataEntryValue> {
return backingStore.data.getAll(key);
}
export function createBackingFormData(formData: FormData): BackingFormData {
return {
data: formData,
keyPointer: -1,
keys: null,
};
}