UNPKG

dynamodb-toolbox

Version:

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

190 lines (189 loc) 8.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.MapSchema_ = exports.map = void 0; const resetLinks_js_1 = require("../../schema/utils/resetLinks.js"); const ifThenElse_js_1 = require("../../utils/ifThenElse.js"); const overwrite_js_1 = require("../../utils/overwrite.js"); const light_js_1 = require("../utils/light.js"); const schema_js_1 = require("./schema.js"); /** * Define a new map attribute * * @param attributes Dictionary of attributes * @param props _(optional)_ Map Props */ const map = (attributes, props = {}) => new MapSchema_((0, light_js_1.lightObj)(attributes), props); exports.map = map; /** * Map schema */ class MapSchema_ extends schema_js_1.MapSchema { /** * Tag schema values as required. Possible values are: * - `'atLeastOnce'` _(default)_: Required in PUTs, optional in UPDATEs * - `'never'`: Optional in PUTs and UPDATEs * - `'always'`: Required in PUTs and UPDATEs * * @param nextRequired SchemaRequiredProp */ required(nextRequired = 'atLeastOnce') { return new MapSchema_(this.attributes, (0, overwrite_js_1.overwrite)(this.props, { required: nextRequired })); } /** * Shorthand for `required('never')` */ optional() { return this.required('never'); } /** * Hide schema values after fetch commands and formatting */ hidden(nextHidden = true) { return new MapSchema_(this.attributes, (0, overwrite_js_1.overwrite)(this.props, { hidden: nextHidden })); } /** * Tag schema values as a primary key attribute or linked to a primary key attribute */ key(nextKey = true) { return new MapSchema_(this.attributes, (0, overwrite_js_1.overwrite)(this.props, { key: nextKey, required: 'always' })); } /** * Rename schema values before save commands */ savedAs(nextSavedAs) { return new MapSchema_(this.attributes, (0, overwrite_js_1.overwrite)(this.props, { savedAs: nextSavedAs })); } /** * Provide a default value during Primary Key computing * * @param nextKeyDefault `keyInput | (() => keyInput)` */ keyDefault(nextKeyDefault) { return new MapSchema_(this.attributes, (0, overwrite_js_1.overwrite)(this.props, { keyDefault: nextKeyDefault })); } /** * Provide a default value for attribute in PUT commands * * @param nextPutDefault `putAttributeInput | (() => putAttributeInput)` */ putDefault(nextPutDefault) { return new MapSchema_(this.attributes, (0, overwrite_js_1.overwrite)(this.props, { putDefault: nextPutDefault })); } /** * Provide a default value for attribute in UPDATE commands * * @param nextUpdateDefault `updateAttributeInput | (() => updateAttributeInput)` */ updateDefault(nextUpdateDefault) { return new MapSchema_(this.attributes, (0, overwrite_js_1.overwrite)(this.props, { updateDefault: nextUpdateDefault })); } /** * Provide a default value for attribute in PUT commands OR Primary Key computing if attribute is tagged as key * * @param nextDefault `key/putAttributeInput | (() => key/putAttributeInput)` */ default(nextDefault) { return (0, ifThenElse_js_1.ifThenElse)(this.props.key, new MapSchema_(this.attributes, (0, overwrite_js_1.overwrite)(this.props, { keyDefault: nextDefault })), new MapSchema_(this.attributes, (0, overwrite_js_1.overwrite)(this.props, { putDefault: nextDefault }))); } /** * Provide a **linked** default value for attribute in Primary Key computing * * @param nextKeyLink `keyAttributeInput | ((keyInput) => keyAttributeInput)` */ keyLink(nextKeyLink) { return new MapSchema_(this.attributes, (0, overwrite_js_1.overwrite)(this.props, { keyLink: nextKeyLink })); } /** * Provide a **linked** default value for attribute in PUT commands * * @param nextPutLink `putAttributeInput | ((putItemInput) => putAttributeInput)` */ putLink(nextPutLink) { return new MapSchema_(this.attributes, (0, overwrite_js_1.overwrite)(this.props, { putLink: nextPutLink })); } /** * Provide a **linked** default value for attribute in UPDATE commands * * @param nextUpdateLink `unknown | ((updateItemInput) => updateAttributeInput)` */ updateLink(nextUpdateLink) { return new MapSchema_(this.attributes, (0, overwrite_js_1.overwrite)(this.props, { updateLink: nextUpdateLink })); } /** * Provide a **linked** default value for attribute in PUT commands OR Primary Key computing if attribute is tagged as key * * @param nextLink `key/putAttributeInput | (() => key/putAttributeInput)` */ link(nextLink) { return (0, ifThenElse_js_1.ifThenElse)(this.props.key, new MapSchema_(this.attributes, (0, overwrite_js_1.overwrite)(this.props, { keyLink: nextLink })), new MapSchema_(this.attributes, (0, overwrite_js_1.overwrite)(this.props, { putLink: nextLink }))); } /** * Provide a custom validator for attribute in Primary Key computing * * @param nextKeyValidator `(keyAttributeInput) => boolean | string` */ keyValidate(nextKeyValidator) { return new MapSchema_(this.attributes, (0, overwrite_js_1.overwrite)(this.props, { keyValidator: nextKeyValidator })); } /** * Provide a custom validator for attribute in PUT commands * * @param nextPutValidator `(putAttributeInput) => boolean | string` */ putValidate(nextPutValidator) { return new MapSchema_(this.attributes, (0, overwrite_js_1.overwrite)(this.props, { putValidator: nextPutValidator })); } /** * Provide a custom validator for attribute in UPDATE commands * * @param nextUpdateValidator `(updateAttributeInput) => boolean | string` */ updateValidate(nextUpdateValidator) { return new MapSchema_(this.attributes, (0, overwrite_js_1.overwrite)(this.props, { updateValidator: nextUpdateValidator })); } /** * Provide a custom validator for attribute in PUT commands OR Primary Key computing if attribute is tagged as key * * @param nextValidator `(key/putAttributeInput) => boolean | string` */ validate(nextValidator) { return (0, ifThenElse_js_1.ifThenElse)(this.props.key, new MapSchema_(this.attributes, (0, overwrite_js_1.overwrite)(this.props, { keyValidator: nextValidator })), new MapSchema_(this.attributes, (0, overwrite_js_1.overwrite)(this.props, { putValidator: nextValidator }))); } pick(...attributeNames) { const nextAttributes = {}; for (const attributeName of attributeNames) { if (!(attributeName in this.attributes)) { continue; } nextAttributes[attributeName] = (0, resetLinks_js_1.resetLinks)(this.attributes[attributeName]); } return new MapSchema_(nextAttributes, this.props); } omit(...attributeNames) { const nextAttributes = {}; const attributeNamesSet = new Set(attributeNames); for (const _attributeName of Object.keys(this.attributes)) { if (attributeNamesSet.has(_attributeName)) { continue; } const attributeName = _attributeName; nextAttributes[attributeName] = (0, resetLinks_js_1.resetLinks)(this.attributes[attributeName]); } return new MapSchema_(nextAttributes, this.props); } and(additionalAttr) { const additionalAttributes = (typeof additionalAttr === 'function' ? additionalAttr(this) : additionalAttr); const nextAttributes = { ...this.attributes }; for (const [attributeName, additionalAttribute] of Object.entries(additionalAttributes)) { nextAttributes[attributeName] = additionalAttribute; } return new MapSchema_(nextAttributes, this.props); } clone(nextProps = {}) { return new MapSchema_(this.attributes, (0, overwrite_js_1.overwrite)(this.props, nextProps)); } build(Action) { return new Action(this); } } exports.MapSchema_ = MapSchema_;