UNPKG

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
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