@oclif/core 1.6.4 → 1.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,27 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
4
4
 
5
+ ### [1.8.1](https://github.com/oclif/core/compare/v1.8.0...v1.8.1) (2022-05-10)
6
+
7
+
8
+ ### Bug Fixes
9
+
10
+ * improve algo for collating command id ([#415](https://github.com/oclif/core/issues/415)) ([1a9bfdb](https://github.com/oclif/core/commit/1a9bfdb810e13506ed8fc4138cde1912981b97e3))
11
+
12
+ ## [1.8.0](https://github.com/oclif/core/compare/v1.7.0...v1.8.0) (2022-05-06)
13
+
14
+
15
+ ### Features
16
+
17
+ * improve Command interface ([#416](https://github.com/oclif/core/issues/416)) ([ed625e1](https://github.com/oclif/core/commit/ed625e1554a09e578e645ddd7aa2ddb1b368c03f))
18
+
19
+ ## [1.7.0](https://github.com/oclif/core/compare/v1.6.4...v1.7.0) (2022-04-11)
20
+
21
+
22
+ ### Features
23
+
24
+ * move console.log to single class method ([#400](https://github.com/oclif/core/issues/400)) ([2ccb274](https://github.com/oclif/core/commit/2ccb2740912dba3b81c4d36712fbb20fd6a03c23))
25
+
5
26
  ### [1.6.4](https://github.com/oclif/core/compare/v1.6.3...v1.6.4) (2022-03-31)
6
27
 
7
28
 
@@ -43,16 +43,16 @@ export declare class Config implements IConfig {
43
43
  loadDevPlugins(): Promise<void>;
44
44
  loadUserPlugins(): Promise<void>;
45
45
  runHook<T extends keyof Hooks>(event: T, opts: Hooks[T]['options'], timeout?: number): Promise<Hook.Result<Hooks[T]['return']>>;
46
- runCommand<T = unknown>(id: string, argv?: string[], cachedCommand?: Command.Plugin): Promise<T>;
46
+ runCommand<T = unknown>(id: string, argv?: string[], cachedCommand?: Command.Loadable): Promise<T>;
47
47
  scopedEnvVar(k: string): string | undefined;
48
48
  scopedEnvVarTrue(k: string): boolean;
49
49
  scopedEnvVarKey(k: string): string;
50
50
  findCommand(id: string, opts: {
51
51
  must: true;
52
- }): Command.Plugin;
52
+ }): Command.Loadable;
53
53
  findCommand(id: string, opts?: {
54
54
  must: boolean;
55
- }): Command.Plugin | undefined;
55
+ }): Command.Loadable | undefined;
56
56
  findTopic(id: string, opts: {
57
57
  must: true;
58
58
  }): Topic;
@@ -72,18 +72,18 @@ export declare class Config implements IConfig {
72
72
  * @param argv string[] process.argv containing the flags and arguments provided by the user
73
73
  * @returns string[]
74
74
  */
75
- findMatches(partialCmdId: string, argv: string[]): Command.Plugin[];
75
+ findMatches(partialCmdId: string, argv: string[]): Command.Loadable[];
76
76
  /**
77
77
  * Returns an array of all commands. If flexible taxonomy is enabled then all permutations will be appended to the array.
78
- * @returns Command.Plugin[]
78
+ * @returns Command.Loadable[]
79
79
  */
80
- getAllCommands(): Command.Plugin[];
80
+ getAllCommands(): Command.Loadable[];
81
81
  /**
82
82
  * Returns an array of all command ids. If flexible taxonomy is enabled then all permutations will be appended to the array.
83
83
  * @returns string[]
84
84
  */
85
85
  getAllCommandIDs(): string[];
86
- get commands(): Command.Plugin[];
86
+ get commands(): Command.Loadable[];
87
87
  get commandIDs(): string[];
88
88
  get topics(): Topic[];
89
89
  s3Key(type: keyof PJSON.S3.Templates, ext?: '.tar.gz' | '.tar.xz' | IConfig.s3Key.Options, options?: IConfig.s3Key.Options): string;
@@ -126,7 +126,7 @@ export declare class Config implements IConfig {
126
126
  * plugin as discovered (will not change the order)
127
127
  *
128
128
  * @param commands commands to determine the priority of
129
- * @returns command instance {Command.Plugin} or undefined
129
+ * @returns command instance {Command.Loadable} or undefined
130
130
  */
131
131
  private determinePriority;
132
132
  }
@@ -324,7 +324,7 @@ class Config {
324
324
  }
325
325
  /**
326
326
  * Returns an array of all commands. If flexible taxonomy is enabled then all permutations will be appended to the array.
327
- * @returns Command.Plugin[]
327
+ * @returns Command.Loadable[]
328
328
  */
329
329
  getAllCommands() {
330
330
  const commands = [...this._commands.values()];
@@ -573,7 +573,7 @@ class Config {
573
573
  * plugin as discovered (will not change the order)
574
574
  *
575
575
  * @param commands commands to determine the priority of
576
- * @returns command instance {Command.Plugin} or undefined
576
+ * @returns command instance {Command.Loadable} or undefined
577
577
  */
578
578
  determinePriority(commands) {
579
579
  var _a, _b;
@@ -14,7 +14,7 @@ export declare class Plugin implements IPlugin {
14
14
  alias: string;
15
15
  tag?: string;
16
16
  manifest: Manifest;
17
- commands: Command.Plugin[];
17
+ commands: Command.Loadable[];
18
18
  hooks: {
19
19
  [k: string]: string[];
20
20
  };
@@ -20,7 +20,7 @@ export declare abstract class HelpBase extends HelpFormatter {
20
20
  export declare class Help extends HelpBase {
21
21
  protected CommandHelpClass: typeof CommandHelp;
22
22
  private get _topics();
23
- protected get sortedCommands(): Interfaces.Command.Plugin[];
23
+ protected get sortedCommands(): Interfaces.Command.Loadable[];
24
24
  protected get sortedTopics(): Interfaces.Topic[];
25
25
  constructor(config: Interfaces.Config, opts?: Partial<Interfaces.HelpOptions>);
26
26
  showHelp(argv: string[]): Promise<void>;
@@ -41,4 +41,5 @@ export declare class Help extends HelpBase {
41
41
  * @return {string} the readme help string for the given command
42
42
  */
43
43
  protected command(command: Interfaces.Command): string;
44
+ protected log(...args: string[]): void;
44
45
  }
package/lib/help/index.js CHANGED
@@ -118,20 +118,20 @@ class Help extends HelpBase {
118
118
  const plugin = this.config.plugins.find(p => p.name === command.pluginName);
119
119
  const state = ((_b = (_a = this.config.pjson) === null || _a === void 0 ? void 0 : _a.oclif) === null || _b === void 0 ? void 0 : _b.state) || ((_d = (_c = plugin === null || plugin === void 0 ? void 0 : plugin.pjson) === null || _c === void 0 ? void 0 : _c.oclif) === null || _d === void 0 ? void 0 : _d.state) || command.state;
120
120
  if (state)
121
- console.log(`This command is in ${state}.\n`);
121
+ this.log(`This command is in ${state}.\n`);
122
122
  const summary = this.summary(command);
123
123
  if (summary) {
124
- console.log(summary + '\n');
124
+ this.log(summary + '\n');
125
125
  }
126
- console.log(this.formatCommand(command));
127
- console.log('');
126
+ this.log(this.formatCommand(command));
127
+ this.log('');
128
128
  if (subTopics.length > 0) {
129
- console.log(this.formatTopics(subTopics));
130
- console.log('');
129
+ this.log(this.formatTopics(subTopics));
130
+ this.log('');
131
131
  }
132
132
  if (subCommands.length > 0) {
133
- console.log(this.formatCommands(subCommands));
134
- console.log('');
133
+ this.log(this.formatCommands(subCommands));
134
+ this.log('');
135
135
  }
136
136
  }
137
137
  async showRootHelp() {
@@ -140,21 +140,21 @@ class Help extends HelpBase {
140
140
  let rootCommands = this.sortedCommands;
141
141
  const state = (_b = (_a = this.config.pjson) === null || _a === void 0 ? void 0 : _a.oclif) === null || _b === void 0 ? void 0 : _b.state;
142
142
  if (state)
143
- console.log(`${this.config.bin} is in ${state}.\n`);
144
- console.log(this.formatRoot());
145
- console.log('');
143
+ this.log(`${this.config.bin} is in ${state}.\n`);
144
+ this.log(this.formatRoot());
145
+ this.log('');
146
146
  if (!this.opts.all) {
147
147
  rootTopics = rootTopics.filter(t => !t.name.includes(':'));
148
148
  rootCommands = rootCommands.filter(c => !c.id.includes(':'));
149
149
  }
150
150
  if (rootTopics.length > 0) {
151
- console.log(this.formatTopics(rootTopics));
152
- console.log('');
151
+ this.log(this.formatTopics(rootTopics));
152
+ this.log('');
153
153
  }
154
154
  if (rootCommands.length > 0) {
155
155
  rootCommands = rootCommands.filter(c => c.id);
156
- console.log(this.formatCommands(rootCommands));
157
- console.log('');
156
+ this.log(this.formatCommands(rootCommands));
157
+ this.log('');
158
158
  }
159
159
  }
160
160
  async showTopicHelp(topic) {
@@ -165,15 +165,15 @@ class Help extends HelpBase {
165
165
  const commands = this.sortedCommands.filter(c => c.id.startsWith(name + ':') && c.id.split(':').length === depth + 1);
166
166
  const state = (_b = (_a = this.config.pjson) === null || _a === void 0 ? void 0 : _a.oclif) === null || _b === void 0 ? void 0 : _b.state;
167
167
  if (state)
168
- console.log(`This topic is in ${state}.\n`);
169
- console.log(this.formatTopic(topic));
168
+ this.log(`This topic is in ${state}.\n`);
169
+ this.log(this.formatTopic(topic));
170
170
  if (subTopics.length > 0) {
171
- console.log(this.formatTopics(subTopics));
172
- console.log('');
171
+ this.log(this.formatTopics(subTopics));
172
+ this.log('');
173
173
  }
174
174
  if (commands.length > 0) {
175
- console.log(this.formatCommands(commands));
176
- console.log('');
175
+ this.log(this.formatCommands(commands));
176
+ this.log('');
177
177
  }
178
178
  }
179
179
  formatRoot() {
@@ -261,5 +261,8 @@ class Help extends HelpBase {
261
261
  command(command) {
262
262
  return this.formatCommand(command);
263
263
  }
264
+ log(...args) {
265
+ console.log(...args);
266
+ }
264
267
  }
265
268
  exports.Help = Help;
package/lib/help/util.js CHANGED
@@ -33,28 +33,27 @@ exports.template = template;
33
33
  function collateSpacedCmdIDFromArgs(argv, config) {
34
34
  if (argv.length === 1)
35
35
  return argv;
36
- const ids = (0, util_1.collectUsableIds)(config.commandIDs);
37
36
  const findId = (argv) => {
37
+ const ids = (0, util_1.collectUsableIds)(config.commandIDs);
38
38
  const final = [];
39
39
  const idPresent = (id) => ids.includes(id);
40
40
  const isFlag = (s) => s.startsWith('-');
41
41
  const isArgWithValue = (s) => s.includes('=');
42
42
  const finalizeId = (s) => s ? [...final, s].join(':') : final.join(':');
43
- const hasSubCommandsWithArgs = () => {
43
+ const hasArgs = () => {
44
+ var _a;
44
45
  const id = finalizeId();
45
46
  if (!id)
46
47
  return false;
47
- // Get a list of sub commands for the current command id. A command is returned as a subcommand if the `id` starts with the current command id.
48
- // e.g. `foo:bar` is a subcommand of `foo`
49
- const subCommands = config.commands.filter(c => (c.id).startsWith(id));
50
- return Boolean(subCommands.find(cmd => { var _a; return cmd.strict === false || ((_a = cmd.args) === null || _a === void 0 ? void 0 : _a.length) > 0; }));
48
+ const cmd = config.findCommand(id);
49
+ return Boolean(cmd && (cmd.strict === false || ((_a = cmd.args) === null || _a === void 0 ? void 0 : _a.length) > 0));
51
50
  };
52
51
  for (const arg of argv) {
53
52
  if (idPresent(finalizeId(arg)))
54
53
  final.push(arg);
55
54
  // If the parent topic has a command that expects positional arguments, then we cannot
56
55
  // assume that any subsequent string could be part of the command name
57
- else if (isArgWithValue(arg) || isFlag(arg) || hasSubCommandsWithArgs())
56
+ else if (isArgWithValue(arg) || isFlag(arg) || hasArgs())
58
57
  break;
59
58
  else
60
59
  final.push(arg);
@@ -1,5 +1,6 @@
1
1
  import { Config, LoadOptions } from './config';
2
2
  import { ArgInput, BooleanFlagProps, FlagInput, OptionFlagProps } from './parser';
3
+ import { Plugin as IPlugin } from './plugin';
3
4
  export declare type Example = string | {
4
5
  description: string;
5
6
  command: string;
@@ -78,7 +79,7 @@ export declare namespace Command {
78
79
  _base: string;
79
80
  }
80
81
  interface Class extends Base {
81
- plugin?: Plugin;
82
+ plugin?: IPlugin;
82
83
  flags?: FlagInput<any>;
83
84
  args?: ArgInput;
84
85
  strict: boolean;
@@ -89,6 +90,12 @@ export declare namespace Command {
89
90
  interface Instance {
90
91
  _run(argv: string[]): Promise<any>;
91
92
  }
93
+ interface Loadable extends Command {
94
+ load(): Promise<Class>;
95
+ }
96
+ /**
97
+ * @deprecated use Command.Loadable instead.
98
+ */
92
99
  interface Plugin extends Command {
93
100
  load(): Promise<Class>;
94
101
  }
@@ -88,27 +88,27 @@ export interface Config {
88
88
  valid: boolean;
89
89
  flexibleTaxonomy?: boolean;
90
90
  topicSeparator: ':' | ' ';
91
- readonly commands: Command.Plugin[];
91
+ readonly commands: Command.Loadable[];
92
92
  readonly topics: Topic[];
93
93
  readonly commandIDs: string[];
94
94
  runCommand<T = unknown>(id: string, argv?: string[]): Promise<T>;
95
- runCommand<T = unknown>(id: string, argv?: string[], cachedCommand?: Command.Plugin): Promise<T>;
95
+ runCommand<T = unknown>(id: string, argv?: string[], cachedCommand?: Command.Loadable): Promise<T>;
96
96
  runHook<T extends keyof Hooks>(event: T, opts: Hooks[T]['options'], timeout?: number): Promise<Hook.Result<Hooks[T]['return']>>;
97
97
  getAllCommandIDs(): string[];
98
- getAllCommands(): Command.Plugin[];
98
+ getAllCommands(): Command.Loadable[];
99
99
  findCommand(id: string, opts: {
100
100
  must: true;
101
- }): Command.Plugin;
101
+ }): Command.Loadable;
102
102
  findCommand(id: string, opts?: {
103
103
  must: boolean;
104
- }): Command.Plugin | undefined;
104
+ }): Command.Loadable | undefined;
105
105
  findTopic(id: string, opts: {
106
106
  must: true;
107
107
  }): Topic;
108
108
  findTopic(id: string, opts?: {
109
109
  must: boolean;
110
110
  }): Topic | undefined;
111
- findMatches(id: string, argv: string[]): Command.Plugin[];
111
+ findMatches(id: string, argv: string[]): Command.Loadable[];
112
112
  scopedEnvVar(key: string): string | undefined;
113
113
  scopedEnvVarKey(key: string): string;
114
114
  scopedEnvVarTrue(key: string): boolean;
@@ -54,7 +54,7 @@ export interface Hooks {
54
54
  options: {
55
55
  id: string;
56
56
  argv: string[];
57
- matches: Command.Plugin[];
57
+ matches: Command.Loadable[];
58
58
  };
59
59
  return: unknown;
60
60
  };
@@ -60,7 +60,7 @@ export interface Plugin {
60
60
  * if it appears to be an npm package but does not look like it's really a CLI plugin, this is set to false
61
61
  */
62
62
  valid: boolean;
63
- commands: Command.Plugin[];
63
+ commands: Command.Loadable[];
64
64
  hooks: {
65
65
  [k: string]: string[];
66
66
  };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@oclif/core",
3
3
  "description": "base library for oclif CLIs",
4
- "version": "1.6.4",
4
+ "version": "1.8.1",
5
5
  "author": "Salesforce",
6
6
  "bugs": "https://github.com/oclif/core/issues",
7
7
  "dependencies": {
@@ -13,7 +13,7 @@
13
13
  "chalk": "^4.1.2",
14
14
  "clean-stack": "^3.0.1",
15
15
  "cli-progress": "^3.10.0",
16
- "debug": "^4.3.3",
16
+ "debug": "^4.3.4",
17
17
  "ejs": "^3.1.6",
18
18
  "fs-extra": "^9.1.0",
19
19
  "get-package-type": "^0.1.0",
@@ -26,7 +26,7 @@
26
26
  "natural-orderby": "^2.0.3",
27
27
  "object-treeify": "^1.1.33",
28
28
  "password-prompt": "^1.1.2",
29
- "semver": "^7.3.5",
29
+ "semver": "^7.3.7",
30
30
  "string-width": "^4.2.3",
31
31
  "strip-ansi": "^6.0.1",
32
32
  "supports-color": "^8.1.1",
@@ -49,7 +49,7 @@
49
49
  "@types/fs-extra": "^9.0.13",
50
50
  "@types/indent-string": "^4.0.1",
51
51
  "@types/js-yaml": "^3.12.7",
52
- "@types/lodash": "^4.14.178",
52
+ "@types/lodash": "^4.14.182",
53
53
  "@types/mocha": "^8.2.3",
54
54
  "@types/nock": "^11.1.0",
55
55
  "@types/node": "^15.14.9",