@syncular/client 0.0.6-96 → 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.
- package/README.md +713 -11
- package/dist/auth-leases.d.ts +11 -0
- package/dist/auth-leases.d.ts.map +1 -0
- package/dist/auth-leases.js +140 -0
- package/dist/auth-leases.js.map +1 -0
- package/dist/blob-limits.d.ts +15 -0
- package/dist/blob-limits.d.ts.map +1 -0
- package/dist/blob-limits.js +66 -0
- package/dist/blob-limits.js.map +1 -0
- package/dist/bridge-client.d.ts +69 -0
- package/dist/bridge-client.d.ts.map +1 -0
- package/dist/bridge-client.js +282 -0
- package/dist/bridge-client.js.map +1 -0
- package/dist/client-config.d.ts +6 -0
- package/dist/client-config.d.ts.map +1 -0
- package/dist/client-config.js +18 -0
- package/dist/client-config.js.map +1 -0
- package/dist/client.d.ts +65 -397
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +150 -960
- package/dist/client.js.map +1 -1
- package/dist/command-history.d.ts +35 -0
- package/dist/command-history.d.ts.map +1 -0
- package/dist/command-history.js +378 -0
- package/dist/command-history.js.map +1 -0
- package/dist/console-diagnostics.d.ts +33 -0
- package/dist/console-diagnostics.d.ts.map +1 -0
- package/dist/console-diagnostics.js +496 -0
- package/dist/console-diagnostics.js.map +1 -0
- package/dist/crdt-yjs/index.d.ts +4 -0
- package/dist/crdt-yjs/index.d.ts.map +1 -0
- package/dist/crdt-yjs/index.js +4 -0
- package/dist/crdt-yjs/index.js.map +1 -0
- package/dist/crdt-yjs/webview-host-facade.d.ts +126 -0
- package/dist/crdt-yjs/webview-host-facade.d.ts.map +1 -0
- package/dist/crdt-yjs/webview-host-facade.js +284 -0
- package/dist/crdt-yjs/webview-host-facade.js.map +1 -0
- package/dist/crdt-yjs/yjs-document-field-adapter.d.ts +153 -0
- package/dist/crdt-yjs/yjs-document-field-adapter.d.ts.map +1 -0
- package/dist/crdt-yjs/yjs-document-field-adapter.js +406 -0
- package/dist/crdt-yjs/yjs-document-field-adapter.js.map +1 -0
- package/dist/crdt-yjs/yjs-prosemirror-bridge.d.ts +73 -0
- package/dist/crdt-yjs/yjs-prosemirror-bridge.d.ts.map +1 -0
- package/dist/crdt-yjs/yjs-prosemirror-bridge.js +169 -0
- package/dist/crdt-yjs/yjs-prosemirror-bridge.js.map +1 -0
- package/dist/database.d.ts +83 -0
- package/dist/database.d.ts.map +1 -0
- package/dist/database.js +916 -0
- package/dist/database.js.map +1 -0
- package/dist/diagnostics.d.ts +10 -0
- package/dist/diagnostics.d.ts.map +1 -0
- package/dist/diagnostics.js +83 -0
- package/dist/diagnostics.js.map +1 -0
- package/dist/errors.d.ts +24 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +211 -0
- package/dist/errors.js.map +1 -0
- package/dist/generated-bridge.d.ts +365 -0
- package/dist/generated-bridge.d.ts.map +1 -0
- package/dist/generated-bridge.js +250 -0
- package/dist/generated-bridge.js.map +1 -0
- package/dist/index.d.ts +13 -23
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -25
- package/dist/index.js.map +1 -1
- package/dist/mutations.d.ts +4 -72
- package/dist/mutations.d.ts.map +1 -1
- package/dist/mutations.js +2 -568
- package/dist/mutations.js.map +1 -1
- package/dist/network.d.ts +3 -0
- package/dist/network.d.ts.map +1 -0
- package/dist/network.js +17 -0
- package/dist/network.js.map +1 -0
- package/dist/react/index.d.ts +169 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +628 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react-native/index.d.ts +35 -0
- package/dist/react-native/index.d.ts.map +1 -0
- package/dist/react-native/index.js +49 -0
- package/dist/react-native/index.js.map +1 -0
- package/dist/runtime-contract.d.ts +13 -0
- package/dist/runtime-contract.d.ts.map +1 -0
- package/dist/runtime-contract.js +24 -0
- package/dist/runtime-contract.js.map +1 -0
- package/dist/rust-client.d.ts +106 -0
- package/dist/rust-client.d.ts.map +1 -0
- package/dist/rust-client.js +936 -0
- package/dist/rust-client.js.map +1 -0
- package/dist/sentry.d.ts +35 -0
- package/dist/sentry.d.ts.map +1 -0
- package/dist/sentry.js +155 -0
- package/dist/sentry.js.map +1 -0
- package/dist/sql-safety.d.ts +3 -0
- package/dist/sql-safety.d.ts.map +1 -0
- package/dist/sql-safety.js +62 -0
- package/dist/sql-safety.js.map +1 -0
- package/dist/syncular-runtime-artifacts.json +61 -0
- package/dist/tauri/index.d.ts +35 -0
- package/dist/tauri/index.d.ts.map +1 -0
- package/dist/tauri/index.js +114 -0
- package/dist/tauri/index.js.map +1 -0
- package/dist/types.d.ts +1059 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/wasm/.syncular-wasm-profile +1 -0
- package/dist/wasm/syncular-runtime-artifact.json +21 -0
- package/dist/wasm/syncular.d.ts +207 -0
- package/dist/wasm/syncular.js +2341 -0
- package/dist/wasm/syncular_bg.wasm +0 -0
- package/dist/wasm/syncular_bg.wasm.d.ts +97 -0
- package/dist/wasm-bindings/runtime-contract.d.ts +22 -0
- package/dist/wasm-bindings/runtime-contract.d.ts.map +1 -0
- package/dist/wasm-bindings/runtime-contract.js +112 -0
- package/dist/wasm-bindings/runtime-contract.js.map +1 -0
- package/dist/wasm-core/.syncular-wasm-profile +1 -0
- package/dist/wasm-core/syncular-runtime-artifact.json +17 -0
- package/dist/wasm-core/syncular.d.ts +162 -0
- package/dist/wasm-core/syncular.js +1847 -0
- package/dist/wasm-core/syncular_bg.wasm +0 -0
- package/dist/wasm-core/syncular_bg.wasm.d.ts +77 -0
- package/dist/wasm-perf/.syncular-wasm-profile +1 -0
- package/dist/wasm-perf/syncular-runtime-artifact.json +21 -0
- package/dist/wasm-perf/syncular.d.ts +207 -0
- package/dist/wasm-perf/syncular.js +2341 -0
- package/dist/wasm-perf/syncular_bg.wasm +0 -0
- package/dist/wasm-perf/syncular_bg.wasm.d.ts +97 -0
- package/dist/wasm-runtime.d.ts +18 -0
- package/dist/wasm-runtime.d.ts.map +1 -0
- package/dist/wasm-runtime.js +28 -0
- package/dist/wasm-runtime.js.map +1 -0
- package/dist/worker-client.d.ts +123 -0
- package/dist/worker-client.d.ts.map +1 -0
- package/dist/worker-client.js +1686 -0
- package/dist/worker-client.js.map +1 -0
- package/dist/worker-entry.d.ts +2 -0
- package/dist/worker-entry.d.ts.map +1 -0
- package/dist/worker-entry.js +479 -0
- package/dist/worker-entry.js.map +1 -0
- package/dist/worker-protocol.d.ts +64 -0
- package/dist/worker-protocol.d.ts.map +1 -0
- package/dist/worker-protocol.js +16 -0
- package/dist/worker-protocol.js.map +1 -0
- package/dist/worker-realtime.d.ts +39 -0
- package/dist/worker-realtime.d.ts.map +1 -0
- package/dist/worker-realtime.js +677 -0
- package/dist/worker-realtime.js.map +1 -0
- package/package.json +124 -17
- package/src/auth-leases.ts +251 -0
- package/src/blob-limits.ts +98 -0
- package/src/bridge-client.ts +512 -0
- package/src/client-config.ts +29 -0
- package/src/client.ts +256 -1414
- package/src/command-history.ts +623 -0
- package/src/console-diagnostics.ts +617 -0
- package/src/crdt-yjs/index.ts +3 -0
- package/src/crdt-yjs/webview-host-facade.ts +477 -0
- package/src/crdt-yjs/yjs-document-field-adapter.ts +733 -0
- package/src/crdt-yjs/yjs-prosemirror-bridge.ts +272 -0
- package/src/database.ts +1342 -0
- package/src/diagnostics.ts +116 -0
- package/src/errors.ts +269 -0
- package/src/generated-bridge.ts +741 -0
- package/src/index.ts +21 -25
- package/src/mutations.ts +12 -821
- package/src/network.ts +32 -0
- package/src/react/index.ts +1036 -0
- package/src/react-native/index.ts +152 -0
- package/src/runtime-contract.ts +48 -0
- package/src/rust-client.ts +1488 -0
- package/src/sentry.ts +215 -0
- package/src/sql-safety.ts +61 -0
- package/src/tauri/index.ts +211 -0
- package/src/types.ts +1356 -0
- package/src/wasm-bindings/generated-wasm-bindings.d.ts +70 -0
- package/src/wasm-bindings/runtime-contract.ts +158 -0
- package/src/wasm-runtime.ts +76 -0
- package/src/worker-client.ts +2215 -0
- package/src/worker-entry.ts +584 -0
- package/src/worker-protocol.ts +109 -0
- package/src/worker-realtime.ts +843 -0
- package/dist/blobs/index.d.ts +0 -7
- package/dist/blobs/index.d.ts.map +0 -1
- package/dist/blobs/index.js +0 -7
- package/dist/blobs/index.js.map +0 -1
- package/dist/blobs/manager.d.ts +0 -345
- package/dist/blobs/manager.d.ts.map +0 -1
- package/dist/blobs/manager.js +0 -749
- package/dist/blobs/manager.js.map +0 -1
- package/dist/blobs/migrate.d.ts +0 -14
- package/dist/blobs/migrate.d.ts.map +0 -1
- package/dist/blobs/migrate.js +0 -59
- package/dist/blobs/migrate.js.map +0 -1
- package/dist/blobs/types.d.ts +0 -62
- package/dist/blobs/types.d.ts.map +0 -1
- package/dist/blobs/types.js +0 -5
- package/dist/blobs/types.js.map +0 -1
- package/dist/conflicts.d.ts +0 -31
- package/dist/conflicts.d.ts.map +0 -1
- package/dist/conflicts.js +0 -112
- package/dist/conflicts.js.map +0 -1
- package/dist/create-client.d.ts +0 -118
- package/dist/create-client.d.ts.map +0 -1
- package/dist/create-client.js +0 -178
- package/dist/create-client.js.map +0 -1
- package/dist/engine/SyncEngine.d.ts +0 -272
- package/dist/engine/SyncEngine.d.ts.map +0 -1
- package/dist/engine/SyncEngine.js +0 -1860
- package/dist/engine/SyncEngine.js.map +0 -1
- package/dist/engine/index.d.ts +0 -6
- package/dist/engine/index.d.ts.map +0 -1
- package/dist/engine/index.js +0 -6
- package/dist/engine/index.js.map +0 -1
- package/dist/engine/types.d.ts +0 -345
- package/dist/engine/types.d.ts.map +0 -1
- package/dist/engine/types.js +0 -7
- package/dist/engine/types.js.map +0 -1
- package/dist/handlers/collection.d.ts +0 -6
- package/dist/handlers/collection.d.ts.map +0 -1
- package/dist/handlers/collection.js +0 -21
- package/dist/handlers/collection.js.map +0 -1
- package/dist/handlers/create-handler.d.ts +0 -120
- package/dist/handlers/create-handler.d.ts.map +0 -1
- package/dist/handlers/create-handler.js +0 -145
- package/dist/handlers/create-handler.js.map +0 -1
- package/dist/handlers/types.d.ts +0 -83
- package/dist/handlers/types.d.ts.map +0 -1
- package/dist/handlers/types.js +0 -5
- package/dist/handlers/types.js.map +0 -1
- package/dist/migrate.d.ts +0 -19
- package/dist/migrate.d.ts.map +0 -1
- package/dist/migrate.js +0 -238
- package/dist/migrate.js.map +0 -1
- package/dist/outbox.d.ts +0 -112
- package/dist/outbox.d.ts.map +0 -1
- package/dist/outbox.js +0 -294
- package/dist/outbox.js.map +0 -1
- package/dist/plugins/incrementing-version.d.ts +0 -34
- package/dist/plugins/incrementing-version.d.ts.map +0 -1
- package/dist/plugins/incrementing-version.js +0 -83
- package/dist/plugins/incrementing-version.js.map +0 -1
- package/dist/plugins/index.d.ts +0 -3
- package/dist/plugins/index.d.ts.map +0 -1
- package/dist/plugins/index.js +0 -3
- package/dist/plugins/index.js.map +0 -1
- package/dist/plugins/types.d.ts +0 -49
- package/dist/plugins/types.d.ts.map +0 -1
- package/dist/plugins/types.js +0 -15
- package/dist/plugins/types.js.map +0 -1
- package/dist/proxy/connection.d.ts +0 -33
- package/dist/proxy/connection.d.ts.map +0 -1
- package/dist/proxy/connection.js +0 -153
- package/dist/proxy/connection.js.map +0 -1
- package/dist/proxy/dialect.d.ts +0 -46
- package/dist/proxy/dialect.d.ts.map +0 -1
- package/dist/proxy/dialect.js +0 -58
- package/dist/proxy/dialect.js.map +0 -1
- package/dist/proxy/driver.d.ts +0 -42
- package/dist/proxy/driver.d.ts.map +0 -1
- package/dist/proxy/driver.js +0 -78
- package/dist/proxy/driver.js.map +0 -1
- package/dist/proxy/index.d.ts +0 -10
- package/dist/proxy/index.d.ts.map +0 -1
- package/dist/proxy/index.js +0 -10
- package/dist/proxy/index.js.map +0 -1
- package/dist/proxy/mutations.d.ts +0 -9
- package/dist/proxy/mutations.d.ts.map +0 -1
- package/dist/proxy/mutations.js +0 -11
- package/dist/proxy/mutations.js.map +0 -1
- package/dist/pull-engine.d.ts +0 -48
- package/dist/pull-engine.d.ts.map +0 -1
- package/dist/pull-engine.js +0 -648
- package/dist/pull-engine.js.map +0 -1
- package/dist/push-engine.d.ts +0 -18
- package/dist/push-engine.d.ts.map +0 -1
- package/dist/push-engine.js +0 -167
- package/dist/push-engine.js.map +0 -1
- package/dist/query/FingerprintCollector.d.ts +0 -18
- package/dist/query/FingerprintCollector.d.ts.map +0 -1
- package/dist/query/FingerprintCollector.js +0 -28
- package/dist/query/FingerprintCollector.js.map +0 -1
- package/dist/query/QueryContext.d.ts +0 -33
- package/dist/query/QueryContext.d.ts.map +0 -1
- package/dist/query/QueryContext.js +0 -16
- package/dist/query/QueryContext.js.map +0 -1
- package/dist/query/fingerprint.d.ts +0 -61
- package/dist/query/fingerprint.d.ts.map +0 -1
- package/dist/query/fingerprint.js +0 -91
- package/dist/query/fingerprint.js.map +0 -1
- package/dist/query/index.d.ts +0 -7
- package/dist/query/index.d.ts.map +0 -1
- package/dist/query/index.js +0 -7
- package/dist/query/index.js.map +0 -1
- package/dist/query/tracked-select.d.ts +0 -18
- package/dist/query/tracked-select.d.ts.map +0 -1
- package/dist/query/tracked-select.js +0 -90
- package/dist/query/tracked-select.js.map +0 -1
- package/dist/schema.d.ts +0 -83
- package/dist/schema.d.ts.map +0 -1
- package/dist/schema.js +0 -7
- package/dist/schema.js.map +0 -1
- package/dist/subscription-state.d.ts +0 -46
- package/dist/subscription-state.d.ts.map +0 -1
- package/dist/subscription-state.js +0 -185
- package/dist/subscription-state.js.map +0 -1
- package/dist/sync-loop.d.ts +0 -34
- package/dist/sync-loop.d.ts.map +0 -1
- package/dist/sync-loop.js +0 -253
- package/dist/sync-loop.js.map +0 -1
- package/dist/sync.d.ts +0 -32
- package/dist/sync.d.ts.map +0 -1
- package/dist/sync.js +0 -55
- package/dist/sync.js.map +0 -1
- package/dist/utils/id.d.ts +0 -17
- package/dist/utils/id.d.ts.map +0 -1
- package/dist/utils/id.js +0 -46
- package/dist/utils/id.js.map +0 -1
- package/src/blobs/index.ts +0 -7
- package/src/blobs/manager.ts +0 -1027
- package/src/blobs/migrate.ts +0 -67
- package/src/blobs/types.ts +0 -84
- package/src/client.test.ts +0 -417
- package/src/conflicts.ts +0 -171
- package/src/create-client.test.ts +0 -83
- package/src/create-client.ts +0 -330
- package/src/engine/SyncEngine.test.ts +0 -254
- package/src/engine/SyncEngine.ts +0 -2375
- package/src/engine/index.ts +0 -6
- package/src/engine/types.ts +0 -419
- package/src/handlers/collection.ts +0 -36
- package/src/handlers/create-handler.ts +0 -330
- package/src/handlers/types.ts +0 -108
- package/src/migrate.ts +0 -318
- package/src/outbox.ts +0 -383
- package/src/plugins/incrementing-version.ts +0 -133
- package/src/plugins/index.ts +0 -2
- package/src/plugins/types.ts +0 -63
- package/src/proxy/connection.ts +0 -191
- package/src/proxy/dialect.ts +0 -76
- package/src/proxy/driver.ts +0 -126
- package/src/proxy/index.ts +0 -10
- package/src/proxy/mutations.ts +0 -18
- package/src/pull-engine.test.ts +0 -151
- package/src/pull-engine.ts +0 -855
- package/src/push-engine.ts +0 -216
- package/src/query/FingerprintCollector.ts +0 -29
- package/src/query/QueryContext.ts +0 -54
- package/src/query/fingerprint.ts +0 -109
- package/src/query/index.ts +0 -10
- package/src/query/tracked-select.ts +0 -139
- package/src/schema.ts +0 -94
- package/src/subscription-state.ts +0 -259
- package/src/sync-loop.ts +0 -379
- package/src/sync.ts +0 -170
- 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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"}
|
package/dist/handlers/types.d.ts
DELETED
|
@@ -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"}
|
package/dist/handlers/types.js
DELETED
|
@@ -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
|
package/dist/migrate.d.ts.map
DELETED
|
@@ -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
|
package/dist/migrate.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../src/migrate.ts"],"names":[],"mappings":"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"}
|