@xylabs/indexed-db 4.4.32 → 4.4.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/dist/browser/IndexDescription.d.ts +30 -0
  2. package/dist/browser/IndexDescription.d.ts.map +1 -0
  3. package/dist/browser/IndexedDbKeyValueStore.d.ts +17 -0
  4. package/dist/browser/IndexedDbKeyValueStore.d.ts.map +1 -0
  5. package/dist/browser/ObjectStore.d.ts +5 -0
  6. package/dist/browser/ObjectStore.d.ts.map +1 -0
  7. package/dist/browser/checkDbNeedsUpgrade.d.ts +7 -0
  8. package/dist/browser/checkDbNeedsUpgrade.d.ts.map +1 -0
  9. package/dist/browser/createStoreDuringUpgrade.d.ts +5 -0
  10. package/dist/browser/createStoreDuringUpgrade.d.ts.map +1 -0
  11. package/dist/{neutral/createStore.d.ts → browser/getExistingIndexes.d.ts} +2 -2
  12. package/dist/browser/getExistingIndexes.d.ts.map +1 -0
  13. package/dist/browser/index.d.ts +11 -0
  14. package/dist/browser/index.d.ts.map +1 -0
  15. package/dist/browser/index.mjs +233 -0
  16. package/dist/browser/index.mjs.map +1 -0
  17. package/dist/browser/withDb.d.ts +6 -0
  18. package/dist/browser/withDb.d.ts.map +1 -0
  19. package/dist/browser/withReadOnlyStore.d.ts +6 -0
  20. package/dist/browser/withReadOnlyStore.d.ts.map +1 -0
  21. package/dist/browser/withReadWriteStore.d.ts +6 -0
  22. package/dist/browser/withReadWriteStore.d.ts.map +1 -0
  23. package/dist/browser/withStore.d.ts +8 -0
  24. package/dist/browser/withStore.d.ts.map +1 -0
  25. package/dist/neutral/IndexDescription.d.ts +0 -4
  26. package/dist/neutral/IndexDescription.d.ts.map +1 -1
  27. package/dist/neutral/IndexedDbKeyValueStore.d.ts +3 -3
  28. package/dist/neutral/IndexedDbKeyValueStore.d.ts.map +1 -1
  29. package/dist/neutral/checkDbNeedsUpgrade.d.ts +7 -0
  30. package/dist/neutral/checkDbNeedsUpgrade.d.ts.map +1 -0
  31. package/dist/neutral/createStoreDuringUpgrade.d.ts +5 -0
  32. package/dist/neutral/createStoreDuringUpgrade.d.ts.map +1 -0
  33. package/dist/neutral/getExistingIndexes.d.ts +2 -1
  34. package/dist/neutral/getExistingIndexes.d.ts.map +1 -1
  35. package/dist/neutral/index.d.ts +3 -1
  36. package/dist/neutral/index.d.ts.map +1 -1
  37. package/dist/neutral/index.mjs +131 -33
  38. package/dist/neutral/index.mjs.map +1 -1
  39. package/dist/neutral/withDb.d.ts +3 -1
  40. package/dist/neutral/withDb.d.ts.map +1 -1
  41. package/dist/neutral/withReadOnlyStore.d.ts +2 -1
  42. package/dist/neutral/withReadOnlyStore.d.ts.map +1 -1
  43. package/dist/neutral/withReadWriteStore.d.ts +2 -1
  44. package/dist/neutral/withReadWriteStore.d.ts.map +1 -1
  45. package/dist/neutral/withStore.d.ts +8 -0
  46. package/dist/neutral/withStore.d.ts.map +1 -0
  47. package/dist/node/IndexDescription.d.ts +30 -0
  48. package/dist/node/IndexDescription.d.ts.map +1 -0
  49. package/dist/node/IndexedDbKeyValueStore.d.ts +17 -0
  50. package/dist/node/IndexedDbKeyValueStore.d.ts.map +1 -0
  51. package/dist/node/ObjectStore.d.ts +5 -0
  52. package/dist/node/ObjectStore.d.ts.map +1 -0
  53. package/dist/node/checkDbNeedsUpgrade.d.ts +7 -0
  54. package/dist/node/checkDbNeedsUpgrade.d.ts.map +1 -0
  55. package/dist/node/createStoreDuringUpgrade.d.ts +5 -0
  56. package/dist/node/createStoreDuringUpgrade.d.ts.map +1 -0
  57. package/dist/node/getExistingIndexes.d.ts +7 -0
  58. package/dist/node/getExistingIndexes.d.ts.map +1 -0
  59. package/dist/node/index.d.ts +11 -0
  60. package/dist/node/index.d.ts.map +1 -0
  61. package/dist/node/index.mjs +233 -0
  62. package/dist/node/index.mjs.map +1 -0
  63. package/dist/node/withDb.d.ts +6 -0
  64. package/dist/node/withDb.d.ts.map +1 -0
  65. package/dist/node/withReadOnlyStore.d.ts +6 -0
  66. package/dist/node/withReadOnlyStore.d.ts.map +1 -0
  67. package/dist/node/withReadWriteStore.d.ts +6 -0
  68. package/dist/node/withReadWriteStore.d.ts.map +1 -0
  69. package/dist/node/withStore.d.ts +8 -0
  70. package/dist/node/withStore.d.ts.map +1 -0
  71. package/package.json +23 -9
  72. package/src/IndexDescription.ts +0 -4
  73. package/src/IndexedDbKeyValueStore.ts +3 -3
  74. package/src/checkDbNeedsUpgrade.ts +37 -0
  75. package/src/{createStore.ts → createStoreDuringUpgrade.ts} +17 -10
  76. package/src/getExistingIndexes.ts +39 -20
  77. package/src/index.ts +3 -1
  78. package/src/withDb.ts +50 -4
  79. package/src/withReadOnlyStore.ts +5 -8
  80. package/src/withReadWriteStore.ts +5 -8
  81. package/src/withStore.ts +34 -0
  82. package/xy.config.ts +2 -2
  83. package/dist/neutral/createStore.d.ts.map +0 -1
package/src/withDb.ts CHANGED
@@ -1,12 +1,58 @@
1
+ import type { Logger } from '@xylabs/logger'
1
2
  import type { EmptyObject } from '@xylabs/object'
2
- import type { DBSchema, IDBPDatabase } from 'idb'
3
+ import type {
4
+ DBSchema, IDBPDatabase, StoreNames,
5
+ } from 'idb'
3
6
  import { openDB } from 'idb'
4
7
 
5
- export async function withDb<T extends DBSchema = DBSchema, R = EmptyObject>(
8
+ import { checkDbNeedsUpgrade } from './checkDbNeedsUpgrade.ts'
9
+ import { createStoreDuringUpgrade } from './createStoreDuringUpgrade.ts'
10
+ import { buildStandardIndexName, type IndexDescription } from './IndexDescription.ts'
11
+
12
+ export async function withDb<DBTypes extends DBSchema | unknown = unknown, R = EmptyObject>(
6
13
  dbName: string,
7
- callback: (db: IDBPDatabase<T>) => Promise<R> | R,
14
+ callback: (db: IDBPDatabase<DBTypes>) => Promise<R> | R,
15
+ expectedIndexes?: Record<string, IndexDescription[]>,
16
+ logger?: Logger,
8
17
  ): Promise<R> {
9
- const db = await openDB<T>(dbName)
18
+ const versionToOpen = expectedIndexes === undefined ? undefined : await checkDbNeedsUpgrade(dbName, expectedIndexes, logger)
19
+ const db = await openDB<DBTypes>(dbName, versionToOpen, {
20
+ blocked(currentVersion, blockedVersion, event) {
21
+ logger?.warn(`IndexedDb: Blocked from upgrading from ${currentVersion} to ${blockedVersion}`, event)
22
+ },
23
+ blocking(currentVersion, blockedVersion, event) {
24
+ logger?.warn(`IndexedDb: Blocking upgrade from ${currentVersion} to ${blockedVersion}`, event)
25
+ },
26
+ terminated() {
27
+ logger?.log('IndexedDb: Terminated')
28
+ },
29
+ upgrade(db, oldVersion, newVersion, transaction) {
30
+ if (oldVersion !== newVersion) {
31
+ logger?.log(`IndexedDb: Upgrading from ${oldVersion} to ${newVersion}`)
32
+ const objectStores = transaction.objectStoreNames
33
+ for (const name of objectStores) {
34
+ try {
35
+ db.deleteObjectStore(name)
36
+ } catch {
37
+ console.log(`IndexedDb: Failed to delete existing object store ${name}`)
38
+ }
39
+ }
40
+ }
41
+ if (expectedIndexes) {
42
+ for (const [storeName, indexes] of Object.entries(expectedIndexes)) {
43
+ if (db.objectStoreNames.contains(storeName as StoreNames<DBTypes>)) {
44
+ continue
45
+ }
46
+ const indexesToCreate = indexes.map(idx => ({
47
+ ...idx,
48
+ name: buildStandardIndexName(idx),
49
+ // eslint-disable-next-line unicorn/no-array-reduce
50
+ })).reduce((acc, idx) => acc.set(idx.name, idx), new Map<string, IndexDescription>()).values()
51
+ createStoreDuringUpgrade(db, storeName as StoreNames<DBTypes>, [...indexesToCreate], logger)
52
+ }
53
+ }
54
+ },
55
+ })
10
56
  try {
11
57
  return await callback(db)
12
58
  } finally {
@@ -1,20 +1,17 @@
1
+ import type { Logger } from '@xylabs/logger'
1
2
  import type { EmptyObject } from '@xylabs/object'
2
3
  import type {
3
4
  IDBPDatabase, IDBPObjectStore, StoreNames,
4
5
  } from 'idb'
5
6
 
6
7
  import type { ObjectStore } from './ObjectStore.ts'
8
+ import { withStore } from './withStore.ts'
7
9
 
8
10
  export async function withReadOnlyStore<T extends EmptyObject = EmptyObject, R = T>(
9
11
  db: IDBPDatabase<ObjectStore<T>>,
10
12
  storeName: StoreNames<ObjectStore<T>>,
11
- callback: (store: IDBPObjectStore<ObjectStore<T>, [StoreNames<ObjectStore<T>>], StoreNames<ObjectStore<T>>, string>) => Promise<R> | R,
13
+ callback: (store: IDBPObjectStore<ObjectStore<T>, [StoreNames<ObjectStore<T>>], StoreNames<ObjectStore<T>>, 'readonly'> | null) => Promise<R> | R,
14
+ logger?: Logger,
12
15
  ): Promise<R> {
13
- const transaction = db.transaction(storeName, 'readonly')
14
- const store = transaction.objectStore(storeName)
15
- try {
16
- return await callback(store)
17
- } finally {
18
- await transaction.done
19
- }
16
+ return await withStore(db, storeName, callback, 'readonly', logger)
20
17
  }
@@ -1,20 +1,17 @@
1
+ import type { Logger } from '@xylabs/logger'
1
2
  import type { EmptyObject } from '@xylabs/object'
2
3
  import type {
3
4
  IDBPDatabase, IDBPObjectStore, StoreNames,
4
5
  } from 'idb'
5
6
 
6
7
  import type { ObjectStore } from './ObjectStore.ts'
8
+ import { withStore } from './withStore.ts'
7
9
 
8
10
  export async function withReadWriteStore<T extends EmptyObject = EmptyObject, R = T>(
9
11
  db: IDBPDatabase<ObjectStore<T>>,
10
12
  storeName: StoreNames<ObjectStore<T>>,
11
- callback: (store: IDBPObjectStore<ObjectStore<T>, [StoreNames<ObjectStore<T>>], StoreNames<ObjectStore<T>>, string>) => Promise<R> | R,
13
+ callback: (store: IDBPObjectStore<ObjectStore<T>, [StoreNames<ObjectStore<T>>], StoreNames<ObjectStore<T>>, 'readwrite'> | null) => Promise<R> | R,
14
+ logger?: Logger,
12
15
  ): Promise<R> {
13
- const transaction = db.transaction(storeName, 'readwrite')
14
- const store = transaction.objectStore(storeName)
15
- try {
16
- return await callback(store)
17
- } finally {
18
- await transaction.done
19
- }
16
+ return await withStore(db, storeName, callback, 'readwrite', logger)
20
17
  }
@@ -0,0 +1,34 @@
1
+ import type { Logger } from '@xylabs/logger'
2
+ import type { EmptyObject } from '@xylabs/object'
3
+ import type {
4
+ IDBPDatabase, IDBPObjectStore, IDBPTransaction, StoreNames,
5
+ } from 'idb'
6
+
7
+ import type { ObjectStore } from './ObjectStore.ts'
8
+
9
+ export async function withStore<T extends EmptyObject = EmptyObject, R = T, M extends 'readonly' | 'readwrite' = 'readonly'>(
10
+ db: IDBPDatabase<ObjectStore<T>>,
11
+ storeName: StoreNames<ObjectStore<T>>,
12
+ callback: (store: IDBPObjectStore<ObjectStore<T>,
13
+ [StoreNames<ObjectStore<T>>], StoreNames<ObjectStore<T>>, M> | null) => Promise<R> | R,
14
+ mode: M,
15
+ logger?: Logger,
16
+ ): Promise<R> {
17
+ logger?.log('withStore', storeName, mode)
18
+ let transaction: IDBPTransaction<ObjectStore<T>, [StoreNames<ObjectStore<T>>], M> | undefined = undefined
19
+ logger?.log('withStore:transaction')
20
+ let store = null
21
+ try {
22
+ transaction = db.transaction(storeName, mode)
23
+ // we do this in a try/catch because the store might not exist
24
+ store = transaction.objectStore(storeName)
25
+ } catch (ex) {
26
+ logger?.log('withStore:catch', ex)
27
+ }
28
+ try {
29
+ return await callback(store)
30
+ } finally {
31
+ logger?.log('withStore:finally')
32
+ await transaction?.done
33
+ }
34
+ }
package/xy.config.ts CHANGED
@@ -1,9 +1,9 @@
1
1
  import type { XyTsupConfig } from '@xylabs/ts-scripts-yarn3'
2
2
  const config: XyTsupConfig = {
3
3
  compile: {
4
- browser: {},
4
+ browser: { src: true },
5
5
  neutral: { src: true },
6
- node: {},
6
+ node: { src: true },
7
7
  },
8
8
  }
9
9
 
@@ -1 +0,0 @@
1
- {"version":3,"file":"createStore.d.ts","sourceRoot":"","sources":["../../src/createStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AACjD,OAAO,KAAK,EACV,YAAY,EAAc,UAAU,EACrC,MAAM,KAAK,CAAA;AAEZ,OAAO,EAEL,KAAK,gBAAgB,EACtB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAEnD,wBAAgB,WAAW,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW,EAC7D,EAAE,EAAE,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAChC,SAAS,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EACrC,OAAO,EAAE,gBAAgB,EAAE,EAC3B,MAAM,CAAC,EAAE,MAAM,QAoBhB"}