@prisma/dev 0.0.0-dev.202505222207 → 0.0.0-dev.202505222221

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
@@ -5,4 +5,4 @@ Received data: ${i}`));n({childProcess:s,url:`http://${b}:${m}`})};s.once("error
5
5
  provider = "postgresql"
6
6
  url = "${e}"
7
7
  }`,o=r.replace(ze,n),s=await H(o);return{base64Override:re.from(o,"utf8").toString("base64"),overrideHash:s}}function O(t){let{req:e}=t;return{traceparent:e.header("traceparent"),"X-capture-telemetry":e.header("X-capture-telemetry")}}import{integer as se,looseObject as Je,minValue as ae,number as _,object as Qe,optional as We,pipe as ie,safeParse as ce,string as de,union as Xe}from"valibot";var Ye=Qe({isolation_level:We(de()),max_wait:ie(_(),se(),ae(0)),timeout:ie(_(),se(),ae(0))});async function ue(t){let{issues:e,output:r,success:n}=ce(Ye,await t.req.json(),{abortEarly:!0});return n?r:t.json({EngineNotStarted:{reason:"InvalidRequest",issues:e}},400)}var Ze=Je({id:Xe([de(),_()])});function le(t,e){let{output:r,success:n}=ce(Ze,t);return n?r:e.json({EngineMalfunction:{}},500)}async function ge(t,e){let{port:r}=e;if(e.dryRun)return me(r,null);let n=await at(r,t,e),{fail:o,promise:s,succeed:a}=A(),i=rt({createServer:et,fetch:n.fetch,port:r},()=>{a()});return i.on("error",c=>{if(typeof c=="object"&&"code"in c&&c.code==="EADDRINUSE")return o(new f(r,"server"));console.error(c)}),await s,me(r,i)}function me(t,e){return{async close(){e&&await Promise.allSettled([tt(e.close.bind(e))(),y.stopAll()])},port:t,url:`http://localhost:${t}`}}async function at(t,e,r){let{debug:n}=r,o=new pe,s=await nt.getPlatformInfo();return n&&console.debug("platform info: %s",JSON.stringify(s)),n&&o.use("*",ot()),o.use("*",async(a,i)=>(a.set("db",e),a.set("debug",!!n),a.set("platform",s),a.set("port",t),a.set("protocol","http"),a.set("serverState",r),await i())),o.route("/",P),o}var P=new pe;P.get("/health",t=>t.json({name:t.get("serverState").name}));P.post("/invalidate",S("header",p),async t=>{let e=await K(t);return e instanceof Response?e:t.body(null)});var it="/:clientVersion/:schemaHash",v=P.basePath(it);P.route("/",v);var ct=["/graphql","/itx/:transactionId/graphql"];v.on("POST",[...ct],S("header",p),async t=>{let{req:e}=t;try{let r=await B(t);if(r instanceof Response)return r;let n=await e.text(),o=e.param("transactionId"),s=await r.request(n,{...O(t),"X-transaction-id":o});return t.text(s)}catch(r){return T(r,t)}});v.basePath("/itx/:transactionId").on("POST",["/commit","/rollback"],S("header",p),async t=>{let{req:e}=t;try{let r=await B(t);if(r instanceof Response)return r;let o=`${e.routePath.split("/").filter(Boolean).at(-1)}Transaction`,s=e.param("transactionId"),a=await r[o](s,O(t));return t.json(a)}catch(r){return T(r,t)}});v.put("/schema",S("header",p),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=await oe(r,t.get("db").connectionString);return R.set(n,{base64Original:r,...s}),t.text(n)}return r!==o.base64Original?t.text("Schema mismatch",400):t.text(n)});v.post("/transaction/start",S("header",p),async t=>{let{req:e}=t,r=await ue(t);if(r instanceof Response)return r;try{let n=await B(t);if(n instanceof Response)return n;let o=await n.startTransaction(r,O(t)),s=le(o,t);if(s instanceof Response)return s;let{id:a}=s,i=e.param("clientVersion"),c=t.get("port"),l=t.get("protocol"),b=e.param("schemaHash");return t.json({...o,"data-proxy":{endpoint:`${l}://localhost:${c}/${i}/${b}/itx/${a}`}})}catch(n){return T(n,t)}});async function B(t){let{req:e}=t,r=ne(t);if(r instanceof Response)return r;let{base64Override:n,overrideHash:o}=r.schemas;return await y.get({base64Schema:n,clientVersion:st.env.PRISMA_DEV_FORCE_CLIENT_VERSION||e.param("clientVersion"),debug:t.get("debug"),platform:t.get("platform"),schemaHash:o})}import{PGlite as dt}from"@electric-sql/pglite";import{PGLiteSocketServer as ut}from"@electric-sql/pglite-socket";import{pgDump as lt}from"@electric-sql/pglite-tools/pg_dump";var d={connectionLimit:1,connectTimeout:0,database:"postgres",maxIdleConnectionLifetime:0,password:"postgres",poolTimeout:0,socketTimeout:0,sslMode:"disable",username:"postgres"},mt=`postgres://${d.username}:${d.password}@localhost`,pt=new URLSearchParams({connection_limit:String(d.connectionLimit),connect_timeout:String(d.connectTimeout),max_idle_connection_lifetime:String(d.maxIdleConnectionLifetime),pool_timeout:String(d.poolTimeout),socket_timeout:String(d.socketTimeout),sslmode:d.sslMode});async function C(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:n}=e,o=await dt.create({database:d.database,dataDir:"memory://",debug:n?5:void 0,defaultDataTransferContainer:"file",username:d.username});await o.waitReady,t==="database"&&await gt(o,e);let s=new ut({db:o,inspect:n,port:r});try{await s.start()}catch(a){throw a instanceof Error&&"code"in a&&a.code==="EADDRINUSE"?new f(r,t):a}return fe(t,e,{db:o,port:r,server:s})}function fe(t,e,r){let{debug:n}=e,{db:o,port:s,server:a}=r||{};return n&&console.debug(`${t} server started on port ${s}`),{...d,close:async()=>{let i=[];try{await a?.stop(),n&&console.debug(`${t} server stopped on port ${s}`)}catch(c){console.error("server stop error",c),i.push(c)}if(t==="database")try{await ft(o,e),n&&console.debug(`${t} state saved`)}catch(c){console.error("dump error",c),i.push(c)}try{await o?.close(),n&&console.debug(`${t} closed`)}catch(c){console.error("db close error",c),i.push(c)}if(i.length>0)throw new AggregateError(i,`Failed to close ${t} properly`)},connectionString:ht(s),port:s}}async function gt(t,e){let r=await e.readDatabaseDump();r&&(await t.exec(`${r}; set search_path to public;`),e.debug&&console.debug("successfully loaded database state from a dump file"))}async function ft(t,e){await e.writeDatabaseDump(()=>lt({args:[],pg:t}))}function ht(t){return`${mt}:${t}/${d.database}?${pt.toString()}`}import{copyFile as bt,mkdir as yt,writeFile as wt}from"fs/promises";import{join as L}from"pathe";import{lock as St}from"proper-lockfile";import{readLastLines as Pt}from"read-last-lines-ts";import{process as vt}from"std-env";var j=Symbol("initialize"),h=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 F(e):new M(e);return await r[j](),r}},M=class extends h{constructor(e){super({...e,persistenceMode:"stateless"})}async[j](){}async close(){}readDatabaseDump(){return Promise.resolve(null)}async writeDatabaseDump(){}async writeServerDump(){}},F=class extends h{#r;#e;#t;#s;#o=null;constructor(e){super({...e,persistenceMode:"stateful"}),this.#r=J(this.name),this.#e=L(this.#r,"ppg.sql"),this.#t=`${this.#e}.bak`,this.#s=L(this.#r,"server.json")}async[j](){await yt(this.#r,{recursive:!0}),this.debug&&console.debug(`using data directory: ${this.#r}`);try{this.#o=await St(this.#r,{lockfilePath:L(this.#r,".lock")}),this.debug&&console.debug(`obtained lock on: ${this.#r}`),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.#o!=null&&(await this.#o(),this.debug&&console.debug(`released lock on: ${this.#r}`))}async readDatabaseDump(){let[e,r]=await Promise.all([I(this.#e),I(this.#t)]),n=Number.isFinite(e)?this.#e:null,o=Number.isFinite(r)?this.#t:null,s=(e>=r?[n,o]:[o,n]).filter(Boolean);for(let a of s){if(!await this.#a(a)){this.debug&&console.debug(`database dump not completed at: ${a}`);continue}let i=await Y(a);if(!i){this.debug&&console.debug(`database dump no longer available at: ${a}`);continue}if(!this.#n(i)){this.debug&&console.debug(`database dump no longer completed at: ${a}`);continue}return this.debug&&console.debug(`using database dump from: ${a}`),i}return this.debug&&console.debug("no completed database dumps found"),null}async writeDatabaseDump(e){let r=!1;await this.#a(this.#e)&&(await bt(this.#e,this.#t),r=!0,this.debug&&console.debug(`backed up dump to: ${this.#t}`));let n=await e();if(await W(n,this.#e),this.debug&&console.debug(`dumped database to: ${this.#e}`),!r)return;let o=await X(this.#t);this.debug&&o&&console.debug(`deleted backup dump: ${this.#t}`)}async writeServerDump(e){await wt(this.#s,`${JSON.stringify({name:this.name,version:"1",pid:vt.pid,port:this.port,databasePort:this.databasePort,shadowDatabasePort:this.shadowDatabasePort,exports:e},null,2)}
8
- `,{encoding:"utf-8"})}async#a(e){if(!await D(e))return!1;let r=Pt(e,5).toString("utf-8");return this.debug&&console.debug(`last lines of checked dump: ${r}`),this.#n(r)}#n(e){return e.includes("-- PostgreSQL database dump complete")}};async function $r(t){let e=await h.get(t),[r,n]=await Promise.all([C("database",e),C("shadow_database",e)]),o=await ge(r,e),s=`prisma+postgres://localhost:${o.port}/?${new URLSearchParams({api_key:V({databaseUrl:r.connectionString,shadowDatabaseUrl:n.connectionString})}).toString()}`,a={accelerate:{url:o.url},database:{connectionString:r.connectionString},ppg:{url:s},shadowDatabase:{connectionString:n.connectionString}};return await e.writeServerDump(a),{...a,close:()=>i(e,[o,r,n])};async function i(c,l){let m=(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){m.push(u)}if(m.length>0)throw new AggregateError(m,"Failed to close some servers")}}export{Z as DEFAULT_DATABASE_PORT,ee as DEFAULT_SERVER_PORT,te as DEFAULT_SHADOW_DATABASE_PORT,f as PortNotAvailableError,$r as unstable_startServer};
8
+ `,{encoding:"utf-8"})}async#a(e){if(!await D(e))return!1;let r=Pt(e,5).toString("utf-8");return this.debug&&console.debug(`last lines of checked dump: ${r}`),this.#n(r)}#n(e){return e.includes("-- PostgreSQL database dump complete")}};async function xr(t){let e=await h.get(t),[r,n]=await Promise.all([C("database",e),C("shadow_database",e)]),o=await ge(r,e),s=`prisma+postgres://localhost:${o.port}/?${new URLSearchParams({api_key:V({databaseUrl:r.connectionString,shadowDatabaseUrl:n.connectionString})}).toString()}`,a={accelerate:{url:o.url},database:{connectionString:r.connectionString},ppg:{url:s},shadowDatabase:{connectionString:n.connectionString}};return await e.writeServerDump(a),{...a,close:()=>i(e,[o,r,n])};async function i(c,l){let m=(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){m.push(u)}if(m.length>0)throw new AggregateError(m,"Failed to close some servers")}}export{Z as DEFAULT_DATABASE_PORT,ee as DEFAULT_SERVER_PORT,te as DEFAULT_SHADOW_DATABASE_PORT,f as PortNotAvailableError,xr as unstable_startServer};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prisma/dev",
3
- "version": "0.0.0-dev.202505222207",
3
+ "version": "0.0.0-dev.202505222221",
4
4
  "description": "A local Prisma Postgres server for development and testing",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",