PromucFlow_constructor/app/client/.eslintrc.js
Valera Melnikov d7cd02a45d
fix: add testing library eslint rules (#31028)
Added recommended rules for testing library

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

- **New Features**
- Added `data-testid` attributes across various components for improved
test identification.

- **Tests**
- Enhanced test cases with asynchronous handling (`async`/`await`) for
more reliable user interaction simulations.
- Transitioned to using `getByTestId` instead of `queryByTestId` for
better assertion reliability in tests.
- Added `await` before the `userEvent.click(el)` statement in the
ChartWidget test file.
- Updated the destructured variable names from `queryByTestId` to
`getByTestId` in the DividerWidget test file for improved clarity.
- Added an import for `screen` from "@testing-library/react" and updated
element querying in the TabsWidget test file.

- **Chores**
- Updated ESLint configurations to include testing-library plugins and
rules, improving code quality and consistency in test files.
- Removed unnecessary `cleanup` function calls after tests, following
best practices for test cleanup.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2024-02-12 18:59:10 +03:00

171 lines
6.9 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// The `@type` comment improves auto-completion for VS Code users: https://github.com/appsmithorg/appsmith/pull/21602#discussion_r1144528505
/** @type {import('eslint').Linter.Config} */
const fs = require("fs");
const path = require("path");
const JSON5 = require("json5");
const baseEslintConfig = JSON5.parse(
fs.readFileSync(path.join(__dirname, "./.eslintrc.base.json"), "utf8"),
);
const baseNoRestrictedImports =
baseEslintConfig.rules["@typescript-eslint/no-restricted-imports"][1];
const eslintConfig = {
extends: ["./.eslintrc.base.json"],
rules: {
"testing-library/no-container": "off",
"testing-library/no-node-access": "off",
"testing-library/no-debugging-utils": "off",
"testing-library/prefer-screen-queries": "off",
"testing-library/render-result-naming-convention": "off",
"testing-library/no-unnecessary-act": "off",
"@typescript-eslint/prefer-nullish-coalescing": "off",
"@typescript-eslint/strict-boolean-expressions": "off",
"@typescript-eslint/no-explicit-any": "off",
"react/display-name": "off",
"react/prop-types": "off",
// `no-restricted-imports` is disabled, as recommended in https://typescript-eslint.io/rules/no-restricted-imports/.
// Please use @typescript-eslint/no-restricted-imports below instead.
"no-restricted-imports": "off",
"@typescript-eslint/no-restricted-imports": [
"error",
{
paths: [
...(baseNoRestrictedImports.paths ?? []),
{
name: "codemirror",
message:
"Reason: If you want to call CodeMirror.on(), CodeMirror.Pos(), or similar functions, please dont import CodeMirror directly. (This will cause it to be bundled in the main chunk.) Instead, assuming your function has access to CodeMirrors editor or doc, use getCodeMirrorNamespaceFromEditor() or getCodeMirrorNamespaceFromDoc() functions to get the CodeMirror namespace from the editor or the doc.",
// Allow type imports as they dont lead to bundling the dependency
allowTypeImports: true,
},
{
name: "lottie-web",
message:
"Reason: Please dont import lottie directly as its very large. Instead, use the utils/lazyLottie wrapper.",
// Allow type imports as they dont lead to bundling the dependency
allowTypeImports: true,
},
{
name: "sql-formatter",
importNames: ["format"],
message:
"Reason: Instead of `import { format }` (which bundles all formatting dialects), please import only dialects you need (e.g. `import { formatDialect, postgresql }`. See https://github.com/sql-formatter-org/sql-formatter/issues/452",
},
],
patterns: [
...(baseNoRestrictedImports.patterns ?? []),
{
group: ["**/ce/*"],
message: "Reason: Please use @appsmith import instead.",
},
],
},
],
"no-restricted-syntax": [
// Annoyingly, the `no-restricted-imports` rule doesnt allow to restrict imports of
// `editorComponents/CodeEditor` but not `editorComponents/CodeEditor/*`: https://stackoverflow.com/q/64995811/1192426
// So were using `no-restricted-syntax` instead.
"error",
{
// Match all
// - `import` statements
// - that are not `import type` statements we allow type imports as they dont lead to bundling the dependency
// - that import `editorComponents/CodeEditor` or `editorComponents/CodeEditor/index` but not `editorComponents/CodeEditor/<anything else>`
// Note: using `\\u002F` instead of `/` due to https://eslint.org/docs/latest/extend/selectors#known-issues
selector:
"ImportDeclaration[importKind!='type'][source.value=/editorComponents\\u002FCodeEditor(\\u002Findex)?$/]",
message:
"Please dont import CodeEditor directly this will cause it to be bundled in the main chunk. Instead, use the LazyCodeEditor component.",
},
// Annoyingly, no-restricted-imports follows the gitignore exclude syntax,
// so theres no way to exclude all @uppy/* but not @uppy/*/*.css imports:
// https://github.com/eslint/eslint/issues/16927
{
// Match all
// - `import` statements
// - that are not `import type` statements we allow type imports as they dont lead to bundling the dependency
// - that import `@uppy/*` unless the `*` part ends with `.css`
// Note: using `\\u002F` instead of `/` due to https://eslint.org/docs/latest/extend/selectors#known-issues
selector:
"ImportDeclaration[importKind!='type'][source.value=/^@uppy\\u002F(?!.*.css$)/]",
message:
"Please dont import Uppy directly. End users rarely use Uppy (e.g. only when they need to upload a file) but Uppy bundles ~200 kB of JS. Please import it lazily instead.",
},
],
},
};
eslintConfig.overrides = [
// For CodeEditor, disable CodeEditor- and CodeMirror-specific import rules
{
files: ["**/components/editorComponents/CodeEditor/**/*"],
rules: {
"@typescript-eslint/no-restricted-imports":
getRestrictedImportsOverrideForCodeEditor(eslintConfig),
"no-restricted-syntax":
getRestrictedSyntaxOverrideForCodeEditor(eslintConfig),
},
},
{
files: ["**/ee/**/*"],
rules: {
...eslintConfig.rules,
"@typescript-eslint/no-restricted-imports":
getRestrictedImportsOverrideForEE(eslintConfig),
},
},
];
function getRestrictedImportsOverrideForCodeEditor(eslintConfig) {
const [errorLevel, existingRules] =
eslintConfig.rules["@typescript-eslint/no-restricted-imports"];
const newPatterns = (existingRules.patterns ?? []).filter(
(i) => i.group[0] !== "**/components/editorComponents/CodeEditor",
);
const newPaths = (existingRules.paths ?? []).filter(
(i) => i.name !== "codemirror",
);
if (newPatterns.length === 0 && newPaths.length === 0) {
return ["off"];
}
return [errorLevel, { patterns: newPatterns, paths: newPaths }];
}
function getRestrictedSyntaxOverrideForCodeEditor(eslintConfig) {
const [errorLevel, ...existingRules] =
eslintConfig.rules["no-restricted-syntax"];
const newRules = existingRules.filter(
(i) =>
i.selector !==
"ImportDeclaration[source.value=/editorComponents\\u002FCodeEditor(\\u002Findex)?$/]",
);
if (newRules.length === 0) {
return ["off"];
}
return [errorLevel, ...newRules];
}
function getRestrictedImportsOverrideForEE(eslintConfig) {
const [errorLevel, existingRules] =
eslintConfig.rules["@typescript-eslint/no-restricted-imports"];
const newPatterns = (existingRules.patterns ?? []).filter(
(i) => i.group[0] !== "**/ce/*",
);
if (newPatterns.length === 0) {
return ["off"];
}
return [errorLevel, { paths: existingRules.paths, patterns: newPatterns }];
}
module.exports = eslintConfig;