dynamodb-toolbox
Version:
Lightweight and type-safe query builder for DynamoDB and TypeScript.
95 lines (94 loc) • 8.12 kB
TypeScript
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 } 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';
export type TransformedValue<SCHEMA extends Schema, OPTIONS extends WriteValueOptions = {}> = SCHEMA extends ItemSchema ? ItemSchemaTransformedValue<SCHEMA, OPTIONS> : SCHEMA extends Schema ? SchemaTransformedValue<SCHEMA, OPTIONS> : never;
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 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 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> | MapAnyOfSchemaTransformedValue<SCHEMA['elements'], OPTIONS>;
type MapAnyOfSchemaTransformedValue<ELEMENTS extends Schema[], OPTIONS extends WriteValueOptions = {}, RESULTS = never> = ELEMENTS extends [infer ELEMENTS_HEAD, ...infer ELEMENTS_TAIL] ? ELEMENTS_HEAD extends Schema ? ELEMENTS_TAIL extends Schema[] ? MapAnyOfSchemaTransformedValue<ELEMENTS_TAIL, OPTIONS, RESULTS | SchemaTransformedValue<ELEMENTS_HEAD, OPTIONS>> : never : never : [RESULTS] extends [never] ? unknown : RESULTS;
export {};