Skip to content

Commit 49914d0

Browse files
committed
convert command to typescript
1 parent 1d8905d commit 49914d0

File tree

4 files changed

+50
-56
lines changed

4 files changed

+50
-56
lines changed

src/cli/index.js

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#!/usr/bin/env node
22
import process from 'node:process';
3-
import YeomanCommand from '../util/command.js';
3+
import YeomanCommand, { addEnvironmentOptions } from '../util/command.js';
44
import packageJson from '../package.json';
55
import Env from '../index.js';
66
import { printGroupedGenerator, environmentAction } from './utils.js';
@@ -9,10 +9,11 @@ const program = new YeomanCommand();
99

1010
program.version(packageJson.version).allowExcessArguments(false).enablePositionalOptions();
1111

12-
Env.addEnvironmentOptions(
12+
addEnvironmentOptions(
1313
program
1414
.command('run <namespace>')
15-
.description('Run a generator', { namespace: 'Generator to run' })
15+
.description('Run a generator')
16+
.argument('<namespace>', 'Generator to run')
1617
.passThroughOptions()
1718
.allowUnknownOption()
1819
.allowExcessArguments(true)

src/command.js

+2-42
Original file line numberDiff line numberDiff line change
@@ -1,58 +1,18 @@
11
import { requireNamespace } from '@yeoman/namespace';
22
import createdLogger from 'debug';
3-
import { Option } from 'commander';
43
import YeomanCommand from './util/command.js';
54

65
const debug = createdLogger('yeoman:environment:command');
76

87
const commandMixin = cls =>
98
class EnvironmentCommand extends cls {
10-
static addEnvironmentOptions(command = new YeomanCommand()) {
11-
/* Environment options */
12-
return (
13-
command
14-
.option('--cwd', 'Path to use as current dir')
15-
/* Environment/Legacy generator options */
16-
.option('--skip-install', 'Do not automatically install dependencies', false)
17-
/* Generator options */
18-
.option('--skip-cache', 'Do not remember prompt answers', false)
19-
.option('--local-config-only', 'Generate .yo-rc-global.json locally', false)
20-
.option('--ask-answered', 'Show prompts for already configured options', false)
21-
/* Conflicter options */
22-
.option('--force', 'Override every file', false)
23-
.option('--dry-run', 'Print conflicts', false)
24-
.option('--whitespace', 'Whitespace changes will not trigger conflicts', false)
25-
.option('--bail', 'Fail on first conflict', false)
26-
.option('--skip-yo-resolve', 'Ignore .yo-resolve files', false)
27-
/* Hidden options, used for api */
28-
.addOption(new Option('--skip-local-cache', 'Skip local answers cache').default(true).hideHelp())
29-
.addOption(new Option('--skip-parse-options', 'Skip legacy options parsing').default(false).hideHelp())
30-
.addOption(new Option('--experimental', 'Experimental features').default(false).hideHelp())
31-
.addOption(new Option('--log-cwd', 'Path for log purpose').hideHelp())
32-
);
33-
}
34-
35-
/**
36-
* Load Generator options into a commander instance.
37-
*
38-
* @param {Command} command - Command to load options
39-
* @param {Generator} generator - Generator
40-
* @return {Command} return command
41-
*/
42-
static addGeneratorOptions(command, generator) {
43-
command.addGeneratorOptions(generator._options);
44-
command.addGeneratorArguments(generator._arguments);
45-
return command;
46-
}
47-
489
/**
4910
* Generate a command for the generator and execute.
5011
*
5112
* @param {string} generatorNamespace
5213
* @param {string[]} args
5314
*/
5415
async execute(generatorNamespace, args = []) {
55-
const env = this;
5616
const namespace = requireNamespace(generatorNamespace);
5717
if (!this.get(namespace.namespace)) {
5818
await this.lookup({
@@ -72,11 +32,11 @@ const commandMixin = cls =>
7232

7333
// Instantiate the generator for options
7434
const generator = await this.create(namespace.namespace, { help: true });
75-
EnvironmentCommand.addGeneratorOptions(namespaceCommand, generator);
35+
namespaceCommand.registerGenerator(generator);
7636

7737
namespaceCommand._parseCommand([], args);
7838
debug('Running generator with arguments %o, options %o', namespaceCommand.args, namespaceCommand.opts());
79-
return env.run([namespace.namespace, ...namespaceCommand.args], {
39+
return this.run([namespace.namespace, ...namespaceCommand.args], {
8040
...namespaceCommand.opts(),
8141
});
8242
}

src/environment.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import Store from './store.js';
2626
import composability from './composability.js';
2727
import resolver from './resolver.js';
2828
import YeomanRepository from './util/repository.js';
29-
import YeomanCommand from './util/command.js';
29+
import YeomanCommand, { addEnvironmentOptions } from './util/command.js';
3030
import commandMixin from './command.js';
3131
import { packageManagerInstallTask } from './package-manager.js';
3232
import { ComposedStore } from './composed-store.js';
@@ -138,7 +138,7 @@ class Environment extends Base {
138138
* @return {Command} Return a Command instance
139139
*/
140140
static prepareCommand(GeneratorClass, command = new YeomanCommand()) {
141-
command = Base.addEnvironmentOptions(command);
141+
command = addEnvironmentOptions(command);
142142
return Environment.prepareGeneratorCommand(command, GeneratorClass);
143143
}
144144

@@ -151,7 +151,7 @@ class Environment extends Base {
151151
*/
152152
static prepareGeneratorCommand(command, GeneratorClass, namespace) {
153153
const generator = new GeneratorClass([], { help: true, env: {} });
154-
Base.addGeneratorOptions(command, generator);
154+
command.registerGenerator(generator);
155155

156156
command.action(async function () {
157157
let rootCommand = this;

src/util/command.js src/util/command.ts

+41-8
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1+
import { BaseGenerator } from '@yeoman/types';
12
import { Command, Option } from 'commander';
23

34
export default class YeomanCommand extends Command {
4-
createCommand(name) {
5+
override createCommand(name?: string) {
56
return new YeomanCommand(name);
67
}
78

@@ -10,7 +11,7 @@ export default class YeomanCommand extends Command {
1011
* @param {Option} option
1112
* @return {YeomanCommand} this;
1213
*/
13-
addOption(option) {
14+
addOption(option: Option) {
1415
if (!option.long || option.required || option.optional) {
1516
return super.addOption(option);
1617
}
@@ -30,12 +31,22 @@ export default class YeomanCommand extends Command {
3031
return result;
3132
}
3233

34+
/**
35+
* Load Generator options into a commander instance.
36+
*
37+
* @param {Generator} generator - Generator
38+
* @return {Command} return command
39+
*/
40+
registerGenerator(generator: any) {
41+
return this.addGeneratorOptions(generator._options).addGeneratorArguments(generator._arguments);
42+
}
43+
3344
/**
3445
* Register arguments using generator._arguments structure.
3546
* @param {object[]} generatorArgs
3647
* @return {YeomanCommand} this;
3748
*/
38-
addGeneratorArguments(generatorArgs = []) {
49+
addGeneratorArguments(generatorArgs: any[] = []) {
3950
if (!generatorArgs || generatorArgs.length === 0) {
4051
return this;
4152
}
@@ -56,7 +67,7 @@ export default class YeomanCommand extends Command {
5667
* @param {string} blueprintOptionDescription - description of the blueprint that adds the option
5768
* @return {YeomanCommand} this;
5869
*/
59-
addGeneratorOptions(options) {
70+
addGeneratorOptions(options: Record<string, any>) {
6071
options = options || {};
6172
for (const [key, value] of Object.entries(options)) {
6273
this._addGeneratorOption(key, value);
@@ -65,14 +76,14 @@ export default class YeomanCommand extends Command {
6576
return this;
6677
}
6778

68-
_addGeneratorOption(optionName, optionDefinition, additionalDescription = '') {
79+
_addGeneratorOption(optionName: string, optionDefinition: any, additionalDescription = '') {
6980
if (optionName === 'help') {
7081
return undefined;
7182
}
7283

7384
const longOption = `--${optionName}`;
74-
const existingOption = this._findOption(longOption);
75-
if (this._findOption(longOption)) {
85+
const existingOption = (this as any)._findOption(longOption);
86+
if ((this as any)._findOption(longOption)) {
7687
return existingOption;
7788
}
7889

@@ -89,9 +100,31 @@ export default class YeomanCommand extends Command {
89100
}
90101

91102
return this.addOption(
92-
new Option(cmdString, optionDefinition.description + additionalDescription)
103+
new Option(cmdString, `${optionDefinition.description}${additionalDescription}`)
93104
.default(optionDefinition.default)
94105
.hideHelp(optionDefinition.hide),
95106
);
96107
}
97108
}
109+
110+
/* Add Environment options */
111+
export const addEnvironmentOptions = (command = new YeomanCommand()) =>
112+
command
113+
.option('--cwd', 'Path to use as current dir')
114+
/* Environment options */
115+
.option('--skip-install', 'Do not automatically install dependencies', false)
116+
/* Generator options */
117+
.option('--skip-cache', 'Do not remember prompt answers', false)
118+
.option('--local-config-only', 'Generate .yo-rc-global.json locally', false)
119+
.option('--ask-answered', 'Show prompts for already configured options', false)
120+
/* Conflicter options */
121+
.option('--force', 'Override every file', false)
122+
.option('--dry-run', 'Print conflicts', false)
123+
.option('--whitespace', 'Whitespace changes will not trigger conflicts', false)
124+
.option('--bail', 'Fail on first conflict', false)
125+
.option('--skip-yo-resolve', 'Ignore .yo-resolve files', false)
126+
/* Hidden options, used for api */
127+
.addOption(new Option('--skip-local-cache', 'Skip local answers cache').default(true).hideHelp())
128+
.addOption(new Option('--skip-parse-options', 'Skip legacy options parsing').default(false).hideHelp())
129+
.addOption(new Option('--experimental', 'Experimental features').default(false).hideHelp())
130+
.addOption(new Option('--log-cwd', 'Path for log purpose').hideHelp());

0 commit comments

Comments
 (0)