@electric-sql/pglite-react 0.2.13 → 0.2.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var v=Object.defineProperty;var w=Object.getOwnPropertyDescriptor;var k=Object.getOwnPropertyNames;var Q=Object.prototype.hasOwnProperty;var h=(e,n)=>{for(var t in n)v(e,t,{get:n[t],enumerable:!0})},x=(e,n,t,i)=>{if(n&&typeof n=="object"||typeof n=="function")for(let r of k(n))!Q.call(e,r)&&r!==t&&v(e,r,{get:()=>n[r],enumerable:!(i=w(n,r))||i.enumerable});return e};var b=e=>x(v({},"__esModule",{value:!0}),e);var U={};h(U,{PGliteProvider:()=>W,makePGliteProvider:()=>y,useLiveIncrementalQuery:()=>E,useLiveQuery:()=>R,usePGlite:()=>p});module.exports=b(U);var c=require("react"),G=require("react/jsx-runtime");function y(){let e=(0,c.createContext)(void 0);return{usePGlite:n=>{let t=(0,c.useContext)(e);if(n!==void 0)return n;if(!t)throw new Error("No PGlite instance found, use PGliteProvider to provide one");return t},PGliteProvider:({children:n,db:t})=>(0,G.jsx)(e.Provider,{value:t,children:n})}}var{PGliteProvider:W,usePGlite:p}=y();var o=require("react");var L=require("@electric-sql/pglite/template");function S(e,n){if(!e&&!n)return!0;if(e?.length!==n?.length)return!1;for(let t=0;t<e.length;t++)if(!Object.is(e[t],n[t]))return!1;return!0}function m(e,n,t){let i=p(),r=(0,o.useRef)(n),a=(0,o.useRef)(),u;typeof e!="string"&&!(e instanceof Promise)&&(u=e);let[P,T]=(0,o.useState)(u?.initialResults),d=r.current;return S(r.current,n)||(r.current=n,d=n),(0,o.useEffect)(()=>{let f=!1,l=s=>{f||T(s)};if(typeof e=="string"){let s=t!==void 0?i.live.incrementalQuery(e,d,t,l):i.live.query(e,d,l);return()=>{f=!0,s.then(({unsubscribe:g})=>g())}}else{if(e instanceof Promise)return e.then(s=>{f||(a.current=s,T(s.initialResults),s.subscribe(l))}),()=>{f=!0,a.current?.unsubscribe(l)};if(u)return T(u.initialResults),u.subscribe(l),()=>{f=!0,u.unsubscribe(l)};throw new Error("Should never happen")}},[i,t,e,d,u]),P&&{rows:P.rows,fields:P.fields}}function R(e,n){return m(e,n)}R.sql=function(e,...n){let{query:t,params:i}=(0,L.query)(e,...n);return m(t,i)};function E(e,n,t){return m(e,n,t)}0&&(module.exports={PGliteProvider,makePGliteProvider,useLiveIncrementalQuery,useLiveQuery,usePGlite});
1
+ "use strict";var y=Object.defineProperty;var w=Object.getOwnPropertyDescriptor;var k=Object.getOwnPropertyNames;var h=Object.prototype.hasOwnProperty;var x=(e,t)=>{for(var n in t)y(e,n,{get:t[n],enumerable:!0})},b=(e,t,n,u)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of k(t))!h.call(e,r)&&r!==n&&y(e,r,{get:()=>t[r],enumerable:!(u=w(t,r))||u.enumerable});return e};var W=e=>b(y({},"__esModule",{value:!0}),e);var U={};x(U,{PGliteProvider:()=>S,makePGliteProvider:()=>m,useLiveIncrementalQuery:()=>E,useLiveQuery:()=>R,usePGlite:()=>a});module.exports=W(U);var P=require("react"),Q=require("react/jsx-runtime");function m(){let e=(0,P.createContext)(void 0);return{usePGlite:t=>{let n=(0,P.useContext)(e);if(t!==void 0)return t;if(!n)throw new Error("No PGlite instance found, use PGliteProvider to provide one");return n},PGliteProvider:({children:t,db:n})=>(0,Q.jsx)(e.Provider,{value:n,children:t})}}var{PGliteProvider:S,usePGlite:a}=m();var G=require("@electric-sql/pglite/template"),o=require("react");function C(e,t){if(!e&&!t)return!0;if(e?.length!==t?.length)return!1;for(let n=0;n<e.length;n++)if(!Object.is(e[n],t[n]))return!1;return!0}function L(e,t,n){let u=a(),r=(0,o.useRef)(t),v=(0,o.useRef)(),i,p=!1;typeof e!="string"&&!(e instanceof Promise)&&(i=e,p=v.current!==i,v.current=i);let[l,T]=(0,o.useState)(i?.initialResults),c=r.current;return C(r.current,t)||(r.current=t,c=t),(0,o.useEffect)(()=>{let d=!1,f=s=>{d||T(s)};if(typeof e=="string"){let s=n!==void 0?u.live.incrementalQuery(e,c,n,f):u.live.query(e,c,f);return()=>{d=!0,s.then(({unsubscribe:g})=>g())}}else{if(e instanceof Promise)return e.then(s=>{d||(v.current=s,T(s.initialResults),s.subscribe(f))}),()=>{d=!0,v.current?.unsubscribe(f)};if(i)return T(i.initialResults),i.subscribe(f),()=>{d=!0,i.unsubscribe(f)};throw new Error("Should never happen")}},[u,n,e,c,i]),p&&i?i.initialResults:l&&{rows:l.rows,fields:l.fields,totalCount:l.totalCount,offset:l.offset,limit:l.limit}}function R(e,t){return L(e,t)}R.sql=function(e,...t){let{query:n,params:u}=(0,G.query)(e,...t);return L(n,u)};function E(e,t,n){return L(e,t,n)}0&&(module.exports={PGliteProvider,makePGliteProvider,useLiveIncrementalQuery,useLiveQuery,usePGlite});
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/provider.tsx","../src/hooks.ts"],"sourcesContent":["export * from './provider'\nexport * from './hooks'\n","import React, { createContext, useContext } from 'react'\nimport { PGliteWithLive } from '@electric-sql/pglite/live'\n\ninterface Props<T extends PGliteWithLive> {\n children?: React.ReactNode\n db?: T\n}\n\ntype PGliteProvider<T extends PGliteWithLive> = (props: Props<T>) => JSX.Element\ntype UsePGlite<T extends PGliteWithLive> = (db?: T) => T\n\ninterface PGliteProviderSet<T extends PGliteWithLive> {\n PGliteProvider: PGliteProvider<T>\n usePGlite: UsePGlite<T>\n}\n\n/**\n * Create a typed set of {@link PGliteProvider} and {@link usePGlite}.\n */\nfunction makePGliteProvider<T extends PGliteWithLive>(): PGliteProviderSet<T> {\n const ctx = createContext<T | undefined>(undefined)\n return {\n usePGlite: ((db?: T) => {\n const dbProvided = useContext(ctx)\n\n // allow providing a db explicitly\n if (db !== undefined) return db\n\n if (!dbProvided)\n throw new Error(\n 'No PGlite instance found, use PGliteProvider to provide one',\n )\n\n return dbProvided\n }) as UsePGlite<T>,\n PGliteProvider: ({ children, db }: Props<T>) => {\n return <ctx.Provider value={db}>{children}</ctx.Provider>\n },\n }\n}\n\nconst { PGliteProvider, usePGlite } = makePGliteProvider<PGliteWithLive>()\n\nexport { makePGliteProvider, PGliteProvider, usePGlite }\n","import { useEffect, useState, useRef } from 'react'\nimport { Results } from '@electric-sql/pglite'\nimport type { LiveQuery } from '@electric-sql/pglite/live'\nimport { usePGlite } from './provider'\nimport { query as buildQuery } from '@electric-sql/pglite/template'\n\nfunction paramsEqual(\n a1: unknown[] | undefined | null,\n a2: unknown[] | undefined | null,\n) {\n if (!a1 && !a2) return true\n if (a1?.length !== a2?.length) return false\n for (let i = 0; i < a1!.length; i++) {\n if (!Object.is(a1![i], a2![i])) {\n return false\n }\n }\n return true\n}\n\nfunction useLiveQueryImpl<T = { [key: string]: unknown }>(\n query: string | LiveQuery<T> | Promise<LiveQuery<T>>,\n params: unknown[] | undefined | null,\n key?: string,\n): Omit<Results<T>, 'affectedRows'> | undefined {\n const db = usePGlite()\n const paramsRef = useRef(params)\n const liveQueryRef = useRef<LiveQuery<T> | undefined>()\n let liveQuery: LiveQuery<T> | undefined\n if (!(typeof query === 'string') && !(query instanceof Promise)) {\n liveQuery = query\n }\n const [results, setResults] = useState<Results<T> | undefined>(\n liveQuery?.initialResults,\n )\n\n let currentParams = paramsRef.current\n if (!paramsEqual(paramsRef.current, params)) {\n paramsRef.current = params\n currentParams = params\n }\n\n useEffect(() => {\n let cancelled = false\n const cb = (results: Results<T>) => {\n if (cancelled) return\n setResults(results)\n }\n if (typeof query === 'string') {\n const ret =\n key !== undefined\n ? db.live.incrementalQuery<T>(query, currentParams, key, cb)\n : db.live.query<T>(query, currentParams, cb)\n\n return () => {\n cancelled = true\n ret.then(({ unsubscribe }) => unsubscribe())\n }\n } else if (query instanceof Promise) {\n query.then((liveQuery) => {\n if (cancelled) return\n liveQueryRef.current = liveQuery\n setResults(liveQuery.initialResults)\n liveQuery.subscribe(cb)\n })\n return () => {\n cancelled = true\n liveQueryRef.current?.unsubscribe(cb)\n }\n } else if (liveQuery) {\n setResults(liveQuery.initialResults)\n liveQuery.subscribe(cb)\n return () => {\n cancelled = true\n liveQuery.unsubscribe(cb)\n }\n } else {\n throw new Error('Should never happen')\n }\n }, [db, key, query, currentParams, liveQuery])\n\n return (\n results && {\n rows: results.rows,\n fields: results.fields,\n }\n )\n}\n\nexport function useLiveQuery<T = { [key: string]: unknown }>(\n query: string,\n params?: unknown[] | null,\n): Results<T> | undefined\n\nexport function useLiveQuery<T = { [key: string]: unknown }>(\n liveQuery: LiveQuery<T>,\n): Results<T>\n\nexport function useLiveQuery<T = { [key: string]: unknown }>(\n liveQueryPromise: Promise<LiveQuery<T>>,\n): Results<T> | undefined\n\nexport function useLiveQuery<T = { [key: string]: unknown }>(\n query: string | LiveQuery<T> | Promise<LiveQuery<T>>,\n params?: unknown[] | null,\n): Results<T> | undefined {\n return useLiveQueryImpl<T>(query, params)\n}\n\nuseLiveQuery.sql = function <T = { [key: string]: unknown }>(\n strings: TemplateStringsArray,\n ...values: any[]\n): Results<T> | undefined {\n const { query, params } = buildQuery(strings, ...values)\n // eslint-disable-next-line react-compiler/react-compiler\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return useLiveQueryImpl<T>(query, params)\n}\n\nexport function useLiveIncrementalQuery<T = { [key: string]: unknown }>(\n query: string,\n params: unknown[] | undefined | null,\n key: string,\n): Results<T> | undefined {\n return useLiveQueryImpl<T>(query, params, key)\n}\n"],"mappings":"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","names":["src_exports","__export","PGliteProvider","makePGliteProvider","useLiveIncrementalQuery","useLiveQuery","usePGlite","__toCommonJS","import_react","import_jsx_runtime","makePGliteProvider","ctx","db","dbProvided","children","PGliteProvider","usePGlite","import_react","import_template","paramsEqual","a1","a2","i","useLiveQueryImpl","query","params","key","db","usePGlite","paramsRef","liveQueryRef","liveQuery","results","setResults","currentParams","cancelled","cb","ret","unsubscribe","useLiveQuery","strings","values","buildQuery","useLiveIncrementalQuery"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/provider.tsx","../src/hooks.ts"],"sourcesContent":["export * from './provider'\nexport * from './hooks'\n","import React, { createContext, useContext } from 'react'\nimport { PGliteWithLive } from '@electric-sql/pglite/live'\n\ninterface Props<T extends PGliteWithLive> {\n children?: React.ReactNode\n db?: T\n}\n\ntype PGliteProvider<T extends PGliteWithLive> = (props: Props<T>) => JSX.Element\ntype UsePGlite<T extends PGliteWithLive> = (db?: T) => T\n\ninterface PGliteProviderSet<T extends PGliteWithLive> {\n PGliteProvider: PGliteProvider<T>\n usePGlite: UsePGlite<T>\n}\n\n/**\n * Create a typed set of {@link PGliteProvider} and {@link usePGlite}.\n */\nfunction makePGliteProvider<T extends PGliteWithLive>(): PGliteProviderSet<T> {\n const ctx = createContext<T | undefined>(undefined)\n return {\n usePGlite: ((db?: T) => {\n const dbProvided = useContext(ctx)\n\n // allow providing a db explicitly\n if (db !== undefined) return db\n\n if (!dbProvided)\n throw new Error(\n 'No PGlite instance found, use PGliteProvider to provide one',\n )\n\n return dbProvided\n }) as UsePGlite<T>,\n PGliteProvider: ({ children, db }: Props<T>) => {\n return <ctx.Provider value={db}>{children}</ctx.Provider>\n },\n }\n}\n\nconst { PGliteProvider, usePGlite } = makePGliteProvider<PGliteWithLive>()\n\nexport { makePGliteProvider, PGliteProvider, usePGlite }\n","import type { LiveQuery, LiveQueryResults } from '@electric-sql/pglite/live'\nimport { query as buildQuery } from '@electric-sql/pglite/template'\nimport { useEffect, useRef, useState } from 'react'\nimport { usePGlite } from './provider'\n\nfunction paramsEqual(\n a1: unknown[] | undefined | null,\n a2: unknown[] | undefined | null,\n) {\n if (!a1 && !a2) return true\n if (a1?.length !== a2?.length) return false\n for (let i = 0; i < a1!.length; i++) {\n if (!Object.is(a1![i], a2![i])) {\n return false\n }\n }\n return true\n}\n\nfunction useLiveQueryImpl<T = { [key: string]: unknown }>(\n query: string | LiveQuery<T> | Promise<LiveQuery<T>>,\n params: unknown[] | undefined | null,\n key?: string,\n): Omit<LiveQueryResults<T>, 'affectedRows'> | undefined {\n const db = usePGlite()\n const paramsRef = useRef(params)\n const liveQueryRef = useRef<LiveQuery<T> | undefined>()\n let liveQuery: LiveQuery<T> | undefined\n let liveQueryChanged = false\n if (!(typeof query === 'string') && !(query instanceof Promise)) {\n liveQuery = query\n liveQueryChanged = liveQueryRef.current !== liveQuery\n liveQueryRef.current = liveQuery\n }\n const [results, setResults] = useState<LiveQueryResults<T> | undefined>(\n liveQuery?.initialResults,\n )\n\n let currentParams = paramsRef.current\n if (!paramsEqual(paramsRef.current, params)) {\n paramsRef.current = params\n currentParams = params\n }\n\n /* eslint-disable @eslint-react/hooks-extra/no-direct-set-state-in-use-effect */\n useEffect(() => {\n let cancelled = false\n const cb = (results: LiveQueryResults<T>) => {\n if (cancelled) return\n setResults(results)\n }\n if (typeof query === 'string') {\n const ret =\n key !== undefined\n ? db.live.incrementalQuery<T>(query, currentParams, key, cb)\n : db.live.query<T>(query, currentParams, cb)\n\n return () => {\n cancelled = true\n ret.then(({ unsubscribe }) => unsubscribe())\n }\n } else if (query instanceof Promise) {\n query.then((liveQuery) => {\n if (cancelled) return\n liveQueryRef.current = liveQuery\n setResults(liveQuery.initialResults)\n liveQuery.subscribe(cb)\n })\n return () => {\n cancelled = true\n liveQueryRef.current?.unsubscribe(cb)\n }\n } else if (liveQuery) {\n setResults(liveQuery.initialResults)\n liveQuery.subscribe(cb)\n return () => {\n cancelled = true\n liveQuery.unsubscribe(cb)\n }\n } else {\n throw new Error('Should never happen')\n }\n }, [db, key, query, currentParams, liveQuery])\n /* eslint-enable @eslint-react/hooks-extra/no-direct-set-state-in-use-effect */\n\n if (liveQueryChanged && liveQuery) {\n return liveQuery.initialResults\n }\n\n return (\n results && {\n rows: results.rows,\n fields: results.fields,\n totalCount: results.totalCount,\n offset: results.offset,\n limit: results.limit,\n }\n )\n}\n\nexport function useLiveQuery<T = { [key: string]: unknown }>(\n query: string,\n params?: unknown[] | null,\n): LiveQueryResults<T> | undefined\n\nexport function useLiveQuery<T = { [key: string]: unknown }>(\n liveQuery: LiveQuery<T>,\n): LiveQueryResults<T>\n\nexport function useLiveQuery<T = { [key: string]: unknown }>(\n liveQueryPromise: Promise<LiveQuery<T>>,\n): LiveQueryResults<T> | undefined\n\nexport function useLiveQuery<T = { [key: string]: unknown }>(\n query: string | LiveQuery<T> | Promise<LiveQuery<T>>,\n params?: unknown[] | null,\n): LiveQueryResults<T> | undefined {\n return useLiveQueryImpl<T>(query, params)\n}\n\nuseLiveQuery.sql = function <T = { [key: string]: unknown }>(\n strings: TemplateStringsArray,\n ...values: any[]\n): LiveQueryResults<T> | undefined {\n const { query, params } = buildQuery(strings, ...values)\n // eslint-disable-next-line react-compiler/react-compiler\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return useLiveQueryImpl<T>(query, params)\n}\n\nexport function useLiveIncrementalQuery<T = { [key: string]: unknown }>(\n query: string,\n params: unknown[] | undefined | null,\n key: string,\n): LiveQueryResults<T> | undefined {\n return useLiveQueryImpl<T>(query, params, key)\n}\n"],"mappings":"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","names":["src_exports","__export","PGliteProvider","makePGliteProvider","useLiveIncrementalQuery","useLiveQuery","usePGlite","__toCommonJS","import_react","import_jsx_runtime","makePGliteProvider","ctx","db","dbProvided","children","PGliteProvider","usePGlite","import_template","import_react","paramsEqual","a1","a2","i","useLiveQueryImpl","query","params","key","db","usePGlite","paramsRef","liveQueryRef","liveQuery","liveQueryChanged","results","setResults","currentParams","cancelled","cb","ret","unsubscribe","useLiveQuery","strings","values","buildQuery","useLiveIncrementalQuery"]}
package/dist/index.d.cts CHANGED
@@ -1,6 +1,5 @@
1
1
  import React from 'react';
2
- import { PGliteWithLive, LiveQuery } from '@electric-sql/pglite/live';
3
- import { Results } from '@electric-sql/pglite';
2
+ import { PGliteWithLive, LiveQueryResults, LiveQuery } from '@electric-sql/pglite/live';
4
3
 
5
4
  interface Props<T extends PGliteWithLive> {
6
5
  children?: React.ReactNode;
@@ -21,20 +20,20 @@ declare const usePGlite: UsePGlite<PGliteWithLive>;
21
20
 
22
21
  declare function useLiveQuery<T = {
23
22
  [key: string]: unknown;
24
- }>(query: string, params?: unknown[] | null): Results<T> | undefined;
23
+ }>(query: string, params?: unknown[] | null): LiveQueryResults<T> | undefined;
25
24
  declare function useLiveQuery<T = {
26
25
  [key: string]: unknown;
27
- }>(liveQuery: LiveQuery<T>): Results<T>;
26
+ }>(liveQuery: LiveQuery<T>): LiveQueryResults<T>;
28
27
  declare function useLiveQuery<T = {
29
28
  [key: string]: unknown;
30
- }>(liveQueryPromise: Promise<LiveQuery<T>>): Results<T> | undefined;
29
+ }>(liveQueryPromise: Promise<LiveQuery<T>>): LiveQueryResults<T> | undefined;
31
30
  declare namespace useLiveQuery {
32
31
  var sql: <T = {
33
32
  [key: string]: unknown;
34
- }>(strings: TemplateStringsArray, ...values: any[]) => Results<T> | undefined;
33
+ }>(strings: TemplateStringsArray, ...values: any[]) => LiveQueryResults<T> | undefined;
35
34
  }
36
35
  declare function useLiveIncrementalQuery<T = {
37
36
  [key: string]: unknown;
38
- }>(query: string, params: unknown[] | undefined | null, key: string): Results<T> | undefined;
37
+ }>(query: string, params: unknown[] | undefined | null, key: string): LiveQueryResults<T> | undefined;
39
38
 
40
39
  export { PGliteProvider, makePGliteProvider, useLiveIncrementalQuery, useLiveQuery, usePGlite };
package/dist/index.d.ts CHANGED
@@ -1,6 +1,5 @@
1
1
  import React from 'react';
2
- import { PGliteWithLive, LiveQuery } from '@electric-sql/pglite/live';
3
- import { Results } from '@electric-sql/pglite';
2
+ import { PGliteWithLive, LiveQueryResults, LiveQuery } from '@electric-sql/pglite/live';
4
3
 
5
4
  interface Props<T extends PGliteWithLive> {
6
5
  children?: React.ReactNode;
@@ -21,20 +20,20 @@ declare const usePGlite: UsePGlite<PGliteWithLive>;
21
20
 
22
21
  declare function useLiveQuery<T = {
23
22
  [key: string]: unknown;
24
- }>(query: string, params?: unknown[] | null): Results<T> | undefined;
23
+ }>(query: string, params?: unknown[] | null): LiveQueryResults<T> | undefined;
25
24
  declare function useLiveQuery<T = {
26
25
  [key: string]: unknown;
27
- }>(liveQuery: LiveQuery<T>): Results<T>;
26
+ }>(liveQuery: LiveQuery<T>): LiveQueryResults<T>;
28
27
  declare function useLiveQuery<T = {
29
28
  [key: string]: unknown;
30
- }>(liveQueryPromise: Promise<LiveQuery<T>>): Results<T> | undefined;
29
+ }>(liveQueryPromise: Promise<LiveQuery<T>>): LiveQueryResults<T> | undefined;
31
30
  declare namespace useLiveQuery {
32
31
  var sql: <T = {
33
32
  [key: string]: unknown;
34
- }>(strings: TemplateStringsArray, ...values: any[]) => Results<T> | undefined;
33
+ }>(strings: TemplateStringsArray, ...values: any[]) => LiveQueryResults<T> | undefined;
35
34
  }
36
35
  declare function useLiveIncrementalQuery<T = {
37
36
  [key: string]: unknown;
38
- }>(query: string, params: unknown[] | undefined | null, key: string): Results<T> | undefined;
37
+ }>(query: string, params: unknown[] | undefined | null, key: string): LiveQueryResults<T> | undefined;
39
38
 
40
39
  export { PGliteProvider, makePGliteProvider, useLiveIncrementalQuery, useLiveQuery, usePGlite };
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import{createContext as a,useContext as y}from"react";import{jsx as L}from"react/jsx-runtime";function G(){let e=a(void 0);return{usePGlite:n=>{let t=y(e);if(n!==void 0)return n;if(!t)throw new Error("No PGlite instance found, use PGliteProvider to provide one");return t},PGliteProvider:({children:n,db:t})=>L(e.Provider,{value:t,children:n})}}var{PGliteProvider:b,usePGlite:v}=G();import{useEffect as R,useState as g,useRef as p}from"react";import{query as w}from"@electric-sql/pglite/template";function k(e,n){if(!e&&!n)return!0;if(e?.length!==n?.length)return!1;for(let t=0;t<e.length;t++)if(!Object.is(e[t],n[t]))return!1;return!0}function P(e,n,t){let s=v(),f=p(n),T=p(),r;typeof e!="string"&&!(e instanceof Promise)&&(r=e);let[d,c]=g(r?.initialResults),l=f.current;return k(f.current,n)||(f.current=n,l=n),R(()=>{let o=!1,u=i=>{o||c(i)};if(typeof e=="string"){let i=t!==void 0?s.live.incrementalQuery(e,l,t,u):s.live.query(e,l,u);return()=>{o=!0,i.then(({unsubscribe:m})=>m())}}else{if(e instanceof Promise)return e.then(i=>{o||(T.current=i,c(i.initialResults),i.subscribe(u))}),()=>{o=!0,T.current?.unsubscribe(u)};if(r)return c(r.initialResults),r.subscribe(u),()=>{o=!0,r.unsubscribe(u)};throw new Error("Should never happen")}},[s,t,e,l,r]),d&&{rows:d.rows,fields:d.fields}}function Q(e,n){return P(e,n)}Q.sql=function(e,...n){let{query:t,params:s}=w(e,...n);return P(t,s)};function I(e,n,t){return P(e,n,t)}export{b as PGliteProvider,G as makePGliteProvider,I as useLiveIncrementalQuery,Q as useLiveQuery,v as usePGlite};
1
+ import{createContext as p,useContext as m}from"react";import{jsx as G}from"react/jsx-runtime";function Q(){let e=p(void 0);return{usePGlite:t=>{let n=m(e);if(t!==void 0)return t;if(!n)throw new Error("No PGlite instance found, use PGliteProvider to provide one");return n},PGliteProvider:({children:t,db:n})=>G(e.Provider,{value:n,children:t})}}var{PGliteProvider:W,usePGlite:y}=Q();import{query as R}from"@electric-sql/pglite/template";import{useEffect as g,useRef as a,useState as w}from"react";function k(e,t){if(!e&&!t)return!0;if(e?.length!==t?.length)return!1;for(let n=0;n<e.length;n++)if(!Object.is(e[n],t[n]))return!1;return!0}function P(e,t,n){let o=y(),v=a(t),f=a(),i,T=!1;typeof e!="string"&&!(e instanceof Promise)&&(i=e,T=f.current!==i,f.current=i);let[u,c]=w(i?.initialResults),d=v.current;return k(v.current,t)||(v.current=t,d=t),g(()=>{let l=!1,s=r=>{l||c(r)};if(typeof e=="string"){let r=n!==void 0?o.live.incrementalQuery(e,d,n,s):o.live.query(e,d,s);return()=>{l=!0,r.then(({unsubscribe:L})=>L())}}else{if(e instanceof Promise)return e.then(r=>{l||(f.current=r,c(r.initialResults),r.subscribe(s))}),()=>{l=!0,f.current?.unsubscribe(s)};if(i)return c(i.initialResults),i.subscribe(s),()=>{l=!0,i.unsubscribe(s)};throw new Error("Should never happen")}},[o,n,e,d,i]),T&&i?i.initialResults:u&&{rows:u.rows,fields:u.fields,totalCount:u.totalCount,offset:u.offset,limit:u.limit}}function h(e,t){return P(e,t)}h.sql=function(e,...t){let{query:n,params:o}=R(e,...t);return P(n,o)};function N(e,t,n){return P(e,t,n)}export{W as PGliteProvider,Q as makePGliteProvider,N as useLiveIncrementalQuery,h as useLiveQuery,y as usePGlite};
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/provider.tsx","../src/hooks.ts"],"sourcesContent":["import React, { createContext, useContext } from 'react'\nimport { PGliteWithLive } from '@electric-sql/pglite/live'\n\ninterface Props<T extends PGliteWithLive> {\n children?: React.ReactNode\n db?: T\n}\n\ntype PGliteProvider<T extends PGliteWithLive> = (props: Props<T>) => JSX.Element\ntype UsePGlite<T extends PGliteWithLive> = (db?: T) => T\n\ninterface PGliteProviderSet<T extends PGliteWithLive> {\n PGliteProvider: PGliteProvider<T>\n usePGlite: UsePGlite<T>\n}\n\n/**\n * Create a typed set of {@link PGliteProvider} and {@link usePGlite}.\n */\nfunction makePGliteProvider<T extends PGliteWithLive>(): PGliteProviderSet<T> {\n const ctx = createContext<T | undefined>(undefined)\n return {\n usePGlite: ((db?: T) => {\n const dbProvided = useContext(ctx)\n\n // allow providing a db explicitly\n if (db !== undefined) return db\n\n if (!dbProvided)\n throw new Error(\n 'No PGlite instance found, use PGliteProvider to provide one',\n )\n\n return dbProvided\n }) as UsePGlite<T>,\n PGliteProvider: ({ children, db }: Props<T>) => {\n return <ctx.Provider value={db}>{children}</ctx.Provider>\n },\n }\n}\n\nconst { PGliteProvider, usePGlite } = makePGliteProvider<PGliteWithLive>()\n\nexport { makePGliteProvider, PGliteProvider, usePGlite }\n","import { useEffect, useState, useRef } from 'react'\nimport { Results } from '@electric-sql/pglite'\nimport type { LiveQuery } from '@electric-sql/pglite/live'\nimport { usePGlite } from './provider'\nimport { query as buildQuery } from '@electric-sql/pglite/template'\n\nfunction paramsEqual(\n a1: unknown[] | undefined | null,\n a2: unknown[] | undefined | null,\n) {\n if (!a1 && !a2) return true\n if (a1?.length !== a2?.length) return false\n for (let i = 0; i < a1!.length; i++) {\n if (!Object.is(a1![i], a2![i])) {\n return false\n }\n }\n return true\n}\n\nfunction useLiveQueryImpl<T = { [key: string]: unknown }>(\n query: string | LiveQuery<T> | Promise<LiveQuery<T>>,\n params: unknown[] | undefined | null,\n key?: string,\n): Omit<Results<T>, 'affectedRows'> | undefined {\n const db = usePGlite()\n const paramsRef = useRef(params)\n const liveQueryRef = useRef<LiveQuery<T> | undefined>()\n let liveQuery: LiveQuery<T> | undefined\n if (!(typeof query === 'string') && !(query instanceof Promise)) {\n liveQuery = query\n }\n const [results, setResults] = useState<Results<T> | undefined>(\n liveQuery?.initialResults,\n )\n\n let currentParams = paramsRef.current\n if (!paramsEqual(paramsRef.current, params)) {\n paramsRef.current = params\n currentParams = params\n }\n\n useEffect(() => {\n let cancelled = false\n const cb = (results: Results<T>) => {\n if (cancelled) return\n setResults(results)\n }\n if (typeof query === 'string') {\n const ret =\n key !== undefined\n ? db.live.incrementalQuery<T>(query, currentParams, key, cb)\n : db.live.query<T>(query, currentParams, cb)\n\n return () => {\n cancelled = true\n ret.then(({ unsubscribe }) => unsubscribe())\n }\n } else if (query instanceof Promise) {\n query.then((liveQuery) => {\n if (cancelled) return\n liveQueryRef.current = liveQuery\n setResults(liveQuery.initialResults)\n liveQuery.subscribe(cb)\n })\n return () => {\n cancelled = true\n liveQueryRef.current?.unsubscribe(cb)\n }\n } else if (liveQuery) {\n setResults(liveQuery.initialResults)\n liveQuery.subscribe(cb)\n return () => {\n cancelled = true\n liveQuery.unsubscribe(cb)\n }\n } else {\n throw new Error('Should never happen')\n }\n }, [db, key, query, currentParams, liveQuery])\n\n return (\n results && {\n rows: results.rows,\n fields: results.fields,\n }\n )\n}\n\nexport function useLiveQuery<T = { [key: string]: unknown }>(\n query: string,\n params?: unknown[] | null,\n): Results<T> | undefined\n\nexport function useLiveQuery<T = { [key: string]: unknown }>(\n liveQuery: LiveQuery<T>,\n): Results<T>\n\nexport function useLiveQuery<T = { [key: string]: unknown }>(\n liveQueryPromise: Promise<LiveQuery<T>>,\n): Results<T> | undefined\n\nexport function useLiveQuery<T = { [key: string]: unknown }>(\n query: string | LiveQuery<T> | Promise<LiveQuery<T>>,\n params?: unknown[] | null,\n): Results<T> | undefined {\n return useLiveQueryImpl<T>(query, params)\n}\n\nuseLiveQuery.sql = function <T = { [key: string]: unknown }>(\n strings: TemplateStringsArray,\n ...values: any[]\n): Results<T> | undefined {\n const { query, params } = buildQuery(strings, ...values)\n // eslint-disable-next-line react-compiler/react-compiler\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return useLiveQueryImpl<T>(query, params)\n}\n\nexport function useLiveIncrementalQuery<T = { [key: string]: unknown }>(\n query: string,\n params: unknown[] | undefined | null,\n key: string,\n): Results<T> | undefined {\n return useLiveQueryImpl<T>(query, params, key)\n}\n"],"mappings":"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","names":["createContext","useContext","jsx","makePGliteProvider","ctx","db","dbProvided","children","PGliteProvider","usePGlite","useEffect","useState","useRef","buildQuery","paramsEqual","a1","a2","i","useLiveQueryImpl","query","params","key","db","usePGlite","paramsRef","useRef","liveQueryRef","liveQuery","results","setResults","useState","currentParams","useEffect","cancelled","cb","ret","unsubscribe","useLiveQuery","strings","values","useLiveIncrementalQuery"]}
1
+ {"version":3,"sources":["../src/provider.tsx","../src/hooks.ts"],"sourcesContent":["import React, { createContext, useContext } from 'react'\nimport { PGliteWithLive } from '@electric-sql/pglite/live'\n\ninterface Props<T extends PGliteWithLive> {\n children?: React.ReactNode\n db?: T\n}\n\ntype PGliteProvider<T extends PGliteWithLive> = (props: Props<T>) => JSX.Element\ntype UsePGlite<T extends PGliteWithLive> = (db?: T) => T\n\ninterface PGliteProviderSet<T extends PGliteWithLive> {\n PGliteProvider: PGliteProvider<T>\n usePGlite: UsePGlite<T>\n}\n\n/**\n * Create a typed set of {@link PGliteProvider} and {@link usePGlite}.\n */\nfunction makePGliteProvider<T extends PGliteWithLive>(): PGliteProviderSet<T> {\n const ctx = createContext<T | undefined>(undefined)\n return {\n usePGlite: ((db?: T) => {\n const dbProvided = useContext(ctx)\n\n // allow providing a db explicitly\n if (db !== undefined) return db\n\n if (!dbProvided)\n throw new Error(\n 'No PGlite instance found, use PGliteProvider to provide one',\n )\n\n return dbProvided\n }) as UsePGlite<T>,\n PGliteProvider: ({ children, db }: Props<T>) => {\n return <ctx.Provider value={db}>{children}</ctx.Provider>\n },\n }\n}\n\nconst { PGliteProvider, usePGlite } = makePGliteProvider<PGliteWithLive>()\n\nexport { makePGliteProvider, PGliteProvider, usePGlite }\n","import type { LiveQuery, LiveQueryResults } from '@electric-sql/pglite/live'\nimport { query as buildQuery } from '@electric-sql/pglite/template'\nimport { useEffect, useRef, useState } from 'react'\nimport { usePGlite } from './provider'\n\nfunction paramsEqual(\n a1: unknown[] | undefined | null,\n a2: unknown[] | undefined | null,\n) {\n if (!a1 && !a2) return true\n if (a1?.length !== a2?.length) return false\n for (let i = 0; i < a1!.length; i++) {\n if (!Object.is(a1![i], a2![i])) {\n return false\n }\n }\n return true\n}\n\nfunction useLiveQueryImpl<T = { [key: string]: unknown }>(\n query: string | LiveQuery<T> | Promise<LiveQuery<T>>,\n params: unknown[] | undefined | null,\n key?: string,\n): Omit<LiveQueryResults<T>, 'affectedRows'> | undefined {\n const db = usePGlite()\n const paramsRef = useRef(params)\n const liveQueryRef = useRef<LiveQuery<T> | undefined>()\n let liveQuery: LiveQuery<T> | undefined\n let liveQueryChanged = false\n if (!(typeof query === 'string') && !(query instanceof Promise)) {\n liveQuery = query\n liveQueryChanged = liveQueryRef.current !== liveQuery\n liveQueryRef.current = liveQuery\n }\n const [results, setResults] = useState<LiveQueryResults<T> | undefined>(\n liveQuery?.initialResults,\n )\n\n let currentParams = paramsRef.current\n if (!paramsEqual(paramsRef.current, params)) {\n paramsRef.current = params\n currentParams = params\n }\n\n /* eslint-disable @eslint-react/hooks-extra/no-direct-set-state-in-use-effect */\n useEffect(() => {\n let cancelled = false\n const cb = (results: LiveQueryResults<T>) => {\n if (cancelled) return\n setResults(results)\n }\n if (typeof query === 'string') {\n const ret =\n key !== undefined\n ? db.live.incrementalQuery<T>(query, currentParams, key, cb)\n : db.live.query<T>(query, currentParams, cb)\n\n return () => {\n cancelled = true\n ret.then(({ unsubscribe }) => unsubscribe())\n }\n } else if (query instanceof Promise) {\n query.then((liveQuery) => {\n if (cancelled) return\n liveQueryRef.current = liveQuery\n setResults(liveQuery.initialResults)\n liveQuery.subscribe(cb)\n })\n return () => {\n cancelled = true\n liveQueryRef.current?.unsubscribe(cb)\n }\n } else if (liveQuery) {\n setResults(liveQuery.initialResults)\n liveQuery.subscribe(cb)\n return () => {\n cancelled = true\n liveQuery.unsubscribe(cb)\n }\n } else {\n throw new Error('Should never happen')\n }\n }, [db, key, query, currentParams, liveQuery])\n /* eslint-enable @eslint-react/hooks-extra/no-direct-set-state-in-use-effect */\n\n if (liveQueryChanged && liveQuery) {\n return liveQuery.initialResults\n }\n\n return (\n results && {\n rows: results.rows,\n fields: results.fields,\n totalCount: results.totalCount,\n offset: results.offset,\n limit: results.limit,\n }\n )\n}\n\nexport function useLiveQuery<T = { [key: string]: unknown }>(\n query: string,\n params?: unknown[] | null,\n): LiveQueryResults<T> | undefined\n\nexport function useLiveQuery<T = { [key: string]: unknown }>(\n liveQuery: LiveQuery<T>,\n): LiveQueryResults<T>\n\nexport function useLiveQuery<T = { [key: string]: unknown }>(\n liveQueryPromise: Promise<LiveQuery<T>>,\n): LiveQueryResults<T> | undefined\n\nexport function useLiveQuery<T = { [key: string]: unknown }>(\n query: string | LiveQuery<T> | Promise<LiveQuery<T>>,\n params?: unknown[] | null,\n): LiveQueryResults<T> | undefined {\n return useLiveQueryImpl<T>(query, params)\n}\n\nuseLiveQuery.sql = function <T = { [key: string]: unknown }>(\n strings: TemplateStringsArray,\n ...values: any[]\n): LiveQueryResults<T> | undefined {\n const { query, params } = buildQuery(strings, ...values)\n // eslint-disable-next-line react-compiler/react-compiler\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return useLiveQueryImpl<T>(query, params)\n}\n\nexport function useLiveIncrementalQuery<T = { [key: string]: unknown }>(\n query: string,\n params: unknown[] | undefined | null,\n key: string,\n): LiveQueryResults<T> | undefined {\n return useLiveQueryImpl<T>(query, params, key)\n}\n"],"mappings":"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","names":["createContext","useContext","jsx","makePGliteProvider","ctx","db","dbProvided","children","PGliteProvider","usePGlite","buildQuery","useEffect","useRef","useState","paramsEqual","a1","a2","i","useLiveQueryImpl","query","params","key","db","usePGlite","paramsRef","useRef","liveQueryRef","liveQuery","liveQueryChanged","results","setResults","useState","currentParams","useEffect","cancelled","cb","ret","unsubscribe","useLiveQuery","strings","values","buildQuery","useLiveIncrementalQuery"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@electric-sql/pglite-react",
3
- "version": "0.2.13",
3
+ "version": "0.2.14",
4
4
  "description": "Hooks for using PGlite",
5
5
  "type": "module",
6
6
  "private": false,
@@ -48,11 +48,11 @@
48
48
  "react": "^18.3.1",
49
49
  "react-dom": "^18.3.1",
50
50
  "vitest": "^2.1.2",
51
- "@electric-sql/pglite": "0.2.13"
51
+ "@electric-sql/pglite": "0.2.14"
52
52
  },
53
53
  "peerDependencies": {
54
54
  "react": "^18.0.0",
55
- "@electric-sql/pglite": "^0.2.13"
55
+ "@electric-sql/pglite": "^0.2.14"
56
56
  },
57
57
  "scripts": {
58
58
  "build": "tsup",