dynamodb-toolbox
Version:
Lightweight and type-safe query builder for DynamoDB and TypeScript.
219 lines (218 loc) • 14.5 kB
TypeScript
import type { AnyOfSchema, AnySchema, AppendKey, BinarySchema, BooleanSchema, ItemSchema, ListSchema, MapSchema, NullSchema, NumberSchema, Paths, PrimitiveSchema, RecordSchema, ResolveAnySchema, ResolveBinarySchema, ResolveBooleanSchema, ResolveNumberSchema, ResolvePrimitiveSchema, ResolveStringSchema, ResolvedBinarySchema, ResolvedNumberSchema, ResolvedStringSchema, Schema, SetSchema, StringSchema, StringToEscape } from '../../../schema/index.js';
import type { Extends, If } from '../../../types/index.js';
export type AnySchemaCondition<SCHEMA extends AnySchema, ATTR_PATH extends string, ALL_PATHS extends string> = AttrCondition<ATTR_PATH, Exclude<Schema, AnySchema>, ALL_PATHS, ResolveAnySchema<SCHEMA>> | AttrCondition<`${ATTR_PATH}${string}`, Exclude<Schema, AnySchema>, ALL_PATHS>;
export type ConditionType = 'S' | 'SS' | 'N' | 'NS' | 'B' | 'BS' | 'BOOL' | 'NULL' | 'L' | 'M';
export type AttrCondition<ATTR_PATH extends string, SCHEMA extends Schema, ALL_PATHS extends string, CUSTOM_VALUE = never> = (SCHEMA extends AnySchema ? AnySchemaCondition<SCHEMA, ATTR_PATH, ALL_PATHS> : never) | (SCHEMA extends NullSchema ? NullSchemaCondition<ATTR_PATH> : never) | (SCHEMA extends BooleanSchema ? BooleanSchemaCondition<ATTR_PATH, SCHEMA, ALL_PATHS, CUSTOM_VALUE> : never) | (SCHEMA extends NumberSchema ? NumberSchemaCondition<ATTR_PATH, SCHEMA, ALL_PATHS, CUSTOM_VALUE> : never) | (SCHEMA extends StringSchema ? StringSchemaCondition<ATTR_PATH, SCHEMA, ALL_PATHS, CUSTOM_VALUE> : never) | (SCHEMA extends BinarySchema ? BinarySchemaCondition<ATTR_PATH, SCHEMA, ALL_PATHS, CUSTOM_VALUE> : never) | (SCHEMA extends SetSchema ? SetSchemaCondition<ATTR_PATH, SCHEMA, ALL_PATHS> : never) | (SCHEMA extends ListSchema ? ListSchemaCondition<ATTR_PATH, SCHEMA, ALL_PATHS> : never) | (SCHEMA extends MapSchema ? MapSchemaCondition<ATTR_PATH, SCHEMA, ALL_PATHS> : never) | (SCHEMA extends RecordSchema ? RecordSchemaCondition<ATTR_PATH, SCHEMA, ALL_PATHS> : never) | (SCHEMA extends AnyOfSchema ? AnyOfSchemaCondition<ATTR_PATH, SCHEMA, ALL_PATHS> : never);
export type ExistsCondition<ATTR_PATH extends string> = {
attr: ATTR_PATH;
exists: boolean;
};
export type TypeCondition<ATTR_PATH extends string> = {
attr: ATTR_PATH;
type: ConditionType;
};
export type EqCondition<ATTR_PATH extends string, ATTR_VALUE, ALL_PATHS extends string, CUSTOM_VALUE = never> = {
attr: ATTR_PATH;
eq: ATTR_VALUE | {
attr: ALL_PATHS;
} | CUSTOM_VALUE;
transform?: boolean;
};
type SizeEqCondition<ATTR_PATH extends string, ALL_PATHS extends string> = {
size: ATTR_PATH;
eq: number | {
attr: ALL_PATHS;
};
};
export type NotEqCondition<ATTR_PATH extends string, ATTR_VALUE, ALL_PATHS extends string, CUSTOM_VALUE = never> = {
attr: ATTR_PATH;
ne: ATTR_VALUE | {
attr: ALL_PATHS;
} | CUSTOM_VALUE;
transform?: boolean;
};
type SizeNotEqCondition<ATTR_PATH extends string, ALL_PATHS extends string> = {
size: ATTR_PATH;
ne: number | {
attr: ALL_PATHS;
};
};
export type InCondition<ATTR_PATH extends string, ATTR_VALUE, ALL_PATHS extends string, CUSTOM_VALUE = never> = {
attr: ATTR_PATH;
in: (ATTR_VALUE | {
attr: ALL_PATHS;
} | CUSTOM_VALUE)[];
transform?: boolean;
};
type SizeInCondition<ATTR_PATH extends string, ALL_PATHS extends string> = {
size: ATTR_PATH;
in: (number | {
attr: ALL_PATHS;
})[];
};
export type ValueCondition<ATTR_PATH extends string, ATTR_VALUE, ALL_PATHS extends string, CUSTOM_VALUE = never> = EqCondition<ATTR_PATH, ATTR_VALUE, ALL_PATHS, CUSTOM_VALUE> | NotEqCondition<ATTR_PATH, ATTR_VALUE, ALL_PATHS, CUSTOM_VALUE> | InCondition<ATTR_PATH, ATTR_VALUE, ALL_PATHS, CUSTOM_VALUE>;
type SizeValueCondition<ATTR_PATH extends string, ALL_PATHS extends string> = SizeEqCondition<ATTR_PATH, ALL_PATHS> | SizeNotEqCondition<ATTR_PATH, ALL_PATHS> | SizeInCondition<ATTR_PATH, ALL_PATHS>;
export type LessThanCondition<ATTR_PATH extends string, ATTR_VALUE, ALL_PATHS extends string, CUSTOM_VALUE = never> = {
attr: ATTR_PATH;
lt: ATTR_VALUE | {
attr: ALL_PATHS;
} | CUSTOM_VALUE;
transform?: boolean;
};
type SizeLessThanCondition<ATTR_PATH extends string, ALL_PATHS extends string> = {
size: ATTR_PATH;
lt: number | {
attr: ALL_PATHS;
};
};
export type LessThanOrEqCondition<ATTR_PATH extends string, ATTR_VALUE, ALL_PATHS extends string, CUSTOM_VALUE = never> = {
attr: ATTR_PATH;
lte: ATTR_VALUE | {
attr: ALL_PATHS;
} | CUSTOM_VALUE;
transform?: boolean;
};
type SizeLessThanOrEqCondition<ATTR_PATH extends string, ALL_PATHS extends string> = {
size: ATTR_PATH;
lte: number | {
attr: ALL_PATHS;
};
};
export type GreaterThanCondition<ATTR_PATH extends string, ATTR_VALUE, ALL_PATHS extends string, CUSTOM_VALUE = never> = {
attr: ATTR_PATH;
gt: ATTR_VALUE | {
attr: ALL_PATHS;
} | CUSTOM_VALUE;
transform?: boolean;
};
type SizeGreaterThanCondition<ATTR_PATH extends string, ALL_PATHS extends string> = {
size: ATTR_PATH;
gt: number | {
attr: ALL_PATHS;
};
};
export type GreaterThanOrEqCondition<ATTR_PATH extends string, ATTR_VALUE, ALL_PATHS extends string, CUSTOM_VALUE = never> = {
attr: ATTR_PATH;
gte: ATTR_VALUE | {
attr: ALL_PATHS;
} | CUSTOM_VALUE;
transform?: boolean;
};
type SizeGreaterThanOrEqCondition<ATTR_PATH extends string, ALL_PATHS extends string> = {
size: ATTR_PATH;
gte: number | {
attr: ALL_PATHS;
};
};
export type BetweenCondition<ATTR_PATH extends string, ATTR_VALUE, ALL_PATHS extends string, CUSTOM_VALUE = never> = {
attr: ATTR_PATH;
between: [
ATTR_VALUE | {
attr: ALL_PATHS;
} | CUSTOM_VALUE,
ATTR_VALUE | {
attr: ALL_PATHS;
} | CUSTOM_VALUE
];
transform?: boolean;
};
type SizeBetweenCondition<ATTR_PATH extends string, ALL_PATHS extends string> = {
size: ATTR_PATH;
between: [number | {
attr: ALL_PATHS;
}, number | {
attr: ALL_PATHS;
}];
};
export type RangeCondition<ATTR_PATH extends string, ATTR_VALUE, ALL_PATHS extends string, CUSTOM_VALUE = never> = LessThanCondition<ATTR_PATH, ATTR_VALUE, ALL_PATHS, CUSTOM_VALUE> | LessThanOrEqCondition<ATTR_PATH, ATTR_VALUE, ALL_PATHS, CUSTOM_VALUE> | GreaterThanCondition<ATTR_PATH, ATTR_VALUE, ALL_PATHS, CUSTOM_VALUE> | GreaterThanOrEqCondition<ATTR_PATH, ATTR_VALUE, ALL_PATHS, CUSTOM_VALUE> | BetweenCondition<ATTR_PATH, ATTR_VALUE, ALL_PATHS, CUSTOM_VALUE>;
type SizeRangeCondition<ATTR_PATH extends string, ALL_PATHS extends string> = SizeLessThanCondition<ATTR_PATH, ALL_PATHS> | SizeLessThanOrEqCondition<ATTR_PATH, ALL_PATHS> | SizeGreaterThanCondition<ATTR_PATH, ALL_PATHS> | SizeGreaterThanOrEqCondition<ATTR_PATH, ALL_PATHS> | SizeBetweenCondition<ATTR_PATH, ALL_PATHS>;
export type SizeCondition<ATTR_PATH extends string, ALL_PATHS extends string> = SizeValueCondition<ATTR_PATH, ALL_PATHS> | SizeRangeCondition<ATTR_PATH, ALL_PATHS>;
export type NullSchemaCondition<ATTR_PATH extends string> = ExistsCondition<ATTR_PATH> | TypeCondition<ATTR_PATH>;
export type BooleanSchemaCondition<ATTR_PATH extends string, SCHEMA extends BooleanSchema, ALL_PATHS extends string, CUSTOM_VALUE = never> = ExistsCondition<ATTR_PATH> | TypeCondition<ATTR_PATH> | ValueCondition<ATTR_PATH, ResolveBooleanSchema<SCHEMA>, ALL_PATHS, CUSTOM_VALUE>;
export type NumberSchemaCondition<ATTR_PATH extends string, SCHEMA extends NumberSchema, ALL_PATHS extends string, CUSTOM_VALUE = never> = ExistsCondition<ATTR_PATH> | TypeCondition<ATTR_PATH> | ValueCondition<ATTR_PATH, ResolveNumberSchema<SCHEMA>, ALL_PATHS, CUSTOM_VALUE> | RangeCondition<ATTR_PATH, ResolvedNumberSchema, ALL_PATHS, CUSTOM_VALUE>;
export type ContainsCondition<ATTR_PATH extends string, ATTR_VALUE, ALL_PATHS extends string, CUSTOM_VALUE = never> = {
attr: ATTR_PATH;
contains: ATTR_VALUE | {
attr: ALL_PATHS;
} | CUSTOM_VALUE;
transform?: boolean;
};
export type BeginsWithCondition<ATTR_PATH extends string, ATTR_VALUE, ALL_PATHS extends string, CUSTOM_VALUE = never> = {
attr: ATTR_PATH;
beginsWith: ATTR_VALUE | {
attr: ALL_PATHS;
} | CUSTOM_VALUE;
transform?: boolean;
};
export type StringSchemaCondition<ATTR_PATH extends string, SCHEMA extends StringSchema, ALL_PATHS extends string, CUSTOM_VALUE = never> = ExistsCondition<ATTR_PATH> | TypeCondition<ATTR_PATH> | ValueCondition<ATTR_PATH, ResolveStringSchema<SCHEMA>, ALL_PATHS, CUSTOM_VALUE> | RangeCondition<ATTR_PATH, ResolvedStringSchema, ALL_PATHS, CUSTOM_VALUE> | BeginsWithCondition<ATTR_PATH, ResolvedStringSchema, ALL_PATHS, CUSTOM_VALUE> | ContainsCondition<ATTR_PATH, ResolvedStringSchema, ALL_PATHS, CUSTOM_VALUE> | SizeCondition<ATTR_PATH, ALL_PATHS>;
export type BinarySchemaCondition<ATTR_PATH extends string, SCHEMA extends BinarySchema, ALL_PATHS extends string, CUSTOM_VALUE = never> = ExistsCondition<ATTR_PATH> | TypeCondition<ATTR_PATH> | ValueCondition<ATTR_PATH, ResolveBinarySchema<SCHEMA>, ALL_PATHS, CUSTOM_VALUE> | RangeCondition<ATTR_PATH, ResolvedBinarySchema, ALL_PATHS, CUSTOM_VALUE> | SizeCondition<ATTR_PATH, ALL_PATHS>;
export type SetSchemaCondition<ATTR_PATH extends string, SCHEMA extends SetSchema, ALL_PATHS extends string> = ExistsCondition<ATTR_PATH> | TypeCondition<ATTR_PATH> | ContainsCondition<ATTR_PATH, ResolvePrimitiveSchema<SCHEMA['elements']>, ALL_PATHS> | SizeCondition<ATTR_PATH, ALL_PATHS>;
export type ListSchemaCondition<ATTR_PATH extends string, SCHEMA extends ListSchema, ALL_PATHS extends string> = ExistsCondition<ATTR_PATH> | TypeCondition<ATTR_PATH> | (SCHEMA['elements'] extends PrimitiveSchema ? ContainsCondition<ATTR_PATH, ResolvePrimitiveSchema<SCHEMA['elements']>, ALL_PATHS> : never) | (ListSchema extends SCHEMA ? never : AttrCondition<`${ATTR_PATH}[${number}]`, SCHEMA['elements'], ALL_PATHS>) | SizeCondition<ATTR_PATH, ALL_PATHS>;
export type MapSchemaCondition<ATTR_PATH extends string, SCHEMA extends MapSchema, ALL_PATHS extends string> = ExistsCondition<ATTR_PATH> | TypeCondition<ATTR_PATH> | (MapSchema extends SCHEMA ? never : {
[KEY in keyof SCHEMA['attributes'] & string]: AttrCondition<AppendKey<ATTR_PATH, KEY>, SCHEMA['attributes'][KEY], ALL_PATHS>;
}[keyof SCHEMA['attributes'] & string]) | SizeCondition<ATTR_PATH, ALL_PATHS>;
export type RecordSchemaCondition<ATTR_PATH extends string, SCHEMA extends RecordSchema, ALL_PATHS extends string> = ExistsCondition<ATTR_PATH> | TypeCondition<ATTR_PATH> | (RecordSchema extends SCHEMA ? never : AttrCondition<AppendKey<ATTR_PATH, ResolveStringSchema<SCHEMA['keys']>>, SCHEMA['elements'], ALL_PATHS>) | SizeCondition<ATTR_PATH, ALL_PATHS>;
export type AnyOfSchemaCondition<ATTR_PATH extends string, SCHEMA extends AnyOfSchema, ALL_PATHS extends string> = ExistsCondition<ATTR_PATH> | TypeCondition<ATTR_PATH> | (AnyOfSchema extends SCHEMA ? never : SCHEMA['elements'][number] extends infer ELEMENT ? ELEMENT extends Schema ? AttrCondition<ATTR_PATH, ELEMENT, ALL_PATHS> : never : never);
export type NonLogicalCondition<SCHEMA extends ItemSchema = ItemSchema> = ItemSchema extends SCHEMA ? FreeCondition | AnySchemaCondition<AnySchema, string, string> : FreeCondition | (keyof SCHEMA['attributes'] extends infer ATTR_PATH ? ATTR_PATH extends string ? AttrCondition<`['${ATTR_PATH}']` | If<Extends<ATTR_PATH, StringToEscape>, never, ATTR_PATH>, SCHEMA['attributes'][ATTR_PATH], Paths<SCHEMA>> : never : never);
type DdbAttributeValue = null | boolean | number | string | Uint8Array | Set<string> | Set<number> | Set<Uint8Array> | DdbAttributeValue[] | {
[key: string]: DdbAttributeValue;
};
type ScalarAttributeValue = number | string | Uint8Array;
type ContainersAttributes = string | Set<string> | Set<number> | Set<Uint8Array> | DdbAttributeValue[];
/**
* @debt v3 "Size conditions can be applied to free conditions as well: Rework { size: 'path', eq: 3 } to { attr: 'path', sizeEq: 3 } (=> { value: 3, sizeEq : 3 })"
*/
export type FreeCondition = FreeTypeCondition | FreeEqCondition | FreeNotEqCondition | FreeInCondition | FreeLessThanCondition | FreeLessThanOrEqCondition | FreeGreaterThanCondition | FreeGreaterThanOrEqCondition | FreeBetweenCondition | FreeBeginsWithCondition | FreeContainsCondition;
type FreeTypeCondition = {
value: DdbAttributeValue;
type: ConditionType;
};
type FreeEqCondition<VALUE extends DdbAttributeValue = DdbAttributeValue> = VALUE extends DdbAttributeValue ? {
value: VALUE;
eq: VALUE;
} : never;
type FreeNotEqCondition<VALUE extends DdbAttributeValue = DdbAttributeValue> = VALUE extends DdbAttributeValue ? {
value: VALUE;
ne: VALUE;
} : never;
type FreeInCondition<VALUE extends DdbAttributeValue = DdbAttributeValue> = VALUE extends DdbAttributeValue ? {
value: VALUE;
in: VALUE[];
} : never;
type FreeLessThanCondition<VALUE extends ScalarAttributeValue = ScalarAttributeValue> = VALUE extends ScalarAttributeValue ? {
value: VALUE;
lt: VALUE;
} : never;
type FreeLessThanOrEqCondition<VALUE extends ScalarAttributeValue = ScalarAttributeValue> = VALUE extends ScalarAttributeValue ? {
value: VALUE;
lte: VALUE;
} : never;
type FreeGreaterThanCondition<VALUE extends ScalarAttributeValue = ScalarAttributeValue> = VALUE extends ScalarAttributeValue ? {
value: VALUE;
gt: VALUE;
} : never;
type FreeGreaterThanOrEqCondition<VALUE extends ScalarAttributeValue = ScalarAttributeValue> = VALUE extends ScalarAttributeValue ? {
value: VALUE;
gte: VALUE;
} : never;
type FreeBetweenCondition<VALUE extends ScalarAttributeValue = ScalarAttributeValue> = VALUE extends ScalarAttributeValue ? {
value: VALUE;
between: [VALUE, VALUE];
} : never;
type FreeBeginsWithCondition = {
value: string;
beginsWith: string;
};
type FreeContainsCondition<VALUE extends ContainersAttributes = ContainersAttributes> = VALUE extends ContainersAttributes ? {
value: VALUE;
contains: VALUE extends Set<infer ELEMENT> ? ELEMENT : VALUE extends (infer ELEMENT)[] ? ELEMENT : VALUE;
} : never;
export type LogicalCondition<SCHEMA extends ItemSchema = ItemSchema> = {
and: SchemaCondition<SCHEMA>[];
} | {
or: SchemaCondition<SCHEMA>[];
} | {
not: SchemaCondition<SCHEMA>;
};
export type SchemaCondition<SCHEMA extends ItemSchema = ItemSchema> = LogicalCondition<SCHEMA> | NonLogicalCondition<SCHEMA>;
export {};