electrodb-temp
Version:
A library to more easily create and interact with multiple entities and heretical relationships in dynamodb
1,753 lines (1,652 loc) • 154 kB
TypeScript
export type DocumentClientMethod = (parameters: any) => {
promise: () => Promise<any>;
};
type TransactWriteItem =
| { Put: { [param: string]: any } }
| { Update: { [param: string]: any } }
| { Delete: { [param: string]: any } }
| { ConditionCheck: { [param: string]: any } };
type TransactWriteCommandInput = {
TransactItems: TransactWriteItem[];
ClientRequestToken?: string;
};
type TransactGetItem = { Get: { [param: string]: any } };
type TransactGetCommandInput = {
TransactItems: TransactGetItem[];
};
export type DocumentClient =
| {
get: DocumentClientMethod;
put: DocumentClientMethod;
delete: DocumentClientMethod;
update: DocumentClientMethod;
batchWrite: DocumentClientMethod;
batchGet: DocumentClientMethod;
scan: DocumentClientMethod;
transactGet: DocumentClientMethod;
transactWrite: DocumentClientMethod;
}
| {
send: (command: any) => Promise<any>;
};
export type AllCollectionNames<
E extends { [name: string]: Entity<any, any, any, any> },
> = {
[Name in keyof E]: E[Name] extends Entity<infer A, infer F, infer C, infer S>
? {
[Collection in keyof EntityCollections<A, F, C, S>]: Collection;
}[keyof EntityCollections<A, F, C, S>]
: never;
}[keyof E];
export type ClusteredCollectionNames<
E extends { [name: string]: Entity<any, any, any, any> },
> = {
[Name in keyof E]: E[Name] extends Entity<infer A, infer F, infer C, infer S>
? {
[Collection in keyof ClusteredEntityCollections<
A,
F,
C,
S
>]: Collection;
}[keyof ClusteredEntityCollections<A, F, C, S>]
: never;
}[keyof E];
export type IsolatedCollectionNames<
E extends { [name: string]: Entity<any, any, any, any> },
> = {
[Name in keyof E]: E[Name] extends Entity<infer A, infer F, infer C, infer S>
? {
[Collection in keyof IsolatedEntityCollections<A, F, C, S>]: Collection;
}[keyof IsolatedEntityCollections<A, F, C, S>]
: never;
}[keyof E];
export type IsolatedCollectionAssociations<
E extends { [name: string]: Entity<any, any, any, any> },
> = {
[Collection in IsolatedCollectionNames<E>]: {
[Name in keyof E]: E[Name] extends Entity<
infer A,
infer F,
infer C,
infer S
>
? Collection extends keyof IsolatedEntityCollections<A, F, C, S>
? Name
: never
: never;
}[keyof E];
};
export type AllEntityAttributeNames<
E extends { [name: string]: Entity<any, any, any, any> },
> = {
[Name in keyof E]: {
[A in keyof E[Name]["schema"]["attributes"]]: A;
}[keyof E[Name]["schema"]["attributes"]];
}[keyof E];
export type AllEntityAttributes<
E extends { [name: string]: Entity<any, any, any, any> },
> = {
[Attr in AllEntityAttributeNames<E>]: {
[Name in keyof E]: Attr extends keyof E[Name]["schema"]["attributes"]
? ItemAttribute<E[Name]["schema"]["attributes"][Attr]>
: never;
}[keyof E];
};
export type CollectionAssociations<
E extends { [name: string]: Entity<any, any, any, any> },
> = {
[Collection in AllCollectionNames<E>]: {
[Name in keyof E]: E[Name] extends Entity<
infer A,
infer F,
infer C,
infer S
>
? Collection extends keyof EntityCollections<A, F, C, S>
? Name
: never
: never;
}[keyof E];
};
export type ClusteredCollectionAssociations<
E extends { [name: string]: Entity<any, any, any, any> },
> = {
[Collection in ClusteredCollectionNames<E>]: {
[Name in keyof E]: E[Name] extends Entity<
infer A,
infer F,
infer C,
infer S
>
? Collection extends keyof ClusteredEntityCollections<A, F, C, S>
? Name
: never
: never;
}[keyof E];
};
export type CollectionAttributes<
E extends { [name: string]: Entity<any, any, any, any> },
Collections extends CollectionAssociations<E>,
> = {
[Collection in keyof Collections]: {
[EntityName in keyof E]: E[EntityName] extends Entity<
infer A,
infer F,
infer C,
infer S
>
? EntityName extends Collections[Collection]
? keyof S["attributes"]
: never
: never;
}[keyof E];
};
export type ClusteredCollectionAttributes<
E extends { [name: string]: Entity<any, any, any, any> },
Collections extends ClusteredCollectionAssociations<E>,
> = {
[Collection in keyof Collections]: {
[EntityName in keyof E]: E[EntityName] extends Entity<
infer A,
infer F,
infer C,
infer S
>
? EntityName extends Collections[Collection]
? keyof S["attributes"]
: never
: never;
}[keyof E];
};
export type IsolatedCollectionAttributes<
E extends { [name: string]: Entity<any, any, any, any> },
Collections extends IsolatedCollectionAssociations<E>,
> = {
[Collection in keyof Collections]: {
[EntityName in keyof E]: E[EntityName] extends Entity<
infer A,
infer F,
infer C,
infer S
>
? EntityName extends Collections[Collection]
? keyof S["attributes"]
: never
: never;
}[keyof E];
};
type DynamoDBAttributeType =
| "S"
| "SS"
| "N"
| "NS"
| "B"
| "BS"
| "BOOL"
| "NULL"
| "L"
| "M";
export interface CollectionWhereOperations {
eq: <T, A extends WhereAttributeSymbol<T>>(attr: A, value: T) => string;
ne: <T, A extends WhereAttributeSymbol<T>>(attr: A, value: T) => string;
gt: <T, A extends WhereAttributeSymbol<T>>(attr: A, value: T) => string;
lt: <T, A extends WhereAttributeSymbol<T>>(attr: A, value: T) => string;
gte: <T, A extends WhereAttributeSymbol<T>>(attr: A, value: T) => string;
lte: <T, A extends WhereAttributeSymbol<T>>(attr: A, value: T) => string;
between: <T, A extends WhereAttributeSymbol<T>>(
attr: A,
value: T,
value2: T,
) => string;
begins: <T, A extends WhereAttributeSymbol<T>>(attr: A, value: T) => string;
exists: <T, A extends WhereAttributeSymbol<T>>(attr: A) => string;
notExists: <T, A extends WhereAttributeSymbol<T>>(attr: A) => string;
contains: <T, A extends WhereAttributeSymbol<T>>(
attr: A,
value: A extends WhereAttributeSymbol<infer V>
? V extends Array<infer I>
? I
: V
: never,
) => string;
notContains: <T, A extends WhereAttributeSymbol<T>>(
attr: A,
value: A extends WhereAttributeSymbol<infer V>
? V extends Array<infer I>
? I
: V
: never,
) => string;
field: (name: string) => string;
name: <T, A extends WhereAttributeSymbol<T>>(attr: A) => string;
value: <T, A extends WhereAttributeSymbol<T>>(attr: A, value: T) => string;
size: <T, A extends WhereAttributeSymbol<T>>(attr: A) => string;
type: <T, A extends WhereAttributeSymbol<T>>(
attr: A,
type: DynamoDBAttributeType,
) => string;
escape: <T extends string | number | boolean>(
value: T,
) => T extends string
? string
: T extends number
? number
: T extends boolean
? boolean
: never;
}
export type CollectionWhereCallback<
E extends { [name: string]: Entity<any, any, any, any> },
I extends Partial<AllEntityAttributes<E>>,
> = <W extends { [A in keyof I]: WhereAttributeSymbol<I[A]> }>(
attributes: W,
operations: CollectionWhereOperations,
) => string;
export type CollectionWhereClause<
E extends { [name: string]: Entity<any, any, any, any> },
A extends string,
F extends string,
C extends string,
S extends Schema<A, F, C>,
I extends Partial<AllEntityAttributes<E>>,
T,
> = (where: CollectionWhereCallback<E, I>) => T;
export interface ServiceWhereRecordsActionOptions<
E extends { [name: string]: Entity<any, any, any, any> },
A extends string,
F extends string,
C extends string,
S extends Schema<A, F, C>,
I extends Partial<AllEntityAttributes<E>>,
Items,
IndexCompositeAttributes,
> {
go: ServiceQueryRecordsGo<Items>;
params: ParamRecord;
where: CollectionWhereClause<
E,
A,
F,
C,
S,
I,
ServiceWhereRecordsActionOptions<
E,
A,
F,
C,
S,
I,
Items,
IndexCompositeAttributes
>
>;
}
export type CollectionIndexKeys<
Entities extends { [name: string]: Entity<any, any, any, any> },
Collections extends CollectionAssociations<Entities>,
> = {
[Collection in keyof Collections]: {
[EntityResultName in Collections[Collection]]: EntityResultName extends keyof Entities
? Entities[EntityResultName] extends Entity<
infer A,
infer F,
infer C,
infer S
>
? keyof TableIndexCompositeAttributes<A, F, C, S>
: never
: never;
}[Collections[Collection]];
};
export type ClusteredCollectionIndexKeys<
Entities extends { [name: string]: Entity<any, any, any, any> },
Collections extends ClusteredCollectionAssociations<Entities>,
> = {
[Collection in keyof Collections]: {
[EntityResultName in Collections[Collection]]: EntityResultName extends keyof Entities
? Entities[EntityResultName] extends Entity<
infer A,
infer F,
infer C,
infer S
>
? keyof TableIndexCompositeAttributes<A, F, C, S>
: never
: never;
}[Collections[Collection]];
};
export type IsolatedCollectionIndexKeys<
Entities extends { [name: string]: Entity<any, any, any, any> },
Collections extends IsolatedCollectionAssociations<Entities>,
> = {
[Collection in keyof Collections]: {
[EntityResultName in Collections[Collection]]: EntityResultName extends keyof Entities
? Entities[EntityResultName] extends Entity<
infer A,
infer F,
infer C,
infer S
>
? keyof TableIndexCompositeAttributes<A, F, C, S>
: never
: never;
}[Collections[Collection]];
};
export type CollectionPageKeys<
Entities extends { [name: string]: Entity<any, any, any, any> },
Collections extends CollectionAssociations<Entities>,
> = {
[Collection in keyof Collections]: {
[EntityResultName in Collections[Collection]]: EntityResultName extends keyof Entities
? Entities[EntityResultName] extends Entity<
infer A,
infer F,
infer C,
infer S
>
? keyof Parameters<
Entities[EntityResultName]["query"][Collection extends keyof EntityCollections<
A,
F,
C,
S
>
? EntityCollections<A, F, C, S>[Collection]
: never]
>[0]
: never
: never;
}[Collections[Collection]];
};
export type ClusteredCollectionPageKeys<
Entities extends { [name: string]: Entity<any, any, any, any> },
Collections extends ClusteredCollectionAssociations<Entities>,
> = {
[Collection in keyof Collections]: {
[EntityResultName in Collections[Collection]]: EntityResultName extends keyof Entities
? Entities[EntityResultName] extends Entity<
infer A,
infer F,
infer C,
infer S
>
? keyof Parameters<
Entities[EntityResultName]["query"][Collection extends keyof ClusteredEntityCollections<
A,
F,
C,
S
>
? ClusteredEntityCollections<A, F, C, S>[Collection]
: never]
>[0]
: never
: never;
}[Collections[Collection]];
};
export type IsolatedCollectionPageKeys<
Entities extends { [name: string]: Entity<any, any, any, any> },
Collections extends IsolatedCollectionAssociations<Entities>,
> = {
[Collection in keyof Collections]: {
[EntityResultName in Collections[Collection]]: EntityResultName extends keyof Entities
? Entities[EntityResultName] extends Entity<
infer A,
infer F,
infer C,
infer S
>
? keyof Parameters<
Entities[EntityResultName]["query"][Collection extends keyof IsolatedEntityCollections<
A,
F,
C,
S
>
? IsolatedEntityCollections<A, F, C, S>[Collection]
: never]
>[0]
: never
: never;
}[Collections[Collection]];
};
export type CollectionIndexAttributes<
Entities extends { [name: string]: Entity<any, any, any, any> },
Collections extends CollectionAssociations<Entities>,
> = {
[Collection in keyof CollectionIndexKeys<Entities, Collections>]: {
[key in CollectionIndexKeys<
Entities,
Collections
>[Collection]]: key extends keyof AllEntityAttributes<Entities>
? AllEntityAttributes<Entities>[key]
: never;
};
};
export type ClusteredCollectionIndexAttributes<
Entities extends { [name: string]: Entity<any, any, any, any> },
Collections extends ClusteredCollectionAssociations<Entities>,
> = {
[Collection in keyof ClusteredCollectionIndexKeys<Entities, Collections>]: {
[Key in ClusteredCollectionIndexKeys<
Entities,
Collections
>[Collection]]: Key extends keyof AllEntityAttributes<Entities>
? AllEntityAttributes<Entities>[Key]
: never;
};
};
export type IsolatedCollectionIndexAttributes<
Entities extends { [name: string]: Entity<any, any, any, any> },
Collections extends IsolatedCollectionAssociations<Entities>,
> = {
[Collection in keyof IsolatedCollectionIndexKeys<Entities, Collections>]: {
[Key in IsolatedCollectionIndexKeys<
Entities,
Collections
>[Collection]]: Key extends keyof AllEntityAttributes<Entities>
? AllEntityAttributes<Entities>[Key]
: never;
};
};
export type CollectionPageAttributes<
Entities extends { [name: string]: Entity<any, any, any, any> },
Collections extends CollectionAssociations<Entities>,
> = {
[Collection in keyof CollectionPageKeys<Entities, Collections>]: {
[key in CollectionPageKeys<
Entities,
Collections
>[Collection]]: key extends keyof AllEntityAttributes<Entities>
? AllEntityAttributes<Entities>[key]
: never;
};
};
export type ClusteredCollectionPageAttributes<
Entities extends { [name: string]: Entity<any, any, any, any> },
Collections extends ClusteredCollectionAssociations<Entities>,
> = {
[Collection in keyof ClusteredCollectionPageKeys<Entities, Collections>]: {
[key in ClusteredCollectionPageKeys<
Entities,
Collections
>[Collection]]: key extends keyof AllEntityAttributes<Entities>
? AllEntityAttributes<Entities>[key]
: never;
};
};
export type IsolatedCollectionPageAttributes<
Entities extends { [name: string]: Entity<any, any, any, any> },
Collections extends IsolatedCollectionAssociations<Entities>,
> = {
[Collection in keyof IsolatedCollectionPageKeys<Entities, Collections>]: {
[key in IsolatedCollectionPageKeys<
Entities,
Collections
>[Collection]]: key extends keyof AllEntityAttributes<Entities>
? AllEntityAttributes<Entities>[key]
: never;
};
};
export type OptionalPropertyNames<T> = {
[K in keyof T]: undefined extends T[K] ? K : never;
}[keyof T];
// Common properties from L and R with undefined in R[K] replaced by type in L[K]
export type SpreadProperties<L, R, K extends keyof L & keyof R> = {
[P in K]: L[P] | Exclude<R[P], undefined>;
};
export type Id<T> = { [K in keyof T]: T[K] }; // see note at bottom*
// Type of { ...L, ...R }
export type Spread<L, R> = Id<
// Properties in L that don't exist in R
Pick<L, Exclude<keyof L, keyof R>> &
// Properties in R with types that exclude undefined
Pick<R, Exclude<keyof R, OptionalPropertyNames<R>>> &
// Properties in R, with types that include undefined, that don't exist in L
Pick<R, Exclude<OptionalPropertyNames<R>, keyof L>> &
// Properties in R, with types that include undefined, that exist in L
SpreadProperties<L, R, OptionalPropertyNames<R> & keyof L>
>;
export type RequiredProperties<T> = Pick<
T,
{ [K in keyof T]-?: {} extends Pick<T, K> ? never : K }[keyof T]
>;
export type CollectionQueries<
E extends { [name: string]: Entity<any, any, any, any> },
Collections extends CollectionAssociations<E>,
> = {
[Collection in keyof Collections]: {
[EntityName in keyof E]: EntityName extends Collections[Collection]
? (
params: RequiredProperties<
Parameters<
E[EntityName]["query"][E[EntityName] extends Entity<
infer A,
infer F,
infer C,
infer S
>
? Collection extends keyof EntityCollections<A, F, C, S>
? EntityCollections<A, F, C, S>[Collection]
: never
: never]
>[0]
>,
) => {
go: ServiceQueryRecordsGo<{
[EntityResultName in Collections[Collection]]: EntityResultName extends keyof E
? E[EntityResultName] extends Entity<
infer A,
infer F,
infer C,
infer S
>
? ResponseItem<A, F, C, S>[]
: never
: never;
}>;
params: ParamRecord;
where: {
[EntityResultName in Collections[Collection]]: EntityResultName extends keyof E
? E[EntityResultName] extends Entity<
infer A,
infer F,
infer C,
infer S
>
? Pick<
AllEntityAttributes<E>,
Extract<
AllEntityAttributeNames<E>,
CollectionAttributes<E, Collections>[Collection]
>
> extends Partial<AllEntityAttributes<E>>
? CollectionWhereClause<
E,
A,
F,
C,
S,
Pick<
AllEntityAttributes<E>,
Extract<
AllEntityAttributeNames<E>,
CollectionAttributes<E, Collections>[Collection]
>
>,
ServiceWhereRecordsActionOptions<
E,
A,
F,
C,
S,
Pick<
AllEntityAttributes<E>,
Extract<
AllEntityAttributeNames<E>,
CollectionAttributes<E, Collections>[Collection]
>
>,
{
[EntityResultName in Collections[Collection]]: EntityResultName extends keyof E
? E[EntityResultName] extends Entity<
infer A,
infer F,
infer C,
infer S
>
? ResponseItem<A, F, C, S>[]
: never
: never;
},
Partial<
Spread<
Collection extends keyof CollectionPageAttributes<
E,
Collections
>
? CollectionPageAttributes<
E,
Collections
>[Collection]
: {},
Collection extends keyof CollectionIndexAttributes<
E,
Collections
>
? CollectionIndexAttributes<
E,
Collections
>[Collection]
: {}
>
>
>
>
: never
: never
: never;
}[Collections[Collection]];
}
: never;
}[keyof E];
};
type ClusteredCollectionOperations<
E extends { [name: string]: Entity<any, any, any, any> },
Collections extends ClusteredCollectionAssociations<E>,
Collection extends keyof Collections,
EntityName extends keyof E,
> = EntityName extends Collections[Collection]
? {
go: ServiceQueryRecordsGo<{
[EntityResultName in Collections[Collection]]: EntityResultName extends keyof E
? E[EntityResultName] extends Entity<
infer A,
infer F,
infer C,
infer S
>
? ResponseItem<A, F, C, S>[]
: never
: never;
}>;
params: ParamRecord;
where: {
[EntityResultName in Collections[Collection]]: EntityResultName extends keyof E
? E[EntityResultName] extends Entity<
infer A,
infer F,
infer C,
infer S
>
? Pick<
AllEntityAttributes<E>,
Extract<
AllEntityAttributeNames<E>,
ClusteredCollectionAttributes<E, Collections>[Collection]
>
> extends Partial<AllEntityAttributes<E>>
? CollectionWhereClause<
E,
A,
F,
C,
S,
Pick<
AllEntityAttributes<E>,
Extract<
AllEntityAttributeNames<E>,
ClusteredCollectionAttributes<E, Collections>[Collection]
>
>,
ServiceWhereRecordsActionOptions<
E,
A,
F,
C,
S,
Pick<
AllEntityAttributes<E>,
Extract<
AllEntityAttributeNames<E>,
ClusteredCollectionAttributes<
E,
Collections
>[Collection]
>
>,
{
[EntityResultName in Collections[Collection]]: EntityResultName extends keyof E
? E[EntityResultName] extends Entity<
infer A,
infer F,
infer C,
infer S
>
? ResponseItem<A, F, C, S>[]
: never
: never;
},
Partial<
Spread<
Collection extends keyof ClusteredCollectionPageAttributes<
E,
Collections
>
? ClusteredCollectionPageAttributes<
E,
Collections
>[Collection]
: {},
Collection extends keyof ClusteredCollectionIndexAttributes<
E,
Collections
>
? ClusteredCollectionIndexAttributes<
E,
Collections
>[Collection]
: {}
>
>
>
>
: never
: never
: never;
}[Collections[Collection]];
}
: never;
type ClusteredCompositeAttributes<
E extends { [name: string]: Entity<any, any, any, any> },
Collections extends ClusteredCollectionAssociations<E>,
Collection extends keyof Collections,
EntityName extends keyof E,
> = EntityName extends Collections[Collection]
? Parameters<
E[EntityName]["query"][E[EntityName] extends Entity<
infer A,
infer F,
infer C,
infer S
>
? Collection extends keyof ClusteredEntityCollections<A, F, C, S>
? ClusteredEntityCollections<A, F, C, S>[Collection]
: never
: never]
>[0]
: never;
type ClusteredCollectionQueryOperations<Param, Result> = {
between(
skCompositeAttributesStart: Param,
skCompositeAttributesEnd: Param,
): Result;
gt(skCompositeAttributes: Param): Result;
gte(skCompositeAttributes: Param): Result;
lt(skCompositeAttributes: Param): Result;
lte(skCompositeAttributes: Param): Result;
begins(skCompositeAttributes: Param): Result;
};
type OptionalPropertyOf<T extends object> = Exclude<
{
[K in keyof T]: T extends Record<K, T[K]> ? never : K;
}[keyof T],
undefined
>;
type ClusteredCollectionQueryParams<
E extends { [name: string]: Entity<any, any, any, any> },
Collections extends ClusteredCollectionAssociations<E>,
> = {
[Collection in keyof Collections as Collections[Collection] extends keyof E
? Collection
: never]: {
[EntityName in keyof E]: EntityName extends Collections[Collection]
? ClusteredCompositeAttributes<E, Collections, Collection, EntityName>
: never;
}[keyof E];
};
export type ClusteredCollectionQueries<
E extends { [name: string]: Entity<any, any, any, any> },
Collections extends ClusteredCollectionAssociations<E>,
> = {
[Collection in keyof Collections as Collections[Collection] extends keyof E
? Collection
: never]: {
[EntityName in keyof E]: EntityName extends Collections[Collection]
? (
params: ClusteredCompositeAttributes<
E,
Collections,
Collection,
EntityName
>,
) => ClusteredCollectionOperations<
E,
Collections,
Collection,
EntityName
> &
ClusteredCollectionQueryOperations<
Pick<
ClusteredCompositeAttributes<
E,
Collections,
Collection,
EntityName
>,
OptionalPropertyOf<
ClusteredCompositeAttributes<
E,
Collections,
Collection,
EntityName
>
>
>,
ClusteredCollectionOperations<
E,
Collections,
Collection,
EntityName
>
>
: never;
}[keyof E];
};
export type IsolatedCollectionQueries<
E extends { [name: string]: Entity<any, any, any, any> },
Collections extends IsolatedCollectionAssociations<E>,
> = {
[Collection in keyof Collections]: {
[EntityName in keyof E]: EntityName extends Collections[Collection]
? (
params: RequiredProperties<
Parameters<
E[EntityName]["query"][E[EntityName] extends Entity<
infer A,
infer F,
infer C,
infer S
>
? Collection extends keyof IsolatedEntityCollections<A, F, C, S>
? IsolatedEntityCollections<A, F, C, S>[Collection]
: never
: never]
>[0]
>,
) => {
go: ServiceQueryRecordsGo<{
[EntityResultName in Collections[Collection]]: EntityResultName extends keyof E
? E[EntityResultName] extends Entity<
infer A,
infer F,
infer C,
infer S
>
? ResponseItem<A, F, C, S>[]
: never
: never;
}>;
params: ParamRecord;
where: {
[EntityResultName in Collections[Collection]]: EntityResultName extends keyof E
? E[EntityResultName] extends Entity<
infer A,
infer F,
infer C,
infer S
>
? Pick<
AllEntityAttributes<E>,
Extract<
AllEntityAttributeNames<E>,
IsolatedCollectionAttributes<E, Collections>[Collection]
>
> extends Partial<AllEntityAttributes<E>>
? CollectionWhereClause<
E,
A,
F,
C,
S,
Pick<
AllEntityAttributes<E>,
Extract<
AllEntityAttributeNames<E>,
IsolatedCollectionAttributes<
E,
Collections
>[Collection]
>
>,
ServiceWhereRecordsActionOptions<
E,
A,
F,
C,
S,
Pick<
AllEntityAttributes<E>,
Extract<
AllEntityAttributeNames<E>,
IsolatedCollectionAttributes<
E,
Collections
>[Collection]
>
>,
{
[EntityResultName in Collections[Collection]]: EntityResultName extends keyof E
? E[EntityResultName] extends Entity<
infer A,
infer F,
infer C,
infer S
>
? ResponseItem<A, F, C, S>[]
: never
: never;
},
Partial<
Spread<
Collection extends keyof IsolatedCollectionPageAttributes<
E,
Collections
>
? IsolatedCollectionPageAttributes<
E,
Collections
>[Collection]
: {},
Collection extends keyof IsolatedCollectionIndexAttributes<
E,
Collections
>
? IsolatedCollectionIndexAttributes<
E,
Collections
>[Collection]
: {}
>
>
>
>
: never
: never
: never;
}[Collections[Collection]];
}
: never;
}[keyof E];
};
export type ElectroDBMethodTypes =
| "put"
| "get"
| "query"
| "scan"
| "update"
| "delete"
| "remove"
| "patch"
| "create"
| "batchGet"
| "batchWrite";
export interface ElectroQueryEvent<P extends any = any> {
type: "query";
method: ElectroDBMethodTypes;
config: any;
params: P;
}
export interface ElectroResultsEvent<R extends any = any> {
type: "results";
method: ElectroDBMethodTypes;
config: any;
results: R;
success: boolean;
}
export type ElectroEvent = ElectroQueryEvent | ElectroResultsEvent;
export type ElectroEventType = Pick<ElectroEvent, "type">;
export type ElectroEventListener = (event: ElectroEvent) => void;
// todo: coming soon, more events!
// | {
// name: "error";
// type: "configuration_error" | "invalid_query" | "dynamodb_client";
// message: string;
// details: ElectroError;
// } | {
// name: "error";
// type: "user_defined";
// message: string;
// details: ElectroValidationError;
// } | {
// name: "warn";
// type: "deprecation_warning" | "optimization_suggestion";
// message: string;
// details: any;
// } | {
// name: "info";
// type: "client_updated" | "table_overwritten";
// message: string;
// details: any;
// };
export type EntityIdentifiers<E extends Entity<any, any, any, any>> =
E extends Entity<infer A, infer F, infer C, infer S>
? AllTableIndexCompositeAttributes<A, F, C, S>
: never;
export type EntityItem<E extends Entity<any, any, any, any>> = E extends Entity<
infer A,
infer F,
infer C,
infer S
>
? ResponseItem<A, F, C, S>
: never;
export type CreateEntityItem<E extends Entity<any, any, any, any>> =
E extends Entity<infer A, infer F, infer C, infer S>
? PutItem<A, F, C, S>
: never;
export type BatchWriteEntityItem<E extends Entity<any, any, any, any>> =
E extends Entity<infer A, infer F, infer C, infer S>
? PutItem<A, F, C, S>[]
: never;
export type BatchGetEntityItem<E extends Entity<any, any, any, any>> =
E extends Entity<infer A, infer F, infer C, infer S>
? ResponseItem<A, F, C, S>[]
: never;
export type UpdateEntityResponseItem<E extends Entity<any, any, any, any>> =
E extends Entity<infer A, infer F, infer C, infer S>
? AllTableIndexCompositeAttributes<A, F, C, S>
: never;
export type UpdateEntityItem<E extends Entity<any, any, any, any>> =
E extends Entity<infer A, infer F, infer C, infer S>
? SetItem<A, F, C, S>
: never;
export type UpdateAddEntityItem<E extends Entity<any, any, any, any>> =
E extends Entity<infer A, infer F, infer C, infer S>
? AddItem<A, F, C, S>
: never;
export type UpdateSubtractEntityItem<E extends Entity<any, any, any, any>> =
E extends Entity<infer A, infer F, infer C, infer S>
? SubtractItem<A, F, C, S>
: never;
export type UpdateAppendEntityItem<E extends Entity<any, any, any, any>> =
E extends Entity<infer A, infer F, infer C, infer S>
? AppendItem<A, F, C, S>
: never;
export type UpdateRemoveEntityItem<E extends Entity<any, any, any, any>> =
E extends Entity<infer A, infer F, infer C, infer S>
? RemoveItem<A, F, C, S>
: never;
export type UpdateDeleteEntityItem<E extends Entity<any, any, any, any>> =
E extends Entity<infer A, infer F, infer C, infer S>
? DeleteItem<A, F, C, S>
: never;
export type EntityRecord<E extends Entity<any, any, any, any>> =
E extends Entity<infer A, infer F, infer C, infer S>
? Item<A, F, C, S, S["attributes"]>
: never;
export type CollectionItem<
SERVICE extends Service<any>,
COLLECTION extends keyof SERVICE["collections"],
> = SERVICE extends Service<infer E>
? Pick<
{
[EntityName in keyof E]: E[EntityName] extends Entity<
infer A,
infer F,
infer C,
infer S
>
? COLLECTION extends keyof CollectionAssociations<E>
? EntityName extends CollectionAssociations<E>[COLLECTION]
? ResponseItem<A, F, C, S>[]
: never
: never
: never;
},
COLLECTION extends keyof CollectionAssociations<E>
? CollectionAssociations<E>[COLLECTION]
: never
>
: never;
export type QueryResponse<E extends Entity<any, any, any, any>> = {
data: EntityItem<E>[];
cursor: string | null;
};
export type CreateEntityResponse<E extends Entity<any, any, any, any>> = {
data: CreateEntityItem<E>;
};
export type BatchWriteResponse<E extends Entity<any, any, any, any>> =
E extends Entity<infer A, infer F, infer C, infer S>
? {
unprocessed: AllTableIndexCompositeAttributes<A, F, C, S>[];
}
: never;
export type BatchGetResponse<E extends Entity<any, any, any, any>> =
E extends Entity<infer A, infer F, infer C, infer S>
? {
data: EntityItem<E>[];
unprocessed: AllTableIndexCompositeAttributes<A, F, C, S>[];
}
: never;
export type UpdateEntityResponse<E extends Entity<any, any, any, any>> = {
data: UpdateEntityResponseItem<E>;
};
export type UpdateAddEntityResponse<E extends Entity<any, any, any, any>> = {
data: UpdateAddEntityItem<E>;
};
export type UpdateSubtractEntityResponse<E extends Entity<any, any, any, any>> =
{
data: UpdateSubtractEntityItem<E>;
};
export type UpdateAppendEntityResponse<E extends Entity<any, any, any, any>> = {
data: UpdateAppendEntityItem<E>;
};
export type UpdateRemoveEntityResponse<E extends Entity<any, any, any, any>> = {
data: UpdateRemoveEntityItem<E>;
};
export type UpdateDeleteEntityResponse<E extends Entity<any, any, any, any>> = {
data: UpdateDeleteEntityItem<E>;
};
export type CollectionResponse<
SERVICE extends Service<any>,
COLLECTION extends keyof SERVICE["collections"],
> = {
data: CollectionItem<SERVICE, COLLECTION>;
cursor: string | null;
};
export interface QueryBranches<
A extends string,
F extends string,
C extends string,
S extends Schema<A, F, C>,
ResponseItem,
IndexCompositeAttributes,
> {
go: GoQueryTerminal<A, F, C, S, ResponseItem>;
params: ParamTerminal<A, F, C, S, ResponseItem>;
where: WhereClause<
A,
F,
C,
S,
Item<A, F, C, S, S["attributes"]>,
QueryBranches<A, F, C, S, ResponseItem, IndexCompositeAttributes>
>;
}
export interface RecordsActionOptions<
A extends string,
F extends string,
C extends string,
S extends Schema<A, F, C>,
Items,
IndexCompositeAttributes,
> {
go: QueryRecordsGo<Items>;
params: ParamRecord;
where: WhereClause<
A,
F,
C,
S,
Item<A, F, C, S, S["attributes"]>,
RecordsActionOptions<A, F, C, S, Items, IndexCompositeAttributes>
>;
}
export type TransactionItemCode =
| "None"
| "ConditionalCheckFailed"
| "ItemCollectionSizeLimitExceeded"
| "TransactionConflict"
| "ProvisionedThroughputExceeded"
| "ThrottlingError"
| "ValidationError";
export type TransactionItem<T> = {
item: null | T;
rejected: boolean;
code: TransactionItemCode;
message?: string | undefined;
};
type CommittedTransactionResult<T, Params> = Params & {
[TransactionSymbol]: T;
};
export interface SingleRecordOperationOptions<
A extends string,
F extends string,
C extends string,
S extends Schema<A, F, C>,
ResponseType,
> {
go: GoGetTerminal<A, F, C, S, ResponseType>;
params: ParamTerminal<A, F, C, S, ResponseType>;
where: WhereClause<
A,
F,
C,
S,
Item<A, F, C, S, S["attributes"]>,
SingleRecordOperationOptions<A, F, C, S, ResponseType>
>;
}
type GoGetTerminalTransaction<
A extends string,
F extends string,
C extends string,
S extends Schema<A, F, C>,
ResponseItem,
Params,
> = <Options extends TransactGetQueryOptions<keyof ResponseItem>>(
options?: Options,
) => Options extends GoQueryTerminalOptions<infer Attr>
? CommittedTransactionResult<
{
[Name in keyof ResponseItem as Name extends Attr
? Name
: never]: ResponseItem[Name];
},
Params
>
: CommittedTransactionResult<ResponseItem, Params>;
type GoSingleTerminalTransaction<
A extends string,
F extends string,
C extends string,
S extends Schema<A, F, C>,
ResponseItem,
Params,
> = <Options extends TransactWriteQueryOptions>(
options?: Options,
) => CommittedTransactionResult<ResponseItem, Params>;
export interface SingleRecordOperationOptionsTransaction<
A extends string,
F extends string,
C extends string,
S extends Schema<A, F, C>,
ResponseType,
Params,
> {
commit: GoSingleTerminalTransaction<A, F, C, S, ResponseType, Params>;
where: WhereClause<
A,
F,
C,
S,
Item<A, F, C, S, S["attributes"]>,
SingleRecordOperationOptionsTransaction<A, F, C, S, ResponseType, Params>
>;
}
export interface GetOperationOptionsTransaction<
A extends string,
F extends string,
C extends string,
S extends Schema<A, F, C>,
ResponseType,
Params,
> {
commit: GoGetTerminalTransaction<A, F, C, S, ResponseType, Params>;
}
export type DeleteRecordOperationGoTransaction<
ResponseType,
Options = TransactWriteQueryOptions,
> = <T = ResponseType>(
options?: Options,
) => CommittedTransactionResult<T, TransactWriteItem>;
export interface DeleteRecordOperationOptionsTransaction<
A extends string,
F extends string,
C extends string,
S extends Schema<A, F, C>,
ResponseType,
> {
commit: DeleteRecordOperationGoTransaction<
ResponseType,
TransactWriteQueryOptions
>;
where: WhereClause<
A,
F,
C,
S,
Item<A, F, C, S, S["attributes"]>,
DeleteRecordOperationOptionsTransaction<A, F, C, S, ResponseType>
>;
}
export type PutRecordGoTransaction<
ResponseType,
Options = TransactWriteQueryOptions,
> = <T = ResponseType>(
options?: Options,
) => CommittedTransactionResult<T, TransactWriteItem>;
export interface PutRecordOperationOptionsTransaction<
A extends string,
F extends string,
C extends string,
S extends Schema<A, F, C>,
ResponseType,
> {
commit: PutRecordGoTransaction<ResponseType, TransactWriteQueryOptions>;
where: WhereClause<
A,
F,
C,
S,
Item<A, F, C, S, S["attributes"]>,
PutRecordOperationOptionsTransaction<A, F, C, S, ResponseType>
>;
}
export type UpdateRecordGoTransaction<ResponseType> = <
T = ResponseType,
Options extends TransactWriteQueryOptions = TransactWriteQueryOptions,
>(
options?: Options,
) => CommittedTransactionResult<Partial<T>, TransactWriteItem>;
export interface SetRecordActionOptionsTransaction<
A extends string,
F extends string,
C extends string,
S extends Schema<A, F, C>,
SetAttr,
IndexCompositeAttributes,
TableItem,
> {
commit: UpdateRecordGoTransaction<TableItem>;
params: ParamRecord<UpdateQueryParams>;
set: SetRecordTransaction<
A,
F,
C,
S,
SetItem<A, F, C, S>,
IndexCompositeAttributes,
TableItem
>;
remove: RemoveRecordTransaction<
A,
F,
C,
S,
Array<keyof SetItem<A, F, C, S>>,
IndexCompositeAttributes,
TableItem
>;
add: SetRecordTransaction<
A,
F,
C,
S,
AddItem<A, F, C, S>,
IndexCompositeAttributes,
TableItem
>;
subtract: SetRecordTransaction<
A,
F,
C,
S,
SubtractItem<A, F, C, S>,
IndexCompositeAttributes,
TableItem
>;
append: SetRecordTransaction<
A,
F,
C,
S,
AppendItem<A, F, C, S>,
IndexCompositeAttributes,
TableItem
>;
delete: SetRecordTransaction<
A,
F,
C,
S,
DeleteItem<A, F, C, S>,
IndexCompositeAttributes,
TableItem
>;
data: DataUpdateMethodRecordTransaction<
A,
F,
C,
S,
Item<A, F, C, S, S["attributes"]>,
IndexCompositeAttributes,
TableItem
>;
composite: UpdateComposite<
A,
F,
C,
S,
SetRecordActionOptionsTransaction<
A,
F,
C,
S,
SetAttr,
IndexCompositeAttributes,
TableItem
>
>;
where: WhereClause<
A,
F,
C,
S,
Item<A, F, C, S, S["attributes"]>,
SetRecordActionOptionsTransaction<
A,
F,
C,
S,
SetAttr,
IndexCompositeAttributes,
TableItem
>
>;
}
export type RemoveRecordTransaction<
A extends string,
F extends string,
C extends string,
S extends Schema<A, F, C>,
RemoveAttr,
IndexCompositeAttributes,
TableItem,
> = (
properties: RemoveAttr,
) => SetRecordActionOptionsTransaction<
A,
F,
C,
S,
RemoveAttr,
IndexCompositeAttributes,
TableItem
>;
export type SetRecordTransaction<
A extends string,
F extends string,
C extends string,
S extends Schema<A, F, C>,
SetAttr,
IndexCompositeAttributes,
TableItem,
> = (
properties: SetAttr,
) => SetRecordActionOptionsTransaction<
A,
F,
C,
S,
SetAttr,
IndexCompositeAttributes,
TableItem
>;
export type DataUpdateMethodRecordTransaction<
A extends string,
F extends string,
C extends string,
S extends Schema<A, F, C>,
SetAttr,
IndexCompositeAttributes,
TableItem,
> = DataUpdateMethod<
A,
F,
C,
S,
UpdateData<A, F, C, S>,
SetRecordActionOptionsTransaction<
A,
F,
C,
S,
SetAttr,
IndexCompositeAttributes,
TableItem
>
>;
export interface BatchGetRecordOperationOptions<
A extends string,
F extends string,
C extends string,
S extends Schema<A, F, C>,
ResponseType,
> {
go: GoBatchGetTerminal<A, F, C, S, ResponseType>;
params: ParamTerminal<A, F, C, S, ResponseType>;
}
export interface PutRecordOperationOptions<
A extends string,
F extends string,
C extends string,
S extends Schema<A, F, C>,
ResponseType,
> {
go: PutRecordGo<ResponseType>;
params: ParamRecord<PutQueryOptions>;
where: WhereClause<
A,
F,
C,
S,
Item<A, F, C, S, S["attributes"]>,
PutRecordOperationOptions<A, F, C, S, ResponseType>
>;
}
type RequiredKeys<T> = Exclude<
{ [K in keyof T]-?: {} extends Pick<T, K> ? never : K }[keyof T],
symbol
>;
type OverlappingProperties<T1, T2> = {
[Key in keyof T1 as Key extends keyof T2 ? Key : never]: Key extends keyof T2
? T2[Key]
: never;
};
type NonOverlappingProperties<T1, T2> = {
[Key in keyof T1 as Key extends keyof T2 ? never : Key]: T1[Key];
};
export type UpsertRecordOperationOptionsTransaction<
A extends string,
F extends string,
C extends string,
S extends Schema<A, F, C>,
ResponseType,
FullExpectedItem,
RemainingExpectedItem,
ProvidedItem,
> =
[RequiredKeys<RemainingExpectedItem>] extends [never]
? {
commit: PutRecordGoTransaction<ResponseType, TransactWriteQueryOptions>;
where: WhereClause<
A,
F,
C,
S,
Item<A, F, C, S, S["attributes"]>,
UpsertRecordOperationOptionsTransaction<
A,
F,
C,
S,
ResponseType,
FullExpectedItem,
RemainingExpectedItem,
ProvidedItem
>
>;
set: <
ReceivedItem extends Partial<
OverlappingProperties<RemainingExpectedItem, PutItem<A, F, C, S>>
>,
>(
item: ReceivedItem,
) => UpsertRecordOperationOptionsTransaction<
A,
F,
C,
S,
ResponseType,
FullExpectedItem,
NonOverlappingProperties<RemainingExpectedItem, ReceivedItem>,
NonOverlappingProperties<ProvidedItem, ReceivedItem>
>;
ifNotExists: <
ReceivedItem extends Partial<
OverlappingProperties<RemainingExpectedItem, PutItem<A, F, C, S>>
>,
>(
item: ReceivedItem,
) => UpsertRecordOperationOptionsTransaction<
A,
F,
C,
S,
ResponseType,
FullExpectedItem,
NonOverlappingProperties<RemainingExpectedItem, ReceivedItem>,
NonOverlappingProperties<ProvidedItem, ReceivedItem>
>;
add: <
ReceivedItem extends Partial<
OverlappingProperties<RemainingExpectedItem, AddItem<A, F, C, S>>
>,
>(
item: ReceivedItem,
) => UpsertRecordOperationOptionsTransaction<
A,
F,
C,
S,
ResponseType,
FullExpectedItem,
NonOverlappingProperties<RemainingExpectedItem, ReceivedItem>,
NonOverlappingProperties<ProvidedItem, ReceivedItem>
>;
subtract: <
ReceivedItem extends Partial<
OverlappingProperties<
RemainingExpectedItem,
SubtractItem<A, F, C, S>
>
>,
>(
item: ReceivedItem,
) => UpsertRecordOperationOptionsTransaction<
A,
F,
C,
S,
ResponseType,
FullExpectedItem,
NonOverlappingProperties<RemainingExpectedItem, ReceivedItem>,
NonOverlappingProperties<ProvidedItem, ReceivedItem>
>;
append: <
ReceivedItem extends Partial<
OverlappingProperties<RemainingExpectedItem, AppendItem<A, F, C, S>>
>,
>(
item: ReceivedItem,
) => UpsertRecordOperationOptionsTransaction<
A,
F,
C,
S,
ResponseType,
FullExpectedItem,
NonOverlappingProperties<RemainingExpectedItem, ReceivedItem>,
NonOverlappingProperties<ProvidedItem, ReceivedItem>
>;
}
: {
// these are strings to give context to the user this is a builder pattern
commit:
| `Missing required attributes to perform upsert`
| `Required: ${RequiredKeys<RemainingExpectedItem>}`;
where: WhereC