tinbase 0.9.0 → 0.10.1

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 (162) hide show
  1. package/README.md +10 -9
  2. package/dist/admin/api.d.ts +62 -1
  3. package/dist/admin/api.js +209 -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 +66 -30
  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 +170 -30
  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/database-url.d.ts +25 -0
  108. package/dist/node/native/database-url.js +38 -0
  109. package/dist/node/native/database-url.js.map +1 -0
  110. package/dist/node/native/engine.d.ts +7 -0
  111. package/dist/node/native/engine.js +63 -85
  112. package/dist/node/native/engine.js.map +1 -1
  113. package/dist/node/native/wire-engine.d.ts +16 -0
  114. package/dist/node/native/wire-engine.js +83 -0
  115. package/dist/node/native/wire-engine.js.map +1 -0
  116. package/dist/node/native/wire.d.ts +25 -8
  117. package/dist/node/native/wire.js +130 -15
  118. package/dist/node/native/wire.js.map +1 -1
  119. package/dist/node/project.d.ts +15 -1
  120. package/dist/node/project.js +19 -7
  121. package/dist/node/project.js.map +1 -1
  122. package/dist/node/server-shared.d.ts +4 -1
  123. package/dist/node/server.d.ts +11 -0
  124. package/dist/node/server.js +11 -0
  125. package/dist/node/server.js.map +1 -1
  126. package/dist/node/ws.d.ts +26 -1
  127. package/dist/node/ws.js +26 -3
  128. package/dist/node/ws.js.map +1 -1
  129. package/dist/realtime/engine.d.ts +6 -0
  130. package/dist/realtime/engine.js +45 -34
  131. package/dist/realtime/engine.js.map +1 -1
  132. package/dist/rest/build.d.ts +44 -1
  133. package/dist/rest/build.js +96 -10
  134. package/dist/rest/build.js.map +1 -1
  135. package/dist/rest/errors.d.ts +8 -0
  136. package/dist/rest/errors.js +12 -1
  137. package/dist/rest/errors.js.map +1 -1
  138. package/dist/rest/handler.d.ts +17 -1
  139. package/dist/rest/handler.js +125 -10
  140. package/dist/rest/handler.js.map +1 -1
  141. package/dist/rest/parse.d.ts +26 -1
  142. package/dist/rest/parse.js +29 -2
  143. package/dist/rest/parse.js.map +1 -1
  144. package/dist/retention/service.d.ts +3 -0
  145. package/dist/retention/service.js +3 -1
  146. package/dist/retention/service.js.map +1 -1
  147. package/dist/security.d.ts +22 -0
  148. package/dist/security.js +47 -0
  149. package/dist/security.js.map +1 -0
  150. package/dist/storage/driver.d.ts +8 -1
  151. package/dist/storage/driver.js +4 -1
  152. package/dist/storage/driver.js.map +1 -1
  153. package/dist/storage/handler.d.ts +20 -1
  154. package/dist/storage/handler.js +272 -16
  155. package/dist/storage/handler.js.map +1 -1
  156. package/dist/types.d.ts +84 -1
  157. package/dist/types.js +10 -0
  158. package/dist/types.js.map +1 -1
  159. package/dist/webhooks/service.d.ts +25 -2
  160. package/dist/webhooks/service.js +21 -3
  161. package/dist/webhooks/service.js.map +1 -1
  162. package/package.json +5 -3
@@ -0,0 +1,186 @@
1
+ /**
2
+ * A minimal TOML reader for supabase/config.toml - just enough of the format to
3
+ * read a real Supabase project's settings, without a TOML dependency. It handles
4
+ * the subset config.toml actually uses:
5
+ *
6
+ * - `[section]` and dotted `[section.sub.name]` table headers
7
+ * - `key = value` scalars (string, bool, integer)
8
+ * - single-line string arrays: `key = ["a", "b"]`
9
+ * - `#` line and inline comments
10
+ * - `env(VAR)` substitution against process.env (or a provided env)
11
+ *
12
+ * It does NOT handle inline tables (`{ a = 1 }`), multi-line arrays, or dotted
13
+ * keys inside a table body - none of which config.toml uses for the settings we
14
+ * read. Each loader (auth, api, storage, functions, oauth) reads from the one
15
+ * parsed tree instead of re-scanning the file.
16
+ */
17
+ import { readFileSync } from 'node:fs';
18
+ import { join } from 'node:path';
19
+ function emptyTable() {
20
+ return { values: new Map(), children: new Map() };
21
+ }
22
+ /** Parse config.toml at `projectDir/supabase/config.toml`; empty root if absent/unreadable. */
23
+ export function loadConfigToml(projectDir, env = process.env) {
24
+ let text;
25
+ try {
26
+ text = readFileSync(join(projectDir, 'supabase', 'config.toml'), 'utf8');
27
+ }
28
+ catch {
29
+ return emptyTable();
30
+ }
31
+ return parseConfigToml(text, env);
32
+ }
33
+ /** Parse TOML `text` into a table tree, resolving `env(VAR)` references. */
34
+ export function parseConfigToml(text, env = process.env) {
35
+ const root = emptyTable();
36
+ let current = root;
37
+ for (const rawLine of text.split('\n')) {
38
+ const line = stripComment(rawLine).trim();
39
+ if (!line)
40
+ continue;
41
+ const header = line.match(/^\[([^\]]+)\]$/);
42
+ if (header) {
43
+ current = descend(root, header[1].split('.').map((s) => s.trim()));
44
+ continue;
45
+ }
46
+ const kv = line.match(/^([A-Za-z0-9_]+)\s*=\s*(.+)$/);
47
+ if (!kv)
48
+ continue;
49
+ const value = parseValue(kv[2].trim(), env);
50
+ if (value !== undefined)
51
+ current.values.set(kv[1], value);
52
+ }
53
+ return root;
54
+ }
55
+ /** Walk/create the table at the given dotted path. */
56
+ function descend(root, path) {
57
+ let t = root;
58
+ for (const key of path) {
59
+ let next = t.children.get(key);
60
+ if (!next) {
61
+ next = emptyTable();
62
+ t.children.set(key, next);
63
+ }
64
+ t = next;
65
+ }
66
+ return t;
67
+ }
68
+ /** Remove a `#` comment that isn't inside a quoted string. */
69
+ function stripComment(line) {
70
+ let quote = null;
71
+ for (let i = 0; i < line.length; i++) {
72
+ const c = line[i];
73
+ if (quote) {
74
+ if (c === quote)
75
+ quote = null;
76
+ }
77
+ else if (c === '"' || c === "'") {
78
+ quote = c;
79
+ }
80
+ else if (c === '#') {
81
+ return line.slice(0, i);
82
+ }
83
+ }
84
+ return line;
85
+ }
86
+ /** Parse a scalar or single-line array value, resolving env() and stripping quotes. */
87
+ function parseValue(raw, env) {
88
+ if (raw.startsWith('[') && raw.endsWith(']')) {
89
+ const inner = raw.slice(1, -1).trim();
90
+ if (inner === '')
91
+ return [];
92
+ return inner
93
+ .split(',')
94
+ .map((s) => resolveScalar(s.trim(), env))
95
+ .filter((s) => s !== undefined && s !== '');
96
+ }
97
+ return resolveScalar(raw, env);
98
+ }
99
+ /** Strip quotes and expand an `env(VAR)` reference to its value. */
100
+ function resolveScalar(raw, env) {
101
+ const v = raw.trim().replace(/^["']|["']$/g, '');
102
+ const m = v.match(/^env\(\s*"?([A-Za-z0-9_]+)"?\s*\)$/);
103
+ if (m)
104
+ return env[m[1]];
105
+ return v;
106
+ }
107
+ // ── typed accessors ───────────────────────────────────────────────────────
108
+ /** Child table at a dotted path, or undefined if any segment is missing. */
109
+ export function tableAt(root, path) {
110
+ let t = root;
111
+ for (const key of path.split('.')) {
112
+ t = t?.children.get(key);
113
+ if (!t)
114
+ return undefined;
115
+ }
116
+ return t;
117
+ }
118
+ /** String value at `key`, or undefined if absent, empty, or an array. */
119
+ export function getString(table, key) {
120
+ const v = table?.values.get(key);
121
+ return typeof v === 'string' && v !== '' ? v : undefined;
122
+ }
123
+ /** Boolean value at `key`, or undefined if absent or not exactly true/false. */
124
+ export function getBool(table, key) {
125
+ const v = table?.values.get(key);
126
+ if (v === 'true')
127
+ return true;
128
+ if (v === 'false')
129
+ return false;
130
+ return undefined;
131
+ }
132
+ /** Integer value at `key` (base 10), or undefined if absent or unparseable. */
133
+ export function getInt(table, key) {
134
+ const v = table?.values.get(key);
135
+ if (typeof v !== 'string')
136
+ return undefined;
137
+ const n = parseInt(v, 10);
138
+ return Number.isFinite(n) ? n : undefined;
139
+ }
140
+ /** String-array value at `key`, or undefined if absent or a scalar. */
141
+ export function getStringArray(table, key) {
142
+ const v = table?.values.get(key);
143
+ return Array.isArray(v) ? v : undefined;
144
+ }
145
+ /**
146
+ * Parse a Supabase duration string ("1m", "24h", "10s", "50m") to seconds.
147
+ * Returns undefined if absent or malformed.
148
+ */
149
+ export function getDurationSeconds(table, key) {
150
+ const v = table?.values.get(key);
151
+ if (typeof v !== 'string')
152
+ return undefined;
153
+ const m = v.trim().match(/^(\d+)\s*(s|m|h)$/i);
154
+ if (!m) {
155
+ const n = parseInt(v, 10);
156
+ return Number.isFinite(n) ? n : undefined;
157
+ }
158
+ const n = parseInt(m[1], 10);
159
+ const unit = m[2].toLowerCase();
160
+ return unit === 'h' ? n * 3600 : unit === 'm' ? n * 60 : n;
161
+ }
162
+ /**
163
+ * Parse a Supabase byte-size string ("50MiB", "5MB", "500KB") to bytes.
164
+ * Returns undefined if absent or malformed.
165
+ */
166
+ export function getByteSize(table, key) {
167
+ const v = table?.values.get(key);
168
+ if (typeof v !== 'string')
169
+ return undefined;
170
+ const m = v.trim().match(/^(\d+(?:\.\d+)?)\s*(b|kb|kib|mb|mib|gb|gib)?$/i);
171
+ if (!m)
172
+ return undefined;
173
+ const n = parseFloat(m[1]);
174
+ const unit = (m[2] ?? 'b').toLowerCase();
175
+ const mult = {
176
+ b: 1,
177
+ kb: 1000,
178
+ kib: 1024,
179
+ mb: 1000 * 1000,
180
+ mib: 1024 * 1024,
181
+ gb: 1000 * 1000 * 1000,
182
+ gib: 1024 * 1024 * 1024,
183
+ };
184
+ return Math.round(n * (mult[unit] ?? 1));
185
+ }
186
+ //# sourceMappingURL=config-toml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-toml.js","sourceRoot":"","sources":["../../src/node/config-toml.ts"],"names":[],"mappings":"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"}
@@ -1,16 +1,24 @@
1
1
  import type { MigrationFile } from '../types.js';
2
+ /** Inputs for {@link computeDbDiff}: how to reach the live db plus the migrations that define the shadow. */
2
3
  export interface DbDiffOptions {
3
4
  /** the live project's data dir (wasm) or undefined when a native engine is passed */
4
5
  liveDataDir?: string;
6
+ /** an already-open live engine; takes precedence over `liveDataDir` when set */
5
7
  liveEngine?: import('../db/engine.js').DbEngine;
8
+ /** migrations applied to both the shadow and (as pending) the live db before diffing */
6
9
  migrations: MigrationFile[];
10
+ /** ignored for diffing (seed is data, not schema); accepted so callers can pass one options bag */
7
11
  seedSql?: string;
12
+ /** schema to diff; defaults to 'public' */
8
13
  schema?: string;
9
14
  /** factory for the shadow engine (native mode); omit for wasm/in-memory shadow */
10
15
  makeShadowEngine?: () => Promise<import('../db/engine.js').DbEngine>;
11
16
  }
17
+ /** Compute the DDL delta from the migrations-only shadow db to the current live schema. */
12
18
  export declare function computeDbDiff(opts: DbDiffOptions): Promise<string[]>;
19
+ /** Fresh throwaway data dir for a native-engine shadow database, under the OS temp dir. */
13
20
  export declare function shadowNativeDataDir(): string;
21
+ /** Inputs for {@link pullSchema}: everything {@link DbDiffOptions} needs plus where/how to write the migration. */
14
22
  export interface DbPullOptions extends DbDiffOptions {
15
23
  /** directory to write the migration into (usually supabase/migrations); omit to skip writing */
16
24
  migrationsDir?: string;
@@ -19,14 +27,18 @@ export interface DbPullOptions extends DbDiffOptions {
19
27
  /** timestamp version prefix; pass for determinism (default: now as YYYYMMDDHHMMSS) */
20
28
  stamp?: string;
21
29
  }
30
+ /** Outcome of a {@link pullSchema} run. */
22
31
  export interface DbPullResult {
32
+ /** the diffed DDL statements; empty when live and migrations already match */
23
33
  ddl: string[];
34
+ /** timestamp version recorded for the written migration, or null when nothing was written */
24
35
  version: string | null;
36
+ /** path of the written migration file, or null when `migrationsDir` was omitted or ddl was empty */
25
37
  path: string | null;
26
38
  }
27
39
  /**
28
40
  * `tinbase db pull` core: like `db diff`, but writes the delta as a migration
29
- * AND records it as already-applied on the live database — the schema is
41
+ * AND records it as already-applied on the live database - the schema is
30
42
  * already there, so a subsequent `tinbase start` must not re-run it. This is
31
43
  * how you bring an out-of-migration (or externally-created) schema under
32
44
  * version control.
@@ -10,6 +10,7 @@ import { tmpdir } from 'node:os';
10
10
  import { join } from 'node:path';
11
11
  import { createBackend } from '../index.js';
12
12
  import { snapshotSchema, diffSchemas } from '../db/schema-diff.js';
13
+ /** Compute the DDL delta from the migrations-only shadow db to the current live schema. */
13
14
  export async function computeDbDiff(opts) {
14
15
  const schema = opts.schema ?? 'public';
15
16
  // shadow = migrations only, fresh
@@ -35,12 +36,13 @@ export async function computeDbDiff(opts) {
35
36
  await live.close();
36
37
  }
37
38
  }
39
+ /** Fresh throwaway data dir for a native-engine shadow database, under the OS temp dir. */
38
40
  export function shadowNativeDataDir() {
39
41
  return join(mkdtempSync(join(tmpdir(), 'tinbase-shadow-')), 'pg');
40
42
  }
41
43
  /**
42
44
  * `tinbase db pull` core: like `db diff`, but writes the delta as a migration
43
- * AND records it as already-applied on the live database — the schema is
45
+ * AND records it as already-applied on the live database - the schema is
44
46
  * already there, so a subsequent `tinbase start` must not re-run it. This is
45
47
  * how you bring an out-of-migration (or externally-created) schema under
46
48
  * version control.
@@ -1 +1 @@
1
- {"version":3,"file":"db-diff.js","sourceRoot":"","sources":["../../src/node/db-diff.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"db-diff.js","sourceRoot":"","sources":["../../src/node/db-diff.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,26 @@
1
1
  import type { StorageDriver } from '../types.js';
2
- /** Node-only driver — object bytes live under a root directory. */
2
+ /**
3
+ * Node-only {@link StorageDriver} that keeps object bytes as files under a
4
+ * single root directory. Keys map to relative paths beneath the root.
5
+ */
3
6
  export declare class FsStorageDriver implements StorageDriver {
4
7
  private root;
5
8
  constructor(root: string);
9
+ /**
10
+ * Resolve a storage key to an absolute path inside the root.
11
+ *
12
+ * SECURITY: rejects keys that escape the root (e.g. `../`); the normalized
13
+ * path must stay under `root` + separator or the key is refused.
14
+ *
15
+ * @throws if the key would resolve outside the root directory.
16
+ */
6
17
  private resolve;
18
+ /** Write object bytes, creating parent directories as needed. */
7
19
  put(key: string, data: Uint8Array): Promise<void>;
20
+ /** Read object bytes, or null if the key does not exist. */
8
21
  get(key: string): Promise<Uint8Array | null>;
22
+ /** Delete an object; a missing key is not an error. */
9
23
  delete(key: string): Promise<void>;
24
+ /** Delete several objects in sequence. */
10
25
  deleteMany(keys: string[]): Promise<void>;
11
26
  }
@@ -1,11 +1,26 @@
1
+ /**
2
+ * Filesystem-backed storage driver (Node only). Persists object bytes as files
3
+ * under a single root directory, with path-traversal protection on every key.
4
+ */
1
5
  import { mkdir, readFile, rm, writeFile } from 'node:fs/promises';
2
6
  import { dirname, join, normalize, sep } from 'node:path';
3
- /** Node-only driver — object bytes live under a root directory. */
7
+ /**
8
+ * Node-only {@link StorageDriver} that keeps object bytes as files under a
9
+ * single root directory. Keys map to relative paths beneath the root.
10
+ */
4
11
  export class FsStorageDriver {
5
12
  root;
6
13
  constructor(root) {
7
14
  this.root = root;
8
15
  }
16
+ /**
17
+ * Resolve a storage key to an absolute path inside the root.
18
+ *
19
+ * SECURITY: rejects keys that escape the root (e.g. `../`); the normalized
20
+ * path must stay under `root` + separator or the key is refused.
21
+ *
22
+ * @throws if the key would resolve outside the root directory.
23
+ */
9
24
  resolve(key) {
10
25
  const path = normalize(join(this.root, key));
11
26
  if (!path.startsWith(normalize(this.root) + sep)) {
@@ -13,11 +28,13 @@ export class FsStorageDriver {
13
28
  }
14
29
  return path;
15
30
  }
31
+ /** Write object bytes, creating parent directories as needed. */
16
32
  async put(key, data) {
17
33
  const path = this.resolve(key);
18
34
  await mkdir(dirname(path), { recursive: true });
19
35
  await writeFile(path, data);
20
36
  }
37
+ /** Read object bytes, or null if the key does not exist. */
21
38
  async get(key) {
22
39
  try {
23
40
  return new Uint8Array(await readFile(this.resolve(key)));
@@ -28,9 +45,11 @@ export class FsStorageDriver {
28
45
  throw e;
29
46
  }
30
47
  }
48
+ /** Delete an object; a missing key is not an error. */
31
49
  async delete(key) {
32
50
  await rm(this.resolve(key), { force: true });
33
51
  }
52
+ /** Delete several objects in sequence. */
34
53
  async deleteMany(keys) {
35
54
  for (const k of keys)
36
55
  await this.delete(k);
@@ -1 +1 @@
1
- {"version":3,"file":"fs-driver.js","sourceRoot":"","sources":["../../src/node/fs-driver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACjE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,WAAW,CAAA;AAGzD,mEAAmE;AACnE,MAAM,OAAO,eAAe;IACN;IAApB,YAAoB,IAAY;QAAZ,SAAI,GAAJ,IAAI,CAAQ;IAAG,CAAC;IAE5B,OAAO,CAAC,GAAW;QACzB,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAA;QAC5C,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC;YACjD,MAAM,IAAI,KAAK,CAAC,wBAAwB,GAAG,EAAE,CAAC,CAAA;QAChD,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,IAAgB;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAC9B,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAC/C,MAAM,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;IAC7B,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,IAAI,CAAC;YACH,OAAO,IAAI,UAAU,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QAC1D,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAK,CAA2B,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAO,IAAI,CAAA;YAC/D,MAAM,CAAC,CAAA;QACT,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,MAAM,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;IAC9C,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAAc;QAC7B,KAAK,MAAM,CAAC,IAAI,IAAI;YAAE,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;IAC5C,CAAC;CACF"}
1
+ {"version":3,"file":"fs-driver.js","sourceRoot":"","sources":["../../src/node/fs-driver.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACjE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,WAAW,CAAA;AAGzD;;;GAGG;AACH,MAAM,OAAO,eAAe;IACN;IAApB,YAAoB,IAAY;QAAZ,SAAI,GAAJ,IAAI,CAAQ;IAAG,CAAC;IAEpC;;;;;;;OAOG;IACK,OAAO,CAAC,GAAW;QACzB,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAA;QAC5C,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC;YACjD,MAAM,IAAI,KAAK,CAAC,wBAAwB,GAAG,EAAE,CAAC,CAAA;QAChD,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,iEAAiE;IACjE,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,IAAgB;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAC9B,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAC/C,MAAM,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;IAC7B,CAAC;IAED,4DAA4D;IAC5D,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,IAAI,CAAC;YACH,OAAO,IAAI,UAAU,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QAC1D,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAK,CAA2B,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAO,IAAI,CAAA;YAC/D,MAAM,CAAC,CAAA;QACT,CAAC;IACH,CAAC;IAED,uDAAuD;IACvD,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,MAAM,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;IAC9C,CAAC;IAED,0CAA0C;IAC1C,KAAK,CAAC,UAAU,CAAC,IAAc;QAC7B,KAAK,MAAM,CAAC,IAAI,IAAI;YAAE,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;IAC5C,CAAC;CACF"}
@@ -5,7 +5,7 @@ export { loadSupabaseProject, type SupabaseProject } from './project.js';
5
5
  export { acceptWebSocket, type WsConnection } from './ws.js';
6
6
  export { createNativeEngine, ensurePostgres, type NativeEngineOptions } from './native/engine.js';
7
7
  export { PgWireClient, PgWireError } from './native/wire.js';
8
- export { loadFunctions, loadFunctionEnv } from './load-functions.js';
8
+ export { loadFunctions, loadFunctionEnv, type LoadFunctionOptions } from './load-functions.js';
9
9
  export { bundleFunction, rewriteRemoteSpecifier } from './bundle-function.js';
10
- export { loadOAuthProviders } from './load-oauth.js';
10
+ export { loadProjectConfig, type ProjectConfig } from './load-config.js';
11
11
  export { computeDbDiff, pullSchema, shadowNativeDataDir, type DbDiffOptions, type DbPullOptions, type DbPullResult } from './db-diff.js';
@@ -7,6 +7,6 @@ export { createNativeEngine, ensurePostgres } from './native/engine.js';
7
7
  export { PgWireClient, PgWireError } from './native/wire.js';
8
8
  export { loadFunctions, loadFunctionEnv } from './load-functions.js';
9
9
  export { bundleFunction, rewriteRemoteSpecifier } from './bundle-function.js';
10
- export { loadOAuthProviders } from './load-oauth.js';
10
+ export { loadProjectConfig } from './load-config.js';
11
11
  export { computeDbDiff, pullSchema, shadowNativeDataDir } from './db-diff.js';
12
12
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/node/index.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAyC,MAAM,aAAa,CAAA;AAC7F,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAChD,OAAO,EAAE,mBAAmB,EAAwB,MAAM,cAAc,CAAA;AACxE,OAAO,EAAE,eAAe,EAAqB,MAAM,SAAS,CAAA;AAC5D,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAA4B,MAAM,oBAAoB,CAAA;AACjG,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AACpE,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAA;AAC7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AACpD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,mBAAmB,EAA6D,MAAM,cAAc,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/node/index.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAyC,MAAM,aAAa,CAAA;AAC7F,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAChD,OAAO,EAAE,mBAAmB,EAAwB,MAAM,cAAc,CAAA;AACxE,OAAO,EAAE,eAAe,EAAqB,MAAM,SAAS,CAAA;AAC5D,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAA4B,MAAM,oBAAoB,CAAA;AACjG,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,EAAE,aAAa,EAAE,eAAe,EAA4B,MAAM,qBAAqB,CAAA;AAC9F,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAA;AAC7E,OAAO,EAAE,iBAAiB,EAAsB,MAAM,kBAAkB,CAAA;AACxE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,mBAAmB,EAA6D,MAAM,cAAc,CAAA"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Read everything tinbase can honor from an existing Supabase project's
3
+ * supabase/config.toml, so pointing tinbase at that project needs no new config.
4
+ *
5
+ * config.toml is one document, so this is one loader: parse once, then project
6
+ * the tree into a nested `ProjectConfig` that mirrors the file's sections. The
7
+ * CLI spreads those sections into createBackend. Sections for services tinbase
8
+ * doesn't run (SMS, analytics, pooler, studio/edge-runtime ports, experimental)
9
+ * are intentionally ignored.
10
+ */
11
+ import type { AuthSettings } from '../auth/settings.js';
12
+ import type { OAuthProviderConfig } from '../auth/oauth.js';
13
+ import type { RateLimitRule } from '../auth/rate-limit.js';
14
+ import type { BucketSeed } from '../types.js';
15
+ /** The project's config.toml, projected into the shapes tinbase consumes. */
16
+ export interface ProjectConfig {
17
+ /** the [auth] slice: settings, redirects, sessions, rate limits, OAuth */
18
+ auth: AuthConfig;
19
+ /** the [api] slice: exposed schemas and row cap */
20
+ api: ApiConfig;
21
+ /** the [storage] slice: default size limit and buckets to seed */
22
+ storage: StorageConfig;
23
+ /** the [db.seed] slice: whether/what to seed */
24
+ seed: SeedConfig;
25
+ /** per-function options keyed by function name ([functions.<name>]) */
26
+ functions: Record<string, FunctionOptions>;
27
+ }
28
+ /** The `[auth]` slice of config.toml, projected into the shapes the backend consumes. */
29
+ export interface AuthConfig {
30
+ /** whether to run the auth service ([auth].enabled) */
31
+ enabled?: boolean;
32
+ /** runtime-toggleable settings, layered under the live auth.config table */
33
+ settings: Partial<AuthSettings>;
34
+ /** [auth].site_url */
35
+ siteUrl?: string;
36
+ /** [auth].jwt_expiry, seconds */
37
+ jwtExpiry?: number;
38
+ /** [auth].additional_redirect_urls */
39
+ uriAllowList?: string[];
40
+ /** [auth.rate_limit].* mapped to the auth limiter's rules */
41
+ rateLimits?: Record<string, RateLimitRule>;
42
+ /** [auth.sessions].timebox, seconds */
43
+ sessionTimeboxSeconds?: number;
44
+ /** [auth.sessions].inactivity_timeout, seconds */
45
+ sessionInactivitySeconds?: number;
46
+ /** OAuth providers from [auth.external.*] and env-var fallbacks */
47
+ oauthProviders: Record<string, OAuthProviderConfig>;
48
+ }
49
+ /** The `[api]` slice of config.toml. */
50
+ export interface ApiConfig {
51
+ /** [api].schemas: schemas exposed through the Data API (db-schemas) */
52
+ schemas?: string[];
53
+ /** [api].max_rows: REST read row cap */
54
+ maxRows?: number;
55
+ }
56
+ /** The `[storage]` slice of config.toml. */
57
+ export interface StorageConfig {
58
+ /** [storage].file_size_limit: default per-bucket byte limit */
59
+ fileSizeLimit?: number;
60
+ /** [storage.buckets.*]: buckets to create at boot */
61
+ buckets?: BucketSeed[];
62
+ }
63
+ /** The `[db.seed]` slice of config.toml. */
64
+ export interface SeedConfig {
65
+ /** [db.seed].enabled */
66
+ enabled?: boolean;
67
+ /** [db.seed].sql_paths (files or globs, relative to supabase/) */
68
+ paths?: string[];
69
+ }
70
+ /** Per-function `[functions.<name>]` options. */
71
+ export interface FunctionOptions {
72
+ /** [functions.<name>].enabled */
73
+ enabled?: boolean;
74
+ /** [functions.<name>].verify_jwt */
75
+ verifyJwt?: boolean;
76
+ /** [functions.<name>].entrypoint, relative to the project root */
77
+ entrypoint?: string;
78
+ }
79
+ /** Parse supabase/config.toml once and project it into a {@link ProjectConfig}. */
80
+ export declare function loadProjectConfig(projectDir: string, env?: NodeJS.ProcessEnv): ProjectConfig;