@electric-sql/pglite
Version:
PGlite is a WASM Postgres build packaged into a TypeScript client library that enables you to run Postgres in the browser, Node.js and Bun, with no need to install any other dependencies. It is only 3.7mb gzipped.
133 lines (131 loc) • 20.9 kB
JavaScript
;var we=Object.create;var Q=Object.defineProperty;var Ae=Object.getOwnPropertyDescriptor;var Te=Object.getOwnPropertyNames;var Se=Object.getPrototypeOf,Re=Object.prototype.hasOwnProperty;var oe=e=>{throw TypeError(e)};var Ie=(e,t)=>{for(var n in t)Q(e,n,{get:t[n],enumerable:!0})},ue=(e,t,n,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Te(t))!Re.call(e,r)&&r!==n&&Q(e,r,{get:()=>t[r],enumerable:!(s=Ae(t,r))||s.enumerable});return e};var ce=(e,t,n)=>(n=e!=null?we(Se(e)):{},ue(t||!e||!e.__esModule?Q(n,"default",{value:e,enumerable:!0}):n,e)),ve=e=>ue(Q({},"__esModule",{value:!0}),e);var te=(e,t,n)=>t.has(e)||oe("Cannot "+n);var c=(e,t,n)=>(te(e,t,"read from private field"),n?n.call(e):t.get(e)),O=(e,t,n)=>t.has(e)?oe("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,n),v=(e,t,n,s)=>(te(e,t,"write to private field"),s?s.call(e,n):t.set(e,n),n),L=(e,t,n)=>(te(e,t,"access private method"),n);var ne=(e,t,n,s)=>({set _(r){v(e,t,r,n)},get _(){return c(e,t,s)}});var St={};Ie(St,{live:()=>At});module.exports=ve(St);function U(e){let t=e.length;for(let n=e.length-1;n>=0;n--){let s=e.charCodeAt(n);s>127&&s<=2047?t++:s>2047&&s<=65535&&(t+=2),s>=56320&&s<=57343&&n--}return t}var A,T,k,H,V,R,W,F,le,P=class{constructor(t=256){this.size=t;O(this,R);O(this,A);O(this,T,5);O(this,k,!1);O(this,H,new TextEncoder);O(this,V,0);v(this,A,L(this,R,W).call(this,t))}addInt32(t){return L(this,R,F).call(this,4),c(this,A).setInt32(c(this,T),t,c(this,k)),v(this,T,c(this,T)+4),this}addInt16(t){return L(this,R,F).call(this,2),c(this,A).setInt16(c(this,T),t,c(this,k)),v(this,T,c(this,T)+2),this}addCString(t){return t&&this.addString(t),L(this,R,F).call(this,1),c(this,A).setUint8(c(this,T),0),ne(this,T)._++,this}addString(t=""){let n=U(t);return L(this,R,F).call(this,n),c(this,H).encodeInto(t,new Uint8Array(c(this,A).buffer,c(this,T))),v(this,T,c(this,T)+n),this}add(t){return L(this,R,F).call(this,t.byteLength),new Uint8Array(c(this,A).buffer).set(new Uint8Array(t),c(this,T)),v(this,T,c(this,T)+t.byteLength),this}flush(t){let n=L(this,R,le).call(this,t);return v(this,T,5),v(this,A,L(this,R,W).call(this,this.size)),new Uint8Array(n)}};A=new WeakMap,T=new WeakMap,k=new WeakMap,H=new WeakMap,V=new WeakMap,R=new WeakSet,W=function(t){return new DataView(new ArrayBuffer(t))},F=function(t){if(c(this,A).byteLength-c(this,T)<t){let s=c(this,A).buffer,r=s.byteLength+(s.byteLength>>1)+t;v(this,A,L(this,R,W).call(this,r)),new Uint8Array(c(this,A).buffer).set(new Uint8Array(s))}},le=function(t){if(t){c(this,A).setUint8(c(this,V),t);let n=c(this,T)-(c(this,V)+1);c(this,A).setInt32(c(this,V)+1,n,c(this,k))}return c(this,A).buffer.slice(t?0:5,c(this,T))};var g=new P,Ce=e=>{g.addInt16(3).addInt16(0);for(let s of Object.keys(e))g.addCString(s).addCString(e[s]);g.addCString("client_encoding").addCString("UTF8");let t=g.addCString("").flush(),n=t.byteLength+4;return new P().addInt32(n).add(t).flush()},Ne=()=>{let e=new DataView(new ArrayBuffer(8));return e.setInt32(0,8,!1),e.setInt32(4,80877103,!1),new Uint8Array(e.buffer)},Le=e=>g.addCString(e).flush(112),De=(e,t)=>(g.addCString(e).addInt32(U(t)).addString(t),g.flush(112)),Oe=e=>g.addString(e).flush(112),Me=e=>g.addCString(e).flush(81),Be=[],xe=e=>{let t=e.name??"";t.length>63&&(console.error("Warning! Postgres only supports 63 characters for query names."),console.error("You supplied %s (%s)",t,t.length),console.error("This can cause conflicts and silent errors executing queries"));let n=g.addCString(t).addCString(e.text).addInt16(e.types?.length??0);return e.types?.forEach(s=>n.addInt32(s)),g.flush(80)},q=new P;var Pe=(e,t)=>{for(let n=0;n<e.length;n++){let s=t?t(e[n],n):e[n];if(s===null)g.addInt16(0),q.addInt32(-1);else if(s instanceof ArrayBuffer||ArrayBuffer.isView(s)){let r=ArrayBuffer.isView(s)?s.buffer.slice(s.byteOffset,s.byteOffset+s.byteLength):s;g.addInt16(1),q.addInt32(r.byteLength),q.add(r)}else g.addInt16(0),q.addInt32(U(s)),q.addString(s)}},$e=(e={})=>{let t=e.portal??"",n=e.statement??"",s=e.binary??!1,r=e.values??Be,a=r.length;return g.addCString(t).addCString(n),g.addInt16(a),Pe(r,e.valueMapper),g.addInt16(a),g.add(q.flush()),g.addInt16(s?1:0),g.flush(66)},Ue=new Uint8Array([69,0,0,0,9,0,0,0,0,0]),Fe=e=>{if(!e||!e.portal&&!e.rows)return Ue;let t=e.portal??"",n=e.rows??0,s=U(t),r=4+s+1+4,a=new DataView(new ArrayBuffer(1+r));return a.setUint8(0,69),a.setInt32(1,r,!1),new TextEncoder().encodeInto(t,new Uint8Array(a.buffer,5)),a.setUint8(s+5,0),a.setUint32(a.byteLength-4,n,!1),new Uint8Array(a.buffer)},ke=(e,t)=>{let n=new DataView(new ArrayBuffer(16));return n.setInt32(0,16,!1),n.setInt16(4,1234,!1),n.setInt16(6,5678,!1),n.setInt32(8,e,!1),n.setInt32(12,t,!1),new Uint8Array(n.buffer)},re=(e,t)=>{let n=new P;return n.addCString(t),n.flush(e)},Ve=g.addCString("P").flush(68),qe=g.addCString("S").flush(68),Ge=e=>e.name?re(68,`${e.type}${e.name??""}`):e.type==="P"?Ve:qe,je=e=>{let t=`${e.type}${e.name??""}`;return re(67,t)},Qe=e=>g.add(e).flush(100),We=e=>re(102,e),z=e=>new Uint8Array([e,0,0,0,4]),He=z(72),ze=z(83),Xe=z(88),Je=z(99),G={startup:Ce,password:Le,requestSsl:Ne,sendSASLInitialResponseMessage:De,sendSCRAMClientFinalMessage:Oe,query:Me,parse:xe,bind:$e,execute:Fe,describe:Ge,close:je,flush:()=>He,sync:()=>ze,end:()=>Xe,copyData:Qe,copyDone:()=>Je,copyFail:We,cancel:ke};var Ft=new ArrayBuffer(0);var Ke=1,Ze=4,In=Ke+Ze,vn=new ArrayBuffer(0);var et=globalThis.JSON.parse,tt=globalThis.JSON.stringify,de=16,pe=17;var fe=20,nt=21,rt=23;var X=25,st=26;var me=114;var it=700,at=701;var ot=1042,ut=1043,ct=1082;var lt=1114,ye=1184;var dt=3802;var pt={string:{to:X,from:[X,ut,ot],serialize:e=>{if(typeof e=="string")return e;if(typeof e=="number")return e.toString();throw new Error("Invalid input for string type")},parse:e=>e},number:{to:0,from:[nt,rt,st,it,at],serialize:e=>e.toString(),parse:e=>+e},bigint:{to:fe,from:[fe],serialize:e=>e.toString(),parse:e=>{let t=BigInt(e);return t<Number.MIN_SAFE_INTEGER||t>Number.MAX_SAFE_INTEGER?t:Number(t)}},json:{to:me,from:[me,dt],serialize:e=>typeof e=="string"?e:tt(e),parse:e=>et(e)},boolean:{to:de,from:[de],serialize:e=>{if(typeof e!="boolean")throw new Error("Invalid input for boolean type");return e?"t":"f"},parse:e=>e==="t"},date:{to:ye,from:[ct,lt,ye],serialize:e=>{if(typeof e=="string")return e;if(typeof e=="number")return new Date(e).toISOString();if(e instanceof Date)return e.toISOString();throw new Error("Invalid input for date type")},parse:e=>new Date(e)},bytea:{to:pe,from:[pe],serialize:e=>{if(!(e instanceof Uint8Array))throw new Error("Invalid input for bytea type");return"\\x"+Array.from(e).map(t=>t.toString(16).padStart(2,"0")).join("")},parse:e=>{let t=e.slice(2);return Uint8Array.from({length:t.length/2},(n,s)=>parseInt(t.substring(s*2,(s+1)*2),16))}}},he=ft(pt),Pn=he.parsers,$n=he.serializers;function ft(e){return Object.keys(e).reduce(({parsers:t,serializers:n},s)=>{let{to:r,from:a,serialize:i,parse:b}=e[s];return n[r]=i,n[s]=i,t[s]=b,Array.isArray(a)?a.forEach(y=>{t[y]=b,n[y]=i}):(t[a]=b,n[a]=i),{parsers:t,serializers:n}},{parsers:{},serializers:{}})}function ge(e){let t=e.find(n=>n.name==="parameterDescription");return t?t.dataTypeIDs:[]}async function se(e,t,n,s){if(!n||n.length===0)return t;s=s??e;let r=[];try{await e.execProtocol(G.parse({text:t}),{syncToFs:!1}),r.push(...(await e.execProtocol(G.describe({type:"S"}),{syncToFs:!1})).messages)}finally{r.push(...(await e.execProtocol(G.sync(),{syncToFs:!1})).messages)}let a=ge(r),i=t.replace(/\$([0-9]+)/g,(y,l)=>"%"+l+"L");return(await s.query(`SELECT format($1, ${n.map((y,l)=>`$${l+2}`).join(", ")}) as query`,[i,...n],{paramTypes:[X,...a]})).rows[0].query}function ie(e){let t,n=!1,s=async()=>{if(!t){n=!1;return}n=!0;let{args:r,resolve:a,reject:i}=t;t=void 0;try{let b=await e(...r);a(b)}catch(b){i(b)}finally{s()}};return async(...r)=>{t&&t.resolve(void 0);let a=new Promise((i,b)=>{t={args:r,resolve:i,reject:b}});return n||s(),a}}var mt=Object.defineProperty,yt=(e,t)=>{for(var n in t)mt(e,n,{get:t[n],enumerable:!0})},Y={};yt(Y,{IN_NODE:()=>K,getFsBundle:()=>gt,instantiateWasm:()=>ht,rmdirRecursive:()=>be,startArtifactDownload:()=>ae,toPostgresName:()=>_t,uuid:()=>bt});var K=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string",j=new Map;async function ae(e){K||j.has(e.toString())||j.set(e.toString(),fetch(e))}var J=new Map;async function ht(e,t,n){if(n||J.has(t.toString())){let s=n||J.get(t.toString());return{instance:await WebAssembly.instantiate(s,e),module:s}}if(K){let s=await(await import("fs/promises")).readFile(t),{module:r,instance:a}=await WebAssembly.instantiate(s,e);return J.set(t.toString(),r),{instance:a,module:r}}else{j.has(t.toString())||ae(t);let s=await j.get(t.toString()),{module:r,instance:a}=await WebAssembly.instantiateStreaming(s.clone(),e);return J.set(t.toString(),r),{instance:a,module:r}}}async function gt(e){return K?(await(await import("fs/promises")).readFile(e)).buffer:(ae(e),(await j.get(e.toString())).clone().arrayBuffer())}var bt=()=>{if(globalThis.crypto?.randomUUID)return globalThis.crypto.randomUUID();let e=new Uint8Array(16);if(globalThis.crypto?.getRandomValues)globalThis.crypto.getRandomValues(e);else for(let n=0;n<e.length;n++)e[n]=Math.floor(Math.random()*256);e[6]=e[6]&15|64,e[8]=e[8]&63|128;let t=[];return e.forEach(n=>{t.push(n.toString(16).padStart(2,"0"))}),t.slice(0,4).join("")+"-"+t.slice(4,6).join("")+"-"+t.slice(6,8).join("")+"-"+t.slice(8,10).join("")+"-"+t.slice(10).join("")};function _t(e){let t;return e.startsWith('"')&&e.endsWith('"')?t=e.substring(1,e.length-1):t=e.toLowerCase(),t}function be(e,t){try{let n=e.readdir(t).filter(s=>s!=="."&&s!=="..");for(let s of n){let r=t+"/"+s;try{e.readdir(r),be(e,r)}catch{e.unlink(r)}}e.rmdir(t)}catch{try{e.unlink(t)}catch{}}}var Et=5,wt=async(e,t)=>{let n=new Set,s={async query(r,a,i){let b,y,l;if(typeof r!="string"&&(b=r.signal,a=r.params,i=r.callback,y=r.offset,l=r.limit,r=r.query),y===void 0!=(l===void 0))throw new Error("offset and limit must be provided together");let o=y!==void 0&&l!==void 0,S;if(o&&(typeof y!="number"||isNaN(y)||typeof l!="number"||isNaN(l)))throw new Error("offset and limit must be numbers");let _=i?[i]:[],m=Y.uuid().replace(/-/g,""),D=!1,I,M,$=async()=>{await e.transaction(async u=>{let d=a&&a.length>0?await se(e,r,a,u):r;await u.exec(`CREATE OR REPLACE TEMP VIEW live_query_${m}_view AS ${d}`);let E=await _e(u,`live_query_${m}_view`);await Ee(u,E,n),o?(await u.exec(`
PREPARE live_query_${m}_get(int, int) AS
SELECT * FROM live_query_${m}_view
LIMIT $1 OFFSET $2;
`),await u.exec(`
PREPARE live_query_${m}_get_total_count AS
SELECT COUNT(*) FROM live_query_${m}_view;
`),S=(await u.query(`EXECUTE live_query_${m}_get_total_count;`)).rows[0].count,I={...await u.query(`EXECUTE live_query_${m}_get(${l}, ${y});`),offset:y,limit:l,totalCount:S}):(await u.exec(`
PREPARE live_query_${m}_get AS
SELECT * FROM live_query_${m}_view;
`),I=await u.query(`EXECUTE live_query_${m}_get;`)),M=await Promise.all(E.map(w=>u.listen(`"table_change__${w.schema_oid}__${w.table_oid}"`,async()=>{N()})))})};await $();let N=ie(async({offset:u,limit:d}={})=>{if(!o&&(u!==void 0||d!==void 0))throw new Error("offset and limit cannot be provided for non-windowed queries");if(u&&(typeof u!="number"||isNaN(u))||d&&(typeof d!="number"||isNaN(d)))throw new Error("offset and limit must be numbers");y=u??y,l=d??l;let E=async(w=0)=>{if(_.length!==0){try{o?I={...await e.query(`EXECUTE live_query_${m}_get(${l}, ${y});`),offset:y,limit:l,totalCount:S}:I=await e.query(`EXECUTE live_query_${m}_get;`)}catch(h){let p=h.message;if(p.startsWith(`prepared statement "live_query_${m}`)&&p.endsWith("does not exist")){if(w>Et)throw h;await $(),E(w+1)}else throw h}if(Z(_,I),o){let h=(await e.query(`EXECUTE live_query_${m}_get_total_count;`)).rows[0].count;h!==S&&(S=h,N())}}};await E()}),B=u=>{if(D)throw new Error("Live query is no longer active and cannot be subscribed to");_.push(u)},f=async u=>{u?_=_.filter(d=>d!==d):_=[],_.length===0&&!D&&(D=!0,await e.transaction(async d=>{await Promise.all(M.map(E=>E(d))),await d.exec(`
DROP VIEW IF EXISTS live_query_${m}_view;
DEALLOCATE live_query_${m}_get;
`)}))};return b?.aborted?await f():b?.addEventListener("abort",()=>{f()},{once:!0}),Z(_,I),{initialResults:I,subscribe:B,unsubscribe:f,refresh:N}},async changes(r,a,i,b){let y;if(typeof r!="string"&&(y=r.signal,a=r.params,i=r.key,b=r.callback,r=r.query),!i)throw new Error("key is required for changes queries");let l=b?[b]:[],o=Y.uuid().replace(/-/g,""),S=!1,_=1,m,D,I=async()=>{await e.transaction(async f=>{let u=await se(e,r,a,f);await f.query(`CREATE OR REPLACE TEMP VIEW live_query_${o}_view AS ${u}`);let d=await _e(f,`live_query_${o}_view`);await Ee(f,d,n);let E=[...(await f.query(`
SELECT column_name, data_type, udt_name
FROM information_schema.columns
WHERE table_name = 'live_query_${o}_view'
`)).rows,{column_name:"__after__",data_type:"integer"}];await f.exec(`
CREATE TEMP TABLE live_query_${o}_state1 (LIKE live_query_${o}_view INCLUDING ALL);
CREATE TEMP TABLE live_query_${o}_state2 (LIKE live_query_${o}_view INCLUDING ALL);
`);for(let w of[1,2]){let h=w===1?2:1;await f.exec(`
PREPARE live_query_${o}_diff${w} AS
WITH
prev AS (SELECT LAG("${i}") OVER () as __after__, * FROM live_query_${o}_state${h}),
curr AS (SELECT LAG("${i}") OVER () as __after__, * FROM live_query_${o}_state${w}),
data_diff AS (
-- INSERT operations: Include all columns
SELECT
'INSERT' AS __op__,
${E.map(({column_name:p})=>`curr."${p}" AS "${p}"`).join(`,
`)},
ARRAY[]::text[] AS __changed_columns__
FROM curr
LEFT JOIN prev ON curr.${i} = prev.${i}
WHERE prev.${i} IS NULL
UNION ALL
-- DELETE operations: Include only the primary key
SELECT
'DELETE' AS __op__,
${E.map(({column_name:p,data_type:x,udt_name:ee})=>p===i?`prev."${p}" AS "${p}"`:`NULL${x==="USER-DEFINED"?`::${ee}`:""} AS "${p}"`).join(`,
`)},
ARRAY[]::text[] AS __changed_columns__
FROM prev
LEFT JOIN curr ON prev.${i} = curr.${i}
WHERE curr.${i} IS NULL
UNION ALL
-- UPDATE operations: Include only changed columns
SELECT
'UPDATE' AS __op__,
${E.map(({column_name:p,data_type:x,udt_name:ee})=>p===i?`curr."${p}" AS "${p}"`:`CASE
WHEN curr."${p}" IS DISTINCT FROM prev."${p}"
THEN curr."${p}"
ELSE NULL${x==="USER-DEFINED"?`::${ee}`:""}
END AS "${p}"`).join(`,
`)},
ARRAY(SELECT unnest FROM unnest(ARRAY[${E.filter(({column_name:p})=>p!==i).map(({column_name:p})=>`CASE
WHEN curr."${p}" IS DISTINCT FROM prev."${p}"
THEN '${p}'
ELSE NULL
END`).join(", ")}]) WHERE unnest IS NOT NULL) AS __changed_columns__
FROM curr
INNER JOIN prev ON curr.${i} = prev.${i}
WHERE NOT (curr IS NOT DISTINCT FROM prev)
)
SELECT * FROM data_diff;
`)}D=await Promise.all(d.map(w=>f.listen(`"table_change__${w.schema_oid}__${w.table_oid}"`,async()=>{M()})))})};await I();let M=ie(async()=>{if(l.length===0&&m)return;let f=!1;for(let u=0;u<5;u++)try{await e.transaction(async d=>{await d.exec(`
INSERT INTO live_query_${o}_state${_}
SELECT * FROM live_query_${o}_view;
`),m=await d.query(`EXECUTE live_query_${o}_diff${_};`),_=_===1?2:1,await d.exec(`
TRUNCATE live_query_${o}_state${_};
`)});break}catch(d){if(d.message===`relation "live_query_${o}_state${_}" does not exist`){f=!0,await I();continue}else throw d}Tt(l,[...f?[{__op__:"RESET"}]:[],...m.rows])}),$=f=>{if(S)throw new Error("Live query is no longer active and cannot be subscribed to");l.push(f)},N=async f=>{f?l=l.filter(u=>u!==u):l=[],l.length===0&&!S&&(S=!0,await e.transaction(async u=>{await Promise.all(D.map(d=>d(u))),await u.exec(`
DROP VIEW IF EXISTS live_query_${o}_view;
DROP TABLE IF EXISTS live_query_${o}_state1;
DROP TABLE IF EXISTS live_query_${o}_state2;
DEALLOCATE live_query_${o}_diff1;
DEALLOCATE live_query_${o}_diff2;
`)}))};return y?.aborted?await N():y?.addEventListener("abort",()=>{N()},{once:!0}),await M(),{fields:m.fields.filter(f=>!["__after__","__op__","__changed_columns__"].includes(f.name)),initialChanges:m.rows,subscribe:$,unsubscribe:N,refresh:M}},async incrementalQuery(r,a,i,b){let y;if(typeof r!="string"&&(y=r.signal,a=r.params,i=r.key,b=r.callback,r=r.query),!i)throw new Error("key is required for incremental queries");let l=b?[b]:[],o=new Map,S=new Map,_=[],m=!0,{fields:D,unsubscribe:I,refresh:M}=await s.changes(r,a,i,B=>{for(let d of B){let{__op__:E,__changed_columns__:w,...h}=d;switch(E){case"RESET":o.clear(),S.clear();break;case"INSERT":o.set(h[i],h),S.set(h.__after__,h[i]);break;case"DELETE":{let p=o.get(h[i]);o.delete(h[i]),p.__after__!==null&&S.delete(p.__after__);break}case"UPDATE":{let p={...o.get(h[i])??{}};for(let x of w)p[x]=h[x],x==="__after__"&&S.set(h.__after__,h[i]);o.set(h[i],p);break}}}let f=[],u=null;for(let d=0;d<o.size;d++){let E=S.get(u),w=o.get(E);if(!w)break;let h={...w};delete h.__after__,f.push(h),u=E}_=f,m||Z(l,{rows:f,fields:D})});m=!1,Z(l,{rows:_,fields:D});let $=B=>{l.push(B)},N=async B=>{B?l=l.filter(f=>f!==f):l=[],l.length===0&&await I()};return y?.aborted?await N():y?.addEventListener("abort",()=>{N()},{once:!0}),{initialResults:{rows:_,fields:D},subscribe:$,unsubscribe:N,refresh:M}}};return{namespaceObj:s}},At={name:"Live Queries",setup:wt};async function _e(e,t){return(await e.query(`
WITH RECURSIVE view_dependencies AS (
-- Base case: Get the initial view's dependencies
SELECT DISTINCT
cl.relname AS dependent_name,
n.nspname AS schema_name,
cl.oid AS dependent_oid,
n.oid AS schema_oid,
cl.relkind = 'v' AS is_view
FROM pg_rewrite r
JOIN pg_depend d ON r.oid = d.objid
JOIN pg_class cl ON d.refobjid = cl.oid
JOIN pg_namespace n ON cl.relnamespace = n.oid
WHERE
r.ev_class = (
SELECT oid FROM pg_class WHERE relname = $1 AND relkind = 'v'
)
AND d.deptype = 'n'
UNION ALL
-- Recursive case: Traverse dependencies for views
SELECT DISTINCT
cl.relname AS dependent_name,
n.nspname AS schema_name,
cl.oid AS dependent_oid,
n.oid AS schema_oid,
cl.relkind = 'v' AS is_view
FROM view_dependencies vd
JOIN pg_rewrite r ON vd.dependent_name = (
SELECT relname FROM pg_class WHERE oid = r.ev_class AND relkind = 'v'
)
JOIN pg_depend d ON r.oid = d.objid
JOIN pg_class cl ON d.refobjid = cl.oid
JOIN pg_namespace n ON cl.relnamespace = n.oid
WHERE d.deptype = 'n'
)
SELECT DISTINCT
dependent_name AS table_name,
schema_name,
dependent_oid AS table_oid,
schema_oid
FROM view_dependencies
WHERE NOT is_view; -- Exclude intermediate views
`,[t])).rows.map(s=>({table_name:s.table_name,schema_name:s.schema_name,table_oid:s.table_oid,schema_oid:s.schema_oid}))}async function Ee(e,t,n){let s=t.filter(r=>!n.has(`${r.schema_oid}_${r.table_oid}`)).map(r=>`
CREATE OR REPLACE FUNCTION "_notify_${r.schema_oid}_${r.table_oid}"() RETURNS TRIGGER AS $$
BEGIN
PERFORM pg_notify('table_change__${r.schema_oid}__${r.table_oid}', '');
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE TRIGGER "_notify_trigger_${r.schema_oid}_${r.table_oid}"
AFTER INSERT OR UPDATE OR DELETE ON "${r.schema_name}"."${r.table_name}"
FOR EACH STATEMENT EXECUTE FUNCTION "_notify_${r.schema_oid}_${r.table_oid}"();
`).join(`
`);s.trim()!==""&&await e.exec(s),t.map(r=>n.add(`${r.schema_oid}_${r.table_oid}`))}var Z=(e,t)=>{for(let n of e)n(t)},Tt=(e,t)=>{for(let n of e)n(t)};0&&(module.exports={live});
//# sourceMappingURL=index.cjs.map