mn-ws 0.1.0 → 0.2.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/assets/groups.json +10 -0
- package/assets/mn-ws/SKILL.md +55 -0
- package/assets/mn-ws/hooks.json +14 -0
- package/assets/mn-ws/install/inject-root.mjs +26 -0
- package/bin/ws.mjs +13 -0
- package/dist/core/auth.d.ts +194 -0
- package/dist/core/auth.d.ts.map +1 -0
- package/dist/core/auth.js +331 -0
- package/dist/core/auth.js.map +1 -0
- package/dist/core/brand.d.ts +11 -0
- package/dist/core/brand.d.ts.map +1 -0
- package/dist/core/brand.js +7 -0
- package/dist/core/brand.js.map +1 -0
- package/dist/core/bridge.d.ts +106 -0
- package/dist/core/bridge.d.ts.map +1 -0
- package/dist/core/bridge.js +308 -0
- package/dist/core/bridge.js.map +1 -0
- package/dist/core/config.d.ts +174 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +417 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/controller.d.ts +64 -0
- package/dist/core/controller.d.ts.map +1 -0
- package/dist/core/controller.js +100 -0
- package/dist/core/controller.js.map +1 -0
- package/dist/core/errors/index.d.ts +30 -0
- package/dist/core/errors/index.d.ts.map +1 -0
- package/dist/core/errors/index.js +88 -0
- package/dist/core/errors/index.js.map +1 -0
- package/dist/core/open.d.ts +3 -0
- package/dist/core/open.d.ts.map +1 -0
- package/dist/core/open.js +27 -0
- package/dist/core/open.js.map +1 -0
- package/dist/core/paths.d.ts +15 -0
- package/dist/core/paths.d.ts.map +1 -0
- package/dist/core/paths.js +50 -0
- package/dist/core/paths.js.map +1 -0
- package/dist/core/serve-port.d.ts +73 -0
- package/dist/core/serve-port.d.ts.map +1 -0
- package/dist/core/serve-port.js +134 -0
- package/dist/core/serve-port.js.map +1 -0
- package/dist/core/session.d.ts +78 -0
- package/dist/core/session.d.ts.map +1 -0
- package/dist/core/session.js +124 -0
- package/dist/core/session.js.map +1 -0
- package/dist/core/skills/bus.d.ts +29 -0
- package/dist/core/skills/bus.d.ts.map +1 -0
- package/dist/core/skills/bus.js +114 -0
- package/dist/core/skills/bus.js.map +1 -0
- package/dist/core/skills/get.d.ts +17 -0
- package/dist/core/skills/get.d.ts.map +1 -0
- package/dist/core/skills/get.js +87 -0
- package/dist/core/skills/get.js.map +1 -0
- package/dist/core/skills/handlers.d.ts +22 -0
- package/dist/core/skills/handlers.d.ts.map +1 -0
- package/dist/core/skills/handlers.js +86 -0
- package/dist/core/skills/handlers.js.map +1 -0
- package/dist/core/skills/index.d.ts +47 -0
- package/dist/core/skills/index.d.ts.map +1 -0
- package/dist/core/skills/index.js +268 -0
- package/dist/core/skills/index.js.map +1 -0
- package/dist/core/skills/install.d.ts +18 -0
- package/dist/core/skills/install.d.ts.map +1 -0
- package/dist/core/skills/install.js +123 -0
- package/dist/core/skills/install.js.map +1 -0
- package/dist/core/skills/text-util.d.ts +2 -0
- package/dist/core/skills/text-util.d.ts.map +1 -0
- package/dist/core/skills/text-util.js +14 -0
- package/dist/core/skills/text-util.js.map +1 -0
- package/dist/core/store.d.ts +29 -0
- package/dist/core/store.d.ts.map +1 -0
- package/dist/core/store.js +100 -0
- package/dist/core/store.js.map +1 -0
- package/dist/core/views.d.ts +11 -0
- package/dist/core/views.d.ts.map +1 -0
- package/dist/core/views.js +20 -0
- package/dist/core/views.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/modules/auth/index.d.ts +73 -0
- package/dist/modules/auth/index.d.ts.map +1 -0
- package/dist/modules/auth/index.js +64 -0
- package/dist/modules/auth/index.js.map +1 -0
- package/dist/modules/auth/service.d.ts +98 -0
- package/dist/modules/auth/service.d.ts.map +1 -0
- package/dist/modules/auth/service.js +200 -0
- package/dist/modules/auth/service.js.map +1 -0
- package/dist/modules/bridge/index.d.ts +73 -0
- package/dist/modules/bridge/index.d.ts.map +1 -0
- package/dist/modules/bridge/index.js +89 -0
- package/dist/modules/bridge/index.js.map +1 -0
- package/dist/modules/bridge/service.d.ts +75 -0
- package/dist/modules/bridge/service.d.ts.map +1 -0
- package/dist/modules/bridge/service.js +134 -0
- package/dist/modules/bridge/service.js.map +1 -0
- package/dist/modules/home/index.d.ts +95 -0
- package/dist/modules/home/index.d.ts.map +1 -0
- package/dist/modules/home/index.js +123 -0
- package/dist/modules/home/index.js.map +1 -0
- package/dist/modules/home/service.d.ts +48 -0
- package/dist/modules/home/service.d.ts.map +1 -0
- package/dist/modules/home/service.js +195 -0
- package/dist/modules/home/service.js.map +1 -0
- package/dist/modules/skill/index.d.ts +78 -0
- package/dist/modules/skill/index.d.ts.map +1 -0
- package/dist/modules/skill/index.js +132 -0
- package/dist/modules/skill/index.js.map +1 -0
- package/dist/runtime/api.d.ts +24 -0
- package/dist/runtime/api.d.ts.map +1 -0
- package/dist/runtime/api.js +140 -0
- package/dist/runtime/api.js.map +1 -0
- package/dist/runtime/cli.d.ts +23 -0
- package/dist/runtime/cli.d.ts.map +1 -0
- package/dist/runtime/cli.js +410 -0
- package/dist/runtime/cli.js.map +1 -0
- package/dist/runtime/help.d.ts +29 -0
- package/dist/runtime/help.d.ts.map +1 -0
- package/dist/runtime/help.js +89 -0
- package/dist/runtime/help.js.map +1 -0
- package/dist/runtime/registry.d.ts +318 -0
- package/dist/runtime/registry.d.ts.map +1 -0
- package/dist/runtime/registry.js +75 -0
- package/dist/runtime/registry.js.map +1 -0
- package/dist/runtime/server.d.ts +10 -0
- package/dist/runtime/server.d.ts.map +1 -0
- package/dist/runtime/server.js +127 -0
- package/dist/runtime/server.js.map +1 -0
- package/dist/runtime/spec.d.ts +32 -0
- package/dist/runtime/spec.d.ts.map +1 -0
- package/dist/runtime/spec.js +180 -0
- package/dist/runtime/spec.js.map +1 -0
- package/dist/runtime/types/action.d.ts +101 -0
- package/dist/runtime/types/action.d.ts.map +1 -0
- package/dist/runtime/types/action.js +19 -0
- package/dist/runtime/types/action.js.map +1 -0
- package/dist/runtime/types/client.d.ts +39 -0
- package/dist/runtime/types/client.d.ts.map +1 -0
- package/dist/runtime/types/client.js +2 -0
- package/dist/runtime/types/client.js.map +1 -0
- package/dist/runtime/types/http.d.ts +22 -0
- package/dist/runtime/types/http.d.ts.map +1 -0
- package/dist/runtime/types/http.js +6 -0
- package/dist/runtime/types/http.js.map +1 -0
- package/dist/runtime/types/module.d.ts +72 -0
- package/dist/runtime/types/module.d.ts.map +1 -0
- package/dist/runtime/types/module.js +15 -0
- package/dist/runtime/types/module.js.map +1 -0
- package/dist/web/public/assets/CliHints-BOxU-Duc.js +1 -0
- package/dist/web/public/assets/index-BTRKdMIW.js +50 -0
- package/dist/web/public/assets/index-BjGe8ggI.css +1 -0
- package/dist/web/public/assets/view-CE4tnCuy.js +1 -0
- package/dist/web/public/assets/view-CEQ2uPxE.js +1 -0
- package/dist/web/public/favicon-16.png +0 -0
- package/dist/web/public/favicon-32.png +0 -0
- package/dist/web/public/favicon-48.png +0 -0
- package/dist/web/public/favicon.ico +0 -0
- package/dist/web/public/index.html +19 -0
- package/dist/web/public/logo-rounded.png +0 -0
- package/dist/web/public/logo-rounded.svg +6 -0
- package/dist/web/public/logo.png +0 -0
- package/dist/web/public/logo.svg +6 -0
- package/package.json +56 -35
- package/README.md +0 -251
- package/bin/index.js +0 -714
- package/client/bridge-client.js +0 -160
- package/client/web.js +0 -234
- package/client/ws-client.js +0 -191
- package/lib/apps.js +0 -237
- package/lib/auth.js +0 -319
- package/lib/config.js +0 -534
- package/lib/index.js +0 -15
- package/lib/logger.js +0 -63
- package/lib/protocol.js +0 -208
- package/lib/store.js +0 -66
- package/server/auth.js +0 -274
- package/server/server.js +0 -752
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
// action 规格的解析、校验与文本生成。
|
|
2
|
+
//
|
|
3
|
+
// 一处声明,两端生效:CLI 的 `--flag` 与 HTTP 的 query/body 都走同一套强转与校验。
|
|
4
|
+
// 这正是历史上 `parseInt(flags.depth, 10) || 3` 散落在各处的根源——两端各写一遍解析,
|
|
5
|
+
// 迟早分叉。现在 depth 只在 action 声明里写一次 `{ type: 'number', default: 3 }`。
|
|
6
|
+
import { readFileSync } from 'node:fs';
|
|
7
|
+
import { badInput } from '../core/errors/index.js';
|
|
8
|
+
import { APP_NAME } from '../core/paths.js';
|
|
9
|
+
const TYPES = new Set(['string', 'number', 'boolean', 'array', 'json', 'kv']);
|
|
10
|
+
// 取 action 的 CLI 路径列表。支持两种写法:
|
|
11
|
+
// 单路径 cli: ['repo', 'list']
|
|
12
|
+
// 多路径 cli: [['bundled','list'], ['skill','install','--list']] ← 别名
|
|
13
|
+
export function cliPathsOf(action) {
|
|
14
|
+
const cli = action.cli;
|
|
15
|
+
if (!cli || !cli.length)
|
|
16
|
+
return [];
|
|
17
|
+
const first = cli[0];
|
|
18
|
+
return Array.isArray(first) ? cli : [cli];
|
|
19
|
+
}
|
|
20
|
+
export function argSpecsOf(action) {
|
|
21
|
+
return (action.args || []).map((a) => typeof a === 'string'
|
|
22
|
+
? { name: a, required: true }
|
|
23
|
+
: { ...a, required: a.required !== false });
|
|
24
|
+
}
|
|
25
|
+
export function flagSpecsOf(action) {
|
|
26
|
+
return Object.entries(action.flags || {}).map(([name, spec]) => ({ name, ...spec }));
|
|
27
|
+
}
|
|
28
|
+
// 该 action 里哪些 flag 是布尔型——CLI 解析据此决定要不要吃掉下一个 token 当值。
|
|
29
|
+
// 少了这份信息,`skill install --force demo` 会把 force 解析成字符串 'demo'。
|
|
30
|
+
export function booleanFlagNames(action) {
|
|
31
|
+
return new Set(flagSpecsOf(action)
|
|
32
|
+
.filter((f) => (f.type || 'string') === 'boolean')
|
|
33
|
+
.map((f) => f.name));
|
|
34
|
+
}
|
|
35
|
+
function coerceOne(name, spec, raw) {
|
|
36
|
+
const type = spec.type || 'string';
|
|
37
|
+
if (!TYPES.has(type))
|
|
38
|
+
throw new Error(`action 声明有误:flag "${name}" 的 type 非法 (${type})`);
|
|
39
|
+
if (raw === undefined || raw === null)
|
|
40
|
+
return undefined;
|
|
41
|
+
// 需要值的 flag 写在末尾时(`--depth` 后面没跟东西),解析器只能记成 true。
|
|
42
|
+
// 放任下去:Number(true) === 1 会静默变成「深度 1」这种另一个合法值,
|
|
43
|
+
// String(true) 则会让路径变成 'true'。宁可报错,也不要把笔误变成别的语义。
|
|
44
|
+
if (raw === true && type !== 'boolean') {
|
|
45
|
+
throw badInput(`参数 --${name} 需要提供值`);
|
|
46
|
+
}
|
|
47
|
+
if (type === 'boolean') {
|
|
48
|
+
if (typeof raw === 'boolean')
|
|
49
|
+
return raw;
|
|
50
|
+
const s = String(raw).toLowerCase();
|
|
51
|
+
return !(s === 'false' || s === '0' || s === 'no' || s === '');
|
|
52
|
+
}
|
|
53
|
+
if (type === 'number') {
|
|
54
|
+
const n = Number(raw);
|
|
55
|
+
if (!Number.isFinite(n))
|
|
56
|
+
throw badInput(`参数 ${name} 必须是数字,收到: ${raw}`);
|
|
57
|
+
return n;
|
|
58
|
+
}
|
|
59
|
+
if (type === 'array') {
|
|
60
|
+
if (Array.isArray(raw))
|
|
61
|
+
return raw.map((x) => String(x).trim()).filter(Boolean);
|
|
62
|
+
return String(raw).split(',').map((x) => x.trim()).filter(Boolean);
|
|
63
|
+
}
|
|
64
|
+
if (type === 'json') {
|
|
65
|
+
// HTTP 侧直接就是对象/数组;CLI 侧是字符串:`--groups '[{…}]'` 或 `--groups @groups.json`
|
|
66
|
+
if (typeof raw === 'object')
|
|
67
|
+
return raw;
|
|
68
|
+
const s = String(raw).trim();
|
|
69
|
+
if (s.startsWith('@')) {
|
|
70
|
+
const p = s.slice(1);
|
|
71
|
+
try {
|
|
72
|
+
return JSON.parse(readFileSync(p, 'utf8'));
|
|
73
|
+
}
|
|
74
|
+
catch (e) {
|
|
75
|
+
throw badInput(`参数 --${name} 读取文件失败: ${p}(${e.message})`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
try {
|
|
79
|
+
return JSON.parse(s);
|
|
80
|
+
}
|
|
81
|
+
catch (e) {
|
|
82
|
+
throw badInput(`参数 --${name} 不是合法 JSON: ${e.message}`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
if (type === 'kv') {
|
|
86
|
+
// CLI:`--set name=值`(可重复,解析器会把同名 flag 收成数组)
|
|
87
|
+
// HTTP:`{set: {name: '值'}}` 或 `{set: ['name=值']}`
|
|
88
|
+
if (raw && typeof raw === 'object' && !Array.isArray(raw))
|
|
89
|
+
return { ...raw };
|
|
90
|
+
const list = Array.isArray(raw) ? raw : [raw];
|
|
91
|
+
const out = {};
|
|
92
|
+
for (const item of list) {
|
|
93
|
+
const s = String(item);
|
|
94
|
+
const eq = s.indexOf('=');
|
|
95
|
+
if (eq <= 0)
|
|
96
|
+
throw badInput(`参数 --${name} 需要 key=value 形式,收到 ${JSON.stringify(item)}`);
|
|
97
|
+
out[s.slice(0, eq).trim()] = s.slice(eq + 1);
|
|
98
|
+
}
|
|
99
|
+
return out;
|
|
100
|
+
}
|
|
101
|
+
return String(raw);
|
|
102
|
+
}
|
|
103
|
+
// 按声明校验并强转输入。未声明的键原样透传(HTTP body 可能带界面用的额外字段)。
|
|
104
|
+
export function applySpec(action, raw) {
|
|
105
|
+
const out = { ...raw };
|
|
106
|
+
for (const spec of flagSpecsOf(action)) {
|
|
107
|
+
const v = coerceOne(spec.name, spec, raw[spec.name]);
|
|
108
|
+
if (v === undefined) {
|
|
109
|
+
if (spec.default !== undefined)
|
|
110
|
+
out[spec.name] = spec.default;
|
|
111
|
+
else if (spec.required)
|
|
112
|
+
throw inputError(action, `缺少参数 --${spec.name}`);
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
if (spec.enum && !spec.enum.includes(v)) {
|
|
116
|
+
throw inputError(action, `参数 --${spec.name} 只能是 ${spec.enum.join(' | ')},收到: ${v}`);
|
|
117
|
+
}
|
|
118
|
+
out[spec.name] = v;
|
|
119
|
+
}
|
|
120
|
+
for (const spec of argSpecsOf(action)) {
|
|
121
|
+
const v = out[spec.name];
|
|
122
|
+
const empty = v === undefined || v === '' || (Array.isArray(v) && !v.length);
|
|
123
|
+
if (empty && spec.required)
|
|
124
|
+
throw inputError(action, `缺少参数 <${spec.name}>`);
|
|
125
|
+
}
|
|
126
|
+
return out;
|
|
127
|
+
}
|
|
128
|
+
const ROUTE_CACHE = new WeakMap();
|
|
129
|
+
export function compileRoute(action) {
|
|
130
|
+
const cached = ROUTE_CACHE.get(action);
|
|
131
|
+
if (cached)
|
|
132
|
+
return cached;
|
|
133
|
+
const [method, pattern] = action.http;
|
|
134
|
+
const keys = [];
|
|
135
|
+
const body = pattern
|
|
136
|
+
.split('/')
|
|
137
|
+
.map((seg) => {
|
|
138
|
+
if (!seg.startsWith(':'))
|
|
139
|
+
return seg.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
140
|
+
keys.push(seg.slice(1));
|
|
141
|
+
return '([^/]+)';
|
|
142
|
+
})
|
|
143
|
+
.join('/');
|
|
144
|
+
const compiled = { method, keys, regex: new RegExp('^' + body + '$') };
|
|
145
|
+
ROUTE_CACHE.set(action, compiled);
|
|
146
|
+
return compiled;
|
|
147
|
+
}
|
|
148
|
+
// ---- 用法串生成:从声明反推,help 因此不可能与实际命令脱节 ----
|
|
149
|
+
export function usageOf(action) {
|
|
150
|
+
const [path] = cliPathsOf(action);
|
|
151
|
+
const parts = [APP_NAME, ...(path || [])];
|
|
152
|
+
for (const a of argSpecsOf(action)) {
|
|
153
|
+
const label = a.rest ? `${a.name}...` : a.name;
|
|
154
|
+
parts.push(a.required ? `<${label}>` : `[${label}]`);
|
|
155
|
+
}
|
|
156
|
+
for (const f of flagSpecsOf(action)) {
|
|
157
|
+
let token;
|
|
158
|
+
if (f.type === 'boolean') {
|
|
159
|
+
token = `--${f.name}`;
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
// 值的占位符优先用 enum 展开(--side <ours|theirs>),其次显式 hint,
|
|
163
|
+
// 最后才退回 flag 名——`--http <http>` 这种读起来没有信息量。
|
|
164
|
+
const hint = f.enum ? f.enum.join('|') : f.hint || f.name;
|
|
165
|
+
token = `--${f.name} <${hint}>`;
|
|
166
|
+
}
|
|
167
|
+
parts.push(f.required ? token : `[${token}]`);
|
|
168
|
+
}
|
|
169
|
+
// 开放式 action:可选项由数据驱动(模板的 option schema),
|
|
170
|
+
// 声明期无法枚举。用一句提示代替逐个列出,读者才知道还有别的开关。
|
|
171
|
+
if (action.openFlags)
|
|
172
|
+
parts.push('[--<选项> <值> ...]');
|
|
173
|
+
return parts.join(' ');
|
|
174
|
+
}
|
|
175
|
+
// 「用法:」前缀是**对外契约**:assets 文档教 agent 用错误文本里的「用法:」
|
|
176
|
+
// 判定为参数错误并决定「停下来问人」。不能只写「缺少参数 X」,必须带完整用法串。
|
|
177
|
+
function inputError(action, detail) {
|
|
178
|
+
return badInput(`用法: ${usageOf(action)} —— ${detail}`);
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec.js","sourceRoot":"","sources":["../../src/runtime/spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import type { ParamsCovered } from './http.js';
|
|
2
|
+
export type FlagType = 'string' | 'number' | 'boolean' | 'array' | 'json' | 'kv';
|
|
3
|
+
export interface FlagSpec {
|
|
4
|
+
type?: FlagType;
|
|
5
|
+
default?: unknown;
|
|
6
|
+
required?: boolean;
|
|
7
|
+
enum?: readonly unknown[];
|
|
8
|
+
hint?: string;
|
|
9
|
+
}
|
|
10
|
+
export type ArgEntry = string | {
|
|
11
|
+
name: string;
|
|
12
|
+
required?: boolean;
|
|
13
|
+
rest?: boolean;
|
|
14
|
+
};
|
|
15
|
+
export interface TransportMeta {
|
|
16
|
+
transport: 'cli' | 'http';
|
|
17
|
+
}
|
|
18
|
+
export type Err<Msg extends string> = {
|
|
19
|
+
readonly __error__: Msg;
|
|
20
|
+
};
|
|
21
|
+
export type Assert<Cond extends boolean, Msg extends string> = Cond extends true ? unknown : Err<Msg>;
|
|
22
|
+
export type FlagValue<F> = F extends {
|
|
23
|
+
type: 'number';
|
|
24
|
+
} ? number : F extends {
|
|
25
|
+
type: 'boolean';
|
|
26
|
+
} ? boolean : F extends {
|
|
27
|
+
type: 'array';
|
|
28
|
+
} ? string[] : F extends {
|
|
29
|
+
enum: infer E;
|
|
30
|
+
} ? E extends readonly unknown[] ? E[number] : string : string;
|
|
31
|
+
export type IsPresent<F> = F extends {
|
|
32
|
+
default: unknown;
|
|
33
|
+
} ? true : F extends {
|
|
34
|
+
required: true;
|
|
35
|
+
} ? true : false;
|
|
36
|
+
export type CtxFlags<F> = unknown & {
|
|
37
|
+
[K in keyof F as IsPresent<F[K]> extends true ? K : never]: FlagValue<F[K]>;
|
|
38
|
+
} & {
|
|
39
|
+
[K in keyof F as IsPresent<F[K]> extends true ? never : K]?: FlagValue<F[K]>;
|
|
40
|
+
};
|
|
41
|
+
export type UnionToIntersection<U> = (U extends unknown ? (x: U) => void : never) extends (x: infer I) => void ? I : never;
|
|
42
|
+
export type CtxArgs<As> = UnionToIntersection<As extends readonly (infer A)[] ? A extends string ? {
|
|
43
|
+
[K in A]: string;
|
|
44
|
+
} : A extends {
|
|
45
|
+
name: infer N extends string;
|
|
46
|
+
} ? A extends {
|
|
47
|
+
required: false;
|
|
48
|
+
} ? {
|
|
49
|
+
[K in N]?: A extends {
|
|
50
|
+
rest: true;
|
|
51
|
+
} ? string[] : string;
|
|
52
|
+
} : {
|
|
53
|
+
[K in N]: A extends {
|
|
54
|
+
rest: true;
|
|
55
|
+
} ? string[] : string;
|
|
56
|
+
} : never : never>;
|
|
57
|
+
export type CtxOf<A> = unknown & (A extends {
|
|
58
|
+
flags: infer F;
|
|
59
|
+
} ? CtxFlags<F> : unknown) & (A extends {
|
|
60
|
+
args: infer As;
|
|
61
|
+
} ? CtxArgs<As> : unknown) & (A extends {
|
|
62
|
+
openFlags: true;
|
|
63
|
+
} ? {
|
|
64
|
+
[k: string]: unknown;
|
|
65
|
+
} : unknown);
|
|
66
|
+
export interface ActionShape {
|
|
67
|
+
id: string;
|
|
68
|
+
cli: readonly string[] | readonly (readonly string[])[];
|
|
69
|
+
http?: readonly [string, string] | null;
|
|
70
|
+
/** 纯 CLI 的显式出口:http 必须同时为 null;表示「这个操作就是不给面板入口」 */
|
|
71
|
+
web?: boolean;
|
|
72
|
+
summary?: string;
|
|
73
|
+
args?: readonly ArgEntry[];
|
|
74
|
+
flags?: Record<string, FlagSpec>;
|
|
75
|
+
openFlags?: boolean;
|
|
76
|
+
}
|
|
77
|
+
type FlagsLegal<A> = A extends {
|
|
78
|
+
flags: infer F;
|
|
79
|
+
} ? {
|
|
80
|
+
[K in keyof F]: F[K] extends {
|
|
81
|
+
type: infer T;
|
|
82
|
+
} ? T extends FlagType ? true : false : true;
|
|
83
|
+
}[keyof F] extends true ? true : false : true;
|
|
84
|
+
type HttpLegal<A> = A extends {
|
|
85
|
+
http: infer H;
|
|
86
|
+
} ? H extends readonly [string, string] ? true : H extends null ? true : false : true;
|
|
87
|
+
export type ValidateAction<A> = unknown & Assert<FlagsLegal<A>, 'flag 的 type 只能是 string | number | boolean | array'> & Assert<HttpLegal<A>, 'http 必须是 [METHOD, PATTERN] 或显式 null'> & Assert<ParamsCovered<A>, '路由 :param 与 args 名不一致(运行时会静默变 undefined)'>;
|
|
88
|
+
export type RunResult<A> = A extends {
|
|
89
|
+
run: (...a: any[]) => infer R;
|
|
90
|
+
} ? Awaited<R> : never;
|
|
91
|
+
export interface ActionDefinition<A> extends ActionShape {
|
|
92
|
+
run: (ctx: CtxOf<A>, meta: TransportMeta) => unknown;
|
|
93
|
+
render?: (result: RunResult<A>, ctx: CtxOf<A>) => unknown;
|
|
94
|
+
}
|
|
95
|
+
export type TypedAction<S, R> = S & {
|
|
96
|
+
run: (ctx: CtxOf<S>, meta?: TransportMeta) => R;
|
|
97
|
+
render?: (result: Awaited<R>, ctx?: CtxOf<S>) => string | Promise<string>;
|
|
98
|
+
};
|
|
99
|
+
export declare function defineAction<const S>(spec: S & ActionShape & ValidateAction<S>): <R>(run: (ctx: CtxOf<S>, meta: TransportMeta) => R, render?: (result: Awaited<R>, ctx: CtxOf<S>) => string | Promise<string>) => TypedAction<S, Awaited<R>>;
|
|
100
|
+
export {};
|
|
101
|
+
//# sourceMappingURL=action.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../../src/runtime/types/action.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// action 类型系统的核心。
|
|
2
|
+
//
|
|
3
|
+
// 一份 action 声明字面量同时产出:
|
|
4
|
+
// 运行时 —— spec.js 的强转/校验/help 派生(原样保留)
|
|
5
|
+
// 编译期 —— CtxOf 推出 ctx 形状;run 返回值推出 render 参数与 API 响应类型
|
|
6
|
+
//
|
|
7
|
+
// 报错手法:Assert<条件, 消息> 在条件不成立时让参数类型长出 __error__ 字段,
|
|
8
|
+
// 调用处对象缺该字段即报红,消息直接展示在错误信息里。
|
|
9
|
+
// 唯一入口,两段式:
|
|
10
|
+
// 第一段 defineAction(声明):const 参数推断并保留字面量,执行声明级校验;
|
|
11
|
+
// 第二段 (run, render?):ctx 被 CtxOf<S> 精确上下文类型化,
|
|
12
|
+
// render 参数由 run 返回值推出。
|
|
13
|
+
//
|
|
14
|
+
// 为什么不是单调用:自引用泛型(同对象内从 flags 推 run 的 ctx)在 TS 中会
|
|
15
|
+
// 退化成 any/unknown(实测 TS 5.9 仍如此);两段式把推断顺序显式化,零歧义。
|
|
16
|
+
export function defineAction(spec) {
|
|
17
|
+
return (run, render) => ({ ...spec, run, render });
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=action.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action.js","sourceRoot":"","sources":["../../../src/runtime/types/action.ts"],"names":[],"mappings":"AAAA,kBAAkB;AAClB,EAAE;AACF,uBAAuB;AACvB,wCAAwC;AACxC,yDAAyD;AACzD,EAAE;AACF,mDAAmD;AACnD,6BAA6B;AA+I7B,YAAY;AACZ,mDAAmD;AACnD,gDAAgD;AAChD,iDAAiD;AACjD,EAAE;AACF,iDAAiD;AACjD,kDAAkD;AAClD,MAAM,UAAU,YAAY,CAAU,IAAyC;IAC7E,OAAO,CACL,GAA8C,EAC9C,MAAwE,EAC5C,EAAE,CAAC,CAAC,EAAE,GAAI,IAAe,EAAE,GAAG,EAAE,MAAM,EAAiC,CAAA,CAAC;AACxG,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { ArgEntry, FlagSpec } from './action.js';
|
|
2
|
+
import type { ActionIds, AllActions } from './module.js';
|
|
3
|
+
export type FindAction<AA extends readonly unknown[], Id> = AA extends readonly [
|
|
4
|
+
infer H,
|
|
5
|
+
...infer R
|
|
6
|
+
] ? H extends {
|
|
7
|
+
id: Id;
|
|
8
|
+
} ? H : FindAction<R extends readonly unknown[] ? R : [], Id> : never;
|
|
9
|
+
export type PatternParams<P extends string> = P extends `${string}:${infer K}/${infer Rest}` ? K | PatternParams<`/${Rest}`> : P extends `${string}:${infer K}` ? K : never;
|
|
10
|
+
type FlagInputValue<F extends FlagSpec> = F['type'] extends 'boolean' ? boolean : F['type'] extends 'number' ? number : F['type'] extends 'array' ? string[] | string : F['enum'] extends readonly (infer E)[] ? E : string;
|
|
11
|
+
type Empty = {};
|
|
12
|
+
export type FlagInputOf<A> = A extends {
|
|
13
|
+
flags: infer F;
|
|
14
|
+
} ? {
|
|
15
|
+
[K in keyof F]?: F[K] extends FlagSpec ? FlagInputValue<F[K]> : unknown;
|
|
16
|
+
} : Empty;
|
|
17
|
+
type ArgObjects<Args> = Extract<Args extends readonly unknown[] ? Args[number] : never, {
|
|
18
|
+
name: string;
|
|
19
|
+
}>;
|
|
20
|
+
type RequiredArgInput<Args extends readonly ArgEntry[]> = {
|
|
21
|
+
[E in ArgObjects<Args> as E['required'] extends true ? E['name'] : never]: E['rest'] extends true ? string[] : string | number;
|
|
22
|
+
};
|
|
23
|
+
type OptionalArgInput<Args extends readonly ArgEntry[]> = {
|
|
24
|
+
[E in ArgObjects<Args> as E['required'] extends true ? never : E['name']]?: E['rest'] extends true ? string[] : string | number;
|
|
25
|
+
};
|
|
26
|
+
export type ArgInputOf<A> = A extends {
|
|
27
|
+
args: infer Args;
|
|
28
|
+
} ? Args extends readonly ArgEntry[] ? RequiredArgInput<Args> & OptionalArgInput<Args> : Empty : Empty;
|
|
29
|
+
export type CallParams<A> = (A extends {
|
|
30
|
+
http: readonly [string, infer P extends string];
|
|
31
|
+
} ? PatternParams<P> extends never ? Empty : Record<PatternParams<P>, string | number> : Empty) & ArgInputOf<A> & FlagInputOf<A>;
|
|
32
|
+
export type CallResult<A> = A extends {
|
|
33
|
+
run: (...a: any[]) => infer R;
|
|
34
|
+
} ? Awaited<R> : unknown;
|
|
35
|
+
export type TypedClient<M extends readonly unknown[]> = ActionIds<AllActions<M>> extends infer Ids extends readonly string[] ? {
|
|
36
|
+
[Id in Ids[number]]: (params: CallParams<FindAction<AllActions<M>, Id>>) => Promise<CallResult<FindAction<AllActions<M>, Id>>>;
|
|
37
|
+
} : Empty;
|
|
38
|
+
export {};
|
|
39
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/runtime/types/client.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzD,MAAM,MAAM,UAAU,CAAC,EAAE,SAAS,SAAS,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,SAAS;IAC9E,MAAM,CAAC;IACP,GAAG,MAAM,CAAC;CACX,GACG,CAAC,SAAS;IAAE,EAAE,EAAE,EAAE,CAAA;CAAE,GAClB,CAAC,GACD,UAAU,CAAC,CAAC,SAAS,SAAS,OAAO,EAAE,GAAG,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,GACvD,KAAK,CAAC;AAGV,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,MAAM,IAAI,CAAC,SAAS,GAAG,MAAM,IAAI,MAAM,CAAC,IAAI,MAAM,IAAI,EAAE,GACxF,CAAC,GAAG,aAAa,CAAC,IAAI,IAAI,EAAE,CAAC,GAC7B,CAAC,SAAS,GAAG,MAAM,IAAI,MAAM,CAAC,EAAE,GAC9B,CAAC,GACD,KAAK,CAAC;AAGZ,KAAK,cAAc,CAAC,CAAC,SAAS,QAAQ,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,SAAS,GACjE,OAAO,GACP,CAAC,CAAC,MAAM,CAAC,SAAS,QAAQ,GACxB,MAAM,GACN,CAAC,CAAC,MAAM,CAAC,SAAS,OAAO,GACvB,MAAM,EAAE,GAAG,MAAM,GACjB,CAAC,CAAC,MAAM,CAAC,SAAS,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,GACpC,CAAC,GACD,MAAM,CAAC;AAIjB,KAAK,KAAK,GAAG,EAAE,CAAC;AAGhB,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,CAAC,SAAS;IAAE,KAAK,EAAE,MAAM,CAAC,CAAA;CAAE,GACrD;KAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,QAAQ,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO;CAAE,GAC3E,KAAK,CAAC;AAOV,KAAK,UAAU,CAAC,IAAI,IAAI,OAAO,CAC7B,IAAI,SAAS,SAAS,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,KAAK,EACtD;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CACjB,CAAC;AAEF,KAAK,gBAAgB,CAAC,IAAI,SAAS,SAAS,QAAQ,EAAE,IAAI;KACvD,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,SAAS,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,SAAS,IAAI,GAC7F,MAAM,EAAE,GACR,MAAM,GAAG,MAAM;CACpB,CAAC;AACF,KAAK,gBAAgB,CAAC,IAAI,SAAS,SAAS,QAAQ,EAAE,IAAI;KACvD,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,SAAS,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,IAAI,GAC9F,MAAM,EAAE,GACR,MAAM,GAAG,MAAM;CACpB,CAAC;AACF,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI,CAAC,SAAS;IAAE,IAAI,EAAE,MAAM,IAAI,CAAA;CAAE,GACtD,IAAI,SAAS,SAAS,QAAQ,EAAE,GAC9B,gBAAgB,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,IAAI,CAAC,GAC/C,KAAK,GACP,KAAK,CAAC;AAGV,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS;IAAE,IAAI,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,SAAS,MAAM,CAAC,CAAA;CAAE,GACtF,aAAa,CAAC,CAAC,CAAC,SAAS,KAAK,GAC5B,KAAK,GACL,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,GAC3C,KAAK,CAAC,GACR,UAAU,CAAC,CAAC,CAAC,GACb,WAAW,CAAC,CAAC,CAAC,CAAC;AAGjB,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI,CAAC,SAAS;IAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,KAAK,MAAM,CAAC,CAAA;CAAE,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;AAG/F,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,SAAS,OAAO,EAAE,IAAI,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,MAAM,GAAG,SACxF,SAAS,MAAM,EAAE,GACvB;KACG,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CACnB,MAAM,EAAE,UAAU,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAC9C,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;CACxD,GACD,KAAK,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/runtime/types/client.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export type RouteParams<P extends string> = P extends `${string}:${infer Rest}` ? Rest extends `${infer Name}/${infer More}` ? Name | RouteParams<`/${More}`> : Rest : never;
|
|
2
|
+
export type ArgNames<A> = A extends {
|
|
3
|
+
args: infer As;
|
|
4
|
+
} ? As extends readonly unknown[] ? As[number] extends infer X ? X extends string ? X : X extends {
|
|
5
|
+
name: infer N;
|
|
6
|
+
} ? N : never : never : never : never;
|
|
7
|
+
type PatternOf<A> = A extends {
|
|
8
|
+
http: infer H;
|
|
9
|
+
} ? H extends readonly [string, infer P] ? P : never : never;
|
|
10
|
+
export type ParamsCovered<A> = [RouteParams<PatternOf<A>>] extends [never] ? true : RouteParams<PatternOf<A>> extends ArgNames<A> ? true : false;
|
|
11
|
+
type Segs<P extends string> = P extends `${infer H}/${infer R}` ? [H, ...Segs<R>] : [P];
|
|
12
|
+
type SegMatch<A extends string, B extends string> = A extends `:${string}` ? true : B extends `:${string}` ? true : A extends B ? true : false;
|
|
13
|
+
type SameLenCompat<X extends readonly string[], Y extends readonly string[]> = X extends readonly [
|
|
14
|
+
infer XH extends string,
|
|
15
|
+
...infer XR extends string[]
|
|
16
|
+
] ? Y extends readonly [infer YH extends string, ...infer YR extends string[]] ? SegMatch<XH, YH> extends true ? SameLenCompat<XR, YR> : false : false : true;
|
|
17
|
+
export type Overlap<P extends string, Q extends string> = Segs<P>['length'] extends Segs<Q>['length'] ? SameLenCompat<Segs<P>, Segs<Q>> : false;
|
|
18
|
+
export type AmbiguousPairs<Ps extends readonly string[], I extends unknown[] = []> = I['length'] extends Ps['length'] ? never : Ps[I['length'] & number] extends infer P extends string ? {
|
|
19
|
+
[J in keyof Ps]: J extends `${I['length']}` ? never : Overlap<P, Ps[J] extends string ? Ps[J] : never> extends true ? `${P} ≈ ${Ps[J]}` : never;
|
|
20
|
+
}[number] | AmbiguousPairs<Ps, [...I, 1]> : never;
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../src/runtime/types/http.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/runtime/types/http.ts"],"names":[],"mappings":"AAAA,YAAY;AACZ,0DAA0D;AAC1D,0DAA0D;AAC1D,yDAAyD"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import type { Assert, Err } from './action.js';
|
|
2
|
+
import type { AmbiguousPairs } from './http.js';
|
|
3
|
+
export interface ModuleShape<A extends readonly unknown[]> {
|
|
4
|
+
id: string;
|
|
5
|
+
title: string;
|
|
6
|
+
order?: number;
|
|
7
|
+
actions: A;
|
|
8
|
+
}
|
|
9
|
+
export interface AnyModule {
|
|
10
|
+
id: string;
|
|
11
|
+
title: string;
|
|
12
|
+
order?: number;
|
|
13
|
+
actions: readonly unknown[];
|
|
14
|
+
}
|
|
15
|
+
export declare function defineModule<const M>(m: M & {
|
|
16
|
+
id: string;
|
|
17
|
+
title: string;
|
|
18
|
+
actions: readonly unknown[];
|
|
19
|
+
}): M;
|
|
20
|
+
export type Includes<T extends readonly unknown[], V> = T extends readonly [infer H, ...infer R] ? [H] extends [V] ? [V] extends [H] ? true : Includes<R, V> : Includes<R, V> : false;
|
|
21
|
+
export type Dup<T extends readonly unknown[], Seen extends readonly unknown[] = []> = T extends readonly [
|
|
22
|
+
infer H,
|
|
23
|
+
...infer R
|
|
24
|
+
] ? Includes<Seen, H> extends true ? H | Dup<R, Seen> : Dup<R, [...Seen, H]> : never;
|
|
25
|
+
type JoinPath<T extends readonly string[]> = T extends readonly [infer H extends string] ? H : T extends readonly [infer H extends string, ...infer R extends readonly string[]] ? `${H} ${JoinPath<R>}` : '';
|
|
26
|
+
export type CliKey<A> = A extends {
|
|
27
|
+
cli: infer C;
|
|
28
|
+
} ? C extends readonly string[] ? C[0] extends string ? JoinPath<C> : C[number] extends infer P ? P extends readonly string[] ? JoinPath<P> : never : never : never : never;
|
|
29
|
+
export type HttpKey<A> = A extends {
|
|
30
|
+
http: infer H;
|
|
31
|
+
} ? H extends readonly [string, string] ? `${H[0]} ${H[1]}` : never : never;
|
|
32
|
+
type ActionsOf<M> = M extends {
|
|
33
|
+
actions: infer A extends readonly unknown[];
|
|
34
|
+
} ? A : [];
|
|
35
|
+
export type AllActions<M extends readonly unknown[]> = M extends readonly [infer H, ...infer R] ? [...ActionsOf<H>, ...AllActions<R extends readonly unknown[] ? R : []>] : [];
|
|
36
|
+
export type ModuleIds<M> = M extends readonly unknown[] ? {
|
|
37
|
+
[K in keyof M]: M[K] extends {
|
|
38
|
+
id: infer I;
|
|
39
|
+
} ? I : never;
|
|
40
|
+
} : [];
|
|
41
|
+
export type ActionIds<AA> = AA extends readonly unknown[] ? {
|
|
42
|
+
[K in keyof AA]: AA[K] extends {
|
|
43
|
+
id: infer I;
|
|
44
|
+
} ? I : never;
|
|
45
|
+
} : [];
|
|
46
|
+
export type ActionCliKeys<AA> = AA extends readonly unknown[] ? {
|
|
47
|
+
[K in keyof AA]: CliKey<AA[K]>;
|
|
48
|
+
} : [];
|
|
49
|
+
export type ActionHttpKeys<AA> = AA extends readonly unknown[] ? {
|
|
50
|
+
[K in keyof AA]: HttpKey<AA[K]>;
|
|
51
|
+
} : [];
|
|
52
|
+
export type FilterNever<T extends readonly unknown[]> = T extends readonly [infer H, ...infer R] ? [H] extends [never] ? FilterNever<R> : [H, ...FilterNever<R>] : [];
|
|
53
|
+
export type ActionPatterns<AA> = FilterNever<AA extends readonly unknown[] ? {
|
|
54
|
+
[K in keyof AA]: AA[K] extends {
|
|
55
|
+
http: infer H;
|
|
56
|
+
} ? H extends readonly [infer M, infer P] ? M extends string ? P extends string ? `${M} ${P}` : never : never : never : never;
|
|
57
|
+
} : []>;
|
|
58
|
+
export type RegistryChecks<M extends readonly unknown[]> = unknown & Assert<[
|
|
59
|
+
Dup<ModuleIds<M>>
|
|
60
|
+
] extends [never] ? true : false, '模块 id 重复'> & Assert<[
|
|
61
|
+
Dup<ActionIds<AllActions<M>>>
|
|
62
|
+
] extends [never] ? true : false, 'action id 重复'> & Assert<[
|
|
63
|
+
Dup<ActionCliKeys<AllActions<M>>>
|
|
64
|
+
] extends [never] ? true : false, 'CLI 命令路径重复'> & Assert<[
|
|
65
|
+
Dup<ActionHttpKeys<AllActions<M>>>
|
|
66
|
+
] extends [never] ? true : false, 'HTTP 路由重复'> & Assert<[
|
|
67
|
+
AmbiguousPairs<ActionPatterns<AllActions<M>>>
|
|
68
|
+
] extends [never] ? true : false, '存在结构性歧义的路由(不同模式匹配同一批 URL,任何排序都无法区分)'>;
|
|
69
|
+
export declare function defineModules<const M extends readonly AnyModule[]>(modules: M & RegistryChecks<M>): M;
|
|
70
|
+
export type CheckedModules<M extends readonly unknown[]> = M & RegistryChecks<M>;
|
|
71
|
+
export type { Err };
|
|
72
|
+
//# sourceMappingURL=module.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../src/runtime/types/module.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// 模块与注册表的类型系统。
|
|
2
|
+
//
|
|
3
|
+
// defineModule:约束单个模块形状(id/title/actions)。
|
|
4
|
+
// defineModules:模块汇总处的"编译期装载检查",把 registry.js 运行时循环
|
|
5
|
+
// (重复模块 id / action id / CLI 路径 / HTTP 路由 + 路由歧义)前移成编译错误。
|
|
6
|
+
// 用裸泛型 M 承接整个字面量:id/actions 的字面量形状原样保留,
|
|
7
|
+
// 同时交叉类型保证必填字段存在。
|
|
8
|
+
export function defineModule(m) {
|
|
9
|
+
return m;
|
|
10
|
+
}
|
|
11
|
+
// 汇总入口:运行时按 order 排序;类型层执行全部装载检查。
|
|
12
|
+
export function defineModules(modules) {
|
|
13
|
+
return [...modules].sort((a, b) => (a.order ?? 100) - (b.order ?? 100));
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module.js","sourceRoot":"","sources":["../../../src/runtime/types/module.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,EAAE;AACF,2CAA2C;AAC3C,oDAAoD;AACpD,0DAA0D;AAoB1D,wCAAwC;AACxC,kBAAkB;AAClB,MAAM,UAAU,YAAY,CAC1B,CAAiE;IAEjE,OAAO,CAAC,CAAC;AACX,CAAC;AA2HD,kCAAkC;AAClC,MAAM,UAAU,aAAa,CAC3B,OAA8B;IAE9B,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,CAAiB,CAAC;AAC1F,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{u as c,j as s,r as t,C as m}from"./index-BTRKdMIW.js";function d({module:n}){const{boot:l}=c(),a=((l==null?void 0:l.commands)||[]).filter(e=>e.module===n);return a.length?s.jsxs("div",{className:"cli-hint",children:[s.jsx("span",{className:"cli-hint-label",children:"这个页面上的每个按钮都有一条同构的 CLI 命令"}),a.map((e,i)=>s.jsxs(t.Fragment,{children:[i>0&&s.jsx("span",{className:"cli-hint-sep",children:" · "}),s.jsx(m,{className:"cli-cmd",text:e.command,title:`点击复制:${e.usage}`,children:e.command})]},e.id)),s.jsxs("span",{className:"cli-hint-tail",children:["。加 ",s.jsx("code",{className:"cli-hint-flag",children:"--json"})," 得机器可读输出。"]})]}):null}export{d as C};
|