@clerc/core 0.10.4 → 0.11.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/index.d.ts +13 -8
- package/dist/{index.cjs → index.js} +38 -49
- package/dist/index.mjs +23 -7
- package/package.json +4 -4
package/dist/index.d.ts
CHANGED
|
@@ -118,8 +118,8 @@ type Raw<C extends CommandRecord = CommandRecord, N extends keyof C = keyof C> =
|
|
|
118
118
|
mergedFlags: TypeFlagWithDefault<C, N>["flags"] & TypeFlagWithDefault<C, N>["unknownFlags"];
|
|
119
119
|
};
|
|
120
120
|
interface HandlerContext<C extends CommandRecord = CommandRecord, N extends keyof C = keyof C> {
|
|
121
|
-
name
|
|
122
|
-
resolved: boolean;
|
|
121
|
+
name: N extends keyof C ? N : N | undefined;
|
|
122
|
+
resolved: N extends keyof C ? true : boolean;
|
|
123
123
|
isSingleCommand: boolean;
|
|
124
124
|
raw: Raw<C, N>;
|
|
125
125
|
parameters: TransformParameters<C, N>;
|
|
@@ -135,7 +135,12 @@ type FallbackType<T, U> = {} extends T ? U : T;
|
|
|
135
135
|
type InspectorContext<C extends CommandRecord = CommandRecord> = HandlerContext<C> & {
|
|
136
136
|
flags: FallbackType<TypeFlag<NonNullable<C[keyof C]["flags"]>>["flags"], Dict<any>>;
|
|
137
137
|
};
|
|
138
|
-
type Inspector<C extends CommandRecord = CommandRecord> =
|
|
138
|
+
type Inspector<C extends CommandRecord = CommandRecord> = InspectorFn<C> | InspectorObject<C>;
|
|
139
|
+
type InspectorFn<C extends CommandRecord = CommandRecord> = (ctx: InspectorContext<C>, next: () => void) => void;
|
|
140
|
+
interface InspectorObject<C extends CommandRecord = CommandRecord> {
|
|
141
|
+
enforce?: "pre" | "post";
|
|
142
|
+
fn: InspectorFn<C>;
|
|
143
|
+
}
|
|
139
144
|
interface Plugin<T extends Clerc = Clerc, U extends Clerc = Clerc> {
|
|
140
145
|
setup: (cli: T) => U;
|
|
141
146
|
}
|
|
@@ -222,8 +227,8 @@ declare class Clerc<C extends CommandRecord = {}> {
|
|
|
222
227
|
* })
|
|
223
228
|
* ```
|
|
224
229
|
*/
|
|
225
|
-
command<N extends string | SingleCommandType, O extends CommandOptions<[...P], A, F>, P extends string[] = string[], A extends MaybeArray<string> = MaybeArray<string>, F extends Dict<FlagOptions> =
|
|
226
|
-
command<N extends string | SingleCommandType, O extends CommandOptions<[...P], A, F>, P extends string[] = string[], A extends MaybeArray<string> = MaybeArray<string>, F extends Dict<FlagOptions> =
|
|
230
|
+
command<N extends string | SingleCommandType, O extends CommandOptions<[...P], A, F>, P extends string[] = string[], A extends MaybeArray<string> = MaybeArray<string>, F extends Dict<FlagOptions> = Dict<FlagOptions>>(c: CommandWithHandler<N, O & CommandOptions<[...P], A, F>>): this & Clerc<C & Record<N, Command<N, O>>>;
|
|
231
|
+
command<N extends string | SingleCommandType, O extends CommandOptions<[...P], A, F>, P extends string[] = string[], A extends MaybeArray<string> = MaybeArray<string>, F extends Dict<FlagOptions> = Dict<FlagOptions>>(name: N, description: string, options?: O & CommandOptions<[...P], A, F>): this & Clerc<C & Record<N, Command<N, O>>>;
|
|
227
232
|
/**
|
|
228
233
|
* Register a handler
|
|
229
234
|
* @param name
|
|
@@ -238,7 +243,7 @@ declare class Clerc<C extends CommandRecord = {}> {
|
|
|
238
243
|
* })
|
|
239
244
|
* ```
|
|
240
245
|
*/
|
|
241
|
-
on<K extends keyof CM, CM extends this["_commands"] = this["_commands"]>(name:
|
|
246
|
+
on<K extends LiteralUnion<keyof CM, string>, CM extends this["_commands"] = this["_commands"]>(name: K, handler: Handler<CM, K>): this;
|
|
242
247
|
/**
|
|
243
248
|
* Use a plugin
|
|
244
249
|
* @param plugin
|
|
@@ -249,7 +254,7 @@ declare class Clerc<C extends CommandRecord = {}> {
|
|
|
249
254
|
* .use(plugin)
|
|
250
255
|
* ```
|
|
251
256
|
*/
|
|
252
|
-
use<T extends Clerc, U extends Clerc>(plugin: Plugin<T, U>): U;
|
|
257
|
+
use<T extends Clerc, U extends Clerc>(plugin: Plugin<T, U>): this & Clerc<C & U["_commands"]> & U;
|
|
253
258
|
/**
|
|
254
259
|
* Register a inspector
|
|
255
260
|
* @param inspector
|
|
@@ -326,4 +331,4 @@ interface ParsedParameter {
|
|
|
326
331
|
declare function parseParameters(parameters: string[]): ParsedParameter[];
|
|
327
332
|
declare function mapParametersToArguments(mapping: Record<string, string | string[]>, parameters: ParsedParameter[], cliArguments: string[]): undefined;
|
|
328
333
|
|
|
329
|
-
export { Clerc, Command, CommandAlias, CommandCustomProperties, CommandExistsError, CommandNameConflictError, CommandOptions, CommandRecord, CommandWithHandler, CommonCommandExistsError, FallbackType, Flag, FlagOptions, Handler, HandlerContext, HandlerInCommand, Inspector, InspectorContext, MakeEventMap, MultipleCommandsMatchedError, NoSuchCommandError, ParentCommandExistsError, Plugin, PossibleInputKind, SingleCommand, SingleCommandAliasError, SingleCommandError, SingleCommandType, SubcommandExistsError, compose, defineCommand, defineHandler, defineInspector, definePlugin, mapParametersToArguments, parseParameters, resolveArgv, resolveCommand, resolveFlattenCommands, resolveParametersBeforeFlag, resolveRootCommands, resolveSubcommandsByParent };
|
|
334
|
+
export { Clerc, Command, CommandAlias, CommandCustomProperties, CommandExistsError, CommandNameConflictError, CommandOptions, CommandRecord, CommandWithHandler, CommonCommandExistsError, FallbackType, Flag, FlagOptions, Handler, HandlerContext, HandlerInCommand, Inspector, InspectorContext, InspectorFn, InspectorObject, MakeEventMap, MultipleCommandsMatchedError, NoSuchCommandError, ParentCommandExistsError, Plugin, PossibleInputKind, SingleCommand, SingleCommandAliasError, SingleCommandError, SingleCommandType, SubcommandExistsError, compose, defineCommand, defineHandler, defineInspector, definePlugin, mapParametersToArguments, parseParameters, resolveArgv, resolveCommand, resolveFlattenCommands, resolveParametersBeforeFlag, resolveRootCommands, resolveSubcommandsByParent };
|
|
@@ -1,11 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
var liteEmit = require('lite-emit');
|
|
6
|
-
var typeFlag = require('type-flag');
|
|
7
|
-
var utils = require('@clerc/utils');
|
|
8
|
-
var isPlatform = require('is-platform');
|
|
1
|
+
import { LiteEmit } from 'lite-emit';
|
|
2
|
+
import { typeFlag } from 'type-flag';
|
|
3
|
+
import { mustArray, arrayStartsWith, camelCase } from '@clerc/utils';
|
|
4
|
+
import { isNode, isDeno } from 'is-platform';
|
|
9
5
|
|
|
10
6
|
class SingleCommandError extends Error {
|
|
11
7
|
constructor() {
|
|
@@ -57,7 +53,7 @@ function resolveFlattenCommands(commands) {
|
|
|
57
53
|
const commandsMap = /* @__PURE__ */ new Map();
|
|
58
54
|
for (const command of Object.values(commands)) {
|
|
59
55
|
if (command.alias) {
|
|
60
|
-
const aliases =
|
|
56
|
+
const aliases = mustArray(command.alias);
|
|
61
57
|
for (const alias of aliases) {
|
|
62
58
|
if (alias in commands) {
|
|
63
59
|
throw new CommandNameConflictError(commands[alias].name, command.name);
|
|
@@ -73,11 +69,11 @@ function resolveCommand(commands, name) {
|
|
|
73
69
|
if (name === SingleCommand) {
|
|
74
70
|
return commands[SingleCommand];
|
|
75
71
|
}
|
|
76
|
-
const nameArr =
|
|
72
|
+
const nameArr = mustArray(name);
|
|
77
73
|
const commandsMap = resolveFlattenCommands(commands);
|
|
78
74
|
const possibleCommands = [];
|
|
79
75
|
commandsMap.forEach((v, k) => {
|
|
80
|
-
if (
|
|
76
|
+
if (arrayStartsWith(nameArr, k)) {
|
|
81
77
|
possibleCommands.push(v);
|
|
82
78
|
}
|
|
83
79
|
});
|
|
@@ -91,7 +87,7 @@ function resolveSubcommandsByParent(commands, parent, depth = Infinity) {
|
|
|
91
87
|
const parentArr = parent === "" ? [] : Array.isArray(parent) ? parent : parent.split(" ");
|
|
92
88
|
return Object.values(commands).filter((c) => {
|
|
93
89
|
const commandNameArr = c.name.split(" ");
|
|
94
|
-
return
|
|
90
|
+
return arrayStartsWith(commandNameArr, parentArr) && commandNameArr.length - parentArr.length <= depth;
|
|
95
91
|
});
|
|
96
92
|
}
|
|
97
93
|
const resolveRootCommands = (commands) => resolveSubcommandsByParent(commands, "", 1);
|
|
@@ -108,12 +104,25 @@ function resolveParametersBeforeFlag(argv, isSingleCommand) {
|
|
|
108
104
|
}
|
|
109
105
|
return parameters;
|
|
110
106
|
}
|
|
111
|
-
const resolveArgv = () =>
|
|
107
|
+
const resolveArgv = () => isNode() ? process.argv.slice(2) : isDeno() ? Deno.args : [];
|
|
112
108
|
function compose(inspectors) {
|
|
109
|
+
const preInspectors = [];
|
|
110
|
+
const normalInspectors = [];
|
|
111
|
+
const postInspectors = [];
|
|
112
|
+
for (const inspector of inspectors) {
|
|
113
|
+
const objectInspector = typeof inspector === "object" ? inspector : { fn: inspector };
|
|
114
|
+
const { enforce } = objectInspector;
|
|
115
|
+
(enforce === "pre" ? preInspectors : enforce === "post" ? postInspectors : normalInspectors).push(objectInspector.fn);
|
|
116
|
+
}
|
|
117
|
+
const mergedInspectorFns = [
|
|
118
|
+
...preInspectors,
|
|
119
|
+
...normalInspectors,
|
|
120
|
+
...postInspectors
|
|
121
|
+
];
|
|
113
122
|
return (getCtx) => {
|
|
114
123
|
return dispatch(0);
|
|
115
124
|
function dispatch(i) {
|
|
116
|
-
const inspector =
|
|
125
|
+
const inspector = mergedInspectorFns[i];
|
|
117
126
|
return inspector(getCtx(), dispatch.bind(null, i + 1));
|
|
118
127
|
}
|
|
119
128
|
};
|
|
@@ -161,7 +170,7 @@ function parseParameters(parameters) {
|
|
|
161
170
|
function mapParametersToArguments(mapping, parameters, cliArguments) {
|
|
162
171
|
for (let i = 0; i < parameters.length; i += 1) {
|
|
163
172
|
const { name, required, spread } = parameters[i];
|
|
164
|
-
const camelCaseName =
|
|
173
|
+
const camelCaseName = camelCase(name);
|
|
165
174
|
if (camelCaseName in mapping) {
|
|
166
175
|
throw new Error(`Invalid parameter: ${stringify(name)} is used more than once.`);
|
|
167
176
|
}
|
|
@@ -207,7 +216,7 @@ const _Clerc = class {
|
|
|
207
216
|
__privateAdd(this, _version, "");
|
|
208
217
|
__privateAdd(this, _inspectors, []);
|
|
209
218
|
__privateAdd(this, _commands, {});
|
|
210
|
-
__privateAdd(this, _commandEmitter, new
|
|
219
|
+
__privateAdd(this, _commandEmitter, new LiteEmit());
|
|
211
220
|
}
|
|
212
221
|
get _name() {
|
|
213
222
|
return __privateGet(this, _name);
|
|
@@ -260,10 +269,10 @@ const _Clerc = class {
|
|
|
260
269
|
if (name !== SingleCommand) {
|
|
261
270
|
const splitedName = name.split(" ");
|
|
262
271
|
const existedCommandNames = Object.keys(__privateGet(this, _commands)).filter((name2) => typeof name2 === "string").map((name2) => name2.split(" "));
|
|
263
|
-
if (existedCommandNames.some((name2) =>
|
|
272
|
+
if (existedCommandNames.some((name2) => arrayStartsWith(splitedName, name2))) {
|
|
264
273
|
throw new ParentCommandExistsError(splitedName.join(" "));
|
|
265
274
|
}
|
|
266
|
-
if (existedCommandNames.some((name2) =>
|
|
275
|
+
if (existedCommandNames.some((name2) => arrayStartsWith(name2, splitedName))) {
|
|
267
276
|
throw new SubcommandExistsError(splitedName.join(" "));
|
|
268
277
|
}
|
|
269
278
|
}
|
|
@@ -292,7 +301,7 @@ const _Clerc = class {
|
|
|
292
301
|
const getContext = () => {
|
|
293
302
|
const command = getCommand();
|
|
294
303
|
const isCommandResolved = !!command;
|
|
295
|
-
const parsed = typeFlag
|
|
304
|
+
const parsed = typeFlag((command == null ? void 0 : command.flags) || {}, [...argv]);
|
|
296
305
|
const { _: args, flags } = parsed;
|
|
297
306
|
let parameters = __privateGet(this, _isSingleCommand, isSingleCommand_get) || !isCommandResolved ? args : args.slice(command.name.split(" ").length);
|
|
298
307
|
let commandParameters = (command == null ? void 0 : command.parameters) || [];
|
|
@@ -333,13 +342,16 @@ const _Clerc = class {
|
|
|
333
342
|
};
|
|
334
343
|
return context;
|
|
335
344
|
};
|
|
336
|
-
const emitHandler =
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
345
|
+
const emitHandler = {
|
|
346
|
+
enforce: "post",
|
|
347
|
+
fn: () => {
|
|
348
|
+
const command = getCommand();
|
|
349
|
+
const handlerContext = getContext();
|
|
350
|
+
if (!command) {
|
|
351
|
+
throw new NoSuchCommandError(stringName);
|
|
352
|
+
}
|
|
353
|
+
__privateGet(this, _commandEmitter).emit(command.name, handlerContext);
|
|
341
354
|
}
|
|
342
|
-
__privateGet(this, _commandEmitter).emit(command.name, handlerContext);
|
|
343
355
|
};
|
|
344
356
|
const inspectors = [...__privateGet(this, _inspectors), emitHandler];
|
|
345
357
|
const callInspector = compose(inspectors);
|
|
@@ -368,27 +380,4 @@ const defineHandler = (_cli, _key, handler) => handler;
|
|
|
368
380
|
const defineInspector = (_cli, inspector) => inspector;
|
|
369
381
|
const defineCommand = (c) => c;
|
|
370
382
|
|
|
371
|
-
|
|
372
|
-
exports.CommandExistsError = CommandExistsError;
|
|
373
|
-
exports.CommandNameConflictError = CommandNameConflictError;
|
|
374
|
-
exports.CommonCommandExistsError = CommonCommandExistsError;
|
|
375
|
-
exports.MultipleCommandsMatchedError = MultipleCommandsMatchedError;
|
|
376
|
-
exports.NoSuchCommandError = NoSuchCommandError;
|
|
377
|
-
exports.ParentCommandExistsError = ParentCommandExistsError;
|
|
378
|
-
exports.SingleCommand = SingleCommand;
|
|
379
|
-
exports.SingleCommandAliasError = SingleCommandAliasError;
|
|
380
|
-
exports.SingleCommandError = SingleCommandError;
|
|
381
|
-
exports.SubcommandExistsError = SubcommandExistsError;
|
|
382
|
-
exports.compose = compose;
|
|
383
|
-
exports.defineCommand = defineCommand;
|
|
384
|
-
exports.defineHandler = defineHandler;
|
|
385
|
-
exports.defineInspector = defineInspector;
|
|
386
|
-
exports.definePlugin = definePlugin;
|
|
387
|
-
exports.mapParametersToArguments = mapParametersToArguments;
|
|
388
|
-
exports.parseParameters = parseParameters;
|
|
389
|
-
exports.resolveArgv = resolveArgv;
|
|
390
|
-
exports.resolveCommand = resolveCommand;
|
|
391
|
-
exports.resolveFlattenCommands = resolveFlattenCommands;
|
|
392
|
-
exports.resolveParametersBeforeFlag = resolveParametersBeforeFlag;
|
|
393
|
-
exports.resolveRootCommands = resolveRootCommands;
|
|
394
|
-
exports.resolveSubcommandsByParent = resolveSubcommandsByParent;
|
|
383
|
+
export { Clerc, CommandExistsError, CommandNameConflictError, CommonCommandExistsError, MultipleCommandsMatchedError, NoSuchCommandError, ParentCommandExistsError, SingleCommand, SingleCommandAliasError, SingleCommandError, SubcommandExistsError, compose, defineCommand, defineHandler, defineInspector, definePlugin, mapParametersToArguments, parseParameters, resolveArgv, resolveCommand, resolveFlattenCommands, resolveParametersBeforeFlag, resolveRootCommands, resolveSubcommandsByParent };
|
package/dist/index.mjs
CHANGED
|
@@ -106,10 +106,23 @@ function resolveParametersBeforeFlag(argv, isSingleCommand) {
|
|
|
106
106
|
}
|
|
107
107
|
const resolveArgv = () => isNode() ? process.argv.slice(2) : isDeno() ? Deno.args : [];
|
|
108
108
|
function compose(inspectors) {
|
|
109
|
+
const preInspectors = [];
|
|
110
|
+
const normalInspectors = [];
|
|
111
|
+
const postInspectors = [];
|
|
112
|
+
for (const inspector of inspectors) {
|
|
113
|
+
const objectInspector = typeof inspector === "object" ? inspector : { fn: inspector };
|
|
114
|
+
const { enforce } = objectInspector;
|
|
115
|
+
(enforce === "pre" ? preInspectors : enforce === "post" ? postInspectors : normalInspectors).push(objectInspector.fn);
|
|
116
|
+
}
|
|
117
|
+
const mergedInspectorFns = [
|
|
118
|
+
...preInspectors,
|
|
119
|
+
...normalInspectors,
|
|
120
|
+
...postInspectors
|
|
121
|
+
];
|
|
109
122
|
return (getCtx) => {
|
|
110
123
|
return dispatch(0);
|
|
111
124
|
function dispatch(i) {
|
|
112
|
-
const inspector =
|
|
125
|
+
const inspector = mergedInspectorFns[i];
|
|
113
126
|
return inspector(getCtx(), dispatch.bind(null, i + 1));
|
|
114
127
|
}
|
|
115
128
|
};
|
|
@@ -329,13 +342,16 @@ const _Clerc = class {
|
|
|
329
342
|
};
|
|
330
343
|
return context;
|
|
331
344
|
};
|
|
332
|
-
const emitHandler =
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
345
|
+
const emitHandler = {
|
|
346
|
+
enforce: "post",
|
|
347
|
+
fn: () => {
|
|
348
|
+
const command = getCommand();
|
|
349
|
+
const handlerContext = getContext();
|
|
350
|
+
if (!command) {
|
|
351
|
+
throw new NoSuchCommandError(stringName);
|
|
352
|
+
}
|
|
353
|
+
__privateGet(this, _commandEmitter).emit(command.name, handlerContext);
|
|
337
354
|
}
|
|
338
|
-
__privateGet(this, _commandEmitter).emit(command.name, handlerContext);
|
|
339
355
|
};
|
|
340
356
|
const inspectors = [...__privateGet(this, _inspectors), emitHandler];
|
|
341
357
|
const callInspector = compose(inspectors);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@clerc/core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.0",
|
|
4
4
|
"author": "Ray <nn_201312@163.com> (https://github.com/so1ve)",
|
|
5
5
|
"description": "Clerc core",
|
|
6
6
|
"keywords": [
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
"args",
|
|
12
12
|
"terminal"
|
|
13
13
|
],
|
|
14
|
+
"type": "module",
|
|
14
15
|
"homepage": "https://github.com/so1ve/clerc/tree/main/packages/core#readme",
|
|
15
16
|
"repository": {
|
|
16
17
|
"type": "git",
|
|
@@ -25,11 +26,10 @@
|
|
|
25
26
|
"exports": {
|
|
26
27
|
".": {
|
|
27
28
|
"types": "./dist/index.d.ts",
|
|
28
|
-
"require": "./dist/index.cjs",
|
|
29
29
|
"import": "./dist/index.mjs"
|
|
30
30
|
}
|
|
31
31
|
},
|
|
32
|
-
"main": "dist/index.
|
|
32
|
+
"main": "dist/index.js",
|
|
33
33
|
"module": "dist/index.mjs",
|
|
34
34
|
"types": "dist/index.d.ts",
|
|
35
35
|
"typesVersions": {
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
"is-platform": "^0.2.0",
|
|
51
51
|
"lite-emit": "^1.4.0",
|
|
52
52
|
"type-flag": "^3.0.0",
|
|
53
|
-
"@clerc/utils": "0.
|
|
53
|
+
"@clerc/utils": "0.11.0"
|
|
54
54
|
},
|
|
55
55
|
"scripts": {
|
|
56
56
|
"build": "puild",
|