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.
Files changed (156) hide show
  1. package/README.md +10 -9
  2. package/dist/admin/api.d.ts +62 -1
  3. package/dist/admin/api.js +221 -10
  4. package/dist/admin/api.js.map +1 -1
  5. package/dist/admin/ui.d.ts +1 -1
  6. package/dist/admin/ui.js +1548 -16
  7. package/dist/admin/ui.js.map +1 -1
  8. package/dist/auth/handler.d.ts +52 -5
  9. package/dist/auth/handler.js +147 -36
  10. package/dist/auth/handler.js.map +1 -1
  11. package/dist/auth/inbox.d.ts +4 -2
  12. package/dist/auth/inbox.js +1 -0
  13. package/dist/auth/inbox.js.map +1 -1
  14. package/dist/auth/oauth.d.ts +30 -4
  15. package/dist/auth/oauth.js +22 -6
  16. package/dist/auth/oauth.js.map +1 -1
  17. package/dist/auth/password.d.ts +5 -0
  18. package/dist/auth/password.js +7 -0
  19. package/dist/auth/password.js.map +1 -1
  20. package/dist/auth/qr.d.ts +1 -1
  21. package/dist/auth/qr.js +1 -1
  22. package/dist/auth/rate-limit.d.ts +33 -0
  23. package/dist/auth/rate-limit.js +63 -0
  24. package/dist/auth/rate-limit.js.map +1 -0
  25. package/dist/auth/redirect.d.ts +20 -0
  26. package/dist/auth/redirect.js +79 -0
  27. package/dist/auth/redirect.js.map +1 -0
  28. package/dist/auth/settings.d.ts +55 -0
  29. package/dist/auth/settings.js +116 -0
  30. package/dist/auth/settings.js.map +1 -0
  31. package/dist/auth/totp.js +1 -1
  32. package/dist/cli.js +43 -21
  33. package/dist/cli.js.map +1 -1
  34. package/dist/cron/service.d.ts +15 -2
  35. package/dist/cron/service.js +19 -2
  36. package/dist/cron/service.js.map +1 -1
  37. package/dist/db/bootstrap.d.ts +13 -6
  38. package/dist/db/bootstrap.js +26 -5
  39. package/dist/db/bootstrap.js.map +1 -1
  40. package/dist/db/database.d.ts +61 -3
  41. package/dist/db/database.js +72 -9
  42. package/dist/db/database.js.map +1 -1
  43. package/dist/db/emulated.d.ts +39 -2
  44. package/dist/db/emulated.js +39 -23
  45. package/dist/db/emulated.js.map +1 -1
  46. package/dist/db/engine.d.ts +19 -5
  47. package/dist/db/engine.js +4 -2
  48. package/dist/db/engine.js.map +1 -1
  49. package/dist/db/inspect.d.ts +6 -1
  50. package/dist/db/inspect.js +2 -1
  51. package/dist/db/inspect.js.map +1 -1
  52. package/dist/db/pglite-engine.d.ts +7 -1
  53. package/dist/db/pglite-engine.js +7 -1
  54. package/dist/db/pglite-engine.js.map +1 -1
  55. package/dist/db/pgmem-engine.d.ts +9 -3
  56. package/dist/db/pgmem-engine.js +13 -7
  57. package/dist/db/pgmem-engine.js.map +1 -1
  58. package/dist/db/schema-diff.d.ts +9 -1
  59. package/dist/db/schema-diff.js +19 -5
  60. package/dist/db/schema-diff.js.map +1 -1
  61. package/dist/db/sql-compat.d.ts +2 -2
  62. package/dist/db/sql-compat.js +2 -2
  63. package/dist/functions/deno-shim.d.ts +6 -17
  64. package/dist/functions/deno-shim.js +42 -10
  65. package/dist/functions/deno-shim.js.map +1 -1
  66. package/dist/functions/handler.d.ts +9 -4
  67. package/dist/functions/handler.js +9 -1
  68. package/dist/functions/handler.js.map +1 -1
  69. package/dist/gen-types.d.ts +6 -1
  70. package/dist/gen-types.js +53 -41
  71. package/dist/gen-types.js.map +1 -1
  72. package/dist/index.d.ts +33 -3
  73. package/dist/index.js +158 -28
  74. package/dist/index.js.map +1 -1
  75. package/dist/jwt.d.ts +4 -1
  76. package/dist/jwt.js +4 -2
  77. package/dist/jwt.js.map +1 -1
  78. package/dist/log-buffer.d.ts +7 -1
  79. package/dist/log-buffer.js +3 -0
  80. package/dist/log-buffer.js.map +1 -1
  81. package/dist/net/service.d.ts +35 -6
  82. package/dist/net/service.js +72 -17
  83. package/dist/net/service.js.map +1 -1
  84. package/dist/node/bun-server.d.ts +2 -1
  85. package/dist/node/bun-server.js +11 -1
  86. package/dist/node/bun-server.js.map +1 -1
  87. package/dist/node/bundle-function.d.ts +1 -1
  88. package/dist/node/bundle-function.js +1 -1
  89. package/dist/node/config-toml.d.ts +31 -0
  90. package/dist/node/config-toml.js +186 -0
  91. package/dist/node/config-toml.js.map +1 -0
  92. package/dist/node/db-diff.d.ts +13 -1
  93. package/dist/node/db-diff.js +3 -1
  94. package/dist/node/db-diff.js.map +1 -1
  95. package/dist/node/fs-driver.d.ts +16 -1
  96. package/dist/node/fs-driver.js +20 -1
  97. package/dist/node/fs-driver.js.map +1 -1
  98. package/dist/node/index.d.ts +2 -2
  99. package/dist/node/index.js +1 -1
  100. package/dist/node/index.js.map +1 -1
  101. package/dist/node/load-config.d.ts +80 -0
  102. package/dist/node/load-config.js +230 -0
  103. package/dist/node/load-config.js.map +1 -0
  104. package/dist/node/load-functions.d.ts +17 -2
  105. package/dist/node/load-functions.js +17 -4
  106. package/dist/node/load-functions.js.map +1 -1
  107. package/dist/node/native/engine.d.ts +7 -0
  108. package/dist/node/native/engine.js +58 -7
  109. package/dist/node/native/engine.js.map +1 -1
  110. package/dist/node/native/wire.d.ts +15 -1
  111. package/dist/node/native/wire.js +32 -10
  112. package/dist/node/native/wire.js.map +1 -1
  113. package/dist/node/project.d.ts +15 -1
  114. package/dist/node/project.js +19 -7
  115. package/dist/node/project.js.map +1 -1
  116. package/dist/node/server-shared.d.ts +4 -1
  117. package/dist/node/server.d.ts +11 -0
  118. package/dist/node/server.js +11 -0
  119. package/dist/node/server.js.map +1 -1
  120. package/dist/node/ws.d.ts +26 -1
  121. package/dist/node/ws.js +26 -3
  122. package/dist/node/ws.js.map +1 -1
  123. package/dist/realtime/engine.d.ts +6 -0
  124. package/dist/realtime/engine.js +45 -34
  125. package/dist/realtime/engine.js.map +1 -1
  126. package/dist/rest/build.d.ts +37 -1
  127. package/dist/rest/build.js +48 -8
  128. package/dist/rest/build.js.map +1 -1
  129. package/dist/rest/errors.d.ts +8 -0
  130. package/dist/rest/errors.js +12 -1
  131. package/dist/rest/errors.js.map +1 -1
  132. package/dist/rest/handler.d.ts +17 -1
  133. package/dist/rest/handler.js +48 -5
  134. package/dist/rest/handler.js.map +1 -1
  135. package/dist/rest/parse.d.ts +24 -1
  136. package/dist/rest/parse.js +7 -1
  137. package/dist/rest/parse.js.map +1 -1
  138. package/dist/retention/service.d.ts +3 -0
  139. package/dist/retention/service.js +3 -1
  140. package/dist/retention/service.js.map +1 -1
  141. package/dist/security.d.ts +22 -0
  142. package/dist/security.js +47 -0
  143. package/dist/security.js.map +1 -0
  144. package/dist/storage/driver.d.ts +8 -1
  145. package/dist/storage/driver.js +4 -1
  146. package/dist/storage/driver.js.map +1 -1
  147. package/dist/storage/handler.d.ts +10 -1
  148. package/dist/storage/handler.js +93 -12
  149. package/dist/storage/handler.js.map +1 -1
  150. package/dist/types.d.ts +77 -1
  151. package/dist/types.js +10 -0
  152. package/dist/types.js.map +1 -1
  153. package/dist/webhooks/service.d.ts +25 -2
  154. package/dist/webhooks/service.js +21 -3
  155. package/dist/webhooks/service.js.map +1 -1
  156. package/package.json +5 -3
package/README.md CHANGED
@@ -124,7 +124,7 @@ const server = await serve(backend, { port: 54321 })
124
124
  | Cron | `cron.*` | Scheduled jobs, drop-in with pg_cron's API — `cron.schedule(name, '*/5 * * * *', 'sql')` (also the `'N seconds'` form), `cron.unschedule(...)`, and the `cron.job` / `cron.job_run_details` tables. Schedules match in **UTC**, like hosted pg_cron; an in-process scheduler runs due jobs and logs to `cron.job_run_details`. Jobs run while tinbase is up, with service-role privileges. No extension |
125
125
  | HTTP from SQL (pg_net) | `net.*` | `net.http_post` / `net.http_get` / `net.http_delete(...)` enqueue a request that an in-process worker sends, recording the reply in `net._http_response`. Lets a cron job or trigger call an Edge Function or any URL — the common Supabase `cron.schedule(..., $$ select net.http_post(...) $$)` pattern works unchanged. No extension |
126
126
  | Database Webhooks | config | Fire HTTP requests on table INSERT/UPDATE/DELETE with Supabase's exact payload (`type`/`table`/`schema`/`record`/`old_record`). Configured via `createBackend({ webhooks })`, `backend.webhooks.register()`, or `supabase/webhooks.json`. Built on the CDC pipeline — no extension needed |
127
- | Studio (Admin UI) | `/_/` | A Supabase-Studio-style dashboard (React + Radix + Tailwind): Table Editor with full row CRUD, SQL editor, user management, bucket/object CRUD, and a database overview. One self-contained HTML file (works in the single binary); log in with the service_role key |
127
+ | Studio (Admin UI) | `/_/` | A Supabase-Studio-style dashboard (React + Radix + Tailwind) with real URL routing and a command palette: table editor (filters, sorting, inline type-aware editing, FK navigation, RLS + role preview), database section (schema visualizer, tables, functions, triggers, enums, indexes, migrations, policies, roles), authentication, storage, edge functions, realtime, automations (cron/queues/webhooks), logs, SQL editor, settings, and a live Advisor. One self-contained HTML file (works in the single binary); log in with the service_role key |
128
128
  | Realtime | `/realtime/v1` | Phoenix protocol (v1 JSON and v2 array/binary serializers), `postgres_changes` (INSERT/UPDATE/DELETE, filters) fed by triggers + `pg_notify`, broadcast (incl. binary payloads), presence. WebSocket server is a ~150-line RFC 6455 implementation - no `ws` dependency |
129
129
 
130
130
  ### RLS works like real Supabase
@@ -139,14 +139,15 @@ create policy "own rows" on todos
139
139
 
140
140
  ## Studio
141
141
 
142
- tinbase ships with a built-in dashboard at [`/_/`](http://127.0.0.1:54321/_/) - the same shape as Supabase Studio:
142
+ tinbase ships with a built-in dashboard at [`/_/`](http://127.0.0.1:54321/_/) - the same shape as Supabase Studio, with real URL routing (deep links, back/forward), a `Ctrl+K` command palette, light/dark theming, and drag-resizable panels:
143
143
 
144
- - **Table Editor** - browse tables with pagination and row counts; insert, edit, and delete rows (type-aware, primary-key based)
145
- - **SQL Editor** - run arbitrary SQL with result grids and Postgres error details
146
- - **Authentication** - list, create, delete users and reset passwords
147
- - **Storage** - create/delete buckets, upload/delete objects, toggle public access
148
- - **RLS Policies** - list, create, and drop policies per table
149
- - **Database** - stats, migrations, functions, and triggers
144
+ - **Table Editor** - browse and edit with filters, column sorting, checkboxes and bulk actions; inline type-aware cell editors (enums and booleans as pickers, timestamps with a NOW helper); foreign-key navigation; RLS controls and "view data as" role preview; a schema selector; and a Data/Definition split.
145
+ - **SQL Editor** - saved queries and tabs, run-as-role, result limits, history, schema-aware autocomplete, and a results grid with CSV/JSON export.
146
+ - **Database** - a schema visualizer plus tables, functions, triggers, enumerated types, indexes, migrations, policies, and roles - each with create/edit flows in side sheets.
147
+ - **Authentication** - a users grid with a detail panel, invite via magic link, and live sign-in/provider settings.
148
+ - **Storage** - bucket rail with Files/Settings/Policies tabs, folder browsing, previews, signed URLs, drag-drop upload, and RLS policy management.
149
+ - **Edge Functions / Realtime / Automations / Logs** - an invoke tester and secrets, a live channel inspector with authorization policies, cron/queues/webhooks, and a faceted log explorer.
150
+ - **Advisor** - runs the applicable Supabase security and performance lints live against the catalog, opened from the header or the dashboard, with per-finding detail and a jump to the fix.
150
151
 
151
152
  It is a React app compiled to a single self-contained HTML file, so it also works inside the single binary. Sign in with the `service_role` key printed at startup.
152
153
 
@@ -213,7 +214,7 @@ Rough coverage of the supabase-js SDK surface, measured against what each sub-li
213
214
 
214
215
  **Overall: roughly 80% of the supabase-js SDK surface - and ~90% of what a typical CRUD + auth + storage + realtime app actually calls.**
215
216
 
216
- Beyond the client SDK, the local platform features real projects depend on also work: **type generation**, **RLS** (enforced on REST, Storage, and realtime), **database webhooks**, **cron**, **queues (pgmq)**, the **Studio** dashboard, and Supabase-CLI migration conventions (`db reset` / `db diff`). The remaining gaps are OAuth logins' provider variety, the Deno edge-function runtime, and pgvector (needs an extension binary).
217
+ Beyond the client SDK, the local platform features real projects depend on also work: **type generation**, **RLS** (enforced on REST, Storage, and realtime), **database webhooks**, **cron**, **queues (pgmq)**, a **Supabase-Studio-parity dashboard** (table editor, database catalog, auth/storage/edge-functions/realtime/automations management, SQL editor, and a live Advisor), and Supabase-CLI migration conventions (`db reset` / `db diff`). The remaining gaps are OAuth logins' provider variety, phone auth/MFA polish, and pgvector (needs an extension binary).
217
218
 
218
219
  ## Known gaps
219
220
 
@@ -1,19 +1,80 @@
1
+ /**
2
+ * Admin API (/admin/v1/*) backing tinbase studio at /_/.
3
+ * Every endpoint requires the service_role key. This is a thin, introspection-
4
+ * and-SQL surface; row CRUD goes through the normal PostgREST layer (with RLS
5
+ * bypassed by the service_role), so the studio uses the same paths an app does.
6
+ */
7
+ import { type AuthSettings } from '../auth/settings.js';
1
8
  import type { Database } from '../db/database.js';
2
9
  import type { LogBuffer } from '../log-buffer.js';
3
10
  import type { RequestContext } from '../types.js';
11
+ /** Studio-facing admin surface: schema introspection, raw SQL, RLS policies, secrets, and auth settings, all gated on the service_role key. */
4
12
  export declare class AdminApi {
5
13
  private db;
6
14
  private logs?;
7
- constructor(db: Database, logs?: LogBuffer | undefined);
15
+ private auth?;
16
+ private info?;
17
+ constructor(db: Database, logs?: LogBuffer | undefined, auth?: {
18
+ anonKey: string;
19
+ jwtSecret: string;
20
+ } | undefined, info?: {
21
+ /** names of loaded edge functions */
22
+ edgeFunctions: string[];
23
+ /** configured OAuth provider ids */
24
+ oauthProviders: string[];
25
+ /** whether the local dev inbox mailer is mounted at /inbox */
26
+ inbox: boolean;
27
+ /** statically configured database webhooks */
28
+ webhooks: unknown[];
29
+ /** SHARED runtime auth settings - mutated in place so the auth handler sees changes instantly */
30
+ authSettings?: AuthSettings;
31
+ /** env vars injected into edge functions (service_role-only introspection for the studio) */
32
+ functionEnv?: Record<string, string>;
33
+ } | undefined);
34
+ /** Route an /admin/v1/* request to its handler, rejecting any non-service_role caller with a 403. */
8
35
  handle(req: Request, ctx: RequestContext, url: URL): Promise<Response>;
36
+ /**
37
+ * Patch the shared runtime auth settings (signups / anonymous / autoconfirm /
38
+ * password length / disabled providers). Mutates the object the auth handler
39
+ * reads on every request - changes apply instantly - and persists it to
40
+ * auth.config so a restart keeps them.
41
+ */
42
+ private patchAuthSettings;
43
+ /**
44
+ * Add or replace edge-function secrets. Mutates the live functionEnv object
45
+ * the Deno shim reads on the next invocation, so changes apply with no
46
+ * restart. This is a runtime store: it is not written back to
47
+ * supabase/functions/.env, so a restart reloads from that file. Built-in
48
+ * SUPABASE_* vars are read-only and cannot be overwritten here.
49
+ *
50
+ * Body: { secrets: { NAME: value, ... } } - names must be valid env keys.
51
+ */
52
+ private putSecrets;
53
+ /** Delete one custom edge-function secret. Built-ins cannot be deleted. */
54
+ private deleteSecret;
55
+ /**
56
+ * Mint a short-lived JWT for role preview in the studio ("view data as anon /
57
+ * authenticated"). Requires the service_role key like every admin endpoint.
58
+ */
59
+ private impersonate;
60
+ /** List a schema's tables and views with columns, primary keys, row counts, and outbound foreign keys for the studio table browser. */
9
61
  private listTables;
62
+ /** Run an arbitrary SQL statement from the studio SQL editor, optionally under a SET LOCAL role + JWT claims to preview RLS as anon/authenticated. */
10
63
  private runSql;
64
+ /** List user-visible schema names (excluding the Postgres catalog schemas). */
11
65
  private schemas;
66
+ /** List applied migrations from supabase_migrations.schema_migrations, ordered by version. */
12
67
  private migrations;
68
+ /** List the RLS policies defined in a schema (from pg_policies). */
13
69
  private listPolicies;
70
+ /** Create an RLS policy from the studio policy editor, building the CREATE POLICY DDL from the request body. */
14
71
  private createPolicy;
72
+ /** Drop an RLS policy by schema/table/name. */
15
73
  private dropPolicy;
74
+ /** List a schema's SQL functions with signatures, language, and source body. */
16
75
  private listFunctions;
76
+ /** List a schema's user triggers with timing and events, decoded from pg_trigger's tgtype bitmask. */
17
77
  private listTriggers;
78
+ /** Summary counts (users, buckets, objects, migrations, tables) plus database size and version for the studio dashboard. */
18
79
  private stats;
19
80
  }
package/dist/admin/api.js CHANGED
@@ -4,20 +4,62 @@
4
4
  * and-SQL surface; row CRUD goes through the normal PostgREST layer (with RLS
5
5
  * bypassed by the service_role), so the studio uses the same paths an app does.
6
6
  */
7
+ import { applyAuthSettingsPatch, saveAuthSettings } from '../auth/settings.js';
8
+ import { statusForSqlState } from '../rest/errors.js';
7
9
  import { quoteIdent } from '../db/database.js';
10
+ import { signJwt } from '../jwt.js';
8
11
  function json(status, body) {
9
12
  return new Response(JSON.stringify(body), {
10
13
  status,
11
14
  headers: { 'content-type': 'application/json; charset=utf-8' },
12
15
  });
13
16
  }
17
+ /**
18
+ * Map any thrown value to an admin error response. Postgres errors get their
19
+ * SQLSTATE-derived status (via PostgREST's mapping) and carry code/detail/hint;
20
+ * everything else is a 500. The `error` field stays a plain string so existing
21
+ * studio callers keep working.
22
+ */
23
+ function adminError(e) {
24
+ const pg = e;
25
+ if (pg && typeof pg.code === 'string' && /^[0-9A-Z]{5}$/.test(pg.code)) {
26
+ return json(statusForSqlState(pg.code), {
27
+ error: pg.message ?? 'database error',
28
+ code: pg.code,
29
+ detail: pg.detail ?? null,
30
+ hint: pg.hint ?? null,
31
+ });
32
+ }
33
+ return json(500, { error: e instanceof Error ? e.message : String(e) });
34
+ }
35
+ /** Built-in edge-function vars tinbase injects - read-only, can't be edited/deleted. */
36
+ const BUILTIN_SECRETS = new Set(['SUPABASE_URL', 'SUPABASE_ANON_KEY', 'SUPABASE_SERVICE_ROLE_KEY']);
37
+ /**
38
+ * SHA-256 digests of every secret value, so the studio can show a stable
39
+ * fingerprint (like hosted Supabase) without ever sending the plaintext of a
40
+ * custom secret back over the wire.
41
+ */
42
+ async function secretDigests(env) {
43
+ const out = {};
44
+ for (const [name, value] of Object.entries(env)) {
45
+ const buf = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(value));
46
+ out[name] = [...new Uint8Array(buf)].map((b) => b.toString(16).padStart(2, '0')).join('');
47
+ }
48
+ return out;
49
+ }
50
+ /** Studio-facing admin surface: schema introspection, raw SQL, RLS policies, secrets, and auth settings, all gated on the service_role key. */
14
51
  export class AdminApi {
15
52
  db;
16
53
  logs;
17
- constructor(db, logs) {
54
+ auth;
55
+ info;
56
+ constructor(db, logs, auth, info) {
18
57
  this.db = db;
19
58
  this.logs = logs;
59
+ this.auth = auth;
60
+ this.info = info;
20
61
  }
62
+ /** Route an /admin/v1/* request to its handler, rejecting any non-service_role caller with a 403. */
21
63
  async handle(req, ctx, url) {
22
64
  if (ctx.role !== 'service_role') {
23
65
  return json(403, { error: 'admin API requires the service_role key' });
@@ -45,6 +87,34 @@ export class AdminApi {
45
87
  return await this.listFunctions(url);
46
88
  if (path === 'triggers' && method === 'GET')
47
89
  return await this.listTriggers(url);
90
+ if (path === 'keys' && method === 'GET')
91
+ return json(200, { anonKey: this.auth?.anonKey ?? null });
92
+ if (path === 'impersonate' && method === 'GET')
93
+ return await this.impersonate(url);
94
+ if (path === 'edge-functions' && method === 'GET') {
95
+ const env = this.info?.functionEnv ?? {};
96
+ return json(200, {
97
+ functions: this.info?.edgeFunctions ?? [],
98
+ env,
99
+ builtins: [...BUILTIN_SECRETS],
100
+ digests: await secretDigests(env),
101
+ });
102
+ }
103
+ if (path === 'edge-functions/secrets' && method === 'PUT')
104
+ return await this.putSecrets(req);
105
+ if (path === 'edge-functions/secrets' && method === 'DELETE')
106
+ return await this.deleteSecret(url);
107
+ if (path === 'auth-config' && method === 'GET') {
108
+ return json(200, {
109
+ providers: this.info?.oauthProviders ?? [],
110
+ inbox: this.info?.inbox ?? false,
111
+ settings: this.info?.authSettings ?? null,
112
+ });
113
+ }
114
+ if (path === 'auth-config' && method === 'PATCH')
115
+ return await this.patchAuthSettings(req);
116
+ if (path === 'webhooks' && method === 'GET')
117
+ return json(200, { webhooks: this.info?.webhooks ?? [] });
48
118
  if (path === 'logs' && method === 'GET')
49
119
  return json(200, { logs: this.logs?.list() ?? [] });
50
120
  if (path === 'logs' && method === 'DELETE') {
@@ -54,18 +124,134 @@ export class AdminApi {
54
124
  return json(404, { error: `unknown admin endpoint: ${path}` });
55
125
  }
56
126
  catch (e) {
57
- return json(500, { error: e instanceof Error ? e.message : String(e) });
127
+ return adminError(e);
128
+ }
129
+ }
130
+ /**
131
+ * Patch the shared runtime auth settings (signups / anonymous / autoconfirm /
132
+ * password length / disabled providers). Mutates the object the auth handler
133
+ * reads on every request - changes apply instantly - and persists it to
134
+ * auth.config so a restart keeps them.
135
+ */
136
+ async patchAuthSettings(req) {
137
+ const settings = this.info?.authSettings;
138
+ if (!settings)
139
+ return json(400, { error: 'auth settings are not configured' });
140
+ const body = (await req.json().catch(() => null));
141
+ if (!body || typeof body !== 'object')
142
+ return json(400, { error: 'a JSON object body is required' });
143
+ // only known OAuth providers can be disabled - reject typos outright
144
+ if (Array.isArray(body.disabledProviders)) {
145
+ const known = this.info?.oauthProviders ?? [];
146
+ const unknown = body.disabledProviders.filter((p) => !known.includes(p));
147
+ if (unknown.length > 0)
148
+ return json(400, { error: `unknown provider(s): ${unknown.join(', ')}` });
149
+ }
150
+ const err = applyAuthSettingsPatch(settings, body);
151
+ if (err)
152
+ return json(400, { error: err });
153
+ await saveAuthSettings(this.db, settings);
154
+ return json(200, { settings });
155
+ }
156
+ /**
157
+ * Add or replace edge-function secrets. Mutates the live functionEnv object
158
+ * the Deno shim reads on the next invocation, so changes apply with no
159
+ * restart. This is a runtime store: it is not written back to
160
+ * supabase/functions/.env, so a restart reloads from that file. Built-in
161
+ * SUPABASE_* vars are read-only and cannot be overwritten here.
162
+ *
163
+ * Body: { secrets: { NAME: value, ... } } - names must be valid env keys.
164
+ */
165
+ async putSecrets(req) {
166
+ const env = this.info?.functionEnv;
167
+ if (!env)
168
+ return json(400, { error: 'edge functions are not configured' });
169
+ const body = (await req.json().catch(() => null));
170
+ const secrets = body?.secrets;
171
+ if (!secrets || typeof secrets !== 'object' || Array.isArray(secrets)) {
172
+ return json(400, { error: 'body must be { secrets: { NAME: value, ... } }' });
173
+ }
174
+ const names = Object.keys(secrets);
175
+ if (names.length === 0)
176
+ return json(400, { error: 'at least one secret is required' });
177
+ for (const name of names) {
178
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(name)) {
179
+ return json(400, { error: `invalid secret name "${name}" - use letters, digits, and underscores` });
180
+ }
181
+ if (BUILTIN_SECRETS.has(name))
182
+ return json(400, { error: `"${name}" is a built-in and cannot be changed` });
183
+ if (typeof secrets[name] !== 'string')
184
+ return json(400, { error: `value for "${name}" must be a string` });
185
+ }
186
+ for (const name of names)
187
+ env[name] = secrets[name];
188
+ return json(200, { ok: true, secrets: await secretDigests(env) });
189
+ }
190
+ /** Delete one custom edge-function secret. Built-ins cannot be deleted. */
191
+ async deleteSecret(url) {
192
+ const env = this.info?.functionEnv;
193
+ if (!env)
194
+ return json(400, { error: 'edge functions are not configured' });
195
+ const name = url.searchParams.get('name');
196
+ if (!name)
197
+ return json(400, { error: 'a secret name is required (?name=)' });
198
+ if (BUILTIN_SECRETS.has(name))
199
+ return json(400, { error: `"${name}" is a built-in and cannot be deleted` });
200
+ if (!(name in env))
201
+ return json(404, { error: `secret "${name}" not found` });
202
+ delete env[name];
203
+ return json(200, { ok: true, secrets: await secretDigests(env) });
204
+ }
205
+ /**
206
+ * Mint a short-lived JWT for role preview in the studio ("view data as anon /
207
+ * authenticated"). Requires the service_role key like every admin endpoint.
208
+ */
209
+ async impersonate(url) {
210
+ if (!this.auth)
211
+ return json(400, { error: 'impersonation is not configured' });
212
+ const role = url.searchParams.get('role') ?? 'anon';
213
+ if (role !== 'anon' && role !== 'authenticated') {
214
+ return json(400, { error: 'role must be anon or authenticated' });
58
215
  }
216
+ const now = Math.floor(Date.now() / 1000);
217
+ const claims = { iss: 'supabase', ref: 'tinbase', role, iat: now, exp: now + 3600 };
218
+ if (role === 'authenticated') {
219
+ const sub = url.searchParams.get('sub');
220
+ if (!sub)
221
+ return json(400, { error: 'sub (user id) is required for authenticated' });
222
+ claims.sub = sub;
223
+ const email = url.searchParams.get('email');
224
+ if (email)
225
+ claims.email = email;
226
+ }
227
+ return json(200, { token: await signJwt(claims, this.auth.jwtSecret), expiresIn: 3600 });
59
228
  }
229
+ /** List a schema's tables and views with columns, primary keys, row counts, and outbound foreign keys for the studio table browser. */
60
230
  async listTables(url) {
61
231
  const schema = url.searchParams.get('schema') ?? 'public';
62
232
  this.db.invalidateSchemaCache();
63
233
  const info = await this.db.getSchemaInfo(schema);
234
+ // information_schema.columns includes views, so flag them - the studio
235
+ // renders views read-only instead of complaining about a missing PK.
236
+ //
237
+ // Guarded like the per-table count below: the pgmem preview engine has no
238
+ // information_schema.views, and an unguarded throw here failed the whole
239
+ // request, so the studio's table browser showed "No tables yet" for a
240
+ // database full of tables. No views on that engine either, so an empty set
241
+ // is the right answer rather than a degraded one.
242
+ let views = new Set();
243
+ try {
244
+ const viewRows = await this.db.query(`select table_name from information_schema.views where table_schema = $1`, [schema]);
245
+ views = new Set(viewRows.rows.map((v) => v.table_name));
246
+ }
247
+ catch {
248
+ // engine without information_schema.views - treat everything as a table
249
+ }
64
250
  const tables = [];
65
251
  for (const t of info.tables.values()) {
66
252
  // A single table whose count fails (e.g. an engine gap in an RLS policy's
67
253
  // correlated subquery on the pgmem preview engine) must not blank the whole
68
- // table list — fall back to an unknown count for just that table.
254
+ // table list - fall back to an unknown count for just that table.
69
255
  let count;
70
256
  try {
71
257
  count = await this.db.query(`select count(*)::int as n from ${quoteIdent(schema)}.${quoteIdent(t.name)}`);
@@ -81,6 +267,7 @@ export class AdminApi {
81
267
  name: t.name,
82
268
  primaryKey: t.primaryKey,
83
269
  rowCount: count.rows[0]?.n ?? 0,
270
+ isView: views.has(t.name),
84
271
  foreignKeys: fks,
85
272
  columns: t.columns.map((c) => ({
86
273
  name: c.name,
@@ -93,13 +280,25 @@ export class AdminApi {
93
280
  }
94
281
  return json(200, { schema, tables });
95
282
  }
283
+ /** Run an arbitrary SQL statement from the studio SQL editor, optionally under a SET LOCAL role + JWT claims to preview RLS as anon/authenticated. */
96
284
  async runSql(req) {
97
285
  const body = (await req.json().catch(() => ({})));
98
286
  if (!body.query?.trim())
99
287
  return json(400, { error: 'query is required' });
288
+ const role = body.role?.trim();
289
+ if (role !== undefined && !/^[a-z_][a-z0-9_]{0,62}$/.test(role)) {
290
+ return json(400, { error: 'invalid role name' });
291
+ }
100
292
  const started = Date.now();
101
293
  try {
102
- const res = await this.db.query(body.query);
294
+ // When a role is requested ("run as anon/authenticated"), execute inside a
295
+ // transaction with SET LOCAL role + request.jwt.claims - the same mechanism
296
+ // the REST layer uses - so role/claims never leak onto the shared connection
297
+ // between concurrent requests. The claims value is passed as a bound
298
+ // parameter, not interpolated.
299
+ const res = role
300
+ ? await this.db.withContext({ role, claims: body.claims ?? { role } }, (q) => q(body.query))
301
+ : await this.db.query(body.query);
103
302
  this.db.invalidateSchemaCache();
104
303
  return json(200, {
105
304
  rows: res.rows.slice(0, 2000),
@@ -109,20 +308,22 @@ export class AdminApi {
109
308
  });
110
309
  }
111
310
  catch (e) {
112
- const pg = e;
113
- return json(400, { error: pg.message, code: pg.code, detail: pg.detail, hint: pg.hint });
311
+ return adminError(e);
114
312
  }
115
313
  }
314
+ /** List user-visible schema names (excluding the Postgres catalog schemas). */
116
315
  async schemas() {
117
316
  const res = await this.db.query(`select schema_name as name from information_schema.schemata
118
317
  where schema_name not in ('pg_catalog','information_schema','pg_toast')
119
318
  order by schema_name`);
120
319
  return json(200, { schemas: res.rows.map((r) => r.name) });
121
320
  }
321
+ /** List applied migrations from supabase_migrations.schema_migrations, ordered by version. */
122
322
  async migrations() {
123
323
  const res = await this.db.query(`select version, name, applied_at from supabase_migrations.schema_migrations order by version`);
124
324
  return json(200, { migrations: res.rows });
125
325
  }
326
+ /** List the RLS policies defined in a schema (from pg_policies). */
126
327
  async listPolicies(url) {
127
328
  const schema = url.searchParams.get('schema') ?? 'public';
128
329
  const res = await this.db.query(`select schemaname as schema, tablename as table, policyname as name,
@@ -131,14 +332,19 @@ export class AdminApi {
131
332
  order by tablename, policyname`, [schema]);
132
333
  return json(200, { policies: res.rows });
133
334
  }
335
+ /** Create an RLS policy from the studio policy editor, building the CREATE POLICY DDL from the request body. */
134
336
  async createPolicy(req) {
135
337
  const b = (await req.json().catch(() => ({})));
136
338
  if (!b.table || !b.name)
137
339
  return json(400, { error: 'table and name are required' });
138
340
  const schema = b.schema ?? 'public';
139
341
  const cmd = (b.command ?? 'ALL').toUpperCase();
342
+ const behavior = (b.behavior ?? 'PERMISSIVE').toUpperCase();
343
+ if (behavior !== 'PERMISSIVE' && behavior !== 'RESTRICTIVE') {
344
+ return json(400, { error: 'behavior must be PERMISSIVE or RESTRICTIVE' });
345
+ }
140
346
  const roles = b.roles?.trim() || 'public';
141
- let sql = `create policy ${quoteIdent(b.name)} on ${quoteIdent(schema)}.${quoteIdent(b.table)} for ${cmd} to ${roles}`;
347
+ let sql = `create policy ${quoteIdent(b.name)} on ${quoteIdent(schema)}.${quoteIdent(b.table)} as ${behavior} for ${cmd} to ${roles}`;
142
348
  if (b.using?.trim())
143
349
  sql += ` using (${b.using})`;
144
350
  if (b.check?.trim())
@@ -149,10 +355,10 @@ export class AdminApi {
149
355
  return json(200, { ok: true });
150
356
  }
151
357
  catch (e) {
152
- const pg = e;
153
- return json(400, { error: pg.message, code: pg.code, hint: pg.hint });
358
+ return adminError(e);
154
359
  }
155
360
  }
361
+ /** Drop an RLS policy by schema/table/name. */
156
362
  async dropPolicy(url) {
157
363
  const schema = url.searchParams.get('schema') ?? 'public';
158
364
  const table = url.searchParams.get('table');
@@ -161,17 +367,20 @@ export class AdminApi {
161
367
  return json(400, { error: 'table and name are required' });
162
368
  try {
163
369
  await this.db.query(`drop policy ${quoteIdent(name)} on ${quoteIdent(schema)}.${quoteIdent(table)}`);
370
+ this.db.invalidateSchemaCache();
164
371
  return json(200, { ok: true });
165
372
  }
166
373
  catch (e) {
167
- return json(400, { error: e.message });
374
+ return adminError(e);
168
375
  }
169
376
  }
377
+ /** List a schema's SQL functions with signatures, language, and source body. */
170
378
  async listFunctions(url) {
171
379
  const schema = url.searchParams.get('schema') ?? 'public';
172
380
  const res = await this.db.query(`select p.proname as name,
173
381
  pg_get_function_identity_arguments(p.oid) as args,
174
382
  t.typname as returns, l.lanname as language,
383
+ p.prosecdef as security_definer,
175
384
  p.prosrc as body
176
385
  from pg_proc p
177
386
  join pg_namespace n on n.oid = p.pronamespace
@@ -181,6 +390,7 @@ export class AdminApi {
181
390
  order by p.proname`, [schema]);
182
391
  return json(200, { functions: res.rows });
183
392
  }
393
+ /** List a schema's user triggers with timing and events, decoded from pg_trigger's tgtype bitmask. */
184
394
  async listTriggers(url) {
185
395
  const schema = url.searchParams.get('schema') ?? 'public';
186
396
  const res = await this.db.query(`select tg.tgname as name, c.relname as table,
@@ -198,6 +408,7 @@ export class AdminApi {
198
408
  order by c.relname, tg.tgname`, [schema]);
199
409
  return json(200, { triggers: res.rows });
200
410
  }
411
+ /** Summary counts (users, buckets, objects, migrations, tables) plus database size and version for the studio dashboard. */
201
412
  async stats() {
202
413
  const one = async (sql) => (await this.db.query(sql)).rows[0]?.n ?? 0;
203
414
  const users = await one(`select count(*)::int as n from auth.users`);
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/admin/api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/admin/api.ts"],"names":[],"mappings":"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"}