UNPKG

dynamodb-toolbox

Version:

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

180 lines (179 loc) 6.83 kB
import { ifThenElse } from '../../utils/ifThenElse.js'; import { overwrite } from '../../utils/overwrite.js'; import { writable } from '../../utils/writable.js'; import { StringSchema } from './schema.js'; /** * Define a new schema of string type * * @param props _(optional)_ Schema Props */ export const string = (props = {}) => new StringSchema_(props); /** * String attribute (warm) */ export class StringSchema_ extends StringSchema { /** * Tag attribute 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 StringSchema_(overwrite(this.props, { required: nextRequired })); } /** * Shorthand for `required('never')` */ optional() { return this.required('never'); } /** * Hide attribute after fetch commands and formatting */ hidden(nextHidden = true) { return new StringSchema_(overwrite(this.props, { hidden: nextHidden })); } /** * Tag attribute as a primary key attribute or linked to a primary attribute */ key(nextKey = true) { return new StringSchema_(overwrite(this.props, { key: nextKey, required: 'always' })); } /** * Rename attribute before save commands */ savedAs(nextSavedAs) { return new StringSchema_(overwrite(this.props, { savedAs: nextSavedAs })); } /** * Provide a finite list of possible values for attribute * (For typing reasons, enums are only available as attribute methods, not as input props) * * @param enum Possible values * @example * string().enum('foo', 'bar') */ enum(...nextEnum) { return new StringSchema_(overwrite(this.props, { enum: writable(nextEnum) })); } /** * Shorthand for `enum(constantValue).default(constantValue)` * * @param constantValue Constant value * @example * string().const('foo') */ const(constant) { return ifThenElse(this.props.key, new StringSchema_(overwrite(this.props, { enum: [constant], keyDefault: constant })), new StringSchema_(overwrite(this.props, { enum: [constant], putDefault: constant }))); } /** * Transform the attribute value in PUT commands OR Primary Key computing if attribute is tagged as key */ transform(transform) { return new StringSchema_(overwrite(this.props, { transform })); } /** * Provide a default value for attribute in Primary Key computing * * @param nextKeyDefault `keyAttributeInput | (() => keyAttributeInput)` */ keyDefault(nextKeyDefault) { return new StringSchema_(overwrite(this.props, { keyDefault: nextKeyDefault })); } /** * Provide a default value for attribute in PUT commands * * @param nextPutDefault `putAttributeInput | (() => putAttributeInput)` */ putDefault(nextPutDefault) { return new StringSchema_(overwrite(this.props, { putDefault: nextPutDefault })); } /** * Provide a default value for attribute in UPDATE commands * * @param nextUpdateDefault `updateAttributeInput | (() => updateAttributeInput)` */ updateDefault(nextUpdateDefault) { return new StringSchema_(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 ifThenElse(this.props.key, new StringSchema_(overwrite(this.props, { keyDefault: nextDefault })), new StringSchema_(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 StringSchema_(overwrite(this.props, { keyLink: nextKeyLink })); } /** * Provide a **linked** default value for attribute in PUT commands * * @param nextPutLink `putAttributeInput | ((putItemInput) => putAttributeInput)` */ putLink(nextPutLink) { return new StringSchema_(overwrite(this.props, { putLink: nextPutLink })); } /** * Provide a **linked** default value for attribute in UPDATE commands * * @param nextUpdateLink `unknown | ((updateItemInput) => updateAttributeInput)` */ updateLink(nextUpdateLink) { return new StringSchema_(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 ifThenElse(this.props.key, new StringSchema_(overwrite(this.props, { keyLink: nextLink })), new StringSchema_(overwrite(this.props, { putLink: nextLink }))); } /** * Provide a custom validator for attribute in Primary Key computing * * @param nextKeyValidator `(keyAttributeInput) => boolean | string` */ keyValidate(nextKeyValidator) { return new StringSchema_(overwrite(this.props, { keyValidator: nextKeyValidator })); } /** * Provide a custom validator for attribute in PUT commands * * @param nextPutValidator `(putAttributeInput) => boolean | string` */ putValidate(nextPutValidator) { return new StringSchema_(overwrite(this.props, { putValidator: nextPutValidator })); } /** * Provide a custom validator for attribute in UPDATE commands * * @param nextUpdateValidator `(updateAttributeInput) => boolean | string` */ updateValidate(nextUpdateValidator) { return new StringSchema_(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 ifThenElse(this.props.key, new StringSchema_(overwrite(this.props, { keyValidator: nextValidator })), new StringSchema_(overwrite(this.props, { putValidator: nextValidator }))); } clone(nextprops = {}) { return new StringSchema_(overwrite(this.props, nextprops)); } build(Action) { return new Action(this); } }