@prisma/dev 0.0.0-dev.202506031936 → 0.0.0-dev.202506031947

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.
Files changed (2) hide show
  1. package/dist/index.js +1 -1
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -4,5 +4,5 @@ import{HTTPException as E}from"hono/http-exception";import{object as ye,optional
4
4
  Received data: ${l}`));n({childProcess:s,url:`http://${u}:${N}`})},a=l=>{this.#t=null,r(new w(String(l))),s.removeListener("exit",c),s.kill()};s.once("error",a);let c=(l,m)=>{this.#t=null,r(new w(`Query Engine exited with code ${l} and signal ${m}`))};return s.once("exit",c),s.stdout.on("data",i),this.#e.debug&&(s.stderr.on("data",console.error.bind(console,"[Query Engine]")),s.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 ze(e,"exit"))}async#o(){this.#e.debug&&console.debug("[Query Engine] getting engine commit hash...");let e=await this.#n();this.#e.debug&&console.debug("[Query Engine] got engine commit hash",e);let r=Q(this.#e.clientVersion,e);this.#e.debug&&console.debug("[Query Engine] cache directory path",r),await We(r,{recursive:!0});let{platform:n}=this.#e.platform,o=n==="windows"?".exe":"",s=Ye(r,`query-engine-${n}${o}`);return this.#e.debug&&console.debug("[Query Engine] binary path",s),(tt==="1"||await J(s)===!1)&&await this.#a({commitHash:e,extension:o,engineBinaryPath:s}),s}async#n(){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 n=(await e.json()).devDependencies?.["@prisma/engines-version"];if(!n)throw new Error("Couldn't find engines version in package.json");let o=n.split(".").at(-1);if(!o)throw new Error("Couldn't find commit hash in engines version");return o}async#a(e){let{commitHash:r,extension:n,engineBinaryPath:o}=e,{binaryTarget:s}=this.#e.platform,i=`https://binaries.prisma.sh/all_commits/${r}/${s}/query-engine${n}.gz`;this.#e.debug&&console.debug("[Query Engine] downloading engine from url",i);let a=await fetch(i);if(!a.ok)throw new Error(`Couldn't download engine. URL: ${i}, status code: ${a.status}`);re&&await Xe(Number(re)),await z(await a.arrayBuffer(),o),this.#e.debug&&console.debug("[Query Engine] downloaded and saved at",o)}#s(e){let r={};for(let[n,o]of Object.entries(e))o!=null&&(r[n]=o);return r}async#i(e,r,n){let{url:o}=await this.#t,s=this.#s(r),i=await fetch(`${o}/transaction/${e}/${n}`,{headers:{...s,"Content-Type":"application/json"},method:"POST"});if(!i.ok)throw await f.fromResponse(i);try{return await i.json()}catch{return{}}}};function A(t,e){return console.error(t),t instanceof w?e.json({EngineNotStarted:{reason:{EngineStartupError:{logs:[],msg:t.message}}}},500):t instanceof f?e.text(t.responseBody,t.statusCode):e.body(null,500)}var w=class extends Error{name="EngineStartError"},f=class t extends Error{constructor(r,n,o){super(`${r}: Query Engine response status ${n}, body: ${o}`);this.action=r;this.statusCode=n;this.responseBody=o}name="EngineHttpError";static async fromResponse(r){let n=new URL(r.url),o=await r.text();return new t(n.pathname,r.status,o)}};import{Buffer as ne}from"buffer";var R=new Map;async function H(t){let r=new TextEncoder().encode(t),n=await crypto.subtle.digest("SHA-256",r);return Array.from(new Uint8Array(n)).map(i=>i.toString(16).padStart(2,"0")).join("")}function oe(t){let e=t.req.param("schemaHash"),r=R.get(e);return r==null?t.json({EngineNotStarted:{reason:"SchemaMissing"}},404):{schemaHash:e,schemas:r}}var nt=/datasource\s+db\s+\{\s*provider\s*=\s*"postgres(!?ql)?"\s+url\s*=\s*.+\s*\}/;async function se(t,e){let r=ne.from(t,"base64").toString("utf8"),n=`datasource db {
5
5
  provider = "postgresql"
6
6
  url = "${e.toString()}"
7
- }`,o=r.replace(nt,n),s=await H(o);return{base64Override:ne.from(o,"utf8").toString("base64"),overrideHash:s}}function D(t){let{req:e}=t;return{traceparent:e.header("traceparent"),"X-capture-telemetry":e.header("X-capture-telemetry")}}import{integer as ie,looseObject as ot,minValue as ae,number as k,object as st,optional as it,pipe as ce,safeParse as de,string as le,union as at}from"valibot";var ct=st({isolation_level:it(le()),max_wait:ce(k(),ie(),ae(0)),timeout:ce(k(),ie(),ae(0))});async function ue(t){let{issues:e,output:r,success:n}=de(ct,await t.req.json(),{abortEarly:!0});return n?r:t.json({EngineNotStarted:{reason:"InvalidRequest",issues:e}},400)}var dt=ot({id:at([le(),k()])});function me(t,e){let{output:r,success:n}=de(dt,t);return n?r:e.json({EngineMalfunction:{}},500)}var P=new lt;P.post("/invalidate",S("header",g),async t=>{let e=await te(t);return e instanceof Response?e:t.body(null)});var ut="/:clientVersion/:schemaHash",v=P.basePath(ut);P.route("/",v);var mt=["/graphql","/itx/:transactionId/graphql"];v.on("POST",[...mt],S("header",g),async t=>{let{req:e}=t;try{let r=await C(t);if(r instanceof Response)return r;let n=await e.text(),o=e.param("transactionId"),s=await r.request(n,{...D(t),"X-transaction-id":o});return t.text(s)}catch(r){return A(r,t)}});v.basePath("/itx/:transactionId").on("POST",["/commit","/rollback"],S("header",g),async t=>{let{req:e}=t;try{let r=await C(t);if(r instanceof Response)return r;let o=`${e.routePath.split("/").filter(Boolean).at(-1)}Transaction`,s=e.param("transactionId"),i=await r[o](s,D(t));return t.json(i)}catch(r){return A(r,t)}});v.put("/schema",S("header",g),async t=>{let{req:e}=t,r=await e.text();if(!r)return t.text("Missing schema",400);let n=e.param("schemaHash"),o=R.get(n);if(o==null){if(n!==await H(r))return t.text("Schema hash mismatch",400);let s=new URL(t.get("db").connectionString);s.searchParams.set("single_use_connections","true");let i=await se(r,s);return R.set(n,{base64Original:r,...i}),t.text(n)}return r!==o.base64Original?t.text("Schema mismatch",400):t.text(n)});v.post("/transaction/start",S("header",g),async t=>{let{req:e}=t,r=await ue(t);if(r instanceof Response)return r;try{let n=await C(t);if(n instanceof Response)return n;let o=await n.startTransaction(r,D(t)),s=me(o,t);if(s instanceof Response)return s;let{id:i}=s,a=e.param("clientVersion"),c=t.get("port"),l=t.get("protocol"),m=e.param("schemaHash");return t.json({...o,"data-proxy":{endpoint:`${l}://localhost:${c}/${a}/${m}/itx/${i}`}})}catch(n){return A(n,t)}});async function C(t){let{req:e}=t,r=oe(t);if(r instanceof Response)return r;let{base64Override:n,overrideHash:o}=r.schemas;return await y.get({base64Schema:n,clientVersion:process.env.PRISMA_DEV_FORCE_CLIENT_VERSION||e.param("clientVersion"),debug:t.get("debug"),platform:t.get("platform"),schemaHash:o})}import{Hono as pt}from"hono/tiny";import{StatusCodes as gt}from"http-status-codes";var O=new pt;O.post("/database/dump",async t=>{let r=await t.get("db").dump();return t.json(r,gt.CREATED)});O.get("/health",t=>t.json({name:t.get("serverState").name}));async function he(t,e){let{port:r}=e;if(e.dryRun)return pe(r,null);let n=await St(r,t,e),{promise:o,reject:s,resolve:i}=T(),a=yt({createServer:ht,fetch:n.fetch,port:r},i);return a.on("error",c=>{if(typeof c=="object"&&"code"in c&&c.code==="EADDRINUSE")return s(new h(r,"server"));console.error("[Accelerate]",c)}),await o,pe(r,a)}function pe(t,e){return{async close(){e&&await Promise.allSettled([ft(e.close.bind(e))(),y.stopAll()])},port:t,url:`http://localhost:${t}`}}async function St(t,e,r){let{debug:n}=r,o=new ge,s=await bt.getPlatformInfo();return n&&console.debug("[Accelerate] platform info: %s",JSON.stringify(s)),n&&o.use("*",wt((...i)=>console.log("[Accelerate]",...i))),o.use("*",async(i,a)=>(i.set("db",e),i.set("debug",!!n),i.set("platform",s),i.set("port",t),i.set("protocol","http"),i.set("serverState",r),await a())),o.route("/",B),o}var B=new ge;B.route("/",P);B.route("/",O);import{mkdir as Pt,writeFile as vt}from"fs/promises";import{join as x}from"pathe";import{lock as Et}from"proper-lockfile";import{process as Tt}from"std-env";var j=Symbol("initialize"),b=class{databasePort;debug;dryRun;name;persistenceMode;port;shadowDatabasePort;constructor(e){this.databasePort=e.databasePort??51214,this.debug=e.debug??!1,this.dryRun=e.dryRun??!1,this.name=e.name??"default",this.persistenceMode=e.persistenceMode,this.port=e.port??51213,this.shadowDatabasePort=e.shadowDatabasePort??51215}static async get(e){let r=e?.dryRun!==!0&&e?.persistenceMode!=="stateless"?new M(e):new L(e);return await r[j](),r}},L=class extends b{constructor(e){super({...e,persistenceMode:"stateless"})}get databaseDumpPath(){return"<DUMP_PATH>"}get pgliteDataDirPath(){return"memory://"}async[j](){}async close(){}async writeServerDump(){}},M=class extends b{#r;#e;#t;#o;#n=null;constructor(e){super({...e,persistenceMode:"stateful"}),this.#e=G(this.name),this.#r=x(this.#e,"db_dump.bak"),this.#t=x(this.#e,".pglite"),this.#o=x(this.#e,"server.json")}get databaseDumpPath(){return this.#r}get pgliteDataDirPath(){return this.#t}async[j](){await Pt(this.#e,{recursive:!0}),this.debug&&console.debug(`[State] using data directory: ${this.#e}`);try{this.#n=await Et(this.#e,{lockfilePath:x(this.#e,".lock")}),this.debug&&console.debug(`[State] obtained lock on: ${this.#e}`),await this.writeServerDump()}catch(e){throw e instanceof Error&&"code"in e&&e.code==="ELOCKED"?new Error(`A server with the name "${this.name}" is already running. `):e}}async close(){this.#n!=null&&(await this.#n(),this.debug&&console.debug(`[State] released lock on: ${this.#e}`))}async writeServerDump(e){await vt(this.#o,`${JSON.stringify({name:this.name,version:"1",pid:Tt.pid,port:this.port,databasePort:this.databasePort,shadowDatabasePort:this.shadowDatabasePort,exports:e},null,2)}
7
+ }`,o=r.replace(nt,n),s=await H(o);return{base64Override:ne.from(o,"utf8").toString("base64"),overrideHash:s}}function D(t){let{req:e}=t;return{traceparent:e.header("traceparent"),"X-capture-telemetry":e.header("X-capture-telemetry")}}import{integer as ie,looseObject as ot,minValue as ae,number as k,object as st,optional as it,pipe as ce,safeParse as de,string as le,union as at}from"valibot";var ct=st({isolation_level:it(le()),max_wait:ce(k(),ie(),ae(0)),timeout:ce(k(),ie(),ae(0))});async function ue(t){let{issues:e,output:r,success:n}=de(ct,await t.req.json(),{abortEarly:!0});return n?r:t.json({EngineNotStarted:{reason:"InvalidRequest",issues:e}},400)}var dt=ot({id:at([le(),k()])});function me(t,e){let{output:r,success:n}=de(dt,t);return n?r:e.json({EngineMalfunction:{}},500)}var P=new lt;P.post("/invalidate",S("header",g),async t=>{let e=await te(t);return e instanceof Response?e:t.body(null)});var ut="/:clientVersion/:schemaHash",v=P.basePath(ut);P.route("/",v);var mt=["/graphql","/itx/:transactionId/graphql"];v.on("POST",[...mt],S("header",g),async t=>{let{req:e}=t;try{let r=await C(t);if(r instanceof Response)return r;let n=await e.text(),o=e.param("transactionId"),s=await r.request(n,{...D(t),"X-transaction-id":o});return t.text(s)}catch(r){return A(r,t)}});v.basePath("/itx/:transactionId").on("POST",["/commit","/rollback"],S("header",g),async t=>{let{req:e}=t;try{let r=await C(t);if(r instanceof Response)return r;let o=`${e.routePath.split("/").filter(Boolean).at(-1)}Transaction`,s=e.param("transactionId"),i=await r[o](s,D(t));return t.json(i)}catch(r){return A(r,t)}});v.put("/schema",S("header",g),async t=>{let{req:e}=t,r=await e.text();if(!r)return t.text("Missing schema",400);let n=e.param("schemaHash"),o=R.get(n);if(o==null){if(n!==await H(r))return t.text("Schema hash mismatch",400);let s=new URL(t.get("db").connectionString);s.searchParams.set("single_use_connections","true");let i=await se(r,s);return R.set(n,{base64Original:r,...i}),t.text(n)}return r!==o.base64Original?t.text("Schema mismatch",400):t.text(n)});v.post("/transaction/start",S("header",g),async t=>{let{req:e}=t,r=await ue(t);if(r instanceof Response)return r;try{let n=await C(t);if(n instanceof Response)return n;let o=await n.startTransaction(r,D(t)),s=me(o,t);if(s instanceof Response)return s;let{id:i}=s,a=e.param("clientVersion"),c=t.get("port"),l=t.get("protocol"),m=e.param("schemaHash");return t.json({...o,"data-proxy":{endpoint:`${l}://localhost:${c}/${a}/${m}/itx/${i}`}})}catch(n){return A(n,t)}});async function C(t){let{req:e}=t,r=oe(t);if(r instanceof Response)return r;let{base64Override:n,overrideHash:o}=r.schemas;return await y.get({base64Schema:n,clientVersion:process.env.PRISMA_DEV_FORCE_CLIENT_VERSION||e.param("clientVersion"),debug:t.get("debug"),platform:t.get("platform"),schemaHash:o})}import{Hono as pt}from"hono/tiny";import{StatusCodes as gt}from"http-status-codes";var O=new pt;O.post("/database/dump",async t=>{let r=await t.get("db").dump();return t.json(r,gt.CREATED)});O.get("/health",t=>t.json({name:t.get("serverState").name}));async function he(t,e){let{port:r}=e;if(e.dryRun)return pe(r,null);let n=await St(r,t,e),{promise:o,reject:s,resolve:i}=T(),a=yt({createServer:ht,fetch:n.fetch,overrideGlobalObjects:!1,port:r},i);return a.on("error",c=>{if(typeof c=="object"&&"code"in c&&c.code==="EADDRINUSE")return s(new h(r,"server"));console.error("[Accelerate]",c)}),await o,pe(r,a)}function pe(t,e){return{async close(){e&&await Promise.allSettled([ft(e.close.bind(e))(),y.stopAll()])},port:t,url:`http://localhost:${t}`}}async function St(t,e,r){let{debug:n}=r,o=new ge,s=await bt.getPlatformInfo();return n&&console.debug("[Accelerate] platform info: %s",JSON.stringify(s)),n&&o.use("*",wt((...i)=>console.log("[Accelerate]",...i))),o.use("*",async(i,a)=>(i.set("db",e),i.set("debug",!!n),i.set("platform",s),i.set("port",t),i.set("protocol","http"),i.set("serverState",r),await a())),o.route("/",B),o}var B=new ge;B.route("/",P);B.route("/",O);import{mkdir as Pt,writeFile as vt}from"fs/promises";import{join as x}from"pathe";import{lock as Et}from"proper-lockfile";import{process as Tt}from"std-env";var j=Symbol("initialize"),b=class{databasePort;debug;dryRun;name;persistenceMode;port;shadowDatabasePort;constructor(e){this.databasePort=e.databasePort??51214,this.debug=e.debug??!1,this.dryRun=e.dryRun??!1,this.name=e.name??"default",this.persistenceMode=e.persistenceMode,this.port=e.port??51213,this.shadowDatabasePort=e.shadowDatabasePort??51215}static async get(e){let r=e?.dryRun!==!0&&e?.persistenceMode!=="stateless"?new M(e):new L(e);return await r[j](),r}},L=class extends b{constructor(e){super({...e,persistenceMode:"stateless"})}get databaseDumpPath(){return"<DUMP_PATH>"}get pgliteDataDirPath(){return"memory://"}async[j](){}async close(){}async writeServerDump(){}},M=class extends b{#r;#e;#t;#o;#n=null;constructor(e){super({...e,persistenceMode:"stateful"}),this.#e=G(this.name),this.#r=x(this.#e,"db_dump.bak"),this.#t=x(this.#e,".pglite"),this.#o=x(this.#e,"server.json")}get databaseDumpPath(){return this.#r}get pgliteDataDirPath(){return this.#t}async[j](){await Pt(this.#e,{recursive:!0}),this.debug&&console.debug(`[State] using data directory: ${this.#e}`);try{this.#n=await Et(this.#e,{lockfilePath:x(this.#e,".lock")}),this.debug&&console.debug(`[State] obtained lock on: ${this.#e}`),await this.writeServerDump()}catch(e){throw e instanceof Error&&"code"in e&&e.code==="ELOCKED"?new Error(`A server with the name "${this.name}" is already running. `):e}}async close(){this.#n!=null&&(await this.#n(),this.debug&&console.debug(`[State] released lock on: ${this.#e}`))}async writeServerDump(e){await vt(this.#o,`${JSON.stringify({name:this.name,version:"1",pid:Tt.pid,port:this.port,databasePort:this.databasePort,shadowDatabasePort:this.shadowDatabasePort,exports:e},null,2)}
8
8
  `,{encoding:"utf-8"})}};async function Ur(t){let e=await b.get(t),[r,n]=await Promise.all([$("database",e),$("shadow_database",e)]),o=await he(r,e),s=`prisma+postgres://localhost:${o.port}/?${new URLSearchParams({api_key:q({databaseUrl:r.connectionString,shadowDatabaseUrl:n.connectionString})}).toString()}`,i={database:{connectionString:r.connectionString},http:{url:o.url},ppg:{url:s},shadowDatabase:{connectionString:n.connectionString}};return await e.writeServerDump(i),{...i,close:()=>a(e,[o,r,n])};async function a(c,l){let p=(await Promise.allSettled(l.map(u=>u.close()))).filter(u=>u.status==="rejected").map(u=>new Error(u.reason));try{await c.close()}catch(u){p.push(u)}if(p.length>0)throw new AggregateError(p,"Failed to close some servers")}}export{Y as DEFAULT_DATABASE_PORT,X as DEFAULT_SERVER_PORT,Z as DEFAULT_SHADOW_DATABASE_PORT,h as PortNotAvailableError,Ur as unstable_startServer};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prisma/dev",
3
- "version": "0.0.0-dev.202506031936",
3
+ "version": "0.0.0-dev.202506031947",
4
4
  "description": "A local Prisma Postgres server for development and testing",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",