@livestore/livestore 0.0.41-dev.2 → 0.0.42-dev.0

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 (146) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/{inMemoryDatabase.d.ts → MainDatabaseWrapper.d.ts} +11 -18
  3. package/dist/MainDatabaseWrapper.d.ts.map +1 -0
  4. package/dist/{inMemoryDatabase.js → MainDatabaseWrapper.js} +26 -72
  5. package/dist/MainDatabaseWrapper.js.map +1 -0
  6. package/dist/__tests__/react/fixture.d.ts +41 -40
  7. package/dist/__tests__/react/fixture.d.ts.map +1 -1
  8. package/dist/__tests__/react/fixture.js +2 -8
  9. package/dist/__tests__/react/fixture.js.map +1 -1
  10. package/dist/cud.d.ts +9 -9
  11. package/dist/cud.d.ts.map +1 -1
  12. package/dist/cud.js +7 -8
  13. package/dist/cud.js.map +1 -1
  14. package/dist/effect/LiveStore.d.ts +10 -10
  15. package/dist/effect/LiveStore.d.ts.map +1 -1
  16. package/dist/effect/LiveStore.js +2 -11
  17. package/dist/effect/LiveStore.js.map +1 -1
  18. package/dist/global-state.d.ts +2 -2
  19. package/dist/global-state.d.ts.map +1 -1
  20. package/dist/global-state.js.map +1 -1
  21. package/dist/index.d.ts +6 -6
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +4 -3
  24. package/dist/index.js.map +1 -1
  25. package/dist/migrations.d.ts +5 -5
  26. package/dist/migrations.d.ts.map +1 -1
  27. package/dist/migrations.js +37 -21
  28. package/dist/migrations.js.map +1 -1
  29. package/dist/query-info.d.ts +8 -9
  30. package/dist/query-info.d.ts.map +1 -1
  31. package/dist/query-info.js +1 -1
  32. package/dist/query-info.js.map +1 -1
  33. package/dist/react/LiveStoreProvider.d.ts +7 -7
  34. package/dist/react/LiveStoreProvider.d.ts.map +1 -1
  35. package/dist/react/LiveStoreProvider.js +11 -19
  36. package/dist/react/LiveStoreProvider.js.map +1 -1
  37. package/dist/react/useRow.d.ts +6 -6
  38. package/dist/react/useRow.d.ts.map +1 -1
  39. package/dist/react/useRow.js +2 -2
  40. package/dist/react/useRow.js.map +1 -1
  41. package/dist/reactiveQueries/sql.js +2 -2
  42. package/dist/reactiveQueries/sql.js.map +1 -1
  43. package/dist/reactiveQueries/sql.test.js +12 -31
  44. package/dist/reactiveQueries/sql.test.js.map +1 -1
  45. package/dist/row-query.d.ts +6 -6
  46. package/dist/row-query.d.ts.map +1 -1
  47. package/dist/row-query.js +9 -12
  48. package/dist/row-query.js.map +1 -1
  49. package/dist/store.d.ts +18 -18
  50. package/dist/store.d.ts.map +1 -1
  51. package/dist/store.js +80 -86
  52. package/dist/store.js.map +1 -1
  53. package/dist/utils/bounded-collections.d.ts +1 -1
  54. package/dist/utils/bounded-collections.d.ts.map +1 -1
  55. package/dist/utils/bounded-collections.js +2 -1
  56. package/dist/utils/bounded-collections.js.map +1 -1
  57. package/dist/utils/util.d.ts +0 -16
  58. package/dist/utils/util.d.ts.map +1 -1
  59. package/dist/utils/util.js +0 -38
  60. package/dist/utils/util.js.map +1 -1
  61. package/package.json +8 -44
  62. package/src/{inMemoryDatabase.ts → MainDatabaseWrapper.ts} +40 -94
  63. package/src/__tests__/react/fixture.tsx +3 -9
  64. package/src/cud.ts +17 -16
  65. package/src/effect/LiveStore.ts +12 -24
  66. package/src/global-state.ts +3 -2
  67. package/src/index.ts +7 -23
  68. package/src/migrations.ts +51 -34
  69. package/src/query-info.ts +10 -9
  70. package/src/react/LiveStoreProvider.tsx +19 -27
  71. package/src/react/useRow.ts +24 -12
  72. package/src/reactiveQueries/sql.test.ts +12 -31
  73. package/src/reactiveQueries/sql.ts +2 -2
  74. package/src/row-query.ts +32 -29
  75. package/src/store.ts +98 -103
  76. package/src/utils/bounded-collections.ts +3 -2
  77. package/src/utils/util.ts +0 -44
  78. package/tsconfig.json +1 -1
  79. package/vitest.config.js +4 -0
  80. package/dist/inMemoryDatabase.d.ts.map +0 -1
  81. package/dist/inMemoryDatabase.js.map +0 -1
  82. package/dist/schema/index.d.ts +0 -42
  83. package/dist/schema/index.d.ts.map +0 -1
  84. package/dist/schema/index.js +0 -42
  85. package/dist/schema/index.js.map +0 -1
  86. package/dist/schema/mutations.d.ts +0 -81
  87. package/dist/schema/mutations.d.ts.map +0 -1
  88. package/dist/schema/mutations.js +0 -29
  89. package/dist/schema/mutations.js.map +0 -1
  90. package/dist/schema/parse-utils.d.ts +0 -6
  91. package/dist/schema/parse-utils.d.ts.map +0 -1
  92. package/dist/schema/parse-utils.js +0 -22
  93. package/dist/schema/parse-utils.js.map +0 -1
  94. package/dist/schema/system-tables.d.ts +0 -76
  95. package/dist/schema/system-tables.d.ts.map +0 -1
  96. package/dist/schema/system-tables.js +0 -11
  97. package/dist/schema/system-tables.js.map +0 -1
  98. package/dist/schema/table-def.d.ts +0 -100
  99. package/dist/schema/table-def.d.ts.map +0 -1
  100. package/dist/schema/table-def.js +0 -70
  101. package/dist/schema/table-def.js.map +0 -1
  102. package/dist/storage/in-memory/index.d.ts +0 -19
  103. package/dist/storage/in-memory/index.d.ts.map +0 -1
  104. package/dist/storage/in-memory/index.js +0 -16
  105. package/dist/storage/in-memory/index.js.map +0 -1
  106. package/dist/storage/index.d.ts +0 -18
  107. package/dist/storage/index.d.ts.map +0 -1
  108. package/dist/storage/index.js +0 -9
  109. package/dist/storage/index.js.map +0 -1
  110. package/dist/storage/tauri/index.d.ts +0 -23
  111. package/dist/storage/tauri/index.d.ts.map +0 -1
  112. package/dist/storage/tauri/index.js +0 -46
  113. package/dist/storage/tauri/index.js.map +0 -1
  114. package/dist/storage/utils/idb.d.ts +0 -11
  115. package/dist/storage/utils/idb.d.ts.map +0 -1
  116. package/dist/storage/utils/idb.js +0 -71
  117. package/dist/storage/utils/idb.js.map +0 -1
  118. package/dist/storage/web-worker/common.d.ts +0 -11
  119. package/dist/storage/web-worker/common.d.ts.map +0 -1
  120. package/dist/storage/web-worker/common.js +0 -2
  121. package/dist/storage/web-worker/common.js.map +0 -1
  122. package/dist/storage/web-worker/index.d.ts +0 -34
  123. package/dist/storage/web-worker/index.d.ts.map +0 -1
  124. package/dist/storage/web-worker/index.js +0 -134
  125. package/dist/storage/web-worker/index.js.map +0 -1
  126. package/dist/storage/web-worker/make-worker.d.ts +0 -20
  127. package/dist/storage/web-worker/make-worker.d.ts.map +0 -1
  128. package/dist/storage/web-worker/make-worker.js +0 -155
  129. package/dist/storage/web-worker/make-worker.js.map +0 -1
  130. package/dist/storage/web-worker/vite-dev-polyfill.d.ts +0 -2
  131. package/dist/storage/web-worker/vite-dev-polyfill.d.ts.map +0 -1
  132. package/dist/storage/web-worker/vite-dev-polyfill.js +0 -35
  133. package/dist/storage/web-worker/vite-dev-polyfill.js.map +0 -1
  134. package/src/schema/index.ts +0 -100
  135. package/src/schema/mutations.ts +0 -128
  136. package/src/schema/parse-utils.ts +0 -42
  137. package/src/schema/system-tables.ts +0 -21
  138. package/src/schema/table-def.ts +0 -270
  139. package/src/storage/in-memory/index.ts +0 -28
  140. package/src/storage/index.ts +0 -36
  141. package/src/storage/tauri/index.ts +0 -66
  142. package/src/storage/utils/idb.ts +0 -85
  143. package/src/storage/web-worker/common.ts +0 -6
  144. package/src/storage/web-worker/index.ts +0 -185
  145. package/src/storage/web-worker/make-worker.ts +0 -214
  146. package/src/storage/web-worker/vite-dev-polyfill.ts +0 -33
package/src/store.ts CHANGED
@@ -1,21 +1,20 @@
1
- import { assertNever, makeNoopSpan, makeNoopTracer, shouldNeverHappen } from '@livestore/utils'
1
+ import type { DatabaseFactory, DatabaseImpl, MainDatabase, PreparedBindValues } from '@livestore/common'
2
+ import { type LiveStoreSchema, makeMutationEventSchema, type MutationEvent } from '@livestore/common/schema'
3
+ import { assertNever, isPromise, makeNoopTracer, shouldNeverHappen } from '@livestore/utils'
2
4
  import { Schema } from '@livestore/utils/effect'
3
5
  import * as otel from '@opentelemetry/api'
4
6
  import type { GraphQLSchema } from 'graphql'
5
- import type * as Sqlite from 'sqlite-esm'
6
7
 
7
8
  import { dynamicallyRegisteredTables, globalDbGraph } from './global-state.js'
8
- import { InMemoryDatabase } from './inMemoryDatabase.js'
9
+ import { MainDatabaseWrapper } from './MainDatabaseWrapper.js'
9
10
  import { migrateDb } from './migrations.js'
10
11
  import type { StackInfo } from './react/utils/stack-info.js'
11
12
  import type { DebugRefreshReasonBase, ReactiveGraph, Ref } from './reactive.js'
12
13
  import type { DbContext, DbGraph, LiveQuery } from './reactiveQueries/base-class.js'
13
- import { type LiveStoreSchema, makeMutationEventSchema, type MutationEvent } from './schema/index.js'
14
- import type { Storage, StorageInit } from './storage/index.js'
15
14
  import { downloadBlob } from './utils/dev.js'
16
15
  import { getDurationMsFromSpan } from './utils/otel.js'
17
16
  import type { ParamsObject } from './utils/util.js'
18
- import { isPromise, prepareBindValues } from './utils/util.js'
17
+ import { prepareBindValues } from './utils/util.js'
19
18
 
20
19
  export type BaseGraphQLContext = {
21
20
  queriedTables: Set<string>
@@ -25,22 +24,21 @@ export type BaseGraphQLContext = {
25
24
 
26
25
  export type GraphQLOptions<TContext> = {
27
26
  schema: GraphQLSchema
28
- makeContext: (db: InMemoryDatabase, tracer: otel.Tracer) => TContext
27
+ makeContext: (db: MainDatabase, tracer: otel.Tracer) => TContext
29
28
  }
30
29
 
31
30
  export type StoreOptions<
32
31
  TGraphQLContext extends BaseGraphQLContext,
33
32
  TSchema extends LiveStoreSchema = LiveStoreSchema,
34
33
  > = {
35
- db: InMemoryDatabase
36
- /** A `Proxy`d version of `db` except that it also mirrors `execute` calls to the storage */
37
- dbProxy: InMemoryDatabase
34
+ db: DatabaseImpl
35
+ // /** A `Proxy`d version of `db` except that it also mirrors `execute` calls to the storage */
36
+ // dbProxy: InMemoryDatabase
38
37
  schema: TSchema
39
- storage?: Storage
40
38
  graphQLOptions?: GraphQLOptions<TGraphQLContext>
41
39
  otelTracer: otel.Tracer
42
40
  otelRootSpanContext: otel.Context
43
- dbGraph?: DbGraph
41
+ dbGraph: DbGraph
44
42
  }
45
43
 
46
44
  export type RefreshReason =
@@ -77,15 +75,23 @@ export type StoreOtel = {
77
75
  let storeCount = 0
78
76
  const uniqueStoreId = () => `store-${++storeCount}`
79
77
 
78
+ export type BootDb = {
79
+ execute(queryStr: string, bindValues?: ParamsObject): void
80
+ select<T>(queryStr: string, bindValues?: ParamsObject): ReadonlyArray<T>
81
+ txn(callback: () => void): void
82
+ }
83
+
80
84
  export class Store<
81
85
  TGraphQLContext extends BaseGraphQLContext = BaseGraphQLContext,
82
86
  TSchema extends LiveStoreSchema = LiveStoreSchema,
83
87
  > {
84
88
  id = uniqueStoreId()
85
89
  graph: ReactiveGraph<RefreshReason, QueryDebugInfo, DbContext>
86
- inMemoryDB: InMemoryDatabase
90
+ mainDbWrapper: MainDatabaseWrapper
87
91
  // TODO refactor
88
- _proxyDb: InMemoryDatabase
92
+ // _proxyDb: InMemoryDatabase
93
+ // TODO
94
+ db: DatabaseImpl
89
95
  schema: LiveStoreSchema
90
96
  graphQLSchema?: GraphQLSchema
91
97
  graphQLContext?: TGraphQLContext
@@ -98,22 +104,21 @@ export class Store<
98
104
 
99
105
  /** RC-based set to see which queries are currently subscribed to */
100
106
  activeQueries: ReferenceCountedSet<LiveQuery<any>>
101
- storage?: Storage
102
107
 
103
108
  private mutationArgsSchema
104
109
 
105
110
  private constructor({
106
111
  db,
107
- dbProxy,
112
+ // dbProxy,
108
113
  schema,
109
- storage,
110
114
  graphQLOptions,
111
115
  dbGraph,
112
116
  otelTracer,
113
117
  otelRootSpanContext,
114
118
  }: StoreOptions<TGraphQLContext, TSchema>) {
115
- this.inMemoryDB = db
116
- this._proxyDb = dbProxy
119
+ this.mainDbWrapper = new MainDatabaseWrapper({ otelTracer, otelRootSpanContext, db: db.mainDb })
120
+ this.db = db
121
+ // this._proxyDb = dbProxy
117
122
  this.schema = schema
118
123
 
119
124
  // TODO refactor
@@ -122,7 +127,7 @@ export class Store<
122
127
  // TODO generalize the `tableRefs` concept to allow finer-grained refs
123
128
  this.tableRefs = {}
124
129
  this.activeQueries = new ReferenceCountedSet()
125
- this.storage = storage
130
+ // this.storage = storage
126
131
 
127
132
  const mutationsSpan = otelTracer.startSpan('LiveStore:mutations', {}, otelRootSpanContext)
128
133
  const otelMuationsSpanContext = otel.trace.setSpan(otel.context.active(), mutationsSpan)
@@ -130,7 +135,7 @@ export class Store<
130
135
  const queriesSpan = otelTracer.startSpan('LiveStore:queries', {}, otelRootSpanContext)
131
136
  const otelQueriesSpanContext = otel.trace.setSpan(otel.context.active(), queriesSpan)
132
137
 
133
- this.graph = dbGraph ?? globalDbGraph
138
+ this.graph = dbGraph
134
139
  this.graph.context = { store: this as any, otelTracer, rootOtelContext: otelQueriesSpanContext }
135
140
 
136
141
  this.otel = {
@@ -156,7 +161,7 @@ export class Store<
156
161
 
157
162
  if (graphQLOptions) {
158
163
  this.graphQLSchema = graphQLOptions.schema
159
- this.graphQLContext = graphQLOptions.makeContext(db, this.otel.tracer)
164
+ this.graphQLContext = graphQLOptions.makeContext(db.mainDb, this.otel.tracer)
160
165
  }
161
166
  }
162
167
 
@@ -294,6 +299,7 @@ export class Store<
294
299
  writeTables.add(tableName)
295
300
  }
296
301
  } catch (e: any) {
302
+ debugger
297
303
  console.error(e, mutationEvent)
298
304
  }
299
305
  }
@@ -301,7 +307,7 @@ export class Store<
301
307
 
302
308
  if (mutationsEvents.length > 1) {
303
309
  // TODO: what to do about storage transaction here?
304
- this.inMemoryDB.txn(applyMutations)
310
+ this.mainDbWrapper.txn(applyMutations)
305
311
  } else {
306
312
  applyMutations()
307
313
  }
@@ -390,15 +396,15 @@ export class Store<
390
396
  const statementSql = typeof statementRes === 'string' ? statementRes : statementRes.sql
391
397
  const writeTables =
392
398
  typeof statementRes === 'string'
393
- ? this.inMemoryDB.getTablesUsed(statementSql)
394
- : statementRes.writeTables ?? this.inMemoryDB.getTablesUsed(statementSql)
399
+ ? this.mainDbWrapper.getTablesUsed(statementSql)
400
+ : statementRes.writeTables ?? this.mainDbWrapper.getTablesUsed(statementSql)
395
401
 
396
402
  const bindValues =
397
403
  typeof statementRes === 'string'
398
404
  ? Schema.encodeUnknownSync(mutationDef.schema)(mutationEvent.args)
399
405
  : statementRes.bindValues
400
406
 
401
- const { durationMs } = this.inMemoryDB.execute(
407
+ const { durationMs } = this.mainDbWrapper.execute(
402
408
  statementSql,
403
409
  prepareBindValues(bindValues ?? {}, statementSql),
404
410
  writeTables,
@@ -406,10 +412,8 @@ export class Store<
406
412
  )
407
413
 
408
414
  // Asynchronously apply mutation to a persistent storage (we're not awaiting this promise here)
409
- if (this.storage !== undefined) {
410
- const mutationEventEncoded = Schema.encodeUnknownSync(this.mutationArgsSchema)(mutationEvent)
411
- this.storage.mutate(mutationEventEncoded, span)
412
- }
415
+ const mutationEventEncoded = Schema.encodeUnknownSync(this.mutationArgsSchema)(mutationEvent)
416
+ this.db.storageDb.mutate(mutationEventEncoded, span)
413
417
 
414
418
  // Uncomment to print a list of queries currently registered on the store
415
419
  // console.debug(JSON.parse(JSON.stringify([...this.queries].map((q) => `${labelForKey(q.componentKey)}/${q.label}`))))
@@ -432,16 +436,14 @@ export class Store<
432
436
  writeTables?: ReadonlySet<string>,
433
437
  otelContext?: otel.Context,
434
438
  ) => {
435
- this.inMemoryDB.execute(query, prepareBindValues(params, query), writeTables, { otelContext })
439
+ this.mainDbWrapper.execute(query, prepareBindValues(params, query), writeTables, { otelContext })
436
440
 
437
- if (this.storage !== undefined) {
438
- const parentSpan = otel.trace.getSpan(otel.context.active())
439
- this.storage.execute(query, prepareBindValues(params, query), parentSpan)
440
- }
441
+ const parentSpan = otel.trace.getSpan(otel.context.active())
442
+ this.db.storageDb.execute(query, prepareBindValues(params, query), parentSpan)
441
443
  }
442
444
 
443
445
  select = (query: string, params: ParamsObject = {}) => {
444
- return this.inMemoryDB.select(query, { bindValues: prepareBindValues(params, query) })
446
+ return this.mainDbWrapper.select(query, { bindValues: prepareBindValues(params, query) })
445
447
  }
446
448
 
447
449
  makeTableRef = (tableName: string) =>
@@ -452,19 +454,17 @@ export class Store<
452
454
  })
453
455
 
454
456
  __devDownloadDb = () => {
455
- const data = this.inMemoryDB.export()
457
+ const data = this.mainDbWrapper.export()
456
458
  downloadBlob(data, `livestore-${Date.now()}.db`)
457
459
  }
458
460
 
459
461
  __devDownloadMutationLogDb = async () => {
460
- const data = await this.storage?.getMutationLogData()
461
- if (data !== undefined) {
462
- downloadBlob(data, `livestore-mutationlog-${Date.now()}.db`)
463
- }
462
+ const data = await this.db.storageDb.getMutationLogData()
463
+ downloadBlob(data, `livestore-mutationlog-${Date.now()}.db`)
464
464
  }
465
465
 
466
- // TODO allow for graceful store reset without requiring a full page reload
467
- dangerouslyResetStorage = () => this.storage?.dangerouslyReset()
466
+ // TODO allow for graceful store reset without requiring a full page reload (which should also call .boot)
467
+ dangerouslyResetStorage = () => this.db.storageDb.dangerouslyReset()
468
468
  }
469
469
 
470
470
  /** Create a new LiveStore Store */
@@ -473,91 +473,86 @@ export const createStore = async <
473
473
  TSchema extends LiveStoreSchema = LiveStoreSchema,
474
474
  >({
475
475
  schema,
476
- loadStorage,
477
476
  graphQLOptions,
478
477
  otelTracer = makeNoopTracer(),
479
478
  otelRootSpanContext = otel.context.active(),
480
- sqlite3,
479
+ makeDb,
481
480
  boot,
482
- dbGraph,
481
+ dbGraph = globalDbGraph,
482
+ batchUpdates,
483
483
  }: {
484
484
  schema: TSchema
485
- loadStorage: () => StorageInit | Promise<StorageInit>
486
485
  graphQLOptions?: GraphQLOptions<TGraphQLContext>
487
486
  otelTracer?: otel.Tracer
488
487
  otelRootSpanContext?: otel.Context
489
- sqlite3: Sqlite.Sqlite3Static
490
- boot?: (db: InMemoryDatabase, parentSpan: otel.Span) => unknown | Promise<unknown>
488
+ makeDb: DatabaseFactory
489
+ boot?: (db: BootDb, parentSpan: otel.Span) => unknown | Promise<unknown>
491
490
  dbGraph?: DbGraph
491
+ batchUpdates?: (run: () => void) => void
492
492
  }): Promise<Store<TGraphQLContext, TSchema>> => {
493
493
  return otelTracer.startActiveSpan('createStore', {}, otelRootSpanContext, async (span) => {
494
494
  try {
495
495
  const otelContext = otel.trace.setSpan(otel.context.active(), span)
496
496
 
497
- const storage = await otelTracer.startActiveSpan('storage:load', {}, otelContext, async (span) => {
497
+ const dbPromise = makeDb({ otelTracer, otelContext })
498
+ const db = dbPromise instanceof Promise ? await dbPromise : dbPromise
499
+
500
+ otelTracer.startActiveSpan('migrateDb', {}, otelContext, (span) => {
498
501
  try {
499
- const init = await loadStorage()
500
- const parentSpan = otel.trace.getSpan(otel.context.active()) ?? makeNoopSpan()
501
- return init({ otelTracer, parentSpan })
502
+ const otelContext = otel.trace.setSpan(otel.context.active(), span)
503
+ migrateDb({ db, schema, otelContext })
502
504
  } finally {
503
505
  span.end()
504
506
  }
505
507
  })
506
508
 
507
- const persistedData = await otelTracer.startActiveSpan(
508
- 'storage:getPersistedData',
509
- {},
510
- otelContext,
511
- async (span) => {
512
- try {
513
- return await storage.getPersistedData(span)
514
- } finally {
515
- span.end()
516
- }
517
- },
518
- )
519
-
520
- const db = InMemoryDatabase.load({ data: persistedData, otelTracer, otelRootSpanContext, sqlite3 })
521
-
522
- const txnKeywords = ['begin transaction;', 'commit;', 'rollback;']
523
- const isTxnQuery = (query: string) => txnKeywords.some((_) => query.toLowerCase().startsWith(_))
509
+ if (batchUpdates !== undefined) {
510
+ dbGraph.effectsWrapper = batchUpdates
511
+ }
524
512
 
525
- // Proxy to `db` that also mirrors `execute` calls to `storage`
526
- const dbProxy = new Proxy(db, {
527
- get: (db, prop, receiver) => {
528
- if (prop === 'execute') {
529
- const execute: InMemoryDatabase['execute'] = (query, bindValues, writeTables, options) => {
530
- if (isTxnQuery(query) === false) {
531
- storage.execute(query, bindValues, span)
532
- }
533
- return db.execute(query, bindValues, writeTables, options)
513
+ if (boot !== undefined) {
514
+ let isInTxn = false
515
+ const txnExecuteStmnts: [string, PreparedBindValues | undefined][] = []
516
+
517
+ const bootDbImpl: BootDb = {
518
+ execute: (queryStr, bindValues) => {
519
+ const stmt = db.mainDb.prepare(queryStr)
520
+ const preparedBindValues = bindValues ? prepareBindValues(bindValues, queryStr) : undefined
521
+ stmt.execute(preparedBindValues)
522
+
523
+ if (isInTxn === true) {
524
+ void db.storageDb.execute(queryStr, preparedBindValues, undefined)
525
+ } else {
526
+ txnExecuteStmnts.push([queryStr, preparedBindValues])
534
527
  }
535
- return execute
536
- } else if (prop === 'select') {
537
- // NOTE we're even proxying `select` calls here as some apps (e.g. Overtone) currently rely on this
538
- // TODO remove this once we've migrated all apps to use `execute` instead of `select`
539
- const select: InMemoryDatabase['select'] = (query, options = {}) => {
540
- storage.execute(query, options.bindValues as any)
541
- return db.select(query, options)
528
+ },
529
+ select: (queryStr, bindValues) => {
530
+ const stmt = db.mainDb.prepare(queryStr)
531
+ const preparedBindValues = bindValues ? prepareBindValues(bindValues, queryStr) : undefined
532
+ return stmt.select(preparedBindValues)
533
+ },
534
+ txn: (callback) => {
535
+ try {
536
+ isInTxn = true
537
+ db.mainDb.execute('BEGIN', undefined)
538
+
539
+ callback()
540
+
541
+ db.mainDb.execute('COMMIT', undefined)
542
+
543
+ db.storageDb.execute('BEGIN', undefined, undefined)
544
+ for (const [queryStr, bindValues] of txnExecuteStmnts) {
545
+ db.storageDb.execute(queryStr, bindValues, undefined)
546
+ }
547
+ db.storageDb.execute('COMMIT', undefined, undefined)
548
+ } catch (e: any) {
549
+ db.mainDb.execute('ROLLBACK', undefined)
550
+ throw e
542
551
  }
543
- return select
544
- } else {
545
- return Reflect.get(db, prop, receiver)
546
- }
547
- },
548
- })
549
-
550
- otelTracer.startActiveSpan('migrateDb', {}, otelContext, async (span) => {
551
- try {
552
- const otelContext = otel.trace.setSpan(otel.context.active(), span)
553
- migrateDb({ db: dbProxy, schema, otelContext })
554
- } finally {
555
- span.end()
552
+ },
556
553
  }
557
- })
558
554
 
559
- if (boot !== undefined) {
560
- const booting = boot(dbProxy, span)
555
+ const booting = boot(bootDbImpl, span)
561
556
  // NOTE only awaiting if it's actually a promise to avoid unnecessary async/await
562
557
  if (isPromise(booting)) {
563
558
  await booting
@@ -568,7 +563,7 @@ export const createStore = async <
568
563
  // Think about what to do about this case.
569
564
  // await applySchema(db, schema)
570
565
  return Store.createStore<TGraphQLContext, TSchema>(
571
- { db, dbProxy, schema, storage, graphQLOptions, otelTracer, otelRootSpanContext, dbGraph },
566
+ { db, schema, graphQLOptions, otelTracer, otelRootSpanContext, dbGraph },
572
567
  span,
573
568
  )
574
569
  } finally {
@@ -10,16 +10,17 @@ export default class BoundMap<K, V> {
10
10
  this.#sizeLimit = sizeLimit
11
11
  }
12
12
 
13
- onEvict: ((key: K) => void) | undefined
13
+ onEvict: ((key: K, value: V) => void) | undefined
14
14
 
15
15
  set = (key: K, value: V) => {
16
16
  this.#map.set(key, value)
17
17
  // console.log(this.#map.size, this.#sizeLimit);
18
18
  if (this.#map.size > this.#sizeLimit) {
19
19
  const firstKey = this.#map.keys().next().value
20
+ const deletedValue = this.#map.get(firstKey)!
20
21
  this.#map.delete(firstKey)
21
22
  if (this.onEvict) {
22
- this.onEvict(firstKey)
23
+ this.onEvict(firstKey, deletedValue)
23
24
  }
24
25
  }
25
26
  }
package/src/utils/util.ts CHANGED
@@ -11,20 +11,6 @@ export type Bindable = SqlValue[] | ParamsObject
11
11
 
12
12
  export type PreparedBindValues = Brand.Branded<Bindable, 'PreparedBindValues'>
13
13
 
14
- /**
15
- * This is a tag function for tagged literals.
16
- * it lets us get syntax highlighting on SQL queries in VSCode, but
17
- * doesn't do anything at runtime.
18
- * Code copied from: https://esdiscuss.org/topic/string-identity-template-tag
19
- */
20
- export const sql = (template: TemplateStringsArray, ...args: unknown[]): string => {
21
- let str = ''
22
- for (const [i, arg] of args.entries()) {
23
- str += template[i] + String(arg)
24
- }
25
- return str + template.at(-1)
26
- }
27
-
28
14
  /** Prepare bind values to send to SQLite
29
15
  /* Add $ to the beginning of keys; which we use as our interpolation syntax
30
16
  /* We also strip out any params that aren't used in the statement,
@@ -43,33 +29,3 @@ export const prepareBindValues = (values: Bindable, statement: string): Prepared
43
29
 
44
30
  return result as PreparedBindValues
45
31
  }
46
-
47
- /**
48
- * Use this to make assertion at end of if-else chain that all members of a
49
- * union have been accounted for.
50
- */
51
- /* eslint-disable-next-line prefer-arrow/prefer-arrow-functions */
52
- export function casesHandled(x: never): never {
53
- throw new Error(`A case was not handled for value: ${objectToString(x)}`)
54
- }
55
-
56
- export const objectToString = (error: any): string => {
57
- const stack = typeof process !== 'undefined' && process.env.CL_DEBUG ? error.stack : undefined
58
- const str = error.toString()
59
- const stackStr = stack ? `\n${stack}` : ''
60
- if (str !== '[object Object]') return str + stackStr
61
-
62
- try {
63
- return JSON.stringify({ ...error, stack }, null, 2)
64
- } catch (e: any) {
65
- console.log(error)
66
-
67
- return 'Error while printing error: ' + e
68
- }
69
- }
70
-
71
- export const isPromise = (value: any): value is Promise<unknown> => typeof value?.then === 'function'
72
-
73
- export const isReadonlyArray = <I, T>(value: ReadonlyArray<I> | T): value is ReadonlyArray<I> => Array.isArray(value)
74
-
75
- export const isIterable = <T>(value: any): value is Iterable<T> => typeof value?.[Symbol.iterator] === 'function'
package/tsconfig.json CHANGED
@@ -9,5 +9,5 @@
9
9
  "tsBuildInfoFile": "./dist/.tsbuildinfo"
10
10
  },
11
11
  "include": ["./src"],
12
- "references": [{ "path": "../../effect-db-schema" }, { "path": "../sql-queries" }, { "path": "../utils" }]
12
+ "references": [{ "path": "../../effect-db-schema" }, { "path": "../common" }, { "path": "../web" }, { "path": "../utils" }]
13
13
  }
package/vitest.config.js CHANGED
@@ -5,6 +5,10 @@ export default defineConfig({
5
5
  // Needed for React hook tests
6
6
  environment: 'jsdom',
7
7
  },
8
+ esbuild: {
9
+ // TODO remove once `using` keyword supported OOTB with Vite https://github.com/vitejs/vite/issues/15464#issuecomment-1872485703
10
+ target: 'es2020',
11
+ },
8
12
  resolve: {
9
13
  alias: {
10
14
  'sqlite-esm': 'sqlite-esm/node',
@@ -1 +0,0 @@
1
- {"version":3,"file":"inMemoryDatabase.d.ts","sourceRoot":"","sources":["../src/inMemoryDatabase.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAC/C,OAAO,KAAK,KAAK,MAAM,MAAM,YAAY,CAAA;AAKzC,OAAiB,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAA;AAErE,OAAO,KAAK,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAEnE,KAAK,gBAAgB,GAAG,MAAM,CAAC,QAAQ,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAA;CAAE,CAAA;AAE/D,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,UAAU,CAAC,aAAa,CAAC,CAAA;IACtC,kBAAkB,EAAE,MAAM,CAAA;IAC1B,eAAe,EAAE,MAAM,CAAA;IACvB,MAAM,EAAE,UAAU,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAA;CACzE;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,EAAE,MAAM;IAChB,UAAU,EAAE,kBAAkB,GAAG,SAAS;IAC1C,UAAU,EAAE,MAAM;IAClB,SAAS,EAAE,MAAM,GAAG,SAAS;IAC7B,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC;IAC1B,gBAAgB,EAAE,mBAAmB;CACtC,CAAA;AAED,eAAO,MAAM,cAAc,QAAO,SAKhC,CAAA;AAEF,qBAAa,gBAAgB;IASzB,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,mBAAmB;IACpB,GAAG,EAAE,MAAM,CAAC,aAAa;IAVlC,OAAO,CAAC,WAAW,CAAsD;IACzE,OAAO,CAAC,eAAe,CAAyC;IAChE,OAAO,CAAC,WAAW,CAAmB;IACtC,OAAO,CAAC,cAAc,CAAA;IACf,SAAS,EAAE,SAAS,CAAmB;gBAGpC,EAAE,EAAE,gBAAgB,EACpB,UAAU,EAAE,IAAI,CAAC,MAAM,EACvB,mBAAmB,EAAE,IAAI,CAAC,OAAO,EAClC,GAAG,EAAE,MAAM,CAAC,aAAa;IAOlC,MAAM,CAAC,IAAI,CAAC,EACV,IAAI,EACJ,UAAU,EACV,mBAAmB,EACnB,OAAO,GACR,EAAE;QACD,IAAI,EAAE,UAAU,GAAG,SAAS,CAAA;QAC5B,UAAU,EAAE,IAAI,CAAC,MAAM,CAAA;QACvB,mBAAmB,EAAE,IAAI,CAAC,OAAO,CAAA;QACjC,OAAO,EAAE,MAAM,CAAC,aAAa,CAAA;KAC9B,GAAG,gBAAgB;IA4BpB,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI;IAoBrC,aAAa,CAAC,KAAK,EAAE,MAAM;IAsB3B,OAAO,CACL,KAAK,EAAE,MAAM,EACb,UAAU,CAAC,EAAE,kBAAkB,EAC/B,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,EACjC,OAAO,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAC;QAAC,WAAW,CAAC,EAAE,IAAI,CAAC,OAAO,CAAA;KAAE,GAC/D;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE;IA8DzB,MAAM,CAAC,CAAC,GAAG,GAAG,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;QACR,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;QAC3B,UAAU,CAAC,EAAE,kBAAkB,CAAA;QAC/B,SAAS,CAAC,EAAE,OAAO,CAAA;QACnB,WAAW,CAAC,EAAE,IAAI,CAAC,OAAO,CAAA;KAC3B,GACA,aAAa,CAAC,CAAC,CAAC;IA4FnB,MAAM;CAQP"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"inMemoryDatabase.js","sourceRoot":"","sources":["../src/inMemoryDatabase.ts"],"names":[],"mappings":"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"}
@@ -1,42 +0,0 @@
1
- import type { SqliteDsl } from 'effect-db-schema';
2
- import { type MutationDef, type MutationDefMap, type MutationDefRecord, type RawSqlMutation } from './mutations.js';
3
- import type { TableDef } from './table-def.js';
4
- export * from './system-tables.js';
5
- export * as DbSchema from './table-def.js';
6
- export * as ParseUtils from './parse-utils.js';
7
- export * from './mutations.js';
8
- export type LiveStoreSchema<TDbSchema extends SqliteDsl.DbSchema = SqliteDsl.DbSchema, TMutationsDefRecord extends MutationDefRecord = MutationDefRecord> = {
9
- /** Only used on type-level */
10
- readonly _DbSchemaType: TDbSchema;
11
- /** Only used on type-level */
12
- readonly _MutationDefMapType: TMutationsDefRecord;
13
- readonly tables: Map<string, TableDef>;
14
- readonly mutations: MutationDefMap;
15
- };
16
- export type InputSchema = {
17
- readonly tables: Record<string, TableDef> | ReadonlyArray<TableDef>;
18
- readonly mutations?: ReadonlyArray<MutationDef.Any> | Record<string, MutationDef.Any>;
19
- };
20
- export declare const makeSchema: <TInputSchema extends InputSchema>(schema: TInputSchema) => LiveStoreSchema<DbSchemaFromInputSchemaTables<TInputSchema["tables"]>, MutationDefRecordFromInputSchemaMutations<TInputSchema["mutations"]>>;
21
- /**
22
- * In case of ...
23
- * - array: we use the table name of each array item (= table definition) as the object key
24
- * - object: we discard the keys of the input object and use the table name of each object value (= table definition) as the new object key
25
- */
26
- export type DbSchemaFromInputSchemaTables<TTables extends InputSchema['tables']> = TTables extends ReadonlyArray<TableDef> ? {
27
- [K in TTables[number] as K['sqliteDef']['name']]: K['sqliteDef'];
28
- } : TTables extends Record<string, TableDef> ? {
29
- [K in keyof TTables as TTables[K]['sqliteDef']['name']]: TTables[K]['sqliteDef'];
30
- } : never;
31
- export type MutationDefRecordFromInputSchemaMutations<TMutations extends InputSchema['mutations']> = TMutations extends ReadonlyArray<MutationDef.Any> ? {
32
- [K in TMutations[number] as K['name']]: K;
33
- } & {
34
- 'livestore.RawSql': RawSqlMutation;
35
- } : TMutations extends {
36
- [name: string]: MutationDef.Any;
37
- } ? {
38
- [K in keyof TMutations as TMutations[K]['name']]: TMutations[K];
39
- } & {
40
- 'livestore.RawSql': RawSqlMutation;
41
- } : never;
42
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/schema/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAGjD,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EAEpB,MAAM,gBAAgB,CAAA;AAEvB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAE9C,cAAc,oBAAoB,CAAA;AAClC,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAA;AAC1C,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAA;AAC9C,cAAc,gBAAgB,CAAA;AAE9B,MAAM,MAAM,eAAe,CACzB,SAAS,SAAS,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,QAAQ,EACzD,mBAAmB,SAAS,iBAAiB,GAAG,iBAAiB,IAC/D;IACF,8BAA8B;IAC9B,QAAQ,CAAC,aAAa,EAAE,SAAS,CAAA;IACjC,8BAA8B;IAC9B,QAAQ,CAAC,mBAAmB,EAAE,mBAAmB,CAAA;IAEjD,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IACtC,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAA;CACnC,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAA;IACnE,QAAQ,CAAC,SAAS,CAAC,EAAE,aAAa,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,CAAA;CACtF,CAAA;AAED,eAAO,MAAM,UAAU,0MA2CtB,CAAA;AAED;;;;GAIG;AACH,MAAM,MAAM,6BAA6B,CAAC,OAAO,SAAS,WAAW,CAAC,QAAQ,CAAC,IAC7E,OAAO,SAAS,aAAa,CAAC,QAAQ,CAAC,GACnC;KAAG,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC;CAAE,GACpE,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GACtC;KAAG,CAAC,IAAI,MAAM,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;CAAE,GACpF,KAAK,CAAA;AAEb,MAAM,MAAM,yCAAyC,CAAC,UAAU,SAAS,WAAW,CAAC,WAAW,CAAC,IAC/F,UAAU,SAAS,aAAa,CAAC,WAAW,CAAC,GAAG,CAAC,GAC7C;KAAG,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;CAAE,GAAG;IAAE,kBAAkB,EAAE,cAAc,CAAA;CAAE,GACtF,UAAU,SAAS;IAAE,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC,GAAG,CAAA;CAAE,GACpD;KAAG,CAAC,IAAI,MAAM,UAAU,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC;CAAE,GAAG;IAAE,kBAAkB,EAAE,cAAc,CAAA;CAAE,GAC5G,KAAK,CAAA"}
@@ -1,42 +0,0 @@
1
- import { isReadonlyArray } from '../utils/util.js';
2
- import { rawSqlMutation, } from './mutations.js';
3
- import { systemTables } from './system-tables.js';
4
- export * from './system-tables.js';
5
- export * as DbSchema from './table-def.js';
6
- export * as ParseUtils from './parse-utils.js';
7
- export * from './mutations.js';
8
- export const makeSchema = (
9
- /** Note when using the object-notation for tables/mutations, the object keys are ignored and not used as table/mutation names */
10
- schema) => {
11
- const inputTables = Array.isArray(schema.tables)
12
- ? schema.tables
13
- : // TODO validate that table names are unique in this case
14
- Object.values(schema.tables);
15
- const tables = new Map();
16
- for (const tableDef of inputTables) {
17
- // TODO validate tables (e.g. index names are unique)
18
- tables.set(tableDef.sqliteDef.ast.name, tableDef);
19
- }
20
- for (const tableDef of systemTables) {
21
- tables.set(tableDef.sqliteDef.name, tableDef);
22
- }
23
- const mutations = new Map();
24
- if (isReadonlyArray(schema.mutations)) {
25
- for (const mutation of schema.mutations) {
26
- mutations.set(mutation.name, mutation);
27
- }
28
- }
29
- else {
30
- for (const [name, mutation] of Object.entries(schema.mutations ?? {})) {
31
- mutations.set(name, mutation);
32
- }
33
- }
34
- mutations.set('livestore.RawSql', rawSqlMutation);
35
- return {
36
- _DbSchemaType: Symbol('livestore.DbSchemaType'),
37
- _MutationDefMapType: Symbol('livestore.MutationDefMapType'),
38
- tables,
39
- mutations,
40
- };
41
- };
42
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/schema/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,EAKL,cAAc,GACf,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAGjD,cAAc,oBAAoB,CAAA;AAClC,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAA;AAC1C,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAA;AAC9C,cAAc,gBAAgB,CAAA;AAoB9B,MAAM,CAAC,MAAM,UAAU,GAAG;AACxB,iIAAiI;AACjI,MAAoB,EAIpB,EAAE;IACF,MAAM,WAAW,GAA4B,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;QACvE,CAAC,CAAC,MAAM,CAAC,MAAM;QACf,CAAC,CAAC,yDAAyD;YACzD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IAEhC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoB,CAAA;IAE1C,KAAK,MAAM,QAAQ,IAAI,WAAW,EAAE,CAAC;QACnC,qDAAqD;QACrD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;IACnD,CAAC;IAED,KAAK,MAAM,QAAQ,IAAI,YAAY,EAAE,CAAC;QACpC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;IAC/C,CAAC;IAED,MAAM,SAAS,GAAmB,IAAI,GAAG,EAAE,CAAA;IAE3C,IAAI,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;QACtC,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACxC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;QACxC,CAAC;IACH,CAAC;SAAM,CAAC;QACN,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC,EAAE,CAAC;YACtE,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;QAC/B,CAAC;IACH,CAAC;IAED,SAAS,CAAC,GAAG,CAAC,kBAAkB,EAAE,cAAc,CAAC,CAAA;IAEjD,OAAO;QACL,aAAa,EAAE,MAAM,CAAC,wBAAwB,CAAQ;QACtD,mBAAmB,EAAE,MAAM,CAAC,8BAA8B,CAAQ;QAClE,MAAM;QACN,SAAS;KACgB,CAAA;AAC7B,CAAC,CAAA"}