UNPKG

dynamodb-toolbox

Version:

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

101 lines (100 loc) 5.37 kB
import type { $ADD, $APPEND, $DELETE, $PREPEND, $REMOVE, $SUBTRACT, $SUM, ADD, APPEND, DELETE, Extended, GET, PREPEND, REMOVE, SUBTRACT, SUM, Unextended } from '../../../entity/actions/update/symbols/index.js'; import type { Reference, ReferenceExtension } from '../../../entity/actions/update/types.js'; import type { Entity } from '../../../entity/index.js'; import type { Always, AnyOfSchema, AnySchema, ItemSchema, ItemUnextendedValue, ListSchema, MapSchema, Never, NumberExtendedValue, NumberSchema, PrimitiveSchema, RecordSchema, ResolveAnySchema, ResolvePrimitiveSchema, Schema, SchemaExtendedValue, SetExtendedValue, SetSchema } from '../../../schema/index.js'; import type { Paths, ValidValue } from '../../../schema/index.js'; import type { Extends, If, Not, Optional } from '../../../types/index.js'; export type UpdateAttributesInputExtension = ReferenceExtension | { type: '*'; value: Extended<{ [$REMOVE]: true; }>; } | { type: 'number'; value: Extended<{ [$ADD]: number; }> | Extended<{ [$SUM]: [ NumberExtendedValue<ReferenceExtension>, NumberExtendedValue<ReferenceExtension> ]; }> | Extended<{ [$SUBTRACT]: [ NumberExtendedValue<ReferenceExtension>, NumberExtendedValue<ReferenceExtension> ]; }>; } | { type: 'set'; value: Extended<{ [$ADD]: SetExtendedValue; } | { [$DELETE]: SetExtendedValue; }>; } | { type: 'list'; value: Extended<{ [$APPEND]: SchemaExtendedValue<ReferenceExtension> | SchemaExtendedValue[]; } | { [$PREPEND]: SchemaExtendedValue<ReferenceExtension> | SchemaExtendedValue[]; }>; }; type MustBeDefined<SCHEMA extends Schema, FILLED extends boolean = false> = If<FILLED, Extends<SCHEMA['props'], { required: Always; }>, If<Not<Extends<SCHEMA['props'], { required: Always; }>>, false, If<Extends<SCHEMA['props'], { key: true; }>, Not<Extends<SCHEMA['props'], { keyDefault: unknown; } | { keyLink: unknown; }>>, Not<Extends<SCHEMA['props'], { updateDefault: unknown; } | { updateLink: unknown; }>>>>>; type OptionalKeys<SCHEMA extends ItemSchema | MapSchema, FILLED extends boolean = false> = { [KEY in keyof SCHEMA['attributes']]: If<MustBeDefined<SCHEMA['attributes'][KEY], FILLED>, never, KEY>; }[keyof SCHEMA['attributes']]; type CanBeRemoved<SCHEMA extends Schema> = SCHEMA['props'] extends { required: Never; } ? true : false; export type UpdateAttributesInput<SCHEMA extends Entity | ItemSchema = Entity, FILLED extends boolean = false> = Entity extends SCHEMA ? ItemUnextendedValue<UpdateAttributesInputExtension> : ItemSchema extends SCHEMA ? ItemUnextendedValue<UpdateAttributesInputExtension> : SCHEMA extends ItemSchema ? Optional<{ [KEY in keyof SCHEMA['attributes']]: UpdateAttributeInput<SCHEMA['attributes'][KEY], FILLED, Paths<SCHEMA>>; }, OptionalKeys<SCHEMA, FILLED>> : SCHEMA extends Entity ? UpdateAttributesInput<SCHEMA['schema'], FILLED> : never; type NumberUpdate<SCHEMA extends NumberSchema> = number | (SCHEMA['props'] extends { big: true; } ? bigint : never); /** * User input of an UPDATE command for a given Schema * * @param Schema Schema * @param RequireDefaults Boolean * @return Any */ export type UpdateAttributeInput<SCHEMA extends Schema = Schema, FILLED extends boolean = false, AVAILABLE_PATHS extends string = string> = Schema extends SCHEMA ? SchemaExtendedValue<UpdateAttributesInputExtension> | undefined : If<MustBeDefined<SCHEMA, FILLED>, never, undefined> | If<CanBeRemoved<SCHEMA>, REMOVE, never> | GET<[ ref: AVAILABLE_PATHS, fallback?: ValidValue<SCHEMA, { defined: true; }> | Reference<SCHEMA, AVAILABLE_PATHS> ]> | (SCHEMA extends AnySchema ? ResolveAnySchema<SCHEMA> | unknown : never) | (SCHEMA extends PrimitiveSchema ? ResolvePrimitiveSchema<SCHEMA> : never) | (SCHEMA extends NumberSchema ? ADD<NumberUpdate<SCHEMA>> | SUM<NumberUpdate<SCHEMA> | GET<[ ref: AVAILABLE_PATHS, fallback?: NumberUpdate<SCHEMA> | Reference<SCHEMA, AVAILABLE_PATHS> ]>, NumberUpdate<SCHEMA> | GET<[ ref: AVAILABLE_PATHS, fallback?: NumberUpdate<SCHEMA> | Reference<SCHEMA, AVAILABLE_PATHS> ]>> | SUBTRACT<NumberUpdate<SCHEMA> | GET<[ ref: AVAILABLE_PATHS, fallback?: NumberUpdate<SCHEMA> | Reference<SCHEMA, AVAILABLE_PATHS> ]>, NumberUpdate<SCHEMA> | GET<[ ref: AVAILABLE_PATHS, fallback?: NumberUpdate<SCHEMA> | Reference<SCHEMA, AVAILABLE_PATHS> ]>> : never) | (SCHEMA extends SetSchema ? Set<ValidValue<SCHEMA['elements']>> | ADD<Set<ValidValue<SCHEMA['elements']>>> | DELETE<Set<ValidValue<SCHEMA['elements']>>> : never) | (SCHEMA extends ListSchema ? Unextended<ValidValue<SCHEMA['elements']>[]> | APPEND<GET<[ ref: AVAILABLE_PATHS, fallback?: ValidValue<SCHEMA['elements']>[] | Reference<SCHEMA, AVAILABLE_PATHS> ]> | ValidValue<SCHEMA['elements']>[]> | PREPEND<GET<[ ref: AVAILABLE_PATHS, fallback?: ValidValue<SCHEMA['elements']>[] | Reference<SCHEMA, AVAILABLE_PATHS> ]> | ValidValue<SCHEMA['elements']>[]> : never) | (SCHEMA extends MapSchema ? Unextended<ValidValue<SCHEMA>> : never) | (SCHEMA extends RecordSchema ? Unextended<ValidValue<SCHEMA>> : never) | (SCHEMA extends AnyOfSchema ? UpdateAttributeInput<SCHEMA['elements'][number], FILLED, AVAILABLE_PATHS> : never); export {};