@syncular/client 0.0.1-60

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 (176) hide show
  1. package/dist/blobs/index.d.ts +7 -0
  2. package/dist/blobs/index.d.ts.map +1 -0
  3. package/dist/blobs/index.js +7 -0
  4. package/dist/blobs/index.js.map +1 -0
  5. package/dist/blobs/manager.d.ts +345 -0
  6. package/dist/blobs/manager.d.ts.map +1 -0
  7. package/dist/blobs/manager.js +749 -0
  8. package/dist/blobs/manager.js.map +1 -0
  9. package/dist/blobs/migrate.d.ts +14 -0
  10. package/dist/blobs/migrate.d.ts.map +1 -0
  11. package/dist/blobs/migrate.js +59 -0
  12. package/dist/blobs/migrate.js.map +1 -0
  13. package/dist/blobs/types.d.ts +62 -0
  14. package/dist/blobs/types.d.ts.map +1 -0
  15. package/dist/blobs/types.js +5 -0
  16. package/dist/blobs/types.js.map +1 -0
  17. package/dist/client.d.ts +338 -0
  18. package/dist/client.d.ts.map +1 -0
  19. package/dist/client.js +834 -0
  20. package/dist/client.js.map +1 -0
  21. package/dist/conflicts.d.ts +31 -0
  22. package/dist/conflicts.d.ts.map +1 -0
  23. package/dist/conflicts.js +118 -0
  24. package/dist/conflicts.js.map +1 -0
  25. package/dist/create-client.d.ts +115 -0
  26. package/dist/create-client.d.ts.map +1 -0
  27. package/dist/create-client.js +162 -0
  28. package/dist/create-client.js.map +1 -0
  29. package/dist/engine/SyncEngine.d.ts +215 -0
  30. package/dist/engine/SyncEngine.d.ts.map +1 -0
  31. package/dist/engine/SyncEngine.js +1066 -0
  32. package/dist/engine/SyncEngine.js.map +1 -0
  33. package/dist/engine/index.d.ts +6 -0
  34. package/dist/engine/index.d.ts.map +1 -0
  35. package/dist/engine/index.js +6 -0
  36. package/dist/engine/index.js.map +1 -0
  37. package/dist/engine/types.d.ts +230 -0
  38. package/dist/engine/types.d.ts.map +1 -0
  39. package/dist/engine/types.js +7 -0
  40. package/dist/engine/types.js.map +1 -0
  41. package/dist/handlers/create-handler.d.ts +110 -0
  42. package/dist/handlers/create-handler.d.ts.map +1 -0
  43. package/dist/handlers/create-handler.js +140 -0
  44. package/dist/handlers/create-handler.js.map +1 -0
  45. package/dist/handlers/registry.d.ts +15 -0
  46. package/dist/handlers/registry.d.ts.map +1 -0
  47. package/dist/handlers/registry.js +29 -0
  48. package/dist/handlers/registry.js.map +1 -0
  49. package/dist/handlers/types.d.ts +83 -0
  50. package/dist/handlers/types.d.ts.map +1 -0
  51. package/dist/handlers/types.js +5 -0
  52. package/dist/handlers/types.js.map +1 -0
  53. package/dist/index.d.ts +24 -0
  54. package/dist/index.d.ts.map +1 -0
  55. package/dist/index.js +24 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/migrate.d.ts +19 -0
  58. package/dist/migrate.d.ts.map +1 -0
  59. package/dist/migrate.js +106 -0
  60. package/dist/migrate.js.map +1 -0
  61. package/dist/mutations.d.ts +138 -0
  62. package/dist/mutations.d.ts.map +1 -0
  63. package/dist/mutations.js +611 -0
  64. package/dist/mutations.js.map +1 -0
  65. package/dist/outbox.d.ts +112 -0
  66. package/dist/outbox.d.ts.map +1 -0
  67. package/dist/outbox.js +304 -0
  68. package/dist/outbox.js.map +1 -0
  69. package/dist/plugins/incrementing-version.d.ts +34 -0
  70. package/dist/plugins/incrementing-version.d.ts.map +1 -0
  71. package/dist/plugins/incrementing-version.js +83 -0
  72. package/dist/plugins/incrementing-version.js.map +1 -0
  73. package/dist/plugins/index.d.ts +3 -0
  74. package/dist/plugins/index.d.ts.map +1 -0
  75. package/dist/plugins/index.js +3 -0
  76. package/dist/plugins/index.js.map +1 -0
  77. package/dist/plugins/types.d.ts +49 -0
  78. package/dist/plugins/types.d.ts.map +1 -0
  79. package/dist/plugins/types.js +15 -0
  80. package/dist/plugins/types.js.map +1 -0
  81. package/dist/proxy/connection.d.ts +33 -0
  82. package/dist/proxy/connection.d.ts.map +1 -0
  83. package/dist/proxy/connection.js +153 -0
  84. package/dist/proxy/connection.js.map +1 -0
  85. package/dist/proxy/dialect.d.ts +46 -0
  86. package/dist/proxy/dialect.d.ts.map +1 -0
  87. package/dist/proxy/dialect.js +58 -0
  88. package/dist/proxy/dialect.js.map +1 -0
  89. package/dist/proxy/driver.d.ts +42 -0
  90. package/dist/proxy/driver.d.ts.map +1 -0
  91. package/dist/proxy/driver.js +78 -0
  92. package/dist/proxy/driver.js.map +1 -0
  93. package/dist/proxy/index.d.ts +10 -0
  94. package/dist/proxy/index.d.ts.map +1 -0
  95. package/dist/proxy/index.js +10 -0
  96. package/dist/proxy/index.js.map +1 -0
  97. package/dist/proxy/mutations.d.ts +9 -0
  98. package/dist/proxy/mutations.d.ts.map +1 -0
  99. package/dist/proxy/mutations.js +11 -0
  100. package/dist/proxy/mutations.js.map +1 -0
  101. package/dist/pull-engine.d.ts +45 -0
  102. package/dist/pull-engine.d.ts.map +1 -0
  103. package/dist/pull-engine.js +391 -0
  104. package/dist/pull-engine.js.map +1 -0
  105. package/dist/push-engine.d.ts +18 -0
  106. package/dist/push-engine.d.ts.map +1 -0
  107. package/dist/push-engine.js +155 -0
  108. package/dist/push-engine.js.map +1 -0
  109. package/dist/query/FingerprintCollector.d.ts +18 -0
  110. package/dist/query/FingerprintCollector.d.ts.map +1 -0
  111. package/dist/query/FingerprintCollector.js +28 -0
  112. package/dist/query/FingerprintCollector.js.map +1 -0
  113. package/dist/query/QueryContext.d.ts +33 -0
  114. package/dist/query/QueryContext.d.ts.map +1 -0
  115. package/dist/query/QueryContext.js +16 -0
  116. package/dist/query/QueryContext.js.map +1 -0
  117. package/dist/query/fingerprint.d.ts +61 -0
  118. package/dist/query/fingerprint.d.ts.map +1 -0
  119. package/dist/query/fingerprint.js +91 -0
  120. package/dist/query/fingerprint.js.map +1 -0
  121. package/dist/query/index.d.ts +7 -0
  122. package/dist/query/index.d.ts.map +1 -0
  123. package/dist/query/index.js +7 -0
  124. package/dist/query/index.js.map +1 -0
  125. package/dist/query/tracked-select.d.ts +18 -0
  126. package/dist/query/tracked-select.d.ts.map +1 -0
  127. package/dist/query/tracked-select.js +90 -0
  128. package/dist/query/tracked-select.js.map +1 -0
  129. package/dist/schema.d.ts +83 -0
  130. package/dist/schema.d.ts.map +1 -0
  131. package/dist/schema.js +7 -0
  132. package/dist/schema.js.map +1 -0
  133. package/dist/sync-loop.d.ts +32 -0
  134. package/dist/sync-loop.d.ts.map +1 -0
  135. package/dist/sync-loop.js +249 -0
  136. package/dist/sync-loop.js.map +1 -0
  137. package/dist/utils/id.d.ts +8 -0
  138. package/dist/utils/id.d.ts.map +1 -0
  139. package/dist/utils/id.js +19 -0
  140. package/dist/utils/id.js.map +1 -0
  141. package/package.json +58 -0
  142. package/src/blobs/index.ts +7 -0
  143. package/src/blobs/manager.ts +1027 -0
  144. package/src/blobs/migrate.ts +67 -0
  145. package/src/blobs/types.ts +84 -0
  146. package/src/client.ts +1222 -0
  147. package/src/conflicts.ts +180 -0
  148. package/src/create-client.ts +297 -0
  149. package/src/engine/SyncEngine.ts +1337 -0
  150. package/src/engine/index.ts +6 -0
  151. package/src/engine/types.ts +268 -0
  152. package/src/handlers/create-handler.ts +287 -0
  153. package/src/handlers/registry.ts +36 -0
  154. package/src/handlers/types.ts +102 -0
  155. package/src/index.ts +25 -0
  156. package/src/migrate.ts +122 -0
  157. package/src/mutations.ts +926 -0
  158. package/src/outbox.ts +397 -0
  159. package/src/plugins/incrementing-version.ts +133 -0
  160. package/src/plugins/index.ts +2 -0
  161. package/src/plugins/types.ts +63 -0
  162. package/src/proxy/connection.ts +191 -0
  163. package/src/proxy/dialect.ts +76 -0
  164. package/src/proxy/driver.ts +126 -0
  165. package/src/proxy/index.ts +10 -0
  166. package/src/proxy/mutations.ts +18 -0
  167. package/src/pull-engine.ts +518 -0
  168. package/src/push-engine.ts +201 -0
  169. package/src/query/FingerprintCollector.ts +29 -0
  170. package/src/query/QueryContext.ts +54 -0
  171. package/src/query/fingerprint.ts +109 -0
  172. package/src/query/index.ts +10 -0
  173. package/src/query/tracked-select.ts +139 -0
  174. package/src/schema.ts +94 -0
  175. package/src/sync-loop.ts +368 -0
  176. package/src/utils/id.ts +20 -0
@@ -0,0 +1,249 @@
1
+ /**
2
+ * @syncular/client - High-level sync loops
3
+ *
4
+ * Helpers that run push/pull repeatedly until the client is caught up.
5
+ */
6
+ import { upsertConflictsForRejectedCommit } from './conflicts';
7
+ import { getNextSendableOutboxCommit, markOutboxCommitAcked, markOutboxCommitFailed, markOutboxCommitPending, } from './outbox';
8
+ import { applyPullResponse, buildPullRequest, syncPullOnce, } from './pull-engine';
9
+ import { syncPushOnce } from './push-engine';
10
+ async function syncPushUntilSettled(db, transport, options) {
11
+ const maxCommits = Math.max(1, Math.min(1000, options.maxCommits ?? 20));
12
+ let pushedCount = 0;
13
+ for (let i = 0; i < maxCommits; i++) {
14
+ const res = await syncPushOnce(db, transport, {
15
+ clientId: options.clientId,
16
+ actorId: options.actorId,
17
+ plugins: options.plugins,
18
+ });
19
+ if (!res.pushed)
20
+ break;
21
+ pushedCount += 1;
22
+ }
23
+ return { pushedCount };
24
+ }
25
+ function hasPushViaWs(transport) {
26
+ return 'pushViaWs' in transport && typeof transport.pushViaWs === 'function';
27
+ }
28
+ function needsAnotherPull(res) {
29
+ for (const sub of res.subscriptions ?? []) {
30
+ if (sub.status !== 'active')
31
+ continue;
32
+ if (sub.bootstrap)
33
+ return true;
34
+ if ((sub.commits?.length ?? 0) > 0)
35
+ return true;
36
+ }
37
+ return false;
38
+ }
39
+ function mergePullResponse(targetBySubId, res) {
40
+ for (const sub of res.subscriptions ?? []) {
41
+ const prev = targetBySubId.get(sub.id);
42
+ if (!prev) {
43
+ const merged = {
44
+ ...sub,
45
+ commits: [...(sub.commits ?? [])],
46
+ snapshots: [...(sub.snapshots ?? [])],
47
+ };
48
+ targetBySubId.set(sub.id, merged);
49
+ continue;
50
+ }
51
+ const merged = {
52
+ ...prev,
53
+ ...sub,
54
+ commits: [...(prev.commits ?? []), ...(sub.commits ?? [])],
55
+ snapshots: [...(prev.snapshots ?? []), ...(sub.snapshots ?? [])],
56
+ };
57
+ targetBySubId.set(sub.id, merged);
58
+ }
59
+ }
60
+ async function syncPullUntilSettled(db, transport, shapes, options) {
61
+ const maxRounds = Math.max(1, Math.min(1000, options.maxRounds ?? 20));
62
+ const aggregatedBySubId = new Map();
63
+ let rounds = 0;
64
+ for (let i = 0; i < maxRounds; i++) {
65
+ rounds += 1;
66
+ const res = await syncPullOnce(db, transport, shapes, options);
67
+ mergePullResponse(aggregatedBySubId, res);
68
+ if (!needsAnotherPull(res))
69
+ break;
70
+ }
71
+ return {
72
+ // Return an aggregate response so callers can see what was applied across
73
+ // all pull rounds (the last round is often empty by design).
74
+ response: {
75
+ ok: true,
76
+ subscriptions: Array.from(aggregatedBySubId.values()),
77
+ },
78
+ rounds,
79
+ };
80
+ }
81
+ /**
82
+ * Sync once using a WS-first push strategy for the first outbox commit.
83
+ *
84
+ * - If transport supports `pushViaWs` and the commit succeeds over WS, this call
85
+ * sends only an HTTP pull request.
86
+ * - Otherwise it falls back to combined HTTP push+pull.
87
+ *
88
+ * Remaining outbox commits are then settled via `syncPushUntilSettled`.
89
+ */
90
+ async function syncOnceCombined(db, transport, shapes, options) {
91
+ const pullOpts = {
92
+ clientId: options.clientId,
93
+ actorId: options.actorId,
94
+ plugins: options.plugins,
95
+ subscriptions: options.subscriptions,
96
+ limitCommits: options.limitCommits,
97
+ limitSnapshotRows: options.limitSnapshotRows,
98
+ maxSnapshotPages: options.maxSnapshotPages,
99
+ dedupeRows: options.dedupeRows,
100
+ stateId: options.stateId,
101
+ };
102
+ // Build pull request (reads subscription state)
103
+ const pullState = await buildPullRequest(db, pullOpts);
104
+ const { clientId } = pullState.request;
105
+ // Grab at most one outbox commit
106
+ const outbox = await getNextSendableOutboxCommit(db);
107
+ const plugins = options.plugins ?? [];
108
+ const ctx = {
109
+ actorId: options.actorId ?? 'unknown',
110
+ clientId,
111
+ };
112
+ // Build push request, running beforePush plugins
113
+ let pushRequest;
114
+ if (outbox) {
115
+ pushRequest = {
116
+ clientId,
117
+ clientCommitId: outbox.client_commit_id,
118
+ operations: outbox.operations,
119
+ schemaVersion: outbox.schema_version,
120
+ };
121
+ for (const plugin of plugins) {
122
+ if (!plugin.beforePush)
123
+ continue;
124
+ pushRequest = await plugin.beforePush(ctx, pushRequest);
125
+ }
126
+ }
127
+ // Try WS push first for the first outbox commit (if realtime transport supports it).
128
+ // Fall back to HTTP push in the combined request when WS is unavailable or fails.
129
+ let wsPushResponse = null;
130
+ if (pushRequest && hasPushViaWs(transport)) {
131
+ try {
132
+ wsPushResponse = await transport.pushViaWs(pushRequest);
133
+ }
134
+ catch {
135
+ wsPushResponse = null;
136
+ }
137
+ }
138
+ const combined = await transport.sync({
139
+ clientId,
140
+ ...(pushRequest && !wsPushResponse
141
+ ? {
142
+ push: {
143
+ clientCommitId: pushRequest.clientCommitId,
144
+ operations: pushRequest.operations,
145
+ schemaVersion: pushRequest.schemaVersion,
146
+ },
147
+ }
148
+ : {}),
149
+ pull: {
150
+ limitCommits: pullState.request.limitCommits,
151
+ limitSnapshotRows: pullState.request.limitSnapshotRows,
152
+ maxSnapshotPages: pullState.request.maxSnapshotPages,
153
+ dedupeRows: pullState.request.dedupeRows,
154
+ subscriptions: pullState.request.subscriptions,
155
+ },
156
+ });
157
+ // Process push response
158
+ let pushedCommits = 0;
159
+ if (outbox && pushRequest) {
160
+ let pushRes = wsPushResponse ?? combined.push;
161
+ if (!pushRes) {
162
+ await markOutboxCommitPending(db, {
163
+ id: outbox.id,
164
+ error: 'MISSING_PUSH_RESPONSE',
165
+ });
166
+ throw new Error('Server returned no push response');
167
+ }
168
+ // Run afterPush plugins
169
+ for (const plugin of plugins) {
170
+ if (!plugin.afterPush)
171
+ continue;
172
+ pushRes = await plugin.afterPush(ctx, {
173
+ request: pushRequest,
174
+ response: pushRes,
175
+ });
176
+ }
177
+ const responseJson = JSON.stringify(pushRes);
178
+ if (pushRes.status === 'applied' || pushRes.status === 'cached') {
179
+ await markOutboxCommitAcked(db, {
180
+ id: outbox.id,
181
+ commitSeq: pushRes.commitSeq ?? null,
182
+ responseJson,
183
+ });
184
+ pushedCommits = 1;
185
+ }
186
+ else {
187
+ // Check if all errors are retriable
188
+ const errorResults = pushRes.results.filter((r) => r.status === 'error');
189
+ const allRetriable = errorResults.length > 0 &&
190
+ errorResults.every((r) => r.retriable === true);
191
+ if (allRetriable) {
192
+ await markOutboxCommitPending(db, {
193
+ id: outbox.id,
194
+ error: 'Retriable',
195
+ responseJson,
196
+ });
197
+ pushedCommits = 1;
198
+ }
199
+ else {
200
+ await upsertConflictsForRejectedCommit(db, {
201
+ outboxCommitId: outbox.id,
202
+ clientCommitId: outbox.client_commit_id,
203
+ response: pushRes,
204
+ });
205
+ await markOutboxCommitFailed(db, {
206
+ id: outbox.id,
207
+ error: 'REJECTED',
208
+ responseJson,
209
+ });
210
+ pushedCommits = 1;
211
+ }
212
+ }
213
+ // Settle remaining outbox commits
214
+ const remaining = await syncPushUntilSettled(db, transport, {
215
+ clientId: options.clientId,
216
+ actorId: options.actorId,
217
+ plugins: options.plugins,
218
+ maxCommits: (options.maxPushCommits ?? 20) - 1,
219
+ });
220
+ pushedCommits += remaining.pushedCount;
221
+ }
222
+ // Process pull response
223
+ let pullResponse = { ok: true, subscriptions: [] };
224
+ let pullRounds = 0;
225
+ if (combined.pull) {
226
+ pullResponse = await applyPullResponse(db, transport, shapes, pullOpts, pullState, combined.pull);
227
+ pullRounds = 1;
228
+ // Continue pulling if more data
229
+ if (needsAnotherPull(pullResponse)) {
230
+ const aggregatedBySubId = new Map();
231
+ mergePullResponse(aggregatedBySubId, pullResponse);
232
+ const more = await syncPullUntilSettled(db, transport, shapes, {
233
+ ...pullOpts,
234
+ maxRounds: (options.maxPullRounds ?? 20) - 1,
235
+ });
236
+ pullRounds += more.rounds;
237
+ mergePullResponse(aggregatedBySubId, more.response);
238
+ pullResponse = {
239
+ ok: true,
240
+ subscriptions: Array.from(aggregatedBySubId.values()),
241
+ };
242
+ }
243
+ }
244
+ return { pushedCommits, pullRounds, pullResponse };
245
+ }
246
+ export async function syncOnce(db, transport, shapes, options) {
247
+ return syncOnceCombined(db, transport, shapes, options);
248
+ }
249
+ //# sourceMappingURL=sync-loop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-loop.js","sourceRoot":"","sources":["../src/sync-loop.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * ID generation utilities
3
+ */
4
+ /**
5
+ * Generate a random UUID v4
6
+ */
7
+ export declare function randomUUID(): string;
8
+ //# sourceMappingURL=id.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"id.d.ts","sourceRoot":"","sources":["../../src/utils/id.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAYnC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * ID generation utilities
3
+ */
4
+ /**
5
+ * Generate a random UUID v4
6
+ */
7
+ export function randomUUID() {
8
+ // Use crypto.randomUUID if available (modern browsers, Node, Bun)
9
+ if (typeof crypto !== 'undefined' && crypto.randomUUID) {
10
+ return crypto.randomUUID();
11
+ }
12
+ // Fallback implementation
13
+ return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
14
+ const r = (Math.random() * 16) | 0;
15
+ const v = c === 'x' ? r : (r & 0x3) | 0x8;
16
+ return v.toString(16);
17
+ });
18
+ }
19
+ //# sourceMappingURL=id.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"id.js","sourceRoot":"","sources":["../../src/utils/id.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,UAAU,UAAU,GAAW;IACnC,kEAAkE;IAClE,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACvD,OAAO,MAAM,CAAC,UAAU,EAAE,CAAC;IAC7B,CAAC;IAED,0BAA0B;IAC1B,OAAO,sCAAsC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;QACpE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;QAC1C,OAAO,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAAA,CACvB,CAAC,CAAC;AAAA,CACJ"}
package/package.json ADDED
@@ -0,0 +1,58 @@
1
+ {
2
+ "name": "@syncular/client",
3
+ "version": "0.0.1-60",
4
+ "description": "Client-side sync engine with offline-first support, outbox, and conflict resolution",
5
+ "license": "MIT",
6
+ "author": "Benjamin Kniffler",
7
+ "homepage": "https://syncular.dev",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "https://github.com/syncular/syncular.git",
11
+ "directory": "packages/client"
12
+ },
13
+ "bugs": {
14
+ "url": "https://github.com/syncular/syncular/issues"
15
+ },
16
+ "keywords": [
17
+ "sync",
18
+ "offline-first",
19
+ "realtime",
20
+ "database",
21
+ "typescript"
22
+ ],
23
+ "private": false,
24
+ "publishConfig": {
25
+ "access": "public"
26
+ },
27
+ "type": "module",
28
+ "files": [
29
+ "dist",
30
+ "src"
31
+ ],
32
+ "exports": {
33
+ ".": {
34
+ "bun": "./src/index.ts",
35
+ "import": {
36
+ "types": "./dist/index.d.ts",
37
+ "default": "./dist/index.js"
38
+ }
39
+ }
40
+ },
41
+ "scripts": {
42
+ "test": "bun test --pass-with-no-tests",
43
+ "tsgo": "tsgo --noEmit",
44
+ "build": "rm -rf dist && tsgo",
45
+ "release": "bun pm pack --destination . && npm publish ./*.tgz --tag latest && rm -f ./*.tgz"
46
+ },
47
+ "dependencies": {
48
+ "@syncular/core": "0.0.1",
49
+ "@syncular/transport-http": "0.0.1"
50
+ },
51
+ "peerDependencies": {
52
+ "kysely": "*"
53
+ },
54
+ "devDependencies": {
55
+ "@syncular/config": "0.0.0",
56
+ "kysely": "*"
57
+ }
58
+ }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @syncular/client - Blob storage exports
3
+ */
4
+
5
+ export * from './manager';
6
+ export * from './migrate';
7
+ export * from './types';