@prisma/dev 0.19.1 → 0.21.0

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.
@@ -0,0 +1,8 @@
1
+ import { Exports } from './state.js';
2
+
3
+ interface ProgrammaticServer extends Exports {
4
+ close(): Promise<void>;
5
+ name: string;
6
+ }
7
+
8
+ export type { ProgrammaticServer as P };
package/dist/state.d.cts CHANGED
@@ -51,21 +51,19 @@ interface ServerOptions {
51
51
  /**
52
52
  * Connection timeout in milliseconds for pending database connections.
53
53
  *
54
- * Starts ticking for every new client that attempts to connect. When exceeded,
55
- * the pending client connection is evicted and closed.
54
+ * This option is currently not enforced by the multiplexed
55
+ * `@electric-sql/pglite-socket` server used by `@prisma/dev`.
56
+ * It is kept for API compatibility until upstream exposes a queue-timeout
57
+ * equivalent again.
56
58
  *
57
59
  * Default is 1 minute (60,000 milliseconds).
58
- *
59
- * Use it with caution, as it may lead to unexpected behavior. Best used with
60
- * a pool client that retries connections.
61
60
  */
62
61
  databaseConnectTimeoutMillis?: number;
63
62
  /**
64
- * Idle timeout in milliseconds for active database connections.
63
+ * Idle timeout in milliseconds for open database connections.
65
64
  *
66
- * Re-starts ticking after each message received on the active connection. When
67
- * exceeded - meaning there hasn't been any activity for a while, the active
68
- * client connection is closed, and a pending connection is promoted to active.
65
+ * Re-starts ticking after each message received on a connection. When exceeded,
66
+ * that client connection is closed by the socket server.
69
67
  *
70
68
  * Is not applied by default.
71
69
  *
package/dist/state.d.ts CHANGED
@@ -51,21 +51,19 @@ interface ServerOptions {
51
51
  /**
52
52
  * Connection timeout in milliseconds for pending database connections.
53
53
  *
54
- * Starts ticking for every new client that attempts to connect. When exceeded,
55
- * the pending client connection is evicted and closed.
54
+ * This option is currently not enforced by the multiplexed
55
+ * `@electric-sql/pglite-socket` server used by `@prisma/dev`.
56
+ * It is kept for API compatibility until upstream exposes a queue-timeout
57
+ * equivalent again.
56
58
  *
57
59
  * Default is 1 minute (60,000 milliseconds).
58
- *
59
- * Use it with caution, as it may lead to unexpected behavior. Best used with
60
- * a pool client that retries connections.
61
60
  */
62
61
  databaseConnectTimeoutMillis?: number;
63
62
  /**
64
- * Idle timeout in milliseconds for active database connections.
63
+ * Idle timeout in milliseconds for open database connections.
65
64
  *
66
- * Re-starts ticking after each message received on the active connection. When
67
- * exceeded - meaning there hasn't been any activity for a while, the active
68
- * client connection is closed, and a pending connection is promoted to active.
65
+ * Re-starts ticking after each message received on a connection. When exceeded,
66
+ * that client connection is closed by the socket server.
69
67
  *
70
68
  * Is not applied by default.
71
69
  *
package/dist/state.js CHANGED
@@ -1 +1 @@
1
- import{a,b,c,d,e,f,g}from"./chunk-LKYVOPH3.js";import"./chunk-OTI5SWIV.js";import"./chunk-ITQ6ILGR.js";export{g as ServerAlreadyRunningError,a as ServerState,f as ServerStateAlreadyExistsError,b as deleteServer,c as getServerStatus,d as isServerRunning,e as killServer};
1
+ import{a,b,c,d,e,f,g}from"./chunk-FIY24ARL.js";import"./chunk-OTI5SWIV.js";import"./chunk-DGKV2DPF.js";export{g as ServerAlreadyRunningError,a as ServerState,f as ServerStateAlreadyExistsError,b as deleteServer,c as getServerStatus,d as isServerRunning,e as killServer};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prisma/dev",
3
- "version": "0.19.1",
3
+ "version": "0.21.0",
4
4
  "description": "A local Prisma Postgres server for development and testing",
5
5
  "type": "module",
6
6
  "author": "Igal Klebanov <igalklebanov@gmail.com> (https://github.com/igalklebanov)",
@@ -64,31 +64,33 @@
64
64
  "license": "ISC",
65
65
  "devDependencies": {
66
66
  "@arethetypeswrong/cli": "0.18.2",
67
- "@types/node": "25.0.3",
67
+ "@types/node": "25.0.9",
68
68
  "@types/pako": "2.0.4",
69
+ "@types/pg": "8.15.6",
69
70
  "@types/proper-lockfile": "4.1.4",
70
71
  "env-paths": "3.0.0",
72
+ "pg": "8.16.0",
71
73
  "pkg-types": "2.3.0",
72
74
  "tsup": "8.5.1",
73
75
  "typescript": "5.9.3",
74
- "vitest": "4.0.16",
76
+ "vitest": "4.0.17",
75
77
  "common-stuff": "^0.0.0"
76
78
  },
77
79
  "dependencies": {
78
- "@electric-sql/pglite": "0.3.14",
79
- "@electric-sql/pglite-socket": "0.0.19",
80
- "@electric-sql/pglite-tools": "0.2.19",
81
- "@hono/node-server": "1.19.7",
80
+ "@electric-sql/pglite": "0.3.16",
81
+ "@electric-sql/pglite-socket": "0.0.22",
82
+ "@electric-sql/pglite-tools": "0.2.21",
83
+ "@hono/node-server": "1.19.9",
82
84
  "@mrleebo/prisma-ast": "0.13.1",
83
- "@prisma/get-platform": "7.1.0",
84
- "@prisma/query-plan-executor": "7.1.0",
85
+ "@prisma/get-platform": "7.2.0",
86
+ "@prisma/query-plan-executor": "7.2.0",
85
87
  "foreground-child": "3.3.1",
86
88
  "get-port-please": "3.2.0",
87
- "hono": "4.11.1",
89
+ "hono": "4.11.4",
88
90
  "http-status-codes": "2.3.0",
89
91
  "pathe": "2.0.3",
90
92
  "proper-lockfile": "4.1.2",
91
- "remeda": "2.32.0",
93
+ "remeda": "2.33.4",
92
94
  "std-env": "3.10.0",
93
95
  "valibot": "1.2.0",
94
96
  "zeptomatch": "2.1.0"
@@ -98,7 +100,7 @@
98
100
  "check:exports": "attw . --pack --profile node16",
99
101
  "dev": "tsup --watch",
100
102
  "lint": "eslint --fix .",
101
- "test": "",
103
+ "test": "vitest run",
102
104
  "typecheck": "tsc --noEmit"
103
105
  }
104
106
  }
@@ -1 +0,0 @@
1
- import{a as d}from"./chunk-XMKRRRGB.js";import{a as P}from"./chunk-LKYVOPH3.js";import{g as u}from"./chunk-OTI5SWIV.js";import{a as f,c as v,d as g}from"./chunk-7NDL3ECU.js";import{createServer as A}from"http";import{promisify as R}from"util";import T from"@prisma/get-platform";async function y(o,e){let{port:r}=e;if(e.dryRun)return w(r,null);let n=await D(o,e),{promise:m,reject:l,resolve:a}=v(),{serve:c}=await import("@hono/node-server"),i=c({createServer:A,fetch:n.fetch,overrideGlobalObjects:!1,port:r},a);i.on("error",s=>{if(typeof s=="object"&&"code"in s&&s.code==="EADDRINUSE")return l(new u(r));console.error("[Accelerate]",s)});let{port:t}=await m;return e.port=t,w(t,i)}function w(o,e){return{async close(){e&&await Promise.allSettled([R(e.close.bind(e))(),g.stopAll()])},port:o,url:`http://localhost:${o}`}}async function D(o,e){let{debug:r}=e,[{Hono:n},{accelerateRoute:m},{utilityRoute:l}]=await Promise.all([import("hono/tiny"),import("./accelerate-EEKAFGN3.js"),import("./utility-Q5A254LJ.js")]),a=new n,c=await T.getPlatformInfo();if(r&&console.debug("[Accelerate] platform info: %s",JSON.stringify(c)),r){let{logger:t}=await import("hono/logger");a.use("*",t((...s)=>console.log("[Accelerate]",...s)))}a.use("*",async(t,s)=>(t.set("databaseDumpPath",e.databaseDumpPath),t.set("db",o),t.set("debug",!!r),t.set("name",e.name),t.set("platform",c),t.set("shadowDBPort",e.shadowDatabasePort),await s()));let i=new n;return i.route("/",m),i.route("/",l),a.route("/",i),a}async function E(o){let e=await P.createExclusively(o),[r,n]=await Promise.all([d("database",e),d("shadow_database",e)]),m=await y(r,e),l=`prisma+postgres://localhost:${m.port}/?${new URLSearchParams({api_key:f({databaseUrl:r.prismaORMConnectionString,name:e.name,shadowDatabaseUrl:n.prismaORMConnectionString})}).toString()}`,a={database:{connectionString:r.connectionString,prismaORMConnectionString:r.prismaORMConnectionString,terminalCommand:r.terminalCommand},http:{url:m.url},ppg:{url:l},shadowDatabase:{connectionString:n.prismaORMConnectionString,prismaORMConnectionString:n.prismaORMConnectionString,terminalCommand:n.terminalCommand}};return await e.writeServerDump(a),{...a,close:()=>c(e,[m,r,n]),name:e.name};async function c(i,t){let S=(await Promise.allSettled(t.map(p=>p.close()))).filter(p=>p.status==="rejected").map(p=>new Error(p.reason));try{await i.close()}catch(p){S.push(p)}if(S.length>0)throw new AggregateError(S,"Failed to close some servers")}}async function J(o){return await E(o)}export{E as a,J as b};
@@ -1 +0,0 @@
1
- import{g as b}from"./chunk-OTI5SWIV.js";import{e as g}from"./chunk-ITQ6ILGR.js";import{filename as S}from"pathe/utils";var o={connectionLimit:1,connectTimeout:0,database:"template1",maxIdleConnectionLifetime:0,password:"postgres",poolTimeout:0,socketTimeout:0,sslMode:"disable",username:"postgres"},h=`postgres://${o.username}:${o.password}@localhost`,y=new URLSearchParams({sslmode:o.sslMode}),T=new URLSearchParams({...Object.fromEntries(y.entries()),connection_limit:String(o.connectionLimit),connect_timeout:String(o.connectTimeout),max_idle_connection_lifetime:String(o.maxIdleConnectionLifetime),pool_timeout:String(o.poolTimeout),single_use_connections:"true",socket_timeout:String(o.socketTimeout)});async function x(e,t){let r=e==="database"?t.databasePort:t.shadowDatabasePort;if(t.dryRun)return f(e,t,{db:null,port:r,server:null});let{debug:n}=t,a=await(e==="shadow_database"?v:_)(t.pgliteDataDirPath,n);n&&a.onNotification((d,l)=>{console.debug(`[${e}][${d}] ${l}`)});let{PGLiteSocketHandler:m,PGLiteSocketServer:s}=await import("@electric-sql/pglite-socket"),c=e==="shadow_database"?t.shadowDatabaseIdleTimeoutMillis:t.databaseIdleTimeoutMillis;E(c,a,m);let u=new s({connectionQueueTimeout:e==="shadow_database"?t.shadowDatabaseConnectTimeoutMillis:t.databaseConnectTimeoutMillis,db:a,debug:n,inspect:n,port:r});n&&(u.addEventListener("listening",d=>{let{detail:l}=d;console.debug(`[${e}] server listening on ${JSON.stringify(l)}`)}),u.addEventListener("connection",d=>{let{clientAddress:l,clientPort:P}=d.detail;console.debug(`[${e}] client connected from ${l}:${P}`)}),u.addEventListener("error",d=>{let{detail:l}=d;console.error(`[${e}] server error:`,l)}));try{await u.start()}catch(d){throw d instanceof Error&&"code"in d&&d.code==="EADDRINUSE"?new b(r):d}let p=Number(u.getServerConn().split(":").at(1));return t[e==="database"?"databasePort":"shadowDatabasePort"]=p,f(e,t,{db:a,port:p,server:u})}function f(e,t,r){let{debug:n}=t,{db:i,port:a,server:m}=r||{};return n&&console.debug(`[${e}] server started on port ${a}`),{...o,close:async()=>{let s=[];try{await m?.stop(),n&&console.debug(`[${e}] server stopped on port ${a}`)}catch(c){console.error(`[${e}] server stop error`,c),s.push(c)}if(e==="database")try{await i?.syncToFs(),n&&console.debug(`[${e}] synced to filesystem`)}catch(c){console.error(`[${e}] sync error`,c),s.push(c)}try{await i?.close(),n&&console.debug(`[${e}] closed`)}catch(c){console.error(`[${e}] close error`,c),s.push(c)}if(s.length>0)throw new AggregateError(s,`Failed to close ${e} properly`)},connectionString:D(a,y),dump:async s=>{e==="shadow_database"||!i||await $({db:i,debug:n,destinationPath:s})},port:a,prismaORMConnectionString:D(a,T),terminalCommand:`PGPASSWORD=${o.password} PGSSLMODE=${o.sslMode} psql -h localhost -p ${a} -U ${o.username} -d ${o.database}`}}function D(e,t){return`${h}:${e}/${o.database}?${t.toString()}`}async function _(e,t){let{PGlite:r}=await import("@electric-sql/pglite");return await r.create({database:o.database,dataDir:e,debug:t?5:void 0,extensions:await w(),relaxedDurability:!1,username:o.username})}async function v(e,t){let{PGlite:r}=await import("@electric-sql/pglite");return await r.create({database:o.database,dataDir:"memory://",debug:t?5:void 0,extensions:await w(),relaxedDurability:!1,username:o.username})}async function w(){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 E(e,t,r){if(t.__IDLE_TIMEOUT__=e,r.prototype.__ATTACH_OVERRIDDEN__)return;r.prototype.__ATTACH_OVERRIDDEN__=!0;let n=r.prototype.attach;r.prototype.attach=async function(i){let a=await n.call(this,i);if(!Number.isFinite(this.db.__IDLE_TIMEOUT__))return a;let m=null,s=()=>{m!=null&&(clearTimeout(m),m=null)},c=()=>{s(),m=setTimeout(()=>{this.dispatchEvent(new CustomEvent("close")),this.detach(!1)},this.db.__IDLE_TIMEOUT__)};return i.on("error",()=>{s()}),i.on("data",()=>{c()}),i.on("close",()=>{s()}),c(),a}}async function $(e){let{dataDir:t,db:r,debug:n,destinationPath:i}=e,a=r||await _(t,n),{pgDump:m}=await import("@electric-sql/pglite-tools/pg_dump"),s=await m({args:["--schema-only","--no-owner"],fileName:i?S(i):void 0,pg:await a.clone()});return i?(n&&console.debug(`[DB] Dumping database to ${i}`),await g(s,i)):(n&&console.debug("[DB] Dumping database to memory"),await s.text())}export{x as a,$ as b};
File without changes