repo_description: A fast, local first, reactive Database for JavaScript Applications https://rxdb.info/
repo_topics: angular browser-database couchdb crdt database firebase graphql indexeddb ionic local-first localstorage nodejs nosql postgres pouchdb react-native realtime realtime-database rxdb sqlite
code: import {
      Observable
  } from 'rxjs';
  
  import type {
      RxCollection,
  } from './rx-collection.d.ts';
  import type {
      RxAttachment,
      RxAttachmentCreator,
      RxAttachmentCreatorBase64
  } from './rx-attachment.d.ts';
  import type { RxDocumentData, WithDeleted } from './rx-storage.d.ts';
  import type { RxChangeEvent } from './rx-change-event.d.ts';
  import type { DeepReadonly, MaybePromise, PlainJsonValue } from './util.d.ts';
  import type { UpdateQuery } from './plugins/update.d.ts';
  import type { CRDTEntry } from './plugins/crdt.d.ts';
  import type { Reactified } from './plugins/reactivity.d.ts';
  
  
  
  export type RxDocument<RxDocumentType = {}, OrmMethods = {}, Reactivity = unknown> = RxDocumentBase<
      RxDocumentType,
      OrmMethods,
      Reactivity
  > & RxDocumentType & OrmMethods & ExtendObservables<RxDocumentType> & ExtendReactivity<RxDocumentType, Reactivity>;
  
  
  /**
   * Extend the base properties by the property$ fields
   * so it knows that RxDocument.age also has RxDocument.age$ which is
   * an observable.
   * TODO how to do this for the nested fields?
   */
  type ExtendObservables<RxDocumentType> = {
      [P in keyof RxDocumentType as `${string & P}$`]: Observable<RxDocumentType[P]>;
  };
  
  type ExtendReactivity<RxDocumentType, Reactivity> = {
      [P in keyof RxDocumentType as `${string & P}$$`]: Reactified<Reactivity, RxDocumentType[P]>;
  };
  
  /**
   * The public facing modify update function.
   * It only gets the document parts as input, that
   * are mutateable by the user.
   */
  export type ModifyFunction<RxDocumentType> = (
      doc: WithDeleted<RxDocumentType>
  ) => MaybePromise<WithDeleted<RxDocumentType>> | MaybePromise<RxDocumentType>;
  
  /**
   * Meta data that is attached to each document by RxDB.
   */
  export type RxDocumentMeta = {
      /**
       * Last write time.
       * Unix epoch in milliseconds.
       */
      lwt: number;
  
      /**
       * The replication plugins "tags" the origin
       * of writes to later know if a write came from
       * the replication or was done locally.
       */
      o?: {
          hash: string;
          _rev: number;
      };
  
      /**
       * Any other value can be attached to the _meta data.
       * Mostly done by plugins to mark documents.
       */
      [k: string]: PlainJsonValue | undefined;
  
  
  };
  
  export declare interface RxDocumentBase<RxDocType, OrmMethods = {}, Reactivity = unknown> {
      isInstanceOfRxDocument: true;
      collection: RxCollection<RxDocType, OrmMethods, {}, {}, Reactivity>;
      readonly deleted: boolean;
  
      readonly $: Observable<RxDocument<RxDocType, OrmMethods, Reactivity>>;
      readonly $$: Reactified<Reactivity, RxDocument<RxDocType, OrmMethods, Reactivity>>;
      readonly deleted$: Observable<boolean>;
      readonly deleted$$: Reactified<Reactivity, boolean>;
  
      readonly primary: string;
      readonly allAttachments$: Observable<RxAttachment<RxDocType, OrmMethods, Reactivity>[]>;
  
      // internal things
      _data: RxDocumentData<RxDocType>;
      primaryPath: string;
      revision: string;
      /**
       * Used to de-duplicate the enriched property objects
       * of the document. Lazily initialized on first property access.
       */
      _propertyCache: Map<string, any> | undefined;
      $emit(cE: RxChangeEvent<RxDocType>): void;
      _saveData(newData: any, oldData: RxDocumentData<RxDocType>): Promise<RxDocument<RxDocType, OrmMethods, Reactivity>>;
      // /internal things
  
      // Returns the latest state of the document
      getLatest(): RxDocument<RxDocType, OrmMethods, Reactivity>;
  
  
      get$(path: string): Observable<any>;
      get$$(path: string): Reactified<Reactivity, any>;
      get(objPath: string): DeepReadonly<any>;
      populate(objPath: string): Promise<RxDocument<RxDocType, OrmMethods, Reactivity> | any | null>;
  
      /**
       * mutate the document with a function
       */
      modify(mutationFunction: ModifyFunction<RxDocType>, context?: string): Promise<RxDocument<RxDocType, OrmMethods, Reactivity>>;
      incrementalModify(mutationFunction: ModifyFunction<RxDocType>, context?: string): Promise<RxDocument<RxDocType, OrmMethods, Reactivity>>;
  
      /**
       * patches the given properties
       */
      patch(patch: Partial<RxDocType>): Promise<RxDocument<RxDocType, OrmMethods, Reactivity>>;
      incrementalPatch(patch: Partial<RxDocType>): Promise<RxDocument<RxDocType, OrmMethods, Reactivity>>;
  
      update(updateObj: UpdateQuery<RxDocType>): Promise<RxDocument<RxDocType, OrmMethods, Reactivity>>;
      incrementalUpdate(updateObj: UpdateQuery<RxDocType>): Promise<RxDocument<RxDocType, OrmMethods, Reactivity>>;
  
      updateCRDT(updateObj: CRDTEntry<RxDocType> | CRDTEntry<RxDocType>[]): Promise<RxDocument<RxDocType, OrmMethods, Reactivity>>;
  
      remove(): Promise<RxDocument<RxDocType, OrmMethods, Reactivity>>;
      incrementalRemove(): Promise<RxDocument<RxDocType, OrmMethods, Reactivity>>;
  
      // only for temporary documents
      set(objPath: string, value: any): RxDocument<RxDocType, OrmMethods, Reactivity>;
      save(): Promise<boolean>;
  
      // attachments
      putAttachment(
          creator: RxAttachmentCreator
      ): Promise<RxAttachment<RxDocType, OrmMethods, Reactivity>>;
      putAttachmentBase64(
          creator: RxAttachmentCreatorBase64
      ): Promise<RxAttachment<RxDocType, OrmMethods, Reactivity>>;
      putAttachments(
          creators: RxAttachmentCreator[]
      ): Promise<RxAttachment<RxDocType, OrmMethods, Reactivity>[]>;
      getAttachment(id: string): RxAttachment<RxDocType, OrmMethods, Reactivity> | null;
      allAttachments(): RxAttachment<RxDocType, OrmMethods, Reactivity>[];
  
      toJSON(withRevAndAttachments: true): DeepReadonly<RxDocumentData<RxDocType>>;
      toJSON(withRevAndAttachments?: false): DeepReadonly<RxDocType>;
  
      toMutableJSON(withRevAndAttachments: true): RxDocumentData<RxDocType>;
      toMutableJSON(withRevAndAttachments?: false): RxDocType;
  
      close(): void;
  }
  