@prisma/dev
Version:
A local Prisma Postgres server for development and testing
9 lines (8 loc) • 31.2 kB
JavaScript
;var xt=Object.create;var K=Object.defineProperty;var _t=Object.getOwnPropertyDescriptor;var $t=Object.getOwnPropertyNames;var kt=Object.getPrototypeOf,It=Object.prototype.hasOwnProperty;var D=(t,e)=>()=>(t&&(e=t(t=0)),e);var ne=(t,e)=>{for(var r in e)K(t,r,{get:e[r],enumerable:!0})},Re=(t,e,r,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of $t(e))!It.call(t,n)&&n!==r&&K(t,n,{get:()=>e[n],enumerable:!(o=_t(e,n))||o.enumerable});return t};var w=(t,e,r)=>(r=t!=null?xt(kt(t)):{},Re(e||!t||!t.__esModule?K(r,"default",{value:t,enumerable:!0}):r,t)),Ct=t=>Re(K({},"__esModule",{value:!0}),t);var p=D(()=>{"use strict"});function Ae(t){return Buffer.from(JSON.stringify(Object.fromEntries(Object.entries(t).sort(([[e],[r]])=>e.localeCompare(r)))),"utf8").toString("base64url")}function Ht(t){let e=Buffer.from(t,"base64url").toString("utf8"),{issues:r,output:o,success:n}=(0,f.safeParse)(Bt,e,{abortEarly:!0});return n?[null,o]:[r]}var f,Te,Bt,$,se=D(()=>{"use strict";p();f=require("valibot"),Te=/^(postgres|postgresql):\/\//,Bt=(0,f.pipe)((0,f.string)(),(0,f.parseJson)(),(0,f.object)({databaseUrl:(0,f.pipe)((0,f.string)(),(0,f.url)(),(0,f.regex)(Te)),name:(0,f.optional)((0,f.pipe)((0,f.string)(),(0,f.minLength)(1))),shadowDatabaseUrl:(0,f.pipe)((0,f.string)(),(0,f.url)(),(0,f.regex)(Te))}));$=async(t,e)=>{let{authorization:r}=t,{HTTPException:o}=await import("hono/http-exception");if(!r)throw new o(401,{message:"Missing API Key"});let[n,s="",a]=r.split(" ");if(n!=="Bearer"||a)throw new o(401,{message:"Invalid API Key"});let[c,i]=Ht(s);if(c)throw new o(401,{message:"Invalid API Key",cause:c.join(", ")});let{databaseUrl:u,name:l,shadowDatabaseUrl:g}=i,{name:y}=e.get("serverState");if(!l)throw new o(401,{message:`Wrong API Key; The Prisma Dev server running at port ${e.get("port")} requires an API Key from a newer version of \`prisma dev\`. Check the "${y}" server's output for the updated \`DATABASE_URL\` value.`});if(l!==y)throw new o(401,{message:`Wrong API Key; The Prisma Dev server running at port ${e.get("port")} is named "${y}", but the API Key is for "${l}"`});let{hostname:_,port:V}=new URL(u),{port:oe}=e.get("db"),{hostname:Rt,port:Tt}=new URL(g),At=e.get("shadowDBPort");if(_!=="localhost"||Number(V)!==oe||Rt!=="localhost"||Number(Tt)!==At)throw new o(401,{message:"Wrong API Key; Check your Prisma schema's `provider.url` value (probably defined in `.env`'s `DATABASE_URL` environment variable) is aligned with `prisma dev`'s output"});return{decodedAPIKey:i}}});function ce(t,{suffix:e="nodejs"}={}){if(typeof t!="string")throw new TypeError(`Expected a string, got ${typeof t}`);return e&&(t+=`-${e}`),G.default.platform==="darwin"?Lt(t):G.default.platform==="win32"?jt(t):Mt(t)}var h,ae,G,R,ie,k,Lt,jt,Mt,xe=D(()=>{"use strict";p();h=w(require("path"),1),ae=w(require("os"),1),G=w(require("process"),1),R=ae.default.homedir(),ie=ae.default.tmpdir(),{env:k}=G.default,Lt=t=>{let e=h.default.join(R,"Library");return{data:h.default.join(e,"Application Support",t),config:h.default.join(e,"Preferences",t),cache:h.default.join(e,"Caches",t),log:h.default.join(e,"Logs",t),temp:h.default.join(ie,t)}},jt=t=>{let e=k.APPDATA||h.default.join(R,"AppData","Roaming"),r=k.LOCALAPPDATA||h.default.join(R,"AppData","Local");return{data:h.default.join(r,t,"Data"),config:h.default.join(e,t,"Config"),cache:h.default.join(r,t,"Cache"),log:h.default.join(r,t,"Log"),temp:h.default.join(ie,t)}},Mt=t=>{let e=h.default.basename(R);return{data:h.default.join(k.XDG_DATA_HOME||h.default.join(R,".local","share"),t),config:h.default.join(k.XDG_CONFIG_HOME||h.default.join(R,".config"),t),cache:h.default.join(k.XDG_CACHE_HOME||h.default.join(R,".cache"),t),log:h.default.join(k.XDG_STATE_HOME||h.default.join(R,".local","state"),t),temp:h.default.join(ie,e,t)}}});function Ie(t,e){return`${ke.cache}/engine/${t}/${e}`}function M(t){return`${ke.data}/${t}`}async function Ce(t){try{return await(0,v.access)(t,v.constants.F_OK),!0}catch(e){if(de(e))return!1;throw e}}async function Be(t,e){let r=await Ut(t);await(0,v.writeFile)(e,r),await(0,v.chmod)(e,"755")}async function He(t,e){await t.stream().pipeTo(J.WriteStream.toWeb((0,J.createWriteStream)(e,{encoding:"utf-8"})))}function de(t){return t!=null&&typeof t=="object"&&"code"in t&&t.code==="ENOENT"}async function Le(t){try{return await(0,v.readFile)(t,{encoding:"utf-8"})}catch(e){if(de(e))return null;throw e}}async function je(t){await(0,v.mkdir)(t,{recursive:!0})}async function Me(t){try{return(await(0,v.readdir)(t,{withFileTypes:!0})).reduce((r,o)=>(o.isDirectory()&&!o.name.startsWith(".")&&r.push(o.name),r),[])}catch(e){if(de(e))return[];throw e}}var J,v,_e,$e,ke,Ut,Q=D(()=>{"use strict";p();J=require("fs"),v=require("fs/promises"),_e=require("util"),$e=require("zlib");xe();ke=ce("prisma-dev"),Ut=(0,_e.promisify)($e.unzip)});function X(t){let e,r,o=new Promise((a,c)=>{e=a,r=c}),n=a=>{n=s=null,r(a),t?.onRejected?.(a),t?.onFulfilled?.()},s=a=>{s=n=null,e(a),t?.onResolved?.(a),t?.onFulfilled?.()};return{isFulfilled:()=>s===n,promise:o,reject:a=>n?.(a),resolve:a=>s?.(a)}}var me=D(()=>{"use strict";p()});function Y(t,e){return console.error(t),t instanceof U?e.json({EngineNotStarted:{reason:{EngineStartupError:{logs:[],msg:t.message}}}},500):t instanceof H?e.text(t.responseBody,t.statusCode):e.body(null,500)}var Qe,We,ze,Xe,Ye,Ze,Wt,zt,Je,L,U,H,fe=D(()=>{"use strict";p();Qe=require("child_process"),We=require("events"),ze=require("fs/promises"),Xe=require("path"),Ye=require("timers/promises");me();Ze=require("std-env");Q();({PRISMA_DEV_FORCE_ENGINE_BINARY_DOWNLOAD:Wt,PRISMA_DEV_FORCE_ENGINE_BINARY_PATH:zt,PRISMA_DEV_FORCE_NETWORK_DELAY_MS:Je}=Ze.process.env),L=class t{static#r=new Map;#e;#t;constructor(e){this.#e=e,this.#t=null}static async get(e){let{debug:r}=e,o=`${e.schemaHash}:${e.clientVersion}`;try{let n=t.#r.get(o);if(n)return n;let s=new t(e);return t.#r.set(o,s),r&&console.debug("[Query Engine] starting...",e),await s.start(),r&&console.debug("[Query Engine] started!"),s}finally{t.stopAll(o)}}static async stopAll(e){let o=(await Promise.allSettled(Array.from(t.#r.entries()).filter(([n])=>n!==e).map(async([n,s])=>{try{await s.stop()}finally{t.#r.delete(n)}}))).filter(n=>n.status==="rejected").map(n=>n.reason);if(o.length>0)throw new AggregateError(o,"Failed to stop engines")}async commitTransaction(e,r){return await this.#i(e,r,"commit")}async request(e,r){let{url:o}=await this.start(),n=this.#a(r),s=await fetch(o,{body:typeof e=="string"?e:JSON.stringify(e),headers:{...n,"Content-Type":"application/json"},method:"POST"});if(!s.ok)throw await H.fromResponse(s);return await s.text()}async rollbackTransaction(e,r){return await this.#i(e,r,"rollback")}async startTransaction(e,r){let{url:o}=await this.start(),n=this.#a(r),s=await fetch(`${o}/transaction/start`,{body:JSON.stringify(e),headers:{...n,"Content-Type":"application/json"},method:"POST"});if(!s.ok)throw await H.fromResponse(s);return await s.json()}async start(){if(this.#t!=null)return await this.#t;let{promise:e,reject:r,resolve:o}=X();this.#t=e;let n=zt||await this.#s();this.#e.debug&&console.debug("[Query Engine] spinning up at path...",n);let{proxySignals:s}=await import("foreground-child/proxy-signals"),a=(0,Qe.spawn)(n,["--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(a),a.stderr.setEncoding("utf8"),a.stdout.setEncoding("utf8");let c=l=>{let g=l.split(`
`).find(oe=>oe.includes("Started query engine http server"));if(!g)return;a.stdout.removeListener("data",c);let{fields:y}=JSON.parse(g);if(y==null)return r(new Error(`Unexpected data during initialization, "fields" are missing: ${l}`));let{ip:_,port:V}=y;if(_==null||V==null)return r(new Error(`This version of query-engine is not compatible with minippg, "ip" and "port" are missing in the startup log entry.
Received data: ${l}`));o({childProcess:a,url:`http://${_}:${V}`})},i=l=>{this.#t=null,r(new U(String(l))),a.removeListener("exit",u),a.kill()};a.once("error",i);let u=(l,g)=>{this.#t=null,r(new U(`Query Engine exited with code ${l} and signal ${g}`))};return a.once("exit",u),a.stdout.on("data",c),this.#e.debug&&(a.stderr.on("data",console.error.bind(console,"[Query Engine]")),a.stdout.on("data",console.debug.bind(console,"[Query Engine]"))),await this.#t}async stop(){if(this.#t==null)return;let{childProcess:e}=await this.#t;e.exitCode==null&&e.signalCode==null&&(this.#t=null,e.kill(),await(0,We.once)(e,"exit"))}async#s(){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 r=Ie(this.#e.clientVersion,e);this.#e.debug&&console.debug("[Query Engine] cache directory path",r),await(0,ze.mkdir)(r,{recursive:!0});let{platform:o}=this.#e.platform,n=o==="windows"?".exe":"",s=(0,Xe.join)(r,`query-engine-${o}${n}`);return this.#e.debug&&console.debug("[Query Engine] binary path",s),(Wt==="1"||await Ce(s)===!1)&&await this.#n({commitHash:e,extension:n,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 o=(await e.json()).devDependencies?.["@prisma/engines-version"];if(!o)throw new Error("Couldn't find engines version in package.json");let n=o.split(".").at(-1);if(!n)throw new Error("Couldn't find commit hash in engines version");return n}async#n(e){let{commitHash:r,extension:o,engineBinaryPath:n}=e,{binaryTarget:s}=this.#e.platform,a=`https://binaries.prisma.sh/all_commits/${r}/${s}/query-engine${o}.gz`;this.#e.debug&&console.debug("[Query Engine] downloading engine from url",a);let c=await fetch(a);if(!c.ok)throw new Error(`Couldn't download engine. URL: ${a}, status code: ${c.status}`);Je&&await(0,Ye.setTimeout)(Number(Je)),await Be(await c.arrayBuffer(),n),this.#e.debug&&console.debug("[Query Engine] downloaded and saved at",n)}#a(e){let r={};for(let[o,n]of Object.entries(e))n!=null&&(r[o]=n);return r}async#i(e,r,o){let{url:n}=await this.#t,s=this.#a(r),a=await fetch(`${n}/transaction/${e}/${o}`,{headers:{...s,"Content-Type":"application/json"},method:"POST"});if(!a.ok)throw await H.fromResponse(a);try{return await a.json()}catch{return{}}}};U=class extends Error{name="EngineStartError"},H=class t extends Error{constructor(r,o,n){super(`${r}: Query Engine response status ${o}, body: ${n}`);this.action=r;this.statusCode=o;this.responseBody=n}name="EngineHttpError";static async fromResponse(r){let o=new URL(r.url),n=await r.text();return new t(o.pathname,r.status,n)}}});async function et(t){let{output:e,success:r}=(0,S.safeParse)(Xt,await t.req.json(),{abortEarly:!0});return r?e:t.text("Invalid input",400)}var S,Xt,tt=D(()=>{"use strict";p();S=require("valibot"),Xt=(0,S.object)({tags:(0,S.union)([(0,S.pipe)((0,S.array)((0,S.string)()),(0,S.minLength)(1)),(0,S.literal)("all")])})});async function ge(t){let r=new TextEncoder().encode(t),o=await crypto.subtle.digest("SHA-256",r);return Array.from(new Uint8Array(o)).map(a=>a.toString(16).padStart(2,"0")).join("")}function rt(t){let e=t.req.param("schemaHash"),r=Z.get(e);return r==null?t.json({EngineNotStarted:{reason:"SchemaMissing"}},404):{schemaHash:e,schemas:r}}async function ot(t,e){let r=he.Buffer.from(t,"base64").toString("utf8"),o=`datasource db {
provider = "postgresql"
url = "${e.toString()}"
}`,n=r.replace(Yt,o),s=await ge(n);return{base64Override:he.Buffer.from(n,"utf8").toString("base64"),overrideHash:s}}var he,Z,Yt,nt=D(()=>{"use strict";p();he=require("buffer"),Z=new Map;Yt=/datasource\s+db\s+\{\s*provider\s*=\s*"postgres(!?ql)?"\s+url\s*=\s*.+\s*\}/});function ee(t){let{req:e}=t;return{traceparent:e.header("traceparent"),"X-capture-telemetry":e.header("X-capture-telemetry")}}var st=D(()=>{"use strict";p()});async function at(t){let{issues:e,output:r,success:o}=(0,m.safeParse)(Zt,await t.req.json(),{abortEarly:!0});return o?r:t.json({EngineNotStarted:{reason:"InvalidRequest",issues:e}},400)}function it(t,e){let{output:r,success:o}=(0,m.safeParse)(er,t);return o?r:e.json({EngineMalfunction:{}},500)}var m,Zt,er,ct=D(()=>{"use strict";p();m=require("valibot"),Zt=(0,m.object)({isolation_level:(0,m.optional)((0,m.string)()),max_wait:(0,m.pipe)((0,m.number)(),(0,m.integer)(),(0,m.minValue)(0)),timeout:(0,m.pipe)((0,m.number)(),(0,m.integer)(),(0,m.minValue)(0))});er=(0,m.looseObject)({id:(0,m.union)([(0,m.string)(),(0,m.number)()])})});var ut={};ne(ut,{accelerateRoute:()=>te});async function ye(t){let{req:e}=t,r=rt(t);if(r instanceof Response)return r;let{base64Override:o,overrideHash:n}=r.schemas;return await L.get({base64Schema:o,clientVersion:process.env.PRISMA_DEV_FORCE_CLIENT_VERSION||e.param("clientVersion"),debug:t.get("debug"),platform:t.get("platform"),schemaHash:n})}var dt,j,te,tr,N,rr,lt=D(()=>{"use strict";p();dt=require("hono/tiny"),j=require("hono/validator");se();tt();fe();nt();st();ct();te=new dt.Hono;te.post("/invalidate",(0,j.validator)("header",$),async t=>{let e=await et(t);return e instanceof Response?e:t.body(null)});tr="/:clientVersion/:schemaHash",N=te.basePath(tr);te.route("/",N);rr=["/graphql","/itx/:transactionId/graphql"];N.on("POST",[...rr],(0,j.validator)("header",$),async t=>{let{req:e}=t;try{let r=await ye(t);if(r instanceof Response)return r;let o=await e.text(),n=e.param("transactionId"),s=await r.request(o,{...ee(t),"X-transaction-id":n});return t.text(s)}catch(r){return Y(r,t)}});N.basePath("/itx/:transactionId").on("POST",["/commit","/rollback"],(0,j.validator)("header",$),async t=>{let{req:e}=t;try{let r=await ye(t);if(r instanceof Response)return r;let n=`${e.routePath.split("/").filter(Boolean).at(-1)}Transaction`,s=e.param("transactionId"),a=await r[n](s,ee(t));return t.json(a)}catch(r){return Y(r,t)}});N.put("/schema",(0,j.validator)("header",$),async t=>{let{req:e}=t,r=await e.text();if(!r)return t.text("Missing schema",400);let o=e.param("schemaHash"),n=Z.get(o);if(n==null){if(o!==await ge(r))return t.text("Schema hash mismatch",400);let s=await ot(r,t.get("db").prismaORMConnectionString);return Z.set(o,{base64Original:r,...s}),t.text(o)}return r!==n.base64Original?t.text("Schema mismatch",400):t.text(o)});N.post("/transaction/start",(0,j.validator)("header",$),async t=>{let{req:e}=t,r=await at(t);if(r instanceof Response)return r;try{let o=await ye(t);if(o instanceof Response)return o;let n=await o.startTransaction(r,ee(t)),s=it(n,t);if(s instanceof Response)return s;let{id:a}=s,c=e.param("clientVersion"),i=t.get("port"),u=t.get("protocol"),l=e.param("schemaHash");return t.json({...n,"data-proxy":{endpoint:`${u}://localhost:${i}/${c}/${l}/itx/${a}`}})}catch(o){return Y(o,t)}})});var ft={};ne(ft,{utilityRoute:()=>be});var pt,mt,be,Gr,ht=D(()=>{"use strict";p();pt=require("hono/tiny"),mt=require("http-status-codes"),be=new pt.Hono;be.post("/database/dump",async t=>{let e=t.get("db"),r=t.get("serverState");return await e.dump(r.databaseDumpPath),t.json({dumpPath:r.databaseDumpPath},mt.StatusCodes.CREATED)});Gr=be.get("/health",t=>t.json({name:t.get("serverState").name}))});var cr={};ne(cr,{DEFAULT_DATABASE_PORT:()=>I,DEFAULT_SERVER_PORT:()=>C,DEFAULT_SHADOW_DATABASE_PORT:()=>B,PortNotAvailableError:()=>E,ServerAlreadyRunningError:()=>q,unstable_startServer:()=>ir});module.exports=Ct(cr);p();se();p();var Ve=require("pathe/utils");Q();p();var A=require("get-port-please"),z=require("remeda"),I=51214,C=51213,B=51215,W=65535,T=-1/0;async function Ne(t){let{debug:e,name:r,requestedPorts:o,servers:n}=t,{portsUsedByOtherServers:s,portsUsedByThisServerLastTime:a}=qt(r,n);e&&(console.debug(`ports used by other servers: ${Object.keys(s).join(", ")}`),console.debug(`ports used by "${r}" server last time: ${JSON.stringify(a)}`));let c={databasePort:T,port:T,shadowDatabasePort:T},i=["port","databasePort","shadowDatabasePort"];for(let u of i){let l=await Nt({debug:e,portKey:u,portsUsedByOtherServers:s,portsUsedByThisServerLastTime:a,requestedPorts:o})??await Ft({debug:e,pickedPorts:c,portKey:u,portsUsedByOtherServers:s,portsUsedByThisServerLastTime:a});e&&console.debug(`Got port for "${u}": ${l}`),c[u]=l}return e&&console.debug(`Picked ports: ${JSON.stringify(c)}`),c}async function Nt(t){let{debug:e,portKey:r,portsUsedByOtherServers:o,portsUsedByThisServerLastTime:n,requestedPorts:s}=t,{[r]:a,...c}=s;if(Ue(a))return await Vt({debug:e,otherRequestedPorts:c,portKey:r,portsUsedByOtherServers:o,requestedPort:a}),a;let i=n?.[r]??T;if(!Ue(i))return e&&console.debug(`No port specified for "${r}". Trying to pick a new port.`),null;let u=i in o;return u||Object.values(c).includes(i)?(e&&console.debug(`Port ${i} that was used last time for this server, ${u?"is also used by another server":"has been requested for another service"}. Trying to pick a new port.`),null):await(0,A.checkPort)(i)===!1?(e&&console.debug(`Port ${i}, that was used last time for this server, is not available. Trying to pick a new port.`),null):(e&&console.debug(`Using port ${i} for "${r}" as it was used last time and is available.`),i)}async function Ft(t){let{debug:e,pickedPorts:r,portKey:o,portsUsedByOtherServers:n,portsUsedByThisServerLastTime:s}=t,a=Math.max(I,C,B)+1,c=[...Object.values(r),...Object.keys(n).map(Number),...Object.values(s||{})],i=Math.min(Math.max(a,...c)+100,W),u=(0,z.difference)((0,z.range)(a,i),c),l={port:C,databasePort:I,shadowDatabasePort:B}[o];try{return await(0,A.getPort)({port:l in n||Object.values(r).includes(l)||Object.values(s||{}).includes(l)?void 0:l,ports:u})}catch(g){if(g instanceof Error&&g.name==="GetPortError"&&i+1<=W)return e&&console.debug(`Expanding port lookup to range [${i+1}, ${W}].`),await(0,A.getPort)({portRange:[i+1,W]});throw g}}function Ue(t){return t>=0}function qt(t,e){let r={},o;for(let n of e){let{databasePort:s,port:a,shadowDatabasePort:c}=n;if(n.name===t){o={databasePort:s,port:a,shadowDatabasePort:c};continue}r[s]=!0,r[a]=!0,r[c]=!0}return{portsUsedByOtherServers:r,portsUsedByThisServerLastTime:o}}async function Vt(t){let{debug:e,otherRequestedPorts:r,portKey:o,portsUsedByOtherServers:n,requestedPort:s}=t;if(s in n)throw e&&console.error(`Port ${s} was requested for "${o}", but is already used by another server.`),new le(s);if(Object.values(r).includes(s))throw e&&console.error(`Port ${s} was requested for "${o}", but also for another key.`),new ue(s);if((0,A.isUnsafePort)(s))throw e&&console.error(`Port ${s} was requested for "${o}", but is unsafe.`),new E(s);if(await(0,A.checkPort)(s)===!1)throw e&&console.error(`Port ${s} was requested for "${o}", but is not available.`),new E(s)}var E=class extends Error{constructor(r){super(`Port \`${r}\` is not available.`);this.port=r}name="PortNotAvailableError"},ue=class extends Error{constructor(r){super(`Port number \`${r}\` was requested twice. Please choose a different port for each service.`);this.port=r}name="PortRequestedTwiceError"},le=class extends Error{constructor(r){super(`Port number \`${r}\` belongs to another Prisma Dev server. Please choose a different port.`);this.port=r}name="PortBelongsToAnotherServerError"};var b={connectionLimit:1,connectTimeout:0,database:"template1",maxIdleConnectionLifetime:0,password:"postgres",poolTimeout:0,socketTimeout:0,sslMode:"disable",username:"postgres"},Kt=`postgres://${b.username}:${b.password}@localhost`,Ke=new URLSearchParams({sslmode:b.sslMode}),Gt=new URLSearchParams({...Object.fromEntries(Ke.entries()),connection_limit:String(b.connectionLimit),connect_timeout:String(b.connectTimeout),max_idle_connection_lifetime:String(b.maxIdleConnectionLifetime),pool_timeout:String(b.poolTimeout),single_use_connections:"true",socket_timeout:String(b.socketTimeout)});async function pe(t,e){let r=t==="database"?e.databasePort:e.shadowDatabasePort;if(e.dryRun)return Fe(t,e,{db:null,port:r,server:null});let{debug:o}=e,s=await(t==="shadow_database"?Jt:Ge)(e.pgliteDataDirPath,o);o&&s.onNotification((i,u)=>{console.debug(`[${t}][${i}] ${u}`)});let{PGLiteSocketServer:a}=await import("@electric-sql/pglite-socket"),c=new a({db:s,debug:o,inspect:o,port:r});o&&(c.addEventListener("listening",i=>{let{detail:u}=i;console.debug(`[${t}] server listening on ${JSON.stringify(u)}`)}),c.addEventListener("connection",i=>{let{clientAddress:u,clientPort:l}=i.detail;console.debug(`[${t}] client connected from ${u}:${l}`)}),c.addEventListener("error",i=>{let{detail:u}=i;console.error(`[${t}] server error:`,u)}));try{await c.start()}catch(i){throw i instanceof Error&&"code"in i&&i.code==="EADDRINUSE"?new E(r):i}return Fe(t,e,{db:s,port:r,server:c})}function Fe(t,e,r){let{debug:o}=e,{db:n,port:s,server:a}=r||{};return o&&console.debug(`[${t}] server started on port ${s}`),{...b,close:async()=>{let c=[];try{await a?.stop(),o&&console.debug(`[${t}] server stopped on port ${s}`)}catch(i){console.error(`[${t}] server stop error`,i),c.push(i)}if(t==="database")try{await n?.syncToFs(),o&&console.debug(`[${t}] synced to filesystem`)}catch(i){console.error(`[${t}] sync error`,i),c.push(i)}try{await n?.close(),o&&console.debug(`[${t}] closed`)}catch(i){console.error(`[${t}] close error`,i),c.push(i)}if(c.length>0)throw new AggregateError(c,`Failed to close ${t} properly`)},connectionString:qe(s,Ke),dump:async c=>{t==="shadow_database"||!n||await Qt({db:n,debug:o,destinationPath:c})},port:s,prismaORMConnectionString:qe(s,Gt),terminalCommand:`PGPASSWORD=${b.password} PGSSLMODE=${b.sslMode} psql -h localhost -p ${s} -U ${b.username} -d ${b.database}`}}function qe(t,e){return`${Kt}:${t}/${b.database}?${e.toString()}`}async function Ge(t,e){let{PGlite:r}=await import("@electric-sql/pglite");return await r.create({database:b.database,dataDir:t,debug:e?5:void 0,relaxedDurability:!1,username:b.username})}async function Jt(t,e){let{PGlite:r}=await import("@electric-sql/pglite");return await r.create({database:b.database,dataDir:"memory://",debug:e?5:void 0,relaxedDurability:!1,username:b.username})}async function Qt(t){let{dataDir:e,db:r,debug:o,destinationPath:n}=t,s=r||await Ge(e,o),{pgDump:a}=await import("@electric-sql/pglite-tools/pg_dump"),c=await a({args:["--schema-only","--no-owner"],fileName:n?(0,Ve.filename)(n):void 0,pg:await s.clone()});return n?(o&&console.debug(`[DB] Dumping database to ${n}`),await He(c,n)):(o&&console.debug("[DB] Dumping database to memory"),await c.text())}p();var yt=require("http"),bt=require("util"),Pt=w(require("@prisma/get-platform"),1);me();fe();async function St(t,e){let{port:r}=e;if(e.dryRun)return gt(r,null);let o=await or(r,t,e),{promise:n,reject:s,resolve:a}=X(),{serve:c}=await import("@hono/node-server"),i=c({createServer:yt.createServer,fetch:o.fetch,overrideGlobalObjects:!1,port:r},a);return i.on("error",u=>{if(typeof u=="object"&&"code"in u&&u.code==="EADDRINUSE")return s(new E(r));console.error("[Accelerate]",u)}),await n,gt(r,i)}function gt(t,e){return{async close(){e&&await Promise.allSettled([(0,bt.promisify)(e.close.bind(e))(),L.stopAll()])},port:t,url:`http://localhost:${t}`}}async function or(t,e,r){let{debug:o}=r,[{Hono:n},{accelerateRoute:s},{utilityRoute:a}]=await Promise.all([import("hono/tiny"),Promise.resolve().then(()=>(lt(),ut)),Promise.resolve().then(()=>(ht(),ft))]),c=new n,i=await Pt.default.getPlatformInfo();if(o&&console.debug("[Accelerate] platform info: %s",JSON.stringify(i)),o){let{logger:l}=await import("hono/logger");c.use("*",l((...g)=>console.log("[Accelerate]",...g)))}c.use("*",async(l,g)=>(l.set("db",e),l.set("debug",!!o),l.set("platform",i),l.set("port",t),l.set("protocol","http"),l.set("serverState",r),l.set("shadowDBPort",r.shadowDatabasePort),await g()));let u=new n;return u.route("/",s),u.route("/",a),c.route("/",u),c}p();var Ot=require("fs/promises"),x=require("pathe"),re=require("proper-lockfile"),Ee=require("std-env"),d=require("valibot");Q();p();var wt=require("std-env");function vt(t,e){if(t==null)return!1;try{return wt.process.kill?.(t,0)??!0}catch(r){return e&&console.error(`Error checking if process with PID ${t} exists:`,r),!1}}var we=(0,d.pipe)((0,d.string)(),(0,d.url)()),Dt=(0,d.object)({connectionString:we,prismaORMConnectionString:(0,d.optional)(we),terminalCommand:(0,d.optional)((0,d.string)())}),Et=(0,d.object)({url:we}),Pe=(0,d.pipe)((0,d.number)(),(0,d.integer)(),(0,d.minValue)(1)),nr=(0,d.object)({database:Dt,http:Et,ppg:Et,shadowDatabase:Dt}),sr=(0,d.object)({databasePort:Pe,exports:(0,d.optional)(nr),name:(0,d.pipe)((0,d.string)(),(0,d.minLength)(1)),pid:(0,d.optional)((0,d.pipe)((0,d.number)(),(0,d.integer)(),(0,d.minValue)(0))),port:Pe,shadowDatabasePort:Pe,version:(0,d.literal)("1")}),Oe=Symbol("initialize"),Se="default",O=class{_databasePort;debug;dryRun;name;persistenceMode;pid;_port;_shadowDatabasePort;constructor(e){this._databasePort=e.databasePort??T,this.debug=e.debug??!1,this.dryRun=e.dryRun??!1,this.name=e.name??Se,this.persistenceMode=e.persistenceMode,this.pid=e.pid??Ee.process.pid,this._port=e.port??T,this._shadowDatabasePort=e.shadowDatabasePort??T}static async createExclusively(e){let r=e?.dryRun!==!0&&e?.persistenceMode!=="stateless"?new F(e):new ve(e);return await r[Oe](),r}static async fromServerDump(e){let{debug:r,name:o=Se}=e??{},n=M(o),s=F.getServerDumpPath(n),a=await Le(s);if(a==null)return r&&console.debug(`[State] No server dump file found at: ${s}`),null;r&&(console.debug(`[State] server dump file found at "${s}":`),console.debug(a));let{issues:c,output:i,success:u}=(0,d.safeParse)((0,d.pipe)((0,d.string)(),(0,d.parseJson)(),sr),a);if(!u)throw r&&console.debug(`[State] Invalid server dump file at "${s}":
${JSON.stringify(c,null,2)}`),new Error(`Invalid Prisma Dev state for "${o}".`);return new F({databasePort:i.databasePort,debug:r,dryRun:!1,name:o,pid:i.pid,port:i.port,serverDump:i,shadowDatabasePort:i.shadowDatabasePort})}static async scan(e){let{debug:r}=e??{},o=(0,x.join)(M(Se),"..");r&&console.debug(`[State] scanning for server states in: ${o}`);let n=await Me(o);return r&&console.debug(`[State] found server names: ${JSON.stringify(n)}`),await Promise.all(n.map(s=>ar(s,e)))}get databasePort(){return this._databasePort}get port(){return this._port}get shadowDatabasePort(){return this._shadowDatabasePort}},ve=class extends O{constructor(e){super({...e,databasePort:e?.databasePort??I,persistenceMode:"stateless",port:e?.port??C,shadowDatabasePort:e?.shadowDatabasePort??B})}get databaseDumpPath(){return"<DUMP_PATH>"}get pgliteDataDirPath(){return"memory://"}async[Oe](){}async close(){}async writeServerDump(){}},F=class t extends O{#r;#e;#t;#s;#o;#n=null;constructor(e){super({...e,persistenceMode:"stateful"}),this.#e=M(this.name),this.#r=(0,x.join)(this.#e,"db_dump.bak"),this.#t=(0,x.join)(this.#e,".pglite"),this.#o=e?.serverDump??null,this.#s=t.getServerDumpPath(this.#e)}static getServerDumpPath(e){return(0,x.join)(e,"server.json")}get databaseDumpPath(){return this.#r}get exports(){return this.#o?.exports}get pgliteDataDirPath(){return this.#t}async[Oe](){await je(this.#e),this.debug&&console.debug(`[State] using data directory: ${this.#e}`);try{this.#n=await(0,re.lock)(this.#e,{lockfilePath:(0,x.join)(this.#e,".lock")}),this.debug&&console.debug(`[State] obtained lock on: ${this.#e}`);let e=await O.scan({debug:this.debug,onlyMetadata:!0}),r=await Ne({debug:this.debug,name:this.name,requestedPorts:{databasePort:this.databasePort,port:this.port,shadowDatabasePort:this.shadowDatabasePort},servers:e});this._databasePort=r.databasePort,this._port=r.port,this._shadowDatabasePort=r.shadowDatabasePort,await this.writeServerDump()}catch(e){throw e instanceof Error&&"code"in e&&e.code==="ELOCKED"?new q(this):e}}async close(){if(this.#n!=null)try{await this.#n(),this.#n=null,this.debug&&console.debug(`[State] released lock on: ${this.#e}`)}catch(e){throw console.error(`[State] failed to release lock on: ${this.#e}`),e}}async writeServerDump(e){this.#o={name:this.name,version:"1",pid:Ee.process.pid,port:this.port,databasePort:this.databasePort,shadowDatabasePort:this.shadowDatabasePort,exports:e},await(0,Ot.writeFile)(this.#s,`${JSON.stringify(this.#o,null,2)}
`,{encoding:"utf-8"})}};async function ar(t,e){let{debug:r,onlyMetadata:o}=e||{},n={databasePort:-1,exports:void 0,name:t,pid:void 0,port:-1,shadowDatabasePort:-1,version:"1"};try{let s=await O.fromServerDump({debug:r,name:t});if(!s)return r&&console.debug(`[State] no server state found for name: ${t}`),{...n,status:"no_such_server"};n.databasePort=s.databasePort,n.exports=s.exports,n.pid=s.pid,n.port=s.port,n.shadowDatabasePort=s.shadowDatabasePort;let{exports:a,pid:c}=s;if(o)return{...n,status:"unknown"};if(!vt(c,r))return r&&console.debug(`[State] server state for "${t}" has no running process with PID: ${c}`),{...n,status:"not_running"};let i=M(t);try{if(!await(0,re.check)(i,{lockfilePath:(0,x.join)(i,".lock")}))return r&&console.debug(`[State] server state for "${t}" is not locked, indicating it is not running.`),{...n,status:"starting_up"}}catch(_){r&&console.error(`[State] server state for "${t}" failed to check lock:`,_)}if(!a)return{...n,status:"starting_up"};let{http:u}=a,{hc:l}=await import("hono/client"),g=await l(u.url).health.$get();if(!g.ok)return r&&console.debug(`[State] server state for "${t}" is not live: ${JSON.stringify(g)}`),{...n,status:"not_running"};let y=await g.json();return y.name!==t?(r&&console.debug(`[State] server state for "${t}" has mismatched health response: ${JSON.stringify(y)}`),{...n,status:"unknown"}):(r&&console.debug(`[State] server state for "${t}" is live: ${JSON.stringify(y)}`),{...n,status:"running"})}catch(s){return r&&console.error(`[State] failed to get server status for "${t}":`,s),{...n,status:"error"}}}var De=class extends Error{name="ServerStateAlreadyExistsError";constructor(e){super(`A Prisma Dev server with the name "${e}" is already running.`)}},q=class extends De{#r;name="ServerAlreadyRunningError";constructor(e){super(e.name),this.#r=e}get server(){return O.fromServerDump({debug:this.#r.debug,name:this.#r.name})}};async function ir(t){let e=await O.createExclusively(t),[r,o]=await Promise.all([pe("database",e),pe("shadow_database",e)]),n=await St(r,e),s=`prisma+postgres://localhost:${n.port}/?${new URLSearchParams({api_key:Ae({databaseUrl:r.prismaORMConnectionString,name:e.name,shadowDatabaseUrl:o.prismaORMConnectionString})}).toString()}`,a={database:{connectionString:r.connectionString,prismaORMConnectionString:r.prismaORMConnectionString,terminalCommand:r.terminalCommand},http:{url:n.url},ppg:{url:s},shadowDatabase:{connectionString:o.prismaORMConnectionString,prismaORMConnectionString:o.prismaORMConnectionString,terminalCommand:o.terminalCommand}};return await e.writeServerDump(a),{...a,close:()=>c(e,[n,r,o]),name:e.name};async function c(i,u){let g=(await Promise.allSettled(u.map(y=>y.close()))).filter(y=>y.status==="rejected").map(y=>new Error(y.reason));try{await i.close()}catch(y){g.push(y)}if(g.length>0)throw new AggregateError(g,"Failed to close some servers")}}0&&(module.exports={DEFAULT_DATABASE_PORT,DEFAULT_SERVER_PORT,DEFAULT_SHADOW_DATABASE_PORT,PortNotAvailableError,ServerAlreadyRunningError,unstable_startServer});