@livestore/common 0.4.0-dev.14 → 0.4.0-dev.16
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/adapter-types.d.ts +4 -2
- package/dist/adapter-types.d.ts.map +1 -1
- package/dist/debug-info.d.ts.map +1 -1
- package/dist/debug-info.js +33 -6
- package/dist/debug-info.js.map +1 -1
- package/dist/devtools/devtools-messages-client-session.d.ts +21 -21
- package/dist/devtools/devtools-messages-common.d.ts +6 -6
- package/dist/devtools/devtools-messages-leader.d.ts +24 -24
- package/dist/devtools/devtools-sessioninfo.d.ts +2 -2
- package/dist/devtools/devtools-sessioninfo.d.ts.map +1 -1
- package/dist/devtools/devtools-sessioninfo.js +1 -4
- package/dist/devtools/devtools-sessioninfo.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.d.ts +5 -4
- package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.js +4 -3
- package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
- package/dist/logging.d.ts +40 -0
- package/dist/logging.d.ts.map +1 -0
- package/dist/logging.js +33 -0
- package/dist/logging.js.map +1 -0
- package/dist/schema/state/sqlite/column-def.test.js +19 -1
- package/dist/schema/state/sqlite/column-def.test.js.map +1 -1
- package/dist/schema/state/sqlite/column-spec.d.ts.map +1 -1
- package/dist/schema/state/sqlite/column-spec.js +30 -12
- package/dist/schema/state/sqlite/column-spec.js.map +1 -1
- package/dist/schema/state/sqlite/column-spec.test.js +23 -14
- package/dist/schema/state/sqlite/column-spec.test.js.map +1 -1
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts +14 -8
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts.map +1 -1
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js +5 -3
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js.map +1 -1
- package/dist/schema/state/sqlite/schema-helpers.d.ts +2 -2
- package/dist/schema/state/sqlite/schema-helpers.d.ts.map +1 -1
- package/dist/schema/state/sqlite/schema-helpers.js +22 -12
- package/dist/schema/state/sqlite/schema-helpers.js.map +1 -1
- package/dist/schema/state/sqlite/schema-helpers.test.d.ts +2 -0
- package/dist/schema/state/sqlite/schema-helpers.test.d.ts.map +1 -0
- package/dist/schema/state/sqlite/schema-helpers.test.js +36 -0
- package/dist/schema/state/sqlite/schema-helpers.test.js.map +1 -0
- package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.d.ts +2 -0
- package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.d.ts.map +1 -0
- package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js +73 -0
- package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js.map +1 -0
- package/dist/schema-management/migrations.js +6 -4
- package/dist/schema-management/migrations.js.map +1 -1
- package/dist/sql-queries/sql-queries.d.ts.map +1 -1
- package/dist/sql-queries/sql-queries.js +11 -1
- package/dist/sql-queries/sql-queries.js.map +1 -1
- package/dist/sync/sync-backend.d.ts +3 -3
- package/dist/sync/sync-backend.d.ts.map +1 -1
- package/dist/sync/sync.d.ts +3 -2
- package/dist/sync/sync.d.ts.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +4 -4
- package/src/adapter-types.ts +4 -2
- package/src/debug-info.ts +37 -6
- package/src/devtools/devtools-sessioninfo.ts +2 -5
- package/src/index.ts +1 -0
- package/src/leader-thread/make-leader-thread-layer.ts +10 -4
- package/src/logging.ts +62 -0
- package/src/schema/state/sqlite/column-def.test.ts +24 -1
- package/src/schema/state/sqlite/column-spec.test.ts +29 -16
- package/src/schema/state/sqlite/column-spec.ts +36 -11
- package/src/schema/state/sqlite/db-schema/dsl/field-defs.ts +29 -12
- package/src/schema/state/sqlite/schema-helpers.test.ts +44 -0
- package/src/schema/state/sqlite/schema-helpers.ts +28 -20
- package/src/schema-management/__tests__/migrations-autoincrement-quoting.test.ts +86 -0
- package/src/schema-management/migrations.ts +6 -4
- package/src/sql-queries/sql-queries.ts +9 -1
- package/src/sync/sync-backend.ts +4 -4
- package/src/sync/sync.ts +3 -2
- package/src/version.ts +1 -1
- package/dist/schema/state/sqlite/system-tables.d.ts +0 -976
- package/dist/schema/state/sqlite/system-tables.d.ts.map +0 -1
- package/dist/schema/state/sqlite/system-tables.js +0 -81
- package/dist/schema/state/sqlite/system-tables.js.map +0 -1
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { Effect, Option, Schema } from '@livestore/utils/effect'
|
|
2
|
+
import { describe, expect, it } from 'vitest'
|
|
3
|
+
import { SqliteAst } from '../../schema/state/sqlite/db-schema/mod.ts'
|
|
4
|
+
import type { PreparedStatement, SqliteDb } from '../../sqlite-types.ts'
|
|
5
|
+
import type { PreparedBindValues } from '../../util.ts'
|
|
6
|
+
import { migrateTable } from '../migrations.ts'
|
|
7
|
+
|
|
8
|
+
const makeStubDb = () => {
|
|
9
|
+
const executed: string[] = []
|
|
10
|
+
|
|
11
|
+
const db: SqliteDb = {
|
|
12
|
+
_tag: 'SqliteDb',
|
|
13
|
+
metadata: { dbPointer: 0, persistenceInfo: { fileName: ':memory:' } } as any,
|
|
14
|
+
debug: { head: 0 as any },
|
|
15
|
+
prepare: (queryStr: string): PreparedStatement => ({
|
|
16
|
+
sql: queryStr,
|
|
17
|
+
execute: (_bind: PreparedBindValues | undefined) => {
|
|
18
|
+
executed.push(queryStr)
|
|
19
|
+
},
|
|
20
|
+
select: <T>(_bind: PreparedBindValues | undefined) => [] as unknown as ReadonlyArray<T>,
|
|
21
|
+
finalize: () => {},
|
|
22
|
+
}),
|
|
23
|
+
execute: () => {},
|
|
24
|
+
select: () => [],
|
|
25
|
+
export: () => new Uint8Array(),
|
|
26
|
+
import: () => {},
|
|
27
|
+
close: () => {},
|
|
28
|
+
destroy: () => {},
|
|
29
|
+
session: () => ({ changeset: () => undefined, finish: () => {} }),
|
|
30
|
+
makeChangeset: () => ({ invert: () => ({ invert: () => ({}) as any, apply: () => {} }) as any, apply: () => {} }),
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
return { db, executed }
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
describe('migrateTable - quoting and autoincrement', () => {
|
|
37
|
+
it('creates valid CREATE TABLE with inline INTEGER PRIMARY KEY AUTOINCREMENT and double-quoted identifiers', () => {
|
|
38
|
+
const { db, executed } = makeStubDb()
|
|
39
|
+
|
|
40
|
+
const table = SqliteAst.table(
|
|
41
|
+
'todos',
|
|
42
|
+
[
|
|
43
|
+
SqliteAst.column({
|
|
44
|
+
name: 'id',
|
|
45
|
+
type: { _tag: 'integer' },
|
|
46
|
+
nullable: false,
|
|
47
|
+
primaryKey: true,
|
|
48
|
+
autoIncrement: true,
|
|
49
|
+
default: Option.none(),
|
|
50
|
+
schema: Schema.Number,
|
|
51
|
+
}),
|
|
52
|
+
SqliteAst.column({
|
|
53
|
+
name: 'text',
|
|
54
|
+
type: { _tag: 'text' },
|
|
55
|
+
nullable: false,
|
|
56
|
+
primaryKey: false,
|
|
57
|
+
autoIncrement: false,
|
|
58
|
+
default: Option.some(''),
|
|
59
|
+
schema: Schema.String,
|
|
60
|
+
}),
|
|
61
|
+
SqliteAst.column({
|
|
62
|
+
name: 'completed',
|
|
63
|
+
type: { _tag: 'integer' },
|
|
64
|
+
nullable: false,
|
|
65
|
+
primaryKey: false,
|
|
66
|
+
autoIncrement: false,
|
|
67
|
+
default: Option.some(0),
|
|
68
|
+
schema: Schema.Number,
|
|
69
|
+
}),
|
|
70
|
+
],
|
|
71
|
+
[],
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
migrateTable({ db, tableAst: table, behaviour: 'create-if-not-exists', skipMetaTable: true }).pipe(Effect.runSync)
|
|
75
|
+
|
|
76
|
+
const createStmt = executed.find((s) => /create table if not exists/i.test(s))
|
|
77
|
+
expect(createStmt).toBeDefined()
|
|
78
|
+
|
|
79
|
+
// Identifiers must be double-quoted, not single-quoted
|
|
80
|
+
expect(createStmt!).toContain('create table if not exists "todos"')
|
|
81
|
+
expect(createStmt!).toContain('"id" integer primary key autoincrement')
|
|
82
|
+
expect(createStmt!).toContain(" default ''")
|
|
83
|
+
expect(createStmt!).not.toContain("PRIMARY KEY ('id')")
|
|
84
|
+
expect(createStmt!).not.toMatch(/'todos'|'id'|'text'/)
|
|
85
|
+
})
|
|
86
|
+
})
|
|
@@ -168,10 +168,10 @@ export const migrateTable = ({
|
|
|
168
168
|
|
|
169
169
|
if (behaviour === 'drop-and-recreate') {
|
|
170
170
|
// TODO need to possibly handle cascading deletes due to foreign keys
|
|
171
|
-
dbExecute(db, sql`drop table if exists
|
|
172
|
-
dbExecute(db, sql`create table if not exists
|
|
171
|
+
dbExecute(db, sql`drop table if exists "${tableName}"`)
|
|
172
|
+
dbExecute(db, sql`create table if not exists "${tableName}" (${columnSpec}) strict`)
|
|
173
173
|
} else if (behaviour === 'create-if-not-exists') {
|
|
174
|
-
dbExecute(db, sql`create table if not exists
|
|
174
|
+
dbExecute(db, sql`create table if not exists "${tableName}" (${columnSpec}) strict`)
|
|
175
175
|
}
|
|
176
176
|
|
|
177
177
|
for (const index of tableAst.indexes) {
|
|
@@ -201,5 +201,7 @@ export const migrateTable = ({
|
|
|
201
201
|
|
|
202
202
|
const createIndexFromDefinition = (tableName: string, index: SqliteAst.Index) => {
|
|
203
203
|
const uniqueStr = index.unique ? 'UNIQUE' : ''
|
|
204
|
-
return sql`create ${uniqueStr} index if not exists
|
|
204
|
+
return sql`create ${uniqueStr} index if not exists "${index.name}" on "${tableName}" (${index.columns
|
|
205
|
+
.map((col) => `"${col}"`)
|
|
206
|
+
.join(', ')})`
|
|
205
207
|
}
|
|
@@ -247,7 +247,15 @@ export const createTable = ({
|
|
|
247
247
|
.map(([columnName, _]) => columnName)
|
|
248
248
|
const columnDefStrs = Object.entries(table.columns).map(([columnName, columnDef]) => {
|
|
249
249
|
const nullModifier = columnDef.nullable === true ? '' : 'NOT NULL'
|
|
250
|
-
const defaultModifier =
|
|
250
|
+
const defaultModifier = (() => {
|
|
251
|
+
if (columnDef.default._tag === 'None') return ''
|
|
252
|
+
const defaultValue = columnDef.default.value
|
|
253
|
+
if (typeof defaultValue === 'function') return ''
|
|
254
|
+
if (defaultValue && typeof defaultValue === 'object' && 'sql' in defaultValue) {
|
|
255
|
+
return `DEFAULT ${defaultValue.sql}`
|
|
256
|
+
}
|
|
257
|
+
return `DEFAULT ${defaultValue}`
|
|
258
|
+
})()
|
|
251
259
|
return sql`${columnName} ${columnDef.columnType} ${nullModifier} ${defaultModifier}`
|
|
252
260
|
})
|
|
253
261
|
|
package/src/sync/sync-backend.ts
CHANGED
|
@@ -19,15 +19,15 @@ export * from './sync-backend-kv.ts'
|
|
|
19
19
|
/**
|
|
20
20
|
* Those arguments can be used to implement multi-tenancy etc and are passed in from the store.
|
|
21
21
|
*/
|
|
22
|
-
export type MakeBackendArgs = {
|
|
22
|
+
export type MakeBackendArgs<TPayload = Schema.JsonValue> = {
|
|
23
23
|
storeId: string
|
|
24
24
|
clientId: string
|
|
25
|
-
payload:
|
|
25
|
+
payload: TPayload | undefined
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
// TODO rename to `SyncProviderClientConstructor`
|
|
29
|
-
export type SyncBackendConstructor<TSyncMetadata = Schema.JsonValue> = (
|
|
30
|
-
args: MakeBackendArgs
|
|
29
|
+
export type SyncBackendConstructor<TSyncMetadata = Schema.JsonValue, TPayload = Schema.JsonValue> = (
|
|
30
|
+
args: MakeBackendArgs<TPayload>,
|
|
31
31
|
) => Effect.Effect<
|
|
32
32
|
SyncBackend<TSyncMetadata>,
|
|
33
33
|
UnexpectedError,
|
package/src/sync/sync.ts
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
export * from './errors.ts'
|
|
2
2
|
export * as SyncBackend from './sync-backend.ts'
|
|
3
3
|
|
|
4
|
+
import type { Schema } from '@livestore/utils/effect'
|
|
4
5
|
import type { InitialSyncOptions } from '../leader-thread/types.ts'
|
|
5
6
|
import type { SyncBackendConstructor } from './sync-backend.ts'
|
|
6
7
|
|
|
7
|
-
export type SyncOptions = {
|
|
8
|
-
backend?: SyncBackendConstructor<any>
|
|
8
|
+
export type SyncOptions<TPayload = Schema.JsonValue> = {
|
|
9
|
+
backend?: SyncBackendConstructor<any, TPayload>
|
|
9
10
|
/** @default { _tag: 'Skip' } */
|
|
10
11
|
initialSyncOptions?: InitialSyncOptions
|
|
11
12
|
/**
|
package/src/version.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// import packageJson from '../package.json' with { type: 'json' }
|
|
3
3
|
// export const liveStoreVersion = packageJson.version
|
|
4
4
|
|
|
5
|
-
export const liveStoreVersion = '0.4.0-dev.
|
|
5
|
+
export const liveStoreVersion = '0.4.0-dev.16' as const
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
8
|
* CRITICAL: Increment this version whenever you modify client-side EVENTLOG table schemas.
|