dynamodb-toolbox
Version:
Lightweight and type-safe query builder for DynamoDB and TypeScript.
91 lines (90 loc) • 3.65 kB
JavaScript
import { Parser } from '../../../../../schema/actions/parse/index.js';
import { isObject } from '../../../../../utils/validation/isObject.js';
import { $SET, isRemoval, isSetting } from '../../symbols/index.js';
import { parseUpdateExtension } from './attribute.js';
function* recordElementsParser(schema, inputValue, { transform = true, valuePath } = {}) {
if (isRemoval(inputValue)) {
const parsedValue = inputValue;
if (transform) {
yield parsedValue;
}
else {
return parsedValue;
}
const transformedValue = parsedValue;
return transformedValue;
}
return yield* new Parser(schema.elements).start(inputValue, {
mode: 'update',
fill: false,
transform,
parseExtension: parseUpdateExtension,
valuePath
});
}
export const parseRecordExtension = (schema, input, { transform = true, valuePath } = {}) => {
if (isSetting(input) && input[$SET] !== undefined) {
return {
isExtension: true,
*extensionParser() {
const parser = new Parser(schema).start(input[$SET], {
fill: false,
transform,
valuePath: [...(valuePath !== null && valuePath !== void 0 ? valuePath : []), '$SET']
});
const parsedValue = { [$SET]: parser.next().value };
if (transform) {
yield parsedValue;
}
else {
return parsedValue;
}
const transformedValue = { [$SET]: parser.next().value };
return transformedValue;
}
};
}
if (isObject(input)) {
return {
isExtension: true,
*extensionParser() {
const parsers = Object.entries(input)
.filter(([, inputValue]) => inputValue !== undefined)
.map(([inputKey, inputValue]) => [
new Parser(schema.keys).start(inputKey, { fill: false, transform }),
recordElementsParser(schema, inputValue, {
transform,
valuePath: [...(valuePath !== null && valuePath !== void 0 ? valuePath : []), inputKey]
})
]);
const parsedValue = Object.fromEntries(parsers
.map(([keyParser, elementParser]) => [
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
keyParser.next().value,
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
elementParser.next().value
])
.filter(([, element]) => element !== undefined));
if (transform) {
yield parsedValue;
}
else {
return parsedValue;
}
const transformedValue = Object.fromEntries(parsers
.map(([keyParser, elementParser]) => [
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
keyParser.next().value,
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
elementParser.next().value
])
.filter(([, element]) => element !== undefined));
return transformedValue;
}
};
}
return {
isExtension: false,
unextendedInput: input
};
};