tinbase 0.2.2 → 0.5.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 +38 -8
- package/dist/admin/api.d.ts +5 -0
- package/dist/admin/api.js +85 -0
- package/dist/admin/api.js.map +1 -1
- package/dist/admin/ui.d.ts +1 -1
- package/dist/admin/ui.js +16 -16
- package/dist/auth/handler.d.ts +7 -0
- package/dist/auth/handler.js +25 -0
- package/dist/auth/handler.js.map +1 -1
- package/dist/auth/oauth.d.ts +59 -0
- package/dist/auth/oauth.js +209 -0
- package/dist/auth/oauth.js.map +1 -0
- package/dist/cli.js +105 -2
- package/dist/cli.js.map +1 -1
- package/dist/cron/service.d.ts +29 -0
- package/dist/cron/service.js +134 -0
- package/dist/cron/service.js.map +1 -0
- package/dist/db/bootstrap.d.ts +1 -1
- package/dist/db/bootstrap.js +43 -1
- package/dist/db/bootstrap.js.map +1 -1
- package/dist/db/database.d.ts +3 -0
- package/dist/db/database.js +19 -0
- package/dist/db/database.js.map +1 -1
- package/dist/db/emulated.d.ts +12 -0
- package/dist/db/emulated.js +156 -0
- package/dist/db/emulated.js.map +1 -0
- package/dist/db/schema-diff.d.ts +23 -0
- package/dist/db/schema-diff.js +182 -0
- package/dist/db/schema-diff.js.map +1 -0
- package/dist/functions/deno-shim.d.ts +24 -0
- package/dist/functions/deno-shim.js +47 -0
- package/dist/functions/deno-shim.js.map +1 -0
- package/dist/gen-types.d.ts +17 -0
- package/dist/gen-types.js +222 -0
- package/dist/gen-types.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +35 -6
- package/dist/index.js.map +1 -1
- package/dist/node/db-diff.d.ts +13 -0
- package/dist/node/db-diff.js +40 -0
- package/dist/node/db-diff.js.map +1 -0
- package/dist/node/index.d.ts +2 -0
- package/dist/node/index.js +2 -0
- package/dist/node/index.js.map +1 -1
- package/dist/node/load-functions.js +11 -3
- package/dist/node/load-functions.js.map +1 -1
- package/dist/node/load-oauth.d.ts +4 -0
- package/dist/node/load-oauth.js +126 -0
- package/dist/node/load-oauth.js.map +1 -0
- package/dist/node/native/engine.d.ts +1 -1
- package/dist/node/native/engine.js +45 -14
- package/dist/node/native/engine.js.map +1 -1
- package/dist/realtime/engine.d.ts +14 -1
- package/dist/realtime/engine.js +65 -2
- package/dist/realtime/engine.js.map +1 -1
- package/dist/types.d.ts +8 -0
- package/dist/types.js.map +1 -1
- package/dist/webhooks/service.d.ts +47 -0
- package/dist/webhooks/service.js +86 -0
- package/dist/webhooks/service.js.map +1 -0
- package/package.json +3 -2
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Database } from './database.js';
|
|
2
|
+
interface ColumnSnap {
|
|
3
|
+
name: string;
|
|
4
|
+
type: string;
|
|
5
|
+
nullable: boolean;
|
|
6
|
+
default: string | null;
|
|
7
|
+
}
|
|
8
|
+
interface TableSnap {
|
|
9
|
+
name: string;
|
|
10
|
+
columns: Map<string, ColumnSnap>;
|
|
11
|
+
order: string[];
|
|
12
|
+
}
|
|
13
|
+
export interface SchemaSnapshot {
|
|
14
|
+
tables: Map<string, TableSnap>;
|
|
15
|
+
/** constraint/index name → definition, keyed by table */
|
|
16
|
+
constraints: Map<string, Map<string, string>>;
|
|
17
|
+
indexes: Map<string, Map<string, string>>;
|
|
18
|
+
enums: Map<string, string[]>;
|
|
19
|
+
}
|
|
20
|
+
export declare function snapshotSchema(db: Database, schema?: string): Promise<SchemaSnapshot>;
|
|
21
|
+
/** DDL to turn `from` into `to`, scoped to one schema. Empty array = no changes. */
|
|
22
|
+
export declare function diffSchemas(from: SchemaSnapshot, to: SchemaSnapshot, schema?: string): string[];
|
|
23
|
+
export {};
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema snapshot + diff — the engine behind `tinbase db diff`.
|
|
3
|
+
*
|
|
4
|
+
* Snapshots a schema (tables, columns, constraints, indexes, enums) into a
|
|
5
|
+
* structured form, then emits the DDL to turn one snapshot into another. Used
|
|
6
|
+
* to capture changes made outside migrations (e.g. in the Studio SQL editor)
|
|
7
|
+
* into a new migration, the way `supabase db diff` (migra) does.
|
|
8
|
+
*
|
|
9
|
+
* Covered: enums (create + add value), tables (create/drop), columns
|
|
10
|
+
* (add/drop/alter type/nullability/default), and named constraints + indexes
|
|
11
|
+
* (add/drop by definition). Not yet diffed: functions, triggers, policies,
|
|
12
|
+
* views — noted so the output never silently claims completeness.
|
|
13
|
+
*/
|
|
14
|
+
import { quoteIdent } from './database.js';
|
|
15
|
+
export async function snapshotSchema(db, schema = 'public') {
|
|
16
|
+
const cols = await db.query(`select c.relname as table, a.attname as column,
|
|
17
|
+
format_type(a.atttypid, a.atttypmod) as type,
|
|
18
|
+
not a.attnotnull as nullable,
|
|
19
|
+
pg_get_expr(d.adbin, d.adrelid) as default
|
|
20
|
+
from pg_attribute a
|
|
21
|
+
join pg_class c on c.oid = a.attrelid
|
|
22
|
+
join pg_namespace n on n.oid = c.relnamespace
|
|
23
|
+
left join pg_attrdef d on d.adrelid = c.oid and d.adnum = a.attnum
|
|
24
|
+
where n.nspname = $1 and c.relkind = 'r' and a.attnum > 0 and not a.attisdropped
|
|
25
|
+
order by c.relname, a.attnum`, [schema]);
|
|
26
|
+
const tables = new Map();
|
|
27
|
+
for (const c of cols.rows) {
|
|
28
|
+
let t = tables.get(c.table);
|
|
29
|
+
if (!t) {
|
|
30
|
+
t = { name: c.table, columns: new Map(), order: [] };
|
|
31
|
+
tables.set(c.table, t);
|
|
32
|
+
}
|
|
33
|
+
t.columns.set(c.column, { name: c.column, type: c.type, nullable: c.nullable, default: c.default });
|
|
34
|
+
t.order.push(c.column);
|
|
35
|
+
}
|
|
36
|
+
const cons = await db.query(`select c.relname as table, con.conname as name, pg_get_constraintdef(con.oid) as def, con.conindid::int as conindid
|
|
37
|
+
from pg_constraint con
|
|
38
|
+
join pg_class c on c.oid = con.conrelid
|
|
39
|
+
join pg_namespace n on n.oid = c.relnamespace
|
|
40
|
+
where n.nspname = $1 and con.contype in ('p','u','f','c')`, [schema]);
|
|
41
|
+
const constraints = new Map();
|
|
42
|
+
const constraintIndexOids = new Set();
|
|
43
|
+
for (const c of cons.rows) {
|
|
44
|
+
if (!constraints.has(c.table))
|
|
45
|
+
constraints.set(c.table, new Map());
|
|
46
|
+
constraints.get(c.table).set(c.name, c.def);
|
|
47
|
+
if (c.conindid)
|
|
48
|
+
constraintIndexOids.add(c.conindid);
|
|
49
|
+
}
|
|
50
|
+
// indexes not backing a constraint (those are emitted via the constraint)
|
|
51
|
+
const idx = await db.query(`select c.relname as table, ic.relname as name, pg_get_indexdef(i.indexrelid) as def, i.indexrelid::int as indexrelid
|
|
52
|
+
from pg_index i
|
|
53
|
+
join pg_class ic on ic.oid = i.indexrelid
|
|
54
|
+
join pg_class c on c.oid = i.indrelid
|
|
55
|
+
join pg_namespace n on n.oid = c.relnamespace
|
|
56
|
+
where n.nspname = $1`, [schema]);
|
|
57
|
+
const indexes = new Map();
|
|
58
|
+
for (const r of idx.rows) {
|
|
59
|
+
if (constraintIndexOids.has(r.indexrelid))
|
|
60
|
+
continue;
|
|
61
|
+
if (!indexes.has(r.table))
|
|
62
|
+
indexes.set(r.table, new Map());
|
|
63
|
+
indexes.get(r.table).set(r.name, r.def);
|
|
64
|
+
}
|
|
65
|
+
const en = await db.query(`select t.typname as name, array_agg(e.enumlabel order by e.enumsortorder) as labels
|
|
66
|
+
from pg_type t join pg_enum e on e.enumtypid = t.oid
|
|
67
|
+
join pg_namespace n on n.oid = t.typnamespace
|
|
68
|
+
where n.nspname = $1 group by t.typname`, [schema]);
|
|
69
|
+
const enums = new Map();
|
|
70
|
+
for (const r of en.rows)
|
|
71
|
+
enums.set(r.name, r.labels);
|
|
72
|
+
return { tables, constraints, indexes, enums };
|
|
73
|
+
}
|
|
74
|
+
/** DDL to turn `from` into `to`, scoped to one schema. Empty array = no changes. */
|
|
75
|
+
export function diffSchemas(from, to, schema = 'public') {
|
|
76
|
+
const out = [];
|
|
77
|
+
const q = (n) => quoteIdent(n);
|
|
78
|
+
const tbl = (t) => `${q(schema)}.${q(t)}`;
|
|
79
|
+
// ── enums ──
|
|
80
|
+
for (const [name, labels] of to.enums) {
|
|
81
|
+
if (!from.enums.has(name)) {
|
|
82
|
+
out.push(`create type ${q(schema)}.${q(name)} as enum (${labels.map((l) => `'${l.replace(/'/g, "''")}'`).join(', ')});`);
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
const before = from.enums.get(name);
|
|
86
|
+
for (const label of labels) {
|
|
87
|
+
if (!before.includes(label))
|
|
88
|
+
out.push(`alter type ${q(schema)}.${q(name)} add value '${label.replace(/'/g, "''")}';`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// ── new tables ──
|
|
93
|
+
for (const [name, t] of to.tables) {
|
|
94
|
+
if (from.tables.has(name))
|
|
95
|
+
continue;
|
|
96
|
+
const colDefs = t.order.map((cn) => columnClause(t.columns.get(cn), q));
|
|
97
|
+
out.push(`create table ${tbl(name)} (\n${colDefs.map((c) => ` ${c}`).join(',\n')}\n);`);
|
|
98
|
+
}
|
|
99
|
+
// ── column-level diffs on shared tables ──
|
|
100
|
+
for (const [name, toT] of to.tables) {
|
|
101
|
+
const fromT = from.tables.get(name);
|
|
102
|
+
if (!fromT)
|
|
103
|
+
continue;
|
|
104
|
+
for (const cn of toT.order) {
|
|
105
|
+
const toC = toT.columns.get(cn);
|
|
106
|
+
const fromC = fromT.columns.get(cn);
|
|
107
|
+
if (!fromC) {
|
|
108
|
+
out.push(`alter table ${tbl(name)} add column ${columnClause(toC, q)};`);
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
if (fromC.type !== toC.type)
|
|
112
|
+
out.push(`alter table ${tbl(name)} alter column ${q(cn)} type ${toC.type};`);
|
|
113
|
+
if (fromC.nullable !== toC.nullable)
|
|
114
|
+
out.push(`alter table ${tbl(name)} alter column ${q(cn)} ${toC.nullable ? 'drop not null' : 'set not null'};`);
|
|
115
|
+
if ((fromC.default ?? null) !== (toC.default ?? null)) {
|
|
116
|
+
out.push(toC.default === null
|
|
117
|
+
? `alter table ${tbl(name)} alter column ${q(cn)} drop default;`
|
|
118
|
+
: `alter table ${tbl(name)} alter column ${q(cn)} set default ${toC.default};`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
for (const cn of fromT.order) {
|
|
122
|
+
if (!toT.columns.has(cn))
|
|
123
|
+
out.push(`alter table ${tbl(name)} drop column ${q(cn)};`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// ── dropped tables ──
|
|
127
|
+
for (const name of from.tables.keys()) {
|
|
128
|
+
if (!to.tables.has(name))
|
|
129
|
+
out.push(`drop table ${tbl(name)};`);
|
|
130
|
+
}
|
|
131
|
+
// ── constraints (drop changed/removed, then add new) ──
|
|
132
|
+
diffNamed(from.constraints, to.constraints, {
|
|
133
|
+
drop: (table, cname) => out.push(`alter table ${tbl(table)} drop constraint ${q(cname)};`),
|
|
134
|
+
add: (table, cname, def) => out.push(`alter table ${tbl(table)} add constraint ${q(cname)} ${def};`),
|
|
135
|
+
});
|
|
136
|
+
// ── indexes (drop changed/removed, then add new) ──
|
|
137
|
+
diffNamed(from.indexes, to.indexes, {
|
|
138
|
+
drop: (_table, iname) => out.push(`drop index ${q(schema)}.${q(iname)};`),
|
|
139
|
+
add: (_table, _iname, def) => out.push(`${def};`),
|
|
140
|
+
});
|
|
141
|
+
return out;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Render a column definition. A `serial`-style column introspects as an integer
|
|
145
|
+
* with a `nextval('..._seq')` default and an owned sequence; re-emit it as
|
|
146
|
+
* serial/bigserial/smallserial so the sequence is recreated with the table
|
|
147
|
+
* (a bare `default nextval(...)` would reference a sequence that doesn't exist yet).
|
|
148
|
+
*/
|
|
149
|
+
function columnClause(c, q) {
|
|
150
|
+
const isSerialDefault = c.default !== null && /^nextval\(/i.test(c.default);
|
|
151
|
+
if (isSerialDefault) {
|
|
152
|
+
const serial = c.type === 'bigint' ? 'bigserial' : c.type === 'smallint' ? 'smallserial' : 'serial';
|
|
153
|
+
return `${q(c.name)} ${serial}` + (c.nullable ? '' : ' not null');
|
|
154
|
+
}
|
|
155
|
+
let s = `${q(c.name)} ${c.type}`;
|
|
156
|
+
if (!c.nullable)
|
|
157
|
+
s += ' not null';
|
|
158
|
+
if (c.default !== null)
|
|
159
|
+
s += ` default ${c.default}`;
|
|
160
|
+
return s;
|
|
161
|
+
}
|
|
162
|
+
function diffNamed(from, to, ops) {
|
|
163
|
+
// drops (and changed → drop first)
|
|
164
|
+
for (const [table, defs] of from) {
|
|
165
|
+
const toDefs = to.get(table) ?? new Map();
|
|
166
|
+
for (const [name, def] of defs) {
|
|
167
|
+
const toDef = toDefs.get(name);
|
|
168
|
+
if (toDef === undefined || toDef !== def)
|
|
169
|
+
ops.drop(table, name, def);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
// adds (and changed → re-add)
|
|
173
|
+
for (const [table, defs] of to) {
|
|
174
|
+
const fromDefs = from.get(table) ?? new Map();
|
|
175
|
+
for (const [name, def] of defs) {
|
|
176
|
+
const fromDef = fromDefs.get(name);
|
|
177
|
+
if (fromDef === undefined || fromDef !== def)
|
|
178
|
+
ops.add(table, name, def);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=schema-diff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-diff.js","sourceRoot":"","sources":["../../src/db/schema-diff.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal `Deno` global shim so Supabase-style edge functions run unchanged
|
|
3
|
+
* under Node/Bun. Supabase functions are written for Deno:
|
|
4
|
+
*
|
|
5
|
+
* Deno.serve((req) => new Response(...))
|
|
6
|
+
* const url = Deno.env.get('SUPABASE_URL')
|
|
7
|
+
*
|
|
8
|
+
* Instead of starting a server, our `Deno.serve` captures the handler so the
|
|
9
|
+
* FunctionsHandler can invoke it per request; `Deno.env` reads the injected
|
|
10
|
+
* SUPABASE_* vars, function secrets, and process.env.
|
|
11
|
+
*
|
|
12
|
+
* Not resolved: `npm:` / `jsr:` / URL import specifiers and the Deno std lib —
|
|
13
|
+
* a function using those needs a bundling step. Functions that stick to Web
|
|
14
|
+
* APIs (fetch/Request/Response) + Deno.serve/Deno.env work as-is.
|
|
15
|
+
*/
|
|
16
|
+
type DenoHandler = (req: Request) => Response | Promise<Response>;
|
|
17
|
+
/** Merge variables the shim's Deno.env should expose (SUPABASE_* keys, secrets). */
|
|
18
|
+
export declare function setDenoEnv(env: Record<string, string>): void;
|
|
19
|
+
/** Install globalThis.Deno if we're not already running under a Deno-like runtime. */
|
|
20
|
+
export declare function installDenoShim(): void;
|
|
21
|
+
/** Return and clear the handler captured by the most recent Deno.serve() call. */
|
|
22
|
+
export declare function takeCapturedHandler(): DenoHandler | undefined;
|
|
23
|
+
export declare function resetCapturedHandler(): void;
|
|
24
|
+
export {};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
const captured = {};
|
|
2
|
+
const denoEnv = {};
|
|
3
|
+
/** Merge variables the shim's Deno.env should expose (SUPABASE_* keys, secrets). */
|
|
4
|
+
export function setDenoEnv(env) {
|
|
5
|
+
Object.assign(denoEnv, env);
|
|
6
|
+
}
|
|
7
|
+
/** Install globalThis.Deno if we're not already running under a Deno-like runtime. */
|
|
8
|
+
export function installDenoShim() {
|
|
9
|
+
const g = globalThis;
|
|
10
|
+
if (g.__tinbaseDeno)
|
|
11
|
+
return;
|
|
12
|
+
// a real Deno runtime already provides Deno.serve — don't clobber it
|
|
13
|
+
if (g.Deno && typeof g.Deno.serve === 'function')
|
|
14
|
+
return;
|
|
15
|
+
g.__tinbaseDeno = true;
|
|
16
|
+
g.Deno = {
|
|
17
|
+
serve(arg1, arg2) {
|
|
18
|
+
captured.handler = (typeof arg1 === 'function' ? arg1 : arg2);
|
|
19
|
+
// Deno.serve returns a server; some functions `await server.finished`.
|
|
20
|
+
return { finished: Promise.resolve(), shutdown() { }, ref() { }, unref() { }, addr: { hostname: '0.0.0.0', port: 0, transport: 'tcp' } };
|
|
21
|
+
},
|
|
22
|
+
env: {
|
|
23
|
+
get: (k) => denoEnv[k] ?? process.env[k],
|
|
24
|
+
set: (k, v) => {
|
|
25
|
+
denoEnv[k] = v;
|
|
26
|
+
},
|
|
27
|
+
has: (k) => (denoEnv[k] ?? process.env[k]) !== undefined,
|
|
28
|
+
delete: (k) => {
|
|
29
|
+
delete denoEnv[k];
|
|
30
|
+
},
|
|
31
|
+
toObject: () => ({ ...process.env, ...denoEnv }),
|
|
32
|
+
},
|
|
33
|
+
// enough of the surface that idiomatic functions don't crash on reference
|
|
34
|
+
cwd: () => process.cwd(),
|
|
35
|
+
exit: (code) => process.exit(code),
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/** Return and clear the handler captured by the most recent Deno.serve() call. */
|
|
39
|
+
export function takeCapturedHandler() {
|
|
40
|
+
const h = captured.handler;
|
|
41
|
+
captured.handler = undefined;
|
|
42
|
+
return h;
|
|
43
|
+
}
|
|
44
|
+
export function resetCapturedHandler() {
|
|
45
|
+
captured.handler = undefined;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=deno-shim.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deno-shim.js","sourceRoot":"","sources":["../../src/functions/deno-shim.ts"],"names":[],"mappings":"AAiBA,MAAM,QAAQ,GAA8B,EAAE,CAAA;AAC9C,MAAM,OAAO,GAA2B,EAAE,CAAA;AAE1C,oFAAoF;AACpF,MAAM,UAAU,UAAU,CAAC,GAA2B;IACpD,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;AAC7B,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,eAAe;IAC7B,MAAM,CAAC,GAAG,UAAmF,CAAA;IAC7F,IAAI,CAAC,CAAC,aAAa;QAAE,OAAM;IAC3B,qEAAqE;IACrE,IAAI,CAAC,CAAC,IAAI,IAAI,OAAQ,CAAC,CAAC,IAA4B,CAAC,KAAK,KAAK,UAAU;QAAE,OAAM;IACjF,CAAC,CAAC,aAAa,GAAG,IAAI,CAAA;IACtB,CAAC,CAAC,IAAI,GAAG;QACP,KAAK,CAAC,IAAa,EAAE,IAAc;YACjC,QAAQ,CAAC,OAAO,GAAG,CAAC,OAAO,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAgB,CAAA;YAC5E,uEAAuE;YACvE,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,OAAO,EAAE,EAAE,QAAQ,KAAI,CAAC,EAAE,GAAG,KAAI,CAAC,EAAE,KAAK,KAAI,CAAC,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,CAAA;QACvI,CAAC;QACD,GAAG,EAAE;YACH,GAAG,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;YAChD,GAAG,EAAE,CAAC,CAAS,EAAE,CAAS,EAAE,EAAE;gBAC5B,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;YAChB,CAAC;YACD,GAAG,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS;YAChE,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE;gBACpB,OAAO,OAAO,CAAC,CAAC,CAAC,CAAA;YACnB,CAAC;YACD,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC;SACjD;QACD,0EAA0E;QAC1E,GAAG,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;QACxB,IAAI,EAAE,CAAC,IAAa,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;KAC5C,CAAA;AACH,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,mBAAmB;IACjC,MAAM,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAA;IAC1B,QAAQ,CAAC,OAAO,GAAG,SAAS,CAAA;IAC5B,OAAO,CAAC,CAAA;AACV,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,QAAQ,CAAC,OAAO,GAAG,SAAS,CAAA;AAC9B,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate a Supabase-shaped `Database` TypeScript type from the live schema,
|
|
3
|
+
* matching `supabase gen types typescript` closely enough that a typed
|
|
4
|
+
* supabase-js client works unchanged:
|
|
5
|
+
*
|
|
6
|
+
* export type Database = {
|
|
7
|
+
* public: {
|
|
8
|
+
* Tables: { <t>: { Row, Insert, Update, Relationships } }
|
|
9
|
+
* Views: { <v>: { Row } }
|
|
10
|
+
* Functions: { <f>: { Args, Returns } }
|
|
11
|
+
* Enums: { <e>: "a" | "b" }
|
|
12
|
+
* CompositeTypes: {}
|
|
13
|
+
* }
|
|
14
|
+
* }
|
|
15
|
+
*/
|
|
16
|
+
import type { Database } from './db/database.js';
|
|
17
|
+
export declare function generateTypes(db: Database, schema?: string): Promise<string>;
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
const JSON_TYPE = 'Json';
|
|
2
|
+
export async function generateTypes(db, schema = 'public') {
|
|
3
|
+
const enums = await loadEnums(db, schema);
|
|
4
|
+
const enumNames = new Set(enums.map((e) => e.name));
|
|
5
|
+
const cols = await loadColumns(db, schema);
|
|
6
|
+
const info = await db.getSchemaInfo(schema);
|
|
7
|
+
const fns = await loadFunctions(db, schema);
|
|
8
|
+
const tables = new Map();
|
|
9
|
+
const views = new Map();
|
|
10
|
+
for (const c of cols) {
|
|
11
|
+
const target = c.table_kind === 'r' ? tables : views;
|
|
12
|
+
if (!target.has(c.table_name))
|
|
13
|
+
target.set(c.table_name, []);
|
|
14
|
+
target.get(c.table_name).push(c);
|
|
15
|
+
}
|
|
16
|
+
const tsType = (udt, nullable) => {
|
|
17
|
+
const base = mapType(udt, enumNames, schema);
|
|
18
|
+
return nullable ? `${base} | null` : base;
|
|
19
|
+
};
|
|
20
|
+
const relationshipsFor = (table) => {
|
|
21
|
+
const fks = info.foreignKeys.filter((fk) => fk.srcSchema === schema && fk.srcTable === table);
|
|
22
|
+
if (fks.length === 0)
|
|
23
|
+
return '[]';
|
|
24
|
+
const items = fks.map((fk) => ` {\n` +
|
|
25
|
+
` foreignKeyName: ${JSON.stringify(fk.constraintName)}\n` +
|
|
26
|
+
` columns: ${JSON.stringify(fk.srcColumns)}\n` +
|
|
27
|
+
` isOneToOne: false\n` +
|
|
28
|
+
` referencedRelation: ${JSON.stringify(fk.tgtTable)}\n` +
|
|
29
|
+
` referencedColumns: ${JSON.stringify(fk.tgtColumns)}\n` +
|
|
30
|
+
` }`);
|
|
31
|
+
return `[\n${items.join(',\n')}\n ]`;
|
|
32
|
+
};
|
|
33
|
+
const tableBlock = (name, columns) => {
|
|
34
|
+
const row = columns.map((c) => ` ${ident(c.column_name)}: ${tsType(c.udt_name, c.is_nullable === 'YES')}`).join('\n');
|
|
35
|
+
const insert = columns
|
|
36
|
+
.map((c) => {
|
|
37
|
+
const optional = c.is_nullable === 'YES' || c.has_default || c.is_generated;
|
|
38
|
+
const t = c.is_nullable === 'YES' ? `${mapType(c.udt_name, enumNames, schema)} | null` : mapType(c.udt_name, enumNames, schema);
|
|
39
|
+
return ` ${ident(c.column_name)}${optional ? '?' : ''}: ${t}`;
|
|
40
|
+
})
|
|
41
|
+
.join('\n');
|
|
42
|
+
const update = columns
|
|
43
|
+
.map((c) => {
|
|
44
|
+
const t = c.is_nullable === 'YES' ? `${mapType(c.udt_name, enumNames, schema)} | null` : mapType(c.udt_name, enumNames, schema);
|
|
45
|
+
return ` ${ident(c.column_name)}?: ${t}`;
|
|
46
|
+
})
|
|
47
|
+
.join('\n');
|
|
48
|
+
return (` ${ident(name)}: {\n` +
|
|
49
|
+
` Row: {\n${row}\n }\n` +
|
|
50
|
+
` Insert: {\n${insert}\n }\n` +
|
|
51
|
+
` Update: {\n${update}\n }\n` +
|
|
52
|
+
` Relationships: ${relationshipsFor(name)}\n` +
|
|
53
|
+
` }`);
|
|
54
|
+
};
|
|
55
|
+
const viewBlock = (name, columns) => {
|
|
56
|
+
const row = columns.map((c) => ` ${ident(c.column_name)}: ${tsType(c.udt_name, c.is_nullable === 'YES')}`).join('\n');
|
|
57
|
+
return ` ${ident(name)}: {\n Row: {\n${row}\n }\n Relationships: []\n }`;
|
|
58
|
+
};
|
|
59
|
+
const fnBlock = (f) => {
|
|
60
|
+
const args = !f.args_json || f.args_json.length === 0
|
|
61
|
+
? 'Record<PropertyKey, never>'
|
|
62
|
+
: `{\n${f.args_json.map((a) => ` ${ident(a.name || '')}: ${mapArgType(a.type, enumNames, schema)}`).join('\n')}\n }`;
|
|
63
|
+
const returns = f.return_typtype === 'c' || f.returns_set ? 'Json' : mapType(f.return_type, enumNames, schema);
|
|
64
|
+
return ` ${ident(f.name)}: {\n Args: ${args}\n Returns: ${returns}\n }`;
|
|
65
|
+
};
|
|
66
|
+
const tablesBlock = [...tables].map(([n, c]) => tableBlock(n, c)).join('\n');
|
|
67
|
+
const viewsBlock = [...views].map(([n, c]) => viewBlock(n, c)).join('\n');
|
|
68
|
+
const fnsBlock = fns.map(fnBlock).join('\n');
|
|
69
|
+
const enumsBlock = enums.map((e) => ` ${ident(e.name)}: ${e.labels.map((l) => JSON.stringify(l)).join(' | ')}`).join('\n');
|
|
70
|
+
return `export type Json =
|
|
71
|
+
| string
|
|
72
|
+
| number
|
|
73
|
+
| boolean
|
|
74
|
+
| null
|
|
75
|
+
| { [key: string]: Json | undefined }
|
|
76
|
+
| Json[]
|
|
77
|
+
|
|
78
|
+
export type Database = {
|
|
79
|
+
${ident(schema)}: {
|
|
80
|
+
Tables: {
|
|
81
|
+
${tablesBlock || ' [_ in never]: never'}
|
|
82
|
+
}
|
|
83
|
+
Views: {
|
|
84
|
+
${viewsBlock || ' [_ in never]: never'}
|
|
85
|
+
}
|
|
86
|
+
Functions: {
|
|
87
|
+
${fnsBlock || ' [_ in never]: never'}
|
|
88
|
+
}
|
|
89
|
+
Enums: {
|
|
90
|
+
${enumsBlock || ' [_ in never]: never'}
|
|
91
|
+
}
|
|
92
|
+
CompositeTypes: {
|
|
93
|
+
[_ in never]: never
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
`;
|
|
98
|
+
}
|
|
99
|
+
function ident(name) {
|
|
100
|
+
return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(name) ? name : JSON.stringify(name);
|
|
101
|
+
}
|
|
102
|
+
function mapType(udt, enums, schema) {
|
|
103
|
+
if (udt.startsWith('_'))
|
|
104
|
+
return `${mapType(udt.slice(1), enums, schema)}[]`;
|
|
105
|
+
if (enums.has(udt))
|
|
106
|
+
return `Database[${JSON.stringify(schema)}]["Enums"][${JSON.stringify(udt)}]`;
|
|
107
|
+
switch (udt) {
|
|
108
|
+
case 'int2':
|
|
109
|
+
case 'int4':
|
|
110
|
+
case 'int8':
|
|
111
|
+
case 'float4':
|
|
112
|
+
case 'float8':
|
|
113
|
+
case 'numeric':
|
|
114
|
+
case 'oid':
|
|
115
|
+
return 'number';
|
|
116
|
+
case 'bool':
|
|
117
|
+
return 'boolean';
|
|
118
|
+
case 'json':
|
|
119
|
+
case 'jsonb':
|
|
120
|
+
return JSON_TYPE;
|
|
121
|
+
case 'text':
|
|
122
|
+
case 'varchar':
|
|
123
|
+
case 'bpchar':
|
|
124
|
+
case 'citext':
|
|
125
|
+
case 'uuid':
|
|
126
|
+
case 'date':
|
|
127
|
+
case 'time':
|
|
128
|
+
case 'timetz':
|
|
129
|
+
case 'timestamp':
|
|
130
|
+
case 'timestamptz':
|
|
131
|
+
case 'interval':
|
|
132
|
+
case 'name':
|
|
133
|
+
return 'string';
|
|
134
|
+
default:
|
|
135
|
+
return 'string';
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
function mapArgType(type, enums, schema) {
|
|
139
|
+
// pg_get_function_identity_arguments gives sql type names, not udt; normalize
|
|
140
|
+
const t = type.toLowerCase().trim();
|
|
141
|
+
if (t.endsWith('[]'))
|
|
142
|
+
return `${mapArgType(t.slice(0, -2), enums, schema)}[]`;
|
|
143
|
+
if (/int|serial|numeric|decimal|real|double|float/.test(t))
|
|
144
|
+
return 'number';
|
|
145
|
+
if (/bool/.test(t))
|
|
146
|
+
return 'boolean';
|
|
147
|
+
if (/json/.test(t))
|
|
148
|
+
return JSON_TYPE;
|
|
149
|
+
return 'string';
|
|
150
|
+
}
|
|
151
|
+
async function loadColumns(db, schema) {
|
|
152
|
+
const res = await db.query(`select c.relname as table_name, a.attname as column_name, t.typname as udt_name,
|
|
153
|
+
case when a.attnotnull then 'NO' else 'YES' end as is_nullable,
|
|
154
|
+
(d.adbin is not null) as has_default,
|
|
155
|
+
(a.attgenerated <> '' or a.attidentity <> '') as is_generated,
|
|
156
|
+
c.relkind as table_kind
|
|
157
|
+
from pg_attribute a
|
|
158
|
+
join pg_class c on c.oid = a.attrelid
|
|
159
|
+
join pg_namespace n on n.oid = c.relnamespace
|
|
160
|
+
join pg_type t on t.oid = a.atttypid
|
|
161
|
+
left join pg_attrdef d on d.adrelid = c.oid and d.adnum = a.attnum
|
|
162
|
+
where n.nspname = $1 and c.relkind in ('r','v','m') and a.attnum > 0 and not a.attisdropped
|
|
163
|
+
order by c.relname, a.attnum`, [schema]);
|
|
164
|
+
return res.rows;
|
|
165
|
+
}
|
|
166
|
+
async function loadEnums(db, schema) {
|
|
167
|
+
const res = await db.query(`select t.typname as name, array_agg(e.enumlabel order by e.enumsortorder) as labels
|
|
168
|
+
from pg_type t
|
|
169
|
+
join pg_enum e on e.enumtypid = t.oid
|
|
170
|
+
join pg_namespace n on n.oid = t.typnamespace
|
|
171
|
+
where n.nspname = $1
|
|
172
|
+
group by t.typname
|
|
173
|
+
order by t.typname`, [schema]);
|
|
174
|
+
return res.rows;
|
|
175
|
+
}
|
|
176
|
+
async function loadFunctions(db, schema) {
|
|
177
|
+
const res = await db.query(`select p.proname as name,
|
|
178
|
+
pg_get_function_identity_arguments(p.oid) as identity_args,
|
|
179
|
+
t.typname as return_type, p.proretset as returns_set, t.typtype as return_typtype
|
|
180
|
+
from pg_proc p
|
|
181
|
+
join pg_namespace n on n.oid = p.pronamespace
|
|
182
|
+
join pg_type t on t.oid = p.prorettype
|
|
183
|
+
where n.nspname = $1 and p.prokind = 'f'
|
|
184
|
+
order by p.proname`, [schema]);
|
|
185
|
+
return res.rows.map((r) => ({
|
|
186
|
+
name: r.name,
|
|
187
|
+
return_type: r.return_type,
|
|
188
|
+
returns_set: r.returns_set,
|
|
189
|
+
return_typtype: r.return_typtype,
|
|
190
|
+
args_json: parseArgs(r.identity_args),
|
|
191
|
+
}));
|
|
192
|
+
}
|
|
193
|
+
function parseArgs(identity) {
|
|
194
|
+
if (!identity?.trim())
|
|
195
|
+
return [];
|
|
196
|
+
const parts = [];
|
|
197
|
+
let depth = 0;
|
|
198
|
+
let cur = '';
|
|
199
|
+
for (const ch of identity) {
|
|
200
|
+
if (ch === '(')
|
|
201
|
+
depth++;
|
|
202
|
+
if (ch === ')')
|
|
203
|
+
depth--;
|
|
204
|
+
if (ch === ',' && depth === 0) {
|
|
205
|
+
parts.push(cur);
|
|
206
|
+
cur = '';
|
|
207
|
+
}
|
|
208
|
+
else
|
|
209
|
+
cur += ch;
|
|
210
|
+
}
|
|
211
|
+
if (cur.trim())
|
|
212
|
+
parts.push(cur);
|
|
213
|
+
return parts.map((p) => {
|
|
214
|
+
const toks = p.trim().split(/\s+/);
|
|
215
|
+
while (toks.length > 1 && ['IN', 'OUT', 'INOUT', 'VARIADIC'].includes(toks[0]))
|
|
216
|
+
toks.shift();
|
|
217
|
+
if (toks.length === 1)
|
|
218
|
+
return { name: '', type: toks[0] };
|
|
219
|
+
return { name: toks[0].replace(/^"|"$/g, ''), type: toks.slice(1).join(' ') };
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
//# sourceMappingURL=gen-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gen-types.js","sourceRoot":"","sources":["../src/gen-types.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { FunctionsHandler } from './functions/handler.js';
|
|
2
2
|
import { Database } from './db/database.js';
|
|
3
3
|
import { RealtimeEngine } from './realtime/engine.js';
|
|
4
|
+
import { WebhooksService } from './webhooks/service.js';
|
|
5
|
+
import { CronService } from './cron/service.js';
|
|
4
6
|
import { type BackendConfig, type MigrationFile } from './types.js';
|
|
5
7
|
export * from './types.js';
|
|
6
8
|
export { Database } from './db/database.js';
|
|
@@ -8,12 +10,19 @@ export { MemoryStorageDriver } from './storage/driver.js';
|
|
|
8
10
|
export { RealtimeEngine, type RealtimeSocketLike } from './realtime/engine.js';
|
|
9
11
|
export { signJwt, verifyJwt, decodeJwt } from './jwt.js';
|
|
10
12
|
export { FunctionsHandler, type EdgeFunction, type FunctionContext } from './functions/handler.js';
|
|
13
|
+
export { generateTypes } from './gen-types.js';
|
|
14
|
+
export { installDenoShim, setDenoEnv } from './functions/deno-shim.js';
|
|
15
|
+
export { WebhooksService, type WebhookConfig, type WebhookDelivery } from './webhooks/service.js';
|
|
16
|
+
export { CronService, cronMatches } from './cron/service.js';
|
|
17
|
+
export { snapshotSchema, diffSchemas, type SchemaSnapshot } from './db/schema-diff.js';
|
|
11
18
|
export interface TinbaseBackend {
|
|
12
19
|
/** The whole backend as a fetch handler. Pass to supabase-js as global.fetch for in-process use. */
|
|
13
20
|
fetch: (req: Request) => Promise<Response>;
|
|
14
21
|
db: Database;
|
|
15
22
|
realtime: RealtimeEngine;
|
|
16
23
|
functions: FunctionsHandler;
|
|
24
|
+
webhooks: WebhooksService;
|
|
25
|
+
cron: CronService;
|
|
17
26
|
/** JWT for the anon role — use as supabase-js's supabaseKey. */
|
|
18
27
|
anonKey: string;
|
|
19
28
|
/** JWT for the service_role — bypasses RLS. */
|