postgresai 0.14.0-dev.74 → 0.14.0-dev.75
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/bin/postgres-ai.js +4 -8
- package/lib/metrics-embedded.ts +1 -1
- package/lib/supabase.ts +2 -10
- package/package.json +1 -1
- package/test/supabase.test.ts +0 -59
package/dist/bin/postgres-ai.js
CHANGED
|
@@ -13064,7 +13064,7 @@ var {
|
|
|
13064
13064
|
// package.json
|
|
13065
13065
|
var package_default = {
|
|
13066
13066
|
name: "postgresai",
|
|
13067
|
-
version: "0.14.0-dev.
|
|
13067
|
+
version: "0.14.0-dev.75",
|
|
13068
13068
|
description: "postgres_ai CLI",
|
|
13069
13069
|
license: "Apache-2.0",
|
|
13070
13070
|
private: false,
|
|
@@ -15887,7 +15887,7 @@ var Result = import_lib.default.Result;
|
|
|
15887
15887
|
var TypeOverrides = import_lib.default.TypeOverrides;
|
|
15888
15888
|
var defaults = import_lib.default.defaults;
|
|
15889
15889
|
// package.json
|
|
15890
|
-
var version = "0.14.0-dev.
|
|
15890
|
+
var version = "0.14.0-dev.75";
|
|
15891
15891
|
var package_default2 = {
|
|
15892
15892
|
name: "postgresai",
|
|
15893
15893
|
version,
|
|
@@ -25314,10 +25314,6 @@ class SupabaseClient {
|
|
|
25314
25314
|
}
|
|
25315
25315
|
async function fetchPoolerDatabaseUrl(config2, username) {
|
|
25316
25316
|
const url = `${SUPABASE_API_BASE}/v1/projects/${encodeURIComponent(config2.projectRef)}/config/database/pooler`;
|
|
25317
|
-
const effectiveUsername = (() => {
|
|
25318
|
-
const suffix = `.${config2.projectRef}`;
|
|
25319
|
-
return username.endsWith(suffix) ? username : `${username}${suffix}`;
|
|
25320
|
-
})();
|
|
25321
25317
|
try {
|
|
25322
25318
|
const response = await fetch(url, {
|
|
25323
25319
|
method: "GET",
|
|
@@ -25332,13 +25328,13 @@ async function fetchPoolerDatabaseUrl(config2, username) {
|
|
|
25332
25328
|
if (Array.isArray(data) && data.length > 0) {
|
|
25333
25329
|
const pooler = data[0];
|
|
25334
25330
|
if (pooler.db_host && pooler.db_port && pooler.db_name) {
|
|
25335
|
-
return `postgresql://${
|
|
25331
|
+
return `postgresql://${username}@${pooler.db_host}:${pooler.db_port}/${pooler.db_name}`;
|
|
25336
25332
|
}
|
|
25337
25333
|
if (typeof pooler.connection_string === "string") {
|
|
25338
25334
|
try {
|
|
25339
25335
|
const connUrl = new URL(pooler.connection_string);
|
|
25340
25336
|
const portPart = connUrl.port ? `:${connUrl.port}` : "";
|
|
25341
|
-
return `postgresql://${
|
|
25337
|
+
return `postgresql://${username}@${connUrl.hostname}${portPart}${connUrl.pathname}`;
|
|
25342
25338
|
} catch {
|
|
25343
25339
|
return null;
|
|
25344
25340
|
}
|
package/lib/metrics-embedded.ts
CHANGED
package/lib/supabase.ts
CHANGED
|
@@ -347,14 +347,6 @@ export async function fetchPoolerDatabaseUrl(
|
|
|
347
347
|
): Promise<string | null> {
|
|
348
348
|
const url = `${SUPABASE_API_BASE}/v1/projects/${encodeURIComponent(config.projectRef)}/config/database/pooler`;
|
|
349
349
|
|
|
350
|
-
// For Supabase pooler connections, the username must include the project ref:
|
|
351
|
-
// <user>.<project_ref>
|
|
352
|
-
// Example:
|
|
353
|
-
// postgresql://postgres_ai_mon.xhaqmsvczjkkvkgdyast@aws-1-eu-west-1.pooler.supabase.com:6543/postgres
|
|
354
|
-
const effectiveUsername = (() => {
|
|
355
|
-
const suffix = `.${config.projectRef}`;
|
|
356
|
-
return username.endsWith(suffix) ? username : `${username}${suffix}`;
|
|
357
|
-
})();
|
|
358
350
|
try {
|
|
359
351
|
const response = await fetch(url, {
|
|
360
352
|
method: "GET",
|
|
@@ -375,7 +367,7 @@ export async function fetchPoolerDatabaseUrl(
|
|
|
375
367
|
const pooler = data[0];
|
|
376
368
|
// Build URL from components if available
|
|
377
369
|
if (pooler.db_host && pooler.db_port && pooler.db_name) {
|
|
378
|
-
return `postgresql://${
|
|
370
|
+
return `postgresql://${username}@${pooler.db_host}:${pooler.db_port}/${pooler.db_name}`;
|
|
379
371
|
}
|
|
380
372
|
// Fallback: try to extract from connection_string if present
|
|
381
373
|
if (typeof pooler.connection_string === "string") {
|
|
@@ -383,7 +375,7 @@ export async function fetchPoolerDatabaseUrl(
|
|
|
383
375
|
const connUrl = new URL(pooler.connection_string);
|
|
384
376
|
// Use provided username; handle empty port for default ports (e.g., 5432)
|
|
385
377
|
const portPart = connUrl.port ? `:${connUrl.port}` : "";
|
|
386
|
-
return `postgresql://${
|
|
378
|
+
return `postgresql://${username}@${connUrl.hostname}${portPart}${connUrl.pathname}`;
|
|
387
379
|
} catch {
|
|
388
380
|
return null;
|
|
389
381
|
}
|
package/package.json
CHANGED
package/test/supabase.test.ts
CHANGED
|
@@ -2,7 +2,6 @@ import { describe, expect, test, beforeEach, afterEach, mock } from "bun:test";
|
|
|
2
2
|
import {
|
|
3
3
|
resolveSupabaseConfig,
|
|
4
4
|
extractProjectRefFromUrl,
|
|
5
|
-
fetchPoolerDatabaseUrl,
|
|
6
5
|
SupabaseClient,
|
|
7
6
|
applyInitPlanViaSupabase,
|
|
8
7
|
verifyInitSetupViaSupabase,
|
|
@@ -138,64 +137,6 @@ describe("Supabase module", () => {
|
|
|
138
137
|
});
|
|
139
138
|
});
|
|
140
139
|
|
|
141
|
-
describe("fetchPoolerDatabaseUrl", () => {
|
|
142
|
-
const originalFetch = globalThis.fetch;
|
|
143
|
-
|
|
144
|
-
afterEach(() => {
|
|
145
|
-
globalThis.fetch = originalFetch;
|
|
146
|
-
});
|
|
147
|
-
|
|
148
|
-
test("returns pooler db url with username including project ref (db_host/db_port/db_name response)", async () => {
|
|
149
|
-
globalThis.fetch = mock(() =>
|
|
150
|
-
Promise.resolve(
|
|
151
|
-
new Response(
|
|
152
|
-
JSON.stringify([
|
|
153
|
-
{
|
|
154
|
-
db_host: "aws-1-eu-west-1.pooler.supabase.com",
|
|
155
|
-
db_port: 6543,
|
|
156
|
-
db_name: "postgres",
|
|
157
|
-
},
|
|
158
|
-
]),
|
|
159
|
-
{ status: 200 }
|
|
160
|
-
)
|
|
161
|
-
)
|
|
162
|
-
) as unknown as typeof fetch;
|
|
163
|
-
|
|
164
|
-
const url = await fetchPoolerDatabaseUrl(
|
|
165
|
-
{ projectRef: "xhaqmsvczjkkvkgdyast", accessToken: "token" },
|
|
166
|
-
"postgres_ai_mon"
|
|
167
|
-
);
|
|
168
|
-
expect(url).toBe(
|
|
169
|
-
"postgresql://postgres_ai_mon.xhaqmsvczjkkvkgdyast@aws-1-eu-west-1.pooler.supabase.com:6543/postgres"
|
|
170
|
-
);
|
|
171
|
-
});
|
|
172
|
-
|
|
173
|
-
test("does not double-append project ref if username already has it", async () => {
|
|
174
|
-
globalThis.fetch = mock(() =>
|
|
175
|
-
Promise.resolve(
|
|
176
|
-
new Response(
|
|
177
|
-
JSON.stringify([
|
|
178
|
-
{
|
|
179
|
-
db_host: "aws-1-eu-west-1.pooler.supabase.com",
|
|
180
|
-
db_port: 6543,
|
|
181
|
-
db_name: "postgres",
|
|
182
|
-
},
|
|
183
|
-
]),
|
|
184
|
-
{ status: 200 }
|
|
185
|
-
)
|
|
186
|
-
)
|
|
187
|
-
) as unknown as typeof fetch;
|
|
188
|
-
|
|
189
|
-
const url = await fetchPoolerDatabaseUrl(
|
|
190
|
-
{ projectRef: "xhaqmsvczjkkvkgdyast", accessToken: "token" },
|
|
191
|
-
"postgres_ai_mon.xhaqmsvczjkkvkgdyast"
|
|
192
|
-
);
|
|
193
|
-
expect(url).toBe(
|
|
194
|
-
"postgresql://postgres_ai_mon.xhaqmsvczjkkvkgdyast@aws-1-eu-west-1.pooler.supabase.com:6543/postgres"
|
|
195
|
-
);
|
|
196
|
-
});
|
|
197
|
-
});
|
|
198
|
-
|
|
199
140
|
describe("SupabaseClient", () => {
|
|
200
141
|
test("throws error when project ref is empty", () => {
|
|
201
142
|
expect(() => new SupabaseClient({ projectRef: "", accessToken: "token" })).toThrow(
|