PromucFlow_constructor/app/client/.eslintrc.js
Ankita Kinger 3945fc3140
chore: Adding eslint rule for @appsmith imports (#24207)
## Description

Adding eslint rule for `@appsmith` imports to avoid a set of merge
conflicts on community sync with the business edition repo.

#### PR fixes following issue(s)
Fixes [#24183](https://github.com/appsmithorg/appsmith/issues/24183)

#### Type of change
- Chore (housekeeping or task changes that don't impact user perception)

## Testing

#### How Has This Been Tested?
- [x] Manual
- [ ] Jest
- [ ] Cypress

## Checklist:
#### Dev activity
- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my own code
- [x] I have commented my code, particularly in hard-to-understand areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [ ] PR is being merged under a feature flag


#### QA activity:
- [ ] [Speedbreak
features](https://github.com/appsmithorg/TestSmith/wiki/Test-plan-implementation#speedbreaker-features-to-consider-for-every-change)
have been covered
- [ ] Test plan covers all impacted features and [areas of
interest](https://github.com/appsmithorg/TestSmith/wiki/Guidelines-for-test-plans/_edit#areas-of-interest)
- [ ] Test plan has been peer reviewed by project stakeholders and other
QA members
- [ ] Manually tested functionality on DP
- [ ] We had an implementation alignment call with stakeholders post QA
Round 2
- [ ] Cypress test cases have been added and approved by SDET/manual QA
- [ ] Added `Test Plan Approved` label after Cypress tests were reviewed
- [ ] Added `Test Plan Approved` label after JUnit tests were reviewed
2023-06-07 19:39:17 +05:30

121 lines
5.4 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 eslintConfig = {
extends: ["./.eslintrc.base.json"],
rules: {
// `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: [
{
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,
},
],
patterns: [
{
group: ["@blueprintjs/core/lib/esnext/*"],
message:
"Reason: @blueprintjs/core has both lib/esnext and lib/esm directories which export the same components. To avoid duplicating components in the bundle, please import only from the lib/esm directory.",
},
{
group: ["*.svg"],
importNames: ["ReactComponent"],
message:
"Reason: Please dont import SVG icons statically. (They wont always be needed, but they *will* always be present in the bundle and will increase the bundle size.) Instead, please either import them as SVG paths (e.g. import starIconUrl from './star.svg'), or use the importSvg wrapper from design-system-old (e.g. const StarIcon = importSvg(() => import('./star.svg'))).",
},
{
group: ["remixicon-react/*"],
message:
"Reason: Please dont import Remix icons statically. (They wont always be needed, but they *will* always be present in the bundle and will increase the bundle size.) Instead, please use the importRemixIcon wrapper from design-system-old (e.g. const StarIcon = importRemixIcon(() => import('remixicon-react/Star'))).",
},
{
group: ["**/ce/*"],
message: "Reason: Please use @appsmith import instead.",
},
],
},
],
// 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.
"no-restricted-syntax": [
"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.",
},
],
},
};
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),
},
},
];
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];
}
module.exports = eslintConfig;