@visiblebase/core 0.2.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/README.md +127 -0
- package/bin/core/auth/authenticator.d.ts +68 -0
- package/bin/core/auth/authenticator.d.ts.map +1 -0
- package/bin/core/auth/authenticator.js +106 -0
- package/bin/core/auth/authenticator.js.map +1 -0
- package/bin/core/auth/token-signer.d.ts +27 -0
- package/bin/core/auth/token-signer.d.ts.map +1 -0
- package/bin/core/auth/token-signer.js +116 -0
- package/bin/core/auth/token-signer.js.map +1 -0
- package/bin/core/auth/types.d.ts +94 -0
- package/bin/core/auth/types.d.ts.map +1 -0
- package/bin/core/auth/types.js +7 -0
- package/bin/core/auth/types.js.map +1 -0
- package/bin/core/base/base.d.ts +98 -0
- package/bin/core/base/base.d.ts.map +1 -0
- package/bin/core/base/base.js +281 -0
- package/bin/core/base/base.js.map +1 -0
- package/bin/core/runtime.d.ts +112 -0
- package/bin/core/runtime.d.ts.map +1 -0
- package/bin/core/runtime.js +19 -0
- package/bin/core/runtime.js.map +1 -0
- package/bin/core/types.d.ts +39 -0
- package/bin/core/types.d.ts.map +1 -0
- package/bin/core/types.js +7 -0
- package/bin/core/types.js.map +1 -0
- package/bin/index.d.ts +39 -0
- package/bin/index.d.ts.map +1 -0
- package/bin/index.js +45 -0
- package/bin/index.js.map +1 -0
- package/bin/service/ai/ai-service.d.ts +80 -0
- package/bin/service/ai/ai-service.d.ts.map +1 -0
- package/bin/service/ai/ai-service.js +184 -0
- package/bin/service/ai/ai-service.js.map +1 -0
- package/bin/service/ai/provider.d.ts +77 -0
- package/bin/service/ai/provider.d.ts.map +1 -0
- package/bin/service/ai/provider.js +71 -0
- package/bin/service/ai/provider.js.map +1 -0
- package/bin/service/ai/types.d.ts +72 -0
- package/bin/service/ai/types.d.ts.map +1 -0
- package/bin/service/ai/types.js +7 -0
- package/bin/service/ai/types.js.map +1 -0
- package/bin/service/env/env-service.d.ts +14 -0
- package/bin/service/env/env-service.d.ts.map +1 -0
- package/bin/service/env/env-service.js +42 -0
- package/bin/service/env/env-service.js.map +1 -0
- package/bin/service/env/env-store.d.ts +15 -0
- package/bin/service/env/env-store.d.ts.map +1 -0
- package/bin/service/env/env-store.js +35 -0
- package/bin/service/env/env-store.js.map +1 -0
- package/bin/service/env/schema.d.ts +171 -0
- package/bin/service/env/schema.d.ts.map +1 -0
- package/bin/service/env/schema.js +52 -0
- package/bin/service/env/schema.js.map +1 -0
- package/bin/service/env/types.d.ts +37 -0
- package/bin/service/env/types.d.ts.map +1 -0
- package/bin/service/env/types.js +8 -0
- package/bin/service/env/types.js.map +1 -0
- package/bin/service/hook.d.ts +20 -0
- package/bin/service/hook.d.ts.map +1 -0
- package/bin/service/hook.js +52 -0
- package/bin/service/hook.js.map +1 -0
- package/bin/service/plugin.d.ts +141 -0
- package/bin/service/plugin.d.ts.map +1 -0
- package/bin/service/plugin.js +124 -0
- package/bin/service/plugin.js.map +1 -0
- package/bin/service/products/product-store.d.ts +17 -0
- package/bin/service/products/product-store.d.ts.map +1 -0
- package/bin/service/products/product-store.js +49 -0
- package/bin/service/products/product-store.js.map +1 -0
- package/bin/service/products/products-service.d.ts +16 -0
- package/bin/service/products/products-service.d.ts.map +1 -0
- package/bin/service/products/products-service.js +52 -0
- package/bin/service/products/products-service.js.map +1 -0
- package/bin/service/products/schema.d.ts +207 -0
- package/bin/service/products/schema.d.ts.map +1 -0
- package/bin/service/products/schema.js +60 -0
- package/bin/service/products/schema.js.map +1 -0
- package/bin/service/products/types.d.ts +51 -0
- package/bin/service/products/types.d.ts.map +1 -0
- package/bin/service/products/types.js +7 -0
- package/bin/service/products/types.js.map +1 -0
- package/bin/service/service.d.ts +118 -0
- package/bin/service/service.d.ts.map +1 -0
- package/bin/service/service.js +114 -0
- package/bin/service/service.js.map +1 -0
- package/bin/service/types.d.ts +17 -0
- package/bin/service/types.d.ts.map +1 -0
- package/bin/service/types.js +5 -0
- package/bin/service/types.js.map +1 -0
- package/bin/store/db.d.ts +64 -0
- package/bin/store/db.d.ts.map +1 -0
- package/bin/store/db.js +28 -0
- package/bin/store/db.js.map +1 -0
- package/bin/store/table-api.d.ts +42 -0
- package/bin/store/table-api.d.ts.map +1 -0
- package/bin/store/table-api.js +98 -0
- package/bin/store/table-api.js.map +1 -0
- package/bin/store/types.d.ts +14 -0
- package/bin/store/types.d.ts.map +1 -0
- package/bin/store/types.js +7 -0
- package/bin/store/types.js.map +1 -0
- package/bin/utils/helpers.d.ts +101 -0
- package/bin/utils/helpers.d.ts.map +1 -0
- package/bin/utils/helpers.js +192 -0
- package/bin/utils/helpers.js.map +1 -0
- package/bin/utils/validation.d.ts +18 -0
- package/bin/utils/validation.d.ts.map +1 -0
- package/bin/utils/validation.js +28 -0
- package/bin/utils/validation.js.map +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/core/base/base.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAqC,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAChG,OAAO,EAAE,OAAO,EAA2C,MAAM,0BAA0B,CAAC;AAC5F,OAAO,EAAY,KAAK,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAOpD,OAAO,QAAQ,MAAM,CAAC;IACpB,UAAU,kBAAkB;QAC1B,IAAI,CAAC,EAAE,WAAW,CAAC;QACnB,OAAO,CAAC,EAAE;YAAE,UAAU,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;KAClD;CACF;AAMD;;;;;GAKG;AACH,qBAAa,IAAI;IACf,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA8B;IAEvD,OAAO,CAAC,QAAQ,CAAC,CAAuC;IACxD,OAAO,CAAC,MAAM,CAAC,CAAoD;IACnE,OAAO,CAAC,QAAQ,CAAC,CAA4B;IAC7C,OAAO,CAAC,WAAW,CAAC,CAAgB;IACpC,OAAO,CAAC,IAAI,CAAC,CAAO;IACpB,OAAO,CAAC,aAAa,CAAC,CAAgB;gBAE1B,OAAO,EAAE,WAAW;IAWhC;;;;OAIG;IACH,GAAG,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,GAAG,IAAI;IAMpC,wBAAwB;IACxB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAI3C,uBAAuB;IACvB,WAAW,IAAI,OAAO,EAAE;IAQlB,gBAAgB,IAAI,OAAO,CAAC,aAAa,CAAC;IAShD;;;;OAIG;IACG,KAAK,CAAC,IAAI,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACxE,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAW9B;;;;;;;;;;;OAWG;IACH,MAAM,IAAI,IAAI;IAKd;;OAEG;IACG,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC;IAKxD;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,gBAAgB,CAAC;YAgB3B,UAAU;IAsDxB,OAAO,CAAC,qBAAqB;IAe7B,OAAO,CAAC,SAAS;YA8DH,WAAW;IAKzB,OAAO,CAAC,gBAAgB;YAIV,YAAY;CAK3B;AAED,OAAO,EAAE,IAAI,IAAI,WAAW,EAAE,CAAC"}
|
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base Runtime 主模块。
|
|
3
|
+
*
|
|
4
|
+
* Base 是运行时容器,只负责:Service 路由、鉴权、HTTP。
|
|
5
|
+
* 不知道任何具体 Service 的实现,所有 Service 通过 _onInit() 自初始化。
|
|
6
|
+
*
|
|
7
|
+
* 数据库连接、环境变量存储等运行时特定逻辑由 Runtime 适配器注入。
|
|
8
|
+
*
|
|
9
|
+
* 使用方式:
|
|
10
|
+
* ```ts
|
|
11
|
+
* import { Base } from "@visiblebase/core";
|
|
12
|
+
* import { node } from "@visiblebase/node";
|
|
13
|
+
*
|
|
14
|
+
* const base = new Base({ runtime: node({ database: "sqlite:./data.sqlite" }) });
|
|
15
|
+
* base.use(new AIService());
|
|
16
|
+
* // 路由始终是标准 Hono app
|
|
17
|
+
* serve({ fetch: base.router().fetch, port: 3000 });
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
import { Hono } from "hono";
|
|
21
|
+
import { executeDDL } from "../../store/db.js";
|
|
22
|
+
import { TableApi, buildCreateUserTableSQL } from "../../store/table-api.js";
|
|
23
|
+
import { serviceRouteFullPath } from "../../service/service.js";
|
|
24
|
+
import { asPlugin } from "../../service/plugin.js";
|
|
25
|
+
import { Authenticator } from "../auth/authenticator.js";
|
|
26
|
+
import { randomSecret, bearerToken } from "../../utils/helpers.js";
|
|
27
|
+
// ===========================================================================
|
|
28
|
+
// Base
|
|
29
|
+
// ===========================================================================
|
|
30
|
+
/**
|
|
31
|
+
* VisibleBase 运行时容器。
|
|
32
|
+
*
|
|
33
|
+
* 接收 Service 注册、构建 Hono 路由、管理初始化生命周期。
|
|
34
|
+
* 数据库和 env 通过 Runtime 适配器注入,不依赖任何特定运行时。
|
|
35
|
+
*/
|
|
36
|
+
export class Base {
|
|
37
|
+
runtime;
|
|
38
|
+
services = new Map();
|
|
39
|
+
database;
|
|
40
|
+
client;
|
|
41
|
+
tableMap;
|
|
42
|
+
initPromise;
|
|
43
|
+
hono;
|
|
44
|
+
authenticator;
|
|
45
|
+
constructor(options) {
|
|
46
|
+
if (!options.runtime) {
|
|
47
|
+
throw new Error("Base requires a runtime adapter. Use @visiblebase/node or @visiblebase/serverless.");
|
|
48
|
+
}
|
|
49
|
+
this.runtime = options.runtime;
|
|
50
|
+
}
|
|
51
|
+
// ===========================================================================
|
|
52
|
+
// Service 注册
|
|
53
|
+
// ===========================================================================
|
|
54
|
+
/**
|
|
55
|
+
* 注册一个 Service。
|
|
56
|
+
*
|
|
57
|
+
* Service 在 Base 初始化时自动获得数据库、鉴权器、env 等基础设施。
|
|
58
|
+
*/
|
|
59
|
+
use(svc) {
|
|
60
|
+
const service = "install" in svc && !("get" in svc) ? asPlugin(svc) : svc;
|
|
61
|
+
this.services.set(service.id, service);
|
|
62
|
+
return this;
|
|
63
|
+
}
|
|
64
|
+
/** 获取指定 ID 的 Service */
|
|
65
|
+
getService(id) {
|
|
66
|
+
return this.services.get(id);
|
|
67
|
+
}
|
|
68
|
+
/** 获取所有已注册的 Service */
|
|
69
|
+
getServices() {
|
|
70
|
+
return [...this.services.values()];
|
|
71
|
+
}
|
|
72
|
+
// ===========================================================================
|
|
73
|
+
// 鉴权器
|
|
74
|
+
// ===========================================================================
|
|
75
|
+
async getAuthenticator() {
|
|
76
|
+
await this.ensureReady();
|
|
77
|
+
return this.authenticator;
|
|
78
|
+
}
|
|
79
|
+
// ===========================================================================
|
|
80
|
+
// 表操作
|
|
81
|
+
// ===========================================================================
|
|
82
|
+
/**
|
|
83
|
+
* 获取指定名称的数据库表 API。
|
|
84
|
+
*
|
|
85
|
+
* @param name - 表名(格式为 "service_id.table_name" 或内置表名)
|
|
86
|
+
*/
|
|
87
|
+
async table(name) {
|
|
88
|
+
await this.ensureReady();
|
|
89
|
+
const api = this.tableMap.get(name);
|
|
90
|
+
if (!api)
|
|
91
|
+
throw new Error(`Unknown schema table: ${name}`);
|
|
92
|
+
return api;
|
|
93
|
+
}
|
|
94
|
+
// ===========================================================================
|
|
95
|
+
// HTTP
|
|
96
|
+
// ===========================================================================
|
|
97
|
+
/**
|
|
98
|
+
* 获取 Hono 路由实例(需先完成初始化)。
|
|
99
|
+
*
|
|
100
|
+
* 路由可以直接挂载到任何支持 fetch 的 HTTP 服务器:
|
|
101
|
+
* ```ts
|
|
102
|
+
* // Node.js
|
|
103
|
+
* serve({ fetch: base.router().fetch, port: 3000 });
|
|
104
|
+
*
|
|
105
|
+
* // Cloudflare Workers
|
|
106
|
+
* export default { fetch: base.router().fetch };
|
|
107
|
+
* ```
|
|
108
|
+
*/
|
|
109
|
+
router() {
|
|
110
|
+
this.requireReadySync();
|
|
111
|
+
return this.hono;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* 直接处理一个 Request(用于 Serverless 场景)。
|
|
115
|
+
*/
|
|
116
|
+
async handleRequest(request) {
|
|
117
|
+
await this.ensureReady();
|
|
118
|
+
return this.hono.fetch(request);
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* 健康检查。
|
|
122
|
+
*/
|
|
123
|
+
async health() {
|
|
124
|
+
await this.ensureReady();
|
|
125
|
+
const services = this.getServices();
|
|
126
|
+
return {
|
|
127
|
+
ok: true,
|
|
128
|
+
name: "visiblebase",
|
|
129
|
+
checked_at: new Date().toISOString(),
|
|
130
|
+
services: services.map((s) => s.id),
|
|
131
|
+
service_list: services.map((s) => ({ id: s.id, name: s.name })),
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
// ===========================================================================
|
|
135
|
+
// 初始化(完全通用,不知道任何具体 Service)
|
|
136
|
+
// ===========================================================================
|
|
137
|
+
async initialize() {
|
|
138
|
+
const { database, client, env, builtinTables } = this.runtime;
|
|
139
|
+
this.database = database;
|
|
140
|
+
this.client = { $client: client };
|
|
141
|
+
// 1. 收集所有 Service 的 tables + 内置表
|
|
142
|
+
const userSchema = this.collectServiceSchemas();
|
|
143
|
+
// 2. 创建 TableApi(内置表 + 用户表)
|
|
144
|
+
this.tableMap = new Map();
|
|
145
|
+
// 内置表
|
|
146
|
+
this.tableMap.set("products", new TableApi(database, builtinTables.products));
|
|
147
|
+
this.tableMap.set("env", new TableApi(database, builtinTables.env));
|
|
148
|
+
// 用户表(scoped: "service_id.table_name")
|
|
149
|
+
for (const [name, table] of Object.entries(userSchema)) {
|
|
150
|
+
this.tableMap.set(name, new TableApi(database, table));
|
|
151
|
+
}
|
|
152
|
+
// 3. 执行 DDL
|
|
153
|
+
for (const t of this.tableMap.values()) {
|
|
154
|
+
const ddl = buildCreateUserTableSQL(t.schema);
|
|
155
|
+
if (ddl)
|
|
156
|
+
await executeDDL(this.client, ddl);
|
|
157
|
+
}
|
|
158
|
+
// 4. Bootstrap 默认密钥(如果 EnvProvider 支持持久化)
|
|
159
|
+
await bootstrapDefaultKeys(env);
|
|
160
|
+
// 5. 关联 EnvStore 到 EnvProvider(数据库中的值优先级更高)
|
|
161
|
+
if (env.attachStore) {
|
|
162
|
+
const envStoreModule = await import("../../service/env/env-store.js");
|
|
163
|
+
const envTable = this.tableMap.get("env");
|
|
164
|
+
const store = new envStoreModule.EnvStore(envTable);
|
|
165
|
+
await env.attachStore(store);
|
|
166
|
+
}
|
|
167
|
+
// 6. 创建鉴权器
|
|
168
|
+
this.authenticator = new Authenticator(env, () => this.requireReady());
|
|
169
|
+
// 7. 设置 Service 基础设施 + 调用 _onInit
|
|
170
|
+
for (const svc of this.services.values()) {
|
|
171
|
+
svc._db = database;
|
|
172
|
+
svc._client = this.client;
|
|
173
|
+
svc._authenticator = this.authenticator;
|
|
174
|
+
svc._env = env;
|
|
175
|
+
await svc._onInit();
|
|
176
|
+
}
|
|
177
|
+
// 8. 构建 Hono 路由
|
|
178
|
+
this.hono = this.buildHono();
|
|
179
|
+
}
|
|
180
|
+
collectServiceSchemas() {
|
|
181
|
+
const collected = {};
|
|
182
|
+
for (const svc of this.services.values()) {
|
|
183
|
+
if (!svc.tables)
|
|
184
|
+
continue;
|
|
185
|
+
for (const [name, table] of Object.entries(svc.tables)) {
|
|
186
|
+
const scopedName = `${svc.id}.${name}`;
|
|
187
|
+
if (collected[scopedName]) {
|
|
188
|
+
throw new Error(`Duplicate schema table "${scopedName}" from services: ${svc.id}`);
|
|
189
|
+
}
|
|
190
|
+
collected[scopedName] = table;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
return collected;
|
|
194
|
+
}
|
|
195
|
+
buildHono() {
|
|
196
|
+
const app = new Hono();
|
|
197
|
+
app.get("/health", (c) => {
|
|
198
|
+
const services = this.getServices();
|
|
199
|
+
return c.json({
|
|
200
|
+
ok: true,
|
|
201
|
+
name: "visiblebase",
|
|
202
|
+
checked_at: new Date().toISOString(),
|
|
203
|
+
services: services.map((s) => s.id),
|
|
204
|
+
service_list: services.map((s) => ({ id: s.id, name: s.name })),
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
app.use("/api/admin/*", async (c, next) => {
|
|
208
|
+
await this.authenticator.authenticate(c.req.raw, "admin");
|
|
209
|
+
await next();
|
|
210
|
+
});
|
|
211
|
+
app.use("/v1/*", async (c, next) => {
|
|
212
|
+
const token = bearerToken(c.req.raw);
|
|
213
|
+
if (token) {
|
|
214
|
+
const result = await this.authenticator.authenticate(c.req.raw, "user");
|
|
215
|
+
c.set("user", result.user);
|
|
216
|
+
c.set("product", result.product);
|
|
217
|
+
}
|
|
218
|
+
await next();
|
|
219
|
+
});
|
|
220
|
+
app.get("/v1/services", (c) => c.json({ items: this.getServices().map((s) => s.id) }));
|
|
221
|
+
for (const svc of this.services.values()) {
|
|
222
|
+
for (const route of svc._listRoutes()) {
|
|
223
|
+
const fullPath = serviceRouteFullPath(svc.id, route);
|
|
224
|
+
app.on(route.method, fullPath, async (c) => {
|
|
225
|
+
const ctx = {
|
|
226
|
+
request: c.req.raw,
|
|
227
|
+
url: new URL(c.req.url),
|
|
228
|
+
service_id: svc.id,
|
|
229
|
+
route,
|
|
230
|
+
user: c.get("user"),
|
|
231
|
+
product: c.get("product"),
|
|
232
|
+
json: () => c.req.json(),
|
|
233
|
+
text: () => c.req.text(),
|
|
234
|
+
jsonResponse: (body, status) => c.json(body, status),
|
|
235
|
+
table: async (name) => this.tableMap.get(`${svc.id}.${name}`),
|
|
236
|
+
env: (key) => this.runtime.env.get(key),
|
|
237
|
+
};
|
|
238
|
+
return route.handler(ctx);
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
return app;
|
|
243
|
+
}
|
|
244
|
+
// ===========================================================================
|
|
245
|
+
// 内部辅助
|
|
246
|
+
// ===========================================================================
|
|
247
|
+
async ensureReady() {
|
|
248
|
+
if (!this.initPromise)
|
|
249
|
+
this.initPromise = this.initialize();
|
|
250
|
+
await this.initPromise;
|
|
251
|
+
}
|
|
252
|
+
requireReadySync() {
|
|
253
|
+
if (!this.hono)
|
|
254
|
+
throw new Error("Base init has not completed yet");
|
|
255
|
+
}
|
|
256
|
+
async requireReady() {
|
|
257
|
+
await this.ensureReady();
|
|
258
|
+
const products = this.services.get("products");
|
|
259
|
+
return { product: products?.store ?? { get: () => Promise.resolve(undefined) } };
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
export { Base as VisibleBase };
|
|
263
|
+
// ===========================================================================
|
|
264
|
+
// 默认密钥 Bootstrap
|
|
265
|
+
// ===========================================================================
|
|
266
|
+
/**
|
|
267
|
+
* 自动生成 Base 必需的默认密钥(ADMIN_SECRET_KEY、TOKEN_SIGNING_KEY)。
|
|
268
|
+
*
|
|
269
|
+
* 仅在 .env / Secrets 中没有对应值时才生成,降低首次启动配置成本。
|
|
270
|
+
*/
|
|
271
|
+
async function bootstrapDefaultKeys(env) {
|
|
272
|
+
const ADMIN_SECRET_KEY = "VISIBLEBASE_ADMIN_SECRET_KEY";
|
|
273
|
+
const TOKEN_SIGNING_KEY = "VISIBLEBASE_TOKEN_SIGNING_KEY";
|
|
274
|
+
if (!env.get(ADMIN_SECRET_KEY)) {
|
|
275
|
+
await env.upsert({ key: ADMIN_SECRET_KEY, value: `admin_${randomSecret()}` });
|
|
276
|
+
}
|
|
277
|
+
if (!env.get(TOKEN_SIGNING_KEY)) {
|
|
278
|
+
await env.upsert({ key: TOKEN_SIGNING_KEY, value: `sign_${randomSecret()}` });
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
//# sourceMappingURL=base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/core/base/base.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime 适配器接口模块。
|
|
3
|
+
*
|
|
4
|
+
* 定义 Base 依赖的运行时抽象:数据库连接 + 环境变量存储 + 内置表。
|
|
5
|
+
* 每个运行时(Node.js、Cloudflare Workers、Deno 等)提供各自的实现。
|
|
6
|
+
*
|
|
7
|
+
* 使用示例:
|
|
8
|
+
* ```ts
|
|
9
|
+
* // Node.js
|
|
10
|
+
* import { node } from "@visiblebase/node";
|
|
11
|
+
* const base = new Base({ runtime: node({ database: "sqlite:./data.sqlite" }) });
|
|
12
|
+
*
|
|
13
|
+
* // Cloudflare Workers
|
|
14
|
+
* import { serverless } from "@visiblebase/serverless";
|
|
15
|
+
* const base = new Base({ runtime: serverless({ database: env.DB }) });
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
import type { Database, DbClient } from "../store/db.js";
|
|
19
|
+
import type { EnvEntry, EnvUpsertInput } from "../service/env/types.js";
|
|
20
|
+
import type { EnvStore } from "../service/env/env-store.js";
|
|
21
|
+
import type { AnySQLiteTable } from "drizzle-orm/sqlite-core";
|
|
22
|
+
import type { AnyPgTable } from "drizzle-orm/pg-core";
|
|
23
|
+
/** 表定义类型(SQLite 或 Postgres) */
|
|
24
|
+
export type TableDef = AnySQLiteTable | AnyPgTable;
|
|
25
|
+
/**
|
|
26
|
+
* 环境变量提供者接口。
|
|
27
|
+
*
|
|
28
|
+
* Base 通过此接口读取/写入运行时环境变量,
|
|
29
|
+
* 不关心底层存储是 .env 文件、Worker Secrets 还是数据库。
|
|
30
|
+
*/
|
|
31
|
+
export interface EnvProvider {
|
|
32
|
+
/**
|
|
33
|
+
* 读取单个环境变量。
|
|
34
|
+
*
|
|
35
|
+
* @param key - 环境变量名(会自动标准化)
|
|
36
|
+
*/
|
|
37
|
+
get(key: string): string | undefined;
|
|
38
|
+
/**
|
|
39
|
+
* 列出所有环境变量(含来源信息)。
|
|
40
|
+
*/
|
|
41
|
+
list(): EnvEntry[] | Promise<EnvEntry[]>;
|
|
42
|
+
/**
|
|
43
|
+
* 写入或更新环境变量。
|
|
44
|
+
*
|
|
45
|
+
* @param input - 环境变量键值
|
|
46
|
+
*/
|
|
47
|
+
upsert(input: EnvUpsertInput): Promise<EnvEntry>;
|
|
48
|
+
/**
|
|
49
|
+
* 删除环境变量。
|
|
50
|
+
*
|
|
51
|
+
* @param key - 环境变量名
|
|
52
|
+
*/
|
|
53
|
+
remove(key: string): Promise<void>;
|
|
54
|
+
/**
|
|
55
|
+
* 批量导入环境变量文本(.env 格式)。
|
|
56
|
+
*
|
|
57
|
+
* @param raw - .env 文本内容
|
|
58
|
+
*/
|
|
59
|
+
import(raw: unknown): Promise<EnvEntry[]>;
|
|
60
|
+
/**
|
|
61
|
+
* 关联数据库存储(可选)。
|
|
62
|
+
*
|
|
63
|
+
* 当 Base 初始化数据库后调用,允许 EnvProvider 将值持久化到数据库。
|
|
64
|
+
* 数据库中的值优先级高于运行时源(如 .env 文件)。
|
|
65
|
+
*
|
|
66
|
+
* @param store - 数据库 Env 存储实例
|
|
67
|
+
*/
|
|
68
|
+
attachStore?(store: EnvStore): Promise<void>;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Base 内置表定义。
|
|
72
|
+
*
|
|
73
|
+
* 包含 products 和 env 两个内置表。
|
|
74
|
+
* 适配器根据数据库类型(SQLite / Postgres)提供对应的表定义。
|
|
75
|
+
*/
|
|
76
|
+
export interface BuiltinTables {
|
|
77
|
+
/** 产品表 */
|
|
78
|
+
products: TableDef;
|
|
79
|
+
/** 环境变量表 */
|
|
80
|
+
env: TableDef;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* 运行时适配器接口。
|
|
84
|
+
*
|
|
85
|
+
* 封装 Base 需要的所有运行时特定依赖。
|
|
86
|
+
* 每个平台(Node.js、Cloudflare Workers 等)提供自己的 Runtime 实现。
|
|
87
|
+
*/
|
|
88
|
+
export interface Runtime {
|
|
89
|
+
/**
|
|
90
|
+
* 数据库实例(Drizzle Database 接口)。
|
|
91
|
+
*
|
|
92
|
+
* 用于 Service 的 CRUD 操作。
|
|
93
|
+
*/
|
|
94
|
+
database: Database;
|
|
95
|
+
/**
|
|
96
|
+
* 底层数据库客户端(用于 DDL 执行)。
|
|
97
|
+
*/
|
|
98
|
+
client: DbClient;
|
|
99
|
+
/**
|
|
100
|
+
* 环境变量提供者。
|
|
101
|
+
*
|
|
102
|
+
* 用于读取密钥、API key 等配置。
|
|
103
|
+
*/
|
|
104
|
+
env: EnvProvider;
|
|
105
|
+
/**
|
|
106
|
+
* Base 内置表定义(products + env)。
|
|
107
|
+
*
|
|
108
|
+
* 适配器根据数据库类型提供正确的 Drizzle 表定义。
|
|
109
|
+
*/
|
|
110
|
+
builtinTables: BuiltinTables;
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/core/runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEtD,+BAA+B;AAC/B,MAAM,MAAM,QAAQ,GAAG,cAAc,GAAG,UAAU,CAAC;AAMnD;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC1B;;;;OAIG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAErC;;OAEG;IACH,IAAI,IAAI,QAAQ,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAEzC;;;;OAIG;IACH,MAAM,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEjD;;;;OAIG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnC;;;;OAIG;IACH,MAAM,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAE1C;;;;;;;OAOG;IACH,WAAW,CAAC,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9C;AAMD;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,UAAU;IACV,QAAQ,EAAE,QAAQ,CAAC;IACnB,YAAY;IACZ,GAAG,EAAE,QAAQ,CAAC;CACf;AAMD;;;;;GAKG;AACH,MAAM,WAAW,OAAO;IACtB;;;;OAIG;IACH,QAAQ,EAAE,QAAQ,CAAC;IAEnB;;OAEG;IACH,MAAM,EAAE,QAAQ,CAAC;IAEjB;;;;OAIG;IACH,GAAG,EAAE,WAAW,CAAC;IAEjB;;;;OAIG;IACH,aAAa,EAAE,aAAa,CAAC;CAC9B"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime 适配器接口模块。
|
|
3
|
+
*
|
|
4
|
+
* 定义 Base 依赖的运行时抽象:数据库连接 + 环境变量存储 + 内置表。
|
|
5
|
+
* 每个运行时(Node.js、Cloudflare Workers、Deno 等)提供各自的实现。
|
|
6
|
+
*
|
|
7
|
+
* 使用示例:
|
|
8
|
+
* ```ts
|
|
9
|
+
* // Node.js
|
|
10
|
+
* import { node } from "@visiblebase/node";
|
|
11
|
+
* const base = new Base({ runtime: node({ database: "sqlite:./data.sqlite" }) });
|
|
12
|
+
*
|
|
13
|
+
* // Cloudflare Workers
|
|
14
|
+
* import { serverless } from "@visiblebase/serverless";
|
|
15
|
+
* const base = new Base({ runtime: serverless({ database: env.DB }) });
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/core/runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base Runtime 配置类型模块。
|
|
3
|
+
*
|
|
4
|
+
* 包含创建 Base 实例和健康检查所需的所有类型定义。
|
|
5
|
+
*/
|
|
6
|
+
import type { Runtime } from "./runtime.js";
|
|
7
|
+
/**
|
|
8
|
+
* Base 健康检查结果。
|
|
9
|
+
*/
|
|
10
|
+
export interface BaseHealthStatus {
|
|
11
|
+
/** 当前 Runtime 是否已经完成初始化并可处理请求 */
|
|
12
|
+
ok: boolean;
|
|
13
|
+
/** 服务名称,用于外部探测确认命中的服务类型 */
|
|
14
|
+
name: string;
|
|
15
|
+
/** 健康检查响应时间 */
|
|
16
|
+
checked_at: string;
|
|
17
|
+
/** 当前注册的 service ID 列表 */
|
|
18
|
+
services: string[];
|
|
19
|
+
/** 当前启用的 service 信息列表 */
|
|
20
|
+
service_list: {
|
|
21
|
+
id: string;
|
|
22
|
+
name: string;
|
|
23
|
+
}[];
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* 创建 Base 实例时传入的顶层配置。
|
|
27
|
+
*
|
|
28
|
+
* 必须传入 Runtime 适配器,数据库和 env 存储由适配器提供。
|
|
29
|
+
*/
|
|
30
|
+
export interface BaseOptions {
|
|
31
|
+
/**
|
|
32
|
+
* 运行时适配器。
|
|
33
|
+
*
|
|
34
|
+
* 提供数据库连接、环境变量存储、内置表定义。
|
|
35
|
+
* 使用 @visiblebase/node 或 @visiblebase/serverless 创建。
|
|
36
|
+
*/
|
|
37
|
+
runtime: Runtime;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,iCAAiC;IACjC,EAAE,EAAE,OAAO,CAAC;IACZ,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,eAAe;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,0BAA0B;IAC1B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,yBAAyB;IACzB,YAAY,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC9C;AAED;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B;;;;;OAKG;IACH,OAAO,EAAE,OAAO,CAAC;CAClB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
package/bin/index.d.ts
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @visiblebase/core 公共入口。
|
|
3
|
+
*
|
|
4
|
+
* 按使用场景组织导出,方便开发者按需查找。
|
|
5
|
+
*
|
|
6
|
+
* 使用方式:
|
|
7
|
+
* ```ts
|
|
8
|
+
* import { Base, Service, AIService, type Context } from "@visiblebase/core";
|
|
9
|
+
* import { node } from "@visiblebase/node";
|
|
10
|
+
*
|
|
11
|
+
* const base = new Base({ runtime: node({ database: "sqlite:./data.sqlite" }) });
|
|
12
|
+
* ```
|
|
13
|
+
*/
|
|
14
|
+
export { Base, VisibleBase } from "./core/base/base.js";
|
|
15
|
+
export type { BaseOptions, BaseHealthStatus } from "./core/types.js";
|
|
16
|
+
export type { Runtime, EnvProvider, BuiltinTables, TableDef } from "./core/runtime.js";
|
|
17
|
+
export { Service } from "./service/service.js";
|
|
18
|
+
export { Plugin } from "./service/plugin.js";
|
|
19
|
+
export type { Context, Handler, RouteAuth, EnvRequirement, } from "./service/service.js";
|
|
20
|
+
export type { BasePlugin, BasePluginContext, PluginRouteContext, ServiceContext, } from "./service/plugin.js";
|
|
21
|
+
export { AIService } from "./service/ai/ai-service.js";
|
|
22
|
+
export { Provider } from "./service/ai/provider.js";
|
|
23
|
+
export type { ModelConfig, ModelHandlers, PublicModel, } from "./service/ai/types.js";
|
|
24
|
+
export type { HookFn, ServiceHandler, } from "./service/types.js";
|
|
25
|
+
export { TokenSigner } from "./core/auth/token-signer.js";
|
|
26
|
+
export type { RuntimeUser, CreateUserTokenInput, UserTokenPayload, UserTokenIssueResult, } from "./core/auth/types.js";
|
|
27
|
+
export { EnvService } from "./service/env/env-service.js";
|
|
28
|
+
export type { EnvEntry, EnvUpsertInput } from "./service/env/types.js";
|
|
29
|
+
export { EnvStore } from "./service/env/env-store.js";
|
|
30
|
+
export { ProductsService } from "./service/products/products-service.js";
|
|
31
|
+
export type { Product, ProductCreateInput, ProductStatus } from "./service/products/types.js";
|
|
32
|
+
export type { Database, DbClient } from "./store/db.js";
|
|
33
|
+
export { executeDDL } from "./store/db.js";
|
|
34
|
+
export type { BaseTableApi } from "./store/table-api.js";
|
|
35
|
+
export type { BaseUserSchemaInput } from "./store/types.js";
|
|
36
|
+
export { sqliteProducts, pgProducts } from "./service/products/schema.js";
|
|
37
|
+
export { sqliteEnv, pgEnv } from "./service/env/schema.js";
|
|
38
|
+
export { randomSecret, base64UrlEncode, base64UrlDecode, base64UrlEncodeBytes, base64UrlDecodeBytes, timingSafeEqualBytes, httpError, normalizeEnvKey, bearerToken, parseDotenvEntries, } from "./utils/helpers.js";
|
|
39
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAExD,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAErE,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAMvF,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAE7C,YAAY,EACV,OAAO,EACP,OAAO,EACP,SAAS,EACT,cAAc,GACf,MAAM,sBAAsB,CAAC;AAE9B,YAAY,EACV,UAAU,EACV,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,GACf,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAEpD,YAAY,EACV,WAAW,EACX,aAAa,EACb,WAAW,GACZ,MAAM,uBAAuB,CAAC;AAM/B,YAAY,EACV,MAAM,EACN,cAAc,GACf,MAAM,oBAAoB,CAAC;AAM5B,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAE1D,YAAY,EACV,WAAW,EACX,oBAAoB,EACpB,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,sBAAsB,CAAC;AAM9B,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACvE,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAEtD,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AACzE,YAAY,EAAE,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAM9F,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,YAAY,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,YAAY,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAM5D,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAM3D,OAAO,EACL,YAAY,EACZ,eAAe,EACf,eAAe,EACf,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,SAAS,EACT,eAAe,EACf,WAAW,EACX,kBAAkB,GACnB,MAAM,oBAAoB,CAAC"}
|
package/bin/index.js
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @visiblebase/core 公共入口。
|
|
3
|
+
*
|
|
4
|
+
* 按使用场景组织导出,方便开发者按需查找。
|
|
5
|
+
*
|
|
6
|
+
* 使用方式:
|
|
7
|
+
* ```ts
|
|
8
|
+
* import { Base, Service, AIService, type Context } from "@visiblebase/core";
|
|
9
|
+
* import { node } from "@visiblebase/node";
|
|
10
|
+
*
|
|
11
|
+
* const base = new Base({ runtime: node({ database: "sqlite:./data.sqlite" }) });
|
|
12
|
+
* ```
|
|
13
|
+
*/
|
|
14
|
+
// ===========================================================================
|
|
15
|
+
// 场景 1:创建 Base 实例
|
|
16
|
+
// ===========================================================================
|
|
17
|
+
export { Base, VisibleBase } from "./core/base/base.js";
|
|
18
|
+
// ===========================================================================
|
|
19
|
+
// 场景 2:注册 Service / Plugin / AI 模型
|
|
20
|
+
// ===========================================================================
|
|
21
|
+
export { Service } from "./service/service.js";
|
|
22
|
+
export { Plugin } from "./service/plugin.js";
|
|
23
|
+
export { AIService } from "./service/ai/ai-service.js";
|
|
24
|
+
export { Provider } from "./service/ai/provider.js";
|
|
25
|
+
// ===========================================================================
|
|
26
|
+
// 场景 4:用户鉴权与 Token
|
|
27
|
+
// ===========================================================================
|
|
28
|
+
export { TokenSigner } from "./core/auth/token-signer.js";
|
|
29
|
+
// ===========================================================================
|
|
30
|
+
// 场景 5:管理 Product 与环境变量(内置 Service)
|
|
31
|
+
// ===========================================================================
|
|
32
|
+
export { EnvService } from "./service/env/env-service.js";
|
|
33
|
+
export { EnvStore } from "./service/env/env-store.js";
|
|
34
|
+
export { ProductsService } from "./service/products/products-service.js";
|
|
35
|
+
export { executeDDL } from "./store/db.js";
|
|
36
|
+
// ===========================================================================
|
|
37
|
+
// 场景 7:内置表 Schema(供 Runtime 适配器使用)
|
|
38
|
+
// ===========================================================================
|
|
39
|
+
export { sqliteProducts, pgProducts } from "./service/products/schema.js";
|
|
40
|
+
export { sqliteEnv, pgEnv } from "./service/env/schema.js";
|
|
41
|
+
// ===========================================================================
|
|
42
|
+
// 场景 8:工具函数
|
|
43
|
+
// ===========================================================================
|
|
44
|
+
export { randomSecret, base64UrlEncode, base64UrlDecode, base64UrlEncodeBytes, base64UrlDecodeBytes, timingSafeEqualBytes, httpError, normalizeEnvKey, bearerToken, parseDotenvEntries, } from "./utils/helpers.js";
|
|
45
|
+
//# sourceMappingURL=index.js.map
|
package/bin/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAE9E,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAMxD,8EAA8E;AAC9E,mCAAmC;AACnC,8EAA8E;AAE9E,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAgB7C,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAiBpD,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAS1D,8EAA8E;AAC9E,oCAAoC;AACpC,8EAA8E;AAE9E,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAE1D,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAEtD,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AAQzE,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAI3C,8EAA8E;AAC9E,mCAAmC;AACnC,8EAA8E;AAE9E,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAE3D,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,OAAO,EACL,YAAY,EACZ,eAAe,EACf,eAAe,EACf,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,SAAS,EACT,eAAe,EACf,WAAW,EACX,kBAAkB,GACnB,MAAM,oBAAoB,CAAC"}
|