type Diff < T extends string | number | symbol , U extends string | number | symbol > = ( { [ P in T ] : P ; } & { [ P in U ] : never ; } & { [ x ] : never ; } ) [ T ] ; type RecordProps < R > = Pick < R , Diff < keyof R , keyof TableRecord > > ; type PropValueTypes < R extends Record < K , any > , K extends string | number | symbol > = { [ P in K ] : R [ K ] extends { value : infer ValueType ; } ? ValueType : never ; } ; export type FieldType = "ATTR" | "MODIFIED" | "PK" ; export type ValueType < R > = ( R extends { value : infer ValueType ; } ? ValueType : never ) & ( Partial < PropValueTypes < R , keyof RecordProps < R > > > ) ; export type Values < R > = ValueType < R > | ValueType < R > [ ] ; export type PartialValue < R > = Partial < ValueType < R > > ; export type PartialValues < R > = PartialValue < R > | ( PartialValue < R > [ ] ) ; export type PkType = string | number ; export interface RecordEntity { id : string ; } export type Reducer = ( session : any , action : any , arg ? : any ) => void ; export type PkGenerator = ( record : any , schema : TableSchema ) => string | undefined ; export type RecordNormalizer = ( record : any , context : NormalizeContext ) => any ; export type RecordComparer = ( a : any , b : any , schema : TableSchema ) => boolean ; export type RecordMerger = ( a : any , b : any , schema : TableSchema ) => any ; export interface MapOf < T > { [ key ] : T ; } export interface ForeignKey { name : string ; value : string ; references : string ; refTable : TableSchema ; unique : boolean ; notNull : boolean ; } export interface TableSchema { db : DatabaseSchema ; name : string ; fields : FieldSchema [ ] ; relations : FieldSchema [ ] ; primaryKeys : FieldSchema [ ] ; connect ( schemas ) : void ; composePrimaryKey ( parts ) : string ; ensurePrimaryKey ( record ) : string ; getPrimaryKey ( record ) : string | undefined ; getForeignKeys ( record ) : ForeignKey [ ] ; isModified ( recordA , recordB ) : boolean ; inferRelations ( data , rel , ownerId ) : any [ ] ; injectKeys ( data , record ) : void ; normalize ( data , context ) : string [ ] ; mergeRecord ( oldRecord , newRecord ) : any ; } export interface FieldSchema { table : TableSchema ; refTable ? : TableSchema ; name : string ; propName : string ; references ? : string ; relationName ? : string ; cascade ? : boolean ; unique ? : boolean ; isPrimaryKey : boolean ; isForeignKey : boolean ; isStamp : boolean ; notNull : boolean ; order : number ; connect ( schemas ) : void ; getValue ( data , record ? ) : any ; getRecordValue ( record ) : any ; } export interface template R export interface Table < R extends TableRecord = TableRecord > { session : Session ; schema : TableSchema ; state : TableState ; db : DatabaseSchema ; dirty : boolean ; param { ( string | number ) } id returns { R } memberof get ( id ) : R ; param { ( string | number ) } id returns { ( R | undefined ) } memberof getOrDefault ( id ) : R | undefined ; param { ( string | number ) } id returns { ( ValueType < R > | undefined ) } memberof getValue ( id ) : ValueType < R > | undefined ; param { ( string | number ) } id returns { { } } memberof getMetadata ( id ) : { } ; param { ( string | number ) } id param { { } } metadata memberof setMetadata ( id , metadata ) : void ; param { string } schemaName param { string } fkId returns { string [ ] } memberof getIndex ( schemaName , fkId ) : string [ ] ; returns { R [ ] } memberof all ( ) : R [ ] ; returns { ValueType < R > [ ] } memberof values ( ) : ValueType < R > [ ] ; param { ( string | number ) } id returns { boolean } memberof exists ( id ) : boolean ; param { Values < R > } data param { * } argument returns { string [ ] } memberof insert ( data , argument ? ) : string [ ] ; param { PartialValues < R > } data param { * } argument returns { string [ ] } memberof update ( data , argument ? ) : string [ ] ; param { PartialValues < R > } data param { * } argument returns { string [ ] } memberof upsert ( data , argument ? ) : string [ ] ; param { ( string | number | PartialValue < R > | ( string | number | PartialValue < R > ) [ ] ) } data returns { number } memberof delete ( data ) : number ; memberof deleteAll ( ) : void ; param { TableState < ValueType < R > > } table memberof upsertNormalized ( table ) : void ; param { PartialValues < R > } data param { NormalizeOptions } options returns { NormalizeContext } memberof normalize ( data , options ? ) : NormalizeContext ; } export interface template T export interface TableRecord < T = any > { type { string } memberof id : string ; type { Table } memberof table : Table ; type { T } memberof value : T ; type { any } memberof metadata : any ; param { { } } props memberof setMetadata ( props ) : void ; param { Partial < T > } data returns { this } memberof update ( data ) : this ; memberof delete ( ) : void ; } export interface TableRecordField { name : string ; value : any ; } export interface TableRecordSet < R extends TableRecord = TableRecord > { ids : string [ ] ; length : number ; all ( ) : R [ ] ; values ( ) : ValueType < R > [ ] ; add ( data ) : string [ ] ; remove ( data ) : number ; update ( data ) : string [ ] ; delete ( ) : void ; } export interface SchemaNormalizer { normalize : ( data : any , context : NormalizeContext ) => string [ ] ; } export interface ModelFactory { newSchemaNormalizer : ( schema : TableSchema ) => SchemaNormalizer ; newSession : ( db : DatabaseSchema , state : DatabaseState , options ? : SessionOptions ) => Session ; newTableSchema : ( db : DatabaseSchema , name : string , schema : TableDefinition ) => TableSchema ; newFieldSchema : ( table : TableSchema , name : string , schema : FieldDefinition ) => FieldSchema ; newTableModel : ( session : Session , schema : TableSchema , state : TableState ) => Table ; newRecordSetModel : ( table : Table , schema : FieldSchema , owner : RecordEntity ) => TableRecordSet ; newRecordFieldModel : ( schema : FieldSchema , record : TableRecord ) => TableRecordField ; } export interface RecordFactory { newRecordModel : ( id : string , table : Table ) => TableRecord ; } /**
 * Defines a database schema
 */ export interface Schema { [ key ] : TableDefinition ; } /**
 * Defines a table schema
 */ export interface TableDefinition { [ key ] : FieldDefinition ; } export interface FieldDefinition { type { FieldType } memberof deprecated type ? : FieldType ; pk ? : boolean ; stamp ? : boolean ; type { string } memberof fieldName ? : string ; propName ? : string ; references ? : string ; relationName ? : string ; cascade ? : boolean ; unique ? : boolean ; notNull ? : boolean ; order ? : number ; value ? : ( record : any , context : ComputeContext < any > ) => any ; } export interface ComputeContext < T > { schema : FieldSchema ; record : TableRecord < T > ; } export interface export interface NormalizeContext { type { Table } memberof table ? : Table ; type { TableSchema } memberof schema : TableSchema ; type { TableSchema } memberof currentSchema : TableSchema ; type { DatabaseSchema } memberof db : DatabaseSchema ; type { boolean } memberof normalizePKs : boolean ; type { MapOf < TableState > } memberof output : MapOf < TableState > ; type { { [ key : string ] : any [ ] } } memberof emits : { [ key ] : any [ ] ; } ; param { string } tableSchemaName param { * } record memberof emit ( tableSchemaName , record ) : void ; } export interface DatabaseSchema { tables : TableSchema [ ] ; options : DatabaseOptions ; factory : ModelFactory & RecordFactory ; keySeparator : string ; getRecordNormalizer : ( schemaName : string ) => RecordNormalizer | undefined ; getPkGenerator : ( schemaName : string ) => PkGenerator | undefined ; getRecordComparer : ( schemaName : string ) => RecordComparer | undefined ; getRecordMerger : ( schemaName : string ) => RecordMerger | undefined ; getMissingPkHandler : ( schemaName : string ) => PkGenerator | undefined ; } export interface DatabaseOptions { onNormalize ? : MapOf < RecordNormalizer > | RecordNormalizer ; onGeneratePK ? : MapOf < PkGenerator > | PkGenerator ; onRecordCompare ? : MapOf < RecordComparer > | RecordComparer ; onRecordMerge ? : MapOf < RecordMerger > | RecordMerger ; onMissingPK ? : MapOf < PkGenerator > | PkGenerator ; cascadeAsDefault ? : boolean ; strict ? : boolean ; keySeparator ? : string ; } export interface DatabaseCreateOptions extends DatabaseOptions { factory ? : Partial < ModelFactory > ; recordModelClass ? : RecordClass ; } export interface SessionOptions { readOnly ? : boolean ; tableSchemas ? : TableSchema [ ] ; } export interface NormalizeOptions { normalizePKs ? : boolean ; argument ? : any ; } export interface NormalizeContextOptions extends NormalizeOptions { table ? : Table ; } export type DatabaseState = MapOf < TableState > ; export type TableMap = MapOf < Table > ; export interface TableState < T = any > { name ? : string ; byId : MapOf < T > ; ids : string [ ] ; indexes : MapOf < TableIndex > ; meta : MapOf < { } > ; } export interface TableIndex { unique : boolean ; values : MapOf < string [ ] > ; } export interface Session < T extends TableMap = TableMap > { db : DatabaseSchema ; state : DatabaseState ; tables : T ; readOnly : boolean ; upsert ( ctx ) : void ; commit ( ) : DatabaseState ; } export interface RecordClass { new ( id , table ) : TableRecord ; } export interface ExtendedRecord extends TableRecord { _fields : { [ key ] : any ; } ; }