@visiblebase/core 0.2.0 → 0.2.3

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 (57) hide show
  1. package/README.md +12 -11
  2. package/bin/core/auth/authenticator.d.ts +17 -6
  3. package/bin/core/auth/authenticator.d.ts.map +1 -1
  4. package/bin/core/auth/authenticator.js +49 -30
  5. package/bin/core/auth/authenticator.js.map +1 -1
  6. package/bin/core/base/base.d.ts +11 -40
  7. package/bin/core/base/base.d.ts.map +1 -1
  8. package/bin/core/base/base.js +146 -102
  9. package/bin/core/base/base.js.map +1 -1
  10. package/bin/core/runtime.d.ts +10 -0
  11. package/bin/core/runtime.d.ts.map +1 -1
  12. package/bin/index.d.ts +5 -14
  13. package/bin/index.d.ts.map +1 -1
  14. package/bin/index.js +5 -14
  15. package/bin/index.js.map +1 -1
  16. package/bin/service/action.d.ts +44 -0
  17. package/bin/service/action.d.ts.map +1 -0
  18. package/bin/service/action.js +48 -0
  19. package/bin/service/action.js.map +1 -0
  20. package/bin/service/ai/ai-service.d.ts +36 -60
  21. package/bin/service/ai/ai-service.d.ts.map +1 -1
  22. package/bin/service/ai/ai-service.js +194 -120
  23. package/bin/service/ai/ai-service.js.map +1 -1
  24. package/bin/service/ai/provider.d.ts +24 -58
  25. package/bin/service/ai/provider.d.ts.map +1 -1
  26. package/bin/service/ai/provider.js +20 -41
  27. package/bin/service/ai/provider.js.map +1 -1
  28. package/bin/service/ai/types.d.ts +57 -35
  29. package/bin/service/ai/types.d.ts.map +1 -1
  30. package/bin/service/ai/types.js +1 -1
  31. package/bin/service/env/env-service.d.ts +0 -4
  32. package/bin/service/env/env-service.d.ts.map +1 -1
  33. package/bin/service/env/env-service.js +15 -25
  34. package/bin/service/env/env-service.js.map +1 -1
  35. package/bin/service/hook.d.ts +8 -5
  36. package/bin/service/hook.d.ts.map +1 -1
  37. package/bin/service/hook.js +11 -14
  38. package/bin/service/hook.js.map +1 -1
  39. package/bin/service/plugin.d.ts +20 -96
  40. package/bin/service/plugin.d.ts.map +1 -1
  41. package/bin/service/plugin.js +24 -61
  42. package/bin/service/plugin.js.map +1 -1
  43. package/bin/service/products/products-service.d.ts +0 -5
  44. package/bin/service/products/products-service.d.ts.map +1 -1
  45. package/bin/service/products/products-service.js +19 -25
  46. package/bin/service/products/products-service.js.map +1 -1
  47. package/bin/service/service.d.ts +76 -65
  48. package/bin/service/service.d.ts.map +1 -1
  49. package/bin/service/service.js +47 -80
  50. package/bin/service/service.js.map +1 -1
  51. package/bin/service/types.d.ts +2 -8
  52. package/bin/service/types.d.ts.map +1 -1
  53. package/bin/store/db.d.ts +5 -4
  54. package/bin/store/db.d.ts.map +1 -1
  55. package/bin/store/db.js +3 -2
  56. package/bin/store/db.js.map +1 -1
  57. package/package.json +8 -9
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
- # @visiblebase/base
1
+ # @visiblebase/core
2
2
 
3
- `@visiblebase/base` 是 VisibleBase 的服务端 Runtime。
3
+ `@visiblebase/core` 是 VisibleBase 的服务端 Runtime。
4
4
 
5
5
  它负责这些共用能力:
6
6
 
@@ -13,7 +13,7 @@
13
13
  ## 安装
14
14
 
15
15
  ```bash
16
- pnpm add @visiblebase/base
16
+ pnpm add @visiblebase/core
17
17
  ```
18
18
 
19
19
  需要 Node `>=22.13.0`。
@@ -21,7 +21,7 @@ pnpm add @visiblebase/base
21
21
  ## 最小示例
22
22
 
23
23
  ```ts
24
- import { Base } from "@visiblebase/base";
24
+ import { Base } from "@visiblebase/core";
25
25
 
26
26
  const base = new Base();
27
27
 
@@ -70,7 +70,7 @@ console.log(`VisibleBase listening on http://${server.host}:${server.port}`);
70
70
 
71
71
  ```ts
72
72
  import { sqliteTable, text } from "drizzle-orm/sqlite-core";
73
- import { Base } from "@visiblebase/base";
73
+ import { Base } from "@visiblebase/core";
74
74
 
75
75
  const notes = sqliteTable("notes", {
76
76
  id: text("id").primaryKey(),
@@ -96,14 +96,14 @@ const rows = await base.table("notes").select();
96
96
  插件用于把多个 client 产品会复用的 Base 能力封装起来,例如用户注册登录、支付、订阅权益、usage 扣费或通知。
97
97
 
98
98
  ```ts
99
- import { Base } from "@visiblebase/base";
100
- import { authPlugin } from "@visiblebase/plugin-auth";
99
+ import { Base } from "@visiblebase/core";
100
+ import { accountsPlugin } from "@visiblebase/plugin-accounts";
101
101
  import { usagePlugin } from "@visiblebase/plugin-usage";
102
102
  import { stripePaymentPlugin } from "@visiblebase/plugin-payment-stripe";
103
103
 
104
104
  const base = new Base({
105
105
  plugins: [
106
- authPlugin(),
106
+ accountsPlugin(),
107
107
  usagePlugin(),
108
108
  stripePaymentPlugin(),
109
109
  ],
@@ -114,10 +114,11 @@ Base 使用者不需要为官方插件定义数据库表。插件包内部会声
114
114
 
115
115
  `models` 和 `products` 也是默认内置插件。你不传 `plugins` 时,Base 会自动启用它们;你传入其他插件时,它们仍然保留;如果你传入同 ID 的 `models` 或 `products` 插件,则会替换默认实现。
116
116
 
117
- 插件路由按鉴权模式挂载:
117
+ 插件路由统一挂到同一个 `/v1/{pluginId}/{path}` 空间。
118
118
 
119
- - `auth: "public"` `auth: "user"`:`/v1/plugins/{pluginId}/{path}`
120
- - `auth: "admin"`:`/api/admin/plugins/{pluginId}/{path}`
119
+ - `auth` 不传:默认要求 `user`
120
+ - `auth: ["admin"]`:只允许 admin
121
+ - `auth: []`:免登录
121
122
 
122
123
  如果你在开发插件,插件可以声明自己的 `schema`,并通过 `ctx.table(name)` 读写插件表;也可以通过 `ctx.hook.before()`、`ctx.hook.after()` 和 `ctx.hook.onError()` 介入 service 调用。
123
124
 
@@ -6,14 +6,14 @@
6
6
  *
7
7
  * TokenSigner 实例通过 getSigner() 缓存,避免重复 new TokenSigner(key)。
8
8
  */
9
- import type { RouteAuth } from "../../service/service.js";
9
+ import { type RouteAuth, type RouteIdentity } from "../../service/service.js";
10
10
  import type { EnvProvider } from "../runtime.js";
11
11
  import type { CreateUserTokenInput, UserTokenPayload, UserTokenIssueResult, RuntimeUser } from "./types.js";
12
12
  /** 鉴权级别 */
13
13
  /** 鉴权结果 */
14
14
  export interface AuthResult {
15
15
  /** 鉴权后的实际级别 */
16
- level: RouteAuth;
16
+ level: RouteIdentity;
17
17
  /** 解析出的用户信息(user 级别时可用) */
18
18
  user?: RuntimeUser;
19
19
  /** 解析出的 Product 信息(user 级别时可用) */
@@ -43,13 +43,24 @@ export declare class Authenticator {
43
43
  */
44
44
  private getSigner;
45
45
  /**
46
- * 对请求执行鉴权。
46
+ * 解析请求身份。
47
47
  *
48
48
  * @param request - 原始 HTTP Request
49
- * @param required - 要求的鉴权级别
50
- * @returns 鉴权结果(含 user/product 信息)
49
+ * @returns 当前请求身份;无 token 或 token 无效时返回 guest
51
50
  */
52
- authenticate(request: Request, required: RouteAuth): Promise<AuthResult>;
51
+ resolve(request: Request): Promise<AuthResult>;
52
+ /**
53
+ * 根据 action 的 auth 配置判断当前身份是否允许继续。
54
+ *
55
+ * @param result - 当前已解析身份
56
+ * @param required - action 声明的允许身份集合
57
+ * @returns 通过授权后的身份结果
58
+ */
59
+ authorize(result: AuthResult, required?: RouteAuth): AuthResult;
60
+ /**
61
+ * 对请求执行鉴权并强制满足 action 的 auth 配置。
62
+ */
63
+ authenticate(request: Request, required?: RouteAuth): Promise<AuthResult>;
53
64
  /**
54
65
  * 签发 user_token(验证 product 状态后签发)。
55
66
  *
@@ -1 +1 @@
1
- {"version":3,"file":"authenticator.d.ts","sourceRoot":"","sources":["../../../src/core/auth/authenticator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD,OAAO,KAAK,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE5G,WAAW;AACX,WAAW;AACX,MAAM,WAAW,UAAU;IACzB,eAAe;IACf,KAAK,EAAE,SAAS,CAAC;IACjB,2BAA2B;IAC3B,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,kCAAkC;IAClC,OAAO,CAAC,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAClD;AAED,YAAY;AACZ,qBAAa,aAAa;IAKtB,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,KAAK;IALf,yBAAyB;IACzB,OAAO,CAAC,WAAW,CAAC,CAAc;gBAGxB,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,MAAM,OAAO,CAAC;QAAE,OAAO,EAAE;YAAE,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;gBAAE,UAAU,EAAE,MAAM,CAAC;gBAAC,MAAM,EAAE,MAAM,CAAA;aAAE,GAAG,SAAS,CAAC,CAAA;SAAE,CAAA;KAAE,CAAC;IAG7H;;;;OAIG;IACH,OAAO,CAAC,SAAS;IASjB;;;;;;OAMG;IACG,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC;IAgC9E;;;;;OAKG;IACG,WAAW,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAiB7E;;;;;OAKG;IACG,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAG5D"}
1
+ {"version":3,"file":"authenticator.d.ts","sourceRoot":"","sources":["../../../src/core/auth/authenticator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAsB,KAAK,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAClG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD,OAAO,KAAK,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE5G,WAAW;AACX,WAAW;AACX,MAAM,WAAW,UAAU;IACzB,eAAe;IACf,KAAK,EAAE,aAAa,CAAC;IACrB,2BAA2B;IAC3B,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,kCAAkC;IAClC,OAAO,CAAC,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAClD;AAED,YAAY;AACZ,qBAAa,aAAa;IAKtB,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,KAAK;IALf,yBAAyB;IACzB,OAAO,CAAC,WAAW,CAAC,CAAc;gBAGxB,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,MAAM,OAAO,CAAC;QAAE,OAAO,EAAE;YAAE,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;gBAAE,UAAU,EAAE,MAAM,CAAC;gBAAC,MAAM,EAAE,MAAM,CAAA;aAAE,GAAG,SAAS,CAAC,CAAA;SAAE,CAAA;KAAE,CAAC;IAG7H;;;;OAIG;IACH,OAAO,CAAC,SAAS;IASjB;;;;;OAKG;IACG,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC;IA0BpD;;;;;;OAMG;IACH,SAAS,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,SAAS,GAAG,UAAU;IAY/D;;OAEG;IACG,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC;IAI/E;;;;;OAKG;IACG,WAAW,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAiB7E;;;;;OAKG;IACG,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAG5D"}
@@ -8,6 +8,7 @@
8
8
  */
9
9
  import { bearerToken, httpError } from "../../utils/helpers.js";
10
10
  import { TokenSigner } from "./token-signer.js";
11
+ import { normalizeRouteAuth } from "../../service/service.js";
11
12
  /** 统一鉴权器 */
12
13
  export class Authenticator {
13
14
  env;
@@ -33,42 +34,60 @@ export class Authenticator {
33
34
  return this.tokenSigner;
34
35
  }
35
36
  /**
36
- * 对请求执行鉴权。
37
+ * 解析请求身份。
37
38
  *
38
39
  * @param request - 原始 HTTP Request
39
- * @param required - 要求的鉴权级别
40
- * @returns 鉴权结果(含 user/product 信息)
40
+ * @returns 当前请求身份;无 token 或 token 无效时返回 guest
41
41
  */
42
- async authenticate(request, required) {
43
- if (required === "public") {
44
- return { level: "public" };
45
- }
42
+ async resolve(request) {
46
43
  const token = bearerToken(request);
47
- if (!token) {
48
- throw httpError(401, "Missing authorization token");
49
- }
50
- // admin 鉴权
51
- if (required === "admin") {
52
- const adminKey = this.env.get("VISIBLEBASE_ADMIN_SECRET_KEY");
53
- if (!adminKey)
54
- throw httpError(500, "VISIBLEBASE_ADMIN_SECRET_KEY is required");
55
- if (token !== adminKey)
56
- throw httpError(401, "Invalid admin_secret_key");
44
+ if (!token)
45
+ return { level: "guest" };
46
+ const adminKey = this.env.get("VISIBLEBASE_ADMIN_SECRET_KEY");
47
+ if (adminKey && token === adminKey) {
57
48
  return { level: "admin" };
58
49
  }
59
- // user 鉴权
60
- const payload = await this.getSigner().verify(token);
61
- const store = await this.store();
62
- const product = await store.product.get(payload.product_id);
63
- if (!product)
64
- throw httpError(401, "Unknown token product");
65
- if (product.status !== "active")
66
- throw httpError(403, "Token product is not active");
67
- return {
68
- level: "user",
69
- user: { user_id: payload.user_id, metadata: payload.metadata ?? {} },
70
- product,
71
- };
50
+ try {
51
+ const payload = await this.getSigner().verify(token);
52
+ const store = await this.store();
53
+ const product = await store.product.get(payload.product_id);
54
+ if (!product)
55
+ return { level: "guest" };
56
+ if (product.status !== "active")
57
+ return { level: "guest" };
58
+ return {
59
+ level: "user",
60
+ user: { user_id: payload.user_id, metadata: payload.metadata ?? {} },
61
+ product,
62
+ };
63
+ }
64
+ catch {
65
+ return { level: "guest" };
66
+ }
67
+ }
68
+ /**
69
+ * 根据 action 的 auth 配置判断当前身份是否允许继续。
70
+ *
71
+ * @param result - 当前已解析身份
72
+ * @param required - action 声明的允许身份集合
73
+ * @returns 通过授权后的身份结果
74
+ */
75
+ authorize(result, required) {
76
+ const allowed = normalizeRouteAuth(required);
77
+ if (allowed.length === 0)
78
+ return result;
79
+ if (result.level !== "guest" && allowed.includes(result.level))
80
+ return result;
81
+ if (result.level === "guest") {
82
+ throw httpError(401, "Authentication required");
83
+ }
84
+ throw httpError(403, `Forbidden for identity: ${result.level}`);
85
+ }
86
+ /**
87
+ * 对请求执行鉴权并强制满足 action 的 auth 配置。
88
+ */
89
+ async authenticate(request, required) {
90
+ return this.authorize(await this.resolve(request), required);
72
91
  }
73
92
  /**
74
93
  * 签发 user_token(验证 product 状态后签发)。
@@ -1 +1 @@
1
- {"version":3,"file":"authenticator.js","sourceRoot":"","sources":["../../../src/core/auth/authenticator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"authenticator.js","sourceRoot":"","sources":["../../../src/core/auth/authenticator.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,9 @@
1
1
  /**
2
2
  * Base Runtime 主模块。
3
3
  *
4
- * Base 是运行时容器,只负责:Service 路由、鉴权、HTTP
4
+ * Base 是运行时容器,负责:Service 生命周期、鉴权、HTTP 桥接。
5
5
  * 不知道任何具体 Service 的实现,所有 Service 通过 _onInit() 自初始化。
6
6
  *
7
- * 数据库连接、环境变量存储等运行时特定逻辑由 Runtime 适配器注入。
8
- *
9
7
  * 使用方式:
10
8
  * ```ts
11
9
  * import { Base } from "@visiblebase/core";
@@ -13,7 +11,6 @@
13
11
  *
14
12
  * const base = new Base({ runtime: node({ database: "sqlite:./data.sqlite" }) });
15
13
  * base.use(new AIService());
16
- * // 路由始终是标准 Hono app
17
14
  * serve({ fetch: base.router().fetch, port: 3000 });
18
15
  * ```
19
16
  */
@@ -26,6 +23,9 @@ import type { BaseOptions, BaseHealthStatus } from "../types.js";
26
23
  import type { RuntimeUser } from "../auth/types.js";
27
24
  declare module "hono" {
28
25
  interface ContextVariableMap {
26
+ identity?: {
27
+ kind: "guest" | "user" | "admin";
28
+ };
29
29
  user?: RuntimeUser;
30
30
  product?: {
31
31
  product_id: string;
@@ -33,12 +33,6 @@ declare module "hono" {
33
33
  };
34
34
  }
35
35
  }
36
- /**
37
- * VisibleBase 运行时容器。
38
- *
39
- * 接收 Service 注册、构建 Hono 路由、管理初始化生命周期。
40
- * 数据库和 env 通过 Runtime 适配器注入,不依赖任何特定运行时。
41
- */
42
36
  export declare class Base {
43
37
  private readonly runtime;
44
38
  private readonly services;
@@ -49,43 +43,13 @@ export declare class Base {
49
43
  private hono?;
50
44
  private authenticator?;
51
45
  constructor(options: BaseOptions);
52
- /**
53
- * 注册一个 Service。
54
- *
55
- * Service 在 Base 初始化时自动获得数据库、鉴权器、env 等基础设施。
56
- */
57
46
  use(svc: Service | BasePlugin): this;
58
- /** 获取指定 ID 的 Service */
59
47
  getService(id: string): Service | undefined;
60
- /** 获取所有已注册的 Service */
61
48
  getServices(): Service[];
62
49
  getAuthenticator(): Promise<Authenticator>;
63
- /**
64
- * 获取指定名称的数据库表 API。
65
- *
66
- * @param name - 表名(格式为 "service_id.table_name" 或内置表名)
67
- */
68
50
  table<TRow extends Record<string, unknown> = Record<string, unknown>>(name: string): Promise<BaseTableApi<TRow>>;
69
- /**
70
- * 获取 Hono 路由实例(需先完成初始化)。
71
- *
72
- * 路由可以直接挂载到任何支持 fetch 的 HTTP 服务器:
73
- * ```ts
74
- * // Node.js
75
- * serve({ fetch: base.router().fetch, port: 3000 });
76
- *
77
- * // Cloudflare Workers
78
- * export default { fetch: base.router().fetch };
79
- * ```
80
- */
81
51
  router(): Hono;
82
- /**
83
- * 直接处理一个 Request(用于 Serverless 场景)。
84
- */
85
52
  handleRequest(request: Request): Promise<Response>;
86
- /**
87
- * 健康检查。
88
- */
89
53
  health(): Promise<BaseHealthStatus>;
90
54
  private initialize;
91
55
  private collectServiceSchemas;
@@ -93,6 +57,13 @@ export declare class Base {
93
57
  private ensureReady;
94
58
  private requireReadySync;
95
59
  private requireReady;
60
+ /**
61
+ * 收集插件注册的全局 hook。
62
+ *
63
+ * Service.hook 只作用于当前 Service;Plugin.globalHook 用于 usage、
64
+ * billing 等需要观察所有用户侧调用的横切能力。
65
+ */
66
+ private globalPluginHooks;
96
67
  }
97
68
  export { Base as VisibleBase };
98
69
  //# sourceMappingURL=base.d.ts.map
@@ -1 +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"}
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/core/base/base.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAqC,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAChG,OAAO,EAAE,OAAO,EAAgB,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC5E,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;AAGpD,OAAO,QAAQ,MAAM,CAAC;IACpB,UAAU,kBAAkB;QAC1B,QAAQ,CAAC,EAAE;YAAE,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAA;SAAE,CAAC;QAChD,IAAI,CAAC,EAAE,WAAW,CAAC;QACnB,OAAO,CAAC,EAAE;YAAE,UAAU,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;KAClD;CACF;AAED,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,GAAG,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,GAAG,IAAI;IAMpC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAI3C,WAAW,IAAI,OAAO,EAAE;IAQlB,gBAAgB,IAAI,OAAO,CAAC,aAAa,CAAC;IAS1C,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,MAAM,IAAI,IAAI;IAKR,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC;IAKlD,MAAM,IAAI,OAAO,CAAC,gBAAgB,CAAC;YAgB3B,UAAU;IA8CxB,OAAO,CAAC,qBAAqB;IAoB7B,OAAO,CAAC,SAAS;YAkHH,WAAW;IAKzB,OAAO,CAAC,gBAAgB;YAIV,YAAY;IAM1B;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB;CAK1B;AAED,OAAO,EAAE,IAAI,IAAI,WAAW,EAAE,CAAC"}