UNPKG

@prisma/dev

Version:

A local Prisma Postgres server for development and testing

2 lines (1 loc) • 8.07 kB
"use strict";var C=Object.create;var y=Object.defineProperty;var F=Object.getOwnPropertyDescriptor;var q=Object.getOwnPropertyNames;var H=Object.getPrototypeOf,K=Object.prototype.hasOwnProperty;var V=(e,t)=>{for(var o in t)y(e,o,{get:t[o],enumerable:!0})},x=(e,t,o,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of q(t))!K.call(e,i)&&i!==o&&y(e,i,{get:()=>t[i],enumerable:!(s=F(t,i))||s.enumerable});return e};var r=(e,t,o)=>(o=e!=null?C(H(e)):{},x(t||!e||!e.__esModule?y(o,"default",{value:e,enumerable:!0}):o,e)),W=e=>x(y({},"__esModule",{value:!0}),e);var oe={};V(oe,{dumpDB:()=>G,startDBServer:()=>ee});module.exports=W(oe);var j=require("pathe/utils");var w=require("fs"),f=require("fs/promises"),E=require("util"),A=require("zlib");var n=r(require("path"),1),S=r(require("os"),1),h=r(require("process"),1),p=S.default.homedir(),T=S.default.tmpdir(),{env:g}=h.default,J=e=>{let t=n.default.join(p,"Library");return{data:n.default.join(t,"Application Support",e),config:n.default.join(t,"Preferences",e),cache:n.default.join(t,"Caches",e),log:n.default.join(t,"Logs",e),temp:n.default.join(T,e)}},X=e=>{let t=g.APPDATA||n.default.join(p,"AppData","Roaming"),o=g.LOCALAPPDATA||n.default.join(p,"AppData","Local");return{data:n.default.join(o,e,"Data"),config:n.default.join(t,e,"Config"),cache:n.default.join(o,e,"Cache"),log:n.default.join(o,e,"Log"),temp:n.default.join(T,e)}},Q=e=>{let t=n.default.basename(p);return{data:n.default.join(g.XDG_DATA_HOME||n.default.join(p,".local","share"),e),config:n.default.join(g.XDG_CONFIG_HOME||n.default.join(p,".config"),e),cache:n.default.join(g.XDG_CACHE_HOME||n.default.join(p,".cache"),e),log:n.default.join(g.XDG_STATE_HOME||n.default.join(p,".local","state"),e),temp:n.default.join(T,t,e)}};function _(e,{suffix:t="nodejs"}={}){if(typeof e!="string")throw new TypeError(`Expected a string, got ${typeof e}`);return t&&(e+=`-${t}`),h.default.platform==="darwin"?J(e):h.default.platform==="win32"?X(e):Q(e)}var Y=r(require("zeptomatch"),1),ce=_("prisma-dev"),de=(0,E.promisify)(A.unzip);async function B(e,t){await e.stream().pipeTo(w.WriteStream.toWeb((0,w.createWriteStream)(t,{encoding:"utf8"})))}var O=require("get-port-please"),R=require("remeda");var v=class extends Error{constructor(o){super(`Port \`${o}\` is not available.`);this.port=o}name="PortNotAvailableError"};var a={connectionLimit:1,connectTimeout:0,database:"template1",maxIdleConnectionLifetime:0,password:"postgres",poolTimeout:0,socketTimeout:0,sslMode:"disable",username:"postgres"},z=`postgres://${a.username}:${a.password}@localhost`,U=new URLSearchParams({sslmode:a.sslMode}),Z=new URLSearchParams({...Object.fromEntries(U.entries()),connection_limit:String(a.connectionLimit),connect_timeout:String(a.connectTimeout),max_idle_connection_lifetime:String(a.maxIdleConnectionLifetime),pool_timeout:String(a.poolTimeout),single_use_connections:"true",socket_timeout:String(a.socketTimeout)});async function ee(e,t){let o=e==="database"?t.databasePort:t.shadowDatabasePort;if(t.dryRun)return k(e,t,{db:null,port:o,server:null});let{debug:s}=t,c=await(e==="shadow_database"?te:I)(t.pgliteDataDirPath,s);s&&c.onNotification((l,P)=>{console.debug(`[${e}][${l}] ${P}`)});let{PGLiteSocketHandler:m,PGLiteSocketServer:d}=await import("@electric-sql/pglite-socket"),u=e==="shadow_database"?t.shadowDatabaseIdleTimeoutMillis:t.databaseIdleTimeoutMillis;re(u,c,m);let b=new d({connectionQueueTimeout:e==="shadow_database"?t.shadowDatabaseConnectTimeoutMillis:t.databaseConnectTimeoutMillis,db:c,debug:s,inspect:s,port:o});s&&(b.addEventListener("listening",l=>{let{detail:P}=l;console.debug(`[${e}] server listening on ${JSON.stringify(P)}`)}),b.addEventListener("connection",l=>{let{clientAddress:P,clientPort:M}=l.detail;console.debug(`[${e}] client connected from ${P}:${M}`)}),b.addEventListener("error",l=>{let{detail:P}=l;console.error(`[${e}] server error:`,P)}));try{await b.start()}catch(l){throw l instanceof Error&&"code"in l&&l.code==="EADDRINUSE"?new v(o):l}let $=Number(b.getServerConn().split(":").at(1));return t[e==="database"?"databasePort":"shadowDatabasePort"]=$,k(e,t,{db:c,port:$,server:b})}function k(e,t,o){let{debug:s}=t,{db:i,port:c,server:m}=o||{};return s&&console.debug(`[${e}] server started on port ${c}`),{...a,close:async()=>{let d=[];try{await m?.stop(),s&&console.debug(`[${e}] server stopped on port ${c}`)}catch(u){console.error(`[${e}] server stop error`,u),d.push(u)}if(e==="database")try{await i?.syncToFs(),s&&console.debug(`[${e}] synced to filesystem`)}catch(u){console.error(`[${e}] sync error`,u),d.push(u)}try{await i?.close(),s&&console.debug(`[${e}] closed`)}catch(u){console.error(`[${e}] close error`,u),d.push(u)}if(d.length>0)throw new AggregateError(d,`Failed to close ${e} properly`)},connectionString:L(c,U),dump:async d=>{e==="shadow_database"||!i||await G({db:i,debug:s,destinationPath:d})},port:c,prismaORMConnectionString:L(c,Z),terminalCommand:`PGPASSWORD=${a.password} PGSSLMODE=${a.sslMode} psql -h localhost -p ${c} -U ${a.username} -d ${a.database}`}}function L(e,t){return`${z}:${e}/${a.database}?${t.toString()}`}async function I(e,t){let{PGlite:o}=await import("@electric-sql/pglite");return await o.create({database:a.database,dataDir:e,debug:t?5:void 0,extensions:await N(),relaxedDurability:!1,username:a.username})}async function te(e,t){let{PGlite:o}=await import("@electric-sql/pglite");return await o.create({database:a.database,dataDir:"memory://",debug:t?5:void 0,extensions:await N(),relaxedDurability:!1,username:a.username})}async function N(){let e=await Promise.all([import("@electric-sql/pglite/contrib/amcheck"),import("@electric-sql/pglite/contrib/bloom"),import("@electric-sql/pglite/contrib/btree_gin"),import("@electric-sql/pglite/contrib/btree_gist"),import("@electric-sql/pglite/contrib/citext"),import("@electric-sql/pglite/contrib/cube"),import("@electric-sql/pglite/contrib/dict_int"),import("@electric-sql/pglite/contrib/dict_xsyn"),import("@electric-sql/pglite/contrib/earthdistance"),import("@electric-sql/pglite/contrib/file_fdw"),import("@electric-sql/pglite/contrib/fuzzystrmatch"),import("@electric-sql/pglite/contrib/hstore"),import("@electric-sql/pglite/contrib/intarray"),import("@electric-sql/pglite/contrib/isn"),import("@electric-sql/pglite/contrib/lo"),import("@electric-sql/pglite/contrib/ltree"),import("@electric-sql/pglite/contrib/pageinspect"),import("@electric-sql/pglite/contrib/pg_buffercache"),import("@electric-sql/pglite/contrib/pg_freespacemap"),import("@electric-sql/pglite/contrib/pg_surgery"),import("@electric-sql/pglite/contrib/pg_trgm"),import("@electric-sql/pglite/contrib/pg_visibility"),import("@electric-sql/pglite/contrib/pg_walinspect"),import("@electric-sql/pglite/contrib/seg"),import("@electric-sql/pglite/contrib/tablefunc"),import("@electric-sql/pglite/contrib/tcn"),import("@electric-sql/pglite/contrib/tsm_system_rows"),import("@electric-sql/pglite/contrib/tsm_system_time"),import("@electric-sql/pglite/contrib/unaccent"),import("@electric-sql/pglite/contrib/uuid_ossp"),import("@electric-sql/pglite/vector")]);return Object.assign({},...e)}function re(e,t,o){if(t.__IDLE_TIMEOUT__=e,o.prototype.__ATTACH_OVERRIDDEN__)return;o.prototype.__ATTACH_OVERRIDDEN__=!0;let s=o.prototype.attach;o.prototype.attach=async function(i){let c=await s.call(this,i);if(!Number.isFinite(this.db.__IDLE_TIMEOUT__))return c;let m=null,d=()=>{m!=null&&(clearTimeout(m),m=null)},u=()=>{d(),m=setTimeout(()=>{this.dispatchEvent(new CustomEvent("close")),this.detach(!1)},this.db.__IDLE_TIMEOUT__)};return i.on("error",()=>{d()}),i.on("data",()=>{u()}),i.on("close",()=>{d()}),u(),c}}async function G(e){let{dataDir:t,db:o,debug:s,destinationPath:i}=e,c=o||await I(t,s),{pgDump:m}=await import("@electric-sql/pglite-tools/pg_dump"),d=await m({args:["--schema-only","--no-owner"],fileName:i?(0,j.filename)(i):void 0,pg:await c.clone()});return i?(s&&console.debug(`[DB] Dumping database to ${i}`),await B(d,i)):(s&&console.debug("[DB] Dumping database to memory"),await d.text())}0&&(module.exports={dumpDB,startDBServer});