UNPKG

dynamodb-toolbox

Version:

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

104 lines (103 loc) 8.65 kB
import type { Call } from 'hotscript'; import type { Always, AnyOfSchema, AnySchema, BinarySchema, BooleanSchema, ItemSchema, ListSchema, MapSchema, Never, NullSchema, NumberSchema, PrimitiveSchema, RecordSchema, ResolveAnySchema, ResolveBinarySchema, ResolveBooleanSchema, ResolveNumberSchema, ResolveStringSchema, ResolvedNullSchema, ResolvedPrimitiveSchema, Schema, SetSchema, StringSchema, TupleSchema } from '../../schema/index.js'; import type { Transformer, TypeModifier } from '../../transformers/index.js'; import type { Extends, If, Not, Optional, Overwrite, SelectKeys } from '../../types/index.js'; import type { SchemaExtendedWriteValue, WriteValueOptions } from './options.js'; /** * @debt naming "To rename EncodedValue" */ export type TransformedValue<SCHEMA extends Schema, OPTIONS extends WriteValueOptions = {}> = SCHEMA extends ItemSchema ? ItemSchemaTransformedValue<SCHEMA, OPTIONS> : SCHEMA extends Schema ? SchemaTransformedValue<SCHEMA, OPTIONS> : never; export type TransformedValueRec<SCHEMAS extends Schema[], OPTIONS extends WriteValueOptions = {}, RESULTS extends unknown[] = []> = SCHEMAS extends [infer SCHEMAS_HEAD, ...infer SCHEMAS_TAIL] ? SCHEMAS_HEAD extends Schema ? SCHEMAS_TAIL extends Schema[] ? TransformedValueRec<SCHEMAS_TAIL, OPTIONS, [ ...RESULTS, TransformedValue<SCHEMAS_HEAD, OPTIONS> ]> : never : never : RESULTS; type MustBeDefined<SCHEMA extends Schema, OPTIONS extends WriteValueOptions = {}> = If<Extends<OPTIONS, { defined: true; }>, true, If<Extends<OPTIONS, { mode: 'update' | 'key'; }>, Extends<SCHEMA['props'], { required: Always; }>, Not<Extends<SCHEMA['props'], { required: Never; }>>>>; type OptionalKeys<SCHEMA extends MapSchema | ItemSchema, OPTIONS extends WriteValueOptions = {}> = { [KEY in keyof SCHEMA['attributes']]: If<MustBeDefined<SCHEMA['attributes'][KEY], OPTIONS>, never, SCHEMA['attributes'][KEY] extends { props: { savedAs: string; }; } ? // '& string' needed for old TS versions SCHEMA['attributes'][KEY]['props']['savedAs'] & string : KEY>; }[keyof SCHEMA['attributes']]; type ItemSchemaTransformedValue<SCHEMA extends ItemSchema, OPTIONS extends WriteValueOptions = {}> = ItemSchema extends SCHEMA ? { [KEY: string]: SchemaTransformedValue<Schema, Overwrite<OPTIONS, { defined: false; }>>; } : Optional<{ [KEY in OPTIONS extends { mode: 'key'; } ? SelectKeys<SCHEMA['attributes'], { props: { key: true; }; }> : keyof SCHEMA['attributes'] as SCHEMA['attributes'][KEY]['props'] extends { savedAs: string; } ? SCHEMA['attributes'][KEY]['props']['savedAs'] : KEY]: SchemaTransformedValue<SCHEMA['attributes'][KEY], Overwrite<OPTIONS, { defined: false; }>>; }, OptionalKeys<SCHEMA, Overwrite<OPTIONS, { defined: false; }>>>; type SchemaTransformedValue<SCHEMA extends Schema, OPTIONS extends WriteValueOptions = {}> = Schema extends SCHEMA ? unknown : (SCHEMA extends AnySchema ? AnySchemaTransformedValue<SCHEMA, OPTIONS> : never) | (SCHEMA extends PrimitiveSchema ? PrimitiveSchemaTransformedValue<SCHEMA, OPTIONS> : never) | (SCHEMA extends SetSchema ? SetSchemaTransformedValue<SCHEMA, OPTIONS> : never) | (SCHEMA extends ListSchema ? ListSchemaTransformedValue<SCHEMA, OPTIONS> : never) | (SCHEMA extends TupleSchema ? TupleSchemaTransformedValue<SCHEMA, OPTIONS> : never) | (SCHEMA extends MapSchema ? MapSchemaTransformedValue<SCHEMA, OPTIONS> : never) | (SCHEMA extends RecordSchema ? RecordSchemaTransformedValue<SCHEMA, OPTIONS> : never) | (SCHEMA extends AnyOfSchema ? AnyOfSchemaTransformedValue<SCHEMA, OPTIONS> : never); type AnySchemaTransformedValue<SCHEMA extends AnySchema, OPTIONS extends WriteValueOptions = {}> = AnySchema extends SCHEMA ? unknown : If<MustBeDefined<SCHEMA, OPTIONS>, never, undefined> | SchemaExtendedWriteValue<SCHEMA, OPTIONS> | (SCHEMA['props'] extends { transform: Transformer; } ? Call<TypeModifier<SCHEMA['props']['transform']>, ResolveAnySchema<SCHEMA>> : ResolveAnySchema<SCHEMA>); type PrimitiveSchemaTransformedValue<SCHEMA extends PrimitiveSchema, OPTIONS extends WriteValueOptions = {}> = PrimitiveSchema extends SCHEMA ? undefined | SchemaExtendedWriteValue<SCHEMA, OPTIONS> | ResolvedPrimitiveSchema : If<MustBeDefined<SCHEMA, OPTIONS>, never, undefined> | SchemaExtendedWriteValue<SCHEMA, OPTIONS> | (SCHEMA extends NullSchema ? SCHEMA['props'] extends { transform: Transformer; } ? Call<TypeModifier<SCHEMA['props']['transform']>, ResolvedNullSchema> : ResolvedNullSchema : never) | (SCHEMA extends NumberSchema ? SCHEMA['props'] extends { transform: Transformer; } ? Call<TypeModifier<SCHEMA['props']['transform']>, ResolveNumberSchema<SCHEMA>> : ResolveNumberSchema<SCHEMA> : never) | (SCHEMA extends BooleanSchema ? SCHEMA['props'] extends { transform: Transformer; } ? Call<TypeModifier<SCHEMA['props']['transform']>, ResolveBooleanSchema<SCHEMA>> : ResolveBooleanSchema<SCHEMA> : never) | (SCHEMA extends StringSchema ? SCHEMA['props'] extends { transform: Transformer; } ? Call<TypeModifier<SCHEMA['props']['transform']>, ResolveStringSchema<SCHEMA>> : ResolveStringSchema<SCHEMA> : never) | (SCHEMA extends BinarySchema ? SCHEMA['props'] extends { transform: Transformer; } ? Call<TypeModifier<SCHEMA['props']['transform']>, ResolveBinarySchema<SCHEMA>> : ResolveBinarySchema<SCHEMA> : never); type SetSchemaTransformedValue<SCHEMA extends SetSchema, OPTIONS extends WriteValueOptions = {}> = SetSchema extends SCHEMA ? If<MustBeDefined<SCHEMA, OPTIONS>, never, undefined> | SchemaExtendedWriteValue<SCHEMA, OPTIONS> | Set<SchemaTransformedValue<SetSchema['elements'], Overwrite<OPTIONS, { mode: 'put'; defined: false; }>>> : If<MustBeDefined<SCHEMA, OPTIONS>, never, undefined> | SchemaExtendedWriteValue<SCHEMA, OPTIONS> | Set<SchemaTransformedValue<SCHEMA['elements'], Overwrite<OPTIONS, { mode: 'put'; defined: false; }>>>; type ListSchemaTransformedValue<SCHEMA extends ListSchema, OPTIONS extends WriteValueOptions = {}> = ListSchema extends SCHEMA ? If<MustBeDefined<SCHEMA, OPTIONS>, never, undefined> | SchemaExtendedWriteValue<SCHEMA, OPTIONS> | unknown[] : If<MustBeDefined<SCHEMA, OPTIONS>, never, undefined> | SchemaExtendedWriteValue<SCHEMA, OPTIONS> | SchemaTransformedValue<SCHEMA['elements'], Overwrite<OPTIONS, { defined: false; }>>[]; type TupleSchemaTransformedValue<SCHEMA extends TupleSchema, OPTIONS extends WriteValueOptions = {}> = TupleSchema extends SCHEMA ? If<MustBeDefined<SCHEMA, OPTIONS>, never, undefined> | SchemaExtendedWriteValue<SCHEMA, OPTIONS> | unknown[] : If<MustBeDefined<SCHEMA, OPTIONS>, never, undefined> | SchemaExtendedWriteValue<SCHEMA, OPTIONS> | TransformedValueRec<SCHEMA['elements'], Overwrite<OPTIONS, { defined: false; }>>; type MapSchemaTransformedValue<SCHEMA extends MapSchema, OPTIONS extends WriteValueOptions = {}> = MapSchema extends SCHEMA ? If<MustBeDefined<SCHEMA, OPTIONS>, never, undefined> | SchemaExtendedWriteValue<SCHEMA, OPTIONS> | { [KEY: string]: unknown; } : If<MustBeDefined<SCHEMA, OPTIONS>, never, undefined> | SchemaExtendedWriteValue<SCHEMA, OPTIONS> | Optional<{ [KEY in OPTIONS extends { mode: 'key'; } ? SelectKeys<SCHEMA['attributes'], { props: { key: true; }; }> : keyof SCHEMA['attributes'] as SCHEMA['attributes'][KEY]['props'] extends { savedAs: string; } ? SCHEMA['attributes'][KEY]['props']['savedAs'] : KEY]: SchemaTransformedValue<SCHEMA['attributes'][KEY], Overwrite<OPTIONS, { defined: false; }>>; }, OptionalKeys<SCHEMA, Overwrite<OPTIONS, { defined: false; }>>>; type RecordSchemaTransformedValue<SCHEMA extends RecordSchema, OPTIONS extends WriteValueOptions = {}> = RecordSchema extends SCHEMA ? If<MustBeDefined<SCHEMA, OPTIONS>, never, undefined> | SchemaExtendedWriteValue<SCHEMA, OPTIONS> | Record<string, unknown> : If<MustBeDefined<SCHEMA, OPTIONS>, never, undefined> | SchemaExtendedWriteValue<SCHEMA, OPTIONS> | Optional<Record<Extract<SchemaTransformedValue<SCHEMA['keys'], OPTIONS>, string>, SchemaTransformedValue<SCHEMA['elements'], Overwrite<OPTIONS, { defined: false; }>>>, (SCHEMA['props'] extends { partial: true; } ? string : never) | (OPTIONS extends { mode: 'update'; } ? string : never)>; type AnyOfSchemaTransformedValue<SCHEMA extends AnyOfSchema, OPTIONS extends WriteValueOptions = {}> = AnyOfSchema extends SCHEMA ? unknown : If<MustBeDefined<SCHEMA, OPTIONS>, never, undefined> | SchemaExtendedWriteValue<SCHEMA, OPTIONS> | TransformedValue<SCHEMA['elements'][number], OPTIONS>; export {};