Skip to content

Commit 5709bfe

Browse files
committed
Chore: Refactor usePrefix to rely on a new Theme construct
1 parent ab6be90 commit 5709bfe

File tree

5 files changed

+64
-8
lines changed

5 files changed

+64
-8
lines changed

packages/core/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ const confirm = createPrompt<boolean, { message: string; default?: boolean }>(
2828
(config, done) => {
2929
const [status, setStatus] = useState('pending');
3030
const [value, setValue] = useState('');
31-
const prefix = usePrefix();
31+
const prefix = usePrefix({});
3232

3333
useKeypress((key, rl) => {
3434
if (isEnterKey(key)) {

packages/core/src/index.mts

+2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ export { useEffect } from './lib/use-effect.mjs';
55
export { useMemo } from './lib/use-memo.mjs';
66
export { useRef } from './lib/use-ref.mjs';
77
export { useKeypress } from './lib/use-keypress.mjs';
8+
export { makeTheme } from './lib/make-theme.mjs';
9+
export type { Theme } from './lib/theme.mjs';
810
export { usePagination } from './lib/pagination/use-pagination.mjs';
911
export { createPrompt } from './lib/create-prompt.mjs';
1012
export { Separator } from './lib/Separator.mjs';

packages/core/src/lib/make-theme.mts

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import type { Prettify } from '@inquirer/type';
2+
import { defaultTheme, type Theme } from './theme.mjs';
3+
4+
export function makeTheme<SpecificTheme extends {}>(
5+
...themes: ReadonlyArray<undefined | Partial<Theme<SpecificTheme>>>
6+
): Prettify<Theme<SpecificTheme>> {
7+
return Object.assign({}, defaultTheme, ...themes, {
8+
style: Object.assign({}, defaultTheme.style, ...themes.map((theme) => theme?.style)),
9+
});
10+
}

packages/core/src/lib/theme.mts

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import chalk from 'chalk';
2+
import spinners from 'cli-spinners';
3+
import type { Prettify } from '@inquirer/type';
4+
5+
type DefaultTheme = {
6+
prefix: string;
7+
spinner: {
8+
interval: number;
9+
frames: string[];
10+
};
11+
style: {
12+
answer: (text: string) => string;
13+
message: (text: string) => string;
14+
error: (text: string) => string;
15+
defaultAnswer: (text: string) => string;
16+
help: (text: string) => string;
17+
highlight: (text: string) => string;
18+
key: (text: string) => string;
19+
};
20+
};
21+
22+
export type Theme<Extension extends {} = {}> = Prettify<Extension & DefaultTheme>;
23+
24+
export const defaultTheme: DefaultTheme = {
25+
prefix: chalk.green('?'),
26+
spinner: {
27+
interval: spinners.dots.interval,
28+
frames: spinners.dots.frames.map(chalk.yellow),
29+
},
30+
style: {
31+
answer: chalk.cyan,
32+
message: chalk.bold,
33+
error: (text) => chalk.red(`> ${text}`),
34+
defaultAnswer: (text) => chalk.dim(`(${text})`),
35+
help: chalk.dim,
36+
highlight: chalk.cyan,
37+
key: (text: string) => chalk.cyan.bold(`<${text}>`),
38+
},
39+
};

packages/core/src/lib/use-prefix.mts

+12-7
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,17 @@
1-
import chalk from 'chalk';
2-
import spinners from 'cli-spinners';
31
import { useState } from './use-state.mjs';
42
import { useEffect } from './use-effect.mjs';
3+
import { makeTheme } from './make-theme.mjs';
4+
import { type Theme } from './theme.mjs';
55

6-
const spinner = spinners.dots;
7-
8-
export function usePrefix(isLoading: boolean = false): string {
6+
export function usePrefix({
7+
isLoading = false,
8+
theme,
9+
}: {
10+
isLoading?: boolean;
11+
theme?: Partial<Theme>;
12+
}): string {
913
const [tick, setTick] = useState(0);
14+
const { prefix, spinner } = makeTheme(theme);
1015

1116
useEffect((): void | (() => unknown) => {
1217
if (isLoading) {
@@ -20,8 +25,8 @@ export function usePrefix(isLoading: boolean = false): string {
2025

2126
if (isLoading) {
2227
const frame = tick % spinner.frames.length;
23-
return chalk.yellow(spinner.frames[frame]);
28+
return spinner.frames[frame]!;
2429
}
2530

26-
return chalk.green('?');
31+
return prefix;
2732
}

0 commit comments

Comments
 (0)