@pol-studios/powersync 1.0.25 → 1.0.32

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 (118) hide show
  1. package/README.md +0 -1
  2. package/dist/{CacheSettingsManager-uz-kbnRH.d.ts → CacheSettingsManager-0H_7thHW.d.ts} +21 -3
  3. package/dist/attachments/index.d.ts +30 -30
  4. package/dist/attachments/index.js +13 -4
  5. package/dist/{background-sync-ChCXW-EV.d.ts → background-sync-BujnI3IR.d.ts} +1 -1
  6. package/dist/{chunk-55DKCJV4.js → chunk-2RDWLXJW.js} +408 -78
  7. package/dist/chunk-2RDWLXJW.js.map +1 -0
  8. package/dist/{chunk-P4HZA6ZT.js → chunk-4665ZSE5.js} +2 -2
  9. package/dist/chunk-4665ZSE5.js.map +1 -0
  10. package/dist/{chunk-XOY2CJ67.js → chunk-4F5B5CZ7.js} +3 -3
  11. package/dist/chunk-5WRI5ZAA.js +31 -0
  12. package/dist/{chunk-BGBQYQV3.js → chunk-65A3SYJZ.js} +193 -299
  13. package/dist/chunk-65A3SYJZ.js.map +1 -0
  14. package/dist/chunk-6SZ64KCZ.js +755 -0
  15. package/dist/chunk-6SZ64KCZ.js.map +1 -0
  16. package/dist/{chunk-YSTEESEG.js → chunk-74TBHWJ4.js} +122 -11
  17. package/dist/chunk-74TBHWJ4.js.map +1 -0
  18. package/dist/chunk-ANXWYQEJ.js +1 -0
  19. package/dist/chunk-ANXWYQEJ.js.map +1 -0
  20. package/dist/{chunk-CAB26E6F.js → chunk-C4J4MLER.js} +29 -24
  21. package/dist/chunk-C4J4MLER.js.map +1 -0
  22. package/dist/{chunk-C5ODS3XH.js → chunk-EOW7JK7Q.js} +9 -16
  23. package/dist/chunk-EOW7JK7Q.js.map +1 -0
  24. package/dist/chunk-HRAVPIAZ.js +220 -0
  25. package/dist/chunk-HRAVPIAZ.js.map +1 -0
  26. package/dist/{chunk-XAEII4ZX.js → chunk-NUGQOTEM.js} +32 -4
  27. package/dist/chunk-NUGQOTEM.js.map +1 -0
  28. package/dist/chunk-OGUFUZSY.js +5415 -0
  29. package/dist/chunk-OGUFUZSY.js.map +1 -0
  30. package/dist/{chunk-VB737IVN.js → chunk-P4D6BQ4X.js} +328 -706
  31. package/dist/chunk-P4D6BQ4X.js.map +1 -0
  32. package/dist/{chunk-CACKC6XG.js → chunk-PGEDE6IM.js} +136 -89
  33. package/dist/chunk-PGEDE6IM.js.map +1 -0
  34. package/dist/{chunk-A4IBBWGO.js → chunk-RALHHPTU.js} +1 -1
  35. package/dist/chunk-RIDSPLE5.js +42 -0
  36. package/dist/chunk-RIDSPLE5.js.map +1 -0
  37. package/dist/{chunk-Z6VOBGTU.js → chunk-UOMHWUHV.js} +2 -12
  38. package/dist/chunk-UOMHWUHV.js.map +1 -0
  39. package/dist/{chunk-WGHNIAF7.js → chunk-YONQYTVH.js} +2 -2
  40. package/dist/chunk-ZAN22NGL.js +13 -0
  41. package/dist/chunk-ZAN22NGL.js.map +1 -0
  42. package/dist/config/index.d.ts +200 -0
  43. package/dist/config/index.js +23 -0
  44. package/dist/config/index.js.map +1 -0
  45. package/dist/connector/index.d.ts +23 -5
  46. package/dist/connector/index.js +4 -2
  47. package/dist/core/index.d.ts +2 -2
  48. package/dist/core/index.js +1 -0
  49. package/dist/error/index.js +1 -0
  50. package/dist/generator/index.js +2 -0
  51. package/dist/generator/index.js.map +1 -1
  52. package/dist/index.d.ts +19 -16
  53. package/dist/index.js +88 -46
  54. package/dist/index.native.d.ts +18 -14
  55. package/dist/index.native.js +93 -44
  56. package/dist/index.web.d.ts +17 -14
  57. package/dist/index.web.js +88 -46
  58. package/dist/maintenance/index.d.ts +2 -2
  59. package/dist/maintenance/index.js +3 -2
  60. package/dist/platform/index.d.ts +1 -1
  61. package/dist/platform/index.js +2 -0
  62. package/dist/platform/index.js.map +1 -1
  63. package/dist/platform/index.native.d.ts +1 -1
  64. package/dist/platform/index.native.js +1 -0
  65. package/dist/platform/index.web.d.ts +1 -1
  66. package/dist/platform/index.web.js +1 -0
  67. package/dist/pol-attachment-queue-DqBvLAEY.d.ts +255 -0
  68. package/dist/provider/index.d.ts +319 -124
  69. package/dist/provider/index.js +21 -16
  70. package/dist/provider/index.native.d.ts +108 -0
  71. package/dist/provider/index.native.js +121 -0
  72. package/dist/provider/index.native.js.map +1 -0
  73. package/dist/provider/index.web.d.ts +16 -0
  74. package/dist/provider/index.web.js +112 -0
  75. package/dist/provider/index.web.js.map +1 -0
  76. package/dist/react/index.d.ts +16 -65
  77. package/dist/react/index.js +2 -9
  78. package/dist/storage/index.d.ts +5 -4
  79. package/dist/storage/index.js +12 -9
  80. package/dist/storage/index.native.d.ts +5 -4
  81. package/dist/storage/index.native.js +8 -5
  82. package/dist/storage/index.web.d.ts +5 -4
  83. package/dist/storage/index.web.js +11 -8
  84. package/dist/storage/upload/index.d.ts +4 -3
  85. package/dist/storage/upload/index.js +4 -2
  86. package/dist/storage/upload/index.native.d.ts +4 -3
  87. package/dist/storage/upload/index.native.js +4 -2
  88. package/dist/storage/upload/index.web.d.ts +2 -1
  89. package/dist/storage/upload/index.web.js +4 -2
  90. package/dist/{supabase-connector-D2oIl2t8.d.ts → supabase-connector-HMxBA9Kg.d.ts} +23 -25
  91. package/dist/sync/index.d.ts +183 -11
  92. package/dist/sync/index.js +13 -3
  93. package/dist/{types-CyvBaAl8.d.ts → types-6QHGELuY.d.ts} +4 -1
  94. package/dist/{types-CDqWh56B.d.ts → types-B9MptP7E.d.ts} +13 -1
  95. package/dist/types-BhAEsJj-.d.ts +330 -0
  96. package/dist/{types-D0WcHrq6.d.ts → types-CGMibJKD.d.ts} +8 -0
  97. package/dist/{types-DiBvmGEi.d.ts → types-DqJnP50o.d.ts} +22 -24
  98. package/dist/{pol-attachment-queue-BE2HU3Us.d.ts → types-JCEhw2Lf.d.ts} +139 -346
  99. package/package.json +18 -4
  100. package/dist/chunk-24RDMMCL.js +0 -44
  101. package/dist/chunk-24RDMMCL.js.map +0 -1
  102. package/dist/chunk-55DKCJV4.js.map +0 -1
  103. package/dist/chunk-654ERHA7.js +0 -1
  104. package/dist/chunk-BGBQYQV3.js.map +0 -1
  105. package/dist/chunk-C5ODS3XH.js.map +0 -1
  106. package/dist/chunk-CAB26E6F.js.map +0 -1
  107. package/dist/chunk-CACKC6XG.js.map +0 -1
  108. package/dist/chunk-P4HZA6ZT.js.map +0 -1
  109. package/dist/chunk-TIFL2KWE.js +0 -358
  110. package/dist/chunk-TIFL2KWE.js.map +0 -1
  111. package/dist/chunk-VB737IVN.js.map +0 -1
  112. package/dist/chunk-XAEII4ZX.js.map +0 -1
  113. package/dist/chunk-YSTEESEG.js.map +0 -1
  114. package/dist/chunk-Z6VOBGTU.js.map +0 -1
  115. /package/dist/{chunk-XOY2CJ67.js.map → chunk-4F5B5CZ7.js.map} +0 -0
  116. /package/dist/{chunk-654ERHA7.js.map → chunk-5WRI5ZAA.js.map} +0 -0
  117. /package/dist/{chunk-A4IBBWGO.js.map → chunk-RALHHPTU.js.map} +0 -0
  118. /package/dist/{chunk-WGHNIAF7.js.map → chunk-YONQYTVH.js.map} +0 -0
@@ -1,358 +0,0 @@
1
- import {
2
- createPolAttachmentQueue
3
- } from "./chunk-CACKC6XG.js";
4
- import {
5
- DEFAULT_SYNC_STATUS
6
- } from "./chunk-24RDMMCL.js";
7
- import {
8
- SupabaseConnector
9
- } from "./chunk-BGBQYQV3.js";
10
- import {
11
- classifySupabaseError,
12
- createSyncError
13
- } from "./chunk-I2AYMY5O.js";
14
-
15
- // src/react/provider.tsx
16
- import { useEffect, useState, useRef, useMemo } from "react";
17
-
18
- // src/react/contexts.ts
19
- import { createContext } from "react";
20
- var PowerSyncContext = createContext(null);
21
- PowerSyncContext.displayName = "PowerSyncContext";
22
- var SyncStatusContext = createContext(null);
23
- SyncStatusContext.displayName = "SyncStatusContext";
24
- var AttachmentQueueContext = createContext(null);
25
- AttachmentQueueContext.displayName = "AttachmentQueueContext";
26
-
27
- // src/react/provider.tsx
28
- import { jsx } from "react/jsx-runtime";
29
- var defaultLogger = {
30
- debug: (...args) => console.debug("[PowerSync]", ...args),
31
- info: (...args) => console.info("[PowerSync]", ...args),
32
- warn: (...args) => console.warn("[PowerSync]", ...args),
33
- error: (...args) => console.error("[PowerSync]", ...args)
34
- };
35
- function SlimPowerSyncProvider({
36
- config,
37
- auth,
38
- storage,
39
- attachments,
40
- platform: customPlatform,
41
- onError,
42
- onReady,
43
- onSyncStatusChange,
44
- children
45
- }) {
46
- const {
47
- schema,
48
- powerSyncUrl,
49
- dbFilename = "powersync.db"
50
- } = config;
51
- const [db, setDb] = useState(null);
52
- const [platform, setPlatform] = useState(customPlatform ?? null);
53
- const [isReady, setIsReady] = useState(false);
54
- const [isInitializing, setIsInitializing] = useState(true);
55
- const [error, setError] = useState(null);
56
- const [syncStatus, setSyncStatus] = useState(DEFAULT_SYNC_STATUS);
57
- const [attachmentQueue, setAttachmentQueue] = useState(null);
58
- const [attachmentQueueReady, setAttachmentQueueReady] = useState(!attachments);
59
- const connectorRef = useRef(null);
60
- const initializingRef = useRef(false);
61
- const dbClosedRef = useRef(false);
62
- const onErrorRef = useRef(onError);
63
- const onReadyRef = useRef(onReady);
64
- const onSyncStatusChangeRef = useRef(onSyncStatusChange);
65
- useEffect(() => {
66
- onErrorRef.current = onError;
67
- }, [onError]);
68
- useEffect(() => {
69
- onReadyRef.current = onReady;
70
- }, [onReady]);
71
- useEffect(() => {
72
- onSyncStatusChangeRef.current = onSyncStatusChange;
73
- }, [onSyncStatusChange]);
74
- const logger = platform?.logger ?? defaultLogger;
75
- useEffect(() => {
76
- if (customPlatform) {
77
- setPlatform(customPlatform);
78
- return;
79
- }
80
- import("./platform/index.native.js").then(({
81
- createNativePlatformAdapter
82
- }) => {
83
- setPlatform(createNativePlatformAdapter(defaultLogger));
84
- }).catch((err) => {
85
- logger.error("Failed to load platform adapter:", err);
86
- setError(new Error("Failed to load platform adapter"));
87
- setIsInitializing(false);
88
- });
89
- }, [customPlatform]);
90
- useEffect(() => {
91
- if (!platform || initializingRef.current) return;
92
- initializingRef.current = true;
93
- const controller = {
94
- cancelled: false
95
- };
96
- const initDatabase = async () => {
97
- try {
98
- dbClosedRef.current = false;
99
- logger.info("Initializing database...");
100
- const database = await platform.createDatabase({
101
- dbFilename,
102
- schema
103
- });
104
- if (controller.cancelled) {
105
- await database.close();
106
- initializingRef.current = false;
107
- return;
108
- }
109
- logger.info("Database initialized");
110
- setDb(database);
111
- setIsReady(true);
112
- setIsInitializing(false);
113
- onReadyRef.current?.();
114
- } catch (err_0) {
115
- const initError = err_0 instanceof Error ? err_0 : new Error(String(err_0));
116
- logger.error("Initialization failed:", initError);
117
- if (!controller.cancelled) {
118
- setError(initError);
119
- setIsInitializing(false);
120
- const syncError = createSyncError(classifySupabaseError(initError), initError.message);
121
- onErrorRef.current?.(syncError);
122
- }
123
- initializingRef.current = false;
124
- }
125
- };
126
- initDatabase();
127
- return () => {
128
- controller.cancelled = true;
129
- initializingRef.current = false;
130
- };
131
- }, [platform, dbFilename, schema, logger]);
132
- useEffect(() => {
133
- if (!db || !platform) return;
134
- const connectPowerSync = async () => {
135
- try {
136
- const session = await auth.getSession();
137
- if (!session) {
138
- logger.debug("No session, skipping connect");
139
- return;
140
- }
141
- if (connectorRef.current) {
142
- connectorRef.current.destroy();
143
- connectorRef.current = null;
144
- }
145
- const connector = new SupabaseConnector({
146
- supabaseClient: {
147
- auth: {
148
- getSession: async () => {
149
- const s = await auth.getSession();
150
- return {
151
- data: {
152
- session: s ? {
153
- access_token: s.accessToken,
154
- expires_at: s.expiresAt ? s.expiresAt.getTime() / 1e3 : void 0,
155
- user: s.user
156
- } : null
157
- },
158
- error: null
159
- };
160
- },
161
- refreshSession: async () => {
162
- const s_0 = await auth.refreshSession();
163
- return {
164
- data: {
165
- session: {
166
- access_token: s_0.accessToken,
167
- expires_at: s_0.expiresAt ? s_0.expiresAt.getTime() / 1e3 : void 0,
168
- user: s_0.user
169
- }
170
- },
171
- error: null
172
- };
173
- },
174
- onAuthStateChange: (cb) => {
175
- const unsub = auth.onAuthStateChange((s_1) => {
176
- cb("TOKEN_REFRESHED", s_1 ? {
177
- access_token: s_1.accessToken,
178
- expires_at: s_1.expiresAt ? s_1.expiresAt.getTime() / 1e3 : void 0,
179
- user: s_1.user
180
- } : null);
181
- });
182
- return {
183
- data: {
184
- subscription: {
185
- unsubscribe: unsub
186
- }
187
- }
188
- };
189
- }
190
- }
191
- },
192
- powerSyncUrl,
193
- logger,
194
- onTransactionFailure: (_entries, err_2, classified) => {
195
- const syncError_1 = createSyncError(classified, err_2.message);
196
- onErrorRef.current?.(syncError_1);
197
- }
198
- });
199
- connectorRef.current = connector;
200
- logger.info("Connecting to PowerSync...");
201
- await db.connect(connector);
202
- logger.info("Connected to PowerSync");
203
- } catch (err_1) {
204
- const connectError = err_1 instanceof Error ? err_1 : new Error(String(err_1));
205
- logger.error("Connection failed:", connectError);
206
- const syncError_0 = createSyncError(classifySupabaseError(connectError), connectError.message);
207
- onErrorRef.current?.(syncError_0);
208
- }
209
- };
210
- connectPowerSync();
211
- const unsubscribe = auth.onAuthStateChange(async (session_0) => {
212
- if (session_0 && db && !dbClosedRef.current) {
213
- logger.debug("Session changed, reconnecting...");
214
- await connectPowerSync();
215
- } else if (!session_0 && db) {
216
- logger.debug("Session cleared, disconnecting...");
217
- await db.disconnect();
218
- }
219
- });
220
- return () => {
221
- unsubscribe();
222
- };
223
- }, [db, auth, powerSyncUrl, platform, logger]);
224
- useEffect(() => {
225
- if (!db) return;
226
- const unsubscribe_0 = db.registerListener({
227
- statusChanged: (status) => {
228
- const newStatus = {
229
- connected: status?.connected ?? false,
230
- connecting: status?.connecting ?? false,
231
- hasSynced: status?.hasSynced ?? false,
232
- lastSyncedAt: status?.lastSyncedAt ?? null,
233
- uploading: status?.dataFlowStatus?.uploading ?? false,
234
- downloading: status?.dataFlowStatus?.downloading ?? false,
235
- downloadProgress: status?.downloadProgress ? {
236
- current: status.downloadProgress.downloadedOperations ?? 0,
237
- target: status.downloadProgress.totalOperations ?? 0,
238
- percentage: status.downloadProgress.downloadedFraction ? status.downloadProgress.downloadedFraction * 100 : 0
239
- } : null,
240
- failedTransactions: [],
241
- hasUploadErrors: false,
242
- permanentErrorCount: 0
243
- };
244
- setSyncStatus(newStatus);
245
- onSyncStatusChangeRef.current?.(newStatus);
246
- }
247
- });
248
- return unsubscribe_0;
249
- }, [db]);
250
- useEffect(() => {
251
- if (!db || !platform || !attachments || !storage) {
252
- setAttachmentQueueReady(!attachments);
253
- return;
254
- }
255
- const initQueue = async () => {
256
- try {
257
- logger.info("Initializing attachment queue...");
258
- const queue = await createPolAttachmentQueue(db, platform, {
259
- bucket: attachments.bucket,
260
- watchIds: attachments.watchIds,
261
- skipDownload: attachments.skipDownload,
262
- remoteStorage: {
263
- downloadFile: async (path) => {
264
- const result = await storage.download(path);
265
- if (result.type === "file") {
266
- return result.uri;
267
- }
268
- return result.data;
269
- },
270
- resolveBucket: storage.resolveBucket
271
- },
272
- onUploadComplete: attachments.onUploadComplete ? async (record) => {
273
- attachments.onUploadComplete?.(record);
274
- } : void 0,
275
- onUploadFailed: attachments.onUploadFailed ? (record_0, err_4) => {
276
- attachments.onUploadFailed?.(record_0, err_4);
277
- } : void 0,
278
- cache: attachments.maxCacheBytes ? {
279
- maxSize: attachments.maxCacheBytes
280
- } : void 0
281
- });
282
- setAttachmentQueue(queue);
283
- setAttachmentQueueReady(true);
284
- logger.info("Attachment queue initialized");
285
- } catch (err_3) {
286
- logger.error("Failed to initialize attachment queue:", err_3);
287
- setAttachmentQueueReady(true);
288
- }
289
- };
290
- initQueue();
291
- }, [db, platform, attachments, storage, logger]);
292
- useEffect(() => {
293
- return () => {
294
- dbClosedRef.current = true;
295
- if (connectorRef.current) {
296
- connectorRef.current.destroy();
297
- connectorRef.current = null;
298
- }
299
- if (db) {
300
- db.disconnect().catch(() => {
301
- });
302
- db.close().catch(() => {
303
- });
304
- }
305
- };
306
- }, [db]);
307
- const powerSyncValue = useMemo(() => ({
308
- db,
309
- isReady,
310
- isInitializing,
311
- error,
312
- platform
313
- }), [db, isReady, isInitializing, error, platform]);
314
- const syncStatusValue = useMemo(() => ({
315
- status: syncStatus,
316
- lastSyncedAt: syncStatus.lastSyncedAt
317
- }), [syncStatus]);
318
- const attachmentQueueValue = useMemo(() => ({
319
- queue: attachmentQueue,
320
- isReady: attachmentQueueReady
321
- }), [attachmentQueue, attachmentQueueReady]);
322
- return /* @__PURE__ */ jsx(PowerSyncContext.Provider, { value: powerSyncValue, children: /* @__PURE__ */ jsx(SyncStatusContext.Provider, { value: syncStatusValue, children: /* @__PURE__ */ jsx(AttachmentQueueContext.Provider, { value: attachmentQueueValue, children }) }) });
323
- }
324
-
325
- // src/react/index.ts
326
- import { useContext } from "react";
327
- function usePowerSyncContext() {
328
- const context = useContext(PowerSyncContext);
329
- if (!context) {
330
- throw new Error("usePowerSyncContext must be used within a PowerSyncProvider");
331
- }
332
- return context;
333
- }
334
- function useSyncStatusContext() {
335
- const context = useContext(SyncStatusContext);
336
- if (!context) {
337
- throw new Error("useSyncStatusContext must be used within a PowerSyncProvider");
338
- }
339
- return context;
340
- }
341
- function useAttachmentQueueContext() {
342
- const context = useContext(AttachmentQueueContext);
343
- if (!context) {
344
- throw new Error("useAttachmentQueueContext must be used within a PowerSyncProvider");
345
- }
346
- return context;
347
- }
348
-
349
- export {
350
- PowerSyncContext,
351
- SyncStatusContext,
352
- AttachmentQueueContext,
353
- SlimPowerSyncProvider,
354
- usePowerSyncContext,
355
- useSyncStatusContext,
356
- useAttachmentQueueContext
357
- };
358
- //# sourceMappingURL=chunk-TIFL2KWE.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/react/provider.tsx","../src/react/contexts.ts","../src/react/index.ts"],"sourcesContent":["/**\n * Slim PowerSyncProvider for @pol-studios/powersync\n *\n * A simplified, composable provider that:\n * - Has zero @pol/db coupling\n * - Uses AuthProvider interface for any auth backend\n * - Delegates domain logic to callbacks\n * - Is ~150 lines vs 1400+ in the legacy provider\n *\n * For backwards compatibility, the legacy OfflineDataProvider is still available.\n */\n\nimport React, { useEffect, useState, useRef, useMemo, useCallback } from 'react';\nimport type { PowerSyncProviderProps, SyncStatusContextValue } from './types';\nimport type { AbstractPowerSyncDatabase, SyncStatus, SyncError } from '../core/types';\nimport type { PlatformAdapter } from '../platform/types';\nimport { SupabaseConnector } from '../connector/supabase-connector';\nimport { createPolAttachmentQueue, type PolAttachmentQueue } from '../attachments/pol-attachment-queue';\nimport { classifySupabaseError, createSyncError } from '../core/errors';\nimport { PowerSyncContext, SyncStatusContext, AttachmentQueueContext } from './contexts';\nimport { DEFAULT_SYNC_STATUS } from '../provider/types';\n\n/**\n * Default console logger for when no platform is provided.\n */\nconst defaultLogger = {\n debug: (...args: unknown[]) => console.debug('[PowerSync]', ...args),\n info: (...args: unknown[]) => console.info('[PowerSync]', ...args),\n warn: (...args: unknown[]) => console.warn('[PowerSync]', ...args),\n error: (...args: unknown[]) => console.error('[PowerSync]', ...args)\n};\n\n/**\n * Slim PowerSyncProvider - minimal, composable, no domain coupling.\n *\n * This provider handles:\n * - Database initialization via platform adapter\n * - Connector setup using AuthProvider\n * - Attachment queue initialization (if configured)\n * - Sync status tracking\n * - Error classification and callbacks\n *\n * @example\n * ```tsx\n * import { PowerSyncProvider, createSupabaseAuth, createSupabaseStorage } from '@pol-studios/powersync/react';\n *\n * function App() {\n * const auth = useMemo(() => createSupabaseAuth(supabase), [supabase]);\n * const storage = useMemo(() => createSupabaseStorage({\n * client: supabase,\n * defaultBucket: 'attachments',\n * }), [supabase]);\n *\n * return (\n * <PowerSyncProvider\n * config={{ schema: AppSchema, powerSyncUrl: URL, dbFilename: 'app.db' }}\n * auth={auth}\n * storage={storage}\n * attachments={{ watch: { table: 'Media', idColumn: 'storagePath' } }}\n * onError={(error) => showToast(error.userMessage)}\n * onReady={() => console.log('Ready!')}\n * >\n * <MyApp />\n * </PowerSyncProvider>\n * );\n * }\n * ```\n */\nexport function SlimPowerSyncProvider({\n config,\n auth,\n storage,\n attachments,\n platform: customPlatform,\n onError,\n onReady,\n onSyncStatusChange,\n children\n}: PowerSyncProviderProps): React.ReactElement {\n const {\n schema,\n powerSyncUrl,\n dbFilename = 'powersync.db'\n } = config;\n\n // ─── State ───────────────────────────────────────────────────────────────────\n const [db, setDb] = useState<AbstractPowerSyncDatabase | null>(null);\n const [platform, setPlatform] = useState<PlatformAdapter | null>(customPlatform ?? null);\n const [isReady, setIsReady] = useState(false);\n const [isInitializing, setIsInitializing] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n const [syncStatus, setSyncStatus] = useState<SyncStatus>(DEFAULT_SYNC_STATUS);\n const [attachmentQueue, setAttachmentQueue] = useState<PolAttachmentQueue | null>(null);\n const [attachmentQueueReady, setAttachmentQueueReady] = useState(!attachments);\n\n // ─── Refs ────────────────────────────────────────────────────────────────────\n const connectorRef = useRef<SupabaseConnector | null>(null);\n const initializingRef = useRef(false);\n const dbClosedRef = useRef(false);\n\n // Callback refs to avoid stale closures\n const onErrorRef = useRef(onError);\n const onReadyRef = useRef(onReady);\n const onSyncStatusChangeRef = useRef(onSyncStatusChange);\n useEffect(() => {\n onErrorRef.current = onError;\n }, [onError]);\n useEffect(() => {\n onReadyRef.current = onReady;\n }, [onReady]);\n useEffect(() => {\n onSyncStatusChangeRef.current = onSyncStatusChange;\n }, [onSyncStatusChange]);\n const logger = platform?.logger ?? defaultLogger;\n\n // ─── Create Platform Adapter (lazy) ──────────────────────────────────────────\n useEffect(() => {\n if (customPlatform) {\n setPlatform(customPlatform);\n return;\n }\n\n // Lazy import native platform adapter\n import('../platform/index.native').then(({\n createNativePlatformAdapter\n }) => {\n setPlatform(createNativePlatformAdapter(defaultLogger));\n }).catch(err => {\n logger.error('Failed to load platform adapter:', err);\n setError(new Error('Failed to load platform adapter'));\n setIsInitializing(false);\n });\n }, [customPlatform]);\n\n // ─── Initialize Database ─────────────────────────────────────────────────────\n useEffect(() => {\n if (!platform || initializingRef.current) return;\n initializingRef.current = true;\n const controller = {\n cancelled: false\n };\n const initDatabase = async () => {\n try {\n dbClosedRef.current = false;\n logger.info('Initializing database...');\n const database = await platform.createDatabase({\n dbFilename,\n schema\n });\n if (controller.cancelled) {\n await database.close();\n initializingRef.current = false;\n return;\n }\n logger.info('Database initialized');\n setDb(database);\n setIsReady(true);\n setIsInitializing(false);\n onReadyRef.current?.();\n } catch (err_0) {\n const initError = err_0 instanceof Error ? err_0 : new Error(String(err_0));\n logger.error('Initialization failed:', initError);\n if (!controller.cancelled) {\n setError(initError);\n setIsInitializing(false);\n const syncError = createSyncError(classifySupabaseError(initError), initError.message);\n onErrorRef.current?.(syncError);\n }\n initializingRef.current = false;\n }\n };\n initDatabase();\n return () => {\n controller.cancelled = true;\n initializingRef.current = false;\n };\n }, [platform, dbFilename, schema, logger]);\n\n // ─── Connect to PowerSync ────────────────────────────────────────────────────\n useEffect(() => {\n if (!db || !platform) return;\n const connectPowerSync = async () => {\n try {\n // Check for existing session\n const session = await auth.getSession();\n if (!session) {\n logger.debug('No session, skipping connect');\n return;\n }\n\n // Destroy previous connector if exists\n if (connectorRef.current) {\n connectorRef.current.destroy();\n connectorRef.current = null;\n }\n\n // Create connector using AuthProvider\n const connector = new SupabaseConnector({\n supabaseClient: {\n auth: {\n getSession: async () => {\n const s = await auth.getSession();\n return {\n data: {\n session: s ? {\n access_token: s.accessToken,\n expires_at: s.expiresAt ? s.expiresAt.getTime() / 1000 : undefined,\n user: s.user\n } : null\n },\n error: null\n };\n },\n refreshSession: async () => {\n const s_0 = await auth.refreshSession();\n return {\n data: {\n session: {\n access_token: s_0.accessToken,\n expires_at: s_0.expiresAt ? s_0.expiresAt.getTime() / 1000 : undefined,\n user: s_0.user\n }\n },\n error: null\n };\n },\n onAuthStateChange: cb => {\n const unsub = auth.onAuthStateChange(s_1 => {\n cb('TOKEN_REFRESHED', s_1 ? {\n access_token: s_1.accessToken,\n expires_at: s_1.expiresAt ? s_1.expiresAt.getTime() / 1000 : undefined,\n user: s_1.user\n } : null);\n });\n return {\n data: {\n subscription: {\n unsubscribe: unsub\n }\n }\n };\n }\n }\n } as any,\n powerSyncUrl,\n logger,\n onTransactionFailure: (_entries, err_2, classified) => {\n const syncError_1 = createSyncError(classified, err_2.message);\n onErrorRef.current?.(syncError_1);\n }\n });\n connectorRef.current = connector;\n logger.info('Connecting to PowerSync...');\n await db.connect(connector);\n logger.info('Connected to PowerSync');\n } catch (err_1) {\n const connectError = err_1 instanceof Error ? err_1 : new Error(String(err_1));\n logger.error('Connection failed:', connectError);\n const syncError_0 = createSyncError(classifySupabaseError(connectError), connectError.message);\n onErrorRef.current?.(syncError_0);\n }\n };\n connectPowerSync();\n\n // Subscribe to auth changes for reconnection\n const unsubscribe = auth.onAuthStateChange(async session_0 => {\n if (session_0 && db && !dbClosedRef.current) {\n logger.debug('Session changed, reconnecting...');\n await connectPowerSync();\n } else if (!session_0 && db) {\n logger.debug('Session cleared, disconnecting...');\n await db.disconnect();\n }\n });\n return () => {\n unsubscribe();\n };\n }, [db, auth, powerSyncUrl, platform, logger]);\n\n // ─── Sync Status Listener ────────────────────────────────────────────────────\n useEffect(() => {\n if (!db) return;\n const unsubscribe_0 = db.registerListener({\n statusChanged: (status: any) => {\n const newStatus: SyncStatus = {\n connected: status?.connected ?? false,\n connecting: status?.connecting ?? false,\n hasSynced: status?.hasSynced ?? false,\n lastSyncedAt: status?.lastSyncedAt ?? null,\n uploading: status?.dataFlowStatus?.uploading ?? false,\n downloading: status?.dataFlowStatus?.downloading ?? false,\n downloadProgress: status?.downloadProgress ? {\n current: status.downloadProgress.downloadedOperations ?? 0,\n target: status.downloadProgress.totalOperations ?? 0,\n percentage: status.downloadProgress.downloadedFraction ? status.downloadProgress.downloadedFraction * 100 : 0\n } : null,\n failedTransactions: [],\n hasUploadErrors: false,\n permanentErrorCount: 0\n };\n setSyncStatus(newStatus);\n onSyncStatusChangeRef.current?.(newStatus);\n }\n });\n return unsubscribe_0;\n }, [db]);\n\n // ─── Initialize Attachment Queue ─────────────────────────────────────────────\n useEffect(() => {\n if (!db || !platform || !attachments || !storage) {\n setAttachmentQueueReady(!attachments);\n return;\n }\n const initQueue = async () => {\n try {\n logger.info('Initializing attachment queue...');\n const queue = await createPolAttachmentQueue(db as any, platform, {\n bucket: attachments.bucket,\n watchIds: attachments.watchIds,\n skipDownload: attachments.skipDownload,\n remoteStorage: {\n downloadFile: async path => {\n const result = await storage.download(path);\n if (result.type === 'file') {\n return result.uri;\n }\n return result.data;\n },\n resolveBucket: storage.resolveBucket\n },\n onUploadComplete: attachments.onUploadComplete ? async record => {\n attachments.onUploadComplete?.(record);\n } : undefined,\n onUploadFailed: attachments.onUploadFailed ? (record_0, err_4) => {\n attachments.onUploadFailed?.(record_0, err_4);\n } : undefined,\n cache: attachments.maxCacheBytes ? {\n maxSize: attachments.maxCacheBytes\n } : undefined\n });\n setAttachmentQueue(queue);\n setAttachmentQueueReady(true);\n logger.info('Attachment queue initialized');\n } catch (err_3) {\n logger.error('Failed to initialize attachment queue:', err_3);\n setAttachmentQueueReady(true); // Mark as ready (failed) so consumers can check\n }\n };\n initQueue();\n }, [db, platform, attachments, storage, logger]);\n\n // ─── Cleanup ─────────────────────────────────────────────────────────────────\n useEffect(() => {\n return () => {\n dbClosedRef.current = true;\n if (connectorRef.current) {\n connectorRef.current.destroy();\n connectorRef.current = null;\n }\n if (db) {\n db.disconnect().catch(() => {});\n db.close().catch(() => {});\n }\n };\n }, [db]);\n\n // ─── Context Values ──────────────────────────────────────────────────────────\n const powerSyncValue = useMemo(() => ({\n db,\n isReady,\n isInitializing,\n error,\n platform: platform!\n }), [db, isReady, isInitializing, error, platform]);\n const syncStatusValue = useMemo<SyncStatusContextValue>(() => ({\n status: syncStatus,\n lastSyncedAt: syncStatus.lastSyncedAt\n }), [syncStatus]);\n const attachmentQueueValue = useMemo(() => ({\n queue: attachmentQueue,\n isReady: attachmentQueueReady\n }), [attachmentQueue, attachmentQueueReady]);\n\n // ─── Render ──────────────────────────────────────────────────────────────────\n return <PowerSyncContext.Provider value={powerSyncValue}>\n <SyncStatusContext.Provider value={syncStatusValue}>\n <AttachmentQueueContext.Provider value={attachmentQueueValue}>\n {children}\n </AttachmentQueueContext.Provider>\n </SyncStatusContext.Provider>\n </PowerSyncContext.Provider>;\n}\n\n// Re-export as default for convenience\nexport { SlimPowerSyncProvider as PowerSyncProvider };","/**\n * React Contexts for the slim PowerSyncProvider\n *\n * This module creates the React contexts used by the slim provider.\n * These contexts are separate from the legacy provider contexts to\n * allow gradual migration.\n */\n\nimport { createContext } from 'react';\nimport type { PowerSyncContextValue, SyncStatusContextValue, AttachmentQueueContextValue } from './types';\n\n// ─── PowerSync Context ───────────────────────────────────────────────────────\n\n/**\n * Main context for PowerSync database instance and initialization state.\n *\n * Provides access to:\n * - PowerSync database instance\n * - Initialization state (isReady, isInitializing, error)\n * - Platform adapter\n *\n * @example\n * ```typescript\n * import { useContext } from 'react';\n * import { PowerSyncContext } from '@pol-studios/powersync/react';\n *\n * function MyComponent() {\n * const { db, isReady, error } = useContext(PowerSyncContext);\n * if (!isReady) return <Loading />;\n * if (error) return <Error message={error.message} />;\n * // Use db...\n * }\n * ```\n */\nexport const PowerSyncContext = createContext<PowerSyncContextValue | null>(null);\nPowerSyncContext.displayName = 'PowerSyncContext';\n\n// ─── Sync Status Context ─────────────────────────────────────────────────────\n\n/**\n * Context for sync status updates.\n *\n * Provides access to:\n * - Current sync status (connected, syncing, etc.)\n * - Last synced timestamp\n *\n * @example\n * ```typescript\n * import { useContext } from 'react';\n * import { SyncStatusContext } from '@pol-studios/powersync/react';\n *\n * function SyncIndicator() {\n * const { status, lastSyncedAt } = useContext(SyncStatusContext);\n * return (\n * <View>\n * {status.connected ? 'Connected' : 'Offline'}\n * {lastSyncedAt && <Text>Last synced: {lastSyncedAt.toISOString()}</Text>}\n * </View>\n * );\n * }\n * ```\n */\nexport const SyncStatusContext = createContext<SyncStatusContextValue | null>(null);\nSyncStatusContext.displayName = 'SyncStatusContext';\n\n// ─── Attachment Queue Context ────────────────────────────────────────────────\n\n/**\n * Context for the attachment queue (if configured).\n *\n * Provides access to:\n * - AttachmentQueue instance for checking stats, pausing/resuming downloads\n * - Ready state for the attachment queue\n *\n * @example\n * ```typescript\n * import { useContext } from 'react';\n * import { AttachmentQueueContext } from '@pol-studios/powersync/react';\n *\n * function AttachmentStatus() {\n * const { queue, isReady } = useContext(AttachmentQueueContext);\n * if (!isReady || !queue) return null;\n *\n * const stats = await queue.getStats();\n * return <Text>Downloaded: {stats.syncedCount}/{stats.totalExpected}</Text>;\n * }\n * ```\n */\nexport const AttachmentQueueContext = createContext<AttachmentQueueContextValue | null>(null);\nAttachmentQueueContext.displayName = 'AttachmentQueueContext';","/**\n * React Module for @pol-studios/powersync\n *\n * This module exports the new slim PowerSyncProvider and related contexts/types.\n * For backwards compatibility, the legacy OfflineDataProvider is still available\n * from the main package export.\n *\n * @example\n * ```typescript\n * import {\n * PowerSyncProvider,\n * usePowerSyncContext,\n * useSyncStatusContext,\n * useAttachmentQueueContext,\n * } from '@pol-studios/powersync/react';\n * ```\n */\n\n// ─── Provider ────────────────────────────────────────────────────────────────\n\nexport { SlimPowerSyncProvider, PowerSyncProvider } from './provider';\n\n// ─── Contexts ────────────────────────────────────────────────────────────────\n\nexport { PowerSyncContext, SyncStatusContext, AttachmentQueueContext } from './contexts';\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\nexport type { PowerSyncConfig, PowerSyncProviderProps, PowerSyncContextValue, SyncStatusContextValue, AttachmentQueueContextValue } from './types';\n\n// ─── Hooks (convenience wrappers) ────────────────────────────────────────────\n\nimport { useContext } from 'react';\nimport { PowerSyncContext, SyncStatusContext, AttachmentQueueContext } from './contexts';\nimport type { PowerSyncContextValue, SyncStatusContextValue, AttachmentQueueContextValue } from './types';\n\n/**\n * Hook to access the PowerSync context.\n * Throws if used outside of a PowerSyncProvider.\n *\n * @example\n * ```typescript\n * function MyComponent() {\n * const { db, isReady, error } = usePowerSyncContext();\n * if (!isReady) return <Loading />;\n * if (error) return <Error message={error.message} />;\n * // Use db...\n * }\n * ```\n */\nexport function usePowerSyncContext() {\n const context = useContext(PowerSyncContext);\n if (!context) {\n throw new Error(\"usePowerSyncContext must be used within a PowerSyncProvider\");\n }\n return context;\n}\n\n/**\n * Hook to access sync status.\n * Throws if used outside of a PowerSyncProvider.\n *\n * @example\n * ```typescript\n * function SyncIndicator() {\n * const { status, lastSyncedAt } = useSyncStatusContext();\n * return <Text>{status.connected ? 'Online' : 'Offline'}</Text>;\n * }\n * ```\n */\nexport function useSyncStatusContext() {\n const context = useContext(SyncStatusContext);\n if (!context) {\n throw new Error(\"useSyncStatusContext must be used within a PowerSyncProvider\");\n }\n return context;\n}\n\n/**\n * Hook to access the attachment queue.\n * Throws if used outside of a PowerSyncProvider.\n *\n * @example\n * ```typescript\n * function AttachmentStatus() {\n * const { queue, isReady } = useAttachmentQueueContext();\n * if (!isReady || !queue) return null;\n * // Use queue...\n * }\n * ```\n */\nexport function useAttachmentQueueContext() {\n const context = useContext(AttachmentQueueContext);\n if (!context) {\n throw new Error(\"useAttachmentQueueContext must be used within a PowerSyncProvider\");\n }\n return context;\n}"],"mappings":"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","names":[]}