@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,171 @@
1
+ /**
2
+ * Env 数据库 schema 模块。
3
+ *
4
+ * 定义 VisibleBase 内置的 Env 表结构(SQLite + Postgres)。
5
+ * Env 表存储运行时环境变量,优先级高于 `.env` 文件。
6
+ */
7
+ /**
8
+ * 默认 SQLite Env 表。
9
+ */
10
+ export declare const sqliteEnv: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{
11
+ name: "visiblebase_env";
12
+ schema: undefined;
13
+ columns: {
14
+ key: import("drizzle-orm/sqlite-core").SQLiteColumn<{
15
+ name: "key";
16
+ tableName: "visiblebase_env";
17
+ dataType: "string";
18
+ columnType: "SQLiteText";
19
+ data: string;
20
+ driverParam: string;
21
+ notNull: true;
22
+ hasDefault: false;
23
+ isPrimaryKey: true;
24
+ isAutoincrement: false;
25
+ hasRuntimeDefault: false;
26
+ enumValues: [string, ...string[]];
27
+ baseColumn: never;
28
+ identity: undefined;
29
+ generated: undefined;
30
+ }, {}, {
31
+ length: number | undefined;
32
+ }>;
33
+ value: import("drizzle-orm/sqlite-core").SQLiteColumn<{
34
+ name: "value";
35
+ tableName: "visiblebase_env";
36
+ dataType: "string";
37
+ columnType: "SQLiteText";
38
+ data: string;
39
+ driverParam: string;
40
+ notNull: true;
41
+ hasDefault: false;
42
+ isPrimaryKey: false;
43
+ isAutoincrement: false;
44
+ hasRuntimeDefault: false;
45
+ enumValues: [string, ...string[]];
46
+ baseColumn: never;
47
+ identity: undefined;
48
+ generated: undefined;
49
+ }, {}, {
50
+ length: number | undefined;
51
+ }>;
52
+ created_at: import("drizzle-orm/sqlite-core").SQLiteColumn<{
53
+ name: "created_at";
54
+ tableName: "visiblebase_env";
55
+ dataType: "string";
56
+ columnType: "SQLiteText";
57
+ data: string;
58
+ driverParam: string;
59
+ notNull: true;
60
+ hasDefault: false;
61
+ isPrimaryKey: false;
62
+ isAutoincrement: false;
63
+ hasRuntimeDefault: false;
64
+ enumValues: [string, ...string[]];
65
+ baseColumn: never;
66
+ identity: undefined;
67
+ generated: undefined;
68
+ }, {}, {
69
+ length: number | undefined;
70
+ }>;
71
+ updated_at: import("drizzle-orm/sqlite-core").SQLiteColumn<{
72
+ name: "updated_at";
73
+ tableName: "visiblebase_env";
74
+ dataType: "string";
75
+ columnType: "SQLiteText";
76
+ data: string;
77
+ driverParam: string;
78
+ notNull: true;
79
+ hasDefault: false;
80
+ isPrimaryKey: false;
81
+ isAutoincrement: false;
82
+ hasRuntimeDefault: false;
83
+ enumValues: [string, ...string[]];
84
+ baseColumn: never;
85
+ identity: undefined;
86
+ generated: undefined;
87
+ }, {}, {
88
+ length: number | undefined;
89
+ }>;
90
+ };
91
+ dialect: "sqlite";
92
+ }>;
93
+ /**
94
+ * 默认 Postgres Env 表。
95
+ */
96
+ export declare const pgEnv: import("drizzle-orm/pg-core").PgTableWithColumns<{
97
+ name: "visiblebase_env";
98
+ schema: undefined;
99
+ columns: {
100
+ key: import("drizzle-orm/pg-core").PgColumn<{
101
+ name: "key";
102
+ tableName: "visiblebase_env";
103
+ dataType: "string";
104
+ columnType: "PgText";
105
+ data: string;
106
+ driverParam: string;
107
+ notNull: true;
108
+ hasDefault: false;
109
+ isPrimaryKey: true;
110
+ isAutoincrement: false;
111
+ hasRuntimeDefault: false;
112
+ enumValues: [string, ...string[]];
113
+ baseColumn: never;
114
+ identity: undefined;
115
+ generated: undefined;
116
+ }, {}, {}>;
117
+ value: import("drizzle-orm/pg-core").PgColumn<{
118
+ name: "value";
119
+ tableName: "visiblebase_env";
120
+ dataType: "string";
121
+ columnType: "PgText";
122
+ data: string;
123
+ driverParam: string;
124
+ notNull: true;
125
+ hasDefault: false;
126
+ isPrimaryKey: false;
127
+ isAutoincrement: false;
128
+ hasRuntimeDefault: false;
129
+ enumValues: [string, ...string[]];
130
+ baseColumn: never;
131
+ identity: undefined;
132
+ generated: undefined;
133
+ }, {}, {}>;
134
+ created_at: import("drizzle-orm/pg-core").PgColumn<{
135
+ name: "created_at";
136
+ tableName: "visiblebase_env";
137
+ dataType: "string";
138
+ columnType: "PgText";
139
+ data: string;
140
+ driverParam: string;
141
+ notNull: true;
142
+ hasDefault: false;
143
+ isPrimaryKey: false;
144
+ isAutoincrement: false;
145
+ hasRuntimeDefault: false;
146
+ enumValues: [string, ...string[]];
147
+ baseColumn: never;
148
+ identity: undefined;
149
+ generated: undefined;
150
+ }, {}, {}>;
151
+ updated_at: import("drizzle-orm/pg-core").PgColumn<{
152
+ name: "updated_at";
153
+ tableName: "visiblebase_env";
154
+ dataType: "string";
155
+ columnType: "PgText";
156
+ data: string;
157
+ driverParam: string;
158
+ notNull: true;
159
+ hasDefault: false;
160
+ isPrimaryKey: false;
161
+ isAutoincrement: false;
162
+ hasRuntimeDefault: false;
163
+ enumValues: [string, ...string[]];
164
+ baseColumn: never;
165
+ identity: undefined;
166
+ generated: undefined;
167
+ }, {}, {}>;
168
+ };
169
+ dialect: "pg";
170
+ }>;
171
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/service/env/schema.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH;;GAEG;AACH,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoBpB,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoBhB,CAAC"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Env 数据库 schema 模块。
3
+ *
4
+ * 定义 VisibleBase 内置的 Env 表结构(SQLite + Postgres)。
5
+ * Env 表存储运行时环境变量,优先级高于 `.env` 文件。
6
+ */
7
+ import { pgTable, text as pgText } from "drizzle-orm/pg-core";
8
+ import { sqliteTable, text as sqliteText } from "drizzle-orm/sqlite-core";
9
+ const DEFAULT_ENV_TABLE = "visiblebase_env";
10
+ /**
11
+ * 默认 SQLite Env 表。
12
+ */
13
+ export const sqliteEnv = sqliteTable(DEFAULT_ENV_TABLE, {
14
+ /**
15
+ * Env key。
16
+ */
17
+ key: sqliteText("key").primaryKey(),
18
+ /**
19
+ * Env value。
20
+ */
21
+ value: sqliteText("value").notNull(),
22
+ /**
23
+ * 创建时间。
24
+ */
25
+ created_at: sqliteText("created_at").notNull(),
26
+ /**
27
+ * 更新时间。
28
+ */
29
+ updated_at: sqliteText("updated_at").notNull(),
30
+ });
31
+ /**
32
+ * 默认 Postgres Env 表。
33
+ */
34
+ export const pgEnv = pgTable(DEFAULT_ENV_TABLE, {
35
+ /**
36
+ * Env key。
37
+ */
38
+ key: pgText("key").primaryKey(),
39
+ /**
40
+ * Env value。
41
+ */
42
+ value: pgText("value").notNull(),
43
+ /**
44
+ * 创建时间。
45
+ */
46
+ created_at: pgText("created_at").notNull(),
47
+ /**
48
+ * 更新时间。
49
+ */
50
+ updated_at: pgText("updated_at").notNull(),
51
+ });
52
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/service/env/schema.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,IAAI,IAAI,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,IAAI,IAAI,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAE1E,MAAM,iBAAiB,GAAG,iBAAiB,CAAC;AAE5C;;GAEG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,WAAW,CAAC,iBAAiB,EAAE;IACtD;;OAEG;IACH,GAAG,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,UAAU,EAAE;IAEnC;;OAEG;IACH,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;IAEpC;;OAEG;IACH,UAAU,EAAE,UAAU,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE;IAE9C;;OAEG;IACH,UAAU,EAAE,UAAU,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE;CAC/C,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,OAAO,CAAC,iBAAiB,EAAE;IAC9C;;OAEG;IACH,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,UAAU,EAAE;IAE/B;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;IAEhC;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE;IAE1C;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE;CAC3C,CAAC,CAAC"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Env 层公共类型。
3
+ *
4
+ * 环境变量可以来源于 `.env` 文件或数据库。
5
+ * 数据库中的值优先级高于 `.env` 文件。
6
+ */
7
+ /**
8
+ * Runtime env 列表中的单条记录。
9
+ */
10
+ export interface EnvEntry extends Record<string, unknown> {
11
+ /**
12
+ * 标准化后的环境变量名。
13
+ */
14
+ key: string;
15
+ /**
16
+ * 环境变量明文值。
17
+ */
18
+ value: string;
19
+ /**
20
+ * env 值来源。
21
+ */
22
+ source: "database" | "dotenv";
23
+ }
24
+ /**
25
+ * 写入 env 时的输入。
26
+ */
27
+ export interface EnvUpsertInput {
28
+ /**
29
+ * 环境变量名。
30
+ */
31
+ key: string;
32
+ /**
33
+ * 环境变量值。
34
+ */
35
+ value: string;
36
+ }
37
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/service/env/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,WAAW,QAAS,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACvD;;OAEG;IACH,GAAG,EAAE,MAAM,CAAC;IAEZ;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,MAAM,EAAE,UAAU,GAAG,QAAQ,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,GAAG,EAAE,MAAM,CAAC;IAEZ;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;CACf"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Env 层公共类型。
3
+ *
4
+ * 环境变量可以来源于 `.env` 文件或数据库。
5
+ * 数据库中的值优先级高于 `.env` 文件。
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/service/env/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Hook 模块。
3
+ *
4
+ * Hook 是 service 执行生命周期中可注册的回调链,支持 before / after / onError 三个阶段。
5
+ * 所有 hook 函数接收 Context,可返回新 Context 替换当前。
6
+ */
7
+ import type { HookFn } from "./types.js";
8
+ import type { Context } from "./service.js";
9
+ export declare class Hook {
10
+ private befores;
11
+ private afters;
12
+ private errors;
13
+ before(fn: HookFn): this;
14
+ after(fn: HookFn): this;
15
+ onError(fn: HookFn): this;
16
+ runBefore(ctx: Context): Promise<Context>;
17
+ runAfter(ctx: Context): Promise<Context>;
18
+ runOnError(ctx: Context): Promise<void>;
19
+ }
20
+ //# sourceMappingURL=hook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook.d.ts","sourceRoot":"","sources":["../../src/service/hook.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,qBAAa,IAAI;IACf,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,MAAM,CAAgB;IAE9B,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAMxB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAMvB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAMnB,SAAS,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAQzC,QAAQ,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAQxC,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CAK9C"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Hook 模块。
3
+ *
4
+ * Hook 是 service 执行生命周期中可注册的回调链,支持 before / after / onError 三个阶段。
5
+ * 所有 hook 函数接收 Context,可返回新 Context 替换当前。
6
+ */
7
+ import { assertFunction } from "../utils/validation.js";
8
+ export class Hook {
9
+ befores = [];
10
+ afters = [];
11
+ errors = [];
12
+ before(fn) {
13
+ assertFunction(fn, "before");
14
+ this.befores.push(fn);
15
+ return this;
16
+ }
17
+ after(fn) {
18
+ assertFunction(fn, "after");
19
+ this.afters.push(fn);
20
+ return this;
21
+ }
22
+ onError(fn) {
23
+ assertFunction(fn, "onError");
24
+ this.errors.push(fn);
25
+ return this;
26
+ }
27
+ async runBefore(ctx) {
28
+ for (const fn of this.befores) {
29
+ const next = await fn(ctx);
30
+ if (next !== undefined)
31
+ ctx = next;
32
+ }
33
+ return ctx;
34
+ }
35
+ async runAfter(ctx) {
36
+ for (const fn of this.afters) {
37
+ const next = await fn(ctx);
38
+ if (next !== undefined)
39
+ ctx = next;
40
+ }
41
+ return ctx;
42
+ }
43
+ async runOnError(ctx) {
44
+ for (const fn of this.errors) {
45
+ try {
46
+ await fn(ctx);
47
+ }
48
+ catch { /* 不覆盖原始错误 */ }
49
+ }
50
+ }
51
+ }
52
+ //# sourceMappingURL=hook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook.js","sourceRoot":"","sources":["../../src/service/hook.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAIxD,MAAM,OAAO,IAAI;IACP,OAAO,GAAa,EAAE,CAAC;IACvB,MAAM,GAAa,EAAE,CAAC;IACtB,MAAM,GAAa,EAAE,CAAC;IAE9B,MAAM,CAAC,EAAU;QACf,cAAc,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QAC7B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,EAAU;QACd,cAAc,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QAC5B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CAAC,EAAU;QAChB,cAAc,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;QAC9B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,GAAY;QAC1B,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC9B,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC;YAC3B,IAAI,IAAI,KAAK,SAAS;gBAAE,GAAG,GAAG,IAAI,CAAC;QACrC,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,GAAY;QACzB,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC;YAC3B,IAAI,IAAI,KAAK,SAAS;gBAAE,GAAG,GAAG,IAAI,CAAC;QACrC,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,GAAY;QAC3B,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC7B,IAAI,CAAC;gBAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,aAAa,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,141 @@
1
+ /**
2
+ * Plugin 桥接模块。
3
+ *
4
+ * 提供 Plugin 基类,将旧的 Plugin API(install/route/table/hook)
5
+ * 桥接到新的 Service API。方便现有插件平滑迁移。
6
+ *
7
+ * Plugin = Service + install(ctx) 生命周期。
8
+ */
9
+ import { Service, type RouteAuth } from "./service.js";
10
+ import type { BaseTableApi } from "../store/table-api.js";
11
+ import type { CreateUserTokenInput, UserTokenIssueResult, RuntimeUser } from "../core/auth/types.js";
12
+ /**
13
+ * Plugin 安装上下文。
14
+ *
15
+ * 与 Service 不同,Plugin 通过 install() 手动注册路由和 hook,
16
+ * 而不是在构造函数中用 this.get()/this.post()。
17
+ */
18
+ export interface BasePluginContext {
19
+ /**
20
+ * 获取指定名称的数据库表 API。
21
+ */
22
+ table<TRow extends Record<string, unknown> = Record<string, unknown>>(name: string): BaseTableApi<TRow>;
23
+ /**
24
+ * 注册一个路由。
25
+ */
26
+ route(config: {
27
+ method: "GET" | "POST" | "PUT" | "PATCH" | "DELETE";
28
+ path: string;
29
+ auth?: RouteAuth;
30
+ /** 使用属性签名(非 method),避免 TypeScript 将 this 绑定到 config 对象 */
31
+ handler: (ctx: PluginRouteContext) => Promise<Response> | Response;
32
+ }): void;
33
+ /**
34
+ * 生命周期 hook。
35
+ */
36
+ hook: {
37
+ /** 请求前 */
38
+ before(fn: (ctx: ServiceContext) => Promise<void> | void): void;
39
+ /** 请求后 */
40
+ after(fn: (ctx: ServiceContext) => Promise<void> | void): void;
41
+ /** 请求出错 */
42
+ onError(fn: (ctx: ServiceContext) => Promise<void> | void): void;
43
+ };
44
+ /**
45
+ * 签发 user_token。
46
+ */
47
+ createUserToken(input: CreateUserTokenInput): Promise<UserTokenIssueResult>;
48
+ /**
49
+ * 读取环境变量。
50
+ */
51
+ env(key: string): string | undefined;
52
+ }
53
+ /**
54
+ * 路由 handler 的上下文。
55
+ */
56
+ export interface PluginRouteContext {
57
+ /** 当前用户 */
58
+ user: RuntimeUser;
59
+ /** 当前 Product */
60
+ product: {
61
+ product_id: string;
62
+ status: string;
63
+ };
64
+ /** 原始 Request */
65
+ request: Request;
66
+ /** JSON body 解析 */
67
+ json<T extends Record<string, unknown> = Record<string, unknown>>(): Promise<T>;
68
+ /** 文本 body 读取 */
69
+ text(): Promise<string>;
70
+ /** JSON 响应 */
71
+ jsonResponse(body: unknown, status?: number): Response;
72
+ }
73
+ /**
74
+ * Service hook 上下文。
75
+ */
76
+ export interface ServiceContext {
77
+ user: RuntimeUser;
78
+ product: {
79
+ product_id: string;
80
+ status: string;
81
+ };
82
+ service: string;
83
+ model?: {
84
+ id: string;
85
+ name: string;
86
+ meta?: Record<string, unknown>;
87
+ };
88
+ resolved_model_id?: string;
89
+ input: Record<string, unknown>;
90
+ started_at: Date;
91
+ ended_at?: Date;
92
+ error?: unknown;
93
+ }
94
+ /**
95
+ * Plugin 基类。
96
+ *
97
+ * 扩展自 Service,新增 install() 生命周期。
98
+ * 用法:
99
+ * ```ts
100
+ * class MyPlugin extends Plugin {
101
+ * install(ctx: BasePluginContext): void {
102
+ * ctx.route({ method: "GET", path: "/hello", handler: async (c) => c.jsonResponse({ ok: true }) });
103
+ * ctx.hook.before(async (sc) => { ... });
104
+ * }
105
+ * }
106
+ * ```
107
+ */
108
+ export declare abstract class Plugin extends Service {
109
+ /**
110
+ * 插件 schema(与 Service.tables 等价,提供别名兼容)。
111
+ *
112
+ * 子类通过 readonly schema = { ... } 定义,
113
+ * _onInit 中自动同步到 this.tables。
114
+ */
115
+ readonly schema?: Record<string, any>;
116
+ constructor();
117
+ /**
118
+ * 安装回调。
119
+ *
120
+ * 在 Base 初始化时自动调用,此时 _db/_client/_authenticator/_env 已就绪。
121
+ */
122
+ abstract install(ctx: BasePluginContext): void;
123
+ _onInit(): Promise<void>;
124
+ }
125
+ /**
126
+ * 函数式 Plugin(简化版,不需要 class)。
127
+ */
128
+ export type BasePlugin = {
129
+ id: string;
130
+ name?: string;
131
+ version?: string;
132
+ schema?: Record<string, unknown>;
133
+ install(ctx: BasePluginContext): void;
134
+ };
135
+ /**
136
+ * 将函数式 BasePlugin 包装为 Plugin 类实例。
137
+ *
138
+ * Base.use() 内部调用此函数,使 Service 和 BasePlugin 都可传入。
139
+ */
140
+ export declare function asPlugin(bp: BasePlugin): Plugin;
141
+ //# sourceMappingURL=plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/service/plugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Plugin 桥接模块。
3
+ *
4
+ * 提供 Plugin 基类,将旧的 Plugin API(install/route/table/hook)
5
+ * 桥接到新的 Service API。方便现有插件平滑迁移。
6
+ *
7
+ * Plugin = Service + install(ctx) 生命周期。
8
+ */
9
+ import { Service } from "./service.js";
10
+ import { TableApi } from "../store/table-api.js";
11
+ // ===========================================================================
12
+ // Plugin 基类
13
+ // ===========================================================================
14
+ /**
15
+ * Plugin 基类。
16
+ *
17
+ * 扩展自 Service,新增 install() 生命周期。
18
+ * 用法:
19
+ * ```ts
20
+ * class MyPlugin extends Plugin {
21
+ * install(ctx: BasePluginContext): void {
22
+ * ctx.route({ method: "GET", path: "/hello", handler: async (c) => c.jsonResponse({ ok: true }) });
23
+ * ctx.hook.before(async (sc) => { ... });
24
+ * }
25
+ * }
26
+ * ```
27
+ */
28
+ export class Plugin extends Service {
29
+ /**
30
+ * 插件 schema(与 Service.tables 等价,提供别名兼容)。
31
+ *
32
+ * 子类通过 readonly schema = { ... } 定义,
33
+ * _onInit 中自动同步到 this.tables。
34
+ */
35
+ schema;
36
+ constructor() {
37
+ // 占位 id — 子类的 readonly 字段初始化后会覆盖
38
+ super({ id: "plugin" });
39
+ }
40
+ async _onInit() {
41
+ // 同步 schema → tables(兼容旧插件用 schema 而非 tables)
42
+ if (this.schema && !this.tables) {
43
+ this.tables = this.schema;
44
+ }
45
+ const self = this;
46
+ const ctx = {
47
+ table(name) {
48
+ if (!self._db)
49
+ throw new Error("Plugin database not ready");
50
+ const table = self.tables?.[name];
51
+ if (!table)
52
+ throw new Error(`Unknown table: ${name}`);
53
+ return new TableApi(self._db, table);
54
+ },
55
+ route(config) {
56
+ const handler = async (svcCtx) => {
57
+ const result = await config.handler({
58
+ user: svcCtx.user ?? { user_id: "", metadata: {} },
59
+ product: svcCtx.product ?? { product_id: "", status: "active" },
60
+ request: svcCtx.request,
61
+ json: async () => {
62
+ return svcCtx.input;
63
+ },
64
+ text: async () => JSON.stringify(svcCtx.input),
65
+ jsonResponse: (body, status) => new Response(JSON.stringify(body), {
66
+ status,
67
+ headers: { "content-type": "application/json" },
68
+ }),
69
+ });
70
+ return result;
71
+ };
72
+ const methodMap = {
73
+ GET: self.get.bind(self),
74
+ POST: self.post.bind(self),
75
+ PUT: self.put.bind(self),
76
+ PATCH: self.patch.bind(self),
77
+ DELETE: self.delete.bind(self),
78
+ };
79
+ const register = methodMap[config.method];
80
+ if (register) {
81
+ register(config.path, handler, { auth: config.auth });
82
+ }
83
+ },
84
+ hook: {
85
+ before(fn) { self.hook.before(fn); },
86
+ after(fn) { self.hook.after(fn); },
87
+ onError(fn) { self.hook.onError(fn); },
88
+ },
89
+ async createUserToken(input) {
90
+ if (!self._authenticator)
91
+ throw new Error("Authenticator not ready");
92
+ return self._authenticator.createToken(input);
93
+ },
94
+ env(key) {
95
+ return self._env?.get(key);
96
+ },
97
+ };
98
+ this.install(ctx);
99
+ }
100
+ }
101
+ // ===========================================================================
102
+ // 将 BasePlugin 包装为 Plugin 实例
103
+ // ===========================================================================
104
+ /**
105
+ * 将函数式 BasePlugin 包装为 Plugin 类实例。
106
+ *
107
+ * Base.use() 内部调用此函数,使 Service 和 BasePlugin 都可传入。
108
+ */
109
+ export function asPlugin(bp) {
110
+ return new (class extends Plugin {
111
+ constructor() {
112
+ super();
113
+ this.id = bp.id;
114
+ if (bp.name)
115
+ this.name = bp.name;
116
+ if (bp.schema)
117
+ this.tables = bp.schema;
118
+ }
119
+ install(ctx) {
120
+ bp.install(ctx);
121
+ }
122
+ })();
123
+ }
124
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/service/plugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Product 数据存储。
3
+ *
4
+ * 基于 BaseTableApi,不直接依赖 Drizzle。
5
+ */
6
+ import type { BaseTableApi } from "../../store/table-api.js";
7
+ import type { Product, ProductCreateInput, ProductStatus } from "./types.js";
8
+ export declare class ProductStore {
9
+ private table;
10
+ constructor(table: BaseTableApi<Product>);
11
+ list(): Promise<Product[]>;
12
+ get(product_id: string): Promise<Product | undefined>;
13
+ create(input: ProductCreateInput): Promise<Product>;
14
+ setStatus(product_id: string, status: ProductStatus): Promise<Product>;
15
+ remove(product_id: string): Promise<void>;
16
+ }
17
+ //# sourceMappingURL=product-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"product-store.d.ts","sourceRoot":"","sources":["../../../src/service/products/product-store.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE7E,qBAAa,YAAY;IACX,OAAO,CAAC,KAAK;gBAAL,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC;IAE1C,IAAI,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAI1B,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;IAKrD,MAAM,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,CAAC;IAenD,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;IAWtE,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAGhD"}