@electric-sql/react 0.4.6 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -1
- package/dist/cjs/index.cjs +21 -12
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/index.browser.mjs +1 -1
- package/dist/index.browser.mjs.map +1 -1
- package/dist/index.legacy-esm.js +21 -12
- package/dist/index.legacy-esm.js.map +1 -1
- package/dist/index.mjs +21 -12
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
- package/src/react-hooks.tsx +34 -20
package/README.md
CHANGED
package/dist/cjs/index.cjs
CHANGED
|
@@ -81,7 +81,7 @@ function preloadShape(options) {
|
|
|
81
81
|
return __async(this, null, function* () {
|
|
82
82
|
const shapeStream = getShapeStream(options);
|
|
83
83
|
const shape = getShape(shapeStream);
|
|
84
|
-
yield shape.
|
|
84
|
+
yield shape.rows;
|
|
85
85
|
return shape;
|
|
86
86
|
});
|
|
87
87
|
}
|
|
@@ -89,23 +89,32 @@ function sortedOptionsHash(options) {
|
|
|
89
89
|
return JSON.stringify(options, Object.keys(options).sort());
|
|
90
90
|
}
|
|
91
91
|
function getShapeStream(options) {
|
|
92
|
+
var _a;
|
|
92
93
|
const shapeHash = sortedOptionsHash(options);
|
|
93
94
|
if (streamCache.has(shapeHash)) {
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
95
|
+
const stream = streamCache.get(shapeHash);
|
|
96
|
+
if (stream.error === void 0 && !((_a = stream.options.signal) == null ? void 0 : _a.aborted)) {
|
|
97
|
+
return stream;
|
|
98
|
+
}
|
|
99
|
+
streamCache.delete(shapeHash);
|
|
100
|
+
shapeCache.delete(stream);
|
|
99
101
|
}
|
|
102
|
+
const newShapeStream = new import_client.ShapeStream(options);
|
|
103
|
+
streamCache.set(shapeHash, newShapeStream);
|
|
104
|
+
return newShapeStream;
|
|
100
105
|
}
|
|
101
106
|
function getShape(shapeStream) {
|
|
107
|
+
var _a;
|
|
102
108
|
if (shapeCache.has(shapeStream)) {
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
109
|
+
if (shapeStream.error === void 0 && !((_a = shapeStream.options.signal) == null ? void 0 : _a.aborted)) {
|
|
110
|
+
return shapeCache.get(shapeStream);
|
|
111
|
+
}
|
|
112
|
+
streamCache.delete(sortedOptionsHash(shapeStream.options));
|
|
113
|
+
shapeCache.delete(shapeStream);
|
|
108
114
|
}
|
|
115
|
+
const newShape = new import_client.Shape(shapeStream);
|
|
116
|
+
shapeCache.set(shapeStream, newShape);
|
|
117
|
+
return newShape;
|
|
109
118
|
}
|
|
110
119
|
function shapeSubscribe(shape, callback) {
|
|
111
120
|
const unsubscribe = shape.subscribe(callback);
|
|
@@ -115,7 +124,7 @@ function shapeSubscribe(shape, callback) {
|
|
|
115
124
|
}
|
|
116
125
|
function parseShapeData(shape) {
|
|
117
126
|
return {
|
|
118
|
-
data:
|
|
127
|
+
data: shape.currentRows,
|
|
119
128
|
isLoading: shape.isLoading(),
|
|
120
129
|
lastSyncedAt: shape.lastSyncedAt(),
|
|
121
130
|
isError: shape.error !== false,
|
package/dist/cjs/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.ts","../../src/react-hooks.tsx"],"sourcesContent":["export * from './react-hooks'\n","import {\n Shape,\n ShapeStream,\n ShapeStreamOptions,\n Row,\n GetExtensions,\n} from '@electric-sql/client'\nimport React from 'react'\nimport { useSyncExternalStoreWithSelector } from 'use-sync-external-store/with-selector.js'\n\ntype UnknownShape = Shape<Row<unknown>>\ntype UnknownShapeStream = ShapeStream<Row<unknown>>\n\nconst streamCache = new Map<string, UnknownShapeStream>()\nconst shapeCache = new Map<UnknownShapeStream, UnknownShape>()\n\nexport async function preloadShape<T extends Row<unknown> = Row>(\n options: ShapeStreamOptions<GetExtensions<T>>\n): Promise<Shape<T>> {\n const shapeStream = getShapeStream<T>(options)\n const shape = getShape<T>(shapeStream)\n await shape.
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts","../../src/react-hooks.tsx"],"sourcesContent":["export * from './react-hooks'\n","import {\n Shape,\n ShapeStream,\n ShapeStreamOptions,\n Row,\n GetExtensions,\n} from '@electric-sql/client'\nimport React from 'react'\nimport { useSyncExternalStoreWithSelector } from 'use-sync-external-store/with-selector.js'\n\ntype UnknownShape = Shape<Row<unknown>>\ntype UnknownShapeStream = ShapeStream<Row<unknown>>\n\nconst streamCache = new Map<string, UnknownShapeStream>()\nconst shapeCache = new Map<UnknownShapeStream, UnknownShape>()\n\nexport async function preloadShape<T extends Row<unknown> = Row>(\n options: ShapeStreamOptions<GetExtensions<T>>\n): Promise<Shape<T>> {\n const shapeStream = getShapeStream<T>(options)\n const shape = getShape<T>(shapeStream)\n await shape.rows\n return shape\n}\n\nexport function sortedOptionsHash<T>(options: ShapeStreamOptions<T>): string {\n return JSON.stringify(options, Object.keys(options).sort())\n}\n\nexport function getShapeStream<T extends Row<unknown>>(\n options: ShapeStreamOptions<GetExtensions<T>>\n): ShapeStream<T> {\n const shapeHash = sortedOptionsHash(options)\n\n // If the stream is already cached, return it if valid\n if (streamCache.has(shapeHash)) {\n const stream = streamCache.get(shapeHash)! as ShapeStream<T>\n if (stream.error === undefined && !stream.options.signal?.aborted) {\n return stream\n }\n\n // if stream is cached but errored/aborted, remove it and related shapes\n streamCache.delete(shapeHash)\n shapeCache.delete(stream)\n }\n\n const newShapeStream = new ShapeStream<T>(options)\n\n streamCache.set(shapeHash, newShapeStream)\n\n // Return the created shape\n return newShapeStream\n}\n\nexport function getShape<T extends Row<unknown>>(\n shapeStream: ShapeStream<T>\n): Shape<T> {\n // If the stream is already cached, return it if valid\n if (shapeCache.has(shapeStream)) {\n if (\n shapeStream.error === undefined &&\n !shapeStream.options.signal?.aborted\n ) {\n return shapeCache.get(shapeStream)! as Shape<T>\n }\n\n // if stream is cached but errored/aborted, remove it and related shapes\n streamCache.delete(sortedOptionsHash(shapeStream.options))\n shapeCache.delete(shapeStream)\n }\n\n const newShape = new Shape<T>(shapeStream)\n\n shapeCache.set(shapeStream, newShape)\n\n // Return the created shape\n return newShape\n}\n\nexport interface UseShapeResult<T extends Row<unknown> = Row> {\n /**\n * The array of rows that make up the Shape.\n * @type {T[]}\n */\n data: T[]\n /**\n * The Shape instance used by this useShape\n * @type {Shape<T>}\n */\n shape: Shape<T>\n /** True during initial fetch. False afterwise. */\n isLoading: boolean\n /** Unix time at which we last synced. Undefined when `isLoading` is true. */\n lastSyncedAt?: number\n error: Shape<T>[`error`]\n isError: boolean\n}\n\nfunction shapeSubscribe<T extends Row<unknown>>(\n shape: Shape<T>,\n callback: () => void\n) {\n const unsubscribe = shape.subscribe(callback)\n return () => {\n unsubscribe()\n }\n}\n\nfunction parseShapeData<T extends Row<unknown>>(\n shape: Shape<T>\n): UseShapeResult<T> {\n return {\n data: shape.currentRows,\n isLoading: shape.isLoading(),\n lastSyncedAt: shape.lastSyncedAt(),\n isError: shape.error !== false,\n shape,\n error: shape.error,\n }\n}\n\nfunction identity<T>(arg: T): T {\n return arg\n}\n\ninterface UseShapeOptions<SourceData extends Row<unknown>, Selection>\n extends ShapeStreamOptions<GetExtensions<SourceData>> {\n selector?: (value: UseShapeResult<SourceData>) => Selection\n}\n\nexport function useShape<\n SourceData extends Row<unknown> = Row,\n Selection = UseShapeResult<SourceData>,\n>({\n selector = identity as (arg: UseShapeResult<SourceData>) => Selection,\n ...options\n}: UseShapeOptions<SourceData, Selection>): Selection {\n const shapeStream = getShapeStream<SourceData>(\n options as ShapeStreamOptions<GetExtensions<SourceData>>\n )\n const shape = getShape<SourceData>(shapeStream)\n\n const useShapeData = React.useMemo(() => {\n let latestShapeData = parseShapeData(shape)\n const getSnapshot = () => latestShapeData\n const subscribe = (onStoreChange: () => void) =>\n shapeSubscribe(shape, () => {\n latestShapeData = parseShapeData(shape)\n onStoreChange()\n })\n\n return () => {\n return useSyncExternalStoreWithSelector(\n subscribe,\n getSnapshot,\n getSnapshot,\n selector\n )\n }\n }, [shape, selector])\n\n return useShapeData()\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,oBAMO;AACP,mBAAkB;AAClB,2BAAiD;AAKjD,IAAM,cAAc,oBAAI,IAAgC;AACxD,IAAM,aAAa,oBAAI,IAAsC;AAE7D,SAAsB,aACpB,SACmB;AAAA;AACnB,UAAM,cAAc,eAAkB,OAAO;AAC7C,UAAM,QAAQ,SAAY,WAAW;AACrC,UAAM,MAAM;AACZ,WAAO;AAAA,EACT;AAAA;AAEO,SAAS,kBAAqB,SAAwC;AAC3E,SAAO,KAAK,UAAU,SAAS,OAAO,KAAK,OAAO,EAAE,KAAK,CAAC;AAC5D;AAEO,SAAS,eACd,SACgB;AA/BlB;AAgCE,QAAM,YAAY,kBAAkB,OAAO;AAG3C,MAAI,YAAY,IAAI,SAAS,GAAG;AAC9B,UAAM,SAAS,YAAY,IAAI,SAAS;AACxC,QAAI,OAAO,UAAU,UAAa,GAAC,YAAO,QAAQ,WAAf,mBAAuB,UAAS;AACjE,aAAO;AAAA,IACT;AAGA,gBAAY,OAAO,SAAS;AAC5B,eAAW,OAAO,MAAM;AAAA,EAC1B;AAEA,QAAM,iBAAiB,IAAI,0BAAe,OAAO;AAEjD,cAAY,IAAI,WAAW,cAAc;AAGzC,SAAO;AACT;AAEO,SAAS,SACd,aACU;AAxDZ;AA0DE,MAAI,WAAW,IAAI,WAAW,GAAG;AAC/B,QACE,YAAY,UAAU,UACtB,GAAC,iBAAY,QAAQ,WAApB,mBAA4B,UAC7B;AACA,aAAO,WAAW,IAAI,WAAW;AAAA,IACnC;AAGA,gBAAY,OAAO,kBAAkB,YAAY,OAAO,CAAC;AACzD,eAAW,OAAO,WAAW;AAAA,EAC/B;AAEA,QAAM,WAAW,IAAI,oBAAS,WAAW;AAEzC,aAAW,IAAI,aAAa,QAAQ;AAGpC,SAAO;AACT;AAqBA,SAAS,eACP,OACA,UACA;AACA,QAAM,cAAc,MAAM,UAAU,QAAQ;AAC5C,SAAO,MAAM;AACX,gBAAY;AAAA,EACd;AACF;AAEA,SAAS,eACP,OACmB;AACnB,SAAO;AAAA,IACL,MAAM,MAAM;AAAA,IACZ,WAAW,MAAM,UAAU;AAAA,IAC3B,cAAc,MAAM,aAAa;AAAA,IACjC,SAAS,MAAM,UAAU;AAAA,IACzB;AAAA,IACA,OAAO,MAAM;AAAA,EACf;AACF;AAEA,SAAS,SAAY,KAAW;AAC9B,SAAO;AACT;AAOO,SAAS,SAGd,IAGoD;AAHpD,eACA;AAAA,eAAW;AAAA,EAtIb,IAqIE,IAEG,oBAFH,IAEG;AAAA,IADH;AAAA;AAGA,QAAM,cAAc;AAAA,IAClB;AAAA,EACF;AACA,QAAM,QAAQ,SAAqB,WAAW;AAE9C,QAAM,eAAe,aAAAA,QAAM,QAAQ,MAAM;AACvC,QAAI,kBAAkB,eAAe,KAAK;AAC1C,UAAM,cAAc,MAAM;AAC1B,UAAM,YAAY,CAAC,kBACjB,eAAe,OAAO,MAAM;AAC1B,wBAAkB,eAAe,KAAK;AACtC,oBAAc;AAAA,IAChB,CAAC;AAEH,WAAO,MAAM;AACX,iBAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF,GAAG,CAAC,OAAO,QAAQ,CAAC;AAEpB,SAAO,aAAa;AACtB;","names":["React"]}
|
package/dist/index.browser.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var h=Object.getOwnPropertySymbols;var R=Object.prototype.hasOwnProperty,
|
|
1
|
+
var h=Object.getOwnPropertySymbols;var R=Object.prototype.hasOwnProperty,k=Object.prototype.propertyIsEnumerable;var w=(e,t)=>{var n={};for(var o in e)R.call(e,o)&&t.indexOf(o)<0&&(n[o]=e[o]);if(e!=null&&h)for(var o of h(e))t.indexOf(o)<0&&k.call(e,o)&&(n[o]=e[o]);return n};var d=(e,t,n)=>new Promise((o,r)=>{var s=a=>{try{S(n.next(a))}catch(i){r(i)}},c=a=>{try{S(n.throw(a))}catch(i){r(i)}},S=a=>a.done?o(a.value):Promise.resolve(a.value).then(s,c);S((n=n.apply(e,t)).next())});import{Shape as b,ShapeStream as g}from"@electric-sql/client";import D from"react";import{useSyncExternalStoreWithSelector as U}from"use-sync-external-store/with-selector.js";var p=new Map,u=new Map;function H(e){return d(this,null,function*(){let t=m(e),n=f(t);return yield n.rows,n})}function T(e){return JSON.stringify(e,Object.keys(e).sort())}function m(e){var o;let t=T(e);if(p.has(t)){let r=p.get(t);if(r.error===void 0&&!((o=r.options.signal)!=null&&o.aborted))return r;p.delete(t),u.delete(r)}let n=new g(e);return p.set(t,n),n}function f(e){var n;if(u.has(e)){if(e.error===void 0&&!((n=e.options.signal)!=null&&n.aborted))return u.get(e);p.delete(T(e.options)),u.delete(e)}let t=new b(e);return u.set(e,t),t}function O(e,t){let n=e.subscribe(t);return()=>{n()}}function l(e){return{data:e.currentRows,isLoading:e.isLoading(),lastSyncedAt:e.lastSyncedAt(),isError:e.error!==!1,shape:e,error:e.error}}function y(e){return e}function j(n){var o=n,{selector:e=y}=o,t=w(o,["selector"]);let r=m(t),s=f(r);return D.useMemo(()=>{let S=l(s),a=()=>S,i=x=>O(s,()=>{S=l(s),x()});return()=>U(i,a,a,e)},[s,e])()}export{f as getShape,m as getShapeStream,H as preloadShape,T as sortedOptionsHash,j as useShape};
|
|
2
2
|
//# sourceMappingURL=index.browser.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/react-hooks.tsx"],"sourcesContent":["import {\n Shape,\n ShapeStream,\n ShapeStreamOptions,\n Row,\n GetExtensions,\n} from '@electric-sql/client'\nimport React from 'react'\nimport { useSyncExternalStoreWithSelector } from 'use-sync-external-store/with-selector.js'\n\ntype UnknownShape = Shape<Row<unknown>>\ntype UnknownShapeStream = ShapeStream<Row<unknown>>\n\nconst streamCache = new Map<string, UnknownShapeStream>()\nconst shapeCache = new Map<UnknownShapeStream, UnknownShape>()\n\nexport async function preloadShape<T extends Row<unknown> = Row>(\n options: ShapeStreamOptions<GetExtensions<T>>\n): Promise<Shape<T>> {\n const shapeStream = getShapeStream<T>(options)\n const shape = getShape<T>(shapeStream)\n await shape.
|
|
1
|
+
{"version":3,"sources":["../src/react-hooks.tsx"],"sourcesContent":["import {\n Shape,\n ShapeStream,\n ShapeStreamOptions,\n Row,\n GetExtensions,\n} from '@electric-sql/client'\nimport React from 'react'\nimport { useSyncExternalStoreWithSelector } from 'use-sync-external-store/with-selector.js'\n\ntype UnknownShape = Shape<Row<unknown>>\ntype UnknownShapeStream = ShapeStream<Row<unknown>>\n\nconst streamCache = new Map<string, UnknownShapeStream>()\nconst shapeCache = new Map<UnknownShapeStream, UnknownShape>()\n\nexport async function preloadShape<T extends Row<unknown> = Row>(\n options: ShapeStreamOptions<GetExtensions<T>>\n): Promise<Shape<T>> {\n const shapeStream = getShapeStream<T>(options)\n const shape = getShape<T>(shapeStream)\n await shape.rows\n return shape\n}\n\nexport function sortedOptionsHash<T>(options: ShapeStreamOptions<T>): string {\n return JSON.stringify(options, Object.keys(options).sort())\n}\n\nexport function getShapeStream<T extends Row<unknown>>(\n options: ShapeStreamOptions<GetExtensions<T>>\n): ShapeStream<T> {\n const shapeHash = sortedOptionsHash(options)\n\n // If the stream is already cached, return it if valid\n if (streamCache.has(shapeHash)) {\n const stream = streamCache.get(shapeHash)! as ShapeStream<T>\n if (stream.error === undefined && !stream.options.signal?.aborted) {\n return stream\n }\n\n // if stream is cached but errored/aborted, remove it and related shapes\n streamCache.delete(shapeHash)\n shapeCache.delete(stream)\n }\n\n const newShapeStream = new ShapeStream<T>(options)\n\n streamCache.set(shapeHash, newShapeStream)\n\n // Return the created shape\n return newShapeStream\n}\n\nexport function getShape<T extends Row<unknown>>(\n shapeStream: ShapeStream<T>\n): Shape<T> {\n // If the stream is already cached, return it if valid\n if (shapeCache.has(shapeStream)) {\n if (\n shapeStream.error === undefined &&\n !shapeStream.options.signal?.aborted\n ) {\n return shapeCache.get(shapeStream)! as Shape<T>\n }\n\n // if stream is cached but errored/aborted, remove it and related shapes\n streamCache.delete(sortedOptionsHash(shapeStream.options))\n shapeCache.delete(shapeStream)\n }\n\n const newShape = new Shape<T>(shapeStream)\n\n shapeCache.set(shapeStream, newShape)\n\n // Return the created shape\n return newShape\n}\n\nexport interface UseShapeResult<T extends Row<unknown> = Row> {\n /**\n * The array of rows that make up the Shape.\n * @type {T[]}\n */\n data: T[]\n /**\n * The Shape instance used by this useShape\n * @type {Shape<T>}\n */\n shape: Shape<T>\n /** True during initial fetch. False afterwise. */\n isLoading: boolean\n /** Unix time at which we last synced. Undefined when `isLoading` is true. */\n lastSyncedAt?: number\n error: Shape<T>[`error`]\n isError: boolean\n}\n\nfunction shapeSubscribe<T extends Row<unknown>>(\n shape: Shape<T>,\n callback: () => void\n) {\n const unsubscribe = shape.subscribe(callback)\n return () => {\n unsubscribe()\n }\n}\n\nfunction parseShapeData<T extends Row<unknown>>(\n shape: Shape<T>\n): UseShapeResult<T> {\n return {\n data: shape.currentRows,\n isLoading: shape.isLoading(),\n lastSyncedAt: shape.lastSyncedAt(),\n isError: shape.error !== false,\n shape,\n error: shape.error,\n }\n}\n\nfunction identity<T>(arg: T): T {\n return arg\n}\n\ninterface UseShapeOptions<SourceData extends Row<unknown>, Selection>\n extends ShapeStreamOptions<GetExtensions<SourceData>> {\n selector?: (value: UseShapeResult<SourceData>) => Selection\n}\n\nexport function useShape<\n SourceData extends Row<unknown> = Row,\n Selection = UseShapeResult<SourceData>,\n>({\n selector = identity as (arg: UseShapeResult<SourceData>) => Selection,\n ...options\n}: UseShapeOptions<SourceData, Selection>): Selection {\n const shapeStream = getShapeStream<SourceData>(\n options as ShapeStreamOptions<GetExtensions<SourceData>>\n )\n const shape = getShape<SourceData>(shapeStream)\n\n const useShapeData = React.useMemo(() => {\n let latestShapeData = parseShapeData(shape)\n const getSnapshot = () => latestShapeData\n const subscribe = (onStoreChange: () => void) =>\n shapeSubscribe(shape, () => {\n latestShapeData = parseShapeData(shape)\n onStoreChange()\n })\n\n return () => {\n return useSyncExternalStoreWithSelector(\n subscribe,\n getSnapshot,\n getSnapshot,\n selector\n )\n }\n }, [shape, selector])\n\n return useShapeData()\n}\n"],"mappings":"geAAA,OACE,SAAAA,EACA,eAAAC,MAIK,uBACP,OAAOC,MAAW,QAClB,OAAS,oCAAAC,MAAwC,2CAKjD,IAAMC,EAAc,IAAI,IAClBC,EAAa,IAAI,IAEvB,SAAsBC,EACpBC,EACmB,QAAAC,EAAA,sBACnB,IAAMC,EAAcC,EAAkBH,CAAO,EACvCI,EAAQC,EAAYH,CAAW,EACrC,aAAME,EAAM,KACLA,CACT,GAEO,SAASE,EAAqBN,EAAwC,CAC3E,OAAO,KAAK,UAAUA,EAAS,OAAO,KAAKA,CAAO,EAAE,KAAK,CAAC,CAC5D,CAEO,SAASG,EACdH,EACgB,CA/BlB,IAAAO,EAgCE,IAAMC,EAAYF,EAAkBN,CAAO,EAG3C,GAAIH,EAAY,IAAIW,CAAS,EAAG,CAC9B,IAAMC,EAASZ,EAAY,IAAIW,CAAS,EACxC,GAAIC,EAAO,QAAU,QAAa,GAACF,EAAAE,EAAO,QAAQ,SAAf,MAAAF,EAAuB,SACxD,OAAOE,EAITZ,EAAY,OAAOW,CAAS,EAC5BV,EAAW,OAAOW,CAAM,CAC1B,CAEA,IAAMC,EAAiB,IAAIC,EAAeX,CAAO,EAEjD,OAAAH,EAAY,IAAIW,EAAWE,CAAc,EAGlCA,CACT,CAEO,SAASL,EACdH,EACU,CAxDZ,IAAAK,EA0DE,GAAIT,EAAW,IAAII,CAAW,EAAG,CAC/B,GACEA,EAAY,QAAU,QACtB,GAACK,EAAAL,EAAY,QAAQ,SAApB,MAAAK,EAA4B,SAE7B,OAAOT,EAAW,IAAII,CAAW,EAInCL,EAAY,OAAOS,EAAkBJ,EAAY,OAAO,CAAC,EACzDJ,EAAW,OAAOI,CAAW,CAC/B,CAEA,IAAMU,EAAW,IAAIC,EAASX,CAAW,EAEzC,OAAAJ,EAAW,IAAII,EAAaU,CAAQ,EAG7BA,CACT,CAqBA,SAASE,EACPV,EACAW,EACA,CACA,IAAMC,EAAcZ,EAAM,UAAUW,CAAQ,EAC5C,MAAO,IAAM,CACXC,EAAY,CACd,CACF,CAEA,SAASC,EACPb,EACmB,CACnB,MAAO,CACL,KAAMA,EAAM,YACZ,UAAWA,EAAM,UAAU,EAC3B,aAAcA,EAAM,aAAa,EACjC,QAASA,EAAM,QAAU,GACzB,MAAAA,EACA,MAAOA,EAAM,KACf,CACF,CAEA,SAASc,EAAYC,EAAW,CAC9B,OAAOA,CACT,CAOO,SAASC,EAGdb,EAGoD,CAHpD,IAAAc,EAAAd,EACA,UAAAe,EAAWJ,CAtIb,EAqIEG,EAEGrB,EAAAuB,EAFHF,EAEG,CADH,aAGA,IAAMnB,EAAcC,EAClBH,CACF,EACMI,EAAQC,EAAqBH,CAAW,EAqB9C,OAnBqBsB,EAAM,QAAQ,IAAM,CACvC,IAAIC,EAAkBR,EAAeb,CAAK,EACpCsB,EAAc,IAAMD,EACpBE,EAAaC,GACjBd,EAAeV,EAAO,IAAM,CAC1BqB,EAAkBR,EAAeb,CAAK,EACtCwB,EAAc,CAChB,CAAC,EAEH,MAAO,IACEC,EACLF,EACAD,EACAA,EACAJ,CACF,CAEJ,EAAG,CAAClB,EAAOkB,CAAQ,CAAC,EAEA,CACtB","names":["Shape","ShapeStream","React","useSyncExternalStoreWithSelector","streamCache","shapeCache","preloadShape","options","__async","shapeStream","getShapeStream","shape","getShape","sortedOptionsHash","_a","shapeHash","stream","newShapeStream","ShapeStream","newShape","Shape","shapeSubscribe","callback","unsubscribe","parseShapeData","identity","arg","useShape","_b","selector","__objRest","React","latestShapeData","getSnapshot","subscribe","onStoreChange","useSyncExternalStoreWithSelector"]}
|
package/dist/index.legacy-esm.js
CHANGED
|
@@ -26,30 +26,39 @@ var shapeCache = /* @__PURE__ */ new Map();
|
|
|
26
26
|
async function preloadShape(options) {
|
|
27
27
|
const shapeStream = getShapeStream(options);
|
|
28
28
|
const shape = getShape(shapeStream);
|
|
29
|
-
await shape.
|
|
29
|
+
await shape.rows;
|
|
30
30
|
return shape;
|
|
31
31
|
}
|
|
32
32
|
function sortedOptionsHash(options) {
|
|
33
33
|
return JSON.stringify(options, Object.keys(options).sort());
|
|
34
34
|
}
|
|
35
35
|
function getShapeStream(options) {
|
|
36
|
+
var _a;
|
|
36
37
|
const shapeHash = sortedOptionsHash(options);
|
|
37
38
|
if (streamCache.has(shapeHash)) {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
39
|
+
const stream = streamCache.get(shapeHash);
|
|
40
|
+
if (stream.error === void 0 && !((_a = stream.options.signal) == null ? void 0 : _a.aborted)) {
|
|
41
|
+
return stream;
|
|
42
|
+
}
|
|
43
|
+
streamCache.delete(shapeHash);
|
|
44
|
+
shapeCache.delete(stream);
|
|
43
45
|
}
|
|
46
|
+
const newShapeStream = new ShapeStream(options);
|
|
47
|
+
streamCache.set(shapeHash, newShapeStream);
|
|
48
|
+
return newShapeStream;
|
|
44
49
|
}
|
|
45
50
|
function getShape(shapeStream) {
|
|
51
|
+
var _a;
|
|
46
52
|
if (shapeCache.has(shapeStream)) {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
53
|
+
if (shapeStream.error === void 0 && !((_a = shapeStream.options.signal) == null ? void 0 : _a.aborted)) {
|
|
54
|
+
return shapeCache.get(shapeStream);
|
|
55
|
+
}
|
|
56
|
+
streamCache.delete(sortedOptionsHash(shapeStream.options));
|
|
57
|
+
shapeCache.delete(shapeStream);
|
|
52
58
|
}
|
|
59
|
+
const newShape = new Shape(shapeStream);
|
|
60
|
+
shapeCache.set(shapeStream, newShape);
|
|
61
|
+
return newShape;
|
|
53
62
|
}
|
|
54
63
|
function shapeSubscribe(shape, callback) {
|
|
55
64
|
const unsubscribe = shape.subscribe(callback);
|
|
@@ -59,7 +68,7 @@ function shapeSubscribe(shape, callback) {
|
|
|
59
68
|
}
|
|
60
69
|
function parseShapeData(shape) {
|
|
61
70
|
return {
|
|
62
|
-
data:
|
|
71
|
+
data: shape.currentRows,
|
|
63
72
|
isLoading: shape.isLoading(),
|
|
64
73
|
lastSyncedAt: shape.lastSyncedAt(),
|
|
65
74
|
isError: shape.error !== false,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/react-hooks.tsx"],"sourcesContent":["import {\n Shape,\n ShapeStream,\n ShapeStreamOptions,\n Row,\n GetExtensions,\n} from '@electric-sql/client'\nimport React from 'react'\nimport { useSyncExternalStoreWithSelector } from 'use-sync-external-store/with-selector.js'\n\ntype UnknownShape = Shape<Row<unknown>>\ntype UnknownShapeStream = ShapeStream<Row<unknown>>\n\nconst streamCache = new Map<string, UnknownShapeStream>()\nconst shapeCache = new Map<UnknownShapeStream, UnknownShape>()\n\nexport async function preloadShape<T extends Row<unknown> = Row>(\n options: ShapeStreamOptions<GetExtensions<T>>\n): Promise<Shape<T>> {\n const shapeStream = getShapeStream<T>(options)\n const shape = getShape<T>(shapeStream)\n await shape.
|
|
1
|
+
{"version":3,"sources":["../src/react-hooks.tsx"],"sourcesContent":["import {\n Shape,\n ShapeStream,\n ShapeStreamOptions,\n Row,\n GetExtensions,\n} from '@electric-sql/client'\nimport React from 'react'\nimport { useSyncExternalStoreWithSelector } from 'use-sync-external-store/with-selector.js'\n\ntype UnknownShape = Shape<Row<unknown>>\ntype UnknownShapeStream = ShapeStream<Row<unknown>>\n\nconst streamCache = new Map<string, UnknownShapeStream>()\nconst shapeCache = new Map<UnknownShapeStream, UnknownShape>()\n\nexport async function preloadShape<T extends Row<unknown> = Row>(\n options: ShapeStreamOptions<GetExtensions<T>>\n): Promise<Shape<T>> {\n const shapeStream = getShapeStream<T>(options)\n const shape = getShape<T>(shapeStream)\n await shape.rows\n return shape\n}\n\nexport function sortedOptionsHash<T>(options: ShapeStreamOptions<T>): string {\n return JSON.stringify(options, Object.keys(options).sort())\n}\n\nexport function getShapeStream<T extends Row<unknown>>(\n options: ShapeStreamOptions<GetExtensions<T>>\n): ShapeStream<T> {\n const shapeHash = sortedOptionsHash(options)\n\n // If the stream is already cached, return it if valid\n if (streamCache.has(shapeHash)) {\n const stream = streamCache.get(shapeHash)! as ShapeStream<T>\n if (stream.error === undefined && !stream.options.signal?.aborted) {\n return stream\n }\n\n // if stream is cached but errored/aborted, remove it and related shapes\n streamCache.delete(shapeHash)\n shapeCache.delete(stream)\n }\n\n const newShapeStream = new ShapeStream<T>(options)\n\n streamCache.set(shapeHash, newShapeStream)\n\n // Return the created shape\n return newShapeStream\n}\n\nexport function getShape<T extends Row<unknown>>(\n shapeStream: ShapeStream<T>\n): Shape<T> {\n // If the stream is already cached, return it if valid\n if (shapeCache.has(shapeStream)) {\n if (\n shapeStream.error === undefined &&\n !shapeStream.options.signal?.aborted\n ) {\n return shapeCache.get(shapeStream)! as Shape<T>\n }\n\n // if stream is cached but errored/aborted, remove it and related shapes\n streamCache.delete(sortedOptionsHash(shapeStream.options))\n shapeCache.delete(shapeStream)\n }\n\n const newShape = new Shape<T>(shapeStream)\n\n shapeCache.set(shapeStream, newShape)\n\n // Return the created shape\n return newShape\n}\n\nexport interface UseShapeResult<T extends Row<unknown> = Row> {\n /**\n * The array of rows that make up the Shape.\n * @type {T[]}\n */\n data: T[]\n /**\n * The Shape instance used by this useShape\n * @type {Shape<T>}\n */\n shape: Shape<T>\n /** True during initial fetch. False afterwise. */\n isLoading: boolean\n /** Unix time at which we last synced. Undefined when `isLoading` is true. */\n lastSyncedAt?: number\n error: Shape<T>[`error`]\n isError: boolean\n}\n\nfunction shapeSubscribe<T extends Row<unknown>>(\n shape: Shape<T>,\n callback: () => void\n) {\n const unsubscribe = shape.subscribe(callback)\n return () => {\n unsubscribe()\n }\n}\n\nfunction parseShapeData<T extends Row<unknown>>(\n shape: Shape<T>\n): UseShapeResult<T> {\n return {\n data: shape.currentRows,\n isLoading: shape.isLoading(),\n lastSyncedAt: shape.lastSyncedAt(),\n isError: shape.error !== false,\n shape,\n error: shape.error,\n }\n}\n\nfunction identity<T>(arg: T): T {\n return arg\n}\n\ninterface UseShapeOptions<SourceData extends Row<unknown>, Selection>\n extends ShapeStreamOptions<GetExtensions<SourceData>> {\n selector?: (value: UseShapeResult<SourceData>) => Selection\n}\n\nexport function useShape<\n SourceData extends Row<unknown> = Row,\n Selection = UseShapeResult<SourceData>,\n>({\n selector = identity as (arg: UseShapeResult<SourceData>) => Selection,\n ...options\n}: UseShapeOptions<SourceData, Selection>): Selection {\n const shapeStream = getShapeStream<SourceData>(\n options as ShapeStreamOptions<GetExtensions<SourceData>>\n )\n const shape = getShape<SourceData>(shapeStream)\n\n const useShapeData = React.useMemo(() => {\n let latestShapeData = parseShapeData(shape)\n const getSnapshot = () => latestShapeData\n const subscribe = (onStoreChange: () => void) =>\n shapeSubscribe(shape, () => {\n latestShapeData = parseShapeData(shape)\n onStoreChange()\n })\n\n return () => {\n return useSyncExternalStoreWithSelector(\n subscribe,\n getSnapshot,\n getSnapshot,\n selector\n )\n }\n }, [shape, selector])\n\n return useShapeData()\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAAA;AAAA,EACE;AAAA,EACA;AAAA,OAIK;AACP,OAAO,WAAW;AAClB,SAAS,wCAAwC;AAKjD,IAAM,cAAc,oBAAI,IAAgC;AACxD,IAAM,aAAa,oBAAI,IAAsC;AAE7D,eAAsB,aACpB,SACmB;AACnB,QAAM,cAAc,eAAkB,OAAO;AAC7C,QAAM,QAAQ,SAAY,WAAW;AACrC,QAAM,MAAM;AACZ,SAAO;AACT;AAEO,SAAS,kBAAqB,SAAwC;AAC3E,SAAO,KAAK,UAAU,SAAS,OAAO,KAAK,OAAO,EAAE,KAAK,CAAC;AAC5D;AAEO,SAAS,eACd,SACgB;AA/BlB;AAgCE,QAAM,YAAY,kBAAkB,OAAO;AAG3C,MAAI,YAAY,IAAI,SAAS,GAAG;AAC9B,UAAM,SAAS,YAAY,IAAI,SAAS;AACxC,QAAI,OAAO,UAAU,UAAa,GAAC,YAAO,QAAQ,WAAf,mBAAuB,UAAS;AACjE,aAAO;AAAA,IACT;AAGA,gBAAY,OAAO,SAAS;AAC5B,eAAW,OAAO,MAAM;AAAA,EAC1B;AAEA,QAAM,iBAAiB,IAAI,YAAe,OAAO;AAEjD,cAAY,IAAI,WAAW,cAAc;AAGzC,SAAO;AACT;AAEO,SAAS,SACd,aACU;AAxDZ;AA0DE,MAAI,WAAW,IAAI,WAAW,GAAG;AAC/B,QACE,YAAY,UAAU,UACtB,GAAC,iBAAY,QAAQ,WAApB,mBAA4B,UAC7B;AACA,aAAO,WAAW,IAAI,WAAW;AAAA,IACnC;AAGA,gBAAY,OAAO,kBAAkB,YAAY,OAAO,CAAC;AACzD,eAAW,OAAO,WAAW;AAAA,EAC/B;AAEA,QAAM,WAAW,IAAI,MAAS,WAAW;AAEzC,aAAW,IAAI,aAAa,QAAQ;AAGpC,SAAO;AACT;AAqBA,SAAS,eACP,OACA,UACA;AACA,QAAM,cAAc,MAAM,UAAU,QAAQ;AAC5C,SAAO,MAAM;AACX,gBAAY;AAAA,EACd;AACF;AAEA,SAAS,eACP,OACmB;AACnB,SAAO;AAAA,IACL,MAAM,MAAM;AAAA,IACZ,WAAW,MAAM,UAAU;AAAA,IAC3B,cAAc,MAAM,aAAa;AAAA,IACjC,SAAS,MAAM,UAAU;AAAA,IACzB;AAAA,IACA,OAAO,MAAM;AAAA,EACf;AACF;AAEA,SAAS,SAAY,KAAW;AAC9B,SAAO;AACT;AAOO,SAAS,SAGd,IAGoD;AAHpD,eACA;AAAA,eAAW;AAAA,EAtIb,IAqIE,IAEG,oBAFH,IAEG;AAAA,IADH;AAAA;AAGA,QAAM,cAAc;AAAA,IAClB;AAAA,EACF;AACA,QAAM,QAAQ,SAAqB,WAAW;AAE9C,QAAM,eAAe,MAAM,QAAQ,MAAM;AACvC,QAAI,kBAAkB,eAAe,KAAK;AAC1C,UAAM,cAAc,MAAM;AAC1B,UAAM,YAAY,CAAC,kBACjB,eAAe,OAAO,MAAM;AAC1B,wBAAkB,eAAe,KAAK;AACtC,oBAAc;AAAA,IAChB,CAAC;AAEH,WAAO,MAAM;AACX,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF,GAAG,CAAC,OAAO,QAAQ,CAAC;AAEpB,SAAO,aAAa;AACtB;","names":[]}
|
package/dist/index.mjs
CHANGED
|
@@ -47,7 +47,7 @@ function preloadShape(options) {
|
|
|
47
47
|
return __async(this, null, function* () {
|
|
48
48
|
const shapeStream = getShapeStream(options);
|
|
49
49
|
const shape = getShape(shapeStream);
|
|
50
|
-
yield shape.
|
|
50
|
+
yield shape.rows;
|
|
51
51
|
return shape;
|
|
52
52
|
});
|
|
53
53
|
}
|
|
@@ -55,23 +55,32 @@ function sortedOptionsHash(options) {
|
|
|
55
55
|
return JSON.stringify(options, Object.keys(options).sort());
|
|
56
56
|
}
|
|
57
57
|
function getShapeStream(options) {
|
|
58
|
+
var _a;
|
|
58
59
|
const shapeHash = sortedOptionsHash(options);
|
|
59
60
|
if (streamCache.has(shapeHash)) {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
61
|
+
const stream = streamCache.get(shapeHash);
|
|
62
|
+
if (stream.error === void 0 && !((_a = stream.options.signal) == null ? void 0 : _a.aborted)) {
|
|
63
|
+
return stream;
|
|
64
|
+
}
|
|
65
|
+
streamCache.delete(shapeHash);
|
|
66
|
+
shapeCache.delete(stream);
|
|
65
67
|
}
|
|
68
|
+
const newShapeStream = new ShapeStream(options);
|
|
69
|
+
streamCache.set(shapeHash, newShapeStream);
|
|
70
|
+
return newShapeStream;
|
|
66
71
|
}
|
|
67
72
|
function getShape(shapeStream) {
|
|
73
|
+
var _a;
|
|
68
74
|
if (shapeCache.has(shapeStream)) {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
75
|
+
if (shapeStream.error === void 0 && !((_a = shapeStream.options.signal) == null ? void 0 : _a.aborted)) {
|
|
76
|
+
return shapeCache.get(shapeStream);
|
|
77
|
+
}
|
|
78
|
+
streamCache.delete(sortedOptionsHash(shapeStream.options));
|
|
79
|
+
shapeCache.delete(shapeStream);
|
|
74
80
|
}
|
|
81
|
+
const newShape = new Shape(shapeStream);
|
|
82
|
+
shapeCache.set(shapeStream, newShape);
|
|
83
|
+
return newShape;
|
|
75
84
|
}
|
|
76
85
|
function shapeSubscribe(shape, callback) {
|
|
77
86
|
const unsubscribe = shape.subscribe(callback);
|
|
@@ -81,7 +90,7 @@ function shapeSubscribe(shape, callback) {
|
|
|
81
90
|
}
|
|
82
91
|
function parseShapeData(shape) {
|
|
83
92
|
return {
|
|
84
|
-
data:
|
|
93
|
+
data: shape.currentRows,
|
|
85
94
|
isLoading: shape.isLoading(),
|
|
86
95
|
lastSyncedAt: shape.lastSyncedAt(),
|
|
87
96
|
isError: shape.error !== false,
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/react-hooks.tsx"],"sourcesContent":["import {\n Shape,\n ShapeStream,\n ShapeStreamOptions,\n Row,\n GetExtensions,\n} from '@electric-sql/client'\nimport React from 'react'\nimport { useSyncExternalStoreWithSelector } from 'use-sync-external-store/with-selector.js'\n\ntype UnknownShape = Shape<Row<unknown>>\ntype UnknownShapeStream = ShapeStream<Row<unknown>>\n\nconst streamCache = new Map<string, UnknownShapeStream>()\nconst shapeCache = new Map<UnknownShapeStream, UnknownShape>()\n\nexport async function preloadShape<T extends Row<unknown> = Row>(\n options: ShapeStreamOptions<GetExtensions<T>>\n): Promise<Shape<T>> {\n const shapeStream = getShapeStream<T>(options)\n const shape = getShape<T>(shapeStream)\n await shape.
|
|
1
|
+
{"version":3,"sources":["../src/react-hooks.tsx"],"sourcesContent":["import {\n Shape,\n ShapeStream,\n ShapeStreamOptions,\n Row,\n GetExtensions,\n} from '@electric-sql/client'\nimport React from 'react'\nimport { useSyncExternalStoreWithSelector } from 'use-sync-external-store/with-selector.js'\n\ntype UnknownShape = Shape<Row<unknown>>\ntype UnknownShapeStream = ShapeStream<Row<unknown>>\n\nconst streamCache = new Map<string, UnknownShapeStream>()\nconst shapeCache = new Map<UnknownShapeStream, UnknownShape>()\n\nexport async function preloadShape<T extends Row<unknown> = Row>(\n options: ShapeStreamOptions<GetExtensions<T>>\n): Promise<Shape<T>> {\n const shapeStream = getShapeStream<T>(options)\n const shape = getShape<T>(shapeStream)\n await shape.rows\n return shape\n}\n\nexport function sortedOptionsHash<T>(options: ShapeStreamOptions<T>): string {\n return JSON.stringify(options, Object.keys(options).sort())\n}\n\nexport function getShapeStream<T extends Row<unknown>>(\n options: ShapeStreamOptions<GetExtensions<T>>\n): ShapeStream<T> {\n const shapeHash = sortedOptionsHash(options)\n\n // If the stream is already cached, return it if valid\n if (streamCache.has(shapeHash)) {\n const stream = streamCache.get(shapeHash)! as ShapeStream<T>\n if (stream.error === undefined && !stream.options.signal?.aborted) {\n return stream\n }\n\n // if stream is cached but errored/aborted, remove it and related shapes\n streamCache.delete(shapeHash)\n shapeCache.delete(stream)\n }\n\n const newShapeStream = new ShapeStream<T>(options)\n\n streamCache.set(shapeHash, newShapeStream)\n\n // Return the created shape\n return newShapeStream\n}\n\nexport function getShape<T extends Row<unknown>>(\n shapeStream: ShapeStream<T>\n): Shape<T> {\n // If the stream is already cached, return it if valid\n if (shapeCache.has(shapeStream)) {\n if (\n shapeStream.error === undefined &&\n !shapeStream.options.signal?.aborted\n ) {\n return shapeCache.get(shapeStream)! as Shape<T>\n }\n\n // if stream is cached but errored/aborted, remove it and related shapes\n streamCache.delete(sortedOptionsHash(shapeStream.options))\n shapeCache.delete(shapeStream)\n }\n\n const newShape = new Shape<T>(shapeStream)\n\n shapeCache.set(shapeStream, newShape)\n\n // Return the created shape\n return newShape\n}\n\nexport interface UseShapeResult<T extends Row<unknown> = Row> {\n /**\n * The array of rows that make up the Shape.\n * @type {T[]}\n */\n data: T[]\n /**\n * The Shape instance used by this useShape\n * @type {Shape<T>}\n */\n shape: Shape<T>\n /** True during initial fetch. False afterwise. */\n isLoading: boolean\n /** Unix time at which we last synced. Undefined when `isLoading` is true. */\n lastSyncedAt?: number\n error: Shape<T>[`error`]\n isError: boolean\n}\n\nfunction shapeSubscribe<T extends Row<unknown>>(\n shape: Shape<T>,\n callback: () => void\n) {\n const unsubscribe = shape.subscribe(callback)\n return () => {\n unsubscribe()\n }\n}\n\nfunction parseShapeData<T extends Row<unknown>>(\n shape: Shape<T>\n): UseShapeResult<T> {\n return {\n data: shape.currentRows,\n isLoading: shape.isLoading(),\n lastSyncedAt: shape.lastSyncedAt(),\n isError: shape.error !== false,\n shape,\n error: shape.error,\n }\n}\n\nfunction identity<T>(arg: T): T {\n return arg\n}\n\ninterface UseShapeOptions<SourceData extends Row<unknown>, Selection>\n extends ShapeStreamOptions<GetExtensions<SourceData>> {\n selector?: (value: UseShapeResult<SourceData>) => Selection\n}\n\nexport function useShape<\n SourceData extends Row<unknown> = Row,\n Selection = UseShapeResult<SourceData>,\n>({\n selector = identity as (arg: UseShapeResult<SourceData>) => Selection,\n ...options\n}: UseShapeOptions<SourceData, Selection>): Selection {\n const shapeStream = getShapeStream<SourceData>(\n options as ShapeStreamOptions<GetExtensions<SourceData>>\n )\n const shape = getShape<SourceData>(shapeStream)\n\n const useShapeData = React.useMemo(() => {\n let latestShapeData = parseShapeData(shape)\n const getSnapshot = () => latestShapeData\n const subscribe = (onStoreChange: () => void) =>\n shapeSubscribe(shape, () => {\n latestShapeData = parseShapeData(shape)\n onStoreChange()\n })\n\n return () => {\n return useSyncExternalStoreWithSelector(\n subscribe,\n getSnapshot,\n getSnapshot,\n selector\n )\n }\n }, [shape, selector])\n\n return useShapeData()\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA,EACE;AAAA,EACA;AAAA,OAIK;AACP,OAAO,WAAW;AAClB,SAAS,wCAAwC;AAKjD,IAAM,cAAc,oBAAI,IAAgC;AACxD,IAAM,aAAa,oBAAI,IAAsC;AAE7D,SAAsB,aACpB,SACmB;AAAA;AACnB,UAAM,cAAc,eAAkB,OAAO;AAC7C,UAAM,QAAQ,SAAY,WAAW;AACrC,UAAM,MAAM;AACZ,WAAO;AAAA,EACT;AAAA;AAEO,SAAS,kBAAqB,SAAwC;AAC3E,SAAO,KAAK,UAAU,SAAS,OAAO,KAAK,OAAO,EAAE,KAAK,CAAC;AAC5D;AAEO,SAAS,eACd,SACgB;AA/BlB;AAgCE,QAAM,YAAY,kBAAkB,OAAO;AAG3C,MAAI,YAAY,IAAI,SAAS,GAAG;AAC9B,UAAM,SAAS,YAAY,IAAI,SAAS;AACxC,QAAI,OAAO,UAAU,UAAa,GAAC,YAAO,QAAQ,WAAf,mBAAuB,UAAS;AACjE,aAAO;AAAA,IACT;AAGA,gBAAY,OAAO,SAAS;AAC5B,eAAW,OAAO,MAAM;AAAA,EAC1B;AAEA,QAAM,iBAAiB,IAAI,YAAe,OAAO;AAEjD,cAAY,IAAI,WAAW,cAAc;AAGzC,SAAO;AACT;AAEO,SAAS,SACd,aACU;AAxDZ;AA0DE,MAAI,WAAW,IAAI,WAAW,GAAG;AAC/B,QACE,YAAY,UAAU,UACtB,GAAC,iBAAY,QAAQ,WAApB,mBAA4B,UAC7B;AACA,aAAO,WAAW,IAAI,WAAW;AAAA,IACnC;AAGA,gBAAY,OAAO,kBAAkB,YAAY,OAAO,CAAC;AACzD,eAAW,OAAO,WAAW;AAAA,EAC/B;AAEA,QAAM,WAAW,IAAI,MAAS,WAAW;AAEzC,aAAW,IAAI,aAAa,QAAQ;AAGpC,SAAO;AACT;AAqBA,SAAS,eACP,OACA,UACA;AACA,QAAM,cAAc,MAAM,UAAU,QAAQ;AAC5C,SAAO,MAAM;AACX,gBAAY;AAAA,EACd;AACF;AAEA,SAAS,eACP,OACmB;AACnB,SAAO;AAAA,IACL,MAAM,MAAM;AAAA,IACZ,WAAW,MAAM,UAAU;AAAA,IAC3B,cAAc,MAAM,aAAa;AAAA,IACjC,SAAS,MAAM,UAAU;AAAA,IACzB;AAAA,IACA,OAAO,MAAM;AAAA,EACf;AACF;AAEA,SAAS,SAAY,KAAW;AAC9B,SAAO;AACT;AAOO,SAAS,SAGd,IAGoD;AAHpD,eACA;AAAA,eAAW;AAAA,EAtIb,IAqIE,IAEG,oBAFH,IAEG;AAAA,IADH;AAAA;AAGA,QAAM,cAAc;AAAA,IAClB;AAAA,EACF;AACA,QAAM,QAAQ,SAAqB,WAAW;AAE9C,QAAM,eAAe,MAAM,QAAQ,MAAM;AACvC,QAAI,kBAAkB,eAAe,KAAK;AAC1C,UAAM,cAAc,MAAM;AAC1B,UAAM,YAAY,CAAC,kBACjB,eAAe,OAAO,MAAM;AAC1B,wBAAkB,eAAe,KAAK;AACtC,oBAAc;AAAA,IAChB,CAAC;AAEH,WAAO,MAAM;AACX,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF,GAAG,CAAC,OAAO,QAAQ,CAAC;AAEpB,SAAO,aAAa;AACtB;","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@electric-sql/react",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "React hooks for ElectricSQL",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/cjs/index.cjs",
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"homepage": "https://electric-sql.com",
|
|
32
32
|
"dependencies": {
|
|
33
33
|
"use-sync-external-store": "^1.2.2",
|
|
34
|
-
"@electric-sql/client": "0.
|
|
34
|
+
"@electric-sql/client": "0.7.0"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
37
|
"@testing-library/react": "^16.0.0",
|
package/src/react-hooks.tsx
CHANGED
|
@@ -19,7 +19,7 @@ export async function preloadShape<T extends Row<unknown> = Row>(
|
|
|
19
19
|
): Promise<Shape<T>> {
|
|
20
20
|
const shapeStream = getShapeStream<T>(options)
|
|
21
21
|
const shape = getShape<T>(shapeStream)
|
|
22
|
-
await shape.
|
|
22
|
+
await shape.rows
|
|
23
23
|
return shape
|
|
24
24
|
}
|
|
25
25
|
|
|
@@ -32,35 +32,49 @@ export function getShapeStream<T extends Row<unknown>>(
|
|
|
32
32
|
): ShapeStream<T> {
|
|
33
33
|
const shapeHash = sortedOptionsHash(options)
|
|
34
34
|
|
|
35
|
-
// If the stream is already cached, return
|
|
35
|
+
// If the stream is already cached, return it if valid
|
|
36
36
|
if (streamCache.has(shapeHash)) {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
streamCache.set(shapeHash, newShapeStream)
|
|
37
|
+
const stream = streamCache.get(shapeHash)! as ShapeStream<T>
|
|
38
|
+
if (stream.error === undefined && !stream.options.signal?.aborted) {
|
|
39
|
+
return stream
|
|
40
|
+
}
|
|
43
41
|
|
|
44
|
-
//
|
|
45
|
-
|
|
42
|
+
// if stream is cached but errored/aborted, remove it and related shapes
|
|
43
|
+
streamCache.delete(shapeHash)
|
|
44
|
+
shapeCache.delete(stream)
|
|
46
45
|
}
|
|
46
|
+
|
|
47
|
+
const newShapeStream = new ShapeStream<T>(options)
|
|
48
|
+
|
|
49
|
+
streamCache.set(shapeHash, newShapeStream)
|
|
50
|
+
|
|
51
|
+
// Return the created shape
|
|
52
|
+
return newShapeStream
|
|
47
53
|
}
|
|
48
54
|
|
|
49
55
|
export function getShape<T extends Row<unknown>>(
|
|
50
56
|
shapeStream: ShapeStream<T>
|
|
51
57
|
): Shape<T> {
|
|
52
|
-
// If the stream is already cached, return
|
|
58
|
+
// If the stream is already cached, return it if valid
|
|
53
59
|
if (shapeCache.has(shapeStream)) {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
+
if (
|
|
61
|
+
shapeStream.error === undefined &&
|
|
62
|
+
!shapeStream.options.signal?.aborted
|
|
63
|
+
) {
|
|
64
|
+
return shapeCache.get(shapeStream)! as Shape<T>
|
|
65
|
+
}
|
|
60
66
|
|
|
61
|
-
//
|
|
62
|
-
|
|
67
|
+
// if stream is cached but errored/aborted, remove it and related shapes
|
|
68
|
+
streamCache.delete(sortedOptionsHash(shapeStream.options))
|
|
69
|
+
shapeCache.delete(shapeStream)
|
|
63
70
|
}
|
|
71
|
+
|
|
72
|
+
const newShape = new Shape<T>(shapeStream)
|
|
73
|
+
|
|
74
|
+
shapeCache.set(shapeStream, newShape)
|
|
75
|
+
|
|
76
|
+
// Return the created shape
|
|
77
|
+
return newShape
|
|
64
78
|
}
|
|
65
79
|
|
|
66
80
|
export interface UseShapeResult<T extends Row<unknown> = Row> {
|
|
@@ -96,7 +110,7 @@ function parseShapeData<T extends Row<unknown>>(
|
|
|
96
110
|
shape: Shape<T>
|
|
97
111
|
): UseShapeResult<T> {
|
|
98
112
|
return {
|
|
99
|
-
data:
|
|
113
|
+
data: shape.currentRows,
|
|
100
114
|
isLoading: shape.isLoading(),
|
|
101
115
|
lastSyncedAt: shape.lastSyncedAt(),
|
|
102
116
|
isError: shape.error !== false,
|