@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 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?: N;
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> = (ctx: InspectorContext<C>, next: () => void) => void;
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> = {}>(c: CommandWithHandler<N, O & CommandOptions<[...P], A, F>>): this & Clerc<C & Record<N, Command<N, O>>>;
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> = {}>(name: N, description: string, options?: O & CommandOptions<[...P], A, F>): this & Clerc<C & Record<N, Command<N, O>>>;
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: LiteralUnion<K, string>, handler: Handler<CM, K>): this;
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
- 'use strict';
2
-
3
- Object.defineProperty(exports, '__esModule', { value: true });
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 = utils.mustArray(command.alias);
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 = utils.mustArray(name);
72
+ const nameArr = mustArray(name);
77
73
  const commandsMap = resolveFlattenCommands(commands);
78
74
  const possibleCommands = [];
79
75
  commandsMap.forEach((v, k) => {
80
- if (utils.arrayStartsWith(nameArr, k)) {
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 utils.arrayStartsWith(commandNameArr, parentArr) && commandNameArr.length - parentArr.length <= depth;
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 = () => isPlatform.isNode() ? process.argv.slice(2) : isPlatform.isDeno() ? Deno.args : [];
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 = inspectors[i];
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 = utils.camelCase(name);
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 liteEmit.LiteEmit());
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) => utils.arrayStartsWith(splitedName, name2))) {
272
+ if (existedCommandNames.some((name2) => arrayStartsWith(splitedName, name2))) {
264
273
  throw new ParentCommandExistsError(splitedName.join(" "));
265
274
  }
266
- if (existedCommandNames.some((name2) => utils.arrayStartsWith(name2, splitedName))) {
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.typeFlag((command == null ? void 0 : command.flags) || {}, [...argv]);
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
- const command = getCommand();
338
- const handlerContext = getContext();
339
- if (!command) {
340
- throw new NoSuchCommandError(stringName);
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
- exports.Clerc = Clerc;
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 = inspectors[i];
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
- const command = getCommand();
334
- const handlerContext = getContext();
335
- if (!command) {
336
- throw new NoSuchCommandError(stringName);
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.10.4",
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.cjs",
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.10.4"
53
+ "@clerc/utils": "0.11.0"
54
54
  },
55
55
  "scripts": {
56
56
  "build": "puild",