@prisma/dev 0.24.17 → 0.25.1

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/db.cjs CHANGED
@@ -1,12 +1,12 @@
1
- "use strict";var He=Object.create;var x=Object.defineProperty;var Ke=Object.getOwnPropertyDescriptor;var Je=Object.getOwnPropertyNames;var Ye=Object.getPrototypeOf,Xe=Object.prototype.hasOwnProperty;var Ve=(e,t)=>{for(var r in t)x(e,r,{get:t[r],enumerable:!0})},se=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of Je(t))!Xe.call(e,s)&&s!==r&&x(e,s,{get:()=>t[s],enumerable:!(n=Ke(t,s))||n.enumerable});return e};var S=(e,t,r)=>(r=e!=null?He(Ye(e)):{},se(t||!e||!e.__esModule?x(r,"default",{value:e,enumerable:!0}):r,e)),Ze=e=>se(x({},"__esModule",{value:!0}),e);var Zt={};Ve(Zt,{attachWalEventBridge:()=>k,dumpDB:()=>ze,shouldPollWalAfterMessages:()=>G,shouldPollWalAfterResponse:()=>te,startDBServer:()=>Kt,startLazyShadowDBServer:()=>Qe});module.exports=Ze(Zt);var et=()=>typeof document>"u"?new URL(`file:${__filename}`).href:document.currentScript&&document.currentScript.tagName.toUpperCase()==="SCRIPT"?document.currentScript.src:new URL("main.js",document.baseURI).href,b=et();var F=require("net"),Oe=require("path"),Me=require("pathe/utils");var B=require("fs"),P=require("fs/promises"),oe=require("util"),ae=require("zlib");var g=S(require("path"),1),q=S(require("os"),1),L=S(require("process"),1),R=q.default.homedir(),W=q.default.tmpdir(),{env:v}=L.default,tt=e=>{let t=g.default.join(R,"Library");return{data:g.default.join(t,"Application Support",e),config:g.default.join(t,"Preferences",e),cache:g.default.join(t,"Caches",e),log:g.default.join(t,"Logs",e),temp:g.default.join(W,e)}},rt=e=>{let t=v.APPDATA||g.default.join(R,"AppData","Roaming"),r=v.LOCALAPPDATA||g.default.join(R,"AppData","Local");return{data:g.default.join(r,e,"Data"),config:g.default.join(t,e,"Config"),cache:g.default.join(r,e,"Cache"),log:g.default.join(r,e,"Log"),temp:g.default.join(W,e)}},nt=e=>{let t=g.default.basename(R);return{data:g.default.join(v.XDG_DATA_HOME||g.default.join(R,".local","share"),e),config:g.default.join(v.XDG_CONFIG_HOME||g.default.join(R,".config"),e),cache:g.default.join(v.XDG_CACHE_HOME||g.default.join(R,".cache"),e),log:g.default.join(v.XDG_STATE_HOME||g.default.join(R,".local","state"),e),temp:g.default.join(W,t,e)}};function z(e,{suffix:t="nodejs"}={}){if(typeof e!="string")throw new TypeError(`Expected a string, got ${typeof e}`);return t&&(e+=`-${t}`),L.default.platform==="darwin"?tt(e):L.default.platform==="win32"?rt(e):nt(e)}var st=S(require("zeptomatch"),1),or=z("prisma-dev"),ar=(0,oe.promisify)(ae.unzip);async function ie(e){try{return await(0,P.access)(e,P.constants.F_OK),!0}catch(t){if(ot(t))return!1;throw t}}async function ue(e,t){await e.stream().pipeTo(B.WriteStream.toWeb((0,B.createWriteStream)(t,{encoding:"utf8"})))}function ot(e){return e!=null&&typeof e=="object"&&"code"in e&&e.code==="ENOENT"}var j=require("get-port-please"),ce=require("remeda");var N=class extends Error{constructor(r){super(`Port \`${r}\` is not available.`);this.port=r}name="PortNotAvailableError"};var K=require("perf_hooks"),Pe=require("@electric-sql/pglite");var me=require("buffer");var le=/(?:"[^"]+"|`[^`]+`|\[[^\]]+\]|\w+)/,at=new RegExp(`(?:${le.source}\\.)*${le.source}`),it=new RegExp(`(?:FROM|JOIN|UPDATE|INTO|TABLE)\\s+(${at.source})`,"gi"),ut=/"([^"]+)"|`([^`]+)`|\[([^\]]+)\]|(\w+)/g,de=/prismaQuery='([^']+)'/,ct=new Set([T(`
1
+ "use strict";var Ye=Object.create;var I=Object.defineProperty;var Je=Object.getOwnPropertyDescriptor;var Xe=Object.getOwnPropertyNames;var Ve=Object.getPrototypeOf,Ze=Object.prototype.hasOwnProperty;var et=(e,t)=>{for(var r in t)I(e,r,{get:t[r],enumerable:!0})},se=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Xe(t))!Ze.call(e,o)&&o!==r&&I(e,o,{get:()=>t[o],enumerable:!(n=Je(t,o))||n.enumerable});return e};var S=(e,t,r)=>(r=e!=null?Ye(Ve(e)):{},se(t||!e||!e.__esModule?I(r,"default",{value:e,enumerable:!0}):r,e)),tt=e=>se(I({},"__esModule",{value:!0}),e);var or={};et(or,{attachWalEventBridge:()=>Q,dumpDB:()=>He,shouldPollWalAfterMessages:()=>F,shouldPollWalAfterResponse:()=>re,startDBServer:()=>Zt,startLazyShadowDBServer:()=>qe});module.exports=tt(or);var rt=()=>typeof document>"u"?new URL(`file:${__filename}`).href:document.currentScript&&document.currentScript.tagName.toUpperCase()==="SCRIPT"?document.currentScript.src:new URL("main.js",document.baseURI).href,b=rt();var q=require("net"),Ue=require("path"),Ce=require("pathe/utils");var B=require("fs"),P=require("fs/promises"),ae=require("util"),ie=require("zlib");var g=S(require("path"),1),W=S(require("os"),1),L=S(require("process"),1),R=W.default.homedir(),z=W.default.tmpdir(),{env:v}=L.default,nt=e=>{let t=g.default.join(R,"Library");return{data:g.default.join(t,"Application Support",e),config:g.default.join(t,"Preferences",e),cache:g.default.join(t,"Caches",e),log:g.default.join(t,"Logs",e),temp:g.default.join(z,e)}},ot=e=>{let t=v.APPDATA||g.default.join(R,"AppData","Roaming"),r=v.LOCALAPPDATA||g.default.join(R,"AppData","Local");return{data:g.default.join(r,e,"Data"),config:g.default.join(t,e,"Config"),cache:g.default.join(r,e,"Cache"),log:g.default.join(r,e,"Log"),temp:g.default.join(z,e)}},st=e=>{let t=g.default.basename(R);return{data:g.default.join(v.XDG_DATA_HOME||g.default.join(R,".local","share"),e),config:g.default.join(v.XDG_CONFIG_HOME||g.default.join(R,".config"),e),cache:g.default.join(v.XDG_CACHE_HOME||g.default.join(R,".cache"),e),log:g.default.join(v.XDG_STATE_HOME||g.default.join(R,".local","state"),e),temp:g.default.join(z,t,e)}};function j(e,{suffix:t="nodejs"}={}){if(typeof e!="string")throw new TypeError(`Expected a string, got ${typeof e}`);return t&&(e+=`-${t}`),L.default.platform==="darwin"?nt(e):L.default.platform==="win32"?ot(e):st(e)}var at=S(require("zeptomatch"),1),lr=j("prisma-dev"),dr=(0,ae.promisify)(ie.unzip);async function ue(e){try{return await(0,P.access)(e,P.constants.F_OK),!0}catch(t){if(it(t))return!1;throw t}}async function ce(e,t){await e.stream().pipeTo(B.WriteStream.toWeb((0,B.createWriteStream)(t,{encoding:"utf8"})))}function it(e){return e!=null&&typeof e=="object"&&"code"in e&&e.code==="ENOENT"}var H=require("get-port-please"),le=require("remeda");var x=class extends Error{constructor(r){super(`Port \`${r}\` is not available.`);this.port=r}name="PortNotAvailableError"};var Y=require("perf_hooks"),Ee=require("@electric-sql/pglite");var pe=require("buffer");var de=/(?:"[^"]+"|`[^`]+`|\[[^\]]+\]|\w+)/,ut=new RegExp(`(?:${de.source}\\.)*${de.source}`),ct=new RegExp(`(?:FROM|JOIN|UPDATE|INTO|TABLE)\\s+(${ut.source})`,"gi"),lt=/"([^"]+)"|`([^`]+)`|\[([^\]]+)\]|(\w+)/g,me=/prismaQuery='([^']+)'/,dt=new Set([T(`
2
2
  select b.oid, b.typarray
3
3
  from pg_catalog.pg_type a
4
4
  left join pg_catalog.pg_type b on b.oid = a.typelem
5
5
  where a.typcategory = $1
6
6
  group by b.oid, b.typarray
7
7
  order by b.oid
8
- `),T('GRANT "pg_write_all_data" TO "prisma_application"'),T("SELECT SUM(reads)::BIGINT AS reads, SUM(writes)::BIGINT AS writes, SUM(COALESCE(extends, $1))::BIGINT AS extends FROM pg_stat_io"),T("SELECT pg_database_size(current_database())::BIGINT, SUM(pg_total_relation_size(relid))::BIGINT AS pg_total_relation_size FROM pg_stat_user_tables"),T("SELECT COUNT(*) AS cnt FROM pg_stat_activity WHERE pid <> pg_backend_pid() and xact_start notnull")]),lt=[/^BEGIN\b/i,/^COMMIT\b/i,/^ROLLBACK\b/i,/^SAVEPOINT\b/i,/^RELEASE\b/i,/^SET\b/i,/^SHOW\b/i,/^DISCARD\b/i,/^DEALLOCATE\b/i,/^CLOSE\b/i,/^CREATE EXTENSION\b/i,/^WITH state_assign\b/i];function T(e){return e.replace(/\s+/g," ").trim()}function pe(e){return be(T(e))}function ge(e){if(!e?.action||!e.model&&/raw/i.test(e.action))return null;let t=e.payload?be(JSON.stringify(e.payload)):"0";return`${e.model??""}.${e.action}:${t}`}function dt(e){let t=new Set;for(let r of e.matchAll(it)){let n=r[1];if(!n)continue;let s;for(let o of n.matchAll(ut))s=o[1]??o[2]??o[3]??o[4];s&&!s.startsWith("pg_")&&t.add(s)}return Array.from(t)}function mt(e){return ct.has(e)?!0:lt.some(t=>t.test(e))}function fe(e){if(mt(T(e)))return null;let t=dt(e);return t.length===0&&/\bpg_\w+/i.test(e)?null:t}function H(e){if(Array.isArray(e))return e.map(H);if(e!==null&&typeof e=="object"){let t=e;return t.$type==="Param"?"<<redacted>>":Object.fromEntries(Object.entries(t).map(([r,n])=>[r,H(n)]))}return e}function ye(e){let t=e.match(de);if(!t?.[1])return{cleanedSql:T(e),prismaQueryInfo:null};let r=e.replace(de,"");r=r.replace(/,\s*,/g,",").replace(/\/\*\s*,/g,"/*").replace(/,\s*\*\//g,"*/").replace(/\/\*\s*\*\//g,"").replace(/\s+/g," ").trim();let n=decodeURIComponent(t[1]),s=n.indexOf(":");if(s===-1)return{cleanedSql:r,prismaQueryInfo:{action:n,isRaw:!0}};let o=n.slice(0,s),l=n.slice(s+1),c=o.indexOf("."),i=c===-1?void 0:o.slice(0,c),u=c===-1?o:o.slice(c+1);if(!u)return{cleanedSql:r,prismaQueryInfo:null};let p;try{p=H(JSON.parse(me.Buffer.from(l,"base64url").toString("utf8")))}catch{p=void 0}return{cleanedSql:r,prismaQueryInfo:{action:u,isRaw:!1,model:i,payload:p}}}function be(e){let t=5381;for(let r=0;r<e.length;r++)t=(t<<5)+t+e.charCodeAt(r)&4294967295;return(t>>>0).toString(36)}var O=new WeakMap;function Ee(e){let t=O.get(e);if(t&&!t.closed)return t.bridge;let r=pt(e),n={bridge:{close:()=>(n.closed||(n.closed=!0,n.sessions.clear(),n.subscribers.clear(),n.queryQueue.enqueue=n.originalEnqueue,n.queryQueue.clearQueueForHandler=n.originalClearQueueForHandler,O.delete(e)),Promise.resolve()),subscribe:s=>(n.subscribers.add(s),()=>{n.subscribers.delete(s)})},closed:!1,originalClearQueueForHandler:r.clearQueueForHandler.bind(r),originalEnqueue:r.enqueue.bind(r),queryQueue:r,sessions:new Map,subscribers:new Set};return r.clearQueueForHandler=s=>{n.sessions.delete(s),n.originalClearQueueForHandler(s)},r.enqueue=async(s,o,l)=>{let c=gt(n,s),i=bt(o);ft(c,i);let u=yt(c,i);if(!u)return await n.originalEnqueue(s,o,l);let p={commandTags:[],dataRowCount:0},y=new Pe.protocol.Parser,a=K.performance.now(),d=await n.originalEnqueue(s,o,D=>{y.parse(D,je=>{Tt(p,je)}),l(D)}),f=Math.max(0,K.performance.now()-a);return _t(n,{applicationName:u.applicationName,durationMs:f,query:u.query,responseStats:p}),d},O.set(e,n),n.bridge}async function Se(e){await O.get(e)?.bridge.close()}function pt(e){let t=e.queryQueue;if(!t||typeof t.enqueue!="function"||typeof t.clearQueueForHandler!="function")throw new Error("PGLiteSocketServer query queue is unavailable for query insights capture");return t}function gt(e,t){let r=e.sessions.get(t);if(r)return r;let n={applicationName:null,portals:new Map,statements:new Map};return e.sessions.set(t,n),n}function ft(e,t){if(t)switch(t.kind){case"startup":e.applicationName=t.applicationName;return;case"parse":e.statements.set(t.statementName,t.query);return;case"bind":{let r=e.statements.get(t.statementName);r&&e.portals.set(t.portalName,r);return}case"close":t.target==="portal"?e.portals.delete(t.name):e.statements.delete(t.name);return;default:return}}function yt(e,t){if(!t)return null;if(t.kind==="query")return{applicationName:e.applicationName,query:t.query};if(t.kind==="execute"){let r=e.portals.get(t.portalName);return r?{applicationName:e.applicationName,query:r}:null}return null}function bt(e){let t=Buffer.from(e);if(t.length<4)return null;let r=t.readInt32BE(0);if(t.length>=8&&r===t.length){let s=t.readInt32BE(4);if(s===196608||s===196608)return Pt(t)}if(t.length<5)return null;switch(String.fromCharCode(t[0]??0)){case"Q":return Et(t);case"P":return St(t);case"B":return wt(t);case"E":return ht(t);case"C":return Rt(t);default:return null}}function Pt(e){let t=8,r=null;for(;t<e.length-1;){let n=w(e,t);if(!n||n.value==="")break;t=n.nextOffset;let s=w(e,t);if(!s)break;t=s.nextOffset,n.value==="application_name"&&(r=s.value)}return{applicationName:r,kind:"startup"}}function Et(e){let t=w(e,5);return t?{kind:"query",query:t.value}:null}function St(e){let t=w(e,5);if(!t)return null;let r=w(e,t.nextOffset);return r?{kind:"parse",query:r.value,statementName:t.value}:null}function wt(e){let t=w(e,5);if(!t)return null;let r=w(e,t.nextOffset);return r?{kind:"bind",portalName:t.value,statementName:r.value}:null}function ht(e){let t=w(e,5);return t?{kind:"execute",portalName:t.value}:null}function Rt(e){if(e.length<7)return null;let t=e[5];if(t===void 0)return null;let r=w(e,6);return r?{kind:"close",name:r.value,target:t===80?"portal":"statement"}:null}function w(e,t){let r=e.indexOf(0,t);return r===-1?null:{nextOffset:r+1,value:e.toString("utf8",t,r)}}function Tt(e,t){if(t.name==="dataRow"){e.dataRowCount+=1;return}t.name==="commandComplete"&&typeof t.text=="string"&&t.text.length>0&&e.commandTags.push(t.text)}function _t(e,t){let r=ye(t.query),n=fe(r.cleanedSql);if(!n)return;let s=pe(r.cleanedSql),o={applicationName:t.applicationName,durationMs:t.durationMs,groupKey:ge(r.prismaQueryInfo),prismaQueryInfo:r.prismaQueryInfo,query:r.cleanedSql,queryId:s,reads:0,rowsReturned:At(t.responseStats),tables:n,timestamp:new Date().toISOString()};for(let l of e.subscribers)l([o])}function At(e){let t=e.commandTags.reduce((r,n)=>r+vt(n),0);return Math.max(t,e.dataRowCount)}function vt(e){let t=e.trim().split(/\s+/).at(-1);return!t||!/^\d+$/.test(t)?0:Number(t)}var A=require("fs"),_=require("fs/promises"),he=require("module"),Re=require("path"),h=require("url"),Dt=(0,he.createRequire)(b),Nt=["initdb.wasm","pglite.data","pglite.wasm"],Y="pglite-seed.tar.gz",Te={amcheck:"amcheck.tar.gz",bloom:"bloom.tar.gz",btree_gin:"btree_gin.tar.gz",btree_gist:"btree_gist.tar.gz",citext:"citext.tar.gz",cube:"cube.tar.gz",dict_int:"dict_int.tar.gz",dict_xsyn:"dict_xsyn.tar.gz",earthdistance:"earthdistance.tar.gz",file_fdw:"file_fdw.tar.gz",fuzzystrmatch:"fuzzystrmatch.tar.gz",hstore:"hstore.tar.gz",intarray:"intarray.tar.gz",isn:"isn.tar.gz",lo:"lo.tar.gz",ltree:"ltree.tar.gz",pageinspect:"pageinspect.tar.gz",pg_buffercache:"pg_buffercache.tar.gz",pg_freespacemap:"pg_freespacemap.tar.gz",pg_surgery:"pg_surgery.tar.gz",pg_trgm:"pg_trgm.tar.gz",pg_visibility:"pg_visibility.tar.gz",pg_walinspect:"pg_walinspect.tar.gz",seg:"seg.tar.gz",tablefunc:"tablefunc.tar.gz",tcn:"tcn.tar.gz",tsm_system_rows:"tsm_system_rows.tar.gz",tsm_system_time:"tsm_system_time.tar.gz",unaccent:"unaccent.tar.gz",uuid_ossp:"uuid-ossp.tar.gz",vector:"vector.tar.gz"},It=[...Nt.map(e=>({fileName:e,kind:"core",name:e})),{fileName:Y,kind:"core",name:Y},...Object.entries(Te).map(([e,t])=>({fileName:t,kind:"extension",name:e}))],C=new Map,xt=Symbol.for("@prisma/dev/bundled-pglite-runtime-asset-sources"),M=null;async function X(){await kt();let e=_e();if(e)return await Mt(e),await Lt(e);let t=Ct(),r=t.href,n=C.get(r);return n||(n=Bt(t),C.set(r,n)),await n}async function Lt(e){let t=`bundled:${e.wasmModule.href}:${e.fsBundle.href}`,r=C.get(t);return r||(r=Ot(e),C.set(t,r)),await r}async function Bt(e){let t=$(new URL("./runtime-assets/",b)),[r,n,s]=await Promise.all([(0,_.readFile)(U("pglite.data",e,t)),(0,_.readFile)(U(Y,e,t)),(0,_.readFile)(U("pglite.wasm",e,t))]),o=Ae();return{extensions:Object.fromEntries(Object.entries(Te).map(([l,c])=>[l,U(c,e,t)])),fsBundle:new Blob([Uint8Array.from(r)]),loadDataDir:new Blob([Uint8Array.from(n)]),wasmModule:await o.compile(s)}}async function Ot(e){let[t,r,n]=await Promise.all([J(e.fsBundle),J(e.loadDataDir),J(e.wasmModule)]),s=Ae();return{extensions:e.extensions,fsBundle:new Blob([Uint8Array.from(t)]),loadDataDir:new Blob([Uint8Array.from(r)]),wasmModule:await s.compile(n)}}async function Mt(e){if(e.initdbWasm.protocol!=="file:")return;let t=new URL("initdb.wasm",$(new URL("./",e.initdbWasm))),r=(0,h.fileURLToPath)(t);(0,A.existsSync)(r)||await(0,_.copyFile)((0,h.fileURLToPath)(e.initdbWasm),r)}function $(e){return e instanceof URL?we(e):we((0,h.pathToFileURL)(e))}function we(e){return e.href.endsWith("/")?e:new URL(`${e.href}/`)}function Ut(){let e=Dt.resolve("@electric-sql/pglite");return $((0,Re.dirname)(e))}function Ct(){let e=$(new URL("./",b));if($t(e))return e;if(Gt())return Ut();throw new Error("Unable to locate PGlite runtime assets. If you bundled @prisma/dev, copy them next to the bundle with copyPrismaDevRuntimeAssets().")}function $t(e){return It.every(t=>(0,A.existsSync)((0,h.fileURLToPath)(new URL(t.fileName,e))))}function _e(){return globalThis[xt]??null}async function kt(){!Qt()||_e()||(M||(M=import("./runtime-assets-manifest.bun.js").then(()=>{}).catch(e=>{throw M=null,e})),await M)}function Gt(){let e=(0,h.fileURLToPath)(new URL("../package.json",b));if(!(0,A.existsSync)(e))return!1;try{return JSON.parse((0,A.readFileSync)(e,"utf8")).name==="@prisma/dev"}catch{return!1}}function Qt(){return typeof globalThis.Bun<"u"}function Ae(){let e=globalThis.WebAssembly;if(!e)throw new Error("WebAssembly is not available in this runtime.");return e}async function J(e){if(e.protocol==="file:")return await(0,_.readFile)(e);let t=await fetch(e);if(!t.ok)throw new Error(`Failed to fetch runtime asset ${e.href}: ${t.status} ${t.statusText}`);return new Uint8Array(await t.arrayBuffer())}function U(e,t,r){let n=new URL(e,t);if((0,A.existsSync)((0,h.fileURLToPath)(n)))return n;if(r){let s=new URL(e,r);if((0,A.existsSync)((0,h.fileURLToPath)(s)))return s}return n}var ee=require("@electric-sql/pglite"),E="_prisma_dev_wal",Z="events",Ne="install_all_triggers",ve="capture_event",De="prisma_dev_wal_capture",I=new WeakMap,Ft=new Set(["ALTER","COMMIT","COPY","CREATE","DELETE","DROP","INSERT","MERGE","TRUNCATE","UPDATE"]);async function k(e,t){let r=I.get(e);if(r&&!r.closed)return r.bridge;let n=e.execProtocolRaw.bind(e),s=e.execProtocolRawStream.bind(e),o={bridge:{close:async()=>{o.closed||(o.closed=!0,o.subscribers.clear(),e.execProtocolRaw===l&&(e.execProtocolRaw=n),e.execProtocolRawStream===c&&(e.execProtocolRawStream=s),await o.pollPromise,I.delete(e))},poll:async()=>{await V(o,e)},subscribe:i=>(o.subscribers.add(i),()=>{o.subscribers.delete(i)})},closed:!1,ensureInfrastructurePromise:null,pendingPoll:!1,pollPromise:null,subscribers:new Set,suppressDepth:0},l=async(i,u)=>{let p=await n(i,u);return!o.closed&&o.suppressDepth===0&&te(p)&&V(o,e),p},c=async(i,u)=>{let p=[],y=new ee.protocol.Parser,a=u?.onRawData;await s(i,{...u,onRawData:d=>{y.parse(d,f=>{p.push(f)}),a?.(d)}}),!o.closed&&o.suppressDepth===0&&G(p)&&V(o,e)};return e.execProtocolRaw=l,e.execProtocolRawStream=c,I.set(e,o),await xe(o,e),o.bridge}async function Ie(e){let t=I.get(e);t&&await t.bridge.close()}function G(e){for(let t of e){if(t.name!=="commandComplete"||typeof t.text!="string")continue;let r=t.text.split(/\s+/,1)[0]?.toUpperCase();if(r&&Ft.has(r))return!0}return!1}function te(e){if(e.length===0)return!1;let t=[];return new ee.protocol.Parser().parse(e,n=>{t.push(n)}),G(t)}async function xe(e,t){e.ensureInfrastructurePromise??=re(e,t,async()=>{await t.exec(`CREATE SCHEMA IF NOT EXISTS "${E}"`),await t.exec(`
9
- CREATE TABLE IF NOT EXISTS "${E}"."${Z}" (
8
+ `),T('GRANT "pg_write_all_data" TO "prisma_application"'),T("SELECT SUM(reads)::BIGINT AS reads, SUM(writes)::BIGINT AS writes, SUM(COALESCE(extends, $1))::BIGINT AS extends FROM pg_stat_io"),T("SELECT pg_database_size(current_database())::BIGINT, SUM(pg_total_relation_size(relid))::BIGINT AS pg_total_relation_size FROM pg_stat_user_tables"),T("SELECT COUNT(*) AS cnt FROM pg_stat_activity WHERE pid <> pg_backend_pid() and xact_start notnull")]),mt=[/^BEGIN\b/i,/^COMMIT\b/i,/^ROLLBACK\b/i,/^SAVEPOINT\b/i,/^RELEASE\b/i,/^SET\b/i,/^SHOW\b/i,/^DISCARD\b/i,/^DEALLOCATE\b/i,/^CLOSE\b/i,/^CREATE EXTENSION\b/i,/^WITH state_assign\b/i];function T(e){return e.replace(/\s+/g," ").trim()}function ge(e){return Pe(T(e))}function fe(e){if(!e?.action||!e.model&&/raw/i.test(e.action))return null;let t=e.payload?Pe(JSON.stringify(e.payload)):"0";return`${e.model??""}.${e.action}:${t}`}function pt(e){let t=new Set;for(let r of e.matchAll(ct)){let n=r[1];if(!n)continue;let o;for(let s of n.matchAll(lt))o=s[1]??s[2]??s[3]??s[4];o&&!o.startsWith("pg_")&&t.add(o)}return Array.from(t)}function gt(e){return dt.has(e)?!0:mt.some(t=>t.test(e))}function ye(e){if(gt(T(e)))return null;let t=pt(e);return t.length===0&&/\bpg_\w+/i.test(e)?null:t}function K(e){if(Array.isArray(e))return e.map(K);if(e!==null&&typeof e=="object"){let t=e;return t.$type==="Param"?"<<redacted>>":Object.fromEntries(Object.entries(t).map(([r,n])=>[r,K(n)]))}return e}function be(e){let t=e.match(me);if(!t?.[1])return{cleanedSql:T(e),prismaQueryInfo:null};let r=e.replace(me,"");r=r.replace(/,\s*,/g,",").replace(/\/\*\s*,/g,"/*").replace(/,\s*\*\//g,"*/").replace(/\/\*\s*\*\//g,"").replace(/\s+/g," ").trim();let n=decodeURIComponent(t[1]),o=n.indexOf(":");if(o===-1)return{cleanedSql:r,prismaQueryInfo:{action:n,isRaw:!0}};let s=n.slice(0,o),u=n.slice(o+1),l=s.indexOf("."),c=l===-1?void 0:s.slice(0,l),i=l===-1?s:s.slice(l+1);if(!i)return{cleanedSql:r,prismaQueryInfo:null};let m;try{m=K(JSON.parse(pe.Buffer.from(u,"base64url").toString("utf8")))}catch{m=void 0}return{cleanedSql:r,prismaQueryInfo:{action:i,isRaw:!1,model:c,payload:m}}}function Pe(e){let t=5381;for(let r=0;r<e.length;r++)t=(t<<5)+t+e.charCodeAt(r)&4294967295;return(t>>>0).toString(36)}function O(e){let t=e.queryQueue;if(!t||typeof t.enqueue!="function"||typeof t.clearQueueForHandler!="function")throw new Error("PGLiteSocketServer query queue is unavailable");return t}var M=new WeakMap;function Se(e){let t=M.get(e);if(t&&!t.closed)return t.bridge;let r=O(e),n={bridge:{close:()=>(n.closed||(n.closed=!0,n.sessions.clear(),n.subscribers.clear(),n.queryQueue.enqueue=n.originalEnqueue,n.queryQueue.clearQueueForHandler=n.originalClearQueueForHandler,M.delete(e)),Promise.resolve()),subscribe:o=>(n.subscribers.add(o),()=>{n.subscribers.delete(o)})},closed:!1,originalClearQueueForHandler:r.clearQueueForHandler.bind(r),originalEnqueue:r.enqueue.bind(r),queryQueue:r,sessions:new Map,subscribers:new Set};return r.clearQueueForHandler=o=>{n.sessions.delete(o),n.originalClearQueueForHandler(o)},r.enqueue=async(o,s,u)=>{let l=ft(n,o),c=Pt(s);yt(l,c);let i=bt(l,c);if(!i)return await n.originalEnqueue(o,s,u);let m={commandTags:[],dataRowCount:0},y=new Ee.protocol.Parser,a=Y.performance.now(),d=await n.originalEnqueue(o,s,D=>{y.parse(D,Ke=>{_t(m,Ke)}),u(D)}),f=Math.max(0,Y.performance.now()-a);return At(n,{applicationName:i.applicationName,durationMs:f,query:i.query,responseStats:m}),d},M.set(e,n),n.bridge}async function we(e){await M.get(e)?.bridge.close()}function ft(e,t){let r=e.sessions.get(t);if(r)return r;let n={applicationName:null,portals:new Map,statements:new Map};return e.sessions.set(t,n),n}function yt(e,t){if(t)switch(t.kind){case"startup":e.applicationName=t.applicationName;return;case"parse":e.statements.set(t.statementName,t.query);return;case"bind":{let r=e.statements.get(t.statementName);r&&e.portals.set(t.portalName,r);return}case"close":t.target==="portal"?e.portals.delete(t.name):e.statements.delete(t.name);return;default:return}}function bt(e,t){if(!t)return null;if(t.kind==="query")return{applicationName:e.applicationName,query:t.query};if(t.kind==="execute"){let r=e.portals.get(t.portalName);return r?{applicationName:e.applicationName,query:r}:null}return null}function Pt(e){let t=Buffer.from(e);if(t.length<4)return null;let r=t.readInt32BE(0);if(t.length>=8&&r===t.length){let o=t.readInt32BE(4);if(o===196608||o===196608)return Et(t)}if(t.length<5)return null;switch(String.fromCharCode(t[0]??0)){case"Q":return St(t);case"P":return wt(t);case"B":return ht(t);case"E":return Rt(t);case"C":return Tt(t);default:return null}}function Et(e){let t=8,r=null;for(;t<e.length-1;){let n=w(e,t);if(!n||n.value==="")break;t=n.nextOffset;let o=w(e,t);if(!o)break;t=o.nextOffset,n.value==="application_name"&&(r=o.value)}return{applicationName:r,kind:"startup"}}function St(e){let t=w(e,5);return t?{kind:"query",query:t.value}:null}function wt(e){let t=w(e,5);if(!t)return null;let r=w(e,t.nextOffset);return r?{kind:"parse",query:r.value,statementName:t.value}:null}function ht(e){let t=w(e,5);if(!t)return null;let r=w(e,t.nextOffset);return r?{kind:"bind",portalName:t.value,statementName:r.value}:null}function Rt(e){let t=w(e,5);return t?{kind:"execute",portalName:t.value}:null}function Tt(e){if(e.length<7)return null;let t=e[5];if(t===void 0)return null;let r=w(e,6);return r?{kind:"close",name:r.value,target:t===80?"portal":"statement"}:null}function w(e,t){let r=e.indexOf(0,t);return r===-1?null:{nextOffset:r+1,value:e.toString("utf8",t,r)}}function _t(e,t){if(t.name==="dataRow"){e.dataRowCount+=1;return}t.name==="commandComplete"&&typeof t.text=="string"&&t.text.length>0&&e.commandTags.push(t.text)}function At(e,t){let r=be(t.query),n=ye(r.cleanedSql);if(!n)return;let o=ge(r.cleanedSql),s={applicationName:t.applicationName,durationMs:t.durationMs,groupKey:fe(r.prismaQueryInfo),prismaQueryInfo:r.prismaQueryInfo,query:r.cleanedSql,queryId:o,reads:0,rowsReturned:vt(t.responseStats),tables:n,timestamp:new Date().toISOString()};for(let u of e.subscribers)u([s])}function vt(e){let t=e.commandTags.reduce((r,n)=>r+Dt(n),0);return Math.max(t,e.dataRowCount)}function Dt(e){let t=e.trim().split(/\s+/).at(-1);return!t||!/^\d+$/.test(t)?0:Number(t)}var xt=new Set([66,67,68,69,72,80,100]),Nt=90;function It(e){let t=e[0];return t!==void 0&&xt.has(t)}function Lt(){let e=Buffer.alloc(0);return{filter(t,r){e=e.length===0?Buffer.from(t):Buffer.concat([e,t]);let n=[],o=0;for(;e.length-o>=5;){let u=1+e.readInt32BE(o+1);if(u<5){n.push(e.subarray(o)),o=e.length;break}if(e.length-o<u)break;r&&e[o]===Nt||n.push(e.subarray(o,o+u)),o+=u}e=e.subarray(o);let s=n[0];return n.length===1&&s?s:Buffer.concat(n)},get holdsPartialFrame(){return e.length>0}}}function he(e){let t=O(e),r=t.enqueue.bind(t),n=t.clearQueueForHandler.bind(t),o=new Map;t.clearQueueForHandler=s=>{o.delete(s),n(s)},t.enqueue=async(s,u,l)=>{let c=It(u),i=o.get(s);if(!c&&!i)return await r(s,u,l);i||(i=Lt(),o.set(s,i));let m=i;try{return await r(s,u,y=>{let a=m.filter(y,c);a.length>0&&l(a)})}finally{m.holdsPartialFrame||o.delete(s)}}}var A=require("fs"),_=require("fs/promises"),Te=require("module"),_e=require("path"),h=require("url"),Bt=(0,Te.createRequire)(b),Ot=["initdb.wasm","pglite.data","pglite.wasm"],X="pglite-seed.tar.gz",Ae={amcheck:"amcheck.tar.gz",bloom:"bloom.tar.gz",btree_gin:"btree_gin.tar.gz",btree_gist:"btree_gist.tar.gz",citext:"citext.tar.gz",cube:"cube.tar.gz",dict_int:"dict_int.tar.gz",dict_xsyn:"dict_xsyn.tar.gz",earthdistance:"earthdistance.tar.gz",file_fdw:"file_fdw.tar.gz",fuzzystrmatch:"fuzzystrmatch.tar.gz",hstore:"hstore.tar.gz",intarray:"intarray.tar.gz",isn:"isn.tar.gz",lo:"lo.tar.gz",ltree:"ltree.tar.gz",pageinspect:"pageinspect.tar.gz",pg_buffercache:"pg_buffercache.tar.gz",pg_freespacemap:"pg_freespacemap.tar.gz",pg_surgery:"pg_surgery.tar.gz",pg_trgm:"pg_trgm.tar.gz",pg_visibility:"pg_visibility.tar.gz",pg_walinspect:"pg_walinspect.tar.gz",seg:"seg.tar.gz",tablefunc:"tablefunc.tar.gz",tcn:"tcn.tar.gz",tsm_system_rows:"tsm_system_rows.tar.gz",tsm_system_time:"tsm_system_time.tar.gz",unaccent:"unaccent.tar.gz",uuid_ossp:"uuid-ossp.tar.gz",vector:"vector.tar.gz"},Mt=[...Ot.map(e=>({fileName:e,kind:"core",name:e})),{fileName:X,kind:"core",name:X},...Object.entries(Ae).map(([e,t])=>({fileName:t,kind:"extension",name:e}))],$=new Map,Ut=Symbol.for("@prisma/dev/bundled-pglite-runtime-asset-sources"),U=null;async function V(){await Wt();let e=ve();if(e)return await Qt(e),await Ct(e);let t=Gt(),r=t.href,n=$.get(r);return n||(n=$t(t),$.set(r,n)),await n}async function Ct(e){let t=`bundled:${e.wasmModule.href}:${e.fsBundle.href}`,r=$.get(t);return r||(r=kt(e),$.set(t,r)),await r}async function $t(e){let t=k(new URL("./runtime-assets/",b)),[r,n,o]=await Promise.all([(0,_.readFile)(C("pglite.data",e,t)),(0,_.readFile)(C(X,e,t)),(0,_.readFile)(C("pglite.wasm",e,t))]),s=De();return{extensions:Object.fromEntries(Object.entries(Ae).map(([u,l])=>[u,C(l,e,t)])),fsBundle:new Blob([Uint8Array.from(r)]),loadDataDir:new Blob([Uint8Array.from(n)]),wasmModule:await s.compile(o)}}async function kt(e){let[t,r,n]=await Promise.all([J(e.fsBundle),J(e.loadDataDir),J(e.wasmModule)]),o=De();return{extensions:e.extensions,fsBundle:new Blob([Uint8Array.from(t)]),loadDataDir:new Blob([Uint8Array.from(r)]),wasmModule:await o.compile(n)}}async function Qt(e){if(e.initdbWasm.protocol!=="file:")return;let t=new URL("initdb.wasm",k(new URL("./",e.initdbWasm))),r=(0,h.fileURLToPath)(t);(0,A.existsSync)(r)||await(0,_.copyFile)((0,h.fileURLToPath)(e.initdbWasm),r)}function k(e){return e instanceof URL?Re(e):Re((0,h.pathToFileURL)(e))}function Re(e){return e.href.endsWith("/")?e:new URL(`${e.href}/`)}function Ft(){let e=Bt.resolve("@electric-sql/pglite");return k((0,_e.dirname)(e))}function Gt(){let e=k(new URL("./",b));if(qt(e))return e;if(zt())return Ft();throw new Error("Unable to locate PGlite runtime assets. If you bundled @prisma/dev, copy them next to the bundle with copyPrismaDevRuntimeAssets().")}function qt(e){return Mt.every(t=>(0,A.existsSync)((0,h.fileURLToPath)(new URL(t.fileName,e))))}function ve(){return globalThis[Ut]??null}async function Wt(){!jt()||ve()||(U||(U=import("./runtime-assets-manifest.bun.js").then(()=>{}).catch(e=>{throw U=null,e})),await U)}function zt(){let e=(0,h.fileURLToPath)(new URL("../package.json",b));if(!(0,A.existsSync)(e))return!1;try{return JSON.parse((0,A.readFileSync)(e,"utf8")).name==="@prisma/dev"}catch{return!1}}function jt(){return typeof globalThis.Bun<"u"}function De(){let e=globalThis.WebAssembly;if(!e)throw new Error("WebAssembly is not available in this runtime.");return e}async function J(e){if(e.protocol==="file:")return await(0,_.readFile)(e);let t=await fetch(e);if(!t.ok)throw new Error(`Failed to fetch runtime asset ${e.href}: ${t.status} ${t.statusText}`);return new Uint8Array(await t.arrayBuffer())}function C(e,t,r){let n=new URL(e,t);if((0,A.existsSync)((0,h.fileURLToPath)(n)))return n;if(r){let o=new URL(e,r);if((0,A.existsSync)((0,h.fileURLToPath)(o)))return o}return n}var te=require("@electric-sql/pglite"),E="_prisma_dev_wal",ee="events",Ie="install_all_triggers",xe="capture_event",Ne="prisma_dev_wal_capture",N=new WeakMap,Ht=new Set(["ALTER","COMMIT","COPY","CREATE","DELETE","DROP","INSERT","MERGE","TRUNCATE","UPDATE"]);async function Q(e,t){let r=N.get(e);if(r&&!r.closed)return r.bridge;let n=e.execProtocolRaw.bind(e),o=e.execProtocolRawStream.bind(e),s={bridge:{close:async()=>{s.closed||(s.closed=!0,s.subscribers.clear(),e.execProtocolRaw===u&&(e.execProtocolRaw=n),e.execProtocolRawStream===l&&(e.execProtocolRawStream=o),await s.pollPromise,N.delete(e))},poll:async()=>{await Z(s,e)},subscribe:c=>(s.subscribers.add(c),()=>{s.subscribers.delete(c)})},closed:!1,ensureInfrastructurePromise:null,pendingPoll:!1,pollPromise:null,subscribers:new Set,suppressDepth:0},u=async(c,i)=>{let m=await n(c,i);return!s.closed&&s.suppressDepth===0&&re(m)&&Z(s,e),m},l=async(c,i)=>{let m=[],y=new te.protocol.Parser,a=i?.onRawData;await o(c,{...i,onRawData:d=>{y.parse(d,f=>{m.push(f)}),a?.(d)}}),!s.closed&&s.suppressDepth===0&&F(m)&&Z(s,e)};return e.execProtocolRaw=u,e.execProtocolRawStream=l,N.set(e,s),await Be(s,e),s.bridge}async function Le(e){let t=N.get(e);t&&await t.bridge.close()}function F(e){for(let t of e){if(t.name!=="commandComplete"||typeof t.text!="string")continue;let r=t.text.split(/\s+/,1)[0]?.toUpperCase();if(r&&Ht.has(r))return!0}return!1}function re(e){if(e.length===0)return!1;let t=[];return new te.protocol.Parser().parse(e,n=>{t.push(n)}),F(t)}async function Be(e,t){e.ensureInfrastructurePromise??=ne(e,t,async()=>{await t.exec(`CREATE SCHEMA IF NOT EXISTS "${E}"`),await t.exec(`
9
+ CREATE TABLE IF NOT EXISTS "${E}"."${ee}" (
10
10
  id BIGSERIAL PRIMARY KEY,
11
11
  txid BIGINT NOT NULL DEFAULT txid_current(),
12
12
  schema_name TEXT NOT NULL,
@@ -17,7 +17,7 @@
17
17
  created_at TIMESTAMPTZ NOT NULL DEFAULT clock_timestamp()
18
18
  )
19
19
  `),await t.exec(`
20
- CREATE OR REPLACE FUNCTION "${E}"."${ve}"()
20
+ CREATE OR REPLACE FUNCTION "${E}"."${xe}"()
21
21
  RETURNS trigger
22
22
  LANGUAGE plpgsql
23
23
  AS $$
@@ -26,7 +26,7 @@
26
26
  RETURN COALESCE(NEW, OLD);
27
27
  END IF;
28
28
 
29
- INSERT INTO "${E}"."${Z}" (
29
+ INSERT INTO "${E}"."${ee}" (
30
30
  txid,
31
31
  schema_name,
32
32
  table_name,
@@ -47,7 +47,7 @@
47
47
  END;
48
48
  $$;
49
49
  `),await t.exec(`
50
- CREATE OR REPLACE FUNCTION "${E}"."${Ne}"()
50
+ CREATE OR REPLACE FUNCTION "${E}"."${Ie}"()
51
51
  RETURNS void
52
52
  LANGUAGE plpgsql
53
53
  AS $$
@@ -67,28 +67,28 @@
67
67
  SELECT 1
68
68
  FROM pg_trigger
69
69
  WHERE tgrelid = target
70
- AND tgname = '${De}'
70
+ AND tgname = '${Ne}'
71
71
  ) THEN
72
72
  CONTINUE;
73
73
  END IF;
74
74
 
75
75
  EXECUTE format(
76
- 'CREATE TRIGGER %I AFTER INSERT OR UPDATE OR DELETE ON %s FOR EACH ROW EXECUTE FUNCTION "${E}"."${ve}"()',
77
- '${De}',
76
+ 'CREATE TRIGGER %I AFTER INSERT OR UPDATE OR DELETE ON %s FOR EACH ROW EXECUTE FUNCTION "${E}"."${xe}"()',
77
+ '${Ne}',
78
78
  target::text
79
79
  );
80
80
  END LOOP;
81
81
  END;
82
82
  $$;
83
- `),await Le(e,t)}),await e.ensureInfrastructurePromise}async function Le(e,t){await re(e,t,async()=>{await t.query(`SELECT "${E}"."${Ne}"()`)})}async function qt(e,t){await xe(e,t),await Le(e,t);let r=await re(e,t,async()=>await t.query(`
83
+ `),await Oe(e,t)}),await e.ensureInfrastructurePromise}async function Oe(e,t){await ne(e,t,async()=>{await t.query(`SELECT "${E}"."${Ie}"()`)})}async function Kt(e,t){await Be(e,t),await Oe(e,t);let r=await ne(e,t,async()=>await t.query(`
84
84
  WITH drained AS (
85
- DELETE FROM "${E}"."${Z}"
85
+ DELETE FROM "${E}"."${ee}"
86
86
  RETURNING txid, schema_name, table_name, op, row_data, old_row_data, id
87
87
  )
88
88
  SELECT txid, schema_name, table_name, op, row_data, old_row_data
89
89
  FROM drained
90
90
  ORDER BY id
91
- `));if(r.rows.length===0||e.subscribers.size===0)return;let n=r.rows.map(Wt);for(let s of e.subscribers)queueMicrotask(()=>{if(!e.closed&&e.subscribers.has(s))try{s(n)}catch(o){console.error("[WAL bridge] subscriber failed",o)}})}async function V(e,t){if(!e.closed){if(e.pollPromise){e.pendingPoll=!0,await e.pollPromise;return}e.pollPromise=(async()=>{do e.pendingPoll=!1,await qt(e,t);while(e.pendingPoll&&!e.closed)})().finally(()=>{e.pollPromise=null}),await e.pollPromise}}async function re(e,t,r){e.suppressDepth+=1;try{return await r()}finally{e.suppressDepth-=1,e.suppressDepth===0&&!e.closed&&I.get(t)!==e&&(e.closed=!0)}}function Wt(e){return{oldRecord:e.old_row_data,record:e.row_data,schema:e.schema_name,table:e.table_name,txid:String(e.txid),type:zt(e.op)}}function zt(e){switch(e.toLowerCase()){case"delete":return"delete";case"insert":return"insert";case"update":return"update";default:throw new Error(`Unsupported WAL bridge operation: ${e}`)}}var jt=10,Ue="127.0.0.1",Ce=128*1024*1024,$e=["-c","shared_buffers=16MB","-c","temp_buffers=1MB","-c","work_mem=1MB","-c","maintenance_work_mem=16MB","-c","wal_buffers=1MB"],m={connectionLimit:jt,connectTimeout:0,database:"template1",maxIdleConnectionLifetime:0,password:"postgres",poolTimeout:0,socketTimeout:0,sslMode:"disable",username:"postgres"},Ht=`postgres://${m.username}:${m.password}@localhost`,ne=new URLSearchParams({sslmode:m.sslMode}),ke=new URLSearchParams({...Object.fromEntries(ne.entries()),connection_limit:String(m.connectionLimit),connect_timeout:String(m.connectTimeout),max_idle_connection_lifetime:String(m.maxIdleConnectionLifetime),pool_timeout:String(m.poolTimeout),socket_timeout:String(m.socketTimeout)});async function Ge(e){let{rows:t}=await e.query("SELECT EXISTS(SELECT 1 FROM pg_roles WHERE rolname = 'postgres') AS exists");t[0]?.exists?await e.exec(`ALTER ROLE ${m.username} WITH LOGIN SUPERUSER PASSWORD '${m.password}'`):await e.exec(`CREATE ROLE ${m.username} WITH LOGIN SUPERUSER PASSWORD '${m.password}'`),await e.exec(`SET ROLE ${m.username}`)}async function Kt(e,t){if(e==="shadow_database"&&!t.dryRun)return await Qe(t);let r=e==="database"?t.databasePort:t.shadowDatabasePort;return t.dryRun?qe(e,t,{db:null,port:r,server:null}):await Fe(e,t,{port:r,updateServerStatePort:!0})}async function Qe(e,t=async()=>await Fe("shadow_database",e,{port:0,updateServerStatePort:!1})){let{debug:r}=e,n=null,s=null,o=!1,l=new Set,c=(0,F.createServer)(u),i=await Jt(c,e.shadowDatabasePort);return e.shadowDatabasePort=i,r&&console.debug(`[shadow_database] lazy proxy listening on port ${i}`),{...m,attachWalEventBridge:()=>Promise.reject(new Error("WAL bridge is only available for the primary database server")),attachQueryInsightsBridge:()=>Promise.reject(new Error("Query insights are only available for the primary database server")),close:async()=>{o=!0;for(let d of l)d.destroy();l.clear();let a=[];try{await Yt(c),r&&console.debug(`[shadow_database] lazy proxy stopped on port ${i}`)}catch(d){console.error("[shadow_database] lazy proxy stop error",d),a.push(d)}try{await s?.catch(()=>null),await n?.close()}catch(d){console.error("[shadow_database] backend close error",d),a.push(d)}if(a.length>0)throw new AggregateError(a,"Failed to close shadow_database properly")},connectionString:Q(i,ne),dump:async()=>{},getPrimaryKeyColumns:()=>Promise.reject(new Error("Primary key resolution is only available for the primary database server")),port:i,prismaORMConnectionString:Q(i,ke),terminalCommand:`PGPASSWORD=${m.password} PGSSLMODE=${m.sslMode} psql -h localhost -p ${i} -U ${m.username} -d ${m.database}`};function u(a){l.add(a);let d=()=>{l.delete(a)};a.once("close",d),a.once("error",d),a.pause(),p(a)}async function p(a){try{let d=await y();if(o){a.destroy();return}let f=(0,F.createConnection)({host:Ue,port:d.port});l.add(f);let D=()=>{l.delete(f)};f.once("close",D),f.once("error",D),a.once("close",()=>f.destroy()),a.once("error",()=>f.destroy()),f.once("error",()=>a.destroy()),f.once("connect",()=>{r&&console.debug(`[shadow_database] proxying connection to lazy backend on port ${d.port}`),a.resume(),a.pipe(f),f.pipe(a)})}catch(d){r&&console.error("[shadow_database] failed to start lazy backend",d),a.destroy(d instanceof Error?d:void 0)}}async function y(){if(n)return n;if(o)throw new Error("shadow_database is closed");return s||(r&&console.debug("[shadow_database] starting lazy backend..."),s=t().then(a=>(n=a,r&&console.debug(`[shadow_database] lazy backend started on port ${a.port}`),a)).catch(a=>{throw s=null,a})),await s}}async function Fe(e,t,r){let{debug:n}=t,{port:s,updateServerStatePort:o}=r,c=await(e==="shadow_database"?Xt:We)(t.pgliteDataDirPath,n);n&&c.onNotification((a,d)=>{console.debug(`[${e}][${a}] ${d}`)});let{PGLiteSocketServer:i}=await import("@electric-sql/pglite-socket"),u=e==="shadow_database"?t.shadowDatabaseIdleTimeoutMillis:t.databaseIdleTimeoutMillis,p=new i({db:c,debug:n,idleTimeout:Number.isFinite(u)?u:0,inspect:n,maxConnections:m.connectionLimit,port:s});n&&(p.addEventListener("listening",a=>{let{detail:d}=a;console.debug(`[${e}] server listening on ${JSON.stringify(d)}`)}),p.addEventListener("connection",a=>{let{clientAddress:d,clientPort:f}=a.detail;console.debug(`[${e}] client connected from ${d}:${f}`)}),p.addEventListener("error",a=>{let{detail:d}=a;console.error(`[${e}] server error:`,d)}));try{await p.start()}catch(a){throw a instanceof Error&&"code"in a&&a.code==="EADDRINUSE"?new N(s):a}let y=Number(p.getServerConn().split(":").at(1));return o&&(t[e==="database"?"databasePort":"shadowDatabasePort"]=y),qe(e,t,{db:c,port:y,server:p})}function qe(e,t,r){let{debug:n}=t,{db:s,port:o,server:l}=r||{},c=new Map;return n&&console.debug(`[${e}] server started on port ${o}`),{...m,attachWalEventBridge:async()=>{if(e!=="database"||!s)throw new Error("WAL bridge is only available for the primary database server");return await k(s)},attachQueryInsightsBridge:()=>{if(e!=="database"||!l)throw new Error("Query insights are only available for the primary database server");return Promise.resolve(Ee(l))},close:async()=>{let i=[];try{await l?.stop(),n&&console.debug(`[${e}] server stopped on port ${o}`)}catch(u){console.error(`[${e}] server stop error`,u),i.push(u)}if(e==="database"){try{l&&await Se(l),n&&console.debug(`[${e}] closed query insights bridge`)}catch(u){console.error(`[${e}] query insights bridge close error`,u),i.push(u)}try{s&&await Ie(s),n&&console.debug(`[${e}] closed WAL bridge`)}catch(u){console.error(`[${e}] WAL bridge close error`,u),i.push(u)}try{await s?.syncToFs(),n&&console.debug(`[${e}] synced to filesystem`)}catch(u){console.error(`[${e}] sync error`,u),i.push(u)}}try{await s?.close(),n&&console.debug(`[${e}] closed`)}catch(u){console.error(`[${e}] close error`,u),i.push(u)}if(i.length>0)throw new AggregateError(i,`Failed to close ${e} properly`)},connectionString:Q(o,ne),dump:async i=>{e==="shadow_database"||!s||await ze({db:s,debug:n,destinationPath:i})},getPrimaryKeyColumns:async(i,u)=>{if(e==="shadow_database"||!s)throw new Error("Primary key resolution is only available for the primary database server");let p=`${i}.${u}`,y=c.get(p);return y||(y=Vt(s,i,u).catch(a=>{throw c.delete(p),a}),c.set(p,y)),await y},port:o,prismaORMConnectionString:Q(o,ke),terminalCommand:`PGPASSWORD=${m.password} PGSSLMODE=${m.sslMode} psql -h localhost -p ${o} -U ${m.username} -d ${m.database}`}}function Q(e,t){return`${Ht}:${e}/${m.database}?${t.toString()}`}async function We(e,t){let{PGlite:r}=await import("@electric-sql/pglite"),n=await X(),s=e==="memory://"||!await ie((0,Oe.join)(e,"PG_VERSION")),o=await r.create({database:m.database,dataDir:e,debug:t?5:void 0,extensions:n.extensions,fsBundle:n.fsBundle,initialMemory:Ce,loadDataDir:s?n.loadDataDir:void 0,relaxedDurability:!1,startParams:[...r.defaultStartParams,...$e],wasmModule:n.wasmModule});return await Ge(o),o}async function Jt(e,t){return await new Promise((r,n)=>{let s=c=>{if(l(),c.code==="EADDRINUSE"){n(new N(t));return}n(c)},o=()=>{let c=e.address();if(l(),!c||typeof c=="string"){n(new Error("Failed to determine TCP server port"));return}r(c.port)},l=()=>{e.off("error",s),e.off("listening",o)};e.once("error",s),e.once("listening",o),e.listen(t,Ue)})}async function Yt(e){await new Promise((t,r)=>{e.close(n=>{let s=n;if(s&&s.code!=="ERR_SERVER_NOT_RUNNING"){r(s);return}t()})})}async function Xt(e,t){let{PGlite:r}=await import("@electric-sql/pglite"),n=await X(),s=await r.create({database:m.database,dataDir:"memory://",debug:t?5:void 0,extensions:n.extensions,fsBundle:n.fsBundle,initialMemory:Ce,loadDataDir:n.loadDataDir,relaxedDurability:!1,startParams:[...r.defaultStartParams,...$e],wasmModule:n.wasmModule});return await Ge(s),s}async function Vt(e,t,r){let{rows:n}=await e.query(`
91
+ `));if(r.rows.length===0||e.subscribers.size===0)return;let n=r.rows.map(Yt);for(let o of e.subscribers)queueMicrotask(()=>{if(!e.closed&&e.subscribers.has(o))try{o(n)}catch(s){console.error("[WAL bridge] subscriber failed",s)}})}async function Z(e,t){if(!e.closed){if(e.pollPromise){e.pendingPoll=!0,await e.pollPromise;return}e.pollPromise=(async()=>{do e.pendingPoll=!1,await Kt(e,t);while(e.pendingPoll&&!e.closed)})().finally(()=>{e.pollPromise=null}),await e.pollPromise}}async function ne(e,t,r){e.suppressDepth+=1;try{return await r()}finally{e.suppressDepth-=1,e.suppressDepth===0&&!e.closed&&N.get(t)!==e&&(e.closed=!0)}}function Yt(e){return{oldRecord:e.old_row_data,record:e.row_data,schema:e.schema_name,table:e.table_name,txid:String(e.txid),type:Jt(e.op)}}function Jt(e){switch(e.toLowerCase()){case"delete":return"delete";case"insert":return"insert";case"update":return"update";default:throw new Error(`Unsupported WAL bridge operation: ${e}`)}}var Xt=10,$e="127.0.0.1",ke=128*1024*1024,Qe=["-c","shared_buffers=16MB","-c","temp_buffers=1MB","-c","work_mem=1MB","-c","maintenance_work_mem=16MB","-c","wal_buffers=1MB"],p={connectionLimit:Xt,connectTimeout:0,database:"template1",maxIdleConnectionLifetime:0,password:"postgres",poolTimeout:0,socketTimeout:0,sslMode:"disable",username:"postgres"},Vt=`postgres://${p.username}:${p.password}@localhost`,oe=new URLSearchParams({sslmode:p.sslMode}),Fe=new URLSearchParams({...Object.fromEntries(oe.entries()),connection_limit:String(p.connectionLimit),connect_timeout:String(p.connectTimeout),max_idle_connection_lifetime:String(p.maxIdleConnectionLifetime),pool_timeout:String(p.poolTimeout),socket_timeout:String(p.socketTimeout)});async function Ge(e){let{rows:t}=await e.query("SELECT EXISTS(SELECT 1 FROM pg_roles WHERE rolname = 'postgres') AS exists");t[0]?.exists?await e.exec(`ALTER ROLE ${p.username} WITH LOGIN SUPERUSER PASSWORD '${p.password}'`):await e.exec(`CREATE ROLE ${p.username} WITH LOGIN SUPERUSER PASSWORD '${p.password}'`),await e.exec(`SET ROLE ${p.username}`)}async function Zt(e,t){if(e==="shadow_database"&&!t.dryRun)return await qe(t);let r=e==="database"?t.databasePort:t.shadowDatabasePort;return t.dryRun?ze(e,t,{db:null,port:r,server:null}):await We(e,t,{port:r,updateServerStatePort:!0})}async function qe(e,t=async()=>await We("shadow_database",e,{port:0,updateServerStatePort:!1})){let{debug:r}=e,n=null,o=null,s=!1,u=new Set,l=(0,q.createServer)(i),c=await er(l,e.shadowDatabasePort);return e.shadowDatabasePort=c,r&&console.debug(`[shadow_database] lazy proxy listening on port ${c}`),{...p,attachWalEventBridge:()=>Promise.reject(new Error("WAL bridge is only available for the primary database server")),attachQueryInsightsBridge:()=>Promise.reject(new Error("Query insights are only available for the primary database server")),close:async()=>{s=!0;for(let d of u)d.destroy();u.clear();let a=[];try{await tr(l),r&&console.debug(`[shadow_database] lazy proxy stopped on port ${c}`)}catch(d){console.error("[shadow_database] lazy proxy stop error",d),a.push(d)}try{await o?.catch(()=>null),await n?.close()}catch(d){console.error("[shadow_database] backend close error",d),a.push(d)}if(a.length>0)throw new AggregateError(a,"Failed to close shadow_database properly")},connectionString:G(c,oe),dump:async()=>{},getPrimaryKeyColumns:()=>Promise.reject(new Error("Primary key resolution is only available for the primary database server")),port:c,prismaORMConnectionString:G(c,Fe),terminalCommand:`PGPASSWORD=${p.password} PGSSLMODE=${p.sslMode} psql -h localhost -p ${c} -U ${p.username} -d ${p.database}`};function i(a){u.add(a);let d=()=>{u.delete(a)};a.once("close",d),a.once("error",d),a.pause(),m(a)}async function m(a){try{let d=await y();if(s){a.destroy();return}let f=(0,q.createConnection)({host:$e,port:d.port});u.add(f);let D=()=>{u.delete(f)};f.once("close",D),f.once("error",D),a.once("close",()=>f.destroy()),a.once("error",()=>f.destroy()),f.once("error",()=>a.destroy()),f.once("connect",()=>{r&&console.debug(`[shadow_database] proxying connection to lazy backend on port ${d.port}`),a.resume(),a.pipe(f),f.pipe(a)})}catch(d){r&&console.error("[shadow_database] failed to start lazy backend",d),a.destroy(d instanceof Error?d:void 0)}}async function y(){if(n)return n;if(s)throw new Error("shadow_database is closed");return o||(r&&console.debug("[shadow_database] starting lazy backend..."),o=t().then(a=>(n=a,r&&console.debug(`[shadow_database] lazy backend started on port ${a.port}`),a)).catch(a=>{throw o=null,a})),await o}}async function We(e,t,r){let{debug:n}=t,{port:o,updateServerStatePort:s}=r,l=await(e==="shadow_database"?rr:je)(t.pgliteDataDirPath,n);n&&l.onNotification((a,d)=>{console.debug(`[${e}][${a}] ${d}`)});let{PGLiteSocketServer:c}=await import("@electric-sql/pglite-socket"),i=e==="shadow_database"?t.shadowDatabaseIdleTimeoutMillis:t.databaseIdleTimeoutMillis,m=new c({db:l,debug:n,idleTimeout:Number.isFinite(i)?i:0,inspect:n,maxConnections:p.connectionLimit,port:o});he(m),n&&(m.addEventListener("listening",a=>{let{detail:d}=a;console.debug(`[${e}] server listening on ${JSON.stringify(d)}`)}),m.addEventListener("connection",a=>{let{clientAddress:d,clientPort:f}=a.detail;console.debug(`[${e}] client connected from ${d}:${f}`)}),m.addEventListener("error",a=>{let{detail:d}=a;console.error(`[${e}] server error:`,d)}));try{await m.start()}catch(a){throw a instanceof Error&&"code"in a&&a.code==="EADDRINUSE"?new x(o):a}let y=Number(m.getServerConn().split(":").at(1));return s&&(t[e==="database"?"databasePort":"shadowDatabasePort"]=y),ze(e,t,{db:l,port:y,server:m})}function ze(e,t,r){let{debug:n}=t,{db:o,port:s,server:u}=r||{},l=new Map;return n&&console.debug(`[${e}] server started on port ${s}`),{...p,attachWalEventBridge:async()=>{if(e!=="database"||!o)throw new Error("WAL bridge is only available for the primary database server");return await Q(o)},attachQueryInsightsBridge:()=>{if(e!=="database"||!u)throw new Error("Query insights are only available for the primary database server");return Promise.resolve(Se(u))},close:async()=>{let c=[];try{await u?.stop(),n&&console.debug(`[${e}] server stopped on port ${s}`)}catch(i){console.error(`[${e}] server stop error`,i),c.push(i)}if(e==="database"){try{u&&await we(u),n&&console.debug(`[${e}] closed query insights bridge`)}catch(i){console.error(`[${e}] query insights bridge close error`,i),c.push(i)}try{o&&await Le(o),n&&console.debug(`[${e}] closed WAL bridge`)}catch(i){console.error(`[${e}] WAL bridge close error`,i),c.push(i)}try{await o?.syncToFs(),n&&console.debug(`[${e}] synced to filesystem`)}catch(i){console.error(`[${e}] sync error`,i),c.push(i)}}try{await o?.close(),n&&console.debug(`[${e}] closed`)}catch(i){console.error(`[${e}] close error`,i),c.push(i)}if(c.length>0)throw new AggregateError(c,`Failed to close ${e} properly`)},connectionString:G(s,oe),dump:async c=>{e==="shadow_database"||!o||await He({db:o,debug:n,destinationPath:c})},getPrimaryKeyColumns:async(c,i)=>{if(e==="shadow_database"||!o)throw new Error("Primary key resolution is only available for the primary database server");let m=`${c}.${i}`,y=l.get(m);return y||(y=nr(o,c,i).catch(a=>{throw l.delete(m),a}),l.set(m,y)),await y},port:s,prismaORMConnectionString:G(s,Fe),terminalCommand:`PGPASSWORD=${p.password} PGSSLMODE=${p.sslMode} psql -h localhost -p ${s} -U ${p.username} -d ${p.database}`}}function G(e,t){return`${Vt}:${e}/${p.database}?${t.toString()}`}async function je(e,t){let{PGlite:r}=await import("@electric-sql/pglite"),n=await V(),o=e==="memory://"||!await ue((0,Ue.join)(e,"PG_VERSION")),s=await r.create({database:p.database,dataDir:e,debug:t?5:void 0,extensions:n.extensions,fsBundle:n.fsBundle,initialMemory:ke,loadDataDir:o?n.loadDataDir:void 0,relaxedDurability:!1,startParams:[...r.defaultStartParams,...Qe],wasmModule:n.wasmModule});return await Ge(s),s}async function er(e,t){return await new Promise((r,n)=>{let o=l=>{if(u(),l.code==="EADDRINUSE"){n(new x(t));return}n(l)},s=()=>{let l=e.address();if(u(),!l||typeof l=="string"){n(new Error("Failed to determine TCP server port"));return}r(l.port)},u=()=>{e.off("error",o),e.off("listening",s)};e.once("error",o),e.once("listening",s),e.listen(t,$e)})}async function tr(e){await new Promise((t,r)=>{e.close(n=>{let o=n;if(o&&o.code!=="ERR_SERVER_NOT_RUNNING"){r(o);return}t()})})}async function rr(e,t){let{PGlite:r}=await import("@electric-sql/pglite"),n=await V(),o=await r.create({database:p.database,dataDir:"memory://",debug:t?5:void 0,extensions:n.extensions,fsBundle:n.fsBundle,initialMemory:ke,loadDataDir:n.loadDataDir,relaxedDurability:!1,startParams:[...r.defaultStartParams,...Qe],wasmModule:n.wasmModule});return await Ge(o),o}async function nr(e,t,r){let{rows:n}=await e.query(`
92
92
  SELECT attribute.attname AS column_name
93
93
  FROM pg_constraint pk_constraint
94
94
  INNER JOIN pg_class relation
@@ -101,7 +101,7 @@
101
101
  ON attribute.attrelid = relation.oid
102
102
  AND attribute.attnum = keys.attnum
103
103
  WHERE pk_constraint.contype = 'p'
104
- AND namespace.nspname = ${Be(t)}
105
- AND relation.relname = ${Be(r)}
104
+ AND namespace.nspname = ${Me(t)}
105
+ AND relation.relname = ${Me(r)}
106
106
  ORDER BY keys.ordinality
107
- `);return n.map(s=>s.column_name)}function Be(e){return`'${e.replaceAll("'","''")}'`}async function ze(e){let{dataDir:t,db:r,debug:n,destinationPath:s}=e,o=r||await We(t,n),{pgDump:l}=await import("@electric-sql/pglite-tools/pg_dump"),c=await l({args:["--schema-only","--no-owner"],fileName:s?(0,Me.filename)(s):void 0,pg:await o.clone()});return s?(n&&console.debug(`[DB] Dumping database to ${s}`),await ue(c,s)):(n&&console.debug("[DB] Dumping database to memory"),await c.text())}0&&(module.exports={attachWalEventBridge,dumpDB,shouldPollWalAfterMessages,shouldPollWalAfterResponse,startDBServer,startLazyShadowDBServer});
107
+ `);return n.map(o=>o.column_name)}function Me(e){return`'${e.replaceAll("'","''")}'`}async function He(e){let{dataDir:t,db:r,debug:n,destinationPath:o}=e,s=r||await je(t,n),{pgDump:u}=await import("@electric-sql/pglite-tools/pg_dump"),l=await u({args:["--schema-only","--no-owner"],fileName:o?(0,Ce.filename)(o):void 0,pg:await s.clone()});return o?(n&&console.debug(`[DB] Dumping database to ${o}`),await ce(l,o)):(n&&console.debug("[DB] Dumping database to memory"),await l.text())}0&&(module.exports={attachWalEventBridge,dumpDB,shouldPollWalAfterMessages,shouldPollWalAfterResponse,startDBServer,startLazyShadowDBServer});
package/dist/db.js CHANGED
@@ -1 +1 @@
1
- import{c as a,d as b,e as c,f as d,g as e,h as f}from"./chunk-PP43TGA5.js";import"./chunk-KWCQYPJI.js";import"./chunk-EDFHV3AK.js";import"./chunk-DWY47FQV.js";export{a as attachWalEventBridge,f as dumpDB,b as shouldPollWalAfterMessages,c as shouldPollWalAfterResponse,d as startDBServer,e as startLazyShadowDBServer};
1
+ import{c as a,d as b,e as c,f as d,g as e,h as f}from"./chunk-QDQPFKGQ.js";import"./chunk-KWCQYPJI.js";import"./chunk-EDFHV3AK.js";import"./chunk-DWY47FQV.js";export{a as attachWalEventBridge,f as dumpDB,b as shouldPollWalAfterMessages,c as shouldPollWalAfterResponse,d as startDBServer,e as startLazyShadowDBServer};