@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.
Files changed (66) hide show
  1. package/README.md +11 -2
  2. package/dist/config-store.d.ts +47 -12
  3. package/dist/config-store.d.ts.map +1 -1
  4. package/dist/config-store.js +446 -60
  5. package/dist/config-store.js.map +1 -1
  6. package/dist/config-sync.d.ts +22 -8
  7. package/dist/config-sync.d.ts.map +1 -1
  8. package/dist/config-sync.js +86 -33
  9. package/dist/config-sync.js.map +1 -1
  10. package/dist/console-sink.d.ts +1 -1
  11. package/dist/file-logger.d.ts +4 -4
  12. package/dist/file-logger.d.ts.map +1 -1
  13. package/dist/file-logger.js +6 -5
  14. package/dist/file-logger.js.map +1 -1
  15. package/dist/home.d.ts +64 -0
  16. package/dist/home.d.ts.map +1 -0
  17. package/dist/home.js +236 -0
  18. package/dist/home.js.map +1 -0
  19. package/dist/host-logs.d.ts +9 -0
  20. package/dist/host-logs.d.ts.map +1 -0
  21. package/dist/host-logs.js +104 -0
  22. package/dist/host-logs.js.map +1 -0
  23. package/dist/index.d.ts +5 -3
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +7 -4
  26. package/dist/index.js.map +1 -1
  27. package/dist/instance-lock.d.ts +56 -0
  28. package/dist/instance-lock.d.ts.map +1 -0
  29. package/dist/instance-lock.js +282 -0
  30. package/dist/instance-lock.js.map +1 -0
  31. package/dist/locales/en.d.ts +16 -0
  32. package/dist/locales/en.d.ts.map +1 -0
  33. package/dist/locales/en.js +16 -0
  34. package/dist/locales/en.js.map +1 -0
  35. package/dist/node-modules-loader.d.ts +2 -2
  36. package/dist/node-modules-loader.d.ts.map +1 -1
  37. package/dist/node-modules-loader.js +8 -4
  38. package/dist/node-modules-loader.js.map +1 -1
  39. package/dist/plugin-discovery.d.ts +9 -4
  40. package/dist/plugin-discovery.d.ts.map +1 -1
  41. package/dist/plugin-discovery.js +28 -16
  42. package/dist/plugin-discovery.js.map +1 -1
  43. package/dist/providers.d.ts +38 -13
  44. package/dist/providers.d.ts.map +1 -1
  45. package/dist/providers.js +107 -232
  46. package/dist/providers.js.map +1 -1
  47. package/dist/secrets.d.ts +47 -0
  48. package/dist/secrets.d.ts.map +1 -0
  49. package/dist/secrets.js +108 -0
  50. package/dist/secrets.js.map +1 -0
  51. package/dist/start.d.ts +19 -12
  52. package/dist/start.d.ts.map +1 -1
  53. package/dist/start.js +174 -48
  54. package/dist/start.js.map +1 -1
  55. package/dist/subcommand.d.ts.map +1 -1
  56. package/dist/subcommand.js +2 -2
  57. package/dist/subcommand.js.map +1 -1
  58. package/dist/texts.d.ts +31 -0
  59. package/dist/texts.d.ts.map +1 -0
  60. package/dist/texts.js +21 -0
  61. package/dist/texts.js.map +1 -0
  62. package/dist/yaml-file.d.ts +36 -0
  63. package/dist/yaml-file.d.ts.map +1 -0
  64. package/dist/yaml-file.js +220 -0
  65. package/dist/yaml-file.js.map +1 -0
  66. package/package.json +14 -7
@@ -0,0 +1,31 @@
1
+ declare const SOURCE: {
2
+ readonly configFile: "配置文件";
3
+ readonly secretsFile: "密钥文件";
4
+ readonly yamlSyntax: "语法错误";
5
+ readonly yamlPosition: "{code}(第 {line} 行第 {col} 列)";
6
+ readonly saveRefused: "{file}有尚未生效的外部修改,为免覆盖已拒绝本次保存({path})";
7
+ readonly unsafePluginId: "插件 id 不合法:{id}";
8
+ readonly noDefinition: "插件 {instance} 不存在,也没有可用来新建它的同模块定义(模块须已登记且声明 reusable)";
9
+ readonly plainSecret: "setPluginConfig 只收文档形态:{instance} 的 {paths, list} 是密钥字段,不能写原值;改配置请用 applyPluginConfig";
10
+ readonly secretAt: "{path}(键 {key})";
11
+ readonly danglingRejected: "{instance} 引用的密钥不在 secrets.yaml 里:{items, list};重新填写值,或先在 secrets.yaml 里补上这些键";
12
+ readonly dangling: "{instance} 引用的密钥不在 secrets.yaml 里:{items, list};用 parseConfig 读配置的插件会激活失败,在 WebUI 重新填写或在 secrets.yaml 里补上这些键";
13
+ readonly secretsResolved: "配置引用的密钥都在 secrets.yaml 里";
14
+ };
15
+ export type Source = typeof SOURCE;
16
+ export declare const t: import("@aalis/schema-i18n").TextFactory<{
17
+ readonly configFile: "配置文件";
18
+ readonly secretsFile: "密钥文件";
19
+ readonly yamlSyntax: "语法错误";
20
+ readonly yamlPosition: "{code}(第 {line} 行第 {col} 列)";
21
+ readonly saveRefused: "{file}有尚未生效的外部修改,为免覆盖已拒绝本次保存({path})";
22
+ readonly unsafePluginId: "插件 id 不合法:{id}";
23
+ readonly noDefinition: "插件 {instance} 不存在,也没有可用来新建它的同模块定义(模块须已登记且声明 reusable)";
24
+ readonly plainSecret: "setPluginConfig 只收文档形态:{instance} 的 {paths, list} 是密钥字段,不能写原值;改配置请用 applyPluginConfig";
25
+ readonly secretAt: "{path}(键 {key})";
26
+ readonly danglingRejected: "{instance} 引用的密钥不在 secrets.yaml 里:{items, list};重新填写值,或先在 secrets.yaml 里补上这些键";
27
+ readonly dangling: "{instance} 引用的密钥不在 secrets.yaml 里:{items, list};用 parseConfig 读配置的插件会激活失败,在 WebUI 重新填写或在 secrets.yaml 里补上这些键";
28
+ readonly secretsResolved: "配置引用的密钥都在 secrets.yaml 里";
29
+ }>;
30
+ export {};
31
+ //# sourceMappingURL=texts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"texts.d.ts","sourceRoot":"","sources":["../src/texts.ts"],"names":[],"mappings":"AAMA,QAAA,MAAM,MAAM;;;;;;;;;;;;;CAgBF,CAAC;AACX,MAAM,MAAM,MAAM,GAAG,OAAO,MAAM,CAAC;AAEnC,eAAO,MAAM,CAAC;;;;;;;;;;;;;EAA4F,CAAC"}
package/dist/texts.js ADDED
@@ -0,0 +1,21 @@
1
+ // 本包自己的原文字典:经 WebUI 显示的拒写说明、配置文档的报错与诊断项 config.secrets,以及文件称呼与 YAML 报错位置。
2
+ // 后两样也用在日志(取原文)与启动时打到终端的报错(取英文),三处共用一份。其余插件加载之前与插件体系之外打到终端的话
3
+ // 不进字典,直接写英文
4
+ import { defineTexts } from '@aalis/schema-i18n';
5
+ import en from './locales/en.js';
6
+ const SOURCE = {
7
+ configFile: '配置文件',
8
+ secretsFile: '密钥文件',
9
+ yamlSyntax: '语法错误',
10
+ yamlPosition: '{code}(第 {line} 行第 {col} 列)',
11
+ saveRefused: '{file}有尚未生效的外部修改,为免覆盖已拒绝本次保存({path})',
12
+ unsafePluginId: '插件 id 不合法:{id}',
13
+ noDefinition: '插件 {instance} 不存在,也没有可用来新建它的同模块定义(模块须已登记且声明 reusable)',
14
+ plainSecret: 'setPluginConfig 只收文档形态:{instance} 的 {paths, list} 是密钥字段,不能写原值;改配置请用 applyPluginConfig',
15
+ secretAt: '{path}(键 {key})',
16
+ danglingRejected: '{instance} 引用的密钥不在 secrets.yaml 里:{items, list};重新填写值,或先在 secrets.yaml 里补上这些键',
17
+ dangling: '{instance} 引用的密钥不在 secrets.yaml 里:{items, list};用 parseConfig 读配置的插件会激活失败,在 WebUI 重新填写或在 secrets.yaml 里补上这些键',
18
+ secretsResolved: '配置引用的密钥都在 secrets.yaml 里',
19
+ };
20
+ export const t = defineTexts({ ns: '@aalis/runtime', language: 'zh-CN', source: SOURCE, locales: { en } });
21
+ //# sourceMappingURL=texts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"texts.js","sourceRoot":"","sources":["../src/texts.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,6DAA6D;AAC7D,aAAa;AACb,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAEjC,MAAM,MAAM,GAAG;IACb,UAAU,EAAE,MAAM;IAClB,WAAW,EAAE,MAAM;IACnB,UAAU,EAAE,MAAM;IAClB,YAAY,EAAE,6BAA6B;IAC3C,WAAW,EAAE,sCAAsC;IACnD,cAAc,EAAE,gBAAgB;IAChC,YAAY,EAAE,uDAAuD;IACrE,WAAW,EACT,uFAAuF;IACzF,QAAQ,EAAE,iBAAiB;IAC3B,gBAAgB,EACd,+EAA+E;IACjF,QAAQ,EACN,8GAA8G;IAChH,eAAe,EAAE,0BAA0B;CACnC,CAAC;AAGX,MAAM,CAAC,MAAM,CAAC,GAAG,WAAW,CAAC,EAAE,EAAE,EAAE,gBAAgB,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC"}
@@ -0,0 +1,36 @@
1
+ import type { Logger } from '@aalis/core';
2
+ import { type TextRef } from '@aalis/schema-i18n';
3
+ interface YamlFileOptions<T> {
4
+ /** 对文件的称呼(本包字典的「配置文件」「密钥文件」):拒写说明按读者语言显示,日志取原文,启动时的报错取英文 */
5
+ label: TextRef;
6
+ logger: Logger;
7
+ serialize(value: T): string;
8
+ /** 文件不存在时的初始值 */
9
+ missing(): T;
10
+ /**
11
+ * 原子写的权限位。给定时临时文件一律以它创建,不沿用原文件的权限(密钥文件用 0o600);
12
+ * 不给时沿用原文件的权限位,没有原文件时用 0o600
13
+ */
14
+ mode?: number;
15
+ /**
16
+ * 运行中改成空文件(或只剩注释)时按 {@link missing} 的值投递。缺省拒收:主配置变空多是写坏了,
17
+ * 放行会让全部插件按默认值重载;密钥文件清空是合法状态
18
+ */
19
+ emptyAsMissing?: boolean;
20
+ }
21
+ interface YamlFile<T> {
22
+ /** 装载时读到的内容 */
23
+ initial: T;
24
+ /**
25
+ * 原子写回。写前比对盘上内容:有尚未生效的外部修改时拒写,抛 {@link ConfigSaveRefusedError}(只带路径)
26
+ */
27
+ save(value: T): void;
28
+ /**
29
+ * 监听文件所在目录(按文件名过滤)+ 300ms 去抖,按与上次读入或写出的内容比对去重(自写回不触发);
30
+ * 拒写之后的下一次变更不去重;武装后立即对账一次。返回退订
31
+ */
32
+ watch(onChange: (next: T) => void): () => void;
33
+ }
34
+ export declare function openYamlFile<T extends object>(absPath: string, opts: YamlFileOptions<T>): YamlFile<T>;
35
+ export {};
36
+ //# sourceMappingURL=yaml-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yaml-file.d.ts","sourceRoot":"","sources":["../src/yaml-file.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAe,KAAK,OAAO,EAAsB,MAAM,oBAAoB,CAAC;AAUnF,UAAU,eAAe,CAAC,CAAC;IACzB,4DAA4D;IAC5D,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC;IAC5B,iBAAiB;IACjB,OAAO,IAAI,CAAC,CAAC;IACb;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,UAAU,QAAQ,CAAC,CAAC;IAClB,eAAe;IACf,OAAO,EAAE,CAAC,CAAC;IACX;;OAEG;IACH,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;IACrB;;;OAGG;IACH,KAAK,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;CAChD;AAuCD,wBAAgB,YAAY,CAAC,CAAC,SAAS,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAsKrG"}
@@ -0,0 +1,220 @@
1
+ import { randomBytes } from 'node:crypto';
2
+ import { chmodSync, existsSync, watch as fsWatch, readFileSync, renameSync, rmSync, statSync, writeFileSync, } from 'node:fs';
3
+ import { basename, dirname } from 'node:path';
4
+ import { ConfigSaveRefusedError } from '@aalis/api-host-config';
5
+ import { resolveText, toSource, withText } from '@aalis/schema-i18n';
6
+ import { parseDocument } from 'yaml';
7
+ import { t } from './texts.js';
8
+ /**
9
+ * yaml 解析错误的可公开描述:只给错误码与行列。yaml 的报错 message 可能带原文(例如
10
+ * `Unexpected ${token.source} in …`、block scalar 头部的多余字符),配置与密钥文件的原文可能就是密钥,
11
+ * 随日志进 latest.log 与 WebUI 日志页就是泄漏。
12
+ */
13
+ function describeYamlError(err) {
14
+ const e = err;
15
+ const code = typeof e?.code === 'string' ? e.code : t('yamlSyntax');
16
+ const at = e?.linePos?.[0];
17
+ return at ? t('yamlPosition', { code, line: at.line, col: at.col }) : code;
18
+ }
19
+ /** 启动时的报错由宿主打到终端,这时插件还没加载、没有读者语言:文字对象一律取英文 */
20
+ function english(text) {
21
+ return typeof text === 'string' ? text : resolveText(text, ['en']);
22
+ }
23
+ /**
24
+ * 解析 YAML 文本:错误抛出,警告(例如把 `!xxx` 当成标签、值变成空)记一行错误码与行列。不用 yaml 的 parse():
25
+ * 它把警告连同原文经 process.emitWarning 打到 stderr。toJS() 遇到以集合作键时同样会这样打(不进 doc.warnings),
26
+ * logLevel 设为 error 关掉
27
+ */
28
+ function parseYamlText(text, label, logger) {
29
+ const doc = parseDocument(text, { logLevel: 'error' });
30
+ if (doc.errors.length > 0)
31
+ throw doc.errors[0];
32
+ for (const warning of doc.warnings)
33
+ logger.warn(`${label}有可疑写法:${toSource(describeYamlError(warning))}`);
34
+ return doc.toJS();
35
+ }
36
+ /** 值必须是纯映射:裸标量、数组会被下游按 Object.entries 摊开写回垃圾 */
37
+ function describeNonMapping(v) {
38
+ if (v === null)
39
+ return 'empty';
40
+ if (Array.isArray(v))
41
+ return 'array';
42
+ if (typeof v !== 'object')
43
+ return typeof v;
44
+ return null;
45
+ }
46
+ export function openYamlFile(absPath, opts) {
47
+ const { label, logger } = opts;
48
+ const dataDir = dirname(absPath);
49
+ let raw = null;
50
+ // 拒写之后调用方手里的文档(常连同运行态)已领先于文件:下一次文件变更不论内容是否等于 raw 都要投递,
51
+ // 让宿主按文件重新对账。否则把文件原样改回的「修好」会被当成空变更跳过,文档与运行态从此偏离文件,
52
+ // 下一次成功保存还会把被拒的改动写进去。
53
+ let reconcilePending = false;
54
+ let watcher = null;
55
+ let debounceTimer = null;
56
+ function load() {
57
+ if (!existsSync(absPath)) {
58
+ raw = null;
59
+ return opts.missing();
60
+ }
61
+ raw = readFileSync(absPath, 'utf-8');
62
+ let parsed;
63
+ try {
64
+ parsed = parseYamlText(raw, label.source, logger) ?? {};
65
+ }
66
+ catch (err) {
67
+ // 启动时语法错误照样响亮拒启,消息里只有错误码与行列(崩溃日志同为暴露面)
68
+ throw new Error(`Could not parse the ${english(label)} ${absPath}: ${english(describeYamlError(err))}`);
69
+ }
70
+ // 「解析成功但不是映射」同样上抛,不能放进下游摊开再写回磁盘。空文件视同空映射(?? {} 已兜)
71
+ const kind = describeNonMapping(parsed);
72
+ if (kind)
73
+ throw new Error(`The ${english(label)} ${absPath} is not a mapping (got ${kind})`);
74
+ return parsed;
75
+ }
76
+ const initial = load();
77
+ return {
78
+ initial,
79
+ save(value) {
80
+ // 写前比对磁盘实况:盘上内容必须仍是本进程最后读入或写出的那份。不是,就有尚未生效的外部修改
81
+ // (去抖窗口内、监听未武装、解析失败被搁置、另一个进程写过),整份覆写会把它静默吃掉,所以拒写。
82
+ // 文件不存在时没有可保护的内容,照写。
83
+ let onDisk = null;
84
+ try {
85
+ onDisk = readFileSync(absPath, 'utf-8');
86
+ }
87
+ catch (err) {
88
+ if (err.code !== 'ENOENT')
89
+ throw err;
90
+ }
91
+ if (onDisk !== null && onDisk !== raw) {
92
+ reconcilePending = true;
93
+ const reason = t('saveRefused', { file: label, path: absPath });
94
+ throw withText(new ConfigSaveRefusedError(reason.source), reason);
95
+ }
96
+ const text = opts.serialize(value);
97
+ // 原子写:先写临时文件再 rename(同目录同分区,rename 原子覆盖)。直接 writeFileSync 是 O_CREAT|O_TRUNC,
98
+ // 写中断(磁盘写满、进程被杀)时盘上留下 0 字节或半截 YAML,空文件还会被当成空文档放行。
99
+ // watch() 守的是目录,rename 换 inode 不会打断监听。
100
+ const tmp = `${absPath}.tmp.${process.pid}.${randomBytes(4).toString('hex')}`;
101
+ // 临时文件建出来就是收紧的权限:按默认 umask 建出再 chmod,其间或进程在 rename 前被杀时,目录里就有一份
102
+ // 权限更宽的副本;rename 让目标继承 tmp 的权限
103
+ let mode = opts.mode ?? 0o600;
104
+ if (opts.mode === undefined) {
105
+ try {
106
+ mode = statSync(absPath).mode & 0o777;
107
+ }
108
+ catch {
109
+ /* 原文件不存在或取不到权限:按 0o600 建 */
110
+ }
111
+ }
112
+ try {
113
+ writeFileSync(tmp, text, { encoding: 'utf-8', mode });
114
+ // 建文件时的 mode 还会被 umask 收窄;对齐回目标权限位(不会宽于 mode 本身)
115
+ try {
116
+ chmodSync(tmp, mode);
117
+ }
118
+ catch {
119
+ /* 对不齐就保持建出时更窄的权限,不拖累写入本身 */
120
+ }
121
+ renameSync(tmp, absPath);
122
+ }
123
+ catch (err) {
124
+ // 临时文件是整份内容(可能含密钥),不能留在目录里
125
+ try {
126
+ rmSync(tmp, { force: true });
127
+ }
128
+ catch {
129
+ /* 删不掉也要把原始错误传出去 */
130
+ }
131
+ throw err;
132
+ }
133
+ raw = text;
134
+ reconcilePending = false;
135
+ },
136
+ watch(onChange) {
137
+ if (watcher)
138
+ return () => { };
139
+ // 守目录而非文件:文件可能尚未落盘,建出来时也要能接上
140
+ if (!existsSync(dataDir))
141
+ return () => { };
142
+ const fileName = basename(absPath);
143
+ try {
144
+ const schedule = () => {
145
+ if (debounceTimer)
146
+ clearTimeout(debounceTimer);
147
+ debounceTimer = setTimeout(() => {
148
+ debounceTimer = null;
149
+ // 读盘失败与解析失败分开:编辑器先删后建式保存的瞬时 ENOENT 不能报成「YAML 写错了」。
150
+ // 读不到安静返回(下一个事件会来),解析失败才出声
151
+ let current;
152
+ try {
153
+ current = readFileSync(absPath, 'utf-8');
154
+ }
155
+ catch {
156
+ return;
157
+ }
158
+ // raw 在装载、save、本回调三处维护:一并挡掉自写回、目录里无关文件的杂音、touch 与改完又改回来的空变更。
159
+ // 拒写之后的这一次除外(见 reconcilePending)
160
+ if (current === raw && !reconcilePending)
161
+ return;
162
+ let parsed;
163
+ try {
164
+ parsed = parseYamlText(current, label.source, logger);
165
+ }
166
+ catch (err) {
167
+ // raw 只在解析成功后推进:同一份坏内容每次保存都重新告警,直到改对为止
168
+ logger.warn(`${label.source}解析失败,本次变更已忽略,仍在使用上一份内容:${toSource(describeYamlError(err))}`);
169
+ return;
170
+ }
171
+ // 空文件、裸标量、数组:一道闸拒收,放行会让下游按空内容重载或写回垃圾
172
+ if (parsed === null && opts.emptyAsMissing)
173
+ parsed = opts.missing();
174
+ const kind = describeNonMapping(parsed);
175
+ if (kind) {
176
+ logger.warn(`${label.source}不是一个映射(得到 ${kind}),本次变更已忽略`);
177
+ return;
178
+ }
179
+ raw = current;
180
+ reconcilePending = false;
181
+ try {
182
+ onChange(parsed);
183
+ }
184
+ catch (err) {
185
+ logger.warn(`${label.source}变更处理器抛错:${err instanceof Error ? err.message : String(err)}`);
186
+ }
187
+ }, 300);
188
+ };
189
+ // 必须监听目录,不能监听文件本身:fs.watch 绑的是那一刻的 inode,编辑器保存与本模块的 save
190
+ // 都是「写临时文件 → rename」,换了 inode 之后绑在旧 inode 上的 watcher 永不触发,也没有任何报错
191
+ watcher = fsWatch(dataDir, (_event, filename) => {
192
+ // filename 平台不保证非空;为空时不过滤,交给内容比对兜底
193
+ if (filename && basename(filename.toString()) !== fileName)
194
+ return;
195
+ schedule();
196
+ });
197
+ // 不接 error 会成为未捕获异常、带倒进程(Windows 上被监听的目录被删或不可访问时会报 EPERM)
198
+ watcher.on('error', err => {
199
+ logger.warn(`${label.source}监听出错,已停止监听(${err instanceof Error ? err.message : String(err)}):手动修改后需重启才生效,重启前的进程保存会被拒绝`);
200
+ watcher?.close();
201
+ watcher = null;
202
+ });
203
+ // 武装即对账一次:武装前(启动期)的外部修改不会再有事件,不补就既不生效、又让 save 一直拒写
204
+ schedule();
205
+ }
206
+ catch (err) {
207
+ logger.warn(`无法监听${label.source}变更(${err instanceof Error ? err.message : String(err)}):手动修改后需重启才生效,重启前的进程保存会被拒绝`);
208
+ }
209
+ return () => {
210
+ if (debounceTimer) {
211
+ clearTimeout(debounceTimer);
212
+ debounceTimer = null;
213
+ }
214
+ watcher?.close();
215
+ watcher = null;
216
+ };
217
+ },
218
+ };
219
+ }
220
+ //# sourceMappingURL=yaml-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yaml-file.js","sourceRoot":"","sources":["../src/yaml-file.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aalis/runtime",
3
- "version": "0.15.1",
3
+ "version": "0.17.0",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -23,22 +23,29 @@
23
23
  "files": [
24
24
  "dist"
25
25
  ],
26
+ "engines": {
27
+ "node": ">=24.15.0"
28
+ },
26
29
  "dependencies": {
27
30
  "chalk": "^5.4.0",
28
31
  "yaml": "^2.7.0",
29
- "@aalis/schema-config": ">=0.14.0 <1.0.0",
32
+ "@aalis/schema-config": ">=0.16.0 <1.0.0",
30
33
  "@aalis/schema-log": ">=0.2.0 <1.0.0",
31
- "@aalis/api-plugin-source": ">=0.1.0 <1.0.0",
32
- "@aalis/api-host-config": ">=0.1.0 <1.0.0"
34
+ "@aalis/api-doctor": ">=0.9.0 <1.0.0",
35
+ "@aalis/api-plugin-source": ">=0.2.0 <1.0.0",
36
+ "@aalis/api-host-config": ">=0.3.0 <1.0.0",
37
+ "@aalis/api-host-logs": ">=0.1.0 <1.0.0",
38
+ "@aalis/api-host-paths": ">=0.1.0 <1.0.0",
39
+ "@aalis/schema-i18n": ">=0.1.0 <1.0.0"
33
40
  },
34
41
  "peerDependencies": {
35
- "@aalis/core": ">=0.19.0 <1.0.0"
42
+ "@aalis/core": ">=0.21.0 <1.0.0"
36
43
  },
37
44
  "devDependencies": {
38
45
  "typescript": "^5.7.0",
39
46
  "@types/node": "^22.0.0",
40
- "@aalis/core": "0.19.1",
41
- "@aalis/api-commands": "0.7.0"
47
+ "@aalis/core": "0.21.0",
48
+ "@aalis/api-commands": "0.9.0"
42
49
  },
43
50
  "scripts": {
44
51
  "build": "tsc",