@sqlite-sync/core 0.12.3 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/dist/{reset-state-t0tTGqoh.js → crdt-sync-producer-BY-WobgO.js} +55 -241
  2. package/dist/crdt-sync-producer-BY-WobgO.js.map +1 -0
  3. package/dist/{crdt-sync-remote-source-CPXzmSIS.js → crdt-sync-remote-source-yeTEkOjH.js} +344 -12
  4. package/dist/crdt-sync-remote-source-yeTEkOjH.js.map +1 -0
  5. package/dist/{crdt-table-schema-BRm_WdcW.js → crdt-table-schema-D6Yf61Ex.js} +37 -13
  6. package/dist/crdt-table-schema-D6Yf61Ex.js.map +1 -0
  7. package/dist/{index-BHsKLqcK.d.ts → index-CH4lf3iX.d.ts} +166 -72
  8. package/dist/index.common-C8W9VKSY.js +276 -0
  9. package/dist/index.common-C8W9VKSY.js.map +1 -0
  10. package/dist/index.d.ts +2 -2
  11. package/dist/index.js +20 -677
  12. package/dist/index.js.map +1 -1
  13. package/dist/index.native.d.ts +2 -0
  14. package/dist/index.native.js +9 -0
  15. package/dist/internal.d.ts +1 -1
  16. package/dist/internal.js +2 -2
  17. package/dist/local.d.ts +48 -0
  18. package/dist/local.js +255 -0
  19. package/dist/local.js.map +1 -0
  20. package/dist/{make-crdt-table-C6l0F-o_.js → make-crdt-table-DYCXOYB7.js} +13 -14
  21. package/dist/make-crdt-table-DYCXOYB7.js.map +1 -0
  22. package/dist/reset-state-CPOi_45B.js +220 -0
  23. package/dist/reset-state-CPOi_45B.js.map +1 -0
  24. package/dist/server.d.ts +8 -3
  25. package/dist/server.js +2 -2
  26. package/dist/server.js.map +1 -1
  27. package/dist/sqlite-reactive-db-DLS1xRZp.js +296 -0
  28. package/dist/sqlite-reactive-db-DLS1xRZp.js.map +1 -0
  29. package/dist/synced-db-database-B5M7MrBD.js +81 -0
  30. package/dist/synced-db-database-B5M7MrBD.js.map +1 -0
  31. package/dist/{system-schema-Dvl_BLId.js → system-schema-CXf3FmxN.js} +142 -58
  32. package/dist/system-schema-CXf3FmxN.js.map +1 -0
  33. package/dist/worker.d.ts +2 -10
  34. package/dist/worker.js +11 -177
  35. package/dist/worker.js.map +1 -1
  36. package/dist/ws-remote-source-BbPWrHB6.js +161 -0
  37. package/dist/ws-remote-source-BbPWrHB6.js.map +1 -0
  38. package/dist/ws-remote-source-DFBhDc6Z.d.ts +12 -0
  39. package/package.json +9 -1
  40. package/dist/crdt-sync-remote-source-CPXzmSIS.js.map +0 -1
  41. package/dist/crdt-table-schema-BRm_WdcW.js.map +0 -1
  42. package/dist/make-crdt-table-C6l0F-o_.js.map +0 -1
  43. package/dist/reset-state-t0tTGqoh.js.map +0 -1
  44. package/dist/system-schema-Dvl_BLId.js.map +0 -1
@@ -0,0 +1,276 @@
1
+ import "./system-schema-CXf3FmxN.js";
2
+ import "./crdt-sync-producer-BY-WobgO.js";
3
+ import "./crdt-sync-remote-source-yeTEkOjH.js";
4
+ import "./sqlite-reactive-db-DLS1xRZp.js";
5
+ import { n as buildWriteOriginByName } from "./admit-client-events-BDrJw4SK.js";
6
+ //#region src/schema/define-sync-schema.ts
7
+ const RESERVED_TABLE_NAMES = /* @__PURE__ */ new Set([
8
+ "change_history",
9
+ "crdt_events",
10
+ "worker.crdt_events",
11
+ "persisted_crdt_events",
12
+ "crdt_update_log",
13
+ "crdt_change_intents",
14
+ "worker.kv",
15
+ "sync_kv"
16
+ ]);
17
+ /**
18
+ * Define a sync database schema from `t.table()` builders.
19
+ *
20
+ * Record keys are the crdt (view) table names; base table names default to the key
21
+ * prefixed with "_", overridable per table via `t.table(cols, { baseName })`.
22
+ */
23
+ function defineSyncSchema({ tables, migrations }) {
24
+ const tablesConfig = Object.entries(tables).map(([crdtTableName, table]) => ({
25
+ crdtTableName,
26
+ baseTableName: table.baseName ?? `_${crdtTableName}`,
27
+ ...table.exportImport === "ignore" ? { exportImport: "ignore" } : {}
28
+ }));
29
+ const seenNames = /* @__PURE__ */ new Set();
30
+ for (const { crdtTableName, baseTableName } of tablesConfig) for (const name of [crdtTableName, baseTableName]) {
31
+ const normalizedName = name.toLowerCase();
32
+ if (RESERVED_TABLE_NAMES.has(normalizedName)) throw new Error(`Table name "${name}" is reserved by sqlite-sync and cannot be used in a sync schema`);
33
+ if (seenNames.has(normalizedName)) throw new Error(`Duplicate table name "${name}" in sync schema`);
34
+ seenNames.add(normalizedName);
35
+ }
36
+ const writeOriginByName = buildWriteOriginByName({
37
+ tables,
38
+ tablesConfig
39
+ });
40
+ return {
41
+ tables,
42
+ get tablesConfig() {
43
+ return tablesConfig;
44
+ },
45
+ get writeOriginByName() {
46
+ return writeOriginByName;
47
+ },
48
+ get migrations() {
49
+ return migrations;
50
+ },
51
+ get "~clientSchema"() {
52
+ throw new Error("~clientSchema is type-only and cannot be accessed at runtime");
53
+ },
54
+ get "~serverSchema"() {
55
+ throw new Error("~serverSchema is type-only and cannot be accessed at runtime");
56
+ },
57
+ get "~mutationsSchema"() {
58
+ throw new Error("~mutationsSchema is type-only and cannot be accessed at runtime");
59
+ }
60
+ };
61
+ }
62
+ //#endregion
63
+ //#region src/schema/table-builder.ts
64
+ var ColumnBuilder = class ColumnBuilder {
65
+ meta;
66
+ constructor(meta) {
67
+ this.meta = meta;
68
+ }
69
+ /** Allow SQL NULL; widens the value type with `null`. */
70
+ nullable() {
71
+ return new ColumnBuilder({
72
+ ...this.meta,
73
+ nullable: true
74
+ });
75
+ }
76
+ /** Declare a column default. Creates may omit the column; it must match the migrated DDL default. */
77
+ default(value) {
78
+ return new ColumnBuilder({
79
+ ...this.meta,
80
+ hasDefault: true,
81
+ defaultValue: value
82
+ });
83
+ }
84
+ /** Narrow the TypeScript value type without changing storage, e.g. `t.text().$type<"movie" | "tv">()`. */
85
+ $type() {
86
+ return this;
87
+ }
88
+ /** Human/AI-readable description, surfaced in generated schema docs. */
89
+ describe(description) {
90
+ return new ColumnBuilder({
91
+ ...this.meta,
92
+ description
93
+ });
94
+ }
95
+ };
96
+ const RESERVED_COLUMNS = ["id", "tombstone"];
97
+ const idColumnMeta = {
98
+ kind: "text",
99
+ sqlType: "text",
100
+ nullable: false,
101
+ hasDefault: false,
102
+ description: "Unique immutable item id"
103
+ };
104
+ const tombstoneColumnMeta = {
105
+ kind: "boolean",
106
+ sqlType: "integer",
107
+ nullable: false,
108
+ hasDefault: true,
109
+ defaultValue: false,
110
+ description: "Soft-delete marker"
111
+ };
112
+ var TableBuilder = class TableBuilder {
113
+ userColumns;
114
+ /** All columns in DDL order, including the auto-injected `id` and `tombstone`. */
115
+ columns;
116
+ baseName;
117
+ description;
118
+ /** Resolved {@link AiAccess}; defaults to `"read-write"`. */
119
+ aiAccess;
120
+ /** Resolved {@link WriteOrigin}; defaults to `"any"`. */
121
+ writeOrigin;
122
+ /** Resolved {@link ExportImportMode}; defaults to `"include"`. */
123
+ exportImport;
124
+ constructor(userColumns, options) {
125
+ this.userColumns = userColumns;
126
+ for (const reserved of RESERVED_COLUMNS) if (reserved in userColumns) throw new Error(`Column "${reserved}" is added automatically to every synced table and cannot be declared`);
127
+ this.columns = {
128
+ id: idColumnMeta,
129
+ ...Object.fromEntries(Object.entries(userColumns).map(([name, column]) => [name, column.meta])),
130
+ tombstone: tombstoneColumnMeta
131
+ };
132
+ this.baseName = options?.baseName;
133
+ this.description = options?.description;
134
+ this.aiAccess = options?.ai ?? "read-write";
135
+ this.writeOrigin = options?.writes ?? "any";
136
+ this.exportImport = options?.exportImport ?? "include";
137
+ }
138
+ describe(description) {
139
+ return new TableBuilder(this.userColumns, {
140
+ baseName: this.baseName,
141
+ description,
142
+ ai: this.aiAccess,
143
+ writes: this.writeOrigin,
144
+ exportImport: this.exportImport
145
+ });
146
+ }
147
+ /** Type-only: the row shape returned by queries. Do not access at runtime. */
148
+ get $row() {
149
+ return null;
150
+ }
151
+ /**
152
+ * Validate a CRDT event payload against the declared columns.
153
+ * `item-created` payloads must contain every column without a default (nullable columns may be omitted)
154
+ * and their `tombstone` value is ignored, since applying a create always sets it to 0;
155
+ * `item-updated` payloads are partial and must not touch `id` or set `tombstone` to a deleted value.
156
+ */
157
+ validatePayload(payload, options) {
158
+ const event = options?.event ?? "item-created";
159
+ const errors = [];
160
+ for (const key of Object.keys(payload)) if (!Object.hasOwn(this.columns, key)) errors.push(`Unknown column "${key}"`);
161
+ if (event === "item-updated") {
162
+ if ("id" in payload) errors.push(`Column "id" is immutable and cannot appear in an update payload`);
163
+ if (payload.tombstone === true || payload.tombstone === 1) errors.push(`Column "tombstone" cannot be set to true/1 in an update payload; use an item-deleted event`);
164
+ }
165
+ if (event === "item-created") for (const [name, meta] of Object.entries(this.columns)) {
166
+ if (Object.hasOwn(payload, name) || name === "tombstone" || meta.nullable || meta.hasDefault) continue;
167
+ errors.push(`Missing required column "${name}"`);
168
+ }
169
+ for (const [name, value] of Object.entries(payload)) {
170
+ const meta = Object.hasOwn(this.columns, name) ? this.columns[name] : void 0;
171
+ if (!meta || event === "item-updated" && name === "id" || event === "item-created" && name === "tombstone") continue;
172
+ const error = validateValue(name, value, meta);
173
+ if (error) errors.push(error);
174
+ }
175
+ return errors.length === 0 ? { success: true } : {
176
+ success: false,
177
+ errors
178
+ };
179
+ }
180
+ };
181
+ function describeValue(value) {
182
+ if (value === null) return "null";
183
+ if (Array.isArray(value)) return "array";
184
+ return typeof value;
185
+ }
186
+ function validateValue(name, value, meta) {
187
+ if (value === null) return meta.nullable ? null : `Column "${name}" is not nullable, got null`;
188
+ switch (meta.kind) {
189
+ case "text": return typeof value === "string" ? null : `Column "${name}" expects text, got ${describeValue(value)}`;
190
+ case "integer": return typeof value === "number" && Number.isInteger(value) ? null : `Column "${name}" expects an integer, got ${describeValue(value)}`;
191
+ case "real": return typeof value === "number" && Number.isFinite(value) ? null : `Column "${name}" expects a number, got ${describeValue(value)}`;
192
+ case "boolean": return typeof value === "boolean" || value === 0 || value === 1 ? null : `Column "${name}" expects a boolean (true/false or 0/1), got ${describeValue(value)}`;
193
+ case "enum":
194
+ if (typeof value !== "string") return `Column "${name}" expects one of ${formatEnumValues(meta)}, got ${describeValue(value)}`;
195
+ return meta.enumValues?.includes(value) ? null : `Column "${name}" expects one of ${formatEnumValues(meta)}, got "${value}"`;
196
+ }
197
+ }
198
+ function formatEnumValues(meta) {
199
+ return (meta.enumValues ?? []).map((value) => `"${value}"`).join(" | ");
200
+ }
201
+ function column(kind, sqlType) {
202
+ return new ColumnBuilder({
203
+ kind,
204
+ sqlType,
205
+ nullable: false,
206
+ hasDefault: false
207
+ });
208
+ }
209
+ const t = {
210
+ text: () => column("text", "text"),
211
+ integer: () => column("integer", "integer"),
212
+ real: () => column("real", "real"),
213
+ /** Stored as INTEGER 0/1; always bind booleans as 0/1 when writing raw SQL. */
214
+ boolean: () => column("boolean", "integer"),
215
+ /**
216
+ * Union of string literals stored as TEXT, e.g. `t.enum(["movie", "tv"])`. Unlike `$type`, the
217
+ * allowed values are kept as runtime metadata, so payloads are validated against them.
218
+ * For an open-ended set, use `t.text().$type<"idle" | (string & {})>()` instead.
219
+ */
220
+ enum: (values) => new ColumnBuilder({
221
+ kind: "enum",
222
+ sqlType: "text",
223
+ nullable: false,
224
+ hasDefault: false,
225
+ enumValues: values
226
+ }),
227
+ table: (columns, options) => new TableBuilder(columns, options)
228
+ };
229
+ //#endregion
230
+ //#region src/sqlite-crdt/crdt-storage-mutator.ts
231
+ function createCrdtStorageMutator({ storage }) {
232
+ const mapToStorageEvent = (event) => {
233
+ switch (event.type) {
234
+ case "item-created": return {
235
+ type: "item-created",
236
+ dataset: event.dataset,
237
+ item_id: event.item_id,
238
+ payload: JSON.stringify(event.payload)
239
+ };
240
+ case "item-updated": return {
241
+ type: "item-updated",
242
+ dataset: event.dataset,
243
+ item_id: event.item_id,
244
+ payload: JSON.stringify(event.payload)
245
+ };
246
+ case "item-deleted": return {
247
+ type: "item-deleted",
248
+ dataset: event.dataset,
249
+ item_id: event.item_id,
250
+ payload: "{}"
251
+ };
252
+ }
253
+ };
254
+ const applyEvents = (events) => {
255
+ storage.applyOwnEvents(events.map(mapToStorageEvent));
256
+ };
257
+ const applyEvent = (event) => {
258
+ storage.applyOwnEvents([mapToStorageEvent(event)]);
259
+ };
260
+ const applySnapshot = (snapshot) => {
261
+ storage.applyOwnSnapshot({
262
+ dataset: snapshot.dataset,
263
+ item_id: snapshot.id,
264
+ patch: { ...snapshot.patch }
265
+ });
266
+ };
267
+ return {
268
+ applyEvent,
269
+ applyEvents,
270
+ applySnapshot
271
+ };
272
+ }
273
+ //#endregion
274
+ export { defineSyncSchema as a, t as i, ColumnBuilder as n, TableBuilder as r, createCrdtStorageMutator as t };
275
+
276
+ //# sourceMappingURL=index.common-C8W9VKSY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.common-C8W9VKSY.js","names":[],"sources":["../src/schema/define-sync-schema.ts","../src/schema/table-builder.ts","../src/sqlite-crdt/crdt-storage-mutator.ts"],"sourcesContent":["import type { Migrations } from \"../migrations/migrator\";\nimport type { CrdtTableConfig, ReadonlyTable, SyncDbSchema } from \"../sqlite-crdt/crdt-schema\";\nimport { buildWriteOriginByName } from \"./admit-client-events\";\nimport type {\n AnyTableBuilder,\n InferRow,\n SyncSchemaTables,\n TableBuilder,\n TableColumns,\n WriteOrigin,\n} from \"./table-builder\";\n\ntype Simplify<T> = { [K in keyof T]: T[K] } & {};\n\n// Names sqlite-sync uses for its own tables/views, so a user schema can't shadow them.\nconst RESERVED_TABLE_NAMES = new Set<string>([\n \"change_history\",\n \"crdt_events\",\n \"worker.crdt_events\",\n \"persisted_crdt_events\",\n \"crdt_update_log\",\n \"crdt_change_intents\",\n \"worker.kv\",\n \"sync_kv\",\n]);\n\ntype RowOf<Table extends AnyTableBuilder> =\n Table extends TableBuilder<infer Cols extends TableColumns, any, WriteOrigin> ? InferRow<Cols> : never;\n\n// Falls back to the \"_\" convention unless ~baseName is a string *literal* — inference can\n// resolve an omitted override to its constraint (string | undefined) rather than undefined.\ntype BaseNameOf<CrdtName, Table extends AnyTableBuilder> = string extends Table[\"~baseName\"]\n ? `_${CrdtName & string}`\n : [Table[\"~baseName\"]] extends [string]\n ? Table[\"~baseName\"]\n : `_${CrdtName & string}`;\n\ntype ClientSchemaOf<Tables extends SyncSchemaTables> = Simplify<\n {\n [K in keyof Tables]: Tables[K][\"~writeOrigin\"] extends \"server\"\n ? ReadonlyTable<RowOf<Tables[K]>>\n : RowOf<Tables[K]>;\n } & {\n [K in keyof Tables as BaseNameOf<K, Tables[K]>]: ReadonlyTable<RowOf<Tables[K]>>;\n }\n>;\n\ntype ServerSchemaOf<Tables extends SyncSchemaTables> = Simplify<\n { [K in keyof Tables]: RowOf<Tables[K]> } & {\n [K in keyof Tables as BaseNameOf<K, Tables[K]>]: ReadonlyTable<RowOf<Tables[K]>>;\n }\n>;\n\ntype MutationsSchemaOf<Tables extends SyncSchemaTables> = Simplify<{\n [K in keyof Tables as BaseNameOf<K, Tables[K]>]: RowOf<Tables[K]>;\n}>;\n\nexport interface DefinedSyncSchema<Tables extends SyncSchemaTables>\n extends SyncDbSchema<ClientSchemaOf<Tables>, ServerSchemaOf<Tables>, MutationsSchemaOf<Tables>> {\n /** The table builders, for type extraction (`typeof schema.tables.item.$row`) and runtime metadata. */\n tables: Tables;\n /** Write origin keyed by crdt and base table name. */\n writeOriginByName: ReadonlyMap<string, WriteOrigin>;\n}\n\nexport type DefineSyncSchemaConfig<Tables extends SyncSchemaTables> = {\n tables: Tables;\n /** Full migration history (including the initial createTable version), built with `createMigrations`. */\n migrations: Migrations;\n};\n\n/**\n * Define a sync database schema from `t.table()` builders.\n *\n * Record keys are the crdt (view) table names; base table names default to the key\n * prefixed with \"_\", overridable per table via `t.table(cols, { baseName })`.\n */\nexport function defineSyncSchema<Tables extends SyncSchemaTables>({\n tables,\n migrations,\n}: DefineSyncSchemaConfig<Tables>): DefinedSyncSchema<Tables> {\n const tablesConfig: CrdtTableConfig[] = Object.entries(tables).map(([crdtTableName, table]) => ({\n crdtTableName,\n baseTableName: table.baseName ?? `_${crdtTableName}`,\n ...(table.exportImport === \"ignore\" ? { exportImport: \"ignore\" } : {}),\n }));\n\n const seenNames = new Set<string>();\n for (const { crdtTableName, baseTableName } of tablesConfig) {\n for (const name of [crdtTableName, baseTableName]) {\n const normalizedName = name.toLowerCase();\n if (RESERVED_TABLE_NAMES.has(normalizedName)) {\n throw new Error(`Table name \"${name}\" is reserved by sqlite-sync and cannot be used in a sync schema`);\n }\n if (seenNames.has(normalizedName)) {\n throw new Error(`Duplicate table name \"${name}\" in sync schema`);\n }\n seenNames.add(normalizedName);\n }\n }\n\n const writeOriginByName = buildWriteOriginByName({ tables, tablesConfig });\n\n return {\n tables,\n get tablesConfig() {\n return tablesConfig;\n },\n get writeOriginByName() {\n return writeOriginByName;\n },\n get migrations() {\n return migrations;\n },\n get \"~clientSchema\"(): never {\n throw new Error(\"~clientSchema is type-only and cannot be accessed at runtime\");\n },\n get \"~serverSchema\"(): never {\n throw new Error(\"~serverSchema is type-only and cannot be accessed at runtime\");\n },\n get \"~mutationsSchema\"(): never {\n throw new Error(\"~mutationsSchema is type-only and cannot be accessed at runtime\");\n },\n };\n}\n","export type ColumnKind = \"text\" | \"integer\" | \"real\" | \"boolean\" | \"enum\";\n\nexport type SqliteStorageType = \"text\" | \"integer\" | \"real\";\n\n/**\n * What `@sqlite-sync/ai` may do with a table.\n * `read-only`: documented and queryable; mutations rejected.\n * `hidden`: omitted from the schema doc; reads rejected.\n */\nexport type AiAccess = \"read-write\" | \"read-only\" | \"hidden\";\n\n/**\n * Who may author CRDT events for a table.\n * `\"any\"` (default): every replica. `\"server\"`: client pushes drop these events.\n */\nexport type WriteOrigin = \"any\" | \"server\";\n\n/** Whether backup and restore include a table. */\nexport type ExportImportMode = \"include\" | \"ignore\";\n\nexport type ColumnMeta = {\n kind: ColumnKind;\n /** Storage type used in generated DDL. Booleans store as integer 0/1. */\n sqlType: SqliteStorageType;\n nullable: boolean;\n hasDefault: boolean;\n /** Declared default in JS form (booleans as booleans). */\n defaultValue?: unknown;\n /** Allowed values for `enum` columns. */\n enumValues?: readonly string[];\n description?: string;\n};\n\nexport class ColumnBuilder<Value, HasDefault extends boolean = false> {\n declare readonly \"~types\": { value: Value; hasDefault: HasDefault };\n\n constructor(readonly meta: ColumnMeta) {}\n\n /** Allow SQL NULL; widens the value type with `null`. */\n nullable(): ColumnBuilder<Value | null, HasDefault> {\n return new ColumnBuilder({ ...this.meta, nullable: true });\n }\n\n /** Declare a column default. Creates may omit the column; it must match the migrated DDL default. */\n default(value: Value): ColumnBuilder<Value, true> {\n return new ColumnBuilder({ ...this.meta, hasDefault: true, defaultValue: value });\n }\n\n /** Narrow the TypeScript value type without changing storage, e.g. `t.text().$type<\"movie\" | \"tv\">()`. */\n $type<Narrowed extends Value>(): ColumnBuilder<Narrowed, HasDefault> {\n return this as unknown as ColumnBuilder<Narrowed, HasDefault>;\n }\n\n /** Human/AI-readable description, surfaced in generated schema docs. */\n describe(description: string): ColumnBuilder<Value, HasDefault> {\n return new ColumnBuilder({ ...this.meta, description });\n }\n}\n\nexport type AnyColumnBuilder = ColumnBuilder<any, boolean>;\n\nexport type TableColumns = Record<string, AnyColumnBuilder>;\n\nexport type AnyTableBuilder = TableBuilder<any, any, WriteOrigin>;\n\nexport type SyncSchemaTables = Record<string, AnyTableBuilder>;\n\nexport type TableOptions<\n BaseName extends string | undefined = string | undefined,\n Writes extends WriteOrigin = \"any\",\n> = {\n /** Override the materialized base table name (defaults to the crdt table name prefixed with \"_\"). */\n baseName?: BaseName;\n description?: string;\n /** Defaults to `\"read-write\"`. See {@link AiAccess}. */\n ai?: AiAccess;\n /** Defaults to `\"any\"`. See {@link WriteOrigin}. */\n writes?: Writes;\n /** Defaults to `\"include\"`. Ignored tables are omitted from export and skipped on import. */\n exportImport?: ExportImportMode;\n};\n\ntype Simplify<T> = { [K in keyof T]: T[K] } & {};\n\ntype ColumnValue<Column> = Column extends ColumnBuilder<infer Value, boolean> ? Value : never;\n\nexport type InferRow<Cols extends TableColumns> = Simplify<\n { id: string } & { [K in keyof Cols]: ColumnValue<Cols[K]> } & { tombstone?: boolean }\n>;\n\nexport type PayloadValidationResult = { success: true } | { success: false; errors: string[] };\n\nconst RESERVED_COLUMNS = [\"id\", \"tombstone\"] as const;\n\nconst idColumnMeta: ColumnMeta = {\n kind: \"text\",\n sqlType: \"text\",\n nullable: false,\n hasDefault: false,\n description: \"Unique immutable item id\",\n};\n\nconst tombstoneColumnMeta: ColumnMeta = {\n kind: \"boolean\",\n sqlType: \"integer\",\n nullable: false,\n hasDefault: true,\n defaultValue: false,\n description: \"Soft-delete marker\",\n};\n\nexport class TableBuilder<\n Cols extends TableColumns,\n BaseName extends string | undefined = undefined,\n Writes extends WriteOrigin = \"any\",\n> {\n declare readonly \"~baseName\": BaseName;\n declare readonly \"~writeOrigin\": Writes;\n\n /** All columns in DDL order, including the auto-injected `id` and `tombstone`. */\n readonly columns: Record<string, ColumnMeta>;\n readonly baseName: BaseName;\n readonly description: string | undefined;\n /** Resolved {@link AiAccess}; defaults to `\"read-write\"`. */\n readonly aiAccess: AiAccess;\n /** Resolved {@link WriteOrigin}; defaults to `\"any\"`. */\n readonly writeOrigin: Writes;\n /** Resolved {@link ExportImportMode}; defaults to `\"include\"`. */\n readonly exportImport: ExportImportMode;\n\n constructor(\n readonly userColumns: Cols,\n options?: TableOptions<BaseName, Writes>,\n ) {\n for (const reserved of RESERVED_COLUMNS) {\n if (reserved in userColumns) {\n throw new Error(`Column \"${reserved}\" is added automatically to every synced table and cannot be declared`);\n }\n }\n\n this.columns = {\n id: idColumnMeta,\n ...Object.fromEntries(Object.entries(userColumns).map(([name, column]) => [name, column.meta])),\n tombstone: tombstoneColumnMeta,\n };\n this.baseName = options?.baseName as BaseName;\n this.description = options?.description;\n this.aiAccess = options?.ai ?? \"read-write\";\n this.writeOrigin = (options?.writes ?? \"any\") as Writes;\n this.exportImport = options?.exportImport ?? \"include\";\n }\n\n describe(description: string): TableBuilder<Cols, BaseName, Writes> {\n return new TableBuilder<Cols, BaseName, Writes>(this.userColumns, {\n baseName: this.baseName,\n description,\n ai: this.aiAccess,\n writes: this.writeOrigin,\n exportImport: this.exportImport,\n });\n }\n\n /** Type-only: the row shape returned by queries. Do not access at runtime. */\n get $row(): InferRow<Cols> {\n return null as never;\n }\n\n /**\n * Validate a CRDT event payload against the declared columns.\n * `item-created` payloads must contain every column without a default (nullable columns may be omitted)\n * and their `tombstone` value is ignored, since applying a create always sets it to 0;\n * `item-updated` payloads are partial and must not touch `id` or set `tombstone` to a deleted value.\n */\n validatePayload(\n payload: Record<string, unknown>,\n options?: { event?: \"item-created\" | \"item-updated\" },\n ): PayloadValidationResult {\n const event = options?.event ?? \"item-created\";\n const errors: string[] = [];\n\n for (const key of Object.keys(payload)) {\n if (!Object.hasOwn(this.columns, key)) {\n errors.push(`Unknown column \"${key}\"`);\n }\n }\n\n if (event === \"item-updated\") {\n if (\"id\" in payload) {\n errors.push(`Column \"id\" is immutable and cannot appear in an update payload`);\n }\n if (payload.tombstone === true || payload.tombstone === 1) {\n errors.push(`Column \"tombstone\" cannot be set to true/1 in an update payload; use an item-deleted event`);\n }\n }\n\n if (event === \"item-created\") {\n for (const [name, meta] of Object.entries(this.columns)) {\n if (Object.hasOwn(payload, name) || name === \"tombstone\" || meta.nullable || meta.hasDefault) {\n continue;\n }\n errors.push(`Missing required column \"${name}\"`);\n }\n }\n\n for (const [name, value] of Object.entries(payload)) {\n const meta = Object.hasOwn(this.columns, name) ? this.columns[name] : undefined;\n if (!meta || (event === \"item-updated\" && name === \"id\") || (event === \"item-created\" && name === \"tombstone\")) {\n continue;\n }\n const error = validateValue(name, value, meta);\n if (error) {\n errors.push(error);\n }\n }\n\n return errors.length === 0 ? { success: true } : { success: false, errors };\n }\n}\n\nfunction describeValue(value: unknown): string {\n if (value === null) return \"null\";\n if (Array.isArray(value)) return \"array\";\n return typeof value;\n}\n\nfunction validateValue(name: string, value: unknown, meta: ColumnMeta): string | null {\n if (value === null) {\n return meta.nullable ? null : `Column \"${name}\" is not nullable, got null`;\n }\n\n switch (meta.kind) {\n case \"text\":\n return typeof value === \"string\" ? null : `Column \"${name}\" expects text, got ${describeValue(value)}`;\n case \"integer\":\n return typeof value === \"number\" && Number.isInteger(value)\n ? null\n : `Column \"${name}\" expects an integer, got ${describeValue(value)}`;\n case \"real\":\n return typeof value === \"number\" && Number.isFinite(value)\n ? null\n : `Column \"${name}\" expects a number, got ${describeValue(value)}`;\n case \"boolean\":\n return typeof value === \"boolean\" || value === 0 || value === 1\n ? null\n : `Column \"${name}\" expects a boolean (true/false or 0/1), got ${describeValue(value)}`;\n case \"enum\": {\n if (typeof value !== \"string\") {\n return `Column \"${name}\" expects one of ${formatEnumValues(meta)}, got ${describeValue(value)}`;\n }\n return meta.enumValues?.includes(value)\n ? null\n : `Column \"${name}\" expects one of ${formatEnumValues(meta)}, got \"${value}\"`;\n }\n }\n}\n\nfunction formatEnumValues(meta: ColumnMeta): string {\n return (meta.enumValues ?? []).map((value) => `\"${value}\"`).join(\" | \");\n}\n\nfunction column<Value>(kind: ColumnKind, sqlType: SqliteStorageType): ColumnBuilder<Value> {\n return new ColumnBuilder<Value>({ kind, sqlType, nullable: false, hasDefault: false });\n}\n\nexport const t = {\n text: () => column<string>(\"text\", \"text\"),\n integer: () => column<number>(\"integer\", \"integer\"),\n real: () => column<number>(\"real\", \"real\"),\n /** Stored as INTEGER 0/1; always bind booleans as 0/1 when writing raw SQL. */\n boolean: () => column<boolean>(\"boolean\", \"integer\"),\n /**\n * Union of string literals stored as TEXT, e.g. `t.enum([\"movie\", \"tv\"])`. Unlike `$type`, the\n * allowed values are kept as runtime metadata, so payloads are validated against them.\n * For an open-ended set, use `t.text().$type<\"idle\" | (string & {})>()` instead.\n */\n enum: <const Values extends readonly [string, ...string[]]>(values: Values) =>\n new ColumnBuilder<Values[number]>({\n kind: \"enum\",\n sqlType: \"text\",\n nullable: false,\n hasDefault: false,\n enumValues: values,\n }),\n table: <\n Cols extends TableColumns,\n const BaseName extends string | undefined = undefined,\n const Writes extends WriteOrigin = \"any\",\n >(\n columns: Cols,\n options?: TableOptions<BaseName, Writes>,\n ) => new TableBuilder(columns, options),\n};\n","import type { CrdtStorage, OwnCrdtEvent } from \"./crdt-storage\";\n\nexport type CrdtStorageMutator<Database> = ReturnType<typeof createCrdtStorageMutator<Database>>;\n\ntype CommitEventOptions<Database, Table extends keyof Database & string> =\n | {\n type: \"item-created\";\n dataset: Table;\n item_id: string;\n payload: CreateEventPayload<Database, Table>;\n }\n | {\n type: \"item-updated\";\n dataset: Table;\n item_id: string;\n payload: UpdateEventPayload<Database, Table>;\n }\n | {\n type: \"item-deleted\";\n dataset: Table;\n item_id: string;\n };\n\ntype AnyCommitEventOptions<Database> = {\n [Table in keyof Database & string]: CommitEventOptions<Database, Table>;\n}[keyof Database & string];\n\ntype CreateEventPayload<Database, Table extends keyof Database> = Omit<Database[Table], \"tombstone\">;\ntype UpdateEventPayload<Database, Table extends keyof Database> = Omit<Partial<Database[Table]>, \"id\" | \"tombstone\">;\n\nexport type SnapshotOptions<Database, Table extends keyof Database & string> = {\n dataset: Table;\n id: string;\n patch: UpdateEventPayload<Database, Table>;\n};\n\nexport function createCrdtStorageMutator<Database>({ storage }: { storage: CrdtStorage }) {\n const mapToStorageEvent = (event: CommitEventOptions<Database, keyof Database & string>): OwnCrdtEvent => {\n switch (event.type) {\n case \"item-created\":\n return {\n type: \"item-created\",\n dataset: event.dataset,\n item_id: event.item_id,\n payload: JSON.stringify(event.payload),\n };\n case \"item-updated\":\n return {\n type: \"item-updated\",\n dataset: event.dataset,\n item_id: event.item_id,\n payload: JSON.stringify(event.payload),\n };\n case \"item-deleted\":\n return {\n type: \"item-deleted\",\n dataset: event.dataset,\n item_id: event.item_id,\n payload: \"{}\",\n };\n }\n };\n\n const applyEvents = (events: AnyCommitEventOptions<Database>[]) => {\n storage.applyOwnEvents(events.map(mapToStorageEvent));\n };\n\n const applyEvent = <Table extends keyof Database & string>(event: CommitEventOptions<Database, Table>) => {\n storage.applyOwnEvents([mapToStorageEvent(event)]);\n };\n\n const applySnapshot = <Table extends keyof Database & string>(snapshot: SnapshotOptions<Database, Table>) => {\n storage.applyOwnSnapshot({\n dataset: snapshot.dataset,\n item_id: snapshot.id,\n patch: { ...snapshot.patch },\n });\n };\n\n return {\n applyEvent,\n applyEvents,\n applySnapshot,\n };\n}\n"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- import { $ as createExportData, $t as ReadonlyTable, A as PendingCrdtEvent, An as CrdtUpdateLogPayload, At as ExecuteParams, B as DefinedSyncSchema, Bt as LogLevel, C as WorkerConfig, Cn as StoredValue, Ct as jsonSafeParse, D as CrdtStorageMutator, Dn as CrdtEventStatus, Dt as KvStoreItem, E as createCrdtSyncProducer, En as CrdtEventOrigin, Et as tryCatchAsync, F as verifySyncSchema, Ft as PreparedStatement, G as SQLiteReactiveDb, Gt as TableMetadata, H as AdmitClientEventsResult, Ht as startPerformanceLogger, I as CrdtEventValidationError, It as QueryBuilderOutput, J as parametersAreEqual, Jt as HLCCounter, K as SharedLiveQuery, Kt as introspectDb, L as NewCrdtEventValidationResult, Lt as SQLiteDbWrapper, M as createSQLiteCrdtApplyFunction, Mn as isNoOpCrdtEventPayload, N as SchemaVerificationIssue, Nn as dummyKysely, Nt as KyselyQueryFactory, O as SnapshotOptions, On as CrdtEventType, Ot as createKvStoreTableQuery, P as formatSchemaVerificationIssues, Q as SyncedDbExport, Qt as CrdtTableConfig, R as validateNewCrdtEvent, Rt as SQLiteTransactionWrapper, Sn as createMigrator, St as generateId, T as WorkerState, Tn as CRDT_EVENT_NO_OP_PAYLOAD, Tt as tryCatch, Ut as ColumnMetadata, V as defineSyncSchema, Vt as Logger, W as admitClientEvents, Wt as DatabaseIntrospection, X as ImportDataOptions, Xt as deserializeHLC, Y as xxhash, Yt as compareHLC, Z as ImportDataResult, Zt as serializeHLC, _n as MigratableEvent, _t as TypedBroadcastChannel, a as SyncedDbDatabase, an as ColumnKind, at as OwnCrdtSnapshot, b as EventsPushResponse, bn as SyncDbMigrator, bt as createDeferredPromise, c as SyncedDbTransaction, cn as InferRow, ct as SystemMigration, dn as SyncSchemaTables, dt as applyWorkerDbSchema, en as SyncDbSchema, et as createImportData, fn as TableBuilder, g as CrdtSyncRemoteSource, gn as t, gt as DistributiveOmit, h as makeCrdtTable, hn as WriteOrigin, ht as DeferredPromise, i as SyncedDb, in as ColumnBuilder, it as OwnCrdtEvent, j as createCrdtApplyFunction, jn as PersistedCrdtEvent, jt as ExecuteResult, k as createCrdtStorageMutator, kn as CrdtUpdateLogItem, kt as createSQLiteKvStore, l as UnsafeSyncedDbSqlExecutor, ln as PayloadValidationResult, lt as SystemMigrationContext, mn as TableOptions, n as ResetRequest, nn as AnyColumnBuilder, nt as CrdtStorage, o as SyncedDbOptions, on as ColumnMeta, ot as createCrdtStorage, pn as TableColumns, q as SharedLiveQuerySnapshot, qt as HLC, r as ResetStore, rn as AnyTableBuilder, s as SyncedDbSqlExecutor, sn as ExportImportMode, st as SystemDbConfig, t as RESET_REQUEST_TTL_MS, tn as AiAccess, u as createSyncedDb, un as SqliteStorageType, ut as applyMemoryDbSchema, v as EventsPullRequest, vn as Migrations, vt as TypedEvent, w as WorkerNotificationMessage, wn as createStoredValue, wt as quoteId, x as createCrdtSyncRemoteSource, xn as createMigrations, xt as createTypedEventTarget, y as EventsPushRequest, yn as MigrationsDb, yt as TypedEventTarget, z as DefineSyncSchemaConfig } from "./index-BHsKLqcK.js";
2
- export { type AdmitClientEventsResult, type AiAccess, type AnyColumnBuilder, type AnyTableBuilder, CRDT_EVENT_NO_OP_PAYLOAD, ColumnBuilder, type ColumnKind, type ColumnMeta, type ColumnMetadata, type CrdtEventOrigin, type CrdtEventStatus, type CrdtEventType, CrdtEventValidationError, type CrdtStorage, type CrdtStorageMutator, type CrdtSyncRemoteSource, type CrdtTableConfig, type CrdtUpdateLogItem, type CrdtUpdateLogPayload, type DatabaseIntrospection, type DeferredPromise, type DefineSyncSchemaConfig, type DefinedSyncSchema, type DistributiveOmit, type EventsPullRequest, type EventsPushRequest, type EventsPushResponse, type ExecuteParams, type ExecuteResult, type ExportImportMode, type HLC, HLCCounter, type ImportDataOptions, type ImportDataResult, type InferRow, type KvStoreItem, type KyselyQueryFactory, type LogLevel, type Logger, type MigratableEvent, type Migrations, type MigrationsDb, type NewCrdtEventValidationResult, type OwnCrdtEvent, type OwnCrdtSnapshot, type PayloadValidationResult, type PendingCrdtEvent, type PersistedCrdtEvent, type PreparedStatement, type QueryBuilderOutput, RESET_REQUEST_TTL_MS, type ReadonlyTable, type ResetRequest, type ResetStore, SQLiteDbWrapper, SQLiteReactiveDb, type SQLiteTransactionWrapper, type SchemaVerificationIssue, type SharedLiveQuery, type SharedLiveQuerySnapshot, type SnapshotOptions, type SqliteStorageType, type StoredValue, type SyncDbMigrator, type SyncDbSchema, type SyncSchemaTables, type SyncedDb, type SyncedDbDatabase, type SyncedDbExport, type SyncedDbOptions, type SyncedDbSqlExecutor, type SyncedDbTransaction, type SystemDbConfig, type SystemMigration, type SystemMigrationContext, TableBuilder, type TableColumns, type TableMetadata, type TableOptions, TypedBroadcastChannel, TypedEvent, type TypedEventTarget, type UnsafeSyncedDbSqlExecutor, type WorkerConfig, type WorkerNotificationMessage, type WorkerState, type WriteOrigin, admitClientEvents, applyMemoryDbSchema, applyWorkerDbSchema, compareHLC, createCrdtApplyFunction, createCrdtStorage, createCrdtStorageMutator, createCrdtSyncProducer, createCrdtSyncRemoteSource, createDeferredPromise, createExportData, createImportData, createKvStoreTableQuery, createMigrations, createMigrator, createSQLiteCrdtApplyFunction, createSQLiteKvStore, createStoredValue, createSyncedDb, createTypedEventTarget, defineSyncSchema, deserializeHLC, dummyKysely, formatSchemaVerificationIssues, generateId, introspectDb, isNoOpCrdtEventPayload, jsonSafeParse, makeCrdtTable, parametersAreEqual, quoteId, serializeHLC, startPerformanceLogger, t, tryCatch, tryCatchAsync, validateNewCrdtEvent, verifySyncSchema, xxhash };
1
+ import { $ as parametersAreEqual, $t as ColumnMetadata, A as WorkerState, An as SyncDbMigrator, At as tryCatch, B as verifySyncSchemaWithDriver, Bn as CrdtUpdateLogPayload, Bt as PreparedStatement, C as EventsPullRequest, Cn as TableColumns, Ct as TypedEvent, Dn as MigratableEvent, Dt as generateId, E as createCrdtSyncRemoteSource, En as t, Et as createTypedEventTarget, F as PendingCrdtEvent, Fn as CRDT_EVENT_NO_OP_PAYLOAD, Ft as ExecuteParams, G as DefinedSyncSchema, Gt as SqliteDriver, H as NewCrdtEventValidationResult, Hn as isNoOpCrdtEventPayload, Ht as SQLiteDbWrapper, I as createCrdtApplyFunction, In as CrdtEventOrigin, It as ExecuteResult, Jt as SqliteDriverStatement, K as defineSyncSchema, Kt as SqliteDriverHooks, L as createSQLiteCrdtApplyFunction, Ln as CrdtEventStatus, M as CrdtStorageMutator, Mn as createMigrator, Mt as KvStoreItem, N as SnapshotOptions, Nn as StoredValue, Nt as createKvStoreTableQuery, O as WorkerConfig, On as Migrations, Ot as jsonSafeParse, P as createCrdtStorageMutator, Pn as createStoredValue, Pt as createSQLiteKvStore, Q as SharedLiveQuerySnapshot, Qt as startPerformanceLogger, R as SchemaVerificationIssue, Rn as CrdtEventType, Rt as KyselyQueryFactory, Sn as TableBuilder, St as TypedBroadcastChannel, T as EventsPushResponse, Tn as WriteOrigin, Tt as createDeferredPromise, U as validateNewCrdtEvent, Un as dummyKysely, Ut as SQLiteTransactionWrapper, V as CrdtEventValidationError, Vn as PersistedCrdtEvent, Vt as QueryBuilderOutput, W as DefineSyncSchemaConfig, X as SQLiteReactiveDb, Xt as LogLevel, Y as admitClientEvents, Yt as SqliteDriverValue, Z as SharedLiveQuery, Zt as Logger, _n as ExportImportMode, a as createSQLiteReactiveDb, an as compareHLC, at as createImportData, b as makeCrdtTable, bn as SqliteStorageType, bt as DeferredPromise, c as ResetStore, cn as CrdtTableConfig, d as createSyncedDb, dn as AiAccess, dt as createCrdtStorage, en as DatabaseIntrospection, et as xxhash, f as SyncedDbDatabase, fn as AnyColumnBuilder, ft as SystemDbConfig, gn as ColumnMeta, gt as applyWorkerDbSchema, h as UnsafeSyncedDbSqlExecutor, hn as ColumnKind, ht as applyMemoryDbSchema, i as verifySyncSchema, in as HLCCounter, it as createExportData, j as createCrdtSyncProducer, jn as createMigrations, jt as tryCatchAsync, k as WorkerNotificationMessage, kn as MigrationsDb, kt as quoteId, l as SyncedDb, ln as ReadonlyTable, lt as OwnCrdtEvent, m as SyncedDbTransaction, mn as ColumnBuilder, mt as SystemMigrationContext, n as createWasmSqliteDriver, nn as introspectDb, nt as ImportDataResult, o as RESET_REQUEST_TTL_MS, on as deserializeHLC, p as SyncedDbSqlExecutor, pn as AnyTableBuilder, pt as SystemMigration, q as AdmitClientEventsResult, qt as SqliteDriverRows, r as loadSqliteWasm, rn as HLC, rt as SyncedDbExport, s as ResetRequest, sn as serializeHLC, st as CrdtStorage, t as createWasmMemoryDriver, tn as TableMetadata, tt as ImportDataOptions, u as SyncedDbOptions, un as SyncDbSchema, ut as OwnCrdtSnapshot, vn as InferRow, w as EventsPushRequest, wn as TableOptions, wt as TypedEventTarget, x as CrdtSyncRemoteSource, xn as SyncSchemaTables, xt as DistributiveOmit, yn as PayloadValidationResult, z as formatSchemaVerificationIssues, zn as CrdtUpdateLogItem } from "./index-CH4lf3iX.js";
2
+ export { type AdmitClientEventsResult, type AiAccess, type AnyColumnBuilder, type AnyTableBuilder, CRDT_EVENT_NO_OP_PAYLOAD, ColumnBuilder, type ColumnKind, type ColumnMeta, type ColumnMetadata, type CrdtEventOrigin, type CrdtEventStatus, type CrdtEventType, CrdtEventValidationError, type CrdtStorage, type CrdtStorageMutator, type CrdtSyncRemoteSource, type CrdtTableConfig, type CrdtUpdateLogItem, type CrdtUpdateLogPayload, type DatabaseIntrospection, type DeferredPromise, type DefineSyncSchemaConfig, type DefinedSyncSchema, type DistributiveOmit, type EventsPullRequest, type EventsPushRequest, type EventsPushResponse, type ExecuteParams, type ExecuteResult, type ExportImportMode, type HLC, HLCCounter, type ImportDataOptions, type ImportDataResult, type InferRow, type KvStoreItem, type KyselyQueryFactory, type LogLevel, type Logger, type MigratableEvent, type Migrations, type MigrationsDb, type NewCrdtEventValidationResult, type OwnCrdtEvent, type OwnCrdtSnapshot, type PayloadValidationResult, type PendingCrdtEvent, type PersistedCrdtEvent, type PreparedStatement, type QueryBuilderOutput, RESET_REQUEST_TTL_MS, type ReadonlyTable, type ResetRequest, type ResetStore, SQLiteDbWrapper, SQLiteReactiveDb, type SQLiteTransactionWrapper, type SchemaVerificationIssue, type SharedLiveQuery, type SharedLiveQuerySnapshot, type SnapshotOptions, type SqliteDriver, type SqliteDriverHooks, type SqliteDriverRows, type SqliteDriverStatement, type SqliteDriverValue, type SqliteStorageType, type StoredValue, type SyncDbMigrator, type SyncDbSchema, type SyncSchemaTables, type SyncedDb, type SyncedDbDatabase, type SyncedDbExport, type SyncedDbOptions, type SyncedDbSqlExecutor, type SyncedDbTransaction, type SystemDbConfig, type SystemMigration, type SystemMigrationContext, TableBuilder, type TableColumns, type TableMetadata, type TableOptions, TypedBroadcastChannel, TypedEvent, type TypedEventTarget, type UnsafeSyncedDbSqlExecutor, type WorkerConfig, type WorkerNotificationMessage, type WorkerState, type WriteOrigin, admitClientEvents, applyMemoryDbSchema, applyWorkerDbSchema, compareHLC, createCrdtApplyFunction, createCrdtStorage, createCrdtStorageMutator, createCrdtSyncProducer, createCrdtSyncRemoteSource, createDeferredPromise, createExportData, createImportData, createKvStoreTableQuery, createMigrations, createMigrator, createSQLiteCrdtApplyFunction, createSQLiteKvStore, createSQLiteReactiveDb, createStoredValue, createSyncedDb, createTypedEventTarget, createWasmMemoryDriver, createWasmSqliteDriver, defineSyncSchema, deserializeHLC, dummyKysely, formatSchemaVerificationIssues, generateId, introspectDb, isNoOpCrdtEventPayload, jsonSafeParse, loadSqliteWasm, makeCrdtTable, parametersAreEqual, quoteId, serializeHLC, startPerformanceLogger, t, tryCatch, tryCatchAsync, validateNewCrdtEvent, verifySyncSchema, verifySyncSchemaWithDriver, xxhash };