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.
Files changed (35) hide show
  1. package/dist/core/config/index.d.ts +0 -1
  2. package/dist/core/config/index.d.ts.map +1 -1
  3. package/dist/core/config/index.js +0 -2
  4. package/dist/core/schemaManager/index.js +4 -4
  5. package/dist/types/query.types.d.ts +13 -8
  6. package/dist/utils/query/builder/crud.d.ts +5 -5
  7. package/dist/utils/query/builder/crud.d.ts.map +1 -1
  8. package/dist/utils/query/builder/filters.d.ts +7 -0
  9. package/dist/utils/query/builder/filters.d.ts.map +1 -1
  10. package/dist/utils/query/builder/filters.js +9 -0
  11. package/dist/utils/query/builder/index.d.ts.map +1 -1
  12. package/dist/utils/query/builder/index.js +1 -0
  13. package/dist/utils/query/helpers/localDb/getLocalMethod.d.ts +1 -1
  14. package/dist/utils/query/helpers/localDb/getLocalMethod.d.ts.map +1 -1
  15. package/dist/utils/query/helpers/localDb/getLocalMethod.js +3 -3
  16. package/dist/utils/query/helpers/localDb/localQueryBuilder.d.ts +2 -2
  17. package/dist/utils/query/helpers/localDb/localQueryBuilder.d.ts.map +1 -1
  18. package/dist/utils/query/helpers/localDb/localQueryBuilder.js +4 -4
  19. package/dist/utils/query/localDbQuery/index.d.ts.map +1 -1
  20. package/dist/utils/query/localDbQuery/index.js +2 -2
  21. package/dist/utils/query/localDbQuery/update.d.ts +1 -1
  22. package/dist/utils/query/localDbQuery/update.d.ts.map +1 -1
  23. package/dist/utils/query/localDbQuery/update.js +12 -2
  24. package/dist/utils/query/localDbQuery/upsert.d.ts +1 -1
  25. package/dist/utils/query/localDbQuery/upsert.d.ts.map +1 -1
  26. package/dist/utils/query/localDbQuery/upsert.js +16 -3
  27. package/dist/utils/query/remoteQuery/supabaseQuery.d.ts.map +1 -1
  28. package/dist/utils/query/remoteQuery/supabaseQuery.js +31 -49
  29. package/dist/utils/sync/pullFromRemote/pullData.d.ts.map +1 -1
  30. package/dist/utils/sync/pullFromRemote/pullData.js +4 -5
  31. package/dist/utils/sync/pullFromRemote/updateLocalDb.d.ts.map +1 -1
  32. package/dist/utils/sync/pullFromRemote/updateLocalDb.js +0 -3
  33. package/dist/utils/sync/pushLocal/uploadChunk.d.ts.map +1 -1
  34. package/dist/utils/sync/pushLocal/uploadChunk.js +18 -31
  35. 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;AAwB3C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;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"}
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
- await clearSchemaCache(tableName);
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<T extends CrudMethods, U extends boolean, R> {
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;IAWjB;;;;;OAKG;IACH,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;IAWjB;;;;OAIG;IACH,MAAM,CAAC,CAAC;IAUR;;;;;OAKG;IACH,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM;IAWzB;;;;;;;;;;;;;;;;;OAiBG;IACH,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE;QAAE,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE;CAWjE"}
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,kDAiBiC,CAAC"}
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"}
@@ -58,4 +58,5 @@ export const supastash = new SupastashQueryBuilder({
58
58
  runSelected: false,
59
59
  viewRemoteResult: false,
60
60
  onConflictKeys: ["id"],
61
+ preserveTimestamp: false,
61
62
  });
@@ -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,GAClB,MAAM,OAAO,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CA6B7C"}
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,2JAIb;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,CAAC,GAAG,GAAG,EACjC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,WAAW,EAAE,GAAG,IAAI,EAC7B,QAAQ,CAAC,EAAE,QAAQ,kFAGpB;AAED,wBAAgB,WAAW,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC,EAAE,CAAC,EACjD,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,EACvB,QAAQ,CAAC,EAAE,QAAQ,EACnB,QAAQ,CAAC,EAAE,CAAC,EACZ,cAAc,CAAC,EAAE,MAAM,EAAE,2JAU1B"}
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,CA8BvE"}
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":"AACA,OAAO,EACL,WAAW,EAEX,iBAAiB,EACjB,aAAa,EACb,QAAQ,EACT,MAAM,4BAA4B,CAAC;AAMpC;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC,EAAE,CAAC,EACtD,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,CAAC,GAAG,IAAI,EACjB,OAAO,EAAE,WAAW,EAAE,GAAG,IAAI,EAC7B,QAAQ,CAAC,EAAE,QAAQ,EACnB,QAAQ,CAAC,EAAE,CAAC,GACX,OAAO,CAAC,CAAC,SAAS,IAAI,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAoEnE"}
1
+ {"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":"AACA,OAAO,EAEL,iBAAiB,EACjB,aAAa,EACb,QAAQ,EACT,MAAM,4BAA4B,CAAC;AAMpC;;;;;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,GAChC,OAAO,CAAC,CAAC,SAAS,IAAI,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC,CA2GnE"}
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.some((key) => colArray.includes(key));
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;AAMpC;;;;;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,CAmNpC"}
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 { supastash } from "../builder";
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
- return {
22
- ...rest,
23
- created_at: item.created_at ?? now,
24
- updated_at: item.updated_at ?? now,
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
- ...rest,
32
- created_at: rest.created_at ?? now,
33
- updated_at: rest.updated_at ?? now,
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 refreshItems = upsertOrInsertPayload.map((item) => ({
119
- id: item.id,
120
- synced_at: new Date().toISOString(),
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.some((key) => colArray.includes(key));
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 db = await getSupastashDb();
153
- const { clause, values: filterValues } = buildWhereClause(filters ?? []);
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,CAuE/B"}
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 lastest timestamp
66
- const lastest = data.find((r) => r.updated_at)?.updated_at;
67
- console.log("lastest", lastest);
68
- if (lastest) {
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,iBAqEpB"}
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;AAyLzD;;;;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
+ {"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 refreshItems = rows?.map((row) => ({
11
- id: row.id,
12
- synced_at: new Date().toISOString(),
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
- log(`[Supastash] Upsert attempt ${attempts} failed for table ${table}`, toUpsert.map((row) => row.id), error);
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
- if (config.useCustomRPCForUpserts) {
91
- const { error, data, } = await supabase.rpc("supastash_bulk_upsert", {
92
- p_table_name: table,
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
- const { error } = await supabase.from(table).upsert(toUpsert);
109
- if (!error) {
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) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "supastash",
3
- "version": "0.1.7",
3
+ "version": "0.1.8",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "type": "module",