Skip to content

Commit

Permalink
rule prefer-scope-imports
Browse files Browse the repository at this point in the history
  • Loading branch information
gearonix committed Feb 12, 2024
1 parent ab929b3 commit 90560d7
Show file tree
Hide file tree
Showing 7 changed files with 182 additions and 0 deletions.
34 changes: 34 additions & 0 deletions docs/rules/prefer-scope-imports.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# effector/no-scope-imports

This rule prefers scoped namespace imports.

Works with `effector-react`, `effector-solid`by default.

```js
// from
import { useUnit, useList } from "effector-react";
```

---

```js
// to
import { useUnit, useList } from "effector-react/scope";
```

You can also provide extra packages to include.

```json
{
"effector/prefer-scope-imports": [
"error",
{
"packages": ["@effector/reflect", "@farfetched/core", "another-lib"]
}
]
}
```

```js
import { stuff } from "@effector/reflect/scope";
```
1 change: 1 addition & 0 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ module.exports = {
"mandatory-scope-binding": require("./rules/mandatory-scope-binding/mandatory-scope-binding"),
"prefer-useUnit": require("./rules/prefer-useUnit/prefer-useUnit"),
"no-patronum-debug": require("./rules/no-patronum-debug/no-patronum-debug"),
"prefer-scope-imports": require("./rules/prefer-scope-imports/prefer-scope-imports"),
},
configs: {
recommended: require("./config/recommended"),
Expand Down
1 change: 1 addition & 0 deletions rules/prefer-scope-imports/examples/correct.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
import { useUnit, useList } from "effector-react/scope";
1 change: 1 addition & 0 deletions rules/prefer-scope-imports/examples/incorrect.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
import { useUnit, useList } from "effector-react";
60 changes: 60 additions & 0 deletions rules/prefer-scope-imports/prefer-scope-imports.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
const { createLinkToRule } = require("../../utils/create-link-to-rule");

module.exports = {
meta: {
type: "problem",
docs: {
description: "Prefer scoped namespace imports",
category: "Quality",
recommended: true,
url: createLinkToRule("prefer-scope-imports"),
},
messages: {
preferScope: "Use the `/scope` namespace.",
},
schema: [
{
type: "object",
properties: {
packages: {
type: "array",
minItems: 0,
items: [
{
type: "string",
},
],
},
},
},
],
hasSuggestions: true,
fixable: "code",
},
create(context) {
const options = context.options[0];
const userPackages = options?.packages ?? [];

const packages = ["effector-react", "effector-solid", ...userPackages];

return {
ImportDeclaration(node) {
if (!packages.includes(node.source.value)) return;

context.report({
node,
messageId: "preferScope",
suggest: [
{
messageId: "preferScope",
fix(fixer) {
const literal = node.source;
return fixer.replaceText(literal, `'${literal.value}/scope'`);
},
},
],
});
},
};
},
};
1 change: 1 addition & 0 deletions rules/prefer-scope-imports/prefer-scope-imports.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
https://eslint.effector.dev/rules/prefer-scope-imports.html
84 changes: 84 additions & 0 deletions rules/prefer-scope-imports/prefer-scope-imports.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
const { RuleTester } = require("eslint");
const { join } = require("path");

const { readExample } = require("../../utils/read-example");
const rule = require("./prefer-scope-imports");

const ruleTester = new RuleTester({
parserOptions: {
ecmaVersion: 2020,
sourceType: "module",
},
});

const readExampleForTheRule = (name) => ({
code: readExample(__dirname, name),
filename: join(__dirname, "examples", name),
});

ruleTester.run("effector/prefer-scope-imports.test", rule, {
valid: [
...["correct.js"].map(readExampleForTheRule),
...["import { useUnit, useList } from 'effector-solid/scope';"].map(
(code) => ({ code })
),
{
code: "import { useUnit, useList } from '@farfetched/core';",
},
{
code: "import { useUnit, useList } from 'effector-react/core';",
},
],

invalid: [
...["incorrect.js"].map(readExampleForTheRule).map((result) => ({
...result,
errors: [
{
messageId: "preferScope",
type: "ImportDeclaration",
suggestions: [
{
messageId: "preferScope",
output:
"import { useUnit, useList } from 'effector-react/scope';",
},
],
},
],
})),
{
code: "import { useUnit, useList } from '@farfetched/core';",
options: [{ packages: ["@farfetched/core"] }],
errors: [
{
messageId: "preferScope",
type: "ImportDeclaration",
suggestions: [
{
messageId: "preferScope",
output:
"import { useUnit, useList } from '@farfetched/core/scope';",
},
],
},
],
},
{
code: "import { useUnit, useList } from 'effector-solid';",
errors: [
{
messageId: "preferScope",
type: "ImportDeclaration",
suggestions: [
{
messageId: "preferScope",
output:
"import { useUnit, useList } from 'effector-solid/scope';",
},
],
},
],
},
],
});

0 comments on commit 90560d7

Please sign in to comment.