@aalis/runtime 0.15.1 → 0.17.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 +11 -2
- package/dist/config-store.d.ts +47 -12
- package/dist/config-store.d.ts.map +1 -1
- package/dist/config-store.js +446 -60
- package/dist/config-store.js.map +1 -1
- package/dist/config-sync.d.ts +22 -8
- package/dist/config-sync.d.ts.map +1 -1
- package/dist/config-sync.js +86 -33
- package/dist/config-sync.js.map +1 -1
- package/dist/console-sink.d.ts +1 -1
- package/dist/file-logger.d.ts +4 -4
- package/dist/file-logger.d.ts.map +1 -1
- package/dist/file-logger.js +6 -5
- package/dist/file-logger.js.map +1 -1
- package/dist/home.d.ts +64 -0
- package/dist/home.d.ts.map +1 -0
- package/dist/home.js +236 -0
- package/dist/home.js.map +1 -0
- package/dist/host-logs.d.ts +9 -0
- package/dist/host-logs.d.ts.map +1 -0
- package/dist/host-logs.js +104 -0
- package/dist/host-logs.js.map +1 -0
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -4
- package/dist/index.js.map +1 -1
- package/dist/instance-lock.d.ts +56 -0
- package/dist/instance-lock.d.ts.map +1 -0
- package/dist/instance-lock.js +282 -0
- package/dist/instance-lock.js.map +1 -0
- package/dist/locales/en.d.ts +16 -0
- package/dist/locales/en.d.ts.map +1 -0
- package/dist/locales/en.js +16 -0
- package/dist/locales/en.js.map +1 -0
- package/dist/node-modules-loader.d.ts +2 -2
- package/dist/node-modules-loader.d.ts.map +1 -1
- package/dist/node-modules-loader.js +8 -4
- package/dist/node-modules-loader.js.map +1 -1
- package/dist/plugin-discovery.d.ts +9 -4
- package/dist/plugin-discovery.d.ts.map +1 -1
- package/dist/plugin-discovery.js +28 -16
- package/dist/plugin-discovery.js.map +1 -1
- package/dist/providers.d.ts +38 -13
- package/dist/providers.d.ts.map +1 -1
- package/dist/providers.js +107 -232
- package/dist/providers.js.map +1 -1
- package/dist/secrets.d.ts +47 -0
- package/dist/secrets.d.ts.map +1 -0
- package/dist/secrets.js +108 -0
- package/dist/secrets.js.map +1 -0
- package/dist/start.d.ts +19 -12
- package/dist/start.d.ts.map +1 -1
- package/dist/start.js +174 -48
- package/dist/start.js.map +1 -1
- package/dist/subcommand.d.ts.map +1 -1
- package/dist/subcommand.js +2 -2
- package/dist/subcommand.js.map +1 -1
- package/dist/texts.d.ts +31 -0
- package/dist/texts.d.ts.map +1 -0
- package/dist/texts.js +21 -0
- package/dist/texts.js.map +1 -0
- package/dist/yaml-file.d.ts +36 -0
- package/dist/yaml-file.d.ts.map +1 -0
- package/dist/yaml-file.js +220 -0
- package/dist/yaml-file.js.map +1 -0
- package/package.json +14 -7
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
import { execFileSync } from 'node:child_process';
|
|
2
|
+
import { createHash, randomBytes } from 'node:crypto';
|
|
3
|
+
import { linkSync, lstatSync, mkdirSync, readdirSync, readFileSync, readlinkSync, statSync, unlinkSync, writeFileSync, } from 'node:fs';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
// ============================================================
|
|
6
|
+
// 实例锁:同一家目录只许一个实例
|
|
7
|
+
// ============================================================
|
|
8
|
+
//
|
|
9
|
+
// 没有锁时,手动在终端再起一份会与服务并存,每条消息回两遍。锁是 `run/instance.<n>.lock`,代号 n 最大的那份是现行锁:
|
|
10
|
+
// - 取锁时先把完整内容写进临时文件,再 link 成下一个代号。link 在目标已存在时原子失败,同一代号只有一个进程拿得到;
|
|
11
|
+
// 内容在建出时就是完整的,读不到半截。所以家目录所在的文件系统要支持硬链接。
|
|
12
|
+
// - 不删、不改名活着的锁。link 成功后再看一遍更低的代号:还有活着的持有者(读到的「残留」其实已经被人接手,
|
|
13
|
+
// 或者代号在 run/ 清空后从 1 重新编号),就让出刚建的这一代、报占用。代号最低的活持有者胜出。
|
|
14
|
+
// 确认没有之后,删掉更低代号的旧文件。
|
|
15
|
+
// - 释放时只删内容仍是自己那份的锁文件:同名的锁可能已经是别的实例的。
|
|
16
|
+
// - 锁内容建出后不再改写。前台 respawn 的交接靠取锁时生成的令牌:锁里只记它的哈希,令牌经环境变量交给新进程,
|
|
17
|
+
// 新进程看到锁里的哈希与令牌对得上,就照常 link 出下一个代号接手。不核对父进程 pid:开发模式经 tsx 包装进程
|
|
18
|
+
// 起新实例,新实例的父进程是 tsx,不是旧实例;令牌只在交给新进程的环境变量里,拿得到它就是被交接的那个。
|
|
19
|
+
//
|
|
20
|
+
// 判活只用与墙上时钟无关的标识(时钟被 NTP 步进、夏令时回拨都不影响):
|
|
21
|
+
// - 本次开机的标识不同(重启过)判残留;
|
|
22
|
+
// - pid 命名空间不同(另一个容器,或同一个容器被强杀后重启)判不了,按占用处理;
|
|
23
|
+
// - pid 不在判残留;pid 在时比对进程启动标识,不同判残留(pid 被复用);
|
|
24
|
+
// - 查不了启动标识(Windows、没有 ps 的精简镜像)时只看 pid。
|
|
25
|
+
const LOCK_PATTERN = /^instance\.(\d+)\.lock$/;
|
|
26
|
+
const TEMP_PATTERN = /^\.instance\.\d+\.[0-9a-f]+\.tmp$/;
|
|
27
|
+
/** 临时文件正常只活几毫秒;超过这个时长的是取锁中途退出留下的 */
|
|
28
|
+
const TEMP_STALE_MS = 60_000;
|
|
29
|
+
function run(cmd, args) {
|
|
30
|
+
try {
|
|
31
|
+
const out = execFileSync(cmd, args, {
|
|
32
|
+
encoding: 'utf-8',
|
|
33
|
+
env: { ...process.env, LC_ALL: 'C', TZ: 'UTC0' },
|
|
34
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
35
|
+
timeout: 2000,
|
|
36
|
+
}).trim();
|
|
37
|
+
return out || undefined;
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export const nodeProcessProbe = {
|
|
44
|
+
pid: process.pid,
|
|
45
|
+
now: () => Date.now(),
|
|
46
|
+
bootId() {
|
|
47
|
+
if (process.platform === 'linux') {
|
|
48
|
+
try {
|
|
49
|
+
return readFileSync('/proc/sys/kernel/random/boot_id', 'utf-8').trim() || undefined;
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return process.platform === 'darwin' ? run('sysctl', ['-n', 'kern.bootsessionuuid']) : undefined;
|
|
56
|
+
},
|
|
57
|
+
pidNs() {
|
|
58
|
+
if (process.platform !== 'linux')
|
|
59
|
+
return undefined;
|
|
60
|
+
try {
|
|
61
|
+
return readlinkSync('/proc/self/ns/pid');
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
exists(pid) {
|
|
68
|
+
try {
|
|
69
|
+
process.kill(pid, 0);
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
// EPERM:进程在,只是不归本用户
|
|
74
|
+
return err.code === 'EPERM';
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
startId(pid) {
|
|
78
|
+
if (process.platform === 'win32')
|
|
79
|
+
return undefined;
|
|
80
|
+
if (process.platform === 'linux') {
|
|
81
|
+
try {
|
|
82
|
+
// comm 可能含空格与括号:从最后一个 ')' 之后切,下一项是第 3 字段 state,starttime 是第 22 字段
|
|
83
|
+
const stat = readFileSync(`/proc/${pid}/stat`, 'utf-8');
|
|
84
|
+
return stat.slice(stat.lastIndexOf(')') + 2).split(' ')[19];
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
return undefined;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return run('ps', ['-o', 'lstart=', '-p', String(pid)]);
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
const sha256 = (s) => createHash('sha256').update(s).digest('hex');
|
|
94
|
+
/**
|
|
95
|
+
* 读锁:文件已不在为 'gone';内容坏了为 'corrupt'(按残留处理),目录项还在却读不到(悬空的符号链接)同样算坏;
|
|
96
|
+
* 别的读错误不猜,抛给宿主
|
|
97
|
+
*/
|
|
98
|
+
function readHolder(file) {
|
|
99
|
+
let text;
|
|
100
|
+
try {
|
|
101
|
+
text = readFileSync(file, 'utf-8');
|
|
102
|
+
}
|
|
103
|
+
catch (err) {
|
|
104
|
+
if (err.code === 'ENOENT') {
|
|
105
|
+
return lstatSync(file, { throwIfNoEntry: false }) ? 'corrupt' : 'gone';
|
|
106
|
+
}
|
|
107
|
+
throw new Error(`Cannot read lock file ${file}: ${err.message}`);
|
|
108
|
+
}
|
|
109
|
+
try {
|
|
110
|
+
const v = JSON.parse(text);
|
|
111
|
+
if (typeof v.pid === 'number' && typeof v.handoffHash === 'string')
|
|
112
|
+
return v;
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
/* 下面按坏内容处理 */
|
|
116
|
+
}
|
|
117
|
+
return 'corrupt';
|
|
118
|
+
}
|
|
119
|
+
/** run/ 里的锁按代号从小到大排。读锁用目录里的原文件名,不按代号重拼:`instance.05.lock` 拼不回原名 */
|
|
120
|
+
function generations(runDir) {
|
|
121
|
+
const out = [];
|
|
122
|
+
for (const name of readdirSync(runDir)) {
|
|
123
|
+
const m = LOCK_PATTERN.exec(name);
|
|
124
|
+
if (m)
|
|
125
|
+
out.push({ n: Number(m[1]), name });
|
|
126
|
+
}
|
|
127
|
+
return out.sort((a, b) => a.n - b.n);
|
|
128
|
+
}
|
|
129
|
+
/** 持有者是否还在(见文件头的判活规则);判不了的按在处理 */
|
|
130
|
+
function isHolderAlive(holder, probe) {
|
|
131
|
+
const boot = probe.bootId();
|
|
132
|
+
if (holder.bootId !== undefined && boot !== undefined && holder.bootId !== boot)
|
|
133
|
+
return false;
|
|
134
|
+
const ns = probe.pidNs();
|
|
135
|
+
if (holder.pidNs !== undefined && ns !== undefined && holder.pidNs !== ns)
|
|
136
|
+
return true;
|
|
137
|
+
// 锁里记的是本进程的 pid,而本进程还没取过锁:那是 pid 被复用前的上一个进程
|
|
138
|
+
if (holder.pid === probe.pid)
|
|
139
|
+
return false;
|
|
140
|
+
if (!probe.exists(holder.pid))
|
|
141
|
+
return false;
|
|
142
|
+
if (holder.startId === undefined)
|
|
143
|
+
return true;
|
|
144
|
+
const started = probe.startId(holder.pid);
|
|
145
|
+
return started === undefined || started === holder.startId;
|
|
146
|
+
}
|
|
147
|
+
function optional(key, value) {
|
|
148
|
+
return value === undefined ? {} : { [key]: value };
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* 取实例锁。`handoffToken` 是旧实例 respawn 时交过来的令牌:与锁里的哈希对得上的那份按已交接处理;
|
|
152
|
+
* 否则按持有者死活决定取锁还是报占用。
|
|
153
|
+
*/
|
|
154
|
+
export function acquireInstanceLock(runDir, opts = {}) {
|
|
155
|
+
const probe = opts.probe ?? nodeProcessProbe;
|
|
156
|
+
mkdirSync(runDir, { recursive: true });
|
|
157
|
+
const token = randomBytes(32).toString('hex');
|
|
158
|
+
const mine = {
|
|
159
|
+
pid: probe.pid,
|
|
160
|
+
...optional('startId', probe.startId(probe.pid)),
|
|
161
|
+
...optional('bootId', probe.bootId()),
|
|
162
|
+
...optional('pidNs', probe.pidNs()),
|
|
163
|
+
handoffHash: sha256(token),
|
|
164
|
+
};
|
|
165
|
+
const handedOver = (h) => opts.handoffToken !== undefined && h.handoffHash === sha256(opts.handoffToken);
|
|
166
|
+
/** 活着、又不是把锁交给本进程的那一个 */
|
|
167
|
+
const blocks = (h) => typeof h === 'object' && !handedOver(h) && isHolderAlive(h, probe);
|
|
168
|
+
const temp = join(runDir, `.instance.${probe.pid}.${randomBytes(4).toString('hex')}.tmp`);
|
|
169
|
+
try {
|
|
170
|
+
try {
|
|
171
|
+
writeFileSync(temp, JSON.stringify(mine), { mode: 0o600 });
|
|
172
|
+
}
|
|
173
|
+
catch (err) {
|
|
174
|
+
throw new Error(`Cannot write to ${runDir}: ${err.message}`);
|
|
175
|
+
}
|
|
176
|
+
for (;;) {
|
|
177
|
+
const top = generations(runDir).at(-1);
|
|
178
|
+
const next = (top?.n ?? 0) + 1;
|
|
179
|
+
if (top !== undefined) {
|
|
180
|
+
const file = join(runDir, top.name);
|
|
181
|
+
const holder = readHolder(file);
|
|
182
|
+
// 刚被释放:重读一遍
|
|
183
|
+
if (holder === 'gone')
|
|
184
|
+
continue;
|
|
185
|
+
if (blocks(holder))
|
|
186
|
+
return { ok: false, holder, file };
|
|
187
|
+
// 代号到了 2^53 及以上,加一不再变大:link 会一直撞上已有的文件
|
|
188
|
+
if (next <= top.n) {
|
|
189
|
+
throw new Error(`The generation number of lock file ${file} is too large to allocate the next one; once you are sure no instance is running, delete it and start again`);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
const file = join(runDir, `instance.${next}.lock`);
|
|
193
|
+
try {
|
|
194
|
+
linkSync(temp, file);
|
|
195
|
+
}
|
|
196
|
+
catch (err) {
|
|
197
|
+
if (err.code === 'EEXIST')
|
|
198
|
+
continue;
|
|
199
|
+
throw new Error(`Cannot create lock file ${file} (the file system of the home directory must support hard links): ${err.message}`);
|
|
200
|
+
}
|
|
201
|
+
// 更低的代号里还有活着的持有者:让出刚建的这一代(读锁出错时同样先让出再抛)
|
|
202
|
+
const blocker = lowerBlocker(runDir, next, blocks, file);
|
|
203
|
+
if (blocker)
|
|
204
|
+
return { ok: false, ...blocker };
|
|
205
|
+
cleanup(runDir, next, probe);
|
|
206
|
+
return {
|
|
207
|
+
ok: true,
|
|
208
|
+
lock: {
|
|
209
|
+
file,
|
|
210
|
+
handoffToken: token,
|
|
211
|
+
release() {
|
|
212
|
+
try {
|
|
213
|
+
const current = readHolder(file);
|
|
214
|
+
if (typeof current === 'object' && current.handoffHash === mine.handoffHash)
|
|
215
|
+
unlinkSync(file);
|
|
216
|
+
}
|
|
217
|
+
catch {
|
|
218
|
+
/* 退出路径上不抛:读不了或已被清掉都不再处理 */
|
|
219
|
+
}
|
|
220
|
+
},
|
|
221
|
+
},
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
finally {
|
|
226
|
+
try {
|
|
227
|
+
unlinkSync(temp);
|
|
228
|
+
}
|
|
229
|
+
catch {
|
|
230
|
+
/* 删不掉的临时文件过一阵由取到锁的进程清掉 */
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
function lowerBlocker(runDir, next, blocks, own) {
|
|
235
|
+
try {
|
|
236
|
+
for (const { n, name } of generations(runDir)) {
|
|
237
|
+
if (n >= next)
|
|
238
|
+
break;
|
|
239
|
+
const file = join(runDir, name);
|
|
240
|
+
const holder = readHolder(file);
|
|
241
|
+
if (!blocks(holder))
|
|
242
|
+
continue;
|
|
243
|
+
unlinkSync(own);
|
|
244
|
+
return { holder, file };
|
|
245
|
+
}
|
|
246
|
+
return undefined;
|
|
247
|
+
}
|
|
248
|
+
catch (err) {
|
|
249
|
+
try {
|
|
250
|
+
unlinkSync(own);
|
|
251
|
+
}
|
|
252
|
+
catch {
|
|
253
|
+
/* 已经不在 */
|
|
254
|
+
}
|
|
255
|
+
throw err;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
/** 删掉更低代号的锁(此时都已确认不是活着的持有者),以及取锁中途退出留下的旧临时文件 */
|
|
259
|
+
function cleanup(runDir, current, probe) {
|
|
260
|
+
for (const name of readdirSync(runDir)) {
|
|
261
|
+
const lock = LOCK_PATTERN.exec(name);
|
|
262
|
+
const path = join(runDir, name);
|
|
263
|
+
let stale = lock !== null && Number(lock[1]) < current;
|
|
264
|
+
if (!stale && TEMP_PATTERN.test(name)) {
|
|
265
|
+
try {
|
|
266
|
+
stale = probe.now() - statSync(path).mtimeMs > TEMP_STALE_MS;
|
|
267
|
+
}
|
|
268
|
+
catch {
|
|
269
|
+
stale = false;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
if (!stale)
|
|
273
|
+
continue;
|
|
274
|
+
try {
|
|
275
|
+
unlinkSync(path);
|
|
276
|
+
}
|
|
277
|
+
catch {
|
|
278
|
+
/* 并发清理时可能已被删掉 */
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
//# sourceMappingURL=instance-lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instance-lock.js","sourceRoot":"","sources":["../src/instance-lock.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
declare const _default: {
|
|
2
|
+
readonly configFile: "config file";
|
|
3
|
+
readonly secretsFile: "secrets file";
|
|
4
|
+
readonly yamlSyntax: "syntax error";
|
|
5
|
+
readonly yamlPosition: "{code} (line {line}, column {col})";
|
|
6
|
+
readonly saveRefused: "The {file} has external changes that have not taken effect yet; this save was refused so they are not overwritten ({path})";
|
|
7
|
+
readonly unsafePluginId: "Invalid plugin id: {id}";
|
|
8
|
+
readonly noDefinition: "Plugin {instance} does not exist, and no definition of the same module is available to create it (the module must be registered and declare reusable)";
|
|
9
|
+
readonly plainSecret: "setPluginConfig only accepts the document form: raw values cannot be written to the secret fields of {instance} ({paths, list}); use applyPluginConfig to change the config";
|
|
10
|
+
readonly secretAt: "{path} (key {key})";
|
|
11
|
+
readonly danglingRejected: "{instance} references secrets missing from secrets.yaml: {items, list}; enter the values again, or add these keys to secrets.yaml first";
|
|
12
|
+
readonly dangling: "{instance} references secrets missing from secrets.yaml: {items, list}; plugins that read their config with parseConfig fail to activate. Enter the values again in the WebUI, or add these keys to secrets.yaml";
|
|
13
|
+
readonly secretsResolved: "All secrets referenced by the config are in secrets.yaml";
|
|
14
|
+
};
|
|
15
|
+
export default _default;
|
|
16
|
+
//# sourceMappingURL=en.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"en.d.ts","sourceRoot":"","sources":["../../src/locales/en.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAGA,wBAkBG"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { defineLocale } from '@aalis/schema-i18n';
|
|
2
|
+
export default defineLocale()({
|
|
3
|
+
configFile: 'config file',
|
|
4
|
+
secretsFile: 'secrets file',
|
|
5
|
+
yamlSyntax: 'syntax error',
|
|
6
|
+
yamlPosition: '{code} (line {line}, column {col})',
|
|
7
|
+
saveRefused: 'The {file} has external changes that have not taken effect yet; this save was refused so they are not overwritten ({path})',
|
|
8
|
+
unsafePluginId: 'Invalid plugin id: {id}',
|
|
9
|
+
noDefinition: 'Plugin {instance} does not exist, and no definition of the same module is available to create it (the module must be registered and declare reusable)',
|
|
10
|
+
plainSecret: 'setPluginConfig only accepts the document form: raw values cannot be written to the secret fields of {instance} ({paths, list}); use applyPluginConfig to change the config',
|
|
11
|
+
secretAt: '{path} (key {key})',
|
|
12
|
+
danglingRejected: '{instance} references secrets missing from secrets.yaml: {items, list}; enter the values again, or add these keys to secrets.yaml first',
|
|
13
|
+
dangling: '{instance} references secrets missing from secrets.yaml: {items, list}; plugins that read their config with parseConfig fail to activate. Enter the values again in the WebUI, or add these keys to secrets.yaml',
|
|
14
|
+
secretsResolved: 'All secrets referenced by the config are in secrets.yaml',
|
|
15
|
+
});
|
|
16
|
+
//# sourceMappingURL=en.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"en.js","sourceRoot":"","sources":["../../src/locales/en.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,eAAe,YAAY,EAAU,CAAC;IACpC,UAAU,EAAE,aAAa;IACzB,WAAW,EAAE,cAAc;IAC3B,UAAU,EAAE,cAAc;IAC1B,YAAY,EAAE,oCAAoC;IAClD,WAAW,EACT,4HAA4H;IAC9H,cAAc,EAAE,yBAAyB;IACzC,YAAY,EACV,uJAAuJ;IACzJ,WAAW,EACT,6KAA6K;IAC/K,QAAQ,EAAE,oBAAoB;IAC9B,gBAAgB,EACd,yIAAyI;IAC3I,QAAQ,EACN,kNAAkN;IACpN,eAAe,EAAE,0DAA0D;CAC5E,CAAC,CAAC"}
|
|
@@ -28,7 +28,7 @@ export declare function warnLikelyPluginMissingKeyword(logger: Logger, name: str
|
|
|
28
28
|
/**
|
|
29
29
|
* 创建一个从项目 node_modules 解析插件的 PluginLoader。
|
|
30
30
|
*
|
|
31
|
-
* @param projectDir
|
|
31
|
+
* @param projectDir 安装集目录(含 package.json 与 node_modules)的绝对路径
|
|
32
32
|
* @param opts.hostCoreDir 宿主那份 @aalis/core 的包目录,默认 {@link HOST_CORE_DIR};插件解析到的 core 与它不同即拒绝加载
|
|
33
33
|
*
|
|
34
34
|
* - `discover()`:读 projectDir/package.json 的 dependencies + optionalDependencies,
|
|
@@ -36,7 +36,7 @@ export declare function warnLikelyPluginMissingKeyword(logger: Logger, name: str
|
|
|
36
36
|
* - `load()`:先经 {@link assertSameCore} 核对 core 是宿主那份,再用 `pathToFileURL(entry).href` 动态 import。
|
|
37
37
|
* - `reload()`:用入口文件 mtime 作 import URL query 强制 ESM 缓存失效。
|
|
38
38
|
*/
|
|
39
|
-
export declare function createNodeModulesPluginLoader(projectDir
|
|
39
|
+
export declare function createNodeModulesPluginLoader(projectDir: string, opts?: {
|
|
40
40
|
hostCoreDir?: string;
|
|
41
41
|
}): PluginLoader;
|
|
42
42
|
//# sourceMappingURL=node-modules-loader.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-modules-loader.d.ts","sourceRoot":"","sources":["../src/node-modules-loader.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"node-modules-loader.d.ts","sourceRoot":"","sources":["../src/node-modules-loader.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAG5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAyB5E;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAGvE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAY1G;AAuDD;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,MAAM,GAAG,SAMjC,CAAC;AA0BL;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,gBAAgB,EACtB,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAWlC;AAED;;;GAGG;AACH,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAMhH;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,6BAA6B,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,YAAY,CA4CnH"}
|
|
@@ -4,6 +4,7 @@ import { dirname, join, resolve } from 'node:path';
|
|
|
4
4
|
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
5
5
|
import { pluginDefinitionOf } from '@aalis/api-plugin-source';
|
|
6
6
|
import { DefaultLogger } from '@aalis/core';
|
|
7
|
+
import { assertAbsolute } from './home.js';
|
|
7
8
|
// ============================================================
|
|
8
9
|
// NodeModulesPluginLoader —— 从 node_modules 解析并加载插件
|
|
9
10
|
// ============================================================
|
|
@@ -167,7 +168,7 @@ export function warnLikelyPluginMissingKeyword(logger, name, meta) {
|
|
|
167
168
|
/**
|
|
168
169
|
* 创建一个从项目 node_modules 解析插件的 PluginLoader。
|
|
169
170
|
*
|
|
170
|
-
* @param projectDir
|
|
171
|
+
* @param projectDir 安装集目录(含 package.json 与 node_modules)的绝对路径
|
|
171
172
|
* @param opts.hostCoreDir 宿主那份 @aalis/core 的包目录,默认 {@link HOST_CORE_DIR};插件解析到的 core 与它不同即拒绝加载
|
|
172
173
|
*
|
|
173
174
|
* - `discover()`:读 projectDir/package.json 的 dependencies + optionalDependencies,
|
|
@@ -175,15 +176,18 @@ export function warnLikelyPluginMissingKeyword(logger, name, meta) {
|
|
|
175
176
|
* - `load()`:先经 {@link assertSameCore} 核对 core 是宿主那份,再用 `pathToFileURL(entry).href` 动态 import。
|
|
176
177
|
* - `reload()`:用入口文件 mtime 作 import URL query 强制 ESM 缓存失效。
|
|
177
178
|
*/
|
|
178
|
-
export function createNodeModulesPluginLoader(projectDir
|
|
179
|
-
|
|
179
|
+
export function createNodeModulesPluginLoader(projectDir, opts = {}) {
|
|
180
|
+
assertAbsolute('Install directory', projectDir);
|
|
181
|
+
const root = projectDir;
|
|
180
182
|
const hostCoreDir = opts.hostCoreDir === undefined ? HOST_CORE_DIR : realpathSync(opts.hostCoreDir);
|
|
181
183
|
const logger = new DefaultLogger('aalis:loader');
|
|
182
184
|
return {
|
|
183
185
|
async discover() {
|
|
184
186
|
const rootPkg = readJson(resolve(root, 'package.json'));
|
|
185
|
-
if (!rootPkg)
|
|
187
|
+
if (!rootPkg) {
|
|
188
|
+
logger.warn(`安装集 ${root} 里没有可读的 package.json,没有可加载的插件`);
|
|
186
189
|
return [];
|
|
190
|
+
}
|
|
187
191
|
const deps = {
|
|
188
192
|
...(rootPkg.dependencies ?? {}),
|
|
189
193
|
...(rootPkg.optionalDependencies ?? {}),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-modules-loader.js","sourceRoot":"","sources":["../src/node-modules-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC3E,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9D,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"node-modules-loader.js","sourceRoot":"","sources":["../src/node-modules-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { HostConfig } from '@aalis/api-host-config';
|
|
2
1
|
import type { PluginSourceService } from '@aalis/api-plugin-source';
|
|
3
2
|
import { type App, type PluginDefinition } from '@aalis/core';
|
|
3
|
+
import type { ConfigStore } from './config-store.js';
|
|
4
4
|
/**
|
|
5
5
|
* 已发现但尚未导入的插件条目。`source` 是 loader 自己理解的字符串
|
|
6
6
|
* (fs loader 用绝对路径,URL loader 用 URL,内存 loader 用 module 别名)。
|
|
@@ -35,8 +35,13 @@ export interface PluginDiscovery extends PluginSourceService {
|
|
|
35
35
|
registerConfiguredInstances(): Promise<void>;
|
|
36
36
|
}
|
|
37
37
|
/**
|
|
38
|
-
*
|
|
39
|
-
*
|
|
38
|
+
* 模块在注册表里的定义:主实例在册取主实例的,否则取同模块任一在册实例的(主实例已卸载、后缀实例还在时)。
|
|
39
|
+
* 由配置段定义、还没登记的后缀实例按它登记或新建:热重载登记、配置同步与 host-config 新建实例同一判据
|
|
40
40
|
*/
|
|
41
|
-
export declare function
|
|
41
|
+
export declare function moduleDefinitionOf(app: App, moduleName: string): PluginDefinition | undefined;
|
|
42
|
+
/**
|
|
43
|
+
* @param doc 配置文档:登记时按实例 id 取配置(解析密钥引用后交给 core)与禁用标记,并从中枚举 `name:suffix` 实例。
|
|
44
|
+
* 默认值回填与密钥拆出由加载器一侧的政策(withPluginConfigSync)先写进文档。
|
|
45
|
+
*/
|
|
46
|
+
export declare function createPluginDiscovery(app: App, loader: PluginLoader, doc: Pick<ConfigStore, 'get' | 'isPluginDisabled' | 'resolvePluginConfig'>): PluginDiscovery;
|
|
42
47
|
//# sourceMappingURL=plugin-discovery.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-discovery.d.ts","sourceRoot":"","sources":["../src/plugin-discovery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"plugin-discovery.d.ts","sourceRoot":"","sources":["../src/plugin-discovery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,KAAK,GAAG,EAAE,KAAK,gBAAgB,EAA4C,MAAM,aAAa,CAAC;AACxG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAarD;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,0BAA0B;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,iDAAiD;IACjD,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;;;;;GAMG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;IACxC,IAAI,CAAC,UAAU,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IACrE,MAAM,CAAC,CAAC,UAAU,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;CACzE;AAED,MAAM,WAAW,eAAgB,SAAQ,mBAAmB;IAC1D,gCAAgC;IAChC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB;;;OAGG;IACH,2BAA2B,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9C;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAS7F;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,GAAG,EACR,MAAM,EAAE,YAAY,EACpB,GAAG,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,GAAG,kBAAkB,GAAG,qBAAqB,CAAC,GACzE,eAAe,CA2FjB"}
|
package/dist/plugin-discovery.js
CHANGED
|
@@ -1,16 +1,34 @@
|
|
|
1
1
|
import { parseInstanceId } from '@aalis/core';
|
|
2
|
+
import { describeDangling } from './secrets.js';
|
|
2
3
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
4
|
+
* 模块在注册表里的定义:主实例在册取主实例的,否则取同模块任一在册实例的(主实例已卸载、后缀实例还在时)。
|
|
5
|
+
* 由配置段定义、还没登记的后缀实例按它登记或新建:热重载登记、配置同步与 host-config 新建实例同一判据
|
|
6
|
+
*/
|
|
7
|
+
export function moduleDefinitionOf(app, moduleName) {
|
|
8
|
+
const main = app.plugins.getPlugin(moduleName)?.definition;
|
|
9
|
+
if (main)
|
|
10
|
+
return main;
|
|
11
|
+
for (const status of app.plugins.getStatus()) {
|
|
12
|
+
if (status.name !== moduleName)
|
|
13
|
+
continue;
|
|
14
|
+
const definition = app.plugins.getPlugin(status.instanceId)?.definition;
|
|
15
|
+
if (definition)
|
|
16
|
+
return definition;
|
|
17
|
+
}
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* @param doc 配置文档:登记时按实例 id 取配置(解析密钥引用后交给 core)与禁用标记,并从中枚举 `name:suffix` 实例。
|
|
22
|
+
* 默认值回填与密钥拆出由加载器一侧的政策(withPluginConfigSync)先写进文档。
|
|
5
23
|
*/
|
|
6
24
|
export function createPluginDiscovery(app, loader, doc) {
|
|
7
25
|
const log = app.logger;
|
|
8
|
-
const registration = (definition, instanceId = definition.name) =>
|
|
9
|
-
definition
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
disabled: doc.isPluginDisabled(instanceId)
|
|
13
|
-
}
|
|
26
|
+
const registration = (definition, instanceId = definition.name) => {
|
|
27
|
+
const { config, dangling } = doc.resolvePluginConfig(instanceId, definition.configSchema);
|
|
28
|
+
if (dangling.length > 0)
|
|
29
|
+
log.error(describeDangling(instanceId, dangling).source);
|
|
30
|
+
return { definition, instanceId, config, disabled: doc.isPluginDisabled(instanceId) };
|
|
31
|
+
};
|
|
14
32
|
/** 导入一批描述符并备好各自的登记项;单个失败(含 id 撞上危险键、文档拒取)只记该条,不拖累其余 */
|
|
15
33
|
async function importAll(descriptors, fresh) {
|
|
16
34
|
const loaded = [];
|
|
@@ -93,14 +111,8 @@ export function createPluginDiscovery(app, loader, doc) {
|
|
|
93
111
|
return names;
|
|
94
112
|
},
|
|
95
113
|
async registerConfiguredInstances() {
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
const definition = app.plugins.getPlugin(instanceId)?.definition;
|
|
99
|
-
// 主实例的定义优先;主实例已卸载时用同模块任一在册实例的,与冷启动时这一段照常登记一致
|
|
100
|
-
if (definition && (instanceId === name || !known.has(name)))
|
|
101
|
-
known.set(name, definition);
|
|
102
|
-
}
|
|
103
|
-
await app.pluginAll(configuredInstances(name => known.get(name)));
|
|
114
|
+
// 主实例已卸载时用同模块任一在册实例的定义,与冷启动时这一段照常登记一致
|
|
115
|
+
await app.pluginAll(configuredInstances(name => moduleDefinitionOf(app, name)));
|
|
104
116
|
},
|
|
105
117
|
};
|
|
106
118
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-discovery.js","sourceRoot":"","sources":["../src/plugin-discovery.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"plugin-discovery.js","sourceRoot":"","sources":["../src/plugin-discovery.ts"],"names":[],"mappings":"AACA,OAAO,EAA4D,eAAe,EAAE,MAAM,aAAa,CAAC;AAExG,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAgDhD;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAQ,EAAE,UAAkB;IAC7D,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC;IAC3D,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC;IACtB,KAAK,MAAM,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;QAC7C,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU;YAAE,SAAS;QACzC,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC;QACxE,IAAI,UAAU;YAAE,OAAO,UAAU,CAAC;IACpC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CACnC,GAAQ,EACR,MAAoB,EACpB,GAA0E;IAE1E,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC;IAEvB,MAAM,YAAY,GAAG,CAAC,UAA4B,EAAE,UAAU,GAAG,UAAU,CAAC,IAAI,EAAsB,EAAE;QACtG,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC,mBAAmB,CAAC,UAAU,EAAE,UAAU,CAAC,YAAY,CAAC,CAAC;QAC1F,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;YAAE,GAAG,CAAC,KAAK,CAAC,gBAAgB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC;QAClF,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,gBAAgB,CAAC,UAAU,CAAC,EAAE,CAAC;IACxF,CAAC,CAAC;IAEF,uDAAuD;IACvD,KAAK,UAAU,SAAS,CAAC,WAA+B,EAAE,KAAc;QACtE,MAAM,MAAM,GAAyB,EAAE,CAAC;QACxC,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;YAC/B,IAAI,CAAC;gBACH,2DAA2D;gBAC3D,MAAM,UAAU,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAChG,IAAI,CAAC,UAAU;oBAAE,SAAS;gBAC1B,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC;YACxC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,GAAG,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,IAAI,OAAO,EAAE,GAAG,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;OAGG;IACH,SAAS,mBAAmB,CAC1B,YAAkE;QAElE,MAAM,KAAK,GAAyB,EAAE,CAAC;QACvC,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YAC9D,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;YAC1D,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC;gBAAE,SAAS;YAC1D,MAAM,UAAU,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;YAC5C,IAAI,UAAU;gBAAE,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC;;gBAC3D,GAAG,CAAC,IAAI,CAAC,UAAU,SAAS,YAAY,UAAU,UAAU,CAAC,CAAC;QACrE,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;OAGG;IACH,SAAS,kBAAkB,CAAC,KAAoC,EAAE,UAA8B;QAC9F,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACvD,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YAC9D,IAAI,eAAe,CAAC,SAAS,CAAC,CAAC,MAAM;gBAAE,SAAS;YAChD,IAAI,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC;gBAAE,SAAS;YACnG,GAAG,CAAC,IAAI,CAAC,QAAQ,SAAS,mCAAmC,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IAED,OAAO;QACL,KAAK,CAAC,OAAO;YACX,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC;YAC3C,GAAG,CAAC,IAAI,CAAC,MAAM,UAAU,CAAC,MAAM,MAAM,CAAC,CAAC;YACxC,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;YAClD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YACnF,kBAAkB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;YACtC,MAAM,GAAG,CAAC,SAAS,CAAC,CAAC,GAAG,MAAM,EAAE,GAAG,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAClF,oEAAoE;YACpE,MAAM,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAC3B,CAAC;QAED,KAAK,CAAC,MAAM;YACV,MAAM,KAAK,GAAG,IAAI,GAAG,EAA4B,CAAC;YAClD,MAAM,KAAK,GAAuB,EAAE,CAAC;YACrC,KAAK,MAAM,IAAI,IAAI,MAAM,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;gBAC3C,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACpD,IAAI,UAAU;oBAAE,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC;;oBACxE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxB,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAC5C,KAAK,MAAM,IAAI,IAAI,MAAM;gBAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YAC5E,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,CAAC,GAAG,MAAM,EAAE,GAAG,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAClG,qDAAqD;YACrD,iDAAiD;YACjD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACpF,KAAK,MAAM,IAAI,IAAI,KAAK;gBAAE,GAAG,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;YACrD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,KAAK,CAAC,2BAA2B;YAC/B,sCAAsC;YACtC,MAAM,GAAG,CAAC,SAAS,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC,kBAAkB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QAClF,CAAC;KACF,CAAC;AACJ,CAAC"}
|