@jsbot-tellus/core 2.5.1 → 2.6.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/dist/core/plugin/params/declaration.d.ts.map +1 -1
- package/dist/core/plugin/params/declaration.js +67 -4
- package/dist/core/plugin/params/declaration.js.map +1 -1
- package/dist/core/plugin/params/input.d.ts.map +1 -1
- package/dist/core/plugin/params/input.js +17 -2
- package/dist/core/plugin/params/input.js.map +1 -1
- package/dist/core/plugin/params/type-level.d.ts +2 -1
- package/dist/core/plugin/params/type-level.d.ts.map +1 -1
- package/dist/core/plugin/params/types.d.ts +5 -0
- package/dist/core/plugin/params/types.d.ts.map +1 -1
- package/dist/core/plugin/params/types.js.map +1 -1
- package/dist/core/plugin/params/values.d.ts +1 -0
- package/dist/core/plugin/params/values.d.ts.map +1 -1
- package/dist/core/plugin/params/values.js +3 -0
- package/dist/core/plugin/params/values.js.map +1 -1
- package/docs/plugin-api.md +23 -10
- package/package.json +1 -1
- package/src/core/plugin/params/declaration.ts +112 -4
- package/src/core/plugin/params/input.ts +29 -2
- package/src/core/plugin/params/type-level.ts +7 -3
- package/src/core/plugin/params/types.ts +6 -0
- package/src/core/plugin/params/values.ts +4 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"declaration.d.ts","sourceRoot":"","sources":["../../../../src/core/plugin/params/declaration.ts"],"names":[],"mappings":"AAAA,OAAO,EAEH,KAAK,gBAAgB,
|
|
1
|
+
{"version":3,"file":"declaration.d.ts","sourceRoot":"","sources":["../../../../src/core/plugin/params/declaration.ts"],"names":[],"mappings":"AAAA,OAAO,EAEH,KAAK,gBAAgB,EAErB,KAAK,SAAS,EACjB,MAAM,YAAY,CAAA;AAWnB,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAczD;AAsFD,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAYlD;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAyDxD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAqFnD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,IAAI,CAkDtD;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,MAAM,CAYlD;AAED,wBAAgB,iBAAiB,CAC7B,IAAI,EAAE,gBAAgB,EACtB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,GACb,OAAO,CA+CT"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { declarationError, } from './types.js';
|
|
2
|
-
import { parseBoolean, parseTimeValue, unquote } from './values.js';
|
|
2
|
+
import { measureLength, parseBoolean, parseTimeValue, unquote, } from './values.js';
|
|
3
3
|
const NAME_PATTERN = /^[\p{L}_][\p{L}\p{N}_-]*$/u;
|
|
4
|
+
const LENGTH_PATTERN = /^(\d*)\.\.(\d*)$/;
|
|
4
5
|
export function parseType(value) {
|
|
5
6
|
switch (value) {
|
|
6
7
|
case 'string':
|
|
@@ -16,6 +17,58 @@ export function parseType(value) {
|
|
|
16
17
|
throw declarationError(`未知的参数类型 "${value}"`);
|
|
17
18
|
}
|
|
18
19
|
}
|
|
20
|
+
function parseLengthNumber(raw, token) {
|
|
21
|
+
const value = Number(raw);
|
|
22
|
+
if (!Number.isSafeInteger(value)) {
|
|
23
|
+
throw declarationError(`长度限制不是安全的整数:${token}`);
|
|
24
|
+
}
|
|
25
|
+
return value;
|
|
26
|
+
}
|
|
27
|
+
function parseLength(raw, token) {
|
|
28
|
+
const value = raw.trim();
|
|
29
|
+
const match = LENGTH_PATTERN.exec(value);
|
|
30
|
+
if (!match) {
|
|
31
|
+
throw declarationError(`非法的长度限制 "${raw}":${token}`);
|
|
32
|
+
}
|
|
33
|
+
const minRaw = match[1] ?? '';
|
|
34
|
+
const maxRaw = match[2] ?? '';
|
|
35
|
+
if (minRaw === '' && maxRaw === '') {
|
|
36
|
+
throw declarationError(`长度限制不能为空:${token}`);
|
|
37
|
+
}
|
|
38
|
+
const min = minRaw === '' ? undefined : parseLengthNumber(minRaw, token);
|
|
39
|
+
const max = maxRaw === '' ? undefined : parseLengthNumber(maxRaw, token);
|
|
40
|
+
if (min !== undefined && max !== undefined && min > max) {
|
|
41
|
+
throw declarationError(`长度下限不能大于上限:${token}`);
|
|
42
|
+
}
|
|
43
|
+
return { min, max };
|
|
44
|
+
}
|
|
45
|
+
function parseTypeDeclaration(raw, token) {
|
|
46
|
+
const value = raw.trim();
|
|
47
|
+
const open = value.indexOf('(');
|
|
48
|
+
if (open < 0) {
|
|
49
|
+
return { type: parseType(value) };
|
|
50
|
+
}
|
|
51
|
+
if (!value.endsWith(')')) {
|
|
52
|
+
throw declarationError(`非法的参数声明 "${token}"`);
|
|
53
|
+
}
|
|
54
|
+
const type = parseType(value.slice(0, open).trim());
|
|
55
|
+
const length = parseLength(value.slice(open + 1, -1), token);
|
|
56
|
+
if (type !== 'string' && type !== 'text') {
|
|
57
|
+
throw declarationError(`只有 string/text 参数支持长度限制:${token}`);
|
|
58
|
+
}
|
|
59
|
+
return { type, length };
|
|
60
|
+
}
|
|
61
|
+
function validateDefaultLength(name, value, length) {
|
|
62
|
+
if (length === undefined)
|
|
63
|
+
return;
|
|
64
|
+
const measured = measureLength(value);
|
|
65
|
+
if (length.min !== undefined && measured < length.min) {
|
|
66
|
+
throw declarationError(`参数 ${name} 的默认值至少需要 ${length.min} 个字符`);
|
|
67
|
+
}
|
|
68
|
+
if (length.max !== undefined && measured > length.max) {
|
|
69
|
+
throw declarationError(`参数 ${name} 的默认值不能超过 ${length.max} 个字符`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
19
72
|
export function validateName(value) {
|
|
20
73
|
const name = value.trim();
|
|
21
74
|
if (!name) {
|
|
@@ -89,7 +142,11 @@ export function parseToken(token) {
|
|
|
89
142
|
if (required) {
|
|
90
143
|
throw declarationError('变长参数必须使用 [ ]');
|
|
91
144
|
}
|
|
92
|
-
const
|
|
145
|
+
const rest = inner.slice(3);
|
|
146
|
+
if (rest.includes('(')) {
|
|
147
|
+
throw declarationError(`变长参数不支持长度限制:${token}`);
|
|
148
|
+
}
|
|
149
|
+
const name = validateName(rest);
|
|
93
150
|
return {
|
|
94
151
|
name,
|
|
95
152
|
type: 'string',
|
|
@@ -106,18 +163,23 @@ export function parseToken(token) {
|
|
|
106
163
|
const defaultRaw = equals >= 0 ? inner.slice(equals + 1).trim() : undefined;
|
|
107
164
|
const colon = head.indexOf(':');
|
|
108
165
|
const name = validateName(colon >= 0 ? head.slice(0, colon) : head);
|
|
109
|
-
const type =
|
|
166
|
+
const { type, length } = parseTypeDeclaration(colon >= 0 ? head.slice(colon + 1) : 'string', token);
|
|
110
167
|
if (required && defaultRaw !== undefined) {
|
|
111
168
|
throw declarationError(`必填参数不能有默认值:${token}`);
|
|
112
169
|
}
|
|
113
170
|
if (defaultRaw !== undefined) {
|
|
171
|
+
const defaultValue = parseDefaultValue(type, defaultRaw, name);
|
|
172
|
+
if (typeof defaultValue === 'string') {
|
|
173
|
+
validateDefaultLength(name, defaultValue, length);
|
|
174
|
+
}
|
|
114
175
|
return {
|
|
115
176
|
name,
|
|
116
177
|
type,
|
|
117
178
|
required,
|
|
118
179
|
rest: false,
|
|
119
180
|
hasDefault: true,
|
|
120
|
-
defaultValue
|
|
181
|
+
defaultValue,
|
|
182
|
+
length,
|
|
121
183
|
};
|
|
122
184
|
}
|
|
123
185
|
return {
|
|
@@ -126,6 +188,7 @@ export function parseToken(token) {
|
|
|
126
188
|
required,
|
|
127
189
|
rest: false,
|
|
128
190
|
hasDefault: false,
|
|
191
|
+
length,
|
|
129
192
|
};
|
|
130
193
|
}
|
|
131
194
|
export function validateSpecs(specs) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"declaration.js","sourceRoot":"","sources":["../../../../src/core/plugin/params/declaration.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,gBAAgB,
|
|
1
|
+
{"version":3,"file":"declaration.js","sourceRoot":"","sources":["../../../../src/core/plugin/params/declaration.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,gBAAgB,GAInB,MAAM,YAAY,CAAA;AACnB,OAAO,EACH,aAAa,EACb,YAAY,EACZ,cAAc,EACd,OAAO,GACV,MAAM,aAAa,CAAA;AAEpB,MAAM,YAAY,GAAG,4BAA4B,CAAA;AACjD,MAAM,cAAc,GAAG,kBAAkB,CAAA;AAEzC,MAAM,UAAU,SAAS,CAAC,KAAa;IACnC,QAAQ,KAAK,EAAE,CAAC;QACZ,KAAK,QAAQ,CAAC;QACd,KAAK,MAAM,CAAC;QACZ,KAAK,QAAQ,CAAC;QACd,KAAK,SAAS,CAAC;QACf,KAAK,SAAS,CAAC;QACf,KAAK,IAAI,CAAC;QACV,KAAK,OAAO,CAAC;QACb,KAAK,MAAM;YACP,OAAO,KAAK,CAAA;QAChB;YACI,MAAM,gBAAgB,CAAC,YAAY,KAAK,GAAG,CAAC,CAAA;IACpD,CAAC;AACL,CAAC;AAOD,SAAS,iBAAiB,CAAC,GAAW,EAAE,KAAa;IACjD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;IAEzB,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/B,MAAM,gBAAgB,CAAC,eAAe,KAAK,EAAE,CAAC,CAAA;IAClD,CAAC;IAED,OAAO,KAAK,CAAA;AAChB,CAAC;AAED,SAAS,WAAW,CAAC,GAAW,EAAE,KAAa;IAC3C,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,CAAA;IACxB,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAExC,IAAI,CAAC,KAAK,EAAE,CAAC;QACT,MAAM,gBAAgB,CAAC,YAAY,GAAG,KAAK,KAAK,EAAE,CAAC,CAAA;IACvD,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;IAC7B,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;IAE7B,IAAI,MAAM,KAAK,EAAE,IAAI,MAAM,KAAK,EAAE,EAAE,CAAC;QACjC,MAAM,gBAAgB,CAAC,YAAY,KAAK,EAAE,CAAC,CAAA;IAC/C,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IACxE,MAAM,GAAG,GAAG,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IAExE,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC;QACtD,MAAM,gBAAgB,CAAC,cAAc,KAAK,EAAE,CAAC,CAAA;IACjD,CAAC;IAED,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,CAAA;AACvB,CAAC;AAED,SAAS,oBAAoB,CAAC,GAAW,EAAE,KAAa;IACpD,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,CAAA;IACxB,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IAE/B,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;QACX,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC,EAAE,CAAA;IACrC,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,gBAAgB,CAAC,YAAY,KAAK,GAAG,CAAC,CAAA;IAChD,CAAC;IAED,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;IACnD,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;IAE5D,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACvC,MAAM,gBAAgB,CAAC,2BAA2B,KAAK,EAAE,CAAC,CAAA;IAC9D,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;AAC3B,CAAC;AAED,SAAS,qBAAqB,CAC1B,IAAY,EACZ,KAAa,EACb,MAA+B;IAE/B,IAAI,MAAM,KAAK,SAAS;QAAE,OAAM;IAEhC,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,CAAA;IAErC,IAAI,MAAM,CAAC,GAAG,KAAK,SAAS,IAAI,QAAQ,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC;QACpD,MAAM,gBAAgB,CAClB,MAAM,IAAI,aAAa,MAAM,CAAC,GAAG,MAAM,CAC1C,CAAA;IACL,CAAC;IAED,IAAI,MAAM,CAAC,GAAG,KAAK,SAAS,IAAI,QAAQ,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC;QACpD,MAAM,gBAAgB,CAClB,MAAM,IAAI,aAAa,MAAM,CAAC,GAAG,MAAM,CAC1C,CAAA;IACL,CAAC;AACL,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAa;IACtC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,CAAA;IAEzB,IAAI,CAAC,IAAI,EAAE,CAAC;QACR,MAAM,gBAAgB,CAAC,SAAS,CAAC,CAAA;IACrC,CAAC;IAED,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,MAAM,gBAAgB,CAAC,WAAW,IAAI,GAAG,CAAC,CAAA;IAC9C,CAAC;IAED,OAAO,IAAI,CAAA;AACf,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC1C,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,IAAI,KAAK,GAAG,CAAC,CAAA;IAEb,OAAO,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAA;QAEzB,IAAI,IAAI,KAAK,SAAS;YAAE,MAAK;QAE7B,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAClB,KAAK,IAAI,CAAC,CAAA;YACV,SAAQ;QACZ,CAAC;QAED,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YAC/B,MAAM,gBAAgB,CAAC,YAAY,IAAI,GAAG,CAAC,CAAA;QAC/C,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAA;QACtC,IAAI,GAAG,GAAG,KAAK,GAAG,CAAC,CAAA;QACnB,IAAI,KAAK,GAAkB,IAAI,CAAA;QAE/B,OAAO,GAAG,GAAG,KAAK,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;YAClC,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAA;YAE1B,IAAI,OAAO,KAAK,SAAS;gBAAE,MAAK;YAEhC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACjB,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;oBACnB,GAAG,IAAI,CAAC,CAAA;oBACR,SAAQ;gBACZ,CAAC;gBAED,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;oBACpB,KAAK,GAAG,IAAI,CAAA;gBAChB,CAAC;gBAED,SAAQ;YACZ,CAAC;YAED,IAAI,OAAO,KAAK,GAAG,IAAI,OAAO,KAAK,GAAG,EAAE,CAAC;gBACrC,KAAK,GAAG,OAAO,CAAA;gBACf,SAAQ;YACZ,CAAC;YAED,IAAI,OAAO,KAAK,KAAK;gBAAE,MAAK;QAChC,CAAC;QAED,IAAI,GAAG,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,KAAK,EAAE,CAAC;YAC9C,MAAM,gBAAgB,CAAC,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,KAAK,EAAE,CAAC,CAAA;QACpE,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;QACvC,KAAK,GAAG,GAAG,GAAG,CAAC,CAAA;IACnB,CAAC;IAED,OAAO,KAAK,CAAA;AAChB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAa;IACpC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;IACrB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IAErC,IACI,CAAC,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,CAAC;QAC9B,CAAC,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG,CAAC;QAChC,CAAC,IAAI,KAAK,GAAG,CAAC,KAAK,CAAC,KAAK,KAAK,GAAG,CAAC,EACpC,CAAC;QACC,MAAM,gBAAgB,CAAC,YAAY,KAAK,GAAG,CAAC,CAAA;IAChD,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,KAAK,GAAG,CAAA;IAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;IAEvC,IAAI,CAAC,KAAK,EAAE,CAAC;QACT,MAAM,gBAAgB,CAAC,SAAS,CAAC,CAAA;IACrC,CAAC;IAED,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,IAAI,QAAQ,EAAE,CAAC;YACX,MAAM,gBAAgB,CAAC,cAAc,CAAC,CAAA;QAC1C,CAAC;QAED,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QAE3B,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,gBAAgB,CAAC,eAAe,KAAK,EAAE,CAAC,CAAA;QAClD,CAAC;QAED,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;QAE/B,OAAO;YACH,IAAI;YACJ,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,KAAK;YACf,IAAI,EAAE,IAAI;YACV,UAAU,EAAE,KAAK;SACpB,CAAA;IACL,CAAC;IAED,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,gBAAgB,CAAC,YAAY,KAAK,GAAG,CAAC,CAAA;IAChD,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IACjC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAA;IACvE,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAA;IAC3E,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IAC/B,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;IACnE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,oBAAoB,CACzC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAC7C,KAAK,CACR,CAAA;IAED,IAAI,QAAQ,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QACvC,MAAM,gBAAgB,CAAC,cAAc,KAAK,EAAE,CAAC,CAAA;IACjD,CAAC;IAED,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,YAAY,GAAG,iBAAiB,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,CAAA;QAE9D,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE,CAAC;YACnC,qBAAqB,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,CAAC,CAAA;QACrD,CAAC;QAED,OAAO;YACH,IAAI;YACJ,IAAI;YACJ,QAAQ;YACR,IAAI,EAAE,KAAK;YACX,UAAU,EAAE,IAAI;YAChB,YAAY;YACZ,MAAM;SACT,CAAA;IACL,CAAC;IAED,OAAO;QACH,IAAI;QACJ,IAAI;QACJ,QAAQ;QACR,IAAI,EAAE,KAAK;QACX,UAAU,EAAE,KAAK;QACjB,MAAM;KACT,CAAA;AACL,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAkB;IAC5C,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAA;IAC/B,IAAI,YAAY,GAAG,KAAK,CAAA;IACxB,IAAI,QAAQ,GAAG,KAAK,CAAA;IACpB,IAAI,QAAQ,GAAG,KAAK,CAAA;IAEpB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAA;QAEzB,IAAI,CAAC,IAAI;YAAE,SAAQ;QAEnB,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,MAAM,gBAAgB,CAAC,UAAU,IAAI,CAAC,IAAI,GAAG,CAAC,CAAA;QAClD,CAAC;QAED,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAEpB,IAAI,QAAQ,EAAE,CAAC;YACX,MAAM,gBAAgB,CAAC,cAAc,CAAC,CAAA;QAC1C,CAAC;QAED,IAAI,QAAQ,EAAE,CAAC;YACX,MAAM,gBAAgB,CAAC,cAAc,CAAC,CAAA;QAC1C,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,IAAI,KAAK,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7B,MAAM,gBAAgB,CAAC,YAAY,CAAC,CAAA;YACxC,CAAC;YAED,QAAQ,GAAG,IAAI,CAAA;YACf,SAAQ;QACZ,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACvB,IAAI,KAAK,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7B,MAAM,gBAAgB,CAAC,YAAY,CAAC,CAAA;YACxC,CAAC;YAED,QAAQ,GAAG,IAAI,CAAA;QACnB,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChB,IAAI,YAAY,EAAE,CAAC;gBACf,MAAM,gBAAgB,CAAC,iBAAiB,CAAC,CAAA;YAC7C,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,YAAY,GAAG,IAAI,CAAA;QACvB,CAAC;IACL,CAAC;AACL,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,KAAkB;IACtC,OAAO,KAAK;SACP,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACV,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,OAAO,OAAO,IAAI,CAAC,IAAI,GAAG,CAAA;QAC9B,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAA;QAEjE,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,CAAA;IACpD,CAAC,CAAC;SACD,IAAI,CAAC,GAAG,CAAC,CAAA;AAClB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC7B,IAAsB,EACtB,GAAW,EACX,IAAY;IAEZ,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;IAE1B,QAAQ,IAAI,EAAE,CAAC;QACX,KAAK,QAAQ,CAAC;QACd,KAAK,MAAM;YACP,OAAO,KAAK,CAAA;QAChB,KAAK,QAAQ,EAAE,CAAC;YACZ,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YAE/D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC3B,MAAM,gBAAgB,CAAC,MAAM,IAAI,WAAW,CAAC,CAAA;YACjD,CAAC;YAED,OAAO,MAAM,CAAA;QACjB,CAAC;QACD,KAAK,SAAS,EAAE,CAAC;YACb,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YAE/D,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC5B,MAAM,gBAAgB,CAAC,MAAM,IAAI,WAAW,CAAC,CAAA;YACjD,CAAC;YAED,OAAO,MAAM,CAAA;QACjB,CAAC;QACD,KAAK,SAAS,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,CAAA;YAEnC,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;gBACnB,MAAM,gBAAgB,CAAC,MAAM,IAAI,YAAY,CAAC,CAAA;YAClD,CAAC;YAED,OAAO,OAAO,CAAA;QAClB,CAAC;QACD,KAAK,IAAI,CAAC;QACV,KAAK,OAAO;YACR,MAAM,gBAAgB,CAAC,MAAM,IAAI,SAAS,CAAC,CAAA;QAC/C,KAAK,MAAM,EAAE,CAAC;YACV,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,CAAA;YAErC,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;gBACnB,MAAM,gBAAgB,CAAC,MAAM,IAAI,WAAW,CAAC,CAAA;YACjD,CAAC;YAED,OAAO,OAAO,CAAA;QAClB,CAAC;IACL,CAAC;AACL,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../../../src/core/plugin/params/input.ts"],"names":[],"mappings":"AAAA,OAAO,EAEH,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,mBAAmB,EAC3B,MAAM,YAAY,CAAA;AAGnB,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,UAAU,EAAE,CA6FxE;
|
|
1
|
+
{"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../../../src/core/plugin/params/input.ts"],"names":[],"mappings":"AAAA,OAAO,EAEH,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,mBAAmB,EAC3B,MAAM,YAAY,CAAA;AAGnB,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,UAAU,EAAE,CA6FxE;AA4BD,wBAAgB,UAAU,CACtB,IAAI,EAAE,SAAS,EACf,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,GACd,OAAO,CA+CT;AAED,wBAAgB,UAAU,CACtB,KAAK,EAAE,SAAS,EAAE,EAClB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GAAG,SAAS,GAC5B,mBAAmB,CA6FrB"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { CommandParamsError, } from './types.js';
|
|
2
|
-
import { parseAt, parseBoolean, parseTime } from './values.js';
|
|
2
|
+
import { measureLength, parseAt, parseBoolean, parseTime } from './values.js';
|
|
3
3
|
export function tokenizeInput(input, usage) {
|
|
4
4
|
const tokens = [];
|
|
5
5
|
let index = 0;
|
|
@@ -75,9 +75,24 @@ export function tokenizeInput(input, usage) {
|
|
|
75
75
|
}
|
|
76
76
|
return tokens;
|
|
77
77
|
}
|
|
78
|
+
function enforceLength(spec, value, usage) {
|
|
79
|
+
const length = spec.length;
|
|
80
|
+
if (length === undefined) {
|
|
81
|
+
return value;
|
|
82
|
+
}
|
|
83
|
+
const measured = measureLength(value);
|
|
84
|
+
if (length.min !== undefined && measured < length.min) {
|
|
85
|
+
throw new CommandParamsError(`参数 ${spec.name} 至少需要 ${length.min} 个字符`, usage);
|
|
86
|
+
}
|
|
87
|
+
if (length.max !== undefined && measured > length.max) {
|
|
88
|
+
throw new CommandParamsError(`参数 ${spec.name} 不能超过 ${length.max} 个字符`, usage);
|
|
89
|
+
}
|
|
90
|
+
return value;
|
|
91
|
+
}
|
|
78
92
|
export function parseValue(spec, raw, usage) {
|
|
79
93
|
switch (spec.type) {
|
|
80
94
|
case 'string':
|
|
95
|
+
return enforceLength(spec, raw, usage);
|
|
81
96
|
case 'text':
|
|
82
97
|
return raw;
|
|
83
98
|
case 'number': {
|
|
@@ -150,7 +165,7 @@ export function parseInput(specs, input, usage, quoteId) {
|
|
|
150
165
|
}
|
|
151
166
|
const remaining = tokens.length - index;
|
|
152
167
|
const value = remaining === 1 ? token.value : input.slice(token.start).trim();
|
|
153
|
-
args.push(value);
|
|
168
|
+
args.push(enforceLength(spec, value, usage));
|
|
154
169
|
index = tokens.length;
|
|
155
170
|
continue;
|
|
156
171
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input.js","sourceRoot":"","sources":["../../../../src/core/plugin/params/input.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,kBAAkB,GAIrB,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"input.js","sourceRoot":"","sources":["../../../../src/core/plugin/params/input.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,8 @@ type Whitespace = ' ' | '\n' | '\r' | '\t' | '\v' | '\f';
|
|
|
2
2
|
type TrimLeft<Source extends string> = Source extends `${Whitespace}${infer Rest}` ? TrimLeft<Rest> : Source;
|
|
3
3
|
type TrimRight<Source extends string> = Source extends `${infer Rest}${Whitespace}` ? TrimRight<Rest> : Source;
|
|
4
4
|
type Trim<Source extends string> = TrimLeft<TrimRight<Source>>;
|
|
5
|
-
type
|
|
5
|
+
type StripLength<Type extends string> = Trim<Type> extends `${infer Base}(${string})` ? Trim<Base> : Trim<Type>;
|
|
6
|
+
type ParamValue<Type extends string> = StripLength<Type> extends 'string' | 'text' ? string : StripLength<Type> extends 'number' | 'integer' | 'at' | 'reply' | 'time' ? number : StripLength<Type> extends 'boolean' ? boolean : unknown;
|
|
6
7
|
interface VariadicParam {
|
|
7
8
|
readonly variadic: true;
|
|
8
9
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"type-level.d.ts","sourceRoot":"","sources":["../../../../src/core/plugin/params/type-level.ts"],"names":[],"mappings":"AAAA,KAAK,UAAU,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;AAExD,KAAK,QAAQ,CAAC,MAAM,SAAS,MAAM,IAC/B,MAAM,SAAS,GAAG,UAAU,GAAG,MAAM,IAAI,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,MAAM,CAAA;AAEzE,KAAK,SAAS,CAAC,MAAM,SAAS,MAAM,IAChC,MAAM,SAAS,GAAG,MAAM,IAAI,GAAG,UAAU,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,MAAM,CAAA;AAE1E,KAAK,IAAI,CAAC,MAAM,SAAS,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAA;AAE9D,KAAK,UAAU,CAAC,IAAI,SAAS,MAAM,IAC/B,
|
|
1
|
+
{"version":3,"file":"type-level.d.ts","sourceRoot":"","sources":["../../../../src/core/plugin/params/type-level.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,6 +12,10 @@ export declare class CommandParamsError extends Error {
|
|
|
12
12
|
readonly usage: string;
|
|
13
13
|
constructor(message: string, usage: string);
|
|
14
14
|
}
|
|
15
|
+
export interface ParamLength {
|
|
16
|
+
min?: number | undefined;
|
|
17
|
+
max?: number | undefined;
|
|
18
|
+
}
|
|
15
19
|
export interface ParamSpec {
|
|
16
20
|
name: string;
|
|
17
21
|
type: CommandParamType;
|
|
@@ -19,6 +23,7 @@ export interface ParamSpec {
|
|
|
19
23
|
rest: boolean;
|
|
20
24
|
hasDefault: boolean;
|
|
21
25
|
defaultValue?: unknown;
|
|
26
|
+
length?: ParamLength | undefined;
|
|
22
27
|
}
|
|
23
28
|
export interface InputToken {
|
|
24
29
|
value: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/core/plugin/params/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AAEvD,MAAM,MAAM,gBAAgB,GACtB,QAAQ,GACR,MAAM,GACN,QAAQ,GACR,SAAS,GACT,SAAS,GACT,IAAI,GACJ,OAAO,GACP,MAAM,CAAA;AAEZ,MAAM,WAAW,mBAAmB;IAChC,IAAI,EAAE,OAAO,EAAE,CAAA;IACf,OAAO,EAAE,MAAM,EAAE,CAAA;CACpB;AAED,MAAM,WAAW,qBAAqB;IAClC,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,kBAAkB,GAAG,mBAAmB,CAAA;CACxE;AAED,qBAAa,kBAAmB,SAAQ,KAAK;IACzC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IAEtB,YAAY,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAIzC;CACJ;AAED,MAAM,WAAW,SAAS;IACtB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,gBAAgB,CAAA;IACtB,QAAQ,EAAE,OAAO,CAAA;IACjB,IAAI,EAAE,OAAO,CAAA;IACb,UAAU,EAAE,OAAO,CAAA;IACnB,YAAY,CAAC,EAAE,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/core/plugin/params/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AAEvD,MAAM,MAAM,gBAAgB,GACtB,QAAQ,GACR,MAAM,GACN,QAAQ,GACR,SAAS,GACT,SAAS,GACT,IAAI,GACJ,OAAO,GACP,MAAM,CAAA;AAEZ,MAAM,WAAW,mBAAmB;IAChC,IAAI,EAAE,OAAO,EAAE,CAAA;IACf,OAAO,EAAE,MAAM,EAAE,CAAA;CACpB;AAED,MAAM,WAAW,qBAAqB;IAClC,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,kBAAkB,GAAG,mBAAmB,CAAA;CACxE;AAED,qBAAa,kBAAmB,SAAQ,KAAK;IACzC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IAEtB,YAAY,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAIzC;CACJ;AAED,MAAM,WAAW,WAAW;IACxB,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACxB,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAC3B;AAED,MAAM,WAAW,SAAS;IACtB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,gBAAgB,CAAA;IACtB,QAAQ,EAAE,OAAO,CAAA;IACjB,IAAI,EAAE,OAAO,CAAA;IACb,UAAU,EAAE,OAAO,CAAA;IACnB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAA;CACnC;AAED,MAAM,WAAW,UAAU;IACvB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;CAChB;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,CAEvD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/core/plugin/params/types.ts"],"names":[],"mappings":"AAsBA,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAChC,KAAK,CAAQ;IAEtB,YAAY,OAAe,EAAE,KAAa;QACtC,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAA;QAChC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;IACtB,CAAC;CACJ;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/core/plugin/params/types.ts"],"names":[],"mappings":"AAsBA,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAChC,KAAK,CAAQ;IAEtB,YAAY,OAAe,EAAE,KAAa;QACtC,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAA;QAChC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;IACtB,CAAC;CACJ;AAsBD,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC5C,OAAO,IAAI,KAAK,CAAC,UAAU,OAAO,EAAE,CAAC,CAAA;AACzC,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export declare function unquote(value: string): string;
|
|
2
|
+
export declare function measureLength(value: string): number;
|
|
2
3
|
export declare function parseBoolean(value: string): boolean | null;
|
|
3
4
|
export declare function parseAt(value: string, name: string, usage: string): number;
|
|
4
5
|
export declare function parseTimeValue(value: string): number | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"values.d.ts","sourceRoot":"","sources":["../../../../src/core/plugin/params/values.ts"],"names":[],"mappings":"AAGA,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAkC7C;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAY1D;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CA2B1E;AAmBD,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiC3D;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAW5E"}
|
|
1
|
+
{"version":3,"file":"values.d.ts","sourceRoot":"","sources":["../../../../src/core/plugin/params/values.ts"],"names":[],"mappings":"AAGA,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAkC7C;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAY1D;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CA2B1E;AAmBD,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiC3D;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAW5E"}
|
|
@@ -26,6 +26,9 @@ export function unquote(value) {
|
|
|
26
26
|
}
|
|
27
27
|
return result;
|
|
28
28
|
}
|
|
29
|
+
export function measureLength(value) {
|
|
30
|
+
return Array.from(value).length;
|
|
31
|
+
}
|
|
29
32
|
export function parseBoolean(value) {
|
|
30
33
|
const normalized = value.trim().toLowerCase();
|
|
31
34
|
if (['true', '1', 'yes', 'y', 'on'].includes(normalized)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"values.js","sourceRoot":"","sources":["../../../../src/core/plugin/params/values.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"values.js","sourceRoot":"","sources":["../../../../src/core/plugin/params/values.ts"],"names":[],"mappings":"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"}
|
package/docs/plugin-api.md
CHANGED
|
@@ -240,14 +240,15 @@ ctx.commands.register(
|
|
|
240
240
|
|
|
241
241
|
声明语法:
|
|
242
242
|
|
|
243
|
-
| 写法
|
|
244
|
-
|
|
|
245
|
-
| `<arg>`
|
|
246
|
-
| `[arg]`
|
|
247
|
-
| `<arg:type>`
|
|
248
|
-
| `[arg:type=default]`
|
|
249
|
-
| `<arg:
|
|
250
|
-
|
|
|
243
|
+
| 写法 | 说明 |
|
|
244
|
+
| --------------------- | ---------------------------------------- |
|
|
245
|
+
| `<arg>` | 必填字符串参数 |
|
|
246
|
+
| `[arg]` | 可选字符串参数 |
|
|
247
|
+
| `<arg:type>` | 指定类型的必填参数 |
|
|
248
|
+
| `[arg:type=default]` | 可选参数及默认值 |
|
|
249
|
+
| `<arg:string(2..10)>` | 带长度限制的字符串参数 |
|
|
250
|
+
| `<arg:text>` | 文本参数,消费全部剩余输入,必须放在最后 |
|
|
251
|
+
| `[...rest]` | 变长参数,每个剩余 token 作为一个字符串 |
|
|
251
252
|
|
|
252
253
|
内置类型:
|
|
253
254
|
|
|
@@ -261,15 +262,27 @@ ctx.commands.register(
|
|
|
261
262
|
- `reply`:当前消息引用(回复)的消息 ID,解析为数字。该参数不消费命令文本,而是从事件中的 `reply` 分段读取;未引用消息时必填参数会报错,且不能声明默认值。引用消息发送命令时,`raw_message` 开头的 `[CQ:reply,...]` 会被忽略,命令仍能正常匹配。
|
|
262
263
|
- `[...rest]`:把剩余 token 依次收集为字符串;只能放在最后,且没有必填形式。
|
|
263
264
|
|
|
265
|
+
`string` 和 `text` 可以在类型后追加长度限制,按 Unicode 码点计数,区间两端都包含:
|
|
266
|
+
|
|
267
|
+
```ts
|
|
268
|
+
params: '<message:text(2..200)> [nickname:string(..16)]'
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
- `(..10)`:最多 10 个字符。
|
|
272
|
+
- `(2..)`:至少 2 个字符。
|
|
273
|
+
- `(2..10)`:2 到 10 个字符。
|
|
274
|
+
- 只能用于 `string` / `text`;其他类型和 `[...rest]` 会报声明错误。
|
|
275
|
+
- 默认值也会在注册时校验;usage 不会显示长度限制。
|
|
276
|
+
|
|
264
277
|
固定参数可以用双引号或单引号包裹,例如 `/ask "hello world" 2` 会把 `hello world` 作为一个 token;引号内的反斜杠用于转义。
|
|
265
278
|
|
|
266
279
|
解析规则:
|
|
267
280
|
|
|
268
281
|
- `match.args` 和 `match.rest` 保持原始内容,不会被参数解析结果替换。
|
|
269
282
|
- 声明槽位填完后,多余 token 会被忽略并记录 debug 日志,不会报错。`text` 和 `rest` 会消费全部剩余输入,因此不存在多余 token。
|
|
270
|
-
-
|
|
283
|
+
- 必填参数缺失、已声明槽位类型错误、长度不符合限制或引号未闭合时,Router 会自动回复错误和用法,handler 不会执行。
|
|
271
284
|
- usage 会自动生成,并显示在 `/help` 和指令组根命令的用法提示中。
|
|
272
|
-
- 必填参数不能出现在可选参数之后;参数名不能重复;`text`
|
|
285
|
+
- 必填参数不能出现在可选参数之后;参数名不能重复;`text` 和变长参数必须放在最后;必填参数不能声明默认值;长度限制只能用于 `string` / `text`,上下限必须是非负整数且下限不能大于上限。
|
|
273
286
|
- 当 `params` 是字符串字面量时,handler 从第四个参数开始的位置参数类型会自动推导。例如 `<question:string> [count:integer=1]` 会推导为 `(question: string, count: number)`,`[name:string]` 会推导为 `string | undefined`,`[...rest]` 会推导为 `...string[]`。
|
|
274
287
|
- 需要在类型位置复用推导结果时,可以使用导出的 `CommandParamArgs<'<question:string>'>`。
|
|
275
288
|
- 也可以继续手写 handler 参数注解;注解与声明不一致时会在编译期报错。
|
package/package.json
CHANGED
|
@@ -1,11 +1,18 @@
|
|
|
1
1
|
import {
|
|
2
2
|
declarationError,
|
|
3
3
|
type CommandParamType,
|
|
4
|
+
type ParamLength,
|
|
4
5
|
type ParamSpec,
|
|
5
6
|
} from './types.js'
|
|
6
|
-
import {
|
|
7
|
+
import {
|
|
8
|
+
measureLength,
|
|
9
|
+
parseBoolean,
|
|
10
|
+
parseTimeValue,
|
|
11
|
+
unquote,
|
|
12
|
+
} from './values.js'
|
|
7
13
|
|
|
8
14
|
const NAME_PATTERN = /^[\p{L}_][\p{L}\p{N}_-]*$/u
|
|
15
|
+
const LENGTH_PATTERN = /^(\d*)\.\.(\d*)$/
|
|
9
16
|
|
|
10
17
|
export function parseType(value: string): CommandParamType {
|
|
11
18
|
switch (value) {
|
|
@@ -23,6 +30,90 @@ export function parseType(value: string): CommandParamType {
|
|
|
23
30
|
}
|
|
24
31
|
}
|
|
25
32
|
|
|
33
|
+
interface ParsedType {
|
|
34
|
+
type: CommandParamType
|
|
35
|
+
length?: ParamLength | undefined
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function parseLengthNumber(raw: string, token: string): number {
|
|
39
|
+
const value = Number(raw)
|
|
40
|
+
|
|
41
|
+
if (!Number.isSafeInteger(value)) {
|
|
42
|
+
throw declarationError(`长度限制不是安全的整数:${token}`)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return value
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function parseLength(raw: string, token: string): ParamLength {
|
|
49
|
+
const value = raw.trim()
|
|
50
|
+
const match = LENGTH_PATTERN.exec(value)
|
|
51
|
+
|
|
52
|
+
if (!match) {
|
|
53
|
+
throw declarationError(`非法的长度限制 "${raw}":${token}`)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const minRaw = match[1] ?? ''
|
|
57
|
+
const maxRaw = match[2] ?? ''
|
|
58
|
+
|
|
59
|
+
if (minRaw === '' && maxRaw === '') {
|
|
60
|
+
throw declarationError(`长度限制不能为空:${token}`)
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const min = minRaw === '' ? undefined : parseLengthNumber(minRaw, token)
|
|
64
|
+
const max = maxRaw === '' ? undefined : parseLengthNumber(maxRaw, token)
|
|
65
|
+
|
|
66
|
+
if (min !== undefined && max !== undefined && min > max) {
|
|
67
|
+
throw declarationError(`长度下限不能大于上限:${token}`)
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
return { min, max }
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function parseTypeDeclaration(raw: string, token: string): ParsedType {
|
|
74
|
+
const value = raw.trim()
|
|
75
|
+
const open = value.indexOf('(')
|
|
76
|
+
|
|
77
|
+
if (open < 0) {
|
|
78
|
+
return { type: parseType(value) }
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
if (!value.endsWith(')')) {
|
|
82
|
+
throw declarationError(`非法的参数声明 "${token}"`)
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
const type = parseType(value.slice(0, open).trim())
|
|
86
|
+
const length = parseLength(value.slice(open + 1, -1), token)
|
|
87
|
+
|
|
88
|
+
if (type !== 'string' && type !== 'text') {
|
|
89
|
+
throw declarationError(`只有 string/text 参数支持长度限制:${token}`)
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
return { type, length }
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function validateDefaultLength(
|
|
96
|
+
name: string,
|
|
97
|
+
value: string,
|
|
98
|
+
length: ParamLength | undefined
|
|
99
|
+
): void {
|
|
100
|
+
if (length === undefined) return
|
|
101
|
+
|
|
102
|
+
const measured = measureLength(value)
|
|
103
|
+
|
|
104
|
+
if (length.min !== undefined && measured < length.min) {
|
|
105
|
+
throw declarationError(
|
|
106
|
+
`参数 ${name} 的默认值至少需要 ${length.min} 个字符`
|
|
107
|
+
)
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
if (length.max !== undefined && measured > length.max) {
|
|
111
|
+
throw declarationError(
|
|
112
|
+
`参数 ${name} 的默认值不能超过 ${length.max} 个字符`
|
|
113
|
+
)
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
26
117
|
export function validateName(value: string): string {
|
|
27
118
|
const name = value.trim()
|
|
28
119
|
|
|
@@ -120,7 +211,13 @@ export function parseToken(token: string): ParamSpec {
|
|
|
120
211
|
throw declarationError('变长参数必须使用 [ ]')
|
|
121
212
|
}
|
|
122
213
|
|
|
123
|
-
const
|
|
214
|
+
const rest = inner.slice(3)
|
|
215
|
+
|
|
216
|
+
if (rest.includes('(')) {
|
|
217
|
+
throw declarationError(`变长参数不支持长度限制:${token}`)
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
const name = validateName(rest)
|
|
124
221
|
|
|
125
222
|
return {
|
|
126
223
|
name,
|
|
@@ -140,20 +237,30 @@ export function parseToken(token: string): ParamSpec {
|
|
|
140
237
|
const defaultRaw = equals >= 0 ? inner.slice(equals + 1).trim() : undefined
|
|
141
238
|
const colon = head.indexOf(':')
|
|
142
239
|
const name = validateName(colon >= 0 ? head.slice(0, colon) : head)
|
|
143
|
-
const type
|
|
240
|
+
const { type, length } = parseTypeDeclaration(
|
|
241
|
+
colon >= 0 ? head.slice(colon + 1) : 'string',
|
|
242
|
+
token
|
|
243
|
+
)
|
|
144
244
|
|
|
145
245
|
if (required && defaultRaw !== undefined) {
|
|
146
246
|
throw declarationError(`必填参数不能有默认值:${token}`)
|
|
147
247
|
}
|
|
148
248
|
|
|
149
249
|
if (defaultRaw !== undefined) {
|
|
250
|
+
const defaultValue = parseDefaultValue(type, defaultRaw, name)
|
|
251
|
+
|
|
252
|
+
if (typeof defaultValue === 'string') {
|
|
253
|
+
validateDefaultLength(name, defaultValue, length)
|
|
254
|
+
}
|
|
255
|
+
|
|
150
256
|
return {
|
|
151
257
|
name,
|
|
152
258
|
type,
|
|
153
259
|
required,
|
|
154
260
|
rest: false,
|
|
155
261
|
hasDefault: true,
|
|
156
|
-
defaultValue
|
|
262
|
+
defaultValue,
|
|
263
|
+
length,
|
|
157
264
|
}
|
|
158
265
|
}
|
|
159
266
|
|
|
@@ -163,6 +270,7 @@ export function parseToken(token: string): ParamSpec {
|
|
|
163
270
|
required,
|
|
164
271
|
rest: false,
|
|
165
272
|
hasDefault: false,
|
|
273
|
+
length,
|
|
166
274
|
}
|
|
167
275
|
}
|
|
168
276
|
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
type ParamSpec,
|
|
5
5
|
type ParsedCommandParams,
|
|
6
6
|
} from './types.js'
|
|
7
|
-
import { parseAt, parseBoolean, parseTime } from './values.js'
|
|
7
|
+
import { measureLength, parseAt, parseBoolean, parseTime } from './values.js'
|
|
8
8
|
|
|
9
9
|
export function tokenizeInput(input: string, usage: string): InputToken[] {
|
|
10
10
|
const tokens: InputToken[] = []
|
|
@@ -101,6 +101,32 @@ export function tokenizeInput(input: string, usage: string): InputToken[] {
|
|
|
101
101
|
return tokens
|
|
102
102
|
}
|
|
103
103
|
|
|
104
|
+
function enforceLength(spec: ParamSpec, value: string, usage: string): string {
|
|
105
|
+
const length = spec.length
|
|
106
|
+
|
|
107
|
+
if (length === undefined) {
|
|
108
|
+
return value
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const measured = measureLength(value)
|
|
112
|
+
|
|
113
|
+
if (length.min !== undefined && measured < length.min) {
|
|
114
|
+
throw new CommandParamsError(
|
|
115
|
+
`参数 ${spec.name} 至少需要 ${length.min} 个字符`,
|
|
116
|
+
usage
|
|
117
|
+
)
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
if (length.max !== undefined && measured > length.max) {
|
|
121
|
+
throw new CommandParamsError(
|
|
122
|
+
`参数 ${spec.name} 不能超过 ${length.max} 个字符`,
|
|
123
|
+
usage
|
|
124
|
+
)
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
return value
|
|
128
|
+
}
|
|
129
|
+
|
|
104
130
|
export function parseValue(
|
|
105
131
|
spec: ParamSpec,
|
|
106
132
|
raw: string,
|
|
@@ -108,6 +134,7 @@ export function parseValue(
|
|
|
108
134
|
): unknown {
|
|
109
135
|
switch (spec.type) {
|
|
110
136
|
case 'string':
|
|
137
|
+
return enforceLength(spec, raw, usage)
|
|
111
138
|
case 'text':
|
|
112
139
|
return raw
|
|
113
140
|
case 'number': {
|
|
@@ -218,7 +245,7 @@ export function parseInput(
|
|
|
218
245
|
const value =
|
|
219
246
|
remaining === 1 ? token.value : input.slice(token.start).trim()
|
|
220
247
|
|
|
221
|
-
args.push(value)
|
|
248
|
+
args.push(enforceLength(spec, value, usage))
|
|
222
249
|
index = tokens.length
|
|
223
250
|
continue
|
|
224
251
|
}
|
|
@@ -8,12 +8,16 @@ type TrimRight<Source extends string> =
|
|
|
8
8
|
|
|
9
9
|
type Trim<Source extends string> = TrimLeft<TrimRight<Source>>
|
|
10
10
|
|
|
11
|
+
type StripLength<Type extends string> =
|
|
12
|
+
Trim<Type> extends `${infer Base}(${string})` ? Trim<Base> : Trim<Type>
|
|
13
|
+
|
|
11
14
|
type ParamValue<Type extends string> =
|
|
12
|
-
|
|
15
|
+
StripLength<Type> extends 'string' | 'text'
|
|
13
16
|
? string
|
|
14
|
-
:
|
|
17
|
+
: StripLength<Type> extends
|
|
18
|
+
'number' | 'integer' | 'at' | 'reply' | 'time'
|
|
15
19
|
? number
|
|
16
|
-
:
|
|
20
|
+
: StripLength<Type> extends 'boolean'
|
|
17
21
|
? boolean
|
|
18
22
|
: unknown
|
|
19
23
|
|
|
@@ -30,6 +30,11 @@ export class CommandParamsError extends Error {
|
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
+
export interface ParamLength {
|
|
34
|
+
min?: number | undefined
|
|
35
|
+
max?: number | undefined
|
|
36
|
+
}
|
|
37
|
+
|
|
33
38
|
export interface ParamSpec {
|
|
34
39
|
name: string
|
|
35
40
|
type: CommandParamType
|
|
@@ -37,6 +42,7 @@ export interface ParamSpec {
|
|
|
37
42
|
rest: boolean
|
|
38
43
|
hasDefault: boolean
|
|
39
44
|
defaultValue?: unknown
|
|
45
|
+
length?: ParamLength | undefined
|
|
40
46
|
}
|
|
41
47
|
|
|
42
48
|
export interface InputToken {
|
|
@@ -37,6 +37,10 @@ export function unquote(value: string): string {
|
|
|
37
37
|
return result
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
+
export function measureLength(value: string): number {
|
|
41
|
+
return Array.from(value).length
|
|
42
|
+
}
|
|
43
|
+
|
|
40
44
|
export function parseBoolean(value: string): boolean | null {
|
|
41
45
|
const normalized = value.trim().toLowerCase()
|
|
42
46
|
|