tinbase 0.2.1 → 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.
Files changed (61) hide show
  1. package/README.md +38 -8
  2. package/dist/admin/api.d.ts +5 -0
  3. package/dist/admin/api.js +85 -0
  4. package/dist/admin/api.js.map +1 -1
  5. package/dist/admin/ui.d.ts +1 -1
  6. package/dist/admin/ui.js +16 -16
  7. package/dist/auth/handler.d.ts +7 -0
  8. package/dist/auth/handler.js +25 -0
  9. package/dist/auth/handler.js.map +1 -1
  10. package/dist/auth/oauth.d.ts +59 -0
  11. package/dist/auth/oauth.js +209 -0
  12. package/dist/auth/oauth.js.map +1 -0
  13. package/dist/cli.js +105 -2
  14. package/dist/cli.js.map +1 -1
  15. package/dist/cron/service.d.ts +29 -0
  16. package/dist/cron/service.js +134 -0
  17. package/dist/cron/service.js.map +1 -0
  18. package/dist/db/bootstrap.d.ts +1 -1
  19. package/dist/db/bootstrap.js +43 -1
  20. package/dist/db/bootstrap.js.map +1 -1
  21. package/dist/db/database.d.ts +3 -0
  22. package/dist/db/database.js +19 -0
  23. package/dist/db/database.js.map +1 -1
  24. package/dist/db/emulated.d.ts +12 -0
  25. package/dist/db/emulated.js +156 -0
  26. package/dist/db/emulated.js.map +1 -0
  27. package/dist/db/schema-diff.d.ts +23 -0
  28. package/dist/db/schema-diff.js +182 -0
  29. package/dist/db/schema-diff.js.map +1 -0
  30. package/dist/functions/deno-shim.d.ts +24 -0
  31. package/dist/functions/deno-shim.js +47 -0
  32. package/dist/functions/deno-shim.js.map +1 -0
  33. package/dist/gen-types.d.ts +17 -0
  34. package/dist/gen-types.js +222 -0
  35. package/dist/gen-types.js.map +1 -0
  36. package/dist/index.d.ts +9 -0
  37. package/dist/index.js +35 -6
  38. package/dist/index.js.map +1 -1
  39. package/dist/node/db-diff.d.ts +13 -0
  40. package/dist/node/db-diff.js +40 -0
  41. package/dist/node/db-diff.js.map +1 -0
  42. package/dist/node/index.d.ts +2 -0
  43. package/dist/node/index.js +2 -0
  44. package/dist/node/index.js.map +1 -1
  45. package/dist/node/load-functions.js +11 -3
  46. package/dist/node/load-functions.js.map +1 -1
  47. package/dist/node/load-oauth.d.ts +4 -0
  48. package/dist/node/load-oauth.js +126 -0
  49. package/dist/node/load-oauth.js.map +1 -0
  50. package/dist/node/native/engine.d.ts +1 -1
  51. package/dist/node/native/engine.js +98 -22
  52. package/dist/node/native/engine.js.map +1 -1
  53. package/dist/realtime/engine.d.ts +14 -1
  54. package/dist/realtime/engine.js +65 -2
  55. package/dist/realtime/engine.js.map +1 -1
  56. package/dist/types.d.ts +8 -0
  57. package/dist/types.js.map +1 -1
  58. package/dist/webhooks/service.d.ts +47 -0
  59. package/dist/webhooks/service.js +86 -0
  60. package/dist/webhooks/service.js.map +1 -0
  61. 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. */