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
@@ -1,4 +1,5 @@
1
1
  import { CrudMethods, ExecuteOptions, SupastashQuery, SupastashQueryResult, SyncMode } from "../../../types/query.types";
2
+ type FilterBuilderFor<T extends CrudMethods, U extends boolean, R, Z> = T extends "select" ? SupastashFilterBuilder<T, U, R, Z> : Omit<SupastashFilterBuilder<T, U, R, Z>, "cacheFirst">;
2
3
  /**
3
4
  * Builder for the filter methods
4
5
  * @param T - The method to call
@@ -30,7 +31,7 @@ export default class SupastashFilterBuilder<T extends CrudMethods, U extends boo
30
31
  * @param value - The value to filter by.
31
32
  * @returns more filter options.
32
33
  */
33
- eq(column: string, value: any): SupastashFilterBuilder<T, U, R, Z>;
34
+ eq(column: string, value: any): FilterBuilderFor<T, U, R, Z>;
34
35
  /**
35
36
  * Sets the NEQ operator for the query.
36
37
  *
@@ -38,7 +39,7 @@ export default class SupastashFilterBuilder<T extends CrudMethods, U extends boo
38
39
  * @param value - The value to filter by.
39
40
  * @returns more filter options.
40
41
  */
41
- neq(column: string, value: any): SupastashFilterBuilder<T, U, R, Z>;
42
+ neq(column: string, value: any): FilterBuilderFor<T, U, R, Z>;
42
43
  /**
43
44
  * Sets the GT operator for the query.
44
45
  *
@@ -46,7 +47,7 @@ export default class SupastashFilterBuilder<T extends CrudMethods, U extends boo
46
47
  * @param value - The value to filter by.
47
48
  * @returns more filter options.
48
49
  */
49
- gt(column: string, value: any): SupastashFilterBuilder<T, U, R, Z>;
50
+ gt(column: string, value: any): FilterBuilderFor<T, U, R, Z>;
50
51
  /**
51
52
  * Sets the LT operator for the query.
52
53
  *
@@ -54,7 +55,7 @@ export default class SupastashFilterBuilder<T extends CrudMethods, U extends boo
54
55
  * @param value - The value to filter by.
55
56
  * @returns more filter options.
56
57
  */
57
- lt(column: string, value: any): SupastashFilterBuilder<T, U, R, Z>;
58
+ lt(column: string, value: any): FilterBuilderFor<T, U, R, Z>;
58
59
  /**
59
60
  * Sets the GTE operator for the query.
60
61
  *
@@ -62,7 +63,7 @@ export default class SupastashFilterBuilder<T extends CrudMethods, U extends boo
62
63
  * @param value - The value to filter by.
63
64
  * @returns more filter options.
64
65
  */
65
- gte(column: string, value: any): SupastashFilterBuilder<T, U, R, Z>;
66
+ gte(column: string, value: any): FilterBuilderFor<T, U, R, Z>;
66
67
  /**
67
68
  * Sets the LTE operator for the query.
68
69
  *
@@ -70,7 +71,7 @@ export default class SupastashFilterBuilder<T extends CrudMethods, U extends boo
70
71
  * @param value - The value to filter by.
71
72
  * @returns more filter options.
72
73
  */
73
- lte(column: string, value: any): SupastashFilterBuilder<T, U, R, Z>;
74
+ lte(column: string, value: any): FilterBuilderFor<T, U, R, Z>;
74
75
  /**
75
76
  * Sets the LIKE operator for the query.
76
77
  *
@@ -78,7 +79,7 @@ export default class SupastashFilterBuilder<T extends CrudMethods, U extends boo
78
79
  * @param value - The value to filter by.
79
80
  * @returns more filter options.
80
81
  */
81
- like(column: string, value: any): SupastashFilterBuilder<T, U, R, Z>;
82
+ like(column: string, value: any): FilterBuilderFor<T, U, R, Z>;
82
83
  /**
83
84
  * Sets the IS operator for the query.
84
85
  *
@@ -86,7 +87,7 @@ export default class SupastashFilterBuilder<T extends CrudMethods, U extends boo
86
87
  * @param value - The value to filter by.
87
88
  * @returns more filter options.
88
89
  */
89
- is(column: string, value: any): SupastashFilterBuilder<T, U, R, Z>;
90
+ is(column: string, value: any): FilterBuilderFor<T, U, R, Z>;
90
91
  /**
91
92
  * Sets the IN operator for the query.
92
93
  *
@@ -94,14 +95,14 @@ export default class SupastashFilterBuilder<T extends CrudMethods, U extends boo
94
95
  * @param value - The value to filter by.
95
96
  * @returns more filter options.
96
97
  */
97
- in(column: string, value: any[]): SupastashFilterBuilder<T, U, R, Z>;
98
+ in(column: string, value: any[]): FilterBuilderFor<T, U, R, Z>;
98
99
  /**
99
100
  * Sets the limit of the query.
100
101
  *
101
102
  * @param n - The number of results to return.
102
103
  * @returns more filter options.
103
104
  */
104
- limit(n: number): SupastashFilterBuilder<T, U, R, Z>;
105
+ limit(n: number): FilterBuilderFor<T, U, R, Z>;
105
106
  /**
106
107
  * Returns only one result instead of an array.
107
108
  * Sets `limit(1)` automatically. Fails if more than one result is returned.
@@ -109,20 +110,42 @@ export default class SupastashFilterBuilder<T extends CrudMethods, U extends boo
109
110
  * Similar to Supabase `.single()`.
110
111
  */
111
112
  single(): SupastashFilterBuilder<T, true, R, Z>;
113
+ /**
114
+ * Creates its own SQLite transaction for this insert or upsert.
115
+ *
116
+ * Do not use inside `db.withTransaction(...)` or
117
+ * `supastash.withTransaction(...)` — nested transactions are not allowed.
118
+ */
119
+ withTx(): FilterBuilderFor<T, U, R, Z>;
112
120
  /**
113
121
  * Sets the preserve timestamp of the query.
114
122
  *
115
123
  * @param preserve - Whether to preserve the timestamp.
116
124
  * @returns more filter options.
117
125
  */
118
- preserveTimestamp(preserve: boolean): SupastashFilterBuilder<T, U, R, Z>;
126
+ preserveTimestamp(preserve: boolean): FilterBuilderFor<T, U, R, Z>;
119
127
  /**
120
128
  * Sets the sync mode of the query.
121
129
  *
122
130
  * @param mode - The sync mode to use.
123
131
  * @returns more filter options.
124
132
  */
125
- syncMode(mode: SyncMode): SupastashFilterBuilder<T, U, R, Z>;
133
+ syncMode(mode: SyncMode): FilterBuilderFor<T, U, R, Z>;
134
+ /**
135
+ * Throws an error if the query fails.
136
+ *
137
+ * @returns more filter options.
138
+ */
139
+ throwOnError(): FilterBuilderFor<T, U, R, Z>;
140
+ /**
141
+ * Executes a cache-first fetch strategy.
142
+ *
143
+ * Attempts to resolve the query from the local database.
144
+ * Falls back to the remote database if no usable result is found.
145
+ *
146
+ * @returns Query results from local and/or remote sources.
147
+ */
148
+ cacheFirst(): FilterBuilderFor<T, U, R, Z>;
126
149
  /**
127
150
  * Executes the query.
128
151
  * Must be called after all filters are set.
@@ -149,4 +172,5 @@ export default class SupastashFilterBuilder<T extends CrudMethods, U extends boo
149
172
  viewRemoteResult?: V;
150
173
  }): Promise<SupastashQueryResult<T, U, V, Z>>;
151
174
  }
175
+ export {};
152
176
  //# 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;AAKpC;;;;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,iBAAiB,CAAC,QAAQ,EAAE,OAAO;IAInC;;;;;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;IA4D5C;;;;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;AAKpC,KAAK,gBAAgB,CACnB,CAAC,SAAS,WAAW,EACrB,CAAC,SAAS,OAAO,EACjB,CAAC,EACD,CAAC,IACC,CAAC,SAAS,QAAQ,GAClB,sBAAsB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAClC,IAAI,CAAC,sBAAsB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;AAE3D;;;;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,MAAM;IAUN;;;;;OAKG;IACH,iBAAiB,CAAC,QAAQ,EAAE,OAAO;IAInC;;;;;OAKG;IACH,QAAQ,CAAC,IAAI,EAAE,QAAQ;IAIvB;;;;OAIG;IACH,YAAY;IAIZ;;;;;;;OAOG;IACH,UAAU;IAIV;;;;;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;IA4D5C;;;;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"}
@@ -151,6 +151,19 @@ export default class SupastashFilterBuilder {
151
151
  limit: 1,
152
152
  });
153
153
  }
154
+ /**
155
+ * Creates its own SQLite transaction for this insert or upsert.
156
+ *
157
+ * Do not use inside `db.withTransaction(...)` or
158
+ * `supastash.withTransaction(...)` — nested transactions are not allowed.
159
+ */
160
+ withTx() {
161
+ const isInATx = this.query.txId !== null;
162
+ if (isInATx) {
163
+ throw new Error(`[Supastash] Cannot use \`withTx()\` inside a transaction. Method: ${this.query.method} on table: ${this.query.table}`);
164
+ }
165
+ return this.withQueryPatch({ withTx: true });
166
+ }
154
167
  /**
155
168
  * Sets the preserve timestamp of the query.
156
169
  *
@@ -169,6 +182,25 @@ export default class SupastashFilterBuilder {
169
182
  syncMode(mode) {
170
183
  return this.withQueryPatch({ type: mode });
171
184
  }
185
+ /**
186
+ * Throws an error if the query fails.
187
+ *
188
+ * @returns more filter options.
189
+ */
190
+ throwOnError() {
191
+ return this.withQueryPatch({ throwOnError: true });
192
+ }
193
+ /**
194
+ * Executes a cache-first fetch strategy.
195
+ *
196
+ * Attempts to resolve the query from the local database.
197
+ * Falls back to the remote database if no usable result is found.
198
+ *
199
+ * @returns Query results from local and/or remote sources.
200
+ */
201
+ cacheFirst() {
202
+ return this.withQueryPatch({ fetchPolicy: "localFirst" });
203
+ }
172
204
  /**
173
205
  * Executes the query.
174
206
  * Must be called after all filters are set.
@@ -1,4 +1,4 @@
1
- import { CrudMethods, SupastashQuery } from "../../../types/query.types";
1
+ import { CrudMethods, PayloadData, SupastashQuery } from "../../../types/query.types";
2
2
  import SupastashCrudBuilder from "./crud";
3
3
  /**
4
4
  * Builder for the supastash query
@@ -19,7 +19,34 @@ export declare class SupastashQueryBuilder<T extends CrudMethods, U extends bool
19
19
  * @returns crud options.
20
20
  */
21
21
  from(table: string): SupastashCrudBuilder<T, U, R>;
22
+ /**
23
+ * Executes multiple Supastash operations inside a single SQLite transaction.
24
+ *
25
+ * ⚠️ Do NOT call this inside `db.withTransaction(...)`
26
+ * or another `supastash.withTransaction(...)`.
27
+ * Nested transactions are not supported and will throw.
28
+ *
29
+ * All queries executed using the provided `tx` builder
30
+ * will share the same SQLite transaction and `txId`.
31
+ *
32
+ * If any operation inside the callback throws,
33
+ * the entire transaction is rolled back automatically.
34
+ *
35
+ * Example:
36
+ *
37
+ * await supastash.withTransaction(async (tx) => {
38
+ * await tx.from("orders").insert(order).run();
39
+ * await tx.from("ledger").insert(ledgerEntry).run();
40
+ * });
41
+ *
42
+ *
43
+ * In this example, both inserts succeed or both fail.
44
+ */
45
+ withTransaction(fn: (tx: SupastashTransactionalBuilder<T, U, R>) => Promise<void> | void): Promise<void>;
22
46
  }
47
+ type SupastashTransactionalBuilder<T extends CrudMethods, U extends boolean, R> = Omit<SupastashQueryBuilder<T, U, R>, "withTransaction">;
48
+ export type SupastashTransactionClient = SupastashTransactionalBuilder<CrudMethods, boolean, PayloadData>;
49
+ export type SupastashClient = SupastashTransactionalBuilder<CrudMethods, boolean, PayloadData>;
23
50
  /**
24
51
  * Supastash query builder for local-first CRUD operations.
25
52
  *
@@ -42,4 +69,5 @@ export declare class SupastashQueryBuilder<T extends CrudMethods, U extends bool
42
69
  * .run(); // Required to execute the query
43
70
  */
44
71
  export declare const supastash: SupastashQueryBuilder<CrudMethods, boolean, any>;
72
+ export {};
45
73
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/utils/query/builder/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EAGX,cAAc,EAEf,MAAM,4BAA4B,CAAC;AAEpC,OAAO,oBAAoB,MAAM,QAAQ,CAAC;AAE1C;;;;GAIG;AACH,qBAAa,qBAAqB,CAChC,CAAC,SAAS,WAAW,EACrB,CAAC,SAAS,OAAO,EACjB,CAAC;IAED,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA0B;IAEhD;;;OAGG;gBACS,KAAK,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAI1C;;;;;OAKG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM;CAInB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,SAAS,kDAkBiC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/utils/query/builder/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,WAAW,EAEX,WAAW,EACX,cAAc,EAEf,MAAM,4BAA4B,CAAC;AAGpC,OAAO,oBAAoB,MAAM,QAAQ,CAAC;AAE1C;;;;GAIG;AACH,qBAAa,qBAAqB,CAChC,CAAC,SAAS,WAAW,EACrB,CAAC,SAAS,OAAO,EACjB,CAAC;IAED,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA0B;IAEhD;;;OAGG;gBACS,KAAK,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAI1C;;;;;OAKG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM;IAMlB;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,eAAe,CACb,EAAE,EAAE,CAAC,EAAE,EAAE,6BAA6B,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;CAgD3E;AAED,KAAK,6BAA6B,CAChC,CAAC,SAAS,WAAW,EACrB,CAAC,SAAS,OAAO,EACjB,CAAC,IACC,IAAI,CAAC,qBAAqB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC;AAE5D,MAAM,MAAM,0BAA0B,GAAG,6BAA6B,CACpE,WAAW,EACX,OAAO,EACP,WAAW,CACZ,CAAC;AACF,MAAM,MAAM,eAAe,GAAG,6BAA6B,CACzD,WAAW,EACX,OAAO,EACP,WAAW,CACZ,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,SAAS,kDAyBiC,CAAC"}
@@ -1,4 +1,7 @@
1
+ import { getSupastashDb } from "../../../db/dbInitializer";
2
+ import { txStore } from "../../../store/tx";
1
3
  import { generateUUIDv4 } from "../../genUUID";
4
+ import { queueRemoteCall } from "../helpers/queueRemote";
2
5
  import SupastashCrudBuilder from "./crud";
3
6
  /**
4
7
  * Builder for the supastash query
@@ -20,9 +23,76 @@ export class SupastashQueryBuilder {
20
23
  * @returns crud options.
21
24
  */
22
25
  from(table) {
23
- const newQuery = { ...this.query, table };
26
+ const id = generateUUIDv4();
27
+ const newQuery = { ...this.query, table, id };
24
28
  return new SupastashCrudBuilder(newQuery);
25
29
  }
30
+ /**
31
+ * Executes multiple Supastash operations inside a single SQLite transaction.
32
+ *
33
+ * ⚠️ Do NOT call this inside `db.withTransaction(...)`
34
+ * or another `supastash.withTransaction(...)`.
35
+ * Nested transactions are not supported and will throw.
36
+ *
37
+ * All queries executed using the provided `tx` builder
38
+ * will share the same SQLite transaction and `txId`.
39
+ *
40
+ * If any operation inside the callback throws,
41
+ * the entire transaction is rolled back automatically.
42
+ *
43
+ * Example:
44
+ *
45
+ * await supastash.withTransaction(async (tx) => {
46
+ * await tx.from("orders").insert(order).run();
47
+ * await tx.from("ledger").insert(ledgerEntry).run();
48
+ * });
49
+ *
50
+ *
51
+ * In this example, both inserts succeed or both fail.
52
+ */
53
+ withTransaction(fn) {
54
+ const query = async () => {
55
+ // Create a new transaction id
56
+ const newTxId = generateUUIDv4();
57
+ try {
58
+ const db = await getSupastashDb();
59
+ // Add the transaction to the store
60
+ txStore[newTxId] = [];
61
+ // Execute the local calls
62
+ await db.withTransaction(async (tx) => {
63
+ const txQuery = {
64
+ ...this.query,
65
+ txId: newTxId,
66
+ tx,
67
+ throwOnError: true, // Throw the error to roll back the transaction
68
+ };
69
+ const txBuilder = new SupastashQueryBuilder(txQuery);
70
+ return fn(txBuilder);
71
+ });
72
+ // Execute the remote calls
73
+ const remoteCalls = txStore[newTxId] ?? [];
74
+ if (remoteCalls.length > 0) {
75
+ const newStates = remoteCalls.map((call) => {
76
+ return {
77
+ ...call,
78
+ txId: null,
79
+ tx: null,
80
+ withTx: false,
81
+ type: "remoteOnly",
82
+ };
83
+ });
84
+ for (const state of newStates) {
85
+ queueRemoteCall(state);
86
+ }
87
+ }
88
+ }
89
+ finally {
90
+ // Delete the transaction from the store
91
+ delete txStore[newTxId];
92
+ }
93
+ };
94
+ return query();
95
+ }
26
96
  }
27
97
  /**
28
98
  * Supastash query builder for local-first CRUD operations.
@@ -59,4 +129,10 @@ export const supastash = new SupastashQueryBuilder({
59
129
  viewRemoteResult: false,
60
130
  onConflictKeys: ["id"],
61
131
  preserveTimestamp: false,
132
+ throwOnError: false,
133
+ fetchPolicy: null,
134
+ // With tx
135
+ txId: null,
136
+ tx: null,
137
+ withTx: false,
62
138
  });
@@ -1 +1 @@
1
- {"version":3,"file":"mainQuery.d.ts","sourceRoot":"","sources":["../../../../src/utils/query/builder/mainQuery.ts"],"names":[],"mappings":"AACA,OAAO,EACL,WAAW,EAGX,cAAc,EACd,oBAAoB,EAErB,MAAM,4BAA4B,CAAC;AAWpC;;;;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,CA+E3C"}
1
+ {"version":3,"file":"mainQuery.d.ts","sourceRoot":"","sources":["../../../../src/utils/query/builder/mainQuery.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,WAAW,EAGX,cAAc,EACd,oBAAoB,EAErB,MAAM,4BAA4B,CAAC;AAWpC;;;;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,CAiG3C"}
@@ -1,4 +1,5 @@
1
1
  import { getSupastashConfig } from "../../../core/config";
2
+ import { txStore } from "../../../store/tx";
2
3
  import { logWarn } from "../../logs";
3
4
  import { refreshScreen } from "../../refreshScreenCalls";
4
5
  import { assignInsertIds, getCommonError, runSyncStrategy, validatePayloadForSingleInsert, } from "../helpers/mainQueryHelpers";
@@ -22,8 +23,10 @@ export async function queryDb(state) {
22
23
  payload: updatedPayload,
23
24
  type: syncMode,
24
25
  };
26
+ if (state.txId && ["localFirst"].includes(updatedState.type)) {
27
+ txStore[state.txId].push(updatedState);
28
+ }
25
29
  const { localResult, remoteResult, } = await runSyncStrategy(updatedState);
26
- localData = localResult?.data;
27
30
  const success = !localResult?.error && !remoteResult?.error;
28
31
  const commonError = getCommonError(table, method, localResult, remoteResult);
29
32
  if (viewRemoteResult) {
@@ -39,14 +42,26 @@ export async function queryDb(state) {
39
42
  success,
40
43
  });
41
44
  }
45
+ const remoteData = remoteResult?.data;
46
+ const localData = localResult?.data;
47
+ const policy = state.fetchPolicy;
48
+ const fetchPolicyData = !policy
49
+ ? null
50
+ : policy === "localFirst"
51
+ ? localData ?? remoteData
52
+ : remoteData ?? localData;
53
+ const data = fetchPolicyData ??
54
+ (type === "remoteOnly" ? remoteData : localData ?? null);
42
55
  return Promise.resolve({
43
- data: type === "remoteOnly" ? remoteResult?.data : localData ?? null,
56
+ data,
44
57
  error: commonError ?? null,
45
58
  success,
46
59
  });
47
60
  }
48
61
  catch (error) {
49
62
  logWarn(`[Supastash] ${error instanceof Error ? error.message : String(error)}`);
63
+ if (state.throwOnError)
64
+ throw error;
50
65
  if (state.viewRemoteResult) {
51
66
  return Promise.resolve({
52
67
  remote: null,
@@ -1,4 +1,4 @@
1
- import { CrudMethods, FilterCalls, MethodReturnTypeMap, SupastashQuery, SyncMode } from "../../../../types/query.types";
1
+ import { CrudMethods, MethodReturnTypeMap, SupastashQuery } from "../../../../types/query.types";
2
2
  /**
3
3
  * Gets method for local db calls
4
4
  *
@@ -11,5 +11,5 @@ import { CrudMethods, FilterCalls, MethodReturnTypeMap, SupastashQuery, SyncMode
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, Z>(table: string, method: T, select: string | null, payload: R | R[] | null, filters: FilterCalls[] | null, limit: number | null, isSingle: U, state: SupastashQuery<T, U, R>, onConflictKeys?: string[], syncMode?: SyncMode, preserveTimestamp?: boolean): () => Promise<MethodReturnTypeMap<U, Z>[T]>;
14
+ export default function getLocalMethod<T extends CrudMethods, U extends boolean, R, Z>(state: SupastashQuery<T, U, R>): () => 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,cAAc,EACd,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,KAAK,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAC9B,cAAc,CAAC,EAAE,MAAM,EAAE,EACzB,QAAQ,CAAC,EAAE,QAAQ,EACnB,iBAAiB,CAAC,EAAE,OAAO,GAC1B,MAAM,OAAO,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAgC7C"}
1
+ {"version":3,"file":"getLocalMethod.d.ts","sourceRoot":"","sources":["../../../../../src/utils/query/helpers/localDb/getLocalMethod.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EAEX,mBAAmB,EACnB,cAAc,EACf,MAAM,+BAA+B,CAAC;AASvC;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,OAAO,UAAU,cAAc,CACpC,CAAC,SAAS,WAAW,EACrB,CAAC,SAAS,OAAO,EACjB,CAAC,EACD,CAAC,EACD,KAAK,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,OAAO,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAY7E"}
@@ -11,13 +11,14 @@ import { buildDelete, buildInsert, buildSelect, buildUpdate, buildUpsert, } 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(table, method, select, payload, filters, limit, isSingle, state, onConflictKeys, syncMode, preserveTimestamp) {
14
+ export default function getLocalMethod(state) {
15
+ const { method } = state;
15
16
  const handlers = {
16
- select: buildSelect(table, select, filters, limit, isSingle),
17
- insert: buildInsert(table, payload, syncMode, isSingle),
18
- update: buildUpdate(table, payload, filters, syncMode, isSingle, preserveTimestamp),
19
- delete: buildDelete(table, filters, syncMode),
20
- upsert: buildUpsert(table, payload, state, syncMode, isSingle, onConflictKeys, preserveTimestamp),
17
+ select: buildSelect(state),
18
+ insert: buildInsert(state),
19
+ update: buildUpdate(state),
20
+ delete: buildDelete(state),
21
+ upsert: buildUpsert(state),
21
22
  none: async () => null,
22
23
  };
23
24
  return handlers[method];
@@ -1,9 +1,12 @@
1
1
  import { SyncMode } from "../../../../types/query.types";
2
+ import { SupastashSQLiteExecutor } from "../../../../types/supastashConfig.types";
2
3
  interface InsertOptions<R = any> {
3
4
  table: string;
4
5
  syncMode?: SyncMode;
5
6
  nowISO?: string;
6
7
  returnInsertedRows?: boolean;
8
+ withTx: boolean;
9
+ tx: SupastashSQLiteExecutor | null;
7
10
  }
8
11
  export declare function insertMany<R = any>(payload: R[], opts: InsertOptions<R>): Promise<R[] | void>;
9
12
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"insertMany.d.ts","sourceRoot":"","sources":["../../../../../src/utils/query/helpers/localDb/insertMany.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAIzD,UAAU,aAAa,CAAC,CAAC,GAAG,GAAG;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAMD,wBAAsB,UAAU,CAAC,CAAC,GAAG,GAAG,EACtC,OAAO,EAAE,CAAC,EAAE,EACZ,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,GACrB,OAAO,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,CAyGrB"}
1
+ {"version":3,"file":"insertMany.d.ts","sourceRoot":"","sources":["../../../../../src/utils/query/helpers/localDb/insertMany.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACzD,OAAO,EAEL,uBAAuB,EACxB,MAAM,yCAAyC,CAAC;AAIjD,UAAU,aAAa,CAAC,CAAC,GAAG,GAAG;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,MAAM,EAAE,OAAO,CAAC;IAChB,EAAE,EAAE,uBAAuB,GAAG,IAAI,CAAC;CACpC;AAMD,wBAAsB,UAAU,CAAC,CAAC,GAAG,GAAG,EACtC,OAAO,EAAE,CAAC,EAAE,EACZ,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,GACrB,OAAO,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,CA+GrB"}
@@ -5,7 +5,6 @@ const MAX_PARAMS = 999;
5
5
  const CHECK_BATCH = 900;
6
6
  const YIELD_EVERY = 500;
7
7
  export async function insertMany(payload, opts) {
8
- const db = await getSupastashDb();
9
8
  const { table, syncMode, returnInsertedRows } = opts;
10
9
  const timeStamp = opts.nowISO ?? new Date().toISOString();
11
10
  assertTableName(table);
@@ -24,6 +23,7 @@ export async function insertMany(payload, opts) {
24
23
  idSet.add(id);
25
24
  return id;
26
25
  });
26
+ const db = opts.tx ?? (await getSupastashDb());
27
27
  // 2) Check existing ids in DB (batched; fail-fast)
28
28
  for (let i = 0; i < ids.length; i += CHECK_BATCH) {
29
29
  const part = ids.slice(i, i + CHECK_BATCH);
@@ -36,7 +36,7 @@ export async function insertMany(payload, opts) {
36
36
  }
37
37
  // 3) Do inserts in a single transaction
38
38
  const insertedIds = [];
39
- const run = async () => {
39
+ const run = async (db) => {
40
40
  for (let i = 0; i < payload.length; i++) {
41
41
  const item = payload[i];
42
42
  const newPayload = {
@@ -63,7 +63,14 @@ export async function insertMany(payload, opts) {
63
63
  }
64
64
  };
65
65
  try {
66
- await run();
66
+ if (opts.withTx && !opts.tx) {
67
+ await db.withTransaction(async (tx) => {
68
+ await run(tx);
69
+ });
70
+ }
71
+ else {
72
+ await run(opts.tx ?? db);
73
+ }
67
74
  }
68
75
  catch (e) {
69
76
  throw e;
@@ -1,4 +1,4 @@
1
- import { CrudMethods, FilterCalls, SupastashQuery, SyncMode } from "../../../../types/query.types";
1
+ import { CrudMethods, SupastashQuery } from "../../../../types/query.types";
2
2
  /**
3
3
  * Builds a select query
4
4
  *
@@ -9,7 +9,7 @@ import { CrudMethods, FilterCalls, SupastashQuery, SyncMode } from "../../../../
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, 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>>;
12
+ export declare function buildSelect<T extends boolean, R, Z>(state: SupastashQuery<CrudMethods, boolean, R>): () => 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, R, Z>(table: string, sele
17
17
  * @param payload - The payload to insert
18
18
  * @returns query
19
19
  */
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>>;
20
+ export declare function buildInsert<T extends boolean, R, Z>(state: SupastashQuery<CrudMethods, boolean, R>): () => 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<T extends boolean, R, Z>(table: string, payload: R | null, filters: FilterCalls[] | null, syncMode?: SyncMode, isSingle?: T, preserveTimestamp?: boolean): () => Promise<T extends true ? import("../../../../types/query.types").PayloadResult<Z> : import("../../../../types/query.types").PayloadListResult<Z>>;
26
+ export declare function buildUpdate<T extends boolean, R, Z>(state: SupastashQuery<CrudMethods, boolean, R>): () => 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<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, state: SupastashQuery<CrudMethods, T, R>, syncMode?: SyncMode, isSingle?: T, onConflictKeys?: string[], preserveTimestamp?: boolean): () => Promise<T extends true ? import("../../../../types/query.types").PayloadResult<Z> : import("../../../../types/query.types").PayloadListResult<Z>>;
32
+ export declare function buildDelete<Z = any>(state: SupastashQuery<CrudMethods, boolean, Z>): () => Promise<import("../../../../types/query.types").SupatashDeleteResult<Z>>;
33
+ export declare function buildUpsert<T extends boolean, R, Z>(state: SupastashQuery<CrudMethods, boolean, R>): () => 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,EACL,WAAW,EACX,WAAW,EACX,cAAc,EACd,QAAQ,EACT,MAAM,+BAA+B,CAAC;AAOvC;;;;;;;;;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,EACZ,iBAAiB,CAAC,EAAE,OAAO,2JAW5B;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,KAAK,EAAE,cAAc,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC,EACxC,QAAQ,CAAC,EAAE,QAAQ,EACnB,QAAQ,CAAC,EAAE,CAAC,EACZ,cAAc,CAAC,EAAE,MAAM,EAAE,EACzB,iBAAiB,CAAC,EAAE,OAAO,2JAY5B"}
1
+ {"version":3,"file":"localQueryBuilder.d.ts","sourceRoot":"","sources":["../../../../../src/utils/query/helpers/localDb/localQueryBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAO5E;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC,EAAE,CAAC,EACjD,KAAK,EAAE,cAAc,CAAC,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC,2JAI/C;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC,EAAE,CAAC,EACjD,KAAK,EAAE,cAAc,CAAC,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC,2JAU/C;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC,EAAE,CAAC,EACjD,KAAK,EAAE,cAAc,CAAC,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC,2JAG/C;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,CAAC,GAAG,GAAG,EACjC,KAAK,EAAE,cAAc,CAAC,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC,kFAG/C;AAED,wBAAgB,WAAW,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC,EAAE,CAAC,EACjD,KAAK,EAAE,cAAc,CAAC,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC,2JAU/C"}
@@ -13,8 +13,8 @@ import { upsertData } from "../../localDbQuery/upsert";
13
13
  * @param isSingle - Whether to return a single row or multiple rows
14
14
  * @returns query
15
15
  */
16
- export function buildSelect(table, select, filters, limit, isSingle) {
17
- return async () => await selectData(table, select || "*", filters, limit, isSingle);
16
+ export function buildSelect(state) {
17
+ return async () => await selectData({ ...state, select: state.select || "*" });
18
18
  }
19
19
  /**
20
20
  * Builds an insert query
@@ -23,30 +23,37 @@ export function buildSelect(table, select, filters, limit, isSingle) {
23
23
  * @param payload - The payload to insert
24
24
  * @returns query
25
25
  */
26
- export function buildInsert(table, payload, syncMode, isSingle) {
26
+ export function buildInsert(state) {
27
+ const payload = state.payload;
27
28
  const newPayload = payload
28
29
  ? Array.isArray(payload)
29
30
  ? payload
30
31
  : [payload]
31
32
  : null;
32
- return async () => await insertData(table, newPayload, syncMode, isSingle);
33
+ return async () => await insertData({ ...state, payload: newPayload });
33
34
  }
34
35
  /**
35
36
  * Builds an update query
36
37
  *
37
38
  * @returns query
38
39
  */
39
- export function buildUpdate(table, payload, filters, syncMode, isSingle, preserveTimestamp) {
40
- return async () => await updateData(table, payload, filters, syncMode, isSingle, preserveTimestamp);
40
+ export function buildUpdate(state) {
41
+ return async () => await updateData(state);
41
42
  }
42
43
  /**
43
44
  * Builds a delete query
44
45
  *
45
46
  * @returns query
46
47
  */
47
- export function buildDelete(table, filters, syncMode) {
48
- return async () => await deleteData(table, filters, syncMode);
48
+ export function buildDelete(state) {
49
+ return async () => await deleteData(state);
49
50
  }
50
- export function buildUpsert(table, payload, state, syncMode, isSingle, onConflictKeys, preserveTimestamp) {
51
- return async () => await upsertData(table, payload, state, syncMode, isSingle, onConflictKeys, preserveTimestamp);
51
+ export function buildUpsert(state) {
52
+ const payload = state.payload;
53
+ const newPayload = payload
54
+ ? Array.isArray(payload)
55
+ ? payload
56
+ : [payload]
57
+ : null;
58
+ return async () => await upsertData({ ...state, payload: newPayload });
52
59
  }
@@ -1,4 +1,5 @@
1
1
  import { CrudMethods, SupastashQuery, SyncMode } from "../../../../types/query.types";
2
+ import { SupastashSQLiteExecutor } from "../../../../types/supastashConfig.types";
2
3
  interface UpsertOptions<R = any> {
3
4
  table: string;
4
5
  onConflictKeys?: string[];
@@ -7,6 +8,8 @@ interface UpsertOptions<R = any> {
7
8
  preserveTimestamp?: boolean;
8
9
  returnRows?: boolean;
9
10
  yieldEvery?: number;
11
+ withTx: boolean;
12
+ tx: SupastashSQLiteExecutor | null;
10
13
  }
11
14
  export declare function upsertMany<R = any>(items: R[], opts: UpsertOptions<R>, state: SupastashQuery<CrudMethods, boolean, R>): Promise<R[] | void>;
12
15
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"upsertMany.d.ts","sourceRoot":"","sources":["../../../../../src/utils/query/helpers/localDb/upsertMany.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,WAAW,EACX,cAAc,EACd,QAAQ,EACT,MAAM,+BAA+B,CAAC;AAKvC,UAAU,aAAa,CAAC,CAAC,GAAG,GAAG;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAMD,wBAAsB,UAAU,CAAC,CAAC,GAAG,GAAG,EACtC,KAAK,EAAE,CAAC,EAAE,EACV,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,EACtB,KAAK,EAAE,cAAc,CAAC,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC,GAC7C,OAAO,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,CAoLrB"}
1
+ {"version":3,"file":"upsertMany.d.ts","sourceRoot":"","sources":["../../../../../src/utils/query/helpers/localDb/upsertMany.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,WAAW,EACX,cAAc,EACd,QAAQ,EACT,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAC;AAKlF,UAAU,aAAa,CAAC,CAAC,GAAG,GAAG;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;IAChB,EAAE,EAAE,uBAAuB,GAAG,IAAI,CAAC;CACpC;AAMD,wBAAsB,UAAU,CAAC,CAAC,GAAG,GAAG,EACtC,KAAK,EAAE,CAAC,EAAE,EACV,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,EACtB,KAAK,EAAE,cAAc,CAAC,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC,GAC7C,OAAO,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,CA0LrB"}