@supacloud/lite 0.9.1 → 0.10.0
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/CHANGELOG.md +14 -0
- package/README.md +22 -0
- package/dist/cli.js +75 -9
- package/dist/index.js +75 -9
- package/dist/runtime/functions/handler.d.ts +41 -3
- package/dist/runtime/functions/handler.d.ts.map +1 -1
- package/dist/runtime/index.d.ts +1 -1
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/node/load-config.d.ts +2 -0
- package/dist/runtime/node/load-config.d.ts.map +1 -1
- package/dist/runtime/node/load-functions.d.ts +8 -5
- package/dist/runtime/node/load-functions.d.ts.map +1 -1
- package/dist/runtime/types.d.ts +2 -2
- package/dist/runtime/types.d.ts.map +1 -1
- package/package.json +4 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.10.0](https://github.com/vibeunion/supacloud/compare/supacloud-lite-v0.9.2...supacloud-lite-v0.10.0) (2026-09-02)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* **lite:** support Elysia/Hono framework functions with function-local routing ([#1093](https://github.com/vibeunion/supacloud/issues/1093)) ([e92dbea](https://github.com/vibeunion/supacloud/commit/e92dbeaacb4386d17f64985b74f97b146090bbf9))
|
|
9
|
+
|
|
10
|
+
## [0.9.2](https://github.com/vibeunion/supacloud/compare/supacloud-lite-v0.9.1...supacloud-lite-v0.9.2) (2026-08-29)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
### Miscellaneous Chores
|
|
14
|
+
|
|
15
|
+
* **deps:** upgrade workspace dependencies and svadmin ([#1067](https://github.com/vibeunion/supacloud/issues/1067)) ([9cd8ed6](https://github.com/vibeunion/supacloud/commit/9cd8ed6e81f11da1b26bf491ca745b5599115cc0))
|
|
16
|
+
|
|
3
17
|
## [0.9.1](https://github.com/vibeunion/supacloud/compare/supacloud-lite-v0.9.0...supacloud-lite-v0.9.1) (2026-08-23)
|
|
4
18
|
|
|
5
19
|
|
package/README.md
CHANGED
|
@@ -74,6 +74,28 @@ supabase/
|
|
|
74
74
|
|
|
75
75
|
`config.toml` 当前支持 Auth、API schema/max rows、Storage bucket/size limit、seed 和 function entrypoint 等常用配置。
|
|
76
76
|
|
|
77
|
+
#### Function 框架契约(Elysia / Hono)
|
|
78
|
+
|
|
79
|
+
Function 默认导出除 fetch 函数与 `Deno.serve()` 外,也支持框架路由器对象——Elysia 实例(`handle()`)与 Hono 应用(`fetch()`),与 SupaCloud Edge Runtime 的契约一致:
|
|
80
|
+
|
|
81
|
+
```ts
|
|
82
|
+
// functions/api/index.ts
|
|
83
|
+
import { Elysia } from 'elysia'
|
|
84
|
+
|
|
85
|
+
export default new Elysia()
|
|
86
|
+
.get('/', () => ({ ok: true }))
|
|
87
|
+
.get('/cases/:id', ({ params }) => params)
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
框架路由器按 function-local 路径接收请求(`/functions/v1/api/cases/42` → `/cases/42`),与生产 Edge Runtime 的 `toFunctionLocalUrl` 行为一致;普通 fetch 函数与不带 `routes` 的 `{ fetch }` 对象保持原有完整 URL 不变。也可在 `config.toml` 显式声明:
|
|
91
|
+
|
|
92
|
+
```toml
|
|
93
|
+
[functions.api]
|
|
94
|
+
framework = "elysia" # fetch(默认)| elysia | hono
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
注意:浏览器预检(OPTIONS)会转发给框架应用,框架函数应自行挂载 CORS(如 `@elysiajs/cors`),与生产 Edge Runtime 行为一致。
|
|
98
|
+
|
|
77
99
|
#### Auth 运行方式
|
|
78
100
|
|
|
79
101
|
Lite 不下载、安装或启动独立的 GoTrue 进程。`/auth/v1/*` 由同一个 Bun 进程中的内置 Auth 实现处理,并与该 Lite 项目的 PGlite `auth` schema 共享生命周期;这避免了 sidecar 的配置、端口和会话一致性负担。
|
package/dist/cli.js
CHANGED
|
@@ -9,7 +9,7 @@ import { dirname as dirname7, join as join10, resolve as resolve5 } from "path";
|
|
|
9
9
|
// package.json
|
|
10
10
|
var package_default = {
|
|
11
11
|
name: "@supacloud/lite",
|
|
12
|
-
version: "0.
|
|
12
|
+
version: "0.10.0",
|
|
13
13
|
description: "Bun-native, single-project Supabase-compatible backend powered by PGlite or native PostgreSQL",
|
|
14
14
|
type: "module",
|
|
15
15
|
license: "Apache-2.0",
|
|
@@ -58,12 +58,13 @@ var package_default = {
|
|
|
58
58
|
typecheck: "bun x tsc --noEmit -p tsconfig.json"
|
|
59
59
|
},
|
|
60
60
|
dependencies: {
|
|
61
|
-
"@electric-sql/pglite": "0.5.
|
|
61
|
+
"@electric-sql/pglite": "0.5.8",
|
|
62
62
|
tar: "^7.5.22"
|
|
63
63
|
},
|
|
64
64
|
devDependencies: {
|
|
65
|
-
"@supabase/supabase-js": "^2.112.
|
|
65
|
+
"@supabase/supabase-js": "^2.112.4",
|
|
66
66
|
"@types/bun": "^1.4.0",
|
|
67
|
+
elysia: "^1.4.30",
|
|
67
68
|
typescript: "^7.0.2"
|
|
68
69
|
},
|
|
69
70
|
engines: {
|
|
@@ -2692,6 +2693,36 @@ async function upsertWithoutTtl(query, key, serializedValue) {
|
|
|
2692
2693
|
}
|
|
2693
2694
|
|
|
2694
2695
|
// src/runtime/functions/handler.ts
|
|
2696
|
+
function isLoadedFunction(value) {
|
|
2697
|
+
return typeof value === "object" && value !== null && "handler" in value;
|
|
2698
|
+
}
|
|
2699
|
+
function normalizeEntry(value) {
|
|
2700
|
+
return isLoadedFunction(value) ? value : { handler: value };
|
|
2701
|
+
}
|
|
2702
|
+
function isFrameworkRouterHandler(handler) {
|
|
2703
|
+
if (!handler || typeof handler !== "object")
|
|
2704
|
+
return false;
|
|
2705
|
+
const candidate = handler;
|
|
2706
|
+
if (candidate.__supacloud?.routeAware === true)
|
|
2707
|
+
return true;
|
|
2708
|
+
if (typeof candidate.handle === "function")
|
|
2709
|
+
return true;
|
|
2710
|
+
return Array.isArray(candidate.routes) && typeof candidate.fetch === "function";
|
|
2711
|
+
}
|
|
2712
|
+
function toFunctionLocalUrl(requestUrl) {
|
|
2713
|
+
const url = new URL(requestUrl);
|
|
2714
|
+
const publicRoute = url.pathname.match(/^\/functions\/v1\/[^/]+(\/.*)?$/);
|
|
2715
|
+
if (publicRoute) {
|
|
2716
|
+
url.pathname = publicRoute[1] || "/";
|
|
2717
|
+
return url.toString();
|
|
2718
|
+
}
|
|
2719
|
+
const internalRoute = url.pathname.match(/^\/[^/]+(\/.*)?$/);
|
|
2720
|
+
if (internalRoute) {
|
|
2721
|
+
url.pathname = internalRoute[1] || "/";
|
|
2722
|
+
}
|
|
2723
|
+
return url.toString();
|
|
2724
|
+
}
|
|
2725
|
+
|
|
2695
2726
|
class FunctionsHandler {
|
|
2696
2727
|
functions;
|
|
2697
2728
|
env;
|
|
@@ -2712,12 +2743,15 @@ class FunctionsHandler {
|
|
|
2712
2743
|
if (!name) {
|
|
2713
2744
|
return json2(404, { error: "function name required: /functions/v1/<name>" });
|
|
2714
2745
|
}
|
|
2715
|
-
const
|
|
2716
|
-
if (!
|
|
2746
|
+
const value = this.functions.get(name);
|
|
2747
|
+
if (!value) {
|
|
2717
2748
|
return json2(404, { error: `function "${name}" not found` });
|
|
2718
2749
|
}
|
|
2750
|
+
const entry = normalizeEntry(value);
|
|
2751
|
+
const routeAware = entry.framework !== undefined && entry.framework !== "fetch" || isFrameworkRouterHandler(entry.handler);
|
|
2752
|
+
const target = routeAware ? new Request(toFunctionLocalUrl(req.url), req) : req;
|
|
2719
2753
|
try {
|
|
2720
|
-
const invoke = () =>
|
|
2754
|
+
const invoke = () => this.invoke(entry.handler, target, ctx);
|
|
2721
2755
|
const res = await runWithDenoEnv(this.env, () => runWithPgredisCache(this.pgredis, invoke));
|
|
2722
2756
|
if (!(res instanceof Response)) {
|
|
2723
2757
|
return json2(500, { error: `function "${name}" did not return a Response` });
|
|
@@ -2728,6 +2762,18 @@ class FunctionsHandler {
|
|
|
2728
2762
|
return json2(500, { error: message });
|
|
2729
2763
|
}
|
|
2730
2764
|
}
|
|
2765
|
+
invoke(handler, req, ctx) {
|
|
2766
|
+
if (typeof handler === "function") {
|
|
2767
|
+
return Promise.resolve(handler(req, { auth: ctx, env: this.env }));
|
|
2768
|
+
}
|
|
2769
|
+
if (typeof handler.handle === "function") {
|
|
2770
|
+
return Promise.resolve(handler.handle.call(handler, req));
|
|
2771
|
+
}
|
|
2772
|
+
if (typeof handler.fetch === "function") {
|
|
2773
|
+
return Promise.resolve(handler.fetch.call(handler, req));
|
|
2774
|
+
}
|
|
2775
|
+
throw new Error("function handler must be a function or an object with handle()/fetch()");
|
|
2776
|
+
}
|
|
2731
2777
|
}
|
|
2732
2778
|
function json2(status, body) {
|
|
2733
2779
|
return new Response(JSON.stringify(body), {
|
|
@@ -12656,6 +12702,14 @@ function readFunctions(root) {
|
|
|
12656
12702
|
const entrypoint = getString(t, "entrypoint");
|
|
12657
12703
|
if (entrypoint !== undefined)
|
|
12658
12704
|
opts.entrypoint = entrypoint;
|
|
12705
|
+
const framework = getString(t, "framework");
|
|
12706
|
+
if (framework !== undefined) {
|
|
12707
|
+
if (framework === "fetch" || framework === "elysia" || framework === "hono") {
|
|
12708
|
+
opts.framework = framework;
|
|
12709
|
+
} else {
|
|
12710
|
+
console.warn(` warning: [functions.${name}] framework "${framework}" is not one of fetch/elysia/hono; falling back to fetch`);
|
|
12711
|
+
}
|
|
12712
|
+
}
|
|
12659
12713
|
out[name] = opts;
|
|
12660
12714
|
}
|
|
12661
12715
|
return out;
|
|
@@ -12766,6 +12820,15 @@ async function loadFunctionEnv(projectDir) {
|
|
|
12766
12820
|
}
|
|
12767
12821
|
return env;
|
|
12768
12822
|
}
|
|
12823
|
+
var FUNCTION_FRAMEWORKS = new Set(["fetch", "elysia", "hono"]);
|
|
12824
|
+
function resolveFramework(name, value) {
|
|
12825
|
+
if (value === undefined)
|
|
12826
|
+
return;
|
|
12827
|
+
if (FUNCTION_FRAMEWORKS.has(value))
|
|
12828
|
+
return value;
|
|
12829
|
+
console.warn(` warning: function "${name}" has unsupported framework "${value}", expected one of fetch/elysia/hono; falling back to fetch`);
|
|
12830
|
+
return;
|
|
12831
|
+
}
|
|
12769
12832
|
var loadQueue = Promise.resolve();
|
|
12770
12833
|
async function loadFunctions2(projectDir, options = {}) {
|
|
12771
12834
|
let releaseQueue;
|
|
@@ -12820,11 +12883,14 @@ async function loadFunctionsUnlocked(projectDir, options) {
|
|
|
12820
12883
|
const mod = await import(importUrl);
|
|
12821
12884
|
const denoHandler = takeCapturedHandler();
|
|
12822
12885
|
const defaultExport = mod.default;
|
|
12823
|
-
const handler = typeof defaultExport === "function" ? defaultExport : defaultExport && typeof defaultExport.
|
|
12886
|
+
const handler = typeof defaultExport === "function" ? defaultExport : defaultExport && (typeof defaultExport.handle === "function" || typeof defaultExport.fetch === "function") ? defaultExport : denoHandler ? (req) => denoHandler(req) : undefined;
|
|
12824
12887
|
if (handler) {
|
|
12825
|
-
functions.set(name,
|
|
12888
|
+
functions.set(name, {
|
|
12889
|
+
handler,
|
|
12890
|
+
framework: resolveFramework(name, options[name]?.framework)
|
|
12891
|
+
});
|
|
12826
12892
|
} else {
|
|
12827
|
-
console.warn(` warning: function "${name}" has no default function, fetch object, or Deno.serve() handler, skipped`);
|
|
12893
|
+
console.warn(` warning: function "${name}" has no default function, handle/fetch object, or Deno.serve() handler, skipped`);
|
|
12828
12894
|
}
|
|
12829
12895
|
} catch (e) {
|
|
12830
12896
|
const msg = e instanceof Error ? e.message : String(e);
|
package/dist/index.js
CHANGED
|
@@ -85,7 +85,7 @@ function randomToken(bytes = 32) {
|
|
|
85
85
|
// package.json
|
|
86
86
|
var package_default = {
|
|
87
87
|
name: "@supacloud/lite",
|
|
88
|
-
version: "0.
|
|
88
|
+
version: "0.10.0",
|
|
89
89
|
description: "Bun-native, single-project Supabase-compatible backend powered by PGlite or native PostgreSQL",
|
|
90
90
|
type: "module",
|
|
91
91
|
license: "Apache-2.0",
|
|
@@ -134,12 +134,13 @@ var package_default = {
|
|
|
134
134
|
typecheck: "bun x tsc --noEmit -p tsconfig.json"
|
|
135
135
|
},
|
|
136
136
|
dependencies: {
|
|
137
|
-
"@electric-sql/pglite": "0.5.
|
|
137
|
+
"@electric-sql/pglite": "0.5.8",
|
|
138
138
|
tar: "^7.5.22"
|
|
139
139
|
},
|
|
140
140
|
devDependencies: {
|
|
141
|
-
"@supabase/supabase-js": "^2.112.
|
|
141
|
+
"@supabase/supabase-js": "^2.112.4",
|
|
142
142
|
"@types/bun": "^1.4.0",
|
|
143
|
+
elysia: "^1.4.30",
|
|
143
144
|
typescript: "^7.0.2"
|
|
144
145
|
},
|
|
145
146
|
engines: {
|
|
@@ -2696,6 +2697,36 @@ async function upsertWithoutTtl(query, key, serializedValue) {
|
|
|
2696
2697
|
}
|
|
2697
2698
|
|
|
2698
2699
|
// src/runtime/functions/handler.ts
|
|
2700
|
+
function isLoadedFunction(value) {
|
|
2701
|
+
return typeof value === "object" && value !== null && "handler" in value;
|
|
2702
|
+
}
|
|
2703
|
+
function normalizeEntry(value) {
|
|
2704
|
+
return isLoadedFunction(value) ? value : { handler: value };
|
|
2705
|
+
}
|
|
2706
|
+
function isFrameworkRouterHandler(handler) {
|
|
2707
|
+
if (!handler || typeof handler !== "object")
|
|
2708
|
+
return false;
|
|
2709
|
+
const candidate = handler;
|
|
2710
|
+
if (candidate.__supacloud?.routeAware === true)
|
|
2711
|
+
return true;
|
|
2712
|
+
if (typeof candidate.handle === "function")
|
|
2713
|
+
return true;
|
|
2714
|
+
return Array.isArray(candidate.routes) && typeof candidate.fetch === "function";
|
|
2715
|
+
}
|
|
2716
|
+
function toFunctionLocalUrl(requestUrl) {
|
|
2717
|
+
const url = new URL(requestUrl);
|
|
2718
|
+
const publicRoute = url.pathname.match(/^\/functions\/v1\/[^/]+(\/.*)?$/);
|
|
2719
|
+
if (publicRoute) {
|
|
2720
|
+
url.pathname = publicRoute[1] || "/";
|
|
2721
|
+
return url.toString();
|
|
2722
|
+
}
|
|
2723
|
+
const internalRoute = url.pathname.match(/^\/[^/]+(\/.*)?$/);
|
|
2724
|
+
if (internalRoute) {
|
|
2725
|
+
url.pathname = internalRoute[1] || "/";
|
|
2726
|
+
}
|
|
2727
|
+
return url.toString();
|
|
2728
|
+
}
|
|
2729
|
+
|
|
2699
2730
|
class FunctionsHandler {
|
|
2700
2731
|
functions;
|
|
2701
2732
|
env;
|
|
@@ -2716,12 +2747,15 @@ class FunctionsHandler {
|
|
|
2716
2747
|
if (!name) {
|
|
2717
2748
|
return json2(404, { error: "function name required: /functions/v1/<name>" });
|
|
2718
2749
|
}
|
|
2719
|
-
const
|
|
2720
|
-
if (!
|
|
2750
|
+
const value = this.functions.get(name);
|
|
2751
|
+
if (!value) {
|
|
2721
2752
|
return json2(404, { error: `function "${name}" not found` });
|
|
2722
2753
|
}
|
|
2754
|
+
const entry = normalizeEntry(value);
|
|
2755
|
+
const routeAware = entry.framework !== undefined && entry.framework !== "fetch" || isFrameworkRouterHandler(entry.handler);
|
|
2756
|
+
const target = routeAware ? new Request(toFunctionLocalUrl(req.url), req) : req;
|
|
2723
2757
|
try {
|
|
2724
|
-
const invoke = () =>
|
|
2758
|
+
const invoke = () => this.invoke(entry.handler, target, ctx);
|
|
2725
2759
|
const res = await runWithDenoEnv(this.env, () => runWithPgredisCache(this.pgredis, invoke));
|
|
2726
2760
|
if (!(res instanceof Response)) {
|
|
2727
2761
|
return json2(500, { error: `function "${name}" did not return a Response` });
|
|
@@ -2732,6 +2766,18 @@ class FunctionsHandler {
|
|
|
2732
2766
|
return json2(500, { error: message });
|
|
2733
2767
|
}
|
|
2734
2768
|
}
|
|
2769
|
+
invoke(handler, req, ctx) {
|
|
2770
|
+
if (typeof handler === "function") {
|
|
2771
|
+
return Promise.resolve(handler(req, { auth: ctx, env: this.env }));
|
|
2772
|
+
}
|
|
2773
|
+
if (typeof handler.handle === "function") {
|
|
2774
|
+
return Promise.resolve(handler.handle.call(handler, req));
|
|
2775
|
+
}
|
|
2776
|
+
if (typeof handler.fetch === "function") {
|
|
2777
|
+
return Promise.resolve(handler.fetch.call(handler, req));
|
|
2778
|
+
}
|
|
2779
|
+
throw new Error("function handler must be a function or an object with handle()/fetch()");
|
|
2780
|
+
}
|
|
2735
2781
|
}
|
|
2736
2782
|
function json2(status, body) {
|
|
2737
2783
|
return new Response(JSON.stringify(body), {
|
|
@@ -12404,6 +12450,14 @@ function readFunctions(root) {
|
|
|
12404
12450
|
const entrypoint = getString(t, "entrypoint");
|
|
12405
12451
|
if (entrypoint !== undefined)
|
|
12406
12452
|
opts.entrypoint = entrypoint;
|
|
12453
|
+
const framework = getString(t, "framework");
|
|
12454
|
+
if (framework !== undefined) {
|
|
12455
|
+
if (framework === "fetch" || framework === "elysia" || framework === "hono") {
|
|
12456
|
+
opts.framework = framework;
|
|
12457
|
+
} else {
|
|
12458
|
+
console.warn(` warning: [functions.${name}] framework "${framework}" is not one of fetch/elysia/hono; falling back to fetch`);
|
|
12459
|
+
}
|
|
12460
|
+
}
|
|
12407
12461
|
out[name] = opts;
|
|
12408
12462
|
}
|
|
12409
12463
|
return out;
|
|
@@ -12514,6 +12568,15 @@ async function loadFunctionEnv(projectDir) {
|
|
|
12514
12568
|
}
|
|
12515
12569
|
return env;
|
|
12516
12570
|
}
|
|
12571
|
+
var FUNCTION_FRAMEWORKS = new Set(["fetch", "elysia", "hono"]);
|
|
12572
|
+
function resolveFramework(name, value) {
|
|
12573
|
+
if (value === undefined)
|
|
12574
|
+
return;
|
|
12575
|
+
if (FUNCTION_FRAMEWORKS.has(value))
|
|
12576
|
+
return value;
|
|
12577
|
+
console.warn(` warning: function "${name}" has unsupported framework "${value}", expected one of fetch/elysia/hono; falling back to fetch`);
|
|
12578
|
+
return;
|
|
12579
|
+
}
|
|
12517
12580
|
var loadQueue = Promise.resolve();
|
|
12518
12581
|
async function loadFunctions2(projectDir, options = {}) {
|
|
12519
12582
|
let releaseQueue;
|
|
@@ -12568,11 +12631,14 @@ async function loadFunctionsUnlocked(projectDir, options) {
|
|
|
12568
12631
|
const mod = await import(importUrl);
|
|
12569
12632
|
const denoHandler = takeCapturedHandler();
|
|
12570
12633
|
const defaultExport = mod.default;
|
|
12571
|
-
const handler = typeof defaultExport === "function" ? defaultExport : defaultExport && typeof defaultExport.
|
|
12634
|
+
const handler = typeof defaultExport === "function" ? defaultExport : defaultExport && (typeof defaultExport.handle === "function" || typeof defaultExport.fetch === "function") ? defaultExport : denoHandler ? (req) => denoHandler(req) : undefined;
|
|
12572
12635
|
if (handler) {
|
|
12573
|
-
functions.set(name,
|
|
12636
|
+
functions.set(name, {
|
|
12637
|
+
handler,
|
|
12638
|
+
framework: resolveFramework(name, options[name]?.framework)
|
|
12639
|
+
});
|
|
12574
12640
|
} else {
|
|
12575
|
-
console.warn(` warning: function "${name}" has no default function, fetch object, or Deno.serve() handler, skipped`);
|
|
12641
|
+
console.warn(` warning: function "${name}" has no default function, handle/fetch object, or Deno.serve() handler, skipped`);
|
|
12576
12642
|
}
|
|
12577
12643
|
} catch (e) {
|
|
12578
12644
|
const msg = e instanceof Error ? e.message : String(e);
|
|
@@ -2,14 +2,43 @@
|
|
|
2
2
|
* Edge Functions (/functions/v1/*) - supabase.functions.invoke() support.
|
|
3
3
|
*
|
|
4
4
|
* A "function" is any fetch handler: (Request) => Response | Promise<Response>.
|
|
5
|
+
* Framework router objects (Elysia `app.handle()`, Hono `app.fetch()`) are
|
|
6
|
+
* supported too, aligned with the SupaCloud Edge Runtime contract: route-aware
|
|
7
|
+
* handlers receive a function-local URL (`/functions/v1/<name>/a/b` -> `/a/b`).
|
|
5
8
|
* The core takes a name → handler map (portable, works in the browser); the
|
|
6
9
|
* Node CLI populates it from supabase/functions/<name>/index.{ts,js,mjs}
|
|
7
|
-
* modules that `export default` a
|
|
10
|
+
* modules that `export default` a handler.
|
|
8
11
|
*/
|
|
9
12
|
import type { RequestContext } from '../types.js';
|
|
10
13
|
import { type PgredisCache } from './pgredis.js';
|
|
11
14
|
/** An edge function: a fetch handler invoked with the resolved request context. */
|
|
12
15
|
export type EdgeFunction = (req: Request, ctx: FunctionContext) => Response | Promise<Response>;
|
|
16
|
+
/** Frameworks whose router objects own the path below /functions/v1/<name>. */
|
|
17
|
+
export type FunctionFramework = 'fetch' | 'elysia' | 'hono';
|
|
18
|
+
/**
|
|
19
|
+
* A framework router export, e.g. an Elysia instance (`handle()`) or a Hono /
|
|
20
|
+
* Itty router (`fetch()`). Object handlers receive only the Request.
|
|
21
|
+
*/
|
|
22
|
+
export interface FrameworkObjectHandler {
|
|
23
|
+
handle?: (req: Request) => Response | Promise<Response>;
|
|
24
|
+
fetch?: (req: Request) => Response | Promise<Response>;
|
|
25
|
+
/** Router route table (Elysia exposes one); marks the handler route-aware. */
|
|
26
|
+
routes?: unknown;
|
|
27
|
+
/** Explicit marker emitted by framework adapters. */
|
|
28
|
+
__supacloud?: {
|
|
29
|
+
routeAware?: boolean;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/** Anything registerable as a function: plain fetch handler or router object. */
|
|
33
|
+
export type FunctionHandler = EdgeFunction | FrameworkObjectHandler;
|
|
34
|
+
/** A loaded function plus its declared framework profile. */
|
|
35
|
+
export interface LoadedFunction {
|
|
36
|
+
handler: FunctionHandler;
|
|
37
|
+
/** config.toml [functions.<name>].framework; `fetch` keeps legacy routing. */
|
|
38
|
+
framework?: FunctionFramework;
|
|
39
|
+
}
|
|
40
|
+
/** Registry value: a bare handler or a {@link LoadedFunction} entry. */
|
|
41
|
+
export type FunctionRegistryValue = FunctionHandler | LoadedFunction;
|
|
13
42
|
/** Second argument passed to every {@link EdgeFunction} invocation. */
|
|
14
43
|
export interface FunctionContext {
|
|
15
44
|
/** verified request context (role + JWT claims) resolved by the router */
|
|
@@ -22,17 +51,26 @@ export interface FunctionContext {
|
|
|
22
51
|
[key: string]: string;
|
|
23
52
|
};
|
|
24
53
|
}
|
|
54
|
+
/** Mirrors the Edge Runtime: router objects and marked handlers own sub-paths. */
|
|
55
|
+
export declare function isFrameworkRouterHandler(handler: unknown): boolean;
|
|
56
|
+
/**
|
|
57
|
+
* Strip the function prefix so framework routers see their own route table:
|
|
58
|
+
* /functions/v1/<name>/a/b -> /a/b (and /functions/v1/<name> -> /).
|
|
59
|
+
* Matches the Edge Runtime's toFunctionLocalUrl().
|
|
60
|
+
*/
|
|
61
|
+
export declare function toFunctionLocalUrl(requestUrl: string): string;
|
|
25
62
|
/** Registry and dispatcher for edge functions, backing supabase.functions.invoke(). */
|
|
26
63
|
export declare class FunctionsHandler {
|
|
27
64
|
private functions;
|
|
28
65
|
private env;
|
|
29
66
|
private pgredis;
|
|
30
|
-
constructor(functions: Map<string,
|
|
67
|
+
constructor(functions: Map<string, FunctionRegistryValue>, env: FunctionContext['env'], pgredis: PgredisCache);
|
|
31
68
|
/** Register (or replace) a function under `name`, served at /functions/v1/<name>. */
|
|
32
|
-
register(name: string, fn:
|
|
69
|
+
register(name: string, fn: FunctionRegistryValue): void;
|
|
33
70
|
/** Names of all registered functions. */
|
|
34
71
|
list(): string[];
|
|
35
72
|
/** Dispatch a /functions/v1/<name> request to its handler, returning a 404 when unknown and a 500 when the handler throws or returns a non-Response. */
|
|
36
73
|
handle(req: Request, ctx: RequestContext, url: URL): Promise<Response>;
|
|
74
|
+
private invoke;
|
|
37
75
|
}
|
|
38
76
|
//# sourceMappingURL=handler.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/runtime/functions/handler.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/runtime/functions/handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEjD,OAAO,EAAE,KAAK,YAAY,EAAuB,MAAM,cAAc,CAAA;AAErE,mFAAmF;AACnF,MAAM,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,eAAe,KAAK,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;AAE/F,+EAA+E;AAC/E,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAA;AAE3D;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACrC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IACvD,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IACtD,8EAA8E;IAC9E,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,qDAAqD;IACrD,WAAW,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,CAAA;CACvC;AAED,iFAAiF;AACjF,MAAM,MAAM,eAAe,GAAG,YAAY,GAAG,sBAAsB,CAAA;AAEnE,6DAA6D;AAC7D,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,eAAe,CAAA;IACxB,8EAA8E;IAC9E,SAAS,CAAC,EAAE,iBAAiB,CAAA;CAC9B;AAED,wEAAwE;AACxE,MAAM,MAAM,qBAAqB,GAAG,eAAe,GAAG,cAAc,CAAA;AAEpE,uEAAuE;AACvE,MAAM,WAAW,eAAe;IAC9B,0EAA0E;IAC1E,IAAI,EAAE,cAAc,CAAA;IACpB,4HAA4H;IAC5H,GAAG,EAAE;QACH,YAAY,EAAE,MAAM,CAAA;QACpB,iBAAiB,EAAE,MAAM,CAAA;QACzB,yBAAyB,EAAE,MAAM,CAAA;QACjC,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KACtB,CAAA;CACF;AAUD,kFAAkF;AAClF,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAMlE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAY7D;AAED,uFAAuF;AACvF,qBAAa,gBAAgB;IAEzB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,OAAO;IAHjB,YACU,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,qBAAqB,CAAC,EAC7C,GAAG,EAAE,eAAe,CAAC,KAAK,CAAC,EAC3B,OAAO,EAAE,YAAY,EAC3B;IAEJ,qFAAqF;IACrF,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,qBAAqB,GAAG,IAAI,CAEtD;IAED,yCAAyC;IACzC,IAAI,IAAI,MAAM,EAAE,CAEf;IAED,wJAAwJ;IAClJ,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CA4B3E;IAED,OAAO,CAAC,MAAM;CAYf"}
|
package/dist/runtime/index.d.ts
CHANGED
|
@@ -18,7 +18,7 @@ export { SmsInbox, type SmsInboxEntry } from './auth/sms-inbox.js';
|
|
|
18
18
|
export { LogBuffer, type LogEntry, type LogLevel } from './log-buffer.js';
|
|
19
19
|
export { RealtimeEngine, type RealtimeSocketLike } from './realtime/engine.js';
|
|
20
20
|
export { signJwt, verifyJwt, decodeJwt } from './jwt.js';
|
|
21
|
-
export { FunctionsHandler, type EdgeFunction, type FunctionContext } from './functions/handler.js';
|
|
21
|
+
export { FunctionsHandler, isFrameworkRouterHandler, toFunctionLocalUrl, type EdgeFunction, type FrameworkObjectHandler, type FunctionContext, type FunctionFramework, type FunctionHandler, type FunctionRegistryValue, type LoadedFunction, } from './functions/handler.js';
|
|
22
22
|
export { type PgredisCacheBinding } from './functions/pgredis.js';
|
|
23
23
|
export { generateTypes } from './gen-types.js';
|
|
24
24
|
export { installDenoShim } from './functions/deno-shim.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAE9C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,gBAAgB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -76,6 +76,8 @@ export interface FunctionOptions {
|
|
|
76
76
|
verifyJwt?: boolean;
|
|
77
77
|
/** [functions.<name>].entrypoint, relative to the project root */
|
|
78
78
|
entrypoint?: string;
|
|
79
|
+
/** [functions.<name>].framework: fetch (default), elysia, or hono */
|
|
80
|
+
framework?: import('../functions/handler.js').FunctionFramework;
|
|
79
81
|
}
|
|
80
82
|
/** Parse supabase/config.toml once and project it into a {@link ProjectConfig}. */
|
|
81
83
|
export declare function loadProjectConfig(projectDir: string, env?: Environment): ProjectConfig;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load-config.d.ts","sourceRoot":"","sources":["../../../src/runtime/node/load-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,EAUL,KAAK,WAAW,EACjB,MAAM,kBAAkB,CAAA;AAEzB,oFAAoF;AACpF,MAAM,WAAW,aAAa;IAC5B,0EAA0E;IAC1E,IAAI,EAAE,UAAU,CAAA;IAChB,mDAAmD;IACnD,GAAG,EAAE,SAAS,CAAA;IACd,kEAAkE;IAClE,OAAO,EAAE,aAAa,CAAA;IACtB,gDAAgD;IAChD,IAAI,EAAE,UAAU,CAAA;IAChB,uEAAuE;IACvE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAA;CAC3C;AAED,yFAAyF;AACzF,MAAM,WAAW,UAAU;IACzB,uDAAuD;IACvD,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,4EAA4E;IAC5E,QAAQ,EAAE,OAAO,CAAC,YAAY,CAAC,CAAA;IAC/B,sBAAsB;IACtB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,iCAAiC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,sCAAsC;IACtC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;IAC1C,uCAAuC;IACvC,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,kDAAkD;IAClD,wBAAwB,CAAC,EAAE,MAAM,CAAA;IACjC,mEAAmE;IACnE,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAA;CACpD;AAED,wCAAwC;AACxC,MAAM,WAAW,SAAS;IACxB,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,wCAAwC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,4CAA4C;AAC5C,MAAM,WAAW,aAAa;IAC5B,+DAA+D;IAC/D,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,qDAAqD;IACrD,OAAO,CAAC,EAAE,UAAU,EAAE,CAAA;CACvB;AAED,4CAA4C;AAC5C,MAAM,WAAW,UAAU;IACzB,wBAAwB;IACxB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,kEAAkE;IAClE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;CACjB;AAED,iDAAiD;AACjD,MAAM,WAAW,eAAe;IAC9B,iCAAiC;IACjC,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,oCAAoC;IACpC,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"load-config.d.ts","sourceRoot":"","sources":["../../../src/runtime/node/load-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,EAUL,KAAK,WAAW,EACjB,MAAM,kBAAkB,CAAA;AAEzB,oFAAoF;AACpF,MAAM,WAAW,aAAa;IAC5B,0EAA0E;IAC1E,IAAI,EAAE,UAAU,CAAA;IAChB,mDAAmD;IACnD,GAAG,EAAE,SAAS,CAAA;IACd,kEAAkE;IAClE,OAAO,EAAE,aAAa,CAAA;IACtB,gDAAgD;IAChD,IAAI,EAAE,UAAU,CAAA;IAChB,uEAAuE;IACvE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAA;CAC3C;AAED,yFAAyF;AACzF,MAAM,WAAW,UAAU;IACzB,uDAAuD;IACvD,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,4EAA4E;IAC5E,QAAQ,EAAE,OAAO,CAAC,YAAY,CAAC,CAAA;IAC/B,sBAAsB;IACtB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,iCAAiC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,sCAAsC;IACtC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;IAC1C,uCAAuC;IACvC,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,kDAAkD;IAClD,wBAAwB,CAAC,EAAE,MAAM,CAAA;IACjC,mEAAmE;IACnE,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAA;CACpD;AAED,wCAAwC;AACxC,MAAM,WAAW,SAAS;IACxB,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,wCAAwC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,4CAA4C;AAC5C,MAAM,WAAW,aAAa;IAC5B,+DAA+D;IAC/D,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,qDAAqD;IACrD,OAAO,CAAC,EAAE,UAAU,EAAE,CAAA;CACvB;AAED,4CAA4C;AAC5C,MAAM,WAAW,UAAU;IACzB,wBAAwB;IACxB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,kEAAkE;IAClE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;CACjB;AAED,iDAAiD;AACjD,MAAM,WAAW,eAAe;IAC9B,iCAAiC;IACjC,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,oCAAoC;IACpC,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,qEAAqE;IACrE,SAAS,CAAC,EAAE,OAAO,yBAAyB,EAAE,iBAAiB,CAAA;CAChE;AAED,mFAAmF;AACnF,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,GAAE,WAAyB,GAAG,aAAa,CASnG"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { FunctionFramework, LoadedFunction } from '../functions/handler.js';
|
|
2
2
|
/**
|
|
3
3
|
* Load edge-function secrets from supabase/functions/.env (KEY=VALUE lines,
|
|
4
4
|
* `#` comments). These are exposed to functions via Deno.env and ctx.env -
|
|
@@ -11,15 +11,18 @@ export interface LoadFunctionOptions {
|
|
|
11
11
|
enabled?: boolean;
|
|
12
12
|
/** Custom entrypoint path, relative to the project root. */
|
|
13
13
|
entrypoint?: string;
|
|
14
|
+
/** Framework profile: fetch (default, legacy routing), elysia, or hono. */
|
|
15
|
+
framework?: FunctionFramework;
|
|
14
16
|
}
|
|
15
17
|
/**
|
|
16
18
|
* Discover and load every edge function under supabase/functions/, keyed by
|
|
17
19
|
* directory name. Dirs starting with `_` or `.` are skipped (shared code), as
|
|
18
20
|
* are functions disabled in config.toml. Each function is bundled with esbuild
|
|
19
21
|
* when available (falling back to a plain import), then its handler is taken
|
|
20
|
-
* from a default function export, a default `{ fetch() }`
|
|
21
|
-
* `Deno.serve()` call.
|
|
22
|
-
*
|
|
22
|
+
* from a default function export, a default `{ fetch() }` / `{ handle() }`
|
|
23
|
+
* object export (Elysia/Hono routers), or a captured `Deno.serve()` call.
|
|
24
|
+
* Load failures warn and skip rather than throwing, so one broken function
|
|
25
|
+
* can't block startup.
|
|
23
26
|
*/
|
|
24
|
-
export declare function loadFunctions(projectDir: string, options?: Record<string, LoadFunctionOptions>): Promise<Map<string,
|
|
27
|
+
export declare function loadFunctions(projectDir: string, options?: Record<string, LoadFunctionOptions>): Promise<Map<string, LoadedFunction>>;
|
|
25
28
|
//# sourceMappingURL=load-functions.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load-functions.d.ts","sourceRoot":"","sources":["../../../src/runtime/node/load-functions.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"load-functions.d.ts","sourceRoot":"","sources":["../../../src/runtime/node/load-functions.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAwC,iBAAiB,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAItH;;;;GAIG;AACH,wBAAsB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAqBzF;AAED,gEAAgE;AAChE,MAAM,WAAW,mBAAmB;IAClC,6CAA6C;IAC7C,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,4DAA4D;IAC5D,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,2EAA2E;IAC3E,SAAS,CAAC,EAAE,iBAAiB,CAAA;CAC9B;AAaD;;;;;;;;;GASG;AACH,wBAAsB,aAAa,CACjC,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAM,GAChD,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAYtC"}
|
package/dist/runtime/types.d.ts
CHANGED
|
@@ -75,8 +75,8 @@ export interface BackendConfig {
|
|
|
75
75
|
seedSql?: string;
|
|
76
76
|
/** Where object storage bytes live. Default: in-memory. Node CLI passes a fs driver. */
|
|
77
77
|
storageDriver?: StorageDriver;
|
|
78
|
-
/** Edge functions: name → fetch handler, served at /functions/v1/<name>. */
|
|
79
|
-
functions?: Map<string, import('./functions/handler.js').
|
|
78
|
+
/** Edge functions: name → fetch handler or framework router (Elysia/Hono), served at /functions/v1/<name>. */
|
|
79
|
+
functions?: Map<string, import('./functions/handler.js').FunctionRegistryValue> | Record<string, import('./functions/handler.js').FunctionRegistryValue>;
|
|
80
80
|
/** Per-function JWT verification setting from config.toml; false makes the function public. */
|
|
81
81
|
functionVerifyJwt?: Record<string, boolean>;
|
|
82
82
|
/** Extra env/secrets exposed to functions via Deno.env and ctx.env (e.g. from supabase/functions/.env). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/runtime/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAEzC,yFAAyF;AACzF,MAAM,WAAW,aAAa;IAC5B,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAA;IACZ,8CAA8C;IAC9C,GAAG,EAAE,MAAM,CAAA;CACZ;AAED;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,gBAAgB,EAAE,QAAQ,CAAA;IAC1C,uFAAuF;IACvF,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;IACpB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC,OAAO,oBAAoB,EAAE,YAAY,CAAC,CAAA;IACjE;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,gHAAgH;IAChH,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,kEAAkE;IAClE,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB,6EAA6E;IAC7E,UAAU,CAAC,EAAE,aAAa,EAAE,CAAA;IAC5B,8EAA8E;IAC9E,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,wFAAwF;IACxF,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/runtime/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@supacloud/lite",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.0",
|
|
4
4
|
"description": "Bun-native, single-project Supabase-compatible backend powered by PGlite or native PostgreSQL",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -49,12 +49,13 @@
|
|
|
49
49
|
"typecheck": "bun x tsc --noEmit -p tsconfig.json"
|
|
50
50
|
},
|
|
51
51
|
"dependencies": {
|
|
52
|
-
"@electric-sql/pglite": "0.5.
|
|
52
|
+
"@electric-sql/pglite": "0.5.8",
|
|
53
53
|
"tar": "^7.5.22"
|
|
54
54
|
},
|
|
55
55
|
"devDependencies": {
|
|
56
|
-
"@supabase/supabase-js": "^2.112.
|
|
56
|
+
"@supabase/supabase-js": "^2.112.4",
|
|
57
57
|
"@types/bun": "^1.4.0",
|
|
58
|
+
"elysia": "^1.4.30",
|
|
58
59
|
"typescript": "^7.0.2"
|
|
59
60
|
},
|
|
60
61
|
"engines": {
|