supastash 0.1.62 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (151) hide show
  1. package/README.md +17 -5
  2. package/dist/core/config/index.d.ts.map +1 -1
  3. package/dist/core/config/index.js +5 -1
  4. package/dist/db/adapters/expo_sqlite.d.ts.map +1 -1
  5. package/dist/db/adapters/expo_sqlite.js +11 -0
  6. package/dist/db/adapters/rn_nitro.d.ts.map +1 -1
  7. package/dist/db/adapters/rn_nitro.js +20 -0
  8. package/dist/db/adapters/rn_sqlite_storage.d.ts.map +1 -1
  9. package/dist/db/adapters/rn_sqlite_storage.js +27 -0
  10. package/dist/hooks/supastashData/fetchCalls.d.ts.map +1 -1
  11. package/dist/hooks/supastashData/index.d.ts.map +1 -1
  12. package/dist/hooks/supastashData/index.js +12 -4
  13. package/dist/hooks/supastashData/realtimeSubscription.js +4 -4
  14. package/dist/hooks/supastashData/registerSub.d.ts +3 -3
  15. package/dist/hooks/supastashData/registerSub.d.ts.map +1 -1
  16. package/dist/hooks/supastashData/registerSub.js +3 -3
  17. package/dist/hooks/supastashFilters/index.d.ts +2 -2
  18. package/dist/hooks/supastashFilters/index.d.ts.map +1 -1
  19. package/dist/hooks/supastashFilters/index.js +6 -4
  20. package/dist/hooks/supastashLiteQuery/index.d.ts.map +1 -1
  21. package/dist/hooks/supastashLiteQuery/index.js +12 -2
  22. package/dist/hooks/syncEngine/pushLocal/index.js +1 -1
  23. package/dist/index.d.ts +3 -1
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +1 -0
  26. package/dist/store/tableFilters.d.ts +3 -3
  27. package/dist/store/tableFilters.d.ts.map +1 -1
  28. package/dist/store/tx.d.ts +3 -0
  29. package/dist/store/tx.d.ts.map +1 -0
  30. package/dist/store/tx.js +1 -0
  31. package/dist/types/expoSqlite.types.d.ts +3 -13
  32. package/dist/types/index.d.ts +1 -1
  33. package/dist/types/index.d.ts.map +1 -1
  34. package/dist/types/liteQuery.types.d.ts +2 -2
  35. package/dist/types/query.types.d.ts +24 -1
  36. package/dist/types/realtimeData.types.d.ts +8 -4
  37. package/dist/types/supastashConfig.types.d.ts +83 -6
  38. package/dist/types/syncEngine.types.d.ts +49 -7
  39. package/dist/utils/errorHandler.d.ts +6 -0
  40. package/dist/utils/errorHandler.d.ts.map +1 -0
  41. package/dist/utils/errorHandler.js +8 -0
  42. package/dist/utils/fetchData/buildFilter.d.ts +8 -4
  43. package/dist/utils/fetchData/buildFilter.d.ts.map +1 -1
  44. package/dist/utils/fetchData/createTable.d.ts.map +1 -1
  45. package/dist/utils/fetchData/createTable.js +3 -46
  46. package/dist/utils/fetchData/deleteData.d.ts.map +1 -1
  47. package/dist/utils/fetchData/deleteData.js +6 -3
  48. package/dist/utils/fetchData/fetchLocalData.d.ts +2 -2
  49. package/dist/utils/fetchData/fetchLocalData.d.ts.map +1 -1
  50. package/dist/utils/fetchData/initialFetch.d.ts +2 -2
  51. package/dist/utils/fetchData/initialFetch.d.ts.map +1 -1
  52. package/dist/utils/fetchData/liteHelpers.d.ts +2 -2
  53. package/dist/utils/fetchData/liteHelpers.d.ts.map +1 -1
  54. package/dist/utils/fetchData/liteHelpers.js +14 -119
  55. package/dist/utils/fetchData/realTimeCall.js +2 -2
  56. package/dist/utils/fetchData/receiveData.js +1 -1
  57. package/dist/utils/query/builder/crud.d.ts +5 -5
  58. package/dist/utils/query/builder/crud.d.ts.map +1 -1
  59. package/dist/utils/query/builder/filters.d.ts +36 -12
  60. package/dist/utils/query/builder/filters.d.ts.map +1 -1
  61. package/dist/utils/query/builder/filters.js +32 -0
  62. package/dist/utils/query/builder/index.d.ts +29 -1
  63. package/dist/utils/query/builder/index.d.ts.map +1 -1
  64. package/dist/utils/query/builder/index.js +77 -1
  65. package/dist/utils/query/builder/mainQuery.d.ts.map +1 -1
  66. package/dist/utils/query/builder/mainQuery.js +17 -2
  67. package/dist/utils/query/helpers/localDb/getLocalMethod.d.ts +2 -2
  68. package/dist/utils/query/helpers/localDb/getLocalMethod.d.ts.map +1 -1
  69. package/dist/utils/query/helpers/localDb/getLocalMethod.js +7 -6
  70. package/dist/utils/query/helpers/localDb/insertMany.d.ts +3 -0
  71. package/dist/utils/query/helpers/localDb/insertMany.d.ts.map +1 -1
  72. package/dist/utils/query/helpers/localDb/insertMany.js +10 -3
  73. package/dist/utils/query/helpers/localDb/localQueryBuilder.d.ts +6 -6
  74. package/dist/utils/query/helpers/localDb/localQueryBuilder.d.ts.map +1 -1
  75. package/dist/utils/query/helpers/localDb/localQueryBuilder.js +17 -10
  76. package/dist/utils/query/helpers/localDb/upsertMany.d.ts +3 -0
  77. package/dist/utils/query/helpers/localDb/upsertMany.d.ts.map +1 -1
  78. package/dist/utils/query/helpers/localDb/upsertMany.js +9 -2
  79. package/dist/utils/query/helpers/mainQueryHelpers.d.ts.map +1 -1
  80. package/dist/utils/query/helpers/mainQueryHelpers.js +38 -8
  81. package/dist/utils/query/helpers/queueRemote.d.ts.map +1 -1
  82. package/dist/utils/query/helpers/queueRemote.js +33 -24
  83. package/dist/utils/query/localDbQuery/delete.d.ts +9 -3
  84. package/dist/utils/query/localDbQuery/delete.d.ts.map +1 -1
  85. package/dist/utils/query/localDbQuery/delete.js +16 -5
  86. package/dist/utils/query/localDbQuery/index.d.ts.map +1 -1
  87. package/dist/utils/query/localDbQuery/index.js +3 -3
  88. package/dist/utils/query/localDbQuery/insert.d.ts +2 -2
  89. package/dist/utils/query/localDbQuery/insert.d.ts.map +1 -1
  90. package/dist/utils/query/localDbQuery/insert.js +8 -5
  91. package/dist/utils/query/localDbQuery/select.d.ts +2 -2
  92. package/dist/utils/query/localDbQuery/select.d.ts.map +1 -1
  93. package/dist/utils/query/localDbQuery/select.js +5 -2
  94. package/dist/utils/query/localDbQuery/update.d.ts +2 -2
  95. package/dist/utils/query/localDbQuery/update.d.ts.map +1 -1
  96. package/dist/utils/query/localDbQuery/update.js +5 -2
  97. package/dist/utils/query/localDbQuery/upsert.d.ts +2 -2
  98. package/dist/utils/query/localDbQuery/upsert.d.ts.map +1 -1
  99. package/dist/utils/query/localDbQuery/upsert.js +8 -3
  100. package/dist/utils/query/remoteQuery/supabaseQuery.d.ts.map +1 -1
  101. package/dist/utils/query/remoteQuery/supabaseQuery.js +4 -1
  102. package/dist/utils/reusedHelpers.d.ts +8 -0
  103. package/dist/utils/reusedHelpers.d.ts.map +1 -0
  104. package/dist/utils/reusedHelpers.js +162 -0
  105. package/dist/utils/schema/createSyncStatus.d.ts +3 -1
  106. package/dist/utils/schema/createSyncStatus.d.ts.map +1 -1
  107. package/dist/utils/schema/createSyncStatus.js +30 -3
  108. package/dist/utils/sync/pullFromRemote/fetchOlder.d.ts +44 -0
  109. package/dist/utils/sync/pullFromRemote/fetchOlder.d.ts.map +1 -0
  110. package/dist/utils/sync/pullFromRemote/fetchOlder.js +55 -0
  111. package/dist/utils/sync/pullFromRemote/fetchOlderHelpers.d.ts +33 -0
  112. package/dist/utils/sync/pullFromRemote/fetchOlderHelpers.d.ts.map +1 -0
  113. package/dist/utils/sync/pullFromRemote/fetchOlderHelpers.js +110 -0
  114. package/dist/utils/sync/pullFromRemote/helpers.d.ts +10 -7
  115. package/dist/utils/sync/pullFromRemote/helpers.d.ts.map +1 -1
  116. package/dist/utils/sync/pullFromRemote/helpers.js +20 -14
  117. package/dist/utils/sync/pullFromRemote/pullData.d.ts +2 -3
  118. package/dist/utils/sync/pullFromRemote/pullData.d.ts.map +1 -1
  119. package/dist/utils/sync/pullFromRemote/pullData.js +4 -9
  120. package/dist/utils/sync/pullFromRemote/pullDeletedData.d.ts +8 -5
  121. package/dist/utils/sync/pullFromRemote/updateFilter.d.ts +1 -1
  122. package/dist/utils/sync/pullFromRemote/updateFilter.d.ts.map +1 -1
  123. package/dist/utils/sync/pullFromRemote/updateFilter.js +5 -3
  124. package/dist/utils/sync/pullFromRemote/updateLocalDb.d.ts +4 -3
  125. package/dist/utils/sync/pullFromRemote/updateLocalDb.d.ts.map +1 -1
  126. package/dist/utils/sync/pullFromRemote/updateLocalDb.js +51 -46
  127. package/dist/utils/sync/pullFromRemote/validateFilters.d.ts +2 -4
  128. package/dist/utils/sync/pullFromRemote/validateFilters.d.ts.map +1 -1
  129. package/dist/utils/sync/pullFromRemote/validateFilters.js +9 -63
  130. package/dist/utils/sync/pushLocal/deleteChunks.d.ts.map +1 -1
  131. package/dist/utils/sync/pushLocal/deleteChunks.js +7 -5
  132. package/dist/utils/sync/pushLocal/getAllUnsyncedData.d.ts.map +1 -1
  133. package/dist/utils/sync/pushLocal/getAllUnsyncedData.js +12 -44
  134. package/dist/utils/sync/pushLocal/uploadHelpers.js +1 -1
  135. package/dist/utils/sync/status/filterKey.d.ts +3 -3
  136. package/dist/utils/sync/status/filterKey.d.ts.map +1 -1
  137. package/dist/utils/sync/status/filterKey.js +5 -2
  138. package/dist/utils/sync/status/remoteSchema.d.ts +4 -0
  139. package/dist/utils/sync/status/remoteSchema.d.ts.map +1 -0
  140. package/dist/utils/sync/status/remoteSchema.js +140 -0
  141. package/dist/utils/sync/status/repo.d.ts +5 -5
  142. package/dist/utils/sync/status/repo.d.ts.map +1 -1
  143. package/dist/utils/sync/status/repo.js +29 -23
  144. package/dist/utils/sync/status/services.d.ts +5 -6
  145. package/dist/utils/sync/status/services.d.ts.map +1 -1
  146. package/dist/utils/sync/status/services.js +1 -6
  147. package/dist/utils/sync/status/syncStatus.d.ts +5 -7
  148. package/dist/utils/sync/status/syncStatus.d.ts.map +1 -1
  149. package/dist/utils/sync/status/syncStatus.js +11 -3
  150. package/package.json +2 -2
  151. package/dist/types/supastashFilters.types.d.ts +0 -3
package/README.md CHANGED
@@ -15,6 +15,15 @@
15
15
 
16
16
  ---
17
17
 
18
+ > 🔴 **NEW — Replication Mode**
19
+ >
20
+ > Improves sync ordering and prevents missed updates in distributed offline systems.
21
+ > ⚠️ Must read if your app supports multiple devices or long offline sessions.
22
+ >
23
+ > 👉 Learn more: https://0xzekea.github.io/supastash/docs/replication-mode
24
+
25
+ ---
26
+
18
27
  ## ✨ Features
19
28
 
20
29
  - 🔁 **Two-way sync** (Supabase ↔ SQLite)
@@ -91,8 +100,8 @@ configureSupastash({
91
100
  id: "TEXT PRIMARY KEY",
92
101
  name: "TEXT",
93
102
  email: "TEXT",
94
- created_at: "TIMESTAMP",
95
- updated_at: "TIMESTAMP",
103
+ created_at: "TEXT NOT NULL",
104
+ updated_at: "TEXT NOT NULL",
96
105
  });
97
106
  },
98
107
 
@@ -173,9 +182,12 @@ useSupastashFilters({
173
182
  - Your Supabase tables must have:
174
183
 
175
184
  - A primary key `id` (string or UUID)
176
- - `timestamptz` columns for `created_at`, `updated_at`, and `deleted_at`
177
185
 
178
- - Run this SQL in Supabase to allow schema reflection:
186
+ - `timestamptz` columns for `created_at`, `updated_at`, and `deleted_at`
187
+ - If using `replicationMode: "server-side"`(Recommended), you must also add:
188
+ - `arrived_at timestamptz NOT NULL DEFAULT now()`
189
+ - A server trigger to enforce `arrived_at` updates
190
+ - Run this SQL in Supabase to allow schema reflection:
179
191
 
180
192
  ```sql
181
193
  create or replace function get_table_schema(table_name text)
@@ -206,7 +218,7 @@ const { data: orders } = useSupatashData("orders", {
206
218
 
207
219
  ## 🔄 How Sync Works
208
220
 
209
- - Tracks rows using `updated_at`, `deleted_at`, and `created_at`
221
+ - Tracks rows using a replication cursor (`updated_at` by default, or `arrived_at` in server-side mode)
210
222
  - Batches changes in background and retries failed ones
211
223
  - Local cache backed by Supabase
212
224
  - Runs pull/push jobs efficiently using staged task pipelines
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/config/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,eAAe,EACf,0BAA0B,EAC3B,MAAM,mCAAmC,CAAC;AA6B3C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AAEH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,0BAA0B,EACrE,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG;IAAE,gBAAgB,EAAE,CAAC,CAAA;CAAE,QAuCrD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAChC,CAAC,SAAS,0BAA0B,KACjC,eAAe,CAAC,CAAC,CAAC,CAEtB;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,qBAAqB,CACnC,CAAC,SAAS,0BAA0B,EACpC,MAAM,EAAE;IACR,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG;QAC9B,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;KAC3B,CAAC;CACH,QAEA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/config/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,eAAe,EACf,0BAA0B,EAC3B,MAAM,mCAAmC,CAAC;AAiC3C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AAEH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,0BAA0B,EACrE,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG;IAAE,gBAAgB,EAAE,CAAC,CAAA;CAAE,QAuCrD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAChC,CAAC,SAAS,0BAA0B,KACjC,eAAe,CAAC,CAAC,CAAC,CAEtB;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,qBAAqB,CACnC,CAAC,SAAS,0BAA0B,EACpC,MAAM,EAAE;IACR,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG;QAC9B,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;KAC3B,CAAC;CACH,QAEA"}
@@ -14,8 +14,12 @@ let _config = {
14
14
  pull: true,
15
15
  useFiltersFromStore: true,
16
16
  },
17
+ replicationMode: "client-side",
18
+ maxSyncLookbackDays: 365,
19
+ perTableSyncLookbackDays: undefined,
20
+ fullSyncTables: [],
17
21
  listeners: 250,
18
- supabaseBatchSize: 100,
22
+ supabaseBatchSize: 800,
19
23
  debugMode: true,
20
24
  syncPolicy: DEFAULT_POLICY,
21
25
  fieldEnforcement: DEFAULT_FIELDS,
@@ -1 +1 @@
1
- {"version":3,"file":"expo_sqlite.d.ts","sourceRoot":"","sources":["../../../src/db/adapters/expo_sqlite.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,sBAAsB,EAEvB,MAAM,mCAAmC,CAAC;AAE3C,eAAO,MAAM,iBAAiB,EAAE,sBAkC/B,CAAC"}
1
+ {"version":3,"file":"expo_sqlite.d.ts","sourceRoot":"","sources":["../../../src/db/adapters/expo_sqlite.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,sBAAsB,EAGvB,MAAM,mCAAmC,CAAC;AAE3C,eAAO,MAAM,iBAAiB,EAAE,sBAoD/B,CAAC"}
@@ -19,6 +19,17 @@ export const SQLiteAdapterExpo = {
19
19
  closeAsync: async () => {
20
20
  await db.closeAsync?.();
21
21
  },
22
+ withTransaction: async (fn) => {
23
+ return await db.withTransactionAsync(async () => {
24
+ const txExecutor = {
25
+ runAsync: async (sql, params) => await db.runAsync(sql, params ?? []),
26
+ execAsync: async (statement) => await db.execAsync(statement),
27
+ getAllAsync: async (sql, params) => await db.getAllAsync(sql, params ?? []),
28
+ getFirstAsync: async (sql, params) => await db.getFirstAsync(sql, params ?? []),
29
+ };
30
+ return await fn(txExecutor);
31
+ });
32
+ },
22
33
  };
23
34
  },
24
35
  };
@@ -1 +1 @@
1
- {"version":3,"file":"rn_nitro.d.ts","sourceRoot":"","sources":["../../../src/db/adapters/rn_nitro.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,sBAAsB,EAEvB,MAAM,mCAAmC,CAAC;AAG3C,eAAO,MAAM,kBAAkB,EAAE,sBA6ChC,CAAC"}
1
+ {"version":3,"file":"rn_nitro.d.ts","sourceRoot":"","sources":["../../../src/db/adapters/rn_nitro.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,sBAAsB,EAGvB,MAAM,mCAAmC,CAAC;AAG3C,eAAO,MAAM,kBAAkB,EAAE,sBA2EhC,CAAC"}
@@ -29,6 +29,26 @@ export const SQLiteAdapterNitro = {
29
29
  closeAsync: async () => {
30
30
  await db.close?.();
31
31
  },
32
+ withTransaction: async (fn) => {
33
+ await db.transaction(async (tx) => {
34
+ const txExecutor = {
35
+ runAsync: async (sql, params) => await tx.executeAsync(sql, params ?? []),
36
+ execAsync: async (statement) => {
37
+ await tx.executeAsync(statement);
38
+ },
39
+ getAllAsync: async (sql, params) => {
40
+ const result = await tx.executeAsync(sql, params ?? []);
41
+ const mainResult = result.rows?._array ?? [];
42
+ return mainResult;
43
+ },
44
+ getFirstAsync: async (sql, params) => {
45
+ const result = await tx.executeAsync(sql, params ?? []);
46
+ return result.rows?._array?.[0] ?? null;
47
+ },
48
+ };
49
+ return await fn(txExecutor);
50
+ });
51
+ },
32
52
  };
33
53
  },
34
54
  };
@@ -1 +1 @@
1
- {"version":3,"file":"rn_sqlite_storage.d.ts","sourceRoot":"","sources":["../../../src/db/adapters/rn_sqlite_storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,sBAAsB,EAEvB,MAAM,mCAAmC,CAAC;AAE3C,eAAO,MAAM,oBAAoB,EAAE,sBAmClC,CAAC"}
1
+ {"version":3,"file":"rn_sqlite_storage.d.ts","sourceRoot":"","sources":["../../../src/db/adapters/rn_sqlite_storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,sBAAsB,EAGvB,MAAM,mCAAmC,CAAC;AAE3C,eAAO,MAAM,oBAAoB,EAAE,sBA+ElC,CAAC"}
@@ -20,6 +20,33 @@ export const SQLiteAdapterStorage = {
20
20
  closeAsync: async () => {
21
21
  await db.close?.();
22
22
  },
23
+ withTransaction: async (fn) => {
24
+ await db.transaction(async (tx) => {
25
+ const txExecutor = {
26
+ runAsync: async (sql, params) => {
27
+ await tx.executeSql(sql, params ?? []);
28
+ },
29
+ execAsync: async (statement) => {
30
+ await tx.executeSql(statement);
31
+ },
32
+ getAllAsync: async (sql, params) => {
33
+ const [, resultSet] = await tx.executeSql(sql, params ?? []);
34
+ const rows = [];
35
+ for (let i = 0; i < resultSet.rows.length; i++) {
36
+ rows.push(resultSet.rows.item(i));
37
+ }
38
+ return rows;
39
+ },
40
+ getFirstAsync: async (sql, params) => {
41
+ const [, resultSet] = await tx.executeSql(sql, params ?? []);
42
+ if (resultSet.rows.length === 0)
43
+ return null;
44
+ return resultSet.rows.item(0);
45
+ },
46
+ };
47
+ return await fn(txExecutor);
48
+ });
49
+ },
23
50
  };
24
51
  },
25
52
  };
@@ -1 +1 @@
1
- {"version":3,"file":"fetchCalls.d.ts","sourceRoot":"","sources":["../../../src/hooks/supastashData/fetchCalls.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,eAAe,EAChB,MAAM,gCAAgC,CAAC;AAKxC,wBAAgB,UAAU,CAAC,CAAC,GAAG,GAAG,EAChC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC,EAC3B,WAAW,EAAE,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC;;;;;;EA4GtC"}
1
+ {"version":3,"file":"fetchCalls.d.ts","sourceRoot":"","sources":["../../../src/hooks/supastashData/fetchCalls.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,eAAe,EAEhB,MAAM,gCAAgC,CAAC;AAKxC,wBAAgB,UAAU,CAAC,CAAC,GAAG,GAAG,EAChC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC,EAC3B,WAAW,EAAE,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC;;;;;;EA4GtC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hooks/supastashData/index.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,eAAe,EACf,mBAAmB,EACpB,MAAM,gCAAgC,CAAC;AAWxC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+DG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,GAAG,GAAG,EACtC,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,eAAoB,GAC5B,mBAAmB,CAAC,CAAC,CAAC,CA4FxB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hooks/supastashData/index.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,eAAe,EACf,mBAAmB,EAEpB,MAAM,gCAAgC,CAAC;AAWxC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+DG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,GAAG,GAAG,EACtC,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,eAAoB,GAC5B,mBAAmB,CAAC,CAAC,CAAC,CAqGxB"}
@@ -2,8 +2,8 @@ import { useEffect, useMemo, useRef } from "react";
2
2
  import { AppState } from "react-native";
3
3
  import { localCache } from "../../store/localCache";
4
4
  import { supastashEventBus } from "../../utils/events/eventBus";
5
- import { buildFilterString } from "../../utils/fetchData/buildFilter";
6
5
  import useRealtimeData from "../../utils/fetchData/realTimeCall";
6
+ import { ReusedHelpers } from "../../utils/reusedHelpers";
7
7
  import { isTrulyNullish } from "../../utils/serializer";
8
8
  import useDataState from "./dataState";
9
9
  import useEventQueues from "./eventQueues";
@@ -80,11 +80,19 @@ export function useSupastashData(table, options = {}) {
80
80
  const { dataMap, data, groupedBy, } = useDataState(table);
81
81
  const queueHandler = useEventQueues(table, options, flushIntervalMs);
82
82
  const { triggerRefresh, trigger, cancel, initialFetchAndSync, isFetching } = fetchCalls(table, options, hasTriggeredRef);
83
- const subKey = useMemo(() => `${table}:${buildFilterString(filter)}`, [table, filter]);
83
+ const subKey = useMemo(() => `${table}:${ReusedHelpers.buildFilterString(filter)}`, [table, filter]);
84
84
  const isAnyNullish = useMemo(() => {
85
- if (!options.sqlFilter)
85
+ if (!options.sqlFilter?.length)
86
86
  return false;
87
- return options.sqlFilter.some((filter) => isTrulyNullish(filter.value) && filter.operator !== "is");
87
+ const check = (filter) => {
88
+ if (!filter || typeof filter !== "object")
89
+ return false;
90
+ if ("or" in filter) {
91
+ return filter.or?.some(check) ?? false;
92
+ }
93
+ return isTrulyNullish(filter.value) && filter.operator !== "is";
94
+ };
95
+ return options.sqlFilter.some(check);
88
96
  }, [options.sqlFilter]);
89
97
  useEffect(() => {
90
98
  if (!shouldFetch || (lazy && !hasTriggeredRef.current))
@@ -2,9 +2,9 @@
2
2
  import NetInfo from "@react-native-community/netinfo";
3
3
  import { useCallback, useEffect, useRef } from "react";
4
4
  import { getSupastashConfig } from "../../core/config";
5
- import { buildFilterString } from "../../utils/fetchData/buildFilter";
6
5
  import { RealtimeManager } from "../../utils/fetchData/realTimeManager";
7
6
  import { logError } from "../../utils/logs";
7
+ import { ReusedHelpers } from "../../utils/reusedHelpers";
8
8
  import { supabaseClientErr } from "../../utils/supabaseClientErr";
9
9
  const generateHookId = () => `hook_${Date.now()}_${Math.random().toString(36)}`;
10
10
  function useRealtimeSubscription(table, queueHandler, options, initialized, realtime) {
@@ -36,7 +36,7 @@ function useRealtimeSubscription(table, queueHandler, options, initialized, real
36
36
  if (!isConnected) {
37
37
  if (isSubscribedRef.current) {
38
38
  const filterString = options.filter
39
- ? buildFilterString(options.filter)
39
+ ? ReusedHelpers.buildFilterString(options.filter)
40
40
  : undefined;
41
41
  RealtimeManager.unsubscribe(table, hookId, filterString);
42
42
  isSubscribedRef.current = false;
@@ -50,7 +50,7 @@ function useRealtimeSubscription(table, queueHandler, options, initialized, real
50
50
  (!options.lazy || initialized));
51
51
  if (shouldSubscribe && !isSubscribedRef.current) {
52
52
  const filterString = options.filter
53
- ? buildFilterString(options.filter)
53
+ ? ReusedHelpers.buildFilterString(options.filter)
54
54
  : undefined;
55
55
  RealtimeManager.subscribe(table, hookId, queueHandler, filterString);
56
56
  isSubscribedRef.current = true;
@@ -63,7 +63,7 @@ function useRealtimeSubscription(table, queueHandler, options, initialized, real
63
63
  return;
64
64
  }
65
65
  const filterString = options.filter
66
- ? buildFilterString(options.filter)
66
+ ? ReusedHelpers.buildFilterString(options.filter)
67
67
  : undefined;
68
68
  const unsubscribeStatus = RealtimeManager.onStatusChange(handleStatusChange);
69
69
  const unsubscribeNetInfo = NetInfo.addEventListener(({ isConnected }) => {
@@ -1,4 +1,4 @@
1
- import { RealtimeFilter } from "../../types/realtimeData.types";
2
- export declare function registerSub(table: string, filter?: RealtimeFilter): boolean;
3
- export declare function unregisterSub(table: string, filter?: RealtimeFilter): void;
1
+ import { SupastashFilter } from "../../types/realtimeData.types";
2
+ export declare function registerSub(table: string, filter?: SupastashFilter): boolean;
3
+ export declare function unregisterSub(table: string, filter?: SupastashFilter): void;
4
4
  //# sourceMappingURL=registerSub.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"registerSub.d.ts","sourceRoot":"","sources":["../../../src/hooks/supastashData/registerSub.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAKhE,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,cAAc,GAAG,OAAO,CAQ3E;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,cAAc,GAAG,IAAI,CAQ1E"}
1
+ {"version":3,"file":"registerSub.d.ts","sourceRoot":"","sources":["../../../src/hooks/supastashData/registerSub.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAKjE,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,eAAe,GAAG,OAAO,CAQ5E;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,eAAe,GAAG,IAAI,CAQ3E"}
@@ -1,7 +1,7 @@
1
- import { buildFilterString } from "../../utils/fetchData/buildFilter";
1
+ import { ReusedHelpers } from "../../utils/reusedHelpers";
2
2
  const subRegistry = {};
3
3
  export function registerSub(table, filter) {
4
- const key = `${table}::${buildFilterString(filter) ?? ""}`;
4
+ const key = `${table}::${ReusedHelpers.buildFilterString(filter) ?? ""}`;
5
5
  if (subRegistry[key]) {
6
6
  subRegistry[key]++;
7
7
  return true;
@@ -10,7 +10,7 @@ export function registerSub(table, filter) {
10
10
  return false;
11
11
  }
12
12
  export function unregisterSub(table, filter) {
13
- const key = `${table}::${buildFilterString(filter) ?? ""}`;
13
+ const key = `${table}::${ReusedHelpers.buildFilterString(filter) ?? ""}`;
14
14
  if (subRegistry[key]) {
15
15
  subRegistry[key]--;
16
16
  if (subRegistry[key] <= 0) {
@@ -1,4 +1,4 @@
1
- import { SupastashFilter } from "../../types/supastashFilters.types";
1
+ import { SupastashFilter } from "../../types/realtimeData.types";
2
2
  /**
3
3
  * useSupastashFilters
4
4
  *
@@ -27,7 +27,7 @@ import { SupastashFilter } from "../../types/supastashFilters.types";
27
27
  * ```
28
28
  *
29
29
  * @param {SupastashFilter} filters - An object where each key is a table name, and its value is
30
- * an array of `RealtimeFilter` objects that define the filter criteria for that table's pull sync.
30
+ * an array of `SupastashFilter` objects that define the filter criteria for that table's pull sync.
31
31
  *
32
32
  * @note This hook does not re-run unless the `filters` object reference changes.
33
33
  * To force re-evaluation, pass a fresh object (not just mutated data).
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hooks/supastashFilters/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAOrE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,CAAC,EAAE,eAAe,QAuD5D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hooks/supastashFilters/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAMjE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,CAAC,EAAE,eAAe,QAwD5D"}
@@ -1,7 +1,8 @@
1
1
  import { useEffect } from "react";
2
2
  import { filterTracker, tableFilters, tableFiltersUsed, } from "../../store/tableFilters";
3
3
  import { logWarn } from "../../utils/logs";
4
- import isValidFilter, { warnOnMisMatch, } from "../../utils/sync/pullFromRemote/validateFilters";
4
+ import { ReusedHelpers } from "../../utils/reusedHelpers";
5
+ import { warnOnMisMatch } from "../../utils/sync/pullFromRemote/validateFilters";
5
6
  import { checkIfTableExist } from "../../utils/tableValidator";
6
7
  /**
7
8
  * useSupastashFilters
@@ -31,7 +32,7 @@ import { checkIfTableExist } from "../../utils/tableValidator";
31
32
  * ```
32
33
  *
33
34
  * @param {SupastashFilter} filters - An object where each key is a table name, and its value is
34
- * an array of `RealtimeFilter` objects that define the filter criteria for that table's pull sync.
35
+ * an array of `SupastashFilter` objects that define the filter criteria for that table's pull sync.
35
36
  *
36
37
  * @note This hook does not re-run unless the `filters` object reference changes.
37
38
  * To force re-evaluation, pass a fresh object (not just mutated data).
@@ -62,8 +63,9 @@ export function useSupastashFilters(filters) {
62
63
  logWarn(`Table '${table}' does not exist; skipping filters`);
63
64
  continue;
64
65
  }
65
- const raw = filters[table] ?? [];
66
- const valid = raw.filter((f) => isValidFilter([f]));
66
+ const raw = (filters[table] ??
67
+ []);
68
+ const valid = raw.filter((f) => ReusedHelpers.isValidFilter([f]));
67
69
  if (!valid.length) {
68
70
  tableFilters.delete(table);
69
71
  tableFiltersUsed.delete(table);
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hooks/supastashLiteQuery/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAUhF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAiDM;AACN,wBAAgB,qBAAqB,CAAC,CAAC,GAAG,GAAG,EAC3C,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,gBAAgB,CAAC,CAAC,CAAM,GAChC,eAAe,CAAC,CAAC,CAAC,CAiFpB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hooks/supastashLiteQuery/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAWhF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAiDM;AACN,wBAAgB,qBAAqB,CAAC,CAAC,GAAG,GAAG,EAC3C,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,gBAAgB,CAAC,CAAC,CAAM,GAChC,eAAe,CAAC,CAAC,CAAC,CA0FpB"}
@@ -109,9 +109,19 @@ export function useSupastashLiteQuery(table, options = {}) {
109
109
  loadMore();
110
110
  }, [loadMore]);
111
111
  const isAnyNullish = useMemo(() => {
112
- if (!options.sqlFilter)
112
+ if (!options.sqlFilter?.length)
113
113
  return false;
114
- return options.sqlFilter.some((filter) => isTrulyNullish(filter.value) && filter.operator !== "is");
114
+ const check = (filter) => {
115
+ if (!filter || typeof filter !== "object")
116
+ return false;
117
+ if ("or" in filter) {
118
+ return filter.or?.some(check) ?? false;
119
+ }
120
+ else {
121
+ return isTrulyNullish(filter.value) && filter.operator !== "is";
122
+ }
123
+ };
124
+ return options.sqlFilter.some(check);
115
125
  }, [options.sqlFilter]);
116
126
  return { data, loadMore, loading, hasMore, reset };
117
127
  }
@@ -59,7 +59,7 @@ export async function pushLocalData() {
59
59
  });
60
60
  }
61
61
  catch (e) {
62
- const msg = e?.code ?? e?.name ?? String(e);
62
+ const msg = e?.message ?? e?.code ?? e?.name ?? String(e);
63
63
  SyncInfoUpdater.markLogError({
64
64
  type: "push",
65
65
  table,
package/dist/index.d.ts CHANGED
@@ -13,6 +13,7 @@ export { refreshScreen } from "./utils/refreshScreenCalls";
13
13
  export { dropAllTables, dropTable, wipeAllTables, wipeOldDataForAllTables, wipeOldDataForATable, wipeTable, } from "./utils/schema/wipeTables";
14
14
  export { getSupastashRuntimeMode, reinitializeSupastash, } from "./utils/supastashMode";
15
15
  export { getAllTables } from "./utils/sync/getAllTables";
16
+ export { fetchOlderPage } from "./utils/sync/pullFromRemote/fetchOlder";
16
17
  export { updateFilters } from "./utils/sync/pullFromRemote/updateFilter";
17
18
  export { updateLocalDb, upsertData, } from "./utils/sync/pullFromRemote/updateLocalDb";
18
19
  export { refreshAllTables, refreshTable, refreshTableWithPayload, } from "./utils/sync/refreshTables";
@@ -20,5 +21,6 @@ export { clearSyncCalls, getAllSyncTables, getSyncCall, registerSyncCall, unregi
20
21
  export { clearAllLocalDeleteLog, clearAllLocalSyncLog, clearLocalDeleteLog, clearLocalSyncLog, clearSyncLog, getLocalDeleteLog, getSyncLog, resetSyncLog, setLocalDeleteLog, setLocalSyncLog, setSyncLog, } from "./utils/sync/status/syncStatus";
21
22
  export type { CrudMethods } from "./types/query.types";
22
23
  export type { RealtimeOptions, SupastashDataResult, SupastashFilter, } from "./types/realtimeData.types";
23
- export type { SupastashConfig, SupastashHookReturn, SupastashSQLiteClientTypes, SupastashSQLiteDatabase, } from "./types/supastashConfig.types";
24
+ export type { SupastashConfig, SupastashHookReturn, SupastashSQLiteClientTypes, SupastashSQLiteDatabase, SupastashSQLiteExecutor, } from "./types/supastashConfig.types";
25
+ export type { SupastashClient, SupastashTransactionClient, } from "./utils/query/builder";
24
26
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,YAAY,GACb,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EACL,aAAa,EACb,SAAS,EACT,aAAa,EACb,uBAAuB,EACvB,oBAAoB,EACpB,SAAS,GACV,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,0CAA0C,CAAC;AACzE,OAAO,EACL,aAAa,EACb,UAAU,GACX,MAAM,2CAA2C,CAAC;AACnD,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,uBAAuB,GACxB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,WAAW,EACX,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,YAAY,EACZ,iBAAiB,EACjB,UAAU,EACV,YAAY,EACZ,iBAAiB,EACjB,eAAe,EACf,UAAU,GACX,MAAM,gCAAgC,CAAC;AAExC,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,YAAY,EACV,eAAe,EACf,mBAAmB,EACnB,eAAe,GAChB,MAAM,4BAA4B,CAAC;AACpC,YAAY,EACV,eAAe,EACf,mBAAmB,EACnB,0BAA0B,EAC1B,uBAAuB,GACxB,MAAM,+BAA+B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,YAAY,GACb,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EACL,aAAa,EACb,SAAS,EACT,aAAa,EACb,uBAAuB,EACvB,oBAAoB,EACpB,SAAS,GACV,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,0CAA0C,CAAC;AACzE,OAAO,EACL,aAAa,EACb,UAAU,GACX,MAAM,2CAA2C,CAAC;AACnD,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,uBAAuB,GACxB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,WAAW,EACX,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,YAAY,EACZ,iBAAiB,EACjB,UAAU,EACV,YAAY,EACZ,iBAAiB,EACjB,eAAe,EACf,UAAU,GACX,MAAM,gCAAgC,CAAC;AAExC,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,YAAY,EACV,eAAe,EACf,mBAAmB,EACnB,eAAe,GAChB,MAAM,4BAA4B,CAAC;AACpC,YAAY,EACV,eAAe,EACf,mBAAmB,EACnB,0BAA0B,EAC1B,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,+BAA+B,CAAC;AACvC,YAAY,EACV,eAAe,EACf,0BAA0B,GAC3B,MAAM,uBAAuB,CAAC"}
package/dist/index.js CHANGED
@@ -14,6 +14,7 @@ export { refreshScreen } from "./utils/refreshScreenCalls";
14
14
  export { dropAllTables, dropTable, wipeAllTables, wipeOldDataForAllTables, wipeOldDataForATable, wipeTable, } from "./utils/schema/wipeTables";
15
15
  export { getSupastashRuntimeMode, reinitializeSupastash, } from "./utils/supastashMode";
16
16
  export { getAllTables } from "./utils/sync/getAllTables";
17
+ export { fetchOlderPage } from "./utils/sync/pullFromRemote/fetchOlder";
17
18
  export { updateFilters } from "./utils/sync/pullFromRemote/updateFilter";
18
19
  export { updateLocalDb, upsertData, } from "./utils/sync/pullFromRemote/updateLocalDb";
19
20
  export { refreshAllTables, refreshTable, refreshTableWithPayload, } from "./utils/sync/refreshTables";
@@ -1,5 +1,5 @@
1
- import { RealtimeFilter } from "../types/realtimeData.types";
1
+ import { SupastashFilter } from "../types/realtimeData.types";
2
2
  export declare const tableFiltersUsed: Set<string>;
3
- export declare const filterTracker: Map<string, RealtimeFilter[]>;
4
- export declare const tableFilters: Map<string, RealtimeFilter[]>;
3
+ export declare const filterTracker: Map<string, SupastashFilter[]>;
4
+ export declare const tableFilters: Map<string, SupastashFilter[]>;
5
5
  //# sourceMappingURL=tableFilters.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tableFilters.d.ts","sourceRoot":"","sources":["../../src/store/tableFilters.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D,eAAO,MAAM,gBAAgB,aAAoB,CAAC;AAClD,eAAO,MAAM,aAAa,+BAAsC,CAAC;AAEjE,eAAO,MAAM,YAAY,+BAAsC,CAAC"}
1
+ {"version":3,"file":"tableFilters.d.ts","sourceRoot":"","sources":["../../src/store/tableFilters.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE9D,eAAO,MAAM,gBAAgB,aAAoB,CAAC;AAClD,eAAO,MAAM,aAAa,gCAAuC,CAAC;AAElE,eAAO,MAAM,YAAY,gCAAuC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { CrudMethods, PayloadData, SupastashQuery } from "../types/query.types";
2
+ export declare const txStore: Record<string, SupastashQuery<CrudMethods, boolean, PayloadData>[]>;
3
+ //# sourceMappingURL=tx.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tx.d.ts","sourceRoot":"","sources":["../../src/store/tx.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEhF,eAAO,MAAM,OAAO,EAAS,MAAM,CACjC,MAAM,EACN,cAAc,CAAC,WAAW,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,CACpD,CAAC"}
@@ -0,0 +1 @@
1
+ export const txStore = {};
@@ -1,4 +1,6 @@
1
- export interface ExpoSQLiteDatabase {
1
+ import type { SQLiteDatabase, SQLiteRunResult } from "expo-sqlite";
2
+
3
+ export interface ExpoSQLiteDatabase extends SQLiteDatabase {
2
4
  runAsync<T = any>(
3
5
  statement: string,
4
6
  params: SQLiteBindParams
@@ -44,15 +46,3 @@ export type SQLiteBindBlobParams = Record<string, Uint8Array>;
44
46
  export type SQLiteColumnNames = string[];
45
47
  export type SQLiteColumnValues = any[];
46
48
  export type SQLiteAnyDatabase = any;
47
-
48
- export interface SQLiteRunResult {
49
- /**
50
- * The last inserted row ID. Returned from the [`sqlite3_last_insert_rowid()`](https://www.sqlite.org/c3ref/last_insert_rowid.html) function.
51
- */
52
- lastInsertRowId: number;
53
-
54
- /**
55
- * The number of rows affected. Returned from the [`sqlite3_changes()`](https://www.sqlite.org/c3ref/changes.html) function.
56
- */
57
- changes: number;
58
- }
@@ -1,5 +1,5 @@
1
1
  export type { SupastashQueryResult, SupastashResult } from "./query.types";
2
2
  export type { SupastashDataHook, SupastashDataResult, } from "./realtimeData.types";
3
- export type { SupastashConfig, SupastashSQLiteClientTypes, } from "./supastashConfig.types";
3
+ export type { SupastashConfig, SupastashSQLiteClientTypes, SupastashSQLiteDatabase, SupastashSQLiteExecutor, } from "./supastashConfig.types";
4
4
  export type { SyncResult, TableSchema } from "./syncEngine.types";
5
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAC3E,YAAY,EACV,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,eAAe,EACf,0BAA0B,GAC3B,MAAM,yBAAyB,CAAC;AACjC,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAC3E,YAAY,EACV,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,eAAe,EACf,0BAA0B,EAC1B,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,yBAAyB,CAAC;AACjC,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC"}
@@ -1,4 +1,4 @@
1
- import { RealtimeFilter } from "./realtimeData.types";
1
+ import { SupastashFilter } from "./realtimeData.types";
2
2
 
3
3
  /**
4
4
  * LiteQueryOptions
@@ -44,7 +44,7 @@ export type LiteQueryOptions<R = any> = {
44
44
  * }
45
45
  * ]
46
46
  */
47
- sqlFilter?: RealtimeFilter<R>[];
47
+ sqlFilter?: SupastashFilter<R>[];
48
48
  };
49
49
 
50
50
  export interface LiteQueryResult<R> {
@@ -1,6 +1,7 @@
1
1
  import { PostgrestError, PostgrestSingleResponse } from "@supabase/supabase-js";
2
+ import { SupastashSQLiteExecutor } from "./supastashConfig.types";
2
3
 
3
- type SupabaseResult<T> = PostgrestSingleResponse<T>;
4
+ export type SupabaseResult<T> = PostgrestSingleResponse<T>;
4
5
  export type PayloadData = any;
5
6
 
6
7
  export type SupabaseQueryReturn<U extends boolean, Z> = U extends true
@@ -50,6 +51,12 @@ export interface SupastashQuery<
50
51
  viewRemoteResult: boolean;
51
52
  onConflictKeys?: string[];
52
53
  preserveTimestamp: boolean;
54
+ throwOnError: boolean;
55
+ fetchPolicy: FetchPolicy | null;
56
+ // With tx
57
+ txId: string | null;
58
+ tx: SupastashSQLiteExecutor | null;
59
+ withTx: boolean;
53
60
  }
54
61
 
55
62
  export interface CrudReturnValue {
@@ -95,6 +102,8 @@ export type SyncMode =
95
102
  | "localOnly"
96
103
  | "remoteOnly";
97
104
 
105
+ export type FetchPolicy = "localFirst" | "remoteFirst";
106
+
98
107
  export type SupastashQueryResult<
99
108
  T extends CrudMethods,
100
109
  U extends boolean,
@@ -135,6 +144,13 @@ export type QueryBuilder<
135
144
  // Transitions to U = true when called
136
145
  single(): QueryBuilder<T, true, R, Z>;
137
146
 
147
+ /**
148
+ * Throws an error if the query fails.
149
+ *
150
+ * @returns more filter options.
151
+ */
152
+ throwOnError(): QueryBuilder<T, U, R, Z>;
153
+
138
154
  // Executes the query
139
155
  execute<V extends boolean = false>(
140
156
  options?: ExecuteOptions & { viewRemoteResult?: V }
@@ -168,3 +184,10 @@ export interface ExecuteOptions {
168
184
  */
169
185
  debug?: boolean;
170
186
  }
187
+
188
+ interface BatchedCall<T extends CrudMethods, U extends boolean, R> {
189
+ state: SupastashQuery<T, U, R>;
190
+ opKey: string;
191
+ resolve: (success: boolean) => void;
192
+ reject: (error: any) => void;
193
+ }
@@ -8,13 +8,17 @@ export type FilterOperator =
8
8
  | "in"
9
9
  | "is";
10
10
 
11
- export type RealtimeFilter<R = any> = {
11
+ export type Filter<R = any> = {
12
12
  column: keyof R;
13
13
  operator: FilterOperator;
14
14
  value: string | number | null | boolean | (string | number)[];
15
15
  };
16
16
 
17
- export type SupastashFilter<R = any> = RealtimeFilter<R>;
17
+ export type SupastashFilter<R = any> =
18
+ | Filter<R>
19
+ | {
20
+ or: Filter<R>[];
21
+ };
18
22
 
19
23
  export interface RealtimeOptions<R = any> {
20
24
  /**
@@ -88,7 +92,7 @@ export interface RealtimeOptions<R = any> {
88
92
  * @example
89
93
  * sqlFilter: [{ column: "user_id", operator: "eq", value: "123" }]
90
94
  */
91
- sqlFilter?: RealtimeFilter<R>[];
95
+ sqlFilter?: SupastashFilter<R>[];
92
96
 
93
97
  /**
94
98
  * Clears the shared cache for this table when the hook mounts.
@@ -115,7 +119,7 @@ export interface RealtimeOptions<R = any> {
115
119
  * value: "123"
116
120
  * }
117
121
  */
118
- filter?: RealtimeFilter<R>;
122
+ filter?: SupastashFilter<R>;
119
123
 
120
124
  /**
121
125
  * If true, only use the filter for the realtime subscription stream.