Skip to content

Commit

Permalink
fixed the bug of help command.
Browse files Browse the repository at this point in the history
  • Loading branch information
AyushNautiyalDeveloper committed Oct 18, 2023
1 parent 2a28d11 commit 51d1a6f
Show file tree
Hide file tree
Showing 3 changed files with 87 additions and 5 deletions.
11 changes: 10 additions & 1 deletion package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 6 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
"ajv": "^8.12.0",
"chalk": "^4.1.0",
"chokidar": "^3.5.2",
"fast-levenshtein": "^3.0.0",
"fs-extra": "^11.1.0",
"indent-string": "^4.0.0",
"inquirer": "^8.2.0",
Expand All @@ -50,6 +51,7 @@
"@oclif/test": "^2",
"@swc/core": "^1.3.2",
"@types/chai": "^4.3.6",
"@types/fast-levenshtein": "^0.0.2",
"@types/fs-extra": "^11.0.1",
"@types/inquirer": "^8.1.3",
"@types/js-yaml": "^4.0.5",
Expand Down Expand Up @@ -105,7 +107,10 @@
"bin": "asyncapi",
"plugins": [],
"hooks": {
"command_not_found": ["./lib/hooks/command_not_found/myhook"] },
"command_not_found": [
"./lib/hooks/command_not_found/myhook"
]
},
"macos": {
"identifier": "com.asyncapi.cli"
},
Expand Down
74 changes: 71 additions & 3 deletions src/hooks/command_not_found/myhook.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,75 @@
import {Hook} from '@oclif/core';
import {Hook, toConfiguredId, CliUx} from '@oclif/core';
import chalk from 'chalk';
import {default as levenshtein} from 'fast-levenshtein';
import { Help } from '@oclif/core';

const hook: Hook<'command_not_found'> = async function (opts) {
if (opts.id === 'help') { process.stdout.write(`${opts.id} command not found.\n`);}
export const closest = (target: string, possibilities: string[]): string =>
possibilities
.map((id) => ({distance: levenshtein.get(target, id, {useCollator: true}), id}))
.sort((a, b) => a.distance - b.distance)[0]?.id ?? '';

const hook: Hook.CommandNotFound = async function (opts) {
if (opts.id === '--help') {
const help = new Help(this.config);
help.showHelp(['--help']);
return;
}
const hiddenCommandIds = new Set(opts.config.commands.filter((c) => {c.hidden;}).map((c) => c.id));

Check warning on line 17 in src/hooks/command_not_found/myhook.ts

View workflow job for this annotation

GitHub Actions / Test NodeJS PR - ubuntu-latest

Expected an assignment or function call and instead saw an expression
const commandIDs = [...opts.config.commandIDs, ...opts.config.commands.flatMap((c) => c.aliases)].filter(
(c) => !hiddenCommandIds.has(c),
);
//here we get the command ids and hidden command ids.

if (commandIDs.length === 0) {return;}
// now we we return if the command id are not there.

let binHelp = `${opts.config.bin} help`;

const idSplit = opts.id.split(':');
if (opts.config.findTopic(idSplit[0])) {
// if valid topic, update binHelp with topic
binHelp = `${binHelp} ${idSplit[0]}`;
}

//if there is a topic in the opts we just upgrade the our commnad like

// alter the suggestion in the help scenario so that help is the first command
// otherwise the user will be presented 'did you mean 'help'?' instead of 'did you mean "help <command>"?'
let suggestion = (/:?help:?/).test(opts.id)
? ['help', ...opts.id.split(':').filter((cmd) => cmd !== 'help')].join(':')
: closest(opts.id, commandIDs);

let readableSuggestion = toConfiguredId(suggestion, this.config);
const originalCmd = toConfiguredId(opts.id, this.config);
this.warn(`${chalk.yellow(originalCmd)} is not a ${opts.config.bin} command.`);

let response = '';
try {
if (opts.id === 'help') {readableSuggestion = '--help';}
response = await CliUx.ux.prompt(`Did you mean ${chalk.blueBright(readableSuggestion)}? [y/n]`, {timeout: 10_000});
} catch (error) {
this.log('');
this.debug(error);
}

if (response === 'y') {
// this will split the original command from the suggested replacement, and gather the remaining args as varargs to help with situations like:
// confit set foo-bar -> confit:set:foo-bar -> config:set:foo-bar -> config:set foo-bar
let argv = opts.argv?.length ? opts.argv : opts.id.split(':').slice(suggestion.split(':').length);
if (suggestion.startsWith('help:')) {
// the args are the command/partial command you need help for (package:version)
// we created the suggestion variable to start with "help" so slice the first entry
argv = suggestion.split(':').slice(1);
// the command is just the word "help"
suggestion = 'help';
}
if (opts.id === 'help') {
return this.config.runCommand('--help');
}
return this.config.runCommand(suggestion, argv);
}

this.error(`Run ${chalk.bold.cyan(binHelp)} for a list of available commands.`, {exit: 127});
};

export default hook;

0 comments on commit 51d1a6f

Please sign in to comment.