@prisma/dev 0.0.0-dev.202603231356 → 0.0.0-dev.202607271405

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 (87) hide show
  1. package/README.md +318 -0
  2. package/dist/accelerate-TRR43YJ5.js +11 -0
  3. package/dist/chunk-662IKR3V.js +1 -0
  4. package/dist/chunk-ANHBRJRZ.js +1 -0
  5. package/dist/chunk-DOJAPHLY.js +1 -0
  6. package/dist/{chunk-X3G665AK.js → chunk-EDFHV3AK.js} +1 -1
  7. package/dist/chunk-HFONW2ZS.js +3 -0
  8. package/dist/chunk-J6FIMHSD.js +1 -0
  9. package/dist/chunk-KWCQYPJI.js +1 -0
  10. package/dist/chunk-MD3K2IUP.js +1 -0
  11. package/dist/chunk-PP43TGA5.js +107 -0
  12. package/dist/chunk-SW3J2PL2.js +1 -0
  13. package/dist/daemon.cjs +33 -26
  14. package/dist/daemon.d.cts +12 -3
  15. package/dist/daemon.d.ts +12 -3
  16. package/dist/daemon.js +1 -1
  17. package/dist/db-BzbLAxLn.d.cts +126 -0
  18. package/dist/db-HU7BFiFV.d.ts +126 -0
  19. package/dist/db.cjs +23 -16
  20. package/dist/db.d.cts +3 -70
  21. package/dist/db.d.ts +3 -70
  22. package/dist/db.js +1 -1
  23. package/dist/engine-YTEOPVUP.js +3 -0
  24. package/dist/index.cjs +33 -26
  25. package/dist/index.d.cts +61 -6
  26. package/dist/index.d.ts +61 -6
  27. package/dist/index.js +1 -1
  28. package/dist/query-plan-executor-ZS4544O3.js +1 -0
  29. package/dist/runtime-assets/amcheck.tar.gz +0 -0
  30. package/dist/runtime-assets/bloom.tar.gz +0 -0
  31. package/dist/runtime-assets/btree_gin.tar.gz +0 -0
  32. package/dist/runtime-assets/btree_gist.tar.gz +0 -0
  33. package/dist/runtime-assets/citext.tar.gz +0 -0
  34. package/dist/runtime-assets/cube.tar.gz +0 -0
  35. package/dist/runtime-assets/dict_int.tar.gz +0 -0
  36. package/dist/runtime-assets/dict_xsyn.tar.gz +0 -0
  37. package/dist/runtime-assets/earthdistance.tar.gz +0 -0
  38. package/dist/runtime-assets/file_fdw.tar.gz +0 -0
  39. package/dist/runtime-assets/fuzzystrmatch.tar.gz +0 -0
  40. package/dist/runtime-assets/hstore.tar.gz +0 -0
  41. package/dist/runtime-assets/initdb.wasm +0 -0
  42. package/dist/runtime-assets/intarray.tar.gz +0 -0
  43. package/dist/runtime-assets/isn.tar.gz +0 -0
  44. package/dist/runtime-assets/lo.tar.gz +0 -0
  45. package/dist/runtime-assets/ltree.tar.gz +0 -0
  46. package/dist/runtime-assets/pageinspect.tar.gz +0 -0
  47. package/dist/runtime-assets/pg_buffercache.tar.gz +0 -0
  48. package/dist/runtime-assets/pg_freespacemap.tar.gz +0 -0
  49. package/dist/runtime-assets/pg_surgery.tar.gz +0 -0
  50. package/dist/runtime-assets/pg_trgm.tar.gz +0 -0
  51. package/dist/runtime-assets/pg_visibility.tar.gz +0 -0
  52. package/dist/runtime-assets/pg_walinspect.tar.gz +0 -0
  53. package/dist/runtime-assets/pglite-seed.tar.gz +0 -0
  54. package/dist/runtime-assets/pglite.wasm +0 -0
  55. package/dist/runtime-assets/seg.tar.gz +0 -0
  56. package/dist/runtime-assets/tablefunc.tar.gz +0 -0
  57. package/dist/runtime-assets/tcn.tar.gz +0 -0
  58. package/dist/runtime-assets/tsm_system_rows.tar.gz +0 -0
  59. package/dist/runtime-assets/tsm_system_time.tar.gz +0 -0
  60. package/dist/runtime-assets/unaccent.tar.gz +0 -0
  61. package/dist/runtime-assets/uuid-ossp.tar.gz +0 -0
  62. package/dist/runtime-assets/vector.tar.gz +0 -0
  63. package/dist/runtime-assets-manifest.bun.js +2 -0
  64. package/dist/runtime-assets.cjs +1 -1
  65. package/dist/runtime-assets.d.cts +2 -0
  66. package/dist/runtime-assets.d.ts +2 -0
  67. package/dist/runtime-assets.js +1 -1
  68. package/dist/server-QR7P25DP.js +1 -0
  69. package/dist/{state-DTMxyzXf.d.ts → state-CNKFAMiX.d.cts} +22 -1
  70. package/dist/{state-DTMxyzXf.d.cts → state-CNKFAMiX.d.ts} +22 -1
  71. package/dist/state.cjs +3 -3
  72. package/dist/state.d.cts +1 -1
  73. package/dist/state.d.ts +1 -1
  74. package/dist/state.js +1 -1
  75. package/dist/utility-YEFNU35E.js +1 -0
  76. package/dist/vite.cjs +121 -0
  77. package/dist/vite.d.cts +196 -0
  78. package/dist/vite.d.ts +194 -0
  79. package/dist/vite.js +1 -0
  80. package/package.json +28 -9
  81. package/dist/accelerate-HWGEFOM5.js +0 -11
  82. package/dist/chunk-62DM64XC.js +0 -1
  83. package/dist/chunk-CC3P7GPW.js +0 -3
  84. package/dist/chunk-TF5C7XJX.js +0 -3
  85. package/dist/chunk-X7AUCZJT.js +0 -1
  86. package/dist/chunk-YL6J3L2T.js +0 -100
  87. package/dist/utility-Q5A254LJ.js +0 -1
@@ -0,0 +1,126 @@
1
+ import { PGlite } from '@electric-sql/pglite';
2
+ import { E as ExperimentalQueryInsightsMetadata, d as ServerState } from './state-CNKFAMiX.cjs';
3
+
4
+ interface PrismaQueryInfo {
5
+ action: string;
6
+ isRaw: boolean;
7
+ model?: string;
8
+ payload?: unknown;
9
+ }
10
+ interface QueryInsightsEvent {
11
+ applicationName: string | null;
12
+ durationMs: number;
13
+ groupKey: string | null;
14
+ prismaQueryInfo: PrismaQueryInfo | null;
15
+ query: string;
16
+ queryId: string;
17
+ reads: number;
18
+ rowsReturned: number;
19
+ tables: string[];
20
+ timestamp: string;
21
+ }
22
+ interface QueryInsightsSnapshotRequest {
23
+ excludeApplications?: string[];
24
+ limit?: number;
25
+ since?: number;
26
+ }
27
+ interface QueryInsightsSnapshotQuery {
28
+ count: number;
29
+ duration: number;
30
+ groupKey?: string | null;
31
+ id: string;
32
+ lastSeen: number;
33
+ maxDurationMs?: number | null;
34
+ minDurationMs?: number | null;
35
+ prismaQueryInfo?: PrismaQueryInfo | null;
36
+ query: string;
37
+ queryId?: string | null;
38
+ reads: number;
39
+ rowsReturned: number;
40
+ tables: string[];
41
+ }
42
+ interface QueryInsightsSnapshot {
43
+ generatedAt: number;
44
+ queries: QueryInsightsSnapshotQuery[];
45
+ }
46
+ interface ExperimentalQueryInsights extends ExperimentalQueryInsightsMetadata {
47
+ snapshot(input?: QueryInsightsSnapshotRequest): Promise<QueryInsightsSnapshot>;
48
+ }
49
+
50
+ type QueryInsightsSubscriber = (events: readonly QueryInsightsEvent[]) => void;
51
+ interface QueryInsightsBridge {
52
+ close(): Promise<void>;
53
+ subscribe(callback: QueryInsightsSubscriber): () => void;
54
+ }
55
+
56
+ interface WalEvent {
57
+ oldRecord: Record<string, unknown> | null;
58
+ record: Record<string, unknown> | null;
59
+ schema: string;
60
+ table: string;
61
+ txid: string;
62
+ type: "delete" | "insert" | "update";
63
+ }
64
+ interface WalEventBridge {
65
+ close(): Promise<void>;
66
+ poll(): Promise<void>;
67
+ subscribe(callback: WalEventSubscriber): () => void;
68
+ }
69
+ interface WalEventBridgeOptions {
70
+ database?: string;
71
+ host?: string;
72
+ password?: string;
73
+ port?: number;
74
+ username?: string;
75
+ }
76
+ type WalEventSubscriber = (events: WalEvent[]) => void;
77
+ type PolledMessage = {
78
+ name: string;
79
+ text?: string;
80
+ };
81
+ declare function attachWalEventBridge(db: PGlite, _options?: WalEventBridgeOptions): Promise<WalEventBridge>;
82
+ declare function shouldPollWalAfterMessages(messages: PolledMessage[]): boolean;
83
+ declare function shouldPollWalAfterResponse(response: Uint8Array): boolean;
84
+
85
+ interface DBServer {
86
+ attachQueryInsightsBridge(): Promise<QueryInsightsBridge>;
87
+ attachWalEventBridge(): Promise<WalEventBridge>;
88
+ close(): Promise<void>;
89
+ readonly connectionLimit: number;
90
+ readonly connectionString: string;
91
+ readonly connectTimeout: number;
92
+ readonly database: string;
93
+ dump(destinationPath: string): Promise<void>;
94
+ readonly maxIdleConnectionLifetime: number;
95
+ readonly password: string;
96
+ readonly poolTimeout: number;
97
+ readonly port: number;
98
+ readonly prismaORMConnectionString: string;
99
+ getPrimaryKeyColumns(schema: string, table: string): Promise<readonly string[]>;
100
+ readonly socketTimeout: number;
101
+ readonly sslMode: string;
102
+ readonly terminalCommand: string;
103
+ readonly username: string;
104
+ }
105
+ interface DBDump {
106
+ dumpPath: string;
107
+ }
108
+ type DBServerPurpose = "database" | "shadow_database";
109
+ declare function startDBServer(purpose: DBServerPurpose, serverState: ServerState): Promise<DBServer>;
110
+ declare function startLazyShadowDBServer(serverState: Pick<ServerState, "debug" | "shadowDatabasePort" | "shadowDatabaseIdleTimeoutMillis"> & {
111
+ pgliteDataDirPath?: string;
112
+ }, startBackend?: () => Promise<DBServer>): Promise<DBServer>;
113
+ type DumpDBOptions<D extends string> = {
114
+ dataDir: string;
115
+ db?: never;
116
+ debug?: boolean;
117
+ destinationPath?: D;
118
+ } | {
119
+ dataDir?: never;
120
+ db: PGlite;
121
+ debug?: boolean;
122
+ destinationPath?: D;
123
+ };
124
+ declare function dumpDB<D extends string = never>(options: DumpDBOptions<D>): Promise<[D] extends [never] ? string : void>;
125
+
126
+ export { type DBServerPurpose as D, type ExperimentalQueryInsights as E, type PrismaQueryInfo as P, type QueryInsightsSnapshot as Q, type WalEvent as W, type QueryInsightsSnapshotQuery as a, type QueryInsightsSnapshotRequest as b, type DBDump as c, type DBServer as d, type DumpDBOptions as e, type WalEventBridge as f, attachWalEventBridge as g, dumpDB as h, shouldPollWalAfterResponse as i, startDBServer as j, startLazyShadowDBServer as k, shouldPollWalAfterMessages as s };
@@ -0,0 +1,126 @@
1
+ import { PGlite } from '@electric-sql/pglite';
2
+ import { E as ExperimentalQueryInsightsMetadata, d as ServerState } from './state-CNKFAMiX.js';
3
+
4
+ interface PrismaQueryInfo {
5
+ action: string;
6
+ isRaw: boolean;
7
+ model?: string;
8
+ payload?: unknown;
9
+ }
10
+ interface QueryInsightsEvent {
11
+ applicationName: string | null;
12
+ durationMs: number;
13
+ groupKey: string | null;
14
+ prismaQueryInfo: PrismaQueryInfo | null;
15
+ query: string;
16
+ queryId: string;
17
+ reads: number;
18
+ rowsReturned: number;
19
+ tables: string[];
20
+ timestamp: string;
21
+ }
22
+ interface QueryInsightsSnapshotRequest {
23
+ excludeApplications?: string[];
24
+ limit?: number;
25
+ since?: number;
26
+ }
27
+ interface QueryInsightsSnapshotQuery {
28
+ count: number;
29
+ duration: number;
30
+ groupKey?: string | null;
31
+ id: string;
32
+ lastSeen: number;
33
+ maxDurationMs?: number | null;
34
+ minDurationMs?: number | null;
35
+ prismaQueryInfo?: PrismaQueryInfo | null;
36
+ query: string;
37
+ queryId?: string | null;
38
+ reads: number;
39
+ rowsReturned: number;
40
+ tables: string[];
41
+ }
42
+ interface QueryInsightsSnapshot {
43
+ generatedAt: number;
44
+ queries: QueryInsightsSnapshotQuery[];
45
+ }
46
+ interface ExperimentalQueryInsights extends ExperimentalQueryInsightsMetadata {
47
+ snapshot(input?: QueryInsightsSnapshotRequest): Promise<QueryInsightsSnapshot>;
48
+ }
49
+
50
+ type QueryInsightsSubscriber = (events: readonly QueryInsightsEvent[]) => void;
51
+ interface QueryInsightsBridge {
52
+ close(): Promise<void>;
53
+ subscribe(callback: QueryInsightsSubscriber): () => void;
54
+ }
55
+
56
+ interface WalEvent {
57
+ oldRecord: Record<string, unknown> | null;
58
+ record: Record<string, unknown> | null;
59
+ schema: string;
60
+ table: string;
61
+ txid: string;
62
+ type: "delete" | "insert" | "update";
63
+ }
64
+ interface WalEventBridge {
65
+ close(): Promise<void>;
66
+ poll(): Promise<void>;
67
+ subscribe(callback: WalEventSubscriber): () => void;
68
+ }
69
+ interface WalEventBridgeOptions {
70
+ database?: string;
71
+ host?: string;
72
+ password?: string;
73
+ port?: number;
74
+ username?: string;
75
+ }
76
+ type WalEventSubscriber = (events: WalEvent[]) => void;
77
+ type PolledMessage = {
78
+ name: string;
79
+ text?: string;
80
+ };
81
+ declare function attachWalEventBridge(db: PGlite, _options?: WalEventBridgeOptions): Promise<WalEventBridge>;
82
+ declare function shouldPollWalAfterMessages(messages: PolledMessage[]): boolean;
83
+ declare function shouldPollWalAfterResponse(response: Uint8Array): boolean;
84
+
85
+ interface DBServer {
86
+ attachQueryInsightsBridge(): Promise<QueryInsightsBridge>;
87
+ attachWalEventBridge(): Promise<WalEventBridge>;
88
+ close(): Promise<void>;
89
+ readonly connectionLimit: number;
90
+ readonly connectionString: string;
91
+ readonly connectTimeout: number;
92
+ readonly database: string;
93
+ dump(destinationPath: string): Promise<void>;
94
+ readonly maxIdleConnectionLifetime: number;
95
+ readonly password: string;
96
+ readonly poolTimeout: number;
97
+ readonly port: number;
98
+ readonly prismaORMConnectionString: string;
99
+ getPrimaryKeyColumns(schema: string, table: string): Promise<readonly string[]>;
100
+ readonly socketTimeout: number;
101
+ readonly sslMode: string;
102
+ readonly terminalCommand: string;
103
+ readonly username: string;
104
+ }
105
+ interface DBDump {
106
+ dumpPath: string;
107
+ }
108
+ type DBServerPurpose = "database" | "shadow_database";
109
+ declare function startDBServer(purpose: DBServerPurpose, serverState: ServerState): Promise<DBServer>;
110
+ declare function startLazyShadowDBServer(serverState: Pick<ServerState, "debug" | "shadowDatabasePort" | "shadowDatabaseIdleTimeoutMillis"> & {
111
+ pgliteDataDirPath?: string;
112
+ }, startBackend?: () => Promise<DBServer>): Promise<DBServer>;
113
+ type DumpDBOptions<D extends string> = {
114
+ dataDir: string;
115
+ db?: never;
116
+ debug?: boolean;
117
+ destinationPath?: D;
118
+ } | {
119
+ dataDir?: never;
120
+ db: PGlite;
121
+ debug?: boolean;
122
+ destinationPath?: D;
123
+ };
124
+ declare function dumpDB<D extends string = never>(options: DumpDBOptions<D>): Promise<[D] extends [never] ? string : void>;
125
+
126
+ export { type DBServerPurpose as D, type ExperimentalQueryInsights as E, type PrismaQueryInfo as P, type QueryInsightsSnapshot as Q, type WalEvent as W, type QueryInsightsSnapshotQuery as a, type QueryInsightsSnapshotRequest as b, type DBDump as c, type DBServer as d, type DumpDBOptions as e, type WalEventBridge as f, attachWalEventBridge as g, dumpDB as h, shouldPollWalAfterResponse as i, startDBServer as j, startLazyShadowDBServer as k, shouldPollWalAfterMessages as s };
package/dist/db.cjs CHANGED
@@ -1,5 +1,12 @@
1
- "use strict";var Ee=Object.create;var A=Object.defineProperty;var ye=Object.getOwnPropertyDescriptor;var we=Object.getOwnPropertyNames;var Re=Object.getPrototypeOf,Se=Object.prototype.hasOwnProperty;var he=(e,t)=>{for(var r in t)A(e,r,{get:t[r],enumerable:!0})},q=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of we(t))!Se.call(e,o)&&o!==r&&A(e,o,{get:()=>t[o],enumerable:!(n=ye(t,o))||n.enumerable});return e};var g=(e,t,r)=>(r=e!=null?Ee(Re(e)):{},q(t||!e||!e.__esModule?A(r,"default",{value:e,enumerable:!0}):r,e)),Te=e=>q(A({},"__esModule",{value:!0}),e);var et={};he(et,{attachWalEventBridge:()=>O,dumpDB:()=>Pe,shouldPollWalAfterMessages:()=>x,shouldPollWalAfterResponse:()=>F,startDBServer:()=>Ve});module.exports=Te(et);var Ae=()=>typeof document>"u"?new URL(`file:${__filename}`).href:document.currentScript&&document.currentScript.tagName.toUpperCase()==="SCRIPT"?document.currentScript.src:new URL("main.js",document.baseURI).href,f=Ae();var me=require("pathe/utils");var v=require("fs"),E=require("fs/promises"),H=require("util"),K=require("zlib");var a=g(require("path"),1),U=g(require("os"),1),_=g(require("process"),1),b=U.default.homedir(),B=U.default.tmpdir(),{env:R}=_.default,_e=e=>{let t=a.default.join(b,"Library");return{data:a.default.join(t,"Application Support",e),config:a.default.join(t,"Preferences",e),cache:a.default.join(t,"Caches",e),log:a.default.join(t,"Logs",e),temp:a.default.join(B,e)}},ve=e=>{let t=R.APPDATA||a.default.join(b,"AppData","Roaming"),r=R.LOCALAPPDATA||a.default.join(b,"AppData","Local");return{data:a.default.join(r,e,"Data"),config:a.default.join(t,e,"Config"),cache:a.default.join(r,e,"Cache"),log:a.default.join(r,e,"Log"),temp:a.default.join(B,e)}},Le=e=>{let t=a.default.basename(b);return{data:a.default.join(R.XDG_DATA_HOME||a.default.join(b,".local","share"),e),config:a.default.join(R.XDG_CONFIG_HOME||a.default.join(b,".config"),e),cache:a.default.join(R.XDG_CACHE_HOME||a.default.join(b,".cache"),e),log:a.default.join(R.XDG_STATE_HOME||a.default.join(b,".local","state"),e),temp:a.default.join(B,t,e)}};function I(e,{suffix:t="nodejs"}={}){if(typeof e!="string")throw new TypeError(`Expected a string, got ${typeof e}`);return t&&(e+=`-${t}`),_.default.platform==="darwin"?_e(e):_.default.platform==="win32"?ve(e):Le(e)}var Ne=g(require("zeptomatch"),1),it=I("prisma-dev"),at=(0,H.promisify)(K.unzip);async function X(e,t){await e.stream().pipeTo(v.WriteStream.toWeb((0,v.createWriteStream)(t,{encoding:"utf8"})))}var $=require("get-port-please"),J=require("remeda");var L=class extends Error{constructor(r){super(`Port \`${r}\` is not available.`);this.port=r}name="PortNotAvailableError"};var S=require("fs"),y=require("fs/promises"),Q=require("module"),Z=require("path"),w=require("url"),De=(0,Q.createRequire)(f),Oe=["initdb.wasm","pglite.data","pglite.wasm"],ee={amcheck:"amcheck.tar.gz",bloom:"bloom.tar.gz",btree_gin:"btree_gin.tar.gz",btree_gist:"btree_gist.tar.gz",citext:"citext.tar.gz",cube:"cube.tar.gz",dict_int:"dict_int.tar.gz",dict_xsyn:"dict_xsyn.tar.gz",earthdistance:"earthdistance.tar.gz",file_fdw:"file_fdw.tar.gz",fuzzystrmatch:"fuzzystrmatch.tar.gz",hstore:"hstore.tar.gz",intarray:"intarray.tar.gz",isn:"isn.tar.gz",lo:"lo.tar.gz",ltree:"ltree.tar.gz",pageinspect:"pageinspect.tar.gz",pg_buffercache:"pg_buffercache.tar.gz",pg_freespacemap:"pg_freespacemap.tar.gz",pg_surgery:"pg_surgery.tar.gz",pg_trgm:"pg_trgm.tar.gz",pg_visibility:"pg_visibility.tar.gz",pg_walinspect:"pg_walinspect.tar.gz",seg:"seg.tar.gz",tablefunc:"tablefunc.tar.gz",tcn:"tcn.tar.gz",tsm_system_rows:"tsm_system_rows.tar.gz",tsm_system_time:"tsm_system_time.tar.gz",unaccent:"unaccent.tar.gz",uuid_ossp:"uuid-ossp.tar.gz",vector:"vector.tar.gz"},xe=[...Oe.map(e=>({fileName:e,kind:"core",name:e})),...Object.entries(ee).map(([e,t])=>({fileName:t,kind:"extension",name:e}))],D=new Map,Ue=Symbol.for("@prisma/dev/bundled-pglite-runtime-asset-sources"),N=null;async function G(){await ke();let e=te();if(e)return await Ge(e),await Be(e);let t=Me(),r=t.href,n=D.get(r);return n||(n=Ie(t),D.set(r,n)),await n}async function Be(e){let t=`bundled:${e.wasmModule.href}:${e.fsBundle.href}`,r=D.get(t);return r||(r=$e(e),D.set(t,r)),await r}async function Ie(e){let[t,r]=await Promise.all([(0,y.readFile)(new URL("pglite.data",e)),(0,y.readFile)(new URL("pglite.wasm",e))]),n=re();return{extensions:Object.fromEntries(Object.entries(ee).map(([o,s])=>[o,new URL(s,e)])),fsBundle:new Blob([Uint8Array.from(t)]),wasmModule:await n.compile(r)}}async function $e(e){let[t,r]=await Promise.all([V(e.fsBundle),V(e.wasmModule)]),n=re();return{extensions:e.extensions,fsBundle:new Blob([Uint8Array.from(t)]),wasmModule:await n.compile(r)}}async function Ge(e){if(e.initdbWasm.protocol!=="file:")return;let t=new URL("initdb.wasm",C(new URL("./",e.initdbWasm))),r=(0,w.fileURLToPath)(t);(0,S.existsSync)(r)||await(0,y.copyFile)((0,w.fileURLToPath)(e.initdbWasm),r)}function C(e){return e instanceof URL?Y(e):Y((0,w.pathToFileURL)(e))}function Y(e){return e.href.endsWith("/")?e:new URL(`${e.href}/`)}function Ce(){let e=De.resolve("@electric-sql/pglite");return C((0,Z.dirname)(e))}function Me(){let e=C(new URL("./",f));if(We(e))return e;if(Fe())return Ce();throw new Error("Unable to locate PGlite runtime assets. If you bundled @prisma/dev, copy them next to the bundle with copyPrismaDevRuntimeAssets().")}function We(e){return xe.every(t=>(0,S.existsSync)((0,w.fileURLToPath)(new URL(t.fileName,e))))}function te(){return globalThis[Ue]??null}async function ke(){!je()||te()||(N||(N=import("./runtime-assets-manifest.bun.js").then(()=>{}).catch(e=>{throw N=null,e})),await N)}function Fe(){let e=(0,w.fileURLToPath)(new URL("../package.json",f));if(!(0,S.existsSync)(e))return!1;try{return JSON.parse((0,S.readFileSync)(e,"utf8")).name==="@prisma/dev"}catch{return!1}}function je(){return typeof globalThis.Bun<"u"}function re(){let e=globalThis.WebAssembly;if(!e)throw new Error("WebAssembly is not available in this runtime.");return e}async function V(e){if(e.protocol==="file:")return await(0,y.readFile)(e);let t=await fetch(e);if(!t.ok)throw new Error(`Failed to fetch runtime asset ${e.href}: ${t.status} ${t.statusText}`);return new Uint8Array(await t.arrayBuffer())}var k=require("@electric-sql/pglite"),p="_prisma_dev_wal",W="events",se="install_all_triggers",ne="capture_event",oe="prisma_dev_wal_capture",T=new WeakMap,ze=new Set(["ALTER","COMMIT","COPY","CREATE","DELETE","DROP","INSERT","MERGE","TRUNCATE","UPDATE"]);async function O(e,t){let r=T.get(e);if(r&&!r.closed)return r.bridge;let n=e.execProtocolRaw.bind(e),o=e.execProtocolRawStream.bind(e),s={bridge:{close:async()=>{s.closed||(s.closed=!0,s.subscribers.clear(),e.execProtocolRaw===P&&(e.execProtocolRaw=n),e.execProtocolRawStream===m&&(e.execProtocolRawStream=o),await s.pollPromise,T.delete(e))},poll:async()=>{await M(s,e)},subscribe:i=>(s.subscribers.add(i),()=>{s.subscribers.delete(i)})},closed:!1,ensureInfrastructurePromise:null,pendingPoll:!1,pollPromise:null,subscribers:new Set,suppressDepth:0},P=async(i,c)=>{let l=await n(i,c);return!s.closed&&s.suppressDepth===0&&F(l)&&M(s,e),l},m=async(i,c)=>{let l=[],d=new k.protocol.Parser,h=c?.onRawData;await o(i,{...c,onRawData:z=>{d.parse(z,be=>{l.push(be)}),h?.(z)}}),!s.closed&&s.suppressDepth===0&&x(l)&&M(s,e)};return e.execProtocolRaw=P,e.execProtocolRawStream=m,T.set(e,s),await ae(s,e),s.bridge}async function ie(e){let t=T.get(e);t&&await t.bridge.close()}function x(e){for(let t of e){if(t.name!=="commandComplete"||typeof t.text!="string")continue;let r=t.text.split(/\s+/,1)[0]?.toUpperCase();if(r&&ze.has(r))return!0}return!1}function F(e){if(e.length===0)return!1;let t=[];return new k.protocol.Parser().parse(e,n=>{t.push(n)}),x(t)}async function ae(e,t){e.ensureInfrastructurePromise??=j(e,t,async()=>{await t.exec(`CREATE SCHEMA IF NOT EXISTS "${p}"`),await t.exec(`
2
- CREATE TABLE IF NOT EXISTS "${p}"."${W}" (
1
+ "use strict";var He=Object.create;var x=Object.defineProperty;var Ke=Object.getOwnPropertyDescriptor;var Je=Object.getOwnPropertyNames;var Ye=Object.getPrototypeOf,Xe=Object.prototype.hasOwnProperty;var Ve=(e,t)=>{for(var r in t)x(e,r,{get:t[r],enumerable:!0})},se=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of Je(t))!Xe.call(e,s)&&s!==r&&x(e,s,{get:()=>t[s],enumerable:!(n=Ke(t,s))||n.enumerable});return e};var S=(e,t,r)=>(r=e!=null?He(Ye(e)):{},se(t||!e||!e.__esModule?x(r,"default",{value:e,enumerable:!0}):r,e)),Ze=e=>se(x({},"__esModule",{value:!0}),e);var Zt={};Ve(Zt,{attachWalEventBridge:()=>k,dumpDB:()=>ze,shouldPollWalAfterMessages:()=>G,shouldPollWalAfterResponse:()=>te,startDBServer:()=>Kt,startLazyShadowDBServer:()=>Qe});module.exports=Ze(Zt);var et=()=>typeof document>"u"?new URL(`file:${__filename}`).href:document.currentScript&&document.currentScript.tagName.toUpperCase()==="SCRIPT"?document.currentScript.src:new URL("main.js",document.baseURI).href,b=et();var F=require("net"),Oe=require("path"),Me=require("pathe/utils");var B=require("fs"),P=require("fs/promises"),oe=require("util"),ae=require("zlib");var g=S(require("path"),1),q=S(require("os"),1),L=S(require("process"),1),R=q.default.homedir(),W=q.default.tmpdir(),{env:v}=L.default,tt=e=>{let t=g.default.join(R,"Library");return{data:g.default.join(t,"Application Support",e),config:g.default.join(t,"Preferences",e),cache:g.default.join(t,"Caches",e),log:g.default.join(t,"Logs",e),temp:g.default.join(W,e)}},rt=e=>{let t=v.APPDATA||g.default.join(R,"AppData","Roaming"),r=v.LOCALAPPDATA||g.default.join(R,"AppData","Local");return{data:g.default.join(r,e,"Data"),config:g.default.join(t,e,"Config"),cache:g.default.join(r,e,"Cache"),log:g.default.join(r,e,"Log"),temp:g.default.join(W,e)}},nt=e=>{let t=g.default.basename(R);return{data:g.default.join(v.XDG_DATA_HOME||g.default.join(R,".local","share"),e),config:g.default.join(v.XDG_CONFIG_HOME||g.default.join(R,".config"),e),cache:g.default.join(v.XDG_CACHE_HOME||g.default.join(R,".cache"),e),log:g.default.join(v.XDG_STATE_HOME||g.default.join(R,".local","state"),e),temp:g.default.join(W,t,e)}};function z(e,{suffix:t="nodejs"}={}){if(typeof e!="string")throw new TypeError(`Expected a string, got ${typeof e}`);return t&&(e+=`-${t}`),L.default.platform==="darwin"?tt(e):L.default.platform==="win32"?rt(e):nt(e)}var st=S(require("zeptomatch"),1),or=z("prisma-dev"),ar=(0,oe.promisify)(ae.unzip);async function ie(e){try{return await(0,P.access)(e,P.constants.F_OK),!0}catch(t){if(ot(t))return!1;throw t}}async function ue(e,t){await e.stream().pipeTo(B.WriteStream.toWeb((0,B.createWriteStream)(t,{encoding:"utf8"})))}function ot(e){return e!=null&&typeof e=="object"&&"code"in e&&e.code==="ENOENT"}var j=require("get-port-please"),ce=require("remeda");var N=class extends Error{constructor(r){super(`Port \`${r}\` is not available.`);this.port=r}name="PortNotAvailableError"};var K=require("perf_hooks"),Pe=require("@electric-sql/pglite");var me=require("buffer");var le=/(?:"[^"]+"|`[^`]+`|\[[^\]]+\]|\w+)/,at=new RegExp(`(?:${le.source}\\.)*${le.source}`),it=new RegExp(`(?:FROM|JOIN|UPDATE|INTO|TABLE)\\s+(${at.source})`,"gi"),ut=/"([^"]+)"|`([^`]+)`|\[([^\]]+)\]|(\w+)/g,de=/prismaQuery='([^']+)'/,ct=new Set([T(`
2
+ select b.oid, b.typarray
3
+ from pg_catalog.pg_type a
4
+ left join pg_catalog.pg_type b on b.oid = a.typelem
5
+ where a.typcategory = $1
6
+ group by b.oid, b.typarray
7
+ order by b.oid
8
+ `),T('GRANT "pg_write_all_data" TO "prisma_application"'),T("SELECT SUM(reads)::BIGINT AS reads, SUM(writes)::BIGINT AS writes, SUM(COALESCE(extends, $1))::BIGINT AS extends FROM pg_stat_io"),T("SELECT pg_database_size(current_database())::BIGINT, SUM(pg_total_relation_size(relid))::BIGINT AS pg_total_relation_size FROM pg_stat_user_tables"),T("SELECT COUNT(*) AS cnt FROM pg_stat_activity WHERE pid <> pg_backend_pid() and xact_start notnull")]),lt=[/^BEGIN\b/i,/^COMMIT\b/i,/^ROLLBACK\b/i,/^SAVEPOINT\b/i,/^RELEASE\b/i,/^SET\b/i,/^SHOW\b/i,/^DISCARD\b/i,/^DEALLOCATE\b/i,/^CLOSE\b/i,/^CREATE EXTENSION\b/i,/^WITH state_assign\b/i];function T(e){return e.replace(/\s+/g," ").trim()}function pe(e){return be(T(e))}function ge(e){if(!e?.action||!e.model&&/raw/i.test(e.action))return null;let t=e.payload?be(JSON.stringify(e.payload)):"0";return`${e.model??""}.${e.action}:${t}`}function dt(e){let t=new Set;for(let r of e.matchAll(it)){let n=r[1];if(!n)continue;let s;for(let o of n.matchAll(ut))s=o[1]??o[2]??o[3]??o[4];s&&!s.startsWith("pg_")&&t.add(s)}return Array.from(t)}function mt(e){return ct.has(e)?!0:lt.some(t=>t.test(e))}function fe(e){if(mt(T(e)))return null;let t=dt(e);return t.length===0&&/\bpg_\w+/i.test(e)?null:t}function H(e){if(Array.isArray(e))return e.map(H);if(e!==null&&typeof e=="object"){let t=e;return t.$type==="Param"?"<<redacted>>":Object.fromEntries(Object.entries(t).map(([r,n])=>[r,H(n)]))}return e}function ye(e){let t=e.match(de);if(!t?.[1])return{cleanedSql:T(e),prismaQueryInfo:null};let r=e.replace(de,"");r=r.replace(/,\s*,/g,",").replace(/\/\*\s*,/g,"/*").replace(/,\s*\*\//g,"*/").replace(/\/\*\s*\*\//g,"").replace(/\s+/g," ").trim();let n=decodeURIComponent(t[1]),s=n.indexOf(":");if(s===-1)return{cleanedSql:r,prismaQueryInfo:{action:n,isRaw:!0}};let o=n.slice(0,s),l=n.slice(s+1),c=o.indexOf("."),i=c===-1?void 0:o.slice(0,c),u=c===-1?o:o.slice(c+1);if(!u)return{cleanedSql:r,prismaQueryInfo:null};let p;try{p=H(JSON.parse(me.Buffer.from(l,"base64url").toString("utf8")))}catch{p=void 0}return{cleanedSql:r,prismaQueryInfo:{action:u,isRaw:!1,model:i,payload:p}}}function be(e){let t=5381;for(let r=0;r<e.length;r++)t=(t<<5)+t+e.charCodeAt(r)&4294967295;return(t>>>0).toString(36)}var O=new WeakMap;function Ee(e){let t=O.get(e);if(t&&!t.closed)return t.bridge;let r=pt(e),n={bridge:{close:()=>(n.closed||(n.closed=!0,n.sessions.clear(),n.subscribers.clear(),n.queryQueue.enqueue=n.originalEnqueue,n.queryQueue.clearQueueForHandler=n.originalClearQueueForHandler,O.delete(e)),Promise.resolve()),subscribe:s=>(n.subscribers.add(s),()=>{n.subscribers.delete(s)})},closed:!1,originalClearQueueForHandler:r.clearQueueForHandler.bind(r),originalEnqueue:r.enqueue.bind(r),queryQueue:r,sessions:new Map,subscribers:new Set};return r.clearQueueForHandler=s=>{n.sessions.delete(s),n.originalClearQueueForHandler(s)},r.enqueue=async(s,o,l)=>{let c=gt(n,s),i=bt(o);ft(c,i);let u=yt(c,i);if(!u)return await n.originalEnqueue(s,o,l);let p={commandTags:[],dataRowCount:0},y=new Pe.protocol.Parser,a=K.performance.now(),d=await n.originalEnqueue(s,o,D=>{y.parse(D,je=>{Tt(p,je)}),l(D)}),f=Math.max(0,K.performance.now()-a);return _t(n,{applicationName:u.applicationName,durationMs:f,query:u.query,responseStats:p}),d},O.set(e,n),n.bridge}async function Se(e){await O.get(e)?.bridge.close()}function pt(e){let t=e.queryQueue;if(!t||typeof t.enqueue!="function"||typeof t.clearQueueForHandler!="function")throw new Error("PGLiteSocketServer query queue is unavailable for query insights capture");return t}function gt(e,t){let r=e.sessions.get(t);if(r)return r;let n={applicationName:null,portals:new Map,statements:new Map};return e.sessions.set(t,n),n}function ft(e,t){if(t)switch(t.kind){case"startup":e.applicationName=t.applicationName;return;case"parse":e.statements.set(t.statementName,t.query);return;case"bind":{let r=e.statements.get(t.statementName);r&&e.portals.set(t.portalName,r);return}case"close":t.target==="portal"?e.portals.delete(t.name):e.statements.delete(t.name);return;default:return}}function yt(e,t){if(!t)return null;if(t.kind==="query")return{applicationName:e.applicationName,query:t.query};if(t.kind==="execute"){let r=e.portals.get(t.portalName);return r?{applicationName:e.applicationName,query:r}:null}return null}function bt(e){let t=Buffer.from(e);if(t.length<4)return null;let r=t.readInt32BE(0);if(t.length>=8&&r===t.length){let s=t.readInt32BE(4);if(s===196608||s===196608)return Pt(t)}if(t.length<5)return null;switch(String.fromCharCode(t[0]??0)){case"Q":return Et(t);case"P":return St(t);case"B":return wt(t);case"E":return ht(t);case"C":return Rt(t);default:return null}}function Pt(e){let t=8,r=null;for(;t<e.length-1;){let n=w(e,t);if(!n||n.value==="")break;t=n.nextOffset;let s=w(e,t);if(!s)break;t=s.nextOffset,n.value==="application_name"&&(r=s.value)}return{applicationName:r,kind:"startup"}}function Et(e){let t=w(e,5);return t?{kind:"query",query:t.value}:null}function St(e){let t=w(e,5);if(!t)return null;let r=w(e,t.nextOffset);return r?{kind:"parse",query:r.value,statementName:t.value}:null}function wt(e){let t=w(e,5);if(!t)return null;let r=w(e,t.nextOffset);return r?{kind:"bind",portalName:t.value,statementName:r.value}:null}function ht(e){let t=w(e,5);return t?{kind:"execute",portalName:t.value}:null}function Rt(e){if(e.length<7)return null;let t=e[5];if(t===void 0)return null;let r=w(e,6);return r?{kind:"close",name:r.value,target:t===80?"portal":"statement"}:null}function w(e,t){let r=e.indexOf(0,t);return r===-1?null:{nextOffset:r+1,value:e.toString("utf8",t,r)}}function Tt(e,t){if(t.name==="dataRow"){e.dataRowCount+=1;return}t.name==="commandComplete"&&typeof t.text=="string"&&t.text.length>0&&e.commandTags.push(t.text)}function _t(e,t){let r=ye(t.query),n=fe(r.cleanedSql);if(!n)return;let s=pe(r.cleanedSql),o={applicationName:t.applicationName,durationMs:t.durationMs,groupKey:ge(r.prismaQueryInfo),prismaQueryInfo:r.prismaQueryInfo,query:r.cleanedSql,queryId:s,reads:0,rowsReturned:At(t.responseStats),tables:n,timestamp:new Date().toISOString()};for(let l of e.subscribers)l([o])}function At(e){let t=e.commandTags.reduce((r,n)=>r+vt(n),0);return Math.max(t,e.dataRowCount)}function vt(e){let t=e.trim().split(/\s+/).at(-1);return!t||!/^\d+$/.test(t)?0:Number(t)}var A=require("fs"),_=require("fs/promises"),he=require("module"),Re=require("path"),h=require("url"),Dt=(0,he.createRequire)(b),Nt=["initdb.wasm","pglite.data","pglite.wasm"],Y="pglite-seed.tar.gz",Te={amcheck:"amcheck.tar.gz",bloom:"bloom.tar.gz",btree_gin:"btree_gin.tar.gz",btree_gist:"btree_gist.tar.gz",citext:"citext.tar.gz",cube:"cube.tar.gz",dict_int:"dict_int.tar.gz",dict_xsyn:"dict_xsyn.tar.gz",earthdistance:"earthdistance.tar.gz",file_fdw:"file_fdw.tar.gz",fuzzystrmatch:"fuzzystrmatch.tar.gz",hstore:"hstore.tar.gz",intarray:"intarray.tar.gz",isn:"isn.tar.gz",lo:"lo.tar.gz",ltree:"ltree.tar.gz",pageinspect:"pageinspect.tar.gz",pg_buffercache:"pg_buffercache.tar.gz",pg_freespacemap:"pg_freespacemap.tar.gz",pg_surgery:"pg_surgery.tar.gz",pg_trgm:"pg_trgm.tar.gz",pg_visibility:"pg_visibility.tar.gz",pg_walinspect:"pg_walinspect.tar.gz",seg:"seg.tar.gz",tablefunc:"tablefunc.tar.gz",tcn:"tcn.tar.gz",tsm_system_rows:"tsm_system_rows.tar.gz",tsm_system_time:"tsm_system_time.tar.gz",unaccent:"unaccent.tar.gz",uuid_ossp:"uuid-ossp.tar.gz",vector:"vector.tar.gz"},It=[...Nt.map(e=>({fileName:e,kind:"core",name:e})),{fileName:Y,kind:"core",name:Y},...Object.entries(Te).map(([e,t])=>({fileName:t,kind:"extension",name:e}))],C=new Map,xt=Symbol.for("@prisma/dev/bundled-pglite-runtime-asset-sources"),M=null;async function X(){await kt();let e=_e();if(e)return await Mt(e),await Lt(e);let t=Ct(),r=t.href,n=C.get(r);return n||(n=Bt(t),C.set(r,n)),await n}async function Lt(e){let t=`bundled:${e.wasmModule.href}:${e.fsBundle.href}`,r=C.get(t);return r||(r=Ot(e),C.set(t,r)),await r}async function Bt(e){let t=$(new URL("./runtime-assets/",b)),[r,n,s]=await Promise.all([(0,_.readFile)(U("pglite.data",e,t)),(0,_.readFile)(U(Y,e,t)),(0,_.readFile)(U("pglite.wasm",e,t))]),o=Ae();return{extensions:Object.fromEntries(Object.entries(Te).map(([l,c])=>[l,U(c,e,t)])),fsBundle:new Blob([Uint8Array.from(r)]),loadDataDir:new Blob([Uint8Array.from(n)]),wasmModule:await o.compile(s)}}async function Ot(e){let[t,r,n]=await Promise.all([J(e.fsBundle),J(e.loadDataDir),J(e.wasmModule)]),s=Ae();return{extensions:e.extensions,fsBundle:new Blob([Uint8Array.from(t)]),loadDataDir:new Blob([Uint8Array.from(r)]),wasmModule:await s.compile(n)}}async function Mt(e){if(e.initdbWasm.protocol!=="file:")return;let t=new URL("initdb.wasm",$(new URL("./",e.initdbWasm))),r=(0,h.fileURLToPath)(t);(0,A.existsSync)(r)||await(0,_.copyFile)((0,h.fileURLToPath)(e.initdbWasm),r)}function $(e){return e instanceof URL?we(e):we((0,h.pathToFileURL)(e))}function we(e){return e.href.endsWith("/")?e:new URL(`${e.href}/`)}function Ut(){let e=Dt.resolve("@electric-sql/pglite");return $((0,Re.dirname)(e))}function Ct(){let e=$(new URL("./",b));if($t(e))return e;if(Gt())return Ut();throw new Error("Unable to locate PGlite runtime assets. If you bundled @prisma/dev, copy them next to the bundle with copyPrismaDevRuntimeAssets().")}function $t(e){return It.every(t=>(0,A.existsSync)((0,h.fileURLToPath)(new URL(t.fileName,e))))}function _e(){return globalThis[xt]??null}async function kt(){!Qt()||_e()||(M||(M=import("./runtime-assets-manifest.bun.js").then(()=>{}).catch(e=>{throw M=null,e})),await M)}function Gt(){let e=(0,h.fileURLToPath)(new URL("../package.json",b));if(!(0,A.existsSync)(e))return!1;try{return JSON.parse((0,A.readFileSync)(e,"utf8")).name==="@prisma/dev"}catch{return!1}}function Qt(){return typeof globalThis.Bun<"u"}function Ae(){let e=globalThis.WebAssembly;if(!e)throw new Error("WebAssembly is not available in this runtime.");return e}async function J(e){if(e.protocol==="file:")return await(0,_.readFile)(e);let t=await fetch(e);if(!t.ok)throw new Error(`Failed to fetch runtime asset ${e.href}: ${t.status} ${t.statusText}`);return new Uint8Array(await t.arrayBuffer())}function U(e,t,r){let n=new URL(e,t);if((0,A.existsSync)((0,h.fileURLToPath)(n)))return n;if(r){let s=new URL(e,r);if((0,A.existsSync)((0,h.fileURLToPath)(s)))return s}return n}var ee=require("@electric-sql/pglite"),E="_prisma_dev_wal",Z="events",Ne="install_all_triggers",ve="capture_event",De="prisma_dev_wal_capture",I=new WeakMap,Ft=new Set(["ALTER","COMMIT","COPY","CREATE","DELETE","DROP","INSERT","MERGE","TRUNCATE","UPDATE"]);async function k(e,t){let r=I.get(e);if(r&&!r.closed)return r.bridge;let n=e.execProtocolRaw.bind(e),s=e.execProtocolRawStream.bind(e),o={bridge:{close:async()=>{o.closed||(o.closed=!0,o.subscribers.clear(),e.execProtocolRaw===l&&(e.execProtocolRaw=n),e.execProtocolRawStream===c&&(e.execProtocolRawStream=s),await o.pollPromise,I.delete(e))},poll:async()=>{await V(o,e)},subscribe:i=>(o.subscribers.add(i),()=>{o.subscribers.delete(i)})},closed:!1,ensureInfrastructurePromise:null,pendingPoll:!1,pollPromise:null,subscribers:new Set,suppressDepth:0},l=async(i,u)=>{let p=await n(i,u);return!o.closed&&o.suppressDepth===0&&te(p)&&V(o,e),p},c=async(i,u)=>{let p=[],y=new ee.protocol.Parser,a=u?.onRawData;await s(i,{...u,onRawData:d=>{y.parse(d,f=>{p.push(f)}),a?.(d)}}),!o.closed&&o.suppressDepth===0&&G(p)&&V(o,e)};return e.execProtocolRaw=l,e.execProtocolRawStream=c,I.set(e,o),await xe(o,e),o.bridge}async function Ie(e){let t=I.get(e);t&&await t.bridge.close()}function G(e){for(let t of e){if(t.name!=="commandComplete"||typeof t.text!="string")continue;let r=t.text.split(/\s+/,1)[0]?.toUpperCase();if(r&&Ft.has(r))return!0}return!1}function te(e){if(e.length===0)return!1;let t=[];return new ee.protocol.Parser().parse(e,n=>{t.push(n)}),G(t)}async function xe(e,t){e.ensureInfrastructurePromise??=re(e,t,async()=>{await t.exec(`CREATE SCHEMA IF NOT EXISTS "${E}"`),await t.exec(`
9
+ CREATE TABLE IF NOT EXISTS "${E}"."${Z}" (
3
10
  id BIGSERIAL PRIMARY KEY,
4
11
  txid BIGINT NOT NULL DEFAULT txid_current(),
5
12
  schema_name TEXT NOT NULL,
@@ -10,16 +17,16 @@
10
17
  created_at TIMESTAMPTZ NOT NULL DEFAULT clock_timestamp()
11
18
  )
12
19
  `),await t.exec(`
13
- CREATE OR REPLACE FUNCTION "${p}"."${ne}"()
20
+ CREATE OR REPLACE FUNCTION "${E}"."${ve}"()
14
21
  RETURNS trigger
15
22
  LANGUAGE plpgsql
16
23
  AS $$
17
24
  BEGIN
18
- IF TG_TABLE_SCHEMA = '${p}' THEN
25
+ IF TG_TABLE_SCHEMA = '${E}' THEN
19
26
  RETURN COALESCE(NEW, OLD);
20
27
  END IF;
21
28
 
22
- INSERT INTO "${p}"."${W}" (
29
+ INSERT INTO "${E}"."${Z}" (
23
30
  txid,
24
31
  schema_name,
25
32
  table_name,
@@ -40,7 +47,7 @@
40
47
  END;
41
48
  $$;
42
49
  `),await t.exec(`
43
- CREATE OR REPLACE FUNCTION "${p}"."${se}"()
50
+ CREATE OR REPLACE FUNCTION "${E}"."${Ne}"()
44
51
  RETURNS void
45
52
  LANGUAGE plpgsql
46
53
  AS $$
@@ -52,7 +59,7 @@
52
59
  FROM pg_class AS c
53
60
  JOIN pg_namespace AS n ON n.oid = c.relnamespace
54
61
  WHERE c.relkind IN ('r', 'p')
55
- AND n.nspname NOT IN ('${p}', 'information_schema', 'pg_catalog')
62
+ AND n.nspname NOT IN ('${E}', 'information_schema', 'pg_catalog')
56
63
  AND n.nspname NOT LIKE 'pg_temp_%'
57
64
  AND n.nspname NOT LIKE 'pg_toast%'
58
65
  LOOP
@@ -60,28 +67,28 @@
60
67
  SELECT 1
61
68
  FROM pg_trigger
62
69
  WHERE tgrelid = target
63
- AND tgname = '${oe}'
70
+ AND tgname = '${De}'
64
71
  ) THEN
65
72
  CONTINUE;
66
73
  END IF;
67
74
 
68
75
  EXECUTE format(
69
- 'CREATE TRIGGER %I AFTER INSERT OR UPDATE OR DELETE ON %s FOR EACH ROW EXECUTE FUNCTION "${p}"."${ne}"()',
70
- '${oe}',
76
+ 'CREATE TRIGGER %I AFTER INSERT OR UPDATE OR DELETE ON %s FOR EACH ROW EXECUTE FUNCTION "${E}"."${ve}"()',
77
+ '${De}',
71
78
  target::text
72
79
  );
73
80
  END LOOP;
74
81
  END;
75
82
  $$;
76
- `),await ce(e,t)}),await e.ensureInfrastructurePromise}async function ce(e,t){await j(e,t,async()=>{await t.query(`SELECT "${p}"."${se}"()`)})}async function qe(e,t){await ae(e,t),await ce(e,t);let r=await j(e,t,async()=>await t.query(`
83
+ `),await Le(e,t)}),await e.ensureInfrastructurePromise}async function Le(e,t){await re(e,t,async()=>{await t.query(`SELECT "${E}"."${Ne}"()`)})}async function qt(e,t){await xe(e,t),await Le(e,t);let r=await re(e,t,async()=>await t.query(`
77
84
  WITH drained AS (
78
- DELETE FROM "${p}"."${W}"
85
+ DELETE FROM "${E}"."${Z}"
79
86
  RETURNING txid, schema_name, table_name, op, row_data, old_row_data, id
80
87
  )
81
88
  SELECT txid, schema_name, table_name, op, row_data, old_row_data
82
89
  FROM drained
83
90
  ORDER BY id
84
- `));if(r.rows.length===0||e.subscribers.size===0)return;let n=r.rows.map(He);for(let o of e.subscribers)queueMicrotask(()=>{if(!e.closed&&e.subscribers.has(o))try{o(n)}catch(s){console.error("[WAL bridge] subscriber failed",s)}})}async function M(e,t){if(!e.closed){if(e.pollPromise){e.pendingPoll=!0,await e.pollPromise;return}e.pollPromise=(async()=>{do e.pendingPoll=!1,await qe(e,t);while(e.pendingPoll&&!e.closed)})().finally(()=>{e.pollPromise=null}),await e.pollPromise}}async function j(e,t,r){e.suppressDepth+=1;try{return await r()}finally{e.suppressDepth-=1,e.suppressDepth===0&&!e.closed&&T.get(t)!==e&&(e.closed=!0)}}function He(e){return{oldRecord:e.old_row_data,record:e.row_data,schema:e.schema_name,table:e.table_name,txid:String(e.txid),type:Ke(e.op)}}function Ke(e){switch(e.toLowerCase()){case"delete":return"delete";case"insert":return"insert";case"update":return"update";default:throw new Error(`Unsupported WAL bridge operation: ${e}`)}}var Xe=10,u={connectionLimit:Xe,connectTimeout:0,database:"template1",maxIdleConnectionLifetime:0,password:"postgres",poolTimeout:0,socketTimeout:0,sslMode:"disable",username:"postgres"},Je=`postgres://${u.username}:${u.password}@localhost`,pe=new URLSearchParams({sslmode:u.sslMode}),Ye=new URLSearchParams({...Object.fromEntries(pe.entries()),connection_limit:String(u.connectionLimit),connect_timeout:String(u.connectTimeout),max_idle_connection_lifetime:String(u.maxIdleConnectionLifetime),pool_timeout:String(u.poolTimeout),socket_timeout:String(u.socketTimeout)});async function ge(e){let{rows:t}=await e.query("SELECT EXISTS(SELECT 1 FROM pg_roles WHERE rolname = 'postgres') AS exists");t[0]?.exists?await e.exec(`ALTER ROLE ${u.username} WITH LOGIN SUPERUSER PASSWORD '${u.password}'`):await e.exec(`CREATE ROLE ${u.username} WITH LOGIN SUPERUSER PASSWORD '${u.password}'`),await e.exec(`SET ROLE ${u.username}`)}async function Ve(e,t){let r=e==="database"?t.databasePort:t.shadowDatabasePort;if(t.dryRun)return le(e,t,{db:null,port:r,server:null});let{debug:n}=t,s=await(e==="shadow_database"?Qe:fe)(t.pgliteDataDirPath,n);n&&s.onNotification((l,d)=>{console.debug(`[${e}][${l}] ${d}`)});let{PGLiteSocketServer:P}=await import("@electric-sql/pglite-socket"),m=e==="shadow_database"?t.shadowDatabaseIdleTimeoutMillis:t.databaseIdleTimeoutMillis,i=new P({db:s,debug:n,idleTimeout:Number.isFinite(m)?m:0,inspect:n,maxConnections:u.connectionLimit,port:r});n&&(i.addEventListener("listening",l=>{let{detail:d}=l;console.debug(`[${e}] server listening on ${JSON.stringify(d)}`)}),i.addEventListener("connection",l=>{let{clientAddress:d,clientPort:h}=l.detail;console.debug(`[${e}] client connected from ${d}:${h}`)}),i.addEventListener("error",l=>{let{detail:d}=l;console.error(`[${e}] server error:`,d)}));try{await i.start()}catch(l){throw l instanceof Error&&"code"in l&&l.code==="EADDRINUSE"?new L(r):l}let c=Number(i.getServerConn().split(":").at(1));return t[e==="database"?"databasePort":"shadowDatabasePort"]=c,le(e,t,{db:s,port:c,server:i})}function le(e,t,r){let{debug:n}=t,{db:o,port:s,server:P}=r||{},m=new Map;return n&&console.debug(`[${e}] server started on port ${s}`),{...u,attachWalEventBridge:async()=>{if(e!=="database"||!o)throw new Error("WAL bridge is only available for the primary database server");return await O(o)},close:async()=>{let i=[];try{await P?.stop(),n&&console.debug(`[${e}] server stopped on port ${s}`)}catch(c){console.error(`[${e}] server stop error`,c),i.push(c)}if(e==="database"){try{o&&await ie(o),n&&console.debug(`[${e}] closed WAL bridge`)}catch(c){console.error(`[${e}] WAL bridge close error`,c),i.push(c)}try{await o?.syncToFs(),n&&console.debug(`[${e}] synced to filesystem`)}catch(c){console.error(`[${e}] sync error`,c),i.push(c)}}try{await o?.close(),n&&console.debug(`[${e}] closed`)}catch(c){console.error(`[${e}] close error`,c),i.push(c)}if(i.length>0)throw new AggregateError(i,`Failed to close ${e} properly`)},connectionString:ue(s,pe),dump:async i=>{e==="shadow_database"||!o||await Pe({db:o,debug:n,destinationPath:i})},getPrimaryKeyColumns:async(i,c)=>{if(e==="shadow_database"||!o)throw new Error("Primary key resolution is only available for the primary database server");let l=`${i}.${c}`,d=m.get(l);return d||(d=Ze(o,i,c).catch(h=>{throw m.delete(l),h}),m.set(l,d)),await d},port:s,prismaORMConnectionString:ue(s,Ye),terminalCommand:`PGPASSWORD=${u.password} PGSSLMODE=${u.sslMode} psql -h localhost -p ${s} -U ${u.username} -d ${u.database}`}}function ue(e,t){return`${Je}:${e}/${u.database}?${t.toString()}`}async function fe(e,t){let{PGlite:r}=await import("@electric-sql/pglite"),n=await G(),o=await r.create({database:u.database,dataDir:e,debug:t?5:void 0,extensions:n.extensions,fsBundle:n.fsBundle,relaxedDurability:!1,wasmModule:n.wasmModule});return await ge(o),o}async function Qe(e,t){let{PGlite:r}=await import("@electric-sql/pglite"),n=await G(),o=await r.create({database:u.database,dataDir:"memory://",debug:t?5:void 0,extensions:n.extensions,fsBundle:n.fsBundle,relaxedDurability:!1,wasmModule:n.wasmModule});return await ge(o),o}async function Ze(e,t,r){let{rows:n}=await e.query(`
91
+ `));if(r.rows.length===0||e.subscribers.size===0)return;let n=r.rows.map(Wt);for(let s of e.subscribers)queueMicrotask(()=>{if(!e.closed&&e.subscribers.has(s))try{s(n)}catch(o){console.error("[WAL bridge] subscriber failed",o)}})}async function V(e,t){if(!e.closed){if(e.pollPromise){e.pendingPoll=!0,await e.pollPromise;return}e.pollPromise=(async()=>{do e.pendingPoll=!1,await qt(e,t);while(e.pendingPoll&&!e.closed)})().finally(()=>{e.pollPromise=null}),await e.pollPromise}}async function re(e,t,r){e.suppressDepth+=1;try{return await r()}finally{e.suppressDepth-=1,e.suppressDepth===0&&!e.closed&&I.get(t)!==e&&(e.closed=!0)}}function Wt(e){return{oldRecord:e.old_row_data,record:e.row_data,schema:e.schema_name,table:e.table_name,txid:String(e.txid),type:zt(e.op)}}function zt(e){switch(e.toLowerCase()){case"delete":return"delete";case"insert":return"insert";case"update":return"update";default:throw new Error(`Unsupported WAL bridge operation: ${e}`)}}var jt=10,Ue="127.0.0.1",Ce=128*1024*1024,$e=["-c","shared_buffers=16MB","-c","temp_buffers=1MB","-c","work_mem=1MB","-c","maintenance_work_mem=16MB","-c","wal_buffers=1MB"],m={connectionLimit:jt,connectTimeout:0,database:"template1",maxIdleConnectionLifetime:0,password:"postgres",poolTimeout:0,socketTimeout:0,sslMode:"disable",username:"postgres"},Ht=`postgres://${m.username}:${m.password}@localhost`,ne=new URLSearchParams({sslmode:m.sslMode}),ke=new URLSearchParams({...Object.fromEntries(ne.entries()),connection_limit:String(m.connectionLimit),connect_timeout:String(m.connectTimeout),max_idle_connection_lifetime:String(m.maxIdleConnectionLifetime),pool_timeout:String(m.poolTimeout),socket_timeout:String(m.socketTimeout)});async function Ge(e){let{rows:t}=await e.query("SELECT EXISTS(SELECT 1 FROM pg_roles WHERE rolname = 'postgres') AS exists");t[0]?.exists?await e.exec(`ALTER ROLE ${m.username} WITH LOGIN SUPERUSER PASSWORD '${m.password}'`):await e.exec(`CREATE ROLE ${m.username} WITH LOGIN SUPERUSER PASSWORD '${m.password}'`),await e.exec(`SET ROLE ${m.username}`)}async function Kt(e,t){if(e==="shadow_database"&&!t.dryRun)return await Qe(t);let r=e==="database"?t.databasePort:t.shadowDatabasePort;return t.dryRun?qe(e,t,{db:null,port:r,server:null}):await Fe(e,t,{port:r,updateServerStatePort:!0})}async function Qe(e,t=async()=>await Fe("shadow_database",e,{port:0,updateServerStatePort:!1})){let{debug:r}=e,n=null,s=null,o=!1,l=new Set,c=(0,F.createServer)(u),i=await Jt(c,e.shadowDatabasePort);return e.shadowDatabasePort=i,r&&console.debug(`[shadow_database] lazy proxy listening on port ${i}`),{...m,attachWalEventBridge:()=>Promise.reject(new Error("WAL bridge is only available for the primary database server")),attachQueryInsightsBridge:()=>Promise.reject(new Error("Query insights are only available for the primary database server")),close:async()=>{o=!0;for(let d of l)d.destroy();l.clear();let a=[];try{await Yt(c),r&&console.debug(`[shadow_database] lazy proxy stopped on port ${i}`)}catch(d){console.error("[shadow_database] lazy proxy stop error",d),a.push(d)}try{await s?.catch(()=>null),await n?.close()}catch(d){console.error("[shadow_database] backend close error",d),a.push(d)}if(a.length>0)throw new AggregateError(a,"Failed to close shadow_database properly")},connectionString:Q(i,ne),dump:async()=>{},getPrimaryKeyColumns:()=>Promise.reject(new Error("Primary key resolution is only available for the primary database server")),port:i,prismaORMConnectionString:Q(i,ke),terminalCommand:`PGPASSWORD=${m.password} PGSSLMODE=${m.sslMode} psql -h localhost -p ${i} -U ${m.username} -d ${m.database}`};function u(a){l.add(a);let d=()=>{l.delete(a)};a.once("close",d),a.once("error",d),a.pause(),p(a)}async function p(a){try{let d=await y();if(o){a.destroy();return}let f=(0,F.createConnection)({host:Ue,port:d.port});l.add(f);let D=()=>{l.delete(f)};f.once("close",D),f.once("error",D),a.once("close",()=>f.destroy()),a.once("error",()=>f.destroy()),f.once("error",()=>a.destroy()),f.once("connect",()=>{r&&console.debug(`[shadow_database] proxying connection to lazy backend on port ${d.port}`),a.resume(),a.pipe(f),f.pipe(a)})}catch(d){r&&console.error("[shadow_database] failed to start lazy backend",d),a.destroy(d instanceof Error?d:void 0)}}async function y(){if(n)return n;if(o)throw new Error("shadow_database is closed");return s||(r&&console.debug("[shadow_database] starting lazy backend..."),s=t().then(a=>(n=a,r&&console.debug(`[shadow_database] lazy backend started on port ${a.port}`),a)).catch(a=>{throw s=null,a})),await s}}async function Fe(e,t,r){let{debug:n}=t,{port:s,updateServerStatePort:o}=r,c=await(e==="shadow_database"?Xt:We)(t.pgliteDataDirPath,n);n&&c.onNotification((a,d)=>{console.debug(`[${e}][${a}] ${d}`)});let{PGLiteSocketServer:i}=await import("@electric-sql/pglite-socket"),u=e==="shadow_database"?t.shadowDatabaseIdleTimeoutMillis:t.databaseIdleTimeoutMillis,p=new i({db:c,debug:n,idleTimeout:Number.isFinite(u)?u:0,inspect:n,maxConnections:m.connectionLimit,port:s});n&&(p.addEventListener("listening",a=>{let{detail:d}=a;console.debug(`[${e}] server listening on ${JSON.stringify(d)}`)}),p.addEventListener("connection",a=>{let{clientAddress:d,clientPort:f}=a.detail;console.debug(`[${e}] client connected from ${d}:${f}`)}),p.addEventListener("error",a=>{let{detail:d}=a;console.error(`[${e}] server error:`,d)}));try{await p.start()}catch(a){throw a instanceof Error&&"code"in a&&a.code==="EADDRINUSE"?new N(s):a}let y=Number(p.getServerConn().split(":").at(1));return o&&(t[e==="database"?"databasePort":"shadowDatabasePort"]=y),qe(e,t,{db:c,port:y,server:p})}function qe(e,t,r){let{debug:n}=t,{db:s,port:o,server:l}=r||{},c=new Map;return n&&console.debug(`[${e}] server started on port ${o}`),{...m,attachWalEventBridge:async()=>{if(e!=="database"||!s)throw new Error("WAL bridge is only available for the primary database server");return await k(s)},attachQueryInsightsBridge:()=>{if(e!=="database"||!l)throw new Error("Query insights are only available for the primary database server");return Promise.resolve(Ee(l))},close:async()=>{let i=[];try{await l?.stop(),n&&console.debug(`[${e}] server stopped on port ${o}`)}catch(u){console.error(`[${e}] server stop error`,u),i.push(u)}if(e==="database"){try{l&&await Se(l),n&&console.debug(`[${e}] closed query insights bridge`)}catch(u){console.error(`[${e}] query insights bridge close error`,u),i.push(u)}try{s&&await Ie(s),n&&console.debug(`[${e}] closed WAL bridge`)}catch(u){console.error(`[${e}] WAL bridge close error`,u),i.push(u)}try{await s?.syncToFs(),n&&console.debug(`[${e}] synced to filesystem`)}catch(u){console.error(`[${e}] sync error`,u),i.push(u)}}try{await s?.close(),n&&console.debug(`[${e}] closed`)}catch(u){console.error(`[${e}] close error`,u),i.push(u)}if(i.length>0)throw new AggregateError(i,`Failed to close ${e} properly`)},connectionString:Q(o,ne),dump:async i=>{e==="shadow_database"||!s||await ze({db:s,debug:n,destinationPath:i})},getPrimaryKeyColumns:async(i,u)=>{if(e==="shadow_database"||!s)throw new Error("Primary key resolution is only available for the primary database server");let p=`${i}.${u}`,y=c.get(p);return y||(y=Vt(s,i,u).catch(a=>{throw c.delete(p),a}),c.set(p,y)),await y},port:o,prismaORMConnectionString:Q(o,ke),terminalCommand:`PGPASSWORD=${m.password} PGSSLMODE=${m.sslMode} psql -h localhost -p ${o} -U ${m.username} -d ${m.database}`}}function Q(e,t){return`${Ht}:${e}/${m.database}?${t.toString()}`}async function We(e,t){let{PGlite:r}=await import("@electric-sql/pglite"),n=await X(),s=e==="memory://"||!await ie((0,Oe.join)(e,"PG_VERSION")),o=await r.create({database:m.database,dataDir:e,debug:t?5:void 0,extensions:n.extensions,fsBundle:n.fsBundle,initialMemory:Ce,loadDataDir:s?n.loadDataDir:void 0,relaxedDurability:!1,startParams:[...r.defaultStartParams,...$e],wasmModule:n.wasmModule});return await Ge(o),o}async function Jt(e,t){return await new Promise((r,n)=>{let s=c=>{if(l(),c.code==="EADDRINUSE"){n(new N(t));return}n(c)},o=()=>{let c=e.address();if(l(),!c||typeof c=="string"){n(new Error("Failed to determine TCP server port"));return}r(c.port)},l=()=>{e.off("error",s),e.off("listening",o)};e.once("error",s),e.once("listening",o),e.listen(t,Ue)})}async function Yt(e){await new Promise((t,r)=>{e.close(n=>{let s=n;if(s&&s.code!=="ERR_SERVER_NOT_RUNNING"){r(s);return}t()})})}async function Xt(e,t){let{PGlite:r}=await import("@electric-sql/pglite"),n=await X(),s=await r.create({database:m.database,dataDir:"memory://",debug:t?5:void 0,extensions:n.extensions,fsBundle:n.fsBundle,initialMemory:Ce,loadDataDir:n.loadDataDir,relaxedDurability:!1,startParams:[...r.defaultStartParams,...$e],wasmModule:n.wasmModule});return await Ge(s),s}async function Vt(e,t,r){let{rows:n}=await e.query(`
85
92
  SELECT attribute.attname AS column_name
86
93
  FROM pg_constraint pk_constraint
87
94
  INNER JOIN pg_class relation
@@ -94,7 +101,7 @@
94
101
  ON attribute.attrelid = relation.oid
95
102
  AND attribute.attnum = keys.attnum
96
103
  WHERE pk_constraint.contype = 'p'
97
- AND namespace.nspname = ${de(t)}
98
- AND relation.relname = ${de(r)}
104
+ AND namespace.nspname = ${Be(t)}
105
+ AND relation.relname = ${Be(r)}
99
106
  ORDER BY keys.ordinality
100
- `);return n.map(o=>o.column_name)}function de(e){return`'${e.replaceAll("'","''")}'`}async function Pe(e){let{dataDir:t,db:r,debug:n,destinationPath:o}=e,s=r||await fe(t,n),{pgDump:P}=await import("@electric-sql/pglite-tools/pg_dump"),m=await P({args:["--schema-only","--no-owner"],fileName:o?(0,me.filename)(o):void 0,pg:await s.clone()});return o?(n&&console.debug(`[DB] Dumping database to ${o}`),await X(m,o)):(n&&console.debug("[DB] Dumping database to memory"),await m.text())}0&&(module.exports={attachWalEventBridge,dumpDB,shouldPollWalAfterMessages,shouldPollWalAfterResponse,startDBServer});
107
+ `);return n.map(s=>s.column_name)}function Be(e){return`'${e.replaceAll("'","''")}'`}async function ze(e){let{dataDir:t,db:r,debug:n,destinationPath:s}=e,o=r||await We(t,n),{pgDump:l}=await import("@electric-sql/pglite-tools/pg_dump"),c=await l({args:["--schema-only","--no-owner"],fileName:s?(0,Me.filename)(s):void 0,pg:await o.clone()});return s?(n&&console.debug(`[DB] Dumping database to ${s}`),await ue(c,s)):(n&&console.debug("[DB] Dumping database to memory"),await c.text())}0&&(module.exports={attachWalEventBridge,dumpDB,shouldPollWalAfterMessages,shouldPollWalAfterResponse,startDBServer,startLazyShadowDBServer});
package/dist/db.d.cts CHANGED
@@ -1,71 +1,4 @@
1
- import { PGlite } from '@electric-sql/pglite';
2
- import { c as ServerState } from './state-DTMxyzXf.cjs';
1
+ import '@electric-sql/pglite';
2
+ export { c as DBDump, d as DBServer, D as DBServerPurpose, e as DumpDBOptions, W as WalEvent, f as WalEventBridge, g as attachWalEventBridge, h as dumpDB, s as shouldPollWalAfterMessages, i as shouldPollWalAfterResponse, j as startDBServer, k as startLazyShadowDBServer } from './db-BzbLAxLn.cjs';
3
+ import './state-CNKFAMiX.cjs';
3
4
  import 'valibot';
4
-
5
- interface WalEvent {
6
- oldRecord: Record<string, unknown> | null;
7
- record: Record<string, unknown> | null;
8
- schema: string;
9
- table: string;
10
- txid: string;
11
- type: "delete" | "insert" | "update";
12
- }
13
- interface WalEventBridge {
14
- close(): Promise<void>;
15
- poll(): Promise<void>;
16
- subscribe(callback: WalEventSubscriber): () => void;
17
- }
18
- interface WalEventBridgeOptions {
19
- database?: string;
20
- host?: string;
21
- password?: string;
22
- port?: number;
23
- username?: string;
24
- }
25
- type WalEventSubscriber = (events: WalEvent[]) => void;
26
- type PolledMessage = {
27
- name: string;
28
- text?: string;
29
- };
30
- declare function attachWalEventBridge(db: PGlite, _options?: WalEventBridgeOptions): Promise<WalEventBridge>;
31
- declare function shouldPollWalAfterMessages(messages: PolledMessage[]): boolean;
32
- declare function shouldPollWalAfterResponse(response: Uint8Array): boolean;
33
-
34
- interface DBServer {
35
- attachWalEventBridge(): Promise<WalEventBridge>;
36
- close(): Promise<void>;
37
- readonly connectionLimit: number;
38
- readonly connectionString: string;
39
- readonly connectTimeout: number;
40
- readonly database: string;
41
- dump(destinationPath: string): Promise<void>;
42
- readonly maxIdleConnectionLifetime: number;
43
- readonly password: string;
44
- readonly poolTimeout: number;
45
- readonly port: number;
46
- readonly prismaORMConnectionString: string;
47
- getPrimaryKeyColumns(schema: string, table: string): Promise<readonly string[]>;
48
- readonly socketTimeout: number;
49
- readonly sslMode: string;
50
- readonly terminalCommand: string;
51
- readonly username: string;
52
- }
53
- interface DBDump {
54
- dumpPath: string;
55
- }
56
- type DBServerPurpose = "database" | "shadow_database";
57
- declare function startDBServer(purpose: DBServerPurpose, serverState: ServerState): Promise<DBServer>;
58
- type DumpDBOptions<D extends string> = {
59
- dataDir: string;
60
- db?: never;
61
- debug?: boolean;
62
- destinationPath?: D;
63
- } | {
64
- dataDir?: never;
65
- db: PGlite;
66
- debug?: boolean;
67
- destinationPath?: D;
68
- };
69
- declare function dumpDB<D extends string = never>(options: DumpDBOptions<D>): Promise<[D] extends [never] ? string : void>;
70
-
71
- export { type DBDump, type DBServer, type DBServerPurpose, type DumpDBOptions, type WalEvent, type WalEventBridge, attachWalEventBridge, dumpDB, shouldPollWalAfterMessages, shouldPollWalAfterResponse, startDBServer };
package/dist/db.d.ts CHANGED
@@ -1,71 +1,4 @@
1
- import { PGlite } from '@electric-sql/pglite';
2
- import { c as ServerState } from './state-DTMxyzXf.js';
1
+ import '@electric-sql/pglite';
2
+ export { c as DBDump, d as DBServer, D as DBServerPurpose, e as DumpDBOptions, W as WalEvent, f as WalEventBridge, g as attachWalEventBridge, h as dumpDB, s as shouldPollWalAfterMessages, i as shouldPollWalAfterResponse, j as startDBServer, k as startLazyShadowDBServer } from './db-HU7BFiFV.js';
3
+ import './state-CNKFAMiX.js';
3
4
  import 'valibot';
4
-
5
- interface WalEvent {
6
- oldRecord: Record<string, unknown> | null;
7
- record: Record<string, unknown> | null;
8
- schema: string;
9
- table: string;
10
- txid: string;
11
- type: "delete" | "insert" | "update";
12
- }
13
- interface WalEventBridge {
14
- close(): Promise<void>;
15
- poll(): Promise<void>;
16
- subscribe(callback: WalEventSubscriber): () => void;
17
- }
18
- interface WalEventBridgeOptions {
19
- database?: string;
20
- host?: string;
21
- password?: string;
22
- port?: number;
23
- username?: string;
24
- }
25
- type WalEventSubscriber = (events: WalEvent[]) => void;
26
- type PolledMessage = {
27
- name: string;
28
- text?: string;
29
- };
30
- declare function attachWalEventBridge(db: PGlite, _options?: WalEventBridgeOptions): Promise<WalEventBridge>;
31
- declare function shouldPollWalAfterMessages(messages: PolledMessage[]): boolean;
32
- declare function shouldPollWalAfterResponse(response: Uint8Array): boolean;
33
-
34
- interface DBServer {
35
- attachWalEventBridge(): Promise<WalEventBridge>;
36
- close(): Promise<void>;
37
- readonly connectionLimit: number;
38
- readonly connectionString: string;
39
- readonly connectTimeout: number;
40
- readonly database: string;
41
- dump(destinationPath: string): Promise<void>;
42
- readonly maxIdleConnectionLifetime: number;
43
- readonly password: string;
44
- readonly poolTimeout: number;
45
- readonly port: number;
46
- readonly prismaORMConnectionString: string;
47
- getPrimaryKeyColumns(schema: string, table: string): Promise<readonly string[]>;
48
- readonly socketTimeout: number;
49
- readonly sslMode: string;
50
- readonly terminalCommand: string;
51
- readonly username: string;
52
- }
53
- interface DBDump {
54
- dumpPath: string;
55
- }
56
- type DBServerPurpose = "database" | "shadow_database";
57
- declare function startDBServer(purpose: DBServerPurpose, serverState: ServerState): Promise<DBServer>;
58
- type DumpDBOptions<D extends string> = {
59
- dataDir: string;
60
- db?: never;
61
- debug?: boolean;
62
- destinationPath?: D;
63
- } | {
64
- dataDir?: never;
65
- db: PGlite;
66
- debug?: boolean;
67
- destinationPath?: D;
68
- };
69
- declare function dumpDB<D extends string = never>(options: DumpDBOptions<D>): Promise<[D] extends [never] ? string : void>;
70
-
71
- export { type DBDump, type DBServer, type DBServerPurpose, type DumpDBOptions, type WalEvent, type WalEventBridge, attachWalEventBridge, dumpDB, shouldPollWalAfterMessages, shouldPollWalAfterResponse, startDBServer };
package/dist/db.js CHANGED
@@ -1 +1 @@
1
- import{a,b,c,d,e}from"./chunk-YL6J3L2T.js";import"./chunk-62DM64XC.js";import"./chunk-X3G665AK.js";import"./chunk-DWY47FQV.js";export{a as attachWalEventBridge,e as dumpDB,b as shouldPollWalAfterMessages,c as shouldPollWalAfterResponse,d as startDBServer};
1
+ import{c as a,d as b,e as c,f as d,g as e,h as f}from"./chunk-PP43TGA5.js";import"./chunk-KWCQYPJI.js";import"./chunk-EDFHV3AK.js";import"./chunk-DWY47FQV.js";export{a as attachWalEventBridge,f as dumpDB,b as shouldPollWalAfterMessages,c as shouldPollWalAfterResponse,d as startDBServer,e as startLazyShadowDBServer};
@@ -0,0 +1,3 @@
1
+ import{b as f,d as w,e as y}from"./chunk-DWY47FQV.js";import{a as E,b as v,c as b}from"./chunk-DOJAPHLY.js";import{spawn as $}from"child_process";import{once as H}from"events";import{mkdir as C}from"fs/promises";import{join as A}from"path";import{setTimeout as j}from"timers/promises";function R(r){let e,t,s=new Promise((i,a)=>{e=i,t=a}),n=i=>{n=o=null,t(i),r?.onRejected?.(i),r?.onFulfilled?.()},o=i=>{o=n=null,e(i),r?.onResolved?.(i),r?.onFulfilled?.()};return{isFulfilled:()=>o===n,promise:s,reject:i=>n?.(i),resolve:i=>o?.(i)}}import{process as B}from"std-env";var{PRISMA_DEV_FORCE_ENGINE_BINARY_DOWNLOAD:L,PRISMA_DEV_FORCE_ENGINE_BINARY_PATH:N,PRISMA_DEV_FORCE_NETWORK_DELAY_MS:P}=B.env,S=class r{static#t=new Map;#e;#n;constructor(e){this.#e=e,this.#n=null}static async get(e){let{debug:t}=e,s=`${e.schemaHash}:${e.clientVersion}`;try{let n=r.#t.get(s);if(n)return n;let o=new r(e);return r.#t.set(s,o),t&&console.debug("[Query Engine] starting...",e),await o.start(),t&&console.debug("[Query Engine] started!"),o}finally{r.stopAll(s)}}static async stopAll(e){let s=(await Promise.allSettled(Array.from(r.#t.entries()).filter(([n])=>n!==e).map(async([n,o])=>{try{await o.stop()}finally{r.#t.delete(n)}}))).filter(n=>n.status==="rejected").map(n=>n.reason);if(s.length>0)throw new AggregateError(s,"Failed to stop engines")}async commitTransaction(e,t){return await this.#s(e,t,"commit")}async request(e,t){let{url:s}=await this.start(),n=this.#i(t),o=await fetch(s,{body:typeof e=="string"?e:JSON.stringify(e),headers:{...n,"Content-Type":"application/json"},method:"POST"});if(!o.ok)throw await l.fromResponse(o);return await o.text()}async rollbackTransaction(e,t){return await this.#s(e,t,"rollback")}async startTransaction(e,t){let{url:s}=await this.start(),n=this.#i(t),o=await fetch(`${s}/transaction/start`,{body:JSON.stringify(e),headers:{...n,"Content-Type":"application/json"},method:"POST"});if(!o.ok)throw await l.fromResponse(o);return await o.json()}async start(){if(this.#n!=null)return await this.#n;let{promise:e,reject:t,resolve:s}=R();this.#n=e;let n=N||await this.#o();this.#e.debug&&console.debug("[Query Engine] spinning up at path...",n);let{proxySignals:o}=await import("foreground-child/proxy-signals"),i=$(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});o(i),i.stderr.setEncoding("utf8"),i.stdout.setEncoding("utf8");let a=c=>{let u=c.split(`
2
+ `).find(k=>k.includes("Started query engine http server"));if(!u)return;i.stdout.removeListener("data",a);let{fields:p}=JSON.parse(u);if(p==null)return t(new Error(`Unexpected data during initialization, "fields" are missing: ${c}`));let{ip:m,port:h}=p;if(m==null||h==null)return t(new Error(`This version of query-engine is not compatible with minippg, "ip" and "port" are missing in the startup log entry.
3
+ Received data: ${c}`));s({childProcess:i,url:`http://${m}:${h}`})},T=c=>{this.#n=null,t(new d(String(c))),i.removeListener("exit",g),i.kill()};i.once("error",T);let g=(c,u)=>{this.#n=null,t(new d(`Query Engine exited with code ${c} and signal ${u}`))};return i.once("exit",g),i.stdout.on("data",a),this.#e.debug&&(i.stderr.on("data",console.error.bind(console,"[Query Engine]")),i.stdout.on("data",console.debug.bind(console,"[Query Engine]"))),await this.#n}async stop(){if(this.#n==null)return;let{childProcess:e}=await this.#n;e.exitCode==null&&e.signalCode==null&&(this.#n=null,e.kill(),await H(e,"exit"))}async#o(){this.#e.debug&&console.debug("[Query Engine] getting engine commit hash...");let e=await this.#r();this.#e.debug&&console.debug("[Query Engine] got engine commit hash",e);let t=f(this.#e.clientVersion,e);this.#e.debug&&console.debug("[Query Engine] cache directory path",t),await C(t,{recursive:!0});let{binaryTarget:s}=this.#e.platform,n=s==="windows"?".exe":"",o=A(t,`query-engine-${s}${n}`);return this.#e.debug&&console.debug("[Query Engine] binary path",o),(L==="1"||await w(o)===!1)&&await this.#a({commitHash:e,extension:n,engineBinaryPath:o}),o}async#r(){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 s=(await e.json()).devDependencies?.["@prisma/engines-version"];if(!s)throw new Error("Couldn't find engines version in package.json");let n=s.split(".").at(-1);if(!n)throw new Error("Couldn't find commit hash in engines version");return n}async#a(e){let{commitHash:t,extension:s,engineBinaryPath:n}=e,{binaryTarget:o}=this.#e.platform,i=`https://binaries.prisma.sh/all_commits/${t}/${o}/query-engine${s}.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}`);P&&await j(Number(P)),await y(await a.arrayBuffer(),n),this.#e.debug&&console.debug("[Query Engine] downloaded and saved at",n)}#i(e){let t={};for(let[s,n]of Object.entries(e))n!=null&&(t[s]=n);return t}async#s(e,t,s){let{url:n}=await this.#n,o=this.#i(t),i=await fetch(`${n}/transaction/${e}/${s}`,{headers:{...o,"Content-Type":"application/json"},method:"POST"});if(!i.ok)throw await l.fromResponse(i);try{return await i.json()}catch{return{}}}};function G(r,e){if(console.error(r),r instanceof d){E(e,{EngineNotStarted:{reason:{EngineStartupError:{logs:[],msg:r.message}}}},500);return}if(r instanceof l){v(e,r.responseBody,r.statusCode);return}b(e,500)}var d=class extends Error{name="EngineStartError"},l=class r extends Error{constructor(t,s,n){super(`${t}: Query Engine response status ${s}, body: ${n}`);this.action=t;this.statusCode=s;this.responseBody=n}name="EngineHttpError";static async fromResponse(t){let s=new URL(t.url),n=await t.text();return new r(s.pathname,t.status,n)}};export{S as Engine,G as handleEngineError};