@prisma/dev 0.24.9 → 0.24.10

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,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 Ne=Object.create;var v=Object.defineProperty;var Oe=Object.getOwnPropertyDescriptor;var Be=Object.getOwnPropertyNames;var xe=Object.getPrototypeOf,Ue=Object.prototype.hasOwnProperty;var Ie=(e,t)=>{for(var r in t)v(e,r,{get:t[r],enumerable:!0})},Z=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Be(t))!Ue.call(e,n)&&n!==r&&v(e,n,{get:()=>t[n],enumerable:!(o=Oe(t,n))||o.enumerable});return e};var E=(e,t,r)=>(r=e!=null?Ne(xe(e)):{},Z(t||!e||!e.__esModule?v(r,"default",{value:e,enumerable:!0}):r,e)),$e=e=>Z(v({},"__esModule",{value:!0}),e);var ft={};Ie(ft,{attachWalEventBridge:()=>I,dumpDB:()=>Le,shouldPollWalAfterMessages:()=>$,shouldPollWalAfterResponse:()=>X,startDBServer:()=>lt,startLazyShadowDBServer:()=>Te});module.exports=$e(ft);var Ce=()=>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=Ce();var G=require("net"),ye=require("path"),we=require("pathe/utils");var N=require("fs"),y=require("fs/promises"),ee=require("util"),te=require("zlib");var m=E(require("path"),1),M=E(require("os"),1),L=E(require("process"),1),S=M.default.homedir(),k=M.default.tmpdir(),{env:T}=L.default,Ge=e=>{let t=m.default.join(S,"Library");return{data:m.default.join(t,"Application Support",e),config:m.default.join(t,"Preferences",e),cache:m.default.join(t,"Caches",e),log:m.default.join(t,"Logs",e),temp:m.default.join(k,e)}},Me=e=>{let t=T.APPDATA||m.default.join(S,"AppData","Roaming"),r=T.LOCALAPPDATA||m.default.join(S,"AppData","Local");return{data:m.default.join(r,e,"Data"),config:m.default.join(t,e,"Config"),cache:m.default.join(r,e,"Cache"),log:m.default.join(r,e,"Log"),temp:m.default.join(k,e)}},ke=e=>{let t=m.default.basename(S);return{data:m.default.join(T.XDG_DATA_HOME||m.default.join(S,".local","share"),e),config:m.default.join(T.XDG_CONFIG_HOME||m.default.join(S,".config"),e),cache:m.default.join(T.XDG_CACHE_HOME||m.default.join(S,".cache"),e),log:m.default.join(T.XDG_STATE_HOME||m.default.join(S,".local","state"),e),temp:m.default.join(k,t,e)}};function W(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"?Ge(e):L.default.platform==="win32"?Me(e):ke(e)}var We=E(require("zeptomatch"),1),Et=W("prisma-dev"),Rt=(0,ee.promisify)(te.unzip);async function re(e){try{return await(0,y.access)(e,y.constants.F_OK),!0}catch(t){if(Fe(t))return!1;throw t}}async function oe(e,t){await e.stream().pipeTo(N.WriteStream.toWeb((0,N.createWriteStream)(t,{encoding:"utf8"})))}function Fe(e){return e!=null&&typeof e=="object"&&"code"in e&&e.code==="ENOENT"}var F=require("get-port-please"),ne=require("remeda");var A=class extends Error{constructor(r){super(`Port \`${r}\` is not available.`);this.port=r}name="PortNotAvailableError"};var _=require("fs"),h=require("fs/promises"),ae=require("module"),ie=require("path"),R=require("url"),ze=(0,ae.createRequire)(b),je=["initdb.wasm","pglite.data","pglite.wasm"],j="pglite-seed.tar.gz",ce={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"},qe=[...je.map(e=>({fileName:e,kind:"core",name:e})),{fileName:j,kind:"core",name:j},...Object.entries(ce).map(([e,t])=>({fileName:t,kind:"extension",name:e}))],x=new Map,He=Symbol.for("@prisma/dev/bundled-pglite-runtime-asset-sources"),O=null;async function q(){await et();let e=le();if(e)return await Ye(e),await Ke(e);let t=Qe(),r=t.href,o=x.get(r);return o||(o=Je(t),x.set(r,o)),await o}async function Ke(e){let t=`bundled:${e.wasmModule.href}:${e.fsBundle.href}`,r=x.get(t);return r||(r=Xe(e),x.set(t,r)),await r}async function Je(e){let t=U(new URL("./runtime-assets/",b)),[r,o,n]=await Promise.all([(0,h.readFile)(B("pglite.data",e,t)),(0,h.readFile)(B(j,e,t)),(0,h.readFile)(B("pglite.wasm",e,t))]),a=de();return{extensions:Object.fromEntries(Object.entries(ce).map(([p,d])=>[p,B(d,e,t)])),fsBundle:new Blob([Uint8Array.from(r)]),loadDataDir:new Blob([Uint8Array.from(o)]),wasmModule:await a.compile(n)}}async function Xe(e){let[t,r,o]=await Promise.all([z(e.fsBundle),z(e.loadDataDir),z(e.wasmModule)]),n=de();return{extensions:e.extensions,fsBundle:new Blob([Uint8Array.from(t)]),loadDataDir:new Blob([Uint8Array.from(r)]),wasmModule:await n.compile(o)}}async function Ye(e){if(e.initdbWasm.protocol!=="file:")return;let t=new URL("initdb.wasm",U(new URL("./",e.initdbWasm))),r=(0,R.fileURLToPath)(t);(0,_.existsSync)(r)||await(0,h.copyFile)((0,R.fileURLToPath)(e.initdbWasm),r)}function U(e){return e instanceof URL?se(e):se((0,R.pathToFileURL)(e))}function se(e){return e.href.endsWith("/")?e:new URL(`${e.href}/`)}function Ve(){let e=ze.resolve("@electric-sql/pglite");return U((0,ie.dirname)(e))}function Qe(){let e=U(new URL("./",b));if(Ze(e))return e;if(tt())return Ve();throw new Error("Unable to locate PGlite runtime assets. If you bundled @prisma/dev, copy them next to the bundle with copyPrismaDevRuntimeAssets().")}function Ze(e){return qe.every(t=>(0,_.existsSync)((0,R.fileURLToPath)(new URL(t.fileName,e))))}function le(){return globalThis[He]??null}async function et(){!rt()||le()||(O||(O=import("./runtime-assets-manifest.bun.js").then(()=>{}).catch(e=>{throw O=null,e})),await O)}function tt(){let e=(0,R.fileURLToPath)(new URL("../package.json",b));if(!(0,_.existsSync)(e))return!1;try{return JSON.parse((0,_.readFileSync)(e,"utf8")).name==="@prisma/dev"}catch{return!1}}function rt(){return typeof globalThis.Bun<"u"}function de(){let e=globalThis.WebAssembly;if(!e)throw new Error("WebAssembly is not available in this runtime.");return e}async function z(e){if(e.protocol==="file:")return await(0,h.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 B(e,t,r){let o=new URL(e,t);if((0,_.existsSync)((0,R.fileURLToPath)(o)))return o;if(r){let n=new URL(e,r);if((0,_.existsSync)((0,R.fileURLToPath)(n)))return n}return o}var J=require("@electric-sql/pglite"),w="_prisma_dev_wal",K="events",pe="install_all_triggers",ue="capture_event",me="prisma_dev_wal_capture",D=new WeakMap,ot=new Set(["ALTER","COMMIT","COPY","CREATE","DELETE","DROP","INSERT","MERGE","TRUNCATE","UPDATE"]);async function I(e,t){let r=D.get(e);if(r&&!r.closed)return r.bridge;let o=e.execProtocolRaw.bind(e),n=e.execProtocolRawStream.bind(e),a={bridge:{close:async()=>{a.closed||(a.closed=!0,a.subscribers.clear(),e.execProtocolRaw===p&&(e.execProtocolRaw=o),e.execProtocolRawStream===d&&(e.execProtocolRawStream=n),await a.pollPromise,D.delete(e))},poll:async()=>{await H(a,e)},subscribe:i=>(a.subscribers.add(i),()=>{a.subscribers.delete(i)})},closed:!1,ensureInfrastructurePromise:null,pendingPoll:!1,pollPromise:null,subscribers:new Set,suppressDepth:0},p=async(i,u)=>{let f=await o(i,u);return!a.closed&&a.suppressDepth===0&&X(f)&&H(a,e),f},d=async(i,u)=>{let f=[],P=new J.protocol.Parser,s=u?.onRawData;await n(i,{...u,onRawData:c=>{P.parse(c,g=>{f.push(g)}),s?.(c)}}),!a.closed&&a.suppressDepth===0&&$(f)&&H(a,e)};return e.execProtocolRaw=p,e.execProtocolRawStream=d,D.set(e,a),await ge(a,e),a.bridge}async function fe(e){let t=D.get(e);t&&await t.bridge.close()}function $(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&&ot.has(r))return!0}return!1}function X(e){if(e.length===0)return!1;let t=[];return new J.protocol.Parser().parse(e,o=>{t.push(o)}),$(t)}async function ge(e,t){e.ensureInfrastructurePromise??=Y(e,t,async()=>{await t.exec(`CREATE SCHEMA IF NOT EXISTS "${w}"`),await t.exec(`
2
- CREATE TABLE IF NOT EXISTS "${w}"."${K}" (
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 "${w}"."${ue}"()
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 = '${w}' THEN
25
+ IF TG_TABLE_SCHEMA = '${E}' THEN
19
26
  RETURN COALESCE(NEW, OLD);
20
27
  END IF;
21
28
 
22
- INSERT INTO "${w}"."${K}" (
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 "${w}"."${pe}"()
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 ('${w}', '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 = '${me}'
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 "${w}"."${ue}"()',
70
- '${me}',
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 Pe(e,t)}),await e.ensureInfrastructurePromise}async function Pe(e,t){await Y(e,t,async()=>{await t.query(`SELECT "${w}"."${pe}"()`)})}async function nt(e,t){await ge(e,t),await Pe(e,t);let r=await Y(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 "${w}"."${K}"
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 o=r.rows.map(st);for(let n of e.subscribers)queueMicrotask(()=>{if(!e.closed&&e.subscribers.has(n))try{n(o)}catch(a){console.error("[WAL bridge] subscriber failed",a)}})}async function H(e,t){if(!e.closed){if(e.pollPromise){e.pendingPoll=!0,await e.pollPromise;return}e.pollPromise=(async()=>{do e.pendingPoll=!1,await nt(e,t);while(e.pendingPoll&&!e.closed)})().finally(()=>{e.pollPromise=null}),await e.pollPromise}}async function Y(e,t,r){e.suppressDepth+=1;try{return await r()}finally{e.suppressDepth-=1,e.suppressDepth===0&&!e.closed&&D.get(t)!==e&&(e.closed=!0)}}function st(e){return{oldRecord:e.old_row_data,record:e.row_data,schema:e.schema_name,table:e.table_name,txid:String(e.txid),type:at(e.op)}}function at(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 it=10,Ee="127.0.0.1",Re=128*1024*1024,Se=["-c","shared_buffers=16MB","-c","temp_buffers=1MB","-c","work_mem=1MB","-c","maintenance_work_mem=16MB","-c","wal_buffers=1MB"],l={connectionLimit:it,connectTimeout:0,database:"template1",maxIdleConnectionLifetime:0,password:"postgres",poolTimeout:0,socketTimeout:0,sslMode:"disable",username:"postgres"},ct=`postgres://${l.username}:${l.password}@localhost`,V=new URLSearchParams({sslmode:l.sslMode}),he=new URLSearchParams({...Object.fromEntries(V.entries()),connection_limit:String(l.connectionLimit),connect_timeout:String(l.connectTimeout),max_idle_connection_lifetime:String(l.maxIdleConnectionLifetime),pool_timeout:String(l.poolTimeout),socket_timeout:String(l.socketTimeout)});async function _e(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 ${l.username} WITH LOGIN SUPERUSER PASSWORD '${l.password}'`):await e.exec(`CREATE ROLE ${l.username} WITH LOGIN SUPERUSER PASSWORD '${l.password}'`),await e.exec(`SET ROLE ${l.username}`)}async function lt(e,t){if(e==="shadow_database"&&!t.dryRun)return await Te(t);let r=e==="database"?t.databasePort:t.shadowDatabasePort;return t.dryRun?De(e,t,{db:null,port:r,server:null}):await Ae(e,t,{port:r,updateServerStatePort:!0})}async function Te(e,t=async()=>await Ae("shadow_database",e,{port:0,updateServerStatePort:!1})){let{debug:r}=e,o=null,n=null,a=!1,p=new Set,d=(0,G.createServer)(u),i=await dt(d,e.shadowDatabasePort);return e.shadowDatabasePort=i,r&&console.debug(`[shadow_database] lazy proxy listening on port ${i}`),{...l,attachWalEventBridge:()=>Promise.reject(new Error("WAL bridge is only available for the primary database server")),close:async()=>{a=!0;for(let c of p)c.destroy();p.clear();let s=[];try{await ut(d),r&&console.debug(`[shadow_database] lazy proxy stopped on port ${i}`)}catch(c){console.error("[shadow_database] lazy proxy stop error",c),s.push(c)}try{await n?.catch(()=>null),await o?.close()}catch(c){console.error("[shadow_database] backend close error",c),s.push(c)}if(s.length>0)throw new AggregateError(s,"Failed to close shadow_database properly")},connectionString:C(i,V),dump:async()=>{},getPrimaryKeyColumns:()=>Promise.reject(new Error("Primary key resolution is only available for the primary database server")),port:i,prismaORMConnectionString:C(i,he),terminalCommand:`PGPASSWORD=${l.password} PGSSLMODE=${l.sslMode} psql -h localhost -p ${i} -U ${l.username} -d ${l.database}`};function u(s){p.add(s);let c=()=>{p.delete(s)};s.once("close",c),s.once("error",c),s.pause(),f(s)}async function f(s){try{let c=await P();if(a){s.destroy();return}let g=(0,G.createConnection)({host:Ee,port:c.port});p.add(g);let Q=()=>{p.delete(g)};g.once("close",Q),g.once("error",Q),s.once("close",()=>g.destroy()),s.once("error",()=>g.destroy()),g.once("error",()=>s.destroy()),g.once("connect",()=>{r&&console.debug(`[shadow_database] proxying connection to lazy backend on port ${c.port}`),s.resume(),s.pipe(g),g.pipe(s)})}catch(c){r&&console.error("[shadow_database] failed to start lazy backend",c),s.destroy(c instanceof Error?c:void 0)}}async function P(){if(o)return o;if(a)throw new Error("shadow_database is closed");return n||(r&&console.debug("[shadow_database] starting lazy backend..."),n=t().then(s=>(o=s,r&&console.debug(`[shadow_database] lazy backend started on port ${s.port}`),s)).catch(s=>{throw n=null,s})),await n}}async function Ae(e,t,r){let{debug:o}=t,{port:n,updateServerStatePort:a}=r,d=await(e==="shadow_database"?mt:ve)(t.pgliteDataDirPath,o);o&&d.onNotification((s,c)=>{console.debug(`[${e}][${s}] ${c}`)});let{PGLiteSocketServer:i}=await import("@electric-sql/pglite-socket"),u=e==="shadow_database"?t.shadowDatabaseIdleTimeoutMillis:t.databaseIdleTimeoutMillis,f=new i({db:d,debug:o,idleTimeout:Number.isFinite(u)?u:0,inspect:o,maxConnections:l.connectionLimit,port:n});o&&(f.addEventListener("listening",s=>{let{detail:c}=s;console.debug(`[${e}] server listening on ${JSON.stringify(c)}`)}),f.addEventListener("connection",s=>{let{clientAddress:c,clientPort:g}=s.detail;console.debug(`[${e}] client connected from ${c}:${g}`)}),f.addEventListener("error",s=>{let{detail:c}=s;console.error(`[${e}] server error:`,c)}));try{await f.start()}catch(s){throw s instanceof Error&&"code"in s&&s.code==="EADDRINUSE"?new A(n):s}let P=Number(f.getServerConn().split(":").at(1));return a&&(t[e==="database"?"databasePort":"shadowDatabasePort"]=P),De(e,t,{db:d,port:P,server:f})}function De(e,t,r){let{debug:o}=t,{db:n,port:a,server:p}=r||{},d=new Map;return o&&console.debug(`[${e}] server started on port ${a}`),{...l,attachWalEventBridge:async()=>{if(e!=="database"||!n)throw new Error("WAL bridge is only available for the primary database server");return await I(n)},close:async()=>{let i=[];try{await p?.stop(),o&&console.debug(`[${e}] server stopped on port ${a}`)}catch(u){console.error(`[${e}] server stop error`,u),i.push(u)}if(e==="database"){try{n&&await fe(n),o&&console.debug(`[${e}] closed WAL bridge`)}catch(u){console.error(`[${e}] WAL bridge close error`,u),i.push(u)}try{await n?.syncToFs(),o&&console.debug(`[${e}] synced to filesystem`)}catch(u){console.error(`[${e}] sync error`,u),i.push(u)}}try{await n?.close(),o&&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:C(a,V),dump:async i=>{e==="shadow_database"||!n||await Le({db:n,debug:o,destinationPath:i})},getPrimaryKeyColumns:async(i,u)=>{if(e==="shadow_database"||!n)throw new Error("Primary key resolution is only available for the primary database server");let f=`${i}.${u}`,P=d.get(f);return P||(P=pt(n,i,u).catch(s=>{throw d.delete(f),s}),d.set(f,P)),await P},port:a,prismaORMConnectionString:C(a,he),terminalCommand:`PGPASSWORD=${l.password} PGSSLMODE=${l.sslMode} psql -h localhost -p ${a} -U ${l.username} -d ${l.database}`}}function C(e,t){return`${ct}:${e}/${l.database}?${t.toString()}`}async function ve(e,t){let{PGlite:r}=await import("@electric-sql/pglite"),o=await q(),n=e==="memory://"||!await re((0,ye.join)(e,"PG_VERSION")),a=await r.create({database:l.database,dataDir:e,debug:t?5:void 0,extensions:o.extensions,fsBundle:o.fsBundle,initialMemory:Re,loadDataDir:n?o.loadDataDir:void 0,relaxedDurability:!1,startParams:[...r.defaultStartParams,...Se],wasmModule:o.wasmModule});return await _e(a),a}async function dt(e,t){return await new Promise((r,o)=>{let n=d=>{if(p(),d.code==="EADDRINUSE"){o(new A(t));return}o(d)},a=()=>{let d=e.address();if(p(),!d||typeof d=="string"){o(new Error("Failed to determine TCP server port"));return}r(d.port)},p=()=>{e.off("error",n),e.off("listening",a)};e.once("error",n),e.once("listening",a),e.listen(t,Ee)})}async function ut(e){await new Promise((t,r)=>{e.close(o=>{let n=o;if(n&&n.code!=="ERR_SERVER_NOT_RUNNING"){r(n);return}t()})})}async function mt(e,t){let{PGlite:r}=await import("@electric-sql/pglite"),o=await q(),n=await r.create({database:l.database,dataDir:"memory://",debug:t?5:void 0,extensions:o.extensions,fsBundle:o.fsBundle,initialMemory:Re,loadDataDir:o.loadDataDir,relaxedDurability:!1,startParams:[...r.defaultStartParams,...Se],wasmModule:o.wasmModule});return await _e(n),n}async function pt(e,t,r){let{rows:o}=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 = ${be(t)}
98
- AND relation.relname = ${be(r)}
104
+ AND namespace.nspname = ${Be(t)}
105
+ AND relation.relname = ${Be(r)}
99
106
  ORDER BY keys.ordinality
100
- `);return o.map(n=>n.column_name)}function be(e){return`'${e.replaceAll("'","''")}'`}async function Le(e){let{dataDir:t,db:r,debug:o,destinationPath:n}=e,a=r||await ve(t,o),{pgDump:p}=await import("@electric-sql/pglite-tools/pg_dump"),d=await p({args:["--schema-only","--no-owner"],fileName:n?(0,we.filename)(n):void 0,pg:await a.clone()});return n?(o&&console.debug(`[DB] Dumping database to ${n}`),await oe(d,n)):(o&&console.debug("[DB] Dumping database to memory"),await d.text())}0&&(module.exports={attachWalEventBridge,dumpDB,shouldPollWalAfterMessages,shouldPollWalAfterResponse,startDBServer,startLazyShadowDBServer});
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,74 +1,4 @@
1
- import { PGlite } from '@electric-sql/pglite';
2
- import { c as ServerState } from './state-CDXGsSbm.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
- declare function startLazyShadowDBServer(serverState: Pick<ServerState, "debug" | "shadowDatabasePort" | "shadowDatabaseIdleTimeoutMillis"> & {
59
- pgliteDataDirPath?: string;
60
- }, startBackend?: () => Promise<DBServer>): Promise<DBServer>;
61
- type DumpDBOptions<D extends string> = {
62
- dataDir: string;
63
- db?: never;
64
- debug?: boolean;
65
- destinationPath?: D;
66
- } | {
67
- dataDir?: never;
68
- db: PGlite;
69
- debug?: boolean;
70
- destinationPath?: D;
71
- };
72
- declare function dumpDB<D extends string = never>(options: DumpDBOptions<D>): Promise<[D] extends [never] ? string : void>;
73
-
74
- export { type DBDump, type DBServer, type DBServerPurpose, type DumpDBOptions, type WalEvent, type WalEventBridge, attachWalEventBridge, dumpDB, shouldPollWalAfterMessages, shouldPollWalAfterResponse, startDBServer, startLazyShadowDBServer };
package/dist/db.d.ts CHANGED
@@ -1,74 +1,4 @@
1
- import { PGlite } from '@electric-sql/pglite';
2
- import { c as ServerState } from './state-CDXGsSbm.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
- declare function startLazyShadowDBServer(serverState: Pick<ServerState, "debug" | "shadowDatabasePort" | "shadowDatabaseIdleTimeoutMillis"> & {
59
- pgliteDataDirPath?: string;
60
- }, startBackend?: () => Promise<DBServer>): Promise<DBServer>;
61
- type DumpDBOptions<D extends string> = {
62
- dataDir: string;
63
- db?: never;
64
- debug?: boolean;
65
- destinationPath?: D;
66
- } | {
67
- dataDir?: never;
68
- db: PGlite;
69
- debug?: boolean;
70
- destinationPath?: D;
71
- };
72
- declare function dumpDB<D extends string = never>(options: DumpDBOptions<D>): Promise<[D] extends [never] ? string : void>;
73
-
74
- export { type DBDump, type DBServer, type DBServerPurpose, type DumpDBOptions, type WalEvent, type WalEventBridge, attachWalEventBridge, dumpDB, shouldPollWalAfterMessages, shouldPollWalAfterResponse, startDBServer, startLazyShadowDBServer };
package/dist/db.js CHANGED
@@ -1 +1 @@
1
- import{a,b,c,d,e,f}from"./chunk-PGJI3PZW.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};
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};