@livestore/common 0.0.0-snapshot-54e706b7e73bd685653cd43e1e34a02c1d8054a2 → 0.0.0-snapshot-412a36a7e6c9b0e9e237b553fd0522aed285228f.1

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 (156) 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 +8 -8
  15. package/dist/devtools/index.d.ts +42 -0
  16. package/dist/devtools/index.d.ts.map +1 -0
  17. package/dist/devtools/index.js +49 -0
  18. package/dist/devtools/index.js.map +1 -0
  19. package/dist/init-singleton-tables.d.ts +4 -0
  20. package/dist/init-singleton-tables.d.ts.map +1 -0
  21. package/dist/init-singleton-tables.js +16 -0
  22. package/dist/init-singleton-tables.js.map +1 -0
  23. package/dist/leader-thread/apply-event.d.ts +16 -0
  24. package/dist/leader-thread/apply-event.d.ts.map +1 -0
  25. package/dist/leader-thread/apply-event.js +103 -0
  26. package/dist/leader-thread/apply-event.js.map +1 -0
  27. package/dist/leader-thread/leader-worker-devtools.d.ts +1 -1
  28. package/dist/mutation.d.ts +14 -0
  29. package/dist/mutation.d.ts.map +1 -0
  30. package/dist/mutation.js +71 -0
  31. package/dist/mutation.js.map +1 -0
  32. package/dist/query-builder/api.d.ts +293 -0
  33. package/dist/query-builder/api.d.ts.map +1 -0
  34. package/dist/query-builder/api.js +6 -0
  35. package/dist/query-builder/api.js.map +1 -0
  36. package/dist/query-builder/astToSql.d.ts +7 -0
  37. package/dist/query-builder/astToSql.d.ts.map +1 -0
  38. package/dist/query-builder/astToSql.js +190 -0
  39. package/dist/query-builder/astToSql.js.map +1 -0
  40. package/dist/query-builder/impl.d.ts +7 -0
  41. package/dist/query-builder/impl.d.ts.map +1 -0
  42. package/dist/query-builder/impl.js +286 -0
  43. package/dist/query-builder/impl.js.map +1 -0
  44. package/dist/query-builder/impl.test.d.ts +87 -0
  45. package/dist/query-builder/impl.test.d.ts.map +1 -0
  46. package/dist/query-builder/impl.test.js +554 -0
  47. package/dist/query-builder/impl.test.js.map +1 -0
  48. package/dist/query-builder/mod.d.ts +17 -0
  49. package/dist/query-builder/mod.d.ts.map +1 -0
  50. package/dist/query-builder/mod.js +17 -0
  51. package/dist/query-builder/mod.js.map +1 -0
  52. package/dist/query-info.d.ts +38 -0
  53. package/dist/query-info.d.ts.map +1 -0
  54. package/dist/query-info.js +7 -0
  55. package/dist/query-info.js.map +1 -0
  56. package/dist/rehydrate-from-eventlog.d.ts +14 -0
  57. package/dist/rehydrate-from-eventlog.d.ts.map +1 -0
  58. package/dist/rehydrate-from-eventlog.js +64 -0
  59. package/dist/rehydrate-from-eventlog.js.map +1 -0
  60. package/dist/rehydrate-from-mutationlog.d.ts +14 -0
  61. package/dist/rehydrate-from-mutationlog.d.ts.map +1 -0
  62. package/dist/rehydrate-from-mutationlog.js +72 -0
  63. package/dist/rehydrate-from-mutationlog.js.map +1 -0
  64. package/dist/schema/EventDef.d.ts +2 -2
  65. package/dist/schema/client-document-def.d.ts +223 -0
  66. package/dist/schema/client-document-def.d.ts.map +1 -0
  67. package/dist/schema/client-document-def.js +170 -0
  68. package/dist/schema/client-document-def.js.map +1 -0
  69. package/dist/schema/client-document-def.test.d.ts +2 -0
  70. package/dist/schema/client-document-def.test.d.ts.map +1 -0
  71. package/dist/schema/client-document-def.test.js +201 -0
  72. package/dist/schema/client-document-def.test.js.map +1 -0
  73. package/dist/schema/db-schema/ast/sqlite.d.ts +69 -0
  74. package/dist/schema/db-schema/ast/sqlite.d.ts.map +1 -0
  75. package/dist/schema/db-schema/ast/sqlite.js +71 -0
  76. package/dist/schema/db-schema/ast/sqlite.js.map +1 -0
  77. package/dist/schema/db-schema/ast/validate.d.ts +3 -0
  78. package/dist/schema/db-schema/ast/validate.d.ts.map +1 -0
  79. package/dist/schema/db-schema/ast/validate.js +12 -0
  80. package/dist/schema/db-schema/ast/validate.js.map +1 -0
  81. package/dist/schema/db-schema/dsl/field-defs.d.ts +90 -0
  82. package/dist/schema/db-schema/dsl/field-defs.d.ts.map +1 -0
  83. package/dist/schema/db-schema/dsl/field-defs.js +87 -0
  84. package/dist/schema/db-schema/dsl/field-defs.js.map +1 -0
  85. package/dist/schema/db-schema/dsl/field-defs.test.d.ts +2 -0
  86. package/dist/schema/db-schema/dsl/field-defs.test.d.ts.map +1 -0
  87. package/dist/schema/db-schema/dsl/field-defs.test.js +29 -0
  88. package/dist/schema/db-schema/dsl/field-defs.test.js.map +1 -0
  89. package/dist/schema/db-schema/dsl/mod.d.ts +90 -0
  90. package/dist/schema/db-schema/dsl/mod.d.ts.map +1 -0
  91. package/dist/schema/db-schema/dsl/mod.js +41 -0
  92. package/dist/schema/db-schema/dsl/mod.js.map +1 -0
  93. package/dist/schema/db-schema/hash.d.ts +2 -0
  94. package/dist/schema/db-schema/hash.d.ts.map +1 -0
  95. package/dist/schema/db-schema/hash.js +14 -0
  96. package/dist/schema/db-schema/hash.js.map +1 -0
  97. package/dist/schema/db-schema/mod.d.ts +3 -0
  98. package/dist/schema/db-schema/mod.d.ts.map +1 -0
  99. package/dist/schema/db-schema/mod.js +3 -0
  100. package/dist/schema/db-schema/mod.js.map +1 -0
  101. package/dist/schema/index.d.ts +62 -0
  102. package/dist/schema/index.d.ts.map +1 -0
  103. package/dist/schema/index.js +67 -0
  104. package/dist/schema/index.js.map +1 -0
  105. package/dist/schema/mutations.d.ts +227 -0
  106. package/dist/schema/mutations.d.ts.map +1 -0
  107. package/dist/schema/mutations.js +68 -0
  108. package/dist/schema/mutations.js.map +1 -0
  109. package/dist/schema/schema-helpers.d.ts +4 -0
  110. package/dist/schema/schema-helpers.d.ts.map +1 -0
  111. package/dist/schema/schema-helpers.js +30 -0
  112. package/dist/schema/schema-helpers.js.map +1 -0
  113. package/dist/schema/sqlite-state.d.ts +12 -0
  114. package/dist/schema/sqlite-state.d.ts.map +1 -0
  115. package/dist/schema/sqlite-state.js +36 -0
  116. package/dist/schema/sqlite-state.js.map +1 -0
  117. package/dist/schema/state/sqlite/query-builder/impl.test.d.ts +3 -3
  118. package/dist/schema/state/sqlite/sqlite-state.d.ts +12 -0
  119. package/dist/schema/state/sqlite/sqlite-state.d.ts.map +1 -0
  120. package/dist/schema/state/sqlite/sqlite-state.js +36 -0
  121. package/dist/schema/state/sqlite/sqlite-state.js.map +1 -0
  122. package/dist/schema/state/sqlite/system-tables.d.ts +2 -2
  123. package/dist/schema/state/state.d.ts +3 -0
  124. package/dist/schema/state/state.d.ts.map +1 -0
  125. package/dist/schema/state/state.js +3 -0
  126. package/dist/schema/state/state.js.map +1 -0
  127. package/dist/schema/state.d.ts +3 -0
  128. package/dist/schema/state.d.ts.map +1 -0
  129. package/dist/schema/state.js +3 -0
  130. package/dist/schema/state.js.map +1 -0
  131. package/dist/schema/system-tables.d.ts +27 -0
  132. package/dist/schema/system-tables.d.ts.map +1 -0
  133. package/dist/schema/system-tables.js +86 -0
  134. package/dist/schema/system-tables.js.map +1 -0
  135. package/dist/schema/table-def.d.ts +84 -0
  136. package/dist/schema/table-def.d.ts.map +1 -0
  137. package/dist/schema/table-def.js +36 -0
  138. package/dist/schema/table-def.js.map +1 -0
  139. package/dist/schema/view.d.ts +3 -0
  140. package/dist/schema/view.d.ts.map +1 -0
  141. package/dist/schema/view.js +3 -0
  142. package/dist/schema/view.js.map +1 -0
  143. package/dist/schema-management/validate-mutation-defs.d.ts +8 -0
  144. package/dist/schema-management/validate-mutation-defs.d.ts.map +1 -0
  145. package/dist/schema-management/validate-mutation-defs.js +39 -0
  146. package/dist/schema-management/validate-mutation-defs.js.map +1 -0
  147. package/dist/sync/next/test/mutation-fixtures.d.ts +73 -0
  148. package/dist/sync/next/test/mutation-fixtures.d.ts.map +1 -0
  149. package/dist/sync/next/test/mutation-fixtures.js +161 -0
  150. package/dist/sync/next/test/mutation-fixtures.js.map +1 -0
  151. package/dist/sync/next-mutation-event-id-pair.d.ts +14 -0
  152. package/dist/sync/next-mutation-event-id-pair.d.ts.map +1 -0
  153. package/dist/sync/next-mutation-event-id-pair.js +13 -0
  154. package/dist/sync/next-mutation-event-id-pair.js.map +1 -0
  155. package/dist/sync/syncstate.d.ts +2 -2
  156. package/package.json +3 -3
@@ -0,0 +1,77 @@
1
+ import type { SqliteDsl } from '@livestore/db-schema';
2
+ import type { GetValForKey } from '@livestore/utils';
3
+ import type { MutationEvent } from './schema/mutations.js';
4
+ import type * as DbSchema from './schema/table-def.js';
5
+ export declare const makeDerivedMutationDefsForTable: <TTableDef extends DbSchema.TableDefBase<DbSchema.DefaultSqliteTableDefConstrained, DbSchema.TableOptions & {
6
+ deriveMutations: {
7
+ enabled: true;
8
+ };
9
+ }>>(table: TTableDef) => {
10
+ insert: import("./schema/mutations.js").MutationDef<`_Derived_Create_${any}`, {
11
+ readonly [x: string]: any;
12
+ } & {
13
+ readonly [x: string]: any;
14
+ }, any>;
15
+ update: import("./schema/mutations.js").MutationDef<`_Derived_Update_${any}`, {
16
+ readonly values: {};
17
+ readonly where: {};
18
+ }, {
19
+ readonly values: {};
20
+ readonly where: {};
21
+ }>;
22
+ delete: import("./schema/mutations.js").MutationDef<`_Derived_Delete_${any}`, {
23
+ readonly where: {};
24
+ }, {
25
+ readonly where: {};
26
+ }>;
27
+ };
28
+ export declare const deriveCreateMutationDef: <TTableDef extends DbSchema.TableDefBase<DbSchema.DefaultSqliteTableDefConstrained, DbSchema.TableOptions & {
29
+ deriveMutations: {
30
+ enabled: true;
31
+ };
32
+ }>>(table: TTableDef) => import("./schema/mutations.js").MutationDef<`_Derived_Create_${any}`, {
33
+ readonly [x: string]: any;
34
+ } & {
35
+ readonly [x: string]: any;
36
+ }, any>;
37
+ export declare const deriveUpdateMutationDef: <TTableDef extends DbSchema.TableDefBase<DbSchema.DefaultSqliteTableDefConstrained, DbSchema.TableOptions & {
38
+ deriveMutations: {
39
+ enabled: true;
40
+ };
41
+ }>>(table: TTableDef) => import("./schema/mutations.js").MutationDef<`_Derived_Update_${any}`, {
42
+ readonly values: {};
43
+ readonly where: {};
44
+ }, {
45
+ readonly values: {};
46
+ readonly where: {};
47
+ }>;
48
+ export declare const deriveDeleteMutationDef: <TTableDef extends DbSchema.TableDefBase<DbSchema.DefaultSqliteTableDefConstrained, DbSchema.TableOptions & {
49
+ deriveMutations: {
50
+ enabled: true;
51
+ };
52
+ }>>(table: TTableDef) => import("./schema/mutations.js").MutationDef<`_Derived_Delete_${any}`, {
53
+ readonly where: {};
54
+ }, {
55
+ readonly where: {};
56
+ }>;
57
+ /**
58
+ * Convenience helper functions on top of the derived mutation definitions.
59
+ */
60
+ export type DerivedMutationHelperFns<TColumns extends SqliteDsl.ConstraintColumns, TOptions extends DbSchema.TableOptions> = {
61
+ insert: DerivedMutationHelperFns.InsertMutationFn<TColumns, TOptions>;
62
+ update: DerivedMutationHelperFns.UpdateMutationFn<TColumns, TOptions>;
63
+ delete: DerivedMutationHelperFns.DeleteMutationFn<TColumns, TOptions>;
64
+ };
65
+ export declare namespace DerivedMutationHelperFns {
66
+ export type InsertMutationFn<TColumns extends SqliteDsl.ConstraintColumns, TOptions extends DbSchema.TableOptions> = SqliteDsl.AnyIfConstained<TColumns, UseShortcut<TOptions> extends true ? (values?: GetValForKey<SqliteDsl.FromColumns.InsertRowDecoded<TColumns>, 'value'>) => MutationEvent.PartialAny : (values: SqliteDsl.FromColumns.InsertRowDecoded<TColumns>) => MutationEvent.PartialAny>;
67
+ export type UpdateMutationFn<TColumns extends SqliteDsl.ConstraintColumns, TOptions extends DbSchema.TableOptions> = SqliteDsl.AnyIfConstained<TColumns, UseShortcut<TOptions> extends true ? (values: Partial<GetValForKey<SqliteDsl.FromColumns.RowDecoded<TColumns>, 'value'>>) => MutationEvent.PartialAny : (args: {
68
+ where: Partial<SqliteDsl.FromColumns.RowDecoded<TColumns>>;
69
+ values: Partial<SqliteDsl.FromColumns.RowDecoded<TColumns>>;
70
+ }) => MutationEvent.PartialAny>;
71
+ export type DeleteMutationFn<TColumns extends SqliteDsl.ConstraintColumns, _TOptions extends DbSchema.TableOptions> = (args: {
72
+ where: Partial<SqliteDsl.FromColumns.RowDecoded<TColumns>>;
73
+ }) => MutationEvent.PartialAny;
74
+ type UseShortcut<TOptions extends DbSchema.TableOptions> = TOptions['isSingleColumn'] extends true ? TOptions['isSingleton'] extends true ? true : false : false;
75
+ export {};
76
+ }
77
+ //# sourceMappingURL=derived-mutations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"derived-mutations.d.ts","sourceRoot":"","sources":["../src/derived-mutations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ import { ReadonlyRecord, Schema } from '@livestore/utils/effect';
2
+ import { defineMutation } from './schema/mutations.js';
3
+ import { getDefaultValuesDecoded } from './schema/schema-helpers.js';
4
+ import { deleteRows, insertRow, updateRows } from './sql-queries/sql-queries.js';
5
+ export const makeDerivedMutationDefsForTable = (table) => ({
6
+ insert: deriveCreateMutationDef(table),
7
+ update: deriveUpdateMutationDef(table),
8
+ delete: deriveDeleteMutationDef(table),
9
+ });
10
+ export const deriveCreateMutationDef = (table) => {
11
+ const tableName = table.sqliteDef.name;
12
+ const [optionalFields, requiredColumns] = ReadonlyRecord.partition(table.sqliteDef.columns, (col) => col.nullable === false && col.default._tag === 'None');
13
+ const insertSchema = Schema.Struct(ReadonlyRecord.map(requiredColumns, (col) => col.schema))
14
+ .pipe(Schema.extend(Schema.partial(Schema.Struct(ReadonlyRecord.map(optionalFields, (col) => col.schema)))))
15
+ .annotations({ title: `${tableName}:Insert` });
16
+ return defineMutation(`_Derived_Create_${tableName}`, insertSchema, ({ id, ...explicitDefaultValues }) => {
17
+ const defaultValues = getDefaultValuesDecoded(table, explicitDefaultValues);
18
+ const [sql, bindValues] = insertRow({
19
+ tableName: table.sqliteDef.name,
20
+ columns: table.sqliteDef.columns,
21
+ values: { ...defaultValues, id },
22
+ });
23
+ return { sql, bindValues, writeTables: new Set([tableName]) };
24
+ }, { localOnly: table.options.deriveMutations.localOnly });
25
+ };
26
+ export const deriveUpdateMutationDef = (table) => {
27
+ const tableName = table.sqliteDef.name;
28
+ return defineMutation(`_Derived_Update_${tableName}`, Schema.Struct({
29
+ where: Schema.partial(table.schema),
30
+ values: Schema.partial(table.schema),
31
+ }).annotations({ title: `${tableName}:Update` }), ({ where, values }) => {
32
+ const [sql, bindValues] = updateRows({
33
+ tableName: table.sqliteDef.name,
34
+ columns: table.sqliteDef.columns,
35
+ where,
36
+ updateValues: values,
37
+ });
38
+ return { sql, bindValues, writeTables: new Set([tableName]) };
39
+ }, { localOnly: table.options.deriveMutations.localOnly });
40
+ };
41
+ export const deriveDeleteMutationDef = (table) => {
42
+ const tableName = table.sqliteDef.name;
43
+ return defineMutation(`_Derived_Delete_${tableName}`, Schema.Struct({
44
+ where: Schema.partial(table.schema),
45
+ }), ({ where }) => {
46
+ const [sql, bindValues] = deleteRows({
47
+ tableName: table.sqliteDef.name,
48
+ columns: table.sqliteDef.columns,
49
+ where,
50
+ });
51
+ return { sql, bindValues, writeTables: new Set([tableName]) };
52
+ }, { localOnly: table.options.deriveMutations.localOnly });
53
+ };
54
+ //# sourceMappingURL=derived-mutations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"derived-mutations.js","sourceRoot":"","sources":["../src/derived-mutations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=derived-mutations.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"derived-mutations.test.d.ts","sourceRoot":"","sources":["../src/derived-mutations.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,93 @@
1
+ import { describe, expect, test } from 'vitest';
2
+ import { appConfig, todos } from './__tests__/fixture.js';
3
+ describe('derived mutations', () => {
4
+ test('todos', () => {
5
+ expect(patchId(todos.insert({ id: 't1', completed: true, text: 'Task 1' }))).toMatchInlineSnapshot(`
6
+ {
7
+ "args": {
8
+ "completed": true,
9
+ "id": "t1",
10
+ "text": "Task 1",
11
+ },
12
+ "id": "00000000-0000-0000-0000-000000000000",
13
+ "mutation": "_Derived_Create_todos",
14
+ }
15
+ `);
16
+ expect(patchId(todos.update({ where: { id: 't1' }, values: { text: 'Task 1 - fixed' } }))).toMatchInlineSnapshot(`
17
+ {
18
+ "args": {
19
+ "values": {
20
+ "text": "Task 1 - fixed",
21
+ },
22
+ "where": {
23
+ "id": "t1",
24
+ },
25
+ },
26
+ "id": "00000000-0000-0000-0000-000000000000",
27
+ "mutation": "_Derived_Update_todos",
28
+ }
29
+ `);
30
+ expect(patchId(todos.delete({ where: { id: 't1' } }))).toMatchInlineSnapshot(`
31
+ {
32
+ "args": {
33
+ "where": {
34
+ "id": "t1",
35
+ },
36
+ },
37
+ "id": "00000000-0000-0000-0000-000000000000",
38
+ "mutation": "_Derived_Delete_todos",
39
+ }
40
+ `);
41
+ });
42
+ test('app_config', () => {
43
+ expect(patchId(appConfig.insert())).toMatchInlineSnapshot(`
44
+ {
45
+ "args": {
46
+ "id": "singleton",
47
+ "value": {
48
+ "value": undefined,
49
+ },
50
+ },
51
+ "id": "00000000-0000-0000-0000-000000000000",
52
+ "mutation": "_Derived_Create_app_config",
53
+ }
54
+ `);
55
+ expect(patchId(appConfig.insert({ fontSize: 12, theme: 'dark' }))).toMatchInlineSnapshot(`
56
+ {
57
+ "args": {
58
+ "id": "singleton",
59
+ "value": {
60
+ "value": {
61
+ "fontSize": 12,
62
+ "theme": "dark",
63
+ },
64
+ },
65
+ },
66
+ "id": "00000000-0000-0000-0000-000000000000",
67
+ "mutation": "_Derived_Create_app_config",
68
+ }
69
+ `);
70
+ expect(patchId(appConfig.update({ fontSize: 13 }))).toMatchInlineSnapshot(`
71
+ {
72
+ "args": {
73
+ "values": {
74
+ "value": {
75
+ "fontSize": 13,
76
+ },
77
+ },
78
+ "where": {
79
+ "id": "singleton",
80
+ },
81
+ },
82
+ "id": "00000000-0000-0000-0000-000000000000",
83
+ "mutation": "_Derived_Update_app_config",
84
+ }
85
+ `);
86
+ });
87
+ });
88
+ const patchId = (muationEvent) => {
89
+ // TODO use new id paradigm
90
+ const id = `00000000-0000-0000-0000-000000000000`;
91
+ return { ...muationEvent, id };
92
+ };
93
+ //# sourceMappingURL=derived-mutations.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"derived-mutations.test.js","sourceRoot":"","sources":["../src/derived-mutations.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAE/C,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAA;AAGzD,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE;QACjB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC;;;;;;;;;;KAUlG,CAAC,CAAA;QAEF,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC;;;;;;;;;;;;;KAahH,CAAC,CAAA;QAEF,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC;;;;;;;;;;KAU5E,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,YAAY,EAAE,GAAG,EAAE;QACtB,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,qBAAqB,CAAC;;;;;;;;;;;KAWzD,CAAC,CAAA;QAEF,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC;;;;;;;;;;;;;;KAcxF,CAAC,CAAA;QAEF,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC;;;;;;;;;;;;;;;KAezE,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,MAAM,OAAO,GAAG,CAAC,YAAsC,EAAE,EAAE;IACzD,2BAA2B;IAC3B,MAAM,EAAE,GAAG,sCAAsC,CAAA;IACjD,OAAO,EAAE,GAAG,YAAY,EAAE,EAAE,EAAE,CAAA;AAChC,CAAC,CAAA"}
@@ -0,0 +1,12 @@
1
+ import type { Effect, PubSub } from '@livestore/utils/effect';
2
+ import type * as Devtools from './devtools-messages.js';
3
+ export type PrepareDevtoolsBridge = {
4
+ /** Messages coming from the app host (usually responses to requests) */
5
+ responsePubSub: PubSub.PubSub<Devtools.MessageFromAppHostCoordinator | Devtools.MessageFromAppHostStore>;
6
+ sendToAppHost: (msg: Devtools.MessageToAppHostCoordinator | Devtools.MessageToAppHostStore) => Effect.Effect<void>;
7
+ appHostId: string;
8
+ copyToClipboard: (text: string) => Effect.Effect<void>;
9
+ sendEscapeKey?: Effect.Effect<void>;
10
+ isLeader: boolean;
11
+ };
12
+ //# sourceMappingURL=devtools-bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devtools-bridge.d.ts","sourceRoot":"","sources":["../../src/devtools/devtools-bridge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAE7D,OAAO,KAAK,KAAK,QAAQ,MAAM,wBAAwB,CAAA;AAEvD,MAAM,MAAM,qBAAqB,GAAG;IAClC,wEAAwE;IACxE,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,6BAA6B,GAAG,QAAQ,CAAC,uBAAuB,CAAC,CAAA;IACxG,aAAa,EAAE,CAAC,GAAG,EAAE,QAAQ,CAAC,2BAA2B,GAAG,QAAQ,CAAC,qBAAqB,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAClH,SAAS,EAAE,MAAM,CAAA;IACjB,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IACtD,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IACnC,QAAQ,EAAE,OAAO,CAAA;CAClB,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=devtools-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devtools-bridge.js","sourceRoot":"","sources":["../../src/devtools/devtools-bridge.ts"],"names":[],"mappings":""}
@@ -23,38 +23,38 @@ declare const DebugInfoRes_base: Schema.Struct<{
23
23
  slowQueries: Schema.transform<Schema.Struct<{
24
24
  size: typeof Schema.Number;
25
25
  items: Schema.Array$<Schema.Schema<{
26
- readonly queryStr: string;
27
26
  readonly bindValues: ((readonly (string | number | Uint8Array<ArrayBufferLike> | null)[] | {
28
27
  readonly [x: string]: string | number | Uint8Array<ArrayBufferLike> | null;
29
28
  }) & import("effect/Brand").Brand<"PreparedBindValues">) | undefined;
29
+ readonly queryStr: string;
30
30
  readonly durationMs: number;
31
31
  readonly rowsCount: number | undefined;
32
32
  readonly queriedTables: ReadonlySet<string>;
33
33
  readonly startTimePerfNow: number;
34
34
  }, {
35
- readonly queryStr: string;
36
35
  readonly bindValues: readonly (string | number | readonly number[] | null)[] | {
37
36
  readonly [x: string]: string | number | readonly number[] | null;
38
37
  } | undefined;
38
+ readonly queryStr: string;
39
39
  readonly durationMs: number;
40
40
  readonly rowsCount: number | undefined;
41
41
  readonly queriedTables: readonly string[];
42
42
  readonly startTimePerfNow: number;
43
43
  }, never>>;
44
44
  }>, Schema.Schema<import("../bounded-collections.js").BoundArray<{
45
- readonly queryStr: string;
46
45
  readonly bindValues: ((readonly (string | number | Uint8Array<ArrayBufferLike> | null)[] | {
47
46
  readonly [x: string]: string | number | Uint8Array<ArrayBufferLike> | null;
48
47
  }) & import("effect/Brand").Brand<"PreparedBindValues">) | undefined;
48
+ readonly queryStr: string;
49
49
  readonly durationMs: number;
50
50
  readonly rowsCount: number | undefined;
51
51
  readonly queriedTables: ReadonlySet<string>;
52
52
  readonly startTimePerfNow: number;
53
53
  }>, import("../bounded-collections.js").BoundArray<{
54
- readonly queryStr: string;
55
54
  readonly bindValues: ((readonly (string | number | Uint8Array<ArrayBufferLike> | null)[] | {
56
55
  readonly [x: string]: string | number | Uint8Array<ArrayBufferLike> | null;
57
56
  }) & import("effect/Brand").Brand<"PreparedBindValues">) | undefined;
57
+ readonly queryStr: string;
58
58
  readonly durationMs: number;
59
59
  readonly rowsCount: number | undefined;
60
60
  readonly queriedTables: ReadonlySet<string>;
@@ -96,38 +96,38 @@ declare const DebugInfoHistoryRes_base: Schema.Struct<{
96
96
  slowQueries: Schema.transform<Schema.Struct<{
97
97
  size: typeof Schema.Number;
98
98
  items: Schema.Array$<Schema.Schema<{
99
- readonly queryStr: string;
100
99
  readonly bindValues: ((readonly (string | number | Uint8Array<ArrayBufferLike> | null)[] | {
101
100
  readonly [x: string]: string | number | Uint8Array<ArrayBufferLike> | null;
102
101
  }) & import("effect/Brand").Brand<"PreparedBindValues">) | undefined;
102
+ readonly queryStr: string;
103
103
  readonly durationMs: number;
104
104
  readonly rowsCount: number | undefined;
105
105
  readonly queriedTables: ReadonlySet<string>;
106
106
  readonly startTimePerfNow: number;
107
107
  }, {
108
- readonly queryStr: string;
109
108
  readonly bindValues: readonly (string | number | readonly number[] | null)[] | {
110
109
  readonly [x: string]: string | number | readonly number[] | null;
111
110
  } | undefined;
111
+ readonly queryStr: string;
112
112
  readonly durationMs: number;
113
113
  readonly rowsCount: number | undefined;
114
114
  readonly queriedTables: readonly string[];
115
115
  readonly startTimePerfNow: number;
116
116
  }, never>>;
117
117
  }>, Schema.Schema<import("../bounded-collections.js").BoundArray<{
118
- readonly queryStr: string;
119
118
  readonly bindValues: ((readonly (string | number | Uint8Array<ArrayBufferLike> | null)[] | {
120
119
  readonly [x: string]: string | number | Uint8Array<ArrayBufferLike> | null;
121
120
  }) & import("effect/Brand").Brand<"PreparedBindValues">) | undefined;
121
+ readonly queryStr: string;
122
122
  readonly durationMs: number;
123
123
  readonly rowsCount: number | undefined;
124
124
  readonly queriedTables: ReadonlySet<string>;
125
125
  readonly startTimePerfNow: number;
126
126
  }>, import("../bounded-collections.js").BoundArray<{
127
- readonly queryStr: string;
128
127
  readonly bindValues: ((readonly (string | number | Uint8Array<ArrayBufferLike> | null)[] | {
129
128
  readonly [x: string]: string | number | Uint8Array<ArrayBufferLike> | null;
130
129
  }) & import("effect/Brand").Brand<"PreparedBindValues">) | undefined;
130
+ readonly queryStr: string;
131
131
  readonly durationMs: number;
132
132
  readonly rowsCount: number | undefined;
133
133
  readonly queriedTables: ReadonlySet<string>;
@@ -0,0 +1,42 @@
1
+ import type { Effect, Scope } from '@livestore/utils/effect';
2
+ import { Schema, WebChannel } from '@livestore/utils/effect';
3
+ export * from './devtools-messages.js';
4
+ export * from './devtools-window-message.js';
5
+ export * from './devtools-bridge.js';
6
+ export declare namespace WebBridge {
7
+ const AppHostReady_base: Schema.TaggedStruct<"LSD.WebBridge.AppHostReady", {
8
+ appHostId: typeof Schema.String;
9
+ isLeader: typeof Schema.Boolean;
10
+ }>;
11
+ export class AppHostReady extends AppHostReady_base {
12
+ }
13
+ const DevtoolsReady_base: Schema.TaggedStruct<"LSD.WebBridge.DevtoolsReady", {
14
+ devtoolsId: typeof Schema.String;
15
+ }>;
16
+ export class DevtoolsReady extends DevtoolsReady_base {
17
+ }
18
+ const ConnectToDevtools_base: Schema.TaggedStruct<"LSD.WebBridge.ConnectToDevtools", {
19
+ devtoolsId: typeof Schema.String;
20
+ appHostId: typeof Schema.String;
21
+ /**
22
+ * Given the m:n relationship between devtools and app hosts and the fact that appHostIds are usually
23
+ * sticky, we generate a new unique id for the lifetime of the web bridge.
24
+ */
25
+ webBridgeId: typeof Schema.String;
26
+ isLeader: typeof Schema.Boolean;
27
+ storeId: typeof Schema.String;
28
+ }>;
29
+ export class ConnectToDevtools extends ConnectToDevtools_base {
30
+ }
31
+ const AppHostWillDisconnect_base: Schema.TaggedStruct<"LSD.WebBridge.AppHostWillDisconnect", {
32
+ appHostId: typeof Schema.String;
33
+ }>;
34
+ export class AppHostWillDisconnect extends AppHostWillDisconnect_base {
35
+ }
36
+ const All_base: Schema.Union<[typeof AppHostReady, typeof DevtoolsReady, typeof ConnectToDevtools, typeof AppHostWillDisconnect]>;
37
+ export class All extends All_base {
38
+ }
39
+ export const makeBroadcastChannel: (key?: string) => Effect.Effect<WebChannel.WebChannel<typeof All.Type, typeof All.Type>, never, Scope.Scope>;
40
+ export {};
41
+ }
42
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/devtools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAA;AAC5D,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAE5D,cAAc,wBAAwB,CAAA;AACtC,cAAc,8BAA8B,CAAA;AAC5C,cAAc,sBAAsB,CAAA;AAEpC,yBAAiB,SAAS,CAAC;;;;;IACzB,MAAM,OAAO,YAAa,SAAQ,iBAIhC;KAAG;;;;IAEL,MAAM,OAAO,aAAc,SAAQ,kBAEjC;KAAG;;;;QAKH;;;WAGG;;;;;IANL,MAAM,OAAO,iBAAkB,SAAQ,sBAUrC;KAAG;;;;IAEL,MAAM,OAAO,qBAAsB,SAAQ,0BAEzC;KAAG;;IAML,MAAM,OAAO,GAAI,SAAQ,QAAmF;KAAG;IAE/G,MAAM,CAAC,MAAM,oBAAoB,GAC/B,MAAM,MAAM,KACX,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,OAAO,GAAG,CAAC,IAAI,EAAE,OAAO,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAKxF,CAAA;;CACL"}
@@ -0,0 +1,49 @@
1
+ import { Schema, WebChannel } from '@livestore/utils/effect';
2
+ export * from './devtools-messages.js';
3
+ export * from './devtools-window-message.js';
4
+ export * from './devtools-bridge.js';
5
+ export var WebBridge;
6
+ (function (WebBridge) {
7
+ class AppHostReady extends Schema.TaggedStruct('LSD.WebBridge.AppHostReady', {
8
+ appHostId: Schema.String,
9
+ // storeId: Schema.String,
10
+ isLeader: Schema.Boolean,
11
+ }) {
12
+ }
13
+ WebBridge.AppHostReady = AppHostReady;
14
+ class DevtoolsReady extends Schema.TaggedStruct('LSD.WebBridge.DevtoolsReady', {
15
+ devtoolsId: Schema.String,
16
+ }) {
17
+ }
18
+ WebBridge.DevtoolsReady = DevtoolsReady;
19
+ class ConnectToDevtools extends Schema.TaggedStruct('LSD.WebBridge.ConnectToDevtools', {
20
+ devtoolsId: Schema.String,
21
+ appHostId: Schema.String,
22
+ /**
23
+ * Given the m:n relationship between devtools and app hosts and the fact that appHostIds are usually
24
+ * sticky, we generate a new unique id for the lifetime of the web bridge.
25
+ */
26
+ webBridgeId: Schema.String,
27
+ isLeader: Schema.Boolean,
28
+ storeId: Schema.String,
29
+ }) {
30
+ }
31
+ WebBridge.ConnectToDevtools = ConnectToDevtools;
32
+ class AppHostWillDisconnect extends Schema.TaggedStruct('LSD.WebBridge.AppHostWillDisconnect', {
33
+ appHostId: Schema.String,
34
+ }) {
35
+ }
36
+ WebBridge.AppHostWillDisconnect = AppHostWillDisconnect;
37
+ // export class DevtoolsWillDisconnect extends Schema.TaggedStruct('LSD.WebBridge.DevtoolsWillDisconnect', {
38
+ // appHostId: Schema.String,
39
+ // }) {}
40
+ class All extends Schema.Union(AppHostReady, DevtoolsReady, ConnectToDevtools, AppHostWillDisconnect) {
41
+ }
42
+ WebBridge.All = All;
43
+ WebBridge.makeBroadcastChannel = (key) => WebChannel.broadcastChannel({
44
+ channelName: `livestore-web-bridge-devtools${key ? `-${key}` : ''}`,
45
+ listenSchema: All,
46
+ sendSchema: All,
47
+ });
48
+ })(WebBridge || (WebBridge = {}));
49
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/devtools/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAE5D,cAAc,wBAAwB,CAAA;AACtC,cAAc,8BAA8B,CAAA;AAC5C,cAAc,sBAAsB,CAAA;AAEpC,MAAM,KAAW,SAAS,CAyCzB;AAzCD,WAAiB,SAAS;IACxB,MAAa,YAAa,SAAQ,MAAM,CAAC,YAAY,CAAC,4BAA4B,EAAE;QAClF,SAAS,EAAE,MAAM,CAAC,MAAM;QACxB,0BAA0B;QAC1B,QAAQ,EAAE,MAAM,CAAC,OAAO;KACzB,CAAC;KAAG;IAJQ,sBAAY,eAIpB,CAAA;IAEL,MAAa,aAAc,SAAQ,MAAM,CAAC,YAAY,CAAC,6BAA6B,EAAE;QACpF,UAAU,EAAE,MAAM,CAAC,MAAM;KAC1B,CAAC;KAAG;IAFQ,uBAAa,gBAErB,CAAA;IAEL,MAAa,iBAAkB,SAAQ,MAAM,CAAC,YAAY,CAAC,iCAAiC,EAAE;QAC5F,UAAU,EAAE,MAAM,CAAC,MAAM;QACzB,SAAS,EAAE,MAAM,CAAC,MAAM;QACxB;;;WAGG;QACH,WAAW,EAAE,MAAM,CAAC,MAAM;QAC1B,QAAQ,EAAE,MAAM,CAAC,OAAO;QACxB,OAAO,EAAE,MAAM,CAAC,MAAM;KACvB,CAAC;KAAG;IAVQ,2BAAiB,oBAUzB,CAAA;IAEL,MAAa,qBAAsB,SAAQ,MAAM,CAAC,YAAY,CAAC,qCAAqC,EAAE;QACpG,SAAS,EAAE,MAAM,CAAC,MAAM;KACzB,CAAC;KAAG;IAFQ,+BAAqB,wBAE7B,CAAA;IAEL,4GAA4G;IAC5G,8BAA8B;IAC9B,QAAQ;IAER,MAAa,GAAI,SAAQ,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,qBAAqB,CAAC;KAAG;IAAlG,aAAG,MAA+F,CAAA;IAElG,8BAAoB,GAAG,CAClC,GAAY,EACgF,EAAE,CAC9F,UAAU,CAAC,gBAAgB,CAAC;QAC1B,WAAW,EAAE,gCAAgC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;QACnE,YAAY,EAAE,GAAG;QACjB,UAAU,EAAE,GAAG;KAChB,CAAC,CAAA;AACN,CAAC,EAzCgB,SAAS,KAAT,SAAS,QAyCzB"}
@@ -0,0 +1,4 @@
1
+ import type { SynchronousDatabase } from './adapter-types.js';
2
+ import type { LiveStoreSchema } from './schema/index.js';
3
+ export declare const initializeSingletonTables: (schema: LiveStoreSchema, db: SynchronousDatabase) => void;
4
+ //# sourceMappingURL=init-singleton-tables.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-singleton-tables.d.ts","sourceRoot":"","sources":["../src/init-singleton-tables.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAIxD,eAAO,MAAM,yBAAyB,GAAI,QAAQ,eAAe,EAAE,IAAI,mBAAmB,SAkBzF,CAAA"}
@@ -0,0 +1,16 @@
1
+ import { getDefaultValuesEncoded } from './schema/schema-helpers.js';
2
+ import { prepareBindValues, sql } from './util.js';
3
+ export const initializeSingletonTables = (schema, db) => {
4
+ for (const [, tableDef] of schema.tables) {
5
+ if (tableDef.options.isSingleton) {
6
+ const defaultValues = getDefaultValuesEncoded(tableDef, undefined);
7
+ const defaultColumnNames = [...Object.keys(defaultValues), 'id'];
8
+ const columnValues = defaultColumnNames.map((name) => `$${name}`).join(', ');
9
+ const tableName = tableDef.sqliteDef.name;
10
+ const insertQuery = sql `insert into ${tableName} (${defaultColumnNames.join(', ')}) select ${columnValues} where not exists(select 1 from ${tableName} where id = 'singleton')`;
11
+ const bindValues = prepareBindValues({ ...defaultValues, id: 'singleton' }, insertQuery);
12
+ db.execute(insertQuery, bindValues);
13
+ }
14
+ }
15
+ };
16
+ //# sourceMappingURL=init-singleton-tables.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-singleton-tables.js","sourceRoot":"","sources":["../src/init-singleton-tables.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAA;AACpE,OAAO,EAAE,iBAAiB,EAAE,GAAG,EAAE,MAAM,WAAW,CAAA;AAElD,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,MAAuB,EAAE,EAAuB,EAAE,EAAE;IAC5F,KAAK,MAAM,CAAC,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QACzC,IAAI,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YACjC,MAAM,aAAa,GAAG,uBAAuB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;YAElE,MAAM,kBAAkB,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC,CAAA;YAChE,MAAM,YAAY,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAE5E,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAA;YACzC,MAAM,WAAW,GAAG,GAAG,CAAA,eAAe,SAAS,KAAK,kBAAkB,CAAC,IAAI,CACzE,IAAI,CACL,YAAY,YAAY,mCAAmC,SAAS,0BAA0B,CAAA;YAE/F,MAAM,UAAU,GAAG,iBAAiB,CAAC,EAAE,GAAG,aAAa,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,WAAW,CAAC,CAAA;YAExF,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,UAAU,CAAC,CAAA;QACrC,CAAC;IACH,CAAC;AACH,CAAC,CAAA"}
@@ -0,0 +1,16 @@
1
+ import { Effect } from '@livestore/utils/effect';
2
+ import type { SqliteDb } from '../adapter-types.js';
3
+ import type { LiveStoreSchema } from '../schema/mod.js';
4
+ import { EventId } from '../schema/mod.js';
5
+ import type { MaterializeEvent } from './types.js';
6
+ export declare const makeMaterializeEvent: ({ schema, dbState: db, dbEventlog, }: {
7
+ schema: LiveStoreSchema;
8
+ dbState: SqliteDb;
9
+ dbEventlog: SqliteDb;
10
+ }) => Effect.Effect<MaterializeEvent, never>;
11
+ export declare const rollback: ({ db, dbEventlog, eventIdsToRollback, }: {
12
+ db: SqliteDb;
13
+ dbEventlog: SqliteDb;
14
+ eventIdsToRollback: EventId.EventId[];
15
+ }) => Effect.Effect<void, never, never>;
16
+ //# sourceMappingURL=apply-event.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply-event.d.ts","sourceRoot":"","sources":["../../src/leader-thread/apply-event.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAyB,MAAM,yBAAyB,CAAA;AAEvE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAEnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,EAAE,OAAO,EAA6B,MAAM,kBAAkB,CAAA;AAKrE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAElD,eAAO,MAAM,oBAAoB,GAAI,sCAIlC;IACD,MAAM,EAAE,eAAe,CAAA;IACvB,OAAO,EAAE,QAAQ,CAAA;IACjB,UAAU,EAAE,QAAQ,CAAA;CACrB,KAAG,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,KAAK,CAiGrC,CAAA;AAEJ,eAAO,MAAM,QAAQ,GAAI,yCAItB;IACD,EAAE,EAAE,QAAQ,CAAA;IACZ,UAAU,EAAE,QAAQ,CAAA;IACpB,kBAAkB,EAAE,OAAO,CAAC,OAAO,EAAE,CAAA;CACtC,sCAsCE,CAAA"}
@@ -0,0 +1,103 @@
1
+ import { LS_DEV, shouldNeverHappen } from '@livestore/utils';
2
+ import { Effect, ReadonlyArray, Schema } from '@livestore/utils/effect';
3
+ import { getExecArgsFromEvent } from '../materializer-helper.js';
4
+ import { EventId, getEventDef, SystemTables } from '../schema/mod.js';
5
+ import { insertRow } from '../sql-queries/index.js';
6
+ import { sql } from '../util.js';
7
+ import { execSql, execSqlPrepared } from './connection.js';
8
+ import * as Eventlog from './eventlog.js';
9
+ export const makeMaterializeEvent = ({ schema, dbState: db, dbEventlog, }) => Effect.gen(function* () {
10
+ const eventDefSchemaHashMap = new Map(
11
+ // TODO Running `Schema.hash` can be a bottleneck for larger schemas. There is an opportunity to run this
12
+ // at build time and lookup the pre-computed hash at runtime.
13
+ // Also see https://github.com/Effect-TS/effect/issues/2719
14
+ [...schema.eventsDefsMap.entries()].map(([k, v]) => [k, Schema.hash(v.schema)]));
15
+ return (eventEncoded, options) => Effect.gen(function* () {
16
+ const skipEventlog = options?.skipEventlog ?? false;
17
+ const eventName = eventEncoded.name;
18
+ const eventDef = getEventDef(schema, eventName);
19
+ const execArgsArr = getExecArgsFromEvent({
20
+ eventDef,
21
+ event: { decoded: undefined, encoded: eventEncoded },
22
+ });
23
+ // NOTE we might want to bring this back if we want to debug no-op events
24
+ // const makeExecuteOptions = (statementSql: string, bindValues: any) => ({
25
+ // onRowsChanged: (rowsChanged: number) => {
26
+ // if (rowsChanged === 0) {
27
+ // console.warn(`Event "${eventDef.name}" did not affect any rows:`, statementSql, bindValues)
28
+ // }
29
+ // },
30
+ // })
31
+ // console.group('[@livestore/common:leader-thread:materializeEvent]', { eventName })
32
+ const session = db.session();
33
+ for (const { statementSql, bindValues } of execArgsArr) {
34
+ // console.debug(eventName, statementSql, bindValues)
35
+ // TODO use cached prepared statements instead of exec
36
+ yield* execSqlPrepared(db, statementSql, bindValues);
37
+ }
38
+ const changeset = session.changeset();
39
+ session.finish();
40
+ // TODO use prepared statements
41
+ yield* execSql(db, ...insertRow({
42
+ tableName: SystemTables.SESSION_CHANGESET_META_TABLE,
43
+ columns: SystemTables.sessionChangesetMetaTable.sqliteDef.columns,
44
+ values: {
45
+ idGlobal: eventEncoded.id.global,
46
+ idClient: eventEncoded.id.client,
47
+ // NOTE the changeset will be empty (i.e. null) for no-op events
48
+ changeset: changeset ?? null,
49
+ debug: LS_DEV ? execArgsArr : null,
50
+ },
51
+ }));
52
+ // console.groupEnd()
53
+ // write to eventlog
54
+ if (skipEventlog === false) {
55
+ const eventName = eventEncoded.name;
56
+ const eventDefSchemaHash = eventDefSchemaHashMap.get(eventName) ?? shouldNeverHappen(`Unknown event definition: ${eventName}`);
57
+ yield* Eventlog.insertIntoEventlog(eventEncoded, dbEventlog, eventDefSchemaHash, eventEncoded.clientId, eventEncoded.sessionId);
58
+ }
59
+ else {
60
+ // console.debug('[@livestore/common:leader-thread] skipping eventlog write', mutation, statementSql, bindValues)
61
+ }
62
+ return {
63
+ sessionChangeset: changeset
64
+ ? {
65
+ _tag: 'sessionChangeset',
66
+ data: changeset,
67
+ debug: LS_DEV ? execArgsArr : null,
68
+ }
69
+ : { _tag: 'no-op' },
70
+ };
71
+ }).pipe(Effect.withSpan(`@livestore/common:leader-thread:materializeEvent`, {
72
+ attributes: {
73
+ eventName: eventEncoded.name,
74
+ mutationId: eventEncoded.id,
75
+ 'span.label': `${EventId.toString(eventEncoded.id)} ${eventEncoded.name}`,
76
+ },
77
+ }));
78
+ });
79
+ export const rollback = ({ db, dbEventlog, eventIdsToRollback, }) => Effect.gen(function* () {
80
+ const rollbackEvents = db
81
+ .select(sql `SELECT * FROM ${SystemTables.SESSION_CHANGESET_META_TABLE} WHERE (idGlobal, idClient) IN (${eventIdsToRollback.map((id) => `(${id.global}, ${id.client})`).join(', ')})`)
82
+ .map((_) => ({ id: { global: _.idGlobal, client: _.idClient }, changeset: _.changeset, debug: _.debug }))
83
+ .toSorted((a, b) => EventId.compare(a.id, b.id));
84
+ // Apply changesets in reverse order
85
+ for (let i = rollbackEvents.length - 1; i >= 0; i--) {
86
+ const { changeset } = rollbackEvents[i];
87
+ if (changeset !== null) {
88
+ db.makeChangeset(changeset).invert().apply();
89
+ }
90
+ }
91
+ const eventIdPairChunks = ReadonlyArray.chunksOf(100)(eventIdsToRollback.map((id) => `(${id.global}, ${id.client})`));
92
+ // Delete the changeset rows
93
+ for (const eventIdPairChunk of eventIdPairChunks) {
94
+ db.execute(sql `DELETE FROM ${SystemTables.SESSION_CHANGESET_META_TABLE} WHERE (idGlobal, idClient) IN (${eventIdPairChunk.join(', ')})`);
95
+ }
96
+ // Delete the eventlog rows
97
+ for (const eventIdPairChunk of eventIdPairChunks) {
98
+ dbEventlog.execute(sql `DELETE FROM ${SystemTables.EVENTLOG_META_TABLE} WHERE (idGlobal, idClient) IN (${eventIdPairChunk.join(', ')})`);
99
+ }
100
+ }).pipe(Effect.withSpan('@livestore/common:LeaderSyncProcessor:rollback', {
101
+ attributes: { count: eventIdsToRollback.length },
102
+ }));
103
+ //# sourceMappingURL=apply-event.js.map