@livestore/common 0.3.0-dev.31 → 0.3.0-dev.33

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 (63) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/derived-mutations.d.ts +77 -0
  3. package/dist/derived-mutations.d.ts.map +1 -0
  4. package/dist/derived-mutations.js +54 -0
  5. package/dist/derived-mutations.js.map +1 -0
  6. package/dist/derived-mutations.test.d.ts +2 -0
  7. package/dist/derived-mutations.test.d.ts.map +1 -0
  8. package/dist/derived-mutations.test.js +93 -0
  9. package/dist/derived-mutations.test.js.map +1 -0
  10. package/dist/devtools/devtools-bridge.d.ts +12 -0
  11. package/dist/devtools/devtools-bridge.d.ts.map +1 -0
  12. package/dist/devtools/devtools-bridge.js +2 -0
  13. package/dist/devtools/devtools-bridge.js.map +1 -0
  14. package/dist/devtools/devtools-messages-client-session.d.ts +29 -29
  15. package/dist/devtools/devtools-messages-common.d.ts +6 -6
  16. package/dist/devtools/devtools-messages-leader.d.ts +24 -24
  17. package/dist/devtools/index.d.ts +42 -0
  18. package/dist/devtools/index.d.ts.map +1 -0
  19. package/dist/devtools/index.js +49 -0
  20. package/dist/devtools/index.js.map +1 -0
  21. package/dist/init-singleton-tables.d.ts +4 -0
  22. package/dist/init-singleton-tables.d.ts.map +1 -0
  23. package/dist/init-singleton-tables.js +16 -0
  24. package/dist/init-singleton-tables.js.map +1 -0
  25. package/dist/leader-thread/leader-worker-devtools.d.ts +1 -1
  26. package/dist/mutation.d.ts +14 -0
  27. package/dist/mutation.d.ts.map +1 -0
  28. package/dist/mutation.js +71 -0
  29. package/dist/mutation.js.map +1 -0
  30. package/dist/query-info.d.ts +38 -0
  31. package/dist/query-info.d.ts.map +1 -0
  32. package/dist/query-info.js +7 -0
  33. package/dist/query-info.js.map +1 -0
  34. package/dist/rehydrate-from-mutationlog.d.ts +14 -0
  35. package/dist/rehydrate-from-mutationlog.d.ts.map +1 -0
  36. package/dist/rehydrate-from-mutationlog.js +72 -0
  37. package/dist/rehydrate-from-mutationlog.js.map +1 -0
  38. package/dist/schema/EventDef.d.ts +2 -2
  39. package/dist/schema/index.d.ts +62 -0
  40. package/dist/schema/index.d.ts.map +1 -0
  41. package/dist/schema/index.js +67 -0
  42. package/dist/schema/index.js.map +1 -0
  43. package/dist/schema/mutations.d.ts +227 -0
  44. package/dist/schema/mutations.d.ts.map +1 -0
  45. package/dist/schema/mutations.js +68 -0
  46. package/dist/schema/mutations.js.map +1 -0
  47. package/dist/schema-management/migrations.js +2 -0
  48. package/dist/schema-management/migrations.js.map +1 -1
  49. package/dist/sync/next/test/event-fixtures.d.ts +7 -7
  50. package/dist/sync/next/test/mutation-fixtures.d.ts +73 -0
  51. package/dist/sync/next/test/mutation-fixtures.d.ts.map +1 -0
  52. package/dist/sync/next/test/mutation-fixtures.js +161 -0
  53. package/dist/sync/next/test/mutation-fixtures.js.map +1 -0
  54. package/dist/sync/next-mutation-event-id-pair.d.ts +14 -0
  55. package/dist/sync/next-mutation-event-id-pair.d.ts.map +1 -0
  56. package/dist/sync/next-mutation-event-id-pair.js +13 -0
  57. package/dist/sync/next-mutation-event-id-pair.js.map +1 -0
  58. package/dist/sync/syncstate.d.ts +2 -2
  59. package/dist/version.d.ts +1 -1
  60. package/dist/version.js +1 -1
  61. package/package.json +2 -2
  62. package/src/schema-management/migrations.ts +1 -0
  63. package/src/version.ts +1 -1
@@ -0,0 +1,161 @@
1
+ import { Schema } from '@livestore/utils/effect';
2
+ import { ROOT_ID } from '../../../adapter-types.js';
3
+ import { defineFacts, defineMutation } from '../../../schema/mutations.js';
4
+ import { factsSnapshotForDag, getFactsGroupForMutationArgs } from '../facts.js';
5
+ import { historyDagFromNodes, rootEventNode } from '../history-dag.js';
6
+ /** Used for conflict detection and event history compaction */
7
+ export const facts = defineFacts({
8
+ todoExists: (id) => `todo-exists-${id}`,
9
+ todoIsWriteable: (id, writeable) => [`todo-is-writeable-${id}`, writeable],
10
+ todoCompleted: (id, completed) => [`todo-completed-${id}`, completed],
11
+ todoTextUpdated: (id) => `todo-text-updated-${id}`,
12
+ inputValue: (id) => `input-value-${id}`,
13
+ });
14
+ export const mutations = {
15
+ createTodo: defineMutation('createTodo', Schema.Struct({ id: Schema.String, text: Schema.String }), 'INSERT INTO todos (id, text) VALUES ($id, $text)', {
16
+ facts: ({ id }) => ({
17
+ modify: {
18
+ set: [facts.todoExists(id), facts.todoIsWriteable(id, true), facts.todoCompleted(id, false)],
19
+ },
20
+ }),
21
+ }),
22
+ upsertTodo: defineMutation('upsertTodo', Schema.Struct({ id: Schema.String, text: Schema.optional(Schema.String) }), 'INSERT INTO todos (id, text) VALUES ($id, $text) ON CONFLICT (id) DO UPDATE SET text = $text', {
23
+ facts: ({ id }, currentFacts) =>
24
+ // TODO enable an API along the lines of `map.has(key, value)`
25
+ currentFacts.has(facts.todoExists(id)) && currentFacts.get(facts.todoIsWriteable(id, true)[0]) === false
26
+ ? { require: [facts.todoExists(id), facts.todoIsWriteable(id, true)] }
27
+ : { modify: { set: [facts.todoExists(id), facts.todoIsWriteable(id, true), facts.todoTextUpdated(id)] } },
28
+ }),
29
+ completeTodo: defineMutation('completeTodo', Schema.Struct({ id: Schema.String }),
30
+ // consider `RETURNING` to validate before applying facts
31
+ 'UPDATE todos SET completed = true WHERE id = $id', {
32
+ // prewrite assertions from DB
33
+ // enables more concurrency
34
+ // turning database inside out
35
+ // similar to upsert semantics
36
+ facts: ({ id }) => ({
37
+ require: [facts.todoExists(id), facts.todoIsWriteable(id, true)],
38
+ modify: { set: [facts.todoCompleted(id, true)] },
39
+ }),
40
+ }),
41
+ uncompleteTodo: defineMutation('uncompleteTodo', Schema.Struct({ id: Schema.String }), 'UPDATE todos SET completed = false WHERE id = $id', {
42
+ facts: ({ id }) => ({
43
+ require: [facts.todoExists(id), facts.todoIsWriteable(id, true)],
44
+ modify: { set: [facts.todoCompleted(id, false)] },
45
+ }),
46
+ }),
47
+ completeTodos: defineMutation('completeTodos', Schema.Struct({ ids: Schema.Array(Schema.String) }), 'UPDATE todos SET completed = true WHERE id IN ($ids:csv)', {
48
+ facts: ({ ids }) => ({
49
+ require: ids.flatMap((id) => [facts.todoExists(id), facts.todoIsWriteable(id, true)]),
50
+ modify: { set: ids.map((id) => facts.todoCompleted(id, true)) },
51
+ }),
52
+ }),
53
+ toggleTodo: defineMutation('toggleTodo', Schema.Struct({ id: Schema.String }), 'UPDATE todos SET completed = NOT completed WHERE id = $id', {
54
+ facts: ({ id }, currentFacts) => {
55
+ const currentIsCompleted = currentFacts.get(facts.todoCompleted(id, true)[0]) === true;
56
+ return {
57
+ require: [facts.todoExists(id), facts.todoIsWriteable(id, true)],
58
+ modify: {
59
+ // remove: [facts.todoCompleted(id, currentIsCompleted)],
60
+ set: [facts.todoCompleted(id, !currentIsCompleted)],
61
+ },
62
+ };
63
+ },
64
+ }),
65
+ setReadonlyTodo: defineMutation('setReadonlyTodo', Schema.Struct({ id: Schema.String, readonly: Schema.Boolean }), 'UPDATE todos SET readonly = $readonly WHERE id = $id', {
66
+ facts: ({ id, readonly }) => ({
67
+ require: [facts.todoExists(id)],
68
+ modify: { set: [facts.todoIsWriteable(id, !readonly)] },
69
+ }),
70
+ }),
71
+ setTextTodo: defineMutation('setTextTodo', Schema.Struct({ id: Schema.String, text: Schema.String }), 'UPDATE todos SET text = $text WHERE id = $id', {
72
+ facts: ({ id }) => ({
73
+ require: [facts.todoExists(id), facts.todoIsWriteable(id, true)],
74
+ modify: { set: [facts.todoTextUpdated(id)] },
75
+ }),
76
+ }),
77
+ setInputValue: defineMutation('setInputValue', Schema.Struct({ id: Schema.String, text: Schema.String }), 'UPDATE todos SET text = $text WHERE id = $id', {
78
+ localOnly: true,
79
+ facts: ({ id }) => ({ modify: { set: [facts.inputValue(id)] } }),
80
+ }),
81
+ };
82
+ export const toEventNodes = (partialEvents, mutationDefs) => {
83
+ const nodesAcc = [rootEventNode];
84
+ let currentEventId = ROOT_ID;
85
+ const getNextEventId = (mutationDef) => {
86
+ if (mutationDef.options.localOnly) {
87
+ return { global: currentEventId.global, local: currentEventId.local + 1 };
88
+ }
89
+ return { global: currentEventId.global + 1, local: 0 };
90
+ };
91
+ const eventNodes = partialEvents.map((partialEvent) => {
92
+ const mutationDef = mutationDefs[partialEvent.mutation];
93
+ const eventId = getNextEventId(mutationDef);
94
+ currentEventId = eventId;
95
+ const factsSnapshot = factsSnapshotForDag(historyDagFromNodes(nodesAcc, { skipFactsCheck: true }), undefined);
96
+ // console.log('factsSnapshot', eventId, factsSnapshot)
97
+ // const depRead: MutationEventFactsSnapshot = new Map<string, any>()
98
+ // const factsSnapshotProxy = new Proxy(factsSnapshot, {
99
+ // get: (target, prop) => {
100
+ // if (prop === 'has') {
101
+ // return (key: string) => {
102
+ // depRead.set(key, EMPTY_FACT_VALUE)
103
+ // return target.has(key)
104
+ // }
105
+ // } else if (prop === 'get') {
106
+ // return (key: string) => {
107
+ // depRead.set(key, EMPTY_FACT_VALUE)
108
+ // return target.get(key)
109
+ // }
110
+ // }
111
+ // notYetImplemented(`toEventNodes: ${prop.toString()} is not yet implemented`)
112
+ // },
113
+ // })
114
+ // const factsRes = mutationDef.options.facts?.(partialEvent.args, factsSnapshotProxy)
115
+ // console.log('factsRes', factsRes?.modify, factsRes?.require)
116
+ // const iterableToMap = (iterable: Iterable<MutationEventFactInput>) => {
117
+ // const map = new Map()
118
+ // for (const item of iterable) {
119
+ // if (typeof item === 'string') {
120
+ // map.set(item, EMPTY_FACT_VALUE)
121
+ // } else {
122
+ // map.set(item[0], item[1])
123
+ // }
124
+ // }
125
+ // return map
126
+ // }
127
+ // const facts = {
128
+ // modifyAdd: factsRes?.modify.add ? iterableToMap(factsRes.modify.add) : new Map(),
129
+ // modifyRemove: factsRes?.modify.remove ? iterableToMap(factsRes.modify.remove) : new Map(),
130
+ // depRequire: factsRes?.require ? iterableToMap(factsRes.require) : new Map(),
131
+ // depRead,
132
+ // } satisfies MutationEventFactsGroup
133
+ // applyFactGroup(facts, factsSnapshot)
134
+ const facts = getFactsGroupForMutationArgs({
135
+ factsCallback: mutationDef.options.facts,
136
+ args: partialEvent.args,
137
+ currentFacts: factsSnapshot,
138
+ });
139
+ const node = {
140
+ id: eventId,
141
+ parentId: getParentId(eventId),
142
+ mutation: partialEvent.mutation,
143
+ args: partialEvent.args,
144
+ factsGroup: facts,
145
+ };
146
+ nodesAcc.push(node);
147
+ return node;
148
+ });
149
+ eventNodes.unshift(rootEventNode);
150
+ // console.log('eventNodes', eventNodes)
151
+ return eventNodes;
152
+ };
153
+ const getParentId = (eventId) => {
154
+ const globalParentId = eventId.global;
155
+ const localParentId = eventId.local - 1;
156
+ if (localParentId < 0) {
157
+ return { global: globalParentId - 1, local: 0 };
158
+ }
159
+ return { global: globalParentId, local: localParentId };
160
+ };
161
+ //# sourceMappingURL=mutation-fixtures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutation-fixtures.js","sourceRoot":"","sources":["../../../../src/sync/next/test/mutation-fixtures.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { Effect } from '@livestore/utils/effect';
2
+ import type { EventId } from '../adapter-types.js';
3
+ export declare const makeNextMutationEventIdPair: (currentMutationEventIdRef: {
4
+ current: EventId;
5
+ }) => (opts: {
6
+ localOnly: boolean;
7
+ }) => Effect.Effect<{
8
+ id: {
9
+ global: number;
10
+ local: number;
11
+ };
12
+ parentId: EventId;
13
+ }, never, never>;
14
+ //# sourceMappingURL=next-mutation-event-id-pair.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"next-mutation-event-id-pair.d.ts","sourceRoot":"","sources":["../../src/sync/next-mutation-event-id-pair.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAEhD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAElD,eAAO,MAAM,2BAA2B,GACrC,2BAA2B;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,MAAM,MAAM;IAAE,SAAS,EAAE,OAAO,CAAA;CAAE;;;;;;gBAc9E,CAAA"}
@@ -0,0 +1,13 @@
1
+ import { Effect } from '@livestore/utils/effect';
2
+ export const makeNextMutationEventIdPair = (currentMutationEventIdRef) => (opts) => Effect.gen(function* () {
3
+ // NOTE we always point to `local: 0` for non-localOnly mutations
4
+ const parentId = opts.localOnly
5
+ ? currentMutationEventIdRef.current
6
+ : { global: currentMutationEventIdRef.current.global, local: 0 };
7
+ const id = opts.localOnly
8
+ ? { global: parentId.global, local: parentId.local + 1 }
9
+ : { global: parentId.global + 1, local: 0 };
10
+ currentMutationEventIdRef.current = id;
11
+ return { id, parentId };
12
+ });
13
+ //# sourceMappingURL=next-mutation-event-id-pair.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"next-mutation-event-id-pair.js","sourceRoot":"","sources":["../../src/sync/next-mutation-event-id-pair.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAIhD,MAAM,CAAC,MAAM,2BAA2B,GACtC,CAAC,yBAA+C,EAAE,EAAE,CAAC,CAAC,IAA4B,EAAE,EAAE,CACpF,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,iEAAiE;IACjE,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS;QAC7B,CAAC,CAAC,yBAAyB,CAAC,OAAO;QACnC,CAAC,CAAC,EAAE,MAAM,EAAE,yBAAyB,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,CAAA;IAElE,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS;QACvB,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,GAAG,CAAC,EAAE;QACxD,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAA;IAE7C,yBAAyB,CAAC,OAAO,GAAG,EAAE,CAAA;IAEtC,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAA;AACzB,CAAC,CAAC,CAAA"}
@@ -222,9 +222,9 @@ declare const MergeResultUnexpectedError_base: Schema.Class<MergeResultUnexpecte
222
222
  _tag: Schema.Literal<["unexpected-error"]>;
223
223
  cause: typeof UnexpectedError;
224
224
  }>, never, {
225
- readonly cause: UnexpectedError;
226
- } & {
227
225
  readonly _tag: "unexpected-error";
226
+ } & {
227
+ readonly cause: UnexpectedError;
228
228
  }, {}, {}>;
229
229
  export declare class MergeResultUnexpectedError extends MergeResultUnexpectedError_base {
230
230
  }
package/dist/version.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export declare const liveStoreVersion: "0.3.0-dev.31";
1
+ export declare const liveStoreVersion: "0.3.0-dev.33";
2
2
  /**
3
3
  * This version number is incremented whenever the internal storage format changes in a breaking way.
4
4
  * Whenever this version changes, LiveStore will start with fresh database files. Old database files are not deleted.
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.3.0-dev.31';
4
+ export const liveStoreVersion = '0.3.0-dev.33';
5
5
  /**
6
6
  * This version number is incremented whenever the internal storage format changes in a breaking way.
7
7
  * Whenever this version changes, LiveStore will start with fresh database files. Old database files are not deleted.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@livestore/common",
3
- "version": "0.3.0-dev.31",
3
+ "version": "0.3.0-dev.33",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "exports": {
@@ -54,7 +54,7 @@
54
54
  "graphology": "0.26.0-alpha1",
55
55
  "graphology-dag": "0.4.1",
56
56
  "graphology-types": "0.24.8",
57
- "@livestore/utils": "0.3.0-dev.31"
57
+ "@livestore/utils": "0.3.0-dev.33"
58
58
  },
59
59
  "devDependencies": {
60
60
  "vitest": "^3.1.1"
@@ -185,6 +185,7 @@ const toSqliteColumnSpec = (column: SqliteAst.Column) => {
185
185
  const defaultValueStr = (() => {
186
186
  if (column.default._tag === 'None') return ''
187
187
 
188
+ if (column.default.value === null) return 'default null'
188
189
  if (SqliteDsl.isSqlDefaultValue(column.default.value)) return `default ${column.default.value.sql}`
189
190
 
190
191
  const encodeValue = EffectSchema.encodeSync(column.schema)
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.3.0-dev.31' as const
5
+ export const liveStoreVersion = '0.3.0-dev.33' as const
6
6
 
7
7
  /**
8
8
  * This version number is incremented whenever the internal storage format changes in a breaking way.