dynamodb-toolbox
Version:
Lightweight and type-safe query builder for DynamoDB and TypeScript.
47 lines (46 loc) • 1.85 kB
JavaScript
import { isSerializableTransformer } from '../../../../transformers/index.js';
import { isBigInt } from '../../../../utils/validation/isBigInt.js';
import { getDefaultsDTO } from './utils.js';
/**
* @debt feature "handle defaults, links & validators DTOs"
*/
export const getPrimitiveSchemaDTO = (schema) => {
const defaultsDTO = getDefaultsDTO(schema);
const { props } = schema;
const { required, hidden, key, savedAs, transform } = props;
const attrDTO = {
type: schema.type,
...(required !== undefined && required !== 'atLeastOnce' ? { required } : {}),
...(hidden !== undefined && hidden !== false ? { hidden } : {}),
...(key !== undefined && key !== false ? { key } : {}),
...(savedAs !== undefined ? { savedAs } : {}),
...(transform !== undefined
? {
transform: isSerializableTransformer(transform)
? transform.toJSON()
: { transformerId: 'custom' }
}
: {}),
...defaultsDTO
// We need to cast as `.enum` is not coupled to `.type`
};
if (props.enum) {
switch (schema.type) {
case 'binary': {
const textDecoder = new TextDecoder('utf8');
// @ts-ignore type inference can be improved here
attrDTO.enum = props.enum.map(value => btoa(textDecoder.decode(value)));
break;
}
case 'number': {
// @ts-ignore type inference can be improved here
attrDTO.enum = props.enum.map(value => (isBigInt(value) ? value.toString() : value));
break;
}
default:
// @ts-ignore type inference can be improved here
attrDTO.enum = props.enum;
}
}
return attrDTO;
};