supastash 0.1.36 → 0.1.38
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/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/utils/query/localDbQuery/delete.js +1 -1
- package/dist/utils/query/remoteQuery/supabaseQuery.d.ts.map +1 -1
- package/dist/utils/query/remoteQuery/supabaseQuery.js +4 -1
- package/dist/utils/serializer.d.ts +16 -4
- package/dist/utils/serializer.d.ts.map +1 -1
- package/dist/utils/serializer.js +58 -32
- package/dist/utils/sync/pullFromRemote/pullData.d.ts.map +1 -1
- package/dist/utils/sync/pullFromRemote/pullData.js +2 -3
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -8,9 +8,11 @@ export { syncAllTables, syncTable } from "./hooks/syncEngine";
|
|
|
8
8
|
export { useSupastashSyncStatus } from "./hooks/syncStatus";
|
|
9
9
|
export { supastashEventBus } from "./utils/events/eventBus";
|
|
10
10
|
export { supastash } from "./utils/query/builder";
|
|
11
|
+
export { refreshScreen } from "./utils/refreshScreenCalls";
|
|
11
12
|
export { dropAllTables, dropTable, wipeAllTables, wipeOldDataForAllTables, wipeOldDataForATable, wipeTable, } from "./utils/schema/wipeTables";
|
|
12
13
|
export { getAllTables } from "./utils/sync/getAllTables";
|
|
13
14
|
export { updateFilters } from "./utils/sync/pullFromRemote/updateFilter";
|
|
15
|
+
export { upsertData } from "./utils/sync/pullFromRemote/updateLocalDb";
|
|
14
16
|
export { refreshAllTables, refreshTable, refreshTableWithPayload, } from "./utils/sync/refreshTables";
|
|
15
17
|
export { clearSyncCalls, getAllSyncTables, getSyncCall, registerSyncCall, unregisterSyncCall, } from "./utils/sync/registration/syncCalls";
|
|
16
18
|
export { clearAllLocalDeleteLog, clearAllLocalSyncLog, clearLocalDeleteLog, clearLocalSyncLog, clearSyncLog, getLocalDeleteLog, getSyncLog, resetSyncLog, setLocalDeleteLog, setLocalSyncLog, setSyncLog, } from "./utils/sync/status/syncStatus";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EACL,aAAa,EACb,SAAS,EACT,aAAa,EACb,uBAAuB,EACvB,oBAAoB,EACpB,SAAS,GACV,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,0CAA0C,CAAC;AACzE,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,uBAAuB,GACxB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,WAAW,EACX,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,YAAY,EACZ,iBAAiB,EACjB,UAAU,EACV,YAAY,EACZ,iBAAiB,EACjB,eAAe,EACf,UAAU,GACX,MAAM,gCAAgC,CAAC;AAExC,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,YAAY,EACV,eAAe,EACf,mBAAmB,EACnB,eAAe,GAChB,MAAM,4BAA4B,CAAC;AACpC,YAAY,EACV,eAAe,EACf,mBAAmB,EACnB,0BAA0B,EAC1B,uBAAuB,GACxB,MAAM,+BAA+B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EACL,aAAa,EACb,SAAS,EACT,aAAa,EACb,uBAAuB,EACvB,oBAAoB,EACpB,SAAS,GACV,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,0CAA0C,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,2CAA2C,CAAC;AACvE,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,uBAAuB,GACxB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,WAAW,EACX,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,YAAY,EACZ,iBAAiB,EACjB,UAAU,EACV,YAAY,EACZ,iBAAiB,EACjB,eAAe,EACf,UAAU,GACX,MAAM,gCAAgC,CAAC;AAExC,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,YAAY,EACV,eAAe,EACf,mBAAmB,EACnB,eAAe,GAChB,MAAM,4BAA4B,CAAC;AACpC,YAAY,EACV,eAAe,EACf,mBAAmB,EACnB,0BAA0B,EAC1B,uBAAuB,GACxB,MAAM,+BAA+B,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -9,9 +9,11 @@ export { syncAllTables, syncTable } from "./hooks/syncEngine";
|
|
|
9
9
|
export { useSupastashSyncStatus } from "./hooks/syncStatus";
|
|
10
10
|
export { supastashEventBus } from "./utils/events/eventBus";
|
|
11
11
|
export { supastash } from "./utils/query/builder";
|
|
12
|
+
export { refreshScreen } from "./utils/refreshScreenCalls";
|
|
12
13
|
export { dropAllTables, dropTable, wipeAllTables, wipeOldDataForAllTables, wipeOldDataForATable, wipeTable, } from "./utils/schema/wipeTables";
|
|
13
14
|
export { getAllTables } from "./utils/sync/getAllTables";
|
|
14
15
|
export { updateFilters } from "./utils/sync/pullFromRemote/updateFilter";
|
|
16
|
+
export { upsertData } from "./utils/sync/pullFromRemote/updateLocalDb";
|
|
15
17
|
export { refreshAllTables, refreshTable, refreshTableWithPayload, } from "./utils/sync/refreshTables";
|
|
16
18
|
export { clearSyncCalls, getAllSyncTables, getSyncCall, registerSyncCall, unregisterSyncCall, } from "./utils/sync/registration/syncCalls";
|
|
17
19
|
export { clearAllLocalDeleteLog, clearAllLocalSyncLog, clearLocalDeleteLog, clearLocalSyncLog, clearSyncLog, getLocalDeleteLog, getSyncLog, resetSyncLog, setLocalDeleteLog, setLocalSyncLog, setSyncLog, } from "./utils/sync/status/syncStatus";
|
|
@@ -15,7 +15,7 @@ export async function deleteData(table, filters, syncMode) {
|
|
|
15
15
|
const db = await getSupastashDb();
|
|
16
16
|
const timeStamp = new Date().toISOString();
|
|
17
17
|
const itemsToBeDeleted = await db.getAllAsync(`SELECT * FROM ${table} ${clause}`, filterValues);
|
|
18
|
-
await db.runAsync(`UPDATE ${table} SET deleted_at = ?, synced_at =
|
|
18
|
+
await db.runAsync(`UPDATE ${table} SET deleted_at = ?, synced_at = NULL ${clause}`, [timeStamp, ...filterValues]);
|
|
19
19
|
if (syncMode === "localOnly" || syncMode === "remoteFirst") {
|
|
20
20
|
permanentlyDeleteData(table, filters);
|
|
21
21
|
}
|
|
@@ -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;AAWpC;;;;;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,
|
|
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;AAWpC;;;;;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,CA0NpC"}
|
|
@@ -97,9 +97,9 @@ export async function querySupabase(state, isBatched = false) {
|
|
|
97
97
|
});
|
|
98
98
|
break;
|
|
99
99
|
case "delete":
|
|
100
|
+
console.log("delete", timeStamp);
|
|
100
101
|
filterQuery = query.update({
|
|
101
102
|
deleted_at: timeStamp,
|
|
102
|
-
updated_at: timeStamp,
|
|
103
103
|
});
|
|
104
104
|
break;
|
|
105
105
|
default:
|
|
@@ -113,6 +113,9 @@ export async function querySupabase(state, isBatched = false) {
|
|
|
113
113
|
filterQuery = filterQuery[op](column, value);
|
|
114
114
|
}
|
|
115
115
|
}
|
|
116
|
+
if (method === "delete") {
|
|
117
|
+
console.log("delete", filterQuery);
|
|
118
|
+
}
|
|
116
119
|
if (limit != null) {
|
|
117
120
|
filterQuery = filterQuery.limit(limit);
|
|
118
121
|
}
|
|
@@ -1,9 +1,21 @@
|
|
|
1
1
|
export declare function isTrulyNullish(value: any): boolean;
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
3
|
+
* Deterministically stringify any value:
|
|
4
|
+
* - Sorts object keys for stability
|
|
5
|
+
* - Converts Date -> ISO string
|
|
6
|
+
* - Converts BigInt -> string
|
|
7
|
+
* - Replaces NaN/Infinity/undefined with null
|
|
8
|
+
* - Handles circular references
|
|
9
|
+
*/
|
|
10
|
+
export declare function stableStringify(input: any): string;
|
|
11
|
+
/**
|
|
12
|
+
* Normalize a value to something SQLite can bind safely:
|
|
13
|
+
* - Dates -> ISO string
|
|
14
|
+
* - Booleans -> 1/0
|
|
15
|
+
* - Arrays/Objects -> stable JSON string
|
|
16
|
+
* - BigInt -> string
|
|
17
|
+
* - undefined/NaN/Infinity -> null
|
|
18
|
+
* - Everything else passes through
|
|
7
19
|
*/
|
|
8
20
|
export declare function getSafeValue(value: any): any;
|
|
9
21
|
//# sourceMappingURL=serializer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serializer.d.ts","sourceRoot":"","sources":["../../src/utils/serializer.ts"],"names":[],"mappings":"AAAA,wBAAgB,cAAc,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAUlD;
|
|
1
|
+
{"version":3,"file":"serializer.d.ts","sourceRoot":"","sources":["../../src/utils/serializer.ts"],"names":[],"mappings":"AAAA,wBAAgB,cAAc,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAUlD;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM,CAqClD;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,GAAG,GAAG,GAAG,CAa5C"}
|
package/dist/utils/serializer.js
CHANGED
|
@@ -8,46 +8,72 @@ export function isTrulyNullish(value) {
|
|
|
8
8
|
(typeof value === "number" && isNaN(value)));
|
|
9
9
|
}
|
|
10
10
|
/**
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
11
|
+
* Deterministically stringify any value:
|
|
12
|
+
* - Sorts object keys for stability
|
|
13
|
+
* - Converts Date -> ISO string
|
|
14
|
+
* - Converts BigInt -> string
|
|
15
|
+
* - Replaces NaN/Infinity/undefined with null
|
|
16
|
+
* - Handles circular references
|
|
15
17
|
*/
|
|
16
|
-
function stableStringify(
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
18
|
+
export function stableStringify(input) {
|
|
19
|
+
const seen = new WeakSet();
|
|
20
|
+
const sanitize = (val) => {
|
|
21
|
+
if (val === null)
|
|
22
|
+
return null;
|
|
23
|
+
const t = typeof val;
|
|
24
|
+
if (t === "number") {
|
|
25
|
+
return Number.isFinite(val) ? val : null;
|
|
26
|
+
}
|
|
27
|
+
if (t === "bigint")
|
|
28
|
+
return val.toString();
|
|
29
|
+
if (t === "string")
|
|
30
|
+
return val;
|
|
31
|
+
if (t === "boolean")
|
|
32
|
+
return val;
|
|
33
|
+
if (val instanceof Date)
|
|
34
|
+
return val.toISOString();
|
|
35
|
+
if (Array.isArray(val)) {
|
|
36
|
+
return val.map((v) => sanitize(v));
|
|
37
|
+
}
|
|
38
|
+
if (t === "object") {
|
|
39
|
+
if (seen.has(val))
|
|
40
|
+
return "[Circular]";
|
|
41
|
+
seen.add(val);
|
|
42
|
+
const out = {};
|
|
43
|
+
for (const k of Object.keys(val).sort()) {
|
|
44
|
+
out[k] = sanitize(val[k]);
|
|
45
|
+
}
|
|
46
|
+
seen.delete(val);
|
|
47
|
+
return out;
|
|
48
|
+
}
|
|
49
|
+
// functions/symbol/undefined -> null
|
|
50
|
+
return null;
|
|
51
|
+
};
|
|
52
|
+
return JSON.stringify(sanitize(input));
|
|
28
53
|
}
|
|
29
54
|
/**
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
55
|
+
* Normalize a value to something SQLite can bind safely:
|
|
56
|
+
* - Dates -> ISO string
|
|
57
|
+
* - Booleans -> 1/0
|
|
58
|
+
* - Arrays/Objects -> stable JSON string
|
|
59
|
+
* - BigInt -> string
|
|
60
|
+
* - undefined/NaN/Infinity -> null
|
|
61
|
+
* - Everything else passes through
|
|
34
62
|
*/
|
|
35
63
|
export function getSafeValue(value) {
|
|
64
|
+
if (value === undefined)
|
|
65
|
+
return null;
|
|
66
|
+
if (typeof value === "number" && !Number.isFinite(value))
|
|
67
|
+
return null;
|
|
36
68
|
if (value instanceof Date)
|
|
37
69
|
return value.toISOString();
|
|
38
|
-
if (
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
if (allPrimitives)
|
|
44
|
-
return value;
|
|
45
|
-
const allObjects = value.every((v) => typeof v === "object" && v !== null);
|
|
46
|
-
if (allObjects)
|
|
47
|
-
return value.map(stableStringify);
|
|
70
|
+
if (typeof value === "bigint")
|
|
71
|
+
return value.toString();
|
|
72
|
+
if (typeof value === "boolean")
|
|
73
|
+
return value ? 1 : 0;
|
|
74
|
+
if (Array.isArray(value))
|
|
48
75
|
return stableStringify(value);
|
|
49
|
-
|
|
50
|
-
if (typeof value === "object" && value !== null)
|
|
76
|
+
if (value && typeof value === "object")
|
|
51
77
|
return stableStringify(value);
|
|
52
78
|
return value;
|
|
53
79
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pullData.d.ts","sourceRoot":"","sources":["../../../../src/utils/sync/pullFromRemote/pullData.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAOnE;;;;GAIG;AACH,wBAAsB,QAAQ,CAC5B,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,cAAc,EAAE,GACzB,OAAO,CAAC;IAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"pullData.d.ts","sourceRoot":"","sources":["../../../../src/utils/sync/pullFromRemote/pullData.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAOnE;;;;GAIG;AACH,wBAAsB,QAAQ,CAC5B,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,cAAc,EAAE,GACzB,OAAO,CAAC;IAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,IAAI,CAAC,CA8D/D"}
|
|
@@ -42,7 +42,7 @@ export async function pullData(table, filters) {
|
|
|
42
42
|
merged[r.id] = r;
|
|
43
43
|
}
|
|
44
44
|
const data = Object.values(merged);
|
|
45
|
-
if (data.length === 0) {
|
|
45
|
+
if (data.length === 0 && deletedRows.length === 0) {
|
|
46
46
|
logNoUpdates(table);
|
|
47
47
|
return null;
|
|
48
48
|
}
|
|
@@ -50,13 +50,12 @@ export async function pullData(table, filters) {
|
|
|
50
50
|
const createdMax = getMaxDate(createdRows, "created_at");
|
|
51
51
|
const updatedMax = getMaxDate(updatedRows, "updated_at");
|
|
52
52
|
const deletedMax = getMaxDate(deletedRows, "deleted_at");
|
|
53
|
-
log(`Received ${data.length} updates for ${table}`);
|
|
54
53
|
await setSupastashSyncStatus(table, filters, {
|
|
55
54
|
lastCreatedAt: createdMax,
|
|
56
55
|
lastSyncedAt: updatedMax,
|
|
57
56
|
lastDeletedAt: deletedMax,
|
|
58
57
|
filterNamespace: "global",
|
|
59
58
|
});
|
|
60
|
-
log(`[Supastash] Received ${data.length} updates for ${table} (c${createdRows.length}/u${updatedRows.length}/d${deletedRows.length})`);
|
|
59
|
+
log(`[Supastash] Received ${data.length + deletedRows.length} updates for ${table} (c${createdRows.length}/u${updatedRows.length}/d${deletedRows.length})`);
|
|
61
60
|
return { data, deletedIds };
|
|
62
61
|
}
|