@prisma/dev 0.24.4 → 0.24.6
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/accelerate-5FDEK4T6.js +11 -0
- package/dist/chunk-3UF2MBYQ.js +1 -0
- package/dist/{chunk-CC3P7GPW.js → chunk-7KFGQZD5.js} +3 -3
- package/dist/{chunk-X3G665AK.js → chunk-EDFHV3AK.js} +1 -1
- package/dist/chunk-FCMFDITA.js +1 -0
- package/dist/chunk-HQMJSXYT.js +1 -0
- package/dist/chunk-KWCQYPJI.js +1 -0
- package/dist/chunk-PGJI3PZW.js +100 -0
- package/dist/daemon.cjs +26 -26
- package/dist/daemon.d.cts +1 -1
- package/dist/daemon.d.ts +1 -1
- package/dist/daemon.js +1 -1
- package/dist/db.cjs +16 -16
- package/dist/db.d.cts +5 -2
- package/dist/db.d.ts +5 -2
- package/dist/db.js +1 -1
- package/dist/engine-XP6YJ63T.js +3 -0
- package/dist/index.cjs +26 -26
- package/dist/index.d.cts +4 -3
- package/dist/index.d.ts +4 -3
- package/dist/index.js +1 -1
- package/dist/query-plan-executor-F6RXHJSD.js +1 -0
- package/dist/runtime-assets/amcheck.tar.gz +0 -0
- package/dist/runtime-assets/bloom.tar.gz +0 -0
- package/dist/runtime-assets/btree_gin.tar.gz +0 -0
- package/dist/runtime-assets/btree_gist.tar.gz +0 -0
- package/dist/runtime-assets/citext.tar.gz +0 -0
- package/dist/runtime-assets/cube.tar.gz +0 -0
- package/dist/runtime-assets/dict_int.tar.gz +0 -0
- package/dist/runtime-assets/dict_xsyn.tar.gz +0 -0
- package/dist/runtime-assets/earthdistance.tar.gz +0 -0
- package/dist/runtime-assets/file_fdw.tar.gz +0 -0
- package/dist/runtime-assets/fuzzystrmatch.tar.gz +0 -0
- package/dist/runtime-assets/hstore.tar.gz +0 -0
- package/dist/runtime-assets/initdb.wasm +0 -0
- package/dist/runtime-assets/intarray.tar.gz +0 -0
- package/dist/runtime-assets/isn.tar.gz +0 -0
- package/dist/runtime-assets/lo.tar.gz +0 -0
- package/dist/runtime-assets/ltree.tar.gz +0 -0
- package/dist/runtime-assets/pageinspect.tar.gz +0 -0
- package/dist/runtime-assets/pg_buffercache.tar.gz +0 -0
- package/dist/runtime-assets/pg_freespacemap.tar.gz +0 -0
- package/dist/runtime-assets/pg_surgery.tar.gz +0 -0
- package/dist/runtime-assets/pg_trgm.tar.gz +0 -0
- package/dist/runtime-assets/pg_visibility.tar.gz +0 -0
- package/dist/runtime-assets/pg_walinspect.tar.gz +0 -0
- package/dist/runtime-assets/pglite-seed.tar.gz +0 -0
- package/dist/runtime-assets/pglite.wasm +0 -0
- package/dist/runtime-assets/seg.tar.gz +0 -0
- package/dist/runtime-assets/tablefunc.tar.gz +0 -0
- package/dist/runtime-assets/tcn.tar.gz +0 -0
- package/dist/runtime-assets/tsm_system_rows.tar.gz +0 -0
- package/dist/runtime-assets/tsm_system_time.tar.gz +0 -0
- package/dist/runtime-assets/unaccent.tar.gz +0 -0
- package/dist/runtime-assets/uuid-ossp.tar.gz +0 -0
- package/dist/runtime-assets/vector.tar.gz +0 -0
- package/dist/runtime-assets-manifest.bun.js +2 -0
- package/dist/runtime-assets.cjs +1 -1
- package/dist/runtime-assets.d.cts +2 -0
- package/dist/runtime-assets.d.ts +2 -0
- package/dist/runtime-assets.js +1 -1
- package/dist/{state-DTMxyzXf.d.cts → state-CDXGsSbm.d.cts} +8 -0
- package/dist/{state-DTMxyzXf.d.ts → state-CDXGsSbm.d.ts} +8 -0
- package/dist/state.cjs +3 -3
- package/dist/state.d.cts +1 -1
- package/dist/state.d.ts +1 -1
- package/dist/state.js +1 -1
- package/package.json +17 -17
- package/dist/accelerate-HWGEFOM5.js +0 -11
- package/dist/chunk-62DM64XC.js +0 -1
- package/dist/chunk-DLTTSFDI.js +0 -1
- package/dist/chunk-TF5C7XJX.js +0 -3
- package/dist/chunk-YL6J3L2T.js +0 -100
package/dist/db.cjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
"use strict";var
|
|
2
|
-
CREATE TABLE IF NOT EXISTS "${
|
|
1
|
+
"use strict";var Ne=Object.create;var v=Object.defineProperty;var Oe=Object.getOwnPropertyDescriptor;var Be=Object.getOwnPropertyNames;var xe=Object.getPrototypeOf,Ue=Object.prototype.hasOwnProperty;var Ie=(e,t)=>{for(var r in t)v(e,r,{get:t[r],enumerable:!0})},Z=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Be(t))!Ue.call(e,n)&&n!==r&&v(e,n,{get:()=>t[n],enumerable:!(o=Oe(t,n))||o.enumerable});return e};var E=(e,t,r)=>(r=e!=null?Ne(xe(e)):{},Z(t||!e||!e.__esModule?v(r,"default",{value:e,enumerable:!0}):r,e)),$e=e=>Z(v({},"__esModule",{value:!0}),e);var ft={};Ie(ft,{attachWalEventBridge:()=>I,dumpDB:()=>Le,shouldPollWalAfterMessages:()=>$,shouldPollWalAfterResponse:()=>X,startDBServer:()=>lt,startLazyShadowDBServer:()=>Te});module.exports=$e(ft);var Ce=()=>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=Ce();var G=require("net"),ye=require("path"),we=require("pathe/utils");var N=require("fs"),y=require("fs/promises"),ee=require("util"),te=require("zlib");var m=E(require("path"),1),M=E(require("os"),1),L=E(require("process"),1),S=M.default.homedir(),k=M.default.tmpdir(),{env:T}=L.default,Ge=e=>{let t=m.default.join(S,"Library");return{data:m.default.join(t,"Application Support",e),config:m.default.join(t,"Preferences",e),cache:m.default.join(t,"Caches",e),log:m.default.join(t,"Logs",e),temp:m.default.join(k,e)}},Me=e=>{let t=T.APPDATA||m.default.join(S,"AppData","Roaming"),r=T.LOCALAPPDATA||m.default.join(S,"AppData","Local");return{data:m.default.join(r,e,"Data"),config:m.default.join(t,e,"Config"),cache:m.default.join(r,e,"Cache"),log:m.default.join(r,e,"Log"),temp:m.default.join(k,e)}},ke=e=>{let t=m.default.basename(S);return{data:m.default.join(T.XDG_DATA_HOME||m.default.join(S,".local","share"),e),config:m.default.join(T.XDG_CONFIG_HOME||m.default.join(S,".config"),e),cache:m.default.join(T.XDG_CACHE_HOME||m.default.join(S,".cache"),e),log:m.default.join(T.XDG_STATE_HOME||m.default.join(S,".local","state"),e),temp:m.default.join(k,t,e)}};function W(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"?Ge(e):L.default.platform==="win32"?Me(e):ke(e)}var We=E(require("zeptomatch"),1),Et=W("prisma-dev"),Rt=(0,ee.promisify)(te.unzip);async function re(e){try{return await(0,y.access)(e,y.constants.F_OK),!0}catch(t){if(Fe(t))return!1;throw t}}async function oe(e,t){await e.stream().pipeTo(N.WriteStream.toWeb((0,N.createWriteStream)(t,{encoding:"utf8"})))}function Fe(e){return e!=null&&typeof e=="object"&&"code"in e&&e.code==="ENOENT"}var F=require("get-port-please"),ne=require("remeda");var A=class extends Error{constructor(r){super(`Port \`${r}\` is not available.`);this.port=r}name="PortNotAvailableError"};var _=require("fs"),h=require("fs/promises"),ae=require("module"),ie=require("path"),R=require("url"),ze=(0,ae.createRequire)(b),je=["initdb.wasm","pglite.data","pglite.wasm"],j="pglite-seed.tar.gz",ce={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"},qe=[...je.map(e=>({fileName:e,kind:"core",name:e})),{fileName:j,kind:"core",name:j},...Object.entries(ce).map(([e,t])=>({fileName:t,kind:"extension",name:e}))],x=new Map,He=Symbol.for("@prisma/dev/bundled-pglite-runtime-asset-sources"),O=null;async function q(){await et();let e=le();if(e)return await Ye(e),await Ke(e);let t=Qe(),r=t.href,o=x.get(r);return o||(o=Je(t),x.set(r,o)),await o}async function Ke(e){let t=`bundled:${e.wasmModule.href}:${e.fsBundle.href}`,r=x.get(t);return r||(r=Xe(e),x.set(t,r)),await r}async function Je(e){let t=U(new URL("./runtime-assets/",b)),[r,o,n]=await Promise.all([(0,h.readFile)(B("pglite.data",e,t)),(0,h.readFile)(B(j,e,t)),(0,h.readFile)(B("pglite.wasm",e,t))]),a=de();return{extensions:Object.fromEntries(Object.entries(ce).map(([p,d])=>[p,B(d,e,t)])),fsBundle:new Blob([Uint8Array.from(r)]),loadDataDir:new Blob([Uint8Array.from(o)]),wasmModule:await a.compile(n)}}async function Xe(e){let[t,r,o]=await Promise.all([z(e.fsBundle),z(e.loadDataDir),z(e.wasmModule)]),n=de();return{extensions:e.extensions,fsBundle:new Blob([Uint8Array.from(t)]),loadDataDir:new Blob([Uint8Array.from(r)]),wasmModule:await n.compile(o)}}async function Ye(e){if(e.initdbWasm.protocol!=="file:")return;let t=new URL("initdb.wasm",U(new URL("./",e.initdbWasm))),r=(0,R.fileURLToPath)(t);(0,_.existsSync)(r)||await(0,h.copyFile)((0,R.fileURLToPath)(e.initdbWasm),r)}function U(e){return e instanceof URL?se(e):se((0,R.pathToFileURL)(e))}function se(e){return e.href.endsWith("/")?e:new URL(`${e.href}/`)}function Ve(){let e=ze.resolve("@electric-sql/pglite");return U((0,ie.dirname)(e))}function Qe(){let e=U(new URL("./",b));if(Ze(e))return e;if(tt())return Ve();throw new Error("Unable to locate PGlite runtime assets. If you bundled @prisma/dev, copy them next to the bundle with copyPrismaDevRuntimeAssets().")}function Ze(e){return qe.every(t=>(0,_.existsSync)((0,R.fileURLToPath)(new URL(t.fileName,e))))}function le(){return globalThis[He]??null}async function et(){!rt()||le()||(O||(O=import("./runtime-assets-manifest.bun.js").then(()=>{}).catch(e=>{throw O=null,e})),await O)}function tt(){let e=(0,R.fileURLToPath)(new URL("../package.json",b));if(!(0,_.existsSync)(e))return!1;try{return JSON.parse((0,_.readFileSync)(e,"utf8")).name==="@prisma/dev"}catch{return!1}}function rt(){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 z(e){if(e.protocol==="file:")return await(0,h.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 B(e,t,r){let o=new URL(e,t);if((0,_.existsSync)((0,R.fileURLToPath)(o)))return o;if(r){let n=new URL(e,r);if((0,_.existsSync)((0,R.fileURLToPath)(n)))return n}return o}var J=require("@electric-sql/pglite"),w="_prisma_dev_wal",K="events",pe="install_all_triggers",ue="capture_event",me="prisma_dev_wal_capture",D=new WeakMap,ot=new Set(["ALTER","COMMIT","COPY","CREATE","DELETE","DROP","INSERT","MERGE","TRUNCATE","UPDATE"]);async function I(e,t){let r=D.get(e);if(r&&!r.closed)return r.bridge;let o=e.execProtocolRaw.bind(e),n=e.execProtocolRawStream.bind(e),a={bridge:{close:async()=>{a.closed||(a.closed=!0,a.subscribers.clear(),e.execProtocolRaw===p&&(e.execProtocolRaw=o),e.execProtocolRawStream===d&&(e.execProtocolRawStream=n),await a.pollPromise,D.delete(e))},poll:async()=>{await H(a,e)},subscribe:i=>(a.subscribers.add(i),()=>{a.subscribers.delete(i)})},closed:!1,ensureInfrastructurePromise:null,pendingPoll:!1,pollPromise:null,subscribers:new Set,suppressDepth:0},p=async(i,u)=>{let f=await o(i,u);return!a.closed&&a.suppressDepth===0&&X(f)&&H(a,e),f},d=async(i,u)=>{let f=[],P=new J.protocol.Parser,s=u?.onRawData;await n(i,{...u,onRawData:c=>{P.parse(c,g=>{f.push(g)}),s?.(c)}}),!a.closed&&a.suppressDepth===0&&$(f)&&H(a,e)};return e.execProtocolRaw=p,e.execProtocolRawStream=d,D.set(e,a),await ge(a,e),a.bridge}async function fe(e){let t=D.get(e);t&&await t.bridge.close()}function $(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&&ot.has(r))return!0}return!1}function X(e){if(e.length===0)return!1;let t=[];return new J.protocol.Parser().parse(e,o=>{t.push(o)}),$(t)}async function ge(e,t){e.ensureInfrastructurePromise??=Y(e,t,async()=>{await t.exec(`CREATE SCHEMA IF NOT EXISTS "${w}"`),await t.exec(`
|
|
2
|
+
CREATE TABLE IF NOT EXISTS "${w}"."${K}" (
|
|
3
3
|
id BIGSERIAL PRIMARY KEY,
|
|
4
4
|
txid BIGINT NOT NULL DEFAULT txid_current(),
|
|
5
5
|
schema_name TEXT NOT NULL,
|
|
@@ -10,16 +10,16 @@
|
|
|
10
10
|
created_at TIMESTAMPTZ NOT NULL DEFAULT clock_timestamp()
|
|
11
11
|
)
|
|
12
12
|
`),await t.exec(`
|
|
13
|
-
CREATE OR REPLACE FUNCTION "${
|
|
13
|
+
CREATE OR REPLACE FUNCTION "${w}"."${ue}"()
|
|
14
14
|
RETURNS trigger
|
|
15
15
|
LANGUAGE plpgsql
|
|
16
16
|
AS $$
|
|
17
17
|
BEGIN
|
|
18
|
-
IF TG_TABLE_SCHEMA = '${
|
|
18
|
+
IF TG_TABLE_SCHEMA = '${w}' THEN
|
|
19
19
|
RETURN COALESCE(NEW, OLD);
|
|
20
20
|
END IF;
|
|
21
21
|
|
|
22
|
-
INSERT INTO "${
|
|
22
|
+
INSERT INTO "${w}"."${K}" (
|
|
23
23
|
txid,
|
|
24
24
|
schema_name,
|
|
25
25
|
table_name,
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
END;
|
|
41
41
|
$$;
|
|
42
42
|
`),await t.exec(`
|
|
43
|
-
CREATE OR REPLACE FUNCTION "${
|
|
43
|
+
CREATE OR REPLACE FUNCTION "${w}"."${pe}"()
|
|
44
44
|
RETURNS void
|
|
45
45
|
LANGUAGE plpgsql
|
|
46
46
|
AS $$
|
|
@@ -52,7 +52,7 @@
|
|
|
52
52
|
FROM pg_class AS c
|
|
53
53
|
JOIN pg_namespace AS n ON n.oid = c.relnamespace
|
|
54
54
|
WHERE c.relkind IN ('r', 'p')
|
|
55
|
-
AND n.nspname NOT IN ('${
|
|
55
|
+
AND n.nspname NOT IN ('${w}', 'information_schema', 'pg_catalog')
|
|
56
56
|
AND n.nspname NOT LIKE 'pg_temp_%'
|
|
57
57
|
AND n.nspname NOT LIKE 'pg_toast%'
|
|
58
58
|
LOOP
|
|
@@ -60,28 +60,28 @@
|
|
|
60
60
|
SELECT 1
|
|
61
61
|
FROM pg_trigger
|
|
62
62
|
WHERE tgrelid = target
|
|
63
|
-
AND tgname = '${
|
|
63
|
+
AND tgname = '${me}'
|
|
64
64
|
) THEN
|
|
65
65
|
CONTINUE;
|
|
66
66
|
END IF;
|
|
67
67
|
|
|
68
68
|
EXECUTE format(
|
|
69
|
-
'CREATE TRIGGER %I AFTER INSERT OR UPDATE OR DELETE ON %s FOR EACH ROW EXECUTE FUNCTION "${
|
|
70
|
-
'${
|
|
69
|
+
'CREATE TRIGGER %I AFTER INSERT OR UPDATE OR DELETE ON %s FOR EACH ROW EXECUTE FUNCTION "${w}"."${ue}"()',
|
|
70
|
+
'${me}',
|
|
71
71
|
target::text
|
|
72
72
|
);
|
|
73
73
|
END LOOP;
|
|
74
74
|
END;
|
|
75
75
|
$$;
|
|
76
|
-
`),await
|
|
76
|
+
`),await Pe(e,t)}),await e.ensureInfrastructurePromise}async function Pe(e,t){await Y(e,t,async()=>{await t.query(`SELECT "${w}"."${pe}"()`)})}async function nt(e,t){await ge(e,t),await Pe(e,t);let r=await Y(e,t,async()=>await t.query(`
|
|
77
77
|
WITH drained AS (
|
|
78
|
-
DELETE FROM "${
|
|
78
|
+
DELETE FROM "${w}"."${K}"
|
|
79
79
|
RETURNING txid, schema_name, table_name, op, row_data, old_row_data, id
|
|
80
80
|
)
|
|
81
81
|
SELECT txid, schema_name, table_name, op, row_data, old_row_data
|
|
82
82
|
FROM drained
|
|
83
83
|
ORDER BY id
|
|
84
|
-
`));if(r.rows.length===0||e.subscribers.size===0)return;let
|
|
84
|
+
`));if(r.rows.length===0||e.subscribers.size===0)return;let o=r.rows.map(st);for(let n of e.subscribers)queueMicrotask(()=>{if(!e.closed&&e.subscribers.has(n))try{n(o)}catch(a){console.error("[WAL bridge] subscriber failed",a)}})}async function H(e,t){if(!e.closed){if(e.pollPromise){e.pendingPoll=!0,await e.pollPromise;return}e.pollPromise=(async()=>{do e.pendingPoll=!1,await nt(e,t);while(e.pendingPoll&&!e.closed)})().finally(()=>{e.pollPromise=null}),await e.pollPromise}}async function Y(e,t,r){e.suppressDepth+=1;try{return await r()}finally{e.suppressDepth-=1,e.suppressDepth===0&&!e.closed&&D.get(t)!==e&&(e.closed=!0)}}function st(e){return{oldRecord:e.old_row_data,record:e.row_data,schema:e.schema_name,table:e.table_name,txid:String(e.txid),type:at(e.op)}}function at(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 it=10,Ee="127.0.0.1",Re=128*1024*1024,Se=["-c","shared_buffers=16MB","-c","temp_buffers=1MB","-c","work_mem=1MB","-c","maintenance_work_mem=16MB","-c","wal_buffers=1MB"],l={connectionLimit:it,connectTimeout:0,database:"template1",maxIdleConnectionLifetime:0,password:"postgres",poolTimeout:0,socketTimeout:0,sslMode:"disable",username:"postgres"},ct=`postgres://${l.username}:${l.password}@localhost`,V=new URLSearchParams({sslmode:l.sslMode}),he=new URLSearchParams({...Object.fromEntries(V.entries()),connection_limit:String(l.connectionLimit),connect_timeout:String(l.connectTimeout),max_idle_connection_lifetime:String(l.maxIdleConnectionLifetime),pool_timeout:String(l.poolTimeout),socket_timeout:String(l.socketTimeout)});async function _e(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 ${l.username} WITH LOGIN SUPERUSER PASSWORD '${l.password}'`):await e.exec(`CREATE ROLE ${l.username} WITH LOGIN SUPERUSER PASSWORD '${l.password}'`),await e.exec(`SET ROLE ${l.username}`)}async function lt(e,t){if(e==="shadow_database"&&!t.dryRun)return await Te(t);let r=e==="database"?t.databasePort:t.shadowDatabasePort;return t.dryRun?De(e,t,{db:null,port:r,server:null}):await Ae(e,t,{port:r,updateServerStatePort:!0})}async function Te(e,t=async()=>await Ae("shadow_database",e,{port:0,updateServerStatePort:!1})){let{debug:r}=e,o=null,n=null,a=!1,p=new Set,d=(0,G.createServer)(u),i=await dt(d,e.shadowDatabasePort);return e.shadowDatabasePort=i,r&&console.debug(`[shadow_database] lazy proxy listening on port ${i}`),{...l,attachWalEventBridge:()=>Promise.reject(new Error("WAL bridge is only available for the primary database server")),close:async()=>{a=!0;for(let c of p)c.destroy();p.clear();let s=[];try{await ut(d),r&&console.debug(`[shadow_database] lazy proxy stopped on port ${i}`)}catch(c){console.error("[shadow_database] lazy proxy stop error",c),s.push(c)}try{await n?.catch(()=>null),await o?.close()}catch(c){console.error("[shadow_database] backend close error",c),s.push(c)}if(s.length>0)throw new AggregateError(s,"Failed to close shadow_database properly")},connectionString:C(i,V),dump:async()=>{},getPrimaryKeyColumns:()=>Promise.reject(new Error("Primary key resolution is only available for the primary database server")),port:i,prismaORMConnectionString:C(i,he),terminalCommand:`PGPASSWORD=${l.password} PGSSLMODE=${l.sslMode} psql -h localhost -p ${i} -U ${l.username} -d ${l.database}`};function u(s){p.add(s);let c=()=>{p.delete(s)};s.once("close",c),s.once("error",c),s.pause(),f(s)}async function f(s){try{let c=await P();if(a){s.destroy();return}let g=(0,G.createConnection)({host:Ee,port:c.port});p.add(g);let Q=()=>{p.delete(g)};g.once("close",Q),g.once("error",Q),s.once("close",()=>g.destroy()),s.once("error",()=>g.destroy()),g.once("error",()=>s.destroy()),g.once("connect",()=>{r&&console.debug(`[shadow_database] proxying connection to lazy backend on port ${c.port}`),s.resume(),s.pipe(g),g.pipe(s)})}catch(c){r&&console.error("[shadow_database] failed to start lazy backend",c),s.destroy(c instanceof Error?c:void 0)}}async function P(){if(o)return o;if(a)throw new Error("shadow_database is closed");return n||(r&&console.debug("[shadow_database] starting lazy backend..."),n=t().then(s=>(o=s,r&&console.debug(`[shadow_database] lazy backend started on port ${s.port}`),s)).catch(s=>{throw n=null,s})),await n}}async function Ae(e,t,r){let{debug:o}=t,{port:n,updateServerStatePort:a}=r,d=await(e==="shadow_database"?mt:ve)(t.pgliteDataDirPath,o);o&&d.onNotification((s,c)=>{console.debug(`[${e}][${s}] ${c}`)});let{PGLiteSocketServer:i}=await import("@electric-sql/pglite-socket"),u=e==="shadow_database"?t.shadowDatabaseIdleTimeoutMillis:t.databaseIdleTimeoutMillis,f=new i({db:d,debug:o,idleTimeout:Number.isFinite(u)?u:0,inspect:o,maxConnections:l.connectionLimit,port:n});o&&(f.addEventListener("listening",s=>{let{detail:c}=s;console.debug(`[${e}] server listening on ${JSON.stringify(c)}`)}),f.addEventListener("connection",s=>{let{clientAddress:c,clientPort:g}=s.detail;console.debug(`[${e}] client connected from ${c}:${g}`)}),f.addEventListener("error",s=>{let{detail:c}=s;console.error(`[${e}] server error:`,c)}));try{await f.start()}catch(s){throw s instanceof Error&&"code"in s&&s.code==="EADDRINUSE"?new A(n):s}let P=Number(f.getServerConn().split(":").at(1));return a&&(t[e==="database"?"databasePort":"shadowDatabasePort"]=P),De(e,t,{db:d,port:P,server:f})}function De(e,t,r){let{debug:o}=t,{db:n,port:a,server:p}=r||{},d=new Map;return o&&console.debug(`[${e}] server started on port ${a}`),{...l,attachWalEventBridge:async()=>{if(e!=="database"||!n)throw new Error("WAL bridge is only available for the primary database server");return await I(n)},close:async()=>{let i=[];try{await p?.stop(),o&&console.debug(`[${e}] server stopped on port ${a}`)}catch(u){console.error(`[${e}] server stop error`,u),i.push(u)}if(e==="database"){try{n&&await fe(n),o&&console.debug(`[${e}] closed WAL bridge`)}catch(u){console.error(`[${e}] WAL bridge close error`,u),i.push(u)}try{await n?.syncToFs(),o&&console.debug(`[${e}] synced to filesystem`)}catch(u){console.error(`[${e}] sync error`,u),i.push(u)}}try{await n?.close(),o&&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:C(a,V),dump:async i=>{e==="shadow_database"||!n||await Le({db:n,debug:o,destinationPath:i})},getPrimaryKeyColumns:async(i,u)=>{if(e==="shadow_database"||!n)throw new Error("Primary key resolution is only available for the primary database server");let f=`${i}.${u}`,P=d.get(f);return P||(P=pt(n,i,u).catch(s=>{throw d.delete(f),s}),d.set(f,P)),await P},port:a,prismaORMConnectionString:C(a,he),terminalCommand:`PGPASSWORD=${l.password} PGSSLMODE=${l.sslMode} psql -h localhost -p ${a} -U ${l.username} -d ${l.database}`}}function C(e,t){return`${ct}:${e}/${l.database}?${t.toString()}`}async function ve(e,t){let{PGlite:r}=await import("@electric-sql/pglite"),o=await q(),n=e==="memory://"||!await re((0,ye.join)(e,"PG_VERSION")),a=await r.create({database:l.database,dataDir:e,debug:t?5:void 0,extensions:o.extensions,fsBundle:o.fsBundle,initialMemory:Re,loadDataDir:n?o.loadDataDir:void 0,relaxedDurability:!1,startParams:[...r.defaultStartParams,...Se],wasmModule:o.wasmModule});return await _e(a),a}async function dt(e,t){return await new Promise((r,o)=>{let n=d=>{if(p(),d.code==="EADDRINUSE"){o(new A(t));return}o(d)},a=()=>{let d=e.address();if(p(),!d||typeof d=="string"){o(new Error("Failed to determine TCP server port"));return}r(d.port)},p=()=>{e.off("error",n),e.off("listening",a)};e.once("error",n),e.once("listening",a),e.listen(t,Ee)})}async function ut(e){await new Promise((t,r)=>{e.close(o=>{let n=o;if(n&&n.code!=="ERR_SERVER_NOT_RUNNING"){r(n);return}t()})})}async function mt(e,t){let{PGlite:r}=await import("@electric-sql/pglite"),o=await q(),n=await r.create({database:l.database,dataDir:"memory://",debug:t?5:void 0,extensions:o.extensions,fsBundle:o.fsBundle,initialMemory:Re,loadDataDir:o.loadDataDir,relaxedDurability:!1,startParams:[...r.defaultStartParams,...Se],wasmModule:o.wasmModule});return await _e(n),n}async function pt(e,t,r){let{rows:o}=await e.query(`
|
|
85
85
|
SELECT attribute.attname AS column_name
|
|
86
86
|
FROM pg_constraint pk_constraint
|
|
87
87
|
INNER JOIN pg_class relation
|
|
@@ -94,7 +94,7 @@
|
|
|
94
94
|
ON attribute.attrelid = relation.oid
|
|
95
95
|
AND attribute.attnum = keys.attnum
|
|
96
96
|
WHERE pk_constraint.contype = 'p'
|
|
97
|
-
AND namespace.nspname = ${
|
|
98
|
-
AND relation.relname = ${
|
|
97
|
+
AND namespace.nspname = ${be(t)}
|
|
98
|
+
AND relation.relname = ${be(r)}
|
|
99
99
|
ORDER BY keys.ordinality
|
|
100
|
-
`);return
|
|
100
|
+
`);return o.map(n=>n.column_name)}function be(e){return`'${e.replaceAll("'","''")}'`}async function Le(e){let{dataDir:t,db:r,debug:o,destinationPath:n}=e,a=r||await ve(t,o),{pgDump:p}=await import("@electric-sql/pglite-tools/pg_dump"),d=await p({args:["--schema-only","--no-owner"],fileName:n?(0,we.filename)(n):void 0,pg:await a.clone()});return n?(o&&console.debug(`[DB] Dumping database to ${n}`),await oe(d,n)):(o&&console.debug("[DB] Dumping database to memory"),await d.text())}0&&(module.exports={attachWalEventBridge,dumpDB,shouldPollWalAfterMessages,shouldPollWalAfterResponse,startDBServer,startLazyShadowDBServer});
|
package/dist/db.d.cts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { PGlite } from '@electric-sql/pglite';
|
|
2
|
-
import { c as ServerState } from './state-
|
|
2
|
+
import { c as ServerState } from './state-CDXGsSbm.cjs';
|
|
3
3
|
import 'valibot';
|
|
4
4
|
|
|
5
5
|
interface WalEvent {
|
|
@@ -55,6 +55,9 @@ interface DBDump {
|
|
|
55
55
|
}
|
|
56
56
|
type DBServerPurpose = "database" | "shadow_database";
|
|
57
57
|
declare function startDBServer(purpose: DBServerPurpose, serverState: ServerState): Promise<DBServer>;
|
|
58
|
+
declare function startLazyShadowDBServer(serverState: Pick<ServerState, "debug" | "shadowDatabasePort" | "shadowDatabaseIdleTimeoutMillis"> & {
|
|
59
|
+
pgliteDataDirPath?: string;
|
|
60
|
+
}, startBackend?: () => Promise<DBServer>): Promise<DBServer>;
|
|
58
61
|
type DumpDBOptions<D extends string> = {
|
|
59
62
|
dataDir: string;
|
|
60
63
|
db?: never;
|
|
@@ -68,4 +71,4 @@ type DumpDBOptions<D extends string> = {
|
|
|
68
71
|
};
|
|
69
72
|
declare function dumpDB<D extends string = never>(options: DumpDBOptions<D>): Promise<[D] extends [never] ? string : void>;
|
|
70
73
|
|
|
71
|
-
export { type DBDump, type DBServer, type DBServerPurpose, type DumpDBOptions, type WalEvent, type WalEventBridge, attachWalEventBridge, dumpDB, shouldPollWalAfterMessages, shouldPollWalAfterResponse, startDBServer };
|
|
74
|
+
export { type DBDump, type DBServer, type DBServerPurpose, type DumpDBOptions, type WalEvent, type WalEventBridge, attachWalEventBridge, dumpDB, shouldPollWalAfterMessages, shouldPollWalAfterResponse, startDBServer, startLazyShadowDBServer };
|
package/dist/db.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { PGlite } from '@electric-sql/pglite';
|
|
2
|
-
import { c as ServerState } from './state-
|
|
2
|
+
import { c as ServerState } from './state-CDXGsSbm.js';
|
|
3
3
|
import 'valibot';
|
|
4
4
|
|
|
5
5
|
interface WalEvent {
|
|
@@ -55,6 +55,9 @@ interface DBDump {
|
|
|
55
55
|
}
|
|
56
56
|
type DBServerPurpose = "database" | "shadow_database";
|
|
57
57
|
declare function startDBServer(purpose: DBServerPurpose, serverState: ServerState): Promise<DBServer>;
|
|
58
|
+
declare function startLazyShadowDBServer(serverState: Pick<ServerState, "debug" | "shadowDatabasePort" | "shadowDatabaseIdleTimeoutMillis"> & {
|
|
59
|
+
pgliteDataDirPath?: string;
|
|
60
|
+
}, startBackend?: () => Promise<DBServer>): Promise<DBServer>;
|
|
58
61
|
type DumpDBOptions<D extends string> = {
|
|
59
62
|
dataDir: string;
|
|
60
63
|
db?: never;
|
|
@@ -68,4 +71,4 @@ type DumpDBOptions<D extends string> = {
|
|
|
68
71
|
};
|
|
69
72
|
declare function dumpDB<D extends string = never>(options: DumpDBOptions<D>): Promise<[D] extends [never] ? string : void>;
|
|
70
73
|
|
|
71
|
-
export { type DBDump, type DBServer, type DBServerPurpose, type DumpDBOptions, type WalEvent, type WalEventBridge, attachWalEventBridge, dumpDB, shouldPollWalAfterMessages, shouldPollWalAfterResponse, startDBServer };
|
|
74
|
+
export { type DBDump, type DBServer, type DBServerPurpose, type DumpDBOptions, type WalEvent, type WalEventBridge, attachWalEventBridge, dumpDB, shouldPollWalAfterMessages, shouldPollWalAfterResponse, startDBServer, startLazyShadowDBServer };
|
package/dist/db.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a,b,c,d,e}from"./chunk-
|
|
1
|
+
import{a,b,c,d,e,f}from"./chunk-PGJI3PZW.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};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import{a as E}from"./chunk-HQMJSXYT.js";import{b as f,d as w,e as y}from"./chunk-DWY47FQV.js";import{spawn as k}from"child_process";import{once as v}from"events";import{mkdir as T}from"fs/promises";import{join as $}from"path";import{setTimeout as x}from"timers/promises";import{process as C}from"std-env";var{PRISMA_DEV_FORCE_ENGINE_BINARY_DOWNLOAD:O,PRISMA_DEV_FORCE_ENGINE_BINARY_PATH:H,PRISMA_DEV_FORCE_NETWORK_DELAY_MS:b}=C.env,P=class o{static#t=new Map;#e;#n;constructor(e){this.#e=e,this.#n=null}static async get(e){let{debug:n}=e,i=`${e.schemaHash}:${e.clientVersion}`;try{let t=o.#t.get(i);if(t)return t;let s=new o(e);return o.#t.set(i,s),n&&console.debug("[Query Engine] starting...",e),await s.start(),n&&console.debug("[Query Engine] started!"),s}finally{o.stopAll(i)}}static async stopAll(e){let i=(await Promise.allSettled(Array.from(o.#t.entries()).filter(([t])=>t!==e).map(async([t,s])=>{try{await s.stop()}finally{o.#t.delete(t)}}))).filter(t=>t.status==="rejected").map(t=>t.reason);if(i.length>0)throw new AggregateError(i,"Failed to stop engines")}async commitTransaction(e,n){return await this.#s(e,n,"commit")}async request(e,n){let{url:i}=await this.start(),t=this.#i(n),s=await fetch(i,{body:typeof e=="string"?e:JSON.stringify(e),headers:{...t,"Content-Type":"application/json"},method:"POST"});if(!s.ok)throw await l.fromResponse(s);return await s.text()}async rollbackTransaction(e,n){return await this.#s(e,n,"rollback")}async startTransaction(e,n){let{url:i}=await this.start(),t=this.#i(n),s=await fetch(`${i}/transaction/start`,{body:JSON.stringify(e),headers:{...t,"Content-Type":"application/json"},method:"POST"});if(!s.ok)throw await l.fromResponse(s);return await s.json()}async start(){if(this.#n!=null)return await this.#n;let{promise:e,reject:n,resolve:i}=E();this.#n=e;let t=H||await this.#r();this.#e.debug&&console.debug("[Query Engine] spinning up at path...",t);let{proxySignals:s}=await import("foreground-child/proxy-signals"),r=k(t,["--enable-raw-queries","--enable-telemetry-in-response","--port","0"],{env:{LOG_QUERIES:"y",PRISMA_DML:this.#e.base64Schema,QE_LOG_LEVEL:"TRACE",RUST_BACKTRACE:"1",RUST_LOG:"info"},stdio:["ignore","pipe","pipe"],windowsHide:!0});s(r),r.stderr.setEncoding("utf8"),r.stdout.setEncoding("utf8");let c=a=>{let d=a.split(`
|
|
2
|
+
`).find(S=>S.includes("Started query engine http server"));if(!d)return;r.stdout.removeListener("data",c);let{fields:p}=JSON.parse(d);if(p==null)return n(new Error(`Unexpected data during initialization, "fields" are missing: ${a}`));let{ip:m,port:h}=p;if(m==null||h==null)return n(new Error(`This version of query-engine is not compatible with minippg, "ip" and "port" are missing in the startup log entry.
|
|
3
|
+
Received data: ${a}`));i({childProcess:r,url:`http://${m}:${h}`})},R=a=>{this.#n=null,n(new g(String(a))),r.removeListener("exit",u),r.kill()};r.once("error",R);let u=(a,d)=>{this.#n=null,n(new g(`Query Engine exited with code ${a} and signal ${d}`))};return r.once("exit",u),r.stdout.on("data",c),this.#e.debug&&(r.stderr.on("data",console.error.bind(console,"[Query Engine]")),r.stdout.on("data",console.debug.bind(console,"[Query Engine]"))),await this.#n}async stop(){if(this.#n==null)return;let{childProcess:e}=await this.#n;e.exitCode==null&&e.signalCode==null&&(this.#n=null,e.kill(),await v(e,"exit"))}async#r(){this.#e.debug&&console.debug("[Query Engine] getting engine commit hash...");let e=await this.#o();this.#e.debug&&console.debug("[Query Engine] got engine commit hash",e);let n=f(this.#e.clientVersion,e);this.#e.debug&&console.debug("[Query Engine] cache directory path",n),await T(n,{recursive:!0});let{binaryTarget:i}=this.#e.platform,t=i==="windows"?".exe":"",s=$(n,`query-engine-${i}${t}`);return this.#e.debug&&console.debug("[Query Engine] binary path",s),(O==="1"||await w(s)===!1)&&await this.#a({commitHash:e,extension:t,engineBinaryPath:s}),s}async#o(){let e=await fetch(`https://registry.npmjs.org/@prisma/client/${this.#e.clientVersion}`);if(!e.ok)throw new Error(`Couldn't fetch package.json from npm registry, status code: ${e.status}`);let i=(await e.json()).devDependencies?.["@prisma/engines-version"];if(!i)throw new Error("Couldn't find engines version in package.json");let t=i.split(".").at(-1);if(!t)throw new Error("Couldn't find commit hash in engines version");return t}async#a(e){let{commitHash:n,extension:i,engineBinaryPath:t}=e,{binaryTarget:s}=this.#e.platform,r=`https://binaries.prisma.sh/all_commits/${n}/${s}/query-engine${i}.gz`;this.#e.debug&&console.debug("[Query Engine] downloading engine from url",r);let c=await fetch(r);if(!c.ok)throw new Error(`Couldn't download engine. URL: ${r}, status code: ${c.status}`);b&&await x(Number(b)),await y(await c.arrayBuffer(),t),this.#e.debug&&console.debug("[Query Engine] downloaded and saved at",t)}#i(e){let n={};for(let[i,t]of Object.entries(e))t!=null&&(n[i]=t);return n}async#s(e,n,i){let{url:t}=await this.#n,s=this.#i(n),r=await fetch(`${t}/transaction/${e}/${i}`,{headers:{...s,"Content-Type":"application/json"},method:"POST"});if(!r.ok)throw await l.fromResponse(r);try{return await r.json()}catch{return{}}}};function M(o,e){return console.error(o),o instanceof g?e.json({EngineNotStarted:{reason:{EngineStartupError:{logs:[],msg:o.message}}}},500):o instanceof l?e.text(o.responseBody,o.statusCode):e.body(null,500)}var g=class extends Error{name="EngineStartError"},l=class o extends Error{constructor(n,i,t){super(`${n}: Query Engine response status ${i}, body: ${t}`);this.action=n;this.statusCode=i;this.responseBody=t}name="EngineHttpError";static async fromResponse(n){let i=new URL(n.url),t=await n.text();return new o(i.pathname,n.status,t)}};export{P as Engine,M as handleEngineError};
|