@syncular/client 0.0.6-95 → 0.1.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 (356) hide show
  1. package/README.md +713 -11
  2. package/dist/auth-leases.d.ts +11 -0
  3. package/dist/auth-leases.d.ts.map +1 -0
  4. package/dist/auth-leases.js +140 -0
  5. package/dist/auth-leases.js.map +1 -0
  6. package/dist/blob-limits.d.ts +15 -0
  7. package/dist/blob-limits.d.ts.map +1 -0
  8. package/dist/blob-limits.js +66 -0
  9. package/dist/blob-limits.js.map +1 -0
  10. package/dist/bridge-client.d.ts +69 -0
  11. package/dist/bridge-client.d.ts.map +1 -0
  12. package/dist/bridge-client.js +282 -0
  13. package/dist/bridge-client.js.map +1 -0
  14. package/dist/client-config.d.ts +6 -0
  15. package/dist/client-config.d.ts.map +1 -0
  16. package/dist/client-config.js +18 -0
  17. package/dist/client-config.js.map +1 -0
  18. package/dist/client.d.ts +65 -397
  19. package/dist/client.d.ts.map +1 -1
  20. package/dist/client.js +150 -960
  21. package/dist/client.js.map +1 -1
  22. package/dist/command-history.d.ts +35 -0
  23. package/dist/command-history.d.ts.map +1 -0
  24. package/dist/command-history.js +378 -0
  25. package/dist/command-history.js.map +1 -0
  26. package/dist/console-diagnostics.d.ts +33 -0
  27. package/dist/console-diagnostics.d.ts.map +1 -0
  28. package/dist/console-diagnostics.js +496 -0
  29. package/dist/console-diagnostics.js.map +1 -0
  30. package/dist/crdt-yjs/index.d.ts +4 -0
  31. package/dist/crdt-yjs/index.d.ts.map +1 -0
  32. package/dist/crdt-yjs/index.js +4 -0
  33. package/dist/crdt-yjs/index.js.map +1 -0
  34. package/dist/crdt-yjs/webview-host-facade.d.ts +126 -0
  35. package/dist/crdt-yjs/webview-host-facade.d.ts.map +1 -0
  36. package/dist/crdt-yjs/webview-host-facade.js +284 -0
  37. package/dist/crdt-yjs/webview-host-facade.js.map +1 -0
  38. package/dist/crdt-yjs/yjs-document-field-adapter.d.ts +153 -0
  39. package/dist/crdt-yjs/yjs-document-field-adapter.d.ts.map +1 -0
  40. package/dist/crdt-yjs/yjs-document-field-adapter.js +406 -0
  41. package/dist/crdt-yjs/yjs-document-field-adapter.js.map +1 -0
  42. package/dist/crdt-yjs/yjs-prosemirror-bridge.d.ts +73 -0
  43. package/dist/crdt-yjs/yjs-prosemirror-bridge.d.ts.map +1 -0
  44. package/dist/crdt-yjs/yjs-prosemirror-bridge.js +169 -0
  45. package/dist/crdt-yjs/yjs-prosemirror-bridge.js.map +1 -0
  46. package/dist/database.d.ts +83 -0
  47. package/dist/database.d.ts.map +1 -0
  48. package/dist/database.js +916 -0
  49. package/dist/database.js.map +1 -0
  50. package/dist/diagnostics.d.ts +10 -0
  51. package/dist/diagnostics.d.ts.map +1 -0
  52. package/dist/diagnostics.js +83 -0
  53. package/dist/diagnostics.js.map +1 -0
  54. package/dist/errors.d.ts +24 -0
  55. package/dist/errors.d.ts.map +1 -0
  56. package/dist/errors.js +211 -0
  57. package/dist/errors.js.map +1 -0
  58. package/dist/generated-bridge.d.ts +365 -0
  59. package/dist/generated-bridge.d.ts.map +1 -0
  60. package/dist/generated-bridge.js +250 -0
  61. package/dist/generated-bridge.js.map +1 -0
  62. package/dist/index.d.ts +13 -23
  63. package/dist/index.d.ts.map +1 -1
  64. package/dist/index.js +14 -25
  65. package/dist/index.js.map +1 -1
  66. package/dist/mutations.d.ts +4 -72
  67. package/dist/mutations.d.ts.map +1 -1
  68. package/dist/mutations.js +2 -568
  69. package/dist/mutations.js.map +1 -1
  70. package/dist/network.d.ts +3 -0
  71. package/dist/network.d.ts.map +1 -0
  72. package/dist/network.js +17 -0
  73. package/dist/network.js.map +1 -0
  74. package/dist/react/index.d.ts +169 -0
  75. package/dist/react/index.d.ts.map +1 -0
  76. package/dist/react/index.js +628 -0
  77. package/dist/react/index.js.map +1 -0
  78. package/dist/react-native/index.d.ts +35 -0
  79. package/dist/react-native/index.d.ts.map +1 -0
  80. package/dist/react-native/index.js +49 -0
  81. package/dist/react-native/index.js.map +1 -0
  82. package/dist/runtime-contract.d.ts +13 -0
  83. package/dist/runtime-contract.d.ts.map +1 -0
  84. package/dist/runtime-contract.js +24 -0
  85. package/dist/runtime-contract.js.map +1 -0
  86. package/dist/rust-client.d.ts +106 -0
  87. package/dist/rust-client.d.ts.map +1 -0
  88. package/dist/rust-client.js +936 -0
  89. package/dist/rust-client.js.map +1 -0
  90. package/dist/sentry.d.ts +35 -0
  91. package/dist/sentry.d.ts.map +1 -0
  92. package/dist/sentry.js +155 -0
  93. package/dist/sentry.js.map +1 -0
  94. package/dist/sql-safety.d.ts +3 -0
  95. package/dist/sql-safety.d.ts.map +1 -0
  96. package/dist/sql-safety.js +62 -0
  97. package/dist/sql-safety.js.map +1 -0
  98. package/dist/syncular-runtime-artifacts.json +61 -0
  99. package/dist/tauri/index.d.ts +35 -0
  100. package/dist/tauri/index.d.ts.map +1 -0
  101. package/dist/tauri/index.js +114 -0
  102. package/dist/tauri/index.js.map +1 -0
  103. package/dist/types.d.ts +1059 -0
  104. package/dist/types.d.ts.map +1 -0
  105. package/dist/types.js +2 -0
  106. package/dist/types.js.map +1 -0
  107. package/dist/wasm/.syncular-wasm-profile +1 -0
  108. package/dist/wasm/syncular-runtime-artifact.json +21 -0
  109. package/dist/wasm/syncular.d.ts +207 -0
  110. package/dist/wasm/syncular.js +2341 -0
  111. package/dist/wasm/syncular_bg.wasm +0 -0
  112. package/dist/wasm/syncular_bg.wasm.d.ts +97 -0
  113. package/dist/wasm-bindings/runtime-contract.d.ts +22 -0
  114. package/dist/wasm-bindings/runtime-contract.d.ts.map +1 -0
  115. package/dist/wasm-bindings/runtime-contract.js +112 -0
  116. package/dist/wasm-bindings/runtime-contract.js.map +1 -0
  117. package/dist/wasm-core/.syncular-wasm-profile +1 -0
  118. package/dist/wasm-core/syncular-runtime-artifact.json +17 -0
  119. package/dist/wasm-core/syncular.d.ts +162 -0
  120. package/dist/wasm-core/syncular.js +1847 -0
  121. package/dist/wasm-core/syncular_bg.wasm +0 -0
  122. package/dist/wasm-core/syncular_bg.wasm.d.ts +77 -0
  123. package/dist/wasm-perf/.syncular-wasm-profile +1 -0
  124. package/dist/wasm-perf/syncular-runtime-artifact.json +21 -0
  125. package/dist/wasm-perf/syncular.d.ts +207 -0
  126. package/dist/wasm-perf/syncular.js +2341 -0
  127. package/dist/wasm-perf/syncular_bg.wasm +0 -0
  128. package/dist/wasm-perf/syncular_bg.wasm.d.ts +97 -0
  129. package/dist/wasm-runtime.d.ts +18 -0
  130. package/dist/wasm-runtime.d.ts.map +1 -0
  131. package/dist/wasm-runtime.js +28 -0
  132. package/dist/wasm-runtime.js.map +1 -0
  133. package/dist/worker-client.d.ts +123 -0
  134. package/dist/worker-client.d.ts.map +1 -0
  135. package/dist/worker-client.js +1686 -0
  136. package/dist/worker-client.js.map +1 -0
  137. package/dist/worker-entry.d.ts +2 -0
  138. package/dist/worker-entry.d.ts.map +1 -0
  139. package/dist/worker-entry.js +479 -0
  140. package/dist/worker-entry.js.map +1 -0
  141. package/dist/worker-protocol.d.ts +64 -0
  142. package/dist/worker-protocol.d.ts.map +1 -0
  143. package/dist/worker-protocol.js +16 -0
  144. package/dist/worker-protocol.js.map +1 -0
  145. package/dist/worker-realtime.d.ts +39 -0
  146. package/dist/worker-realtime.d.ts.map +1 -0
  147. package/dist/worker-realtime.js +677 -0
  148. package/dist/worker-realtime.js.map +1 -0
  149. package/package.json +124 -17
  150. package/src/auth-leases.ts +251 -0
  151. package/src/blob-limits.ts +98 -0
  152. package/src/bridge-client.ts +512 -0
  153. package/src/client-config.ts +29 -0
  154. package/src/client.ts +256 -1414
  155. package/src/command-history.ts +623 -0
  156. package/src/console-diagnostics.ts +617 -0
  157. package/src/crdt-yjs/index.ts +3 -0
  158. package/src/crdt-yjs/webview-host-facade.ts +477 -0
  159. package/src/crdt-yjs/yjs-document-field-adapter.ts +733 -0
  160. package/src/crdt-yjs/yjs-prosemirror-bridge.ts +272 -0
  161. package/src/database.ts +1342 -0
  162. package/src/diagnostics.ts +116 -0
  163. package/src/errors.ts +269 -0
  164. package/src/generated-bridge.ts +741 -0
  165. package/src/index.ts +21 -25
  166. package/src/mutations.ts +12 -821
  167. package/src/network.ts +32 -0
  168. package/src/react/index.ts +1036 -0
  169. package/src/react-native/index.ts +152 -0
  170. package/src/runtime-contract.ts +48 -0
  171. package/src/rust-client.ts +1488 -0
  172. package/src/sentry.ts +215 -0
  173. package/src/sql-safety.ts +61 -0
  174. package/src/tauri/index.ts +211 -0
  175. package/src/types.ts +1356 -0
  176. package/src/wasm-bindings/generated-wasm-bindings.d.ts +70 -0
  177. package/src/wasm-bindings/runtime-contract.ts +158 -0
  178. package/src/wasm-runtime.ts +76 -0
  179. package/src/worker-client.ts +2215 -0
  180. package/src/worker-entry.ts +584 -0
  181. package/src/worker-protocol.ts +109 -0
  182. package/src/worker-realtime.ts +843 -0
  183. package/dist/blobs/index.d.ts +0 -7
  184. package/dist/blobs/index.d.ts.map +0 -1
  185. package/dist/blobs/index.js +0 -7
  186. package/dist/blobs/index.js.map +0 -1
  187. package/dist/blobs/manager.d.ts +0 -345
  188. package/dist/blobs/manager.d.ts.map +0 -1
  189. package/dist/blobs/manager.js +0 -749
  190. package/dist/blobs/manager.js.map +0 -1
  191. package/dist/blobs/migrate.d.ts +0 -14
  192. package/dist/blobs/migrate.d.ts.map +0 -1
  193. package/dist/blobs/migrate.js +0 -59
  194. package/dist/blobs/migrate.js.map +0 -1
  195. package/dist/blobs/types.d.ts +0 -62
  196. package/dist/blobs/types.d.ts.map +0 -1
  197. package/dist/blobs/types.js +0 -5
  198. package/dist/blobs/types.js.map +0 -1
  199. package/dist/conflicts.d.ts +0 -31
  200. package/dist/conflicts.d.ts.map +0 -1
  201. package/dist/conflicts.js +0 -112
  202. package/dist/conflicts.js.map +0 -1
  203. package/dist/create-client.d.ts +0 -118
  204. package/dist/create-client.d.ts.map +0 -1
  205. package/dist/create-client.js +0 -178
  206. package/dist/create-client.js.map +0 -1
  207. package/dist/engine/SyncEngine.d.ts +0 -272
  208. package/dist/engine/SyncEngine.d.ts.map +0 -1
  209. package/dist/engine/SyncEngine.js +0 -1860
  210. package/dist/engine/SyncEngine.js.map +0 -1
  211. package/dist/engine/index.d.ts +0 -6
  212. package/dist/engine/index.d.ts.map +0 -1
  213. package/dist/engine/index.js +0 -6
  214. package/dist/engine/index.js.map +0 -1
  215. package/dist/engine/types.d.ts +0 -345
  216. package/dist/engine/types.d.ts.map +0 -1
  217. package/dist/engine/types.js +0 -7
  218. package/dist/engine/types.js.map +0 -1
  219. package/dist/handlers/collection.d.ts +0 -6
  220. package/dist/handlers/collection.d.ts.map +0 -1
  221. package/dist/handlers/collection.js +0 -21
  222. package/dist/handlers/collection.js.map +0 -1
  223. package/dist/handlers/create-handler.d.ts +0 -120
  224. package/dist/handlers/create-handler.d.ts.map +0 -1
  225. package/dist/handlers/create-handler.js +0 -145
  226. package/dist/handlers/create-handler.js.map +0 -1
  227. package/dist/handlers/types.d.ts +0 -83
  228. package/dist/handlers/types.d.ts.map +0 -1
  229. package/dist/handlers/types.js +0 -5
  230. package/dist/handlers/types.js.map +0 -1
  231. package/dist/migrate.d.ts +0 -19
  232. package/dist/migrate.d.ts.map +0 -1
  233. package/dist/migrate.js +0 -238
  234. package/dist/migrate.js.map +0 -1
  235. package/dist/outbox.d.ts +0 -112
  236. package/dist/outbox.d.ts.map +0 -1
  237. package/dist/outbox.js +0 -294
  238. package/dist/outbox.js.map +0 -1
  239. package/dist/plugins/incrementing-version.d.ts +0 -34
  240. package/dist/plugins/incrementing-version.d.ts.map +0 -1
  241. package/dist/plugins/incrementing-version.js +0 -83
  242. package/dist/plugins/incrementing-version.js.map +0 -1
  243. package/dist/plugins/index.d.ts +0 -3
  244. package/dist/plugins/index.d.ts.map +0 -1
  245. package/dist/plugins/index.js +0 -3
  246. package/dist/plugins/index.js.map +0 -1
  247. package/dist/plugins/types.d.ts +0 -49
  248. package/dist/plugins/types.d.ts.map +0 -1
  249. package/dist/plugins/types.js +0 -15
  250. package/dist/plugins/types.js.map +0 -1
  251. package/dist/proxy/connection.d.ts +0 -33
  252. package/dist/proxy/connection.d.ts.map +0 -1
  253. package/dist/proxy/connection.js +0 -153
  254. package/dist/proxy/connection.js.map +0 -1
  255. package/dist/proxy/dialect.d.ts +0 -46
  256. package/dist/proxy/dialect.d.ts.map +0 -1
  257. package/dist/proxy/dialect.js +0 -58
  258. package/dist/proxy/dialect.js.map +0 -1
  259. package/dist/proxy/driver.d.ts +0 -42
  260. package/dist/proxy/driver.d.ts.map +0 -1
  261. package/dist/proxy/driver.js +0 -78
  262. package/dist/proxy/driver.js.map +0 -1
  263. package/dist/proxy/index.d.ts +0 -10
  264. package/dist/proxy/index.d.ts.map +0 -1
  265. package/dist/proxy/index.js +0 -10
  266. package/dist/proxy/index.js.map +0 -1
  267. package/dist/proxy/mutations.d.ts +0 -9
  268. package/dist/proxy/mutations.d.ts.map +0 -1
  269. package/dist/proxy/mutations.js +0 -11
  270. package/dist/proxy/mutations.js.map +0 -1
  271. package/dist/pull-engine.d.ts +0 -48
  272. package/dist/pull-engine.d.ts.map +0 -1
  273. package/dist/pull-engine.js +0 -648
  274. package/dist/pull-engine.js.map +0 -1
  275. package/dist/push-engine.d.ts +0 -18
  276. package/dist/push-engine.d.ts.map +0 -1
  277. package/dist/push-engine.js +0 -167
  278. package/dist/push-engine.js.map +0 -1
  279. package/dist/query/FingerprintCollector.d.ts +0 -18
  280. package/dist/query/FingerprintCollector.d.ts.map +0 -1
  281. package/dist/query/FingerprintCollector.js +0 -28
  282. package/dist/query/FingerprintCollector.js.map +0 -1
  283. package/dist/query/QueryContext.d.ts +0 -33
  284. package/dist/query/QueryContext.d.ts.map +0 -1
  285. package/dist/query/QueryContext.js +0 -16
  286. package/dist/query/QueryContext.js.map +0 -1
  287. package/dist/query/fingerprint.d.ts +0 -61
  288. package/dist/query/fingerprint.d.ts.map +0 -1
  289. package/dist/query/fingerprint.js +0 -91
  290. package/dist/query/fingerprint.js.map +0 -1
  291. package/dist/query/index.d.ts +0 -7
  292. package/dist/query/index.d.ts.map +0 -1
  293. package/dist/query/index.js +0 -7
  294. package/dist/query/index.js.map +0 -1
  295. package/dist/query/tracked-select.d.ts +0 -18
  296. package/dist/query/tracked-select.d.ts.map +0 -1
  297. package/dist/query/tracked-select.js +0 -90
  298. package/dist/query/tracked-select.js.map +0 -1
  299. package/dist/schema.d.ts +0 -83
  300. package/dist/schema.d.ts.map +0 -1
  301. package/dist/schema.js +0 -7
  302. package/dist/schema.js.map +0 -1
  303. package/dist/subscription-state.d.ts +0 -46
  304. package/dist/subscription-state.d.ts.map +0 -1
  305. package/dist/subscription-state.js +0 -185
  306. package/dist/subscription-state.js.map +0 -1
  307. package/dist/sync-loop.d.ts +0 -34
  308. package/dist/sync-loop.d.ts.map +0 -1
  309. package/dist/sync-loop.js +0 -253
  310. package/dist/sync-loop.js.map +0 -1
  311. package/dist/sync.d.ts +0 -32
  312. package/dist/sync.d.ts.map +0 -1
  313. package/dist/sync.js +0 -55
  314. package/dist/sync.js.map +0 -1
  315. package/dist/utils/id.d.ts +0 -17
  316. package/dist/utils/id.d.ts.map +0 -1
  317. package/dist/utils/id.js +0 -46
  318. package/dist/utils/id.js.map +0 -1
  319. package/src/blobs/index.ts +0 -7
  320. package/src/blobs/manager.ts +0 -1027
  321. package/src/blobs/migrate.ts +0 -67
  322. package/src/blobs/types.ts +0 -84
  323. package/src/client.test.ts +0 -417
  324. package/src/conflicts.ts +0 -171
  325. package/src/create-client.test.ts +0 -83
  326. package/src/create-client.ts +0 -330
  327. package/src/engine/SyncEngine.test.ts +0 -254
  328. package/src/engine/SyncEngine.ts +0 -2375
  329. package/src/engine/index.ts +0 -6
  330. package/src/engine/types.ts +0 -419
  331. package/src/handlers/collection.ts +0 -36
  332. package/src/handlers/create-handler.ts +0 -330
  333. package/src/handlers/types.ts +0 -108
  334. package/src/migrate.ts +0 -318
  335. package/src/outbox.ts +0 -383
  336. package/src/plugins/incrementing-version.ts +0 -133
  337. package/src/plugins/index.ts +0 -2
  338. package/src/plugins/types.ts +0 -63
  339. package/src/proxy/connection.ts +0 -191
  340. package/src/proxy/dialect.ts +0 -76
  341. package/src/proxy/driver.ts +0 -126
  342. package/src/proxy/index.ts +0 -10
  343. package/src/proxy/mutations.ts +0 -18
  344. package/src/pull-engine.test.ts +0 -151
  345. package/src/pull-engine.ts +0 -855
  346. package/src/push-engine.ts +0 -216
  347. package/src/query/FingerprintCollector.ts +0 -29
  348. package/src/query/QueryContext.ts +0 -54
  349. package/src/query/fingerprint.ts +0 -109
  350. package/src/query/index.ts +0 -10
  351. package/src/query/tracked-select.ts +0 -139
  352. package/src/schema.ts +0 -94
  353. package/src/subscription-state.ts +0 -259
  354. package/src/sync-loop.ts +0 -379
  355. package/src/sync.ts +0 -170
  356. package/src/utils/id.ts +0 -55
@@ -1,120 +0,0 @@
1
- /**
2
- * @syncular/client - Declarative client handler helper
3
- */
4
- import type { ColumnCodecDialect, ColumnCodecSource, ScopeDefinition, ScopeKeysFromDefinitions, ScopeValuesFromPatterns, SyncChange, SyncSnapshot } from '@syncular/core';
5
- import type { SyncClientDb } from '../schema';
6
- import type { ClientClearContext, ClientHandlerContext, ClientSnapshotHookContext, ClientTableHandler } from './types';
7
- /**
8
- * Options for creating a declarative client handler.
9
- */
10
- export interface CreateClientHandlerOptions<DB extends SyncClientDb, TableName extends keyof DB & string, ScopeDefs extends readonly ScopeDefinition[] = readonly ScopeDefinition[]> {
11
- /** Table name in the database */
12
- table: TableName;
13
- /**
14
- * Scope definitions for this table.
15
- * Can be simple strings (column auto-derived) or objects with explicit mapping.
16
- *
17
- * @example
18
- * ```typescript
19
- * // Simple: column auto-derived from placeholder
20
- * scopes: ['user:{user_id}', 'org:{org_id}']
21
- *
22
- * // Explicit: when column differs from pattern variable
23
- * scopes: [
24
- * { pattern: 'user:{user_id}', column: 'owner_id' }
25
- * ]
26
- * ```
27
- */
28
- scopes: ScopeDefs;
29
- /**
30
- * Subscription configuration for this table.
31
- * - `true` (default): Subscribe to this table with default scopes/params
32
- * - `false`: Don't subscribe (handler only for local mutations)
33
- * - Object: Subscribe with custom scopes and params
34
- */
35
- subscribe?: boolean | {
36
- scopes?: ScopeValuesFromPatterns<ScopeDefs>;
37
- params?: Record<string, unknown>;
38
- };
39
- /** Primary key column name (default: 'id') */
40
- primaryKey?: keyof DB[TableName] & string;
41
- /**
42
- * Optional version column name (e.g. 'server_version') to store `change.row_version`.
43
- * If omitted, row_version is ignored by the default handler.
44
- */
45
- versionColumn?: keyof DB[TableName] & string;
46
- /**
47
- * Optional column codec resolver.
48
- * Receives `{ table, column, sqlType?, dialect? }` and returns a codec.
49
- */
50
- codecs?: ColumnCodecSource;
51
- /**
52
- * Dialect used for codec dialect overrides.
53
- * Default: 'sqlite'
54
- */
55
- codecDialect?: ColumnCodecDialect;
56
- /**
57
- * Override: Apply a snapshot.
58
- * Default: upsert all rows (no delete on isFirstPage).
59
- */
60
- applySnapshot?: (ctx: ClientHandlerContext<DB>, snapshot: SyncSnapshot) => Promise<void>;
61
- /**
62
- * Override: Apply a single change.
63
- * Default: upsert on upsert, delete on delete.
64
- */
65
- applyChange?: (ctx: ClientHandlerContext<DB>, change: SyncChange) => Promise<void>;
66
- /**
67
- * Override: Clear all data for this table.
68
- * Default: delete all rows from the table.
69
- */
70
- clearAll?: (ctx: ClientClearContext<DB>) => Promise<void>;
71
- /**
72
- * Hook: Called when a snapshot begins (isFirstPage = true).
73
- * Default: no-op.
74
- */
75
- onSnapshotStart?: (ctx: ClientSnapshotHookContext<DB>) => Promise<void>;
76
- /**
77
- * Hook: Called when a snapshot ends (isLastPage = true).
78
- * Default: no-op.
79
- */
80
- onSnapshotEnd?: (ctx: ClientSnapshotHookContext<DB>) => Promise<void>;
81
- }
82
- /**
83
- * Create a declarative client table handler with sensible defaults.
84
- *
85
- * @example
86
- * ```typescript
87
- * import { createClientHandler } from '@syncular/client';
88
- * import type { ClientDb } from './db.generated';
89
- *
90
- * export const tasksHandler = createClientHandler<ClientDb, 'tasks'>({
91
- * table: 'tasks',
92
- * scopes: ['user:{user_id}'], // column auto-derived from placeholder
93
- * });
94
- *
95
- * // With custom column mapping:
96
- * export const tasksHandler = createClientHandler<ClientDb, 'tasks'>({
97
- * table: 'tasks',
98
- * scopes: [{ pattern: 'user:{user_id}', column: 'owner_id' }],
99
- * });
100
- *
101
- * // With soft delete pattern:
102
- * export const tasksHandler = createClientHandler<ClientDb, 'tasks'>({
103
- * table: 'tasks',
104
- * scopes: ['user:{user_id}'],
105
- * onSnapshotStart: async (ctx) => {
106
- * await ctx.trx.updateTable('tasks')
107
- * .set({ _sync_stale: 1 })
108
- * .where('user_id', '=', ctx.scopeKey.split(':')[1])
109
- * .execute();
110
- * },
111
- * onSnapshotEnd: async (ctx) => {
112
- * await ctx.trx.deleteFrom('tasks')
113
- * .where('_sync_stale', '=', 1)
114
- * .execute();
115
- * },
116
- * });
117
- * ```
118
- */
119
- export declare function createClientHandler<DB extends SyncClientDb, TableName extends keyof DB & string, ScopeDefs extends readonly ScopeDefinition[] = readonly ScopeDefinition[]>(options: CreateClientHandlerOptions<DB, TableName, ScopeDefs>): ClientTableHandler<DB, TableName, ScopeKeysFromDefinitions<ScopeDefs>>;
120
- //# sourceMappingURL=create-handler.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"create-handler.d.ts","sourceRoot":"","sources":["../../src/handlers/create-handler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,EACf,wBAAwB,EACxB,uBAAuB,EACvB,UAAU,EACV,YAAY,EACb,MAAM,gBAAgB,CAAC;AAQxB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,KAAK,EACV,kBAAkB,EAClB,oBAAoB,EACpB,yBAAyB,EACzB,kBAAkB,EACnB,MAAM,SAAS,CAAC;AAIjB;;GAEG;AACH,MAAM,WAAW,0BAA0B,CACzC,EAAE,SAAS,YAAY,EACvB,SAAS,SAAS,MAAM,EAAE,GAAG,MAAM,EACnC,SAAS,SAAS,SAAS,eAAe,EAAE,GAAG,SAAS,eAAe,EAAE;IAEzE,iCAAiC;IACjC,KAAK,EAAE,SAAS,CAAC;IAEjB;;;;;;;;;;;;;;OAcG;IACH,MAAM,EAAE,SAAS,CAAC;IAElB;;;;;OAKG;IACH,SAAS,CAAC,EACN,OAAO,GACP;QACE,MAAM,CAAC,EAAE,uBAAuB,CAAC,SAAS,CAAC,CAAC;QAC5C,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAClC,CAAC;IAEN,8CAA8C;IAC9C,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC;IAE1C;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC;IAE7C;;;OAGG;IACH,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAE3B;;;OAGG;IACH,YAAY,CAAC,EAAE,kBAAkB,CAAC;IAElC;;;OAGG;IACH,aAAa,CAAC,EAAE,CACd,GAAG,EAAE,oBAAoB,CAAC,EAAE,CAAC,EAC7B,QAAQ,EAAE,YAAY,KACnB,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnB;;;OAGG;IACH,WAAW,CAAC,EAAE,CACZ,GAAG,EAAE,oBAAoB,CAAC,EAAE,CAAC,EAC7B,MAAM,EAAE,UAAU,KACf,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnB;;;OAGG;IACH,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,kBAAkB,CAAC,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1D;;;OAGG;IACH,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,yBAAyB,CAAC,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAExE;;;OAGG;IACH,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,yBAAyB,CAAC,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvE;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,wBAAgB,mBAAmB,CACjC,EAAE,SAAS,YAAY,EACvB,SAAS,SAAS,MAAM,EAAE,GAAG,MAAM,EACnC,SAAS,SAAS,SAAS,eAAe,EAAE,GAAG,SAAS,eAAe,EAAE,EAEzE,OAAO,EAAE,0BAA0B,CAAC,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,GAC5D,kBAAkB,CAAC,EAAE,EAAE,SAAS,EAAE,wBAAwB,CAAC,SAAS,CAAC,CAAC,CA6JxE"}
@@ -1,145 +0,0 @@
1
- /**
2
- * @syncular/client - Declarative client handler helper
3
- */
4
- import { applyCodecsToDbRow, isRecord, normalizeScopes, toTableColumnCodecs, } from '@syncular/core';
5
- import { sql } from 'kysely';
6
- const MAX_INSERT_BIND_PARAMETERS = 900;
7
- /**
8
- * Create a declarative client table handler with sensible defaults.
9
- *
10
- * @example
11
- * ```typescript
12
- * import { createClientHandler } from '@syncular/client';
13
- * import type { ClientDb } from './db.generated';
14
- *
15
- * export const tasksHandler = createClientHandler<ClientDb, 'tasks'>({
16
- * table: 'tasks',
17
- * scopes: ['user:{user_id}'], // column auto-derived from placeholder
18
- * });
19
- *
20
- * // With custom column mapping:
21
- * export const tasksHandler = createClientHandler<ClientDb, 'tasks'>({
22
- * table: 'tasks',
23
- * scopes: [{ pattern: 'user:{user_id}', column: 'owner_id' }],
24
- * });
25
- *
26
- * // With soft delete pattern:
27
- * export const tasksHandler = createClientHandler<ClientDb, 'tasks'>({
28
- * table: 'tasks',
29
- * scopes: ['user:{user_id}'],
30
- * onSnapshotStart: async (ctx) => {
31
- * await ctx.trx.updateTable('tasks')
32
- * .set({ _sync_stale: 1 })
33
- * .where('user_id', '=', ctx.scopeKey.split(':')[1])
34
- * .execute();
35
- * },
36
- * onSnapshotEnd: async (ctx) => {
37
- * await ctx.trx.deleteFrom('tasks')
38
- * .where('_sync_stale', '=', 1)
39
- * .execute();
40
- * },
41
- * });
42
- * ```
43
- */
44
- export function createClientHandler(options) {
45
- const { table, scopes: scopeDefs } = options;
46
- const primaryKey = options.primaryKey ?? 'id';
47
- const versionColumn = options.versionColumn;
48
- const codecDialect = options.codecDialect ?? 'sqlite';
49
- const codecCache = new Map();
50
- const resolveTableCodecs = (row) => {
51
- const codecs = options.codecs;
52
- if (!codecs)
53
- return {};
54
- const columns = Object.keys(row);
55
- if (columns.length === 0)
56
- return {};
57
- const cacheKey = columns.slice().sort().join('\u0000');
58
- const cached = codecCache.get(cacheKey);
59
- if (cached)
60
- return cached;
61
- const resolved = toTableColumnCodecs(table, codecs, columns, {
62
- dialect: codecDialect,
63
- });
64
- codecCache.set(cacheKey, resolved);
65
- return resolved;
66
- };
67
- // Normalize scopes to pattern map (stored for metadata)
68
- const scopeColumnMap = normalizeScopes(scopeDefs);
69
- const scopePatterns = Object.keys(scopeColumnMap);
70
- // Default applySnapshot: upsert all rows
71
- const defaultApplySnapshot = async (ctx, snapshot) => {
72
- const rows = [];
73
- for (const row of snapshot.rows ?? []) {
74
- if (!isRecord(row))
75
- continue;
76
- rows.push(applyCodecsToDbRow(row, resolveTableCodecs(row), codecDialect));
77
- }
78
- if (rows.length === 0)
79
- return;
80
- // Get column names from first row
81
- const columns = Object.keys(rows[0]);
82
- if (columns.length === 0)
83
- return;
84
- const updateColumns = columns.filter((c) => c !== primaryKey);
85
- const onConflict = updateColumns.length === 0
86
- ? sql `do nothing`
87
- : sql `do update set ${sql.join(updateColumns.map((col) => sql `${sql.ref(col)} = ${sql.ref(`excluded.${col}`)}`), sql `, `)}`;
88
- const maxRowsPerInsert = Math.max(1, Math.floor(MAX_INSERT_BIND_PARAMETERS / columns.length));
89
- for (let startIndex = 0; startIndex < rows.length; startIndex += maxRowsPerInsert) {
90
- const batchRows = rows.slice(startIndex, startIndex + maxRowsPerInsert);
91
- await sql `
92
- insert into ${sql.table(table)} (${sql.join(columns.map((c) => sql.ref(c)))})
93
- values ${sql.join(batchRows.map((row) => sql `(${sql.join(columns.map((col) => sql.val(row[col] ?? null)), sql `, `)})`), sql `, `)}
94
- on conflict (${sql.ref(primaryKey)}) ${onConflict}
95
- `.execute(ctx.trx);
96
- }
97
- };
98
- // Default applyChange: upsert on upsert, delete on delete
99
- const defaultApplyChange = async (ctx, change) => {
100
- if (change.op === 'delete') {
101
- await sql `
102
- delete from ${sql.table(table)}
103
- where ${sql.ref(primaryKey)} = ${sql.val(change.row_id)}
104
- `.execute(ctx.trx);
105
- return;
106
- }
107
- const row = isRecord(change.row_json)
108
- ? applyCodecsToDbRow(change.row_json, resolveTableCodecs(change.row_json), codecDialect)
109
- : {};
110
- const insertRow = {
111
- ...row,
112
- [primaryKey]: change.row_id,
113
- };
114
- if (versionColumn &&
115
- change.row_version !== null &&
116
- change.row_version !== undefined) {
117
- insertRow[versionColumn] = change.row_version;
118
- }
119
- const columns = Object.keys(insertRow);
120
- const updateColumns = columns.filter((c) => c !== primaryKey);
121
- const onConflict = updateColumns.length === 0
122
- ? sql `do nothing`
123
- : sql `do update set ${sql.join(updateColumns.map((col) => sql `${sql.ref(col)} = ${sql.ref(`excluded.${col}`)}`), sql `, `)}`;
124
- await sql `
125
- insert into ${sql.table(table)} (${sql.join(columns.map((c) => sql.ref(c)))})
126
- values (${sql.join(columns.map((col) => sql.val(insertRow[col] ?? null)), sql `, `)})
127
- on conflict (${sql.ref(primaryKey)}) ${onConflict}
128
- `.execute(ctx.trx);
129
- };
130
- // Default clearAll: delete all rows from the table
131
- const defaultClearAll = async (ctx) => {
132
- await sql `delete from ${sql.table(table)}`.execute(ctx.trx);
133
- };
134
- return {
135
- table,
136
- scopePatterns,
137
- subscribe: options.subscribe,
138
- applySnapshot: options.applySnapshot ?? defaultApplySnapshot,
139
- applyChange: options.applyChange ?? defaultApplyChange,
140
- clearAll: options.clearAll ?? defaultClearAll,
141
- onSnapshotStart: options.onSnapshotStart,
142
- onSnapshotEnd: options.onSnapshotEnd,
143
- };
144
- }
145
- //# sourceMappingURL=create-handler.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"create-handler.js","sourceRoot":"","sources":["../../src/handlers/create-handler.ts"],"names":[],"mappings":"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"}
@@ -1,83 +0,0 @@
1
- /**
2
- * @syncular/client - Sync client table handler interface
3
- */
4
- import type { ScopeValues, ScopeValuesForKeys, SyncChange, SyncSnapshot } from '@syncular/core';
5
- import type { Transaction } from 'kysely';
6
- /**
7
- * Context passed to client table handler methods.
8
- */
9
- export interface ClientHandlerContext<DB> {
10
- /** Database transaction */
11
- trx: Transaction<DB>;
12
- }
13
- /**
14
- * Extended context for snapshot lifecycle hooks.
15
- */
16
- export interface ClientSnapshotHookContext<DB> extends ClientHandlerContext<DB> {
17
- /** The table being snapshotted */
18
- table: string;
19
- /** The scope values for this subscription */
20
- scopes: ScopeValues;
21
- }
22
- /**
23
- * Context for clearAll/clearScope operations.
24
- */
25
- export interface ClientClearContext<DB> extends ClientHandlerContext<DB> {
26
- /** The scope values to clear (data matching these scopes should be removed) */
27
- scopes: ScopeValues;
28
- }
29
- /**
30
- * Subscription configuration for a handler.
31
- */
32
- export interface HandlerSubscriptionConfig<ScopeKeys extends string = string> {
33
- /** Scope values for this subscription */
34
- scopes?: ScopeValuesForKeys<ScopeKeys>;
35
- /** Params for this subscription */
36
- params?: Record<string, unknown>;
37
- }
38
- /**
39
- * Client-side table handler for applying sync snapshots and changes.
40
- */
41
- export interface ClientTableHandler<DB, TableName extends keyof DB & string = keyof DB & string, ScopeKeys extends string = string> {
42
- /** Table name (used as identifier in sync operations) */
43
- table: TableName;
44
- /**
45
- * Scope patterns used by this table.
46
- * Used for deriving safe default subscriptions in `createClient`.
47
- */
48
- scopePatterns?: string[];
49
- /**
50
- * Subscription configuration.
51
- * - `true`: Subscribe to this table (default)
52
- * - `false`: Don't subscribe (local-only handler)
53
- * - Object: Subscribe with custom scopes/params
54
- */
55
- subscribe?: boolean | HandlerSubscriptionConfig<ScopeKeys>;
56
- /**
57
- * Apply a snapshot page for this table.
58
- * The handler is responsible for upserting the rows.
59
- */
60
- applySnapshot(ctx: ClientHandlerContext<DB>, snapshot: SyncSnapshot): Promise<void>;
61
- /**
62
- * Clear local data for this table matching the given scopes.
63
- * Used when subscription is removed or revoked.
64
- * If scopes is empty, clear all data for this table.
65
- */
66
- clearAll(ctx: ClientClearContext<DB>): Promise<void>;
67
- /**
68
- * Apply a single change (upsert/delete).
69
- * Must be idempotent (retries may re-apply).
70
- */
71
- applyChange(ctx: ClientHandlerContext<DB>, change: SyncChange): Promise<void>;
72
- /**
73
- * Optional: Called when a snapshot begins (isFirstPage = true).
74
- * Use this for marking existing rows as stale before applying snapshot.
75
- */
76
- onSnapshotStart?(ctx: ClientSnapshotHookContext<DB>): Promise<void>;
77
- /**
78
- * Optional: Called when a snapshot ends (isLastPage = true).
79
- * Use this for cleaning up stale rows after snapshot is complete.
80
- */
81
- onSnapshotEnd?(ctx: ClientSnapshotHookContext<DB>): Promise<void>;
82
- }
83
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/handlers/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,kBAAkB,EAClB,UAAU,EACV,YAAY,EACb,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAE1C;;GAEG;AACH,MAAM,WAAW,oBAAoB,CAAC,EAAE;IACtC,2BAA2B;IAC3B,GAAG,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB,CAAC,EAAE,CAC3C,SAAQ,oBAAoB,CAAC,EAAE,CAAC;IAChC,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,MAAM,EAAE,WAAW,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB,CAAC,EAAE,CAAE,SAAQ,oBAAoB,CAAC,EAAE,CAAC;IACtE,+EAA+E;IAC/E,MAAM,EAAE,WAAW,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB,CAAC,SAAS,SAAS,MAAM,GAAG,MAAM;IAC1E,yCAAyC;IACzC,MAAM,CAAC,EAAE,kBAAkB,CAAC,SAAS,CAAC,CAAC;IACvC,mCAAmC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB,CACjC,EAAE,EACF,SAAS,SAAS,MAAM,EAAE,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,MAAM,EACvD,SAAS,SAAS,MAAM,GAAG,MAAM;IAEjC,yDAAyD;IACzD,KAAK,EAAE,SAAS,CAAC;IAEjB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IAEzB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,OAAO,GAAG,yBAAyB,CAAC,SAAS,CAAC,CAAC;IAE3D;;;OAGG;IACH,aAAa,CACX,GAAG,EAAE,oBAAoB,CAAC,EAAE,CAAC,EAC7B,QAAQ,EAAE,YAAY,GACrB,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjB;;;;OAIG;IACH,QAAQ,CAAC,GAAG,EAAE,kBAAkB,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAErD;;;OAGG;IACH,WAAW,CAAC,GAAG,EAAE,oBAAoB,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9E;;;OAGG;IACH,eAAe,CAAC,CAAC,GAAG,EAAE,yBAAyB,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpE;;;OAGG;IACH,aAAa,CAAC,CAAC,GAAG,EAAE,yBAAyB,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnE"}
@@ -1,5 +0,0 @@
1
- /**
2
- * @syncular/client - Sync client table handler interface
3
- */
4
- export {};
5
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/handlers/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
package/dist/migrate.d.ts DELETED
@@ -1,19 +0,0 @@
1
- /**
2
- * @syncular/client - Sync migrations (SQLite reference)
3
- */
4
- import { type Kysely } from 'kysely';
5
- import type { SyncClientDb } from './schema';
6
- /**
7
- * Ensures the client sync schema exists in the database.
8
- * Safe to call multiple times (idempotent).
9
- *
10
- * @typeParam DB - Your database type that extends SyncClientDb
11
- */
12
- export declare function ensureClientSyncSchema<DB extends SyncClientDb>(db: Kysely<DB>): Promise<void>;
13
- /**
14
- * Drops the client sync schema from the database.
15
- *
16
- * @typeParam DB - Your database type that extends SyncClientDb
17
- */
18
- export declare function dropClientSyncSchema<DB extends SyncClientDb>(db: Kysely<DB>): Promise<void>;
19
- //# sourceMappingURL=migrate.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../src/migrate.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,MAAM,EAAO,MAAM,QAAQ,CAAC;AAC1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AA4L7C;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAAC,EAAE,SAAS,YAAY,EAClE,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,GACb,OAAO,CAAC,IAAI,CAAC,CAuGf;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CAAC,EAAE,SAAS,YAAY,EAChE,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,GACb,OAAO,CAAC,IAAI,CAAC,CAIf"}
package/dist/migrate.js DELETED
@@ -1,238 +0,0 @@
1
- /**
2
- * @syncular/client - Sync migrations (SQLite reference)
3
- */
4
- import { sql } from 'kysely';
5
- function toErrorMessage(error) {
6
- return error instanceof Error ? error.message : String(error);
7
- }
8
- function isMissingTableError(message) {
9
- const normalized = message.toLowerCase();
10
- return (normalized.includes('no such table') ||
11
- (normalized.includes('relation') && normalized.includes('does not exist')));
12
- }
13
- function isMissingColumnError(message) {
14
- const normalized = message.toLowerCase();
15
- return (normalized.includes('no such column') ||
16
- (normalized.includes('column') && normalized.includes('does not exist')));
17
- }
18
- function isDuplicateColumnError(message) {
19
- const normalized = message.toLowerCase();
20
- return (normalized.includes('duplicate column name') ||
21
- (normalized.includes('column') && normalized.includes('already exists')));
22
- }
23
- async function getColumnNames(db, tableName) {
24
- try {
25
- const sqlite = await sql `
26
- select name from pragma_table_info(${sql.val(tableName)})
27
- `.execute(db);
28
- return new Set(sqlite.rows.map((row) => String(row.name)));
29
- }
30
- catch {
31
- // Not SQLite or pragma unavailable.
32
- }
33
- try {
34
- const postgres = await sql `
35
- select column_name as name
36
- from information_schema.columns
37
- where table_name = ${sql.val(tableName)}
38
- `.execute(db);
39
- return new Set(postgres.rows.map((row) => String(row.name)));
40
- }
41
- catch {
42
- // Introspection unavailable; caller falls back to probing.
43
- }
44
- return null;
45
- }
46
- async function hasColumn(db, tableName, columnName) {
47
- const columns = await getColumnNames(db, tableName);
48
- if (columns) {
49
- return columns.has(columnName);
50
- }
51
- try {
52
- await sql `select ${sql.ref(columnName)} from ${sql.table(tableName)} limit 1`.execute(db);
53
- return true;
54
- }
55
- catch (error) {
56
- const message = toErrorMessage(error);
57
- if (isMissingTableError(message) || isMissingColumnError(message)) {
58
- return false;
59
- }
60
- throw error;
61
- }
62
- }
63
- async function addColumnIfMissing(db, tableName, columnName, addColumn) {
64
- if (await hasColumn(db, tableName, columnName)) {
65
- return;
66
- }
67
- try {
68
- await addColumn();
69
- }
70
- catch (error) {
71
- const message = toErrorMessage(error);
72
- if (isDuplicateColumnError(message)) {
73
- return;
74
- }
75
- throw error;
76
- }
77
- }
78
- async function ensureClientSyncSchemaCompat(db) {
79
- const hasTableColumn = await hasColumn(db, 'sync_subscription_state', 'table');
80
- if (!hasTableColumn &&
81
- (await hasColumn(db, 'sync_subscription_state', 'shape'))) {
82
- try {
83
- await sql `alter table ${sql.table('sync_subscription_state')} rename column ${sql.ref('shape')} to ${sql.ref('table')}`.execute(db);
84
- }
85
- catch {
86
- await addColumnIfMissing(db, 'sync_subscription_state', 'table', async () => {
87
- await db.schema
88
- .alterTable('sync_subscription_state')
89
- .addColumn('table', 'text', (col) => col.notNull().defaultTo(''))
90
- .execute();
91
- });
92
- await sql `update ${sql.table('sync_subscription_state')}
93
- set ${sql.ref('table')} = ${sql.ref('shape')}
94
- where ${sql.ref('table')} = ${sql.val('')}`.execute(db);
95
- }
96
- }
97
- await addColumnIfMissing(db, 'sync_subscription_state', 'bootstrap_state_json', async () => {
98
- await db.schema
99
- .alterTable('sync_subscription_state')
100
- .addColumn('bootstrap_state_json', 'text')
101
- .execute();
102
- });
103
- await addColumnIfMissing(db, 'sync_outbox_commits', 'schema_version', async () => {
104
- await db.schema
105
- .alterTable('sync_outbox_commits')
106
- .addColumn('schema_version', 'integer', (col) => col.notNull().defaultTo(1))
107
- .execute();
108
- });
109
- await addColumnIfMissing(db, 'sync_conflicts', 'resolved_at', async () => {
110
- await db.schema
111
- .alterTable('sync_conflicts')
112
- .addColumn('resolved_at', 'bigint')
113
- .execute();
114
- });
115
- await addColumnIfMissing(db, 'sync_conflicts', 'resolution', async () => {
116
- await db.schema
117
- .alterTable('sync_conflicts')
118
- .addColumn('resolution', 'text')
119
- .execute();
120
- });
121
- await db.schema
122
- .createIndex('idx_sync_outbox_commits_status_updated_at')
123
- .ifNotExists()
124
- .on('sync_outbox_commits')
125
- .columns(['status', 'updated_at', 'created_at'])
126
- .execute();
127
- }
128
- /**
129
- * Ensures the client sync schema exists in the database.
130
- * Safe to call multiple times (idempotent).
131
- *
132
- * @typeParam DB - Your database type that extends SyncClientDb
133
- */
134
- export async function ensureClientSyncSchema(db) {
135
- // Schema builder doesn't need typed access - operates on raw SQL.
136
- await db.schema
137
- .createTable('sync_subscription_state')
138
- .ifNotExists()
139
- .addColumn('state_id', 'text', (col) => col.notNull())
140
- .addColumn('subscription_id', 'text', (col) => col.notNull())
141
- .addColumn('table', 'text', (col) => col.notNull())
142
- .addColumn('scopes_json', 'text', (col) => col.notNull().defaultTo('{}'))
143
- .addColumn('params_json', 'text', (col) => col.notNull())
144
- .addColumn('cursor', 'bigint', (col) => col.notNull())
145
- .addColumn('bootstrap_state_json', 'text')
146
- .addColumn('status', 'text', (col) => col.notNull())
147
- .addColumn('created_at', 'bigint', (col) => col.notNull())
148
- .addColumn('updated_at', 'bigint', (col) => col.notNull())
149
- .execute();
150
- await db.schema
151
- .createTable('sync_outbox_commits')
152
- .ifNotExists()
153
- .addColumn('id', 'text', (col) => col.primaryKey())
154
- .addColumn('client_commit_id', 'text', (col) => col.notNull())
155
- .addColumn('status', 'text', (col) => col.notNull())
156
- .addColumn('operations_json', 'text', (col) => col.notNull())
157
- .addColumn('last_response_json', 'text')
158
- .addColumn('error', 'text')
159
- .addColumn('created_at', 'bigint', (col) => col.notNull())
160
- .addColumn('updated_at', 'bigint', (col) => col.notNull())
161
- .addColumn('attempt_count', 'integer', (col) => col.notNull().defaultTo(0))
162
- .addColumn('acked_commit_seq', 'bigint')
163
- .addColumn('schema_version', 'integer', (col) => col.notNull().defaultTo(1))
164
- .execute();
165
- await db.schema
166
- .createTable('sync_conflicts')
167
- .ifNotExists()
168
- .addColumn('id', 'text', (col) => col.primaryKey())
169
- .addColumn('outbox_commit_id', 'text', (col) => col.notNull())
170
- .addColumn('client_commit_id', 'text', (col) => col.notNull())
171
- .addColumn('op_index', 'integer', (col) => col.notNull())
172
- .addColumn('result_status', 'text', (col) => col.notNull())
173
- .addColumn('message', 'text', (col) => col.notNull())
174
- .addColumn('code', 'text')
175
- .addColumn('server_version', 'bigint')
176
- .addColumn('server_row_json', 'text')
177
- .addColumn('created_at', 'bigint', (col) => col.notNull())
178
- .addColumn('resolved_at', 'bigint')
179
- .addColumn('resolution', 'text')
180
- .execute();
181
- // Apply framework-managed compatibility upgrades for legacy sync tables.
182
- await ensureClientSyncSchemaCompat(db);
183
- await db.schema
184
- .createIndex('idx_sync_subscription_state_state_sub')
185
- .ifNotExists()
186
- .on('sync_subscription_state')
187
- .columns(['state_id', 'subscription_id'])
188
- .unique()
189
- .execute();
190
- await db.schema
191
- .createIndex('idx_sync_subscription_state_state')
192
- .ifNotExists()
193
- .on('sync_subscription_state')
194
- .columns(['state_id', 'updated_at'])
195
- .execute();
196
- await db.schema
197
- .createIndex('idx_sync_outbox_commits_client_commit_id')
198
- .ifNotExists()
199
- .on('sync_outbox_commits')
200
- .columns(['client_commit_id'])
201
- .unique()
202
- .execute();
203
- await db.schema
204
- .createIndex('idx_sync_outbox_commits_status_created_at')
205
- .ifNotExists()
206
- .on('sync_outbox_commits')
207
- .columns(['status', 'created_at'])
208
- .execute();
209
- await db.schema
210
- .createIndex('idx_sync_outbox_commits_status_updated_at')
211
- .ifNotExists()
212
- .on('sync_outbox_commits')
213
- .columns(['status', 'updated_at', 'created_at'])
214
- .execute();
215
- await db.schema
216
- .createIndex('idx_sync_conflicts_outbox_commit')
217
- .ifNotExists()
218
- .on('sync_conflicts')
219
- .columns(['outbox_commit_id'])
220
- .execute();
221
- await db.schema
222
- .createIndex('idx_sync_conflicts_resolved_at')
223
- .ifNotExists()
224
- .on('sync_conflicts')
225
- .columns(['resolved_at'])
226
- .execute();
227
- }
228
- /**
229
- * Drops the client sync schema from the database.
230
- *
231
- * @typeParam DB - Your database type that extends SyncClientDb
232
- */
233
- export async function dropClientSyncSchema(db) {
234
- await db.schema.dropTable('sync_conflicts').ifExists().execute();
235
- await db.schema.dropTable('sync_outbox_commits').ifExists().execute();
236
- await db.schema.dropTable('sync_subscription_state').ifExists().execute();
237
- }
238
- //# sourceMappingURL=migrate.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../src/migrate.ts"],"names":[],"mappings":"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"}