@legendapp/state 3.0.0-alpha.25 → 3.0.0-alpha.27

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/index.js CHANGED
@@ -1908,14 +1908,15 @@ function activateNodeFunction(node, lazyFn) {
1908
1908
  }
1909
1909
  let value = activateFn();
1910
1910
  let didSetToObs = false;
1911
- if (isObservable(value)) {
1912
- didSetToObs = true;
1911
+ const isObs = isObservable(value);
1912
+ if (isObs || node.linkedToNode) {
1913
+ didSetToObs = isObs;
1913
1914
  value = setToObservable(node, value);
1914
1915
  }
1915
1916
  if (isFunction(value) && value.length === 0) {
1916
1917
  value = value();
1917
1918
  }
1918
- const activated = !isObservable(value) ? value == null ? void 0 : value[symbolLinked] : void 0;
1919
+ const activated = !isObs ? value == null ? void 0 : value[symbolLinked] : void 0;
1919
1920
  if (activated) {
1920
1921
  node.activationState = activated;
1921
1922
  value = void 0;
@@ -2081,23 +2082,25 @@ function activateNodeBase(node, value) {
2081
2082
  }
2082
2083
  function setToObservable(node, value) {
2083
2084
  var _a;
2084
- const linkedNode = getNode(value);
2085
+ const linkedNode = value ? getNode(value) : void 0;
2085
2086
  if (linkedNode !== node && (linkedNode == null ? void 0 : linkedNode.linkedToNode) !== node) {
2086
2087
  node.linkedToNode = linkedNode;
2087
- linkedNode.linkedFromNodes || (linkedNode.linkedFromNodes = /* @__PURE__ */ new Set());
2088
- linkedNode.linkedFromNodes.add(node);
2089
2088
  (_a = node.linkedToNodeDispose) == null ? void 0 : _a.call(node);
2090
- node.linkedToNodeDispose = onChange(
2091
- linkedNode,
2092
- () => {
2093
- value = peekInternal(linkedNode);
2094
- if (!isFunction(value)) {
2095
- set(node, value);
2096
- }
2097
- },
2098
- { initial: true },
2099
- /* @__PURE__ */ new Set([node])
2100
- );
2089
+ if (linkedNode) {
2090
+ linkedNode.linkedFromNodes || (linkedNode.linkedFromNodes = /* @__PURE__ */ new Set());
2091
+ linkedNode.linkedFromNodes.add(node);
2092
+ node.linkedToNodeDispose = onChange(
2093
+ linkedNode,
2094
+ () => {
2095
+ value = peekInternal(linkedNode);
2096
+ if (!isFunction(value)) {
2097
+ set(node, value);
2098
+ }
2099
+ },
2100
+ { initial: true },
2101
+ /* @__PURE__ */ new Set([node])
2102
+ );
2103
+ }
2101
2104
  }
2102
2105
  return value;
2103
2106
  }
package/index.mjs CHANGED
@@ -1906,14 +1906,15 @@ function activateNodeFunction(node, lazyFn) {
1906
1906
  }
1907
1907
  let value = activateFn();
1908
1908
  let didSetToObs = false;
1909
- if (isObservable(value)) {
1910
- didSetToObs = true;
1909
+ const isObs = isObservable(value);
1910
+ if (isObs || node.linkedToNode) {
1911
+ didSetToObs = isObs;
1911
1912
  value = setToObservable(node, value);
1912
1913
  }
1913
1914
  if (isFunction(value) && value.length === 0) {
1914
1915
  value = value();
1915
1916
  }
1916
- const activated = !isObservable(value) ? value == null ? void 0 : value[symbolLinked] : void 0;
1917
+ const activated = !isObs ? value == null ? void 0 : value[symbolLinked] : void 0;
1917
1918
  if (activated) {
1918
1919
  node.activationState = activated;
1919
1920
  value = void 0;
@@ -2079,23 +2080,25 @@ function activateNodeBase(node, value) {
2079
2080
  }
2080
2081
  function setToObservable(node, value) {
2081
2082
  var _a;
2082
- const linkedNode = getNode(value);
2083
+ const linkedNode = value ? getNode(value) : void 0;
2083
2084
  if (linkedNode !== node && (linkedNode == null ? void 0 : linkedNode.linkedToNode) !== node) {
2084
2085
  node.linkedToNode = linkedNode;
2085
- linkedNode.linkedFromNodes || (linkedNode.linkedFromNodes = /* @__PURE__ */ new Set());
2086
- linkedNode.linkedFromNodes.add(node);
2087
2086
  (_a = node.linkedToNodeDispose) == null ? void 0 : _a.call(node);
2088
- node.linkedToNodeDispose = onChange(
2089
- linkedNode,
2090
- () => {
2091
- value = peekInternal(linkedNode);
2092
- if (!isFunction(value)) {
2093
- set(node, value);
2094
- }
2095
- },
2096
- { initial: true },
2097
- /* @__PURE__ */ new Set([node])
2098
- );
2087
+ if (linkedNode) {
2088
+ linkedNode.linkedFromNodes || (linkedNode.linkedFromNodes = /* @__PURE__ */ new Set());
2089
+ linkedNode.linkedFromNodes.add(node);
2090
+ node.linkedToNodeDispose = onChange(
2091
+ linkedNode,
2092
+ () => {
2093
+ value = peekInternal(linkedNode);
2094
+ if (!isFunction(value)) {
2095
+ set(node, value);
2096
+ }
2097
+ },
2098
+ { initial: true },
2099
+ /* @__PURE__ */ new Set([node])
2100
+ );
2101
+ }
2099
2102
  }
2100
2103
  return value;
2101
2104
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@legendapp/state",
3
- "version": "3.0.0-alpha.25",
3
+ "version": "3.0.0-alpha.27",
4
4
  "description": "legend-state",
5
5
  "sideEffects": false,
6
6
  "private": false,
@@ -61,7 +61,7 @@ function syncedCrud(props) {
61
61
  const isObs = state.isObservable(result);
62
62
  const value = isObs ? result.peek() : result;
63
63
  if (value) {
64
- result = !isObs && (result[fieldDeleted] || result.__deleted) ? state.internal.symbolDelete : result;
64
+ result = !isObs && (result[fieldDeleted] || result[state.symbolDelete]) ? state.internal.symbolDelete : result;
65
65
  if (asArray) {
66
66
  out.push(result);
67
67
  } else if (asMap) {
@@ -73,6 +73,16 @@ function syncedCrud(props) {
73
73
  }
74
74
  return out;
75
75
  };
76
+ const transformRows = (data) => {
77
+ return Promise.all(
78
+ data.map(
79
+ (value) => (
80
+ // Skip transforming any children with symbolDelete or fieldDeleted because they'll get deleted by resultsToOutType
81
+ value[state.symbolDelete] || fieldDeleted && value[fieldDeleted] ? value : transform.load(value, "get")
82
+ )
83
+ )
84
+ );
85
+ };
76
86
  const get = getFn || listFn ? (getParams) => {
77
87
  const { updateLastSync, lastSync, value } = getParams;
78
88
  if (listFn) {
@@ -89,7 +99,7 @@ function syncedCrud(props) {
89
99
  return resultsToOutType(transformed);
90
100
  }
91
101
  };
92
- const processTransformed = (data) => {
102
+ const processResults = (data) => {
93
103
  data || (data = []);
94
104
  if (fieldUpdatedAt) {
95
105
  const newLastSync = computeLastSync(data, fieldUpdatedAt, fieldCreatedAt);
@@ -99,11 +109,11 @@ function syncedCrud(props) {
99
109
  }
100
110
  let transformed = data;
101
111
  if (transform == null ? void 0 : transform.load) {
102
- transformed = Promise.all(data.map((value2) => transform.load(value2, "get")));
112
+ transformed = transformRows(data);
103
113
  }
104
114
  return state.isPromise(transformed) ? transformed.then(toOut) : toOut(transformed);
105
115
  };
106
- return state.isPromise(listPromise) ? listPromise.then(processTransformed) : processTransformed(listPromise);
116
+ return state.isPromise(listPromise) ? listPromise.then(processResults) : processResults(listPromise);
107
117
  } else if (getFn) {
108
118
  const dataPromise = getFn(getParams);
109
119
  const processData = (data) => {
@@ -299,10 +309,7 @@ function syncedCrud(props) {
299
309
  } else if (fieldDeleted && updateFn) {
300
310
  const valueId = valuePrevious[fieldId];
301
311
  if (valueId) {
302
- updateFn(
303
- { ...valueId ? { [fieldId]: valueId } : {}, [fieldDeleted]: true },
304
- params
305
- );
312
+ updateFn({ ...{ [fieldId]: valueId }, [fieldDeleted]: true }, params);
306
313
  } else {
307
314
  console.error("[legend-state]: deleting item without an id");
308
315
  }
@@ -327,7 +334,7 @@ function syncedCrud(props) {
327
334
  if (newLastSync) {
328
335
  paramsForUpdate.lastSync = newLastSync;
329
336
  }
330
- const rowsTransformed = (transform == null ? void 0 : transform.load) ? await Promise.all(rows.map((row) => transform.load(row, "get"))) : rows;
337
+ const rowsTransformed = (transform == null ? void 0 : transform.load) ? await transformRows(rows) : rows;
331
338
  paramsForUpdate.value = resultsToOutType(rowsTransformed);
332
339
  params.update(paramsForUpdate);
333
340
  }
@@ -59,7 +59,7 @@ function syncedCrud(props) {
59
59
  const isObs = isObservable(result);
60
60
  const value = isObs ? result.peek() : result;
61
61
  if (value) {
62
- result = !isObs && (result[fieldDeleted] || result.__deleted) ? internal.symbolDelete : result;
62
+ result = !isObs && (result[fieldDeleted] || result[symbolDelete]) ? internal.symbolDelete : result;
63
63
  if (asArray) {
64
64
  out.push(result);
65
65
  } else if (asMap) {
@@ -71,6 +71,16 @@ function syncedCrud(props) {
71
71
  }
72
72
  return out;
73
73
  };
74
+ const transformRows = (data) => {
75
+ return Promise.all(
76
+ data.map(
77
+ (value) => (
78
+ // Skip transforming any children with symbolDelete or fieldDeleted because they'll get deleted by resultsToOutType
79
+ value[symbolDelete] || fieldDeleted && value[fieldDeleted] ? value : transform.load(value, "get")
80
+ )
81
+ )
82
+ );
83
+ };
74
84
  const get = getFn || listFn ? (getParams) => {
75
85
  const { updateLastSync, lastSync, value } = getParams;
76
86
  if (listFn) {
@@ -87,7 +97,7 @@ function syncedCrud(props) {
87
97
  return resultsToOutType(transformed);
88
98
  }
89
99
  };
90
- const processTransformed = (data) => {
100
+ const processResults = (data) => {
91
101
  data || (data = []);
92
102
  if (fieldUpdatedAt) {
93
103
  const newLastSync = computeLastSync(data, fieldUpdatedAt, fieldCreatedAt);
@@ -97,11 +107,11 @@ function syncedCrud(props) {
97
107
  }
98
108
  let transformed = data;
99
109
  if (transform == null ? void 0 : transform.load) {
100
- transformed = Promise.all(data.map((value2) => transform.load(value2, "get")));
110
+ transformed = transformRows(data);
101
111
  }
102
112
  return isPromise(transformed) ? transformed.then(toOut) : toOut(transformed);
103
113
  };
104
- return isPromise(listPromise) ? listPromise.then(processTransformed) : processTransformed(listPromise);
114
+ return isPromise(listPromise) ? listPromise.then(processResults) : processResults(listPromise);
105
115
  } else if (getFn) {
106
116
  const dataPromise = getFn(getParams);
107
117
  const processData = (data) => {
@@ -297,10 +307,7 @@ function syncedCrud(props) {
297
307
  } else if (fieldDeleted && updateFn) {
298
308
  const valueId = valuePrevious[fieldId];
299
309
  if (valueId) {
300
- updateFn(
301
- { ...valueId ? { [fieldId]: valueId } : {}, [fieldDeleted]: true },
302
- params
303
- );
310
+ updateFn({ ...{ [fieldId]: valueId }, [fieldDeleted]: true }, params);
304
311
  } else {
305
312
  console.error("[legend-state]: deleting item without an id");
306
313
  }
@@ -325,7 +332,7 @@ function syncedCrud(props) {
325
332
  if (newLastSync) {
326
333
  paramsForUpdate.lastSync = newLastSync;
327
334
  }
328
- const rowsTransformed = (transform == null ? void 0 : transform.load) ? await Promise.all(rows.map((row) => transform.load(row, "get"))) : rows;
335
+ const rowsTransformed = (transform == null ? void 0 : transform.load) ? await transformRows(rows) : rows;
329
336
  paramsForUpdate.value = resultsToOutType(rowsTransformed);
330
337
  params.update(paramsForUpdate);
331
338
  }
@@ -248,8 +248,13 @@ function syncedFirebase(props) {
248
248
  if (!didList)
249
249
  return;
250
250
  const key = snap.key;
251
+ const val = snap.val();
252
+ if (fieldId && !val[fieldId]) {
253
+ val[fieldId] = key;
254
+ }
255
+ val[state.symbolDelete] = true;
251
256
  update2({
252
- value: [{ [key]: state.symbolDelete }],
257
+ value: [val],
253
258
  mode: "assign"
254
259
  });
255
260
  };
@@ -246,8 +246,13 @@ function syncedFirebase(props) {
246
246
  if (!didList)
247
247
  return;
248
248
  const key = snap.key;
249
+ const val = snap.val();
250
+ if (fieldId && !val[fieldId]) {
251
+ val[fieldId] = key;
252
+ }
253
+ val[symbolDelete] = true;
249
254
  update2({
250
- value: [{ [key]: symbolDelete }],
255
+ value: [val],
251
256
  mode: "assign"
252
257
  });
253
258
  };
@@ -263,7 +263,7 @@ function syncedKeel(props) {
263
263
  onSaved,
264
264
  fieldCreatedAt,
265
265
  fieldUpdatedAt,
266
- fieldDeleted: fieldDeleted || "deleted",
266
+ fieldDeleted,
267
267
  changesSince,
268
268
  updatePartial: true,
269
269
  subscribe,
@@ -257,7 +257,7 @@ function syncedKeel(props) {
257
257
  onSaved,
258
258
  fieldCreatedAt,
259
259
  fieldUpdatedAt,
260
- fieldDeleted: fieldDeleted || "deleted",
260
+ fieldDeleted,
261
261
  changesSince,
262
262
  updatePartial: true,
263
263
  subscribe,
@@ -4,10 +4,14 @@ import { SyncedCrudPropsBase, CrudAsOption, SyncedCrudReturnType, SyncedCrudProp
4
4
  import { PostgrestQueryBuilder, PostgrestFilterBuilder } from '@supabase/postgrest-js';
5
5
  import { SupabaseClient } from '@supabase/supabase-js';
6
6
 
7
+ type DatabaseOf<Client extends SupabaseClient> = Client extends SupabaseClient<infer TDB> ? TDB : never;
8
+ type SchemaNameOf<Client extends SupabaseClient> = keyof DatabaseOf<Client>;
9
+ type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
10
+ type IsUnionOfStrings<T> = [T] extends [string] ? ([T] extends [UnionToIntersection<T>] ? false : true) : false;
7
11
  type SupabaseSchemaOf<Client extends SupabaseClient> = Client extends SupabaseClient<infer _, infer __, infer Schema> ? Schema : never;
8
- type SupabaseTableOf<Client extends SupabaseClient> = SupabaseSchemaOf<Client>['Tables'];
9
- type SupabaseCollectionOf<Client extends SupabaseClient> = keyof SupabaseTableOf<Client>;
10
- type SupabaseRowOf<Client extends SupabaseClient, Collection extends SupabaseCollectionOf<Client>> = SupabaseTableOf<Client>[Collection]['Row'];
12
+ type SupabaseTableOf<Client extends SupabaseClient, SchemaName extends SchemaNameOf<Client>> = DatabaseOf<Client>[SchemaName]['Tables'];
13
+ type SupabaseCollectionOf<Client extends SupabaseClient, SchemaName extends SchemaNameOf<Client>> = keyof SupabaseTableOf<Client, IsUnionOfStrings<SchemaName> extends true ? 'public' : SchemaName>;
14
+ type SupabaseRowOf<Client extends SupabaseClient, Collection extends SupabaseCollectionOf<Client, SchemaName>, SchemaName extends SchemaNameOf<Client>> = SupabaseTableOf<Client, SchemaName>[Collection]['Row'];
11
15
  type SyncedSupabaseConfig<TRemote extends {
12
16
  id: string | number;
13
17
  }, TLocal> = Omit<SyncedCrudPropsBase<TRemote, TLocal>, 'create' | 'update' | 'delete'>;
@@ -20,10 +24,11 @@ interface SyncedSupabaseConfiguration extends Omit<SyncedSupabaseConfig<{
20
24
  enabled?: Observable<boolean>;
21
25
  as?: Exclude<CrudAsOption, 'value'>;
22
26
  }
23
- interface SyncedSupabaseProps<Client extends SupabaseClient, Collection extends SupabaseCollectionOf<Client>, TOption extends CrudAsOption = 'object', TRemote extends SupabaseRowOf<Client, Collection> = SupabaseRowOf<Client, Collection>, TLocal = TRemote> extends SyncedSupabaseConfig<TRemote, TLocal>, SyncedCrudPropsMany<TRemote, TRemote, TOption> {
27
+ interface SyncedSupabaseProps<Client extends SupabaseClient<any, any>, Collection extends SupabaseCollectionOf<Client, SchemaName>, SchemaName extends SchemaNameOf<Client>, TOption extends CrudAsOption = 'object', TRemote extends SupabaseRowOf<Client, Collection, SchemaName> = SupabaseRowOf<Client, Collection, SchemaName>, TLocal = TRemote> extends SyncedSupabaseConfig<TRemote, TLocal>, SyncedCrudPropsMany<TRemote, TRemote, TOption> {
24
28
  supabase: Client;
25
29
  collection: Collection;
26
- select?: (query: PostgrestQueryBuilder<SupabaseSchemaOf<Client>, SupabaseTableOf<Client>[Collection], Collection>) => PostgrestFilterBuilder<SupabaseSchemaOf<Client>, TRemote, TRemote[], Collection, []>;
30
+ schema?: SchemaName;
31
+ select?: (query: PostgrestQueryBuilder<SupabaseSchemaOf<Client>, SupabaseTableOf<Client, SchemaName>[Collection], Collection>) => PostgrestFilterBuilder<SupabaseSchemaOf<Client>, TRemote, TRemote[], Collection, []>;
27
32
  filter?: (select: PostgrestFilterBuilder<SupabaseSchemaOf<Client>, TRemote, TRemote[], Collection, []>, params: SyncedGetParams<TRemote>) => PostgrestFilterBuilder<SupabaseSchemaOf<Client>, TRemote, TRemote[], Collection, []>;
28
33
  actions?: ('create' | 'read' | 'update' | 'delete')[];
29
34
  realtime?: boolean | {
@@ -34,6 +39,6 @@ interface SyncedSupabaseProps<Client extends SupabaseClient, Collection extends
34
39
  }
35
40
  declare function getSyncedSupabaseConfiguration(): SyncedSupabaseConfiguration;
36
41
  declare function configureSyncedSupabase(config: SyncedSupabaseConfiguration): void;
37
- declare function syncedSupabase<Client extends SupabaseClient, Collection extends SupabaseCollectionOf<Client> & string, AsOption extends CrudAsOption = 'object', TRemote extends SupabaseRowOf<Client, Collection> = SupabaseRowOf<Client, Collection>, TLocal = TRemote>(props: SyncedSupabaseProps<Client, Collection, AsOption, TRemote, TLocal>): SyncedCrudReturnType<TLocal, AsOption>;
42
+ declare function syncedSupabase<Client extends SupabaseClient<any, any>, Collection extends SupabaseCollectionOf<Client, SchemaName> & string, SchemaName extends SchemaNameOf<Client>, AsOption extends CrudAsOption = 'object', TRemote extends SupabaseRowOf<Client, Collection, SchemaName> = SupabaseRowOf<Client, Collection, SchemaName>, TLocal = TRemote>(props: SyncedSupabaseProps<Client, Collection, SchemaName, AsOption, TRemote, TLocal>): SyncedCrudReturnType<TLocal, AsOption>;
38
43
 
39
44
  export { type SupabaseCollectionOf, type SupabaseRowOf, type SupabaseSchemaOf, type SupabaseTableOf, type SyncedSupabaseConfig, type SyncedSupabaseConfiguration, configureSyncedSupabase, getSyncedSupabaseConfiguration, syncedSupabase };
@@ -4,10 +4,14 @@ import { SyncedCrudPropsBase, CrudAsOption, SyncedCrudReturnType, SyncedCrudProp
4
4
  import { PostgrestQueryBuilder, PostgrestFilterBuilder } from '@supabase/postgrest-js';
5
5
  import { SupabaseClient } from '@supabase/supabase-js';
6
6
 
7
+ type DatabaseOf<Client extends SupabaseClient> = Client extends SupabaseClient<infer TDB> ? TDB : never;
8
+ type SchemaNameOf<Client extends SupabaseClient> = keyof DatabaseOf<Client>;
9
+ type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
10
+ type IsUnionOfStrings<T> = [T] extends [string] ? ([T] extends [UnionToIntersection<T>] ? false : true) : false;
7
11
  type SupabaseSchemaOf<Client extends SupabaseClient> = Client extends SupabaseClient<infer _, infer __, infer Schema> ? Schema : never;
8
- type SupabaseTableOf<Client extends SupabaseClient> = SupabaseSchemaOf<Client>['Tables'];
9
- type SupabaseCollectionOf<Client extends SupabaseClient> = keyof SupabaseTableOf<Client>;
10
- type SupabaseRowOf<Client extends SupabaseClient, Collection extends SupabaseCollectionOf<Client>> = SupabaseTableOf<Client>[Collection]['Row'];
12
+ type SupabaseTableOf<Client extends SupabaseClient, SchemaName extends SchemaNameOf<Client>> = DatabaseOf<Client>[SchemaName]['Tables'];
13
+ type SupabaseCollectionOf<Client extends SupabaseClient, SchemaName extends SchemaNameOf<Client>> = keyof SupabaseTableOf<Client, IsUnionOfStrings<SchemaName> extends true ? 'public' : SchemaName>;
14
+ type SupabaseRowOf<Client extends SupabaseClient, Collection extends SupabaseCollectionOf<Client, SchemaName>, SchemaName extends SchemaNameOf<Client>> = SupabaseTableOf<Client, SchemaName>[Collection]['Row'];
11
15
  type SyncedSupabaseConfig<TRemote extends {
12
16
  id: string | number;
13
17
  }, TLocal> = Omit<SyncedCrudPropsBase<TRemote, TLocal>, 'create' | 'update' | 'delete'>;
@@ -20,10 +24,11 @@ interface SyncedSupabaseConfiguration extends Omit<SyncedSupabaseConfig<{
20
24
  enabled?: Observable<boolean>;
21
25
  as?: Exclude<CrudAsOption, 'value'>;
22
26
  }
23
- interface SyncedSupabaseProps<Client extends SupabaseClient, Collection extends SupabaseCollectionOf<Client>, TOption extends CrudAsOption = 'object', TRemote extends SupabaseRowOf<Client, Collection> = SupabaseRowOf<Client, Collection>, TLocal = TRemote> extends SyncedSupabaseConfig<TRemote, TLocal>, SyncedCrudPropsMany<TRemote, TRemote, TOption> {
27
+ interface SyncedSupabaseProps<Client extends SupabaseClient<any, any>, Collection extends SupabaseCollectionOf<Client, SchemaName>, SchemaName extends SchemaNameOf<Client>, TOption extends CrudAsOption = 'object', TRemote extends SupabaseRowOf<Client, Collection, SchemaName> = SupabaseRowOf<Client, Collection, SchemaName>, TLocal = TRemote> extends SyncedSupabaseConfig<TRemote, TLocal>, SyncedCrudPropsMany<TRemote, TRemote, TOption> {
24
28
  supabase: Client;
25
29
  collection: Collection;
26
- select?: (query: PostgrestQueryBuilder<SupabaseSchemaOf<Client>, SupabaseTableOf<Client>[Collection], Collection>) => PostgrestFilterBuilder<SupabaseSchemaOf<Client>, TRemote, TRemote[], Collection, []>;
30
+ schema?: SchemaName;
31
+ select?: (query: PostgrestQueryBuilder<SupabaseSchemaOf<Client>, SupabaseTableOf<Client, SchemaName>[Collection], Collection>) => PostgrestFilterBuilder<SupabaseSchemaOf<Client>, TRemote, TRemote[], Collection, []>;
27
32
  filter?: (select: PostgrestFilterBuilder<SupabaseSchemaOf<Client>, TRemote, TRemote[], Collection, []>, params: SyncedGetParams<TRemote>) => PostgrestFilterBuilder<SupabaseSchemaOf<Client>, TRemote, TRemote[], Collection, []>;
28
33
  actions?: ('create' | 'read' | 'update' | 'delete')[];
29
34
  realtime?: boolean | {
@@ -34,6 +39,6 @@ interface SyncedSupabaseProps<Client extends SupabaseClient, Collection extends
34
39
  }
35
40
  declare function getSyncedSupabaseConfiguration(): SyncedSupabaseConfiguration;
36
41
  declare function configureSyncedSupabase(config: SyncedSupabaseConfiguration): void;
37
- declare function syncedSupabase<Client extends SupabaseClient, Collection extends SupabaseCollectionOf<Client> & string, AsOption extends CrudAsOption = 'object', TRemote extends SupabaseRowOf<Client, Collection> = SupabaseRowOf<Client, Collection>, TLocal = TRemote>(props: SyncedSupabaseProps<Client, Collection, AsOption, TRemote, TLocal>): SyncedCrudReturnType<TLocal, AsOption>;
42
+ declare function syncedSupabase<Client extends SupabaseClient<any, any>, Collection extends SupabaseCollectionOf<Client, SchemaName> & string, SchemaName extends SchemaNameOf<Client>, AsOption extends CrudAsOption = 'object', TRemote extends SupabaseRowOf<Client, Collection, SchemaName> = SupabaseRowOf<Client, Collection, SchemaName>, TLocal = TRemote>(props: SyncedSupabaseProps<Client, Collection, SchemaName, AsOption, TRemote, TLocal>): SyncedCrudReturnType<TLocal, AsOption>;
38
43
 
39
44
  export { type SupabaseCollectionOf, type SupabaseRowOf, type SupabaseSchemaOf, type SupabaseTableOf, type SyncedSupabaseConfig, type SyncedSupabaseConfiguration, configureSyncedSupabase, getSyncedSupabaseConfiguration, syncedSupabase };
@@ -24,6 +24,7 @@ function syncedSupabase(props) {
24
24
  supabase: client,
25
25
  collection,
26
26
  select: selectFn,
27
+ schema,
27
28
  filter,
28
29
  actions,
29
30
  fieldCreatedAt: fieldCreatedAtParam,
@@ -44,7 +45,8 @@ function syncedSupabase(props) {
44
45
  const fieldDeleted = fieldDeletedParam || (changesSince === "last-sync" ? "deleted" : void 0);
45
46
  const list = !actions || actions.includes("read") ? async (params) => {
46
47
  const { lastSync } = params;
47
- const from = client.from(collection);
48
+ const clientSchema = schema ? client.schema(schema) : client;
49
+ const from = clientSchema.from(collection);
48
50
  let select = selectFn ? selectFn(from) : from.select();
49
51
  if (changesSince === "last-sync" && lastSync) {
50
52
  const date = new Date(lastSync).toISOString();
@@ -91,13 +93,13 @@ function syncedSupabase(props) {
91
93
  }
92
94
  } : void 0;
93
95
  const subscribe = realtime ? ({ node, value$, update: update2 }) => {
94
- const { filter: filter2, schema } = state.isObject(realtime) ? realtime : {};
96
+ const { filter: filter2, schema: schema2 } = state.isObject(realtime) ? realtime : {};
95
97
  const channel = client.channel(`LS_${node.key || ""}${channelNum++}`).on(
96
98
  "postgres_changes",
97
99
  {
98
100
  event: "*",
99
101
  table: collection,
100
- schema: schema || "public",
102
+ schema: schema2 || "public",
101
103
  filter: filter2 || void 0
102
104
  },
103
105
  (payload) => {
@@ -116,9 +118,9 @@ function syncedSupabase(props) {
116
118
  });
117
119
  }
118
120
  } else if (eventType === "DELETE") {
119
- const { id } = old;
121
+ old[state.symbolDelete] = true;
120
122
  update2({
121
- value: [{ [id]: state.symbolDelete }]
123
+ value: [old]
122
124
  });
123
125
  }
124
126
  }
@@ -22,6 +22,7 @@ function syncedSupabase(props) {
22
22
  supabase: client,
23
23
  collection,
24
24
  select: selectFn,
25
+ schema,
25
26
  filter,
26
27
  actions,
27
28
  fieldCreatedAt: fieldCreatedAtParam,
@@ -42,7 +43,8 @@ function syncedSupabase(props) {
42
43
  const fieldDeleted = fieldDeletedParam || (changesSince === "last-sync" ? "deleted" : void 0);
43
44
  const list = !actions || actions.includes("read") ? async (params) => {
44
45
  const { lastSync } = params;
45
- const from = client.from(collection);
46
+ const clientSchema = schema ? client.schema(schema) : client;
47
+ const from = clientSchema.from(collection);
46
48
  let select = selectFn ? selectFn(from) : from.select();
47
49
  if (changesSince === "last-sync" && lastSync) {
48
50
  const date = new Date(lastSync).toISOString();
@@ -89,13 +91,13 @@ function syncedSupabase(props) {
89
91
  }
90
92
  } : void 0;
91
93
  const subscribe = realtime ? ({ node, value$, update: update2 }) => {
92
- const { filter: filter2, schema } = isObject(realtime) ? realtime : {};
94
+ const { filter: filter2, schema: schema2 } = isObject(realtime) ? realtime : {};
93
95
  const channel = client.channel(`LS_${node.key || ""}${channelNum++}`).on(
94
96
  "postgres_changes",
95
97
  {
96
98
  event: "*",
97
99
  table: collection,
98
- schema: schema || "public",
100
+ schema: schema2 || "public",
99
101
  filter: filter2 || void 0
100
102
  },
101
103
  (payload) => {
@@ -114,9 +116,9 @@ function syncedSupabase(props) {
114
116
  });
115
117
  }
116
118
  } else if (eventType === "DELETE") {
117
- const { id } = old;
119
+ old[symbolDelete] = true;
118
120
  update2({
119
- value: [{ [id]: symbolDelete }]
121
+ value: [old]
120
122
  });
121
123
  }
122
124
  }
package/sync.js CHANGED
@@ -241,12 +241,11 @@ function mergeChanges(changes) {
241
241
  function mergeQueuedChanges(allChanges) {
242
242
  const changesByOptionsRemote = /* @__PURE__ */ new Map();
243
243
  const changesByOptionsLocal = /* @__PURE__ */ new Map();
244
- const previousByOptions = /* @__PURE__ */ new Map();
245
244
  const outRemote = /* @__PURE__ */ new Map();
246
245
  const outLocal = /* @__PURE__ */ new Map();
247
246
  for (let i = 0; i < allChanges.length; i++) {
248
247
  const value = allChanges[i];
249
- const { changes, inRemoteChange, getPrevious, syncOptions } = value;
248
+ const { changes, inRemoteChange, syncOptions } = value;
250
249
  const targetMap = inRemoteChange ? outRemote : outLocal;
251
250
  const changesMap = inRemoteChange ? changesByOptionsRemote : changesByOptionsLocal;
252
251
  const existing = changesMap.get(syncOptions);
@@ -254,9 +253,6 @@ function mergeQueuedChanges(allChanges) {
254
253
  const merged = mergeChanges(newChanges);
255
254
  changesMap.set(syncOptions, merged);
256
255
  value.changes = merged;
257
- if (!previousByOptions.has(syncOptions)) {
258
- previousByOptions.set(syncOptions, getPrevious());
259
- }
260
256
  targetMap.set(syncOptions, value);
261
257
  }
262
258
  return Array.from(outRemote.values()).concat(Array.from(outLocal.values()));
package/sync.mjs CHANGED
@@ -239,12 +239,11 @@ function mergeChanges(changes) {
239
239
  function mergeQueuedChanges(allChanges) {
240
240
  const changesByOptionsRemote = /* @__PURE__ */ new Map();
241
241
  const changesByOptionsLocal = /* @__PURE__ */ new Map();
242
- const previousByOptions = /* @__PURE__ */ new Map();
243
242
  const outRemote = /* @__PURE__ */ new Map();
244
243
  const outLocal = /* @__PURE__ */ new Map();
245
244
  for (let i = 0; i < allChanges.length; i++) {
246
245
  const value = allChanges[i];
247
- const { changes, inRemoteChange, getPrevious, syncOptions } = value;
246
+ const { changes, inRemoteChange, syncOptions } = value;
248
247
  const targetMap = inRemoteChange ? outRemote : outLocal;
249
248
  const changesMap = inRemoteChange ? changesByOptionsRemote : changesByOptionsLocal;
250
249
  const existing = changesMap.get(syncOptions);
@@ -252,9 +251,6 @@ function mergeQueuedChanges(allChanges) {
252
251
  const merged = mergeChanges(newChanges);
253
252
  changesMap.set(syncOptions, merged);
254
253
  value.changes = merged;
255
- if (!previousByOptions.has(syncOptions)) {
256
- previousByOptions.set(syncOptions, getPrevious());
257
- }
258
254
  targetMap.set(syncOptions, value);
259
255
  }
260
256
  return Array.from(outRemote.values()).concat(Array.from(outLocal.values()));