@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.
Files changed (110) hide show
  1. package/README.md +127 -0
  2. package/bin/core/auth/authenticator.d.ts +68 -0
  3. package/bin/core/auth/authenticator.d.ts.map +1 -0
  4. package/bin/core/auth/authenticator.js +106 -0
  5. package/bin/core/auth/authenticator.js.map +1 -0
  6. package/bin/core/auth/token-signer.d.ts +27 -0
  7. package/bin/core/auth/token-signer.d.ts.map +1 -0
  8. package/bin/core/auth/token-signer.js +116 -0
  9. package/bin/core/auth/token-signer.js.map +1 -0
  10. package/bin/core/auth/types.d.ts +94 -0
  11. package/bin/core/auth/types.d.ts.map +1 -0
  12. package/bin/core/auth/types.js +7 -0
  13. package/bin/core/auth/types.js.map +1 -0
  14. package/bin/core/base/base.d.ts +98 -0
  15. package/bin/core/base/base.d.ts.map +1 -0
  16. package/bin/core/base/base.js +281 -0
  17. package/bin/core/base/base.js.map +1 -0
  18. package/bin/core/runtime.d.ts +112 -0
  19. package/bin/core/runtime.d.ts.map +1 -0
  20. package/bin/core/runtime.js +19 -0
  21. package/bin/core/runtime.js.map +1 -0
  22. package/bin/core/types.d.ts +39 -0
  23. package/bin/core/types.d.ts.map +1 -0
  24. package/bin/core/types.js +7 -0
  25. package/bin/core/types.js.map +1 -0
  26. package/bin/index.d.ts +39 -0
  27. package/bin/index.d.ts.map +1 -0
  28. package/bin/index.js +45 -0
  29. package/bin/index.js.map +1 -0
  30. package/bin/service/ai/ai-service.d.ts +80 -0
  31. package/bin/service/ai/ai-service.d.ts.map +1 -0
  32. package/bin/service/ai/ai-service.js +184 -0
  33. package/bin/service/ai/ai-service.js.map +1 -0
  34. package/bin/service/ai/provider.d.ts +77 -0
  35. package/bin/service/ai/provider.d.ts.map +1 -0
  36. package/bin/service/ai/provider.js +71 -0
  37. package/bin/service/ai/provider.js.map +1 -0
  38. package/bin/service/ai/types.d.ts +72 -0
  39. package/bin/service/ai/types.d.ts.map +1 -0
  40. package/bin/service/ai/types.js +7 -0
  41. package/bin/service/ai/types.js.map +1 -0
  42. package/bin/service/env/env-service.d.ts +14 -0
  43. package/bin/service/env/env-service.d.ts.map +1 -0
  44. package/bin/service/env/env-service.js +42 -0
  45. package/bin/service/env/env-service.js.map +1 -0
  46. package/bin/service/env/env-store.d.ts +15 -0
  47. package/bin/service/env/env-store.d.ts.map +1 -0
  48. package/bin/service/env/env-store.js +35 -0
  49. package/bin/service/env/env-store.js.map +1 -0
  50. package/bin/service/env/schema.d.ts +171 -0
  51. package/bin/service/env/schema.d.ts.map +1 -0
  52. package/bin/service/env/schema.js +52 -0
  53. package/bin/service/env/schema.js.map +1 -0
  54. package/bin/service/env/types.d.ts +37 -0
  55. package/bin/service/env/types.d.ts.map +1 -0
  56. package/bin/service/env/types.js +8 -0
  57. package/bin/service/env/types.js.map +1 -0
  58. package/bin/service/hook.d.ts +20 -0
  59. package/bin/service/hook.d.ts.map +1 -0
  60. package/bin/service/hook.js +52 -0
  61. package/bin/service/hook.js.map +1 -0
  62. package/bin/service/plugin.d.ts +141 -0
  63. package/bin/service/plugin.d.ts.map +1 -0
  64. package/bin/service/plugin.js +124 -0
  65. package/bin/service/plugin.js.map +1 -0
  66. package/bin/service/products/product-store.d.ts +17 -0
  67. package/bin/service/products/product-store.d.ts.map +1 -0
  68. package/bin/service/products/product-store.js +49 -0
  69. package/bin/service/products/product-store.js.map +1 -0
  70. package/bin/service/products/products-service.d.ts +16 -0
  71. package/bin/service/products/products-service.d.ts.map +1 -0
  72. package/bin/service/products/products-service.js +52 -0
  73. package/bin/service/products/products-service.js.map +1 -0
  74. package/bin/service/products/schema.d.ts +207 -0
  75. package/bin/service/products/schema.d.ts.map +1 -0
  76. package/bin/service/products/schema.js +60 -0
  77. package/bin/service/products/schema.js.map +1 -0
  78. package/bin/service/products/types.d.ts +51 -0
  79. package/bin/service/products/types.d.ts.map +1 -0
  80. package/bin/service/products/types.js +7 -0
  81. package/bin/service/products/types.js.map +1 -0
  82. package/bin/service/service.d.ts +118 -0
  83. package/bin/service/service.d.ts.map +1 -0
  84. package/bin/service/service.js +114 -0
  85. package/bin/service/service.js.map +1 -0
  86. package/bin/service/types.d.ts +17 -0
  87. package/bin/service/types.d.ts.map +1 -0
  88. package/bin/service/types.js +5 -0
  89. package/bin/service/types.js.map +1 -0
  90. package/bin/store/db.d.ts +64 -0
  91. package/bin/store/db.d.ts.map +1 -0
  92. package/bin/store/db.js +28 -0
  93. package/bin/store/db.js.map +1 -0
  94. package/bin/store/table-api.d.ts +42 -0
  95. package/bin/store/table-api.d.ts.map +1 -0
  96. package/bin/store/table-api.js +98 -0
  97. package/bin/store/table-api.js.map +1 -0
  98. package/bin/store/types.d.ts +14 -0
  99. package/bin/store/types.d.ts.map +1 -0
  100. package/bin/store/types.js +7 -0
  101. package/bin/store/types.js.map +1 -0
  102. package/bin/utils/helpers.d.ts +101 -0
  103. package/bin/utils/helpers.d.ts.map +1 -0
  104. package/bin/utils/helpers.js +192 -0
  105. package/bin/utils/helpers.js.map +1 -0
  106. package/bin/utils/validation.d.ts +18 -0
  107. package/bin/utils/validation.d.ts.map +1 -0
  108. package/bin/utils/validation.js +28 -0
  109. package/bin/utils/validation.js.map +1 -0
  110. package/package.json +52 -0
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Service — SDK 核心单元。
3
+ *
4
+ * 每个 Service = 路由 + 数据库表 + hook + 自初始化。
5
+ * 只有一个 Context 类型,所有 handler 共用。
6
+ * Service 需要的基础设施(DB、Auth、Env)由 Base 直接设为属性。
7
+ */
8
+ import { Hook } from "./hook.js";
9
+ // ===========================================================================
10
+ // Service
11
+ // ===========================================================================
12
+ export class Service {
13
+ id;
14
+ name;
15
+ hook = new Hook();
16
+ tables;
17
+ env;
18
+ /**
19
+ * 数据库查询接口(Base 初始化后设置)。
20
+ */
21
+ _db;
22
+ /** 数据库底层连接,用于 DDL(Base 初始化后设置) */
23
+ _client;
24
+ /**
25
+ * 鉴权器(Base 初始化后设置)。
26
+ */
27
+ _authenticator;
28
+ /**
29
+ * Runtime 环境变量(Base 初始化后设置)。
30
+ */
31
+ _env;
32
+ routes = [];
33
+ constructor(options) {
34
+ this.id = options.id;
35
+ this.name = options.name ?? options.id;
36
+ this.tables = options.tables;
37
+ this.env = options.env;
38
+ }
39
+ // ========== 生命周期 ==========
40
+ /**
41
+ * 初始化回调(可选)。Base 在设置 _database/_client/_authenticator/_env 后调用。
42
+ * Service 在此创建自己的 Store、种子数据等。默认空实现。
43
+ */
44
+ async _onInit() { }
45
+ // ========== 路由快捷方法 ==========
46
+ get(path, handler, opts) {
47
+ return this._add("GET", path, handler, opts);
48
+ }
49
+ post(path, handler, opts) {
50
+ return this._add("POST", path, handler, opts);
51
+ }
52
+ put(path, handler, opts) {
53
+ return this._add("PUT", path, handler, opts);
54
+ }
55
+ patch(path, handler, opts) {
56
+ return this._add("PATCH", path, handler, opts);
57
+ }
58
+ delete(path, handler, opts) {
59
+ return this._add("DELETE", path, handler, opts);
60
+ }
61
+ // ========== 内部方法 ==========
62
+ _listRoutes() {
63
+ return this.routes;
64
+ }
65
+ _add(method, path, handler, opts) {
66
+ this.routes.push({
67
+ method,
68
+ path: normalizeRoutePath(path),
69
+ auth: opts?.auth ?? "user",
70
+ handler: wrapHandler(handler, this),
71
+ });
72
+ return this;
73
+ }
74
+ }
75
+ // ===========================================================================
76
+ // wrapHandler
77
+ // ===========================================================================
78
+ function wrapHandler(handler, service) {
79
+ return async (routeCtx) => {
80
+ const input = routeCtx.request.method === "GET" ? {} : await routeCtx.json();
81
+ const db = {};
82
+ if (service.tables) {
83
+ for (const name of Object.keys(service.tables)) {
84
+ db[name] = await routeCtx.table(name);
85
+ }
86
+ }
87
+ const result = await handler({
88
+ input, db,
89
+ user: routeCtx.user,
90
+ product: routeCtx.product,
91
+ request: routeCtx.request,
92
+ env: (key) => routeCtx.env(key),
93
+ });
94
+ if (result instanceof Response)
95
+ return result;
96
+ return routeCtx.jsonResponse(result, 200);
97
+ };
98
+ }
99
+ // ===========================================================================
100
+ // 工具
101
+ // ===========================================================================
102
+ function normalizeRoutePath(pathname) {
103
+ const trimmed = pathname.trim();
104
+ if (!trimmed || trimmed === "/")
105
+ return "/";
106
+ return `/${trimmed.replace(/^\/+/, "").replace(/\/+$/, "")}`;
107
+ }
108
+ export function serviceRouteFullPath(serviceId, route) {
109
+ const prefix = route.auth === "admin"
110
+ ? `/api/admin/services/${serviceId}`
111
+ : `/v1/services/${serviceId}`;
112
+ return route.path === "/" ? prefix : `${prefix}${route.path}`;
113
+ }
114
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/service/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Service 公共类型。
3
+ */
4
+ import type { Context } from "./service.js";
5
+ /**
6
+ * Hook 回调函数。
7
+ *
8
+ * before/after 可返回新 Context 替换当前;onError 返回值被忽略。
9
+ */
10
+ export type HookFn = (ctx: Context) => void | Context | Promise<void | Context>;
11
+ /**
12
+ * AI 模型 handler。
13
+ *
14
+ * 接收 Context(含 model 信息),返回结果或 Response(streaming)。
15
+ */
16
+ export type ServiceHandler<TResult = unknown> = (ctx: Context) => TResult | Promise<TResult>;
17
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/service/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C;;;;GAIG;AACH,MAAM,MAAM,MAAM,GAAG,CACnB,GAAG,EAAE,OAAO,KACT,IAAI,GAAG,OAAO,GAAG,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC;AAE9C;;;;GAIG;AACH,MAAM,MAAM,cAAc,CAAC,OAAO,GAAG,OAAO,IAAI,CAC9C,GAAG,EAAE,OAAO,KACT,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Service 公共类型。
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/service/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * 数据库连接接口模块。
3
+ *
4
+ * 定义 Database / DbClient 抽象接口和 executeDDL 工具函数。
5
+ * 不包含任何运行时特定的数据库驱动(驱动由 @visiblebase/node 等适配器提供)。
6
+ */
7
+ import type { SQL } from "drizzle-orm";
8
+ /**
9
+ * 底层数据库客户端接口。
10
+ *
11
+ * SQLite 用 exec()(同步),Postgres 用 unsafe()(异步)。
12
+ * 适配器只需要提供其中一个方法即可。
13
+ */
14
+ export interface DbClient {
15
+ /** SQLite 同步执行 DDL */
16
+ exec?(sql: string): void;
17
+ /** Postgres 异步执行 DDL */
18
+ unsafe?(sql: string, params?: unknown[]): Promise<unknown>;
19
+ /** 关闭连接(可选) */
20
+ close?(): void;
21
+ /** 关闭连接(异步,可选) */
22
+ end?(): Promise<void>;
23
+ }
24
+ interface Query extends Promise<Record<string, unknown>[]> {
25
+ where(cond: SQL | undefined): Query;
26
+ orderBy(...cols: unknown[]): Query;
27
+ limit(n: number): Query;
28
+ }
29
+ /**
30
+ * Drizzle select / insert / update / delete 的公共子集。
31
+ *
32
+ * 所有 Drizzle 方言实例这 4 个方法签名完全相同,
33
+ * 只是泛型参数不同。此接口用 unknown 替代泛型参数,
34
+ * 返回值用具体类型。各 Store 构造时从 DrizzleDB 转一次。
35
+ */
36
+ export interface Database {
37
+ select(): {
38
+ from(t: unknown): Query;
39
+ };
40
+ insert(t: unknown): {
41
+ values(v: Record<string, unknown> | Record<string, unknown>[]): Promise<void>;
42
+ };
43
+ update(t: unknown): {
44
+ set(v: Record<string, unknown>): {
45
+ where(c: SQL | undefined): Promise<number>;
46
+ };
47
+ };
48
+ delete(t: unknown): {
49
+ where(c: SQL | undefined): Promise<number>;
50
+ };
51
+ }
52
+ /**
53
+ * 执行 DDL 语句。
54
+ *
55
+ * 自动适配同步(SQLite exec)和异步(Postgres unsafe)两种驱动。
56
+ *
57
+ * @param db - 包含 $client 的数据库实例
58
+ * @param ddl - 要执行的 DDL SQL 字符串
59
+ */
60
+ export declare function executeDDL(db: {
61
+ $client: DbClient;
62
+ }, ddl: string): Promise<void>;
63
+ export {};
64
+ //# sourceMappingURL=db.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/store/db.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAMvC;;;;;GAKG;AACH,MAAM,WAAW,QAAQ;IACvB,sBAAsB;IACtB,IAAI,CAAC,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,wBAAwB;IACxB,MAAM,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3D,eAAe;IACf,KAAK,CAAC,IAAI,IAAI,CAAC;IACf,kBAAkB;IAClB,GAAG,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAMD,UAAU,KAAM,SAAQ,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IACxD,KAAK,CAAC,IAAI,EAAE,GAAG,GAAG,SAAS,GAAG,KAAK,CAAC;IACpC,OAAO,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IACnC,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;CACzB;AAMD;;;;;;GAMG;AACH,MAAM,WAAW,QAAQ;IACvB,MAAM,IAAI;QAAE,IAAI,CAAC,CAAC,EAAE,OAAO,GAAG,KAAK,CAAA;KAAE,CAAC;IACtC,MAAM,CAAC,CAAC,EAAE,OAAO,GAAG;QAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;KAAE,CAAC;IACtG,MAAM,CAAC,CAAC,EAAE,OAAO,GAAG;QAAE,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;YAAE,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;SAAE,CAAA;KAAE,CAAC;IACxG,MAAM,CAAC,CAAC,EAAE,OAAO,GAAG;QAAE,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;KAAE,CAAC;CACpE;AAMD;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAAC,EAAE,EAAE;IAAE,OAAO,EAAE,QAAQ,CAAA;CAAE,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAItF"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * 数据库连接接口模块。
3
+ *
4
+ * 定义 Database / DbClient 抽象接口和 executeDDL 工具函数。
5
+ * 不包含任何运行时特定的数据库驱动(驱动由 @visiblebase/node 等适配器提供)。
6
+ */
7
+ // ===========================================================================
8
+ // executeDDL
9
+ // ===========================================================================
10
+ /**
11
+ * 执行 DDL 语句。
12
+ *
13
+ * 自动适配同步(SQLite exec)和异步(Postgres unsafe)两种驱动。
14
+ *
15
+ * @param db - 包含 $client 的数据库实例
16
+ * @param ddl - 要执行的 DDL SQL 字符串
17
+ */
18
+ export async function executeDDL(db, ddl) {
19
+ const c = db.$client;
20
+ if (typeof c?.exec === "function") {
21
+ c.exec(ddl);
22
+ return;
23
+ }
24
+ if (typeof c?.unsafe === "function") {
25
+ await c.unsafe(ddl);
26
+ }
27
+ }
28
+ //# sourceMappingURL=db.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/store/db.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAqDH,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,EAAyB,EAAE,GAAW;IACrE,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC;IACrB,IAAI,OAAO,CAAC,EAAE,IAAI,KAAK,UAAU,EAAE,CAAC;QAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAAC,OAAO;IAAC,CAAC;IAC3D,IAAI,OAAO,CAAC,EAAE,MAAM,KAAK,UAAU,EAAE,CAAC;QAAC,MAAM,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAAC,CAAC;AAC/D,CAAC"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * 通用表操作模块。
3
+ *
4
+ * 基于 Drizzle query builder 提供动态用户表的 CRUD。
5
+ * 构造时做一次 Database 转换,后续方法零类型断言。
6
+ */
7
+ import type { AnyPgTable } from "drizzle-orm/pg-core";
8
+ import type { AnySQLiteTable } from "drizzle-orm/sqlite-core";
9
+ import type { Database } from "./db.js";
10
+ export interface BaseTableApi<TRow = Record<string, unknown>> {
11
+ /** 表在数据库中的真实名称 */
12
+ readonly name: string;
13
+ /** 原始 Drizzle table 对象 */
14
+ readonly schema: AnySQLiteTable | AnyPgTable;
15
+ /** 读取表数据 */
16
+ select(where?: Partial<TRow>): Promise<TRow[]>;
17
+ /** 插入一行或多行数据 */
18
+ insert(values: Partial<TRow> | Partial<TRow>[]): Promise<void>;
19
+ /** 按 where 等值条件更新数据 */
20
+ update(input: {
21
+ where: Partial<TRow>;
22
+ values: Partial<TRow>;
23
+ }): Promise<number>;
24
+ /** 按 where 等值条件删除数据 */
25
+ delete(where: Partial<TRow>): Promise<number>;
26
+ }
27
+ export declare class TableApi implements BaseTableApi {
28
+ readonly name: string;
29
+ readonly schema: AnySQLiteTable | AnyPgTable;
30
+ private readonly db;
31
+ constructor(db: Database, schema: AnySQLiteTable | AnyPgTable);
32
+ select(where?: Record<string, unknown>): Promise<Record<string, unknown>[]>;
33
+ insert(values: Record<string, unknown> | Record<string, unknown>[]): Promise<void>;
34
+ update(input: {
35
+ where: Record<string, unknown>;
36
+ values: Record<string, unknown>;
37
+ }): Promise<number>;
38
+ delete(where: Record<string, unknown>): Promise<number>;
39
+ }
40
+ /** 用户表建表 DDL */
41
+ export declare function buildCreateUserTableSQL(table: AnySQLiteTable | AnyPgTable): string;
42
+ //# sourceMappingURL=table-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table-api.d.ts","sourceRoot":"","sources":["../../src/store/table-api.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAQ9D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAOxC,MAAM,WAAW,YAAY,CAAC,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC1D,kBAAkB;IAClB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,0BAA0B;IAC1B,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,UAAU,CAAC;IAC7C,YAAY;IACZ,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAC/C,gBAAgB;IAChB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/D,uBAAuB;IACvB,MAAM,CAAC,KAAK,EAAE;QAAE,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAChF,uBAAuB;IACvB,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC/C;AAMD,qBAAa,QAAS,YAAW,YAAY;IAC3C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,UAAU,CAAC;IAE7C,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAW;gBAElB,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,GAAG,UAAU;IAMvD,MAAM,CAAC,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAO/E,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAMlF,MAAM,CAAC,KAAK,EAAE;QAClB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACjC,GAAG,OAAO,CAAC,MAAM,CAAC;IAWb,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;CAM9D;AAMD,gBAAgB;AAChB,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,cAAc,GAAG,UAAU,GAAG,MAAM,CA4BlF"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * 通用表操作模块。
3
+ *
4
+ * 基于 Drizzle query builder 提供动态用户表的 CRUD。
5
+ * 构造时做一次 Database 转换,后续方法零类型断言。
6
+ */
7
+ import { getTableColumns, getTableName, eq, and, } from "drizzle-orm";
8
+ // ===========================================================================
9
+ // TableApi — 动态用户表 CRUD
10
+ // ===========================================================================
11
+ export class TableApi {
12
+ name;
13
+ schema;
14
+ db;
15
+ constructor(db, schema) {
16
+ this.db = db;
17
+ this.schema = schema;
18
+ this.name = getTableName(schema);
19
+ }
20
+ async select(where = {}) {
21
+ const cond = buildCondition(this.schema, where);
22
+ const query = this.db.select().from(this.schema);
23
+ const rows = cond ? await query.where(cond) : await query;
24
+ return rows.map((row) => ({ ...row }));
25
+ }
26
+ async insert(values) {
27
+ const rows = Array.isArray(values) ? values : [values];
28
+ if (rows.length === 0)
29
+ throw new TypeError("insert() values cannot be empty");
30
+ await this.db.insert(this.schema).values(rows);
31
+ }
32
+ async update(input) {
33
+ if (Object.keys(input.values).length === 0) {
34
+ throw new TypeError("update() values cannot be empty");
35
+ }
36
+ const cond = buildCondition(this.schema, input.where);
37
+ if (!cond)
38
+ throw new TypeError("update() where cannot be empty");
39
+ // Drizzle update 返回类型因方言而异
40
+ const result = await this.db.update(this.schema).set(input.values).where(cond);
41
+ return typeof result.changes === "number" ? result.changes : Array.isArray(result) ? result.length : 0;
42
+ }
43
+ async delete(where) {
44
+ const cond = buildCondition(this.schema, where);
45
+ if (!cond)
46
+ throw new TypeError("delete() where cannot be empty");
47
+ const result = await this.db.delete(this.schema).where(cond);
48
+ return typeof result.changes === "number" ? result.changes : Array.isArray(result) ? result.length : 0;
49
+ }
50
+ }
51
+ // ===========================================================================
52
+ // DDL 生成(仅在 store init 时使用)
53
+ // ===========================================================================
54
+ /** 用户表建表 DDL */
55
+ export function buildCreateUserTableSQL(table) {
56
+ const tableName = getTableName(table);
57
+ const colDefs = [];
58
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
59
+ for (const key of Object.keys(table)) {
60
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
61
+ const col = table[key];
62
+ if (!col || typeof col.name !== "string")
63
+ continue;
64
+ const name = String(col.name);
65
+ const dataType = String(col.dataType ?? "string");
66
+ const isPrimary = Boolean(col.primary ?? false);
67
+ const isNotNull = Boolean(col.notNull ?? false);
68
+ const sqlType = dataType === "number" ? "INTEGER"
69
+ : dataType === "boolean" ? "INTEGER"
70
+ : dataType === "json" ? "TEXT"
71
+ : "TEXT";
72
+ const parts = [`"${name}"`, sqlType];
73
+ if (isPrimary)
74
+ parts.push("PRIMARY KEY");
75
+ if (isNotNull && !isPrimary)
76
+ parts.push("NOT NULL");
77
+ colDefs.push(parts.join(" "));
78
+ }
79
+ if (colDefs.length === 0)
80
+ return "";
81
+ return `CREATE TABLE IF NOT EXISTS "${tableName}" (${colDefs.join(", ")})`;
82
+ }
83
+ // ===========================================================================
84
+ // 内部辅助
85
+ // ===========================================================================
86
+ function buildCondition(table, where) {
87
+ const entries = Object.entries(where);
88
+ if (entries.length === 0)
89
+ return undefined;
90
+ const columns = getTableColumns(table);
91
+ return and(...entries.map(([key, value]) => {
92
+ const col = columns[key];
93
+ if (!col)
94
+ throw new TypeError(`Unknown column for ${getTableName(table)}: ${key}`);
95
+ return eq(col, value);
96
+ }));
97
+ }
98
+ //# sourceMappingURL=table-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table-api.js","sourceRoot":"","sources":["../../src/store/table-api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * 数据库 schema 相关类型模块。
3
+ *
4
+ * 定义 Base Runtime 和用户业务表的数据库 schema 输入类型。
5
+ */
6
+ import type { AnyPgTable } from "drizzle-orm/pg-core";
7
+ import type { AnySQLiteTable } from "drizzle-orm/sqlite-core";
8
+ /**
9
+ * 用户传给 Base 的业务数据库 schema。
10
+ *
11
+ * key 是业务表在 `base.table(key)` 中使用的名称,value 是 Drizzle table 对象。
12
+ */
13
+ export type BaseUserSchemaInput = Record<string, AnySQLiteTable | AnyPgTable>;
14
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/store/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE9D;;;;GAIG;AACH,MAAM,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,GAAG,UAAU,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * 数据库 schema 相关类型模块。
3
+ *
4
+ * 定义 Base Runtime 和用户业务表的数据库 schema 输入类型。
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/store/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * 通用工具模块。
3
+ *
4
+ * 提供 HTTP 工具函数、SQL 标识符引用、env key 校验等通用辅助。
5
+ * 所有错误统一抛 ErrorWithStatus,由 router 顶层的 try/catch 转成 JSON Response。
6
+ *
7
+ * 零运行时依赖,使用 Web Crypto API 替代 node:crypto。
8
+ */
9
+ /**
10
+ * 带 HTTP 状态码的错误对象。
11
+ */
12
+ export interface ErrorWithStatus extends Error {
13
+ /**
14
+ * 要返回给客户端的 HTTP 状态码。
15
+ */
16
+ statusCode?: number;
17
+ }
18
+ /**
19
+ * 从 Request body 中读取 JSON。
20
+ */
21
+ export declare function readJSON<T extends object>(request: Request): Promise<T>;
22
+ /**
23
+ * 从已读取的文本中解析 JSON。
24
+ */
25
+ export declare function parseJSONText<T extends object>(text: string): T;
26
+ /**
27
+ * 读取 Bearer token。
28
+ */
29
+ export declare function bearerToken(request: Request): string | undefined;
30
+ /**
31
+ * 生成 JSON Response。
32
+ */
33
+ export declare function json(body: unknown, status?: number): Response;
34
+ /**
35
+ * 创建带 HTTP 状态码的错误。
36
+ */
37
+ export declare function httpError(statusCode: number, message: string): ErrorWithStatus;
38
+ /**
39
+ * 把 unknown 错误统一成 Error。
40
+ */
41
+ export declare function normalizeCaughtError(error: unknown): ErrorWithStatus;
42
+ /**
43
+ * SQL 标识符引用(双引号转义)。
44
+ *
45
+ * 用于动态拼接 SQL 时安全地引用表名、列名等标识符。
46
+ */
47
+ export declare function quoteIdent(value: string): string;
48
+ /**
49
+ * 标准化 env key。
50
+ *
51
+ * 规则:转大写、去首尾空格;只允许 A-Z、0-9、_,且不能以数字开头。
52
+ */
53
+ export declare function normalizeEnvKey(value: unknown): string;
54
+ /**
55
+ * 解析 .env 文本格式的环境变量(兼容 export 前缀)。
56
+ *
57
+ * 纯函数,零依赖,可在任何运行时使用。
58
+ *
59
+ * @param raw - .env 文本内容
60
+ * @returns 解析出的键值对数组
61
+ */
62
+ export declare function parseDotenvEntries(raw: unknown): {
63
+ key: string;
64
+ value: string;
65
+ }[];
66
+ /**
67
+ * 生成加密级随机字符串(base64url 编码)。
68
+ *
69
+ * 使用 Web Crypto API 的 crypto.getRandomValues,
70
+ * 兼容 Node.js、Cloudflare Workers、Deno、Bun、浏览器等所有现代运行时。
71
+ *
72
+ * @param size - 随机字节数,默认 32
73
+ */
74
+ export declare function randomSecret(size?: number): string;
75
+ /**
76
+ * 将 Uint8Array 编码为 base64url 字符串。
77
+ *
78
+ * 与 Buffer.toString("base64url") 行为一致。
79
+ */
80
+ export declare function base64UrlEncodeBytes(bytes: Uint8Array): string;
81
+ /**
82
+ * 将 base64url 字符串解码为 Uint8Array。
83
+ *
84
+ * 与 Buffer.from(str, "base64url") 行为一致。
85
+ */
86
+ export declare function base64UrlDecodeBytes(str: string): Uint8Array;
87
+ /**
88
+ * 将字符串编码为 base64url。
89
+ */
90
+ export declare function base64UrlEncode(data: string): string;
91
+ /**
92
+ * 将 base64url 字符串解码为 UTF-8 字符串。
93
+ */
94
+ export declare function base64UrlDecode(str: string): string;
95
+ /**
96
+ * 时间安全的字节比较。
97
+ *
98
+ * 替代 node:crypto 的 timingSafeEqual,在所有运行时中行为一致。
99
+ */
100
+ export declare function timingSafeEqualBytes(a: Uint8Array, b: Uint8Array): boolean;
101
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/utils/helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH;;GAEG;AACH,MAAM,WAAW,eAAgB,SAAQ,KAAK;IAC5C;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAMD;;GAEG;AACH,wBAAsB,QAAQ,CAAC,CAAC,SAAS,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAG7E;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,CAK/D;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAMhE;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,SAAM,GAAG,QAAQ,CAO1D;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,eAAe,CAI9E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe,CAKpE;AAMD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEhD;AAMD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAMtD;AAMD;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,CAsBjF;AAiBD;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,IAAI,SAAK,GAAG,MAAM,CAG9C;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAG9D;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAI5D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,GAAG,OAAO,CAO1E"}