@livestore/common 0.4.0-dev.15 → 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.
Files changed (55) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/devtools/devtools-messages-client-session.d.ts +21 -21
  3. package/dist/devtools/devtools-messages-common.d.ts +6 -6
  4. package/dist/devtools/devtools-messages-leader.d.ts +24 -24
  5. package/dist/devtools/devtools-sessioninfo.d.ts +2 -2
  6. package/dist/devtools/devtools-sessioninfo.d.ts.map +1 -1
  7. package/dist/devtools/devtools-sessioninfo.js +1 -4
  8. package/dist/devtools/devtools-sessioninfo.js.map +1 -1
  9. package/dist/index.d.ts +1 -0
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +1 -0
  12. package/dist/index.js.map +1 -1
  13. package/dist/logging.d.ts +40 -0
  14. package/dist/logging.d.ts.map +1 -0
  15. package/dist/logging.js +33 -0
  16. package/dist/logging.js.map +1 -0
  17. package/dist/schema/state/sqlite/column-def.test.js +19 -1
  18. package/dist/schema/state/sqlite/column-def.test.js.map +1 -1
  19. package/dist/schema/state/sqlite/column-spec.js +8 -4
  20. package/dist/schema/state/sqlite/column-spec.js.map +1 -1
  21. package/dist/schema/state/sqlite/column-spec.test.js +10 -0
  22. package/dist/schema/state/sqlite/column-spec.test.js.map +1 -1
  23. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts +14 -8
  24. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts.map +1 -1
  25. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js +5 -3
  26. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js.map +1 -1
  27. package/dist/schema/state/sqlite/schema-helpers.d.ts +2 -2
  28. package/dist/schema/state/sqlite/schema-helpers.d.ts.map +1 -1
  29. package/dist/schema/state/sqlite/schema-helpers.js +22 -12
  30. package/dist/schema/state/sqlite/schema-helpers.js.map +1 -1
  31. package/dist/schema/state/sqlite/schema-helpers.test.d.ts +2 -0
  32. package/dist/schema/state/sqlite/schema-helpers.test.d.ts.map +1 -0
  33. package/dist/schema/state/sqlite/schema-helpers.test.js +36 -0
  34. package/dist/schema/state/sqlite/schema-helpers.test.js.map +1 -0
  35. package/dist/sql-queries/sql-queries.d.ts.map +1 -1
  36. package/dist/sql-queries/sql-queries.js +11 -1
  37. package/dist/sql-queries/sql-queries.js.map +1 -1
  38. package/dist/version.d.ts +1 -1
  39. package/dist/version.js +1 -1
  40. package/package.json +4 -4
  41. package/src/devtools/devtools-sessioninfo.ts +2 -5
  42. package/src/index.ts +1 -0
  43. package/src/logging.ts +62 -0
  44. package/src/schema/state/sqlite/column-def.test.ts +24 -1
  45. package/src/schema/state/sqlite/column-spec.test.ts +16 -0
  46. package/src/schema/state/sqlite/column-spec.ts +8 -3
  47. package/src/schema/state/sqlite/db-schema/dsl/field-defs.ts +29 -12
  48. package/src/schema/state/sqlite/schema-helpers.test.ts +44 -0
  49. package/src/schema/state/sqlite/schema-helpers.ts +28 -20
  50. package/src/sql-queries/sql-queries.ts +9 -1
  51. package/src/version.ts +1 -1
  52. package/dist/schema/state/sqlite/system-tables.d.ts +0 -976
  53. package/dist/schema/state/sqlite/system-tables.d.ts.map +0 -1
  54. package/dist/schema/state/sqlite/system-tables.js +0 -81
  55. package/dist/schema/state/sqlite/system-tables.js.map +0 -1
package/dist/version.js CHANGED
@@ -1,7 +1,7 @@
1
1
  // TODO bring back when Expo and Playwright supports `with` imports
2
2
  // import packageJson from '../package.json' with { type: 'json' }
3
3
  // export const liveStoreVersion = packageJson.version
4
- export const liveStoreVersion = '0.4.0-dev.15';
4
+ export const liveStoreVersion = '0.4.0-dev.16';
5
5
  /**
6
6
  * CRITICAL: Increment this version whenever you modify client-side EVENTLOG table schemas.
7
7
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@livestore/common",
3
- "version": "0.4.0-dev.15",
3
+ "version": "0.4.0-dev.16",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "exports": {
@@ -15,12 +15,12 @@
15
15
  },
16
16
  "dependencies": {
17
17
  "@opentelemetry/api": "1.9.0",
18
- "@livestore/utils": "0.4.0-dev.15",
19
- "@livestore/webmesh": "0.4.0-dev.15"
18
+ "@livestore/utils": "0.4.0-dev.16",
19
+ "@livestore/webmesh": "0.4.0-dev.16"
20
20
  },
21
21
  "devDependencies": {
22
22
  "vitest": "3.2.4",
23
- "@livestore/utils-dev": "0.4.0-dev.15"
23
+ "@livestore/utils-dev": "0.4.0-dev.16"
24
24
  },
25
25
  "files": [
26
26
  "package.json",
@@ -61,7 +61,7 @@ export const requestSessionInfoSubscription = ({
61
61
  webChannel: WebChannel.WebChannel<Message, Message>
62
62
  pollInterval?: Duration.DurationInput
63
63
  staleTimeout?: Duration.DurationInput
64
- }): Effect.Effect<Subscribable.Subscribable<Set<SessionInfo>>, ParseResult.ParseError, Scope.Scope> =>
64
+ }): Effect.Effect<Subscribable.Subscribable<HashSet.HashSet<SessionInfo>>, ParseResult.ParseError, Scope.Scope> =>
65
65
  Effect.gen(function* () {
66
66
  yield* webChannel
67
67
  .send(RequestSessions.make({}))
@@ -100,8 +100,5 @@ export const requestSessionInfoSubscription = ({
100
100
  Effect.forkScoped,
101
101
  )
102
102
 
103
- return Subscribable.make({
104
- get: sessionInfoSubRef.get.pipe(Effect.map((sessionInfos) => new Set(sessionInfos))),
105
- changes: sessionInfoSubRef.changes.pipe(Stream.map((sessionInfos) => new Set(sessionInfos))),
106
- })
103
+ return Subscribable.make({ get: sessionInfoSubRef.get, changes: sessionInfoSubRef.changes })
107
104
  })
package/src/index.ts CHANGED
@@ -2,6 +2,7 @@ export * from './adapter-types.ts'
2
2
  export * from './bounded-collections.ts'
3
3
  export * from './debug-info.ts'
4
4
  export * as Devtools from './devtools/mod.ts'
5
+ export * as LogConfig from './logging.ts'
5
6
  export * from './make-client-session.ts'
6
7
  export * from './materializer-helper.ts'
7
8
  export * from './otel.ts'
package/src/logging.ts ADDED
@@ -0,0 +1,62 @@
1
+ import { isDevEnv } from '@livestore/utils'
2
+ import { Effect, type Layer, Logger, LogLevel } from '@livestore/utils/effect'
3
+
4
+ /**
5
+ * Optional Effect logger configuration that LiveStore entry points accept.
6
+ *
7
+ * When provided, `logger` replaces the default pretty logger for the runtime.
8
+ * Use `logLevel` to control verbosity. Set to `LogLevel.None` to disable logging
9
+ * entirely while keeping the same logger implementation.
10
+ */
11
+ export type WithLoggerOptions = {
12
+ /** Optional Effect logger layer to control logging output. */
13
+ logger?: Layer.Layer<never> | undefined
14
+ /** Optional minimum log level for the runtime. */
15
+ logLevel?: LogLevel.LogLevel | undefined
16
+ }
17
+
18
+ /**
19
+ * Common defaults for resolving a logger configuration.
20
+ * - `threadName` is used by the default pretty logger when `logger` is not provided.
21
+ * - `mode` selects pretty logger mode (e.g. 'browser' for web workers).
22
+ * - `defaultLogLevel` is used when `logLevel` is not provided.
23
+ */
24
+ export type LoggerDefaults = {
25
+ threadName?: string
26
+ mode?: 'tty' | 'browser'
27
+ defaultLogLevel?: LogLevel.LogLevel
28
+ /** Optional default logger layer to use when `config.logger` is not provided. */
29
+ defaultLogger?: Layer.Layer<never>
30
+ }
31
+
32
+ /**
33
+ * Resolve the logger layer to provide to the Effect runtime.
34
+ */
35
+ export const resolveLoggerLayer = (config?: WithLoggerOptions, defaults?: LoggerDefaults): Layer.Layer<never> => {
36
+ if (config?.logger) return config.logger
37
+ if (defaults?.defaultLogger) return defaults.defaultLogger
38
+ const threadName = defaults?.threadName ?? 'livestore'
39
+ const mode = defaults?.mode
40
+ return Logger.prettyWithThread(threadName, mode ? { mode } : {})
41
+ }
42
+
43
+ /**
44
+ * Resolve the minimum log level, falling back to `defaults.defaultLogLevel` then `LogLevel.Debug`.
45
+ */
46
+ export const resolveLogLevel = (config?: WithLoggerOptions, defaults?: LoggerDefaults): LogLevel.LogLevel => {
47
+ if (config?.logLevel !== undefined) return config.logLevel
48
+ if (defaults?.defaultLogLevel !== undefined) return defaults.defaultLogLevel
49
+ return isDevEnv() ? LogLevel.Debug : LogLevel.Info
50
+ }
51
+
52
+ /**
53
+ * Wrap an effect by applying the resolved minimum log level and providing the resolved logger layer.
54
+ */
55
+ export const withLoggerConfig = <TEnv, TError, TOut>(
56
+ config?: WithLoggerOptions,
57
+ defaults?: LoggerDefaults,
58
+ ): ((effect: Effect.Effect<TOut, TError, TEnv>) => Effect.Effect<TOut, TError, TEnv>) => {
59
+ const level = resolveLogLevel(config, defaults)
60
+ const layer = resolveLoggerLayer(config, defaults)
61
+ return (effect) => effect.pipe(Logger.withMinimumLogLevel(level), Effect.provide(layer))
62
+ }
@@ -1,5 +1,5 @@
1
1
  import { Schema } from '@livestore/utils/effect'
2
- import { describe, expect, it } from 'vitest'
2
+ import { assert, describe, expect, it } from 'vitest'
3
3
 
4
4
  import * as State from '../mod.ts'
5
5
  import { withAutoIncrement, withColumnType, withDefault, withPrimaryKey, withUnique } from './column-annotations.ts'
@@ -636,6 +636,29 @@ describe('getColumnDefForSchema', () => {
636
636
  table2.sqliteDef.columns.count.default._tag === 'Some' && table2.sqliteDef.columns.count.default.value,
637
637
  ).toBe(0)
638
638
  })
639
+
640
+ it('should support thunk defaults without eager evaluation', () => {
641
+ let counter = 0
642
+ const UserSchema = Schema.Struct({
643
+ id: Schema.String.pipe(
644
+ withDefault(() => {
645
+ counter += 1
646
+ return `user-${counter}`
647
+ }),
648
+ ),
649
+ })
650
+
651
+ const table = State.SQLite.table({ name: 'users_with_thunk', schema: UserSchema })
652
+
653
+ expect(counter).toBe(0)
654
+ expect(table.sqliteDef.columns.id.default._tag).toBe('Some')
655
+ if (table.sqliteDef.columns.id.default._tag === 'Some') {
656
+ const defaultThunk = table.sqliteDef.columns.id.default.value
657
+ assert(typeof defaultThunk === 'function')
658
+ expect(defaultThunk()).toBe('user-1')
659
+ expect(defaultThunk()).toBe('user-2')
660
+ }
661
+ })
639
662
  })
640
663
 
641
664
  describe('withUnique', () => {
@@ -146,6 +146,22 @@ describe('makeColumnSpec', () => {
146
146
  expect(result).toContain('default RANDOM()')
147
147
  })
148
148
 
149
+ it('should omit default clause for thunk defaults', () => {
150
+ const table = SqliteAst.table(
151
+ 'thunks',
152
+ [
153
+ createColumn('id', 'integer', { nullable: false, primaryKey: true }),
154
+ createColumn('token', 'text', { defaultValue: () => 'dynamic-token' }),
155
+ ],
156
+ [],
157
+ )
158
+
159
+ const result = makeColumnSpec(table)
160
+ expect(result).toMatchInlineSnapshot(`""id" integer primary key , "token" text "`)
161
+ expect(result).not.toContain('dynamic-token')
162
+ expect(result).not.toMatch(/token" text\s+default/i)
163
+ })
164
+
149
165
  it('should handle null default values', () => {
150
166
  const table = SqliteAst.table(
151
167
  'nullable_defaults',
@@ -47,11 +47,16 @@ const toSqliteColumnSpec = (column: SqliteAst.Column, opts: { inlinePrimaryKey:
47
47
  const defaultValueStr = (() => {
48
48
  if (column.default._tag === 'None') return ''
49
49
 
50
- if (column.default.value === null) return 'default null'
51
- if (SqliteDsl.isSqlDefaultValue(column.default.value)) return `default ${column.default.value.sql}`
50
+ const defaultValue = column.default.value
51
+ if (SqliteDsl.isDefaultThunk(defaultValue)) return ''
52
+
53
+ const resolvedDefault = SqliteDsl.resolveColumnDefault(defaultValue)
54
+
55
+ if (resolvedDefault === null) return 'default null'
56
+ if (SqliteDsl.isSqlDefaultValue(resolvedDefault)) return `default ${resolvedDefault.sql}`
52
57
 
53
58
  const encodeValue = Schema.encodeSync(column.schema)
54
- const encodedDefaultValue = encodeValue(column.default.value)
59
+ const encodedDefaultValue = encodeValue(resolvedDefault)
55
60
 
56
61
  if (columnTypeStr === 'text') return `default '${encodedDefaultValue}'`
57
62
  return `default ${encodedDefaultValue}`
@@ -1,10 +1,27 @@
1
1
  import { casesHandled } from '@livestore/utils'
2
2
  import { Option, Schema } from '@livestore/utils/effect'
3
3
 
4
+ export type SqlDefaultValue = {
5
+ readonly sql: string
6
+ }
7
+
8
+ export const isSqlDefaultValue = (value: unknown): value is SqlDefaultValue => {
9
+ return typeof value === 'object' && value !== null && 'sql' in value && typeof (value as any).sql === 'string'
10
+ }
11
+
12
+ export type ColumnDefaultThunk<T> = () => T
13
+
14
+ export const isDefaultThunk = (value: unknown): value is ColumnDefaultThunk<unknown> => typeof value === 'function'
15
+
16
+ export type ColumnDefaultValue<T> = T | null | ColumnDefaultThunk<T | null> | SqlDefaultValue
17
+
18
+ export const resolveColumnDefault = <T>(value: ColumnDefaultValue<T>): T | null | SqlDefaultValue =>
19
+ isDefaultThunk(value) ? (value as ColumnDefaultThunk<T | null>)() : value
20
+
4
21
  export type ColumnDefinition<TEncoded, TDecoded> = {
5
22
  readonly columnType: FieldColumnType
6
23
  readonly schema: Schema.Schema<TDecoded, TEncoded>
7
- readonly default: Option.Option<TEncoded>
24
+ readonly default: Option.Option<ColumnDefaultValue<TDecoded>>
8
25
  /** @default false */
9
26
  readonly nullable: boolean
10
27
  /** @default false */
@@ -27,9 +44,17 @@ export const isColumnDefinition = (value: unknown): value is ColumnDefinition.An
27
44
  )
28
45
  }
29
46
 
47
+ type MaybeNull<T, TNullable extends boolean> = T | (TNullable extends true ? null : never)
48
+
49
+ type ColumnDefaultArg<T, TNullable extends boolean> =
50
+ | MaybeNull<T, TNullable>
51
+ | ColumnDefaultThunk<MaybeNull<T, TNullable>>
52
+ | SqlDefaultValue
53
+ | NoDefault
54
+
30
55
  export type ColumnDefinitionInput = {
31
56
  readonly schema?: Schema.Schema<unknown>
32
- readonly default?: unknown | NoDefault
57
+ readonly default?: ColumnDefaultArg<unknown, boolean>
33
58
  readonly nullable?: boolean
34
59
  readonly primaryKey?: boolean
35
60
  readonly autoIncrement?: boolean
@@ -38,14 +63,6 @@ export type ColumnDefinitionInput = {
38
63
  export const NoDefault = Symbol.for('NoDefault')
39
64
  export type NoDefault = typeof NoDefault
40
65
 
41
- export type SqlDefaultValue = {
42
- readonly sql: string
43
- }
44
-
45
- export const isSqlDefaultValue = (value: unknown): value is SqlDefaultValue => {
46
- return typeof value === 'object' && value !== null && 'sql' in value && typeof value.sql === 'string'
47
- }
48
-
49
66
  export type ColDefFn<TColumnType extends FieldColumnType> = {
50
67
  (): {
51
68
  columnType: TColumnType
@@ -59,7 +76,7 @@ export type ColDefFn<TColumnType extends FieldColumnType> = {
59
76
  TEncoded extends DefaultEncodedForColumnType<TColumnType>,
60
77
  TDecoded = DefaultEncodedForColumnType<TColumnType>,
61
78
  const TNullable extends boolean = false,
62
- const TDefault extends TDecoded | SqlDefaultValue | NoDefault | (TNullable extends true ? null : never) = NoDefault,
79
+ const TDefault extends ColumnDefaultArg<NoInfer<TDecoded>, TNullable> = NoDefault,
63
80
  const TPrimaryKey extends boolean = false,
64
81
  const TAutoIncrement extends boolean = false,
65
82
  >(args: {
@@ -132,7 +149,7 @@ export type SpecializedColDefFn<
132
149
  <
133
150
  TDecoded = TBaseDecoded,
134
151
  const TNullable extends boolean = false,
135
- const TDefault extends TDecoded | NoDefault | (TNullable extends true ? null : never) = NoDefault,
152
+ const TDefault extends ColumnDefaultArg<NoInfer<TDecoded>, TNullable> = NoDefault,
136
153
  const TPrimaryKey extends boolean = false,
137
154
  const TAutoIncrement extends boolean = false,
138
155
  >(
@@ -0,0 +1,44 @@
1
+ import { describe, expect, it } from 'vitest'
2
+
3
+ import * as State from '../mod.ts'
4
+ import { getDefaultValuesDecoded, getDefaultValuesEncoded } from './schema-helpers.ts'
5
+
6
+ describe('schema-helpers', () => {
7
+ it('resolves thunk defaults when decoding values', () => {
8
+ let counter = 0
9
+ const table = State.SQLite.table({
10
+ name: 'sessions',
11
+ columns: {
12
+ id: State.SQLite.text({ primaryKey: true }),
13
+ token: State.SQLite.text({ default: () => `token-${++counter}` }),
14
+ },
15
+ })
16
+
17
+ expect(counter).toBe(0)
18
+
19
+ const firstDefaults = getDefaultValuesDecoded(table)
20
+ const secondDefaults = getDefaultValuesDecoded(table)
21
+
22
+ expect(firstDefaults.token).toBe('token-1')
23
+ expect(secondDefaults.token).toBe('token-2')
24
+ })
25
+
26
+ it('resolves thunk defaults when encoding values', () => {
27
+ let counter = 0
28
+ const table = State.SQLite.table({
29
+ name: 'sessions_encoded',
30
+ columns: {
31
+ id: State.SQLite.text({ primaryKey: true }),
32
+ token: State.SQLite.text({ default: () => `encoded-${++counter}` }),
33
+ },
34
+ })
35
+
36
+ expect(counter).toBe(0)
37
+
38
+ const firstDefaults = getDefaultValuesEncoded(table)
39
+ const secondDefaults = getDefaultValuesEncoded(table)
40
+
41
+ expect(firstDefaults.token).toBe('encoded-1')
42
+ expect(secondDefaults.token).toBe('encoded-2')
43
+ })
44
+ })
@@ -2,9 +2,9 @@ import { shouldNeverHappen } from '@livestore/utils'
2
2
  import { pipe, ReadonlyRecord, Schema } from '@livestore/utils/effect'
3
3
 
4
4
  import { SqliteDsl } from './db-schema/mod.ts'
5
- import type { TableDef, TableDefBase } from './table-def.ts'
5
+ import type { TableDefBase } from './table-def.ts'
6
6
 
7
- export const getDefaultValuesEncoded = <TTableDef extends TableDef>(
7
+ export const getDefaultValuesEncoded = <TTableDef extends TableDefBase>(
8
8
  tableDef: TTableDef,
9
9
  fallbackValues?: Record<string, any>,
10
10
  ) =>
@@ -15,15 +15,19 @@ export const getDefaultValuesEncoded = <TTableDef extends TableDef>(
15
15
  if (key === 'id') return false
16
16
  return col!.default._tag === 'None' || SqliteDsl.isSqlDefaultValue(col!.default.value) === false
17
17
  }),
18
- ReadonlyRecord.map((column, columnName) =>
19
- fallbackValues?.[columnName] === undefined
20
- ? column!.default._tag === 'None'
21
- ? column!.nullable === true
22
- ? null
23
- : shouldNeverHappen(`Column ${columnName} has no default value and is not nullable`)
24
- : Schema.encodeSync(column!.schema)(column!.default.value)
25
- : fallbackValues[columnName],
26
- ),
18
+ ReadonlyRecord.map((column, columnName) => {
19
+ if (fallbackValues?.[columnName] !== undefined) return fallbackValues[columnName]
20
+ if (column!.default._tag === 'None') {
21
+ return column!.nullable === true
22
+ ? null
23
+ : shouldNeverHappen(`Column ${columnName} has no default value and is not nullable`)
24
+ }
25
+
26
+ const defaultValue = column!.default.value
27
+ const resolvedDefault = SqliteDsl.resolveColumnDefault(defaultValue)
28
+
29
+ return Schema.encodeSync(column!.schema)(resolvedDefault)
30
+ }),
27
31
  )
28
32
 
29
33
  export const getDefaultValuesDecoded = <TTableDef extends TableDefBase>(
@@ -37,13 +41,17 @@ export const getDefaultValuesDecoded = <TTableDef extends TableDefBase>(
37
41
  if (key === 'id') return false
38
42
  return col!.default._tag === 'None' || SqliteDsl.isSqlDefaultValue(col!.default.value) === false
39
43
  }),
40
- ReadonlyRecord.map((column, columnName) =>
41
- fallbackValues?.[columnName] === undefined
42
- ? column!.default._tag === 'None'
43
- ? column!.nullable === true
44
- ? null
45
- : shouldNeverHappen(`Column ${columnName} has no default value and is not nullable`)
46
- : Schema.validateSync(column!.schema)(column!.default.value)
47
- : fallbackValues[columnName],
48
- ),
44
+ ReadonlyRecord.map((column, columnName) => {
45
+ if (fallbackValues?.[columnName] !== undefined) return fallbackValues[columnName]
46
+ if (column!.default._tag === 'None') {
47
+ return column!.nullable === true
48
+ ? null
49
+ : shouldNeverHappen(`Column ${columnName} has no default value and is not nullable`)
50
+ }
51
+
52
+ const defaultValue = column!.default.value
53
+ const resolvedDefault = SqliteDsl.resolveColumnDefault(defaultValue)
54
+
55
+ return Schema.validateSync(column!.schema)(resolvedDefault)
56
+ }),
49
57
  )
@@ -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 = columnDef.default._tag === 'None' ? '' : `DEFAULT ${columnDef.default.value}`
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/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.15' as const
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.