{"version":3,"file":"dexie-react-hooks.mjs","sources":["../src/useObservable.ts","../src/useLiveQuery.ts","../src/usePermissions.ts"],"sourcesContent":["import React from 'react';\nexport interface InteropableObservable<T> {\n  subscribe(\n    onNext: (x: T) => any,\n    onError?: (error: any) => any\n  ): (() => any) | { unsubscribe(): any };\n  getValue?(): T; // For BehaviorSubject\n  hasValue?(): boolean; // For liveQuery observable returning false until a value is available\n}\n\nexport function useObservable<T, TDefault>(\n  observable: InteropableObservable<T>\n): T | undefined;\nexport function useObservable<T, TDefault>(\n  observable: InteropableObservable<T>,\n  defaultResult: TDefault\n): T | TDefault;\nexport function useObservable<T>(\n  observableFactory: () => InteropableObservable<T>,\n  deps?: any[]\n): T | undefined;\nexport function useObservable<T, TDefault>(\n  observableFactory: () => InteropableObservable<T>,\n  deps: any[],\n  defaultResult: TDefault\n): T | TDefault;\nexport function useObservable<T, TDefault>(\n  observableFactory:\n    | InteropableObservable<T>\n    | (() => InteropableObservable<T>),\n  arg2?: any,\n  arg3?: any\n) {\n  // Resolve vars from overloading variants of this function:\n  let deps: any[];\n  let defaultResult: TDefault;\n  if (typeof observableFactory === 'function') {\n    deps = arg2 || [];\n    defaultResult = arg3;\n  } else {\n    deps = [];\n    defaultResult = arg2;\n  }\n\n  // Create a ref that keeps the state we need\n  const monitor = React.useRef({\n    hasResult: false,\n    result: defaultResult as T | TDefault,\n    error: null as any,\n  });\n  // We control when component should rerender. Make triggerUpdate\n  // as examplified on React's docs at:\n  // https://reactjs.org/docs/hooks-faq.html#is-there-something-like-forceupdate\n  const [_, triggerUpdate] = React.useReducer((x) => x + 1, 0);\n\n  // Memoize the observable based on deps\n  const observable = React.useMemo(() => {\n    // Make it remember previous subscription's default value when\n    // resubscribing.\n    const observable =\n      typeof observableFactory === 'function'\n        ? observableFactory()\n        : observableFactory;\n    if (!observable || typeof observable.subscribe !== 'function') {\n      if (observableFactory === observable) {\n        throw new TypeError(\n          `Given argument to useObservable() was neither a valid observable nor a function.`\n        );\n      } else {\n        throw new TypeError(\n          `Observable factory given to useObservable() did not return a valid observable.`\n        );\n      }\n    }\n\n    if (!monitor.current.hasResult &&\n        typeof window !== 'undefined' // Don't do this in SSR\n       ) {\n      // Optimize for BehaviorSubject and other observables implementing getValue():\n      if (typeof observable.hasValue !== 'function' || observable.hasValue()) {\n        if (typeof observable.getValue === 'function') {\n          monitor.current.result = observable.getValue();\n          monitor.current.hasResult = true;\n        } else {\n          // Find out if the observable has a current value: try get it by subscribing and\n          // unsubscribing synchronously\n          const subscription = observable.subscribe((val) => {\n            monitor.current.result = val;\n            monitor.current.hasResult = true;\n          });\n          // Unsubscribe directly. We only needed any synchronous value if it was possible.\n          if (typeof subscription === 'function') {\n            subscription();\n          } else {\n            subscription.unsubscribe();\n          }\n        }\n      }\n    }\n    return observable;\n  }, deps);\n\n  // Integrate with react devtools:\n  React.useDebugValue(monitor.current.result);\n\n  // Subscribe to the observable\n  React.useEffect(() => {\n    const subscription = observable.subscribe(\n      (val) => {\n        const { current } = monitor;\n        if (current.error !== null || current.result !== val) {\n          current.error = null;\n          current.result = val;\n          current.hasResult = true;\n          triggerUpdate();\n        }\n      },\n      (err) => {\n        const { current } = monitor;\n        if (current.error !== err) {\n          current.error = err;\n          triggerUpdate();\n        }\n      }\n    );\n    return typeof subscription === 'function'\n      ? subscription // Support observables that return unsubscribe directly\n      : subscription.unsubscribe.bind(subscription);\n  }, deps);\n\n  // Throw if observable has emitted error so that\n  // an ErrorBoundrary can catch it\n  if (monitor.current.error) throw monitor.current.error;\n\n  // Return the current result\n  return monitor.current.result;\n}\n","import { liveQuery } from 'dexie';\nimport { useObservable } from './useObservable';\n\nexport function useLiveQuery<T>(\n  querier: () => Promise<T> | T,\n  deps?: any[]\n): T | undefined;\nexport function useLiveQuery<T, TDefault>(\n  querier: () => Promise<T> | T,\n  deps: any[],\n  defaultResult: TDefault\n): T | TDefault;\nexport function useLiveQuery<T, TDefault>(\n  querier: () => Promise<T> | T,\n  deps?: any[],\n  defaultResult?: TDefault\n): T | TDefault {\n  return useObservable(\n    () => liveQuery(querier),\n    deps || [],\n    defaultResult as TDefault\n  );\n}\n","import { Dexie } from 'dexie';\nimport { useObservable } from './useObservable';\n//import type { KeyPaths, TableProp } from 'dexie'; // Issue #1725 - not compatible with dexie@3.\n// Workaround: provide these types inline for now. When dexie 4 stable is out, we can use the types from dexie@4.\nexport type KeyPaths<T> = {\n  [P in keyof T]: \n    P extends string \n      ? T[P] extends Array<infer K>\n        ? K extends object // only drill into the array element if it's an object\n          ? P | `${P}.${number}` | `${P}.${number}.${KeyPaths<K>}` \n          : P | `${P}.${number}`\n        : T[P] extends (...args: any[]) => any // Method\n           ? never \n          : T[P] extends object \n            ? P | `${P}.${KeyPaths<T[P]>}` \n            : P \n      : never;\n}[keyof T];\nexport type TableProp<DX extends Dexie> = {\n  [K in keyof DX]: DX[K] extends {schema: any, get: any, put: any, add: any, where: any} ? K : never;\n}[keyof DX] & string;\n\n\ninterface DexieCloudEntity {\n  table(): string;\n  realmId: string;\n  owner: string;\n}\n\nexport interface PermissionChecker<T, TableName extends string> {\n  add(...tableNames: TableName[]): boolean;\n  update(...props: KeyPaths<T>[]): boolean;\n  delete(): boolean;\n}\n\nexport function usePermissions<T extends DexieCloudEntity>(\n  entity: T\n): PermissionChecker<\n  T,\n  T extends { table: () => infer TableName } ? TableName : string\n>;\nexport function usePermissions<\n  TDB extends Dexie,\n  T\n>(db: TDB, table: TableProp<TDB>, obj: T): PermissionChecker<T, TableProp<TDB>>;\nexport function usePermissions(\n  firstArg:\n    | Dexie\n    | {\n        realmId?: string;\n        owner?: string;\n        table?: () => string;\n        readonly db?: Dexie;\n      },\n  table?: string,\n  obj?: { realmId?: string; owner?: string }\n) {\n  if (!firstArg)\n    throw new TypeError(\n      `Invalid arguments to usePermissions(): undefined or null`\n    );\n  let db: Dexie;\n  if (arguments.length >= 3) {\n    if (!('transaction' in firstArg)) {\n      // Using ducktyping instead of instanceof in case there are multiple Dexie modules in app.\n      // First arg is  ensures first arg is a Dexie instance\n      throw new TypeError(\n        `Invalid arguments to usePermission(db, table, obj): 1st arg must be a Dexie instance`\n      );\n    }\n    if (typeof table !== 'string')\n      throw new TypeError(\n        `Invalid arguments to usePermission(db, table, obj): 2nd arg must be string`\n      );\n    if (!obj || typeof obj !== 'object')\n      throw new TypeError(\n        `Invalid arguments to usePermission(db, table, obj): 3rd arg must be an object`\n      );\n    db = firstArg;\n  } else {\n    if (firstArg instanceof Dexie)\n      throw new TypeError(\n        `Invalid arguments to usePermission(db, table, obj): Missing table and obj arguments.`\n      );\n\n    if (\n      typeof firstArg.table === 'function' &&\n      typeof firstArg.db === 'object'\n    ) {\n      db = firstArg.db!;\n      obj = firstArg;\n      table = firstArg.table();\n    } else {\n      throw new TypeError(\n        `Invalid arguments to usePermissions(). ` +\n          `Expected usePermissions(entity: DexieCloudEntity) or ` +\n          `usePermissions(db: Dexie, table: string, obj: DexieCloudObject)`\n      );\n    }\n  }\n  if (!('cloud' in db))\n    throw new Error(\n      `usePermissions() is only for Dexie Cloud but there's no dexie-cloud-addon active in given db.`\n    );\n  if (!('permissions' in (db as any).cloud))\n    throw new Error(`usePermissions() requires a newer version of dexie-cloud-addon. Please upgrade it.`)\n  return useObservable(\n    // @ts-ignore\n    () => db.cloud.permissions(obj, table),\n    [obj.realmId, obj.owner, table]\n  );\n}\n"],"names":[],"mappings":";;;SA0BgB,aAAa,CAC3B,iBAEoC,EACpC,IAAU,EACV,IAAU,EAAA;;AAGV,IAAA,IAAI,IAAW,CAAC;AAChB,IAAA,IAAI,aAAuB,CAAC;AAC5B,IAAA,IAAI,OAAO,iBAAiB,KAAK,UAAU,EAAE;AAC3C,QAAA,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;QAClB,aAAa,GAAG,IAAI,CAAC;AACtB,KAAA;AAAM,SAAA;QACL,IAAI,GAAG,EAAE,CAAC;QACV,aAAa,GAAG,IAAI,CAAC;AACtB,KAAA;;AAGD,IAAA,IAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC;AAC3B,QAAA,SAAS,EAAE,KAAK;AAChB,QAAA,MAAM,EAAE,aAA6B;AACrC,QAAA,KAAK,EAAE,IAAW;AACnB,KAAA,CAAC,CAAC;;;;IAIG,IAAA,EAAA,GAAqB,KAAK,CAAC,UAAU,CAAC,UAAC,CAAC,EAAK,EAAA,OAAA,CAAC,GAAG,CAAC,CAAL,EAAK,EAAE,CAAC,CAAC,CAAA,CAApD,EAAA,CAAA,CAAA,CAAA,CAAA,KAAE,aAAa,GAAA,EAAA,CAAA,CAAA,EAAsC;;AAG7D,IAAA,IAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,YAAA;;;AAG/B,QAAA,IAAM,UAAU,GACd,OAAO,iBAAiB,KAAK,UAAU;cACnC,iBAAiB,EAAE;cACnB,iBAAiB,CAAC;QACxB,IAAI,CAAC,UAAU,IAAI,OAAO,UAAU,CAAC,SAAS,KAAK,UAAU,EAAE;YAC7D,IAAI,iBAAiB,KAAK,UAAU,EAAE;AACpC,gBAAA,MAAM,IAAI,SAAS,CACjB,kFAAkF,CACnF,CAAC;AACH,aAAA;AAAM,iBAAA;AACL,gBAAA,MAAM,IAAI,SAAS,CACjB,gFAAgF,CACjF,CAAC;AACH,aAAA;AACF,SAAA;AAED,QAAA,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS;AAC1B,YAAA,OAAO,MAAM,KAAK,WAAW;AAC5B,UAAA;;YAEH,IAAI,OAAO,UAAU,CAAC,QAAQ,KAAK,UAAU,IAAI,UAAU,CAAC,QAAQ,EAAE,EAAE;AACtE,gBAAA,IAAI,OAAO,UAAU,CAAC,QAAQ,KAAK,UAAU,EAAE;oBAC7C,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,UAAU,CAAC,QAAQ,EAAE,CAAC;AAC/C,oBAAA,OAAO,CAAC,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;AAClC,iBAAA;AAAM,qBAAA;;;AAGL,oBAAA,IAAM,YAAY,GAAG,UAAU,CAAC,SAAS,CAAC,UAAC,GAAG,EAAA;AAC5C,wBAAA,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC;AAC7B,wBAAA,OAAO,CAAC,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;AACnC,qBAAC,CAAC,CAAC;;AAEH,oBAAA,IAAI,OAAO,YAAY,KAAK,UAAU,EAAE;AACtC,wBAAA,YAAY,EAAE,CAAC;AAChB,qBAAA;AAAM,yBAAA;wBACL,YAAY,CAAC,WAAW,EAAE,CAAC;AAC5B,qBAAA;AACF,iBAAA;AACF,aAAA;AACF,SAAA;AACD,QAAA,OAAO,UAAU,CAAC;KACnB,EAAE,IAAI,CAAC,CAAC;;IAGT,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;;IAG5C,KAAK,CAAC,SAAS,CAAC,YAAA;AACd,QAAA,IAAM,YAAY,GAAG,UAAU,CAAC,SAAS,CACvC,UAAC,GAAG,EAAA;AACM,YAAA,IAAA,OAAO,GAAK,OAAO,CAAA,OAAZ,CAAa;YAC5B,IAAI,OAAO,CAAC,KAAK,KAAK,IAAI,IAAI,OAAO,CAAC,MAAM,KAAK,GAAG,EAAE;AACpD,gBAAA,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;AACrB,gBAAA,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC;AACrB,gBAAA,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;AACzB,gBAAA,aAAa,EAAE,CAAC;AACjB,aAAA;SACF,EACD,UAAC,GAAG,EAAA;AACM,YAAA,IAAA,OAAO,GAAK,OAAO,CAAA,OAAZ,CAAa;AAC5B,YAAA,IAAI,OAAO,CAAC,KAAK,KAAK,GAAG,EAAE;AACzB,gBAAA,OAAO,CAAC,KAAK,GAAG,GAAG,CAAC;AACpB,gBAAA,aAAa,EAAE,CAAC;AACjB,aAAA;AACH,SAAC,CACF,CAAC;QACF,OAAO,OAAO,YAAY,KAAK,UAAU;cACrC,YAAY;cACZ,YAAY,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;KACjD,EAAE,IAAI,CAAC,CAAC;;;AAIT,IAAA,IAAI,OAAO,CAAC,OAAO,CAAC,KAAK;AAAE,QAAA,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;;AAGvD,IAAA,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;AAChC;;SC5HgB,YAAY,CAC1B,OAA6B,EAC7B,IAAY,EACZ,aAAwB,EAAA;AAExB,IAAA,OAAO,aAAa,CAClB,YAAA,EAAM,OAAA,SAAS,CAAC,OAAO,CAAC,CAAlB,EAAkB,EACxB,IAAI,IAAI,EAAE,EACV,aAAyB,CAC1B,CAAC;AACJ;;SCuBgB,cAAc,CAC5B,QAOK,EACL,KAAc,EACd,GAA0C,EAAA;AAE1C,IAAA,IAAI,CAAC,QAAQ;AACX,QAAA,MAAM,IAAI,SAAS,CACjB,0DAA0D,CAC3D,CAAC;AACJ,IAAA,IAAI,EAAS,CAAC;AACd,IAAA,IAAI,SAAS,CAAC,MAAM,IAAI,CAAC,EAAE;AACzB,QAAA,IAAI,EAAE,aAAa,IAAI,QAAQ,CAAC,EAAE;;;AAGhC,YAAA,MAAM,IAAI,SAAS,CACjB,sFAAsF,CACvF,CAAC;AACH,SAAA;QACD,IAAI,OAAO,KAAK,KAAK,QAAQ;AAC3B,YAAA,MAAM,IAAI,SAAS,CACjB,4EAA4E,CAC7E,CAAC;AACJ,QAAA,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;AACjC,YAAA,MAAM,IAAI,SAAS,CACjB,+EAA+E,CAChF,CAAC;QACJ,EAAE,GAAG,QAAQ,CAAC;AACf,KAAA;AAAM,SAAA;QACL,IAAI,QAAQ,YAAY,KAAK;AAC3B,YAAA,MAAM,IAAI,SAAS,CACjB,sFAAsF,CACvF,CAAC;AAEJ,QAAA,IACE,OAAO,QAAQ,CAAC,KAAK,KAAK,UAAU;AACpC,YAAA,OAAO,QAAQ,CAAC,EAAE,KAAK,QAAQ,EAC/B;AACA,YAAA,EAAE,GAAG,QAAQ,CAAC,EAAG,CAAC;YAClB,GAAG,GAAG,QAAQ,CAAC;AACf,YAAA,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;AAC1B,SAAA;AAAM,aAAA;YACL,MAAM,IAAI,SAAS,CACjB,yCAAyC;gBACvC,uDAAuD;AACvD,gBAAA,iEAAiE,CACpE,CAAC;AACH,SAAA;AACF,KAAA;AACD,IAAA,IAAI,EAAE,OAAO,IAAI,EAAE,CAAC;AAClB,QAAA,MAAM,IAAI,KAAK,CACb,+FAA+F,CAChG,CAAC;AACJ,IAAA,IAAI,EAAE,aAAa,IAAK,EAAU,CAAC,KAAK,CAAC;AACvC,QAAA,MAAM,IAAI,KAAK,CAAC,oFAAoF,CAAC,CAAA;AACvG,IAAA,OAAO,aAAa;;IAElB,YAAM,EAAA,OAAA,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC,CAAhC,EAAgC,EACtC,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAChC,CAAC;AACJ;;;;"}