@pol-studios/db 1.0.31 → 1.0.33
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/dist/{DataLayerContext-Dc7nF2IG.d.ts → DataLayerContext-BwMk4VpG.d.ts} +92 -8
- package/dist/{UserMetadataContext-B8gVWGMl.d.ts → UserMetadataContext-pQb3A8_Q.d.ts} +1 -1
- package/dist/{UserMetadataContext-DntmpK41.d.ts → UserMetadataContext-yLZQu24J.d.ts} +1 -1
- package/dist/auth/context.d.ts +2 -2
- package/dist/auth/context.js +5 -8
- package/dist/auth/guards.d.ts +9 -9
- package/dist/auth/guards.js +2 -3
- package/dist/auth/hooks.d.ts +2 -2
- package/dist/auth/hooks.js +6 -9
- package/dist/auth/index.d.ts +2 -2
- package/dist/auth/index.js +7 -10
- package/dist/{chunk-VGEMLNNM.js → chunk-3XCW225W.js} +274 -469
- package/dist/chunk-3XCW225W.js.map +1 -0
- package/dist/{chunk-OQ7U6EQ3.js → chunk-4EJ6LUH7.js} +3800 -3425
- package/dist/chunk-4EJ6LUH7.js.map +1 -0
- package/dist/{chunk-FZF26ZRB.js → chunk-7BGDQT5X.js} +29 -16
- package/dist/{chunk-FZF26ZRB.js.map → chunk-7BGDQT5X.js.map} +1 -1
- package/dist/{chunk-P4UZ7IXC.js → chunk-7D4SUZUM.js} +1 -5
- package/dist/{chunk-3PJTNH2L.js → chunk-AKIRHA4Q.js} +2 -2
- package/dist/{chunk-5EFDS7SR.js → chunk-DMVUEJG2.js} +7 -2
- package/dist/chunk-DMVUEJG2.js.map +1 -0
- package/dist/{chunk-2NVSXZKQ.js → chunk-E64B4PJZ.js} +74 -309
- package/dist/chunk-E64B4PJZ.js.map +1 -0
- package/dist/{chunk-WX4ABYIF.js → chunk-E6JL3RUF.js} +149 -26
- package/dist/chunk-E6JL3RUF.js.map +1 -0
- package/dist/{chunk-U5UNPBKB.js → chunk-FI6JAD5G.js} +3 -3
- package/dist/{chunk-TKWR5AAY.js → chunk-JOULSXOI.js} +2 -2
- package/dist/{chunk-HTJ2FQW5.js → chunk-LF3V3ERS.js} +13 -15
- package/dist/{chunk-HTJ2FQW5.js.map → chunk-LF3V3ERS.js.map} +1 -1
- package/dist/{chunk-ADD5MIMK.js → chunk-OUCPYEKC.js} +15 -15
- package/dist/{chunk-ADD5MIMK.js.map → chunk-OUCPYEKC.js.map} +1 -1
- package/dist/{chunk-5BLKZUKM.js → chunk-PNC6CG5U.js} +5 -7
- package/dist/chunk-PNC6CG5U.js.map +1 -0
- package/dist/{chunk-CNIGRBRE.js → chunk-QJZUIAHA.js} +43 -19
- package/dist/{chunk-CNIGRBRE.js.map → chunk-QJZUIAHA.js.map} +1 -1
- package/dist/{chunk-HAWJTZCK.js → chunk-RT4O5H2E.js} +5 -7
- package/dist/chunk-RT4O5H2E.js.map +1 -0
- package/dist/{chunk-WVF7RUW5.js → chunk-WM25QE7E.js} +3 -3
- package/dist/{chunk-H6365JPC.js → chunk-YUX6RGLZ.js} +3 -3
- package/dist/{chunk-H6365JPC.js.map → chunk-YUX6RGLZ.js.map} +1 -1
- package/dist/{chunk-H3LNH2NT.js → chunk-Z456IHCB.js} +5 -9
- package/dist/{chunk-H3LNH2NT.js.map → chunk-Z456IHCB.js.map} +1 -1
- package/dist/{chunk-JAATANS3.js → chunk-ZCOFRJQD.js} +3 -3
- package/dist/{chunk-JAATANS3.js.map → chunk-ZCOFRJQD.js.map} +1 -1
- package/dist/client/index.d.ts +1 -1
- package/dist/client/index.js +2 -2
- package/dist/core/index.d.ts +54 -31
- package/dist/{executor-Br27YZvl.d.ts → executor-YJw4m7Q7.d.ts} +9 -1
- package/dist/gen/index.js +1 -1
- package/dist/hooks/index.d.ts +3 -22
- package/dist/hooks/index.js +5 -4
- package/dist/{index-CYFdO0iB.d.ts → index-lveh8qb0.d.ts} +1 -1
- package/dist/index.d.ts +38 -10
- package/dist/index.js +60 -42
- package/dist/index.native.d.ts +19 -13
- package/dist/index.native.js +65 -39
- package/dist/index.web.d.ts +18 -45
- package/dist/index.web.js +58 -52
- package/dist/index.web.js.map +1 -1
- package/dist/mutation/index.d.ts +2 -2
- package/dist/mutation/index.js +5 -5
- package/dist/parser/index.js +4 -4
- package/dist/powersync-bridge/index.d.ts +18 -3
- package/dist/powersync-bridge/index.js +2 -2
- package/dist/query/index.d.ts +1 -1
- package/dist/query/index.js +7 -8
- package/dist/realtime/index.js +7 -9
- package/dist/realtime/index.js.map +1 -1
- package/dist/types/index.d.ts +3 -3
- package/dist/types/index.js +6 -7
- package/dist/{useBatchUpsert-9OYjibLh.d.ts → useBatchUpsert-DAkiCNo3.d.ts} +1 -1
- package/dist/{useDbCount-Dk0yCKlT.d.ts → useDbCount-DWfYB2iu.d.ts} +16 -2
- package/dist/{useResolveFeedback-C1KucfdQ.d.ts → useResolveFeedback-CxLccZKK.d.ts} +197 -93
- package/dist/{useSupabase-DvWVuHHE.d.ts → useSupabase-DSZNeXnF.d.ts} +1 -1
- package/dist/with-auth/index.d.ts +2 -2
- package/dist/with-auth/index.js +43 -32
- package/dist/with-auth/index.js.map +1 -1
- package/package.json +18 -8
- package/dist/canvas-C4TBBDUL.node +0 -0
- package/dist/canvas-ZQNCL7JL.js +0 -1541
- package/dist/canvas-ZQNCL7JL.js.map +0 -1
- package/dist/chunk-2NVSXZKQ.js.map +0 -1
- package/dist/chunk-5BLKZUKM.js.map +0 -1
- package/dist/chunk-5EFDS7SR.js.map +0 -1
- package/dist/chunk-HAWJTZCK.js.map +0 -1
- package/dist/chunk-O7SETNGD.js +0 -3391
- package/dist/chunk-O7SETNGD.js.map +0 -1
- package/dist/chunk-OQ7U6EQ3.js.map +0 -1
- package/dist/chunk-VGEMLNNM.js.map +0 -1
- package/dist/chunk-WX4ABYIF.js.map +0 -1
- package/dist/dist-NDNRSNOG.js +0 -521
- package/dist/dist-NDNRSNOG.js.map +0 -1
- package/dist/pdf-PHXP7RHD.js +0 -20336
- package/dist/pdf-PHXP7RHD.js.map +0 -1
- /package/dist/{chunk-P4UZ7IXC.js.map → chunk-7D4SUZUM.js.map} +0 -0
- /package/dist/{chunk-3PJTNH2L.js.map → chunk-AKIRHA4Q.js.map} +0 -0
- /package/dist/{chunk-U5UNPBKB.js.map → chunk-FI6JAD5G.js.map} +0 -0
- /package/dist/{chunk-TKWR5AAY.js.map → chunk-JOULSXOI.js.map} +0 -0
- /package/dist/{chunk-WVF7RUW5.js.map → chunk-WM25QE7E.js.map} +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
__require
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-7D4SUZUM.js";
|
|
4
4
|
|
|
5
5
|
// src/powersync-bridge/index.ts
|
|
6
6
|
var _powerSyncAvailable = null;
|
|
@@ -32,13 +32,31 @@ function isPowerSyncSyncStatus(value) {
|
|
|
32
32
|
const status = value;
|
|
33
33
|
return typeof status.connected === "boolean" && typeof status.connecting === "boolean" && typeof status.hasSynced === "boolean" && typeof status.uploading === "boolean" && typeof status.downloading === "boolean";
|
|
34
34
|
}
|
|
35
|
-
function convertToDataLayerSyncStatus(powerSyncStatus, pendingCount = 0) {
|
|
35
|
+
function convertToDataLayerSyncStatus(powerSyncStatus, pendingCount = 0, error) {
|
|
36
|
+
let syncError = null;
|
|
37
|
+
if (error) {
|
|
38
|
+
if (error instanceof Error) {
|
|
39
|
+
syncError = error;
|
|
40
|
+
} else {
|
|
41
|
+
const err = new Error(error.message);
|
|
42
|
+
err.name = error.type ?? "SyncError";
|
|
43
|
+
Object.defineProperty(err, "isPermanent", {
|
|
44
|
+
value: error.isPermanent ?? false,
|
|
45
|
+
enumerable: false
|
|
46
|
+
});
|
|
47
|
+
Object.defineProperty(err, "timestamp", {
|
|
48
|
+
value: error.timestamp ?? /* @__PURE__ */ new Date(),
|
|
49
|
+
enumerable: false
|
|
50
|
+
});
|
|
51
|
+
syncError = err;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
36
54
|
return {
|
|
37
55
|
isConnected: powerSyncStatus.connected,
|
|
38
56
|
isSyncing: powerSyncStatus.uploading || powerSyncStatus.downloading,
|
|
39
57
|
lastSyncedAt: powerSyncStatus.lastSyncedAt,
|
|
40
58
|
pendingUploads: pendingCount,
|
|
41
|
-
error:
|
|
59
|
+
error: syncError
|
|
42
60
|
};
|
|
43
61
|
}
|
|
44
62
|
function convertToDataLayerSyncControl(powerSyncControl) {
|
|
@@ -54,22 +72,17 @@ function convertToDataLayerSyncControl(powerSyncControl) {
|
|
|
54
72
|
ids: values
|
|
55
73
|
});
|
|
56
74
|
},
|
|
57
|
-
//
|
|
58
|
-
// The bridge just provides placeholders that get overridden
|
|
59
|
-
retryFailedUploads: async () => {
|
|
60
|
-
console.warn("retryFailedUploads: Use useSyncControl hook for this functionality");
|
|
61
|
-
},
|
|
62
|
-
clearFailedUploads: () => {
|
|
63
|
-
console.warn("clearFailedUploads: Use useSyncControl hook for this functionality");
|
|
64
|
-
},
|
|
65
|
-
failedUploads: [],
|
|
75
|
+
// Auto-retry controls - managed by the provider/context
|
|
66
76
|
pauseAutoRetry: () => {
|
|
67
|
-
console.warn("pauseAutoRetry: Use useSyncControl hook for this functionality");
|
|
68
77
|
},
|
|
69
78
|
resumeAutoRetry: () => {
|
|
70
|
-
console.warn("resumeAutoRetry: Use useSyncControl hook for this functionality");
|
|
71
79
|
},
|
|
72
|
-
isAutoRetryPaused: false
|
|
80
|
+
isAutoRetryPaused: false,
|
|
81
|
+
// Pending mutations - managed by the provider/context, not this bridge
|
|
82
|
+
addPendingMutation: () => {
|
|
83
|
+
},
|
|
84
|
+
removePendingMutation: () => {
|
|
85
|
+
}
|
|
73
86
|
};
|
|
74
87
|
}
|
|
75
88
|
function createDatabaseGetter(getPowerSyncDb) {
|
|
@@ -92,4 +105,4 @@ export {
|
|
|
92
105
|
createDatabaseGetter,
|
|
93
106
|
getPowerSyncInstance
|
|
94
107
|
};
|
|
95
|
-
//# sourceMappingURL=chunk-
|
|
108
|
+
//# sourceMappingURL=chunk-7BGDQT5X.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/powersync-bridge/index.ts"],"sourcesContent":["/**\n * PowerSync Bridge for @pol-studios/db\n *\n * This module provides integration utilities between @pol-studios/db and\n * @pol-studios/powersync packages. It re-exports key types and provides\n * helper functions for type-safe integration.\n *\n * The @pol-studios/powersync package is an optional peer dependency.\n * This bridge allows the db package to work seamlessly with or without\n * the powersync package installed.\n *\n * @example\n * ```typescript\n * import { isPowerSyncAvailable, usePowerSyncDatabase } from '@pol-studios/db/powersync-bridge';\n *\n * if (isPowerSyncAvailable()) {\n * // Use PowerSync features\n * }\n * ```\n */\n\n// =============================================================================\n// Type Re-exports from @pol-studios/powersync\n// =============================================================================\n\n/**\n * Re-export core types from @pol-studios/powersync for convenience.\n * These types are defined here to avoid runtime dependency on the package.\n */\n\n/**\n * Abstract interface for PowerSync database operations.\n * This matches the interface from @pol-studios/powersync/core.\n */\nexport interface AbstractPowerSyncDatabase {\n /** Execute a query and return all results */\n getAll<T>(sql: string, params?: unknown[]): Promise<T[]>;\n /** Execute a query and return first result or null */\n get<T>(sql: string, params?: unknown[]): Promise<T | null>;\n /** Execute a SQL statement (INSERT, UPDATE, DELETE) */\n execute(sql: string, params?: unknown[]): Promise<{\n rowsAffected: number;\n }>;\n /** Whether the database is currently connected */\n connected: boolean;\n /** Current sync status */\n currentStatus: {\n connected: boolean;\n connecting: boolean;\n hasSynced: boolean;\n lastSyncedAt: Date | null;\n dataFlowStatus?: {\n uploading: boolean;\n downloading: boolean;\n };\n downloadProgress?: {\n downloadedFraction: number;\n downloadedOperations: number;\n totalOperations: number;\n };\n };\n /** Initialize the database */\n init(): Promise<void>;\n /** Close the database connection */\n close(): Promise<void>;\n /** Connect to the PowerSync service */\n connect(connector: unknown): Promise<void>;\n /** Disconnect from the PowerSync service */\n disconnect(): Promise<void>;\n /** Register a listener for status changes */\n registerListener(listener: {\n statusChanged?: (status: unknown) => void;\n }): () => void;\n /** Get the next pending CRUD transaction */\n getNextCrudTransaction(): Promise<unknown>;\n}\n\n/**\n * Sync status from @pol-studios/powersync.\n */\nexport interface PowerSyncSyncStatus {\n /** Whether connected to the PowerSync service */\n connected: boolean;\n /** Whether currently attempting to connect */\n connecting: boolean;\n /** Whether initial sync has completed */\n hasSynced: boolean;\n /** Timestamp of last successful sync */\n lastSyncedAt: Date | null;\n /** Whether currently uploading local changes */\n uploading: boolean;\n /** Whether currently downloading remote changes */\n downloading: boolean;\n /** Download progress details */\n downloadProgress: {\n current: number;\n target: number;\n percentage: number;\n } | null;\n}\n\n/**\n * Connection health status from @pol-studios/powersync.\n */\nexport interface PowerSyncConnectionHealth {\n /** Current connection status */\n status: \"healthy\" | \"degraded\" | \"disconnected\";\n /** Last measured query latency in milliseconds */\n latency: number | null;\n /** Timestamp of the last health check */\n lastHealthCheck: Date | null;\n /** Number of consecutive health check failures */\n consecutiveFailures: number;\n /** Total reconnection attempts since last successful connection */\n reconnectAttempts: number;\n}\n\n/**\n * Sync metrics from @pol-studios/powersync.\n */\nexport interface PowerSyncMetrics {\n /** Total number of sync operations attempted */\n totalSyncs: number;\n /** Number of successful sync operations */\n successfulSyncs: number;\n /** Number of failed sync operations */\n failedSyncs: number;\n /** Duration of the last sync in milliseconds */\n lastSyncDuration: number | null;\n /** Average sync duration in milliseconds */\n averageSyncDuration: number | null;\n /** Total bytes downloaded across all syncs */\n totalDataDownloaded: number;\n /** Total bytes uploaded across all syncs */\n totalDataUploaded: number;\n /** Last sync error details */\n lastError: {\n type: string;\n message: string;\n timestamp: Date;\n } | null;\n}\n\n/**\n * Sync control actions from @pol-studios/powersync.\n */\nexport interface PowerSyncControlActions {\n /** Trigger a sync operation */\n triggerSync: () => Promise<void>;\n /** Pause sync operations */\n pause: () => Promise<void>;\n /** Resume sync operations */\n resume: () => Promise<void>;\n /** Disconnect from the PowerSync service */\n disconnect: () => Promise<void>;\n /** Set the sync scope for selective sync */\n setScope: (scope: {\n type: string;\n ids: string[];\n } | null) => void;\n}\n\n// =============================================================================\n// Availability Check\n// =============================================================================\n\n/**\n * Flag to track whether @pol-studios/powersync is available.\n * This is set lazily on first check.\n */\nlet _powerSyncAvailable: boolean | null = null;\n\n/**\n * Check if @pol-studios/powersync is available.\n *\n * This function performs a lazy check to see if the powersync package\n * is installed and can be imported. The result is cached for subsequent calls.\n *\n * @returns true if @pol-studios/powersync is available, false otherwise\n *\n * @example\n * ```typescript\n * import { isPowerSyncAvailable } from '@pol-studios/db/powersync-bridge';\n *\n * if (isPowerSyncAvailable()) {\n * // Safe to use PowerSync features\n * const { usePowerSync } = await import('@pol-studios/powersync');\n * }\n * ```\n */\nexport function isPowerSyncAvailable(): boolean {\n if (_powerSyncAvailable === null) {\n try {\n // Try to require the package to check availability\n // This will throw if the package is not installed\n require.resolve(\"@pol-studios/powersync\");\n _powerSyncAvailable = true;\n } catch {\n _powerSyncAvailable = false;\n }\n }\n return _powerSyncAvailable;\n}\n\n/**\n * Reset the availability check cache.\n * Useful for testing or when package installation state might change.\n */\nexport function resetPowerSyncAvailabilityCache(): void {\n _powerSyncAvailable = null;\n}\n\n// =============================================================================\n// Type Guards\n// =============================================================================\n\n/**\n * Type guard to check if a value is an AbstractPowerSyncDatabase.\n *\n * @param value - The value to check\n * @returns true if value implements AbstractPowerSyncDatabase interface\n */\nexport function isAbstractPowerSyncDatabase(value: unknown): value is AbstractPowerSyncDatabase {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n const db = value as Record<string, unknown>;\n return typeof db.getAll === \"function\" && typeof db.get === \"function\" && typeof db.execute === \"function\" && typeof db.init === \"function\" && typeof db.close === \"function\" && typeof db.connect === \"function\" && typeof db.disconnect === \"function\" && typeof db.registerListener === \"function\" && \"connected\" in db && \"currentStatus\" in db;\n}\n\n/**\n * Type guard to check if a value is a PowerSyncSyncStatus.\n *\n * @param value - The value to check\n * @returns true if value matches PowerSyncSyncStatus interface\n */\nexport function isPowerSyncSyncStatus(value: unknown): value is PowerSyncSyncStatus {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n const status = value as Record<string, unknown>;\n return typeof status.connected === \"boolean\" && typeof status.connecting === \"boolean\" && typeof status.hasSynced === \"boolean\" && typeof status.uploading === \"boolean\" && typeof status.downloading === \"boolean\";\n}\n\n// =============================================================================\n// Conversion Utilities\n// =============================================================================\n\n/**\n * Convert PowerSync sync status to the V3 DataLayer SyncStatus format.\n *\n * This utility helps bridge the sync status from @pol-studios/powersync\n * to the format expected by @pol-studios/db's DataLayerProvider.\n *\n * @param powerSyncStatus - The sync status from @pol-studios/powersync\n * @param pendingCount - Number of pending uploads (from pendingMutations)\n * @returns SyncStatus in @pol-studios/db format\n */\nexport function convertToDataLayerSyncStatus(powerSyncStatus: PowerSyncSyncStatus, pendingCount: number = 0): import(\"../core/types\").SyncStatus {\n return {\n isConnected: powerSyncStatus.connected,\n isSyncing: powerSyncStatus.uploading || powerSyncStatus.downloading,\n lastSyncedAt: powerSyncStatus.lastSyncedAt,\n pendingUploads: pendingCount,\n error: null\n };\n}\n\n/**\n * Convert PowerSync sync control to the V3 DataLayer SyncControl format.\n *\n * @param powerSyncControl - The sync control actions from @pol-studios/powersync\n * @returns SyncControl in @pol-studios/db format\n */\nexport function convertToDataLayerSyncControl(powerSyncControl: PowerSyncControlActions): import(\"../core/types\").SyncControl {\n return {\n triggerSync: powerSyncControl.triggerSync,\n startLiveSync: powerSyncControl.resume,\n stopLiveSync: () => {\n powerSyncControl.pause();\n },\n setScope: async (scopeName: string, values: string[]) => {\n powerSyncControl.setScope({\n type: scopeName,\n ids: values\n });\n },\n // Failed upload controls - these are managed by useSyncControl hook directly\n // The bridge just provides placeholders that get overridden\n retryFailedUploads: async () => {\n console.warn(\"retryFailedUploads: Use useSyncControl hook for this functionality\");\n },\n clearFailedUploads: () => {\n console.warn(\"clearFailedUploads: Use useSyncControl hook for this functionality\");\n },\n failedUploads: [],\n pauseAutoRetry: () => {\n console.warn(\"pauseAutoRetry: Use useSyncControl hook for this functionality\");\n },\n resumeAutoRetry: () => {\n console.warn(\"resumeAutoRetry: Use useSyncControl hook for this functionality\");\n },\n isAutoRetryPaused: false\n };\n}\n\n// =============================================================================\n// Integration Helpers\n// =============================================================================\n\n/**\n * Create a database instance getter that works with PowerSync context.\n *\n * This is useful for integrating PowerSyncProvider with DataLayerProvider\n * by providing a way to get the database instance from the PowerSync context.\n *\n * @param getPowerSyncDb - Function to get the PowerSync database from context\n * @returns A function that returns the database or null\n */\nexport function createDatabaseGetter(getPowerSyncDb: () => AbstractPowerSyncDatabase | null): () => AbstractPowerSyncDatabase | null {\n return getPowerSyncDb;\n}\n\n/**\n * Options for setting up DataLayerProvider with PowerSync integration.\n */\nexport interface PowerSyncIntegrationOptions {\n /**\n * The PowerSync database instance from PowerSyncProvider.\n */\n database: AbstractPowerSyncDatabase | null;\n\n /**\n * Whether the PowerSync database is ready.\n */\n isReady: boolean;\n\n /**\n * Current sync status from PowerSyncProvider.\n */\n syncStatus?: PowerSyncSyncStatus;\n\n /**\n * Sync control actions from PowerSyncProvider.\n */\n syncControl?: PowerSyncControlActions;\n\n /**\n * Number of pending mutations.\n */\n pendingCount?: number;\n}\n\n/**\n * Get the powerSyncInstance prop for DataLayerProvider from PowerSync context values.\n *\n * This helper extracts the necessary values from @pol-studios/powersync hooks\n * and returns them in a format suitable for DataLayerProvider.\n *\n * @param options - The PowerSync integration options\n * @returns The powerSyncInstance to pass to DataLayerProvider, or null if not ready\n *\n * @example\n * ```typescript\n * // Inside a component wrapped with PowerSyncProvider\n * const { db, isReady } = usePowerSync();\n * const { status, pendingCount } = useSyncStatus();\n * const syncControl = useSyncControl();\n *\n * const powerSyncInstance = getPowerSyncInstance({\n * database: db,\n * isReady,\n * syncStatus: status,\n * syncControl,\n * pendingCount,\n * });\n *\n * return (\n * <DataLayerProvider\n * config={config}\n * powerSyncInstance={powerSyncInstance}\n * supabaseClient={supabase}\n * queryClient={queryClient}\n * >\n * {children}\n * </DataLayerProvider>\n * );\n * ```\n */\nexport function getPowerSyncInstance(options: PowerSyncIntegrationOptions): AbstractPowerSyncDatabase | null {\n if (!options.isReady || !options.database) {\n return null;\n }\n return options.database;\n}\n\n// =============================================================================\n// Re-export for Convenience\n// =============================================================================\n\n/**\n * Re-export the PowerSyncDatabase type from the query executor for convenience.\n * This is the minimal interface used internally by @pol-studios/db.\n */\nexport type { PowerSyncDatabase } from \"../query/executor\";"],"mappings":";;;;;AA0KA,IAAI,sBAAsC;AAoBnC,SAAS,uBAAgC;AAC9C,MAAI,wBAAwB,MAAM;AAChC,QAAI;AAGF,gBAAQ,QAAQ,wBAAwB;AACxC,4BAAsB;AAAA,IACxB,QAAQ;AACN,4BAAsB;AAAA,IACxB;AAAA,EACF;AACA,SAAO;AACT;AAMO,SAAS,kCAAwC;AACtD,wBAAsB;AACxB;AAYO,SAAS,4BAA4B,OAAoD;AAC9F,MAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C,WAAO;AAAA,EACT;AACA,QAAM,KAAK;AACX,SAAO,OAAO,GAAG,WAAW,cAAc,OAAO,GAAG,QAAQ,cAAc,OAAO,GAAG,YAAY,cAAc,OAAO,GAAG,SAAS,cAAc,OAAO,GAAG,UAAU,cAAc,OAAO,GAAG,YAAY,cAAc,OAAO,GAAG,eAAe,cAAc,OAAO,GAAG,qBAAqB,cAAc,eAAe,MAAM,mBAAmB;AACnV;AAQO,SAAS,sBAAsB,OAA8C;AAClF,MAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C,WAAO;AAAA,EACT;AACA,QAAM,SAAS;AACf,SAAO,OAAO,OAAO,cAAc,aAAa,OAAO,OAAO,eAAe,aAAa,OAAO,OAAO,cAAc,aAAa,OAAO,OAAO,cAAc,aAAa,OAAO,OAAO,gBAAgB;AAC5M;AAgBO,SAAS,6BAA6B,iBAAsC,eAAuB,GAAuC;AAC/I,SAAO;AAAA,IACL,aAAa,gBAAgB;AAAA,IAC7B,WAAW,gBAAgB,aAAa,gBAAgB;AAAA,IACxD,cAAc,gBAAgB;AAAA,IAC9B,gBAAgB;AAAA,IAChB,OAAO;AAAA,EACT;AACF;AAQO,SAAS,8BAA8B,kBAAgF;AAC5H,SAAO;AAAA,IACL,aAAa,iBAAiB;AAAA,IAC9B,eAAe,iBAAiB;AAAA,IAChC,cAAc,MAAM;AAClB,uBAAiB,MAAM;AAAA,IACzB;AAAA,IACA,UAAU,OAAO,WAAmB,WAAqB;AACvD,uBAAiB,SAAS;AAAA,QACxB,MAAM;AAAA,QACN,KAAK;AAAA,MACP,CAAC;AAAA,IACH;AAAA;AAAA;AAAA,IAGA,oBAAoB,YAAY;AAC9B,cAAQ,KAAK,oEAAoE;AAAA,IACnF;AAAA,IACA,oBAAoB,MAAM;AACxB,cAAQ,KAAK,oEAAoE;AAAA,IACnF;AAAA,IACA,eAAe,CAAC;AAAA,IAChB,gBAAgB,MAAM;AACpB,cAAQ,KAAK,gEAAgE;AAAA,IAC/E;AAAA,IACA,iBAAiB,MAAM;AACrB,cAAQ,KAAK,iEAAiE;AAAA,IAChF;AAAA,IACA,mBAAmB;AAAA,EACrB;AACF;AAeO,SAAS,qBAAqB,gBAAgG;AACnI,SAAO;AACT;AAoEO,SAAS,qBAAqB,SAAwE;AAC3G,MAAI,CAAC,QAAQ,WAAW,CAAC,QAAQ,UAAU;AACzC,WAAO;AAAA,EACT;AACA,SAAO,QAAQ;AACjB;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/powersync-bridge/index.ts"],"sourcesContent":["/**\n * PowerSync Bridge for @pol-studios/db\n *\n * This module provides integration utilities between @pol-studios/db and\n * @pol-studios/powersync packages. It re-exports key types and provides\n * helper functions for type-safe integration.\n *\n * The @pol-studios/powersync package is an optional peer dependency.\n * This bridge allows the db package to work seamlessly with or without\n * the powersync package installed.\n *\n * @example\n * ```typescript\n * import { isPowerSyncAvailable, usePowerSyncDatabase } from '@pol-studios/db/powersync-bridge';\n *\n * if (isPowerSyncAvailable()) {\n * // Use PowerSync features\n * }\n * ```\n */\n\n// =============================================================================\n// Type Re-exports from @pol-studios/powersync\n// =============================================================================\n\n/**\n * Re-export core types from @pol-studios/powersync for convenience.\n * These types are defined here to avoid runtime dependency on the package.\n */\n\n/**\n * Abstract interface for PowerSync database operations.\n * This matches the interface from @pol-studios/powersync/core.\n */\nexport interface AbstractPowerSyncDatabase {\n /** Execute a query and return all results */\n getAll<T>(sql: string, params?: unknown[]): Promise<T[]>;\n /** Execute a query and return first result or null */\n get<T>(sql: string, params?: unknown[]): Promise<T | null>;\n /** Execute a SQL statement (INSERT, UPDATE, DELETE) */\n execute(sql: string, params?: unknown[]): Promise<{\n rowsAffected: number;\n }>;\n /** Whether the database is currently connected */\n connected: boolean;\n /** Current sync status */\n currentStatus: {\n connected: boolean;\n connecting: boolean;\n hasSynced: boolean;\n lastSyncedAt: Date | null;\n dataFlowStatus?: {\n uploading: boolean;\n downloading: boolean;\n };\n downloadProgress?: {\n downloadedFraction: number;\n downloadedOperations: number;\n totalOperations: number;\n };\n };\n /** Initialize the database */\n init(): Promise<void>;\n /** Close the database connection */\n close(): Promise<void>;\n /** Connect to the PowerSync service */\n connect(connector: unknown): Promise<void>;\n /** Disconnect from the PowerSync service */\n disconnect(): Promise<void>;\n /** Register a listener for status changes */\n registerListener(listener: {\n statusChanged?: (status: unknown) => void;\n }): () => void;\n /** Get the next pending CRUD transaction */\n getNextCrudTransaction(): Promise<unknown>;\n}\n\n/**\n * Sync status from @pol-studios/powersync.\n */\nexport interface PowerSyncSyncStatus {\n /** Whether connected to the PowerSync service */\n connected: boolean;\n /** Whether currently attempting to connect */\n connecting: boolean;\n /** Whether initial sync has completed */\n hasSynced: boolean;\n /** Timestamp of last successful sync */\n lastSyncedAt: Date | null;\n /** Whether currently uploading local changes */\n uploading: boolean;\n /** Whether currently downloading remote changes */\n downloading: boolean;\n /** Download progress details */\n downloadProgress: {\n current: number;\n target: number;\n percentage: number;\n } | null;\n}\n\n/**\n * Connection health status from @pol-studios/powersync.\n */\nexport interface PowerSyncConnectionHealth {\n /** Current connection status */\n status: \"healthy\" | \"degraded\" | \"disconnected\";\n /** Last measured query latency in milliseconds */\n latency: number | null;\n /** Timestamp of the last health check */\n lastHealthCheck: Date | null;\n /** Number of consecutive health check failures */\n consecutiveFailures: number;\n /** Total reconnection attempts since last successful connection */\n reconnectAttempts: number;\n}\n\n/**\n * Sync metrics from @pol-studios/powersync.\n */\nexport interface PowerSyncMetrics {\n /** Total number of sync operations attempted */\n totalSyncs: number;\n /** Number of successful sync operations */\n successfulSyncs: number;\n /** Number of failed sync operations */\n failedSyncs: number;\n /** Duration of the last sync in milliseconds */\n lastSyncDuration: number | null;\n /** Average sync duration in milliseconds */\n averageSyncDuration: number | null;\n /** Total bytes downloaded across all syncs */\n totalDataDownloaded: number;\n /** Total bytes uploaded across all syncs */\n totalDataUploaded: number;\n /** Last sync error details */\n lastError: {\n type: string;\n message: string;\n timestamp: Date;\n } | null;\n}\n\n/**\n * Sync control actions from @pol-studios/powersync.\n */\nexport interface PowerSyncControlActions {\n /** Trigger a sync operation */\n triggerSync: () => Promise<void>;\n /** Pause sync operations */\n pause: () => Promise<void>;\n /** Resume sync operations */\n resume: () => Promise<void>;\n /** Disconnect from the PowerSync service */\n disconnect: () => Promise<void>;\n /** Set the sync scope for selective sync */\n setScope: (scope: {\n type: string;\n ids: string[];\n } | null) => void;\n}\n\n// =============================================================================\n// Availability Check\n// =============================================================================\n\n/**\n * Flag to track whether @pol-studios/powersync is available.\n * This is set lazily on first check.\n */\nlet _powerSyncAvailable: boolean | null = null;\n\n/**\n * Check if @pol-studios/powersync is available.\n *\n * This function performs a lazy check to see if the powersync package\n * is installed and can be imported. The result is cached for subsequent calls.\n *\n * @returns true if @pol-studios/powersync is available, false otherwise\n *\n * @example\n * ```typescript\n * import { isPowerSyncAvailable } from '@pol-studios/db/powersync-bridge';\n *\n * if (isPowerSyncAvailable()) {\n * // Safe to use PowerSync features\n * const { usePowerSync } = await import('@pol-studios/powersync');\n * }\n * ```\n */\nexport function isPowerSyncAvailable(): boolean {\n if (_powerSyncAvailable === null) {\n try {\n // Try to require the package to check availability\n // This will throw if the package is not installed\n require.resolve(\"@pol-studios/powersync\");\n _powerSyncAvailable = true;\n } catch {\n _powerSyncAvailable = false;\n }\n }\n return _powerSyncAvailable;\n}\n\n/**\n * Reset the availability check cache.\n * Useful for testing or when package installation state might change.\n */\nexport function resetPowerSyncAvailabilityCache(): void {\n _powerSyncAvailable = null;\n}\n\n// =============================================================================\n// Type Guards\n// =============================================================================\n\n/**\n * Type guard to check if a value is an AbstractPowerSyncDatabase.\n *\n * @param value - The value to check\n * @returns true if value implements AbstractPowerSyncDatabase interface\n */\nexport function isAbstractPowerSyncDatabase(value: unknown): value is AbstractPowerSyncDatabase {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n const db = value as Record<string, unknown>;\n return typeof db.getAll === \"function\" && typeof db.get === \"function\" && typeof db.execute === \"function\" && typeof db.init === \"function\" && typeof db.close === \"function\" && typeof db.connect === \"function\" && typeof db.disconnect === \"function\" && typeof db.registerListener === \"function\" && \"connected\" in db && \"currentStatus\" in db;\n}\n\n/**\n * Type guard to check if a value is a PowerSyncSyncStatus.\n *\n * @param value - The value to check\n * @returns true if value matches PowerSyncSyncStatus interface\n */\nexport function isPowerSyncSyncStatus(value: unknown): value is PowerSyncSyncStatus {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n const status = value as Record<string, unknown>;\n return typeof status.connected === \"boolean\" && typeof status.connecting === \"boolean\" && typeof status.hasSynced === \"boolean\" && typeof status.uploading === \"boolean\" && typeof status.downloading === \"boolean\";\n}\n\n// =============================================================================\n// Conversion Utilities\n// =============================================================================\n\n/**\n * Error information that can be passed from PowerSync layer.\n * This allows propagating sync errors through the bridge.\n */\nexport interface PowerSyncErrorInfo {\n /** Error message */\n message: string;\n /** Error type/category (e.g., 'network', 'auth', 'conflict') */\n type?: string;\n /** Whether this is a permanent error */\n isPermanent?: boolean;\n /** Timestamp when error occurred */\n timestamp?: Date;\n}\n\n/**\n * Convert PowerSync sync status to the V3 DataLayer SyncStatus format.\n *\n * This utility helps bridge the sync status from @pol-studios/powersync\n * to the format expected by @pol-studios/db's DataLayerProvider.\n *\n * @param powerSyncStatus - The sync status from @pol-studios/powersync\n * @param pendingCount - Number of pending uploads (from pendingMutations)\n * @param error - Optional error information from PowerSync layer\n * @returns SyncStatus in @pol-studios/db format\n */\nexport function convertToDataLayerSyncStatus(powerSyncStatus: PowerSyncSyncStatus, pendingCount: number = 0, error?: PowerSyncErrorInfo | Error | null): import(\"../core/types\").SyncStatus {\n // Convert error to Error instance if provided\n let syncError: Error | null = null;\n if (error) {\n if (error instanceof Error) {\n syncError = error;\n } else {\n // Create an Error with the message and attach additional properties\n const err = new Error(error.message);\n err.name = error.type ?? 'SyncError';\n // Attach metadata as non-enumerable properties for debugging\n Object.defineProperty(err, 'isPermanent', {\n value: error.isPermanent ?? false,\n enumerable: false\n });\n Object.defineProperty(err, 'timestamp', {\n value: error.timestamp ?? new Date(),\n enumerable: false\n });\n syncError = err;\n }\n }\n return {\n isConnected: powerSyncStatus.connected,\n isSyncing: powerSyncStatus.uploading || powerSyncStatus.downloading,\n lastSyncedAt: powerSyncStatus.lastSyncedAt,\n pendingUploads: pendingCount,\n error: syncError\n };\n}\n\n/**\n * Convert PowerSync sync control to the V3 DataLayer SyncControl format.\n *\n * @param powerSyncControl - The sync control actions from @pol-studios/powersync\n * @returns SyncControl in @pol-studios/db format\n */\nexport function convertToDataLayerSyncControl(powerSyncControl: PowerSyncControlActions): import(\"../core/types\").SyncControl {\n return {\n triggerSync: powerSyncControl.triggerSync,\n startLiveSync: powerSyncControl.resume,\n stopLiveSync: () => {\n powerSyncControl.pause();\n },\n setScope: async (scopeName: string, values: string[]) => {\n powerSyncControl.setScope({\n type: scopeName,\n ids: values\n });\n },\n // Auto-retry controls - managed by the provider/context\n pauseAutoRetry: () => {\n // No-op - actual implementation provided by PowerSyncProvider via DataLayerProvider props\n },\n resumeAutoRetry: () => {\n // No-op - actual implementation provided by PowerSyncProvider via DataLayerProvider props\n },\n isAutoRetryPaused: false,\n // Pending mutations - managed by the provider/context, not this bridge\n addPendingMutation: () => {\n // No-op - actual implementation provided by PowerSyncProvider via DataLayerProvider props\n },\n removePendingMutation: () => {\n // No-op - actual implementation provided by PowerSyncProvider via DataLayerProvider props\n }\n };\n}\n\n// =============================================================================\n// Integration Helpers\n// =============================================================================\n\n/**\n * Create a database instance getter that works with PowerSync context.\n *\n * This is useful for integrating PowerSyncProvider with DataLayerProvider\n * by providing a way to get the database instance from the PowerSync context.\n *\n * @param getPowerSyncDb - Function to get the PowerSync database from context\n * @returns A function that returns the database or null\n */\nexport function createDatabaseGetter(getPowerSyncDb: () => AbstractPowerSyncDatabase | null): () => AbstractPowerSyncDatabase | null {\n return getPowerSyncDb;\n}\n\n/**\n * Options for setting up DataLayerProvider with PowerSync integration.\n */\nexport interface PowerSyncIntegrationOptions {\n /**\n * The PowerSync database instance from PowerSyncProvider.\n */\n database: AbstractPowerSyncDatabase | null;\n\n /**\n * Whether the PowerSync database is ready.\n */\n isReady: boolean;\n\n /**\n * Current sync status from PowerSyncProvider.\n */\n syncStatus?: PowerSyncSyncStatus;\n\n /**\n * Sync control actions from PowerSyncProvider.\n */\n syncControl?: PowerSyncControlActions;\n\n /**\n * Number of pending mutations.\n */\n pendingCount?: number;\n}\n\n/**\n * Get the powerSyncInstance prop for DataLayerProvider from PowerSync context values.\n *\n * This helper extracts the necessary values from @pol-studios/powersync hooks\n * and returns them in a format suitable for DataLayerProvider.\n *\n * @param options - The PowerSync integration options\n * @returns The powerSyncInstance to pass to DataLayerProvider, or null if not ready\n *\n * @example\n * ```typescript\n * // Inside a component wrapped with PowerSyncProvider\n * const { db, isReady } = usePowerSync();\n * const { status, pendingCount } = useSyncStatus();\n * const syncControl = useSyncControl();\n *\n * const powerSyncInstance = getPowerSyncInstance({\n * database: db,\n * isReady,\n * syncStatus: status,\n * syncControl,\n * pendingCount,\n * });\n *\n * return (\n * <DataLayerProvider\n * config={config}\n * powerSyncInstance={powerSyncInstance}\n * supabaseClient={supabase}\n * queryClient={queryClient}\n * >\n * {children}\n * </DataLayerProvider>\n * );\n * ```\n */\nexport function getPowerSyncInstance(options: PowerSyncIntegrationOptions): AbstractPowerSyncDatabase | null {\n if (!options.isReady || !options.database) {\n return null;\n }\n return options.database;\n}\n\n// =============================================================================\n// Re-export for Convenience\n// =============================================================================\n\n/**\n * Re-export the PowerSyncDatabase type from the query executor for convenience.\n * This is the minimal interface used internally by @pol-studios/db.\n */\nexport type { PowerSyncDatabase } from \"../query/executor\";"],"mappings":";;;;;AA0KA,IAAI,sBAAsC;AAoBnC,SAAS,uBAAgC;AAC9C,MAAI,wBAAwB,MAAM;AAChC,QAAI;AAGF,gBAAQ,QAAQ,wBAAwB;AACxC,4BAAsB;AAAA,IACxB,QAAQ;AACN,4BAAsB;AAAA,IACxB;AAAA,EACF;AACA,SAAO;AACT;AAMO,SAAS,kCAAwC;AACtD,wBAAsB;AACxB;AAYO,SAAS,4BAA4B,OAAoD;AAC9F,MAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C,WAAO;AAAA,EACT;AACA,QAAM,KAAK;AACX,SAAO,OAAO,GAAG,WAAW,cAAc,OAAO,GAAG,QAAQ,cAAc,OAAO,GAAG,YAAY,cAAc,OAAO,GAAG,SAAS,cAAc,OAAO,GAAG,UAAU,cAAc,OAAO,GAAG,YAAY,cAAc,OAAO,GAAG,eAAe,cAAc,OAAO,GAAG,qBAAqB,cAAc,eAAe,MAAM,mBAAmB;AACnV;AAQO,SAAS,sBAAsB,OAA8C;AAClF,MAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C,WAAO;AAAA,EACT;AACA,QAAM,SAAS;AACf,SAAO,OAAO,OAAO,cAAc,aAAa,OAAO,OAAO,eAAe,aAAa,OAAO,OAAO,cAAc,aAAa,OAAO,OAAO,cAAc,aAAa,OAAO,OAAO,gBAAgB;AAC5M;AAgCO,SAAS,6BAA6B,iBAAsC,eAAuB,GAAG,OAA+E;AAE1L,MAAI,YAA0B;AAC9B,MAAI,OAAO;AACT,QAAI,iBAAiB,OAAO;AAC1B,kBAAY;AAAA,IACd,OAAO;AAEL,YAAM,MAAM,IAAI,MAAM,MAAM,OAAO;AACnC,UAAI,OAAO,MAAM,QAAQ;AAEzB,aAAO,eAAe,KAAK,eAAe;AAAA,QACxC,OAAO,MAAM,eAAe;AAAA,QAC5B,YAAY;AAAA,MACd,CAAC;AACD,aAAO,eAAe,KAAK,aAAa;AAAA,QACtC,OAAO,MAAM,aAAa,oBAAI,KAAK;AAAA,QACnC,YAAY;AAAA,MACd,CAAC;AACD,kBAAY;AAAA,IACd;AAAA,EACF;AACA,SAAO;AAAA,IACL,aAAa,gBAAgB;AAAA,IAC7B,WAAW,gBAAgB,aAAa,gBAAgB;AAAA,IACxD,cAAc,gBAAgB;AAAA,IAC9B,gBAAgB;AAAA,IAChB,OAAO;AAAA,EACT;AACF;AAQO,SAAS,8BAA8B,kBAAgF;AAC5H,SAAO;AAAA,IACL,aAAa,iBAAiB;AAAA,IAC9B,eAAe,iBAAiB;AAAA,IAChC,cAAc,MAAM;AAClB,uBAAiB,MAAM;AAAA,IACzB;AAAA,IACA,UAAU,OAAO,WAAmB,WAAqB;AACvD,uBAAiB,SAAS;AAAA,QACxB,MAAM;AAAA,QACN,KAAK;AAAA,MACP,CAAC;AAAA,IACH;AAAA;AAAA,IAEA,gBAAgB,MAAM;AAAA,IAEtB;AAAA,IACA,iBAAiB,MAAM;AAAA,IAEvB;AAAA,IACA,mBAAmB;AAAA;AAAA,IAEnB,oBAAoB,MAAM;AAAA,IAE1B;AAAA,IACA,uBAAuB,MAAM;AAAA,IAE7B;AAAA,EACF;AACF;AAeO,SAAS,qBAAqB,gBAAgG;AACnI,SAAO;AACT;AAoEO,SAAS,qBAAqB,SAAwE;AAC3G,MAAI,CAAC,QAAQ,WAAW,CAAC,QAAQ,UAAU;AACzC,WAAO;AAAA,EACT;AACA,SAAO,QAAQ;AACjB;","names":[]}
|
|
@@ -10,9 +10,6 @@ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require
|
|
|
10
10
|
if (typeof require !== "undefined") return require.apply(this, arguments);
|
|
11
11
|
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
12
12
|
});
|
|
13
|
-
var __esm = (fn, res) => function __init() {
|
|
14
|
-
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
|
|
15
|
-
};
|
|
16
13
|
var __commonJS = (cb, mod) => function __require2() {
|
|
17
14
|
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
18
15
|
};
|
|
@@ -35,8 +32,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
35
32
|
|
|
36
33
|
export {
|
|
37
34
|
__require,
|
|
38
|
-
__esm,
|
|
39
35
|
__commonJS,
|
|
40
36
|
__toESM
|
|
41
37
|
};
|
|
42
|
-
//# sourceMappingURL=chunk-
|
|
38
|
+
//# sourceMappingURL=chunk-7D4SUZUM.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
__commonJS,
|
|
3
3
|
__toESM
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-7D4SUZUM.js";
|
|
5
5
|
|
|
6
6
|
// ../../../node_modules/.pnpm/xregexp@5.1.1/node_modules/xregexp/tools/output/categories.js
|
|
7
7
|
var require_categories = __commonJS({
|
|
@@ -2775,4 +2775,4 @@ xregexp/src/addons/unicode-scripts.js:
|
|
|
2775
2775
|
* Unicode data by Mathias Bynens <mathiasbynens.be>
|
|
2776
2776
|
*)
|
|
2777
2777
|
*/
|
|
2778
|
-
//# sourceMappingURL=chunk-
|
|
2778
|
+
//# sourceMappingURL=chunk-AKIRHA4Q.js.map
|
|
@@ -105,7 +105,12 @@ function SupabaseProvider(t0) {
|
|
|
105
105
|
let t2;
|
|
106
106
|
if ($[3] !== afterInitialize || $[4] !== supabaseClient) {
|
|
107
107
|
t2 = () => {
|
|
108
|
-
afterInitialize && afterInitialize(supabaseClient);
|
|
108
|
+
const cleanup = afterInitialize && afterInitialize(supabaseClient);
|
|
109
|
+
return () => {
|
|
110
|
+
if (typeof cleanup === "function") {
|
|
111
|
+
cleanup();
|
|
112
|
+
}
|
|
113
|
+
};
|
|
109
114
|
};
|
|
110
115
|
$[3] = afterInitialize;
|
|
111
116
|
$[4] = supabaseClient;
|
|
@@ -202,4 +207,4 @@ export {
|
|
|
202
207
|
useSupabase,
|
|
203
208
|
SupabaseProvider
|
|
204
209
|
};
|
|
205
|
-
//# sourceMappingURL=chunk-
|
|
210
|
+
//# sourceMappingURL=chunk-DMVUEJG2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/client/config.ts","../src/client/useSupabase.tsx","../src/utils/uuid.ts"],"sourcesContent":["let supabaseUrl = process.env.SUPABASE_URL;\nlet supabaseKey = process.env.SUPABASE_ANON_KEY ?? \"\";\nexport function setSupabaseUrl(url: string) {\n supabaseUrl = url;\n}\nexport function getSupabaseUrl() {\n return supabaseUrl;\n}\nexport function setSupabaseKey(key: string) {\n supabaseKey = key;\n}\nexport function getSupabaseKey() {\n return supabaseKey;\n}","import { c as _c } from \"react/compiler-runtime\";\nimport { createContext, ReactNode, useContext, useEffect, useMemo, useState } from \"react\";\nimport { createClient, SupabaseClient, SupabaseClientOptions } from \"@supabase/supabase-js\";\nimport { getSupabaseUrl, getSupabaseKey } from \"./config\";\nimport { generateUUID } from \"../utils/uuid\";\n\n// This interface is augmented by consumers to provide their database types\n// Example: declare module '@pol-studios/db' { interface SupabaseDatabaseTypes { Database: MyDatabaseType } }\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface SupabaseDatabaseTypes {}\nexport type Database = SupabaseDatabaseTypes extends {\n Database: infer D;\n} ? D : any;\nexport type TypedSupabaseClient = SupabaseClient<Database>;\nfunction newUuid(): string {\n return generateUUID();\n}\nfunction isUsable<T>(value: T | null | undefined): value is T {\n return value !== null && value !== undefined;\n}\nfunction delay(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\n// Client instance ID - for self-change detection and cache keys (static per app instance)\n// NOT the database session ID - just identifies this browser tab/app instance\nexport const ClientInstanceId = newUuid();\n\n// DEPRECATED: Alias for backward compatibility - use ClientInstanceId instead\nexport const UserSessionId = ClientInstanceId;\nlet defaultOptions: any = {\n auth: {\n autoRefreshToken: true,\n persistSession: true,\n detectSessionInUrl: true\n },\n global: {},\n realtime: {}\n};\nexport function createNewSupabaseClient<SchemaName extends string & keyof Database = (\"public\" extends keyof Database ? \"public\" : string & keyof Database)>(options?: SupabaseClientOptions<SchemaName>) {\n const client = createClient<Database, SchemaName>(getSupabaseUrl()!, getSupabaseKey()!, {\n ...defaultOptions,\n ...options\n });\n onSupabaseInitializedAction && onSupabaseInitializedAction(client as any);\n return client;\n}\nlet onSupabaseInitializedAction: ((supabase: SupabaseClient) => any) | undefined = undefined;\nexport function onSupabaseInitialized(afterInitialize: (supabase: SupabaseClient) => any) {\n onSupabaseInitializedAction = afterInitialize;\n}\nexport function setDefaultOptions(options: SupabaseClientOptions<string & keyof Database>) {\n defaultOptions = options;\n}\nexport let typedSupabase: SupabaseClient<Database> = null as SupabaseClient<Database>;\nconst context = createContext({\n supabaseClient: typedSupabase as SupabaseClient<Database> | null\n});\nexport default function useSupabase() {\n const supabaseContext = useContext(context);\n if (isUsable(supabaseContext?.supabaseClient) === false) {\n throw new Error(\"Hook not inside a supabase context provider.\");\n }\n return supabaseContext.supabaseClient;\n}\nexport function SupabaseProvider(t0) {\n const $ = _c(16);\n const {\n children,\n options,\n afterInitialize,\n supabaseClient: supabaseClientProp\n } = t0;\n let t1;\n if ($[0] !== options || $[1] !== supabaseClientProp) {\n t1 = () => supabaseClientProp ?? createNewSupabaseClient({\n ...defaultOptions,\n ...(options ? options : {})\n }) as unknown as SupabaseClient<Database>;\n $[0] = options;\n $[1] = supabaseClientProp;\n $[2] = t1;\n } else {\n t1 = $[2];\n }\n const [supabaseClient] = useState(t1);\n const [wasHidden, setWasHidden] = useState(false);\n const [, setConnected] = useState(true);\n let t2;\n if ($[3] !== afterInitialize || $[4] !== supabaseClient) {\n t2 = () => {\n const cleanup = afterInitialize && afterInitialize(supabaseClient);\n return () => {\n if (typeof cleanup === \"function\") {\n cleanup();\n }\n };\n };\n $[3] = afterInitialize;\n $[4] = supabaseClient;\n $[5] = t2;\n } else {\n t2 = $[5];\n }\n let t3;\n if ($[6] !== supabaseClient) {\n t3 = [supabaseClient];\n $[6] = supabaseClient;\n $[7] = t3;\n } else {\n t3 = $[7];\n }\n useEffect(t2, t3);\n let t4;\n let t5;\n if ($[8] !== wasHidden) {\n t4 = () => {\n const checkVisibility = async () => {\n if (typeof window.document === \"undefined\") {\n return;\n }\n if (document?.hidden) {\n await delay(60000).then(x => {\n if (document.hidden) {\n setWasHidden(true);\n }\n });\n } else {\n if (wasHidden) {\n setWasHidden(false);\n ;\n try {\n setConnected(true);\n } catch (t6) {\n const error = t6;\n console.error(\"Reconnection failed:\", error);\n setConnected(false);\n }\n }\n }\n };\n const intervalId = setInterval(checkVisibility, 1000);\n return () => {\n clearInterval(intervalId);\n };\n };\n t5 = [wasHidden];\n $[8] = wasHidden;\n $[9] = t4;\n $[10] = t5;\n } else {\n t4 = $[9];\n t5 = $[10];\n }\n useEffect(t4, t5);\n let t6;\n if ($[11] !== supabaseClient) {\n t6 = {\n supabaseClient\n };\n $[11] = supabaseClient;\n $[12] = t6;\n } else {\n t6 = $[12];\n }\n const t7 = t6;\n let t8;\n if ($[13] !== children || $[14] !== t7) {\n t8 = <context.Provider value={t7}>{children}</context.Provider>;\n $[13] = children;\n $[14] = t7;\n $[15] = t8;\n } else {\n t8 = $[15];\n }\n return t8;\n}","/**\n * Generate a UUID that works across all environments\n * (Browser, React Native, Node.js)\n */\nexport function generateUUID(): string {\n // Try Web Crypto API first (browsers, modern Node.js)\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n }\n\n // Fallback for React Native and older environments\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {\n const r = Math.random() * 16 | 0;\n const v = c === 'x' ? r : r & 0x3 | 0x8;\n return v.toString(16);\n });\n}"],"mappings":"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","names":["t6"]}
|