@livestore/livestore 0.0.41 → 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.
- package/dist/.tsbuildinfo +1 -1
- package/dist/{inMemoryDatabase.d.ts → MainDatabaseWrapper.d.ts} +11 -18
- package/dist/MainDatabaseWrapper.d.ts.map +1 -0
- package/dist/{inMemoryDatabase.js → MainDatabaseWrapper.js} +26 -72
- package/dist/MainDatabaseWrapper.js.map +1 -0
- package/dist/__tests__/react/fixture.d.ts +41 -40
- package/dist/__tests__/react/fixture.d.ts.map +1 -1
- package/dist/__tests__/react/fixture.js +2 -8
- package/dist/__tests__/react/fixture.js.map +1 -1
- package/dist/cud.d.ts +9 -9
- package/dist/cud.d.ts.map +1 -1
- package/dist/cud.js +7 -8
- package/dist/cud.js.map +1 -1
- package/dist/effect/LiveStore.d.ts +10 -10
- package/dist/effect/LiveStore.d.ts.map +1 -1
- package/dist/effect/LiveStore.js +2 -11
- package/dist/effect/LiveStore.js.map +1 -1
- package/dist/global-state.d.ts +2 -2
- package/dist/global-state.d.ts.map +1 -1
- package/dist/global-state.js.map +1 -1
- package/dist/index.d.ts +6 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -3
- package/dist/index.js.map +1 -1
- package/dist/migrations.d.ts +5 -5
- package/dist/migrations.d.ts.map +1 -1
- package/dist/migrations.js +37 -21
- package/dist/migrations.js.map +1 -1
- package/dist/query-info.d.ts +8 -9
- package/dist/query-info.d.ts.map +1 -1
- package/dist/query-info.js +1 -1
- package/dist/query-info.js.map +1 -1
- package/dist/react/LiveStoreProvider.d.ts +7 -7
- package/dist/react/LiveStoreProvider.d.ts.map +1 -1
- package/dist/react/LiveStoreProvider.js +11 -19
- package/dist/react/LiveStoreProvider.js.map +1 -1
- package/dist/react/useRow.d.ts +6 -6
- package/dist/react/useRow.d.ts.map +1 -1
- package/dist/react/useRow.js +2 -2
- package/dist/react/useRow.js.map +1 -1
- package/dist/reactiveQueries/sql.js +2 -2
- package/dist/reactiveQueries/sql.js.map +1 -1
- package/dist/reactiveQueries/sql.test.js +12 -31
- package/dist/reactiveQueries/sql.test.js.map +1 -1
- package/dist/row-query.d.ts +6 -6
- package/dist/row-query.d.ts.map +1 -1
- package/dist/row-query.js +9 -12
- package/dist/row-query.js.map +1 -1
- package/dist/store.d.ts +18 -18
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +80 -86
- package/dist/store.js.map +1 -1
- package/dist/utils/bounded-collections.d.ts +1 -1
- package/dist/utils/bounded-collections.d.ts.map +1 -1
- package/dist/utils/bounded-collections.js +2 -1
- package/dist/utils/bounded-collections.js.map +1 -1
- package/dist/utils/util.d.ts +0 -16
- package/dist/utils/util.d.ts.map +1 -1
- package/dist/utils/util.js +0 -38
- package/dist/utils/util.js.map +1 -1
- package/package.json +8 -44
- package/src/{inMemoryDatabase.ts → MainDatabaseWrapper.ts} +40 -94
- package/src/__tests__/react/fixture.tsx +3 -9
- package/src/cud.ts +17 -16
- package/src/effect/LiveStore.ts +12 -24
- package/src/global-state.ts +3 -2
- package/src/index.ts +7 -23
- package/src/migrations.ts +51 -34
- package/src/query-info.ts +10 -9
- package/src/react/LiveStoreProvider.tsx +19 -27
- package/src/react/useRow.ts +24 -12
- package/src/reactiveQueries/sql.test.ts +12 -31
- package/src/reactiveQueries/sql.ts +2 -2
- package/src/row-query.ts +32 -29
- package/src/store.ts +98 -103
- package/src/utils/bounded-collections.ts +3 -2
- package/src/utils/util.ts +0 -44
- package/tsconfig.json +1 -1
- package/vitest.config.js +4 -0
- package/dist/inMemoryDatabase.d.ts.map +0 -1
- package/dist/inMemoryDatabase.js.map +0 -1
- package/dist/schema/index.d.ts +0 -42
- package/dist/schema/index.d.ts.map +0 -1
- package/dist/schema/index.js +0 -42
- package/dist/schema/index.js.map +0 -1
- package/dist/schema/mutations.d.ts +0 -81
- package/dist/schema/mutations.d.ts.map +0 -1
- package/dist/schema/mutations.js +0 -29
- package/dist/schema/mutations.js.map +0 -1
- package/dist/schema/parse-utils.d.ts +0 -6
- package/dist/schema/parse-utils.d.ts.map +0 -1
- package/dist/schema/parse-utils.js +0 -22
- package/dist/schema/parse-utils.js.map +0 -1
- package/dist/schema/system-tables.d.ts +0 -76
- package/dist/schema/system-tables.d.ts.map +0 -1
- package/dist/schema/system-tables.js +0 -11
- package/dist/schema/system-tables.js.map +0 -1
- package/dist/schema/table-def.d.ts +0 -100
- package/dist/schema/table-def.d.ts.map +0 -1
- package/dist/schema/table-def.js +0 -70
- package/dist/schema/table-def.js.map +0 -1
- package/dist/storage/in-memory/index.d.ts +0 -19
- package/dist/storage/in-memory/index.d.ts.map +0 -1
- package/dist/storage/in-memory/index.js +0 -16
- package/dist/storage/in-memory/index.js.map +0 -1
- package/dist/storage/index.d.ts +0 -18
- package/dist/storage/index.d.ts.map +0 -1
- package/dist/storage/index.js +0 -9
- package/dist/storage/index.js.map +0 -1
- package/dist/storage/tauri/index.d.ts +0 -23
- package/dist/storage/tauri/index.d.ts.map +0 -1
- package/dist/storage/tauri/index.js +0 -46
- package/dist/storage/tauri/index.js.map +0 -1
- package/dist/storage/utils/idb.d.ts +0 -11
- package/dist/storage/utils/idb.d.ts.map +0 -1
- package/dist/storage/utils/idb.js +0 -71
- package/dist/storage/utils/idb.js.map +0 -1
- package/dist/storage/web-worker/common.d.ts +0 -11
- package/dist/storage/web-worker/common.d.ts.map +0 -1
- package/dist/storage/web-worker/common.js +0 -2
- package/dist/storage/web-worker/common.js.map +0 -1
- package/dist/storage/web-worker/index.d.ts +0 -34
- package/dist/storage/web-worker/index.d.ts.map +0 -1
- package/dist/storage/web-worker/index.js +0 -134
- package/dist/storage/web-worker/index.js.map +0 -1
- package/dist/storage/web-worker/make-worker.d.ts +0 -20
- package/dist/storage/web-worker/make-worker.d.ts.map +0 -1
- package/dist/storage/web-worker/make-worker.js +0 -155
- package/dist/storage/web-worker/make-worker.js.map +0 -1
- package/dist/storage/web-worker/vite-dev-polyfill.d.ts +0 -2
- package/dist/storage/web-worker/vite-dev-polyfill.d.ts.map +0 -1
- package/dist/storage/web-worker/vite-dev-polyfill.js +0 -35
- package/dist/storage/web-worker/vite-dev-polyfill.js.map +0 -1
- package/src/schema/index.ts +0 -100
- package/src/schema/mutations.ts +0 -128
- package/src/schema/parse-utils.ts +0 -42
- package/src/schema/system-tables.ts +0 -21
- package/src/schema/table-def.ts +0 -270
- package/src/storage/in-memory/index.ts +0 -28
- package/src/storage/index.ts +0 -36
- package/src/storage/tauri/index.ts +0 -66
- package/src/storage/utils/idb.ts +0 -85
- package/src/storage/web-worker/common.ts +0 -6
- package/src/storage/web-worker/index.ts +0 -185
- package/src/storage/web-worker/make-worker.ts +0 -214
- package/src/storage/web-worker/vite-dev-polyfill.ts +0 -33
package/src/store.ts
CHANGED
|
@@ -1,21 +1,20 @@
|
|
|
1
|
-
import {
|
|
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 {
|
|
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 {
|
|
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:
|
|
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:
|
|
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
|
|
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
|
-
|
|
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.
|
|
116
|
-
this.
|
|
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
|
|
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.
|
|
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.
|
|
394
|
-
: statementRes.writeTables ?? this.
|
|
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.
|
|
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
|
-
|
|
410
|
-
|
|
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.
|
|
439
|
+
this.mainDbWrapper.execute(query, prepareBindValues(params, query), writeTables, { otelContext })
|
|
436
440
|
|
|
437
|
-
|
|
438
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
461
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
490
|
-
boot?: (db:
|
|
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
|
|
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
|
|
500
|
-
|
|
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
|
-
|
|
508
|
-
|
|
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
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
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
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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": "../
|
|
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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"}
|
package/dist/schema/index.d.ts
DELETED
|
@@ -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"}
|
package/dist/schema/index.js
DELETED
|
@@ -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
|
package/dist/schema/index.js.map
DELETED
|
@@ -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"}
|