Skip to content

Commit f89a091

Browse files
committed
Merge branch 'command-line-3.0' into prettier
# Conflicts: # src/GenerateTemplateFiles.ts # src/utilities/CheckUtility.test.ts # src/utilities/CheckUtility.ts
2 parents e1e4f6d + 43290f6 commit f89a091

File tree

3 files changed

+81
-69
lines changed

3 files changed

+81
-69
lines changed

src/GenerateTemplateFiles.ts

Lines changed: 51 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,13 @@ import IReplacer from './models/IReplacer';
1010
import IResults from './models/IResults';
1111
import IDefaultCaseConverter from './models/IDefaultCaseConverter';
1212
import {
13-
errorIfNoConfigItems,
14-
errorIfOptionNameIsNotFound,
15-
errorIfNoStringOrDynamicReplacers,
16-
errorIfStringReplacersDoNotMatch,
13+
throwErrorIfNoConfigItems,
14+
throwErrorIfOptionNameIsNotFound,
15+
throwErrorIfNoStringOrDynamicReplacers,
16+
throwErrorIfStringReplacersDoNotMatch,
17+
displayError,
18+
displayWarning,
19+
displaySuccess,
1720
} from './utilities/CheckUtility';
1821
import IReplacerSlotQuestion from './models/IReplacerSlotQuestion';
1922
import yargs from 'yargs';
@@ -25,13 +28,17 @@ export default class GenerateTemplateFiles {
2528
* Main method to create your template files. Accepts an array of `IConfigItem` items.
2629
*/
2730
public async generate(options: IConfigItem[]): Promise<void> {
28-
errorIfNoConfigItems(options);
29-
errorIfNoStringOrDynamicReplacers(options);
31+
try {
32+
throwErrorIfNoConfigItems(options);
33+
throwErrorIfNoStringOrDynamicReplacers(options);
3034

31-
const selectedConfigItem: IConfigItem = await this._getSelectedItem(options);
32-
const answeredReplacers: IReplacer[] = await this._getReplacerSlotValues(selectedConfigItem);
35+
const selectedConfigItem: IConfigItem = await this._getSelectedItem(options);
36+
const answeredReplacers: IReplacer[] = await this._getReplacerSlotValues(selectedConfigItem);
3337

34-
await this._outputFiles(selectedConfigItem, answeredReplacers);
38+
await this._outputFiles(selectedConfigItem, answeredReplacers);
39+
} catch (error) {
40+
displayError(error.message);
41+
}
3542
}
3643

3744
/**
@@ -40,39 +47,45 @@ export default class GenerateTemplateFiles {
4047
public async commandLine(options: IConfigItem[]): Promise<void> {
4148
this._isCommandLine = true;
4249

43-
errorIfNoConfigItems(options);
44-
errorIfNoStringOrDynamicReplacers(options);
50+
try {
51+
throwErrorIfNoConfigItems(options);
52+
throwErrorIfNoStringOrDynamicReplacers(options);
53+
54+
const [templateName = '', ...replacers] = yargs.argv._;
55+
const selectedConfigItem: IConfigItem | undefined = options.find(
56+
(configItem: IConfigItem) => {
57+
return (
58+
StringUtility.toCase(configItem.option, CaseConverterEnum.KebabCase) ===
59+
StringUtility.toCase(templateName, CaseConverterEnum.KebabCase)
60+
);
61+
}
62+
);
4563

46-
const [templateName = '', ...replacers] = yargs.argv._;
47-
const selectedConfigItem: IConfigItem | undefined = options.find((configItem: IConfigItem) => {
48-
return (
49-
StringUtility.toCase(configItem.option, CaseConverterEnum.KebabCase) ===
64+
throwErrorIfOptionNameIsNotFound(
65+
selectedConfigItem,
5066
StringUtility.toCase(templateName, CaseConverterEnum.KebabCase)
5167
);
52-
});
53-
54-
errorIfOptionNameIsNotFound(
55-
selectedConfigItem,
56-
StringUtility.toCase(templateName, CaseConverterEnum.KebabCase)
57-
);
5868

59-
const commandLineStringReplacers: IReplacer[] = replacers.map((str: string) => {
60-
const [slot, slotValue] = str.split('=');
69+
const commandLineStringReplacers: IReplacer[] = replacers.map((str: string) => {
70+
const [slot, slotValue] = str.split('=');
6171

62-
return {
63-
slot,
64-
slotValue,
65-
};
66-
});
72+
return {
73+
slot,
74+
slotValue,
75+
};
76+
});
6777

68-
errorIfStringReplacersDoNotMatch(selectedConfigItem, commandLineStringReplacers);
78+
throwErrorIfStringReplacersDoNotMatch(selectedConfigItem, commandLineStringReplacers);
6979

70-
const dynamicReplacers: IReplacer[] = selectedConfigItem?.dynamicReplacers || [];
80+
const dynamicReplacers: IReplacer[] = selectedConfigItem?.dynamicReplacers || [];
7181

72-
await this._outputFiles(selectedConfigItem!, [
73-
...commandLineStringReplacers,
74-
...dynamicReplacers,
75-
]);
82+
await this._outputFiles(selectedConfigItem!, [
83+
...commandLineStringReplacers,
84+
...dynamicReplacers,
85+
]);
86+
} catch (error) {
87+
displayError(error.message);
88+
}
7689
}
7790

7891
private async _outputFiles(
@@ -86,10 +99,10 @@ export default class GenerateTemplateFiles {
8699
const shouldWriteFiles: boolean = await this._shouldWriteFiles(outputPath, selectedConfigItem);
87100

88101
if (shouldWriteFiles === false) {
89-
console.info('No new files created');
102+
displayWarning('No new files created');
90103

91104
if (this._isCommandLine) {
92-
console.info('Use --overwrite option to overwrite existing files');
105+
displayWarning('Use --overwrite option to overwrite existing files');
93106
}
94107

95108
return;
@@ -314,11 +327,11 @@ export default class GenerateTemplateFiles {
314327
try {
315328
await recursiveCopy(entryFolderPath, outputPath, recursiveCopyOptions);
316329

317-
console.info(`Files saved to: '${outputPath}'`);
330+
displaySuccess(`Files saved to: '${outputPath}'`);
318331

319332
return outputtedFilesAndFolders.filter(Boolean);
320333
} catch (error) {
321-
console.error(`Copy failed: ${error}`);
334+
displayError(`Copy failed: ${error}`);
322335

323336
return [`Copy failed: ${error}`];
324337
}

src/utilities/CheckUtility.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ describe('displayError', () => {
77
test('should throw an error if condition is false', () => {
88
console.info = jest.fn();
99

10-
displayError(true, errorString);
10+
displayError(errorString);
1111

1212
expect(console.info).toHaveBeenCalledWith(
1313
colors.bold.red(`[Error in generate-template-files]: ${colors.red(errorString)}`)

src/utilities/CheckUtility.ts

Lines changed: 29 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -4,45 +4,44 @@ import StringUtility from './StringUtility';
44
import IReplacerSlotQuestion from '../models/IReplacerSlotQuestion';
55
import colors from 'colors';
66

7-
export const isBooleanType = (value: unknown): value is boolean => {
8-
return typeof value === 'boolean';
7+
export const displayError = (message: string): Error | void => {
8+
console.info(colors.bold.red(`[Error in generate-template-files]: ${colors.red(message)}`));
99
};
1010

11-
export const displayError = (isError: boolean, errorMessage: string): Error | void => {
12-
if (isError) {
13-
try {
14-
throw new Error(errorMessage);
15-
} catch (error) {
16-
console.info(
17-
colors.bold.red(`[Error in generate-template-files]: ${colors.red(error.message)}`)
18-
);
19-
}
20-
}
11+
export const displayWarning = (message: string): Error | void => {
12+
console.info(colors.bold.yellow(colors.yellow(message)));
13+
};
14+
15+
export const displaySuccess = (message: string): Error | void => {
16+
console.info(colors.bold.green(colors.green(message)));
2117
};
2218

23-
export const errorIfNoConfigItems = (options: IConfigItem[]) => {
19+
export const throwErrorIfNoConfigItems = (options: IConfigItem[]) => {
2420
const hasAtLeastOneItem = Boolean(options?.length);
2521

26-
displayError(!hasAtLeastOneItem, 'There was no IConfigItem items found.');
22+
if (!hasAtLeastOneItem) {
23+
throw new Error('There was no IConfigItem items found.');
24+
}
2725
};
2826

29-
export const errorIfOptionNameIsNotFound = (
27+
export const throwErrorIfOptionNameIsNotFound = (
3028
item: IConfigItem | undefined,
3129
templateName: string
3230
) => {
33-
displayError(!item, `No IConfigItem found for ${templateName}`);
31+
if (!item) {
32+
throw new Error(`No IConfigItem found for ${templateName}`);
33+
}
3434
};
3535

36-
export const errorIfStringReplacersDoNotMatch = (
36+
export const throwErrorIfStringReplacersDoNotMatch = (
3737
item: IConfigItem | undefined,
3838
commandLineStringReplacers: IReplacer[]
3939
) => {
4040
const configItemStringReplacers: (string | IReplacerSlotQuestion)[] = item?.stringReplacers ?? [];
4141

42-
displayError(
43-
commandLineStringReplacers.length !== configItemStringReplacers.length,
44-
'IConfigItem stringReplacers do not match the command line arguments.'
45-
);
42+
if (commandLineStringReplacers.length !== configItemStringReplacers.length) {
43+
throw new Error('IConfigItem stringReplacers do not match the command line arguments.');
44+
}
4645

4746
const configItemStringReplacersKeys = configItemStringReplacers
4847
.map((replacer: string | IReplacerSlotQuestion) => {
@@ -56,20 +55,20 @@ export const errorIfStringReplacersDoNotMatch = (
5655
.sort()
5756
.join(', ');
5857

59-
displayError(
60-
configItemStringReplacersKeys !== commandLineStringReplacersKeys,
61-
`${configItemStringReplacersKeys} does not match ${commandLineStringReplacersKeys}.`
62-
);
58+
if (configItemStringReplacersKeys !== commandLineStringReplacersKeys) {
59+
throw new Error(
60+
`${configItemStringReplacersKeys} does not match ${commandLineStringReplacersKeys}.`
61+
);
62+
}
6363
};
6464

65-
export const errorIfNoStringOrDynamicReplacers = (options: IConfigItem[]) => {
65+
export const throwErrorIfNoStringOrDynamicReplacers = (options: IConfigItem[]) => {
6666
const hasStringOrDynamicReplacers =
6767
options.every((item: IConfigItem) => {
6868
return Boolean(item?.stringReplacers?.length) || Boolean(item?.dynamicReplacers?.length);
6969
}) && options.length > 0;
7070

71-
displayError(
72-
!hasStringOrDynamicReplacers,
73-
'IConfigItem needs to have a stringReplacers or dynamicReplacers.'
74-
);
71+
if (!hasStringOrDynamicReplacers) {
72+
throw new Error('IConfigItem needs to have a stringReplacers or dynamicReplacers.');
73+
}
7574
};

0 commit comments

Comments
 (0)