tinbase 0.10.0 → 0.10.2
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 +10 -9
- package/dist/admin/api.d.ts +62 -1
- package/dist/admin/api.js +221 -10
- package/dist/admin/api.js.map +1 -1
- package/dist/admin/ui.d.ts +1 -1
- package/dist/admin/ui.js +1548 -16
- package/dist/admin/ui.js.map +1 -1
- package/dist/auth/handler.d.ts +52 -5
- package/dist/auth/handler.js +147 -36
- package/dist/auth/handler.js.map +1 -1
- package/dist/auth/inbox.d.ts +4 -2
- package/dist/auth/inbox.js +1 -0
- package/dist/auth/inbox.js.map +1 -1
- package/dist/auth/oauth.d.ts +30 -4
- package/dist/auth/oauth.js +22 -6
- package/dist/auth/oauth.js.map +1 -1
- package/dist/auth/password.d.ts +5 -0
- package/dist/auth/password.js +7 -0
- package/dist/auth/password.js.map +1 -1
- package/dist/auth/qr.d.ts +1 -1
- package/dist/auth/qr.js +1 -1
- package/dist/auth/rate-limit.d.ts +33 -0
- package/dist/auth/rate-limit.js +63 -0
- package/dist/auth/rate-limit.js.map +1 -0
- package/dist/auth/redirect.d.ts +20 -0
- package/dist/auth/redirect.js +79 -0
- package/dist/auth/redirect.js.map +1 -0
- package/dist/auth/settings.d.ts +55 -0
- package/dist/auth/settings.js +116 -0
- package/dist/auth/settings.js.map +1 -0
- package/dist/auth/totp.js +1 -1
- package/dist/cli.js +43 -21
- package/dist/cli.js.map +1 -1
- package/dist/cron/service.d.ts +15 -2
- package/dist/cron/service.js +19 -2
- package/dist/cron/service.js.map +1 -1
- package/dist/db/bootstrap.d.ts +13 -6
- package/dist/db/bootstrap.js +26 -5
- package/dist/db/bootstrap.js.map +1 -1
- package/dist/db/database.d.ts +61 -3
- package/dist/db/database.js +72 -9
- package/dist/db/database.js.map +1 -1
- package/dist/db/emulated.d.ts +39 -2
- package/dist/db/emulated.js +39 -23
- package/dist/db/emulated.js.map +1 -1
- package/dist/db/engine.d.ts +19 -5
- package/dist/db/engine.js +4 -2
- package/dist/db/engine.js.map +1 -1
- package/dist/db/inspect.d.ts +6 -1
- package/dist/db/inspect.js +2 -1
- package/dist/db/inspect.js.map +1 -1
- package/dist/db/pglite-engine.d.ts +7 -1
- package/dist/db/pglite-engine.js +7 -1
- package/dist/db/pglite-engine.js.map +1 -1
- package/dist/db/pgmem-engine.d.ts +9 -3
- package/dist/db/pgmem-engine.js +13 -7
- package/dist/db/pgmem-engine.js.map +1 -1
- package/dist/db/schema-diff.d.ts +9 -1
- package/dist/db/schema-diff.js +19 -5
- package/dist/db/schema-diff.js.map +1 -1
- package/dist/db/sql-compat.d.ts +2 -2
- package/dist/db/sql-compat.js +2 -2
- package/dist/functions/deno-shim.d.ts +6 -17
- package/dist/functions/deno-shim.js +42 -10
- package/dist/functions/deno-shim.js.map +1 -1
- package/dist/functions/handler.d.ts +9 -4
- package/dist/functions/handler.js +9 -1
- package/dist/functions/handler.js.map +1 -1
- package/dist/gen-types.d.ts +6 -1
- package/dist/gen-types.js +53 -41
- package/dist/gen-types.js.map +1 -1
- package/dist/index.d.ts +33 -3
- package/dist/index.js +158 -28
- package/dist/index.js.map +1 -1
- package/dist/jwt.d.ts +4 -1
- package/dist/jwt.js +4 -2
- package/dist/jwt.js.map +1 -1
- package/dist/log-buffer.d.ts +7 -1
- package/dist/log-buffer.js +3 -0
- package/dist/log-buffer.js.map +1 -1
- package/dist/net/service.d.ts +35 -6
- package/dist/net/service.js +72 -17
- package/dist/net/service.js.map +1 -1
- package/dist/node/bun-server.d.ts +2 -1
- package/dist/node/bun-server.js +11 -1
- package/dist/node/bun-server.js.map +1 -1
- package/dist/node/bundle-function.d.ts +1 -1
- package/dist/node/bundle-function.js +1 -1
- package/dist/node/config-toml.d.ts +31 -0
- package/dist/node/config-toml.js +186 -0
- package/dist/node/config-toml.js.map +1 -0
- package/dist/node/db-diff.d.ts +13 -1
- package/dist/node/db-diff.js +3 -1
- package/dist/node/db-diff.js.map +1 -1
- package/dist/node/fs-driver.d.ts +16 -1
- package/dist/node/fs-driver.js +20 -1
- package/dist/node/fs-driver.js.map +1 -1
- package/dist/node/index.d.ts +2 -2
- package/dist/node/index.js +1 -1
- package/dist/node/index.js.map +1 -1
- package/dist/node/load-config.d.ts +80 -0
- package/dist/node/load-config.js +230 -0
- package/dist/node/load-config.js.map +1 -0
- package/dist/node/load-functions.d.ts +17 -2
- package/dist/node/load-functions.js +17 -4
- package/dist/node/load-functions.js.map +1 -1
- package/dist/node/native/engine.d.ts +7 -0
- package/dist/node/native/engine.js +58 -7
- package/dist/node/native/engine.js.map +1 -1
- package/dist/node/native/wire.d.ts +15 -1
- package/dist/node/native/wire.js +32 -10
- package/dist/node/native/wire.js.map +1 -1
- package/dist/node/project.d.ts +15 -1
- package/dist/node/project.js +19 -7
- package/dist/node/project.js.map +1 -1
- package/dist/node/server-shared.d.ts +4 -1
- package/dist/node/server.d.ts +11 -0
- package/dist/node/server.js +11 -0
- package/dist/node/server.js.map +1 -1
- package/dist/node/ws.d.ts +26 -1
- package/dist/node/ws.js +26 -3
- package/dist/node/ws.js.map +1 -1
- package/dist/realtime/engine.d.ts +6 -0
- package/dist/realtime/engine.js +45 -34
- package/dist/realtime/engine.js.map +1 -1
- package/dist/rest/build.d.ts +37 -1
- package/dist/rest/build.js +48 -8
- package/dist/rest/build.js.map +1 -1
- package/dist/rest/errors.d.ts +8 -0
- package/dist/rest/errors.js +12 -1
- package/dist/rest/errors.js.map +1 -1
- package/dist/rest/handler.d.ts +17 -1
- package/dist/rest/handler.js +48 -5
- package/dist/rest/handler.js.map +1 -1
- package/dist/rest/parse.d.ts +24 -1
- package/dist/rest/parse.js +7 -1
- package/dist/rest/parse.js.map +1 -1
- package/dist/retention/service.d.ts +3 -0
- package/dist/retention/service.js +3 -1
- package/dist/retention/service.js.map +1 -1
- package/dist/security.d.ts +22 -0
- package/dist/security.js +47 -0
- package/dist/security.js.map +1 -0
- package/dist/storage/driver.d.ts +8 -1
- package/dist/storage/driver.js +4 -1
- package/dist/storage/driver.js.map +1 -1
- package/dist/storage/handler.d.ts +10 -1
- package/dist/storage/handler.js +93 -12
- package/dist/storage/handler.js.map +1 -1
- package/dist/types.d.ts +77 -1
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -1
- package/dist/webhooks/service.d.ts +25 -2
- package/dist/webhooks/service.js +21 -3
- package/dist/webhooks/service.js.map +1 -1
- package/package.json +5 -3
package/dist/db/schema-diff.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Schema snapshot + diff
|
|
2
|
+
* Schema snapshot + diff - the engine behind `tinbase db diff`.
|
|
3
3
|
*
|
|
4
4
|
* Snapshots a schema (tables, columns, constraints, indexes, enums) into a
|
|
5
5
|
* structured form, then emits the DDL to turn one snapshot into another. Used
|
|
@@ -9,9 +9,10 @@
|
|
|
9
9
|
* Covered: enums (create + add value), tables (create/drop), columns
|
|
10
10
|
* (add/drop/alter type/nullability/default), and named constraints + indexes
|
|
11
11
|
* (add/drop by definition). Not yet diffed: functions, triggers, policies,
|
|
12
|
-
* views
|
|
12
|
+
* views - noted so the output never silently claims completeness.
|
|
13
13
|
*/
|
|
14
14
|
import { quoteIdent } from './database.js';
|
|
15
|
+
/** Snapshot a schema's tables, columns, constraints, indexes, and enums. */
|
|
15
16
|
export async function snapshotSchema(db, schema = 'public') {
|
|
16
17
|
const cols = await db.query(`select c.relname as table, a.attname as column,
|
|
17
18
|
format_type(a.atttypid, a.atttypmod) as type,
|
|
@@ -124,18 +125,31 @@ export function diffSchemas(from, to, schema = 'public') {
|
|
|
124
125
|
}
|
|
125
126
|
}
|
|
126
127
|
// ── dropped tables ──
|
|
128
|
+
// `drop table` cascades the table's own constraints and indexes, so the
|
|
129
|
+
// constraint/index diffs below must skip anything on a table dropped here -
|
|
130
|
+
// otherwise they emit `alter table … drop constraint` against a table that no
|
|
131
|
+
// longer exists, and the generated migration fails to apply.
|
|
132
|
+
const droppedTables = new Set();
|
|
127
133
|
for (const name of from.tables.keys()) {
|
|
128
|
-
if (!to.tables.has(name))
|
|
134
|
+
if (!to.tables.has(name)) {
|
|
129
135
|
out.push(`drop table ${tbl(name)};`);
|
|
136
|
+
droppedTables.add(name);
|
|
137
|
+
}
|
|
130
138
|
}
|
|
131
139
|
// ── constraints (drop changed/removed, then add new) ──
|
|
132
140
|
diffNamed(from.constraints, to.constraints, {
|
|
133
|
-
drop: (table, cname) =>
|
|
141
|
+
drop: (table, cname) => {
|
|
142
|
+
if (!droppedTables.has(table))
|
|
143
|
+
out.push(`alter table ${tbl(table)} drop constraint ${q(cname)};`);
|
|
144
|
+
},
|
|
134
145
|
add: (table, cname, def) => out.push(`alter table ${tbl(table)} add constraint ${q(cname)} ${def};`),
|
|
135
146
|
});
|
|
136
147
|
// ── indexes (drop changed/removed, then add new) ──
|
|
137
148
|
diffNamed(from.indexes, to.indexes, {
|
|
138
|
-
drop: (
|
|
149
|
+
drop: (table, iname) => {
|
|
150
|
+
if (!droppedTables.has(table))
|
|
151
|
+
out.push(`drop index ${q(schema)}.${q(iname)};`);
|
|
152
|
+
},
|
|
139
153
|
add: (_table, _iname, def) => out.push(`${def};`),
|
|
140
154
|
});
|
|
141
155
|
return out;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema-diff.js","sourceRoot":"","sources":["../../src/db/schema-diff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"schema-diff.js","sourceRoot":"","sources":["../../src/db/schema-diff.ts"],"names":[],"mappings":"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"}
|
package/dist/db/sql-compat.d.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* tinbase can't install C extensions (pg_cron, pg_net, http, supabase_vault,
|
|
5
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
|
|
6
|
+
* them are emulated in pure SQL instead (cron, pg_net, pgmq - see
|
|
7
7
|
* db/emulated.ts). A real Supabase project's first migration typically runs a
|
|
8
8
|
* batch of `CREATE EXTENSION` statements; on stock Postgres a missing one
|
|
9
9
|
* aborts the whole migration with `extension "…" is not available`.
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
* migration inside a transaction (for atomicity + rollback), and
|
|
20
20
|
* `CREATE/DROP INDEX CONCURRENTLY` / `REINDEX … CONCURRENTLY` are illegal in a
|
|
21
21
|
* transaction block. On a single-connection local dev database CONCURRENTLY
|
|
22
|
-
* buys nothing over a plain index, so we drop the keyword
|
|
22
|
+
* buys nothing over a plain index, so we drop the keyword - the resulting index
|
|
23
23
|
* is identical.
|
|
24
24
|
*
|
|
25
25
|
* The scan is quote/comment-aware so it never touches these keywords when they
|
package/dist/db/sql-compat.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* tinbase can't install C extensions (pg_cron, pg_net, http, supabase_vault,
|
|
5
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
|
|
6
|
+
* them are emulated in pure SQL instead (cron, pg_net, pgmq - see
|
|
7
7
|
* db/emulated.ts). A real Supabase project's first migration typically runs a
|
|
8
8
|
* batch of `CREATE EXTENSION` statements; on stock Postgres a missing one
|
|
9
9
|
* aborts the whole migration with `extension "…" is not available`.
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
* migration inside a transaction (for atomicity + rollback), and
|
|
20
20
|
* `CREATE/DROP INDEX CONCURRENTLY` / `REINDEX … CONCURRENTLY` are illegal in a
|
|
21
21
|
* transaction block. On a single-connection local dev database CONCURRENTLY
|
|
22
|
-
* buys nothing over a plain index, so we drop the keyword
|
|
22
|
+
* buys nothing over a plain index, so we drop the keyword - the resulting index
|
|
23
23
|
* is identical.
|
|
24
24
|
*
|
|
25
25
|
* The scan is quote/comment-aware so it never touches these keywords when they
|
|
@@ -1,25 +1,14 @@
|
|
|
1
|
+
type DenoHandler = (req: Request) => Response | Promise<Response>;
|
|
1
2
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
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 only the
|
|
10
|
-
* injected SUPABASE_* vars and declared function secrets (never the host
|
|
11
|
-
* process.env).
|
|
12
|
-
*
|
|
13
|
-
* Not resolved: `npm:` / `jsr:` / URL import specifiers and the Deno std lib —
|
|
14
|
-
* a function using those needs a bundling step. Functions that stick to Web
|
|
15
|
-
* APIs (fetch/Request/Response) + Deno.serve/Deno.env work as-is.
|
|
3
|
+
* Run `fn` with the shim's Deno.env bound to `env`. The binding lives in an
|
|
4
|
+
* async-context store, so concurrent invocations each read their own env and
|
|
5
|
+
* one backend can never observe another's (or the host's) secrets.
|
|
16
6
|
*/
|
|
17
|
-
|
|
18
|
-
/** Merge variables the shim's Deno.env should expose (SUPABASE_* keys, secrets). */
|
|
19
|
-
export declare function setDenoEnv(env: Record<string, string>): void;
|
|
7
|
+
export declare function runWithDenoEnv<T>(env: Record<string, string>, fn: () => Promise<T>): Promise<T>;
|
|
20
8
|
/** Install globalThis.Deno if we're not already running under a Deno-like runtime. */
|
|
21
9
|
export declare function installDenoShim(): void;
|
|
22
10
|
/** Return and clear the handler captured by the most recent Deno.serve() call. */
|
|
23
11
|
export declare function takeCapturedHandler(): DenoHandler | undefined;
|
|
12
|
+
/** Clear any handler captured by Deno.serve(), without returning it. */
|
|
24
13
|
export declare function resetCapturedHandler(): void;
|
|
25
14
|
export {};
|
|
@@ -1,15 +1,42 @@
|
|
|
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 only the
|
|
10
|
+
* injected SUPABASE_* vars and declared function secrets (never the host
|
|
11
|
+
* process.env).
|
|
12
|
+
*
|
|
13
|
+
* Not resolved: `npm:` / `jsr:` / URL import specifiers and the Deno std lib -
|
|
14
|
+
* a function using those needs a bundling step. Functions that stick to Web
|
|
15
|
+
* APIs (fetch/Request/Response) + Deno.serve/Deno.env work as-is.
|
|
16
|
+
*/
|
|
17
|
+
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
1
18
|
const captured = {};
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
19
|
+
// The Deno global is installed once per process, but each backend (and each
|
|
20
|
+
// in-flight invocation) has its own function env. An AsyncLocalStorage scopes
|
|
21
|
+
// the env to the invocation's async context, so it stays correct across awaits
|
|
22
|
+
// even when two invocations interleave on the event loop - a module-global that
|
|
23
|
+
// was swapped around `await` would let a later call overwrite an earlier call's
|
|
24
|
+
// env mid-flight. A Deno.env read outside any invocation sees an empty env.
|
|
25
|
+
const envStore = new AsyncLocalStorage();
|
|
26
|
+
/**
|
|
27
|
+
* Run `fn` with the shim's Deno.env bound to `env`. The binding lives in an
|
|
28
|
+
* async-context store, so concurrent invocations each read their own env and
|
|
29
|
+
* one backend can never observe another's (or the host's) secrets.
|
|
30
|
+
*/
|
|
31
|
+
export function runWithDenoEnv(env, fn) {
|
|
32
|
+
return envStore.run(env, fn);
|
|
6
33
|
}
|
|
7
34
|
/** Install globalThis.Deno if we're not already running under a Deno-like runtime. */
|
|
8
35
|
export function installDenoShim() {
|
|
9
36
|
const g = globalThis;
|
|
10
37
|
if (g.__tinbaseDeno)
|
|
11
38
|
return;
|
|
12
|
-
// a real Deno runtime already provides Deno.serve
|
|
39
|
+
// a real Deno runtime already provides Deno.serve - don't clobber it
|
|
13
40
|
if (g.Deno && typeof g.Deno.serve === 'function')
|
|
14
41
|
return;
|
|
15
42
|
g.__tinbaseDeno = true;
|
|
@@ -24,15 +51,19 @@ export function installDenoShim() {
|
|
|
24
51
|
// process.env, so a function can't read arbitrary server-side env (cloud
|
|
25
52
|
// credentials, DB URLs, etc.).
|
|
26
53
|
env: {
|
|
27
|
-
get: (k) =>
|
|
54
|
+
get: (k) => envStore.getStore()?.[k],
|
|
28
55
|
set: (k, v) => {
|
|
29
|
-
|
|
56
|
+
const s = envStore.getStore();
|
|
57
|
+
if (s)
|
|
58
|
+
s[k] = v;
|
|
30
59
|
},
|
|
31
|
-
has: (k) =>
|
|
60
|
+
has: (k) => envStore.getStore()?.[k] !== undefined,
|
|
32
61
|
delete: (k) => {
|
|
33
|
-
|
|
62
|
+
const s = envStore.getStore();
|
|
63
|
+
if (s)
|
|
64
|
+
delete s[k];
|
|
34
65
|
},
|
|
35
|
-
toObject: () => ({ ...
|
|
66
|
+
toObject: () => ({ ...(envStore.getStore() ?? {}) }),
|
|
36
67
|
},
|
|
37
68
|
// enough of the surface that idiomatic functions don't crash on reference
|
|
38
69
|
cwd: () => process.cwd(),
|
|
@@ -49,6 +80,7 @@ export function takeCapturedHandler() {
|
|
|
49
80
|
captured.handler = undefined;
|
|
50
81
|
return h;
|
|
51
82
|
}
|
|
83
|
+
/** Clear any handler captured by Deno.serve(), without returning it. */
|
|
52
84
|
export function resetCapturedHandler() {
|
|
53
85
|
captured.handler = undefined;
|
|
54
86
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deno-shim.js","sourceRoot":"","sources":["../../src/functions/deno-shim.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"deno-shim.js","sourceRoot":"","sources":["../../src/functions/deno-shim.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAIpD,MAAM,QAAQ,GAA8B,EAAE,CAAA;AAE9C,4EAA4E;AAC5E,8EAA8E;AAC9E,+EAA+E;AAC/E,gFAAgF;AAChF,gFAAgF;AAChF,4EAA4E;AAC5E,MAAM,QAAQ,GAAG,IAAI,iBAAiB,EAA0B,CAAA;AAEhE;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAI,GAA2B,EAAE,EAAoB;IACjF,OAAO,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;AAC9B,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,qEAAqE;QACrE,kEAAkE;QAClE,yEAAyE;QACzE,+BAA+B;QAC/B,GAAG,EAAE;YACH,GAAG,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;YAC5C,GAAG,EAAE,CAAC,CAAS,EAAE,CAAS,EAAE,EAAE;gBAC5B,MAAM,CAAC,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAA;gBAC7B,IAAI,CAAC;oBAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;YACjB,CAAC;YACD,GAAG,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,SAAS;YAC1D,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE;gBACpB,MAAM,CAAC,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAA;gBAC7B,IAAI,CAAC;oBAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;YACpB,CAAC;YACD,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;SACrD;QACD,0EAA0E;QAC1E,GAAG,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;QACxB,2EAA2E;QAC3E,2BAA2B;QAC3B,IAAI,EAAE,CAAC,IAAa,EAAE,EAAE;YACtB,MAAM,IAAI,KAAK,CAAC,aAAa,IAAI,IAAI,CAAC,wCAAwC,CAAC,CAAA;QACjF,CAAC;KACF,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,wEAAwE;AACxE,MAAM,UAAU,oBAAoB;IAClC,QAAQ,CAAC,OAAO,GAAG,SAAS,CAAA;AAC9B,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Edge Functions (/functions/v1/*)
|
|
2
|
+
* Edge Functions (/functions/v1/*) - supabase.functions.invoke() support.
|
|
3
3
|
*
|
|
4
4
|
* A "function" is any fetch handler: (Request) => Response | Promise<Response>.
|
|
5
5
|
* The core takes a name → handler map (portable, works in the browser); the
|
|
@@ -7,12 +7,13 @@
|
|
|
7
7
|
* modules that `export default` a fetch handler.
|
|
8
8
|
*/
|
|
9
9
|
import type { RequestContext } from '../types.js';
|
|
10
|
+
/** An edge function: a fetch handler invoked with the resolved request context. */
|
|
10
11
|
export type EdgeFunction = (req: Request, ctx: FunctionContext) => Response | Promise<Response>;
|
|
12
|
+
/** Second argument passed to every {@link EdgeFunction} invocation. */
|
|
11
13
|
export interface FunctionContext {
|
|
12
|
-
/**
|
|
14
|
+
/** verified request context (role + JWT claims) resolved by the router */
|
|
13
15
|
auth: RequestContext;
|
|
14
|
-
/**
|
|
15
|
-
* secrets loaded from supabase/functions/.env. */
|
|
16
|
+
/** keys/urls so the function can create its own supabase-js client, plus any secrets loaded from supabase/functions/.env */
|
|
16
17
|
env: {
|
|
17
18
|
SUPABASE_URL: string;
|
|
18
19
|
SUPABASE_ANON_KEY: string;
|
|
@@ -20,11 +21,15 @@ export interface FunctionContext {
|
|
|
20
21
|
[key: string]: string;
|
|
21
22
|
};
|
|
22
23
|
}
|
|
24
|
+
/** Registry and dispatcher for edge functions, backing supabase.functions.invoke(). */
|
|
23
25
|
export declare class FunctionsHandler {
|
|
24
26
|
private functions;
|
|
25
27
|
private env;
|
|
26
28
|
constructor(functions: Map<string, EdgeFunction>, env: FunctionContext['env']);
|
|
29
|
+
/** Register (or replace) a function under `name`, served at /functions/v1/<name>. */
|
|
27
30
|
register(name: string, fn: EdgeFunction): void;
|
|
31
|
+
/** Names of all registered functions. */
|
|
28
32
|
list(): string[];
|
|
33
|
+
/** Dispatch a /functions/v1/<name> request to its handler, returning a 404 when unknown and a 500 when the handler throws or returns a non-Response. */
|
|
29
34
|
handle(req: Request, ctx: RequestContext, url: URL): Promise<Response>;
|
|
30
35
|
}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { runWithDenoEnv } from './deno-shim.js';
|
|
2
|
+
/** Registry and dispatcher for edge functions, backing supabase.functions.invoke(). */
|
|
1
3
|
export class FunctionsHandler {
|
|
2
4
|
functions;
|
|
3
5
|
env;
|
|
@@ -5,12 +7,15 @@ export class FunctionsHandler {
|
|
|
5
7
|
this.functions = functions;
|
|
6
8
|
this.env = env;
|
|
7
9
|
}
|
|
10
|
+
/** Register (or replace) a function under `name`, served at /functions/v1/<name>. */
|
|
8
11
|
register(name, fn) {
|
|
9
12
|
this.functions.set(name, fn);
|
|
10
13
|
}
|
|
14
|
+
/** Names of all registered functions. */
|
|
11
15
|
list() {
|
|
12
16
|
return [...this.functions.keys()];
|
|
13
17
|
}
|
|
18
|
+
/** Dispatch a /functions/v1/<name> request to its handler, returning a 404 when unknown and a 500 when the handler throws or returns a non-Response. */
|
|
14
19
|
async handle(req, ctx, url) {
|
|
15
20
|
const name = url.pathname.replace(/^\/functions\/v1\/?/, '').split('/')[0];
|
|
16
21
|
if (!name) {
|
|
@@ -21,7 +26,10 @@ export class FunctionsHandler {
|
|
|
21
26
|
return json(404, { error: `function "${name}" not found` });
|
|
22
27
|
}
|
|
23
28
|
try {
|
|
24
|
-
|
|
29
|
+
// Bind Deno.env to this backend's function env for the call so a
|
|
30
|
+
// Deno.serve/Deno.env-style function reads its own secrets, not another
|
|
31
|
+
// backend's or the host process.env.
|
|
32
|
+
const res = await runWithDenoEnv(this.env, () => Promise.resolve(fn(req, { auth: ctx, env: this.env })));
|
|
25
33
|
if (!(res instanceof Response)) {
|
|
26
34
|
return json(500, { error: `function "${name}" did not return a Response` });
|
|
27
35
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/functions/handler.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/functions/handler.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAkB/C,uFAAuF;AACvF,MAAM,OAAO,gBAAgB;IAEjB;IACA;IAFV,YACU,SAAoC,EACpC,GAA2B;QAD3B,cAAS,GAAT,SAAS,CAA2B;QACpC,QAAG,GAAH,GAAG,CAAwB;IAClC,CAAC;IAEJ,qFAAqF;IACrF,QAAQ,CAAC,IAAY,EAAE,EAAgB;QACrC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;IAC9B,CAAC;IAED,yCAAyC;IACzC,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAA;IACnC,CAAC;IAED,wJAAwJ;IACxJ,KAAK,CAAC,MAAM,CAAC,GAAY,EAAE,GAAmB,EAAE,GAAQ;QACtD,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;QAC1E,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,8CAA8C,EAAE,CAAC,CAAA;QAC7E,CAAC;QACD,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACnC,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,aAAa,IAAI,aAAa,EAAE,CAAC,CAAA;QAC7D,CAAC;QACD,IAAI,CAAC;YACH,iEAAiE;YACjE,wEAAwE;YACxE,qCAAqC;YACrC,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAA;YACxG,IAAI,CAAC,CAAC,GAAG,YAAY,QAAQ,CAAC,EAAE,CAAC;gBAC/B,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,aAAa,IAAI,6BAA6B,EAAE,CAAC,CAAA;YAC7E,CAAC;YACD,OAAO,GAAG,CAAA;QACZ,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,OAAO,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;YAC1D,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAA;QACtC,CAAC;IACH,CAAC;CACF;AAED,SAAS,IAAI,CAAC,MAAc,EAAE,IAAa;IACzC,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;QACxC,MAAM;QACN,OAAO,EAAE,EAAE,cAAc,EAAE,iCAAiC,EAAE;KAC/D,CAAC,CAAA;AACJ,CAAC"}
|
package/dist/gen-types.d.ts
CHANGED
|
@@ -13,5 +13,10 @@
|
|
|
13
13
|
* }
|
|
14
14
|
* }
|
|
15
15
|
*/
|
|
16
|
-
import type
|
|
16
|
+
import { type Database } from './db/database.js';
|
|
17
|
+
/**
|
|
18
|
+
* Emit the `Database` type source (see module header) for one schema of the
|
|
19
|
+
* live database. Reads columns, enums, functions, and foreign keys, then formats
|
|
20
|
+
* them into the Supabase-shaped type text ready to write to a .d.ts.
|
|
21
|
+
*/
|
|
17
22
|
export declare function generateTypes(db: Database, schema?: string): Promise<string>;
|
package/dist/gen-types.js
CHANGED
|
@@ -1,4 +1,25 @@
|
|
|
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 { parseIdentityArgs } from './db/database.js';
|
|
1
17
|
const JSON_TYPE = 'Json';
|
|
18
|
+
/**
|
|
19
|
+
* Emit the `Database` type source (see module header) for one schema of the
|
|
20
|
+
* live database. Reads columns, enums, functions, and foreign keys, then formats
|
|
21
|
+
* them into the Supabase-shaped type text ready to write to a .d.ts.
|
|
22
|
+
*/
|
|
2
23
|
export async function generateTypes(db, schema = 'public') {
|
|
3
24
|
const enums = await loadEnums(db, schema);
|
|
4
25
|
const enumNames = new Set(enums.map((e) => e.name));
|
|
@@ -56,16 +77,32 @@ export async function generateTypes(db, schema = 'public') {
|
|
|
56
77
|
const row = columns.map((c) => ` ${ident(c.column_name)}: ${tsType(c.udt_name, c.is_nullable === 'YES')}`).join('\n');
|
|
57
78
|
return ` ${ident(name)}: {\n Row: {\n${row}\n }\n Relationships: []\n }`;
|
|
58
79
|
};
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
80
|
+
// Args/Returns for one function row (an overload). Multiple rows sharing a
|
|
81
|
+
// name are merged into a union below so the emitted type never has duplicate
|
|
82
|
+
// keys - matching the official generator.
|
|
83
|
+
const fnArgs = (f) => !f.args_json || f.args_json.length === 0
|
|
84
|
+
? 'Record<PropertyKey, never>'
|
|
85
|
+
: `{ ${f.args_json.map((a) => `${ident(a.name || '')}: ${mapArgType(a.type, enumNames, schema)}`).join('; ')} }`;
|
|
86
|
+
const fnReturns = (f) => (f.return_typtype === 'c' || f.returns_set ? 'Json' : mapType(f.return_type, enumNames, schema));
|
|
87
|
+
const fnShape = (f) => `{ Args: ${fnArgs(f)}; Returns: ${fnReturns(f)} }`;
|
|
88
|
+
const fnBlock = (name, overloads) => {
|
|
89
|
+
if (overloads.length === 1) {
|
|
90
|
+
const f = overloads[0];
|
|
91
|
+
return ` ${ident(name)}: {\n Args: ${fnArgs(f)}\n Returns: ${fnReturns(f)}\n }`;
|
|
92
|
+
}
|
|
93
|
+
return ` ${ident(name)}:\n | ${overloads.map(fnShape).join('\n | ')}`;
|
|
65
94
|
};
|
|
95
|
+
const fnsByName = new Map();
|
|
96
|
+
for (const f of fns) {
|
|
97
|
+
const group = fnsByName.get(f.name);
|
|
98
|
+
if (group)
|
|
99
|
+
group.push(f);
|
|
100
|
+
else
|
|
101
|
+
fnsByName.set(f.name, [f]);
|
|
102
|
+
}
|
|
66
103
|
const tablesBlock = [...tables].map(([n, c]) => tableBlock(n, c)).join('\n');
|
|
67
104
|
const viewsBlock = [...views].map(([n, c]) => viewBlock(n, c)).join('\n');
|
|
68
|
-
const fnsBlock =
|
|
105
|
+
const fnsBlock = [...fnsByName].map(([n, o]) => fnBlock(n, o)).join('\n');
|
|
69
106
|
const enumsBlock = enums.map((e) => ` ${ident(e.name)}: ${e.labels.map((l) => JSON.stringify(l)).join(' | ')}`).join('\n');
|
|
70
107
|
return `export type Json =
|
|
71
108
|
| string
|
|
@@ -136,15 +173,19 @@ function mapType(udt, enums, schema) {
|
|
|
136
173
|
}
|
|
137
174
|
}
|
|
138
175
|
function mapArgType(type, enums, schema) {
|
|
139
|
-
// pg_get_function_identity_arguments gives sql type names, not udt; normalize
|
|
176
|
+
// pg_get_function_identity_arguments gives sql type names, not udt; normalize.
|
|
177
|
+
// Anchor the numeric match so types like `interval` and `point` (which merely
|
|
178
|
+
// contain "int") are not mistyped as number.
|
|
140
179
|
const t = type.toLowerCase().trim();
|
|
141
180
|
if (t.endsWith('[]'))
|
|
142
181
|
return `${mapArgType(t.slice(0, -2), enums, schema)}[]`;
|
|
143
|
-
|
|
182
|
+
// Match the integer types exactly so `interval` (which merely starts with
|
|
183
|
+
// "int") is not mistyped as number; `point` likewise falls through to string.
|
|
184
|
+
if (/^(bigint|smallint|integer|int[248]?)$/.test(t) || /^(serial|bigserial|smallserial|numeric|decimal|real|double|float)/.test(t))
|
|
144
185
|
return 'number';
|
|
145
|
-
if (
|
|
186
|
+
if (/^bool/.test(t))
|
|
146
187
|
return 'boolean';
|
|
147
|
-
if (
|
|
188
|
+
if (/^json/.test(t))
|
|
148
189
|
return JSON_TYPE;
|
|
149
190
|
return 'string';
|
|
150
191
|
}
|
|
@@ -187,36 +228,7 @@ async function loadFunctions(db, schema) {
|
|
|
187
228
|
return_type: r.return_type,
|
|
188
229
|
returns_set: r.returns_set,
|
|
189
230
|
return_typtype: r.return_typtype,
|
|
190
|
-
args_json:
|
|
231
|
+
args_json: parseIdentityArgs(r.identity_args),
|
|
191
232
|
}));
|
|
192
233
|
}
|
|
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
234
|
//# sourceMappingURL=gen-types.js.map
|
package/dist/gen-types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gen-types.js","sourceRoot":"","sources":["../src/gen-types.ts"],"names":[],"mappings":"
|
|
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
|
@@ -19,27 +19,41 @@ export { RealtimeEngine, type RealtimeSocketLike } from './realtime/engine.js';
|
|
|
19
19
|
export { signJwt, verifyJwt, decodeJwt } from './jwt.js';
|
|
20
20
|
export { FunctionsHandler, type EdgeFunction, type FunctionContext } from './functions/handler.js';
|
|
21
21
|
export { generateTypes } from './gen-types.js';
|
|
22
|
-
export { installDenoShim
|
|
22
|
+
export { installDenoShim } from './functions/deno-shim.js';
|
|
23
23
|
export { WebhooksService, type WebhookConfig, type WebhookDelivery } from './webhooks/service.js';
|
|
24
24
|
export { CronService, cronMatches } from './cron/service.js';
|
|
25
25
|
export { NetService, type NetDelivery } from './net/service.js';
|
|
26
26
|
export { RetentionService, type RetentionConfig } from './retention/service.js';
|
|
27
27
|
export { snapshotSchema, diffSchemas, type SchemaSnapshot } from './db/schema-diff.js';
|
|
28
28
|
export { inspectDb, type TableInfo } from './db/inspect.js';
|
|
29
|
+
/**
|
|
30
|
+
* A running tinbase backend. The one field a consumer always needs is
|
|
31
|
+
* {@link TinbaseBackend.fetch}; the rest expose the underlying services for
|
|
32
|
+
* advanced/embedded use (in-process realtime, manual migrations, log access).
|
|
33
|
+
* Returned by {@link createBackend}.
|
|
34
|
+
*/
|
|
29
35
|
export interface TinbaseBackend {
|
|
30
36
|
/** The whole backend as a fetch handler. Pass to supabase-js as global.fetch for in-process use. */
|
|
31
37
|
fetch: (req: Request) => Promise<Response>;
|
|
38
|
+
/** The database engine wrapper - run raw SQL, inspect schema, apply migrations. */
|
|
32
39
|
db: Database;
|
|
40
|
+
/** Realtime (Postgres CDC → WebSocket) engine backing supabase.channel(). */
|
|
33
41
|
realtime: RealtimeEngine;
|
|
42
|
+
/** Edge-function registry/dispatcher backing supabase.functions.invoke(). */
|
|
34
43
|
functions: FunctionsHandler;
|
|
44
|
+
/** Database-webhook service (HTTP requests fired on row changes). */
|
|
35
45
|
webhooks: WebhooksService;
|
|
46
|
+
/** pg_cron emulation scheduler. */
|
|
36
47
|
cron: CronService;
|
|
48
|
+
/** pg_net emulation sender (net.http_* queue drain). */
|
|
37
49
|
net: NetService;
|
|
50
|
+
/** Background sweeper that purges expired tokens and aged-out audit rows. */
|
|
38
51
|
retention: RetentionService;
|
|
39
|
-
/** JWT for the anon role
|
|
52
|
+
/** JWT for the anon role - use as supabase-js's supabaseKey. */
|
|
40
53
|
anonKey: string;
|
|
41
|
-
/** JWT for the service_role
|
|
54
|
+
/** JWT for the service_role - bypasses RLS. */
|
|
42
55
|
serviceRoleKey: string;
|
|
56
|
+
/** Secret used to sign/verify every JWT (the resolved value, incl. the default). */
|
|
43
57
|
jwtSecret: string;
|
|
44
58
|
/** Recent server logs (also surfaced in the Studio Logs pane). */
|
|
45
59
|
logs: LogBuffer;
|
|
@@ -47,6 +61,22 @@ export interface TinbaseBackend {
|
|
|
47
61
|
inbox: InboxMailer | null;
|
|
48
62
|
/** Apply additional migrations at runtime. */
|
|
49
63
|
migrate: (migrations: MigrationFile[], seedSql?: string) => Promise<string[]>;
|
|
64
|
+
/** Tear down every background service and close the database. Idempotent-safe to await once. */
|
|
50
65
|
close: () => Promise<void>;
|
|
51
66
|
}
|
|
67
|
+
/**
|
|
68
|
+
* Build a running tinbase backend from {@link BackendConfig}. Wires the
|
|
69
|
+
* database, auth, storage, realtime, edge functions, and the background
|
|
70
|
+
* services (webhooks/cron/net/retention), mints the anon/service_role keys, and
|
|
71
|
+
* returns a {@link TinbaseBackend} whose `fetch` handles every Supabase wire
|
|
72
|
+
* route.
|
|
73
|
+
*
|
|
74
|
+
* All config is optional: with an empty config it boots an in-memory PGlite
|
|
75
|
+
* backend on the Supabase local-dev defaults. If any startup step throws (e.g. a
|
|
76
|
+
* failing migration), every handle opened so far is torn down before the error
|
|
77
|
+
* propagates, so a failed construction never leaks the engine or a timer.
|
|
78
|
+
*
|
|
79
|
+
* @throws Error from {@link assertSecretsSafe} when bound to a network-exposed
|
|
80
|
+
* host with a weak/default JWT secret or a derived vault key.
|
|
81
|
+
*/
|
|
52
82
|
export declare function createBackend(config?: BackendConfig): Promise<TinbaseBackend>;
|