dsh-life-pack 0.3.6 → 0.3.13
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/client.js +217 -26
- package/dist/client.js.map +1 -1
- package/dist/config-panel-api.d.ts +21 -0
- package/dist/config-panel-api.d.ts.map +1 -0
- package/dist/config-panel-api.js +20 -0
- package/dist/config-panel-api.js.map +1 -0
- package/dist/config-panel-contract.d.ts +90 -0
- package/dist/config-panel-contract.d.ts.map +1 -0
- package/dist/config-panel-contract.js +32 -0
- package/dist/config-panel-contract.js.map +1 -0
- package/dist/config-panel-value.d.ts +68 -0
- package/dist/config-panel-value.d.ts.map +1 -0
- package/dist/config-panel-value.js +190 -0
- package/dist/config-panel-value.js.map +1 -0
- package/dist/config-panel-view.d.ts +294 -0
- package/dist/config-panel-view.d.ts.map +1 -0
- package/dist/config-panel-view.js +615 -0
- package/dist/config-panel-view.js.map +1 -0
- package/dist/config-panel.d.ts +48 -0
- package/dist/config-panel.d.ts.map +1 -0
- package/dist/config-panel.js +273 -0
- package/dist/config-panel.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/manager-version.d.ts +11 -0
- package/dist/manager-version.d.ts.map +1 -1
- package/dist/manager-version.js +39 -6
- package/dist/manager-version.js.map +1 -1
- package/dist/update-queue.d.ts +42 -0
- package/dist/update-queue.d.ts.map +1 -0
- package/dist/update-queue.js +91 -0
- package/dist/update-queue.js.map +1 -0
- package/package.json +2 -1
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/** 共用配置面板 · 组件本体:一台状态机 + 一圈副作用,渲染交给 `config-panel-view.ts`。
|
|
2
|
+
*
|
|
3
|
+
* 这一件就是六个技能设置页的那张卡片:六家只交「连哪条通道」与「有哪些配置项」(行表),
|
|
4
|
+
* 另加三个可选钩子(跟随映射/卡片标题/自家附加块)。卡片怎么画、值怎么取又怎么填回去、
|
|
5
|
+
* 哪些行被改过还没保存、保存/重置/重新读取怎么走、出错时说什么话,全在本件与它下面那几件里。
|
|
6
|
+
*
|
|
7
|
+
* 状态:读到了没(loading/ready/failed)、哪些行被改过(脏基线)、正在写(busy)、
|
|
8
|
+
* 写完的结果(notice/writeError)、就地失败(error)、目录选择那一路(picking/browseRow)、
|
|
9
|
+
* 复制回执(copy)。**脏基线只看可改行**:只读行显示的是技能算好的绝对路径,拿它当「改动」
|
|
10
|
+
* 会让面板一打开就显示「未保存」。**写完一律重新读一份整面**:写回执不是整面,拿它当整面用
|
|
11
|
+
* 会让页头那行「数据目录」显示成空。
|
|
12
|
+
*
|
|
13
|
+
* 只挂一个副作用(挂载期读一次整面):取数口是**取用器**,每次调它现取,所以那个 effect
|
|
14
|
+
* 不需要跟着任何一格重跑——否则回执一落定就再读一次,会自己把自己转起来。
|
|
15
|
+
*
|
|
16
|
+
* 对外只经 `config-panel-api.ts` 那一道门;本件自己不出门。
|
|
17
|
+
*/
|
|
18
|
+
import * as React from 'react';
|
|
19
|
+
import type { ConfigItem } from './config-panel-contract.js';
|
|
20
|
+
import type { GetCall } from './config-panel-value.js';
|
|
21
|
+
import type { PanelParts } from './config-panel-view.js';
|
|
22
|
+
/** 六家的接入面:**一个通道路由名 + 一张行表 + 三个可选钩子**,另加两格六家同形的宿主取数接线。 */
|
|
23
|
+
export interface ConfigPanelProps {
|
|
24
|
+
/** 通道路由名(各家唯一那个真变量,形如 `/ilife-bill-ilife`)。 */
|
|
25
|
+
readonly channel: string;
|
|
26
|
+
/** 行表:顺序即页面顺序,分级写在每一行自己的 `tier` 上。 */
|
|
27
|
+
readonly items: readonly ConfigItem[];
|
|
28
|
+
/** 卡片标题(钩子之一,各家的产品名);不给就只写「配置」。 */
|
|
29
|
+
readonly title?: string | undefined;
|
|
30
|
+
/** 跟随映射(钩子之一):脏键 → 要显示「将跟随更新」的只读行;不给=一行都不跟随。 */
|
|
31
|
+
readonly followKeysOf?: ((dirtyKeys: readonly string[]) => readonly string[]) | undefined;
|
|
32
|
+
/** 自家附加块(钩子之一:版本行/状态行):画在面板主体之后、动作条之前。 */
|
|
33
|
+
readonly extra?: ((parts: PanelParts) => React.ReactNode) | undefined;
|
|
34
|
+
/** 宿主取数口取用器(六家同形的接线,不是各家数据):每次取数时现取,连接后到也不永久缺席。 */
|
|
35
|
+
readonly getCall: GetCall;
|
|
36
|
+
/** 宿主服务查找(六家同形的接线):目录选择是**软依赖**,缺席只是没有入口。 */
|
|
37
|
+
readonly getService?: ((name: string) => unknown) | undefined;
|
|
38
|
+
}
|
|
39
|
+
/** **静态**跟随行名单:给行表里每个键喂一遍六家交的钩子,收它返回的跟随者。
|
|
40
|
+
*
|
|
41
|
+
* 为什么能这么探:`followKeysOf` 是**纯函数**,六家的实现都只是「脏键里有没有这一格」那一下判断
|
|
42
|
+
* (各家 `src/client.ts`),喂单键即得「谁跟着它」——**与当刻脏不脏无关**。有了这个集合,共用件就能
|
|
43
|
+
* 照 v3.1 的 `.ic-under` 把跟随行相对它的可改行缩进(#920 补),**六家源码一个字节不用改**。
|
|
44
|
+
* 拿不到钩子时回空表(一行都不缩进,照旧平铺)。 */
|
|
45
|
+
export declare function followerKeysOf(items: readonly ConfigItem[], hook: ((dirtyKeys: readonly string[]) => readonly string[]) | undefined): readonly string[];
|
|
46
|
+
/** 技能设置页:承载一家自己的全部可配置项(只配置,不干活)。 */
|
|
47
|
+
export declare function ConfigPanel(props: ConfigPanelProps): React.ReactElement;
|
|
48
|
+
//# sourceMappingURL=config-panel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-panel.d.ts","sourceRoot":"","sources":["../src/config-panel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,UAAU,EAAsB,MAAM,4BAA4B,CAAC;AAUjF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAEvD,OAAO,KAAK,EAAE,UAAU,EAAc,MAAM,wBAAwB,CAAC;AAsDrE,0DAA0D;AAC1D,MAAM,WAAW,gBAAgB;IAC/B,+CAA+C;IAC/C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,sCAAsC;IACtC,QAAQ,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,CAAC;IACtC,mCAAmC;IACnC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,gDAAgD;IAChD,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,KAAK,SAAS,MAAM,EAAE,CAAC,GAAG,SAAS,CAAC;IAC1F,0CAA0C;IAC1C,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,UAAU,KAAK,KAAK,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC;IACtE,mDAAmD;IACnD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,6CAA6C;IAC7C,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,SAAS,CAAC;CAC/D;AAED;;;;;6BAK6B;AAC7B,wBAAgB,cAAc,CAC5B,KAAK,EAAE,SAAS,UAAU,EAAE,EAC5B,IAAI,EAAE,CAAC,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,KAAK,SAAS,MAAM,EAAE,CAAC,GAAG,SAAS,GACtE,SAAS,MAAM,EAAE,CAKnB;AAED,oCAAoC;AACpC,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,KAAK,CAAC,YAAY,CA8LvE"}
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
/** 共用配置面板 · 组件本体:一台状态机 + 一圈副作用,渲染交给 `config-panel-view.ts`。
|
|
2
|
+
*
|
|
3
|
+
* 这一件就是六个技能设置页的那张卡片:六家只交「连哪条通道」与「有哪些配置项」(行表),
|
|
4
|
+
* 另加三个可选钩子(跟随映射/卡片标题/自家附加块)。卡片怎么画、值怎么取又怎么填回去、
|
|
5
|
+
* 哪些行被改过还没保存、保存/重置/重新读取怎么走、出错时说什么话,全在本件与它下面那几件里。
|
|
6
|
+
*
|
|
7
|
+
* 状态:读到了没(loading/ready/failed)、哪些行被改过(脏基线)、正在写(busy)、
|
|
8
|
+
* 写完的结果(notice/writeError)、就地失败(error)、目录选择那一路(picking/browseRow)、
|
|
9
|
+
* 复制回执(copy)。**脏基线只看可改行**:只读行显示的是技能算好的绝对路径,拿它当「改动」
|
|
10
|
+
* 会让面板一打开就显示「未保存」。**写完一律重新读一份整面**:写回执不是整面,拿它当整面用
|
|
11
|
+
* 会让页头那行「数据目录」显示成空。
|
|
12
|
+
*
|
|
13
|
+
* 只挂一个副作用(挂载期读一次整面):取数口是**取用器**,每次调它现取,所以那个 effect
|
|
14
|
+
* 不需要跟着任何一格重跑——否则回执一落定就再读一次,会自己把自己转起来。
|
|
15
|
+
*
|
|
16
|
+
* 对外只经 `config-panel-api.ts` 那一道门;本件自己不出门。
|
|
17
|
+
*/
|
|
18
|
+
import * as React from 'react';
|
|
19
|
+
import { COPY_FEEDBACK_MS, DIRECTORY_PICKER_REFUSED, REMOTE_DIRECTORY_PICKER } from './config-panel-contract.js';
|
|
20
|
+
import { dirtyKeysOf, fetchConfigSurface, fromDraft, noFollowKeys, resetConfigSurface, saveConfigSurface, toDraft, } from './config-panel-value.js';
|
|
21
|
+
import { PanelBody } from './config-panel-view.js';
|
|
22
|
+
import { openRowBrowser, pickerModeOf, readPickAnswer } from './directory-browser-api.js';
|
|
23
|
+
import { createRootsSource } from './directory-browser-roots.js';
|
|
24
|
+
import { MANAGER_ACTIONS, MANAGER_RPC } from './update-contract.js';
|
|
25
|
+
/** 认一认某个值像不像目录选择命名空间(认不出就当没有,绝不把设置页带下来)。 */
|
|
26
|
+
function isPickerFace(raw) {
|
|
27
|
+
if (typeof raw !== 'object' || raw === null)
|
|
28
|
+
return false;
|
|
29
|
+
return typeof raw.pick === 'function';
|
|
30
|
+
}
|
|
31
|
+
/** 现取目录选择命名空间:**软依赖**,拿不到回 null(页面据此不出入口)。 */
|
|
32
|
+
function resolvePicker(getService) {
|
|
33
|
+
if (getService === undefined)
|
|
34
|
+
return null;
|
|
35
|
+
try {
|
|
36
|
+
const raw = getService(REMOTE_DIRECTORY_PICKER);
|
|
37
|
+
return isPickerFace(raw) ? raw : null;
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/** 唤起一次系统文件夹选择器并归一结果(**永不抛**)。 */
|
|
44
|
+
async function pickDirectory(picker) {
|
|
45
|
+
try {
|
|
46
|
+
return readPickAnswer(await picker.pick());
|
|
47
|
+
}
|
|
48
|
+
catch (e) {
|
|
49
|
+
const reason = e instanceof Error ? e.message : String(e);
|
|
50
|
+
return { kind: 'unavailable', message: '打不开系统文件夹对话框(' + reason + '):请直接在框里填绝对路径。' };
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/** 写一次剪贴板:**不碰 DOM**,只读当刻环境的 `globalThis.navigator`(拿不到就回 false,不抛)。
|
|
54
|
+
*
|
|
55
|
+
* 为什么不照原型那样退到 `document.execCommand`:本仓插件侧禁 DOM 直写(`document`/`window`),
|
|
56
|
+
* 所以没有那条兜底;拿不到剪贴板就如实回 false,界面上那一枚按钮就地显示「复制失败」。 */
|
|
57
|
+
async function writeClipboard(text) {
|
|
58
|
+
try {
|
|
59
|
+
const nav = globalThis.navigator;
|
|
60
|
+
const clip = nav?.clipboard;
|
|
61
|
+
if (clip === undefined || typeof clip.writeText !== 'function')
|
|
62
|
+
return false;
|
|
63
|
+
await clip.writeText(text);
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/** **静态**跟随行名单:给行表里每个键喂一遍六家交的钩子,收它返回的跟随者。
|
|
71
|
+
*
|
|
72
|
+
* 为什么能这么探:`followKeysOf` 是**纯函数**,六家的实现都只是「脏键里有没有这一格」那一下判断
|
|
73
|
+
* (各家 `src/client.ts`),喂单键即得「谁跟着它」——**与当刻脏不脏无关**。有了这个集合,共用件就能
|
|
74
|
+
* 照 v3.1 的 `.ic-under` 把跟随行相对它的可改行缩进(#920 补),**六家源码一个字节不用改**。
|
|
75
|
+
* 拿不到钩子时回空表(一行都不缩进,照旧平铺)。 */
|
|
76
|
+
export function followerKeysOf(items, hook) {
|
|
77
|
+
if (hook === undefined)
|
|
78
|
+
return [];
|
|
79
|
+
const out = new Set();
|
|
80
|
+
for (const item of items)
|
|
81
|
+
for (const key of hook([item.key]))
|
|
82
|
+
out.add(key);
|
|
83
|
+
return [...out];
|
|
84
|
+
}
|
|
85
|
+
/** 技能设置页:承载一家自己的全部可配置项(只配置,不干活)。 */
|
|
86
|
+
export function ConfigPanel(props) {
|
|
87
|
+
const [state, setState] = React.useState({ kind: 'loading' });
|
|
88
|
+
const [pickerGone, setPickerGone] = React.useState(false);
|
|
89
|
+
const [picking, setPicking] = React.useState(false);
|
|
90
|
+
const [draft, setDraft] = React.useState({});
|
|
91
|
+
const [busy, setBusy] = React.useState(false);
|
|
92
|
+
const [notice, setNotice] = React.useState(null);
|
|
93
|
+
const [writeError, setWriteError] = React.useState(null);
|
|
94
|
+
const [error, setError] = React.useState(null);
|
|
95
|
+
const [browseRow, setBrowseRow] = React.useState(null);
|
|
96
|
+
const [copy, setCopy] = React.useState(null);
|
|
97
|
+
/** 复制回执的复位定时器:**一次性 UI 回执**,不是数据轮询——点一次起一个,到点自我复位,
|
|
98
|
+
* 下一次点击先清掉旧的,卸载时也清掉(下面那个清扫 effect 就是那一半)。 */
|
|
99
|
+
const copyTimer = React.useRef(null);
|
|
100
|
+
React.useEffect(() => () => {
|
|
101
|
+
if (copyTimer.current !== null) {
|
|
102
|
+
clearTimeout(copyTimer.current);
|
|
103
|
+
copyTimer.current = null;
|
|
104
|
+
}
|
|
105
|
+
}, []);
|
|
106
|
+
/** 挂载期读一次整面:卸载之后回来的回执丢掉(不许往已经没了的页面上写)。 */
|
|
107
|
+
React.useEffect(() => {
|
|
108
|
+
let alive = true;
|
|
109
|
+
void (async () => {
|
|
110
|
+
const r = await fetchConfigSurface(props.getCall(), props.channel);
|
|
111
|
+
if (!alive)
|
|
112
|
+
return;
|
|
113
|
+
if (r.ok) {
|
|
114
|
+
setState({ kind: 'ready', surface: r.surface });
|
|
115
|
+
setDraft(toDraft(props.items, r.surface.values, r.surface));
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
setState({ kind: 'failed', message: r.message });
|
|
119
|
+
}
|
|
120
|
+
})();
|
|
121
|
+
return () => {
|
|
122
|
+
alive = false;
|
|
123
|
+
};
|
|
124
|
+
// 只跑一次:`getCall` 本身是取用器,调用时现取连接;行表与通道在一张卡片里不会换。
|
|
125
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
126
|
+
}, []);
|
|
127
|
+
/** 把一份整面铺到页面上(读到之后唯一那一处落点)。 */
|
|
128
|
+
const apply = (surface) => {
|
|
129
|
+
setState({ kind: 'ready', surface });
|
|
130
|
+
setDraft(toDraft(props.items, surface.values, surface));
|
|
131
|
+
};
|
|
132
|
+
const load = async () => {
|
|
133
|
+
setNotice(null);
|
|
134
|
+
setWriteError(null);
|
|
135
|
+
setError(null);
|
|
136
|
+
const r = await fetchConfigSurface(props.getCall(), props.channel);
|
|
137
|
+
if (r.ok)
|
|
138
|
+
apply(r.surface);
|
|
139
|
+
else
|
|
140
|
+
setState({ kind: 'failed', message: r.message });
|
|
141
|
+
};
|
|
142
|
+
/** 写完(保存/重置)之后重新读一份整面:写回执只有 `{path, values}`、重置回执只有
|
|
143
|
+
* `{path, backupPath}`,都不是整面——拿它当整面用,页头那行「数据目录」会显示成空。 */
|
|
144
|
+
const writeThenReload = async (done) => {
|
|
145
|
+
setBusy(true);
|
|
146
|
+
setNotice(null);
|
|
147
|
+
setWriteError(null);
|
|
148
|
+
setError(null);
|
|
149
|
+
const r = await fetchConfigSurface(props.getCall(), props.channel);
|
|
150
|
+
if (r.ok) {
|
|
151
|
+
apply(r.surface);
|
|
152
|
+
setNotice(done);
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
setState({ kind: 'failed', message: r.message });
|
|
156
|
+
}
|
|
157
|
+
setBusy(false);
|
|
158
|
+
};
|
|
159
|
+
const onChange = (key, next) => {
|
|
160
|
+
setDraft((prev) => ({ ...prev, [key]: next }));
|
|
161
|
+
setNotice(null);
|
|
162
|
+
setWriteError(null);
|
|
163
|
+
setError(null);
|
|
164
|
+
};
|
|
165
|
+
const picker = pickerGone ? null : resolvePicker(props.getService);
|
|
166
|
+
/** 唤起系统文件夹选择器那一条路(应用内浏览被拒时的兜底,也是命名空间只给 `pick` 时的唯一一条)。 */
|
|
167
|
+
const openNative = async (key) => {
|
|
168
|
+
const face = pickerGone ? null : resolvePicker(props.getService);
|
|
169
|
+
if (face === null)
|
|
170
|
+
return;
|
|
171
|
+
// 系统对话框是模态的:等它回来的这段时间给一行字,免得看着像「点了没反应」。
|
|
172
|
+
setPicking(true);
|
|
173
|
+
setError(null);
|
|
174
|
+
const outcome = await pickDirectory(face);
|
|
175
|
+
setPicking(false);
|
|
176
|
+
if (outcome.kind === 'picked')
|
|
177
|
+
onChange(key, outcome.path);
|
|
178
|
+
else if (outcome.kind === 'unavailable') {
|
|
179
|
+
setError(outcome.message);
|
|
180
|
+
setPickerGone(true);
|
|
181
|
+
}
|
|
182
|
+
};
|
|
183
|
+
/** 目录行的入口动作:**先应用内浏览,宿主没给这条路再换系统对话框**(判断在共用件里)。 */
|
|
184
|
+
const onOpenRow = async (key) => {
|
|
185
|
+
setError(null);
|
|
186
|
+
const opened = openRowBrowser({
|
|
187
|
+
picker,
|
|
188
|
+
initialPath: draft[key] ?? '',
|
|
189
|
+
onChange: (next) => onChange(key, next),
|
|
190
|
+
onRow: setBrowseRow,
|
|
191
|
+
refusalCode: DIRECTORY_PICKER_REFUSED,
|
|
192
|
+
rootsSource: createRootsSource({
|
|
193
|
+
getCall: props.getCall,
|
|
194
|
+
base: MANAGER_RPC.base,
|
|
195
|
+
endpoint: MANAGER_RPC.endpoint,
|
|
196
|
+
method: MANAGER_ACTIONS.roots,
|
|
197
|
+
}),
|
|
198
|
+
});
|
|
199
|
+
if (opened === undefined || (await opened) === 'refused')
|
|
200
|
+
await openNative(key);
|
|
201
|
+
};
|
|
202
|
+
/** 复制一行(定稿 v3 第三条):写完就地变「已复制」(写不进去就地变「复制失败」),1.5 秒后复位,不弹提示。 */
|
|
203
|
+
const onCopy = (key, text) => {
|
|
204
|
+
void writeClipboard(text).then((ok) => {
|
|
205
|
+
setCopy({ key, ok });
|
|
206
|
+
if (copyTimer.current !== null)
|
|
207
|
+
clearTimeout(copyTimer.current);
|
|
208
|
+
copyTimer.current = setTimeout(() => {
|
|
209
|
+
copyTimer.current = null;
|
|
210
|
+
setCopy(null);
|
|
211
|
+
}, COPY_FEEDBACK_MS);
|
|
212
|
+
});
|
|
213
|
+
};
|
|
214
|
+
const onSave = async () => {
|
|
215
|
+
setBusy(true);
|
|
216
|
+
setNotice(null);
|
|
217
|
+
setWriteError(null);
|
|
218
|
+
setError(null);
|
|
219
|
+
const r = await saveConfigSurface(props.getCall(), props.channel, fromDraft(props.items, draft));
|
|
220
|
+
setBusy(false);
|
|
221
|
+
if (r.ok)
|
|
222
|
+
await writeThenReload('已保存,立即生效(不用重启宿主)');
|
|
223
|
+
else
|
|
224
|
+
setWriteError(r.message);
|
|
225
|
+
};
|
|
226
|
+
const onReset = async () => {
|
|
227
|
+
setBusy(true);
|
|
228
|
+
setNotice(null);
|
|
229
|
+
setWriteError(null);
|
|
230
|
+
setError(null);
|
|
231
|
+
const r = await resetConfigSurface(props.getCall(), props.channel);
|
|
232
|
+
setBusy(false);
|
|
233
|
+
if (r.ok)
|
|
234
|
+
await writeThenReload('已重置为默认(原配置已另存一份 .bak)');
|
|
235
|
+
else
|
|
236
|
+
setWriteError(r.message);
|
|
237
|
+
};
|
|
238
|
+
const surface = state.kind === 'ready' ? state.surface : null;
|
|
239
|
+
const baseline = surface !== null ? toDraft(props.items, surface.values, surface) : null;
|
|
240
|
+
const dirtyKeys = baseline === null ? [] : dirtyKeysOf(props.items, draft, baseline);
|
|
241
|
+
const followKeys = (props.followKeysOf ?? noFollowKeys)(dirtyKeys);
|
|
242
|
+
/** 技能侧报出「有格子真用不了」⇒ 标题行那枚「配置里有值用不了」徽标才亮(#915 第二步)。 */
|
|
243
|
+
const hasAlert = surface !== null && surface.alerts !== undefined && Object.keys(surface.alerts).length > 0;
|
|
244
|
+
/** 静态那一份(与脏不脏无关):画跟随行的缩进用(v3.1 的 `.ic-under`)。 */
|
|
245
|
+
const followerKeys = followerKeysOf(props.items, props.followKeysOf);
|
|
246
|
+
const mode = pickerModeOf(picker);
|
|
247
|
+
const rowEntry = mode === 'none' ? null : { mode, onOpen: onOpenRow };
|
|
248
|
+
return React.createElement(PanelBody, {
|
|
249
|
+
title: props.title,
|
|
250
|
+
items: props.items,
|
|
251
|
+
state,
|
|
252
|
+
draft,
|
|
253
|
+
busy,
|
|
254
|
+
notice,
|
|
255
|
+
writeError,
|
|
256
|
+
error,
|
|
257
|
+
picking,
|
|
258
|
+
browseRow,
|
|
259
|
+
rowEntry,
|
|
260
|
+
dirtyKeys,
|
|
261
|
+
followKeys,
|
|
262
|
+
followerKeys,
|
|
263
|
+
invalid: hasAlert,
|
|
264
|
+
copy,
|
|
265
|
+
onCopy,
|
|
266
|
+
onChange,
|
|
267
|
+
onSave: () => void onSave(),
|
|
268
|
+
onReset: () => void onReset(),
|
|
269
|
+
onRetry: () => void load(),
|
|
270
|
+
extra: props.extra,
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
//# sourceMappingURL=config-panel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-panel.js","sourceRoot":"","sources":["../src/config-panel.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -9,4 +9,6 @@ export { MANAGER_ACTIONS, MANAGER_RPC, manualInstallCommand, reasonText } from '
|
|
|
9
9
|
/** 本机「根」清单(#744):宿主半取数,六家的目录浏览器经 `ilife-manager.roots` 取用。 */
|
|
10
10
|
export { clearRootsCache, listRoots, parseDriveRows, rootsReply } from './roots.js';
|
|
11
11
|
export type { RootsDeps } from './roots.js';
|
|
12
|
+
/** #918:读**任意装机包**版本的那一处唯一定义(备忘宿主侧取用;卡路里那份随后迁移)。 */
|
|
13
|
+
export { installedVersionOf } from './manager-version.js';
|
|
12
14
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,eAAO,MAAM,IAAI,kBAAkB,CAAC;AACpC,eAAO,MAAM,MAAM,EAAE,SAAS,MAAM,EAAmB,CAAC;AAaxD,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAgDxC;AAED,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AAC9H,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACtG,8DAA8D;AAC9D,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACpF,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,eAAO,MAAM,IAAI,kBAAkB,CAAC;AACpC,eAAO,MAAM,MAAM,EAAE,SAAS,MAAM,EAAmB,CAAC;AAaxD,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAgDxC;AAED,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AAC9H,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACtG,8DAA8D;AAC9D,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACpF,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,oDAAoD;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -70,4 +70,6 @@ export { UPDATE_TARGETS } from './update-targets.js';
|
|
|
70
70
|
export { MANAGER_ACTIONS, MANAGER_RPC, manualInstallCommand, reasonText } from './update-contract.js';
|
|
71
71
|
/** 本机「根」清单(#744):宿主半取数,六家的目录浏览器经 `ilife-manager.roots` 取用。 */
|
|
72
72
|
export { clearRootsCache, listRoots, parseDriveRows, rootsReply } from './roots.js';
|
|
73
|
+
/** #918:读**任意装机包**版本的那一处唯一定义(备忘宿主侧取用;卡路里那份随后迁移)。 */
|
|
74
|
+
export { installedVersionOf } from './manager-version.js';
|
|
73
75
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,4 +4,15 @@ export declare function managerPackageJsonPath(): string;
|
|
|
4
4
|
*
|
|
5
5
|
* `filePath` 只在测试里给(拿哨兵件验「读的是给的那份」);生产路径走 `managerPackageJsonPath()`。 */
|
|
6
6
|
export declare function readManagerVersion(filePath?: string): string;
|
|
7
|
+
/** 按**包名**找那份已装包描述文件的路径:从 `from` 那份模块出发按 Node 解析规则找 `<包名>/package.json`
|
|
8
|
+
* (六家插件与六个技能包的 `exports` 都留了 `./package.json` 这一条)。
|
|
9
|
+
*
|
|
10
|
+
* 解析不到就抛(`MODULE_NOT_FOUND`)——接住它的是 `installedVersionOf`,调用方不必自己包 try。 */
|
|
11
|
+
export declare function installedPackageJsonPath(packageName: string, from?: string): string;
|
|
12
|
+
/** 读**任意装机包**的版本(#918:全仓唯一定义,六家与技能侧都走这一处)。
|
|
13
|
+
*
|
|
14
|
+
* 与总管自述那一条同口径:读的是**已装的那份**(不读构建期字面量)、只解析 `version`、
|
|
15
|
+
* 不缓存不轮询、**永不抛**——解析不到/读不到/解析失败/字段缺失一律回 `VERSION_UNKNOWN` 并 warn 留痕。
|
|
16
|
+
* `from` 只在测试里给(拿哨兵件验「读的是给的那一份」)。 */
|
|
17
|
+
export declare function installedVersionOf(packageName: string, from?: string): string;
|
|
7
18
|
//# sourceMappingURL=manager-version.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager-version.d.ts","sourceRoot":"","sources":["../src/manager-version.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"manager-version.d.ts","sourceRoot":"","sources":["../src/manager-version.ts"],"names":[],"mappings":"AAsBA,4EAA4E;AAC5E,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AA2BD;;yEAEyE;AACzE,wBAAgB,kBAAkB,CAAC,QAAQ,GAAE,MAAiC,GAAG,MAAM,CAOtF;AAWD;;;2EAG2E;AAC3E,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,GAAE,MAAwB,GAAG,MAAM,CAEpG;AAED;;;;sCAIsC;AACtC,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,GAAE,MAAwB,GAAG,MAAM,CAc9F"}
|
package/dist/manager-version.js
CHANGED
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
* 进浏览器束会被 `test/client-bundle-48.test.mjs` 的纯度门拦住。
|
|
16
16
|
*/
|
|
17
17
|
import { readFileSync } from 'node:fs';
|
|
18
|
+
import { createRequire } from 'node:module';
|
|
18
19
|
import { dirname, join } from 'node:path';
|
|
19
20
|
import { fileURLToPath } from 'node:url';
|
|
20
21
|
import { VERSION_UNKNOWN } from './update-contract.js';
|
|
@@ -49,12 +50,44 @@ function readOne(path) {
|
|
|
49
50
|
export function readManagerVersion(filePath = managerPackageJsonPath()) {
|
|
50
51
|
const outcome = readOne(filePath);
|
|
51
52
|
if (outcome.version === null) {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
53
|
+
warnVersionRead('dsh-life-pack @ ' + filePath, outcome.reason);
|
|
54
|
+
return VERSION_UNKNOWN;
|
|
55
|
+
}
|
|
56
|
+
return outcome.version;
|
|
57
|
+
}
|
|
58
|
+
/** warn 不得抛:面板降级不受影响。 */
|
|
59
|
+
function warnVersionRead(what, reason) {
|
|
60
|
+
try {
|
|
61
|
+
console.warn('[dsh-life-pack] version read failed: ' + what + ' reason=' + reason);
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
/* 同上 */
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/** 按**包名**找那份已装包描述文件的路径:从 `from` 那份模块出发按 Node 解析规则找 `<包名>/package.json`
|
|
68
|
+
* (六家插件与六个技能包的 `exports` 都留了 `./package.json` 这一条)。
|
|
69
|
+
*
|
|
70
|
+
* 解析不到就抛(`MODULE_NOT_FOUND`)——接住它的是 `installedVersionOf`,调用方不必自己包 try。 */
|
|
71
|
+
export function installedPackageJsonPath(packageName, from = import.meta.url) {
|
|
72
|
+
return createRequire(from).resolve(packageName + '/package.json');
|
|
73
|
+
}
|
|
74
|
+
/** 读**任意装机包**的版本(#918:全仓唯一定义,六家与技能侧都走这一处)。
|
|
75
|
+
*
|
|
76
|
+
* 与总管自述那一条同口径:读的是**已装的那份**(不读构建期字面量)、只解析 `version`、
|
|
77
|
+
* 不缓存不轮询、**永不抛**——解析不到/读不到/解析失败/字段缺失一律回 `VERSION_UNKNOWN` 并 warn 留痕。
|
|
78
|
+
* `from` 只在测试里给(拿哨兵件验「读的是给的那一份」)。 */
|
|
79
|
+
export function installedVersionOf(packageName, from = import.meta.url) {
|
|
80
|
+
let filePath;
|
|
81
|
+
try {
|
|
82
|
+
filePath = installedPackageJsonPath(packageName, from);
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
warnVersionRead(packageName, 'resolve failed: ' + (error instanceof Error ? error.message : String(error)));
|
|
86
|
+
return VERSION_UNKNOWN;
|
|
87
|
+
}
|
|
88
|
+
const outcome = readOne(filePath);
|
|
89
|
+
if (outcome.version === null) {
|
|
90
|
+
warnVersionRead(packageName + ' @ ' + filePath, outcome.reason);
|
|
58
91
|
return VERSION_UNKNOWN;
|
|
59
92
|
}
|
|
60
93
|
return outcome.version;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager-version.js","sourceRoot":"","sources":["../src/manager-version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,4EAA4E;AAC5E,MAAM,UAAU,sBAAsB;IACpC,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;AAC7E,CAAC;AAOD,SAAS,OAAO,CAAC,IAAY;IAC3B,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,eAAe,GAAG,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;IAC/G,CAAC;IACD,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAY,CAAC;IACtC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,gBAAgB,GAAG,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;IAChH,CAAC;IACD,MAAM,OAAO,GAAI,MAAmD,EAAE,OAAO,CAAC;IAC9E,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,gCAAgC,EAAE,CAAC;IACrE,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AACjD,CAAC;AAED;;yEAEyE;AACzE,MAAM,UAAU,kBAAkB,CAAC,WAAmB,sBAAsB,EAAE;IAC5E,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAClC,IAAI,OAAO,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QAC7B,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"manager-version.js","sourceRoot":"","sources":["../src/manager-version.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { CheckOutcome, TargetInfo } from './update-view.js';
|
|
2
|
+
import type { CallFailure, CallOutcome } from './update-client.js';
|
|
3
|
+
/** 行相位(与 `update-panel.ts` 的 `UpdateRowState['phase']` 同形;结构上兼容,不另起第二套名字)。 */
|
|
4
|
+
export type QueuePhase = 'idle' | 'checking' | 'ready' | 'installing' | 'failed';
|
|
5
|
+
/** 队列读写的一行(结构型:面板那行原样传进来即可,不必 import 面板)。 */
|
|
6
|
+
export interface QueueRowState {
|
|
7
|
+
readonly phase: QueuePhase;
|
|
8
|
+
readonly outcome: CheckOutcome | null;
|
|
9
|
+
readonly failure: CallFailure | null;
|
|
10
|
+
}
|
|
11
|
+
/** 任一行 installing 即忙:题头检查更新禁用、行按钮全局互斥、checkAll/act 入口直接返回的同一判据。 */
|
|
12
|
+
export declare function hasInstallingRow(rows: Readonly<Record<string, {
|
|
13
|
+
readonly phase: string;
|
|
14
|
+
}>>): boolean;
|
|
15
|
+
/** 忙时拒绝的那枚失败:码与人话都取 `update-busy` 原句(#678/#740 冻结文案,本文件不写第二套话)。 */
|
|
16
|
+
export declare function updateBusyFailure(targetKey: string): CallFailure;
|
|
17
|
+
/** 串行一轮的传输注入(面板传真实现,单测传假件;每一步的顺序断言即并发门禁)。 */
|
|
18
|
+
export interface SerialDeps {
|
|
19
|
+
/** 查一家最新版(面板:`checkTarget(getCall(), target)`)。 */
|
|
20
|
+
readonly check: (target: TargetInfo) => Promise<CallOutcome<CheckOutcome>>;
|
|
21
|
+
/** 装完后重读真实状态(面板:`checkTarget(getCall(), target, target.phones?.status)`)。 */
|
|
22
|
+
readonly checkStatus: (target: TargetInfo) => Promise<CallOutcome<CheckOutcome>>;
|
|
23
|
+
/** 装上缺席包(面板:`installAbsent(getCall(), target, version)`)。 */
|
|
24
|
+
readonly installAbsent: (target: TargetInfo, version: string) => Promise<CallOutcome<{
|
|
25
|
+
readonly packageName: string;
|
|
26
|
+
readonly version: string;
|
|
27
|
+
}>>;
|
|
28
|
+
/** 装上已装包:查→装→轮询到收尾(面板:`updateInstalled(getCall(), target, pollMs)`,形状冻结)。 */
|
|
29
|
+
readonly installPresent: (target: TargetInfo) => Promise<CallOutcome<CheckOutcome>>;
|
|
30
|
+
/** 只改这一行的补丁(他行保持各自 phase:各行自显的全部依据)。 */
|
|
31
|
+
readonly patch: (key: string, next: QueueRowState) => void;
|
|
32
|
+
/** 读这一行当前态(串行起步的那次 checking 要带着旧 outcome)。 */
|
|
33
|
+
readonly getRow: (key: string) => QueueRowState | undefined;
|
|
34
|
+
}
|
|
35
|
+
/** 按目标顺序逐家查→装→收尾:一家收尾才起下一家;失败记 failed 继续;待重启跳过安装。
|
|
36
|
+
*
|
|
37
|
+
* 跳过安装只有一种:快照事实已是待重启(`restartPendingOf`)——由横幅点名,不在这里装第二遍。
|
|
38
|
+
* 不可装(已是最新/拦下且无安装动作)记 ready 收尾;缺席且无最新版本号记 ready 收尾(等下一次检查)。
|
|
39
|
+
* 本函数不汇总排队数、不碰他行(`patch` 只收本家 key)。
|
|
40
|
+
*/
|
|
41
|
+
export declare function runSerialUpdateAll(targets: readonly TargetInfo[], deps: SerialDeps): Promise<void>;
|
|
42
|
+
//# sourceMappingURL=update-queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-queue.d.ts","sourceRoot":"","sources":["../src/update-queue.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEnE,8EAA8E;AAC9E,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,YAAY,GAAG,QAAQ,CAAC;AAEjF,6CAA6C;AAC7C,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;CACtC;AAED,mEAAmE;AACnE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,GAAG,OAAO,CAKpG;AAED,mEAAmE;AACnE,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,CAEhE;AAED,6CAA6C;AAC7C,MAAM,WAAW,UAAU;IACzB,mDAAmD;IACnD,QAAQ,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC;IAC3E,6EAA6E;IAC7E,QAAQ,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC;IACjF,6DAA6D;IAC7D,QAAQ,CAAC,aAAa,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,WAAW,CAAC;QAAE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;IAClJ,6EAA6E;IAC7E,QAAQ,CAAC,cAAc,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC;IACpF,wCAAwC;IACxC,QAAQ,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,KAAK,IAAI,CAAC;IAC3D,8CAA8C;IAC9C,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,aAAa,GAAG,SAAS,CAAC;CAC7D;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA6DxG"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/** 一键全部更新的串行队列与并发门禁(纯函数:无 DOM、无 react;面板钩子与单测共用同一份)。
|
|
2
|
+
*
|
|
3
|
+
* 拍板出处(#925 决议,用户已逐条确认,不可改语义):
|
|
4
|
+
* 1. 一键排队串行:按目标顺序逐家查→装→轮询到收尾,一家收尾才起下一家;失败一家记 failed
|
|
5
|
+
* 继续下一家;单家重试走行按钮 recheck/retry;删并行发起与交叉轮询。
|
|
6
|
+
* 2. 安装中题头点不得:任一行 installing 时题头检查更新禁用;人话沿用 reasonText('update-busy') 原句。
|
|
7
|
+
* 3. 行按钮全局互斥:installing 行自锁,其余行禁用不进队列;act 入口有忙拒 update-busy 且不改 rows。
|
|
8
|
+
* 4. 进度各行自显:每行各自显示,他行保持 phase;题头不汇总排队数;待重启跳过安装继续下一家。
|
|
9
|
+
*
|
|
10
|
+
* 本文件只管「排队形状与忙判据」:传输动作由调用方注入(查/装/轮询的真实现住 `update-client.ts`,
|
|
11
|
+
* 面板钩子转交,单测给假件),故改坏串行形状必被门禁逮到。
|
|
12
|
+
*/
|
|
13
|
+
import { reasonText } from './update-contract.js';
|
|
14
|
+
import { isAbsent, restartPendingOf, verdictOf } from './update-view.js';
|
|
15
|
+
/** 任一行 installing 即忙:题头检查更新禁用、行按钮全局互斥、checkAll/act 入口直接返回的同一判据。 */
|
|
16
|
+
export function hasInstallingRow(rows) {
|
|
17
|
+
for (const key of Object.keys(rows)) {
|
|
18
|
+
if (rows[key]?.phase === 'installing')
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
/** 忙时拒绝的那枚失败:码与人话都取 `update-busy` 原句(#678/#740 冻结文案,本文件不写第二套话)。 */
|
|
24
|
+
export function updateBusyFailure(targetKey) {
|
|
25
|
+
return { ok: false, code: 'update-busy', message: reasonText('update-busy'), details: { target: targetKey }, manual: null };
|
|
26
|
+
}
|
|
27
|
+
/** 按目标顺序逐家查→装→收尾:一家收尾才起下一家;失败记 failed 继续;待重启跳过安装。
|
|
28
|
+
*
|
|
29
|
+
* 跳过安装只有一种:快照事实已是待重启(`restartPendingOf`)——由横幅点名,不在这里装第二遍。
|
|
30
|
+
* 不可装(已是最新/拦下且无安装动作)记 ready 收尾;缺席且无最新版本号记 ready 收尾(等下一次检查)。
|
|
31
|
+
* 本函数不汇总排队数、不碰他行(`patch` 只收本家 key)。
|
|
32
|
+
*/
|
|
33
|
+
export async function runSerialUpdateAll(targets, deps) {
|
|
34
|
+
for (const target of targets) {
|
|
35
|
+
const current = deps.getRow(target.key);
|
|
36
|
+
deps.patch(target.key, { phase: 'checking', outcome: current?.outcome ?? null, failure: null });
|
|
37
|
+
const checked = await deps.check(target);
|
|
38
|
+
if (!checked.ok) {
|
|
39
|
+
deps.patch(target.key, { phase: 'failed', outcome: null, failure: checked });
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
if (restartPendingOf(checked.value.snapshot)) {
|
|
43
|
+
deps.patch(target.key, { phase: 'ready', outcome: checked.value, failure: null });
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
const verdict = verdictOf(target, checked.value.snapshot);
|
|
47
|
+
const needInstall = verdict.action === 'update' || verdict.action === 'install' || verdict.action === 'retry';
|
|
48
|
+
if (!needInstall) {
|
|
49
|
+
deps.patch(target.key, { phase: 'ready', outcome: checked.value, failure: null });
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
deps.patch(target.key, { phase: 'installing', outcome: checked.value, failure: null });
|
|
53
|
+
if (isAbsent(target)) {
|
|
54
|
+
const version = checked.value.snapshot.latestVersion;
|
|
55
|
+
if (!version) {
|
|
56
|
+
deps.patch(target.key, { phase: 'ready', outcome: checked.value, failure: null });
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
const done = await deps.installAbsent(target, version);
|
|
60
|
+
if (done.ok) {
|
|
61
|
+
const refreshed = await deps.checkStatus(target);
|
|
62
|
+
deps.patch(target.key, refreshed.ok
|
|
63
|
+
? { phase: 'ready', outcome: refreshed.value, failure: null }
|
|
64
|
+
: { phase: 'failed', outcome: null, failure: refreshed });
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
deps.patch(target.key, {
|
|
68
|
+
phase: 'failed',
|
|
69
|
+
outcome: checked.value,
|
|
70
|
+
failure: { ...done, manual: done.manual ?? checked.value.manual ?? null },
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
const done = await deps.installPresent(target);
|
|
76
|
+
if (done.ok) {
|
|
77
|
+
const refreshed = await deps.checkStatus(target);
|
|
78
|
+
deps.patch(target.key, refreshed.ok
|
|
79
|
+
? { phase: 'ready', outcome: refreshed.value, failure: null }
|
|
80
|
+
: { phase: 'failed', outcome: null, failure: refreshed });
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
deps.patch(target.key, {
|
|
84
|
+
phase: 'failed',
|
|
85
|
+
outcome: checked.value,
|
|
86
|
+
failure: { ...done, manual: done.manual ?? checked.value.manual ?? null },
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=update-queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-queue.js","sourceRoot":"","sources":["../src/update-queue.ts"],"names":[],"mappings":"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"}
|