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.
- 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 +66 -30
- 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 +170 -30
- 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/database-url.d.ts +25 -0
- package/dist/node/native/database-url.js +38 -0
- package/dist/node/native/database-url.js.map +1 -0
- package/dist/node/native/engine.d.ts +7 -0
- package/dist/node/native/engine.js +63 -85
- package/dist/node/native/engine.js.map +1 -1
- package/dist/node/native/wire-engine.d.ts +16 -0
- package/dist/node/native/wire-engine.js +83 -0
- package/dist/node/native/wire-engine.js.map +1 -0
- package/dist/node/native/wire.d.ts +25 -8
- package/dist/node/native/wire.js +130 -15
- 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 +44 -1
- package/dist/rest/build.js +96 -10
- 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 +125 -10
- package/dist/rest/handler.js.map +1 -1
- package/dist/rest/parse.d.ts +26 -1
- package/dist/rest/parse.js +29 -2
- 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 +20 -1
- package/dist/storage/handler.js +272 -16
- package/dist/storage/handler.js.map +1 -1
- package/dist/types.d.ts +84 -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
|
@@ -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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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* External-Postgres engine: point tinbase's REST/Auth/Storage at a Postgres you
|
|
3
|
+
* already run, via `--database-url` / `createBackend({ databaseUrl })`. A thin
|
|
4
|
+
* DbEngine over PgWireClient (TCP + cleartext/md5/SCRAM auth), reusing the same
|
|
5
|
+
* engine machinery as the embedded native engine.
|
|
6
|
+
*
|
|
7
|
+
* The target is treated as shared/pre-existing: bootstrap runs idempotently and
|
|
8
|
+
* never assumes exclusive ownership or an empty database. (TLS/sslmode, realtime
|
|
9
|
+
* CDC, RLS-role provisioning edge cases, and pooling are follow-ups.)
|
|
10
|
+
*/
|
|
11
|
+
import type { DbEngine } from '../../db/engine.js';
|
|
12
|
+
export interface ParsedConnectionString {
|
|
13
|
+
host: string;
|
|
14
|
+
port: number;
|
|
15
|
+
user: string;
|
|
16
|
+
password?: string;
|
|
17
|
+
database: string;
|
|
18
|
+
}
|
|
19
|
+
/** Parse a `postgres://user:pass@host:port/dbname` connection string. */
|
|
20
|
+
export declare function parseConnectionString(raw: string): ParsedConnectionString;
|
|
21
|
+
export interface DatabaseUrlEngineOptions {
|
|
22
|
+
databaseUrl: string;
|
|
23
|
+
log?: (msg: string) => void;
|
|
24
|
+
}
|
|
25
|
+
export declare function createDatabaseUrlEngine(opts: DatabaseUrlEngineOptions): Promise<DbEngine>;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { PgWireClient } from './wire.js';
|
|
2
|
+
import { buildWireEngine } from './wire-engine.js';
|
|
3
|
+
/** Parse a `postgres://user:pass@host:port/dbname` connection string. */
|
|
4
|
+
export function parseConnectionString(raw) {
|
|
5
|
+
let url;
|
|
6
|
+
try {
|
|
7
|
+
url = new URL(raw);
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
throw new Error(`invalid database URL: ${raw}`);
|
|
11
|
+
}
|
|
12
|
+
if (url.protocol !== 'postgres:' && url.protocol !== 'postgresql:') {
|
|
13
|
+
throw new Error(`unsupported database URL scheme "${url.protocol}" (expected postgres:// or postgresql://)`);
|
|
14
|
+
}
|
|
15
|
+
const database = decodeURIComponent(url.pathname.replace(/^\//, ''));
|
|
16
|
+
if (!database)
|
|
17
|
+
throw new Error(`database URL is missing a database name: ${raw}`);
|
|
18
|
+
return {
|
|
19
|
+
host: url.hostname || '127.0.0.1',
|
|
20
|
+
port: url.port ? parseInt(url.port, 10) : 5432,
|
|
21
|
+
user: url.username ? decodeURIComponent(url.username) : 'postgres',
|
|
22
|
+
password: url.password ? decodeURIComponent(url.password) : undefined,
|
|
23
|
+
database,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
export async function createDatabaseUrlEngine(opts) {
|
|
27
|
+
const conn = parseConnectionString(opts.databaseUrl);
|
|
28
|
+
opts.log?.(`connecting to external postgres at ${conn.host}:${conn.port}/${conn.database} as ${conn.user}`);
|
|
29
|
+
const connect = () => PgWireClient.connect({
|
|
30
|
+
host: conn.host,
|
|
31
|
+
port: conn.port,
|
|
32
|
+
user: conn.user,
|
|
33
|
+
password: conn.password,
|
|
34
|
+
database: conn.database,
|
|
35
|
+
});
|
|
36
|
+
return buildWireEngine({ connect });
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=database-url.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database-url.js","sourceRoot":"","sources":["../../../src/node/native/database-url.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAUlD,yEAAyE;AACzE,MAAM,UAAU,qBAAqB,CAAC,GAAW;IAC/C,IAAI,GAAQ,CAAA;IACZ,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAA;IACpB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,yBAAyB,GAAG,EAAE,CAAC,CAAA;IACjD,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,KAAK,WAAW,IAAI,GAAG,CAAC,QAAQ,KAAK,aAAa,EAAE,CAAC;QACnE,MAAM,IAAI,KAAK,CAAC,oCAAoC,GAAG,CAAC,QAAQ,2CAA2C,CAAC,CAAA;IAC9G,CAAC;IACD,MAAM,QAAQ,GAAG,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAA;IACpE,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,GAAG,EAAE,CAAC,CAAA;IACjF,OAAO;QACL,IAAI,EAAE,GAAG,CAAC,QAAQ,IAAI,WAAW;QACjC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI;QAC9C,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,UAAU;QAClE,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;QACrE,QAAQ;KACT,CAAA;AACH,CAAC;AAOD,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,IAA8B;IAC1E,MAAM,IAAI,GAAG,qBAAqB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;IACpD,IAAI,CAAC,GAAG,EAAE,CAAC,sCAAsC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;IAC3G,MAAM,OAAO,GAAG,GAAG,EAAE,CACnB,YAAY,CAAC,OAAO,CAAC;QACnB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;KACxB,CAAC,CAAA;IACJ,OAAO,eAAe,CAAC,EAAE,OAAO,EAAE,CAAC,CAAA;AACrC,CAAC"}
|
|
@@ -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>;
|