tinbase 0.10.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.
- package/README.md +10 -9
- package/dist/admin/api.d.ts +62 -1
- package/dist/admin/api.js +209 -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/node/fs-driver.js
CHANGED
|
@@ -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
|
-
/**
|
|
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
|
|
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"}
|
package/dist/node/index.d.ts
CHANGED
|
@@ -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 {
|
|
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';
|
package/dist/node/index.js
CHANGED
|
@@ -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 {
|
|
10
|
+
export { loadProjectConfig } from './load-config.js';
|
|
11
11
|
export { computeDbDiff, pullSchema, shadowNativeDataDir } from './db-diff.js';
|
|
12
12
|
//# sourceMappingURL=index.js.map
|
package/dist/node/index.js.map
CHANGED
|
@@ -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,
|
|
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;
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
import { loadConfigToml, tableAt, getBool, getInt, getString, getStringArray, getByteSize, getDurationSeconds, } from './config-toml.js';
|
|
2
|
+
/** Parse supabase/config.toml once and project it into a {@link ProjectConfig}. */
|
|
3
|
+
export function loadProjectConfig(projectDir, env = process.env) {
|
|
4
|
+
const root = loadConfigToml(projectDir, env);
|
|
5
|
+
return {
|
|
6
|
+
auth: readAuth(root, env),
|
|
7
|
+
api: readApi(root),
|
|
8
|
+
storage: readStorage(root),
|
|
9
|
+
seed: readSeed(root),
|
|
10
|
+
functions: readFunctions(root),
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
// ── [auth] ─────────────────────────────────────────────────────────────────
|
|
14
|
+
function readAuth(root, env) {
|
|
15
|
+
const auth = tableAt(root, 'auth');
|
|
16
|
+
const out = { settings: readAuthSettings(root), oauthProviders: readOAuthProviders(root, env) };
|
|
17
|
+
const enabled = getBool(auth, 'enabled');
|
|
18
|
+
if (enabled !== undefined)
|
|
19
|
+
out.enabled = enabled;
|
|
20
|
+
const siteUrl = getString(auth, 'site_url');
|
|
21
|
+
if (siteUrl !== undefined)
|
|
22
|
+
out.siteUrl = siteUrl;
|
|
23
|
+
const jwtExpiry = getInt(auth, 'jwt_expiry');
|
|
24
|
+
if (jwtExpiry !== undefined && jwtExpiry > 0)
|
|
25
|
+
out.jwtExpiry = jwtExpiry;
|
|
26
|
+
const redirects = getStringArray(auth, 'additional_redirect_urls');
|
|
27
|
+
if (redirects !== undefined)
|
|
28
|
+
out.uriAllowList = redirects;
|
|
29
|
+
const rateLimits = readRateLimits(root);
|
|
30
|
+
if (rateLimits)
|
|
31
|
+
out.rateLimits = rateLimits;
|
|
32
|
+
const sessions = tableAt(root, 'auth.sessions');
|
|
33
|
+
const timebox = getDurationSeconds(sessions, 'timebox');
|
|
34
|
+
if (timebox !== undefined)
|
|
35
|
+
out.sessionTimeboxSeconds = timebox;
|
|
36
|
+
const inactivity = getDurationSeconds(sessions, 'inactivity_timeout');
|
|
37
|
+
if (inactivity !== undefined)
|
|
38
|
+
out.sessionInactivitySeconds = inactivity;
|
|
39
|
+
return out;
|
|
40
|
+
}
|
|
41
|
+
/** The [auth]/[auth.email]/[auth.mfa] keys that become AuthSettings defaults. */
|
|
42
|
+
function readAuthSettings(root) {
|
|
43
|
+
const auth = tableAt(root, 'auth');
|
|
44
|
+
const email = tableAt(root, 'auth.email');
|
|
45
|
+
const mfa = tableAt(root, 'auth.mfa');
|
|
46
|
+
const mfaTotp = tableAt(root, 'auth.mfa.totp');
|
|
47
|
+
const out = {};
|
|
48
|
+
// Signups: [auth].disable_signup (legacy) or enable_signup at [auth]/[auth.email].
|
|
49
|
+
const disableSignup = getBool(auth, 'disable_signup');
|
|
50
|
+
if (disableSignup !== undefined)
|
|
51
|
+
out.disableSignup = disableSignup;
|
|
52
|
+
const enableSignup = getBool(auth, 'enable_signup') ?? getBool(email, 'enable_signup');
|
|
53
|
+
if (enableSignup !== undefined)
|
|
54
|
+
out.disableSignup = !enableSignup;
|
|
55
|
+
const anon = getBool(auth, 'enable_anonymous_sign_ins');
|
|
56
|
+
if (anon !== undefined)
|
|
57
|
+
out.anonymousUsers = anon;
|
|
58
|
+
// enable_confirmations (require email confirmation) is the inverse of autoconfirm;
|
|
59
|
+
// [auth.email] is canonical, top-level [auth] is the legacy alias.
|
|
60
|
+
const confirmations = getBool(email, 'enable_confirmations') ?? getBool(auth, 'enable_confirmations');
|
|
61
|
+
if (confirmations !== undefined)
|
|
62
|
+
out.autoconfirm = !confirmations;
|
|
63
|
+
const minLen = getInt(auth, 'minimum_password_length');
|
|
64
|
+
if (minLen !== undefined)
|
|
65
|
+
out.minPasswordLength = minLen;
|
|
66
|
+
const otpLength = getInt(email, 'otp_length');
|
|
67
|
+
if (otpLength !== undefined)
|
|
68
|
+
out.otpLength = otpLength;
|
|
69
|
+
const otpExpiry = getInt(email, 'otp_expiry');
|
|
70
|
+
if (otpExpiry !== undefined)
|
|
71
|
+
out.otpExpirySeconds = otpExpiry;
|
|
72
|
+
const maxFactors = getInt(mfa, 'max_enrolled_factors');
|
|
73
|
+
if (maxFactors !== undefined)
|
|
74
|
+
out.maxEnrolledFactors = maxFactors;
|
|
75
|
+
const totpEnroll = getBool(mfaTotp, 'enroll_enabled');
|
|
76
|
+
if (totpEnroll !== undefined)
|
|
77
|
+
out.totpEnrollEnabled = totpEnroll;
|
|
78
|
+
const totpVerify = getBool(mfaTotp, 'verify_enabled');
|
|
79
|
+
if (totpVerify !== undefined)
|
|
80
|
+
out.totpVerifyEnabled = totpVerify;
|
|
81
|
+
return out;
|
|
82
|
+
}
|
|
83
|
+
/** Map [auth.rate_limit].* to the auth limiter's rules (GoTrue's windows). */
|
|
84
|
+
function readRateLimits(root) {
|
|
85
|
+
const rl = tableAt(root, 'auth.rate_limit');
|
|
86
|
+
if (!rl)
|
|
87
|
+
return undefined;
|
|
88
|
+
const out = {};
|
|
89
|
+
const FIVE_MIN = 5 * 60 * 1000;
|
|
90
|
+
const ONE_HOUR = 60 * 60 * 1000;
|
|
91
|
+
const signIn = getInt(rl, 'sign_in_sign_ups');
|
|
92
|
+
if (signIn !== undefined) {
|
|
93
|
+
out.token = { limit: signIn, windowMs: FIVE_MIN };
|
|
94
|
+
out.signup = { limit: signIn, windowMs: FIVE_MIN };
|
|
95
|
+
}
|
|
96
|
+
const verify = getInt(rl, 'token_verifications');
|
|
97
|
+
if (verify !== undefined)
|
|
98
|
+
out.verify = { limit: verify, windowMs: FIVE_MIN };
|
|
99
|
+
const email = getInt(rl, 'email_sent');
|
|
100
|
+
if (email !== undefined) {
|
|
101
|
+
out.otp = { limit: email, windowMs: ONE_HOUR };
|
|
102
|
+
out.recover = { limit: email, windowMs: ONE_HOUR };
|
|
103
|
+
}
|
|
104
|
+
return Object.keys(out).length ? out : undefined;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* OAuth providers, highest precedence first:
|
|
108
|
+
* 1. config.toml [auth.external.<provider>]
|
|
109
|
+
* 2. GOTRUE_EXTERNAL_<PROVIDER>_CLIENT_ID / _SECRET / _ENABLED
|
|
110
|
+
* 3. TINBASE_OAUTH_<PROVIDER>_CLIENT_ID / _CLIENT_SECRET / _ENABLED
|
|
111
|
+
* Endpoints come from presets in oauth.ts; only real overrides are passed.
|
|
112
|
+
*/
|
|
113
|
+
function readOAuthProviders(root, env) {
|
|
114
|
+
const out = {};
|
|
115
|
+
const external = tableAt(root, 'auth.external');
|
|
116
|
+
if (external) {
|
|
117
|
+
for (const [name, t] of external.children) {
|
|
118
|
+
const enabled = getBool(t, 'enabled') ?? true;
|
|
119
|
+
const clientId = getString(t, 'client_id');
|
|
120
|
+
const secret = getString(t, 'secret');
|
|
121
|
+
if (!enabled || !clientId || !secret)
|
|
122
|
+
continue;
|
|
123
|
+
const url = getString(t, 'url');
|
|
124
|
+
out[name.toLowerCase()] = {
|
|
125
|
+
clientId,
|
|
126
|
+
clientSecret: secret,
|
|
127
|
+
authorizeUrl: getString(t, 'authorize_url') ?? (url ? `${url}/authorize` : undefined),
|
|
128
|
+
tokenUrl: getString(t, 'token_url') ?? (url ? `${url}/token` : undefined),
|
|
129
|
+
userInfoUrl: getString(t, 'userinfo_url') ?? (url ? `${url}/userinfo` : undefined),
|
|
130
|
+
scopes: getString(t, 'scopes'),
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
collectEnvProviders(env, out, 'GOTRUE_EXTERNAL_', 'SECRET');
|
|
135
|
+
collectEnvProviders(env, out, 'TINBASE_OAUTH_', 'CLIENT_SECRET');
|
|
136
|
+
return out;
|
|
137
|
+
}
|
|
138
|
+
/** Collect providers declared via `<prefix><NAME>_CLIENT_ID/_<secretKey>/_ENABLED` env vars. */
|
|
139
|
+
function collectEnvProviders(env, out, prefix, secretKey) {
|
|
140
|
+
const names = new Set();
|
|
141
|
+
for (const key of Object.keys(env)) {
|
|
142
|
+
if (key.startsWith(prefix) && key.endsWith('_CLIENT_ID')) {
|
|
143
|
+
names.add(key.slice(prefix.length, -'_CLIENT_ID'.length));
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
for (const upper of names) {
|
|
147
|
+
const name = upper.toLowerCase();
|
|
148
|
+
if (out[name])
|
|
149
|
+
continue; // higher-precedence source already set it
|
|
150
|
+
const g = (s) => env[`${prefix}${upper}_${s}`];
|
|
151
|
+
const clientId = g('CLIENT_ID');
|
|
152
|
+
const clientSecret = g(secretKey);
|
|
153
|
+
if (!clientId || !clientSecret)
|
|
154
|
+
continue;
|
|
155
|
+
if (g('ENABLED') !== undefined && g('ENABLED') !== 'true')
|
|
156
|
+
continue;
|
|
157
|
+
out[name] = {
|
|
158
|
+
clientId,
|
|
159
|
+
clientSecret,
|
|
160
|
+
authorizeUrl: g('AUTHORIZE_URL'),
|
|
161
|
+
tokenUrl: g('TOKEN_URL'),
|
|
162
|
+
userInfoUrl: g('USERINFO_URL'),
|
|
163
|
+
scopes: g('SCOPES'),
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
// ── [api] ────────────────────────────────────────────────────────────────
|
|
168
|
+
function readApi(root) {
|
|
169
|
+
const api = tableAt(root, 'api');
|
|
170
|
+
const out = {};
|
|
171
|
+
const schemas = getStringArray(api, 'schemas');
|
|
172
|
+
if (schemas !== undefined)
|
|
173
|
+
out.schemas = schemas;
|
|
174
|
+
const maxRows = getInt(api, 'max_rows');
|
|
175
|
+
if (maxRows !== undefined && maxRows > 0)
|
|
176
|
+
out.maxRows = maxRows;
|
|
177
|
+
return out;
|
|
178
|
+
}
|
|
179
|
+
// ── [storage] ──────────────────────────────────────────────────────────────
|
|
180
|
+
function readStorage(root) {
|
|
181
|
+
const storage = tableAt(root, 'storage');
|
|
182
|
+
const out = {};
|
|
183
|
+
const limit = getByteSize(storage, 'file_size_limit');
|
|
184
|
+
if (limit !== undefined)
|
|
185
|
+
out.fileSizeLimit = limit;
|
|
186
|
+
const buckets = tableAt(root, 'storage.buckets');
|
|
187
|
+
if (buckets && buckets.children.size > 0) {
|
|
188
|
+
out.buckets = [...buckets.children].map(([id, t]) => ({
|
|
189
|
+
id,
|
|
190
|
+
public: getBool(t, 'public') ?? false,
|
|
191
|
+
fileSizeLimit: getByteSize(t, 'file_size_limit') ?? null,
|
|
192
|
+
allowedMimeTypes: getStringArray(t, 'allowed_mime_types') ?? null,
|
|
193
|
+
}));
|
|
194
|
+
}
|
|
195
|
+
return out;
|
|
196
|
+
}
|
|
197
|
+
// ── [db.seed] ──────────────────────────────────────────────────────────────
|
|
198
|
+
function readSeed(root) {
|
|
199
|
+
const seed = tableAt(root, 'db.seed');
|
|
200
|
+
const out = {};
|
|
201
|
+
const enabled = getBool(seed, 'enabled');
|
|
202
|
+
if (enabled !== undefined)
|
|
203
|
+
out.enabled = enabled;
|
|
204
|
+
const paths = getStringArray(seed, 'sql_paths');
|
|
205
|
+
if (paths !== undefined)
|
|
206
|
+
out.paths = paths;
|
|
207
|
+
return out;
|
|
208
|
+
}
|
|
209
|
+
// ── [functions.<name>] ───────────────────────────────────────────────────
|
|
210
|
+
function readFunctions(root) {
|
|
211
|
+
const fns = tableAt(root, 'functions');
|
|
212
|
+
const out = {};
|
|
213
|
+
if (!fns)
|
|
214
|
+
return out;
|
|
215
|
+
for (const [name, t] of fns.children) {
|
|
216
|
+
const opts = {};
|
|
217
|
+
const enabled = getBool(t, 'enabled');
|
|
218
|
+
if (enabled !== undefined)
|
|
219
|
+
opts.enabled = enabled;
|
|
220
|
+
const verifyJwt = getBool(t, 'verify_jwt');
|
|
221
|
+
if (verifyJwt !== undefined)
|
|
222
|
+
opts.verifyJwt = verifyJwt;
|
|
223
|
+
const entrypoint = getString(t, 'entrypoint');
|
|
224
|
+
if (entrypoint !== undefined)
|
|
225
|
+
opts.entrypoint = entrypoint;
|
|
226
|
+
out[name] = opts;
|
|
227
|
+
}
|
|
228
|
+
return out;
|
|
229
|
+
}
|
|
230
|
+
//# sourceMappingURL=load-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load-config.js","sourceRoot":"","sources":["../../src/node/load-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,23 @@
|
|
|
1
1
|
import type { EdgeFunction } from '../functions/handler.js';
|
|
2
2
|
/**
|
|
3
3
|
* Load edge-function secrets from supabase/functions/.env (KEY=VALUE lines,
|
|
4
|
-
* `#` comments). These are exposed to functions via Deno.env and ctx.env
|
|
4
|
+
* `#` comments). These are exposed to functions via Deno.env and ctx.env -
|
|
5
5
|
* the local equivalent of `supabase functions serve --env-file`.
|
|
6
6
|
*/
|
|
7
7
|
export declare function loadFunctionEnv(projectDir: string): Promise<Record<string, string>>;
|
|
8
|
-
|
|
8
|
+
/** Per-function options from config.toml [functions.<name>]. */
|
|
9
|
+
export interface LoadFunctionOptions {
|
|
10
|
+
/** Skip loading when explicitly disabled. */
|
|
11
|
+
enabled?: boolean;
|
|
12
|
+
/** Custom entrypoint path, relative to the project root. */
|
|
13
|
+
entrypoint?: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Discover and load every edge function under supabase/functions/, keyed by
|
|
17
|
+
* directory name. Dirs starting with `_` or `.` are skipped (shared code), as
|
|
18
|
+
* are functions disabled in config.toml. Each function is bundled with esbuild
|
|
19
|
+
* when available (falling back to a plain import), then its handler is taken
|
|
20
|
+
* from a default export or a captured `Deno.serve()` call. Load failures warn
|
|
21
|
+
* and skip rather than throwing, so one broken function can't block startup.
|
|
22
|
+
*/
|
|
23
|
+
export declare function loadFunctions(projectDir: string, options?: Record<string, LoadFunctionOptions>): Promise<Map<string, EdgeFunction>>;
|
|
@@ -6,7 +6,7 @@ import { installDenoShim, resetCapturedHandler, takeCapturedHandler } from '../f
|
|
|
6
6
|
import { bundleFunction } from './bundle-function.js';
|
|
7
7
|
/**
|
|
8
8
|
* Load edge-function secrets from supabase/functions/.env (KEY=VALUE lines,
|
|
9
|
-
* `#` comments). These are exposed to functions via Deno.env and ctx.env
|
|
9
|
+
* `#` comments). These are exposed to functions via Deno.env and ctx.env -
|
|
10
10
|
* the local equivalent of `supabase functions serve --env-file`.
|
|
11
11
|
*/
|
|
12
12
|
export async function loadFunctionEnv(projectDir) {
|
|
@@ -35,7 +35,15 @@ export async function loadFunctionEnv(projectDir) {
|
|
|
35
35
|
}
|
|
36
36
|
return env;
|
|
37
37
|
}
|
|
38
|
-
|
|
38
|
+
/**
|
|
39
|
+
* Discover and load every edge function under supabase/functions/, keyed by
|
|
40
|
+
* directory name. Dirs starting with `_` or `.` are skipped (shared code), as
|
|
41
|
+
* are functions disabled in config.toml. Each function is bundled with esbuild
|
|
42
|
+
* when available (falling back to a plain import), then its handler is taken
|
|
43
|
+
* from a default export or a captured `Deno.serve()` call. Load failures warn
|
|
44
|
+
* and skip rather than throwing, so one broken function can't block startup.
|
|
45
|
+
*/
|
|
46
|
+
export async function loadFunctions(projectDir, options = {}) {
|
|
39
47
|
const functions = new Map();
|
|
40
48
|
const root = join(projectDir, 'supabase', 'functions');
|
|
41
49
|
let entries = [];
|
|
@@ -50,11 +58,16 @@ export async function loadFunctions(projectDir) {
|
|
|
50
58
|
for (const name of entries) {
|
|
51
59
|
if (name.startsWith('_') || name.startsWith('.'))
|
|
52
60
|
continue;
|
|
61
|
+
if (options[name]?.enabled === false)
|
|
62
|
+
continue; // disabled in config.toml
|
|
53
63
|
const dir = join(root, name);
|
|
54
64
|
if (!(await stat(dir)).isDirectory())
|
|
55
65
|
continue;
|
|
56
|
-
|
|
57
|
-
|
|
66
|
+
// A config.toml entrypoint overrides the default index.* discovery.
|
|
67
|
+
const candidates = options[name]?.entrypoint
|
|
68
|
+
? [join(projectDir, options[name].entrypoint)]
|
|
69
|
+
: ['index.ts', 'index.tsx', 'index.js', 'index.mjs'].map((f) => join(dir, f));
|
|
70
|
+
for (const path of candidates) {
|
|
58
71
|
try {
|
|
59
72
|
await stat(path);
|
|
60
73
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load-functions.js","sourceRoot":"","sources":["../../src/node/load-functions.ts"],"names":[],"mappings":"AAAA,yFAAyF;AACzF,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AAC1D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAExC,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AACtG,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAErD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,UAAkB;IACtD,IAAI,IAAY,CAAA;IAChB,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAA;IAClF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAA;IACX,CAAC;IACD,MAAM,GAAG,GAA2B,EAAE,CAAA;IACtC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,CAAA;QACvB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAQ;QAC3C,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAC5B,IAAI,EAAE,KAAK,CAAC,CAAC;YAAE,SAAQ;QACvB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;QACpC,IAAI,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;QACnC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YAC7F,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QACxB,CAAC;QACD,IAAI,GAAG;YAAE,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAA;IACzB,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;
|
|
1
|
+
{"version":3,"file":"load-functions.js","sourceRoot":"","sources":["../../src/node/load-functions.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { DbEngine } from '../../db/engine.js';
|
|
2
|
+
/** Options for {@link createNativeEngine}. */
|
|
2
3
|
export interface NativeEngineOptions {
|
|
3
4
|
/** Postgres data directory (created + initdb'd if missing). */
|
|
4
5
|
dataDir: string;
|
|
@@ -6,8 +7,14 @@ export interface NativeEngineOptions {
|
|
|
6
7
|
version?: string;
|
|
7
8
|
/** Where downloaded binaries are cached. Default ~/.cache/tinbase */
|
|
8
9
|
cacheDir?: string;
|
|
10
|
+
/** sink for progress lines (download, install); no-op when omitted */
|
|
9
11
|
log?: (msg: string) => void;
|
|
10
12
|
}
|
|
11
13
|
/** Download + unpack Postgres binaries if not already cached (concurrency-safe). Returns the install dir. */
|
|
12
14
|
export declare function ensurePostgres(version?: string, cacheDir?: string, log?: (m: string) => void): Promise<string>;
|
|
15
|
+
/**
|
|
16
|
+
* Boot the embedded Postgres child (initdb on first run) and return a {@link DbEngine}
|
|
17
|
+
* backed by two wire connections: one for queries/transactions (serialized by a mutex),
|
|
18
|
+
* one dedicated to LISTEN/NOTIFY.
|
|
19
|
+
*/
|
|
13
20
|
export declare function createNativeEngine(opts: NativeEngineOptions): Promise<DbEngine>;
|