import type { symbolGetNode, symbolOpaque } from './globals'; interface MMKVConfiguration { /** * The MMKV instance's ID. If you want to use multiple instances, make sure to use different IDs! * * @example * ```ts * const userStorage = new MMKV({ id: `user-${userId}-storage` }) * const globalStorage = new MMKV({ id: 'global-app-storage' }) * ``` * * @default 'mmkv.default' */ id: string; /** * The MMKV instance's root path. By default, MMKV stores file inside `$(Documents)/mmkv/`. You can customize MMKV's root directory on MMKV initialization: * * @example * ```ts * const temporaryStorage = new MMKV({ path: '/tmp/' }) * ``` */ path?: string; /** * The MMKV instance's encryption/decryption key. By default, MMKV stores all key-values in plain text on file, relying on iOS's sandbox to make sure the file is encrypted. Should you worry about information leaking, you can choose to encrypt MMKV. * * Encryption keys can have a maximum length of 16 bytes. * * @example * ```ts * const secureStorage = new MMKV({ encryptionKey: 'my-encryption-key!' }) * ``` */ encryptionKey?: string; } type Nullable = T | null | undefined; export type TrackingType = undefined | true | 'shallow' | 'optimize' | symbol; export interface MapGet | WeakMap> { get(key: Parameters[0]): ObservableChild[1]>; get(): T; } export interface ObservableBaseFns { peek(): T; get(trackingType?: TrackingType): T; onChange(cb: ListenerFn, options?: { trackingType?: TrackingType; initial?: boolean; immediate?: boolean; noArgs?: boolean; }): ObservableListenerDispose; } export interface ObservablePrimitiveBaseFns extends ObservableBaseFns { delete(): ObservablePrimitiveBaseFns; set(value: Nullable | CallbackSetter | Promise): ObservablePrimitiveChild; } export interface ObservablePrimitiveBooleanFns { toggle(): T; } export interface ObservableObjectFns extends ObservableBaseFns { set(value: Nullable | CallbackSetter | Promise): ObservableChild; assign(value: T | Partial): ObservableChild; delete(): ObservableChild; } export type ObservablePrimitive = [T] extends [boolean] ? ObservablePrimitiveBaseFns & ObservablePrimitiveBooleanFns : ObservablePrimitiveBaseFns; export interface ObservablePrimitiveChildFns extends ObservablePrimitiveBaseFns { delete(): ObservablePrimitiveChild; } type CallbackSetter = { bivarianceHack(prev: T): T; }['bivarianceHack']; export type OpaqueObject = T & { [symbolOpaque]: true; }; type ArrayOverrideFnNames = 'find' | 'every' | 'some' | 'filter' | 'reduce' | 'reduceRight' | 'forEach' | 'map'; type RemoveIndex = { [K in keyof T as string extends K ? never : number extends K ? never : K]: T[K]; }; export type ObservableArrayOverride = Omit>, ArrayOverrideFnNames> & Pick>, ArrayOverrideFnNames> & { [n: number]: Observable; }; export interface ListenerParams { value: T; getPrevious: () => T; changes: Change[]; } export type ListenerFn = (params: ListenerParams) => void; type PrimitiveKeys = Pick; type NonPrimitiveKeys = Pick; type Recurse = T[K] extends ObservableReadable ? T[K] : T[K] extends Function | Promise ? T[K] : T[K] extends ObservableProxy ? ObservableProxy : T[K] extends Map | WeakMap ? ObservableMap : T[K] extends Set | WeakSet ? T[K] & ObservablePrimitiveBaseFns : T[K] extends OpaqueObject ? T[K] & ObservablePrimitiveChildFns : T[K] extends Primitive ? ObservablePrimitiveChild : T[K] extends Array ? ObservableObjectFns & ObservableArrayOverride : T extends object ? TRecurse : T[K]; type ObservableFnsRecursiveUnsafe = { [K in keyof T]-?: Recurse>>; }; type ObservableFnsRecursiveSafe = { readonly [K in keyof T]-?: Recurse>>; }; type ObservableFnsRecursive = ObservableFnsRecursiveSafe> & ObservableFnsRecursiveUnsafe>; type ObservableComputedFnsRecursive = { readonly [K in keyof T]-?: Recurse>>; }; export interface ObservableEvent { fire(): void; on(cb?: () => void): ObservableListenerDispose; get(): void; } export type QueryByModified = boolean | { [K in keyof T]?: QueryByModified; }; export type TypeAtPath = 'object' | 'array'; export interface Change { path: string[]; pathTypes: TypeAtPath[]; valueAtPath: any; prevAtPath: any; } export interface PersistOptionsLocal { name: string; adjustData?: { load?: (value: T) => T | Promise; save?: (value: T) => T | Promise; }; fieldTransforms?: FieldTransforms; readonly?: boolean; mmkv?: MMKVConfiguration; indexedDB?: { prefixID?: string; itemID?: string; }; options?: any; } export interface PersistOptionsRemote { readonly?: boolean; once?: boolean; requireAuth?: boolean; saveTimeout?: number; waitForLoad?: Promise | ObservableReadable; waitForSave?: Promise | ObservableReadable | ((value: any, path: string[]) => Promise); manual?: boolean; fieldTransforms?: FieldTransforms; allowSaveIfError?: boolean; onLoadError?: (error: Error) => void; onSaveError?: (error: Error) => void; adjustData?: { load?: (value: T) => T | Promise; save?: (value: T) => T | Promise; }; firebase?: { syncPath: (uid: string) => `/${string}/`; queryByModified?: QueryByModified; ignoreKeys?: string[]; dateModifiedKey?: string; }; onBeforeSaveRemote?: () => void; onSaveRemote?: () => void; } export interface PersistOptions { local?: string | PersistOptionsLocal; remote?: PersistOptionsRemote; persistLocal?: ClassConstructor; persistRemote?: ClassConstructor; } export interface PersistMetadata { id?: '__legend_metadata'; modified?: number; pending?: any; } export interface ObservablePersistLocal { initialize?(config: ObservablePersistenceConfig['persistLocalOptions']): Promise; getTable(table: string, config: PersistOptionsLocal): T; getTableTransformed?(table: string, config: PersistOptionsLocal): T; getMetadata(table: string, config: PersistOptionsLocal): PersistMetadata; set(table: string, changes: Change[], config: PersistOptionsLocal): Promise | void; updateMetadata(table: string, metadata: PersistMetadata, config: PersistOptionsLocal): Promise | void; deleteTable(table: string, config: PersistOptionsLocal): Promise | void; deleteMetadata(table: string, config: PersistOptionsLocal): Promise | void; loadTable?(table: string, config: PersistOptionsLocal): Promise | void; } export interface ObservablePersistRemoteSaveParams { state: Observable; obs: Observable; options: PersistOptions; path: string[]; pathTypes: TypeAtPath[]; valueAtPath: T2; prevAtPath: any; } export interface ObservablePersistRemoteListenParams { state: Observable; obs: ObservableReadable; options: PersistOptions; dateModified?: number; onLoad: () => void; onChange: (params: { value: T; path: string[]; pathTypes: TypeAtPath[]; mode: 'assign' | 'set' | 'dateModified'; dateModified: number | undefined; }) => void | Promise; } export interface ObservablePersistRemote { save(params: ObservablePersistRemoteSaveParams): Promise<{ changes?: object; dateModified?: number; }>; listen(params: ObservablePersistRemoteListenParams): void; } export interface ObservablePersistState { isLoadedLocal: boolean; isLoadedRemote: boolean; isEnabledLocal: boolean; isEnabledRemote: boolean; remoteError?: Error; dateModified?: number; clearLocal: (() => Promise) | undefined; sync: () => Promise; getPendingChanges: () => Record | undefined; } export type RecordValue = T extends Record ? t : never; export type ArrayValue = T extends Array ? t : never; export type ObservableValue = T extends Observable ? t : never; declare type ObjectKeys = Pick ? T[K] extends any[] ? never : K : never : never; }[keyof T]>; declare type DictKeys = Pick> ? K : never) : never; }[keyof T]>; declare type ArrayKeys = Pick; export declare type FieldTransforms = (T extends Record> ? { _dict: FieldTransformsInner>; } : never) | FieldTransformsInner; export declare type FieldTransformsInner = { [K in keyof T]: string; } & ({ [K in keyof ObjectKeys as `${K}_obj`]?: FieldTransforms; } | { [K in keyof DictKeys as `${K}_dict`]?: FieldTransforms>; }) & { [K in keyof ArrayKeys as `${K}_arr`]?: FieldTransforms>; } & { [K in keyof ArrayKeys as `${K}_val`]?: FieldTransforms>; }; export type Selector = ObservableReadable | (() => T) | T; export type ClassConstructor = new (...args: Args) => I; export type ObservableListenerDispose = () => void; export interface ObservableRoot { _: any; locked?: boolean; set?: (value: any) => void; activate?: () => void; } export type Primitive = boolean | string | number | Date; export type NotPrimitive = T extends Primitive ? never : T; export type ObservableMap | WeakMap> = Omit & Omit, 'get'> & MapGet; export type ObservableMapIfMap = T extends Map | WeakMap ? ObservableMap : never; export type ObservableArray = ObservableObjectFns & ObservableArrayOverride; export type ObservableObject = ObservableFnsRecursive & ObservableObjectFns; export type ObservableChild = [T] extends [Primitive] ? ObservablePrimitiveChild : ObservableObject; export type ObservablePrimitiveChild = [T] extends [boolean] ? ObservablePrimitiveChildFns & ObservablePrimitiveBooleanFns : ObservablePrimitiveChildFns; export type ObservableObjectOrArray = T extends any[] ? ObservableArray : ObservableObject; export type ObservableComputed = ObservableBaseFns & ObservableComputedFnsRecursive; export type ObservableComputedTwoWay = ObservableComputed & ObservablePrimitiveBaseFns; type Equals = (() => T extends X ? 1 : 2) extends () => T extends Y ? 1 : 2 ? true : false; export type Observable = Equals extends true ? ObservableObject : [T] extends [object] ? ObservableObjectOrArray : ObservablePrimitive; export type ObservableReadable = ObservableBaseFns | ObservablePrimitiveBaseFns | ObservablePrimitiveChildFns | ObservableObjectFns | ObservableMapIfMap; export type ObservableWriteable = ObservableReadable & { set: (value: T | ((prev: T) => T)) => void; delete?: () => void; }; export interface NodeValueListener { track: TrackingType; noArgs?: boolean; listener: ListenerFn; } interface BaseNodeValue { children?: Map; proxy?: object; isActivatedPrimitive?: boolean; root: ObservableRoot; listeners?: Set; listenersImmediate?: Set; descendantHasListener?: boolean; isComputed?: boolean; proxyFn?: (key: string) => ObservableReadable; isEvent?: boolean; linkedToNode?: NodeValue; linkedFromNodes?: Set; isSetting?: number; isAssigning?: number; functions?: Map>; } export interface RootNodeValue extends BaseNodeValue { parent?: undefined; key?: undefined; } export interface ChildNodeValue extends BaseNodeValue { parent: NodeValue; key: string; } export type NodeValue = RootNodeValue | ChildNodeValue; export interface ObserveEvent { num: number; previous?: T | undefined; cancel?: boolean; onCleanup?: () => void; } export interface ObserveEventCallback { num: number; previous?: T | undefined; value?: T; cancel?: boolean; onCleanup?: () => void; onCleanupReaction?: () => void; } export interface ObservablePersistenceConfigLocalOptions { onLoadError?: (error: Error) => void; onSaveError?: (error: Error) => void; indexedDB?: { databaseName: string; version: number; tableNames: string[]; }; } export interface ObservablePersistenceConfig { persistLocal?: ClassConstructor; persistRemote?: ClassConstructor; persistLocalOptions?: ObservablePersistenceConfigLocalOptions; saveTimeout?: number; dateModifiedKey?: string; } export interface ObservableProxy { [key: string]: Observable; [symbolGetNode]: NodeValue; } export {}; //# sourceMappingURL=observableInterfaces.d.ts.map