gs-idb-pro
Version:
> A full-featured wrapper for browser IndexedDB
1,119 lines (1,073 loc) • 51.5 kB
TypeScript
import { StrOrNum, IDisposable } from 'gs-base';
import { DbQuery } from 'gs-idb-basic';
interface IDbLtRange {
/**
* 小于该值
*/
lt: IDBValidKey;
}
interface IDbGtRange {
/**
* 大于该值
*/
gt: IDBValidKey;
}
interface IDbLteRange {
/**
* 小于或等于该值
*/
lte: IDBValidKey;
}
interface IDbGteRange {
/**
* 大于或等于该值
*/
gte: IDBValidKey;
}
interface IDbLtGtRange extends IDbLtRange, IDbGtRange {
}
interface IDbLtGteRange extends IDbLtRange, IDbGteRange {
}
interface IDbLteGtRange extends IDbLteRange, IDbGtRange {
}
interface IDbLteGteRange extends IDbLteRange, IDbGteRange {
}
type IDbRange = IDbLtRange | IDbGtRange | IDbLteRange | IDbGteRange | IDbLtGtRange | IDbLtGteRange | IDbLteGtRange | IDbLteGteRange;
type IDbQuery = IDBValidKey | IDbRange;
interface ICursorOption {
query?: IDbQuery;
/**
* 游标滚动方向,默认为`prev`
*/
direction?: IDBCursorDirection;
/**
* 预先跳过条数
*/
preSkip?: number;
/**
* 从指定的`key`开始, 如果存在`preSkip`会先跳过`preSkip`
* - 当前`store`必须存在其`key`的索引
*/
startKey?: IDBValidKey;
/**
* 从指定的'Key'与`PrimaryKey`开始
* - 使用`startPrimaryKey`时必须同时存在`startKey`
* - 当前`store`必须存在其`key`的索引
*/
startPrimaryKey?: IDBValidKey;
}
interface ICursorRow {
cursor: IDBCursorWithValue;
end: () => void;
}
interface IIndexSchema {
name: string;
keyPath?: string | string[];
unique?: boolean;
multiEntry?: boolean;
}
type IndexSchema = string | IIndexSchema;
/**
* 特殊字段定义
*/
interface ISpecialFieldSchema {
/**
* 为 false 时代表不支持该字段
* 为 true 时代表使用默认值
*/
name: boolean | string;
/**
* 是否在`store`未定义同名索引时,自动创建索引
* 默认值为`true`
*/
isIndexed?: boolean;
}
/**
* 为 false 或 name 为 false 时代表不支持该字段
* 未定义,或为 true 时代表使用默认值
*/
type SpecialFieldSchema = boolean | string | ISpecialFieldSchema;
interface ISpecialFields {
/**
* 添加时间
* 默认值为 `added_at`
* 值为`false` 时代表不创建该字段
*/
addedTimeField?: SpecialFieldSchema;
/**
* 最后修改数据时间
* 默认值为 `updated_at`
* 值为`false` 时代表不创建该字段
*/
updatedTimeField?: SpecialFieldSchema;
/**
* 累计修改次数
* 默认值为 `false`
* 默认字段名为 `updated_count`
*/
updatedCountField?: SpecialFieldSchema;
/**
* 软删除字段
* 默认值为 `false`
* 默认字段名为 `deleted`
*/
softDeletedField?: SpecialFieldSchema;
}
interface IStoreSchemaTemplate extends ISpecialFields {
/**
* 主键包含在数据中的路径
* 未定义时,数据中将不包含主键
*/
keyPath?: string | string[];
autoIncrement?: boolean;
/**
* 索引定义,为字符串时表示索引名称与keyPath
*/
indexSchemas?: IndexSchema[];
}
declare const defaultStoreSchemaTemplate: Readonly<IStoreSchemaTemplate>;
/**
* @template R 在有`mapper`时返回值的类型
* @template V 原始`store`一行数据的类型
*/
type GetRowMapper<R, V> = (item: V, key: IDBValidKey, i: number) => R | Promise<R>;
/**
* @template R 在有`mapper`时返回值的类型
* @template V 原始`store`一行数据的类型
*/
type SaveRowMapper<R, V> = (item: DbRecord<V>) => DbRecord<V> | Promise<DbRecord<V>>;
interface IStoreSchema extends IStoreSchemaTemplate {
name: string;
/**
* 在完成数据库Store定义后执行
* 用于添加默认数据
* 或 用于升级了store结构后对旧数据进行升级
*/
storeDefined?: (store: IStoreUpgradeable) => void | Promise<void>;
/**
* 用于在`store`创建时添加默认数据
* -如果当前`store` 存在 `keyPath` 可以使用任意合法数据
* -如果不存在 `keyPath` 则必须包含 `key` 与 `value` 字段
*/
defaultData?: DbRecord[];
/**
* 用于在数据库升级时,在指定版本范围更新的数据
*/
versionData?: IVersionData[];
/**
* 在调用所有支持`mapper`方法获取数据时的默认映射
*/
defaultGetMapper?: GetRowMapper<any, any>;
/**
* 用于在`store`导出数据时的映射
* - `string[]` 代表要导出的字段
* - 如果不存在`keyPath`,不支持`string[]`
*/
exportMapper?: GetRowMapper<any, any> | string[];
/**
* 在调所有保存数据方法时的默认映射
*/
defaultSaveMapper?: SaveRowMapper<any, any>;
/**
* 用于在调用`store.add()`添加数据时的映射
*/
addMapper?: SaveRowMapper<any, any>;
/**
* 用于在调用`store.replace()`替换数据时的映射
*/
replaceMapper?: SaveRowMapper<any, any>;
/**
* 用于在调用`store.change()`修改数据时的映射
*/
changeMapper?: SaveRowMapper<any, any>;
}
type StoreSchema = string | IStoreSchema;
/**
* 中断循环,并且忽略返回的`value`值
*/
declare const Break: unique symbol;
/**
* 完成循环:结束循环并将当前`value`包含在返回值中
*/
declare const Finished: unique symbol;
/**
* 忽略`value`值,该`value`值将不会包含在返回值中
*/
declare const Continue: unique symbol;
/**
* 跳转到指定的Key,并且忽略返回的`value`值
*/
declare const ContinueKey: unique symbol;
/**
* 跳转到指定的`Key`
*/
declare const NextKey: unique symbol;
/**
* 跳转到指定的`PrimaryKey`,并且忽略返回的value`值
*/
declare const ContinuePrimaryKey: unique symbol;
/**
* 跳转到指定的`PrimaryKey`
*/
declare const NextPrimaryKey: unique symbol;
type VoidControl = typeof Break | typeof ContinueKey | typeof ContinuePrimaryKey | null;
interface IVoidResult {
control?: VoidControl;
key?: IDBValidKey;
primaryKey?: IDBValidKey;
}
type VoidResult = typeof Break | IVoidResult | null | undefined | void;
type ValueControl = VoidControl | typeof Finished | typeof Continue | typeof NextKey | typeof NextPrimaryKey;
interface IValueResult<V = any> {
/**
* 控制循环流程
*/
control?: ValueControl;
value?: V;
key?: IDBValidKey;
primaryKey?: IDBValidKey;
}
type VoidCallFn<Row = any> = (value: Row, key: IDBValidKey, i: number) => VoidResult | Promise<VoidResult>;
type ValueCallFn<Row = any, Rtn = any> = (value: Row, key: IDBValidKey, i: number, results: DbRecordResult<Rtn>[]) => void | IValueResult<Rtn> | Promise<void | IValueResult<Rtn>>;
interface IForEachArg<Row = any> extends ICursorOption {
fn: VoidCallFn<Row>;
}
interface IForEachResultArg<Row = any, Rtn = any> extends ICursorOption {
fn?: ValueCallFn<Row, Rtn>;
/**
* 值为数组时,代表要返回的字段
*/
mapper?: GetRowMapper<Rtn, Row> | string[] | undefined;
}
interface IForEachable<Row = any> {
forEach<Val extends Row = Row>(fn: VoidCallFn<Val> | IForEachArg<Val>): Promise<void>;
forEach<Rtn = DbRecordResult<Row>, Val extends Row = Row>(fn: ValueCallFn<Val, Rtn> | IForEachResultArg<Val, Rtn>, returns: true): Promise<Rtn[]>;
}
interface IInfoTarget {
store: string;
index?: string;
}
type NativeTarget = IDBObjectStore | IDBIndex;
type OperationTarget = NativeTarget | IInfoTarget;
declare function isNativeTarget(target: any): target is IDBObjectStore | IDBIndex;
type IDbIteratorParser<T = any> = (cusor: IDBCursorWithValue) => IValueResult<T> | Promise<IValueResult<T>>;
declare const DbIteratorParsers: Readonly<{
key: ({ primaryKey: value }: IDBCursorWithValue) => {
value: IDBValidKey;
};
value: ({ value }: IDBCursorWithValue) => {
value: any;
};
keyValue: ({ primaryKey: key, value }: IDBCursorWithValue) => {
value: any[];
};
}>;
type DbIteratorParsersKey = keyof typeof DbIteratorParsers;
interface IDbIteratorArg extends ICursorOption {
endsWithNull?: boolean;
}
interface IDbIteratorOption<T> extends Readonly<IDbIteratorArg> {
readonly writable?: boolean;
readonly parser?: DbIteratorParsersKey | IDbIteratorParser<T>;
}
interface IDbIterator<Row = any, Tar extends OperationTarget = OperationTarget> extends IDbIteratorOption<Row>, AsyncIterable<Row> {
}
interface ICursorReader<T> {
iterator(arg?: IDbQuery | IDbIteratorArg): AsyncIterable<T>;
iterator(query: IDbQuery, direction?: IDBCursorDirection): AsyncIterable<T>;
}
/**
* @template R 在有`mapper`时返回值的类型
* @template V 原始`store`一行数据的类型
*/
interface IPageArg<R = any, V = any> extends Omit<IFindMapArg<R, V>, 'preSkip' | 'startKey' | 'startPrimaryKey'> {
/**
* 获取第几页
*/
page?: number;
/**
* 分页大小限制
* - 默认为100
*/
size?: number;
}
interface IPageInfo<R = any, V = any> extends Readonly<Required<IPageArg<R, V>>> {
readonly total: number;
readonly pages: number;
/**
* 下一页需要跳过的行
*/
readonly nextSkip: number;
}
/**
* @template R 在有`mapper`时返回值的类型
* @template V 原始`store`一行数据的类型
*/
interface IPage<R = any, V = any> {
info: IPageInfo<R, V>;
rows: R[];
}
interface IPageableQuery<T> {
page<R = ArrayDbRecord<T>>(): Promise<IPage<R, T>>;
/**
* 获取一页数据
* - 仅当在获取第一页与指定页时调用此方法
* - 如果是获取下一页则应该调用`nextPage(info:IPageInfo)`方法
* @param arg 获取后续页时,请使用上一次的`info`
* @param page 获取第几页,如果存在,将覆盖`arg.page`
*/
page<R = ArrayDbRecord<T>>(arg: IPageArg<R, T> | IPageInfo<R, T>, page?: number): Promise<IPage<R, T>>;
/**
* 获取下一页
* @param info 上一页的`info`字段
*/
nextPage<R = ArrayDbRecord<T>>(info: IPageInfo<R, T>): Promise<IPage<R, T>>;
}
interface IValidDataOperationSchema<T extends OperationTarget> {
storeSchema?: IStoreSchema;
target: T;
}
interface IDbMap<K extends StrOrNum = StrOrNum, V = any, Tar extends OperationTarget = OperationTarget> extends IValidDataOperationSchema<Tar>, IForEachable<V> {
readonly size: Promise<number>;
has(key: K): Promise<boolean>;
get<T extends V = V>(key: K, defaultValue?: T): Promise<T | undefined>;
getMany<T extends V = V>(keys: K[]): Promise<(T | undefined)[]>;
set<T extends V = V>(key: K, value: T): Promise<void>;
setMany<T extends V = V>(values: [K, V][]): Promise<void>;
delete(key: K): Promise<void>;
keys(): AsyncIterable<K>;
values<T extends V = V>(): AsyncIterable<T>;
entries<T extends V = V>(): AsyncIterable<[K, T]>;
/**
* 转换工作目标
* - 如果当前`target`为`store`,则返回`this`
* - 如果当前`target`为`index`,则创建基于其`store`的新实例
*/
asStore(): IDataReader<V, Tar>;
/**
* 转换工作目标
* - 如果当前`target`为`store`,则返回`this`
* - 如果当前`target`为`index`,则创建其`store`的副本
*/
asStore(writable: true): IDataWriter<V, Tar>;
batch<R = any, T extends V = V>(fn: (map: IDbMap<K, T, NativeTarget>) => R | Promise<R>): Promise<R>;
}
interface IGetAllArgs<T> {
query?: IDbQuery | null;
/**
* 最多返回条数,默认值为1000
*/
limit?: number;
}
interface IDataReader<Row = any, Tar extends OperationTarget = OperationTarget> extends IValidDataOperationSchema<Tar>, ICursorReader<Row>, IForEachable<Row>, ICursorQueryable<Row>, IPageableQuery<Row> {
readonly storeName: string;
readonly storeSchema: IStoreSchema;
/**
* @param query
* @param limit 最多返回条数,默认值为1000
*/
all(query?: IDbQuery, limit?: number): Promise<Row[]>;
all(args?: IGetAllArgs<Row>): Promise<Row[]>;
/**
* 返回满足条件的第一条数据
* @param key
*/
get(key: IDbQuery): Promise<Row | undefined>;
/**
* 获取满足每一个条件的第一条数据
* @param keys
* @param excludeEmpty 是否排除空数据
*/
getMany(keys: IDbQuery[], excludeEmpty?: boolean): Promise<Row[]>;
/**
* 创建基于`name`索引的新实例
*/
index(name: string): IDataReader<Row, Tar>;
/**
* 创建基于`name`索引的新实例
*/
index(name: string, writable: true): IDataWriter<Row, Tar>;
/**
* 转换工作目标
* - 如果当前`target`为`store`,则返回`this`
* - 如果当前`target`为`index`,则创建基于其`store`的新实例
*/
asStore(): IDataReader<Row, Tar>;
/**
* 转换工作目标
* - 如果当前`target`为`store`,则返回`this`
* - 如果当前`target`为`index`,则创建其`store`的副本
*/
asStore(writable: true): IDataWriter<Row, Tar>;
/**
* 创建基于当前`target`的`IDbMap`实例
*/
asMap<Key extends StrOrNum = StrOrNum>(): IDbMap<Key, Row, Tar>;
batchRead<R = any>(fn: (reader: IDataReader<Row, NativeTarget>) => Promise<R | void>): Promise<R>;
}
type NativeReader<T = any> = IDataReader<T, NativeTarget>;
declare const Save: unique symbol;
declare const Delete: unique symbol;
interface IModifyResult<Row, Ctrl extends VoidControl | ValueControl> {
/**
* 控制循环流程
*/
control?: Ctrl;
value?: Row;
key?: IDBValidKey;
primaryKey?: IDBValidKey;
/**
* 保持为空时,不对修改结果进行保存
*/
modify?: typeof Save | typeof Delete | null | undefined;
}
type VoidModifyFn<Row = any> = (value: Row, key: IDBValidKey, i: number) => void | IModifyResult<Row, VoidControl> | Promise<void | IModifyResult<Row, VoidControl>>;
type ValueModifyFn<Row = any, Rtn = any> = (value: Row, key: IDBValidKey, i: number, results: DbRecordResult<Rtn>[]) => void | IModifyResult<Row, ValueControl> | Promise<void | IModifyResult<Row, ValueControl>>;
interface ICursorArg<Row = any> extends ICursorOption {
fn: VoidModifyFn<Row>;
}
interface ICursorResultArg<Row = any, Rtn = any> extends ICursorOption {
fn: ValueModifyFn<Row, Rtn>;
/**
* 值为数组时,代表要返回的字段
*/
mapper?: GetRowMapper<Rtn, Row> | string[] | undefined;
}
interface ICursorWriter<Row> {
/**
* 可写游标迭代器
* - 如果需要只读游标,请使用`iterator()`
* @param option
*/
cursor(option?: ICursorOption): AsyncIterable<ICursorRow>;
/**
* 可写游标操作
* - 如果需要只读游标,请使用`forEach()`
* @param fn
*/
cursor<Val extends Row = Row>(fn: VoidModifyFn<Val> | ICursorArg<Val>): Promise<void>;
/**
* 可写游标操作
* - 如果需要只读游标,请使用`forEach()`
* @param fn
* @param returns
*/
cursor<Rtn = DbRecordResult<Row>, Val extends Row = Row>(fn: ValueModifyFn<Val, Rtn> | ICursorResultArg<Val, Rtn>, returns: true): Promise<Rtn[]>;
}
interface IChangeRangeArg<Row> {
newValue: Partial<Row>;
/**
* 用于确实影响范围
* - 如果`record`中不含`key`值,则必须包含`query`
* - 如果`query`与`record`中的`key`值同时,则优先使用`query`
*/
query?: IDbQuery;
/**
* 游标滚动方向
*/
direction?: IDBCursorDirection;
}
interface IRangeWriter<Row> {
deleteRange(key: IDbQuery, returns?: false): Promise<void>;
deleteRange(key: IDbQuery, returns: true): Promise<DbRecordResult<Row>[]>;
deleteRange(key: IDbQuery, option: IDeleteOption<false | undefined>): Promise<void>;
deleteRange(key: IDbQuery, option: IDeleteOption<true>): Promise<DbRecordResult<Row>[]>;
deleteRangeMany(keys: IDbQuery[], returns?: false): Promise<void>;
deleteRangeMany(keys: IDbQuery[], returns: true): Promise<DbRecordResult<Row>[][]>;
deleteRangeMany(keys: IDbQuery[], option: IDeleteOption<false | undefined>): Promise<void>;
deleteRangeMany(keys: IDbQuery[], option: IDeleteOption<true>): Promise<DbRecordResult<Row>[][]>;
changeRange(arg: DbRecord<Partial<Row>> | IChangeRangeArg<Row>, returns?: false): Promise<void>;
changeRange(arg: DbRecord<Partial<Row>> | IChangeRangeArg<Row>, returns: true): Promise<DbRecordResult<Row>[]>;
changeRangeMany(args: DbRecord<Partial<Row>> | IChangeRangeArg<Row>[], returns?: false): Promise<void>;
changeRangeMany(args: DbRecord<Partial<Row>> | IChangeRangeArg<Row>[], returns: true): Promise<DbRecordResult<Row>[][]>;
}
interface IChangeManyOption<Rtn extends boolean | undefined> {
throwIfMissing?: boolean;
returns?: Rtn;
}
interface IDeleteOption<Rtn extends boolean | undefined> {
/**
* 游标滚动方向,默认为`prev`
*/
direction?: IDBCursorDirection;
/**
* 在设置了`softDeletedField`时,是否进行物理删除
* - 如果值为`false`则仅使用`softDeletedField.name`进行标记
*/
physical?: boolean;
returns?: Rtn;
}
interface IDataWriter<Row = any, Tar extends OperationTarget = OperationTarget> extends IDataReader<Row, Tar>, ICursorWriter<Row>, IRangeWriter<Row> {
/**
* 原始的`IDBObjectStore`
* - 仅当`target`为`NativeTarget`时有效
*/
readonly nativeStore?: IDBObjectStore;
add(record: DbRecord<Row>): Promise<DbRecordResult<Row>>;
addMany(records: DbRecord<Row>[], returns?: false): Promise<void>;
addMany(records: DbRecord<Row>[], returns: true): Promise<DbRecordResult<Row>[]>;
/**
* 添加或跳过数据
* - 将先检查`primaryKey`是否存在,再检查当前索引是否存在,如果皆不存在则添加,存在将返回存在的值
* @param record
*/
addOrSkip(record: DbRecord<Row>): Promise<DbRecordResult<Row>>;
addOrSkipMany(records: DbRecord<Row>[], returns?: false): Promise<void>;
addOrSkipMany(records: DbRecord<Row>[], returns: true): Promise<DbRecordResult<Row>[]>;
/**
* 替换数据
* @warning 仅针对`primaryKey`检查
* - 如果未指定`primaryKey`或数据不存在时则为添加
* @param record
*/
replace(record: DbRecord<Row>): Promise<DbRecordResult<Row>>;
replaceMany(records: DbRecord<Row>[], returns?: false): Promise<void>;
replaceMany(records: DbRecord<Row>[], returns: true): Promise<DbRecordResult<Row>[]>;
/**
* 修改数据
* @warning 仅针对`primaryKey`检查
* - 如果未指定`primaryKey`或数据不存在时则为跳过或抛出错误
* @param record
* @param throwIfMissing 未有`primaryKey`或数据不存在时, 值为`false`将抛出错误,值为`false`时返回`undefined`且不抛出错误
*/
change(record: DbRecord<Partial<Row>>, throwIfMissing?: boolean): Promise<DbRecordResult<Row> | undefined>;
changeMany(records: DbRecord<Partial<Row>>[], returns?: false): Promise<void>;
changeMany(records: DbRecord<Partial<Row>>[], returns: true): Promise<(DbRecordResult<Row> | undefined)[]>;
changeMany(records: DbRecord<Partial<Row>>[], option: IChangeManyOption<false | undefined>): Promise<void>;
changeMany(records: DbRecord<Partial<Row>>[], option: IChangeManyOption<true>): Promise<(DbRecordResult<Row> | undefined)[]>;
/**
* 添加或修改数据
* @warning 仅针对`primaryKey`检查
* - 如果未指定`primaryKey`或数据不存在时则为添加
* @param record
*/
addOrChange(record: DbRecord<Partial<Row>>): Promise<DbRecordResult<Row> | undefined>;
addOrChangeMany(records: DbRecord<Partial<Row>>[], returns?: false): Promise<void>;
addOrChangeMany(records: DbRecord<Partial<Row>>[], returns: true): Promise<DbRecordResult<Row>[]>;
/**
* 删除数据
* @warning 仅针对`primaryKey`检查
* - 如果未指定`primaryKey`或数据不存在时则为添加
* @param key
* @param returns
*/
delete(key: IDbQuery, returns?: false): Promise<void>;
delete(key: IDbQuery, returns: true): Promise<DbRecordResult<Row>>;
deleteMany(keys: IDbQuery[], returns?: false): Promise<void>;
deleteMany(keys: IDbQuery[], returns: true): Promise<DbRecordResult<Row>[]>;
/**
* 批量写入
* @param fn
* @param rollbackOnError 当存在错误时是否回滚
*/
batchWrite<R = any>(fn: (writer: IDataWriter<Row, NativeTarget>) => Promise<R | void>, rollbackOnError?: boolean): Promise<R>;
}
type NativeWriter<T = any> = IDataWriter<T, NativeTarget>;
interface IStoreUpgradeable<T = any> {
readonly nativeStore: IDBObjectStore;
readonly upgradeContext: IUpgradeContext;
readonly storeSchema: IStoreSchema;
add(versionBounds: IDbVersionBounds, values: DbRecord<T>[], returns?: false): Promise<void>;
add(versionBounds: IDbVersionBounds, values: DbRecord<T>[], returns: true): Promise<DbRecord<T>>;
addOrChange(versionBounds: IDbVersionBounds, values: DbRecord<T>[], returns?: false): Promise<void>;
addOrChange(versionBounds: IDbVersionBounds, values: DbRecord<T>[], returns: true): Promise<DbRecord<T>[]>;
replace(versionBounds: IDbVersionBounds, values: DbRecord<T>[], returns?: false): Promise<void>;
replace(versionBounds: IDbVersionBounds, values: DbRecord<T>[], returns: true): Promise<DbRecord<T>[]>;
call<R = any>(versionBounds: IDbVersionBounds, fn: (store: IDataWriter, upgradeContext?: IUpgradeContext) => R | Promise<R>): Promise<R>;
}
interface IVersionValidateContext {
readonly schema: Readonly<IDbSchema>;
readonly db: IDBDatabase;
readonly stores: IDBObjectStore[];
}
interface IDataOperationSchema {
store: StoreSchema;
index?: IndexSchema;
}
type DataOperationSchema = string | IDataOperationSchema;
/**
* 默认值为`addOrChangeMany`
*/
type ImportUse = keyof Pick<IDataWriter, 'addMany' | 'addOrChangeMany' | 'replaceMany' | 'addOrSkipMany'>;
interface IMultiBackup {
export(): Promise<Record<string, any[]>>;
/**
* @param data
* @param returns
* @param use 默认值为`addOrChangeMany`
*/
import(data: Record<string, any[]>, returns?: false, use?: ImportUse): Promise<void>;
/**
* @param data
* @param returns
* @param use 默认值为`addOrChangeMany`
*/
import(data: Record<string, any[]>, returns?: true, use?: ImportUse): Promise<Record<string, any[]>>;
}
interface IDataOperators<S1 = any, S2 = any, S3 = any, S4 = any, S5 = any> extends IMultiBackup {
read<Rtn = any>(fn: (s1: NativeReader<S1>, s2: NativeReader<S2>, s3: NativeReader<S3>, s4: NativeReader<S4>, s5: NativeReader<S5>, ...stores: NativeReader[]) => Rtn | Promise<Rtn>): Promise<Rtn>;
write<Rtn = any>(fn: (s1: NativeWriter<S1>, s2: NativeWriter<S2>, s3: NativeWriter<S3>, s4: NativeWriter<S4>, s5: NativeWriter<S5>, ...stores: NativeWriter[]) => Rtn | Promise<Rtn>, rollbackOnError?: boolean): Promise<Rtn>;
}
interface IIDbPro extends IMultiBackup {
readonly initialized: boolean;
readonly schema: IDbSchema;
readonly factory: IDataOperatorFactory;
getStoreSchema(name: string): IStoreSchema;
/**
* 立即初始化所有定义
* 一般不需要调用,仅用于开发时验证配置
*/
initSchema(): IDbSchema;
/**
* 打开低层数据库
* 仅在当前类库不能满足需求时使用
*/
openNativeDb(): Promise<IDBDatabase>;
/**
* 定义`store`
*/
store<T = any, RT extends IDataWriter<T, IInfoTarget> = IDataWriter<T, IInfoTarget>>(store: StoreSchema): RT;
store<T = any, RT extends IDataWriter<T, IInfoTarget> = IDataWriter<T, IInfoTarget>>(operation: IDataOperationSchema): RT;
store<T = any, RT extends IDataWriter<T, IInfoTarget> = IDataWriter<T, IInfoTarget>>(store: StoreSchema, index: IndexSchema): RT;
/**
* 定义多个`store`的联合
*/
stores<S1 = any, S2 = any, S3 = any, S4 = any, S5 = any, Rtn extends IDataOperators = IDataOperators<S1, S2, S3, S4, S5>>(schemas: DataOperationSchema[]): Rtn;
/**
* 定义一个数据会持久化到数据库的`map`,使用键值对存储,主要用于保存配置类信息
* @param storeName 默认值为`idp-pro-map`
* @param defaultData
*/
map<K extends StrOrNum = StrOrNum, V = any>(storeName?: string, defaultData?: RequiredDbNoneKeyPathRecord<V, K>[]): IDbMap<K, V, IInfoTarget>;
/**
* 定义一个数据会持久化到数据库的`map`,使用键值对存储,主要用于保存配置类信息
* @param storeName 默认值为`idp-pro-map`
* @param defaultData
*/
map<K extends StrOrNum = StrOrNum, V = any>(defaultData?: RequiredDbNoneKeyPathRecord<V, K>[], storeName?: string): IDbMap<K, V, IInfoTarget>;
/**
* 向命令行输出当前配置
* @param showFn 是否输出函数
*/
traceSchema(showFn?: boolean): void | Promise<void>;
}
interface IDataOperatorFactory {
newDbMap?<T extends IDbMap>(schema: IValidDataOperationSchema<any>, db?: IIDbPro): T;
newReader?<T extends IDataReader>(schema: IValidDataOperationSchema<any>, db?: IIDbPro): T;
newWriter?<T extends IDataWriter>(schema: IValidDataOperationSchema<any>, db?: IIDbPro): T;
newDataOperators?<T extends IDataOperators>(schemas: IValidDataOperationSchema<IInfoTarget>[], db: IIDbPro): T;
newStoreUpgradeable?<T extends IStoreUpgradeable>(nativeStore: IDBObjectStore, storeSchema: IStoreSchema, upgradeContext: IUpgradeContext): T;
}
type VersionValidateFn = (context: IVersionValidateContext) => true | string | Promise<true | string>;
interface IDbSchema {
name: string;
/**
* 默认值为1
*/
version?: number;
/**
* 用于定义`storeSchemas` 默认值的模板
*/
storeTemplate?: IStoreSchemaTemplate;
storeSchemas?: StoreSchema[];
/**
* 当 `schema` 与 `db` 版本不同时,的检测器
* - 默认值为 `true`
* - 如果为 `false`,则不会检测
* - 如果为函数,将使用自定义检测器
*/
versionDiffValidate?: boolean | VersionValidateFn;
/**
* 当 `schema` 与 `db` 版本相同时的检测器
* - 默认值为 `true`
* - 如果为 `false`,则不会检测
* - 如果为函数,将使用自定义检测器
*/
versionSameValidate?: boolean | VersionValidateFn;
/**
* 创建或升级前执行
* 通常用于重新定义store前删除同名store
*/
beforeUpgrade?: (context: IUpgradeContext) => Promise<void>;
/**
* 创建或升级后执行
* 通常用于升级了store结构后对旧数据进行升级
*/
afterUpgrade?: (context: IUpgradeContext) => Promise<void>;
/**
* 用于对 schema 检测并赋予默认值
* 对于小部分自定义默认值时,可以先调用`validateSchemaWithDefaults()`再进行自定义部分处理
* @param schema
*/
validateSchemaWithDefaults?: (schema: IDbSchema) => IDbSchema;
/**
* 数据操作器工厂
*/
factory?: IDataOperatorFactory;
}
type DBSchema = string | IDbSchema;
interface IDbVersionBounds {
oldMin?: number;
oldMax?: number;
newMin?: number;
newMax?: number;
}
interface IUpgradeContextArgs {
readonly newVersion: number;
readonly oldVersion: number;
readonly dbSchema: Readonly<IDbSchema>;
readonly database: IDBDatabase;
readonly transaction: IDBTransaction;
}
interface IUpgradeContext extends IUpgradeContextArgs, IDisposable {
store<T = any>(storeName: string): IStoreUpgradeable<T>;
deleteStoreIfExists(storeName: string): void;
versionIn(bounds: IDbVersionBounds): boolean;
}
interface IDbNoneKeyPathRecord<T = any, K = IDBValidKey> {
key?: K;
value: T;
}
/**
* 当前`store`不存在`KeyPath`时,用于一行数据记录的表示
* - 当使用数组时,`key`为数组第二项,`value`为数组第一项
* - `value`必须存在值,`key`值可选
*/
type DbNoneKeyPathRecord<V = any, K extends IDBValidKey = IDBValidKey> = IDbNoneKeyPathRecord<V, K> | [V, K?];
type RequiredDbNoneKeyPathRecord<V = any, K extends IDBValidKey = IDBValidKey> = Required<IDbNoneKeyPathRecord<V, K>> | [V, K];
type ArrayDbRecord<V = any, K extends IDBValidKey = IDBValidKey> = [V, K?] | V;
type DbRecord<V = any, K extends IDBValidKey = IDBValidKey> = DbNoneKeyPathRecord<V, K> | V;
type DbRecordResult<V = any, K = IDBValidKey> = Required<IDbNoneKeyPathRecord<V, K>> | V;
interface IVersionData {
/**
* 满足更新数据的版本范围
*/
version: IDbVersionBounds;
/**
* 需要更新的数据记录
*/
data: DbRecord[];
/**
* 用于添加数据的方法,默认为`addOrChange`
*/
use?: keyof Pick<IStoreUpgradeable, 'add' | 'addOrChange' | 'replace'>;
}
declare function parseDbNoneKeyPathRecord<T = any, K extends IDBValidKey = IDBValidKey>(record: any): Required<IDbNoneKeyPathRecord<T, K>>;
type FindFn<T> = (value: T, primaryKey: IDBValidKey, index: number) => boolean | void | Promise<boolean | void>;
/**
* @template V 原始`store`一行数据的类型
*/
interface IFindArg<V = any> extends ICursorOption {
fn?: FindFn<V> | undefined;
/**
* 最多查找次数,默认值为20000
*/
maxEmptyChecks?: number;
}
/**
* @template R 在有`mapper`时返回值的类型
* @template V 原始`store`一行数据的类型
*/
interface IFindMapArg<R = any, V = any> extends IFindArg<V> {
/**
* 值为数组时,代表要返回的字段
*/
mapper?: GetRowMapper<R, V> | string[] | undefined;
}
/**
* @template R 在有`mapper`时返回值的类型
* @template V 原始`store`一行数据的类型
*/
interface IFilterArg<R = any, V = any> extends IFindMapArg<R, V> {
/**
* 最多返回记录数,默认值为1000
*/
limit?: number;
}
interface ICursorQueryable<Row> {
count(): Promise<number>;
count(query: IDbQuery | FindFn<Row>, direction?: IDBCursorDirection): Promise<number>;
count(query: IDbQuery, fn: FindFn<Row>, direction?: IDBCursorDirection): Promise<number>;
count(arg: IFindArg<Row>): Promise<number>;
getRange(key: IDbQuery, direction?: IDBCursorDirection): Promise<DbRecordResult<Row>[]>;
getRangeMany(keys: IDbQuery[], direction?: IDBCursorDirection): Promise<DbRecordResult<Row>[]>;
find(): Promise<Row | undefined>;
find(query: IDbQuery | FindFn<Row>, direction?: IDBCursorDirection): Promise<ArrayDbRecord<Row> | undefined>;
find(query: IDbQuery, fn: FindFn<Row>, direction?: IDBCursorDirection): Promise<ArrayDbRecord<Row> | undefined>;
find<R = ArrayDbRecord<Row>>(args: IFindMapArg<R, Row>): Promise<Row | undefined>;
filter(): Promise<Row[]>;
filter<R = ArrayDbRecord<Row>>(args: IFilterArg<R, Row>): Promise<Row[]>;
filter(query: IDbQuery | FindFn<Row>, direction?: IDBCursorDirection): Promise<ArrayDbRecord<Row>[]>;
filter(query: IDbQuery, fn: FindFn<Row>, direction?: IDBCursorDirection): Promise<ArrayDbRecord<Row>[]>;
export<R = ArrayDbRecord<Row>>(): Promise<ArrayDbRecord<R>[]>;
export<R = ArrayDbRecord<Row>>(query: IDbQuery | FindFn<Row>): Promise<ArrayDbRecord<R>[]>;
export<R = ArrayDbRecord<Row>>(query: IDbQuery, fn: FindFn<Row>): Promise<ArrayDbRecord<R>[]>;
}
type ReadCallFn<T> = (target: NativeTarget) => T | undefined | Promise<T | undefined>;
type WriteCallFn<T> = (target: NativeTarget, store: IDBObjectStore) => T | undefined | Promise<T | undefined>;
interface INativeOperationResult<T extends NativeTarget> {
readonly db?: IDBDatabase;
readonly tx?: IDBTransaction;
readonly nativeStore?: IDBObjectStore;
readonly target: T;
}
type ExportDataTo = keyof Pick<IStoreSchema, 'defaultData' | 'versionData'>;
declare const defaultSpecialFields: Readonly<ISpecialFields>;
interface IGenerateOption<Ts extends boolean | number | undefined> {
/**
* 用于确定特殊索引的字段,未定义则使用`defaultSpecialFields`
*/
specialFields?: ISpecialFields;
/**
* 用于定义导出数据的位置,未定义则不导出数据
*/
dataExportTarget?: ExportDataTo;
/**
* 是否输出为字符串
* - 为`true`时输出为代码最小换行为`160`字符串,否则为`IDbSchema`对象
* - 为数字时为输出代码最小换行长度,如果小于1,则会使用`1`
*/
asString?: Ts;
}
interface IOpenCursorArg extends ICursorOption {
fn: (cursor: IDBCursorWithValue) => void | false | Promise<void | false>;
}
declare class DataOperationBase implements IValidDataOperationSchema<any>, IForEachable {
#private;
readonly idbPro?: IIDbPro;
readonly target: any;
constructor(schema: IValidDataOperationSchema<any>, db?: IIDbPro);
get storeName(): string;
get storeSchema(): IStoreSchema;
get factory(): IDataOperatorFactory;
get nativeStore(): IDBObjectStore | undefined;
get keyPath(): string | string[] | null | undefined;
forEach<T = any>(fn: VoidCallFn<T> | IForEachArg<T>): Promise<void>;
forEach<R = DbRecordResult, T = any>(fn: ValueCallFn<T, R> | IForEachResultArg<T, R>, returns: true): Promise<R[]>;
protected tx(writable?: false): Promise<INativeOperationResult<NativeTarget>>;
protected tx(writable: true): Promise<INativeOperationResult<IDBObjectStore>>;
protected tx<T>(fn: ReadCallFn<T>): Promise<T>;
protected tx<T>(writable: false, fn?: ReadCallFn<T>): Promise<T>;
protected tx<T>(writable: true, fn?: WriteCallFn<T>, rollbackOnError?: boolean): Promise<T>;
protected openCursor(arg: IOpenCursorArg, writable?: boolean): Promise<void>;
protected cursorVoid({ query, direction, preSkip, startKey, startPrimaryKey, fn }: ICursorArg, writable: boolean): Promise<void>;
protected cursorResult({ query, direction, preSkip, startKey, startPrimaryKey, fn, mapper: mpr }: ICursorResultArg, writable: boolean): Promise<any>;
}
declare class DataOperators<S1 = any, S2 = any, S3 = any, S4 = any, S5 = any> implements IDataOperators<S1, S2, S3, S4, S5> {
#private;
readonly idbPro: IIDbPro;
readonly schemas: IValidDataOperationSchema<IInfoTarget>[];
constructor(idbPro: IIDbPro, schemas: IValidDataOperationSchema<IInfoTarget>[]);
get storeNames(): string[];
read<Rtn = any>(fn: (s1: NativeReader<S1>, s2: NativeReader<S2>, s3: NativeReader<S3>, s4: NativeReader<S4>, s5: NativeReader<S5>, ...stores: NativeReader[]) => (Promise<Rtn> | Rtn)): Promise<Rtn>;
write<Rtn = any>(fn: (s1: NativeWriter<S1>, s2: NativeWriter<S2>, s3: NativeWriter<S3>, s4: NativeWriter<S4>, s5: NativeWriter<S5>, ...stores: NativeWriter[]) => (Promise<Rtn> | Rtn), rollbackOnError?: boolean): Promise<Rtn>;
export(): Promise<Record<string, any[]>>;
import(data: Record<string, any[]>, returns?: false, use?: ImportUse): Promise<void>;
import(data: Record<string, any[]>, returns?: true, use?: ImportUse): Promise<Record<string, any[]>>;
protected tx(method: keyof Pick<IDataOperatorFactory, 'newReader' | 'newWriter'>, fn: Function, writable?: boolean, rollbackOnError?: boolean): Promise<any>;
}
declare class DataReader<Row, Tar extends OperationTarget = OperationTarget> extends DataOperationBase implements IDataReader<Row, Tar> {
all(query?: IDbQuery, limit?: number): Promise<Row[]>;
all(args?: IGetAllArgs<Row>): Promise<Row[]>;
count(): Promise<number>;
count(query: IDbQuery | FindFn<Row>, direction?: IDBCursorDirection): Promise<number>;
count(query: IDbQuery, fn: FindFn<Row>, direction?: IDBCursorDirection): Promise<number>;
count(arg: IFindArg<Row>): Promise<number>;
get(key: IDbQuery): Promise<Row | undefined>;
getMany(keys: IDbQuery[], excludeEmpty?: boolean): Promise<Row[]>;
getRange(query: IDbQuery, direction?: IDBCursorDirection): Promise<DbRecordResult<Row>[]>;
getRangeMany(keys: IDbQuery[], direction?: IDBCursorDirection): Promise<DbRecordResult<Row>[]>;
index(name: string): IDataReader<Row, Tar>;
index(name: string, writable: true): IDataWriter<Row, Tar>;
asStore(): IDataReader<Row, Tar>;
asStore(writable: true): IDataWriter<Row, Tar>;
batchRead<R = any>(fn: (reader: IDataReader<Row, NativeTarget>) => Promise<void | R>): Promise<R>;
iterator(query: IDbQuery, direction?: IDBCursorDirection): AsyncIterable<Row>;
iterator(arg: IDbIteratorArg): AsyncIterable<Row>;
filter(): Promise<Row[]>;
filter<R = ArrayDbRecord<Row>>(args: IFilterArg<R, Row>): Promise<R[]>;
filter(query: IDbQuery | FindFn<Row>, direction?: IDBCursorDirection): Promise<ArrayDbRecord<Row>[]>;
filter(query: IDbQuery, fn: FindFn<Row>, direction?: IDBCursorDirection): Promise<ArrayDbRecord<Row>[]>;
filter(arg1?: IDbQuery | FindFn<Row> | IFilterArg<Row>, arg2?: IDBCursorDirection | FindFn<Row>, arg3?: IDBCursorDirection, limit?: number): Promise<ArrayDbRecord<Row>[]>;
find(): Promise<Row | undefined>;
find(query: IDbQuery | FindFn<Row>, direction?: IDBCursorDirection): Promise<ArrayDbRecord<Row> | undefined>;
find(query: IDbQuery, fn: FindFn<Row>, direction?: IDBCursorDirection): Promise<ArrayDbRecord<Row> | undefined>;
find<R = ArrayDbRecord<Row>>(args: IFindMapArg<R, Row>): Promise<Row | undefined>;
page<R = ArrayDbRecord<Row>>(): Promise<IPage<R, Row>>;
page<R = ArrayDbRecord<Row>>(arg: IPageArg<R, Row> | IPageInfo<R, Row>, page?: number): Promise<IPage<R, Row>>;
nextPage<R = Row>(info: IPageInfo<R, Row>): Promise<IPage<R, Row>>;
export<R = ArrayDbRecord<Row>>(): Promise<ArrayDbRecord<R>[]>;
export<R = ArrayDbRecord<Row>>(query: IDbQuery | FindFn<Row>): Promise<ArrayDbRecord<R>[]>;
export<R = ArrayDbRecord<Row>>(query: IDbQuery, fn: FindFn<Row>): Promise<ArrayDbRecord<R>[]>;
asMap<Key extends StrOrNum = StrOrNum>(): IDbMap<Key, Row, Tar>;
protected createOperator(target: OperationTarget, writable?: boolean): any;
}
declare class DataWriter<Row, Tar extends OperationTarget = OperationTarget> extends DataReader<Row, Tar> implements IDataWriter<Row, Tar> {
add(record: DbRecord<Row>): Promise<DbRecordResult<Row>>;
addMany(records: DbRecord<Row>[], returns?: false): Promise<void>;
addMany(records: DbRecord<Row>[], returns: true): Promise<DbRecordResult<Row>[]>;
addOrSkip(record: DbRecord<Row>): Promise<DbRecordResult<Row>>;
addOrSkipMany(records: DbRecord<Row>[], returns?: false): Promise<void>;
addOrSkipMany(records: DbRecord<Row>[], returns: true): Promise<DbRecordResult<Row>[]>;
replace(record: DbRecord<Row>): Promise<DbRecordResult<Row>>;
replaceMany(records: DbRecord<Row>[], returns?: false): Promise<void>;
replaceMany(records: DbRecord<Row>[], returns: true): Promise<DbRecordResult<Row>[]>;
change(record: DbRecord<Partial<Row>>, throwIfMissing?: boolean): Promise<DbRecordResult<Row> | undefined>;
changeMany(records: DbRecord<Partial<Row>>[], returns?: false): Promise<void>;
changeMany(records: DbRecord<Partial<Row>>[], returns: true): Promise<(DbRecordResult<Row> | undefined)[]>;
changeMany(records: DbRecord<Partial<Row>>[], option: IChangeManyOption<false | undefined>): Promise<void>;
changeMany(records: DbRecord<Partial<Row>>[], option: IChangeManyOption<true>): Promise<(DbRecordResult<Row> | undefined)[]>;
addOrChange(record: DbRecord<Partial<Row>>): Promise<DbRecordResult<Row> | undefined>;
addOrChangeMany(records: DbRecord<Partial<Row>>[], returns?: false): Promise<void>;
addOrChangeMany(records: DbRecord<Partial<Row>>[], returns: true): Promise<DbRecordResult<Row>[]>;
delete(key: IDbQuery, returns?: false): Promise<void>;
delete(key: IDbQuery, returns: true): Promise<DbRecordResult<Row>>;
deleteMany(keys: IDbQuery[], returns?: false): Promise<void>;
deleteMany(keys: IDbQuery[], returns: true): Promise<DbRecordResult<Row>[]>;
deleteRange(key: IDbQuery, returns?: false): Promise<void>;
deleteRange(key: IDbQuery, returns: true): Promise<DbRecordResult<Row>[]>;
deleteRange(key: IDbQuery, option: IDeleteOption<false | undefined>): Promise<void>;
deleteRange(key: IDbQuery, option: IDeleteOption<true>): Promise<DbRecordResult<Row>[]>;
deleteRangeMany(keys: IDbQuery[], returns?: false): Promise<void>;
deleteRangeMany(keys: IDbQuery[], returns: true): Promise<DbRecordResult<Row>[][]>;
deleteRangeMany(keys: IDbQuery[], option: IDeleteOption<false | undefined>): Promise<void>;
deleteRangeMany(keys: IDbQuery[], option: IDeleteOption<true>): Promise<DbRecordResult<Row>[][]>;
changeRange(arg: DbRecord<Partial<Row>> | IChangeRangeArg<Row>, returns?: false): Promise<void>;
changeRange(arg: DbRecord<Partial<Row>> | IChangeRangeArg<Row>, returns: true): Promise<DbRecordResult<Row>[]>;
changeRangeMany(args: DbRecord<Partial<Row>> | IChangeRangeArg<Row>[], returns?: false): Promise<void>;
changeRangeMany(args: DbRecord<Partial<Row>> | IChangeRangeArg<Row>[], returns: true): Promise<DbRecordResult<Row>[][]>;
cursor(option?: ICursorOption): AsyncIterable<ICursorRow>;
cursor<Val extends Row = Row>(fn: VoidModifyFn<Val> | ICursorArg<Val>): Promise<void>;
cursor<Rtn = DbRecordResult<Row>, Val extends Row = Row>(fn: ValueModifyFn<Val, Rtn> | ICursorResultArg<Val, Rtn>, returns: true): Promise<Rtn[]>;
batchWrite<R = any>(fn: (writer: IDataWriter<Row, NativeTarget>) => Promise<void | R>, rollbackOnError?: boolean): Promise<R>;
protected changeByPk({ pk, record, fn, requiredPk, getOld, requiredOld, saveMapper, getMapper }: {
pk?: IDbQuery;
record?: DbRecord<Partial<Row>>;
fn: (store: IDBObjectStore, pk: DbQuery, newValue: any, oldValue: any, keyPath?: string | string[]) => void | [Row, DbQuery?] | Promise<void | [Row, DbQuery?]>;
requiredPk?: boolean;
getOld?: boolean;
requiredOld?: boolean;
saveMapper?: SaveRowMapper<any, any>;
getMapper?: GetRowMapper<any, any>;
}): any;
}
declare class DbIterator<T> extends DataOperationBase implements IDbIterator<T> {
direction: IDBCursorDirection;
query: IDbQuery;
writable: boolean;
parser: IDbIteratorParser;
endsWithNull: boolean;
preSkip?: number;
startKey?: IDBValidKey;
startPrimaryKey?: IDBValidKey;
constructor(schema: IValidDataOperationSchema<any>, db?: IIDbPro, option?: IDbIteratorOption<T>);
[Symbol.asyncIterator](): AsyncIterator<T>;
}
declare class DbMap<K extends StrOrNum = StrOrNum, V = any, Tar extends OperationTarget = OperationTarget> extends DataOperationBase implements IDbMap<K, V, Tar> {
get size(): Promise<number>;
delete(key: K): Promise<void>;
batch<R = any, T extends V = V>(fn: (map: IDbMap<K, T, NativeTarget>) => (Promise<R> | R)): Promise<R>;
asStore(): IDataReader<V, Tar>;
asStore(writable: true): IDataWriter<V, Tar>;
entries<T extends V = V>(): AsyncIterable<[K, T]>;
get<T extends V = V>(key: K, defaultValue?: T): Promise<T | undefined>;
getMany<T extends V = V>(keys: K[]): Promise<(T | undefined)[]>;
has(key: K): Promise<boolean>;
keys(): AsyncIterable<K>;
set<T extends V = V>(key: K, value: T): Promise<void>;
setMany<T extends V = V>(values: [K, V][]): Promise<void>;
values<T extends V = V>(): AsyncIterable<T>;
}
declare function dbStore<T = any, RT extends IDataWriter<T, IInfoTarget> = IDataWriter<T, IInfoTarget>>(schema: StoreSchema): RT;
declare function dbStore<T = any, RT extends IDataWriter<T, IInfoTarget> = IDataWriter<T, IInfoTarget>>(schema: IDataOperationSchema): RT;
declare function dbStore<T = any, RT extends IDataWriter<T, IInfoTarget> = IDataWriter<T, IInfoTarget>>(store: StoreSchema, index: IndexSchema): RT;
declare function dbMap<K extends StrOrNum = StrOrNum, V = any>(storeName?: string, defaultData?: RequiredDbNoneKeyPathRecord<V, K>[]): IDbMap<K, V, IInfoTarget>;
declare function dbMap<K extends StrOrNum = StrOrNum, V = any>(defaultData?: RequiredDbNoneKeyPathRecord<V, K>[], storeName?: string): IDbMap<K, V, IInfoTarget>;
declare function dbStores<S1 = any, S2 = any, S3 = any, S4 = any, S5 = any, Rtn extends IDataOperators = IDataOperators<S1, S2, S3, S4, S5>>(schemas: DataOperationSchema[]): Rtn;
/**
* 释放默认数据库实例(如果存在)
*/
declare function releaseDefaultDB(): void;
declare class IDbPro implements IIDbPro {
#private;
constructor(schema: DBSchema, skipPreOpenValidation?: true);
/**
* 默认实例
*/
static get defaultDb(): IIDbPro;
get initialized(): boolean;
get schema(): IDbSchema;
get storeNames(): string[];
get factory(): IDataOperatorFactory;
/**
* 释放默认数据库实例(如果存在)
*/
static releaseDefaultDB(): void;
/**
* 从已经存在的`name`数据库中打开
* @warning 该方法仅用于不需要修改原有数据库结构的场景
* - 如果需要修改,请使用 `generateDbSchema()` 从现有数据库生成配置,且适当修改后重新打开
* @param name
*/
static openExistDb(name: string): Promise<IIDbPro>;
static store<T = any, RT extends IDataWriter<T> = IDataWriter<T>>(store: StoreSchema): RT;
static store<T = any, RT extends IDataWriter<T> = IDataWriter<T>>(operation: IDataOperationSchema): RT;
static store<T = any, RT extends IDataWriter<T> = IDataWriter<T>>(store: StoreSchema, index: IndexSchema): RT;
static stores<S1 = any, S2 = any, S3 = any, S4 = any, S5 = any, Rtn extends IDataOperators = IDataOperators<S1, S2, S3, S4, S5>>(schemas: DataOperationSchema[]): IDataOperators<Rtn>;
static map<K extends StrOrNum = StrOrNum, V = any>(storeName?: string, defaultData?: (IDbNoneKeyPathRecord<V, K> | [V, K])[]): IDbMap<K, V, IInfoTarget>;
static map<K extends StrOrNum = StrOrNum, V = any>(defaultData?: (IDbNoneKeyPathRecord<V, K> | [V, K])[], storeName?: string): IDbMap<K, V, IInfoTarget>;
openNativeDb(): Promise<IDBDatabase>;
store<T = any, RT extends IDataWriter<T, IInfoTarget> = IDataWriter<T, IInfoTarget>>(store: StoreSchema): RT;
store<T = any, RT extends IDataWriter<T, IInfoTarget> = IDataWriter<T, IInfoTarget>>(operation: IDataOperationSchema): RT;
store<T = any, RT extends IDataWriter<T, IInfoTarget> = IDataWriter<T, IInfoTarget>>(store: StoreSchema, index: IndexSchema): RT;
stores<S1 = any, S2 = any, S3 = any, S4 = any, S5 = any, Rtn extends IDataOperators = IDataOperators<S1, S2, S3, S4, S5>>(schemas: DataOperationSchema[]): Rtn;
initSchema(): IDbSchema;
traceSchema(showFn?: boolean): Promise<void>;
map<K extends StrOrNum = StrOrNum, V = any>(storeName?: string, defaultData?: RequiredDbNoneKeyPathRecord<V, K>[]): IDbMap<K, V, IInfoTarget>;
map<K extends StrOrNum = StrOrNum, V = any>(defaultData?: RequiredDbNoneKeyPathRecord<V, K>[], storeName?: string): IDbMap<K, V, IInfoTarget>;
export(): Promise<Record<string, any[]>>;
import(data: Record<string, any[]>, returns?: false, use?: ImportUse): Promise<void>;
import(data: Record<string, any[]>, returns?: true, use?: ImportUse): Promise<Record<string, any[]>>;
getStoreSchema(name: string): IStoreSchema;
}
declare function parseIDbQuery(query: IDbQuery | IDBKeyRange | undefined | null): IDBValidKey | IDBKeyRange | null | undefined;
declare function isIDbQuery(query: any): boolean;
declare class StoreUpgradeable<T = any> implements IStoreUpgradeable<T> {
#private;
readonly upgradeContext: IUpgradeContext;
readonly storeSchema: IStoreSchema;
readonly nativeStore: IDBObjectStore;
constructor(upgradeContext: IUpgradeContext, storeSchema: IStoreSchema, nativeStore: IDBObjectStore);
get writer(): IDataWriter<T>;
add(versionBounds: IDbVersionBounds, values: DbRecord<T>[], returns?: false): Promise<void>;
add(versionBounds: IDbVersionBounds, values: DbRecord<T>[], returns: true): Promise<DbRecord<T>>;
addOrChange(versionBounds: IDbVersionBounds, values: DbRecord<T>[], returns?: false): Promise<void>;
addOrChange(versionBounds: IDbVersionBounds, values: DbRecord<T>[], returns: true): Promise<DbRecord<T>[]>;
call<R = any>(versionBounds: IDbVersionBounds, fn: (store: IDataWriter, upgradeContext?: IUpgradeContext) => (Promise<R> | R)): Promise<R>;
replace(versionBounds: IDbVersionBounds, values: DbRecord<T>[], returns?: false): Promise<void>;
replace(versionBounds: IDbVersionBounds, values: DbRecord<T>[], returns: true): Promise<DbRecord<T>[]>;
}
declare class UpgradeContext implements IUpgradeContext {
#private;
readonly database: IDBDatabase;
readonly newVersion: number;
readonly oldVersion: number;
readonly dbSchema: Readonly<IDbSchema>;
readonly transaction: IDBTransaction;
constructor(args: IUpgradeContextArgs);
deleteStoreIfExists(storeName: string): void;
destroy(): void;
store<T = any>(storeName: string): IStoreUpgradeable<T>;
versionIn({ oldMin, oldMax, newMax, newMin }: IDbVersionBounds): boolean;
}
declare const validateSchemaWithDefaults: IDbSchema['validateSchemaWithDefaults'];
/**
* 版本差异验证器
* @param context
*/
declare const versionDiffValidate: VersionValidateFn;
declare const versionSameValidate: VersionValidateFn;
declare function generateDbSchema(db: string, option?: IGenerateOption<undefined | false>): Promise<IDbSchema>;
declare function generateDbSchema(db: string, option: IGenerateOption<true | number>): Promise<string>;
export { Break, Continue, ContinueKey, ContinuePrimaryKey, DataOperationBase, DataOperators, DataReader, DataWriter, DbIterator, DbIteratorParsers, DbMap, Delete, Finished, IDbPro, NextKey, NextPrimaryKey, Save, StoreUpgradeable, UpgradeContext, dbMap, dbStore, dbStores, defaultSpecialFields, defaultStoreSchemaTemplate, generateDbSchema, isIDbQuery, isNativeTarget, parseDbNoneKeyPathRecord, parseIDbQuery, releaseDefaultDB, validateSchemaWithDefaults, versionDiffValidate, versionSameValidate };
export type { ArrayDbRecord, DBSchema, DataOperationSchema, DbIteratorParsersKey, DbNoneKeyPathRecord, DbRecord, DbRecordResult, ExportDataTo, FindFn, GetRowMapper, IChangeManyOption, IChangeRangeArg, ICursorArg, ICursorOption, ICursorQueryable, ICursorReader, ICursorResultArg, ICursorRow, ICursorWriter, IDataOperationSchema, IDataOperatorFactory, IDataOperators, IDataReader, IDataWriter, IDbGtRange, IDbGteRange, IDbIterator, IDbIteratorArg, IDbIteratorOption, IDbIteratorParser, IDbLtGtRange, IDbLtGteRange, IDbLtRange, IDbLteGtRange, IDbLteGteRange, IDbLteRange, IDbMap, IDbNoneKeyPathRecord, IDbQuery, IDbRange, IDbSchema, IDbVersionBounds, IDeleteOption, IFilterArg, IFindArg, IFindMapArg, IForEachArg, IForEachResultArg, IForEachable, IGenerateOption, IGetAllArgs, IIDbPro, IIndexSchema, IInfoTarget, IModifyResult, IMultiBackup, INativeOperationResult, IOpenCursorArg, IPage, IPageArg, IPageInfo, IPageableQuery, IRangeWriter, ISpecialFieldSchema, ISpecialFields, IStoreSchema, IStoreSchemaTemplate, IStoreUpgradeable, IUpgradeContext, IUpgradeContextArgs, IValidDataOperationSchema, IValueResult, IVersionData, IVersionValidateContext, IVoidResult, ImportUse, IndexSchema, NativeReader, NativeTarget, NativeWriter, OperationTarget, ReadCallFn, RequiredDbNoneKeyPathRecord, SaveRowMapper, SpecialFieldSchema, StoreSchema, ValueCallFn, ValueControl, ValueModifyFn, VersionValidateFn, VoidCallFn, VoidControl, VoidModifyFn, VoidResult, WriteCallFn };