supastash 0.1.7 → 0.1.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/config/index.d.ts +0 -1
- package/dist/core/config/index.d.ts.map +1 -1
- package/dist/core/config/index.js +0 -2
- package/dist/core/schemaManager/index.js +4 -4
- package/dist/types/query.types.d.ts +13 -8
- package/dist/utils/query/builder/crud.d.ts +5 -5
- package/dist/utils/query/builder/crud.d.ts.map +1 -1
- package/dist/utils/query/builder/filters.d.ts +7 -0
- package/dist/utils/query/builder/filters.d.ts.map +1 -1
- package/dist/utils/query/builder/filters.js +9 -0
- package/dist/utils/query/builder/index.d.ts.map +1 -1
- package/dist/utils/query/builder/index.js +1 -0
- package/dist/utils/query/helpers/localDb/getLocalMethod.d.ts +1 -1
- package/dist/utils/query/helpers/localDb/getLocalMethod.d.ts.map +1 -1
- package/dist/utils/query/helpers/localDb/getLocalMethod.js +3 -3
- package/dist/utils/query/helpers/localDb/localQueryBuilder.d.ts +2 -2
- package/dist/utils/query/helpers/localDb/localQueryBuilder.d.ts.map +1 -1
- package/dist/utils/query/helpers/localDb/localQueryBuilder.js +4 -4
- package/dist/utils/query/localDbQuery/index.d.ts.map +1 -1
- package/dist/utils/query/localDbQuery/index.js +2 -2
- package/dist/utils/query/localDbQuery/update.d.ts +1 -1
- package/dist/utils/query/localDbQuery/update.d.ts.map +1 -1
- package/dist/utils/query/localDbQuery/update.js +12 -2
- package/dist/utils/query/localDbQuery/upsert.d.ts +1 -1
- package/dist/utils/query/localDbQuery/upsert.d.ts.map +1 -1
- package/dist/utils/query/localDbQuery/upsert.js +16 -3
- package/dist/utils/query/remoteQuery/supabaseQuery.d.ts.map +1 -1
- package/dist/utils/query/remoteQuery/supabaseQuery.js +31 -49
- package/dist/utils/sync/pullFromRemote/pullData.d.ts.map +1 -1
- package/dist/utils/sync/pullFromRemote/pullData.js +4 -5
- package/dist/utils/sync/pullFromRemote/updateLocalDb.d.ts.map +1 -1
- package/dist/utils/sync/pullFromRemote/updateLocalDb.js +0 -3
- package/dist/utils/sync/pushLocal/uploadChunk.d.ts.map +1 -1
- package/dist/utils/sync/pushLocal/uploadChunk.js +18 -31
- package/package.json +1 -1
|
@@ -41,7 +41,6 @@ import { SupastashConfig, SupastashSQLiteClientTypes } from "../../types/supasta
|
|
|
41
41
|
* @param config.excludeTables - Tables to exclude from sync (default: `{ pull: [], push: [] }`)
|
|
42
42
|
* @param config.pollingInterval - Polling interval for sync (default: `{ pull: 30000, push: 30000 }`)
|
|
43
43
|
* @param config.syncEngine - Control pull/push sync behavior (`push: true`, `pull: false` by default, `useFiltersFromStore: true` by default)
|
|
44
|
-
* @param config.useCustomRPCForUpserts - Use a custom RPC for upserts (default: `false`). Add this to your Supabase project settings first. Docs: https://0xzekea.github.io/supastash/docs/rls-upsert-resolution
|
|
45
44
|
*/
|
|
46
45
|
export declare function configureSupastash<T extends SupastashSQLiteClientTypes>(config: SupastashConfig<T> & {
|
|
47
46
|
sqliteClientType: T;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,0BAA0B,EAC3B,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,0BAA0B,EAC3B,MAAM,mCAAmC,CAAC;AAuB3C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAEH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,0BAA0B,EACrE,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG;IAAE,gBAAgB,EAAE,CAAC,CAAA;CAAE,QAOrD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAChC,CAAC,SAAS,0BAA0B,KACjC,eAAe,CAAC,CAAC,CAAC,CAEtB;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,qBAAqB,CACnC,CAAC,SAAS,0BAA0B,EACpC,MAAM,EAAE;IACR,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG;QAC9B,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;KAC3B,CAAC;CACH,QAEA"}
|
|
@@ -4,7 +4,6 @@ let _config = {
|
|
|
4
4
|
sqliteClient: null,
|
|
5
5
|
sqliteClientType: null,
|
|
6
6
|
excludeTables: { pull: [], push: [] },
|
|
7
|
-
useCustomRPCForUpserts: false,
|
|
8
7
|
pollingInterval: {
|
|
9
8
|
pull: 30000,
|
|
10
9
|
push: 30000,
|
|
@@ -60,7 +59,6 @@ let _configured = false;
|
|
|
60
59
|
* @param config.excludeTables - Tables to exclude from sync (default: `{ pull: [], push: [] }`)
|
|
61
60
|
* @param config.pollingInterval - Polling interval for sync (default: `{ pull: 30000, push: 30000 }`)
|
|
62
61
|
* @param config.syncEngine - Control pull/push sync behavior (`push: true`, `pull: false` by default, `useFiltersFromStore: true` by default)
|
|
63
|
-
* @param config.useCustomRPCForUpserts - Use a custom RPC for upserts (default: `false`). Add this to your Supabase project settings first. Docs: https://0xzekea.github.io/supastash/docs/rls-upsert-resolution
|
|
64
62
|
*/
|
|
65
63
|
export function configureSupastash(config) {
|
|
66
64
|
_config = {
|
|
@@ -26,10 +26,10 @@ export async function defineLocalSchema(tableName, schema, deletePreviousSchema
|
|
|
26
26
|
// Include the columns that must be in the schema
|
|
27
27
|
const safeSchema = {
|
|
28
28
|
...schema,
|
|
29
|
-
created_at: "TEXT NOT NULL",
|
|
30
|
-
updated_at: "TEXT NOT NULL",
|
|
29
|
+
created_at: schema.created_at ?? "TEXT NOT NULL",
|
|
30
|
+
updated_at: schema.updated_at ?? "TEXT NOT NULL",
|
|
31
31
|
synced_at: "TEXT DEFAULT NULL",
|
|
32
|
-
deleted_at: "TEXT DEFAULT NULL",
|
|
32
|
+
deleted_at: schema.deleted_at ?? "TEXT DEFAULT NULL",
|
|
33
33
|
};
|
|
34
34
|
const schemaString = Object.entries(safeSchema)
|
|
35
35
|
.map(([key, value]) => `${key} ${value}`)
|
|
@@ -42,7 +42,7 @@ export async function defineLocalSchema(tableName, schema, deletePreviousSchema
|
|
|
42
42
|
await db.execAsync(dropSql);
|
|
43
43
|
await db.execAsync(clearSyncStatusSql);
|
|
44
44
|
await db.execAsync(clearDeleteStatusSql);
|
|
45
|
-
|
|
45
|
+
clearSchemaCache(tableName);
|
|
46
46
|
log(`[Supastash] Dropped table ${tableName}`);
|
|
47
47
|
}
|
|
48
48
|
await db.execAsync(sql);
|
|
@@ -32,7 +32,11 @@ export type FilterCalls = {
|
|
|
32
32
|
value: any;
|
|
33
33
|
};
|
|
34
34
|
|
|
35
|
-
export interface SupastashQuery<
|
|
35
|
+
export interface SupastashQuery<
|
|
36
|
+
T extends CrudMethods,
|
|
37
|
+
U extends boolean,
|
|
38
|
+
R = PayloadData
|
|
39
|
+
> {
|
|
36
40
|
id: string;
|
|
37
41
|
table: string;
|
|
38
42
|
method: T;
|
|
@@ -45,13 +49,14 @@ export interface SupastashQuery<T extends CrudMethods, U extends boolean, R> {
|
|
|
45
49
|
runSelected: boolean;
|
|
46
50
|
viewRemoteResult: boolean;
|
|
47
51
|
onConflictKeys?: string[];
|
|
52
|
+
preserveTimestamp: boolean;
|
|
48
53
|
}
|
|
49
54
|
|
|
50
55
|
export interface CrudReturnValue {
|
|
51
56
|
error;
|
|
52
57
|
}
|
|
53
58
|
|
|
54
|
-
export type SupastashResult<R> = {
|
|
59
|
+
export type SupastashResult<R = PayloadData> = {
|
|
55
60
|
data: R | null;
|
|
56
61
|
error: {
|
|
57
62
|
message: string;
|
|
@@ -60,9 +65,9 @@ export type SupastashResult<R> = {
|
|
|
60
65
|
} | null;
|
|
61
66
|
};
|
|
62
67
|
|
|
63
|
-
export type PayloadResult<R> = SupastashResult<R>;
|
|
64
|
-
export type PayloadListResult<R> = SupastashResult<R[]>;
|
|
65
|
-
export type SupatashDeleteResult<R> = {
|
|
68
|
+
export type PayloadResult<R = PayloadData> = SupastashResult<R>;
|
|
69
|
+
export type PayloadListResult<R = PayloadData> = SupastashResult<R[]>;
|
|
70
|
+
export type SupatashDeleteResult<R = PayloadData> = {
|
|
66
71
|
data?: R[] | null;
|
|
67
72
|
error: {
|
|
68
73
|
message: string;
|
|
@@ -71,7 +76,7 @@ export type SupatashDeleteResult<R> = {
|
|
|
71
76
|
} | null;
|
|
72
77
|
};
|
|
73
78
|
|
|
74
|
-
export type MethodReturnTypeMap<U extends boolean, R> = {
|
|
79
|
+
export type MethodReturnTypeMap<U extends boolean, R = PayloadData> = {
|
|
75
80
|
select: U extends true ? SupastashResult<R> : SupastashResult<R[]>;
|
|
76
81
|
insert: U extends true ? SupastashResult<R> : SupastashResult<R[]>;
|
|
77
82
|
update: U extends true ? SupastashResult<R> : SupastashResult<R[]>;
|
|
@@ -80,7 +85,7 @@ export type MethodReturnTypeMap<U extends boolean, R> = {
|
|
|
80
85
|
none: null;
|
|
81
86
|
};
|
|
82
87
|
|
|
83
|
-
export type HandlerMap<U extends boolean, R> = {
|
|
88
|
+
export type HandlerMap<U extends boolean, R = PayloadData> = {
|
|
84
89
|
[K in CrudMethods]: () => Promise<MethodReturnTypeMap<U, R>[K]>;
|
|
85
90
|
};
|
|
86
91
|
|
|
@@ -94,7 +99,7 @@ export type SupastashQueryResult<
|
|
|
94
99
|
T extends CrudMethods,
|
|
95
100
|
U extends boolean,
|
|
96
101
|
V extends boolean,
|
|
97
|
-
R
|
|
102
|
+
R = PayloadData
|
|
98
103
|
> = V extends true
|
|
99
104
|
? Promise<{
|
|
100
105
|
remote: SupabaseQueryReturn<U, R> | null;
|
|
@@ -18,27 +18,27 @@ export default class SupastashCrudBuilder<T extends CrudMethods, U extends boole
|
|
|
18
18
|
* @param data - The data to insert. Could be a single object or an array of objects.
|
|
19
19
|
* @returns filter options.
|
|
20
20
|
*/
|
|
21
|
-
insert<Z>(data: R): SupastashFilterBuilder<"insert", false, R, Z>;
|
|
21
|
+
insert<Z = any>(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<Z>(data: R): SupastashFilterBuilder<"update", false, R, Z>;
|
|
28
|
+
update<Z = any>(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<Z>(): SupastashFilterBuilder<"delete", false, R, Z>;
|
|
34
|
+
delete<Z = any>(): 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<Z>(column?: string): SupastashFilterBuilder<"select", false, R, Z>;
|
|
41
|
+
select<Z = any>(column?: string): SupastashFilterBuilder<"select", false, R, Z>;
|
|
42
42
|
/**
|
|
43
43
|
* Sets the method to upsert.
|
|
44
44
|
*
|
|
@@ -57,7 +57,7 @@ export default class SupastashCrudBuilder<T extends CrudMethods, U extends boole
|
|
|
57
57
|
*
|
|
58
58
|
* @returns filter options.
|
|
59
59
|
*/
|
|
60
|
-
upsert<Z>(data: R | R[], options?: {
|
|
60
|
+
upsert<Z = any>(data: R | R[], options?: {
|
|
61
61
|
onConflictKeys?: string[];
|
|
62
62
|
}): SupastashFilterBuilder<"upsert", false, R, Z>;
|
|
63
63
|
}
|
|
@@ -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,CAAC,EAAE,IAAI,EAAE,CAAC;
|
|
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,GAAG,GAAG,EAAE,IAAI,EAAE,CAAC;IAWvB;;;;;OAKG;IACH,MAAM,CAAC,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE,CAAC;IAWvB;;;;OAIG;IACH,MAAM,CAAC,CAAC,GAAG,GAAG;IAUd;;;;;OAKG;IACH,MAAM,CAAC,CAAC,GAAG,GAAG,EAAE,MAAM,CAAC,EAAE,MAAM;IAW/B;;;;;;;;;;;;;;;;;OAiBG;IACH,MAAM,CAAC,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE;QAAE,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE;CAWvE"}
|
|
@@ -109,6 +109,13 @@ export default class SupastashFilterBuilder<T extends CrudMethods, U extends boo
|
|
|
109
109
|
* Similar to Supabase `.single()`.
|
|
110
110
|
*/
|
|
111
111
|
single(): SupastashFilterBuilder<T, true, R, Z>;
|
|
112
|
+
/**
|
|
113
|
+
* Sets the preserve timestamp of the query.
|
|
114
|
+
*
|
|
115
|
+
* @param preserve - Whether to preserve the timestamp.
|
|
116
|
+
* @returns more filter options.
|
|
117
|
+
*/
|
|
118
|
+
preserveTimestamp(preserve: boolean): SupastashFilterBuilder<T, U, R, Z>;
|
|
112
119
|
/**
|
|
113
120
|
* Sets the sync mode of the query.
|
|
114
121
|
*
|
|
@@ -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,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"}
|
|
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,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;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"}
|
|
@@ -150,6 +150,15 @@ export default class SupastashFilterBuilder {
|
|
|
150
150
|
limit: 1,
|
|
151
151
|
});
|
|
152
152
|
}
|
|
153
|
+
/**
|
|
154
|
+
* Sets the preserve timestamp of the query.
|
|
155
|
+
*
|
|
156
|
+
* @param preserve - Whether to preserve the timestamp.
|
|
157
|
+
* @returns more filter options.
|
|
158
|
+
*/
|
|
159
|
+
preserveTimestamp(preserve) {
|
|
160
|
+
return this.withQueryPatch({ preserveTimestamp: preserve });
|
|
161
|
+
}
|
|
153
162
|
/**
|
|
154
163
|
* Sets the sync mode of the query.
|
|
155
164
|
*
|
|
@@ -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,
|
|
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"}
|
|
@@ -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, Z>(table: string, method: T, select: string | null, payload: R | R[] | null, filters: FilterCalls[] | null, limit: number | null, isSingle: U, onConflictKeys?: string[], syncMode?: SyncMode): () => Promise<MethodReturnTypeMap<U, Z>[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, onConflictKeys?: string[], syncMode?: SyncMode, preserveTimestamp?: boolean): () => 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,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,cAAc,CAAC,EAAE,MAAM,EAAE,EACzB,QAAQ,CAAC,EAAE,QAAQ,
|
|
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,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,CA+B7C"}
|
|
@@ -11,13 +11,13 @@ 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, onConflictKeys, syncMode) {
|
|
14
|
+
export default function getLocalMethod(table, method, select, payload, filters, limit, isSingle, onConflictKeys, syncMode, preserveTimestamp) {
|
|
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, isSingle),
|
|
18
|
+
update: buildUpdate(table, payload, filters, syncMode, isSingle, preserveTimestamp),
|
|
19
19
|
delete: buildDelete(table, filters, syncMode),
|
|
20
|
-
upsert: buildUpsert(table, payload, syncMode, isSingle, onConflictKeys),
|
|
20
|
+
upsert: buildUpsert(table, payload, syncMode, isSingle, onConflictKeys, preserveTimestamp),
|
|
21
21
|
none: async () => null,
|
|
22
22
|
};
|
|
23
23
|
return handlers[method];
|
|
@@ -23,12 +23,12 @@ export declare function buildInsert<T extends boolean, R, Z>(table: string, payl
|
|
|
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): () => 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>(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>>;
|
|
27
27
|
/**
|
|
28
28
|
* Builds a delete query
|
|
29
29
|
*
|
|
30
30
|
* @returns query
|
|
31
31
|
*/
|
|
32
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, onConflictKeys?: string[]): () => Promise<T extends true ? import("../../../../types/query.types").PayloadResult<Z> : import("../../../../types/query.types").PayloadListResult<Z>>;
|
|
33
|
+
export declare function buildUpsert<T extends boolean, R, Z>(table: string, payload: R | R[] | null, syncMode?: SyncMode, isSingle?: T, onConflictKeys?: string[], preserveTimestamp?: boolean): () => 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,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,
|
|
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,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,QAAQ,CAAC,EAAE,QAAQ,EACnB,QAAQ,CAAC,EAAE,CAAC,EACZ,cAAc,CAAC,EAAE,MAAM,EAAE,EACzB,iBAAiB,CAAC,EAAE,OAAO,2JAW5B"}
|
|
@@ -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, isSingle) {
|
|
40
|
-
return async () => await updateData(table, payload, filters, syncMode, isSingle);
|
|
39
|
+
export function buildUpdate(table, payload, filters, syncMode, isSingle, preserveTimestamp) {
|
|
40
|
+
return async () => await updateData(table, payload, filters, syncMode, isSingle, preserveTimestamp);
|
|
41
41
|
}
|
|
42
42
|
/**
|
|
43
43
|
* Builds a delete query
|
|
@@ -47,6 +47,6 @@ export function buildUpdate(table, payload, filters, syncMode, isSingle) {
|
|
|
47
47
|
export function buildDelete(table, filters, syncMode) {
|
|
48
48
|
return async () => await deleteData(table, filters, syncMode);
|
|
49
49
|
}
|
|
50
|
-
export function buildUpsert(table, payload, syncMode, isSingle, onConflictKeys) {
|
|
51
|
-
return async () => await upsertData(table, payload, syncMode, isSingle, onConflictKeys);
|
|
50
|
+
export function buildUpsert(table, payload, syncMode, isSingle, onConflictKeys, preserveTimestamp) {
|
|
51
|
+
return async () => await upsertData(table, payload, syncMode, isSingle, onConflictKeys, preserveTimestamp);
|
|
52
52
|
}
|
|
@@ -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,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,
|
|
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,CAkCvE"}
|
|
@@ -5,11 +5,11 @@ import getLocalMethod from "../helpers/localDb/getLocalMethod";
|
|
|
5
5
|
* @returns The result of the query
|
|
6
6
|
*/
|
|
7
7
|
export async function queryLocalDb(state) {
|
|
8
|
-
const { table, method, payload, filters, limit, select, isSingle, onConflictKeys, } = state;
|
|
8
|
+
const { table, method, payload, filters, limit, select, isSingle, onConflictKeys, preserveTimestamp, type, } = state;
|
|
9
9
|
if (!method) {
|
|
10
10
|
throw new Error("Method is required for local call");
|
|
11
11
|
}
|
|
12
|
-
const query = getLocalMethod(table, method, select, payload, filters, limit, isSingle, onConflictKeys);
|
|
12
|
+
const query = getLocalMethod(table, method, select, payload, filters, limit, isSingle, onConflictKeys, type, preserveTimestamp);
|
|
13
13
|
const result = await query();
|
|
14
14
|
return result;
|
|
15
15
|
}
|
|
@@ -7,5 +7,5 @@ import { FilterCalls, PayloadListResult, PayloadResult, SyncMode } from "../../.
|
|
|
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<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>>;
|
|
10
|
+
export declare function updateData<T extends boolean, R, Z>(table: string, payload: R | null, filters: FilterCalls[] | null, syncMode?: SyncMode, isSingle?: T, preserveTimestamp?: boolean): 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":"
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../../src/utils/query/localDbQuery/update.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,WAAW,EAEX,iBAAiB,EACjB,aAAa,EACb,QAAQ,EACT,MAAM,4BAA4B,CAAC;AAQpC;;;;;;;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,EACZ,iBAAiB,CAAC,EAAE,OAAO,GAC1B,OAAO,CAAC,CAAC,SAAS,IAAI,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC,CA+EnE"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
+
import { getSupastashConfig } from "../../../core/config";
|
|
1
2
|
import { getSupastashDb } from "../../../db/dbInitializer";
|
|
2
3
|
import { parseStringifiedFields } from "../../../utils/sync/pushLocal/parseFields";
|
|
3
4
|
import { getSafeValue } from "../../serializer";
|
|
4
5
|
import { assertTableExists } from "../../tableValidator";
|
|
5
6
|
import { buildWhereClause } from "../helpers/remoteDb/queryFilterBuilder";
|
|
7
|
+
const warned = new Set();
|
|
6
8
|
/**
|
|
7
9
|
* Updates data locally, sets synced_at to null pending update to remote server
|
|
8
10
|
*
|
|
@@ -11,7 +13,7 @@ import { buildWhereClause } from "../helpers/remoteDb/queryFilterBuilder";
|
|
|
11
13
|
* @param filters - The filters to apply to the update query
|
|
12
14
|
* @returns a data / error object
|
|
13
15
|
*/
|
|
14
|
-
export async function updateData(table, payload, filters, syncMode, isSingle) {
|
|
16
|
+
export async function updateData(table, payload, filters, syncMode, isSingle, preserveTimestamp) {
|
|
15
17
|
if (!payload)
|
|
16
18
|
throw new Error(`Payload data was not provided for an update call on ${table}`);
|
|
17
19
|
if (!table)
|
|
@@ -20,13 +22,21 @@ export async function updateData(table, payload, filters, syncMode, isSingle) {
|
|
|
20
22
|
const timeStamp = new Date().toISOString();
|
|
21
23
|
const newPayload = {
|
|
22
24
|
...payload,
|
|
23
|
-
updated_at: payload.updated_at ?? timeStamp,
|
|
24
25
|
synced_at: Object.prototype.hasOwnProperty.call(payload, "synced_at")
|
|
25
26
|
? payload.synced_at
|
|
26
27
|
: syncMode && (syncMode === "localOnly" || syncMode === "remoteFirst")
|
|
27
28
|
? timeStamp
|
|
28
29
|
: null,
|
|
29
30
|
};
|
|
31
|
+
if (!preserveTimestamp || payload.updated_at === undefined) {
|
|
32
|
+
if (!warned.has(table) && !getSupastashConfig().debugMode && __DEV__) {
|
|
33
|
+
warned.add(table);
|
|
34
|
+
console.warn(`[Supastash] updated_at not provided for update call on ${table} – defaulting to ${timeStamp}`);
|
|
35
|
+
}
|
|
36
|
+
const userUpdatedAt = payload.updated_at;
|
|
37
|
+
newPayload.updated_at =
|
|
38
|
+
userUpdatedAt !== undefined ? userUpdatedAt : timeStamp;
|
|
39
|
+
}
|
|
30
40
|
const colArray = Object.keys(newPayload);
|
|
31
41
|
const cols = colArray
|
|
32
42
|
.filter((col) => col !== "id")
|
|
@@ -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, Z>(table: string, payload: R | R[] | null, syncMode?: SyncMode, isSingle?: T, onConflictKeys?: string[]): Promise<T extends true ? PayloadResult<Z> : PayloadListResult<Z>>;
|
|
8
|
+
export declare function upsertData<T extends boolean, R, Z>(table: string, payload: R | R[] | null, syncMode?: SyncMode, isSingle?: T, onConflictKeys?: string[], preserveTimestamp?: boolean): 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":"
|
|
1
|
+
{"version":3,"file":"upsert.d.ts","sourceRoot":"","sources":["../../../../src/utils/query/localDbQuery/upsert.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,iBAAiB,EACjB,aAAa,EACb,QAAQ,EACT,MAAM,4BAA4B,CAAC;AAQpC;;;;;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,EACZ,cAAc,GAAE,MAAM,EAAW,EACjC,iBAAiB,CAAC,EAAE,OAAO,GAC1B,OAAO,CAAC,CAAC,SAAS,IAAI,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC,CA4HnE"}
|
|
@@ -1,15 +1,17 @@
|
|
|
1
|
+
import { getSupastashConfig } from "../../../core/config";
|
|
1
2
|
import { getSupastashDb } from "../../../db/dbInitializer";
|
|
2
3
|
import { generateUUIDv4 } from "../../../utils/genUUID";
|
|
3
4
|
import { getSafeValue } from "../../serializer";
|
|
4
5
|
import { parseStringifiedFields } from "../../sync/pushLocal/parseFields";
|
|
5
6
|
import { assertTableExists } from "../../tableValidator";
|
|
7
|
+
const warned = new Set();
|
|
6
8
|
/**
|
|
7
9
|
* Performs upsert-like logic on local DB:
|
|
8
10
|
* - If a row with the same ID exists, it is updated.
|
|
9
11
|
* - Otherwise, it is inserted.
|
|
10
12
|
* Returns all the rows that were upserted.
|
|
11
13
|
*/
|
|
12
|
-
export async function upsertData(table, payload, syncMode, isSingle, onConflictKeys = ["id"]) {
|
|
14
|
+
export async function upsertData(table, payload, syncMode, isSingle, onConflictKeys = ["id"], preserveTimestamp) {
|
|
13
15
|
if (!payload || !table)
|
|
14
16
|
throw new Error("Table and payload are required for upsert.");
|
|
15
17
|
await assertTableExists(table);
|
|
@@ -21,7 +23,6 @@ export async function upsertData(table, payload, syncMode, isSingle, onConflictK
|
|
|
21
23
|
for (const item of items) {
|
|
22
24
|
const newPayload = {
|
|
23
25
|
...item,
|
|
24
|
-
updated_at: item.updated_at ?? timeStamp,
|
|
25
26
|
synced_at: Object.prototype.hasOwnProperty.call(item, "synced_at")
|
|
26
27
|
? item.synced_at
|
|
27
28
|
: syncMode && (syncMode === "localOnly" || syncMode === "remoteFirst")
|
|
@@ -29,7 +30,7 @@ export async function upsertData(table, payload, syncMode, isSingle, onConflictK
|
|
|
29
30
|
: null,
|
|
30
31
|
};
|
|
31
32
|
const colArray = Object.keys(newPayload);
|
|
32
|
-
const includesConflictKeys = onConflictKeys.
|
|
33
|
+
const includesConflictKeys = onConflictKeys.every((key) => colArray.includes(key));
|
|
33
34
|
if (!includesConflictKeys) {
|
|
34
35
|
throw new Error(`onConflictKeys must include at least one key from the payload. Payload: ${JSON.stringify(newPayload)}`);
|
|
35
36
|
}
|
|
@@ -42,6 +43,17 @@ export async function upsertData(table, payload, syncMode, isSingle, onConflictK
|
|
|
42
43
|
if (existingData.length > 1) {
|
|
43
44
|
throw new Error(`Multiple rows matched onConflictKeys in '${table}' — expected unique constraint. Payload: ${JSON.stringify(newPayload)}`);
|
|
44
45
|
}
|
|
46
|
+
if (!preserveTimestamp || item.updated_at === undefined) {
|
|
47
|
+
if (!warned.has(table) &&
|
|
48
|
+
!getSupastashConfig().debugMode &&
|
|
49
|
+
__DEV__) {
|
|
50
|
+
warned.add(table);
|
|
51
|
+
console.warn(`[Supastash] updated_at not provided for upsert call on ${table} – defaulting to ${timeStamp}`);
|
|
52
|
+
}
|
|
53
|
+
const userUpdatedAt = item.updated_at;
|
|
54
|
+
newPayload.updated_at =
|
|
55
|
+
userUpdatedAt !== undefined ? userUpdatedAt : timeStamp;
|
|
56
|
+
}
|
|
45
57
|
const updateColsArray = Object.keys(newPayload);
|
|
46
58
|
const updateCols = updateColsArray
|
|
47
59
|
.filter((col) => !onConflictKeys.includes(col))
|
|
@@ -59,6 +71,7 @@ export async function upsertData(table, payload, syncMode, isSingle, onConflictK
|
|
|
59
71
|
...newPayload,
|
|
60
72
|
id: newPayload.id ?? generateUUIDv4(),
|
|
61
73
|
created_at: newPayload.created_at ?? timeStamp,
|
|
74
|
+
updated_at: newPayload.updated_at ?? timeStamp,
|
|
62
75
|
};
|
|
63
76
|
const newColsArray = Object.keys(insertPayload);
|
|
64
77
|
const insertCols = newColsArray.join(", ");
|
|
@@ -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;
|
|
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;AAQpC;;;;;GAKG;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,CAsMpC"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { getSupastashConfig } from "../../../core/config";
|
|
2
2
|
import { getSupastashDb } from "../../../db/dbInitializer";
|
|
3
|
-
import {
|
|
3
|
+
import { refreshScreen } from "../../refreshScreenCalls";
|
|
4
|
+
import { getSafeValue } from "../../serializer";
|
|
5
|
+
import { updateLocalSyncedAt } from "../../syncUpdate";
|
|
4
6
|
import { buildWhereClause } from "../helpers/remoteDb/queryFilterBuilder";
|
|
5
7
|
import { operatorMap } from "../helpers/remoteDb/queryUtils";
|
|
6
8
|
import { permanentlyDeleteData } from "../localDbQuery/delete";
|
|
@@ -11,27 +13,30 @@ import { permanentlyDeleteData } from "../localDbQuery/delete";
|
|
|
11
13
|
* @returns The result of the query
|
|
12
14
|
*/
|
|
13
15
|
export async function querySupabase(state, isBatched = false) {
|
|
14
|
-
const { table, method, payload, filters, limit, select, isSingle, type, onConflictKeys, viewRemoteResult, } = state;
|
|
16
|
+
const { table, method, payload, filters, limit, select, isSingle, type, onConflictKeys, viewRemoteResult, preserveTimestamp, } = state;
|
|
15
17
|
const config = getSupastashConfig();
|
|
16
|
-
const now = new Date().toISOString();
|
|
17
18
|
let newPayload;
|
|
19
|
+
const timeStamp = new Date().toISOString();
|
|
18
20
|
if (Array.isArray(payload) && payload.length > 0) {
|
|
19
21
|
newPayload = payload.map((item) => {
|
|
20
22
|
const { synced_at, ...rest } = item;
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
23
|
+
const newItem = { ...rest };
|
|
24
|
+
if (!preserveTimestamp) {
|
|
25
|
+
const userUpdatedAt = item.updated_at;
|
|
26
|
+
newItem.updated_at =
|
|
27
|
+
userUpdatedAt !== undefined ? userUpdatedAt : timeStamp;
|
|
28
|
+
}
|
|
29
|
+
return newItem;
|
|
26
30
|
});
|
|
27
31
|
}
|
|
28
32
|
else if (payload) {
|
|
29
33
|
const { synced_at, ...rest } = payload;
|
|
30
|
-
newPayload = {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
34
|
+
newPayload = { ...rest };
|
|
35
|
+
if (!preserveTimestamp) {
|
|
36
|
+
const userUpdatedAt = payload.updated_at;
|
|
37
|
+
newPayload.updated_at =
|
|
38
|
+
userUpdatedAt !== undefined ? userUpdatedAt : timeStamp;
|
|
39
|
+
}
|
|
35
40
|
}
|
|
36
41
|
if (!config.supabaseClient) {
|
|
37
42
|
throw new Error("[Supastash] Supabase Client is required to perform this operation.");
|
|
@@ -54,7 +59,6 @@ export async function querySupabase(state, isBatched = false) {
|
|
|
54
59
|
const supabase = config.supabaseClient;
|
|
55
60
|
let query = supabase.from(table);
|
|
56
61
|
let filterQuery;
|
|
57
|
-
const timeStamp = new Date().toISOString();
|
|
58
62
|
switch (method) {
|
|
59
63
|
case "select":
|
|
60
64
|
filterQuery = query.select(select || "*");
|
|
@@ -110,61 +114,39 @@ export async function querySupabase(state, isBatched = false) {
|
|
|
110
114
|
filterQuery = filterQuery.select();
|
|
111
115
|
}
|
|
112
116
|
const result = await filterQuery;
|
|
117
|
+
const db = await getSupastashDb();
|
|
113
118
|
if (!result.error &&
|
|
114
119
|
method !== "select" &&
|
|
115
120
|
type !== "remoteOnly" &&
|
|
116
121
|
type !== "remoteFirst") {
|
|
117
122
|
if (method === "insert" && newPayload) {
|
|
118
|
-
const
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
}));
|
|
122
|
-
await supastash
|
|
123
|
-
.from(table)
|
|
124
|
-
.upsert(refreshItems)
|
|
125
|
-
.syncMode("localOnly")
|
|
126
|
-
.run();
|
|
123
|
+
for (const item of upsertOrInsertPayload) {
|
|
124
|
+
await updateLocalSyncedAt(table, item.id);
|
|
125
|
+
}
|
|
127
126
|
}
|
|
128
127
|
if (method === "upsert" && newPayload) {
|
|
129
128
|
const onConflictKeysArray = onConflictKeys && onConflictKeys.length > 0 ? onConflictKeys : ["id"];
|
|
130
129
|
for (const item of upsertOrInsertPayload) {
|
|
131
130
|
const colArray = Object.keys(item);
|
|
132
|
-
const includesConflictKeys = onConflictKeysArray.
|
|
131
|
+
const includesConflictKeys = onConflictKeysArray.every((key) => colArray.includes(key));
|
|
133
132
|
if (!includesConflictKeys) {
|
|
134
133
|
throw new Error(`Upsert failed: Conflict keys [${onConflictKeysArray.join(", ")}] must exist in payload. Received: ${JSON.stringify(item)}`);
|
|
135
134
|
}
|
|
135
|
+
const whereClause = onConflictKeysArray
|
|
136
|
+
.map((key) => `${key} = ?`)
|
|
137
|
+
.join(" AND ");
|
|
138
|
+
const conflictValues = onConflictKeysArray.map((key) => getSafeValue(item[key]));
|
|
139
|
+
await db.runAsync(`UPDATE ${table} SET synced_at = ? WHERE ${whereClause}`, [timeStamp, ...conflictValues]);
|
|
136
140
|
}
|
|
137
|
-
const refreshItems = upsertOrInsertPayload.map((item) => {
|
|
138
|
-
return {
|
|
139
|
-
...item,
|
|
140
|
-
synced_at: new Date().toISOString(),
|
|
141
|
-
};
|
|
142
|
-
});
|
|
143
|
-
await supastash
|
|
144
|
-
.from(table)
|
|
145
|
-
.upsert(refreshItems, {
|
|
146
|
-
onConflictKeys: onConflictKeysArray,
|
|
147
|
-
})
|
|
148
|
-
.syncMode("localOnly")
|
|
149
|
-
.run();
|
|
150
141
|
}
|
|
151
142
|
if (filters?.length) {
|
|
152
|
-
const
|
|
153
|
-
|
|
154
|
-
const refreshItems = await db.getAllAsync(`SELECT id FROM ${table} ${clause}`, filterValues);
|
|
155
|
-
const refreshItemsWithSyncedAt = refreshItems.map((item) => ({
|
|
156
|
-
id: item.id,
|
|
157
|
-
synced_at: new Date().toISOString(),
|
|
158
|
-
}));
|
|
159
|
-
await supastash
|
|
160
|
-
.from(table)
|
|
161
|
-
.upsert(refreshItemsWithSyncedAt)
|
|
162
|
-
.syncMode("localOnly")
|
|
163
|
-
.run();
|
|
143
|
+
const { clause, values: filterValues } = buildWhereClause(filters);
|
|
144
|
+
await db.runAsync(`UPDATE ${table} SET synced_at = ? WHERE ${clause}`, filterValues);
|
|
164
145
|
if (method === "delete") {
|
|
165
146
|
await permanentlyDeleteData(table, filters);
|
|
166
147
|
}
|
|
167
148
|
}
|
|
149
|
+
refreshScreen(table);
|
|
168
150
|
}
|
|
169
151
|
return result;
|
|
170
152
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pullData.d.ts","sourceRoot":"","sources":["../../../../src/utils/sync/pullFromRemote/pullData.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAoBnE;;;;GAIG;AACH,wBAAsB,QAAQ,CAC5B,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,cAAc,GACtB,OAAO,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"pullData.d.ts","sourceRoot":"","sources":["../../../../src/utils/sync/pullFromRemote/pullData.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAoBnE;;;;GAIG;AACH,wBAAsB,QAAQ,CAC5B,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,cAAc,GACtB,OAAO,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,CAsE/B"}
|
|
@@ -62,11 +62,10 @@ export async function pullData(table, filter) {
|
|
|
62
62
|
return null;
|
|
63
63
|
}
|
|
64
64
|
log(`Received ${data.length} updates for ${table}`);
|
|
65
|
-
// Update the supastash_sync_status table with the
|
|
66
|
-
const
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
await updateLastPulledInfo(table, lastest);
|
|
65
|
+
// Update the supastash_sync_status table with the latest timestamp
|
|
66
|
+
const latest = data.find((r) => r.updated_at)?.updated_at;
|
|
67
|
+
if (latest) {
|
|
68
|
+
await updateLastPulledInfo(table, latest);
|
|
70
69
|
}
|
|
71
70
|
return data;
|
|
72
71
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"updateLocalDb.d.ts","sourceRoot":"","sources":["../../../../src/utils/sync/pullFromRemote/updateLocalDb.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAanE;;;GAGG;AACH,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,cAAc,EACxB,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,iBAgDhD;AAID;;;;;GAKG;AACH,wBAAsB,UAAU,CAC9B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,GAAG,EACX,SAAS,CAAC,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"updateLocalDb.d.ts","sourceRoot":"","sources":["../../../../src/utils/sync/pullFromRemote/updateLocalDb.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAanE;;;GAGG;AACH,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,cAAc,EACxB,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,iBAgDhD;AAID;;;;;GAKG;AACH,wBAAsB,UAAU,CAC9B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,GAAG,EACX,SAAS,CAAC,EAAE,OAAO,iBAkEpB"}
|
|
@@ -106,9 +106,6 @@ export async function upsertData(table, record, doesExist) {
|
|
|
106
106
|
await db.runAsync(`INSERT INTO ${table} (${keys.join(", ")}) VALUES (${placeholders})`, values);
|
|
107
107
|
}
|
|
108
108
|
await updateLocalSyncedAt(table, record.id);
|
|
109
|
-
if (doesExist === undefined) {
|
|
110
|
-
refreshScreen(table);
|
|
111
|
-
}
|
|
112
109
|
}
|
|
113
110
|
catch (error) {
|
|
114
111
|
console.error(`[Supastash] Error upserting data for ${table}`, error);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uploadChunk.d.ts","sourceRoot":"","sources":["../../../../src/utils/sync/pushLocal/uploadChunk.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"uploadChunk.d.ts","sourceRoot":"","sources":["../../../../src/utils/sync/pushLocal/uploadChunk.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAiKzD;;;;GAIG;AACH,wBAAsB,UAAU,CAC9B,KAAK,EAAE,MAAM,EACb,eAAe,EAAE,WAAW,EAAE,EAC9B,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,iBAUtD"}
|
|
@@ -1,20 +1,26 @@
|
|
|
1
1
|
import { getSupastashConfig } from "../../../core/config";
|
|
2
2
|
import log from "../../logs";
|
|
3
|
-
import { supastash } from "../../query/builder";
|
|
4
3
|
import { supabaseClientErr } from "../../supabaseClientErr";
|
|
4
|
+
import { updateLocalSyncedAt } from "../../syncUpdate";
|
|
5
5
|
import { parseStringifiedFields } from "./parseFields";
|
|
6
6
|
const RANDOM_OLD_DATE = new Date("2000-01-01").toISOString();
|
|
7
7
|
const CHUNK_SIZE = 500;
|
|
8
8
|
const DEFAULT_DATE = "1970-01-01T00:00:00Z";
|
|
9
9
|
async function updateSyncStatus(table, rows) {
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
}));
|
|
14
|
-
await supastash.from(table).upsert(refreshItems).syncMode("localOnly").run();
|
|
10
|
+
for (const row of rows) {
|
|
11
|
+
await updateLocalSyncedAt(table, row.id);
|
|
12
|
+
}
|
|
15
13
|
}
|
|
16
14
|
function errorHandler(error, table, toUpsert, attempts) {
|
|
17
|
-
|
|
15
|
+
if (attempts === 5) {
|
|
16
|
+
log(`[Supastash] Upsert attempt ${attempts} failed for table ${table} \n
|
|
17
|
+
Error: ${error.message} \n
|
|
18
|
+
To Upsert: ${toUpsert.map((row) => row.id).join(", ")} \n
|
|
19
|
+
You can write a custom 'onPushToRemote' callback to handle this error.
|
|
20
|
+
Check the "onPushToRemote" callback in the "useSupastashData" hook for table ${table}.
|
|
21
|
+
Also, callback should return a boolean, if successfully pushed to remote.
|
|
22
|
+
`);
|
|
23
|
+
}
|
|
18
24
|
}
|
|
19
25
|
/**
|
|
20
26
|
* Uploads a chunk of data to the remote database
|
|
@@ -87,32 +93,13 @@ async function uploadChunk(table, chunk, onPushToRemote) {
|
|
|
87
93
|
}
|
|
88
94
|
}
|
|
89
95
|
else {
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
rows: toUpsert,
|
|
94
|
-
});
|
|
95
|
-
const { success_ids, failed } = data || {};
|
|
96
|
-
if (!error && success_ids?.length === toUpsert.length) {
|
|
97
|
-
success = true;
|
|
98
|
-
}
|
|
99
|
-
else {
|
|
100
|
-
if (failed?.length && success_ids?.length) {
|
|
101
|
-
toUpsert = toUpsert.filter((row) => !success_ids.includes(row.id));
|
|
102
|
-
}
|
|
103
|
-
attempts++;
|
|
104
|
-
errorHandler({ ...error, failed }, table, toUpsert, attempts);
|
|
105
|
-
}
|
|
96
|
+
const { error } = await supabase.from(table).upsert(toUpsert);
|
|
97
|
+
if (!error) {
|
|
98
|
+
success = true;
|
|
106
99
|
}
|
|
107
100
|
else {
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
success = true;
|
|
111
|
-
}
|
|
112
|
-
else {
|
|
113
|
-
attempts++;
|
|
114
|
-
errorHandler(error, table, toUpsert, attempts);
|
|
115
|
-
}
|
|
101
|
+
attempts++;
|
|
102
|
+
errorHandler(error, table, toUpsert, attempts);
|
|
116
103
|
}
|
|
117
104
|
}
|
|
118
105
|
if (success) {
|