weifuwu 0.61.2 → 0.63.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +168 -11
- package/dist/client/diff.d.ts +13 -1
- package/dist/client/index.js +3 -3
- package/dist/client/popup.d.ts +22 -0
- package/dist/client/types.d.ts +63 -0
- package/dist/client/ui.d.ts +6 -0
- package/dist/components/Accordion/Accordion.d.ts +9 -0
- package/dist/components/Affix/Affix.d.ts +16 -0
- package/dist/components/AspectRatio/AspectRatio.d.ts +10 -0
- package/dist/components/AvatarGroup/AvatarGroup.d.ts +21 -0
- package/dist/components/BackTop/BackTop.d.ts +16 -0
- package/dist/components/Calendar/Calendar.d.ts +21 -0
- package/dist/components/Carousel/Carousel.d.ts +17 -0
- package/dist/components/Cascader/Cascader.d.ts +21 -0
- package/dist/components/CheckboxGroup/CheckboxGroup.d.ts +23 -0
- package/dist/components/CodeBlock/CodeBlock.d.ts +14 -0
- package/dist/components/Collapse/Collapse.d.ts +28 -0
- package/dist/components/ColorPicker/ColorPicker.d.ts +16 -0
- package/dist/components/Command/Command.d.ts +22 -0
- package/dist/components/ContextMenu/ContextMenu.d.ts +17 -0
- package/dist/components/CopyButton/CopyButton.d.ts +18 -0
- package/dist/components/Descriptions/Descriptions.d.ts +21 -0
- package/dist/components/Highlight/Highlight.d.ts +13 -0
- package/dist/components/HoverCard/HoverCard.d.ts +16 -0
- package/dist/components/Icon/Icon.d.ts +1 -1
- package/dist/components/Img/Img.d.ts +4 -0
- package/dist/components/InView/InView.d.ts +1 -1
- package/dist/components/InfiniteScroll/InfiniteScroll.d.ts +15 -0
- package/dist/components/InputNumber/InputNumber.d.ts +25 -0
- package/dist/components/Label/Label.d.ts +11 -0
- package/dist/components/List/List.d.ts +18 -0
- package/dist/components/Markdown/Markdown.d.ts +14 -0
- package/dist/components/Markdown/parser.d.ts +32 -0
- package/dist/components/Mentions/Mentions.d.ts +19 -0
- package/dist/components/Menu/Menu.d.ts +25 -0
- package/dist/components/Menubar/Menubar.d.ts +22 -0
- package/dist/components/MessageBubble/MessageBubble.d.ts +20 -0
- package/dist/components/Notification/Notification.d.ts +70 -0
- package/dist/components/PasswordInput/PasswordInput.d.ts +21 -0
- package/dist/components/PinInput/PinInput.d.ts +18 -0
- package/dist/components/QRCode/QRCode.d.ts +20 -0
- package/dist/components/QRCode/qr.d.ts +15 -0
- package/dist/components/Rate/Rate.d.ts +16 -0
- package/dist/components/Resizable/Resizable.d.ts +18 -0
- package/dist/components/Result/Result.d.ts +17 -0
- package/dist/components/Select/Select.d.ts +4 -2
- package/dist/components/Table/Table.d.ts +10 -0
- package/dist/components/TagsInput/TagsInput.d.ts +21 -0
- package/dist/components/Timeline/Timeline.d.ts +25 -0
- package/dist/components/ToggleGroup/ToggleGroup.d.ts +33 -0
- package/dist/components/Transfer/Transfer.d.ts +18 -0
- package/dist/components/Tree/Tree.d.ts +27 -0
- package/dist/components/Typography/Typography.d.ts +39 -0
- package/dist/components/VirtualList/VirtualList.d.ts +21 -0
- package/dist/components/Watermark/Watermark.d.ts +19 -0
- package/dist/components/index.d.ts +85 -0
- package/dist/components/index.js +14 -1
- package/dist/components/style.css +4824 -2211
- package/dist/db/postgres/connection.d.ts +24 -3
- package/dist/db/postgres/pool.d.ts +30 -8
- package/dist/db/redis/client.d.ts +43 -0
- package/dist/db/redis/connection.d.ts +12 -0
- package/dist/db/redis/pipeline.d.ts +26 -0
- package/dist/db/redis/pool.d.ts +27 -2
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1055 -94
- package/dist/layout/weifuwu-layout.css +11 -1
- package/dist/postgres/types.d.ts +2 -1
- package/dist/redis/types.d.ts +6 -0
- package/dist/scheduler/cron.d.ts +26 -0
- package/dist/scheduler/index.d.ts +69 -0
- package/package.json +2 -4
|
@@ -1014,7 +1014,11 @@ code {
|
|
|
1014
1014
|
.wf-app-shell {
|
|
1015
1015
|
display: grid;
|
|
1016
1016
|
grid-template-columns: var(--wf-sidebar-width, 240px) minmax(0, 1fr);
|
|
1017
|
-
min-height:
|
|
1017
|
+
/* 固定视口高度(非 min-height):内部页面(聊天等)依赖 height: 100% 链实现
|
|
1018
|
+
容器内滚动——min-height 会让壳随内容长高,聊天消息区永远无法内部滚动
|
|
1019
|
+
(scrollTop 赋值无效果,页面滚动条不跟随消息到底) */
|
|
1020
|
+
height: 100vh;
|
|
1021
|
+
overflow: hidden;
|
|
1018
1022
|
}
|
|
1019
1023
|
|
|
1020
1024
|
/* ── 侧边栏 ── */
|
|
@@ -1115,6 +1119,9 @@ code {
|
|
|
1115
1119
|
.wf-main {
|
|
1116
1120
|
padding: var(--wf-space-lg);
|
|
1117
1121
|
min-width: 0;
|
|
1122
|
+
min-height: 0;
|
|
1123
|
+
/* 内容高于视口时在主区内滚动(壳固定视口高度后的唯一滚动出口) */
|
|
1124
|
+
overflow-y: auto;
|
|
1118
1125
|
background: var(--wf-color-bg);
|
|
1119
1126
|
}
|
|
1120
1127
|
|
|
@@ -1129,6 +1136,8 @@ code {
|
|
|
1129
1136
|
@media (max-width: 767.98px) {
|
|
1130
1137
|
.wf-app-shell {
|
|
1131
1138
|
grid-template-columns: 1fr;
|
|
1139
|
+
height: auto; /* 恢复文档流滚动(侧边栏堆叠在顶部) */
|
|
1140
|
+
overflow: visible;
|
|
1132
1141
|
}
|
|
1133
1142
|
.wf-sidebar {
|
|
1134
1143
|
position: static;
|
|
@@ -1138,6 +1147,7 @@ code {
|
|
|
1138
1147
|
}
|
|
1139
1148
|
.wf-main {
|
|
1140
1149
|
padding: var(--wf-space-md);
|
|
1150
|
+
overflow: visible;
|
|
1141
1151
|
}
|
|
1142
1152
|
}
|
|
1143
1153
|
}
|
package/dist/postgres/types.d.ts
CHANGED
|
@@ -33,7 +33,8 @@ export interface PostgresOptions {
|
|
|
33
33
|
/** 语句超时 ms(慢查询保护,会话级 SET statement_timeout)。默认 0 = 禁用。 */
|
|
34
34
|
statementTimeoutMs?: number;
|
|
35
35
|
/** 查询观测钩子(慢查询日志/审计) */
|
|
36
|
-
|
|
36
|
+
/** 查询观测钩子(慢查询日志/审计);第 4 参数为请求级 traceId(x-trace-id 头,无则 undefined) */
|
|
37
|
+
onQuery?: (query: string, durationMs: number, rowCount: number, traceId?: string) => void;
|
|
37
38
|
/** postgres.js 兼容名(= max) */
|
|
38
39
|
poolSize?: number;
|
|
39
40
|
/** postgres.js 兼容名(= statementTimeoutMs) */
|
package/dist/redis/types.d.ts
CHANGED
|
@@ -14,6 +14,12 @@ export type RedisOptions = {
|
|
|
14
14
|
keyPrefix?: string;
|
|
15
15
|
/** 未连接时命令是否入队等待。默认 true。 */
|
|
16
16
|
enableOfflineQueue?: boolean;
|
|
17
|
+
/** 命令超时 ms(服务器慢/挂起时 reject;阻塞命令 resolve(null))。默认 0 = 禁用。 */
|
|
18
|
+
commandTimeoutMs?: number;
|
|
19
|
+
/** socket 响应超时 ms(僵尸自愈:有 pending 且超时无数据 → 主动断开重连)。默认 0 = 禁用。 */
|
|
20
|
+
socketTimeoutMs?: number;
|
|
21
|
+
/** 命令观测钩子(慢命令日志/审计);第 4 参数为请求级 traceId(x-trace-id 头,无则 undefined) */
|
|
22
|
+
onCommand?: (command: string, args: (string | number)[], durationMs: number, traceId?: string) => void;
|
|
17
23
|
};
|
|
18
24
|
export interface RedisInjected {
|
|
19
25
|
redis: RedisPool;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* cron 表达式解析器(零依赖,5 字段)
|
|
3
|
+
*
|
|
4
|
+
* 字段:分(0-59) 时(0-23) 日(1-31) 月(1-12) 周(0-6, 0=周日)
|
|
5
|
+
* 语法:* | 星号斜杠 n(步进) | a,b,c | a-b
|
|
6
|
+
* 裁剪:秒/年字段、别名(@daily)、L/W/#、? —— 非法抛错(诚实裁剪,不静默降级)
|
|
7
|
+
*/
|
|
8
|
+
export interface CronField {
|
|
9
|
+
/** 匹配的取值集合(已展开;空 = 匹配任意) */
|
|
10
|
+
values: Set<number> | null;
|
|
11
|
+
}
|
|
12
|
+
export interface CronExpr {
|
|
13
|
+
fields: [CronField, CronField, CronField, CronField, CronField];
|
|
14
|
+
/** 日/周是否都显式指定(都非 * 时取 OR 语义) */
|
|
15
|
+
domExplicit: boolean;
|
|
16
|
+
dowExplicit: boolean;
|
|
17
|
+
}
|
|
18
|
+
/** 解析完整 cron 表达式(5 字段,空格分隔) */
|
|
19
|
+
export declare function parseCron(expr: string): CronExpr;
|
|
20
|
+
/**
|
|
21
|
+
* 计算下一个触发时间(严格晚于 from)
|
|
22
|
+
*
|
|
23
|
+
* 经典按字段进位算法:从 from 的下一分钟开始,逐级检查
|
|
24
|
+
* 分 → 时 → 日/月 → 月,不匹配则跳到下一级边界。
|
|
25
|
+
*/
|
|
26
|
+
export declare function nextRun(expr: CronExpr, from: Date): Date;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* scheduler 中间件 — 延时任务(迭代 2)
|
|
3
|
+
*
|
|
4
|
+
* ctx.schedule(name, data, { delayMs | when }) → ZSET(score=触发时间戳)
|
|
5
|
+
* → 守护循环(独立连接 + 定时扫描)到期 ZREM(原子抢占,多实例安全)
|
|
6
|
+
* → queue.add(复用 queue 可靠执行)
|
|
7
|
+
*
|
|
8
|
+
* 依赖:queue(参数传入——触发后入队执行)
|
|
9
|
+
*/
|
|
10
|
+
import type { Context, Middleware } from '../types.ts';
|
|
11
|
+
import type { QueueClientModule } from '../queue/index.ts';
|
|
12
|
+
export interface SchedulerOptions {
|
|
13
|
+
/** Redis 连接串(默认 REDIS_URL) */
|
|
14
|
+
url?: string;
|
|
15
|
+
/** key 前缀。默认 'wf:sched:'。 */
|
|
16
|
+
prefix?: string;
|
|
17
|
+
/** 守护循环扫描间隔 ms。默认 1000(延时任务精度上限)。 */
|
|
18
|
+
tickMs?: number;
|
|
19
|
+
/** queue 模块(触发后入队)——应用已 `const q = queue()` 时传入复用 */
|
|
20
|
+
queue: QueueClientModule;
|
|
21
|
+
}
|
|
22
|
+
export interface ScheduleOptions {
|
|
23
|
+
/** 延迟 ms(>=0,0 = 尽快,下一 tick 触发) */
|
|
24
|
+
delayMs?: number;
|
|
25
|
+
/** 指定触发时间(Date) */
|
|
26
|
+
when?: Date;
|
|
27
|
+
}
|
|
28
|
+
export interface SchedulerClient {
|
|
29
|
+
/**
|
|
30
|
+
* 延时任务(单次):delayMs 或 when 指定触发时间。
|
|
31
|
+
* 到期自动入队(name)——由 queue.worker 消费。
|
|
32
|
+
*/
|
|
33
|
+
schedule: (name: string, data: unknown, opts?: ScheduleOptions) => Promise<{
|
|
34
|
+
id: string;
|
|
35
|
+
}>;
|
|
36
|
+
/**
|
|
37
|
+
* cron 定时任务(重复):到点自动入队(name)。
|
|
38
|
+
* 同 name 重复注册 = 覆盖更新(改表达式/数据直接重新注册,旧定义不残留)。
|
|
39
|
+
* 定义持久化在 HASH——进程重启后守护循环恢复即继续触发(无需重新注册)。
|
|
40
|
+
*/
|
|
41
|
+
cron: (expr: string, name: string, data?: unknown) => Promise<void>;
|
|
42
|
+
/** 取消 cron:删除定义 + 清理 ZSET 中该 cron 的 pending 触发点(不再触发) */
|
|
43
|
+
cancelCron: (name: string) => Promise<boolean>;
|
|
44
|
+
/** 取消未到期的延时任务(按 id;已到期入队/已执行的不受影响) */
|
|
45
|
+
cancelSchedule: (id: string) => Promise<boolean>;
|
|
46
|
+
}
|
|
47
|
+
export interface SchedulerInjected {
|
|
48
|
+
schedule: SchedulerClient['schedule'];
|
|
49
|
+
cron: SchedulerClient['cron'];
|
|
50
|
+
cancelCron: SchedulerClient['cancelCron'];
|
|
51
|
+
cancelSchedule: SchedulerClient['cancelSchedule'];
|
|
52
|
+
}
|
|
53
|
+
declare module '../types.ts' {
|
|
54
|
+
interface Context {
|
|
55
|
+
schedule?: SchedulerClient['schedule'];
|
|
56
|
+
cron?: SchedulerClient['cron'];
|
|
57
|
+
cancelCron?: SchedulerClient['cancelCron'];
|
|
58
|
+
cancelSchedule?: SchedulerClient['cancelSchedule'];
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
export interface SchedulerClientModule extends Middleware<Context, Context & SchedulerInjected> {
|
|
62
|
+
schedule: SchedulerClient['schedule'];
|
|
63
|
+
cron: SchedulerClient['cron'];
|
|
64
|
+
cancelCron: SchedulerClient['cancelCron'];
|
|
65
|
+
cancelSchedule: SchedulerClient['cancelSchedule'];
|
|
66
|
+
/** 关闭守护循环 + 连接 */
|
|
67
|
+
close: () => Promise<void>;
|
|
68
|
+
}
|
|
69
|
+
export declare function scheduler(options: SchedulerOptions): SchedulerClientModule;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "weifuwu",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.63.0",
|
|
5
5
|
"description": "AI SaaS framework — (req, ctx) => Response",
|
|
6
6
|
"exports": {
|
|
7
7
|
".": {
|
|
@@ -36,9 +36,7 @@
|
|
|
36
36
|
"pretest": "docker compose up -d --wait postgres redis 2>/dev/null; sleep 1",
|
|
37
37
|
"test": "node --env-file=.env --test 'src/test/**/*.test.ts' 'src/components/**/*.test.ts' 'src/db/**/*.test.ts'",
|
|
38
38
|
"release": "node scripts/release.mjs",
|
|
39
|
-
"release:dry": "node scripts/release.mjs --dry-run"
|
|
40
|
-
"demo": "node --import weifuwu/dev --env-file=.env apps/demo/server.ts",
|
|
41
|
-
"demo:build": "node apps/demo/scripts/build.mjs"
|
|
39
|
+
"release:dry": "node scripts/release.mjs --dry-run"
|
|
42
40
|
},
|
|
43
41
|
"dependencies": {
|
|
44
42
|
"esbuild": "^0.28.1",
|