dynamodb-toolbox
Version:
Lightweight and type-safe query builder for DynamoDB and TypeScript.
36 lines (35 loc) • 1.75 kB
TypeScript
import type { MapSchema } from '../map/schema.js';
import type { StringSchema } from '../string/schema.js';
import type { Always, AtLeastOnce, Schema, SchemaProps } from '../types/index.js';
import type { AnyOfSchema } from './schema.js';
type ElementDiscriminator<ELEMENT extends Schema> = Schema extends ELEMENT ? string : (ELEMENT extends AnyOfSchema ? Discriminator<ELEMENT['elements']> : never) | (ELEMENT extends MapSchema ? {
[KEY in keyof ELEMENT['attributes']]: ELEMENT['attributes'][KEY] extends StringSchema ? ELEMENT['attributes'][KEY]['props'] extends {
enum: string[];
required?: AtLeastOnce | Always;
transform?: undefined;
} ? [
KEY,
ELEMENT['attributes'][KEY]['props'] extends {
savedAs: string;
} ? ELEMENT['attributes'][KEY]['props']['savedAs'] : KEY
] : never : never;
}[keyof ELEMENT['attributes']] : never);
export type Discriminator<ELEMENTS extends Schema[], RESULTS extends [string, string] = [string, string]> = Schema[] extends ELEMENTS ? string : ELEMENTS extends [infer ELEMENTS_HEAD, ...infer ELEMENTS_TAIL] ? ELEMENTS_HEAD extends Schema ? ELEMENTS_TAIL extends Schema[] ? Discriminator<ELEMENTS_TAIL, RESULTS & ElementDiscriminator<ELEMENTS_HEAD>> : never : never : RESULTS[0];
export interface AnyOfSchemaProps extends SchemaProps {
discriminator?: string;
}
interface AnyOfElementProps extends SchemaProps {
required?: AtLeastOnce;
hidden?: false;
savedAs?: undefined;
keyDefault?: undefined;
putDefault?: undefined;
updateDefault?: undefined;
keyLink?: undefined;
putLink?: undefined;
updateLink?: undefined;
}
export type AnyOfElementSchema = Schema & {
props: AnyOfElementProps;
};
export {};