refactor(frontend): fix eslint config

This commit is contained in:
Sergey Krylov 2025-09-05 05:19:56 +03:00
parent af0436c655
commit 07367c4897
14 changed files with 63 additions and 48 deletions

View File

@ -1,6 +1,12 @@
import '@testing-library/jest-dom'; import '@testing-library/jest-dom';
import { server } from '@mocks/jest/server'; import { server } from '@mocks/jest/server';
beforeAll(() => server.listen()); beforeAll(() => {
afterEach(() => server.resetHandlers()); server.listen();
afterAll(() => server.close()); });
afterEach(() => {
server.resetHandlers();
});
afterAll(() => {
server.close();
});

View File

@ -2,6 +2,7 @@ import pluginQuery from '@tanstack/eslint-plugin-query';
// @ts-expect-error fix package // @ts-expect-error fix package
import config from 'eslint-config-ksv741'; import config from 'eslint-config-ksv741';
// eslint-disable-next-line import/no-anonymous-default-export
export default [ export default [
...pluginQuery.configs['flat/recommended'], ...pluginQuery.configs['flat/recommended'],
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
@ -9,14 +10,24 @@ export default [
{ {
rules: { rules: {
'import/no-extraneous-dependencies': ['error', { 'import/no-extraneous-dependencies': ['error', {
devDependencies: ['eslint.config.ts', 'rsbuild.config.ts', 'configs/**/*'], devDependencies: [
'eslint.config.ts',
'rsbuild.config.ts',
'configs/**/*',
'**/*.test.js',
'**/*.test.jsx',
'**/*.test.ts',
'**/*.test.tsx',
'**/__tests__/**',
'**/tests/**',
'__mocks__/**',
],
}], }],
'import/no-anonymous-default-export': 'off',
'import/order': [ 'import/order': [
'error', { 'error', {
pathGroups: [ pathGroups: [
{ {
pattern: '__spec__/**', pattern: '__mocks__/**',
group: 'builtin', group: 'builtin',
position: 'before', position: 'before',
}, },
@ -71,13 +82,7 @@ export default [
], ],
'@typescript-eslint/strict-boolean-expressions': 'off', '@typescript-eslint/strict-boolean-expressions': 'off',
'@typescript-eslint/no-floating-promises': 'off', '@typescript-eslint/no-floating-promises': 'off',
'@typescript-eslint/consistent-return': 'off',
'func-style': 'off', 'func-style': 'off',
'@typescript-eslint/no-confusing-void-expression': 'off',
'@typescript-eslint/await-thenable': 'off',
'@typescript-eslint/no-misused-promises': 'off',
'@typescript-eslint/prefer-nullish-coalescing': 'off',
'@typescript-eslint/no-unnecessary-condition': 'off',
'jsx-a11y/click-events-have-key-events': 'off', 'jsx-a11y/click-events-have-key-events': 'off',
'jsx-a11y/no-static-element-interactions': 'off', 'jsx-a11y/no-static-element-interactions': 'off',
'jsx-a11y/no-noninteractive-element-interactions': 'off', 'jsx-a11y/no-noninteractive-element-interactions': 'off',
@ -86,23 +91,4 @@ export default [
{ {
ignores: ['./src/shared/api/schema.ts'], ignores: ['./src/shared/api/schema.ts'],
}, },
{
files: [
'**/*.test.js',
'**/*.test.jsx',
'**/*.test.ts',
'**/*.test.tsx',
'**/__tests__/**',
'**/tests/**',
'__mocks__/**',
],
rules: {
'import/no-extraneous-dependencies': [
'error',
{ devDependencies: true }, // в тестах можно
],
'@typescript-eslint/no-unsafe-call': 'off',
'@typescript-eslint/no-unsafe-member-access': 'off',
},
},
]; ];

View File

@ -37,8 +37,12 @@ describe('Test AddExpenseItemForm', () => {
}); });
test.each([ test.each([
['enabled', {}, (el: HTMLElement) => expect(el).toBeEnabled()], ['enabled', {}, (el: HTMLElement) => {
['disabled', { disabled: true }, (el: HTMLElement) => expect(el).toBeDisabled()], expect(el).toBeEnabled();
}],
['disabled', { disabled: true }, (el: HTMLElement) => {
expect(el).toBeDisabled();
}],
])('should render fields %s', (_state, options, assertion) => { ])('should render fields %s', (_state, options, assertion) => {
const { onSubmit, ...formElems } = renderForm(options); const { onSubmit, ...formElems } = renderForm(options);
Object.values(formElems).forEach(assertion); Object.values(formElems).forEach(assertion);

View File

@ -72,8 +72,12 @@ describe('Test EditExpenseItemForm', () => {
}); });
test.each([ test.each([
['enabled', {}, (el: HTMLElement) => expect(el).toBeEnabled()], ['enabled', {}, (el: HTMLElement) => {
['disabled', { disabled: true }, (el: HTMLElement) => expect(el).toBeDisabled()], expect(el).toBeEnabled();
}],
['disabled', { disabled: true }, (el: HTMLElement) => {
expect(el).toBeDisabled();
}],
])('should render fields %s', (_state, options, assertion) => { ])('should render fields %s', (_state, options, assertion) => {
const { onSubmit, ...formElems } = renderForm(options); const { onSubmit, ...formElems } = renderForm(options);
Object.values(formElems).forEach(assertion); Object.values(formElems).forEach(assertion);

View File

@ -36,6 +36,7 @@ const EditExpenseItemForm: FC<EditExpenseItemFormProps> = (props) => {
...formProps ...formProps
} = props; } = props;
// eslint-disable-next-line @typescript-eslint/no-misused-promises
const onFormSubmitHandler: FormEventHandler<HTMLFormElement> = async (event) => { const onFormSubmitHandler: FormEventHandler<HTMLFormElement> = async (event) => {
event.preventDefault(); event.preventDefault();

View File

@ -29,8 +29,12 @@ describe('Test AddExpensesListForm', () => {
}); });
test.each([ test.each([
['enabled', {}, (el: HTMLElement) => expect(el).toBeEnabled()], ['enabled', {}, (el: HTMLElement) => {
['disabled', { disabled: true }, (el: HTMLElement) => expect(el).toBeDisabled()], expect(el).toBeEnabled();
}],
['disabled', { disabled: true }, (el: HTMLElement) => {
expect(el).toBeDisabled();
}],
])('should render fields %s', (_state, options, assertion) => { ])('should render fields %s', (_state, options, assertion) => {
const { onSubmit, ...formElems } = renderForm(options); const { onSubmit, ...formElems } = renderForm(options);
Object.values(formElems).forEach(assertion); Object.values(formElems).forEach(assertion);

View File

@ -37,7 +37,7 @@ const AddExpensesListForm: FC<AddExpenseListFormProps> = (props) => {
const title = formData.get('title'); const title = formData.get('title');
if (typeof title === 'string') { if (typeof title === 'string') {
onSubmit?.({ onSubmit({
title, title,
}); });
} }

View File

@ -46,14 +46,14 @@ const DeleteExpensesListForm: FC<DeleteExpenseListFormProps> = (props) => {
</p> </p>
{ {
list?.items && list?.items?.length > 0 list.items && list.items.length > 0
? ( ? (
<p> <p>
В нем содержится В нем содержится
{' '} {' '}
<b> <b>
{list.items?.length} {list.items.length}
</b> </b>
{' '} {' '}

View File

@ -51,8 +51,12 @@ describe('Test EditExpensesListForm', () => {
}); });
test.each([ test.each([
['enabled', {}, (el: HTMLElement) => expect(el).toBeEnabled()], ['enabled', {}, (el: HTMLElement) => {
['disabled', { disabled: true }, (el: HTMLElement) => expect(el).toBeDisabled()], expect(el).toBeEnabled();
}],
['disabled', { disabled: true }, (el: HTMLElement) => {
expect(el).toBeDisabled();
}],
])('should render fields %s', (_state, options, assertion) => { ])('should render fields %s', (_state, options, assertion) => {
const { onSubmit, ...formElems } = renderForm(options); const { onSubmit, ...formElems } = renderForm(options);
Object.values(formElems).forEach(assertion); Object.values(formElems).forEach(assertion);

View File

@ -15,7 +15,9 @@ export const useAddExpenseItemButton = (args: UseAddExpenseItemButtonArgs) => {
const [isOpen, setIsOpen] = useState(false); const [isOpen, setIsOpen] = useState(false);
const { mutateAsync: addExpenseItemMutation, isPending } = useAddExpenseItem({ id: listId }); const { mutateAsync: addExpenseItemMutation, isPending } = useAddExpenseItem({ id: listId });
const onCloseModalHandler = () => setIsOpen(false); const onCloseModalHandler = () => {
setIsOpen(false);
};
const onClickHandler: MouseEventHandler<HTMLButtonElement> = (event) => { const onClickHandler: MouseEventHandler<HTMLButtonElement> = (event) => {
setIsOpen(true); setIsOpen(true);

View File

@ -13,7 +13,9 @@ export const useDeleteExpenseItemButton = (args: UseDeleteExpenseItemButtonArgs)
const { item, onClick } = args; const { item, onClick } = args;
const [isOpen, setIsOpen] = useState(false); const [isOpen, setIsOpen] = useState(false);
const onCloseModalHandler = () => setIsOpen(false); const onCloseModalHandler = () => {
setIsOpen(false);
};
const onClickHandler: MouseEventHandler<HTMLButtonElement> = (event) => { const onClickHandler: MouseEventHandler<HTMLButtonElement> = (event) => {
setIsOpen(true); setIsOpen(true);
onClick?.(event); onClick?.(event);

View File

@ -17,7 +17,9 @@ export const useEditExpenseItemButton = (args: UseAddExpenseItemButtonArgs) => {
id: item.id, id: item.id,
listId: item.expenseListId, listId: item.expenseListId,
}); });
const onCloseModalHandler = () => setIsOpen(false); const onCloseModalHandler = () => {
setIsOpen(false);
};
const onClickHandler: MouseEventHandler<HTMLButtonElement> = (event) => { const onClickHandler: MouseEventHandler<HTMLButtonElement> = (event) => {
setIsOpen(true); setIsOpen(true);

View File

@ -7,7 +7,7 @@ const rootEl = document.getElementById('root');
async function enableMocking() { async function enableMocking() {
if (process.env.PUBLIC_ENABLE_MOCKING !== 'true') { if (process.env.PUBLIC_ENABLE_MOCKING !== 'true') {
return; return false;
} }
const { worker } = await import('@mocks/browser/msw'); const { worker } = await import('@mocks/browser/msw');

View File

@ -9,7 +9,7 @@ import classes from './ExpensesTable.module.css';
const ExpensesTable = () => { const ExpensesTable = () => {
const { data: expensesList, isPending, isLoading } = useExpensesList(); const { data: expensesList, isPending, isLoading } = useExpensesList();
if (isPending || isLoading) { if (isLoading || isPending) {
return ( return (
<span>Loading...</span> <span>Loading...</span>
); );
@ -49,7 +49,7 @@ const ExpensesTable = () => {
</td> </td>
<td> <td>
{expense.items?.length || 0} {expense.items?.length ?? 0}
</td> </td>
<td> <td>