@aalis/plugin-session-manager 0.15.0 → 0.16.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/README.md +1 -1
- package/dist/index.d.ts +15 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +398 -549
- package/dist/index.js.map +1 -1
- package/dist/locales/en.d.ts +23 -0
- package/dist/locales/en.d.ts.map +1 -0
- package/dist/locales/en.js +23 -0
- package/dist/locales/en.js.map +1 -0
- package/dist/texts.d.ts +45 -0
- package/dist/texts.d.ts.map +1 -0
- package/dist/texts.js +31 -0
- package/dist/texts.js.map +1 -0
- package/package.json +24 -19
- package/dist/settings.d.ts +0 -66
- package/dist/settings.d.ts.map +0 -1
- package/dist/settings.js +0 -219
- package/dist/settings.js.map +0 -1
package/dist/settings.js
DELETED
|
@@ -1,219 +0,0 @@
|
|
|
1
|
-
// ════════════════════════════════════════════════════════════
|
|
2
|
-
// 会话设置:插件登记的设置项,与存放在宿主配置文档里的三层(全局默认、平台档、平台类型档)。
|
|
3
|
-
//
|
|
4
|
-
// session-manager 不认识任何具体的键:登记过的键按登记的字段校验与解析,没登记的(插件没装或没启用)原样留在存储里、
|
|
5
|
-
// 不参与解析。这三层存放在宿主配置文档的 sessionConfig 字段里:它们是「下次启动用什么」的配置,跟着配置文件走,
|
|
6
|
-
// 可以手写,也能由脚手架生成;插件配置的 schema 词汇装不下任意类型的值,所以不放在本插件的配置里。层的先后见
|
|
7
|
-
// api-session-manager 的 SESSION_LAYERS,各层的实现见 index.ts 的层实现表。
|
|
8
|
-
// ════════════════════════════════════════════════════════════
|
|
9
|
-
import { isDeepStrictEqual } from 'node:util';
|
|
10
|
-
import { SessionConfigError, } from '@aalis/api-session-manager';
|
|
11
|
-
import { isBuiltinFieldType, isUnsafeConfigKey, parseConfig, validateConfig } from '@aalis/schema-config';
|
|
12
|
-
const KINDS = new Set(['owner', 'room', 'task']);
|
|
13
|
-
const PROMINENCES = new Set(['composer', 'common', 'advanced']);
|
|
14
|
-
/**
|
|
15
|
-
* 键与形状不对的登记一律拒绝:键会成为存储与配置文档里的对象键,种类与显眼程度决定界面怎么放;外来字段类型的取值
|
|
16
|
-
* schema-config 不校验,没有 validate 就没人核
|
|
17
|
-
*/
|
|
18
|
-
function assertSetting(setting) {
|
|
19
|
-
const { field, appliesTo, prominence } = setting;
|
|
20
|
-
// 类型只约束第一方的写法:按任意值核
|
|
21
|
-
const key = setting.key;
|
|
22
|
-
if (typeof key !== 'string' || key === '' || key === 'sessionDefaults' || isUnsafeConfigKey(key)) {
|
|
23
|
-
throw new TypeError(`会话设置项的键不合法:${String(key)}`);
|
|
24
|
-
}
|
|
25
|
-
if (typeof field?.type !== 'string' || typeof field.label !== 'string') {
|
|
26
|
-
throw new TypeError(`会话设置项 ${key} 的字段要有 type 与 label`);
|
|
27
|
-
}
|
|
28
|
-
if (!isBuiltinFieldType(field.type) && typeof setting.validate !== 'function') {
|
|
29
|
-
throw new TypeError(`会话设置项 ${key} 的字段类型 ${field.type} 不由 schema-config 校验取值,要给出 validate`);
|
|
30
|
-
}
|
|
31
|
-
if (!Array.isArray(appliesTo) || appliesTo.length === 0 || !appliesTo.every(kind => KINDS.has(kind))) {
|
|
32
|
-
throw new TypeError(`会话设置项 ${key} 的 appliesTo 要是 owner、room、task 里的一项或几项`);
|
|
33
|
-
}
|
|
34
|
-
const narrowest = setting.narrowest;
|
|
35
|
-
if (narrowest !== undefined && narrowest !== 'place') {
|
|
36
|
-
throw new TypeError(`会话设置项 ${key} 的 narrowest 只能是 place`);
|
|
37
|
-
}
|
|
38
|
-
if (!PROMINENCES.has(prominence)) {
|
|
39
|
-
throw new TypeError(`会话设置项 ${key} 的显眼程度要是 composer、common、advanced 之一`);
|
|
40
|
-
}
|
|
41
|
-
const dependsOn = setting.dependsOn;
|
|
42
|
-
if (dependsOn !== undefined && (typeof dependsOn !== 'string' || dependsOn === '' || dependsOn === key)) {
|
|
43
|
-
throw new TypeError(`会话设置项 ${key} 的 dependsOn 要是另一个设置项的键`);
|
|
44
|
-
}
|
|
45
|
-
if (dependsOn !== undefined && field.dynamicOptions === undefined) {
|
|
46
|
-
throw new TypeError(`会话设置项 ${key} 声明了 dependsOn,字段要有 dynamicOptions`);
|
|
47
|
-
}
|
|
48
|
-
const unset = setting.unset;
|
|
49
|
-
if (unset !== undefined && (typeof unset !== 'string' || unset === '')) {
|
|
50
|
-
throw new TypeError(`会话设置项 ${key} 的 unset 要是一句非空的话`);
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
/** 已登记的设置项。几个插件登记同一个键时须是同一份内容的定义,键在最后一个登记者撤回时才失效 */
|
|
54
|
-
export class SettingRegistry {
|
|
55
|
-
changed;
|
|
56
|
-
/** 键 → 登记者,先登记的在前 */
|
|
57
|
-
#byKey = new Map();
|
|
58
|
-
constructor(changed) {
|
|
59
|
-
this.changed = changed;
|
|
60
|
-
}
|
|
61
|
-
register(setting, plugin) {
|
|
62
|
-
assertSetting(setting);
|
|
63
|
-
const entries = this.#byKey.get(setting.key) ?? [];
|
|
64
|
-
const first = entries[0];
|
|
65
|
-
if (first && !isDeepStrictEqual(first.setting, setting)) {
|
|
66
|
-
throw new Error(`会话设置项 ${setting.key} 已由 ${first.plugin} 以另一份定义登记`);
|
|
67
|
-
}
|
|
68
|
-
const entry = { setting, plugin };
|
|
69
|
-
entries.push(entry);
|
|
70
|
-
this.#byKey.set(setting.key, entries);
|
|
71
|
-
this.changed();
|
|
72
|
-
return () => {
|
|
73
|
-
const current = this.#byKey.get(setting.key);
|
|
74
|
-
const index = current?.indexOf(entry) ?? -1;
|
|
75
|
-
if (!current || index < 0)
|
|
76
|
-
return;
|
|
77
|
-
current.splice(index, 1);
|
|
78
|
-
if (current.length === 0)
|
|
79
|
-
this.#byKey.delete(setting.key);
|
|
80
|
-
this.changed();
|
|
81
|
-
};
|
|
82
|
-
}
|
|
83
|
-
get(key) {
|
|
84
|
-
return this.#byKey.get(key)?.[0]?.setting;
|
|
85
|
-
}
|
|
86
|
-
/** 按键最先登记的先后;几个插件登记的取最先登记、仍在场的那个 */
|
|
87
|
-
list() {
|
|
88
|
-
return [...this.#byKey.values()].map(([{ setting, plugin }]) => ({ ...setting, plugin }));
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
/**
|
|
92
|
-
* 按登记的 validate 与字段读一个值:合法时给出解析后的值(undefined 等于没设,如外来类型的空串),不合法时给出原因
|
|
93
|
-
*/
|
|
94
|
-
export function readSetting(setting, value) {
|
|
95
|
-
const rejected = setting.validate?.(value);
|
|
96
|
-
if (rejected !== undefined)
|
|
97
|
-
return { invalid: rejected };
|
|
98
|
-
const schema = { [setting.key]: setting.field };
|
|
99
|
-
const record = { [setting.key]: value };
|
|
100
|
-
const [issue] = validateConfig(schema, record);
|
|
101
|
-
if (issue)
|
|
102
|
-
return { invalid: issue.message };
|
|
103
|
-
return { value: parseConfig(schema, record)[setting.key] };
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* 校验一份写入:没登记的键与不合字段的值抛 {@link SessionConfigError};null 与 undefined 是删掉这一项(记为 undefined),
|
|
107
|
-
* 没登记的键也能删
|
|
108
|
-
*/
|
|
109
|
-
export function checkPatch(registry, patch) {
|
|
110
|
-
const checked = new Map();
|
|
111
|
-
for (const [key, value] of Object.entries(patch)) {
|
|
112
|
-
if (value === null || value === undefined) {
|
|
113
|
-
checked.set(key, undefined);
|
|
114
|
-
continue;
|
|
115
|
-
}
|
|
116
|
-
const setting = registry.get(key);
|
|
117
|
-
if (!setting)
|
|
118
|
-
throw new SessionConfigError(`会话设置项 ${key} 没有登记(提供它的插件没装或没启用)`);
|
|
119
|
-
const read = readSetting(setting, value);
|
|
120
|
-
if ('invalid' in read)
|
|
121
|
-
throw new SessionConfigError(`会话设置项 ${key} 的值无效:${read.invalid}`);
|
|
122
|
-
checked.set(key, read.value);
|
|
123
|
-
}
|
|
124
|
-
return checked;
|
|
125
|
-
}
|
|
126
|
-
/** 把校验过的写入合到一份值上,返回新对象:undefined 删掉这一项 */
|
|
127
|
-
export function applyPatch(values, patch) {
|
|
128
|
-
const out = { ...values };
|
|
129
|
-
for (const [key, value] of patch) {
|
|
130
|
-
if (value === undefined)
|
|
131
|
-
delete out[key];
|
|
132
|
-
else
|
|
133
|
-
out[key] = value;
|
|
134
|
-
}
|
|
135
|
-
return out;
|
|
136
|
-
}
|
|
137
|
-
/**
|
|
138
|
-
* 会话自己的覆盖不收只能设到场所为止(narrowest)的项:校验过的写入里有它的值就抛 {@link SessionConfigError},清掉照收
|
|
139
|
-
*/
|
|
140
|
-
export function assertSessionPatch(registry, checked) {
|
|
141
|
-
for (const [key, value] of checked) {
|
|
142
|
-
if (value !== undefined && registry.get(key)?.narrowest) {
|
|
143
|
-
throw new SessionConfigError(`会话设置项 ${key}:这一项在场所及以上设置,不能设在单个会话上`);
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
/** 层标识里的平台名与类型名:与作用域 `平台:类型:目标` 的段同一套写法(非空、不含 `:`、不是 `*`),还要能当配置文档里的对象键 */
|
|
148
|
-
export function isLayerName(name) {
|
|
149
|
-
return typeof name === 'string' && name !== '' && name !== '*' && !name.includes(':') && !isUnsafeConfigKey(name);
|
|
150
|
-
}
|
|
151
|
-
export function assertName(what, name) {
|
|
152
|
-
if (!isLayerName(name))
|
|
153
|
-
throw new SessionConfigError(`${what}不合法:${String(name)}`);
|
|
154
|
-
}
|
|
155
|
-
const isRecord = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
156
|
-
/**
|
|
157
|
-
* 一张「平台名或类型名 → 对象」的表:值不是对象的条目、名字不合层标识写法的条目告警后忽略(按层写时整份重写,它们不再写回),
|
|
158
|
-
* 列出的层都能按层读写
|
|
159
|
-
*/
|
|
160
|
-
function readTable(value, path, what, warn) {
|
|
161
|
-
const table = new Map();
|
|
162
|
-
if (value === undefined)
|
|
163
|
-
return table;
|
|
164
|
-
if (!isRecord(value)) {
|
|
165
|
-
warn(`宿主配置 ${path} 不是对象,已忽略`);
|
|
166
|
-
return table;
|
|
167
|
-
}
|
|
168
|
-
for (const [name, entry] of Object.entries(value)) {
|
|
169
|
-
if (!isLayerName(name)) {
|
|
170
|
-
warn(`宿主配置 ${path} 里的${what}「${name}」不合法(非空、不含 :、不是 *),已忽略;从界面改任一层时会从配置文件删掉`);
|
|
171
|
-
}
|
|
172
|
-
else if (isRecord(entry))
|
|
173
|
-
table.set(name, entry);
|
|
174
|
-
else
|
|
175
|
-
warn(`宿主配置 ${path}.${name} 不是对象,已忽略`);
|
|
176
|
-
}
|
|
177
|
-
return table;
|
|
178
|
-
}
|
|
179
|
-
const LAYER_KEYS = new Set(['defaults', 'platforms', 'types']);
|
|
180
|
-
/**
|
|
181
|
-
* 读出文档里的三层:形状不对的部分与不认识的段告警后忽略(按层写时整份重写,它们不再写回);值本身在解析时按登记的
|
|
182
|
-
* 字段校验
|
|
183
|
-
*/
|
|
184
|
-
export function readLayers(doc, warn) {
|
|
185
|
-
if (doc !== undefined && !isRecord(doc)) {
|
|
186
|
-
warn('宿主配置 sessionConfig 不是对象,已忽略');
|
|
187
|
-
return { platforms: new Map(), types: new Map() };
|
|
188
|
-
}
|
|
189
|
-
for (const key of Object.keys(doc ?? {})) {
|
|
190
|
-
if (!LAYER_KEYS.has(key)) {
|
|
191
|
-
warn(`宿主配置 sessionConfig.${key} 不认识(只有 defaults、platforms、types),已忽略;从界面改任一层时会从配置文件删掉`);
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
const { defaults, platforms, types } = doc ?? {};
|
|
195
|
-
if (defaults !== undefined && !isRecord(defaults))
|
|
196
|
-
warn('宿主配置 sessionConfig.defaults 不是对象,已忽略');
|
|
197
|
-
return {
|
|
198
|
-
defaults: isRecord(defaults) ? defaults : undefined,
|
|
199
|
-
platforms: readTable(platforms, 'sessionConfig.platforms', '平台名', warn),
|
|
200
|
-
types: new Map([...readTable(types, 'sessionConfig.types', '平台名', warn)].map(([platform, entry]) => [
|
|
201
|
-
platform,
|
|
202
|
-
readTable(entry, `sessionConfig.types.${platform}`, '类型名', warn),
|
|
203
|
-
])),
|
|
204
|
-
};
|
|
205
|
-
}
|
|
206
|
-
/** 三层整理成文档的形状:空了的层与表删掉,形状不对、已被忽略的部分不再写回 */
|
|
207
|
-
export function writeLayers({ defaults, platforms, types }) {
|
|
208
|
-
const kept = (table) => [...table].filter(([, values]) => Object.keys(values).length > 0);
|
|
209
|
-
const doc = {};
|
|
210
|
-
if (defaults && Object.keys(defaults).length > 0)
|
|
211
|
-
doc.defaults = defaults;
|
|
212
|
-
if (kept(platforms).length > 0)
|
|
213
|
-
doc.platforms = Object.fromEntries(kept(platforms));
|
|
214
|
-
const typeEntries = [...types].flatMap(([platform, table]) => kept(table).length > 0 ? [[platform, Object.fromEntries(kept(table))]] : []);
|
|
215
|
-
if (typeEntries.length > 0)
|
|
216
|
-
doc.types = Object.fromEntries(typeEntries);
|
|
217
|
-
return doc;
|
|
218
|
-
}
|
|
219
|
-
//# sourceMappingURL=settings.js.map
|
package/dist/settings.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"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"}
|