supastash 0.1.0 → 0.1.1

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 (63) hide show
  1. package/README.md +32 -17
  2. package/dist/hooks/supastashData/fetchCalls.d.ts.map +1 -1
  3. package/dist/hooks/supastashData/fetchCalls.js +14 -1
  4. package/dist/hooks/syncEngine/pullFromRemote/index.d.ts.map +1 -1
  5. package/dist/hooks/syncEngine/pullFromRemote/index.js +2 -1
  6. package/dist/hooks/syncEngine/pushLocal/index.d.ts.map +1 -1
  7. package/dist/hooks/syncEngine/pushLocal/index.js +2 -1
  8. package/dist/index.d.ts +1 -1
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +1 -1
  11. package/dist/store/syncCalls.d.ts +5 -0
  12. package/dist/store/syncCalls.d.ts.map +1 -0
  13. package/dist/store/syncCalls.js +1 -0
  14. package/dist/store/tableSchemaData.d.ts +2 -0
  15. package/dist/store/tableSchemaData.d.ts.map +1 -0
  16. package/dist/store/tableSchemaData.js +1 -0
  17. package/dist/types/query.types.d.ts +25 -19
  18. package/dist/types/supastashConfig.types.d.ts +34 -2
  19. package/dist/utils/fetchData/createTable.d.ts.map +1 -1
  20. package/dist/utils/fetchData/createTable.js +34 -18
  21. package/dist/utils/fetchData/getKeyType.d.ts +6 -0
  22. package/dist/utils/fetchData/getKeyType.d.ts.map +1 -1
  23. package/dist/utils/fetchData/getKeyType.js +47 -0
  24. package/dist/utils/query/builder/crud.d.ts +5 -5
  25. package/dist/utils/query/builder/crud.d.ts.map +1 -1
  26. package/dist/utils/query/builder/filters.d.ts +16 -16
  27. package/dist/utils/query/builder/filters.d.ts.map +1 -1
  28. package/dist/utils/query/builder/mainQuery.d.ts +2 -2
  29. package/dist/utils/query/builder/mainQuery.d.ts.map +1 -1
  30. package/dist/utils/query/builder/mainQuery.js +2 -2
  31. package/dist/utils/query/helpers/localDb/getLocalMethod.d.ts +1 -1
  32. package/dist/utils/query/helpers/localDb/getLocalMethod.d.ts.map +1 -1
  33. package/dist/utils/query/helpers/localDb/getLocalMethod.js +1 -1
  34. package/dist/utils/query/helpers/localDb/localQueryBuilder.d.ts +5 -5
  35. package/dist/utils/query/helpers/localDb/localQueryBuilder.d.ts.map +1 -1
  36. package/dist/utils/query/helpers/localDb/localQueryBuilder.js +2 -2
  37. package/dist/utils/query/helpers/mainQueryHelpers.d.ts +4 -4
  38. package/dist/utils/query/helpers/mainQueryHelpers.d.ts.map +1 -1
  39. package/dist/utils/query/helpers/queryValidator.d.ts.map +1 -1
  40. package/dist/utils/query/helpers/queryValidator.js +6 -0
  41. package/dist/utils/query/localDbQuery/delete.d.ts +1 -1
  42. package/dist/utils/query/localDbQuery/index.d.ts +1 -1
  43. package/dist/utils/query/localDbQuery/index.d.ts.map +1 -1
  44. package/dist/utils/query/localDbQuery/insert.d.ts +1 -1
  45. package/dist/utils/query/localDbQuery/insert.d.ts.map +1 -1
  46. package/dist/utils/query/localDbQuery/insert.js +2 -1
  47. package/dist/utils/query/localDbQuery/select.d.ts +2 -2
  48. package/dist/utils/query/localDbQuery/select.d.ts.map +1 -1
  49. package/dist/utils/query/localDbQuery/select.js +5 -2
  50. package/dist/utils/query/localDbQuery/update.d.ts +2 -2
  51. package/dist/utils/query/localDbQuery/update.d.ts.map +1 -1
  52. package/dist/utils/query/localDbQuery/update.js +13 -2
  53. package/dist/utils/query/localDbQuery/upsert.d.ts +1 -1
  54. package/dist/utils/query/localDbQuery/upsert.d.ts.map +1 -1
  55. package/dist/utils/query/localDbQuery/upsert.js +2 -1
  56. package/dist/utils/query/remoteQuery/supabaseQuery.d.ts +1 -1
  57. package/dist/utils/query/remoteQuery/supabaseQuery.d.ts.map +1 -1
  58. package/dist/utils/sync/pushLocal/getAllUnsyncedData.d.ts.map +1 -1
  59. package/dist/utils/sync/pushLocal/getAllUnsyncedData.js +14 -7
  60. package/dist/utils/sync/refreshTables.d.ts +9 -0
  61. package/dist/utils/sync/refreshTables.d.ts.map +1 -1
  62. package/dist/utils/sync/refreshTables.js +11 -0
  63. package/package.json +1 -1
package/README.md CHANGED
@@ -2,13 +2,15 @@
2
2
 
3
3
  **Offline-First Sync Engine for Supabase + React Native.**
4
4
 
5
+ > Reliable offline-first syncing for Supabase + React Native using local SQLite. Plug in your adapter and get syncing — no boilerplate.
6
+
5
7
  Supastash makes it effortless to build offline-capable mobile apps using **SQLite for local-first storage** and **Supabase for cloud sync**. Designed for React Native, Supastash handles syncing, conflict resolution, realtime updates, and local querying so you can focus on features, not infrastructure.
6
8
 
7
9
  ---
8
10
 
9
11
  ### 📚 Documentation
10
12
 
11
- [Documentation (Coming Soon)](https://...)
13
+ Read the [Docs](https://0xzekea.github.io/supastash/)
12
14
 
13
15
  ---
14
16
 
@@ -41,9 +43,9 @@ npm install @supabase/supabase-js
41
43
 
42
44
  # Choose one SQLite adapter:
43
45
  npm install expo-sqlite
44
- # or
46
+ # OR React Native Nitro
45
47
  npm install react-native-nitro-sqlite
46
- # or
48
+ # OR React Native SQLite Storage
47
49
  npm install react-native-sqlite-storage
48
50
  ```
49
51
 
@@ -100,6 +102,8 @@ export default function RootLayout() {
100
102
 
101
103
  ## 🚨 Key Notes
102
104
 
105
+ > ⚠️ **Important:** All timestamp fields (`created_at`, `updated_at`) used for syncing **must be `timestamptz`** in Supabase. This avoids timezone mismatch issues and ensures reliable sync.
106
+
103
107
  - Supabase tables **must** include:
104
108
 
105
109
  - `id`, `created_at`, `updated_at`, `deleted_at`
@@ -110,17 +114,24 @@ export default function RootLayout() {
110
114
  - To enable schema reflection, create this Supabase RPC:
111
115
 
112
116
  ```sql
113
- create or replace function get_column_names(table_name text)
114
- returns table(column_name text)
117
+ create or replace function get_table_schema(table_name text)
118
+ returns table(
119
+ column_name text,
120
+ data_type text,
121
+ is_nullable text
122
+ )
115
123
  security definer
116
124
  as $$
117
- select column_name
125
+ select
126
+ column_name,
127
+ data_type,
128
+ is_nullable
118
129
  from information_schema.columns
119
130
  where table_schema = 'public'
120
- and table_name = table_name;
131
+ and table_name = $1;
121
132
  $$ language sql;
122
133
 
123
- grant execute on function get_column_names(text) to anon, authenticated;
134
+ grant execute on function get_table_schema(text) to anon, authenticated;
124
135
  ```
125
136
 
126
137
  ---
@@ -198,6 +209,19 @@ Force-refresh any or all table data.
198
209
 
199
210
  ---
200
211
 
212
+ ### Sync Modes (per-query control)
213
+
214
+ You can control how each query syncs:
215
+
216
+ - `localOnly`: Use only local data
217
+ - `remoteOnly`: Fetch directly from Supabase
218
+ - `localFirst` _(default)_: Read/write locally, then sync to Supabase
219
+ - `remoteFirst`: Write to Supabase first, then update local
220
+
221
+ Use `.syncMode("...")` or `{ viewRemoteResult: true }` in `.run()` to control behavior.
222
+
223
+ ---
224
+
201
225
  ## 📁 Project Structure
202
226
 
203
227
  ```
@@ -220,15 +244,6 @@ Uses `vitest` for unit testing.
220
244
 
221
245
  ---
222
246
 
223
- ## 🧱 Roadmap
224
-
225
- - [ ] Per-table sync intervals
226
- - [ ] Smart job resumption
227
- - [ ] Sync versioning
228
- - [ ] Live change audit logs
229
-
230
- ---
231
-
232
247
  ## 🤝 Contributing
233
248
 
234
249
  ```bash
@@ -1 +1 @@
1
- {"version":3,"file":"fetchCalls.d.ts","sourceRoot":"","sources":["../../../src/hooks/supastashData/fetchCalls.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AASjE,wBAAgB,UAAU,CACxB,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,EAClE,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,EACxD,OAAO,EAAE,eAAe,EACxB,WAAW,EAAE,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC;;;;;wBA+D1B,GAAG,GAAG,GAAG,EAAE,aACT,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ;EAYvD"}
1
+ {"version":3,"file":"fetchCalls.d.ts","sourceRoot":"","sources":["../../../src/hooks/supastashData/fetchCalls.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AASjE,wBAAgB,UAAU,CACxB,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,EAClE,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,EACxD,OAAO,EAAE,eAAe,EACxB,WAAW,EAAE,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC;;;;;wBA2E1B,GAAG,GAAG,GAAG,EAAE,aACT,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ;EAYvD"}
@@ -1,4 +1,5 @@
1
1
  import { useEffect, useRef } from "react";
2
+ import { syncCalls } from "../../store/syncCalls";
2
3
  import { tableFilters } from "../../store/tableFilters";
3
4
  import { fetchLocalData } from "../../utils/fetchData/fetchLocalData";
4
5
  import { initialFetch } from "../../utils/fetchData/initialFetch";
@@ -13,7 +14,19 @@ export function fetchCalls(table, setDataMap, setVersion, options, initialized)
13
14
  if (filter && useFilterWhileSyncing && !tableFilters.get(table)) {
14
15
  tableFilters.set(table, filter);
15
16
  }
16
- }, [filter]);
17
+ if (onPushToRemote) {
18
+ syncCalls.set(table, {
19
+ ...(syncCalls.get(table) || {}),
20
+ push: onPushToRemote,
21
+ });
22
+ }
23
+ if (onInsertAndUpdate) {
24
+ syncCalls.set(table, {
25
+ ...(syncCalls.get(table) || {}),
26
+ pull: onInsertAndUpdate,
27
+ });
28
+ }
29
+ }, []);
17
30
  const fetch = async () => {
18
31
  if (!cancelled.current) {
19
32
  await fetchLocalData(table, setDataMap, setVersion, shouldFetch, limit);
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/hooks/syncEngine/pullFromRemote/index.ts"],"names":[],"mappings":"AAMA;;GAEG;AACH,wBAAsB,cAAc,kBAyBnC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/hooks/syncEngine/pullFromRemote/index.ts"],"names":[],"mappings":"AAOA;;GAEG;AACH,wBAAsB,cAAc,kBAyBnC"}
@@ -1,4 +1,5 @@
1
1
  import { getSupastashConfig } from "../../../core/config";
2
+ import { syncCalls } from "../../../store/syncCalls";
2
3
  import { tableFilters } from "../../../store/tableFilters";
3
4
  import log from "../../../utils/logs";
4
5
  import { getAllTables } from "../../../utils/sync/getAllTables";
@@ -19,7 +20,7 @@ export async function pullFromRemote() {
19
20
  const excludeTables = getSupastashConfig()?.excludeTables?.pull || [];
20
21
  const tablesToPull = tables.filter((table) => !excludeTables?.includes(table));
21
22
  for (const table of tablesToPull) {
22
- await updateLocalDb(table, filter(table));
23
+ await updateLocalDb(table, filter(table), syncCalls.get(table)?.pull);
23
24
  }
24
25
  }
25
26
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/hooks/syncEngine/pushLocal/index.ts"],"names":[],"mappings":"AAQA;;GAEG;AACH,wBAAsB,aAAa,kBAmClC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/hooks/syncEngine/pushLocal/index.ts"],"names":[],"mappings":"AASA;;GAEG;AACH,wBAAsB,aAAa,kBAmClC"}
@@ -1,4 +1,5 @@
1
1
  import { getSupastashConfig } from "../../../core/config";
2
+ import { syncCalls } from "../../../store/syncCalls";
2
3
  import log from "../../../utils/logs";
3
4
  import { getAllTables } from "../../../utils/sync/getAllTables";
4
5
  import { pushLocalDataToRemote } from "../../../utils/sync/pushLocal/sendUnsyncedToSupabase";
@@ -18,7 +19,7 @@ export async function pushLocalData() {
18
19
  const tablesToPush = tables.filter((table) => !excludeTables?.includes(table));
19
20
  const noSync = [];
20
21
  for (const table of tablesToPush) {
21
- await pushLocalDataToRemote(table, undefined, noSync);
22
+ await pushLocalDataToRemote(table, syncCalls.get(table)?.push, noSync);
22
23
  }
23
24
  if (noSync.length > 0) {
24
25
  timesPushed++;
package/dist/index.d.ts CHANGED
@@ -6,7 +6,7 @@ export { useSupastash } from "./hooks/supastashLogic";
6
6
  export { supastash } from "./utils/query/builder";
7
7
  export { wipeAllTables, wipeOldDataForAllTables, wipeOldDataForATable, wipeTable, } from "./utils/schema/wipeTables";
8
8
  export { getAllTables } from "./utils/sync/getAllTables";
9
- export { refreshAllTables, refreshTable } from "./utils/sync/refreshTables";
9
+ export { refreshAllTables, refreshTable, refreshTableWithPayload, } from "./utils/sync/refreshTables";
10
10
  export { clearAllLocalDeleteLog, clearAllLocalSyncLog, clearLocalDeleteLog, clearLocalSyncLog, getLocalDeleteLog, getLocalSyncLog, setLocalDeleteLog, setLocalSyncLog, } from "./utils/syncStatus";
11
11
  export type { CrudMethods } from "./types/query.types";
12
12
  export type { RealtimeOptions, SupastashDataResult, } from "./types/realtimeData.types";
@@ -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;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EACL,aAAa,EACb,uBAAuB,EACvB,oBAAoB,EACpB,SAAS,GACV,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC5E,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAE5B,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,YAAY,EACV,eAAe,EACf,mBAAmB,GACpB,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;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EACL,aAAa,EACb,uBAAuB,EACvB,oBAAoB,EACpB,SAAS,GACV,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,uBAAuB,GACxB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAE5B,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,YAAY,EACV,eAAe,EACf,mBAAmB,GACpB,MAAM,4BAA4B,CAAC;AACpC,YAAY,EACV,eAAe,EACf,mBAAmB,EACnB,0BAA0B,EAC1B,uBAAuB,GACxB,MAAM,+BAA+B,CAAC"}
package/dist/index.js CHANGED
@@ -6,5 +6,5 @@ export { useSupastash } from "./hooks/supastashLogic";
6
6
  export { supastash } from "./utils/query/builder";
7
7
  export { wipeAllTables, wipeOldDataForAllTables, wipeOldDataForATable, wipeTable, } from "./utils/schema/wipeTables";
8
8
  export { getAllTables } from "./utils/sync/getAllTables";
9
- export { refreshAllTables, refreshTable } from "./utils/sync/refreshTables";
9
+ export { refreshAllTables, refreshTable, refreshTableWithPayload, } from "./utils/sync/refreshTables";
10
10
  export { clearAllLocalDeleteLog, clearAllLocalSyncLog, clearLocalDeleteLog, clearLocalSyncLog, getLocalDeleteLog, getLocalSyncLog, setLocalDeleteLog, setLocalSyncLog, } from "./utils/syncStatus";
@@ -0,0 +1,5 @@
1
+ export declare const syncCalls: Map<string, {
2
+ push?: (payload: any) => Promise<boolean>;
3
+ pull?: (payload: any) => Promise<void>;
4
+ }>;
5
+ //# sourceMappingURL=syncCalls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syncCalls.d.ts","sourceRoot":"","sources":["../../src/store/syncCalls.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,SAAS;WAGX,CAAC,OAAO,EAAE,GAAG,KAAK,OAAO,CAAC,OAAO,CAAC;WAClC,CAAC,OAAO,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC;EAEvC,CAAC"}
@@ -0,0 +1 @@
1
+ export const syncCalls = new Map();
@@ -0,0 +1,2 @@
1
+ export declare const tableSchemaData: Map<string, any>;
2
+ //# sourceMappingURL=tableSchemaData.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tableSchemaData.d.ts","sourceRoot":"","sources":["../../src/store/tableSchemaData.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe,kBAAyB,CAAC"}
@@ -0,0 +1 @@
1
+ export const tableSchemaData = new Map();
@@ -3,9 +3,9 @@ import { PostgrestError, PostgrestSingleResponse } from "@supabase/supabase-js";
3
3
  type SupabaseResult<T> = PostgrestSingleResponse<T>;
4
4
  export type PayloadData = any;
5
5
 
6
- export type SupabaseQueryReturn<U extends boolean, R> = U extends true
7
- ? PostgrestSingleResponse<R>
8
- : PostgrestSingleResponse<R[]>;
6
+ export type SupabaseQueryReturn<U extends boolean, Z> = U extends true
7
+ ? PostgrestSingleResponse<Z>
8
+ : PostgrestSingleResponse<Z[]>;
9
9
 
10
10
  type FilterOperations =
11
11
  | "="
@@ -108,26 +108,32 @@ export type SupastashQueryResult<
108
108
  success: boolean;
109
109
  }>;
110
110
 
111
- export type QueryBuilder<T extends CrudMethods, U extends boolean> = {
112
- eq(column: string, value: any): QueryBuilder<T, U>;
113
- neq(column: string, value: any): QueryBuilder<T, U>;
114
- gt(column: string, value: any): QueryBuilder<T, U>;
115
- lt(column: string, value: any): QueryBuilder<T, U>;
116
- gte(column: string, value: any): QueryBuilder<T, U>;
117
- lte(column: string, value: any): QueryBuilder<T, U>;
118
- like(column: string, value: any): QueryBuilder<T, U>;
119
- is(column: string, value: any): QueryBuilder<T, U>;
120
- in(column: string, value: any[]): QueryBuilder<T, U>;
121
- limit(n: number): QueryBuilder<T, U>;
122
- syncMode(mode: SyncMode): QueryBuilder<T, U>;
111
+ export type QueryBuilder<T extends CrudMethods, U extends boolean, R, Z> = {
112
+ eq(column: string, value: any): QueryBuilder<T, U, R, Z>;
113
+ neq(column: string, value: any): QueryBuilder<T, U, R, Z>;
114
+ gt(column: string, value: any): QueryBuilder<T, U, R, Z>;
115
+ lt(column: string, value: any): QueryBuilder<T, U, R, Z>;
116
+ gte(column: string, value: any): QueryBuilder<T, U, R, Z>;
117
+ lte(column: string, value: any): QueryBuilder<T, U, R, Z>;
118
+ like(column: string, value: any): QueryBuilder<T, U, R, Z>;
119
+ is(column: string, value: any): QueryBuilder<T, U, R, Z>;
120
+ in(column: string, value: any[]): QueryBuilder<T, U, R, Z>;
121
+ limit(n: number): QueryBuilder<T, U, R, Z>;
122
+ syncMode(mode: SyncMode): QueryBuilder<T, U, R, Z>;
123
123
 
124
124
  // Transitions to U = true when called
125
- single(): QueryBuilder<T, true>;
125
+ single(): QueryBuilder<T, true, R, Z>;
126
126
 
127
127
  // Executes the query
128
- execute(): SupastashQueryResult<T, U>;
129
- run(): SupastashQueryResult<T, U>;
130
- go(): SupastashQueryResult<T, U>;
128
+ execute<V extends boolean = false>(
129
+ options?: ExecuteOptions & { viewRemoteResult?: V }
130
+ ): SupastashQueryResult<T, U, V, Z>;
131
+ run<V extends boolean = false>(
132
+ options?: ExecuteOptions & { viewRemoteResult?: V }
133
+ ): SupastashQueryResult<T, U, V, Z>;
134
+ go<V extends boolean = false>(
135
+ options?: ExecuteOptions & { viewRemoteResult?: V }
136
+ ): SupastashQueryResult<T, U, V, Z>;
131
137
  };
132
138
 
133
139
  export interface ExecuteOptions {
@@ -32,9 +32,41 @@ export type SupastashConfig<T extends SupastashSQLiteClientTypes> = {
32
32
  };
33
33
 
34
34
  interface SupastashSQLiteDatabase {
35
+ /**
36
+ * Executes a SQL statement without returning any result.
37
+ * Useful for `INSERT`, `UPDATE`, `DELETE`, or `CREATE TABLE` commands.
38
+ *
39
+ * @param sql - The SQL statement to run
40
+ * @param params - Optional parameters for the statement
41
+ * @returns A Promise that resolves when the execution is complete
42
+ */
35
43
  runAsync(sql: string, params?: any[]): Promise<void>;
36
- getAllAsync<T = any>(sql: string, params?: any[]): Promise<T[]>;
37
- getFirstAsync<T = any>(sql: string, params?: any[]): Promise<T | null>;
44
+
45
+ /**
46
+ * Executes a query and returns **all rows** as an array.
47
+ *
48
+ * @param sql - The SQL query to execute
49
+ * @param params - Optional parameters for the query
50
+ * @returns A Promise resolving to an array
51
+ */
52
+ getAllAsync(sql: string, params?: any[]): Promise<any[]>;
53
+
54
+ /**
55
+ * Executes a query and returns **only the first row** (or `null` if no rows).
56
+ *
57
+ * @param sql - The SQL query to execute
58
+ * @param params - Optional parameters for the query
59
+ * @returns A Promise resolving to the first matching row
60
+ */
61
+ getFirstAsync(sql: string, params?: any[]): Promise<any | null>;
62
+
63
+ /**
64
+ * Executes **multiple SQL statements** separated by semicolons.
65
+ * Useful for bulk table creation or schema migrations.
66
+ *
67
+ * @param statements - SQL string containing multiple statements
68
+ * @returns A Promise that resolves when all statements are executed
69
+ */
38
70
  execAsync(statements: string): Promise<void>;
39
71
  }
40
72
 
@@ -1 +1 @@
1
- {"version":3,"file":"createTable.d.ts","sourceRoot":"","sources":["../../../src/utils/fetchData/createTable.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAMtD;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,iBA8CrE"}
1
+ {"version":3,"file":"createTable.d.ts","sourceRoot":"","sources":["../../../src/utils/fetchData/createTable.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAqCtD;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,iBAsCrE"}
@@ -1,9 +1,35 @@
1
1
  import { getSupastashConfig } from "../../core/config";
2
2
  import { getSupastashDb } from "../../db/dbInitializer";
3
+ import { tableSchemaData } from "../../store/tableSchemaData";
3
4
  import log from "../logs";
5
+ import { supabaseClientErr } from "../supabaseClientErr";
4
6
  import { checkIfTableExist } from "../tableValidator";
5
- import { getKeyType } from "./getKeyType";
7
+ import { mapPgTypeToSQLite } from "./getKeyType";
6
8
  import { validatePayload } from "./validatePayload";
9
+ let errorCount = new Map();
10
+ async function getTableSchema(table) {
11
+ const config = getSupastashConfig();
12
+ const supabase = config?.supabaseClient;
13
+ if (!supabase) {
14
+ throw new Error(`Supabase client not found, ${supabaseClientErr}`);
15
+ }
16
+ if (tableSchemaData.has(table)) {
17
+ return tableSchemaData.get(table);
18
+ }
19
+ if (errorCount.get(table) && (errorCount.get(table) || 0) > 3) {
20
+ return null;
21
+ }
22
+ const { data, error } = await supabase.rpc("get_table_schema", {
23
+ table_name: table,
24
+ });
25
+ if (error) {
26
+ log(`[Supastash] Error getting table schema for table ${table}: ${error.message}`);
27
+ errorCount.set(table, (errorCount.get(table) || 0) + 1);
28
+ return null;
29
+ }
30
+ tableSchemaData.set(table, data);
31
+ return data;
32
+ }
7
33
  /**
8
34
  * Creates a table in the database
9
35
  * @param table - The name of the table to create
@@ -11,31 +37,21 @@ import { validatePayload } from "./validatePayload";
11
37
  */
12
38
  export async function createTable(table, payload) {
13
39
  const db = await getSupastashDb();
14
- const config = getSupastashConfig();
15
40
  let newPayload = payload;
16
41
  const isTableExist = await checkIfTableExist(table);
17
42
  if (isTableExist)
18
43
  return;
19
- if (!newPayload && config.supabaseClient) {
20
- const { data, error } = await config.supabaseClient
21
- .from(table)
22
- .select("*")
23
- .limit(1);
24
- if (error) {
25
- log("[Supastash] Error fetching data from supabase", error);
26
- return;
27
- }
28
- newPayload = data?.[0];
29
- }
30
- if (!newPayload) {
31
- log(`[Supastash] Can't create table ${table} because no data was found
44
+ const tableSchema = await getTableSchema(table);
45
+ if (!tableSchema) {
46
+ throw new Error(`[Supastash] Can't create table ${table} because no data was found
32
47
  Try creating the table manually using the 'defineLocalSchema()' function.
33
48
  `);
34
- return;
35
49
  }
50
+ const columns = tableSchema.map((col) => {
51
+ return `${col.column_name} ${mapPgTypeToSQLite(col.data_type)} ${col.column_name === "id" ? "PRIMARY KEY" : ""} ${col.is_nullable === "YES" ? "" : "NOT NULL"}`;
52
+ });
53
+ validatePayload(newPayload);
36
54
  try {
37
- validatePayload(newPayload);
38
- const columns = Object.keys({ ...newPayload, synced_at: null }).map((key) => `${key} ${getKeyType(newPayload[key])}`);
39
55
  log("Table to be created", columns);
40
56
  // Create the table
41
57
  await db.runAsync(`CREATE TABLE IF NOT EXISTS ${table} (${columns.join(", ")})`);
@@ -4,4 +4,10 @@
4
4
  * @returns The type of the key
5
5
  */
6
6
  export declare function getKeyType(value: any): "NULL" | "INTEGER" | "REAL" | "TEXT" | "BLOB";
7
+ /**
8
+ * Maps the PostgreSQL type to the SQLite type
9
+ * @param data_type - The PostgreSQL type
10
+ * @returns The SQLite type
11
+ */
12
+ export declare function mapPgTypeToSQLite(data_type: string): string;
7
13
  //# sourceMappingURL=getKeyType.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"getKeyType.d.ts","sourceRoot":"","sources":["../../../src/utils/fetchData/getKeyType.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,GAAG,GACT,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAuB/C"}
1
+ {"version":3,"file":"getKeyType.d.ts","sourceRoot":"","sources":["../../../src/utils/fetchData/getKeyType.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,GAAG,GACT,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAuB/C;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CA8C3D"}
@@ -23,3 +23,50 @@ export function getKeyType(value) {
23
23
  return "TEXT";
24
24
  return "TEXT";
25
25
  }
26
+ /**
27
+ * Maps the PostgreSQL type to the SQLite type
28
+ * @param data_type - The PostgreSQL type
29
+ * @returns The SQLite type
30
+ */
31
+ export function mapPgTypeToSQLite(data_type) {
32
+ switch (data_type) {
33
+ case "character varying":
34
+ case "character":
35
+ case "text":
36
+ case "uuid":
37
+ case "json":
38
+ case "jsonb":
39
+ case "ARRAY":
40
+ case "timestamp without time zone":
41
+ case "timestamp with time zone":
42
+ case "date":
43
+ case "time without time zone":
44
+ case "time with time zone":
45
+ case "inet":
46
+ case "cidr":
47
+ case "macaddr":
48
+ case "tsvector":
49
+ case "tsquery":
50
+ case "interval":
51
+ case "USER-DEFINED":
52
+ return "TEXT";
53
+ case "integer":
54
+ case "bigint":
55
+ case "smallint":
56
+ case "serial":
57
+ case "bigserial":
58
+ return "INTEGER";
59
+ case "boolean":
60
+ return "INTEGER";
61
+ case "numeric":
62
+ case "decimal":
63
+ case "real":
64
+ case "double precision":
65
+ case "money":
66
+ return "REAL";
67
+ case "bytea":
68
+ return "BLOB";
69
+ default:
70
+ return "TEXT";
71
+ }
72
+ }
@@ -18,33 +18,33 @@ export default class SupastashCrudBuilder<T extends CrudMethods, U extends boole
18
18
  * @param data - The data to insert.
19
19
  * @returns filter options.
20
20
  */
21
- insert(data: R): SupastashFilterBuilder<"insert", false, R>;
21
+ insert<Z>(data: R): SupastashFilterBuilder<"insert", false, R, Z>;
22
22
  /**
23
23
  * Sets the method to update.
24
24
  *
25
25
  * @param data - The data to update.
26
26
  * @returns filter options.
27
27
  */
28
- update(data: R): SupastashFilterBuilder<"update", false, R>;
28
+ update<Z>(data: R): SupastashFilterBuilder<"update", false, R, Z>;
29
29
  /**
30
30
  * Sets the method to delete.
31
31
  *
32
32
  * @returns filter options.
33
33
  */
34
- delete(): SupastashFilterBuilder<"delete", false, R>;
34
+ delete<Z>(): SupastashFilterBuilder<"delete", false, R, Z>;
35
35
  /**
36
36
  * Sets the method to select.
37
37
  *
38
38
  * @param column - The column to select.
39
39
  * @returns filter options.
40
40
  */
41
- select(column?: string): SupastashFilterBuilder<"select", false, R>;
41
+ select<Z>(column?: string): SupastashFilterBuilder<"select", false, R, Z>;
42
42
  /**
43
43
  * Sets the method to upsert.
44
44
  *
45
45
  * @param data - The data to upsert.
46
46
  * @returns filter options.
47
47
  */
48
- upsert(data: R | R[]): SupastashFilterBuilder<"upsert", false, R>;
48
+ upsert<Z>(data: R | R[]): SupastashFilterBuilder<"upsert", false, R, Z>;
49
49
  }
50
50
  //# sourceMappingURL=crud.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"crud.d.ts","sourceRoot":"","sources":["../../../../src/utils/query/builder/crud.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,sBAAsB,MAAM,WAAW,CAAC;AAE/C;;;;GAIG;AAEH,MAAM,CAAC,OAAO,OAAO,oBAAoB,CACvC,CAAC,SAAS,WAAW,EACrB,CAAC,SAAS,OAAO,EACjB,CAAC;IAMW,OAAO,CAAC,QAAQ,CAAC,KAAK;IAJlC;;;OAGG;gBAC0B,KAAK,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAE3D;;;;;OAKG;IACH,MAAM,CAAC,IAAI,EAAE,CAAC;IAWd;;;;;OAKG;IACH,MAAM,CAAC,IAAI,EAAE,CAAC;IAWd;;;;OAIG;IACH,MAAM;IAUN;;;;;OAKG;IACH,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM;IAWtB;;;;;OAKG;IACH,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE;CAUrB"}
1
+ {"version":3,"file":"crud.d.ts","sourceRoot":"","sources":["../../../../src/utils/query/builder/crud.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,sBAAsB,MAAM,WAAW,CAAC;AAE/C;;;;GAIG;AAEH,MAAM,CAAC,OAAO,OAAO,oBAAoB,CACvC,CAAC,SAAS,WAAW,EACrB,CAAC,SAAS,OAAO,EACjB,CAAC;IAMW,OAAO,CAAC,QAAQ,CAAC,KAAK;IAJlC;;;OAGG;gBAC0B,KAAK,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAE3D;;;;;OAKG;IACH,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;IAWjB;;;;;OAKG;IACH,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;IAWjB;;;;OAIG;IACH,MAAM,CAAC,CAAC;IAUR;;;;;OAKG;IACH,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM;IAWzB;;;;;OAKG;IACH,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE;CAUxB"}
@@ -4,7 +4,7 @@ import { CrudMethods, ExecuteOptions, SupastashQuery, SupastashQueryResult, Sync
4
4
  * @param T - The method to call
5
5
  * @param U - Whether to return a single row or multiple rows
6
6
  */
7
- export default class SupastashFilterBuilder<T extends CrudMethods, U extends boolean, R> {
7
+ export default class SupastashFilterBuilder<T extends CrudMethods, U extends boolean, R, Z> {
8
8
  private readonly query;
9
9
  /**
10
10
  * Builds a new query with the given filter.
@@ -30,7 +30,7 @@ export default class SupastashFilterBuilder<T extends CrudMethods, U extends boo
30
30
  * @param value - The value to filter by.
31
31
  * @returns more filter options.
32
32
  */
33
- eq(column: string, value: any): SupastashFilterBuilder<T, U, R>;
33
+ eq(column: string, value: any): SupastashFilterBuilder<T, U, R, Z>;
34
34
  /**
35
35
  * Sets the NEQ operator for the query.
36
36
  *
@@ -38,7 +38,7 @@ export default class SupastashFilterBuilder<T extends CrudMethods, U extends boo
38
38
  * @param value - The value to filter by.
39
39
  * @returns more filter options.
40
40
  */
41
- neq(column: string, value: any): SupastashFilterBuilder<T, U, R>;
41
+ neq(column: string, value: any): SupastashFilterBuilder<T, U, R, Z>;
42
42
  /**
43
43
  * Sets the GT operator for the query.
44
44
  *
@@ -46,7 +46,7 @@ export default class SupastashFilterBuilder<T extends CrudMethods, U extends boo
46
46
  * @param value - The value to filter by.
47
47
  * @returns more filter options.
48
48
  */
49
- gt(column: string, value: any): SupastashFilterBuilder<T, U, R>;
49
+ gt(column: string, value: any): SupastashFilterBuilder<T, U, R, Z>;
50
50
  /**
51
51
  * Sets the LT operator for the query.
52
52
  *
@@ -54,7 +54,7 @@ export default class SupastashFilterBuilder<T extends CrudMethods, U extends boo
54
54
  * @param value - The value to filter by.
55
55
  * @returns more filter options.
56
56
  */
57
- lt(column: string, value: any): SupastashFilterBuilder<T, U, R>;
57
+ lt(column: string, value: any): SupastashFilterBuilder<T, U, R, Z>;
58
58
  /**
59
59
  * Sets the GTE operator for the query.
60
60
  *
@@ -62,7 +62,7 @@ export default class SupastashFilterBuilder<T extends CrudMethods, U extends boo
62
62
  * @param value - The value to filter by.
63
63
  * @returns more filter options.
64
64
  */
65
- gte(column: string, value: any): SupastashFilterBuilder<T, U, R>;
65
+ gte(column: string, value: any): SupastashFilterBuilder<T, U, R, Z>;
66
66
  /**
67
67
  * Sets the LTE operator for the query.
68
68
  *
@@ -70,7 +70,7 @@ export default class SupastashFilterBuilder<T extends CrudMethods, U extends boo
70
70
  * @param value - The value to filter by.
71
71
  * @returns more filter options.
72
72
  */
73
- lte(column: string, value: any): SupastashFilterBuilder<T, U, R>;
73
+ lte(column: string, value: any): SupastashFilterBuilder<T, U, R, Z>;
74
74
  /**
75
75
  * Sets the LIKE operator for the query.
76
76
  *
@@ -78,7 +78,7 @@ export default class SupastashFilterBuilder<T extends CrudMethods, U extends boo
78
78
  * @param value - The value to filter by.
79
79
  * @returns more filter options.
80
80
  */
81
- like(column: string, value: any): SupastashFilterBuilder<T, U, R>;
81
+ like(column: string, value: any): SupastashFilterBuilder<T, U, R, Z>;
82
82
  /**
83
83
  * Sets the IS operator for the query.
84
84
  *
@@ -86,7 +86,7 @@ export default class SupastashFilterBuilder<T extends CrudMethods, U extends boo
86
86
  * @param value - The value to filter by.
87
87
  * @returns more filter options.
88
88
  */
89
- is(column: string, value: any): SupastashFilterBuilder<T, U, R>;
89
+ is(column: string, value: any): SupastashFilterBuilder<T, U, R, Z>;
90
90
  /**
91
91
  * Sets the IN operator for the query.
92
92
  *
@@ -94,28 +94,28 @@ export default class SupastashFilterBuilder<T extends CrudMethods, U extends boo
94
94
  * @param value - The value to filter by.
95
95
  * @returns more filter options.
96
96
  */
97
- in(column: string, value: any[]): SupastashFilterBuilder<T, U, R>;
97
+ in(column: string, value: any[]): SupastashFilterBuilder<T, U, R, Z>;
98
98
  /**
99
99
  * Sets the limit of the query.
100
100
  *
101
101
  * @param n - The number of results to return.
102
102
  * @returns more filter options.
103
103
  */
104
- limit(n: number): SupastashFilterBuilder<T, U, R>;
104
+ limit(n: number): SupastashFilterBuilder<T, U, R, Z>;
105
105
  /**
106
106
  * Returns only one result instead of an array.
107
107
  * Sets `limit(1)` automatically. Fails if more than one result is returned.
108
108
  *
109
109
  * Similar to Supabase `.single()`.
110
110
  */
111
- single(): SupastashFilterBuilder<T, true, R>;
111
+ single(): SupastashFilterBuilder<T, true, R, Z>;
112
112
  /**
113
113
  * Sets the sync mode of the query.
114
114
  *
115
115
  * @param mode - The sync mode to use.
116
116
  * @returns more filter options.
117
117
  */
118
- syncMode(mode: SyncMode): SupastashFilterBuilder<T, U, R>;
118
+ syncMode(mode: SyncMode): SupastashFilterBuilder<T, U, R, Z>;
119
119
  /**
120
120
  * Executes the query.
121
121
  * Must be called after all filters are set.
@@ -124,7 +124,7 @@ export default class SupastashFilterBuilder<T extends CrudMethods, U extends boo
124
124
  */
125
125
  execute<V extends boolean = false>(options?: ExecuteOptions & {
126
126
  viewRemoteResult?: V;
127
- }): Promise<SupastashQueryResult<T, U, V, R>>;
127
+ }): Promise<SupastashQueryResult<T, U, V, Z>>;
128
128
  /**
129
129
  * Alias for `execute()`.
130
130
  *
@@ -132,7 +132,7 @@ export default class SupastashFilterBuilder<T extends CrudMethods, U extends boo
132
132
  */
133
133
  run<V extends boolean = false>(options?: ExecuteOptions & {
134
134
  viewRemoteResult?: V;
135
- }): Promise<SupastashQueryResult<T, U, V, R>>;
135
+ }): Promise<SupastashQueryResult<T, U, V, Z>>;
136
136
  /**
137
137
  * Alias for `execute()`.
138
138
  *
@@ -140,6 +140,6 @@ export default class SupastashFilterBuilder<T extends CrudMethods, U extends boo
140
140
  */
141
141
  go<V extends boolean = false>(options?: ExecuteOptions & {
142
142
  viewRemoteResult?: V;
143
- }): Promise<SupastashQueryResult<T, U, V, R>>;
143
+ }): Promise<SupastashQueryResult<T, U, V, Z>>;
144
144
  }
145
145
  //# sourceMappingURL=filters.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"filters.d.ts","sourceRoot":"","sources":["../../../../src/utils/query/builder/filters.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,cAAc,EAEd,cAAc,EACd,oBAAoB,EACpB,QAAQ,EACT,MAAM,4BAA4B,CAAC;AAIpC;;;;GAIG;AACH,MAAM,CAAC,OAAO,OAAO,sBAAsB,CACzC,CAAC,SAAS,WAAW,EACrB,CAAC,SAAS,OAAO,EACjB,CAAC;IAqCW,OAAO,CAAC,QAAQ,CAAC,KAAK;IAnClC;;;;OAIG;IACH,OAAO,CAAC,KAAK;IAYb;;;;OAIG;IACH,OAAO,CAAC,cAAc;IAStB;;;OAGG;gBAC0B,KAAK,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAE3D;;;;;;OAMG;IACH,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG;IAI7B;;;;;;OAMG;IACH,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG;IAI9B;;;;;;OAMG;IACH,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG;IAI7B;;;;;;OAMG;IACH,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG;IAI7B;;;;;;OAMG;IACH,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG;IAI9B;;;;;;OAMG;IACH,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG;IAI9B;;;;;;OAMG;IACH,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG;IAI/B;;;;;;OAMG;IACH,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG;IAI7B;;;;;;OAMG;IACH,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE;IAI/B;;;;;OAKG;IACH,KAAK,CAAC,CAAC,EAAE,MAAM;IAIf;;;;;OAKG;IACH,MAAM;IAQN;;;;;OAKG;IACH,QAAQ,CAAC,IAAI,EAAE,QAAQ;IAIvB;;;;;OAKG;IACH,OAAO,CAAC,CAAC,SAAS,OAAO,GAAG,KAAK,EAC/B,OAAO,CAAC,EAAE,cAAc,GAAG;QAAE,gBAAgB,CAAC,EAAE,CAAC,CAAA;KAAE,GAClD,OAAO,CAAC,oBAAoB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IA8D5C;;;;OAIG;IACH,GAAG,CAAC,CAAC,SAAS,OAAO,GAAG,KAAK,EAC3B,OAAO,CAAC,EAAE,cAAc,GAAG;QAAE,gBAAgB,CAAC,EAAE,CAAC,CAAA;KAAE;IAKrD;;;;OAIG;IACH,EAAE,CAAC,CAAC,SAAS,OAAO,GAAG,KAAK,EAC1B,OAAO,CAAC,EAAE,cAAc,GAAG;QAAE,gBAAgB,CAAC,EAAE,CAAC,CAAA;KAAE;CAItD"}
1
+ {"version":3,"file":"filters.d.ts","sourceRoot":"","sources":["../../../../src/utils/query/builder/filters.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,cAAc,EAEd,cAAc,EACd,oBAAoB,EACpB,QAAQ,EACT,MAAM,4BAA4B,CAAC;AAIpC;;;;GAIG;AACH,MAAM,CAAC,OAAO,OAAO,sBAAsB,CACzC,CAAC,SAAS,WAAW,EACrB,CAAC,SAAS,OAAO,EACjB,CAAC,EACD,CAAC;IAqCW,OAAO,CAAC,QAAQ,CAAC,KAAK;IAnClC;;;;OAIG;IACH,OAAO,CAAC,KAAK;IAYb;;;;OAIG;IACH,OAAO,CAAC,cAAc;IAStB;;;OAGG;gBAC0B,KAAK,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAE3D;;;;;;OAMG;IACH,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG;IAI7B;;;;;;OAMG;IACH,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG;IAI9B;;;;;;OAMG;IACH,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG;IAI7B;;;;;;OAMG;IACH,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG;IAI7B;;;;;;OAMG;IACH,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG;IAI9B;;;;;;OAMG;IACH,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG;IAI9B;;;;;;OAMG;IACH,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG;IAI/B;;;;;;OAMG;IACH,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG;IAI7B;;;;;;OAMG;IACH,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE;IAI/B;;;;;OAKG;IACH,KAAK,CAAC,CAAC,EAAE,MAAM;IAIf;;;;;OAKG;IACH,MAAM;IAQN;;;;;OAKG;IACH,QAAQ,CAAC,IAAI,EAAE,QAAQ;IAIvB;;;;;OAKG;IACH,OAAO,CAAC,CAAC,SAAS,OAAO,GAAG,KAAK,EAC/B,OAAO,CAAC,EAAE,cAAc,GAAG;QAAE,gBAAgB,CAAC,EAAE,CAAC,CAAA;KAAE,GAClD,OAAO,CAAC,oBAAoB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IA8D5C;;;;OAIG;IACH,GAAG,CAAC,CAAC,SAAS,OAAO,GAAG,KAAK,EAC3B,OAAO,CAAC,EAAE,cAAc,GAAG;QAAE,gBAAgB,CAAC,EAAE,CAAC,CAAA;KAAE;IAKrD;;;;OAIG;IACH,EAAE,CAAC,CAAC,SAAS,OAAO,GAAG,KAAK,EAC1B,OAAO,CAAC,EAAE,cAAc,GAAG;QAAE,gBAAgB,CAAC,EAAE,CAAC,CAAA;KAAE;CAItD"}
@@ -4,7 +4,7 @@ import { CrudMethods, SupastashQuery, SupastashQueryResult } from "../../../type
4
4
  * @param state - The state of the query
5
5
  * @returns The result of the query
6
6
  */
7
- export declare function queryDb<T extends CrudMethods, U extends boolean, V extends boolean, R>(state: SupastashQuery<T, U, R> & {
7
+ export declare function queryDb<T extends CrudMethods, U extends boolean, V extends boolean, R, Z>(state: SupastashQuery<T, U, R> & {
8
8
  viewRemoteResult: V;
9
- }): Promise<SupastashQueryResult<T, U, V, R>>;
9
+ }): Promise<SupastashQueryResult<T, U, V, Z>>;
10
10
  //# sourceMappingURL=mainQuery.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mainQuery.d.ts","sourceRoot":"","sources":["../../../../src/utils/query/builder/mainQuery.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EAGX,cAAc,EACd,oBAAoB,EACrB,MAAM,4BAA4B,CAAC;AAUpC;;;;GAIG;AACH,wBAAsB,OAAO,CAC3B,CAAC,SAAS,WAAW,EACrB,CAAC,SAAS,OAAO,EACjB,CAAC,SAAS,OAAO,EACjB,CAAC,EAED,KAAK,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG;IAAE,gBAAgB,EAAE,CAAC,CAAA;CAAE,GACvD,OAAO,CAAC,oBAAoB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CA2E3C"}
1
+ {"version":3,"file":"mainQuery.d.ts","sourceRoot":"","sources":["../../../../src/utils/query/builder/mainQuery.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EAGX,cAAc,EACd,oBAAoB,EACrB,MAAM,4BAA4B,CAAC;AAUpC;;;;GAIG;AACH,wBAAsB,OAAO,CAC3B,CAAC,SAAS,WAAW,EACrB,CAAC,SAAS,OAAO,EACjB,CAAC,SAAS,OAAO,EACjB,CAAC,EACD,CAAC,EAED,KAAK,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG;IAAE,gBAAgB,EAAE,CAAC,CAAA;CAAE,GACvD,OAAO,CAAC,oBAAoB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CA2E3C"}
@@ -10,7 +10,7 @@ export async function queryDb(state) {
10
10
  let localData = null;
11
11
  try {
12
12
  validateQuery(state);
13
- const { method, isSingle, viewRemoteResult, table } = state;
13
+ const { method, isSingle, viewRemoteResult, table, type } = state;
14
14
  validatePayloadForSingleInsert(method, isSingle, state.payload, table);
15
15
  const updatedPayload = method === "insert" ? assignInsertIds(state.payload) : state.payload;
16
16
  const updatedState = {
@@ -35,7 +35,7 @@ export async function queryDb(state) {
35
35
  });
36
36
  }
37
37
  return Promise.resolve({
38
- data: localData ?? null,
38
+ data: type === "remoteOnly" ? remoteResult?.data : localData ?? null,
39
39
  error: commonError ?? null,
40
40
  success,
41
41
  });
@@ -11,5 +11,5 @@ import { CrudMethods, FilterCalls, MethodReturnTypeMap, SyncMode } from "../../.
11
11
  * @param isSingle - Whether to return a single row or multiple rows
12
12
  * @returns query
13
13
  */
14
- export default function getLocalMethod<T extends CrudMethods, U extends boolean, R>(table: string, method: T, select: string | null, payload: R | R[] | null, filters: FilterCalls[] | null, limit: number | null, isSingle: U, syncMode?: SyncMode): () => Promise<MethodReturnTypeMap<U, R>[T]>;
14
+ export default function getLocalMethod<T extends CrudMethods, U extends boolean, R, Z>(table: string, method: T, select: string | null, payload: R | R[] | null, filters: FilterCalls[] | null, limit: number | null, isSingle: U, syncMode?: SyncMode): () => Promise<MethodReturnTypeMap<U, Z>[T]>;
15
15
  //# sourceMappingURL=getLocalMethod.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"getLocalMethod.d.ts","sourceRoot":"","sources":["../../../../../src/utils/query/helpers/localDb/getLocalMethod.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,WAAW,EAEX,mBAAmB,EACnB,QAAQ,EACT,MAAM,+BAA+B,CAAC;AASvC;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,OAAO,UAAU,cAAc,CACpC,CAAC,SAAS,WAAW,EACrB,CAAC,SAAS,OAAO,EACjB,CAAC,EAED,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,CAAC,EACT,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,EACvB,OAAO,EAAE,WAAW,EAAE,GAAG,IAAI,EAC7B,KAAK,EAAE,MAAM,GAAG,IAAI,EACpB,QAAQ,EAAE,CAAC,EACX,QAAQ,CAAC,EAAE,QAAQ,GAClB,MAAM,OAAO,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAgB7C"}
1
+ {"version":3,"file":"getLocalMethod.d.ts","sourceRoot":"","sources":["../../../../../src/utils/query/helpers/localDb/getLocalMethod.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,WAAW,EAEX,mBAAmB,EACnB,QAAQ,EACT,MAAM,+BAA+B,CAAC;AASvC;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,OAAO,UAAU,cAAc,CACpC,CAAC,SAAS,WAAW,EACrB,CAAC,SAAS,OAAO,EACjB,CAAC,EACD,CAAC,EAED,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,CAAC,EACT,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,EACvB,OAAO,EAAE,WAAW,EAAE,GAAG,IAAI,EAC7B,KAAK,EAAE,MAAM,GAAG,IAAI,EACpB,QAAQ,EAAE,CAAC,EACX,QAAQ,CAAC,EAAE,QAAQ,GAClB,MAAM,OAAO,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAuB7C"}
@@ -15,7 +15,7 @@ export default function getLocalMethod(table, method, select, payload, filters,
15
15
  const handlers = {
16
16
  select: buildSelect(table, select, filters, limit, isSingle),
17
17
  insert: buildInsert(table, payload, syncMode, isSingle),
18
- update: buildUpdate(table, payload, filters, syncMode),
18
+ update: buildUpdate(table, payload, filters, syncMode, isSingle),
19
19
  delete: buildDelete(table, filters, syncMode),
20
20
  upsert: buildUpsert(table, payload, syncMode, isSingle),
21
21
  none: async () => null,
@@ -9,7 +9,7 @@ import { FilterCalls, SyncMode } from "../../../../types/query.types";
9
9
  * @param isSingle - Whether to return a single row or multiple rows
10
10
  * @returns query
11
11
  */
12
- export declare function buildSelect<T extends boolean>(table: string, select: string | null, filters: FilterCalls[] | null, limit: number | null, isSingle: T): () => Promise<T extends true ? import("../../../../types/query.types").SupastashResult<any> : import("../../../../types/query.types").SupastashResult<any[]>>;
12
+ export declare function buildSelect<T extends boolean, R, Z>(table: string, select: string | null, filters: FilterCalls[] | null, limit: number | null, isSingle: T): () => Promise<T extends true ? import("../../../../types/query.types").PayloadResult<Z> : import("../../../../types/query.types").PayloadListResult<Z>>;
13
13
  /**
14
14
  * Builds an insert query
15
15
  *
@@ -17,18 +17,18 @@ export declare function buildSelect<T extends boolean>(table: string, select: st
17
17
  * @param payload - The payload to insert
18
18
  * @returns query
19
19
  */
20
- export declare function buildInsert<T extends boolean, R>(table: string, payload: R | R[] | null, syncMode?: SyncMode, isSingle?: T): () => Promise<T extends true ? import("../../../../types/query.types").PayloadResult<R> : import("../../../../types/query.types").PayloadListResult<R>>;
20
+ export declare function buildInsert<T extends boolean, R, Z>(table: string, payload: R | R[] | null, syncMode?: SyncMode, isSingle?: T): () => Promise<T extends true ? import("../../../../types/query.types").PayloadResult<Z> : import("../../../../types/query.types").PayloadListResult<Z>>;
21
21
  /**
22
22
  * Builds an update query
23
23
  *
24
24
  * @returns query
25
25
  */
26
- export declare function buildUpdate<R>(table: string, payload: R | null, filters: FilterCalls[] | null, syncMode?: SyncMode): () => Promise<import("../../../../types/query.types").PayloadListResult<R>>;
26
+ export declare function buildUpdate<T extends boolean, R, Z>(table: string, payload: R | null, filters: FilterCalls[] | null, syncMode?: SyncMode, isSingle?: T): () => Promise<T extends true ? import("../../../../types/query.types").PayloadResult<Z> : import("../../../../types/query.types").PayloadListResult<Z>>;
27
27
  /**
28
28
  * Builds a delete query
29
29
  *
30
30
  * @returns query
31
31
  */
32
- export declare function buildDelete(table: string, filters: FilterCalls[] | null, syncMode?: SyncMode): () => Promise<import("../../../../types/query.types").SupatashDeleteResult<any>>;
33
- export declare function buildUpsert<T extends boolean, R>(table: string, payload: R | R[] | null, syncMode?: SyncMode, isSingle?: T): () => Promise<T extends true ? import("../../../../types/query.types").PayloadResult<R> : import("../../../../types/query.types").PayloadListResult<R>>;
32
+ export declare function buildDelete<Z = any>(table: string, filters: FilterCalls[] | null, syncMode?: SyncMode): () => Promise<import("../../../../types/query.types").SupatashDeleteResult<Z>>;
33
+ export declare function buildUpsert<T extends boolean, R, Z>(table: string, payload: R | R[] | null, syncMode?: SyncMode, isSingle?: T): () => Promise<T extends true ? import("../../../../types/query.types").PayloadResult<Z> : import("../../../../types/query.types").PayloadListResult<Z>>;
34
34
  //# sourceMappingURL=localQueryBuilder.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"localQueryBuilder.d.ts","sourceRoot":"","sources":["../../../../../src/utils/query/helpers/localDb/localQueryBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAOtE;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,OAAO,EAC3C,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,OAAO,EAAE,WAAW,EAAE,GAAG,IAAI,EAC7B,KAAK,EAAE,MAAM,GAAG,IAAI,EACpB,QAAQ,EAAE,CAAC,iKAIZ;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC,EAC9C,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,EACvB,QAAQ,CAAC,EAAE,QAAQ,EACnB,QAAQ,CAAC,EAAE,CAAC,2JASb;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAC3B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,CAAC,GAAG,IAAI,EACjB,OAAO,EAAE,WAAW,EAAE,GAAG,IAAI,EAC7B,QAAQ,CAAC,EAAE,QAAQ,+EAGpB;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,WAAW,EAAE,GAAG,IAAI,EAC7B,QAAQ,CAAC,EAAE,QAAQ,oFAGpB;AAED,wBAAgB,WAAW,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC,EAC9C,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,EACvB,QAAQ,CAAC,EAAE,QAAQ,EACnB,QAAQ,CAAC,EAAE,CAAC,2JAGb"}
1
+ {"version":3,"file":"localQueryBuilder.d.ts","sourceRoot":"","sources":["../../../../../src/utils/query/helpers/localDb/localQueryBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAOtE;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC,EAAE,CAAC,EACjD,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,OAAO,EAAE,WAAW,EAAE,GAAG,IAAI,EAC7B,KAAK,EAAE,MAAM,GAAG,IAAI,EACpB,QAAQ,EAAE,CAAC,2JAIZ;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC,EAAE,CAAC,EACjD,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,EACvB,QAAQ,CAAC,EAAE,QAAQ,EACnB,QAAQ,CAAC,EAAE,CAAC,2JASb;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC,EAAE,CAAC,EACjD,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,CAAC,GAAG,IAAI,EACjB,OAAO,EAAE,WAAW,EAAE,GAAG,IAAI,EAC7B,QAAQ,CAAC,EAAE,QAAQ,EACnB,QAAQ,CAAC,EAAE,CAAC,2JAIb;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,CAAC,GAAG,GAAG,EACjC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,WAAW,EAAE,GAAG,IAAI,EAC7B,QAAQ,CAAC,EAAE,QAAQ,kFAGpB;AAED,wBAAgB,WAAW,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC,EAAE,CAAC,EACjD,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,EACvB,QAAQ,CAAC,EAAE,QAAQ,EACnB,QAAQ,CAAC,EAAE,CAAC,2JAIb"}
@@ -36,8 +36,8 @@ export function buildInsert(table, payload, syncMode, isSingle) {
36
36
  *
37
37
  * @returns query
38
38
  */
39
- export function buildUpdate(table, payload, filters, syncMode) {
40
- return async () => await updateData(table, payload, filters, syncMode);
39
+ export function buildUpdate(table, payload, filters, syncMode, isSingle) {
40
+ return async () => await updateData(table, payload, filters, syncMode, isSingle);
41
41
  }
42
42
  /**
43
43
  * Builds a delete query
@@ -2,11 +2,11 @@ import { PostgrestError } from "@supabase/supabase-js";
2
2
  import { CrudMethods, MethodReturnTypeMap, SupabaseQueryReturn, SupastashQuery } from "../../../types/query.types";
3
3
  export declare function validatePayloadForSingleInsert(method: CrudMethods, isSingle: boolean, payload: unknown, table: string): void;
4
4
  export declare function assignInsertIds<R>(payload: R | R[] | null): R | R[] | null | undefined;
5
- export declare function getCommonError<U extends boolean, T extends CrudMethods, R>(table: string, method: CrudMethods, localResult: MethodReturnTypeMap<U, R>[T] | null, remoteResult: SupabaseQueryReturn<U, R> | null): (Error & {
5
+ export declare function getCommonError<U extends boolean, T extends CrudMethods, R, Z>(table: string, method: CrudMethods, localResult: MethodReturnTypeMap<U, Z>[T] | null, remoteResult: SupabaseQueryReturn<U, Z> | null): (Error & {
6
6
  supabaseError?: PostgrestError;
7
7
  }) | null;
8
- export declare function runSyncStrategy<T extends CrudMethods, U extends boolean, R>(state: SupastashQuery<T, U, R>): Promise<{
9
- localResult: MethodReturnTypeMap<U, R>[T] | null;
10
- remoteResult: SupabaseQueryReturn<U, R> | null;
8
+ export declare function runSyncStrategy<T extends CrudMethods, U extends boolean, R, Z>(state: SupastashQuery<T, U, R>): Promise<{
9
+ localResult: MethodReturnTypeMap<U, Z>[T] | null;
10
+ remoteResult: SupabaseQueryReturn<U, Z> | null;
11
11
  }>;
12
12
  //# sourceMappingURL=mainQueryHelpers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mainQueryHelpers.d.ts","sourceRoot":"","sources":["../../../../src/utils/query/helpers/mainQueryHelpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,mBAAmB,EACnB,cAAc,EACf,MAAM,4BAA4B,CAAC;AAOpC,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,WAAW,EACnB,QAAQ,EAAE,OAAO,EACjB,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,MAAM,GACZ,IAAI,CAUN;AAED,wBAAgB,eAAe,CAAC,CAAC,EAC/B,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,GACtB,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,GAAG,SAAS,CAc5B;AAED,wBAAgB,cAAc,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC,SAAS,WAAW,EAAE,CAAC,EACxE,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,WAAW,EACnB,WAAW,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,EAChD,YAAY,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,GAC7C,CAAC,KAAK,GAAG;IAAE,aAAa,CAAC,EAAE,cAAc,CAAA;CAAE,CAAC,GAAG,IAAI,CAwBrD;AAqGD,wBAAsB,eAAe,CACnC,CAAC,SAAS,WAAW,EACrB,CAAC,SAAS,OAAO,EACjB,CAAC,EAED,KAAK,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAC7B,OAAO,CAAC;IACT,WAAW,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IACjD,YAAY,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;CAChD,CAAC,CA2CD"}
1
+ {"version":3,"file":"mainQueryHelpers.d.ts","sourceRoot":"","sources":["../../../../src/utils/query/helpers/mainQueryHelpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,mBAAmB,EACnB,cAAc,EACf,MAAM,4BAA4B,CAAC;AAOpC,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,WAAW,EACnB,QAAQ,EAAE,OAAO,EACjB,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,MAAM,GACZ,IAAI,CAUN;AAED,wBAAgB,eAAe,CAAC,CAAC,EAC/B,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,GACtB,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,GAAG,SAAS,CAc5B;AAED,wBAAgB,cAAc,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC,SAAS,WAAW,EAAE,CAAC,EAAE,CAAC,EAC3E,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,WAAW,EACnB,WAAW,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,EAChD,YAAY,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,GAC7C,CAAC,KAAK,GAAG;IAAE,aAAa,CAAC,EAAE,cAAc,CAAA;CAAE,CAAC,GAAG,IAAI,CAwBrD;AAqGD,wBAAsB,eAAe,CACnC,CAAC,SAAS,WAAW,EACrB,CAAC,SAAS,OAAO,EACjB,CAAC,EACD,CAAC,EAED,KAAK,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAC7B,OAAO,CAAC;IACT,WAAW,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IACjD,YAAY,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;CAChD,CAAC,CA2CD"}
@@ -1 +1 @@
1
- {"version":3,"file":"queryValidator.d.ts","sourceRoot":"","sources":["../../../../src/utils/query/helpers/queryValidator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAEzE;;;GAGG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,WAAW,EAAE,CAAC,SAAS,OAAO,EAAE,CAAC,EACvE,KAAK,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,QAkC/B"}
1
+ {"version":3,"file":"queryValidator.d.ts","sourceRoot":"","sources":["../../../../src/utils/query/helpers/queryValidator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAEzE;;;GAGG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,WAAW,EAAE,CAAC,SAAS,OAAO,EAAE,CAAC,EACvE,KAAK,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,QA4C/B"}
@@ -15,6 +15,12 @@ export function validateQuery(state) {
15
15
  if (state.method === "update" && !state.payload) {
16
16
  throw new Error("No data was added to update query");
17
17
  }
18
+ if (state.method === "update" &&
19
+ state.payload &&
20
+ Array.isArray(state.payload) &&
21
+ state.payload.length > 1) {
22
+ throw new Error("Payload must be a single object for update query. Use upsert for multiple rows.");
23
+ }
18
24
  if ((state.method === "delete" || state.method === "update") &&
19
25
  (!state.filters || state.filters.length === 0)) {
20
26
  throw new Error(`
@@ -5,7 +5,7 @@ import { FilterCalls, SupatashDeleteResult, SyncMode } from "../../../types/quer
5
5
  * @param filters - The filters to apply to the delete query
6
6
  * @returns The result of the delete query
7
7
  */
8
- export declare function deleteData<R = any>(table: string, filters: FilterCalls[] | null, syncMode?: SyncMode): Promise<SupatashDeleteResult<R>>;
8
+ export declare function deleteData<Z = any>(table: string, filters: FilterCalls[] | null, syncMode?: SyncMode): Promise<SupatashDeleteResult<Z>>;
9
9
  /**
10
10
  * Hard delete: Permanently removes a row by its `id`.
11
11
  * @param table - The name of the table to delete from
@@ -4,5 +4,5 @@ import { CrudMethods, MethodReturnTypeMap, SupastashQuery } from "../../../types
4
4
  * @param state - The state of the query
5
5
  * @returns The result of the query
6
6
  */
7
- export declare function queryLocalDb<T extends CrudMethods, U extends boolean, R>(state: SupastashQuery<T, U, R>): Promise<MethodReturnTypeMap<U, R>[T]>;
7
+ export declare function queryLocalDb<T extends CrudMethods, U extends boolean, R, Z>(state: SupastashQuery<T, U, R>): Promise<MethodReturnTypeMap<U, Z>[T]>;
8
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/utils/query/localDbQuery/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,cAAc,EACf,MAAM,4BAA4B,CAAC;AAGpC;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,CAAC,SAAS,WAAW,EAAE,CAAC,SAAS,OAAO,EAAE,CAAC,EAC5E,KAAK,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAC7B,OAAO,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAoBvC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/utils/query/localDbQuery/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,cAAc,EACf,MAAM,4BAA4B,CAAC;AAGpC;;;;GAIG;AACH,wBAAsB,YAAY,CAChC,CAAC,SAAS,WAAW,EACrB,CAAC,SAAS,OAAO,EACjB,CAAC,EACD,CAAC,EACD,KAAK,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAoBvE"}
@@ -6,5 +6,5 @@ import { PayloadListResult, PayloadResult, SyncMode } from "../../../types/query
6
6
  * @param payload - The payload to insert
7
7
  * @returns a data / error object
8
8
  */
9
- export declare function insertData<T extends boolean, R>(table: string, payload: R[] | null, syncMode?: SyncMode, isSingle?: T): Promise<T extends true ? PayloadResult<R> : PayloadListResult<R>>;
9
+ export declare function insertData<T extends boolean, R, Z>(table: string, payload: R[] | null, syncMode?: SyncMode, isSingle?: T): Promise<T extends true ? PayloadResult<Z> : PayloadListResult<Z>>;
10
10
  //# sourceMappingURL=insert.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"insert.d.ts","sourceRoot":"","sources":["../../../../src/utils/query/localDbQuery/insert.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,iBAAiB,EACjB,aAAa,EACb,QAAQ,EACT,MAAM,4BAA4B,CAAC;AAIpC;;;;;;GAMG;AACH,wBAAsB,UAAU,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC,EACnD,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,CAAC,EAAE,GAAG,IAAI,EACnB,QAAQ,CAAC,EAAE,QAAQ,EACnB,QAAQ,CAAC,EAAE,CAAC,GACX,OAAO,CAAC,CAAC,SAAS,IAAI,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC,CA6EnE"}
1
+ {"version":3,"file":"insert.d.ts","sourceRoot":"","sources":["../../../../src/utils/query/localDbQuery/insert.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,iBAAiB,EACjB,aAAa,EACb,QAAQ,EACT,MAAM,4BAA4B,CAAC;AAKpC;;;;;;GAMG;AACH,wBAAsB,UAAU,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC,EAAE,CAAC,EACtD,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,CAAC,EAAE,GAAG,IAAI,EACnB,QAAQ,CAAC,EAAE,QAAQ,EACnB,QAAQ,CAAC,EAAE,CAAC,GACX,OAAO,CAAC,CAAC,SAAS,IAAI,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC,CA6EnE"}
@@ -1,5 +1,6 @@
1
1
  import { getSupastashDb } from "../../../db/dbInitializer";
2
2
  import { getSafeValue } from "../../serializer";
3
+ import { parseStringifiedFields } from "../../sync/pushLocal/parseFields";
3
4
  import { assertTableExists } from "../../tableValidator";
4
5
  /**
5
6
  * Inserts data locally, sets synced_at to null pending update to remote server
@@ -44,7 +45,7 @@ export async function insertData(table, payload, syncMode, isSingle) {
44
45
  await db.runAsync(`INSERT INTO ${table} (${cols}) VALUES (${placeholders})`, values);
45
46
  const insertedRow = await db.getFirstAsync(`SELECT * FROM ${table} WHERE id = ?`, [newPayload.id]);
46
47
  if (insertedRow) {
47
- inserted.push(insertedRow);
48
+ inserted.push(parseStringifiedFields(insertedRow));
48
49
  }
49
50
  }
50
51
  return {
@@ -1,4 +1,4 @@
1
- import { FilterCalls, PayloadData, SupastashResult } from "../../../types/query.types";
1
+ import { FilterCalls, PayloadListResult, PayloadResult } from "../../../types/query.types";
2
2
  /**
3
3
  * Selects one or many rows from the local database.
4
4
  *
@@ -9,5 +9,5 @@ import { FilterCalls, PayloadData, SupastashResult } from "../../../types/query.
9
9
  * @param isSingle - Whether to return a single row or multiple rows
10
10
  * @returns a data / error object
11
11
  */
12
- export declare function selectData<T extends boolean>(table: string, select: string, filters: FilterCalls[] | null, limit: number | null, isSingle: T): Promise<T extends true ? SupastashResult<PayloadData> : SupastashResult<PayloadData[]>>;
12
+ export declare function selectData<T extends boolean, R, Z>(table: string, select: string, filters: FilterCalls[] | null, limit: number | null, isSingle: T): Promise<T extends true ? PayloadResult<Z> : PayloadListResult<Z>>;
13
13
  //# sourceMappingURL=select.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../../../../src/utils/query/localDbQuery/select.ts"],"names":[],"mappings":"AACA,OAAO,EACL,WAAW,EACX,WAAW,EACX,eAAe,EAChB,MAAM,4BAA4B,CAAC;AAIpC;;;;;;;;;GASG;AACH,wBAAsB,UAAU,CAAC,CAAC,SAAS,OAAO,EAChD,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,WAAW,EAAE,GAAG,IAAI,EAC7B,KAAK,EAAE,MAAM,GAAG,IAAI,EACpB,QAAQ,EAAE,CAAC,GACV,OAAO,CACR,CAAC,SAAS,IAAI,GAAG,eAAe,CAAC,WAAW,CAAC,GAAG,eAAe,CAAC,WAAW,EAAE,CAAC,CAC/E,CAoCA"}
1
+ {"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../../../../src/utils/query/localDbQuery/select.ts"],"names":[],"mappings":"AACA,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,aAAa,EACd,MAAM,4BAA4B,CAAC;AAKpC;;;;;;;;;GASG;AACH,wBAAsB,UAAU,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC,EAAE,CAAC,EACtD,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,WAAW,EAAE,GAAG,IAAI,EAC7B,KAAK,EAAE,MAAM,GAAG,IAAI,EACpB,QAAQ,EAAE,CAAC,GACV,OAAO,CAAC,CAAC,SAAS,IAAI,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAoCnE"}
@@ -1,4 +1,5 @@
1
1
  import { getSupastashDb } from "../../../db/dbInitializer";
2
+ import { parseStringifiedFields } from "../../sync/pushLocal/parseFields";
2
3
  import { assertTableExists } from "../../tableValidator";
3
4
  import { buildWhereClause } from "../helpers/remoteDb/queryFilterBuilder";
4
5
  /**
@@ -22,10 +23,12 @@ export async function selectData(table, select, filters, limit, isSingle) {
22
23
  const db = await getSupastashDb();
23
24
  let data;
24
25
  if (isSingle) {
25
- data = await db.getFirstAsync(query, filterValues);
26
+ const result = await db.getFirstAsync(query, filterValues);
27
+ data = result ? parseStringifiedFields(result) : null;
26
28
  }
27
29
  else {
28
- data = await db.getAllAsync(query, filterValues);
30
+ const result = await db.getAllAsync(query, filterValues);
31
+ data = Array.isArray(result) ? result.map(parseStringifiedFields) : [];
29
32
  }
30
33
  return { data, error: null };
31
34
  }
@@ -1,4 +1,4 @@
1
- import { FilterCalls, PayloadListResult, SyncMode } from "../../../types/query.types";
1
+ import { FilterCalls, PayloadListResult, PayloadResult, SyncMode } from "../../../types/query.types";
2
2
  /**
3
3
  * Updates data locally, sets synced_at to null pending update to remote server
4
4
  *
@@ -7,5 +7,5 @@ import { FilterCalls, PayloadListResult, SyncMode } from "../../../types/query.t
7
7
  * @param filters - The filters to apply to the update query
8
8
  * @returns a data / error object
9
9
  */
10
- export declare function updateData<R>(table: string, payload: R | null, filters: FilterCalls[] | null, syncMode?: SyncMode): Promise<PayloadListResult<R>>;
10
+ export declare function updateData<T extends boolean, R, Z>(table: string, payload: R | null, filters: FilterCalls[] | null, syncMode?: SyncMode, isSingle?: T): Promise<T extends true ? PayloadResult<Z> : PayloadListResult<Z>>;
11
11
  //# sourceMappingURL=update.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../../src/utils/query/localDbQuery/update.ts"],"names":[],"mappings":"AACA,OAAO,EACL,WAAW,EAEX,iBAAiB,EACjB,QAAQ,EACT,MAAM,4BAA4B,CAAC;AAKpC;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAAC,CAAC,EAChC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,CAAC,GAAG,IAAI,EACjB,OAAO,EAAE,WAAW,EAAE,GAAG,IAAI,EAC7B,QAAQ,CAAC,EAAE,QAAQ,GAClB,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAwD/B"}
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../../src/utils/query/localDbQuery/update.ts"],"names":[],"mappings":"AACA,OAAO,EACL,WAAW,EAEX,iBAAiB,EACjB,aAAa,EACb,QAAQ,EACT,MAAM,4BAA4B,CAAC;AAMpC;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC,EAAE,CAAC,EACtD,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,CAAC,GAAG,IAAI,EACjB,OAAO,EAAE,WAAW,EAAE,GAAG,IAAI,EAC7B,QAAQ,CAAC,EAAE,QAAQ,EACnB,QAAQ,CAAC,EAAE,CAAC,GACX,OAAO,CAAC,CAAC,SAAS,IAAI,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAoEnE"}
@@ -1,4 +1,5 @@
1
1
  import { getSupastashDb } from "../../../db/dbInitializer";
2
+ import { parseStringifiedFields } from "../../../utils/sync/pushLocal/parseFields";
2
3
  import { getSafeValue } from "../../serializer";
3
4
  import { assertTableExists } from "../../tableValidator";
4
5
  import { buildWhereClause } from "../helpers/remoteDb/queryFilterBuilder";
@@ -10,7 +11,7 @@ import { buildWhereClause } from "../helpers/remoteDb/queryFilterBuilder";
10
11
  * @param filters - The filters to apply to the update query
11
12
  * @returns a data / error object
12
13
  */
13
- export async function updateData(table, payload, filters, syncMode) {
14
+ export async function updateData(table, payload, filters, syncMode, isSingle) {
14
15
  if (!payload)
15
16
  throw new Error(`Payload data was not provided for an update call on ${table}`);
16
17
  if (!table)
@@ -42,7 +43,17 @@ export async function updateData(table, payload, filters, syncMode) {
42
43
  ...filterValues,
43
44
  ]);
44
45
  const updatedRow = await db.getAllAsync(`SELECT * FROM ${table} ${clause}`, filterValues);
45
- return { error: null, data: updatedRow };
46
+ const result = isSingle && updatedRow
47
+ ? parseStringifiedFields(updatedRow?.[0])
48
+ : !updatedRow
49
+ ? isSingle
50
+ ? null
51
+ : []
52
+ : updatedRow?.map(parseStringifiedFields);
53
+ return {
54
+ error: null,
55
+ data: result,
56
+ };
46
57
  }
47
58
  catch (error) {
48
59
  console.error(`[Supastash] ${error}`);
@@ -5,5 +5,5 @@ import { PayloadListResult, PayloadResult, SyncMode } from "../../../types/query
5
5
  * - Otherwise, it is inserted.
6
6
  * Returns all the rows that were upserted.
7
7
  */
8
- export declare function upsertData<T extends boolean, R>(table: string, payload: R | R[] | null, syncMode?: SyncMode, isSingle?: T): Promise<T extends true ? PayloadResult<R> : PayloadListResult<R>>;
8
+ export declare function upsertData<T extends boolean, R, Z>(table: string, payload: R | R[] | null, syncMode?: SyncMode, isSingle?: T): Promise<T extends true ? PayloadResult<Z> : PayloadListResult<Z>>;
9
9
  //# sourceMappingURL=upsert.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"upsert.d.ts","sourceRoot":"","sources":["../../../../src/utils/query/localDbQuery/upsert.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,iBAAiB,EACjB,aAAa,EACb,QAAQ,EACT,MAAM,4BAA4B,CAAC;AAIpC;;;;;GAKG;AACH,wBAAsB,UAAU,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC,EACnD,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,EACvB,QAAQ,CAAC,EAAE,QAAQ,EACnB,QAAQ,CAAC,EAAE,CAAC,GACX,OAAO,CAAC,CAAC,SAAS,IAAI,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAqEnE"}
1
+ {"version":3,"file":"upsert.d.ts","sourceRoot":"","sources":["../../../../src/utils/query/localDbQuery/upsert.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,iBAAiB,EACjB,aAAa,EACb,QAAQ,EACT,MAAM,4BAA4B,CAAC;AAKpC;;;;;GAKG;AACH,wBAAsB,UAAU,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC,EAAE,CAAC,EACtD,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,EACvB,QAAQ,CAAC,EAAE,QAAQ,EACnB,QAAQ,CAAC,EAAE,CAAC,GACX,OAAO,CAAC,CAAC,SAAS,IAAI,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAqEnE"}
@@ -1,5 +1,6 @@
1
1
  import { getSupastashDb } from "../../../db/dbInitializer";
2
2
  import { getSafeValue } from "../../serializer";
3
+ import { parseStringifiedFields } from "../../sync/pushLocal/parseFields";
3
4
  import { assertTableExists } from "../../tableValidator";
4
5
  /**
5
6
  * Performs upsert-like logic on local DB:
@@ -48,7 +49,7 @@ export async function upsertData(table, payload, syncMode, isSingle) {
48
49
  }
49
50
  const updated = await db.getFirstAsync(`SELECT * FROM ${table} WHERE id = ?`, [item.id]);
50
51
  if (updated)
51
- upserted.push(updated);
52
+ upserted.push(parseStringifiedFields(updated));
52
53
  }
53
54
  return {
54
55
  error: null,
@@ -4,5 +4,5 @@ import { CrudMethods, SupabaseQueryReturn, SupastashQuery } from "../../../types
4
4
  * @param state - The state of the query
5
5
  * @returns The result of the query
6
6
  */
7
- export declare function querySupabase<T extends boolean, R>(state: SupastashQuery<CrudMethods, T, R>, isBatched?: boolean): Promise<SupabaseQueryReturn<T, R>>;
7
+ export declare function querySupabase<T extends boolean, R, Z>(state: SupastashQuery<CrudMethods, T, R>, isBatched?: boolean): Promise<SupabaseQueryReturn<T, Z>>;
8
8
  //# sourceMappingURL=supabaseQuery.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"supabaseQuery.d.ts","sourceRoot":"","sources":["../../../../src/utils/query/remoteQuery/supabaseQuery.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,cAAc,EACf,MAAM,4BAA4B,CAAC;AAMpC;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC,EACtD,KAAK,EAAE,cAAc,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC,EACxC,SAAS,UAAQ,GAChB,OAAO,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAoIpC"}
1
+ {"version":3,"file":"supabaseQuery.d.ts","sourceRoot":"","sources":["../../../../src/utils/query/remoteQuery/supabaseQuery.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,cAAc,EACf,MAAM,4BAA4B,CAAC;AAMpC;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC,EAAE,CAAC,EACzD,KAAK,EAAE,cAAc,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC,EACxC,SAAS,UAAQ,GAChB,OAAO,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAoIpC"}
@@ -1 +1 @@
1
- {"version":3,"file":"getAllUnsyncedData.d.ts","sourceRoot":"","sources":["../../../../src/utils/sync/pushLocal/getAllUnsyncedData.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AA+DzD;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,CAe/B;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,CAM/B"}
1
+ {"version":3,"file":"getAllUnsyncedData.d.ts","sourceRoot":"","sources":["../../../../src/utils/sync/pushLocal/getAllUnsyncedData.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAqEzD;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,CAe/B;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,CAM/B"}
@@ -1,5 +1,6 @@
1
1
  import { getSupastashConfig } from "../../../core/config";
2
2
  import { getSupastashDb } from "../../../db/dbInitializer";
3
+ import { tableSchemaData } from "../../../store/tableSchemaData";
3
4
  import { getTableSchema } from "../../../utils/getTableSchema";
4
5
  import log from "../../../utils/logs";
5
6
  import { supabaseClientErr } from "../../supabaseClientErr";
@@ -17,15 +18,21 @@ async function getRemoteKeys(table) {
17
18
  if (numberOfErrors.get(table) && (numberOfErrors.get(table) || 0) > 3) {
18
19
  return null;
19
20
  }
20
- const { data, error } = await supabase.rpc("get_column_names", {
21
- table_name: table,
22
- });
23
- if (error) {
24
- log(`[Supastash] Error getting remote keys for table ${table} on public schema: ${error.message}`);
25
- numberOfErrors.set(table, (numberOfErrors.get(table) || 0) + 1);
21
+ if (!tableSchemaData.has(table)) {
22
+ const { data, error } = await supabase.rpc("get_table_schema", {
23
+ table_name: table,
24
+ });
25
+ if (error) {
26
+ log(`[Supastash] Error getting remote keys for table ${table} on public schema: ${error.message}`);
27
+ numberOfErrors.set(table, (numberOfErrors.get(table) || 0) + 1);
28
+ return null;
29
+ }
30
+ tableSchemaData.set(table, data);
31
+ }
32
+ if (!tableSchemaData.get(table)) {
26
33
  return null;
27
34
  }
28
- const keys = data?.map((item) => item.column_name);
35
+ const keys = tableSchemaData.get(table)?.map((item) => item.column_name);
29
36
  const columns = await getTableSchema(table);
30
37
  const sharedKeys = keys?.filter((key) => columns.includes(key));
31
38
  const missingKeys = columns.filter((column) => !keys?.includes(column) && column !== "synced_at");
@@ -9,4 +9,13 @@ export declare function refreshTable(table: string): void;
9
9
  * Use this when you want to update data to UI
10
10
  */
11
11
  export declare function refreshAllTables(): void;
12
+ /**
13
+ * Refreshes a single table with a payload
14
+ * Use this when you want to update data to UI
15
+ * Must be the whole payload, not just the changes
16
+ * @param table - The name of the table to refresh
17
+ * @param payload - The payload to refresh the table with
18
+ * @param operation - The operation to perform on the table
19
+ */
20
+ export declare function refreshTableWithPayload(table: string, payload: any, operation: "insert" | "update" | "delete" | "upsert"): void;
12
21
  //# sourceMappingURL=refreshTables.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"refreshTables.d.ts","sourceRoot":"","sources":["../../../src/utils/sync/refreshTables.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,QASzC;AAMD;;;GAGG;AACH,wBAAgB,gBAAgB,SAE/B"}
1
+ {"version":3,"file":"refreshTables.d.ts","sourceRoot":"","sources":["../../../src/utils/sync/refreshTables.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,QASzC;AAMD;;;GAGG;AACH,wBAAgB,gBAAgB,SAE/B;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,GAAG,EACZ,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,QAGrD"}
@@ -24,6 +24,17 @@ const debouncedRefreshAll = debounce(() => {
24
24
  export function refreshAllTables() {
25
25
  debouncedRefreshAll();
26
26
  }
27
+ /**
28
+ * Refreshes a single table with a payload
29
+ * Use this when you want to update data to UI
30
+ * Must be the whole payload, not just the changes
31
+ * @param table - The name of the table to refresh
32
+ * @param payload - The payload to refresh the table with
33
+ * @param operation - The operation to perform on the table
34
+ */
35
+ export function refreshTableWithPayload(table, payload, operation) {
36
+ supastashEventBus.emit(`push:${table}`, payload, operation);
37
+ }
27
38
  /**
28
39
  * Debounces a function
29
40
  * @param func - The function to debounce
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "supastash",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "type": "module",