tinbase 0.6.1 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -6
- package/dist/admin/ui.d.ts +1 -1
- package/dist/admin/ui.js +2 -2
- package/dist/cli.js +9 -4
- package/dist/cli.js.map +1 -1
- package/dist/cron/service.d.ts +6 -2
- package/dist/cron/service.js +5 -2
- package/dist/cron/service.js.map +1 -1
- package/dist/db/bootstrap.d.ts +1 -1
- package/dist/db/bootstrap.js +15 -2
- package/dist/db/bootstrap.js.map +1 -1
- package/dist/db/database.js +25 -6
- package/dist/db/database.js.map +1 -1
- package/dist/db/emulated.d.ts +4 -1
- package/dist/db/emulated.js +179 -0
- package/dist/db/emulated.js.map +1 -1
- package/dist/db/sql-compat.d.ts +32 -0
- package/dist/db/sql-compat.js +136 -0
- package/dist/db/sql-compat.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/net/service.d.ts +33 -0
- package/dist/net/service.js +98 -0
- package/dist/net/service.js.map +1 -0
- package/dist/types.d.ts +2 -0
- package/dist/types.js.map +1 -1
- package/package.json +3 -3
package/dist/db/bootstrap.js
CHANGED
|
@@ -217,6 +217,7 @@ alter default privileges in schema public
|
|
|
217
217
|
create schema if not exists auth;
|
|
218
218
|
|
|
219
219
|
create table if not exists auth.users (
|
|
220
|
+
instance_id uuid default '00000000-0000-0000-0000-000000000000',
|
|
220
221
|
id uuid primary key default gen_random_uuid(),
|
|
221
222
|
aud text default 'authenticated',
|
|
222
223
|
role text default 'authenticated',
|
|
@@ -224,8 +225,15 @@ create table if not exists auth.users (
|
|
|
224
225
|
encrypted_password text,
|
|
225
226
|
email_confirmed_at timestamptz,
|
|
226
227
|
invited_at timestamptz,
|
|
227
|
-
confirmation_token text,
|
|
228
|
-
|
|
228
|
+
confirmation_token text default '',
|
|
229
|
+
confirmation_sent_at timestamptz,
|
|
230
|
+
recovery_token text default '',
|
|
231
|
+
recovery_sent_at timestamptz,
|
|
232
|
+
email_change_token_new text default '',
|
|
233
|
+
email_change text default '',
|
|
234
|
+
email_change_sent_at timestamptz,
|
|
235
|
+
email_change_token_current text default '',
|
|
236
|
+
email_change_confirm_status smallint default 0,
|
|
229
237
|
last_sign_in_at timestamptz,
|
|
230
238
|
raw_app_meta_data jsonb default '{}'::jsonb,
|
|
231
239
|
raw_user_meta_data jsonb default '{}'::jsonb,
|
|
@@ -234,6 +242,11 @@ create table if not exists auth.users (
|
|
|
234
242
|
updated_at timestamptz default now(),
|
|
235
243
|
phone text unique,
|
|
236
244
|
phone_confirmed_at timestamptz,
|
|
245
|
+
phone_change text default '',
|
|
246
|
+
phone_change_token text default '',
|
|
247
|
+
phone_change_sent_at timestamptz,
|
|
248
|
+
reauthentication_token text default '',
|
|
249
|
+
reauthentication_sent_at timestamptz,
|
|
237
250
|
banned_until timestamptz,
|
|
238
251
|
deleted_at timestamptz,
|
|
239
252
|
is_anonymous boolean default false
|
package/dist/db/bootstrap.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/db/bootstrap.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8HpC,CAAA;AAED,MAAM,CAAC,MAAM,aAAa,GAAG
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/db/bootstrap.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8HpC,CAAA;AAED,MAAM,CAAC,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiX5B,CAAA"}
|
package/dist/db/database.js
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import { BOOTSTRAP_SQL, MINIMAL_BOOTSTRAP_SQL } from './bootstrap.js';
|
|
2
|
-
import { PGMQ_SQL, CRON_SQL } from './emulated.js';
|
|
2
|
+
import { PGMQ_SQL, CRON_SQL, NET_SQL, EXT_COMPAT_SQL, VAULT_SQL } from './emulated.js';
|
|
3
|
+
import { rewriteMigrationSql } from './sql-compat.js';
|
|
4
|
+
// tinbase's default session search_path (matches bootstrap + Supabase's, with
|
|
5
|
+
// the extensions schema on the path). Reset to this before each migration so a
|
|
6
|
+
// migration's own `SET search_path` can't leak across our single connection.
|
|
7
|
+
const DEFAULT_SEARCH_PATH_SQL = `set search_path to "$user", public, extensions`;
|
|
3
8
|
import { createPgliteEngine } from './pglite-engine.js';
|
|
4
9
|
export class Database {
|
|
5
10
|
engine;
|
|
@@ -21,10 +26,13 @@ export class Database {
|
|
|
21
26
|
}
|
|
22
27
|
else {
|
|
23
28
|
await engine.exec(BOOTSTRAP_SQL);
|
|
24
|
-
// emulated extensions (pgmq queues, cron) — pure SQL, so
|
|
25
|
-
// with no C extension on either engine
|
|
29
|
+
// emulated extensions (pgmq queues, cron, pg_net) — pure SQL, so
|
|
30
|
+
// pgmq.*/cron.*/net.* work with no C extension on either engine
|
|
26
31
|
await engine.exec(PGMQ_SQL);
|
|
27
32
|
await engine.exec(CRON_SQL);
|
|
33
|
+
await engine.exec(NET_SQL);
|
|
34
|
+
await engine.exec(EXT_COMPAT_SQL);
|
|
35
|
+
await engine.exec(VAULT_SQL);
|
|
28
36
|
}
|
|
29
37
|
return new Database(engine);
|
|
30
38
|
}
|
|
@@ -57,7 +65,13 @@ export class Database {
|
|
|
57
65
|
if (seen.rows.length > 0)
|
|
58
66
|
continue;
|
|
59
67
|
await this.engine.transaction(async (tx) => {
|
|
60
|
-
|
|
68
|
+
// The Supabase CLI applies each migration on a fresh connection, so a
|
|
69
|
+
// top-level `SET search_path TO ''` in one file never leaks to the next.
|
|
70
|
+
// tinbase runs every migration on one connection, so reset to the
|
|
71
|
+
// default first — otherwise a hardened migration's search_path change
|
|
72
|
+
// breaks unqualified calls (e.g. gen_random_bytes) in later files.
|
|
73
|
+
await tx.exec(DEFAULT_SEARCH_PATH_SQL);
|
|
74
|
+
await tx.exec(rewriteMigrationSql(m.sql));
|
|
61
75
|
await tx.query(`insert into supabase_migrations.schema_migrations (version, name, statements)
|
|
62
76
|
values ($1, $2, $3)`, [version, m.name, [m.sql]]);
|
|
63
77
|
});
|
|
@@ -68,15 +82,20 @@ export class Database {
|
|
|
68
82
|
const seen = await this.engine.query(`select 1 from supabase_migrations.seed_files where path = 'supabase/seed.sql' and hash = $1`, [hash]);
|
|
69
83
|
if (seen.rows.length === 0) {
|
|
70
84
|
await this.engine.transaction(async (tx) => {
|
|
71
|
-
await tx.exec(
|
|
85
|
+
await tx.exec(DEFAULT_SEARCH_PATH_SQL);
|
|
86
|
+
await tx.exec(rewriteMigrationSql(seedSql));
|
|
72
87
|
await tx.query(`insert into supabase_migrations.seed_files (path, hash) values ('supabase/seed.sql', $1)
|
|
73
88
|
on conflict (path) do update set hash = excluded.hash, applied_at = now()`, [hash]);
|
|
74
89
|
});
|
|
75
90
|
applied.push('seed.sql');
|
|
76
91
|
}
|
|
77
92
|
}
|
|
78
|
-
if (applied.length > 0)
|
|
93
|
+
if (applied.length > 0) {
|
|
94
|
+
// a migration/seed may have left the session search_path at '' — restore
|
|
95
|
+
// the default so runtime queries resolve extension functions unqualified
|
|
96
|
+
await this.engine.exec(DEFAULT_SEARCH_PATH_SQL);
|
|
79
97
|
this.invalidateSchemaCache();
|
|
98
|
+
}
|
|
80
99
|
return applied;
|
|
81
100
|
}
|
|
82
101
|
async listAppliedMigrations() {
|
package/dist/db/database.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/db/database.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/db/database.ts"],"names":[],"mappings":"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"}
|
package/dist/db/emulated.d.ts
CHANGED
|
@@ -8,5 +8,8 @@
|
|
|
8
8
|
* `pgmq.send(...)`, `pgmq.read(...)`, `select cron.schedule(...)` etc. behave
|
|
9
9
|
* the same from the client's and a migration's point of view.
|
|
10
10
|
*/
|
|
11
|
-
export declare const PGMQ_SQL = "\ncreate schema if not exists pgmq;\ngrant usage on schema pgmq to anon, authenticated, service_role;\n\ndo $$ begin\n if not exists (select 1 from pg_type t join pg_namespace n on n.oid = t.typnamespace\n where t.typname = 'message_record' and n.nspname = 'pgmq') then\n create type pgmq.message_record as (\n msg_id bigint, read_ct integer, enqueued_at timestamptz, vt timestamptz, message jsonb\n );\n end if;\nend $$;\n\ncreate or replace function pgmq.create(queue_name text) returns void language plpgsql security definer set search_path = pgmq, pg_catalog, public as $pgmq$\nbegin\n execute format('create table if not exists pgmq.%I (\n msg_id bigint generated always as identity primary key,\n read_ct integer not null default 0,\n enqueued_at timestamptz not null default now(),\n vt timestamptz not null default now(),\n message jsonb)', 'q_' || queue_name);\n execute format('create table if not exists pgmq.%I (\n msg_id bigint primary key, read_ct integer not null default 0,\n enqueued_at timestamptz not null, archived_at timestamptz not null default now(),\n vt timestamptz, message jsonb)', 'a_' || queue_name);\nend $pgmq$;\n\ncreate or replace function pgmq.send(queue_name text, msg jsonb, delay integer default 0)\nreturns bigint language plpgsql security definer set search_path = pgmq, pg_catalog, public as $pgmq$\ndeclare id bigint;\nbegin\n perform pgmq.create(queue_name);\n execute format('insert into pgmq.%I (vt, message) values (now() + make_interval(secs => $1), $2) returning msg_id', 'q_' || queue_name)\n into id using delay, msg;\n return id;\nend $pgmq$;\n\ncreate or replace function pgmq.read(queue_name text, vt integer, qty integer)\nreturns setof pgmq.message_record language plpgsql security definer set search_path = pgmq, pg_catalog, public as $pgmq$\nbegin\n return query execute format($fmt$\n with cte as (\n select msg_id from pgmq.%I where vt <= now() order by msg_id limit $1 for update skip locked\n )\n update pgmq.%I m set vt = now() + make_interval(secs => $2), read_ct = read_ct + 1\n from cte where m.msg_id = cte.msg_id\n returning m.msg_id, m.read_ct, m.enqueued_at, m.vt, m.message\n $fmt$, 'q_' || queue_name, 'q_' || queue_name) using qty, vt;\nend $pgmq$;\n\ncreate or replace function pgmq.pop(queue_name text)\nreturns setof pgmq.message_record language plpgsql security definer set search_path = pgmq, pg_catalog, public as $pgmq$\nbegin\n return query execute format($fmt$\n with cte as (select msg_id from pgmq.%I where vt <= now() order by msg_id limit 1 for update skip locked)\n delete from pgmq.%I m using cte where m.msg_id = cte.msg_id\n returning m.msg_id, m.read_ct, m.enqueued_at, m.vt, m.message\n $fmt$, 'q_' || queue_name, 'q_' || queue_name);\nend $pgmq$;\n\ncreate or replace function pgmq.delete(queue_name text, msg_id bigint)\nreturns boolean language plpgsql security definer set search_path = pgmq, pg_catalog, public as $pgmq$\ndeclare n integer;\nbegin\n execute format('delete from pgmq.%I where msg_id = $1', 'q_' || queue_name) using msg_id;\n get diagnostics n = row_count;\n return n > 0;\nend $pgmq$;\n\ncreate or replace function pgmq.archive(queue_name text, msg_id bigint)\nreturns boolean language plpgsql security definer set search_path = pgmq, pg_catalog, public as $pgmq$\ndeclare n integer;\nbegin\n execute format($fmt$\n with del as (delete from pgmq.%I where msg_id = $1 returning *)\n insert into pgmq.%I (msg_id, read_ct, enqueued_at, vt, message)\n select msg_id, read_ct, enqueued_at, vt, message from del\n $fmt$, 'q_' || queue_name, 'a_' || queue_name) using msg_id;\n get diagnostics n = row_count;\n return n > 0;\nend $pgmq$;\n\ngrant execute on all functions in schema pgmq to anon, authenticated, service_role;\n";
|
|
11
|
+
export declare const PGMQ_SQL = "\ncreate schema if not exists pgmq;\ngrant usage on schema pgmq to anon, authenticated, service_role;\n\ndo $$ begin\n if not exists (select 1 from pg_type t join pg_namespace n on n.oid = t.typnamespace\n where t.typname = 'message_record' and n.nspname = 'pgmq') then\n create type pgmq.message_record as (\n msg_id bigint, read_ct integer, enqueued_at timestamptz, vt timestamptz, message jsonb\n );\n end if;\nend $$;\n\ncreate or replace function pgmq.create(queue_name text) returns void language plpgsql security definer set search_path = pgmq, pg_catalog, public as $pgmq$\nbegin\n execute format('create table if not exists pgmq.%I (\n msg_id bigint generated always as identity primary key,\n read_ct integer not null default 0,\n enqueued_at timestamptz not null default now(),\n vt timestamptz not null default now(),\n message jsonb)', 'q_' || queue_name);\n execute format('create table if not exists pgmq.%I (\n msg_id bigint primary key, read_ct integer not null default 0,\n enqueued_at timestamptz not null, archived_at timestamptz not null default now(),\n vt timestamptz, message jsonb)', 'a_' || queue_name);\nend $pgmq$;\n\ncreate or replace function pgmq.send(queue_name text, msg jsonb, delay integer default 0)\nreturns bigint language plpgsql security definer set search_path = pgmq, pg_catalog, public as $pgmq$\ndeclare id bigint;\nbegin\n perform pgmq.create(queue_name);\n execute format('insert into pgmq.%I (vt, message) values (now() + make_interval(secs => $1), $2) returning msg_id', 'q_' || queue_name)\n into id using delay, msg;\n return id;\nend $pgmq$;\n\ncreate or replace function pgmq.read(queue_name text, vt integer, qty integer)\nreturns setof pgmq.message_record language plpgsql security definer set search_path = pgmq, pg_catalog, public as $pgmq$\nbegin\n return query execute format($fmt$\n with cte as (\n select msg_id from pgmq.%I where vt <= now() order by msg_id limit $1 for update skip locked\n )\n update pgmq.%I m set vt = now() + make_interval(secs => $2), read_ct = read_ct + 1\n from cte where m.msg_id = cte.msg_id\n returning m.msg_id, m.read_ct, m.enqueued_at, m.vt, m.message\n $fmt$, 'q_' || queue_name, 'q_' || queue_name) using qty, vt;\nend $pgmq$;\n\ncreate or replace function pgmq.pop(queue_name text)\nreturns setof pgmq.message_record language plpgsql security definer set search_path = pgmq, pg_catalog, public as $pgmq$\nbegin\n return query execute format($fmt$\n with cte as (select msg_id from pgmq.%I where vt <= now() order by msg_id limit 1 for update skip locked)\n delete from pgmq.%I m using cte where m.msg_id = cte.msg_id\n returning m.msg_id, m.read_ct, m.enqueued_at, m.vt, m.message\n $fmt$, 'q_' || queue_name, 'q_' || queue_name);\nend $pgmq$;\n\ncreate or replace function pgmq.delete(queue_name text, msg_id bigint)\nreturns boolean language plpgsql security definer set search_path = pgmq, pg_catalog, public as $pgmq$\ndeclare n integer;\nbegin\n execute format('delete from pgmq.%I where msg_id = $1', 'q_' || queue_name) using msg_id;\n get diagnostics n = row_count;\n return n > 0;\nend $pgmq$;\n\ncreate or replace function pgmq.archive(queue_name text, msg_id bigint)\nreturns boolean language plpgsql security definer set search_path = pgmq, pg_catalog, public as $pgmq$\ndeclare n integer;\nbegin\n execute format($fmt$\n with del as (delete from pgmq.%I where msg_id = $1 returning *)\n insert into pgmq.%I (msg_id, read_ct, enqueued_at, vt, message)\n select msg_id, read_ct, enqueued_at, vt, message from del\n $fmt$, 'q_' || queue_name, 'a_' || queue_name) using msg_id;\n get diagnostics n = row_count;\n return n > 0;\nend $pgmq$;\n\ncreate or replace function pgmq.drop_queue(queue_name text) returns boolean language plpgsql security definer set search_path = pgmq, pg_catalog, public as $pgmq$\nbegin\n execute format('drop table if exists pgmq.%I', 'q_' || queue_name);\n execute format('drop table if exists pgmq.%I', 'a_' || queue_name);\n return true;\nend $pgmq$;\n\ncreate or replace function pgmq.purge_queue(queue_name text) returns bigint language plpgsql security definer set search_path = pgmq, pg_catalog, public as $pgmq$\ndeclare n bigint;\nbegin\n execute format('delete from pgmq.%I', 'q_' || queue_name);\n get diagnostics n = row_count;\n return n;\nend $pgmq$;\n\ncreate or replace function pgmq.list_queues()\nreturns table(queue_name text, is_partitioned boolean, is_unlogged boolean, created_at timestamptz)\nlanguage sql security definer set search_path = pgmq, pg_catalog, public as $pgmq$\n select substring(tablename from 3), false, false, now()\n from pg_tables where schemaname = 'pgmq' and left(tablename, 2) = 'q_';\n$pgmq$;\n\ngrant execute on all functions in schema pgmq to anon, authenticated, service_role;\n";
|
|
12
12
|
export declare const CRON_SQL = "\ncreate schema if not exists cron;\ngrant usage on schema cron to service_role, authenticated;\n\ncreate table if not exists cron.job (\n jobid bigint generated always as identity primary key,\n schedule text not null,\n command text not null,\n jobname text unique,\n active boolean not null default true,\n created_at timestamptz not null default now()\n);\n\ncreate table if not exists cron.job_run_details (\n runid bigint generated always as identity primary key,\n jobid bigint,\n command text,\n status text,\n return_message text,\n start_time timestamptz,\n end_time timestamptz\n);\n\ncreate or replace function cron.schedule(job_name text, schedule text, command text)\nreturns bigint language plpgsql security definer set search_path = cron, pg_catalog, public as $cron$\ndeclare id bigint;\nbegin\n insert into cron.job (jobname, schedule, command) values (job_name, schedule, command)\n on conflict (jobname) do update set schedule = excluded.schedule, command = excluded.command, active = true\n returning jobid into id;\n return id;\nend $cron$;\n\ncreate or replace function cron.schedule(schedule text, command text)\nreturns bigint language plpgsql security definer set search_path = cron, pg_catalog, public as $cron$\nbegin\n return cron.schedule('job_' || floor(extract(epoch from clock_timestamp()) * 1000)::bigint::text, schedule, command);\nend $cron$;\n\ncreate or replace function cron.unschedule(job_name text)\nreturns boolean language plpgsql security definer set search_path = cron, pg_catalog, public as $cron$\ndeclare n integer;\nbegin\n delete from cron.job where jobname = job_name;\n get diagnostics n = row_count;\n return n > 0;\nend $cron$;\n\ncreate or replace function cron.unschedule(job_id bigint)\nreturns boolean language plpgsql security definer set search_path = cron, pg_catalog, public as $cron$\ndeclare n integer;\nbegin\n delete from cron.job where jobid = job_id;\n get diagnostics n = row_count;\n return n > 0;\nend $cron$;\n\ngrant execute on function cron.schedule(text,text,text), cron.schedule(text,text), cron.unschedule(text), cron.unschedule(bigint) to service_role, authenticated;\n";
|
|
13
|
+
export declare const NET_SQL = "\ncreate schema if not exists net;\ngrant usage on schema net to service_role, authenticated;\n\ncreate table if not exists net.http_request_queue (\n id bigint generated always as identity primary key,\n method text not null,\n url text not null,\n headers jsonb not null default '{}'::jsonb,\n body text,\n timeout_milliseconds int not null default 5000,\n created timestamptz not null default now()\n);\n\ncreate table if not exists net._http_response (\n id bigint primary key,\n status_code int,\n content_type text,\n headers jsonb,\n content text,\n timed_out boolean,\n error_msg text,\n created timestamptz not null default now()\n);\ngrant select on net._http_response to service_role, authenticated;\n\n-- fold a jsonb param object into the URL as a query string (pg_net semantics)\ncreate or replace function net._merge_params(url text, params jsonb)\nreturns text language sql immutable as $net$\n select case\n when params is null or params = '{}'::jsonb then url\n else url || (case when position('?' in url) > 0 then '&' else '?' end) ||\n (select string_agg(key || '=' || (value #>> '{}'), '&') from jsonb_each(params))\n end;\n$net$;\n\ncreate or replace function net.http_get(url text, params jsonb default '{}'::jsonb, headers jsonb default '{}'::jsonb, timeout_milliseconds int default 5000)\nreturns bigint language plpgsql security definer set search_path = net, pg_catalog, public as $net$\ndeclare req_id bigint;\nbegin\n insert into net.http_request_queue (method, url, headers, body, timeout_milliseconds)\n values ('GET', net._merge_params(url, params), coalesce(headers, '{}'::jsonb), null, timeout_milliseconds)\n returning id into req_id;\n return req_id;\nend $net$;\n\ncreate or replace function net.http_post(url text, body jsonb default '{}'::jsonb, params jsonb default '{}'::jsonb, headers jsonb default '{}'::jsonb, timeout_milliseconds int default 5000)\nreturns bigint language plpgsql security definer set search_path = net, pg_catalog, public as $net$\ndeclare req_id bigint; hdrs jsonb;\nbegin\n hdrs := coalesce(headers, '{}'::jsonb);\n -- default the content type to JSON, matching pg_net, unless the caller set one\n if not (hdrs ? 'Content-Type' or hdrs ? 'content-type') then\n hdrs := hdrs || jsonb_build_object('Content-Type', 'application/json');\n end if;\n insert into net.http_request_queue (method, url, headers, body, timeout_milliseconds)\n values ('POST', net._merge_params(url, params), hdrs, body::text, timeout_milliseconds)\n returning id into req_id;\n return req_id;\nend $net$;\n\ncreate or replace function net.http_delete(url text, params jsonb default '{}'::jsonb, headers jsonb default '{}'::jsonb, timeout_milliseconds int default 5000)\nreturns bigint language plpgsql security definer set search_path = net, pg_catalog, public as $net$\ndeclare req_id bigint;\nbegin\n insert into net.http_request_queue (method, url, headers, body, timeout_milliseconds)\n values ('DELETE', net._merge_params(url, params), coalesce(headers, '{}'::jsonb), null, timeout_milliseconds)\n returning id into req_id;\n return req_id;\nend $net$;\n\ngrant execute on function net.http_get(text,jsonb,jsonb,int), net.http_post(text,jsonb,jsonb,jsonb,int), net.http_delete(text,jsonb,jsonb,int) to service_role, authenticated;\n";
|
|
14
|
+
export declare const EXT_COMPAT_SQL = "\ncreate schema if not exists extensions;\ndo $ensure_moddatetime$\nbegin\n if not exists (\n select 1 from pg_proc p join pg_namespace n on n.oid = p.pronamespace\n where n.nspname = 'extensions' and p.proname = 'moddatetime'\n ) then\n execute $fn$\n create function extensions.moddatetime() returns trigger language plpgsql as $mod$\n begin\n if TG_NARGS >= 1 then\n NEW := jsonb_populate_record(NEW, jsonb_build_object(TG_ARGV[0], now()));\n end if;\n return NEW;\n end\n $mod$\n $fn$;\n end if;\nend\n$ensure_moddatetime$;\n";
|
|
15
|
+
export declare const VAULT_SQL = "\ncreate schema if not exists vault;\ngrant usage on schema vault to service_role;\n\ncreate table if not exists vault.secrets (\n id uuid primary key default gen_random_uuid(),\n name text unique,\n description text not null default '',\n secret text not null,\n key_id uuid,\n nonce bytea,\n created_at timestamptz not null default now(),\n updated_at timestamptz not null default now()\n);\ngrant select, insert, update, delete on vault.secrets to service_role;\n\ncreate or replace view vault.decrypted_secrets as\n select id, name, description, secret, secret as decrypted_secret, key_id, nonce, created_at, updated_at\n from vault.secrets;\ngrant select on vault.decrypted_secrets to service_role;\n\ncreate or replace function vault.create_secret(new_secret text, new_name text default null, new_description text default '', new_key_id uuid default null)\nreturns uuid language plpgsql security definer set search_path = vault, pg_catalog, public as $vault$\ndeclare rec_id uuid;\nbegin\n insert into vault.secrets (name, description, secret, key_id)\n values (new_name, coalesce(new_description, ''), new_secret, new_key_id)\n returning id into rec_id;\n return rec_id;\nend $vault$;\n\ncreate or replace function vault.update_secret(secret_id uuid, new_secret text default null, new_name text default null, new_description text default null, new_key_id uuid default null)\nreturns void language plpgsql security definer set search_path = vault, pg_catalog, public as $vault$\nbegin\n update vault.secrets set\n secret = coalesce(new_secret, secret),\n name = coalesce(new_name, name),\n description = coalesce(new_description, description),\n key_id = coalesce(new_key_id, key_id),\n updated_at = now()\n where id = secret_id;\nend $vault$;\n\ngrant execute on function vault.create_secret(text,text,text,uuid), vault.update_secret(uuid,text,text,text,uuid) to service_role;\n";
|
package/dist/db/emulated.js
CHANGED
|
@@ -91,6 +91,28 @@ begin
|
|
|
91
91
|
return n > 0;
|
|
92
92
|
end $pgmq$;
|
|
93
93
|
|
|
94
|
+
create or replace function pgmq.drop_queue(queue_name text) returns boolean language plpgsql security definer set search_path = pgmq, pg_catalog, public as $pgmq$
|
|
95
|
+
begin
|
|
96
|
+
execute format('drop table if exists pgmq.%I', 'q_' || queue_name);
|
|
97
|
+
execute format('drop table if exists pgmq.%I', 'a_' || queue_name);
|
|
98
|
+
return true;
|
|
99
|
+
end $pgmq$;
|
|
100
|
+
|
|
101
|
+
create or replace function pgmq.purge_queue(queue_name text) returns bigint language plpgsql security definer set search_path = pgmq, pg_catalog, public as $pgmq$
|
|
102
|
+
declare n bigint;
|
|
103
|
+
begin
|
|
104
|
+
execute format('delete from pgmq.%I', 'q_' || queue_name);
|
|
105
|
+
get diagnostics n = row_count;
|
|
106
|
+
return n;
|
|
107
|
+
end $pgmq$;
|
|
108
|
+
|
|
109
|
+
create or replace function pgmq.list_queues()
|
|
110
|
+
returns table(queue_name text, is_partitioned boolean, is_unlogged boolean, created_at timestamptz)
|
|
111
|
+
language sql security definer set search_path = pgmq, pg_catalog, public as $pgmq$
|
|
112
|
+
select substring(tablename from 3), false, false, now()
|
|
113
|
+
from pg_tables where schemaname = 'pgmq' and left(tablename, 2) = 'q_';
|
|
114
|
+
$pgmq$;
|
|
115
|
+
|
|
94
116
|
grant execute on all functions in schema pgmq to anon, authenticated, service_role;
|
|
95
117
|
`;
|
|
96
118
|
// ── cron (scheduled jobs) ────────────────────────────────────────────────────
|
|
@@ -153,4 +175,161 @@ end $cron$;
|
|
|
153
175
|
|
|
154
176
|
grant execute on function cron.schedule(text,text,text), cron.schedule(text,text), cron.unschedule(text), cron.unschedule(bigint) to service_role, authenticated;
|
|
155
177
|
`;
|
|
178
|
+
// pg_net emulation — the `net.http_get/post/delete` SQL surface. The functions
|
|
179
|
+
// only enqueue into net.http_request_queue; the in-process NetService
|
|
180
|
+
// (src/net/service.ts) performs the HTTP and records the reply in
|
|
181
|
+
// net._http_response, exactly like pg_net's background worker. This lets the
|
|
182
|
+
// common Supabase pattern — a cron job that calls net.http_post to hit an Edge
|
|
183
|
+
// Function — run unchanged, with no C extension on either engine.
|
|
184
|
+
export const NET_SQL = `
|
|
185
|
+
create schema if not exists net;
|
|
186
|
+
grant usage on schema net to service_role, authenticated;
|
|
187
|
+
|
|
188
|
+
create table if not exists net.http_request_queue (
|
|
189
|
+
id bigint generated always as identity primary key,
|
|
190
|
+
method text not null,
|
|
191
|
+
url text not null,
|
|
192
|
+
headers jsonb not null default '{}'::jsonb,
|
|
193
|
+
body text,
|
|
194
|
+
timeout_milliseconds int not null default 5000,
|
|
195
|
+
created timestamptz not null default now()
|
|
196
|
+
);
|
|
197
|
+
|
|
198
|
+
create table if not exists net._http_response (
|
|
199
|
+
id bigint primary key,
|
|
200
|
+
status_code int,
|
|
201
|
+
content_type text,
|
|
202
|
+
headers jsonb,
|
|
203
|
+
content text,
|
|
204
|
+
timed_out boolean,
|
|
205
|
+
error_msg text,
|
|
206
|
+
created timestamptz not null default now()
|
|
207
|
+
);
|
|
208
|
+
grant select on net._http_response to service_role, authenticated;
|
|
209
|
+
|
|
210
|
+
-- fold a jsonb param object into the URL as a query string (pg_net semantics)
|
|
211
|
+
create or replace function net._merge_params(url text, params jsonb)
|
|
212
|
+
returns text language sql immutable as $net$
|
|
213
|
+
select case
|
|
214
|
+
when params is null or params = '{}'::jsonb then url
|
|
215
|
+
else url || (case when position('?' in url) > 0 then '&' else '?' end) ||
|
|
216
|
+
(select string_agg(key || '=' || (value #>> '{}'), '&') from jsonb_each(params))
|
|
217
|
+
end;
|
|
218
|
+
$net$;
|
|
219
|
+
|
|
220
|
+
create or replace function net.http_get(url text, params jsonb default '{}'::jsonb, headers jsonb default '{}'::jsonb, timeout_milliseconds int default 5000)
|
|
221
|
+
returns bigint language plpgsql security definer set search_path = net, pg_catalog, public as $net$
|
|
222
|
+
declare req_id bigint;
|
|
223
|
+
begin
|
|
224
|
+
insert into net.http_request_queue (method, url, headers, body, timeout_milliseconds)
|
|
225
|
+
values ('GET', net._merge_params(url, params), coalesce(headers, '{}'::jsonb), null, timeout_milliseconds)
|
|
226
|
+
returning id into req_id;
|
|
227
|
+
return req_id;
|
|
228
|
+
end $net$;
|
|
229
|
+
|
|
230
|
+
create or replace function net.http_post(url text, body jsonb default '{}'::jsonb, params jsonb default '{}'::jsonb, headers jsonb default '{}'::jsonb, timeout_milliseconds int default 5000)
|
|
231
|
+
returns bigint language plpgsql security definer set search_path = net, pg_catalog, public as $net$
|
|
232
|
+
declare req_id bigint; hdrs jsonb;
|
|
233
|
+
begin
|
|
234
|
+
hdrs := coalesce(headers, '{}'::jsonb);
|
|
235
|
+
-- default the content type to JSON, matching pg_net, unless the caller set one
|
|
236
|
+
if not (hdrs ? 'Content-Type' or hdrs ? 'content-type') then
|
|
237
|
+
hdrs := hdrs || jsonb_build_object('Content-Type', 'application/json');
|
|
238
|
+
end if;
|
|
239
|
+
insert into net.http_request_queue (method, url, headers, body, timeout_milliseconds)
|
|
240
|
+
values ('POST', net._merge_params(url, params), hdrs, body::text, timeout_milliseconds)
|
|
241
|
+
returning id into req_id;
|
|
242
|
+
return req_id;
|
|
243
|
+
end $net$;
|
|
244
|
+
|
|
245
|
+
create or replace function net.http_delete(url text, params jsonb default '{}'::jsonb, headers jsonb default '{}'::jsonb, timeout_milliseconds int default 5000)
|
|
246
|
+
returns bigint language plpgsql security definer set search_path = net, pg_catalog, public as $net$
|
|
247
|
+
declare req_id bigint;
|
|
248
|
+
begin
|
|
249
|
+
insert into net.http_request_queue (method, url, headers, body, timeout_milliseconds)
|
|
250
|
+
values ('DELETE', net._merge_params(url, params), coalesce(headers, '{}'::jsonb), null, timeout_milliseconds)
|
|
251
|
+
returning id into req_id;
|
|
252
|
+
return req_id;
|
|
253
|
+
end $net$;
|
|
254
|
+
|
|
255
|
+
grant execute on function net.http_get(text,jsonb,jsonb,int), net.http_post(text,jsonb,jsonb,jsonb,int), net.http_delete(text,jsonb,jsonb,int) to service_role, authenticated;
|
|
256
|
+
`;
|
|
257
|
+
// Small pure-SQL stand-ins for contrib extensions Supabase migrations lean on
|
|
258
|
+
// but which aren't in the PGlite / native builds. `moddatetime` (a BEFORE
|
|
259
|
+
// UPDATE trigger that stamps a timestamp column) is the common one — projects
|
|
260
|
+
// attach it as the updated_at trigger. Created only if absent, so a real
|
|
261
|
+
// extension (where present) still wins.
|
|
262
|
+
export const EXT_COMPAT_SQL = `
|
|
263
|
+
create schema if not exists extensions;
|
|
264
|
+
do $ensure_moddatetime$
|
|
265
|
+
begin
|
|
266
|
+
if not exists (
|
|
267
|
+
select 1 from pg_proc p join pg_namespace n on n.oid = p.pronamespace
|
|
268
|
+
where n.nspname = 'extensions' and p.proname = 'moddatetime'
|
|
269
|
+
) then
|
|
270
|
+
execute $fn$
|
|
271
|
+
create function extensions.moddatetime() returns trigger language plpgsql as $mod$
|
|
272
|
+
begin
|
|
273
|
+
if TG_NARGS >= 1 then
|
|
274
|
+
NEW := jsonb_populate_record(NEW, jsonb_build_object(TG_ARGV[0], now()));
|
|
275
|
+
end if;
|
|
276
|
+
return NEW;
|
|
277
|
+
end
|
|
278
|
+
$mod$
|
|
279
|
+
$fn$;
|
|
280
|
+
end if;
|
|
281
|
+
end
|
|
282
|
+
$ensure_moddatetime$;
|
|
283
|
+
`;
|
|
284
|
+
// Supabase Vault emulation. Real Vault (supabase_vault + pgsodium) encrypts
|
|
285
|
+
// secrets at rest; we can't ship those C extensions, so this is a dev-only
|
|
286
|
+
// plaintext stand-in with the same surface: vault.secrets, the
|
|
287
|
+
// vault.decrypted_secrets view, and vault.create_secret / update_secret. Enough
|
|
288
|
+
// for migrations and app code that store/read secrets by name to work locally.
|
|
289
|
+
// NOT for production — secrets are stored in cleartext.
|
|
290
|
+
export const VAULT_SQL = `
|
|
291
|
+
create schema if not exists vault;
|
|
292
|
+
grant usage on schema vault to service_role;
|
|
293
|
+
|
|
294
|
+
create table if not exists vault.secrets (
|
|
295
|
+
id uuid primary key default gen_random_uuid(),
|
|
296
|
+
name text unique,
|
|
297
|
+
description text not null default '',
|
|
298
|
+
secret text not null,
|
|
299
|
+
key_id uuid,
|
|
300
|
+
nonce bytea,
|
|
301
|
+
created_at timestamptz not null default now(),
|
|
302
|
+
updated_at timestamptz not null default now()
|
|
303
|
+
);
|
|
304
|
+
grant select, insert, update, delete on vault.secrets to service_role;
|
|
305
|
+
|
|
306
|
+
create or replace view vault.decrypted_secrets as
|
|
307
|
+
select id, name, description, secret, secret as decrypted_secret, key_id, nonce, created_at, updated_at
|
|
308
|
+
from vault.secrets;
|
|
309
|
+
grant select on vault.decrypted_secrets to service_role;
|
|
310
|
+
|
|
311
|
+
create or replace function vault.create_secret(new_secret text, new_name text default null, new_description text default '', new_key_id uuid default null)
|
|
312
|
+
returns uuid language plpgsql security definer set search_path = vault, pg_catalog, public as $vault$
|
|
313
|
+
declare rec_id uuid;
|
|
314
|
+
begin
|
|
315
|
+
insert into vault.secrets (name, description, secret, key_id)
|
|
316
|
+
values (new_name, coalesce(new_description, ''), new_secret, new_key_id)
|
|
317
|
+
returning id into rec_id;
|
|
318
|
+
return rec_id;
|
|
319
|
+
end $vault$;
|
|
320
|
+
|
|
321
|
+
create or replace function vault.update_secret(secret_id uuid, new_secret text default null, new_name text default null, new_description text default null, new_key_id uuid default null)
|
|
322
|
+
returns void language plpgsql security definer set search_path = vault, pg_catalog, public as $vault$
|
|
323
|
+
begin
|
|
324
|
+
update vault.secrets set
|
|
325
|
+
secret = coalesce(new_secret, secret),
|
|
326
|
+
name = coalesce(new_name, name),
|
|
327
|
+
description = coalesce(new_description, description),
|
|
328
|
+
key_id = coalesce(new_key_id, key_id),
|
|
329
|
+
updated_at = now()
|
|
330
|
+
where id = secret_id;
|
|
331
|
+
end $vault$;
|
|
332
|
+
|
|
333
|
+
grant execute on function vault.create_secret(text,text,text,uuid), vault.update_secret(uuid,text,text,text,uuid) to service_role;
|
|
334
|
+
`;
|
|
156
335
|
//# sourceMappingURL=emulated.js.map
|
package/dist/db/emulated.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"emulated.js","sourceRoot":"","sources":["../../src/db/emulated.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,+EAA+E;AAC/E,MAAM,CAAC,MAAM,QAAQ,GAAG
|
|
1
|
+
{"version":3,"file":"emulated.js","sourceRoot":"","sources":["../../src/db/emulated.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,+EAA+E;AAC/E,MAAM,CAAC,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyGvB,CAAA;AAED,gFAAgF;AAChF,MAAM,CAAC,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0DvB,CAAA;AAED,+EAA+E;AAC/E,sEAAsE;AACtE,kEAAkE;AAClE,6EAA6E;AAC7E,+EAA+E;AAC/E,kEAAkE;AAClE,MAAM,CAAC,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwEtB,CAAA;AAED,8EAA8E;AAC9E,0EAA0E;AAC1E,8EAA8E;AAC9E,yEAAyE;AACzE,wCAAwC;AACxC,MAAM,CAAC,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;CAqB7B,CAAA;AAED,4EAA4E;AAC5E,2EAA2E;AAC3E,+DAA+D;AAC/D,gFAAgF;AAChF,+EAA+E;AAC/E,wDAAwD;AACxD,MAAM,CAAC,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4CxB,CAAA"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compatibility rewrites for user migration / seed SQL.
|
|
3
|
+
*
|
|
4
|
+
* tinbase can't install C extensions (pg_cron, pg_net, http, supabase_vault,
|
|
5
|
+
* hypopg, …) into the PGlite or embedded-native Postgres build, and several of
|
|
6
|
+
* them are emulated in pure SQL instead (cron, pg_net, pgmq — see
|
|
7
|
+
* db/emulated.ts). A real Supabase project's first migration typically runs a
|
|
8
|
+
* batch of `CREATE EXTENSION` statements; on stock Postgres a missing one
|
|
9
|
+
* aborts the whole migration with `extension "…" is not available`.
|
|
10
|
+
*
|
|
11
|
+
* `tolerateExtensionStatements` wraps every *top-level* CREATE/DROP EXTENSION
|
|
12
|
+
* statement in a `DO … EXCEPTION WHEN OTHERS` block (the same trick the
|
|
13
|
+
* bootstrap uses for its own extension list), so an unavailable extension is
|
|
14
|
+
* skipped with a NOTICE rather than aborting the migration. Extensions the
|
|
15
|
+
* engine does bundle are still created normally, and the emulated schemas
|
|
16
|
+
* created at bootstrap remain in place.
|
|
17
|
+
*
|
|
18
|
+
* It also strips `CONCURRENTLY` from index statements: tinbase applies each
|
|
19
|
+
* migration inside a transaction (for atomicity + rollback), and
|
|
20
|
+
* `CREATE/DROP INDEX CONCURRENTLY` / `REINDEX … CONCURRENTLY` are illegal in a
|
|
21
|
+
* transaction block. On a single-connection local dev database CONCURRENTLY
|
|
22
|
+
* buys nothing over a plain index, so we drop the keyword — the resulting index
|
|
23
|
+
* is identical.
|
|
24
|
+
*
|
|
25
|
+
* The scan is quote/comment-aware so it never touches these keywords when they
|
|
26
|
+
* appear inside a dollar-quoted function body, a string literal, or a comment.
|
|
27
|
+
*/
|
|
28
|
+
/**
|
|
29
|
+
* Rewrite user migration / seed SQL for the local engine: make CREATE/DROP
|
|
30
|
+
* EXTENSION tolerant, and strip CONCURRENTLY from index statements.
|
|
31
|
+
*/
|
|
32
|
+
export declare function rewriteMigrationSql(sql: string): string;
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compatibility rewrites for user migration / seed SQL.
|
|
3
|
+
*
|
|
4
|
+
* tinbase can't install C extensions (pg_cron, pg_net, http, supabase_vault,
|
|
5
|
+
* hypopg, …) into the PGlite or embedded-native Postgres build, and several of
|
|
6
|
+
* them are emulated in pure SQL instead (cron, pg_net, pgmq — see
|
|
7
|
+
* db/emulated.ts). A real Supabase project's first migration typically runs a
|
|
8
|
+
* batch of `CREATE EXTENSION` statements; on stock Postgres a missing one
|
|
9
|
+
* aborts the whole migration with `extension "…" is not available`.
|
|
10
|
+
*
|
|
11
|
+
* `tolerateExtensionStatements` wraps every *top-level* CREATE/DROP EXTENSION
|
|
12
|
+
* statement in a `DO … EXCEPTION WHEN OTHERS` block (the same trick the
|
|
13
|
+
* bootstrap uses for its own extension list), so an unavailable extension is
|
|
14
|
+
* skipped with a NOTICE rather than aborting the migration. Extensions the
|
|
15
|
+
* engine does bundle are still created normally, and the emulated schemas
|
|
16
|
+
* created at bootstrap remain in place.
|
|
17
|
+
*
|
|
18
|
+
* It also strips `CONCURRENTLY` from index statements: tinbase applies each
|
|
19
|
+
* migration inside a transaction (for atomicity + rollback), and
|
|
20
|
+
* `CREATE/DROP INDEX CONCURRENTLY` / `REINDEX … CONCURRENTLY` are illegal in a
|
|
21
|
+
* transaction block. On a single-connection local dev database CONCURRENTLY
|
|
22
|
+
* buys nothing over a plain index, so we drop the keyword — the resulting index
|
|
23
|
+
* is identical.
|
|
24
|
+
*
|
|
25
|
+
* The scan is quote/comment-aware so it never touches these keywords when they
|
|
26
|
+
* appear inside a dollar-quoted function body, a string literal, or a comment.
|
|
27
|
+
*/
|
|
28
|
+
/**
|
|
29
|
+
* Rewrite user migration / seed SQL for the local engine: make CREATE/DROP
|
|
30
|
+
* EXTENSION tolerant, and strip CONCURRENTLY from index statements.
|
|
31
|
+
*/
|
|
32
|
+
export function rewriteMigrationSql(sql) {
|
|
33
|
+
const out = [];
|
|
34
|
+
const n = sql.length;
|
|
35
|
+
let i = 0;
|
|
36
|
+
let stmtStart = 0;
|
|
37
|
+
while (i < n) {
|
|
38
|
+
const c = sql[i];
|
|
39
|
+
// line comment
|
|
40
|
+
if (c === '-' && sql[i + 1] === '-') {
|
|
41
|
+
const nl = sql.indexOf('\n', i);
|
|
42
|
+
i = nl === -1 ? n : nl + 1;
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
// block comment
|
|
46
|
+
if (c === '/' && sql[i + 1] === '*') {
|
|
47
|
+
const end = sql.indexOf('*/', i + 2);
|
|
48
|
+
i = end === -1 ? n : end + 2;
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
// single-quoted string ('' escapes a quote)
|
|
52
|
+
if (c === "'") {
|
|
53
|
+
i++;
|
|
54
|
+
while (i < n) {
|
|
55
|
+
if (sql[i] === "'") {
|
|
56
|
+
if (sql[i + 1] === "'") {
|
|
57
|
+
i += 2;
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
i++;
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
i++;
|
|
64
|
+
}
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
// double-quoted identifier ("" escapes a quote)
|
|
68
|
+
if (c === '"') {
|
|
69
|
+
i++;
|
|
70
|
+
while (i < n) {
|
|
71
|
+
if (sql[i] === '"') {
|
|
72
|
+
if (sql[i + 1] === '"') {
|
|
73
|
+
i += 2;
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
i++;
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
i++;
|
|
80
|
+
}
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
// dollar-quoted string $tag$ … $tag$
|
|
84
|
+
if (c === '$') {
|
|
85
|
+
const m = /^\$[A-Za-z_0-9]*\$/.exec(sql.slice(i));
|
|
86
|
+
if (m) {
|
|
87
|
+
const tag = m[0];
|
|
88
|
+
const end = sql.indexOf(tag, i + tag.length);
|
|
89
|
+
i = end === -1 ? n : end + tag.length;
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// top-level statement terminator
|
|
94
|
+
if (c === ';') {
|
|
95
|
+
out.push(rewriteStatement(sql.slice(stmtStart, i + 1)));
|
|
96
|
+
i++;
|
|
97
|
+
stmtStart = i;
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
i++;
|
|
101
|
+
}
|
|
102
|
+
if (stmtStart < n)
|
|
103
|
+
out.push(rewriteStatement(sql.slice(stmtStart)));
|
|
104
|
+
return out.join('');
|
|
105
|
+
}
|
|
106
|
+
const LEADING_TRIVIA = /^(?:\s|--[^\n]*\n?|\/\*[\s\S]*?\*\/)*/;
|
|
107
|
+
function rewriteStatement(stmt) {
|
|
108
|
+
const trivia = LEADING_TRIVIA.exec(stmt)?.[0] ?? '';
|
|
109
|
+
const rest = stmt.slice(trivia.length);
|
|
110
|
+
// CREATE/DROP EXTENSION → wrap so an unavailable extension is skipped
|
|
111
|
+
if (/^(?:create|drop)\s+extension\b/i.test(rest)) {
|
|
112
|
+
const semi = rest.lastIndexOf(';');
|
|
113
|
+
const bare = (semi !== -1 && rest.slice(semi + 1).trim() === '' ? rest.slice(0, semi) : rest).trim();
|
|
114
|
+
if (!bare)
|
|
115
|
+
return stmt;
|
|
116
|
+
const inner = pickTag(bare, 'tb_ext_stmt');
|
|
117
|
+
const outer = pickTag(bare, 'tb_ext');
|
|
118
|
+
return (`${trivia}DO ${outer} BEGIN EXECUTE ${inner}${bare}${inner}; ` +
|
|
119
|
+
`EXCEPTION WHEN OTHERS THEN RAISE NOTICE 'tinbase: skipped extension statement (%)', SQLERRM; END ${outer};`);
|
|
120
|
+
}
|
|
121
|
+
// CREATE/DROP INDEX / REINDEX … CONCURRENTLY → drop CONCURRENTLY (illegal in
|
|
122
|
+
// a transaction; a plain index is equivalent on a local dev database)
|
|
123
|
+
if (/^(?:create\s+(?:unique\s+)?index|drop\s+index|reindex)\b/i.test(rest)) {
|
|
124
|
+
return trivia + rest.replace(/\s+concurrently\b/i, ' ');
|
|
125
|
+
}
|
|
126
|
+
return stmt;
|
|
127
|
+
}
|
|
128
|
+
/** A dollar-quote tag guaranteed not to occur in `text`. */
|
|
129
|
+
function pickTag(text, base) {
|
|
130
|
+
let tag = `$${base}$`;
|
|
131
|
+
let k = 0;
|
|
132
|
+
while (text.includes(tag))
|
|
133
|
+
tag = `$${base}_${k++}$`;
|
|
134
|
+
return tag;
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=sql-compat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sql-compat.js","sourceRoot":"","sources":["../../src/db/sql-compat.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ import { Database } from './db/database.js';
|
|
|
5
5
|
import { RealtimeEngine } from './realtime/engine.js';
|
|
6
6
|
import { WebhooksService } from './webhooks/service.js';
|
|
7
7
|
import { CronService } from './cron/service.js';
|
|
8
|
+
import { NetService } from './net/service.js';
|
|
8
9
|
import { type BackendConfig, type MigrationFile } from './types.js';
|
|
9
10
|
export * from './types.js';
|
|
10
11
|
export { Database } from './db/database.js';
|
|
@@ -20,6 +21,7 @@ export { generateTypes } from './gen-types.js';
|
|
|
20
21
|
export { installDenoShim, setDenoEnv } from './functions/deno-shim.js';
|
|
21
22
|
export { WebhooksService, type WebhookConfig, type WebhookDelivery } from './webhooks/service.js';
|
|
22
23
|
export { CronService, cronMatches } from './cron/service.js';
|
|
24
|
+
export { NetService, type NetDelivery } from './net/service.js';
|
|
23
25
|
export { snapshotSchema, diffSchemas, type SchemaSnapshot } from './db/schema-diff.js';
|
|
24
26
|
export { inspectDb, type TableInfo } from './db/inspect.js';
|
|
25
27
|
export interface TinbaseBackend {
|
|
@@ -30,6 +32,7 @@ export interface TinbaseBackend {
|
|
|
30
32
|
functions: FunctionsHandler;
|
|
31
33
|
webhooks: WebhooksService;
|
|
32
34
|
cron: CronService;
|
|
35
|
+
net: NetService;
|
|
33
36
|
/** JWT for the anon role — use as supabase-js's supabaseKey. */
|
|
34
37
|
anonKey: string;
|
|
35
38
|
/** JWT for the service_role — bypasses RLS. */
|