Skip to content

Commit 7aef2d3

Browse files
authored
feat(cli): better colors
2 parents 5a4ec16 + 7f657d3 commit 7aef2d3

File tree

4 files changed

+60
-35
lines changed

4 files changed

+60
-35
lines changed

packages/cli/package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "rehooks-cli",
3-
"version": "3.2.2",
4-
"description": "A CLI to insert hooks directly to your codebase.",
3+
"version": "3.2.3",
4+
"description": "A CLI to insert hooks directly to your project.",
55
"publishConfig": {
66
"access": "public"
77
},
@@ -44,6 +44,7 @@
4444
},
4545
"devDependencies": {
4646
"@types/node": "22.5.4",
47+
"colorette": "^2.0.20",
4748
"rimraf": "^6.0.1",
4849
"tsup": "^8.3.0",
4950
"type-fest": "^4.26.1",

packages/cli/src/commands/add.ts

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { green, red, cyan, bold } from "colorette";
12
import { getConfig } from "~/utils/config";
23
import { logger } from "~/utils/logger";
34
import { Command } from "commander";
@@ -9,35 +10,39 @@ import fs from "fs";
910

1011
export const add = new Command()
1112
.name("add")
12-
.description("Add custom hooks to your codebase")
13+
.description("Add hooks to your project")
1314
.action(async () => {
1415
const config = await getConfig(process.cwd());
1516

1617
if (!config) {
17-
logger.error("rehooks.json not found or invalid configuration.");
18+
logger.error(red("rehooks.json not found or invalid configuration."));
1819
return;
1920
}
2021

2122
try {
22-
const fetchSpinner = ora("Fetching hooks...").start();
23+
const fetchSpinner = ora(cyan("Fetching hooks...")).start();
2324
const response = await axios.get("https://rehooks.pyr33x.ir/api/hooks");
2425
const hooks = response.data;
25-
fetchSpinner.succeed("Fetched hooks.");
26+
fetchSpinner.succeed(green("Done."));
2627

2728
const { selectedHooks } = await inquirer.prompt([
2829
{
2930
type: "checkbox",
3031
name: "selectedHooks",
31-
message: "Select hooks to add:",
32+
message: bold("Select hooks to add:"),
3233
choices: hooks.map((h: { title: string }) => h.title),
3334
},
3435
]);
35-
const spinner = ora("Checking configuration...").start();
36-
spinner.succeed("Checked configuration.");
36+
37+
const spinner = ora(cyan("Checking configuration...")).start();
38+
spinner.succeed(green("Checked configuration."));
3739

3840
spinner.succeed(
39-
`Created ${selectedHooks.length} ${selectedHooks.length > 1 ? "files" : "file"}.`,
41+
green(
42+
`Created ${bold(selectedHooks.length.toString())} ${selectedHooks.length > 1 ? "files" : "file"}.`,
43+
),
4044
);
45+
4146
for (const hook of selectedHooks) {
4247
const hookFilePath = path.join(config.directory, `${hook}.ts`);
4348

@@ -46,13 +51,15 @@ export const add = new Command()
4651
{
4752
type: "confirm",
4853
name: "overwrite",
49-
message: `${hook}.ts already exists. Do you want to overwrite it?`,
54+
message: bold(
55+
red(`${hook}.ts already exists. Do you want to overwrite it?`),
56+
),
5057
default: false,
5158
},
5259
]);
5360

5461
if (!overwrite) {
55-
logger.info(`Skipping ${hook}.ts.`);
62+
logger.info(cyan(`Skipping ${hook}.ts.`));
5663
continue;
5764
}
5865
}
@@ -62,9 +69,9 @@ export const add = new Command()
6269
);
6370
let { content } = selectedHookResponse.data;
6471
fs.writeFileSync(hookFilePath, content);
65-
logger.info(` - ${hookFilePath}.`);
72+
logger.info(green(` - ${hookFilePath}.`));
6673
}
6774
} catch (error) {
68-
logger.error(`Error adding hooks: ${error}`);
75+
logger.error(red(`Error adding hooks: ${error}`));
6976
}
7077
});

packages/cli/src/commands/init.ts

Lines changed: 30 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { green, red, cyan, bold, yellow } from "colorette";
12
import { getConfig } from "~/utils/config";
23
import { logger } from "~/utils/logger";
34
import { Command } from "commander";
@@ -12,28 +13,30 @@ export const init = new Command()
1213
.argument("[path]", "Specify a custom path for the hooks directory")
1314
.action(async (customPath) => {
1415
const configPath = path.resolve(process.cwd(), "rehooks.json");
15-
const spinner = ora("Initializing Rehooks configuration...").start();
16+
const spinner = ora(cyan("Initializing Rehooks configuration...")).start();
1617
let hooksDirExists = false;
1718
let currentDirectory: string | undefined;
1819

1920
if (fs.existsSync(configPath)) {
20-
spinner.info("rehooks.json already exists.");
21+
spinner.info(yellow("rehooks.json already exists."));
2122
spinner.stop();
2223

2324
const { overwrite } = await inquirer.prompt([
2425
{
2526
type: "confirm",
2627
name: "overwrite",
27-
message: "rehooks.json already exists. Do you want to overwrite it?",
28+
message: bold(
29+
red("rehooks.json already exists. Do you want to overwrite it?"),
30+
),
2831
default: false,
2932
},
3033
]);
3134

3235
spinner.start();
3336

3437
if (!overwrite) {
35-
spinner.fail("Initialization aborted.");
36-
logger.warn("Initialization aborted.");
38+
spinner.fail(red("Initialization aborted."));
39+
logger.warn(yellow("Initialization aborted."));
3740
return;
3841
}
3942

@@ -44,7 +47,9 @@ export const init = new Command()
4447
hooksDirExists = true;
4548
fs.rmSync(currentDirectory, { recursive: true, force: true });
4649
spinner.succeed(
47-
`Previous hooks directory at ${currentDirectory} has been removed.`,
50+
green(
51+
`Previous hooks directory at ${bold(currentDirectory)} has been removed.`,
52+
),
4853
);
4954
}
5055
}
@@ -56,7 +61,7 @@ export const init = new Command()
5661
{
5762
type: "list",
5863
name: "srcFolderChoice",
59-
message: "Does your project have a 'src' folder?",
64+
message: bold("Does your project have a 'src' folder?"),
6065
choices: [
6166
{ name: "Yes", value: true },
6267
{ name: "No", value: false },
@@ -66,41 +71,45 @@ export const init = new Command()
6671
directory = srcFolderChoice ? "./src/hooks" : "./hooks";
6772
}
6873

69-
spinner.start("Creating rehooks.json configuration file...");
74+
spinner.start(cyan("Creating rehooks.json configuration file..."));
7075
const defaultConfig = { directory };
7176

7277
try {
7378
fs.writeFileSync(configPath, JSON.stringify(defaultConfig, null, 2));
74-
spinner.succeed(`Rehooks configuration file created at ${configPath}.`);
79+
spinner.succeed(
80+
green(`Rehooks configuration file created at ${bold(configPath)}.`),
81+
);
7582

7683
if (
7784
!hooksDirExists ||
7885
(hooksDirExists &&
7986
customPath !== currentDirectory &&
8087
directory !== currentDirectory)
8188
) {
82-
spinner.start("Creating hooks directory...");
89+
spinner.start(cyan("Creating hooks directory..."));
8390
fs.mkdirSync(directory, { recursive: true });
84-
spinner.succeed(`Hooks directory created at ${directory}.`);
91+
spinner.succeed(
92+
green(`Hooks directory created at ${bold(directory)}.`),
93+
);
8594
}
8695
} catch (error) {
87-
spinner.fail("Error creating rehooks.json or hooks directory.");
88-
logger.error(`Error creating rehooks.json or hooks directory: ${error}`);
96+
spinner.fail(red("Error creating rehooks.json or hooks directory."));
97+
logger.error(
98+
red(`Error creating rehooks.json or hooks directory: ${error}`),
99+
);
89100
return;
90101
}
91102

92103
try {
93-
spinner.start("Loading configuration...");
104+
spinner.start(cyan("Loading configuration..."));
94105
const config = await getConfig(process.cwd());
95-
spinner.succeed("Configuration loaded successfully.");
106+
spinner.succeed(green("Configuration loaded successfully."));
96107

97-
if (config) {
98-
return;
99-
} else {
100-
logger.warn("Configuration loaded, but may be incomplete.");
108+
if (!config) {
109+
logger.warn(yellow("Configuration loaded, but may be incomplete."));
101110
}
102111
} catch (error) {
103-
spinner.fail("Failed to load configuration.");
104-
logger.error("Failed to load configuration.");
112+
spinner.fail(red("Failed to load configuration."));
113+
logger.error(red("Failed to load configuration."));
105114
}
106115
});

pnpm-lock.yaml

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)