tinbase 0.1.0 → 0.2.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 +31 -8
- package/dist/admin/api.d.ts +12 -0
- package/dist/admin/api.js +118 -0
- package/dist/admin/api.js.map +1 -0
- package/dist/admin/ui.d.ts +9 -0
- package/dist/admin/ui.js +74 -0
- package/dist/admin/ui.js.map +1 -0
- package/dist/auth/handler.d.ts +8 -1
- package/dist/auth/handler.js +86 -4
- package/dist/auth/handler.js.map +1 -1
- package/dist/cli.js +8 -2
- package/dist/cli.js.map +1 -1
- package/dist/db/bootstrap.d.ts +1 -1
- package/dist/db/bootstrap.js +44 -0
- package/dist/db/bootstrap.js.map +1 -1
- package/dist/db/pglite-engine.js +17 -3
- package/dist/db/pglite-engine.js.map +1 -1
- package/dist/functions/handler.d.ts +28 -0
- package/dist/functions/handler.js +42 -0
- package/dist/functions/handler.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +32 -1
- package/dist/index.js.map +1 -1
- package/dist/node/index.d.ts +1 -0
- package/dist/node/index.js +1 -0
- package/dist/node/index.js.map +1 -1
- package/dist/node/load-functions.d.ts +2 -0
- package/dist/node/load-functions.js +52 -0
- package/dist/node/load-functions.js.map +1 -0
- package/dist/types.d.ts +13 -0
- package/dist/types.js.map +1 -1
- package/package.json +5 -4
package/dist/index.js
CHANGED
|
@@ -7,7 +7,10 @@
|
|
|
7
7
|
* Node, or call it in-process in the browser by passing it as supabase-js's
|
|
8
8
|
* `global.fetch`.
|
|
9
9
|
*/
|
|
10
|
+
import { AdminApi } from './admin/api.js';
|
|
11
|
+
import { ADMIN_HTML } from './admin/ui.js';
|
|
10
12
|
import { AuthHandler } from './auth/handler.js';
|
|
13
|
+
import { FunctionsHandler } from './functions/handler.js';
|
|
11
14
|
import { Database } from './db/database.js';
|
|
12
15
|
import { signJwt, verifyJwt } from './jwt.js';
|
|
13
16
|
import { RealtimeEngine } from './realtime/engine.js';
|
|
@@ -20,6 +23,7 @@ export { Database } from './db/database.js';
|
|
|
20
23
|
export { MemoryStorageDriver } from './storage/driver.js';
|
|
21
24
|
export { RealtimeEngine } from './realtime/engine.js';
|
|
22
25
|
export { signJwt, verifyJwt, decodeJwt } from './jwt.js';
|
|
26
|
+
export { FunctionsHandler } from './functions/handler.js';
|
|
23
27
|
const CORS_HEADERS = {
|
|
24
28
|
'access-control-allow-origin': '*',
|
|
25
29
|
'access-control-allow-methods': 'GET, POST, PUT, PATCH, DELETE, OPTIONS, HEAD',
|
|
@@ -42,10 +46,25 @@ export async function createBackend(config = {}) {
|
|
|
42
46
|
const anonKey = await signJwt({ iss: 'supabase', ref: 'tinbase', role: 'anon', iat: now, exp: now + tenYears }, jwtSecret);
|
|
43
47
|
const serviceRoleKey = await signJwt({ iss: 'supabase', ref: 'tinbase', role: 'service_role', iat: now, exp: now + tenYears }, jwtSecret);
|
|
44
48
|
const rest = new RestHandler(db);
|
|
45
|
-
const
|
|
49
|
+
const mailer = config.mailer ?? {
|
|
50
|
+
async send(msg) {
|
|
51
|
+
const log = config.log ?? console.log;
|
|
52
|
+
log(`[mail] to=${msg.to} subject="${msg.subject}"\n${msg.text}`);
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
const auth = new AuthHandler(db, { jwtSecret, siteUrl, jwtExpiry, mailer });
|
|
46
56
|
const storage = new StorageHandler(db, config.storageDriver ?? new MemoryStorageDriver(), { jwtSecret });
|
|
47
57
|
const realtime = new RealtimeEngine(db);
|
|
48
58
|
await realtime.start();
|
|
59
|
+
const admin = new AdminApi(db);
|
|
60
|
+
const fnMap = config.functions instanceof Map
|
|
61
|
+
? config.functions
|
|
62
|
+
: new Map(Object.entries(config.functions ?? {}));
|
|
63
|
+
const functions = new FunctionsHandler(fnMap, {
|
|
64
|
+
SUPABASE_URL: siteUrl,
|
|
65
|
+
SUPABASE_ANON_KEY: anonKey,
|
|
66
|
+
SUPABASE_SERVICE_ROLE_KEY: serviceRoleKey,
|
|
67
|
+
});
|
|
49
68
|
async function resolveContext(req, url) {
|
|
50
69
|
const authz = req.headers.get('authorization');
|
|
51
70
|
const bearer = authz?.toLowerCase().startsWith('bearer ') ? authz.slice(7) : null;
|
|
@@ -84,12 +103,19 @@ export async function createBackend(config = {}) {
|
|
|
84
103
|
headers: { 'content-type': 'application/json' },
|
|
85
104
|
}));
|
|
86
105
|
}
|
|
106
|
+
if (path === '/_' || path === '/_/') {
|
|
107
|
+
return new Response(ADMIN_HTML, { status: 200, headers: { 'content-type': 'text/html; charset=utf-8' } });
|
|
108
|
+
}
|
|
87
109
|
// public endpoints that skip apikey checks
|
|
88
110
|
if (path.startsWith('/storage/v1/object/public/') || path.startsWith('/storage/v1/object/sign/')) {
|
|
89
111
|
if (req.method === 'GET' || req.method === 'HEAD') {
|
|
90
112
|
return withCors(await storage.handle(req, { role: 'anon', claims: null }, url));
|
|
91
113
|
}
|
|
92
114
|
}
|
|
115
|
+
if (path === '/auth/v1/verify' && req.method === 'GET') {
|
|
116
|
+
// magic-link/recovery clicks arrive from email clients with no apikey
|
|
117
|
+
return withCors(await auth.handle(req, { role: 'anon', claims: null }, url));
|
|
118
|
+
}
|
|
93
119
|
if (path.startsWith('/auth/v1/')) {
|
|
94
120
|
// GoTrue validates the apikey header, but user JWTs ride Authorization
|
|
95
121
|
const apikey = req.headers.get('apikey') ?? url.searchParams.get('apikey');
|
|
@@ -108,6 +134,10 @@ export async function createBackend(config = {}) {
|
|
|
108
134
|
return ctx;
|
|
109
135
|
if (path.startsWith('/rest/v1'))
|
|
110
136
|
return withCors(await rest.handle(req, ctx, url));
|
|
137
|
+
if (path.startsWith('/admin/v1'))
|
|
138
|
+
return withCors(await admin.handle(req, ctx, url));
|
|
139
|
+
if (path.startsWith('/functions/v1'))
|
|
140
|
+
return withCors(await functions.handle(req, ctx, url));
|
|
111
141
|
if (path.startsWith('/storage/v1'))
|
|
112
142
|
return withCors(await storage.handle(req, ctx, url));
|
|
113
143
|
if (path.startsWith('/realtime/v1')) {
|
|
@@ -125,6 +155,7 @@ export async function createBackend(config = {}) {
|
|
|
125
155
|
fetch: handle,
|
|
126
156
|
db,
|
|
127
157
|
realtime,
|
|
158
|
+
functions,
|
|
128
159
|
anonKey,
|
|
129
160
|
serviceRoleKey,
|
|
130
161
|
jwtSecret,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,kBAAkB,EAA+D,MAAM,YAAY,CAAA;AAE5G,cAAc,YAAY,CAAA;AAC1B,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AACzD,OAAO,EAAE,cAAc,EAA2B,MAAM,sBAAsB,CAAA;AAC9E,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,gBAAgB,EAAqB,MAAM,wBAAwB,CAAA;AAC5E,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,kBAAkB,EAA+D,MAAM,YAAY,CAAA;AAE5G,cAAc,YAAY,CAAA;AAC1B,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AACzD,OAAO,EAAE,cAAc,EAA2B,MAAM,sBAAsB,CAAA;AAC9E,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AACxD,OAAO,EAAE,gBAAgB,EAA2C,MAAM,wBAAwB,CAAA;AAkBlG,MAAM,YAAY,GAA2B;IAC3C,6BAA6B,EAAE,GAAG;IAClC,8BAA8B,EAAE,8CAA8C;IAC9E,8BAA8B,EAC5B,6JAA6J;IAC/J,+BAA+B,EAAE,4CAA4C;IAC7E,wBAAwB,EAAE,OAAO;CAClC,CAAA;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,SAAwB,EAAE;IAC5D,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,kBAAkB,CAAA;IACxD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,wBAAwB,CAAA;IAC1D,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,IAAI,CAAA;IAE1C,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,OAAO,CAAC,CAAA;IACjE,IAAI,MAAM,CAAC,UAAU,EAAE,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QAChD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;QAC/E,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,CAAC,GAAG,EAAE,CAAC,uBAAuB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACnF,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAA;IACzC,MAAM,QAAQ,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAA;IACrC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,QAAQ,EAAE,EAAE,SAAS,CAAC,CAAA;IAC1H,MAAM,cAAc,GAAG,MAAM,OAAO,CAClC,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,QAAQ,EAAE,EACxF,SAAS,CACV,CAAA;IAED,MAAM,IAAI,GAAG,IAAI,WAAW,CAAC,EAAE,CAAC,CAAA;IAChC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI;QAC9B,KAAK,CAAC,IAAI,CAAC,GAAkD;YAC3D,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAA;YACrC,GAAG,CAAC,aAAa,GAAG,CAAC,EAAE,aAAa,GAAG,CAAC,OAAO,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAA;QAClE,CAAC;KACF,CAAA;IACD,MAAM,IAAI,GAAG,IAAI,WAAW,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAA;IAC3E,MAAM,OAAO,GAAG,IAAI,cAAc,CAAC,EAAE,EAAE,MAAM,CAAC,aAAa,IAAI,IAAI,mBAAmB,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAA;IACxG,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,EAAE,CAAC,CAAA;IACvC,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAA;IACtB,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,EAAE,CAAC,CAAA;IAE9B,MAAM,KAAK,GACT,MAAM,CAAC,SAAS,YAAY,GAAG;QAC7B,CAAC,CAAC,MAAM,CAAC,SAAS;QAClB,CAAC,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,CAAA;IACrD,MAAM,SAAS,GAAG,IAAI,gBAAgB,CAAC,KAAkC,EAAE;QACzE,YAAY,EAAE,OAAO;QACrB,iBAAiB,EAAE,OAAO;QAC1B,yBAAyB,EAAE,cAAc;KAC1C,CAAC,CAAA;IAEF,KAAK,UAAU,cAAc,CAAC,GAAY,EAAE,GAAQ;QAClD,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAA;QAC9C,MAAM,MAAM,GAAG,KAAK,EAAE,WAAW,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;QACjF,MAAM,KAAK,GAAG,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QACnF,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,QAAQ,CACb,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,6BAA6B,EAAE,IAAI,EAAE,oDAAoD,EAAE,CAAC,EAAE;gBACnI,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;aAChD,CAAC,CACH,CAAA;QACH,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,CAAA;QAChD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,QAAQ,CACb,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC,EAAE;gBAC3D,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;aAChD,CAAC,CACH,CAAA;QACH,CAAC;QACD,MAAM,IAAI,GAAG,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAA;QACnE,IAAI,CAAC,CAAC,MAAM,EAAE,eAAe,EAAE,cAAc,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9D,OAAO,QAAQ,CACb,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,iBAAiB,IAAI,EAAE,EAAE,CAAC,EAAE;gBACjE,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;aAChD,CAAC,CACH,CAAA;QACH,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;IACzB,CAAC;IAED,KAAK,UAAU,MAAM,CAAC,GAAY;QAChC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAC5B,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAA;QAEzB,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC7B,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAA;QACnE,CAAC;QACD,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvC,OAAO,QAAQ,CACb,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE;gBACnE,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;aAChD,CAAC,CACH,CAAA;QACH,CAAC;QAED,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;YACpC,OAAO,IAAI,QAAQ,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,0BAA0B,EAAE,EAAE,CAAC,CAAA;QAC3G,CAAC;QAED,2CAA2C;QAC3C,IAAI,IAAI,CAAC,UAAU,CAAC,4BAA4B,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,0BAA0B,CAAC,EAAE,CAAC;YACjG,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBAClD,OAAO,QAAQ,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,CAAA;YACjF,CAAC;QACH,CAAC;QACD,IAAI,IAAI,KAAK,iBAAiB,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YACvD,sEAAsE;YACtE,OAAO,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,CAAA;QAC9E,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YACjC,uEAAuE;YACvE,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;YAC1E,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC;gBACrD,OAAO,QAAQ,CACb,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,6BAA6B,EAAE,CAAC,EAAE;oBACvE,MAAM,EAAE,GAAG;oBACX,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;iBAChD,CAAC,CACH,CAAA;YACH,CAAC;YACD,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;YACpD,MAAM,GAAG,GAAmB,EAAE,IAAI,EAAE,MAAM,CAAC,SAAS,EAAE,IAAI,IAAI,MAAM,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;YAC1F,OAAO,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;QACnD,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;QAC1C,IAAI,GAAG,YAAY,QAAQ;YAAE,OAAO,GAAG,CAAA;QAEvC,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;YAAE,OAAO,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;QAClF,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;YAAE,OAAO,QAAQ,CAAC,MAAM,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;QACpF,IAAI,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC;YAAE,OAAO,QAAQ,CAAC,MAAM,SAAS,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;QAC5F,IAAI,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;YAAE,OAAO,QAAQ,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;QACxF,IAAI,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;YACpC,OAAO,QAAQ,CACb,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,0CAA0C,EAAE,CAAC,EAAE;gBACpF,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;aAChD,CAAC,CACH,CAAA;QACH,CAAC;QACD,OAAO,QAAQ,CACb,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,qBAAqB,IAAI,EAAE,EAAE,CAAC,EAAE;YACrE,MAAM,EAAE,GAAG;YACX,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;SAChD,CAAC,CACH,CAAA;IACH,CAAC;IAED,OAAO;QACL,KAAK,EAAE,MAAM;QACb,EAAE;QACF,QAAQ;QACR,SAAS;QACT,OAAO;QACP,cAAc;QACd,SAAS;QACT,OAAO,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,OAAO,CAAC;QACvE,KAAK,EAAE,KAAK,IAAI,EAAE;YAChB,QAAQ,CAAC,IAAI,EAAE,CAAA;YACf,MAAM,EAAE,CAAC,KAAK,EAAE,CAAA;QAClB,CAAC;KACF,CAAA;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,GAAa;IAC7B,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;QAClD,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IAChD,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC"}
|
package/dist/node/index.d.ts
CHANGED
|
@@ -5,3 +5,4 @@ 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 } from './load-functions.js';
|
package/dist/node/index.js
CHANGED
|
@@ -5,4 +5,5 @@ export { loadSupabaseProject } from './project.js';
|
|
|
5
5
|
export { acceptWebSocket } from './ws.js';
|
|
6
6
|
export { createNativeEngine, ensurePostgres } from './native/engine.js';
|
|
7
7
|
export { PgWireClient, PgWireError } from './native/wire.js';
|
|
8
|
+
export { loadFunctions } from './load-functions.js';
|
|
8
9
|
//# 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,EAAyC,MAAM,aAAa,CAAA;AAC1E,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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/node/index.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,OAAO,EAAE,KAAK,EAAyC,MAAM,aAAa,CAAA;AAC1E,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,MAAM,qBAAqB,CAAA"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/** Loads edge functions from supabase/functions/<name>/index.{ts,js,mjs} (Node only). */
|
|
2
|
+
import { readdir, stat } from 'node:fs/promises';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { pathToFileURL } from 'node:url';
|
|
5
|
+
export async function loadFunctions(projectDir) {
|
|
6
|
+
const functions = new Map();
|
|
7
|
+
const root = join(projectDir, 'supabase', 'functions');
|
|
8
|
+
let entries = [];
|
|
9
|
+
try {
|
|
10
|
+
entries = await readdir(root);
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return functions;
|
|
14
|
+
}
|
|
15
|
+
for (const name of entries) {
|
|
16
|
+
if (name.startsWith('_') || name.startsWith('.'))
|
|
17
|
+
continue;
|
|
18
|
+
const dir = join(root, name);
|
|
19
|
+
if (!(await stat(dir)).isDirectory())
|
|
20
|
+
continue;
|
|
21
|
+
for (const file of ['index.ts', 'index.js', 'index.mjs']) {
|
|
22
|
+
const path = join(dir, file);
|
|
23
|
+
try {
|
|
24
|
+
await stat(path);
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
try {
|
|
30
|
+
const mod = (await import(pathToFileURL(path).href));
|
|
31
|
+
if (typeof mod.default === 'function') {
|
|
32
|
+
functions.set(name, mod.default);
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
console.warn(` warning: function "${name}" has no default export, skipped`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
catch (e) {
|
|
39
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
40
|
+
if (file === 'index.ts' && /Unknown file extension|Cannot find module/.test(msg)) {
|
|
41
|
+
console.warn(` warning: function "${name}" is TypeScript — run tinbase with tsx or bun, or compile it to .js`);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
console.warn(` warning: failed to load function "${name}": ${msg}`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return functions;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=load-functions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load-functions.js","sourceRoot":"","sources":["../../src/node/load-functions.ts"],"names":[],"mappings":"AAAA,yFAAyF;AACzF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAGxC,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,UAAkB;IACpD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAwB,CAAA;IACjD,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,WAAW,CAAC,CAAA;IAEtD,IAAI,OAAO,GAAa,EAAE,CAAA;IAC1B,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAQ;QAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QAC5B,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE;YAAE,SAAQ;QAC9C,KAAK,MAAM,IAAI,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,WAAW,CAAC,EAAE,CAAC;YACzD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;YAC5B,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,IAAI,CAAC,CAAA;YAClB,CAAC;YAAC,MAAM,CAAC;gBACP,SAAQ;YACV,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAA+B,CAAA;gBAClF,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;oBACtC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;gBAClC,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,IAAI,CAAC,wBAAwB,IAAI,kCAAkC,CAAC,CAAA;gBAC9E,CAAC;YACH,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;gBACtD,IAAI,IAAI,KAAK,UAAU,IAAI,2CAA2C,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;oBACjF,OAAO,CAAC,IAAI,CAAC,wBAAwB,IAAI,qEAAqE,CAAC,CAAA;gBACjH,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,IAAI,CAAC,uCAAuC,IAAI,MAAM,GAAG,EAAE,CAAC,CAAA;gBACtE,CAAC;YACH,CAAC;YACD,MAAK;QACP,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -27,9 +27,22 @@ export interface BackendConfig {
|
|
|
27
27
|
seedSql?: string;
|
|
28
28
|
/** Where object storage bytes live. Default: in-memory. Node CLI passes a fs driver. */
|
|
29
29
|
storageDriver?: StorageDriver;
|
|
30
|
+
/** Edge functions: name → fetch handler, served at /functions/v1/<name>. */
|
|
31
|
+
functions?: Map<string, import('./functions/handler.js').EdgeFunction> | Record<string, import('./functions/handler.js').EdgeFunction>;
|
|
32
|
+
/** Mail transport for OTP/magic-link/recovery emails. Default: console logger. */
|
|
33
|
+
mailer?: Mailer;
|
|
30
34
|
/** Print startup/debug logs. */
|
|
31
35
|
log?: (msg: string) => void;
|
|
32
36
|
}
|
|
37
|
+
export interface MailMessage {
|
|
38
|
+
to: string;
|
|
39
|
+
subject: string;
|
|
40
|
+
text: string;
|
|
41
|
+
}
|
|
42
|
+
/** Pluggable mail transport. Default implementation logs to the console. */
|
|
43
|
+
export interface Mailer {
|
|
44
|
+
send(msg: MailMessage): Promise<void>;
|
|
45
|
+
}
|
|
33
46
|
export declare const DEFAULT_JWT_SECRET = "super-secret-jwt-token-with-at-least-32-characters-long";
|
|
34
47
|
/** Per-request execution context derived from apikey/Authorization headers. */
|
|
35
48
|
export interface RequestContext {
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAkDA,MAAM,CAAC,MAAM,kBAAkB,GAAG,yDAAyD,CAAA;AAiB3F,MAAM,OAAO,QAAS,SAAQ,KAAK;IAExB;IACA;IAFT,YACS,MAAc,EACd,IAA6B;QAEpC,KAAK,CAAC,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAA;QAHtE,WAAM,GAAN,MAAM,CAAQ;QACd,SAAI,GAAJ,IAAI,CAAyB;IAGtC,CAAC;CACF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tinbase",
|
|
3
|
-
"version": "0.1
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "A pure-JS, Docker-free Supabase backend replacement built on PGlite. Wire-compatible with supabase-js.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"author": "Sanket Sahu",
|
|
@@ -20,12 +20,13 @@
|
|
|
20
20
|
"assets/logo.svg"
|
|
21
21
|
],
|
|
22
22
|
"scripts": {
|
|
23
|
-
"build": "tsc -p tsconfig.json",
|
|
23
|
+
"build": "npm run build:admin && tsc -p tsconfig.json",
|
|
24
24
|
"dev": "tsx src/cli.ts start",
|
|
25
25
|
"test": "vitest run",
|
|
26
26
|
"test:watch": "vitest",
|
|
27
27
|
"build:binary": "npm run build && bun build --compile src/cli.ts --outfile dist-bin/tinbase --external @electric-sql/pglite --define 'process.env.TINBASE_SINGLE_BINARY=\"1\"'",
|
|
28
|
-
"prepublishOnly": "npm run build && npm test"
|
|
28
|
+
"prepublishOnly": "npm run build && npm test",
|
|
29
|
+
"build:admin": "cd admin-ui && npm run build"
|
|
29
30
|
},
|
|
30
31
|
"engines": {
|
|
31
32
|
"node": ">=22"
|
|
@@ -56,4 +57,4 @@
|
|
|
56
57
|
"bugs": {
|
|
57
58
|
"url": "https://github.com/sanketsahu/tinbase/issues"
|
|
58
59
|
}
|
|
59
|
-
}
|
|
60
|
+
}
|