-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.ts
101 lines (84 loc) · 2.19 KB
/
index.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
import { Command, flags } from '@oclif/command';
import * as inquirer from 'inquirer';
import { bold, underline } from 'kleur';
import ora from 'ora';
import {
Params,
ParamsContext,
PROMPT_CONFIGS,
paramArgs,
paramFlags,
} from './params';
import { StageRunner, Stage } from './stage-runner';
class CreateKromeApp extends Command {
static description = 'Generate the krome starter app';
static flags = {
version: flags.version({ char: 'v' }),
help: flags.help({ char: 'h' }),
...paramFlags,
};
static args = [...paramArgs];
// TODO: better way to inject {@link ParamsContext}
context: ParamsContext = ParamsContext.create();
stageRunner: StageRunner = new StageRunner(this.context);
spinner = ora({ indent: 2 });
async run(): Promise<void> {
await this.initContext();
this.configStageRunner();
this.log('');
await this.stageRunner.runAll();
this.log('');
this.log(bold(underline('Quickstart')));
this.log('');
this.log(` cd ${this.context.appName}`);
this.log(` yarn start`);
this.log('');
}
async initContext(): Promise<void> {
const params = await this.getParams();
Object.assign(this.context, params);
}
/**
* Collect all the required information from args, flags, or prompt
*/
async getParams(): Promise<Params> {
const {
args,
flags: {
author = '',
description = '',
templateName = '',
framework = '',
doInstall,
},
} = this.parse(CreateKromeApp);
const params: Params = {
appName: args.appName,
author,
description,
templateName,
framework,
doInstall,
};
const promptConfigs = (Object.entries(params) as [
keyof Params,
inquirer.QuestionCollection,
][])
.filter(([, v]) => !v)
.map(([k]) => PROMPT_CONFIGS[k]);
const safeParams = await inquirer.prompt(promptConfigs);
return {
...params,
...safeParams,
};
}
configStageRunner(): void {
this.stageRunner.beforeEach = (stage: Stage) => {
this.spinner.text = stage.label;
};
this.stageRunner.afterEach = () => {
this.spinner.succeed();
};
}
}
export = CreateKromeApp;