Skip to content

Commit d2cfa72

Browse files
committed
Chore: Stricter type-aware eslint
1 parent 83cf7ed commit d2cfa72

File tree

9 files changed

+39
-30
lines changed

9 files changed

+39
-30
lines changed

eslint.config.js

+8-1
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,19 @@ export default tseslint.config(
4242
},
4343
{
4444
files: ['**/*.mts', '**/*.ts'],
45-
extends: [...tseslint.configs.recommendedTypeChecked],
45+
extends: [...tseslint.configs.strictTypeChecked],
4646
languageOptions: {
4747
parserOptions: {
4848
projectService: true,
4949
},
5050
},
51+
rules: {
52+
'@typescript-eslint/restrict-template-expressions': 'off',
53+
'@typescript-eslint/no-invalid-void-type': 'off',
54+
'@typescript-eslint/no-non-null-assertion': 'off',
55+
'@typescript-eslint/no-confusing-void-expression': 'off',
56+
'@typescript-eslint/no-unnecessary-type-parameters': 'off',
57+
},
5158
},
5259
{
5360
files: ['**/*.cjs'],

packages/checkbox/src/index.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ export default createPrompt(
223223

224224
const message = theme.style.message(config.message, status);
225225

226-
let description;
226+
let description: string | undefined;
227227
const page = usePagination({
228228
items,
229229
active,
@@ -283,6 +283,7 @@ export default createPrompt(
283283
if (
284284
items.length > pageSize &&
285285
(theme.helpMode === 'always' ||
286+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
286287
(theme.helpMode === 'auto' && firstRender.current))
287288
) {
288289
helpTipBottom = `\n${theme.style.help('(Use arrow keys to reveal more choices)')}`;

packages/core/src/lib/create-prompt.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ export function createPrompt<Value, Config>(view: ViewFunction<Value, Config>) {
9292
effectScheduler.clearAll();
9393
return answer;
9494
},
95-
(error) => {
95+
(error: unknown) => {
9696
effectScheduler.clearAll();
9797
throw error;
9898
},
@@ -101,7 +101,7 @@ export function createPrompt<Value, Config>(view: ViewFunction<Value, Config>) {
101101
.finally(() => {
102102
cleanups.forEach((cleanup) => cleanup());
103103

104-
screen.done({ clearContent: Boolean(context?.clearPromptOnDone) });
104+
screen.done({ clearContent: Boolean(context.clearPromptOnDone) });
105105
output.end();
106106
})
107107
// Once cleanup is done, let the expose promise resolve/reject to the internal one.

packages/core/src/lib/hook-engine.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ export function withUpdates<R, T extends (...args: any[]) => R>(
6868
): (...args: Parameters<T>) => R {
6969
const wrapped = (...args: Parameters<T>): R => {
7070
const store = getStore();
71-
let shouldUpdate = false;
71+
let shouldUpdate = false as boolean;
7272
const oldHandleChange = store.handleChange;
7373
store.handleChange = () => {
7474
shouldUpdate = true;
@@ -125,7 +125,7 @@ export function handleChange() {
125125
}
126126

127127
export const effectScheduler = {
128-
queue(cb: (readline: InquirerReadline) => void) {
128+
queue(cb: (readline: InquirerReadline) => void | (() => void)) {
129129
const store = getStore();
130130
const { index } = store;
131131

packages/demo/src/demos/timeout.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ async function demo() {
55
const answer = await input(
66
{ message: 'Enter a value (timing out in 5 seconds)' },
77
{ signal: AbortSignal.timeout(5000) },
8-
).catch((error) => {
8+
).catch((error: unknown) => {
99
if (error instanceof Error && error.name === 'AbortPromptError') {
1010
return 'Default value';
1111
}

packages/editor/src/index.ts

+18-16
Original file line numberDiff line numberDiff line change
@@ -36,24 +36,26 @@ export default createPrompt<string, EditorConfig>((config, done) => {
3636
rl.pause();
3737

3838
// Note: The bind call isn't strictly required. But we need it for our mocks to work as expected.
39-
const editCallback = AsyncResource.bind(async (error: Error, answer: string) => {
40-
rl.resume();
41-
if (error) {
42-
setError(error.toString());
43-
} else {
44-
setStatus('loading');
45-
const isValid = await validate(answer);
46-
if (isValid === true) {
47-
setError(undefined);
48-
setStatus('done');
49-
done(answer);
39+
const editCallback = AsyncResource.bind(
40+
async (error: Error | undefined, answer: string) => {
41+
rl.resume();
42+
if (error) {
43+
setError(error.toString());
5044
} else {
51-
setValue(answer);
52-
setError(isValid || 'You must provide a valid value');
53-
setStatus('idle');
45+
setStatus('loading');
46+
const isValid = await validate(answer);
47+
if (isValid === true) {
48+
setError(undefined);
49+
setStatus('done');
50+
done(answer);
51+
} else {
52+
setValue(answer);
53+
setError(isValid || 'You must provide a valid value');
54+
setStatus('idle');
55+
}
5456
}
55-
}
56-
});
57+
},
58+
);
5759

5860
editAsync(value, (error, answer) => void editCallback(error, answer), { postfix });
5961
}

packages/inquirer/src/ui/prompt.ts

+4-3
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ export const _ = {
5151
.filter(Boolean)
5252
.reduce(
5353
// @ts-expect-error implicit any on res[key]
54-
(res, key) => (res !== null && res !== undefined ? res[key] : res),
54+
(res: object | undefined, key) => (res == null ? res : res[key]),
5555
obj,
5656
);
5757
const result = travel(/[,[\]]+?/) || travel(/[,.[\]]+?/);
@@ -351,6 +351,7 @@ export default class PromptsRunner<A extends Answers> {
351351
cleanupSignal = undefined;
352352
};
353353

354+
// eslint-disable-next-line @typescript-eslint/use-unknown-in-catch-callback-variable
354355
activePrompt.run().then(resolve, reject).finally(cleanup);
355356
})
356357
: prompt;
@@ -360,7 +361,7 @@ export default class PromptsRunner<A extends Answers> {
360361
if (moduleSignal?.aborted) {
361362
this.abortController.abort(moduleSignal.reason);
362363
} else if (moduleSignal) {
363-
const abort = () => this.abortController?.abort(moduleSignal.reason);
364+
const abort = () => this.abortController.abort(moduleSignal.reason);
364365
moduleSignal.addEventListener('abort', abort);
365366
cleanupModuleSignal = () => {
366367
moduleSignal.removeEventListener('abort', abort);
@@ -384,7 +385,7 @@ export default class PromptsRunner<A extends Answers> {
384385
* Close the interface and cleanup listeners
385386
*/
386387
close = () => {
387-
this.abortController?.abort();
388+
this.abortController.abort();
388389
};
389390

390391
private shouldRun = async (question: Question<A>): Promise<boolean> => {

packages/rawlist/src/index.ts

+1-3
Original file line numberDiff line numberDiff line change
@@ -97,9 +97,7 @@ export default createPrompt(
9797
}
9898

9999
if (isSelectableChoice(selectedChoice)) {
100-
setValue(
101-
selectedChoice.short ?? selectedChoice.name ?? String(selectedChoice.value),
102-
);
100+
setValue(selectedChoice.short);
103101
setStatus('done');
104102
done(selectedChoice.value);
105103
} else if (value === '') {

packages/search/src/index.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ export default createPrompt(
257257

258258
let searchStr;
259259
if (status === 'done' && selectedChoice) {
260-
const answer = selectedChoice.short ?? selectedChoice.name;
260+
const answer = selectedChoice.short;
261261
return `${prefix} ${message} ${theme.style.answer(answer)}`;
262262
} else {
263263
searchStr = theme.style.searchTerm(searchTerm);

0 commit comments

Comments
 (0)