export function jsonParser(keys: readonly KeysT[]): (value: InputT) => Pick { const keysCopy = keys.slice() return (value) => { const result: Partial> = {} for (const key of keysCopy) { result[key] = JSON.parse(value[key]) } return result as Pick } } export function rows(transformer?: (value: InputT) => OutputT): (result: D1Result) => OutputT[] { if (transformer) { return (result) => (result.results as InputT[]).map(transformer) } else { return (result) => result.results as OutputT[]; } } export function guaranteedSingleton(transformer?: (value: InputT) => OutputT): (result: D1Result) => OutputT { const inner = singleton(transformer) return (result) => { const out = inner(result) if (out === null) { throw Error('expected exactly one result but got none') } return out } } export function singleton(transformer?: (value: InputT) => OutputT): (result: D1Result) => OutputT | null { if (transformer) { return (result) => { if (result.results.length > 1) { throw Error(`expected single result but got ${result.results.length}`); } const resultRow = result.results[0] as InputT|undefined return resultRow ? transformer(resultRow) : null; }; } else { return (result) => { if (result.results.length > 1) { throw Error(`expected single result but got ${result.results.length}`); } const resultRow = result.results[0] as OutputT|undefined return resultRow ?? null; }; } } export function nothing(): (result: D1Result) => void { return (result) => { if (result.results.length > 0) { throw Error(`expected no results but got ${result.results.length}`); } }; } export function writeCount(): (result: D1Result) => number { return (result) => result.meta.rows_written; }