@yunzai-ng/core 0.1.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/LICENSE +661 -0
- package/README.md +51 -0
- package/dist/adapter/accounts.d.ts +174 -0
- package/dist/adapter/accounts.d.ts.map +1 -0
- package/dist/adapter/accounts.js +653 -0
- package/dist/adapter/accounts.js.map +1 -0
- package/dist/adapter/bots.d.ts +142 -0
- package/dist/adapter/bots.d.ts.map +1 -0
- package/dist/adapter/bots.js +454 -0
- package/dist/adapter/bots.js.map +1 -0
- package/dist/adapter/host.d.ts +114 -0
- package/dist/adapter/host.d.ts.map +1 -0
- package/dist/adapter/host.js +90 -0
- package/dist/adapter/host.js.map +1 -0
- package/dist/adapter/login.d.ts +174 -0
- package/dist/adapter/login.d.ts.map +1 -0
- package/dist/adapter/login.js +345 -0
- package/dist/adapter/login.js.map +1 -0
- package/dist/adapter/registry.d.ts +102 -0
- package/dist/adapter/registry.d.ts.map +1 -0
- package/dist/adapter/registry.js +150 -0
- package/dist/adapter/registry.js.map +1 -0
- package/dist/config/core-config.d.ts +151 -0
- package/dist/config/core-config.d.ts.map +1 -0
- package/dist/config/core-config.js +338 -0
- package/dist/config/core-config.js.map +1 -0
- package/dist/config/schema.d.ts +449 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +871 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/config/store.d.ts +184 -0
- package/dist/config/store.d.ts.map +1 -0
- package/dist/config/store.js +428 -0
- package/dist/config/store.js.map +1 -0
- package/dist/config/yaml.d.ts +23 -0
- package/dist/config/yaml.d.ts.map +1 -0
- package/dist/config/yaml.js +108 -0
- package/dist/config/yaml.js.map +1 -0
- package/dist/http/client.d.ts +82 -0
- package/dist/http/client.d.ts.map +1 -0
- package/dist/http/client.js +658 -0
- package/dist/http/client.js.map +1 -0
- package/dist/index.d.ts +77 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +94 -0
- package/dist/index.js.map +1 -0
- package/dist/kernel/app.d.ts +244 -0
- package/dist/kernel/app.d.ts.map +1 -0
- package/dist/kernel/app.js +654 -0
- package/dist/kernel/app.js.map +1 -0
- package/dist/kernel/kv-sink.d.ts +34 -0
- package/dist/kernel/kv-sink.d.ts.map +1 -0
- package/dist/kernel/kv-sink.js +25 -0
- package/dist/kernel/kv-sink.js.map +1 -0
- package/dist/kernel/policy.d.ts +77 -0
- package/dist/kernel/policy.d.ts.map +1 -0
- package/dist/kernel/policy.js +99 -0
- package/dist/kernel/policy.js.map +1 -0
- package/dist/kernel/runtime.d.ts +117 -0
- package/dist/kernel/runtime.d.ts.map +1 -0
- package/dist/kernel/runtime.js +197 -0
- package/dist/kernel/runtime.js.map +1 -0
- package/dist/kernel/sql-sink.d.ts +36 -0
- package/dist/kernel/sql-sink.d.ts.map +1 -0
- package/dist/kernel/sql-sink.js +114 -0
- package/dist/kernel/sql-sink.js.map +1 -0
- package/dist/logger/format.d.ts +67 -0
- package/dist/logger/format.d.ts.map +1 -0
- package/dist/logger/format.js +218 -0
- package/dist/logger/format.js.map +1 -0
- package/dist/logger/index.d.ts +97 -0
- package/dist/logger/index.d.ts.map +1 -0
- package/dist/logger/index.js +363 -0
- package/dist/logger/index.js.map +1 -0
- package/dist/logger/rotate.d.ts +47 -0
- package/dist/logger/rotate.d.ts.map +1 -0
- package/dist/logger/rotate.js +242 -0
- package/dist/logger/rotate.js.map +1 -0
- package/dist/message/segment.d.ts +255 -0
- package/dist/message/segment.d.ts.map +1 -0
- package/dist/message/segment.js +510 -0
- package/dist/message/segment.js.map +1 -0
- package/dist/message/split.d.ts +34 -0
- package/dist/message/split.d.ts.map +1 -0
- package/dist/message/split.js +79 -0
- package/dist/message/split.js.map +1 -0
- package/dist/message/target.d.ts +29 -0
- package/dist/message/target.d.ts.map +1 -0
- package/dist/message/target.js +34 -0
- package/dist/message/target.js.map +1 -0
- package/dist/pipeline/cooldown.d.ts +84 -0
- package/dist/pipeline/cooldown.d.ts.map +1 -0
- package/dist/pipeline/cooldown.js +94 -0
- package/dist/pipeline/cooldown.js.map +1 -0
- package/dist/pipeline/dispatch.d.ts +98 -0
- package/dist/pipeline/dispatch.d.ts.map +1 -0
- package/dist/pipeline/dispatch.js +323 -0
- package/dist/pipeline/dispatch.js.map +1 -0
- package/dist/pipeline/event.d.ts +130 -0
- package/dist/pipeline/event.d.ts.map +1 -0
- package/dist/pipeline/event.js +538 -0
- package/dist/pipeline/event.js.map +1 -0
- package/dist/pipeline/middleware.d.ts +63 -0
- package/dist/pipeline/middleware.d.ts.map +1 -0
- package/dist/pipeline/middleware.js +174 -0
- package/dist/pipeline/middleware.js.map +1 -0
- package/dist/pipeline/prompt.d.ts +80 -0
- package/dist/pipeline/prompt.d.ts.map +1 -0
- package/dist/pipeline/prompt.js +155 -0
- package/dist/pipeline/prompt.js.map +1 -0
- package/dist/pipeline/router.d.ts +98 -0
- package/dist/pipeline/router.d.ts.map +1 -0
- package/dist/pipeline/router.js +489 -0
- package/dist/pipeline/router.js.map +1 -0
- package/dist/platform/detect.d.ts +24 -0
- package/dist/platform/detect.d.ts.map +1 -0
- package/dist/platform/detect.js +178 -0
- package/dist/platform/detect.js.map +1 -0
- package/dist/platform/paths.d.ts +38 -0
- package/dist/platform/paths.d.ts.map +1 -0
- package/dist/platform/paths.js +129 -0
- package/dist/platform/paths.js.map +1 -0
- package/dist/platform/system.d.ts +71 -0
- package/dist/platform/system.d.ts.map +1 -0
- package/dist/platform/system.js +242 -0
- package/dist/platform/system.js.map +1 -0
- package/dist/plugin/context.d.ts +92 -0
- package/dist/plugin/context.d.ts.map +1 -0
- package/dist/plugin/context.js +573 -0
- package/dist/plugin/context.js.map +1 -0
- package/dist/plugin/define.d.ts +92 -0
- package/dist/plugin/define.d.ts.map +1 -0
- package/dist/plugin/define.js +82 -0
- package/dist/plugin/define.js.map +1 -0
- package/dist/plugin/discover.d.ts +106 -0
- package/dist/plugin/discover.d.ts.map +1 -0
- package/dist/plugin/discover.js +254 -0
- package/dist/plugin/discover.js.map +1 -0
- package/dist/plugin/events.d.ts +109 -0
- package/dist/plugin/events.d.ts.map +1 -0
- package/dist/plugin/events.js +209 -0
- package/dist/plugin/events.js.map +1 -0
- package/dist/plugin/hooks.d.ts +266 -0
- package/dist/plugin/hooks.d.ts.map +1 -0
- package/dist/plugin/hooks.js +84 -0
- package/dist/plugin/hooks.js.map +1 -0
- package/dist/plugin/host.d.ts +160 -0
- package/dist/plugin/host.d.ts.map +1 -0
- package/dist/plugin/host.js +546 -0
- package/dist/plugin/host.js.map +1 -0
- package/dist/plugin/market.d.ts +264 -0
- package/dist/plugin/market.d.ts.map +1 -0
- package/dist/plugin/market.js +700 -0
- package/dist/plugin/market.js.map +1 -0
- package/dist/plugin/services.d.ts +116 -0
- package/dist/plugin/services.d.ts.map +1 -0
- package/dist/plugin/services.js +213 -0
- package/dist/plugin/services.js.map +1 -0
- package/dist/plugin/tar.d.ts +65 -0
- package/dist/plugin/tar.d.ts.map +1 -0
- package/dist/plugin/tar.js +277 -0
- package/dist/plugin/tar.js.map +1 -0
- package/dist/render/registry.d.ts +127 -0
- package/dist/render/registry.d.ts.map +1 -0
- package/dist/render/registry.js +306 -0
- package/dist/render/registry.js.map +1 -0
- package/dist/scheduler/index.d.ts +67 -0
- package/dist/scheduler/index.d.ts.map +1 -0
- package/dist/scheduler/index.js +279 -0
- package/dist/scheduler/index.js.map +1 -0
- package/dist/server/api.d.ts +179 -0
- package/dist/server/api.d.ts.map +1 -0
- package/dist/server/api.js +602 -0
- package/dist/server/api.js.map +1 -0
- package/dist/server/auth.d.ts +83 -0
- package/dist/server/auth.d.ts.map +1 -0
- package/dist/server/auth.js +178 -0
- package/dist/server/auth.js.map +1 -0
- package/dist/server/browse.d.ts +60 -0
- package/dist/server/browse.d.ts.map +1 -0
- package/dist/server/browse.js +187 -0
- package/dist/server/browse.js.map +1 -0
- package/dist/server/files.d.ts +27 -0
- package/dist/server/files.d.ts.map +1 -0
- package/dist/server/files.js +76 -0
- package/dist/server/files.js.map +1 -0
- package/dist/server/index.d.ts +189 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +1123 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/table.d.ts +105 -0
- package/dist/server/table.d.ts.map +1 -0
- package/dist/server/table.js +289 -0
- package/dist/server/table.js.map +1 -0
- package/dist/store/index.d.ts +50 -0
- package/dist/store/index.d.ts.map +1 -0
- package/dist/store/index.js +120 -0
- package/dist/store/index.js.map +1 -0
- package/dist/store/json.d.ts +73 -0
- package/dist/store/json.d.ts.map +1 -0
- package/dist/store/json.js +174 -0
- package/dist/store/json.js.map +1 -0
- package/dist/store/kv.d.ts +126 -0
- package/dist/store/kv.d.ts.map +1 -0
- package/dist/store/kv.js +232 -0
- package/dist/store/kv.js.map +1 -0
- package/dist/store/level.d.ts +103 -0
- package/dist/store/level.d.ts.map +1 -0
- package/dist/store/level.js +119 -0
- package/dist/store/level.js.map +1 -0
- package/dist/store/memory.d.ts +61 -0
- package/dist/store/memory.d.ts.map +1 -0
- package/dist/store/memory.js +94 -0
- package/dist/store/memory.js.map +1 -0
- package/dist/store/sql.d.ts +142 -0
- package/dist/store/sql.d.ts.map +1 -0
- package/dist/store/sql.js +246 -0
- package/dist/store/sql.js.map +1 -0
- package/dist/testing/fake.d.ts +109 -0
- package/dist/testing/fake.d.ts.map +1 -0
- package/dist/testing/fake.js +196 -0
- package/dist/testing/fake.js.map +1 -0
- package/dist/testing/index.d.ts +16 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +16 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/mock-adapter.d.ts +205 -0
- package/dist/testing/mock-adapter.d.ts.map +1 -0
- package/dist/testing/mock-adapter.js +309 -0
- package/dist/testing/mock-adapter.js.map +1 -0
- package/dist/util/deep.d.ts +108 -0
- package/dist/util/deep.d.ts.map +1 -0
- package/dist/util/deep.js +275 -0
- package/dist/util/deep.js.map +1 -0
- package/dist/util/defer.d.ts +107 -0
- package/dist/util/defer.d.ts.map +1 -0
- package/dist/util/defer.js +163 -0
- package/dist/util/defer.js.map +1 -0
- package/dist/util/dispose.d.ts +88 -0
- package/dist/util/dispose.d.ts.map +1 -0
- package/dist/util/dispose.js +143 -0
- package/dist/util/dispose.js.map +1 -0
- package/dist/util/duration.d.ts +28 -0
- package/dist/util/duration.d.ts.map +1 -0
- package/dist/util/duration.js +77 -0
- package/dist/util/duration.js.map +1 -0
- package/dist/util/fs.d.ts +110 -0
- package/dist/util/fs.d.ts.map +1 -0
- package/dist/util/fs.js +269 -0
- package/dist/util/fs.js.map +1 -0
- package/dist/util/id.d.ts +49 -0
- package/dist/util/id.d.ts.map +1 -0
- package/dist/util/id.js +87 -0
- package/dist/util/id.js.map +1 -0
- package/dist/util/lru.d.ts +74 -0
- package/dist/util/lru.d.ts.map +1 -0
- package/dist/util/lru.js +156 -0
- package/dist/util/lru.js.map +1 -0
- package/dist/util/queue.d.ts +64 -0
- package/dist/util/queue.d.ts.map +1 -0
- package/dist/util/queue.js +147 -0
- package/dist/util/queue.js.map +1 -0
- package/dist/util/text.d.ts +86 -0
- package/dist/util/text.d.ts.map +1 -0
- package/dist/util/text.js +182 -0
- package/dist/util/text.js.map +1 -0
- package/package.json +44 -0
- package/src/adapter/accounts.ts +758 -0
- package/src/adapter/bots.ts +582 -0
- package/src/adapter/host.ts +224 -0
- package/src/adapter/login.ts +481 -0
- package/src/adapter/registry.ts +202 -0
- package/src/config/core-config.test.ts +60 -0
- package/src/config/core-config.ts +401 -0
- package/src/config/schema.test.ts +179 -0
- package/src/config/schema.ts +1036 -0
- package/src/config/store.test.ts +245 -0
- package/src/config/store.ts +506 -0
- package/src/config/yaml.ts +119 -0
- package/src/http/client.test.ts +568 -0
- package/src/http/client.ts +777 -0
- package/src/index.ts +106 -0
- package/src/kernel/app.test.ts +267 -0
- package/src/kernel/app.ts +843 -0
- package/src/kernel/kv-sink.ts +58 -0
- package/src/kernel/policy.ts +120 -0
- package/src/kernel/runtime.test.ts +542 -0
- package/src/kernel/runtime.ts +307 -0
- package/src/kernel/sql-sink.ts +154 -0
- package/src/logger/format.ts +259 -0
- package/src/logger/index.ts +427 -0
- package/src/logger/rotate.ts +265 -0
- package/src/message/segment.test.ts +335 -0
- package/src/message/segment.ts +569 -0
- package/src/message/split.ts +97 -0
- package/src/message/target.ts +48 -0
- package/src/pipeline/cooldown.ts +136 -0
- package/src/pipeline/dispatch.ts +419 -0
- package/src/pipeline/event.ts +735 -0
- package/src/pipeline/middleware.test.ts +426 -0
- package/src/pipeline/middleware.ts +199 -0
- package/src/pipeline/prompt.ts +212 -0
- package/src/pipeline/router.test.ts +432 -0
- package/src/pipeline/router.ts +575 -0
- package/src/platform/detect.ts +178 -0
- package/src/platform/paths.ts +147 -0
- package/src/platform/system.test.ts +102 -0
- package/src/platform/system.ts +289 -0
- package/src/plugin/context.test.ts +459 -0
- package/src/plugin/context.ts +757 -0
- package/src/plugin/define.test.ts +120 -0
- package/src/plugin/define.ts +142 -0
- package/src/plugin/discover.test.ts +253 -0
- package/src/plugin/discover.ts +353 -0
- package/src/plugin/events.test.ts +162 -0
- package/src/plugin/events.ts +266 -0
- package/src/plugin/hooks.ts +373 -0
- package/src/plugin/host.test.ts +696 -0
- package/src/plugin/host.ts +738 -0
- package/src/plugin/market.test.ts +781 -0
- package/src/plugin/market.ts +870 -0
- package/src/plugin/services.test.ts +135 -0
- package/src/plugin/services.ts +261 -0
- package/src/plugin/tar.test.ts +158 -0
- package/src/plugin/tar.ts +309 -0
- package/src/render/registry.test.ts +127 -0
- package/src/render/registry.ts +439 -0
- package/src/scheduler/index.ts +357 -0
- package/src/server/api.test.ts +802 -0
- package/src/server/api.ts +869 -0
- package/src/server/auth.ts +201 -0
- package/src/server/browse.test.ts +193 -0
- package/src/server/browse.ts +240 -0
- package/src/server/files.ts +97 -0
- package/src/server/index.test.ts +566 -0
- package/src/server/index.ts +1386 -0
- package/src/server/table.ts +351 -0
- package/src/store/index.ts +156 -0
- package/src/store/json.ts +198 -0
- package/src/store/kv.test.ts +307 -0
- package/src/store/kv.ts +256 -0
- package/src/store/level.ts +167 -0
- package/src/store/memory.ts +109 -0
- package/src/store/sql.test.ts +204 -0
- package/src/store/sql.ts +324 -0
- package/src/testing/fake.ts +297 -0
- package/src/testing/index.ts +15 -0
- package/src/testing/mock-adapter.ts +588 -0
- package/src/util/deep.ts +272 -0
- package/src/util/defer.ts +211 -0
- package/src/util/dispose.ts +169 -0
- package/src/util/duration.ts +82 -0
- package/src/util/fs.ts +279 -0
- package/src/util/id.ts +94 -0
- package/src/util/lru.ts +185 -0
- package/src/util/queue.ts +167 -0
- package/src/util/text.ts +189 -0
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
var _a;
|
|
2
|
+
import { dirname } from "node:path";
|
|
3
|
+
import { LruCache } from "../util/lru.js";
|
|
4
|
+
import { Semaphore } from "../util/queue.js";
|
|
5
|
+
import { ensureDir } from "../util/fs.js";
|
|
6
|
+
/** 语句缓存条目上限 */
|
|
7
|
+
const STMT_CACHE_MAX = 200;
|
|
8
|
+
/** 迁移记录表名 */
|
|
9
|
+
const MIGRATION_TABLE = "_yzng_migrations";
|
|
10
|
+
/**
|
|
11
|
+
* 尝试加载 better-sqlite3
|
|
12
|
+
* @returns 构造函数;模块不可用时 undefined
|
|
13
|
+
*/
|
|
14
|
+
export async function loadSqlite() {
|
|
15
|
+
try {
|
|
16
|
+
const mod = (await import("better-sqlite3"));
|
|
17
|
+
return mod.default;
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* SQLite 句柄
|
|
25
|
+
*
|
|
26
|
+
* 根句柄由 `openSql()` 创建;事务内传给回调的是 `depth > 0` 的子句柄,
|
|
27
|
+
* 它们共享同一条连接,因此**不能**在事务回调里持有子句柄留到事务外使用。
|
|
28
|
+
*/
|
|
29
|
+
export class SqliteHandle {
|
|
30
|
+
/** 共享状态 */
|
|
31
|
+
#state;
|
|
32
|
+
/** 事务嵌套深度,0 表示不在事务中 */
|
|
33
|
+
#depth;
|
|
34
|
+
/**
|
|
35
|
+
* @param state 共享状态
|
|
36
|
+
* @param depth 事务嵌套深度
|
|
37
|
+
*/
|
|
38
|
+
constructor(state, depth = 0) {
|
|
39
|
+
this.#state = state;
|
|
40
|
+
this.#depth = depth;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* 执行不返回行的语句
|
|
44
|
+
*
|
|
45
|
+
* 不带参数且含多条语句时走 `exec()`,方便迁移里一次建表 + 建索引;
|
|
46
|
+
* 这种情况下无法报告受影响行数,返回 0。
|
|
47
|
+
* @param sql SQL 文本
|
|
48
|
+
* @param params 绑定参数
|
|
49
|
+
* @returns 受影响行数与最后插入 id
|
|
50
|
+
*/
|
|
51
|
+
async run(sql, params = []) {
|
|
52
|
+
if (params.length === 0 && isMultiStatement(sql)) {
|
|
53
|
+
this.#state.db.exec(sql);
|
|
54
|
+
return { changes: 0, lastInsertRowid: 0 };
|
|
55
|
+
}
|
|
56
|
+
return this.#prepare(sql).run(...params);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* 查询多行
|
|
60
|
+
* @param sql SQL 文本
|
|
61
|
+
* @param params 绑定参数
|
|
62
|
+
* @returns 结果行数组
|
|
63
|
+
*/
|
|
64
|
+
async all(sql, params = []) {
|
|
65
|
+
return this.#prepare(sql).all(...params);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* 查询首行
|
|
69
|
+
* @param sql SQL 文本
|
|
70
|
+
* @param params 绑定参数
|
|
71
|
+
* @returns 首行;无结果时 undefined
|
|
72
|
+
*/
|
|
73
|
+
async get(sql, params = []) {
|
|
74
|
+
return this.#prepare(sql).get(...params) ?? undefined;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* 在事务中执行
|
|
78
|
+
*
|
|
79
|
+
* 最外层用 `BEGIN IMMEDIATE`(立刻拿写锁,避免升级锁时才发现冲突而整段重来);
|
|
80
|
+
* 嵌套层用 SAVEPOINT,实现"内层回滚不牵连外层"。
|
|
81
|
+
* @param fn 事务体,抛错即回滚
|
|
82
|
+
* @returns 事务体的返回值
|
|
83
|
+
*/
|
|
84
|
+
async transaction(fn) {
|
|
85
|
+
if (this.#depth > 0)
|
|
86
|
+
return this.#savepoint(fn);
|
|
87
|
+
// 同一条连接上不能并发开事务,排队等前一个事务结束
|
|
88
|
+
return this.#state.mutex.use(async () => {
|
|
89
|
+
const tx = new _a(this.#state, 1);
|
|
90
|
+
this.#state.db.exec("BEGIN IMMEDIATE");
|
|
91
|
+
try {
|
|
92
|
+
const result = await fn(tx);
|
|
93
|
+
this.#state.db.exec("COMMIT");
|
|
94
|
+
return result;
|
|
95
|
+
}
|
|
96
|
+
catch (err) {
|
|
97
|
+
// 回滚本身也可能失败(连接已断),此时保留原始错误更有诊断价值
|
|
98
|
+
try {
|
|
99
|
+
this.#state.db.exec("ROLLBACK");
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
/* 忽略 */
|
|
103
|
+
}
|
|
104
|
+
throw err;
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* 应用迁移
|
|
110
|
+
*
|
|
111
|
+
* 每条迁移单独一个事务:失败只回滚这一条,已成功的保持生效,修好后重跑从断点继续。
|
|
112
|
+
* 版本号落在迁移表里,故"这个库到哪一版了"有确定答案,不必靠"存在则忽略"的 try/catch。
|
|
113
|
+
* @param migrations 迁移列表
|
|
114
|
+
* @throws 版本号未严格递增,或某条迁移执行失败
|
|
115
|
+
*/
|
|
116
|
+
async migrate(migrations) {
|
|
117
|
+
await this.run(`CREATE TABLE IF NOT EXISTS ${MIGRATION_TABLE} (
|
|
118
|
+
version INTEGER PRIMARY KEY,
|
|
119
|
+
name TEXT NOT NULL,
|
|
120
|
+
applied_at INTEGER NOT NULL
|
|
121
|
+
)`);
|
|
122
|
+
const sorted = [...migrations].sort((a, b) => a.version - b.version);
|
|
123
|
+
for (let i = 1; i < sorted.length; i++) {
|
|
124
|
+
if (sorted[i].version === sorted[i - 1].version) {
|
|
125
|
+
throw new Error(`迁移版本号重复:${sorted[i].version}`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
const rows = await this.all(`SELECT version FROM ${MIGRATION_TABLE}`);
|
|
129
|
+
const applied = new Set(rows.map(r => r.version));
|
|
130
|
+
for (const migration of sorted) {
|
|
131
|
+
if (applied.has(migration.version))
|
|
132
|
+
continue;
|
|
133
|
+
await this.transaction(async (tx) => {
|
|
134
|
+
await migration.up(tx);
|
|
135
|
+
await tx.run(`INSERT INTO ${MIGRATION_TABLE} (version, name, applied_at) VALUES (?, ?, ?)`, [
|
|
136
|
+
migration.version,
|
|
137
|
+
migration.name,
|
|
138
|
+
Date.now()
|
|
139
|
+
]);
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* 嵌套事务:SAVEPOINT
|
|
145
|
+
* @param fn 事务体
|
|
146
|
+
* @returns 事务体的返回值
|
|
147
|
+
*/
|
|
148
|
+
async #savepoint(fn) {
|
|
149
|
+
const name = `yzng_sp_${++this.#state.savepoint}`;
|
|
150
|
+
const tx = new _a(this.#state, this.#depth + 1);
|
|
151
|
+
this.#state.db.exec(`SAVEPOINT ${name}`);
|
|
152
|
+
try {
|
|
153
|
+
const result = await fn(tx);
|
|
154
|
+
this.#state.db.exec(`RELEASE ${name}`);
|
|
155
|
+
return result;
|
|
156
|
+
}
|
|
157
|
+
catch (err) {
|
|
158
|
+
try {
|
|
159
|
+
this.#state.db.exec(`ROLLBACK TO ${name}`);
|
|
160
|
+
this.#state.db.exec(`RELEASE ${name}`);
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
/* 忽略 */
|
|
164
|
+
}
|
|
165
|
+
throw err;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* 取(并缓存)预编译语句
|
|
170
|
+
* @param sql SQL 文本
|
|
171
|
+
* @returns 预编译语句
|
|
172
|
+
*/
|
|
173
|
+
#prepare(sql) {
|
|
174
|
+
const cached = this.#state.stmts.get(sql);
|
|
175
|
+
if (cached)
|
|
176
|
+
return cached;
|
|
177
|
+
const stmt = this.#state.db.prepare(sql);
|
|
178
|
+
this.#state.stmts.set(sql, stmt);
|
|
179
|
+
return stmt;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
_a = SqliteHandle;
|
|
183
|
+
/**
|
|
184
|
+
* 打开 SQLite 数据库
|
|
185
|
+
* @param opts 参数
|
|
186
|
+
* @returns 已打开的 SQL 存储;原生模块不可用时 undefined(调用方应降级为纯 KV)
|
|
187
|
+
*/
|
|
188
|
+
export async function openSql(opts) {
|
|
189
|
+
const ctor = opts.ctor ?? (await loadSqlite());
|
|
190
|
+
if (!ctor)
|
|
191
|
+
return undefined;
|
|
192
|
+
await ensureDir(dirname(opts.file));
|
|
193
|
+
const db = new ctor(opts.file);
|
|
194
|
+
// WAL:读不阻塞写,且断电时不会像 rollback journal 那样留下半个事务
|
|
195
|
+
db.pragma("journal_mode = WAL");
|
|
196
|
+
// NORMAL 在 WAL 下依然崩溃安全(只可能丢最后一个未 checkpoint 的事务),
|
|
197
|
+
// 却比 FULL 快一个数量级;机器人数据不是账本,这个取舍是合适的
|
|
198
|
+
db.pragma("synchronous = NORMAL");
|
|
199
|
+
db.pragma("foreign_keys = ON");
|
|
200
|
+
// 被别的连接短暂锁住时等一会儿再报错,而不是立刻抛 SQLITE_BUSY
|
|
201
|
+
db.pragma("busy_timeout = 5000");
|
|
202
|
+
const state = {
|
|
203
|
+
db,
|
|
204
|
+
stmts: new LruCache({ max: STMT_CACHE_MAX }),
|
|
205
|
+
mutex: new Semaphore(1),
|
|
206
|
+
savepoint: 0
|
|
207
|
+
};
|
|
208
|
+
return {
|
|
209
|
+
handle: new SqliteHandle(state),
|
|
210
|
+
file: opts.file,
|
|
211
|
+
close: () => {
|
|
212
|
+
// 缓存里的语句必须先丢掉:连接关了之后再用它们会直接崩进程
|
|
213
|
+
state.stmts.clear();
|
|
214
|
+
db.close();
|
|
215
|
+
}
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* 判断 SQL 是否包含多条语句
|
|
220
|
+
*
|
|
221
|
+
* 只做粗判:跳过字符串字面量后看是否还有 `;` 跟着非空白内容。
|
|
222
|
+
* 粗判失败的后果仅仅是走 `prepare()` 然后由 SQLite 自己报错,可接受。
|
|
223
|
+
* @param sql SQL 文本
|
|
224
|
+
* @returns 是否多语句
|
|
225
|
+
*/
|
|
226
|
+
function isMultiStatement(sql) {
|
|
227
|
+
let inString = false;
|
|
228
|
+
let quote = "";
|
|
229
|
+
for (let i = 0; i < sql.length; i++) {
|
|
230
|
+
const ch = sql[i];
|
|
231
|
+
if (inString) {
|
|
232
|
+
if (ch === quote)
|
|
233
|
+
inString = false;
|
|
234
|
+
continue;
|
|
235
|
+
}
|
|
236
|
+
if (ch === "'" || ch === '"') {
|
|
237
|
+
inString = true;
|
|
238
|
+
quote = ch;
|
|
239
|
+
continue;
|
|
240
|
+
}
|
|
241
|
+
if (ch === ";" && sql.slice(i + 1).trim() !== "")
|
|
242
|
+
return true;
|
|
243
|
+
}
|
|
244
|
+
return false;
|
|
245
|
+
}
|
|
246
|
+
//# sourceMappingURL=sql.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sql.js","sourceRoot":"","sources":["../../src/store/sql.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 模块职责:测试替身(假日志器、录制型子系统接缝、最小应用视图)
|
|
3
|
+
* 依赖方向:依赖 plugin/hooks、类型包;只被 `*.test.ts` 使用
|
|
4
|
+
* 生命周期:每个用例新建一套
|
|
5
|
+
* 注意事项:这些替身**刻意采用真实实现而非 mock 框架的自动桩** —— 注册后必须可查得到、
|
|
6
|
+
* 注销后必须可查得已不存在,否则"卸载是否确实归还了资源"这类断言无从落地。
|
|
7
|
+
*
|
|
8
|
+
* 目前仅用于内核自身的测试。将来若需使插件作者亦可借其编写单元测试,
|
|
9
|
+
* 须同时放开分层门禁中 `@yunzai-ng/core/*` 的深引限制 ——
|
|
10
|
+
* 那是一次独立的、需要写入文档的决定,不在此处附带开放。
|
|
11
|
+
*/
|
|
12
|
+
import type { AdapterProvider, AppView, HttpClient, KvDriver, Logger, RenderRequest, RendererProvider } from "@yunzai-ng/types";
|
|
13
|
+
import type { CommandRegistration, KernelHooks, MiddlewareRegistration, TaskRegistration } from "../plugin/hooks.js";
|
|
14
|
+
/** 带行记录的假日志器 */
|
|
15
|
+
export interface FakeLogger extends Logger {
|
|
16
|
+
/** 已记录的日志行,形如 `"warn 消息 附加参数"` */
|
|
17
|
+
readonly lines: string[];
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* 创建假日志器
|
|
21
|
+
*
|
|
22
|
+
* 断言"出错时给了提示"而不是"抛异常中断"时用它 —— 框架里大量路径的正确行为
|
|
23
|
+
* 就是"记一条能照着解决的 warn 然后继续跑",没有日志断言就测不到。
|
|
24
|
+
* @returns 假日志器
|
|
25
|
+
*/
|
|
26
|
+
export declare function fakeLogger(): FakeLogger;
|
|
27
|
+
/** 一条静态目录挂载记录 */
|
|
28
|
+
export interface StaticMount {
|
|
29
|
+
/** URL 作用域;面板挂载记为归属标识(如 `plugin:webui-next`) */
|
|
30
|
+
scope: string;
|
|
31
|
+
/** URL 前缀;面板挂载记为 `"/"` */
|
|
32
|
+
urlPath: string;
|
|
33
|
+
/** 本地目录 */
|
|
34
|
+
dir: string;
|
|
35
|
+
/** 是否为单页应用挂载(`ctx.panel()` 记为真) */
|
|
36
|
+
spa: boolean;
|
|
37
|
+
}
|
|
38
|
+
/** 一条路由记录 */
|
|
39
|
+
export interface RouteMount {
|
|
40
|
+
/** URL 作用域 */
|
|
41
|
+
scope: string;
|
|
42
|
+
/** 方法,WebSocket 记为 `"WS"` */
|
|
43
|
+
method: string;
|
|
44
|
+
/** 路径 */
|
|
45
|
+
path: string;
|
|
46
|
+
}
|
|
47
|
+
/** 录制到的全部注册 */
|
|
48
|
+
export interface Recorded {
|
|
49
|
+
/** 命令 */
|
|
50
|
+
commands: CommandRegistration[];
|
|
51
|
+
/** 重新索引的次数(按命令去重前的调用计数) */
|
|
52
|
+
reindexed: CommandRegistration[];
|
|
53
|
+
/** 中间件 */
|
|
54
|
+
middlewares: MiddlewareRegistration[];
|
|
55
|
+
/** 定时任务 */
|
|
56
|
+
tasks: TaskRegistration[];
|
|
57
|
+
/** 路由与 WebSocket */
|
|
58
|
+
routes: RouteMount[];
|
|
59
|
+
/** 静态目录 */
|
|
60
|
+
statics: StaticMount[];
|
|
61
|
+
/** 适配器 */
|
|
62
|
+
adapters: AdapterProvider[];
|
|
63
|
+
/** 渲染器 */
|
|
64
|
+
renderers: RendererProvider[];
|
|
65
|
+
/** 收到的渲染请求(断言 templateRoot/resourceRoot 是否算对) */
|
|
66
|
+
renders: RenderRequest[];
|
|
67
|
+
/** KV 驱动 */
|
|
68
|
+
kvDrivers: KvDriver[];
|
|
69
|
+
/** 已打开的 SQL 库,形如 `"插件名/库名"` */
|
|
70
|
+
sqlOpened: string[];
|
|
71
|
+
/** 被要求关闭全部库的插件名 */
|
|
72
|
+
sqlClosed: string[];
|
|
73
|
+
}
|
|
74
|
+
/** 录制型接缝与其录制结果 */
|
|
75
|
+
export interface RecordingHooks {
|
|
76
|
+
/** 交给上下文的接缝 */
|
|
77
|
+
hooks: KernelHooks;
|
|
78
|
+
/** 录制结果 */
|
|
79
|
+
recorded: Recorded;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* 创建录制型子系统接缝
|
|
83
|
+
*
|
|
84
|
+
* 每个 `register` 均确实将登记写入数组,返回的 disposer 亦确实将其摘除。
|
|
85
|
+
* 因此"插件卸载后残留多少条命令"可直接断言 `recorded.commands.length === 0`。
|
|
86
|
+
* @returns 接缝与录制结果
|
|
87
|
+
*/
|
|
88
|
+
export declare function recordingHooks(): RecordingHooks;
|
|
89
|
+
/**
|
|
90
|
+
* 创建最小应用视图
|
|
91
|
+
*
|
|
92
|
+
* 只填测试真正会读的字段,其余用类型断言留空 —— `AppView` 聚合了适配器、
|
|
93
|
+
* 账号、策略等一大票子系统视图,为一个上下文测试把它们全造出来毫无收益。
|
|
94
|
+
* 一旦某个用例真的要读某字段,就在这里补上真的实现。
|
|
95
|
+
* @returns 应用视图
|
|
96
|
+
*/
|
|
97
|
+
export declare function fakeAppView(): AppView;
|
|
98
|
+
/**
|
|
99
|
+
* 创建假 HTTP 客户端
|
|
100
|
+
*
|
|
101
|
+
* 任何调用均抛错:网络请求出现在单元测试中几乎总属设计问题,应使其显式失败。
|
|
102
|
+
*
|
|
103
|
+
* 方法列表与 `HttpClient` 逐一对齐,且**不使用 as unknown as 断言** ——
|
|
104
|
+
* 经断言的替身对象会掩盖"契约已变更"一事:真实客户端新增一个方法后,
|
|
105
|
+
* 只有被测代码调用它时才在运行时抛错,而编译期不会报告任何问题。
|
|
106
|
+
* @returns HTTP 客户端
|
|
107
|
+
*/
|
|
108
|
+
export declare function fakeHttp(): HttpClient;
|
|
109
|
+
//# sourceMappingURL=fake.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fake.d.ts","sourceRoot":"","sources":["../../src/testing/fake.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EACV,eAAe,EACf,OAAO,EACP,UAAU,EACV,QAAQ,EAER,MAAM,EACN,aAAa,EACb,gBAAgB,EAEjB,MAAM,kBAAkB,CAAA;AACzB,OAAO,KAAK,EACV,mBAAmB,EACnB,WAAW,EACX,sBAAsB,EACtB,gBAAgB,EACjB,MAAM,oBAAoB,CAAA;AAE3B,gBAAgB;AAChB,MAAM,WAAW,UAAW,SAAQ,MAAM;IACxC,kCAAkC;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CACzB;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,IAAI,UAAU,CAwBvC;AAED,iBAAiB;AACjB,MAAM,WAAW,WAAW;IAC1B,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAA;IACb,0BAA0B;IAC1B,OAAO,EAAE,MAAM,CAAA;IACf,WAAW;IACX,GAAG,EAAE,MAAM,CAAA;IACX,mCAAmC;IACnC,GAAG,EAAE,OAAO,CAAA;CACb;AAED,aAAa;AACb,MAAM,WAAW,UAAU;IACzB,cAAc;IACd,KAAK,EAAE,MAAM,CAAA;IACb,6BAA6B;IAC7B,MAAM,EAAE,MAAM,CAAA;IACd,SAAS;IACT,IAAI,EAAE,MAAM,CAAA;CACb;AAED,eAAe;AACf,MAAM,WAAW,QAAQ;IACvB,SAAS;IACT,QAAQ,EAAE,mBAAmB,EAAE,CAAA;IAC/B,2BAA2B;IAC3B,SAAS,EAAE,mBAAmB,EAAE,CAAA;IAChC,UAAU;IACV,WAAW,EAAE,sBAAsB,EAAE,CAAA;IACrC,WAAW;IACX,KAAK,EAAE,gBAAgB,EAAE,CAAA;IACzB,oBAAoB;IACpB,MAAM,EAAE,UAAU,EAAE,CAAA;IACpB,WAAW;IACX,OAAO,EAAE,WAAW,EAAE,CAAA;IACtB,UAAU;IACV,QAAQ,EAAE,eAAe,EAAE,CAAA;IAC3B,UAAU;IACV,SAAS,EAAE,gBAAgB,EAAE,CAAA;IAC7B,iDAAiD;IACjD,OAAO,EAAE,aAAa,EAAE,CAAA;IACxB,YAAY;IACZ,SAAS,EAAE,QAAQ,EAAE,CAAA;IACrB,+BAA+B;IAC/B,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,mBAAmB;IACnB,SAAS,EAAE,MAAM,EAAE,CAAA;CACpB;AAED,kBAAkB;AAClB,MAAM,WAAW,cAAc;IAC7B,eAAe;IACf,KAAK,EAAE,WAAW,CAAA;IAClB,WAAW;IACX,QAAQ,EAAE,QAAQ,CAAA;CACnB;AAeD;;;;;;GAMG;AACH,wBAAgB,cAAc,IAAI,cAAc,CA4G/C;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,IAAI,OAAO,CAMrC;AAED;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,IAAI,UAAU,CAcrC"}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 创建假日志器
|
|
3
|
+
*
|
|
4
|
+
* 断言"出错时给了提示"而不是"抛异常中断"时用它 —— 框架里大量路径的正确行为
|
|
5
|
+
* 就是"记一条能照着解决的 warn 然后继续跑",没有日志断言就测不到。
|
|
6
|
+
* @returns 假日志器
|
|
7
|
+
*/
|
|
8
|
+
export function fakeLogger() {
|
|
9
|
+
const lines = [];
|
|
10
|
+
/** 生成某个级别的记录函数 */
|
|
11
|
+
const push = (level) => (msg, ...args) => {
|
|
12
|
+
const extra = args.map(a => (a instanceof Error ? a.message : String(a))).join(" ");
|
|
13
|
+
lines.push(`${level} ${String(msg)} ${extra}`.trim());
|
|
14
|
+
};
|
|
15
|
+
const logger = {
|
|
16
|
+
lines,
|
|
17
|
+
level: "trace",
|
|
18
|
+
trace: push("trace"),
|
|
19
|
+
debug: push("debug"),
|
|
20
|
+
info: push("info"),
|
|
21
|
+
warn: push("warn"),
|
|
22
|
+
error: push("error"),
|
|
23
|
+
fatal: push("fatal"),
|
|
24
|
+
mark: push("info"),
|
|
25
|
+
child: () => logger,
|
|
26
|
+
isLevelEnabled: () => true
|
|
27
|
+
};
|
|
28
|
+
return logger;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* 从数组里移除某项的 disposer
|
|
32
|
+
* @param list 数组
|
|
33
|
+
* @param item 待移除项
|
|
34
|
+
* @returns 注销函数
|
|
35
|
+
*/
|
|
36
|
+
function remover(list, item) {
|
|
37
|
+
return () => {
|
|
38
|
+
const index = list.indexOf(item);
|
|
39
|
+
if (index >= 0)
|
|
40
|
+
list.splice(index, 1);
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* 创建录制型子系统接缝
|
|
45
|
+
*
|
|
46
|
+
* 每个 `register` 均确实将登记写入数组,返回的 disposer 亦确实将其摘除。
|
|
47
|
+
* 因此"插件卸载后残留多少条命令"可直接断言 `recorded.commands.length === 0`。
|
|
48
|
+
* @returns 接缝与录制结果
|
|
49
|
+
*/
|
|
50
|
+
export function recordingHooks() {
|
|
51
|
+
const recorded = {
|
|
52
|
+
commands: [],
|
|
53
|
+
reindexed: [],
|
|
54
|
+
middlewares: [],
|
|
55
|
+
tasks: [],
|
|
56
|
+
routes: [],
|
|
57
|
+
statics: [],
|
|
58
|
+
adapters: [],
|
|
59
|
+
renderers: [],
|
|
60
|
+
renders: [],
|
|
61
|
+
kvDrivers: [],
|
|
62
|
+
sqlOpened: [],
|
|
63
|
+
sqlClosed: []
|
|
64
|
+
};
|
|
65
|
+
/** 假 SQL 句柄:只记录被调用过,不真的建库 */
|
|
66
|
+
const sqlHandle = {
|
|
67
|
+
file: ":fake:",
|
|
68
|
+
exec: () => undefined,
|
|
69
|
+
run: () => ({ changes: 0, lastInsertRowid: 0 }),
|
|
70
|
+
get: () => undefined,
|
|
71
|
+
all: () => [],
|
|
72
|
+
transaction: (fn) => fn(),
|
|
73
|
+
pragma: () => undefined
|
|
74
|
+
};
|
|
75
|
+
const hooks = {
|
|
76
|
+
commands: {
|
|
77
|
+
register: reg => {
|
|
78
|
+
recorded.commands.push(reg);
|
|
79
|
+
return remover(recorded.commands, reg);
|
|
80
|
+
},
|
|
81
|
+
reindex: reg => void recorded.reindexed.push(reg)
|
|
82
|
+
},
|
|
83
|
+
middlewares: {
|
|
84
|
+
register: reg => {
|
|
85
|
+
recorded.middlewares.push(reg);
|
|
86
|
+
return remover(recorded.middlewares, reg);
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
tasks: {
|
|
90
|
+
register: reg => {
|
|
91
|
+
recorded.tasks.push(reg);
|
|
92
|
+
return remover(recorded.tasks, reg);
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
server: {
|
|
96
|
+
info: { enabled: true, host: "127.0.0.1", port: 2536, publicUrl: "http://127.0.0.1:2536" },
|
|
97
|
+
route: (scope, method, path) => {
|
|
98
|
+
const mount = { scope, method, path };
|
|
99
|
+
recorded.routes.push(mount);
|
|
100
|
+
return remover(recorded.routes, mount);
|
|
101
|
+
},
|
|
102
|
+
websocket: (scope, path) => {
|
|
103
|
+
const mount = { scope, method: "WS", path };
|
|
104
|
+
recorded.routes.push(mount);
|
|
105
|
+
return remover(recorded.routes, mount);
|
|
106
|
+
},
|
|
107
|
+
static: (scope, urlPath, dir) => {
|
|
108
|
+
const mount = { scope, urlPath, dir, spa: false };
|
|
109
|
+
recorded.statics.push(mount);
|
|
110
|
+
return remover(recorded.statics, mount);
|
|
111
|
+
},
|
|
112
|
+
panel: (owner, dir) => {
|
|
113
|
+
const mount = { scope: owner, urlPath: "/", dir, spa: true };
|
|
114
|
+
recorded.statics.push(mount);
|
|
115
|
+
return remover(recorded.statics, mount);
|
|
116
|
+
},
|
|
117
|
+
// 只按 urlPath 相等判断:录制型接缝不实现路径表,而调用方(内核挂载内置面板)
|
|
118
|
+
// 问的只是"根路径有没有人接管"这一种情况
|
|
119
|
+
claimant: path => recorded.statics.find(m => m.urlPath === path)?.scope
|
|
120
|
+
},
|
|
121
|
+
render: {
|
|
122
|
+
register: provider => {
|
|
123
|
+
recorded.renderers.push(provider);
|
|
124
|
+
return remover(recorded.renderers, provider);
|
|
125
|
+
},
|
|
126
|
+
// 一张 3 字节的假图:断言"渲染结果被包成 ImageSegment"用得到,
|
|
127
|
+
// 不需要真的产生 PNG
|
|
128
|
+
render: async (req) => {
|
|
129
|
+
recorded.renders.push(req);
|
|
130
|
+
return { images: [new Uint8Array([1, 2, 3])], cost: 1, renderer: "fake" };
|
|
131
|
+
}
|
|
132
|
+
},
|
|
133
|
+
adapters: {
|
|
134
|
+
register: provider => {
|
|
135
|
+
recorded.adapters.push(provider);
|
|
136
|
+
return remover(recorded.adapters, provider);
|
|
137
|
+
}
|
|
138
|
+
},
|
|
139
|
+
kvDrivers: {
|
|
140
|
+
register: driver => {
|
|
141
|
+
recorded.kvDrivers.push(driver);
|
|
142
|
+
return remover(recorded.kvDrivers, driver);
|
|
143
|
+
}
|
|
144
|
+
},
|
|
145
|
+
sql: {
|
|
146
|
+
open: async (plugin, name) => {
|
|
147
|
+
recorded.sqlOpened.push(`${plugin}/${name}`);
|
|
148
|
+
return sqlHandle;
|
|
149
|
+
},
|
|
150
|
+
close: async (plugin) => void recorded.sqlClosed.push(plugin)
|
|
151
|
+
},
|
|
152
|
+
bots: { pick: () => undefined }
|
|
153
|
+
};
|
|
154
|
+
return { hooks, recorded };
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* 创建最小应用视图
|
|
158
|
+
*
|
|
159
|
+
* 只填测试真正会读的字段,其余用类型断言留空 —— `AppView` 聚合了适配器、
|
|
160
|
+
* 账号、策略等一大票子系统视图,为一个上下文测试把它们全造出来毫无收益。
|
|
161
|
+
* 一旦某个用例真的要读某字段,就在这里补上真的实现。
|
|
162
|
+
* @returns 应用视图
|
|
163
|
+
*/
|
|
164
|
+
export function fakeAppView() {
|
|
165
|
+
return {
|
|
166
|
+
version: "0.0.0-test",
|
|
167
|
+
startedAt: 0,
|
|
168
|
+
usage: () => ({ rss: 0, heapUsed: 0, heapTotal: 0, external: 0, uptime: 0, cpu: 0 })
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* 创建假 HTTP 客户端
|
|
173
|
+
*
|
|
174
|
+
* 任何调用均抛错:网络请求出现在单元测试中几乎总属设计问题,应使其显式失败。
|
|
175
|
+
*
|
|
176
|
+
* 方法列表与 `HttpClient` 逐一对齐,且**不使用 as unknown as 断言** ——
|
|
177
|
+
* 经断言的替身对象会掩盖"契约已变更"一事:真实客户端新增一个方法后,
|
|
178
|
+
* 只有被测代码调用它时才在运行时抛错,而编译期不会报告任何问题。
|
|
179
|
+
* @returns HTTP 客户端
|
|
180
|
+
*/
|
|
181
|
+
export function fakeHttp() {
|
|
182
|
+
/** 统一拒绝 */
|
|
183
|
+
const fail = () => {
|
|
184
|
+
throw new Error("测试中不应发起真实 HTTP 请求");
|
|
185
|
+
};
|
|
186
|
+
const client = {
|
|
187
|
+
request: fail,
|
|
188
|
+
get: fail,
|
|
189
|
+
post: fail,
|
|
190
|
+
buffer: fail,
|
|
191
|
+
download: fail,
|
|
192
|
+
extend: () => client
|
|
193
|
+
};
|
|
194
|
+
return client;
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=fake.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fake.js","sourceRoot":"","sources":["../../src/testing/fake.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 模块职责:`@yunzai-ng/core/testing` 的入口,汇总内核提供的测试替身
|
|
3
|
+
* 依赖方向:只做转发
|
|
4
|
+
* 生命周期:无
|
|
5
|
+
* 注意事项:这些替身刻意**不**从主入口 `@yunzai-ng/core` 导出 —— 一并导出会使测试替身
|
|
6
|
+
* 进入生产依赖图(见 src/index.ts 的说明)。适配器与插件作者编写测试时:
|
|
7
|
+
* ```ts
|
|
8
|
+
* import { createMockAdapter, fakeLogger } from "@yunzai-ng/core/testing"
|
|
9
|
+
* ```
|
|
10
|
+
*
|
|
11
|
+
* 与内核自身那些 `*.test.ts` 的分工:后者是内部单元测试,直接以相对路径 import
|
|
12
|
+
* 内部模块;此处是**对外公开**的替身,因此每次改动均应视为 API 变更。
|
|
13
|
+
*/
|
|
14
|
+
export * from "./fake.js";
|
|
15
|
+
export * from "./mock-adapter.js";
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,cAAc,WAAW,CAAA;AACzB,cAAc,mBAAmB,CAAA"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 模块职责:`@yunzai-ng/core/testing` 的入口,汇总内核提供的测试替身
|
|
3
|
+
* 依赖方向:只做转发
|
|
4
|
+
* 生命周期:无
|
|
5
|
+
* 注意事项:这些替身刻意**不**从主入口 `@yunzai-ng/core` 导出 —— 一并导出会使测试替身
|
|
6
|
+
* 进入生产依赖图(见 src/index.ts 的说明)。适配器与插件作者编写测试时:
|
|
7
|
+
* ```ts
|
|
8
|
+
* import { createMockAdapter, fakeLogger } from "@yunzai-ng/core/testing"
|
|
9
|
+
* ```
|
|
10
|
+
*
|
|
11
|
+
* 与内核自身那些 `*.test.ts` 的分工:后者是内部单元测试,直接以相对路径 import
|
|
12
|
+
* 内部模块;此处是**对外公开**的替身,因此每次改动均应视为 API 变更。
|
|
13
|
+
*/
|
|
14
|
+
export * from "./fake.js";
|
|
15
|
+
export * from "./mock-adapter.js";
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,cAAc,WAAW,CAAA;AACzB,cAAc,mBAAmB,CAAA"}
|