vome-core 0.0.1
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/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/server/index.d.ts +1 -0
- package/dist/server/index.js +1 -0
- package/dist/src/auth/define-macro.d.ts +8 -0
- package/dist/src/auth/index.d.ts +2 -0
- package/dist/src/comm/daily-log.d.ts +8 -0
- package/dist/src/comm/env.d.ts +4 -0
- package/dist/src/comm/format-time.d.ts +10 -0
- package/dist/src/comm/merge.d.ts +2 -0
- package/dist/src/comm/scan.d.ts +4 -0
- package/dist/src/comm/startBanner.d.ts +1 -0
- package/dist/src/core/app.d.ts +37 -0
- package/dist/src/core/config.d.ts +2 -0
- package/dist/src/core/context/index.d.ts +22 -0
- package/dist/src/core/host-infra.d.ts +20 -0
- package/dist/src/core/index.d.ts +20 -0
- package/dist/src/core/plugins/async-context.d.ts +3 -0
- package/dist/src/core/plugins/error.d.ts +5 -0
- package/dist/src/core/plugins/logging.d.ts +3 -0
- package/dist/src/core/plugins/openapi.d.ts +3 -0
- package/dist/src/core/vome-config.d.ts +2 -0
- package/dist/src/ext/base-plugin.d.ts +13 -0
- package/dist/src/ext/index.d.ts +15 -0
- package/dist/src/ext/load-plugin.d.ts +12 -0
- package/dist/src/ext/micro-apps.d.ts +60 -0
- package/dist/src/ext/module-gateway.d.ts +10 -0
- package/dist/src/ext/module-registry.d.ts +45 -0
- package/dist/src/ext/path.d.ts +8 -0
- package/dist/src/index.d.ts +10 -0
- package/dist/src/ioc/container.d.ts +29 -0
- package/dist/src/ioc/decorators.d.ts +35 -0
- package/dist/src/ioc/host.d.ts +2 -0
- package/dist/src/ioc/index.d.ts +6 -0
- package/dist/src/ioc/metadata.d.ts +12 -0
- package/dist/src/ioc/scope.d.ts +9 -0
- package/dist/src/logger/bootstrap.d.ts +2 -0
- package/dist/src/logger/exception.d.ts +22 -0
- package/dist/src/logger/index.d.ts +5 -0
- package/dist/src/logger/logger.d.ts +18 -0
- package/dist/src/logger/pino.d.ts +8 -0
- package/dist/src/orm/base-columns.d.ts +11 -0
- package/dist/src/orm/column-comments.d.ts +25 -0
- package/dist/src/orm/crud-config.d.ts +7 -0
- package/dist/src/orm/crud-register.d.ts +5 -0
- package/dist/src/orm/data-scope.d.ts +24 -0
- package/dist/src/orm/db-store.d.ts +12 -0
- package/dist/src/orm/entity-schema.d.ts +7 -0
- package/dist/src/orm/index.d.ts +22 -0
- package/dist/src/orm/query-builder.d.ts +12 -0
- package/dist/src/orm/query-op.d.ts +27 -0
- package/dist/src/orm/repository.d.ts +74 -0
- package/dist/src/orm/service.d.ts +71 -0
- package/dist/src/orm/tenant.d.ts +24 -0
- package/dist/src/routing/base.d.ts +27 -0
- package/dist/src/routing/context.d.ts +14 -0
- package/dist/src/routing/crud-summary.d.ts +2 -0
- package/dist/src/routing/decorators.d.ts +48 -0
- package/dist/src/routing/eps.d.ts +16 -0
- package/dist/src/routing/index.d.ts +8 -0
- package/dist/src/routing/metadata.d.ts +28 -0
- package/dist/src/routing/openapi-tags.d.ts +23 -0
- package/dist/src/routing/path-utils.d.ts +5 -0
- package/dist/src/routing/perm.d.ts +18 -0
- package/dist/src/routing/register.d.ts +7 -0
- package/dist/src/server/index.d.ts +10 -0
- package/dist/src/shared/index.d.ts +8 -0
- package/dist/src/shared/tree.d.ts +18 -0
- package/dist/typings/comm/crud.d.ts +24 -0
- package/dist/typings/comm/page.d.ts +16 -0
- package/dist/typings/comm/scan.d.ts +6 -0
- package/dist/typings/common.d.ts +6 -0
- package/dist/typings/context/data.d.ts +10 -0
- package/dist/typings/ext/module.d.ts +45 -0
- package/dist/typings/ext/plugin.d.ts +40 -0
- package/dist/typings/ioc/metadata.d.ts +31 -0
- package/dist/typings/logger/config.d.ts +6 -0
- package/dist/typings/routing/crud.d.ts +99 -0
- package/dist/typings/routing/eps.d.ts +53 -0
- package/dist/typings/routing/meta.d.ts +56 -0
- package/dist/typings/routing/register.d.ts +15 -0
- package/dist/typings/routing/scan-context.d.ts +6 -0
- package/package.json +96 -0
- package/src/admin/api/client.ts +184 -0
- package/src/admin/components/vm-aside.vue +227 -0
- package/src/admin/components/vm-auto-perm-dialog.vue +361 -0
- package/src/admin/components/vm-check-tree.vue +338 -0
- package/src/admin/components/vm-dept-tree.vue +549 -0
- package/src/admin/components/vm-empty.vue +62 -0
- package/src/admin/components/vm-eps-perm-picker.vue +114 -0
- package/src/admin/components/vm-group-cascader.vue +563 -0
- package/src/admin/components/vm-icon-picker.vue +616 -0
- package/src/admin/components/vm-markdown.vue +141 -0
- package/src/admin/components/vm-ri-icon.vue +21 -0
- package/src/admin/components/vm-role-picker.vue +314 -0
- package/src/admin/components/vm-view-path-picker.vue +56 -0
- package/src/admin/config/plugin-dev.ts +31 -0
- package/src/admin/crud/components/vm-column-custom.vue +196 -0
- package/src/admin/crud/components/vm-context-menu.vue +99 -0
- package/src/admin/crud/components/vm-date-picker.vue +74 -0
- package/src/admin/crud/components/vm-date-range.vue +291 -0
- package/src/admin/crud/components/vm-date-text.vue +41 -0
- package/src/admin/crud/components/vm-dict-tag.vue +47 -0
- package/src/admin/crud/components/vm-file-icon.vue +54 -0
- package/src/admin/crud/components/vm-multi-select.vue +181 -0
- package/src/admin/crud/components/vm-number-range.vue +200 -0
- package/src/admin/crud/components/vm-radio.vue +87 -0
- package/src/admin/crud/components/vm-select.vue +131 -0
- package/src/admin/crud/components/vm-switch.vue +128 -0
- package/src/admin/crud/components/vm-tree-select.vue +456 -0
- package/src/admin/crud/components/vm-upload-item.vue +215 -0
- package/src/admin/crud/components/vm-upload.vue +323 -0
- package/src/admin/crud/components/vm-user-select.vue +234 -0
- package/src/admin/crud/config.ts +38 -0
- package/src/admin/crud/confirm.ts +135 -0
- package/src/admin/crud/dict.ts +49 -0
- package/src/admin/crud/index.ts +79 -0
- package/src/admin/crud/key.ts +47 -0
- package/src/admin/crud/mitt.ts +27 -0
- package/src/admin/crud/plugins.ts +298 -0
- package/src/admin/crud/registry.ts +45 -0
- package/src/admin/crud/span.ts +48 -0
- package/src/admin/crud/style.ts +112 -0
- package/src/admin/crud/useCrud.ts +81 -0
- package/src/admin/crud/validate.ts +109 -0
- package/src/admin/crud/vm-add-btn.vue +68 -0
- package/src/admin/crud/vm-adv-search.vue +73 -0
- package/src/admin/crud/vm-crud.vue +517 -0
- package/src/admin/crud/vm-dialog.vue +234 -0
- package/src/admin/crud/vm-flex1.vue +14 -0
- package/src/admin/crud/vm-form.vue +239 -0
- package/src/admin/crud/vm-multi-delete-btn.vue +48 -0
- package/src/admin/crud/vm-pagination.vue +125 -0
- package/src/admin/crud/vm-refresh-btn.vue +34 -0
- package/src/admin/crud/vm-row.vue +42 -0
- package/src/admin/crud/vm-search-key.vue +76 -0
- package/src/admin/crud/vm-search.vue +367 -0
- package/src/admin/crud/vm-table.vue +852 -0
- package/src/admin/crud/vm-toolbar.vue +245 -0
- package/src/admin/crud/vm-upsert.vue +530 -0
- package/src/admin/data/remixicon-all.json +1 -0
- package/src/admin/directives/perm.ts +18 -0
- package/src/admin/env.d.ts +5 -0
- package/src/admin/hooks/useBrowser.ts +27 -0
- package/src/admin/hooks/useUpload.ts +82 -0
- package/src/admin/hooks/useVome.ts +13 -0
- package/src/admin/index.ts +59 -0
- package/src/admin/lib/browser.ts +28 -0
- package/src/admin/lib/cn.ts +7 -0
- package/src/admin/lib/dialog-float.ts +14 -0
- package/src/admin/lib/eps.ts +43 -0
- package/src/admin/lib/menu.ts +15 -0
- package/src/admin/lib/module.ts +112 -0
- package/src/admin/lib/tree.ts +2 -0
- package/src/admin/lib/upload.ts +102 -0
- package/src/admin/router/index.ts +61 -0
- package/src/admin/router/menu-routes.ts +126 -0
- package/src/admin/service/base.ts +96 -0
- package/src/admin/service/index.ts +281 -0
- package/src/admin/static/fileicon/demo.css +539 -0
- package/src/admin/static/fileicon/demo_index.html +901 -0
- package/src/admin/static/fileicon/iconfont.css +139 -0
- package/src/admin/static/fileicon/iconfont.js +1 -0
- package/src/admin/static/fileicon/iconfont.json +226 -0
- package/src/admin/static/fileicon/iconfont.ttf +0 -0
- package/src/admin/static/fileicon/iconfont.woff +0 -0
- package/src/admin/static/fileicon/iconfont.woff2 +0 -0
- package/src/admin/static/scarce//344/270/213/350/275/275/345/244/261/350/264/245.svg +1 -0
- package/src/admin/static/scarce//346/224/257/344/273/230/346/210/220/345/212/237.svg +1 -0
- package/src/admin/static/scarce//346/232/202/346/227/240/344/274/230/346/203/240/345/210/270.svg +1 -0
- package/src/admin/static/scarce//346/232/202/346/227/240/345/206/205/345/256/271.svg +1 -0
- package/src/admin/static/scarce//346/232/202/346/227/240/345/217/221/347/245/250.svg +1 -0
- package/src/admin/static/scarce//346/232/202/346/227/240/345/233/276/347/211/207.svg +1 -0
- package/src/admin/static/scarce//346/232/202/346/227/240/345/234/260/345/235/200.svg +1 -0
- package/src/admin/static/scarce//346/232/202/346/227/240/345/272/227/351/223/272.svg +1 -0
- package/src/admin/static/scarce//346/232/202/346/227/240/346/216/250/351/200/201.svg +1 -0
- package/src/admin/static/scarce//346/232/202/346/227/240/346/220/234/347/264/242/347/273/223/346/236/234.svg +1 -0
- package/src/admin/static/scarce//346/232/202/346/227/240/346/224/266/350/227/217.svg +1 -0
- package/src/admin/static/scarce//346/232/202/346/227/240/346/225/260/346/215/256.svg +1 -0
- package/src/admin/static/scarce//346/232/202/346/227/240/346/235/203/351/231/220.svg +1 -0
- package/src/admin/static/scarce//346/232/202/346/227/240/346/266/210/346/201/257.svg +1 -0
- package/src/admin/static/scarce//346/232/202/346/227/240/347/244/274/347/211/251.svg +1 -0
- package/src/admin/static/scarce//346/232/202/346/227/240/347/247/257/345/210/206.svg +1 -0
- package/src/admin/static/scarce//346/232/202/346/227/240/347/275/221/347/273/234.svg +1 -0
- package/src/admin/static/scarce//346/232/202/346/227/240/350/247/206/351/242/221.svg +1 -0
- package/src/admin/static/scarce//346/232/202/346/227/240/350/256/242/345/215/225.svg +1 -0
- package/src/admin/static/scarce//346/232/202/346/227/240/350/257/204/350/256/272.svg +1 -0
- package/src/admin/static/scarce//346/232/202/346/227/240/351/205/215/351/200/201.svg +1 -0
- package/src/admin/static/scarce//346/232/202/346/227/240/351/223/266/350/241/214/345/215/241.svg +1 -0
- package/src/admin/static/scarce//346/232/202/346/227/240/351/237/263/344/271/220.svg +1 -0
- package/src/admin/static/scarce//351/241/265/351/235/242/344/270/215/345/255/230/345/234/250.svg +1 -0
- package/src/admin/stores/app.ts +30 -0
- package/src/admin/stores/tags.ts +73 -0
- package/src/admin/stores/user.ts +52 -0
- package/src/admin/styles/base.css +137 -0
- package/src/admin/tsconfig.json +19 -0
- package/typings/admin/base/auth.ts +23 -0
- package/typings/admin/base/permission.ts +19 -0
- package/typings/admin/comm/cascader.ts +7 -0
- package/typings/admin/comm/check-tree.ts +7 -0
- package/typings/admin/comm/crud.ts +294 -0
- package/typings/admin/comm/eps.ts +52 -0
- package/typings/admin/comm/request.ts +12 -0
- package/typings/admin/comm/service.ts +35 -0
- package/typings/admin/comm/upload.ts +39 -0
- package/typings/admin/host.d.ts +61 -0
- package/typings/admin/vome/browser.ts +11 -0
- package/typings/admin/vome/module.ts +13 -0
- package/typings/admin/vome/tags.ts +9 -0
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { Elysia } from 'elysia';
|
|
2
|
+
/**
|
|
3
|
+
* 托管业务模块 web:GET /vome/apps/:key/*
|
|
4
|
+
* 映射 ~/.vome/{hash}/modules/:key/web/
|
|
5
|
+
*/
|
|
6
|
+
export declare const microApps: Elysia<"", {
|
|
7
|
+
decorator: {};
|
|
8
|
+
store: {};
|
|
9
|
+
derive: {};
|
|
10
|
+
resolve: {};
|
|
11
|
+
}, {
|
|
12
|
+
typebox: {};
|
|
13
|
+
error: {};
|
|
14
|
+
}, {
|
|
15
|
+
schema: {};
|
|
16
|
+
standaloneSchema: {};
|
|
17
|
+
macro: {};
|
|
18
|
+
macroFn: {};
|
|
19
|
+
parser: {};
|
|
20
|
+
response: {};
|
|
21
|
+
}, {
|
|
22
|
+
vome: {
|
|
23
|
+
apps: {
|
|
24
|
+
"*": {
|
|
25
|
+
get: {
|
|
26
|
+
body: unknown;
|
|
27
|
+
params: {
|
|
28
|
+
"*": string;
|
|
29
|
+
} & {};
|
|
30
|
+
query: unknown;
|
|
31
|
+
headers: unknown;
|
|
32
|
+
response: {
|
|
33
|
+
200: "Not Found" | "Invalid app key" | "App not found" | "Forbidden" | Bun.BunFile;
|
|
34
|
+
422: {
|
|
35
|
+
type: "validation";
|
|
36
|
+
on: string;
|
|
37
|
+
summary?: string;
|
|
38
|
+
message?: string;
|
|
39
|
+
found?: unknown;
|
|
40
|
+
property?: string;
|
|
41
|
+
expected?: string;
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
}, {
|
|
49
|
+
derive: {};
|
|
50
|
+
resolve: {};
|
|
51
|
+
schema: {};
|
|
52
|
+
standaloneSchema: {};
|
|
53
|
+
response: {};
|
|
54
|
+
}, {
|
|
55
|
+
derive: {};
|
|
56
|
+
resolve: {};
|
|
57
|
+
schema: {};
|
|
58
|
+
standaloneSchema: {};
|
|
59
|
+
response: {};
|
|
60
|
+
}>;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { ModuleHandler, ModuleHandlerCtx, ModuleManifest, ModuleRouteDef } from '../../typings/ext/module';
|
|
2
|
+
type LoadedModule = {
|
|
3
|
+
manifest: ModuleManifest;
|
|
4
|
+
handlers: Record<string, ModuleHandler>;
|
|
5
|
+
routes: ModuleRouteDef[];
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* 解析 server/index.js:取出 handlers(可选)与是否存在 Plugin 导出痕迹
|
|
9
|
+
* 有 routes 时必须有 handlers;仅钩子时可无 handlers
|
|
10
|
+
*/
|
|
11
|
+
export declare function loadModuleHandlers(content: string, required?: boolean): Record<string, ModuleHandler>;
|
|
12
|
+
export declare const ModuleRegistry: {
|
|
13
|
+
get(key: string): LoadedModule | undefined;
|
|
14
|
+
list(): {
|
|
15
|
+
key: string;
|
|
16
|
+
manifest: ModuleManifest;
|
|
17
|
+
routes: ModuleRouteDef[];
|
|
18
|
+
}[];
|
|
19
|
+
/** 加载已落盘模块到内存;无 routes 时可无 handlers(纯页面 / 仅钩子) */
|
|
20
|
+
load(key: string): LoadedModule;
|
|
21
|
+
unload(key: string): void;
|
|
22
|
+
/** 匹配 method + 子路径,调用对应 handler */
|
|
23
|
+
dispatch(key: string, method: string, subPath: string, ctx: ModuleHandlerCtx): Promise<{
|
|
24
|
+
ok: false;
|
|
25
|
+
status: number;
|
|
26
|
+
message: string;
|
|
27
|
+
data?: undefined;
|
|
28
|
+
route?: undefined;
|
|
29
|
+
} | {
|
|
30
|
+
ok: true;
|
|
31
|
+
data: unknown;
|
|
32
|
+
route: ModuleRouteDef;
|
|
33
|
+
status?: undefined;
|
|
34
|
+
message?: undefined;
|
|
35
|
+
} | {
|
|
36
|
+
ok: false;
|
|
37
|
+
status: number;
|
|
38
|
+
message: string;
|
|
39
|
+
route: ModuleRouteDef;
|
|
40
|
+
data?: undefined;
|
|
41
|
+
}>;
|
|
42
|
+
/** 扫描 modules/ 下已安装目录并 load */
|
|
43
|
+
bootstrap(): void;
|
|
44
|
+
};
|
|
45
|
+
export {};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** ~/.vome/{md5(keys)} */
|
|
2
|
+
export declare function pDataPath(): string;
|
|
3
|
+
/** 插件 JSON 落盘目录 */
|
|
4
|
+
export declare function pPluginPath(): string;
|
|
5
|
+
/** 已安装业务模块根目录(.vome) */
|
|
6
|
+
export declare function pModulesPath(): string;
|
|
7
|
+
/** 单个业务模块目录 */
|
|
8
|
+
export declare function pModulePath(key: string): string;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @vome-core — 同构入口(前后端共用类型与纯工具)
|
|
3
|
+
*
|
|
4
|
+
* 服务端框架:`@vome-core/server`
|
|
5
|
+
* 管理端框架:`@vome-core/admin`
|
|
6
|
+
*/
|
|
7
|
+
export { merge, deepTree, flattenTree, RES_CODE } from './shared';
|
|
8
|
+
export type { Loose, PageQuery, PagePagination, PageResult, ResCode, ApiSuccess, ApiFail, ApiResult, } from './shared';
|
|
9
|
+
/** 与 package.json version 同步 */
|
|
10
|
+
export declare const version: string;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import { type InjectionToken } from './metadata';
|
|
3
|
+
/** @internal 宿主扫描后预创建 Singleton */
|
|
4
|
+
export declare function bootstrapIoc(): void;
|
|
5
|
+
/**
|
|
6
|
+
* 按类或自定义 id 取实例
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* Ioc.get(AdminAuthService)
|
|
11
|
+
* Ioc.get('base.auth.service')
|
|
12
|
+
* ```
|
|
13
|
+
*/
|
|
14
|
+
declare function get<T = unknown>(token: InjectionToken<T>): T;
|
|
15
|
+
/**
|
|
16
|
+
* 注册已创建的单例(Cache / Db 等)
|
|
17
|
+
*
|
|
18
|
+
* @param token - 类或自定义 id
|
|
19
|
+
* @param instance - 实例;若 token 为类,会同时按该类可注入
|
|
20
|
+
*/
|
|
21
|
+
declare function set<T>(token: InjectionToken<T>, instance: T): void;
|
|
22
|
+
/** @internal 清空 Singleton 与 Provider 注册(App.stop 时调用) */
|
|
23
|
+
export declare function resetIoc(): void;
|
|
24
|
+
/** 依赖注入容器 */
|
|
25
|
+
export declare const Ioc: {
|
|
26
|
+
get: typeof get;
|
|
27
|
+
set: typeof set;
|
|
28
|
+
};
|
|
29
|
+
export {};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import { type ClassToken, type InjectionToken, type ProvideOptions } from './metadata';
|
|
3
|
+
/**
|
|
4
|
+
* 注册为可注入的 Provider。
|
|
5
|
+
*
|
|
6
|
+
* @param idOrOptions - 可省略;或自定义 id;或 `{ id, scope }`(作用域只在这里配置)
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* @Provide()
|
|
11
|
+
* export class AdminAuthService {}
|
|
12
|
+
*
|
|
13
|
+
* @Provide('base.auth.service')
|
|
14
|
+
* export class AdminAuthService {}
|
|
15
|
+
*
|
|
16
|
+
* @Provide({ id: 'base.auth.service', scope: ScopeEnum.Request })
|
|
17
|
+
* export class OrderContext {}
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export declare function Provide(idOrOptions?: string | symbol | ProvideOptions): (target: ClassToken) => void;
|
|
21
|
+
/**
|
|
22
|
+
* 属性注入。
|
|
23
|
+
*
|
|
24
|
+
* @param token - 类、字符串 id 或 symbol;省略则用属性 TS 类型
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```ts
|
|
28
|
+
* @Inject()
|
|
29
|
+
* auth: AdminAuthService
|
|
30
|
+
*
|
|
31
|
+
* @Inject('base.auth.service')
|
|
32
|
+
* auth: AdminAuthService
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export declare function Inject(token?: InjectionToken): (target: object, propertyKey: string | symbol) => void;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { scanHost } from './host';
|
|
2
|
+
export { bootstrapIoc, resetIoc, Ioc } from './container';
|
|
3
|
+
export { Provide, Inject } from './decorators';
|
|
4
|
+
export { ScopeEnum } from './scope';
|
|
5
|
+
export { appendInjectMeta, listProviders, getProvider } from './metadata';
|
|
6
|
+
export type { ClassToken, InjectionToken, InjectMeta, ProvideOptions, ProviderToken, } from './metadata';
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare const INJECT_METADATA_KEY = "vome:inject";
|
|
2
|
+
export type { ClassToken, InjectionToken, InjectMeta, ProvideOptions, ProviderMeta, ProviderToken, ScopeValue, } from '../../typings/ioc/metadata';
|
|
3
|
+
import type { ClassToken, InjectionToken, InjectMeta, ProviderMeta } from '../../typings/ioc/metadata';
|
|
4
|
+
export declare function registerProvider(meta: ProviderMeta): void;
|
|
5
|
+
export declare function getProvider(token: InjectionToken): ProviderMeta | undefined;
|
|
6
|
+
/** 去重后的 Provider 列表(同一 useClass 只出现一次) */
|
|
7
|
+
export declare function listProviders(): ProviderMeta[];
|
|
8
|
+
export declare function tokenLabel(token: InjectionToken): string;
|
|
9
|
+
export declare function appendInjectMeta(target: ClassToken, inject: InjectMeta): void;
|
|
10
|
+
export declare function getInjectMetas(target: ClassToken): InjectMeta[];
|
|
11
|
+
/** @internal App.stop 时清空 Provider 注册表 */
|
|
12
|
+
export declare function resetProviders(): void;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Provider 作用域(通过 `@Provide({ scope })` 配置) */
|
|
2
|
+
export declare enum ScopeEnum {
|
|
3
|
+
/** 全局单例:进程内只创建一次(默认) */
|
|
4
|
+
Singleton = "singleton",
|
|
5
|
+
/** 请求作用域:同一 HTTP 请求内复用(依赖 asyncContextManager) */
|
|
6
|
+
Request = "request",
|
|
7
|
+
/** 原型:每次 Ioc.get / 注入都 new */
|
|
8
|
+
Prototype = "prototype"
|
|
9
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 业务异常
|
|
3
|
+
*
|
|
4
|
+
* 抛出后由全局 onError 拦截:按 logging 配置打日志,并返回 `{ code, message }`。
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```ts
|
|
8
|
+
* throw new CommException('获取巧房数据为空')
|
|
9
|
+
* throw new CommException('未登录', { statusCode: 401, code: 1001 })
|
|
10
|
+
* ```
|
|
11
|
+
*/
|
|
12
|
+
export declare class CommException extends Error {
|
|
13
|
+
readonly statusCode: number;
|
|
14
|
+
readonly code: number;
|
|
15
|
+
constructor(message: string, options?: {
|
|
16
|
+
/** HTTP 状态,默认 200(业务错误体) */
|
|
17
|
+
statusCode?: number;
|
|
18
|
+
/** 业务码,默认 1001 */
|
|
19
|
+
code?: number;
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
export declare function isCommException(error: unknown): error is CommException;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 可注入业务日志
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* ```ts
|
|
6
|
+
* @Inject()
|
|
7
|
+
* logger: Logger
|
|
8
|
+
*
|
|
9
|
+
* this.logger.error('获取巧房数据为空')
|
|
10
|
+
* this.logger.info('user %s login', username)
|
|
11
|
+
* ```
|
|
12
|
+
*/
|
|
13
|
+
export declare class Logger {
|
|
14
|
+
info(msg: string, ...args: unknown[]): void;
|
|
15
|
+
warn(msg: string, ...args: unknown[]): void;
|
|
16
|
+
debug(msg: string, ...args: unknown[]): void;
|
|
17
|
+
error(msg: string | Error, ...args: unknown[]): void;
|
|
18
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { createPinoLogger } from '@bogeychan/elysia-logger';
|
|
2
|
+
import type { LoggingConfig } from '../../typings/logger/config';
|
|
3
|
+
export type { LoggingConfig };
|
|
4
|
+
type AppPino = ReturnType<typeof createPinoLogger>;
|
|
5
|
+
/** 全局 pino(请求日志与可注入 Logger 共用) */
|
|
6
|
+
export declare function getPinoLogger(): AppPino;
|
|
7
|
+
/** @internal App.stop 时清空 */
|
|
8
|
+
export declare function resetPinoLogger(): void;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** 实体公共字段(含软删 deletedAt → 回收站) */
|
|
2
|
+
export declare const baseColumns: {
|
|
3
|
+
id: import("drizzle-orm").IsPrimaryKey<import("drizzle-orm").NotNull<import("drizzle-orm/pg-core").PgSerialBuilderInitial<"id">>>;
|
|
4
|
+
createTime: import("drizzle-orm").HasDefault<import("drizzle-orm").NotNull<import("drizzle-orm/pg-core").PgTimestampBuilderInitial<"createTime">>>;
|
|
5
|
+
updateTime: import("drizzle-orm").HasDefault<import("drizzle-orm").HasDefault<import("drizzle-orm").NotNull<import("drizzle-orm/pg-core").PgTimestampBuilderInitial<"updateTime">>>>;
|
|
6
|
+
/** 软删时间,null = 未删除 */
|
|
7
|
+
deletedAt: import("drizzle-orm/pg-core").PgTimestampBuilderInitial<"deletedAt">;
|
|
8
|
+
tenantId: import("drizzle-orm/pg-core").PgIntegerBuilderInitial<"tenantId">;
|
|
9
|
+
};
|
|
10
|
+
/** 公共字段中文注释;columnComments() 会自动合并 */
|
|
11
|
+
export declare const BASE_COLUMN_COMMENTS: Record<string, string>;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 为 pgTable 登记列注释,供 EPS / 自动筛选 / PG COMMENT 同步。
|
|
3
|
+
* 自动合并 `BASE_COLUMN_COMMENTS`,业务字段可覆盖。
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* export const baseMenu = columnComments(pgTable(...), {
|
|
7
|
+
* name: '名称',
|
|
8
|
+
* router: '路由',
|
|
9
|
+
* })
|
|
10
|
+
*/
|
|
11
|
+
export declare function columnComments<T extends object>(table: T, comments?: Record<string, string>): T;
|
|
12
|
+
export declare function getColumnComments(table: object): Record<string, string>;
|
|
13
|
+
/** 已登记的表(schema import 后可用) */
|
|
14
|
+
export declare function listColumnCommentTables(): object[];
|
|
15
|
+
/** Bun.SQL 最小接口(避免 core 强耦合 bun 类型) */
|
|
16
|
+
export type PgCommentSql = {
|
|
17
|
+
(strings: TemplateStringsArray, ...values: unknown[]): Promise<unknown>;
|
|
18
|
+
unsafe: (query: string) => Promise<unknown>;
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* 将 columnComments 与 PG 现有注释 diff,仅对差异列执行 COMMENT ON COLUMN。
|
|
22
|
+
* - 未变 → 不写
|
|
23
|
+
* - 新表 / 新列 / 文案变更 → 只更新对应列
|
|
24
|
+
*/
|
|
25
|
+
export declare function syncColumnCommentsToPg(sql: PgCommentSql): Promise<number>;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { CrudConfig, CrudUpsertMode } from '../../typings/comm/crud';
|
|
2
|
+
/** 读取 vome.crud(唯一入口,供 Repository / BaseService 共用) */
|
|
3
|
+
export declare function readCrudConfig(): CrudConfig;
|
|
4
|
+
/** upsert:参数覆盖 → 配置 → 默认 insert */
|
|
5
|
+
export declare function resolveUpsert(override?: CrudUpsertMode): CrudUpsertMode;
|
|
6
|
+
/** softDelete:参数覆盖 → 配置 → 默认 false */
|
|
7
|
+
export declare function resolveSoftDelete(override?: boolean): boolean;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type SQL } from 'drizzle-orm';
|
|
2
|
+
import type { PgTable } from 'drizzle-orm/pg-core';
|
|
3
|
+
/** 表是否含 departmentId 列(行级数据权限) */
|
|
4
|
+
export declare function tableHasDepartmentId(table: PgTable): boolean;
|
|
5
|
+
/**
|
|
6
|
+
* 当前请求数据范围
|
|
7
|
+
* - off:未写入 / noDataScope,不过滤
|
|
8
|
+
* - all:超管或角色 dataScope=全部
|
|
9
|
+
* - none:自定义但无部门,匹配不到任何行
|
|
10
|
+
* - number[]:按部门 ID 列表过滤
|
|
11
|
+
*
|
|
12
|
+
* Context 约定(宿主写入):
|
|
13
|
+
* - dataScope: 'all' | 'none' | 'custom'
|
|
14
|
+
* - dataScopeDeptIds: number[](custom 时)
|
|
15
|
+
*/
|
|
16
|
+
export declare function resolveDataScope(): 'off' | 'all' | 'none' | number[];
|
|
17
|
+
/** 拼数据范围 where;无隔离时返回原 where */
|
|
18
|
+
export declare function applyDataScopeWhere(table: PgTable, where?: SQL): SQL | undefined;
|
|
19
|
+
/** 租户 + 数据范围(Repository / queryWithOp 统一入口) */
|
|
20
|
+
export declare function applyRowScopes(table: PgTable, where?: SQL): SQL | undefined;
|
|
21
|
+
/**
|
|
22
|
+
* 局部关闭数据范围过滤(权限解析、跨范围配置等)
|
|
23
|
+
*/
|
|
24
|
+
export declare function noDataScope<T>(fn: () => Promise<T>): Promise<T>;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 数据库访问令牌(宿主 bootstrap 后 Ioc.set(DbStore, store))
|
|
3
|
+
*
|
|
4
|
+
* drizzle / client 具体类型由宿主驱动决定,此处用 unknown 避免多驱动联合爆炸。
|
|
5
|
+
*/
|
|
6
|
+
export declare class DbStore {
|
|
7
|
+
readonly drizzle: unknown;
|
|
8
|
+
readonly client?: unknown | undefined;
|
|
9
|
+
readonly schema?: Record<string, unknown> | undefined;
|
|
10
|
+
readonly sql?: unknown | undefined;
|
|
11
|
+
constructor(drizzle: unknown, client?: unknown | undefined, schema?: Record<string, unknown> | undefined, sql?: unknown | undefined);
|
|
12
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Table } from 'drizzle-orm';
|
|
2
|
+
/** 由表结构生成 select / insert / update 三套 Zod */
|
|
3
|
+
export declare function entitySchemas<T extends Table>(table: T): {
|
|
4
|
+
select: import("drizzle-zod").BuildSchema<"select", T["_"]["columns"], undefined, undefined>;
|
|
5
|
+
insert: import("drizzle-zod").BuildSchema<"insert", T["_"]["columns"], undefined, undefined>;
|
|
6
|
+
update: import("drizzle-zod").BuildSchema<"update", T["_"]["columns"], undefined, undefined>;
|
|
7
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ORM / CRUD 层
|
|
3
|
+
*
|
|
4
|
+
* - DbStore:宿主注入的数据库令牌
|
|
5
|
+
* - Repository / BaseService:数据访问与业务基类
|
|
6
|
+
* - QueryOp / 回收站:字段查询与软删
|
|
7
|
+
* - attachCrudRoutes:内置 CRUD 路由
|
|
8
|
+
*/
|
|
9
|
+
export { DbStore } from './db-store';
|
|
10
|
+
export { baseColumns, BASE_COLUMN_COMMENTS } from './base-columns';
|
|
11
|
+
export { entitySchemas } from './entity-schema';
|
|
12
|
+
export { columnComments, getColumnComments, syncColumnCommentsToPg } from './column-comments';
|
|
13
|
+
export { readCrudConfig, resolveSoftDelete, resolveUpsert, } from './crud-config';
|
|
14
|
+
export { Repository, getRepository, InjectRepository, } from './repository';
|
|
15
|
+
export { BaseService } from './service';
|
|
16
|
+
export { q, compactWhere, needsAdvancedQuery, buildQueryOp } from './query-op';
|
|
17
|
+
export { queryWithOp } from './query-builder';
|
|
18
|
+
export { attachCrudRoutes } from './crud-register';
|
|
19
|
+
export { isTenantEnabled, tableHasTenantId, resolveTenantScope, applyTenantWhere, stampTenantId, noTenant, normalizeHost, } from './tenant';
|
|
20
|
+
export { tableHasDepartmentId, resolveDataScope, applyDataScopeWhere, applyRowScopes, noDataScope, } from './data-scope';
|
|
21
|
+
export type { CrudUpsertMode, CrudModifyType, CrudWriteOptions, CrudTrashQueryOptions, CrudDeleteOptions, } from '../../typings/comm/crud';
|
|
22
|
+
export type { PageQuery, PagePagination, PageResult, } from '../../typings/comm/page';
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { PgTable } from 'drizzle-orm/pg-core';
|
|
2
|
+
import type { QueryOp } from '../../typings/routing/crud';
|
|
3
|
+
import type { CrudTrashQueryOptions } from '../../typings/comm/crud';
|
|
4
|
+
import type { PageResult } from '../../typings/comm/page';
|
|
5
|
+
/**
|
|
6
|
+
* 带 join / select / where / extend 的 list / page
|
|
7
|
+
*/
|
|
8
|
+
export declare function queryWithOp(main: PgTable, body: Record<string, unknown>, op: QueryOp, options: {
|
|
9
|
+
request?: Request;
|
|
10
|
+
mode: 'list' | 'page';
|
|
11
|
+
trash?: CrudTrashQueryOptions;
|
|
12
|
+
}): Promise<unknown[] | PageResult>;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type SQL } from 'drizzle-orm';
|
|
2
|
+
import type { PgTable } from 'drizzle-orm/pg-core';
|
|
3
|
+
import type { QueryOp, QueryWhereResult } from '../../typings/routing/crud';
|
|
4
|
+
/** 压平 where 返回值,丢弃空条件 */
|
|
5
|
+
export declare function compactWhere(result: QueryWhereResult | undefined): SQL[];
|
|
6
|
+
/**
|
|
7
|
+
* where 辅助(字段管理)
|
|
8
|
+
*
|
|
9
|
+
* - `between` / `range`:缺参自动跳过
|
|
10
|
+
* - `eqRest`:剩余 body 字段等值,可用 map 指到 join 列
|
|
11
|
+
* - `contains`:PG 数组列包含
|
|
12
|
+
*/
|
|
13
|
+
export declare const q: {
|
|
14
|
+
between(col: unknown, min: unknown, max: unknown): SQL | undefined;
|
|
15
|
+
range(col: unknown, start: unknown, end: unknown): SQL | undefined;
|
|
16
|
+
eqRest(params: Record<string, unknown>, table: PgTable, map?: Record<string, unknown>): SQL[];
|
|
17
|
+
contains(col: unknown, value: unknown): SQL | undefined;
|
|
18
|
+
};
|
|
19
|
+
/** 是否需要 join/select(须走 queryWithOp;where/extend 拼进 where 后走 Service) */
|
|
20
|
+
export declare function needsAdvancedQuery(op?: QueryOp): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* 从请求体 + QueryOp 拼 where / orderBy(含 fieldArray、fieldRange、where、extend)
|
|
23
|
+
*/
|
|
24
|
+
export declare function buildQueryOp(table: PgTable, body: Record<string, unknown>, op?: QueryOp, request?: Request): Promise<{
|
|
25
|
+
where?: SQL;
|
|
26
|
+
orderBySql: SQL[];
|
|
27
|
+
}>;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { type SQL } from 'drizzle-orm';
|
|
2
|
+
import type { InferSelectModel } from 'drizzle-orm';
|
|
3
|
+
import type { PgTable } from 'drizzle-orm/pg-core';
|
|
4
|
+
import { entitySchemas } from './entity-schema';
|
|
5
|
+
import type { CrudTrashQueryOptions } from '../../typings/comm/crud';
|
|
6
|
+
import type { PageResult } from '../../typings/comm/page';
|
|
7
|
+
type SchemaBundle = ReturnType<typeof entitySchemas>;
|
|
8
|
+
/**
|
|
9
|
+
* 表级数据访问(按 pgTable 单例缓存)
|
|
10
|
+
*
|
|
11
|
+
* 查询默认排除已软删;写入走 Zod(entitySchemas)校验。
|
|
12
|
+
*/
|
|
13
|
+
export declare class Repository<T extends PgTable> {
|
|
14
|
+
readonly table: T;
|
|
15
|
+
readonly schema: SchemaBundle;
|
|
16
|
+
constructor(table: T, schema?: SchemaBundle);
|
|
17
|
+
/** 表是否有 deletedAt,能否进回收站 */
|
|
18
|
+
supportsSoftDelete(): boolean;
|
|
19
|
+
private scopedWhere;
|
|
20
|
+
/** 列表查询 */
|
|
21
|
+
find(where?: SQL, options?: CrudTrashQueryOptions & {
|
|
22
|
+
orderBy?: SQL[];
|
|
23
|
+
}): Promise<InferSelectModel<T>[]>;
|
|
24
|
+
/** 取第一条 */
|
|
25
|
+
findOne(where: SQL, options?: CrudTrashQueryOptions): Promise<InferSelectModel<T> | undefined>;
|
|
26
|
+
/** 按主键 id 查询 */
|
|
27
|
+
findById(id: number | string, options?: CrudTrashQueryOptions): Promise<InferSelectModel<T> | undefined>;
|
|
28
|
+
/** 计数 */
|
|
29
|
+
count(where?: SQL, options?: CrudTrashQueryOptions): Promise<number>;
|
|
30
|
+
/** 分页:返回 list + pagination */
|
|
31
|
+
findPage(options: {
|
|
32
|
+
page: number;
|
|
33
|
+
size: number;
|
|
34
|
+
where?: SQL;
|
|
35
|
+
orderBy?: SQL[];
|
|
36
|
+
} & CrudTrashQueryOptions): Promise<PageResult<InferSelectModel<T>>>;
|
|
37
|
+
private parseInsert;
|
|
38
|
+
/** 插入;对象 / 数组都直接交给 values()(Drizzle 两者都支持) */
|
|
39
|
+
create(data: unknown): Promise<InferSelectModel<T> | InferSelectModel<T>[]>;
|
|
40
|
+
/**
|
|
41
|
+
* 有 id 且存在则更新,否则插入。
|
|
42
|
+
* 对象 / 数组均可;数组时一次查出已存在 id,再批量 update + insert。
|
|
43
|
+
*/
|
|
44
|
+
save(data: unknown): Promise<InferSelectModel<T> | InferSelectModel<T>[]>;
|
|
45
|
+
/**
|
|
46
|
+
* 更新:
|
|
47
|
+
* - update(where, patch) 条件更新
|
|
48
|
+
* - update([{ id, ...patch }, ...]) 按 id 批量;相同 patch 合并为一次 inArray
|
|
49
|
+
*/
|
|
50
|
+
update(whereOrRows: SQL | Record<string, unknown>[], data?: unknown): Promise<InferSelectModel<T> | InferSelectModel<T>[] | undefined>;
|
|
51
|
+
/** 按行批量更新:同 patch 合并 inArray,一次 SQL */
|
|
52
|
+
private updateByRows;
|
|
53
|
+
/** SQL 或 id / id[] → where(数组走 inArray,一次条件) */
|
|
54
|
+
private resolveIdWhere;
|
|
55
|
+
/** 软删:写入 deletedAt;支持 SQL / id / id[] */
|
|
56
|
+
softDelete(whereOrIds: SQL | number | string | Array<number | string>): Promise<void>;
|
|
57
|
+
/** 恢复:清空 deletedAt;支持 SQL / id / id[] */
|
|
58
|
+
restore(whereOrIds: SQL | number | string | Array<number | string>): Promise<void>;
|
|
59
|
+
/** 硬删;支持 SQL / id / id[](一次 DELETE … IN) */
|
|
60
|
+
forceDelete(whereOrIds: SQL | number | string | Array<number | string>): Promise<void>;
|
|
61
|
+
}
|
|
62
|
+
/** 按表取单例 Repository */
|
|
63
|
+
export declare function getRepository<T extends PgTable>(table: T): Repository<T>;
|
|
64
|
+
/**
|
|
65
|
+
* 属性注入 Repository
|
|
66
|
+
*
|
|
67
|
+
* @example
|
|
68
|
+
* ```ts
|
|
69
|
+
* @InjectRepository(baseUser)
|
|
70
|
+
* baseUserEntity: Repository<typeof baseUser>
|
|
71
|
+
* ```
|
|
72
|
+
*/
|
|
73
|
+
export declare function InjectRepository<T extends PgTable>(table: T): (target: object, propertyKey: string | symbol) => void;
|
|
74
|
+
export {};
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { type SQL } from 'drizzle-orm';
|
|
2
|
+
import type { Repository } from './repository';
|
|
3
|
+
import type { CrudDeleteOptions, CrudModifyType, CrudTrashQueryOptions, CrudWriteOptions } from '../../typings/comm/crud';
|
|
4
|
+
import type { PageQuery, PageResult } from '../../typings/comm/page';
|
|
5
|
+
/**
|
|
6
|
+
* 业务 Service 基类
|
|
7
|
+
*
|
|
8
|
+
* 第一个 `@InjectRepository` 会自动绑定主实体,之后可用下方通用 CRUD。
|
|
9
|
+
* 可重写 `modifyBefore` / `modifyAfter` 在增删改前后处理数据。
|
|
10
|
+
* add / update / delete 均支持数组(内部判断,一次批量落库)。
|
|
11
|
+
*/
|
|
12
|
+
export declare abstract class BaseService {
|
|
13
|
+
protected entity?: Repository<any>;
|
|
14
|
+
/** IoC 注入时绑定主实体(仅首次) */
|
|
15
|
+
bindEntity(repo: Repository<any>): void;
|
|
16
|
+
/** 显式绑定主实体(CRUD 无 Service 时用) */
|
|
17
|
+
setEntity(repo: Repository<any>): void;
|
|
18
|
+
/** 是否已绑定主实体 */
|
|
19
|
+
hasEntity(): boolean;
|
|
20
|
+
/** 取已绑定 Repository */
|
|
21
|
+
getRepo(): Repository<any>;
|
|
22
|
+
private requireEntity;
|
|
23
|
+
/**
|
|
24
|
+
* 增删改之前(子类按需重写)
|
|
25
|
+
* - add / update:data 为写入对象或数组
|
|
26
|
+
* - delete:data 为 where 条件
|
|
27
|
+
*/
|
|
28
|
+
modifyBefore(_data: any, _type: CrudModifyType): Promise<void>;
|
|
29
|
+
/**
|
|
30
|
+
* 增删改之后(子类按需重写)
|
|
31
|
+
* - add / update:data 多为落库后的行(或原写入对象)
|
|
32
|
+
* - delete:data 为 where 条件
|
|
33
|
+
*/
|
|
34
|
+
modifyAfter(_data: any, _type: CrudModifyType): Promise<void>;
|
|
35
|
+
/** 新增;数组走 create/save 批量;受 vome.crud.upsert 控制 */
|
|
36
|
+
add(data: unknown, options?: CrudWriteOptions): Promise<{
|
|
37
|
+
[x: string]: any;
|
|
38
|
+
} | {
|
|
39
|
+
[x: string]: any;
|
|
40
|
+
}[]>;
|
|
41
|
+
/**
|
|
42
|
+
* 更新:
|
|
43
|
+
* - update(where, patch) SQL 条件
|
|
44
|
+
* - update({ id, ... }) 单条
|
|
45
|
+
* - update([{ id, ... }, ...]) 批量(同 patch 合并 inArray)
|
|
46
|
+
*/
|
|
47
|
+
update(whereOrData: SQL | Record<string, unknown> | Record<string, unknown>[], data?: unknown): Promise<any>;
|
|
48
|
+
/**
|
|
49
|
+
* 删除:开启软删则进回收站,否则硬删;force 强制硬删。
|
|
50
|
+
* whereOrIds 原样交给 Repository(SQL / id / id[])。
|
|
51
|
+
* 业务校验统一重写本方法;彻底删除传 { force: true }。
|
|
52
|
+
*/
|
|
53
|
+
delete(whereOrIds: SQL | number | string | Array<number | string>, options?: CrudDeleteOptions): Promise<void>;
|
|
54
|
+
/** 从回收站恢复;SQL / id / id[] */
|
|
55
|
+
restore(whereOrIds: SQL | number | string | Array<number | string>): Promise<void>;
|
|
56
|
+
/** 列表(默认不含回收站;onlyTrashed / withTrashed 可调) */
|
|
57
|
+
list(where?: SQL, options?: CrudTrashQueryOptions & {
|
|
58
|
+
orderBy?: SQL[];
|
|
59
|
+
}): Promise<{
|
|
60
|
+
[x: string]: any;
|
|
61
|
+
}[]>;
|
|
62
|
+
/** 详情:传 id 或 where */
|
|
63
|
+
info(idOrWhere: number | string | SQL, options?: CrudTrashQueryOptions): Promise<{
|
|
64
|
+
[x: string]: any;
|
|
65
|
+
} | undefined>;
|
|
66
|
+
/** 分页 */
|
|
67
|
+
page(query?: PageQuery & {
|
|
68
|
+
where?: SQL;
|
|
69
|
+
orderBy?: SQL[];
|
|
70
|
+
} & CrudTrashQueryOptions): Promise<PageResult>;
|
|
71
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type SQL } from 'drizzle-orm';
|
|
2
|
+
import type { PgTable } from 'drizzle-orm/pg-core';
|
|
3
|
+
/** 是否开启多租户隔离 */
|
|
4
|
+
export declare function isTenantEnabled(): boolean;
|
|
5
|
+
/** 表是否含 tenantId 列 */
|
|
6
|
+
export declare function tableHasTenantId(table: PgTable): boolean;
|
|
7
|
+
/**
|
|
8
|
+
* 当前请求租户作用域
|
|
9
|
+
* - off:不隔离
|
|
10
|
+
* - all:超管 / noTenant,看全量
|
|
11
|
+
* - none:已开启但无 tenantId,匹配不到任何行
|
|
12
|
+
* - number:按该租户过滤
|
|
13
|
+
*/
|
|
14
|
+
export declare function resolveTenantScope(): 'off' | 'all' | 'none' | number;
|
|
15
|
+
/** 拼租户 where;无隔离时返回原 where */
|
|
16
|
+
export declare function applyTenantWhere(table: PgTable, where?: SQL): SQL | undefined;
|
|
17
|
+
/** 写入时自动带上 tenantId(仅普通租户用户) */
|
|
18
|
+
export declare function stampTenantId<T extends Record<string, unknown>>(table: PgTable, data: T): T;
|
|
19
|
+
/**
|
|
20
|
+
* 局部关闭租户过滤(跨租户查询、登录、权限菜单等)
|
|
21
|
+
*/
|
|
22
|
+
export declare function noTenant<T>(fn: () => Promise<T>): Promise<T>;
|
|
23
|
+
/** 规范化 Host:小写、去端口 */
|
|
24
|
+
export declare function normalizeHost(host: string | null | undefined): string;
|