UNPKG

dynamodb-toolbox

Version:

Lightweight and type-safe query builder for DynamoDB and TypeScript.

205 lines (204 loc) 9.27 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.parseListExtension = void 0; const index_js_1 = require("../../../../../errors/index.js"); const index_js_2 = require("../../../../../schema/actions/parse/index.js"); const formatArrayPath_js_1 = require("../../../../../schema/actions/utils/formatArrayPath.js"); const isArray_js_1 = require("../../../../../utils/validation/isArray.js"); const isInteger_js_1 = require("../../../../../utils/validation/isInteger.js"); const isObject_js_1 = require("../../../../../utils/validation/isObject.js"); const index_js_3 = require("../../symbols/index.js"); const attribute_js_1 = require("./attribute.js"); const reference_js_1 = require("./reference.js"); function* listElementParser(schema, inputValue, { transform = true, valuePath }) { if ((0, index_js_3.isRemoval)(inputValue)) { const parsedValue = inputValue; if (transform) { yield parsedValue; } else { return parsedValue; } const transformedValue = parsedValue; return transformedValue; } if (inputValue === undefined) { const parsedValue = undefined; if (transform) { yield parsedValue; } else { return parsedValue; } const transformedValue = undefined; return transformedValue; } return yield* new index_js_2.Parser(schema.elements).start(inputValue, { mode: 'update', fill: false, transform, parseExtension: attribute_js_1.parseUpdateExtension, valuePath }); } const parseListExtension = (schema, input, { transform = true, valuePath }) => { if ((0, index_js_3.isSetting)(input) && input[index_js_3.$SET] !== undefined) { return { isExtension: true, *extensionParser() { const parser = new index_js_2.Parser(schema).start(input[index_js_3.$SET], { fill: false, transform, valuePath: [...(valuePath !== null && valuePath !== void 0 ? valuePath : []), '$SET'] }); const parsedValue = { [index_js_3.$SET]: parser.next().value }; if (transform) { yield parsedValue; } else { return parsedValue; } const transformedValue = { [index_js_3.$SET]: parser.next().value }; return transformedValue; } }; } if ((0, isObject_js_1.isObject)(input) || (0, isArray_js_1.isArray)(input)) { if ((0, index_js_3.isAppending)(input) && input[index_js_3.$APPEND] !== undefined) { const appendedValue = input[index_js_3.$APPEND]; const appendedValuePath = [...(valuePath !== null && valuePath !== void 0 ? valuePath : []), '$APPEND']; if ((0, isArray_js_1.isArray)(appendedValue)) { return { isExtension: true, *extensionParser() { const parsers = appendedValue.map((element, index) => // Should be a simple list of valid elements (not extended) new index_js_2.Parser(schema.elements).start(element, { fill: false, transform, valuePath: [...appendedValuePath, index] })); const parsedValue = { [index_js_3.$APPEND]: parsers.map(parser => parser.next().value) }; if (transform) { yield parsedValue; } else { return parsedValue; } const transformedValue = { [index_js_3.$APPEND]: parsers.map(parser => parser.next().value) }; return transformedValue; } }; } return { isExtension: true, *extensionParser() { const parser = new index_js_2.Parser(schema).start(appendedValue, { fill: false, transform, parseExtension: reference_js_1.parseReferenceExtension, valuePath: appendedValuePath }); const parsedValue = { [index_js_3.$APPEND]: parser.next().value }; if (transform) { yield parsedValue; } else { return parsedValue; } const transformedValue = { [index_js_3.$APPEND]: parser.next().value }; return transformedValue; } }; } if ((0, index_js_3.isPrepending)(input) && input[index_js_3.$PREPEND] !== undefined) { const prependedValue = input[index_js_3.$PREPEND]; const prependedValuePath = [...(valuePath !== null && valuePath !== void 0 ? valuePath : []), '$PREPEND']; if ((0, isArray_js_1.isArray)(prependedValue)) { return { isExtension: true, *extensionParser() { const parsers = prependedValue.map((element, index) => new index_js_2.Parser(schema.elements).start(element, { fill: false, transform, valuePath: [...prependedValuePath, index] })); const parsedValue = { [index_js_3.$PREPEND]: parsers.map(parser => parser.next().value) }; if (transform) { yield parsedValue; } else { return parsedValue; } const transformedValue = { [index_js_3.$PREPEND]: parsers.map(parser => parser.next().value) }; return transformedValue; } }; } return { isExtension: true, *extensionParser() { const parser = new index_js_2.Parser(schema).start(prependedValue, { fill: false, transform, parseExtension: reference_js_1.parseReferenceExtension, valuePath: prependedValuePath }); const parsedValue = { [index_js_3.$PREPEND]: parser.next().value }; if (transform) { yield parsedValue; } else { return parsedValue; } const transformedValue = { [index_js_3.$PREPEND]: parser.next().value }; return transformedValue; } }; } return { isExtension: true, *extensionParser() { let maxUpdatedIndex = 0; const parsers = Object.fromEntries(Object.entries(input).map(([index, element]) => [ index, listElementParser(schema, element, { transform, valuePath: [...(valuePath !== null && valuePath !== void 0 ? valuePath : []), index] }) ])); for (const inputKey of Object.keys(parsers)) { const parsedInputKey = parseFloat(inputKey); const path = valuePath !== undefined ? (0, formatArrayPath_js_1.formatArrayPath)(valuePath) : undefined; if (!(0, isInteger_js_1.isInteger)(parsedInputKey)) { throw new index_js_1.DynamoDBToolboxError('parsing.invalidAttributeInput', { message: `Index of array attribute ${path !== undefined ? `'${path}' ` : ''}is not a valid integer`, path, payload: { received: inputKey } }); } maxUpdatedIndex = Math.max(maxUpdatedIndex, parsedInputKey); } const parsedValue = Object.fromEntries(Object.entries(parsers) .map(([index, parser]) => [index, parser.next().value]) .filter(([, element]) => element !== undefined)); if (transform) { yield parsedValue; } else { return parsedValue; } const transformedValue = [...Array(maxUpdatedIndex + 1).keys()].map(index => { const parser = parsers[index]; return parser === undefined ? undefined : parser.next().value; }); return transformedValue; } }; } return { isExtension: false, unextendedInput: input }; }; exports.parseListExtension = parseListExtension;