@prisma/dev 0.24.9 → 0.24.11
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.
- package/dist/chunk-2XJK3IOI.js +3 -0
- package/dist/chunk-GMUOAEZU.js +1 -0
- package/dist/chunk-PP43TGA5.js +107 -0
- package/dist/daemon.cjs +31 -24
- package/dist/daemon.d.cts +3 -2
- package/dist/daemon.d.ts +3 -2
- package/dist/daemon.js +1 -1
- package/dist/db-BzbLAxLn.d.cts +126 -0
- package/dist/db-HU7BFiFV.d.ts +126 -0
- package/dist/db.cjs +23 -16
- package/dist/db.d.cts +3 -73
- package/dist/db.d.ts +3 -73
- package/dist/db.js +1 -1
- package/dist/index.cjs +33 -26
- package/dist/index.d.cts +9 -6
- package/dist/index.d.ts +9 -6
- package/dist/index.js +1 -1
- package/dist/{state-CDXGsSbm.d.ts → state-CNKFAMiX.d.cts} +14 -1
- package/dist/{state-CDXGsSbm.d.cts → state-CNKFAMiX.d.ts} +14 -1
- package/dist/state.cjs +3 -3
- package/dist/state.d.cts +1 -1
- package/dist/state.d.ts +1 -1
- package/dist/state.js +1 -1
- package/package.json +2 -1
- package/dist/chunk-7KFGQZD5.js +0 -3
- package/dist/chunk-PGJI3PZW.js +0 -100
- package/dist/chunk-UAYMGXE6.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
|
|
2
|
-
|
|
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 "${
|
|
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 = '${
|
|
25
|
+
IF TG_TABLE_SCHEMA = '${E}' THEN
|
|
19
26
|
RETURN COALESCE(NEW, OLD);
|
|
20
27
|
END IF;
|
|
21
28
|
|
|
22
|
-
INSERT INTO "${
|
|
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 "${
|
|
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 ('${
|
|
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 = '${
|
|
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 "${
|
|
70
|
-
'${
|
|
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
|
|
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 "${
|
|
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
|
|
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 = ${
|
|
98
|
-
AND relation.relname = ${
|
|
104
|
+
AND namespace.nspname = ${Be(t)}
|
|
105
|
+
AND relation.relname = ${Be(r)}
|
|
99
106
|
ORDER BY keys.ordinality
|
|
100
|
-
`);return
|
|
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
|
|
2
|
-
|
|
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
|
|
2
|
-
|
|
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-
|
|
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};
|