@clerc/core 0.17.2 → 0.18.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 CHANGED
@@ -69,6 +69,7 @@ type TypeFlag<Schemas extends Flags> = ParsedFlags<{
69
69
  [flag in keyof Schemas]: InferFlagType<Schemas[flag]>;
70
70
  }>;
71
71
 
72
+ type CommandType = SingleCommandType | string;
72
73
  type FlagOptions = FlagSchema & {
73
74
  description?: string;
74
75
  };
@@ -305,15 +306,6 @@ declare class NoSuchCommandError extends Error {
305
306
  declare class NoCommandGivenError extends Error {
306
307
  constructor();
307
308
  }
308
- declare class ParentCommandExistsError extends Error {
309
- constructor(name: string);
310
- }
311
- declare class SubcommandExistsError extends Error {
312
- constructor(name: string);
313
- }
314
- declare class MultipleCommandsMatchedError extends Error {
315
- constructor(name: string);
316
- }
317
309
  declare class CommandNameConflictError extends Error {
318
310
  constructor(n1: string, n2: string);
319
311
  }
@@ -325,6 +317,9 @@ declare class DescriptionNotSetError extends Error {
325
317
  }
326
318
  declare class VersionNotSetError extends Error {
327
319
  constructor();
320
+ }
321
+ declare class InvalidCommandNameError extends Error {
322
+ constructor(name: string);
328
323
  }
329
324
 
330
325
  declare function resolveFlattenCommands(commands: CommandRecord): Map<string[], CommandAlias<string, CommandOptions<string[], _clerc_utils.MaybeArray<string>, _clerc_utils.Dict<FlagOptions>>>>;
@@ -333,7 +328,8 @@ declare function resolveSubcommandsByParent(commands: CommandRecord, parent: str
333
328
  declare const resolveRootCommands: (commands: CommandRecord) => Command<string, CommandOptions<string[], _clerc_utils.MaybeArray<string>, _clerc_utils.Dict<FlagOptions>>>[];
334
329
  declare function resolveParametersBeforeFlag(argv: string[], isSingleCommand: boolean): string[];
335
330
  declare const resolveArgv: () => string[];
336
- declare function compose(inspectors: Inspector[]): (getCtx: () => InspectorContext) => void;
331
+ declare function compose(inspectors: Inspector[]): (getCtx: () => InspectorContext) => void;
332
+ declare const isInvalidName: (name: CommandType) => boolean;
337
333
 
338
334
  interface ParsedParameter {
339
335
  name: string;
@@ -343,4 +339,4 @@ interface ParsedParameter {
343
339
  declare function parseParameters(parameters: string[]): ParsedParameter[];
344
340
  declare function mapParametersToArguments(mapping: Record<string, string | string[]>, parameters: ParsedParameter[], cliArguments: string[]): Error | undefined;
345
341
 
346
- export { Clerc, Command, CommandAlias, CommandCustomProperties, CommandExistsError, CommandNameConflictError, CommandOptions, CommandRecord, CommandWithHandler, CommonCommandExistsError, DescriptionNotSetError, FallbackType, Flag, FlagOptions, Handler, HandlerContext, HandlerInCommand, Inspector, InspectorContext, InspectorFn, InspectorObject, MakeEventMap, MultipleCommandsMatchedError, NameNotSetError, NoCommandGivenError, NoSuchCommandError, ParentCommandExistsError, Plugin, PossibleInputKind, SingleCommand, SingleCommandAliasError, SingleCommandError, SingleCommandType, SubcommandExistsError, VersionNotSetError, compose, defineCommand, defineHandler, defineInspector, definePlugin, mapParametersToArguments, parseParameters, resolveArgv, resolveCommand, resolveFlattenCommands, resolveParametersBeforeFlag, resolveRootCommands, resolveSubcommandsByParent };
342
+ export { Clerc, Command, CommandAlias, CommandCustomProperties, CommandExistsError, CommandNameConflictError, CommandOptions, CommandRecord, CommandType, CommandWithHandler, CommonCommandExistsError, DescriptionNotSetError, FallbackType, Flag, FlagOptions, Handler, HandlerContext, HandlerInCommand, Inspector, InspectorContext, InspectorFn, InspectorObject, InvalidCommandNameError, MakeEventMap, NameNotSetError, NoCommandGivenError, NoSuchCommandError, Plugin, PossibleInputKind, SingleCommand, SingleCommandAliasError, SingleCommandError, SingleCommandType, VersionNotSetError, compose, defineCommand, defineHandler, defineInspector, definePlugin, isInvalidName, mapParametersToArguments, parseParameters, resolveArgv, resolveCommand, resolveFlattenCommands, resolveParametersBeforeFlag, resolveRootCommands, resolveSubcommandsByParent };
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { LiteEmit } from 'lite-emit';
2
2
  import { typeFlag } from 'type-flag';
3
- import { mustArray, arrayStartsWith, camelCase } from '@clerc/utils';
3
+ import { toArray, arrayStartsWith, camelCase } from '@clerc/utils';
4
4
  import { isNode, isDeno } from 'is-platform';
5
5
 
6
6
  class SingleCommandError extends Error {
@@ -33,21 +33,6 @@ class NoCommandGivenError extends Error {
33
33
  super("No command given.");
34
34
  }
35
35
  }
36
- class ParentCommandExistsError extends Error {
37
- constructor(name) {
38
- super(`Command "${name}" cannot exist with its parent.`);
39
- }
40
- }
41
- class SubcommandExistsError extends Error {
42
- constructor(name) {
43
- super(`Command "${name}" cannot exist with its subcommand.`);
44
- }
45
- }
46
- class MultipleCommandsMatchedError extends Error {
47
- constructor(name) {
48
- super(`Multiple commands matched: ${name}`);
49
- }
50
- }
51
36
  class CommandNameConflictError extends Error {
52
37
  constructor(n1, n2) {
53
38
  super(`Command name ${n1} conflicts with ${n2}. Maybe caused by alias.`);
@@ -68,12 +53,17 @@ class VersionNotSetError extends Error {
68
53
  super("Version not set.");
69
54
  }
70
55
  }
56
+ class InvalidCommandNameError extends Error {
57
+ constructor(name) {
58
+ super(`Bad name format: ${name}`);
59
+ }
60
+ }
71
61
 
72
62
  function resolveFlattenCommands(commands) {
73
63
  const commandsMap = /* @__PURE__ */ new Map();
74
64
  for (const command of Object.values(commands)) {
75
65
  if (command.alias) {
76
- const aliases = mustArray(command.alias);
66
+ const aliases = toArray(command.alias);
77
67
  for (const alias of aliases) {
78
68
  if (alias in commands) {
79
69
  throw new CommandNameConflictError(commands[alias].name, command.name);
@@ -89,19 +79,17 @@ function resolveCommand(commands, name) {
89
79
  if (name === SingleCommand) {
90
80
  return commands[SingleCommand];
91
81
  }
92
- const nameArr = mustArray(name);
82
+ const nameArr = toArray(name);
93
83
  const commandsMap = resolveFlattenCommands(commands);
94
- const possibleCommands = [];
84
+ let current;
85
+ let currentName;
95
86
  commandsMap.forEach((v, k) => {
96
- if (arrayStartsWith(nameArr, k)) {
97
- possibleCommands.push(v);
87
+ if (arrayStartsWith(nameArr, k) && (!currentName || k.length > currentName.length)) {
88
+ current = v;
89
+ currentName = k;
98
90
  }
99
91
  });
100
- if (possibleCommands.length > 1) {
101
- const matchedCommandNames = possibleCommands.map((c) => c.name).join(", ");
102
- throw new MultipleCommandsMatchedError(matchedCommandNames);
103
- }
104
- return possibleCommands[0];
92
+ return current;
105
93
  }
106
94
  function resolveSubcommandsByParent(commands, parent, depth = Infinity) {
107
95
  const parentArr = parent === "" ? [] : Array.isArray(parent) ? parent : parent.split(" ");
@@ -147,6 +135,7 @@ function compose(inspectors) {
147
135
  }
148
136
  };
149
137
  }
138
+ const isInvalidName = (name) => typeof name === "string" && (name.startsWith(" ") || name.endsWith(" "));
150
139
 
151
140
  const { stringify } = JSON;
152
141
  function parseParameters(parameters) {
@@ -275,6 +264,9 @@ const _Clerc = class {
275
264
  throw new CommandExistsError("SingleCommand");
276
265
  }
277
266
  }
267
+ if (isInvalidName(name)) {
268
+ throw new InvalidCommandNameError(name);
269
+ }
278
270
  if (__privateGet(this, _isSingleCommand, isSingleCommand_get)) {
279
271
  throw new SingleCommandError();
280
272
  }
@@ -284,21 +276,16 @@ const _Clerc = class {
284
276
  if (name === SingleCommand && (isCommandObject ? nameOrCommand : options).alias) {
285
277
  throw new SingleCommandAliasError();
286
278
  }
287
- if (name !== SingleCommand) {
288
- const splitedName = name.split(" ");
289
- const existedCommandNames = Object.keys(__privateGet(this, _commands)).filter((name2) => typeof name2 === "string").map((name2) => name2.split(" "));
290
- if (existedCommandNames.some((name2) => arrayStartsWith(splitedName, name2))) {
291
- throw new ParentCommandExistsError(splitedName.join(" "));
292
- }
293
- if (existedCommandNames.some((name2) => arrayStartsWith(name2, splitedName))) {
294
- throw new SubcommandExistsError(splitedName.join(" "));
279
+ const { handler = void 0, ...commandToSave } = isCommandObject ? nameOrCommand : { name, description, ...options };
280
+ const nameList = [commandToSave.name];
281
+ commandToSave.alias && nameList.push(...toArray(commandToSave.alias));
282
+ for (const name2 of nameList) {
283
+ if (Object.keys(__privateGet(this, _commands)).includes(name2) || Object.values(__privateGet(this, _commands)).some(({ alias }) => alias ? toArray(alias).includes(name2) : false)) {
284
+ throw new CommandExistsError(name2);
295
285
  }
296
286
  }
297
- const { handler = void 0, ...commandToSave } = isCommandObject ? nameOrCommand : { name, description, ...options };
298
287
  __privateGet(this, _commands)[name] = commandToSave;
299
- if (isCommandObject && handler) {
300
- this.on(nameOrCommand.name, handler);
301
- }
288
+ isCommandObject && handler && this.on(nameOrCommand.name, handler);
302
289
  return this;
303
290
  }
304
291
  on(name, handler) {
@@ -417,4 +404,4 @@ const defineHandler = (_cli, _key, handler) => handler;
417
404
  const defineInspector = (_cli, inspector) => inspector;
418
405
  const defineCommand = (command) => command;
419
406
 
420
- export { Clerc, CommandExistsError, CommandNameConflictError, CommonCommandExistsError, DescriptionNotSetError, MultipleCommandsMatchedError, NameNotSetError, NoCommandGivenError, NoSuchCommandError, ParentCommandExistsError, SingleCommand, SingleCommandAliasError, SingleCommandError, SubcommandExistsError, VersionNotSetError, compose, defineCommand, defineHandler, defineInspector, definePlugin, mapParametersToArguments, parseParameters, resolveArgv, resolveCommand, resolveFlattenCommands, resolveParametersBeforeFlag, resolveRootCommands, resolveSubcommandsByParent };
407
+ export { Clerc, CommandExistsError, CommandNameConflictError, CommonCommandExistsError, DescriptionNotSetError, InvalidCommandNameError, NameNotSetError, NoCommandGivenError, NoSuchCommandError, SingleCommand, SingleCommandAliasError, SingleCommandError, VersionNotSetError, compose, defineCommand, defineHandler, defineInspector, definePlugin, isInvalidName, mapParametersToArguments, parseParameters, resolveArgv, resolveCommand, resolveFlattenCommands, resolveParametersBeforeFlag, resolveRootCommands, resolveSubcommandsByParent };
package/dist/index.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  import { LiteEmit } from 'lite-emit';
2
2
  import { typeFlag } from 'type-flag';
3
- import { mustArray, arrayStartsWith, camelCase } from '@clerc/utils';
3
+ import { toArray, arrayStartsWith, camelCase } from '@clerc/utils';
4
4
  import { isNode, isDeno } from 'is-platform';
5
5
 
6
6
  class SingleCommandError extends Error {
@@ -33,21 +33,6 @@ class NoCommandGivenError extends Error {
33
33
  super("No command given.");
34
34
  }
35
35
  }
36
- class ParentCommandExistsError extends Error {
37
- constructor(name) {
38
- super(`Command "${name}" cannot exist with its parent.`);
39
- }
40
- }
41
- class SubcommandExistsError extends Error {
42
- constructor(name) {
43
- super(`Command "${name}" cannot exist with its subcommand.`);
44
- }
45
- }
46
- class MultipleCommandsMatchedError extends Error {
47
- constructor(name) {
48
- super(`Multiple commands matched: ${name}`);
49
- }
50
- }
51
36
  class CommandNameConflictError extends Error {
52
37
  constructor(n1, n2) {
53
38
  super(`Command name ${n1} conflicts with ${n2}. Maybe caused by alias.`);
@@ -68,12 +53,17 @@ class VersionNotSetError extends Error {
68
53
  super("Version not set.");
69
54
  }
70
55
  }
56
+ class InvalidCommandNameError extends Error {
57
+ constructor(name) {
58
+ super(`Bad name format: ${name}`);
59
+ }
60
+ }
71
61
 
72
62
  function resolveFlattenCommands(commands) {
73
63
  const commandsMap = /* @__PURE__ */ new Map();
74
64
  for (const command of Object.values(commands)) {
75
65
  if (command.alias) {
76
- const aliases = mustArray(command.alias);
66
+ const aliases = toArray(command.alias);
77
67
  for (const alias of aliases) {
78
68
  if (alias in commands) {
79
69
  throw new CommandNameConflictError(commands[alias].name, command.name);
@@ -89,19 +79,17 @@ function resolveCommand(commands, name) {
89
79
  if (name === SingleCommand) {
90
80
  return commands[SingleCommand];
91
81
  }
92
- const nameArr = mustArray(name);
82
+ const nameArr = toArray(name);
93
83
  const commandsMap = resolveFlattenCommands(commands);
94
- const possibleCommands = [];
84
+ let current;
85
+ let currentName;
95
86
  commandsMap.forEach((v, k) => {
96
- if (arrayStartsWith(nameArr, k)) {
97
- possibleCommands.push(v);
87
+ if (arrayStartsWith(nameArr, k) && (!currentName || k.length > currentName.length)) {
88
+ current = v;
89
+ currentName = k;
98
90
  }
99
91
  });
100
- if (possibleCommands.length > 1) {
101
- const matchedCommandNames = possibleCommands.map((c) => c.name).join(", ");
102
- throw new MultipleCommandsMatchedError(matchedCommandNames);
103
- }
104
- return possibleCommands[0];
92
+ return current;
105
93
  }
106
94
  function resolveSubcommandsByParent(commands, parent, depth = Infinity) {
107
95
  const parentArr = parent === "" ? [] : Array.isArray(parent) ? parent : parent.split(" ");
@@ -147,6 +135,7 @@ function compose(inspectors) {
147
135
  }
148
136
  };
149
137
  }
138
+ const isInvalidName = (name) => typeof name === "string" && (name.startsWith(" ") || name.endsWith(" "));
150
139
 
151
140
  const { stringify } = JSON;
152
141
  function parseParameters(parameters) {
@@ -275,6 +264,9 @@ const _Clerc = class {
275
264
  throw new CommandExistsError("SingleCommand");
276
265
  }
277
266
  }
267
+ if (isInvalidName(name)) {
268
+ throw new InvalidCommandNameError(name);
269
+ }
278
270
  if (__privateGet(this, _isSingleCommand, isSingleCommand_get)) {
279
271
  throw new SingleCommandError();
280
272
  }
@@ -284,21 +276,16 @@ const _Clerc = class {
284
276
  if (name === SingleCommand && (isCommandObject ? nameOrCommand : options).alias) {
285
277
  throw new SingleCommandAliasError();
286
278
  }
287
- if (name !== SingleCommand) {
288
- const splitedName = name.split(" ");
289
- const existedCommandNames = Object.keys(__privateGet(this, _commands)).filter((name2) => typeof name2 === "string").map((name2) => name2.split(" "));
290
- if (existedCommandNames.some((name2) => arrayStartsWith(splitedName, name2))) {
291
- throw new ParentCommandExistsError(splitedName.join(" "));
292
- }
293
- if (existedCommandNames.some((name2) => arrayStartsWith(name2, splitedName))) {
294
- throw new SubcommandExistsError(splitedName.join(" "));
279
+ const { handler = void 0, ...commandToSave } = isCommandObject ? nameOrCommand : { name, description, ...options };
280
+ const nameList = [commandToSave.name];
281
+ commandToSave.alias && nameList.push(...toArray(commandToSave.alias));
282
+ for (const name2 of nameList) {
283
+ if (Object.keys(__privateGet(this, _commands)).includes(name2) || Object.values(__privateGet(this, _commands)).some(({ alias }) => alias ? toArray(alias).includes(name2) : false)) {
284
+ throw new CommandExistsError(name2);
295
285
  }
296
286
  }
297
- const { handler = void 0, ...commandToSave } = isCommandObject ? nameOrCommand : { name, description, ...options };
298
287
  __privateGet(this, _commands)[name] = commandToSave;
299
- if (isCommandObject && handler) {
300
- this.on(nameOrCommand.name, handler);
301
- }
288
+ isCommandObject && handler && this.on(nameOrCommand.name, handler);
302
289
  return this;
303
290
  }
304
291
  on(name, handler) {
@@ -417,4 +404,4 @@ const defineHandler = (_cli, _key, handler) => handler;
417
404
  const defineInspector = (_cli, inspector) => inspector;
418
405
  const defineCommand = (command) => command;
419
406
 
420
- export { Clerc, CommandExistsError, CommandNameConflictError, CommonCommandExistsError, DescriptionNotSetError, MultipleCommandsMatchedError, NameNotSetError, NoCommandGivenError, NoSuchCommandError, ParentCommandExistsError, SingleCommand, SingleCommandAliasError, SingleCommandError, SubcommandExistsError, VersionNotSetError, compose, defineCommand, defineHandler, defineInspector, definePlugin, mapParametersToArguments, parseParameters, resolveArgv, resolveCommand, resolveFlattenCommands, resolveParametersBeforeFlag, resolveRootCommands, resolveSubcommandsByParent };
407
+ export { Clerc, CommandExistsError, CommandNameConflictError, CommonCommandExistsError, DescriptionNotSetError, InvalidCommandNameError, NameNotSetError, NoCommandGivenError, NoSuchCommandError, SingleCommand, SingleCommandAliasError, SingleCommandError, VersionNotSetError, compose, defineCommand, defineHandler, defineInspector, definePlugin, isInvalidName, mapParametersToArguments, parseParameters, resolveArgv, resolveCommand, resolveFlattenCommands, resolveParametersBeforeFlag, resolveRootCommands, resolveSubcommandsByParent };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@clerc/core",
3
- "version": "0.17.2",
3
+ "version": "0.18.0",
4
4
  "author": "Ray <nn_201312@163.com> (https://github.com/so1ve)",
5
5
  "description": "Clerc core",
6
6
  "keywords": [
@@ -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.17.2"
53
+ "@clerc/utils": "0.18.0"
54
54
  },
55
55
  "scripts": {
56
56
  "build": "puild",