diff --git a/index.js b/index.js index f455770..20b2165 100644 --- a/index.js +++ b/index.js @@ -6,7 +6,7 @@ module.exports = { "sourceType": "module", }, extends: [ - path.resolve(__dirname, "./public-api-boundaries.js"), - path.resolve(__dirname, "./layers-slices-boundaries.js") + path.resolve(__dirname, "./rules/public-api-boundaries"), + path.resolve(__dirname, "./rules/layers-slices-boundaries") ], }; diff --git a/package.json b/package.json index 3eefcb8..e8d8c17 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "publish:minor": "npm version minor && npm publish", "publish:major": "npm version major && npm publish", "clean": "git clean -fxd", - "test": "mocha test/**.test.js" + "test": "mocha **/**.test.js" }, "peerDependencies": { "eslint": ">=6", diff --git a/layers-slices-boundaries.js b/rules/layers-slices-boundaries/index.js similarity index 82% rename from layers-slices-boundaries.js rename to rules/layers-slices-boundaries/index.js index afc6b54..71a9db3 100644 --- a/layers-slices-boundaries.js +++ b/rules/layers-slices-boundaries/index.js @@ -1,13 +1,14 @@ -const { getLowerLayers, FS_LAYERS } = require("./helpers"); +const { layersLib } = require("../../utils/layers"); const getLayersRules = () => - FS_LAYERS.map((layer) => ({ + + layersLib.FS_LAYERS.map((layer) => ({ from: layer, - allow: getLowerLayers(layer), + allow: layersLib.getLowerLayers(layer), })); const getLayersBoundariesElements = () => - FS_LAYERS.map((layer) => ({ + layersLib.FS_LAYERS.map((layer) => ({ type: layer, pattern: `${layer}/*`, mode: "folder", diff --git a/rules/layers-slices-boundaries/index.md b/rules/layers-slices-boundaries/index.md new file mode 100644 index 0000000..96569e5 --- /dev/null +++ b/rules/layers-slices-boundaries/index.md @@ -0,0 +1,19 @@ +# @feature-sliced/layers-slices-boundaries + +Reference: [Cross-communication](https://feature-sliced.design/docs/concepts/cross-communication) + +```js +// 👎 Fail +// 🛣 features/auth-form/index.ts +import { getRoute } from "pages/auth"; +import { getStore } from "app/store"; +import { getAuthCtx } from "features/logout"; +import { UserAvatar } from "features/viewer-picker"; + +// 👍 Pass +// 🛣 features/auth-form/index.ts +import { sessionModel } from "entities/session"; +import { Form, Button } from "shared/ui"; +import { getAuthCtx } from "entities/session"; +import { UserAvatar } from "entities/user"; +``` diff --git a/test/layers-boundaries.test.js b/rules/layers-slices-boundaries/layers.test.js similarity index 87% rename from test/layers-boundaries.test.js rename to rules/layers-slices-boundaries/layers.test.js index fc46ad9..9328a08 100644 --- a/test/layers-boundaries.test.js +++ b/rules/layers-slices-boundaries/layers.test.js @@ -1,8 +1,7 @@ const { ESLint } = require("eslint"); const assert = require("assert"); -const { getRandomImportByLayerName } = require("./utils/tools"); -const { mockImports } = require("./utils/mock-import"); -const cfg = require(".."); +const { mockImports } = require("../../utils/mock-import"); +const cfg = require("./"); const eslint = new ESLint({ useEslintrc: false, diff --git a/test/slices-boundaries.test.js b/rules/layers-slices-boundaries/slices.test.js similarity index 94% rename from test/slices-boundaries.test.js rename to rules/layers-slices-boundaries/slices.test.js index cebfd05..c68f26a 100644 --- a/test/slices-boundaries.test.js +++ b/rules/layers-slices-boundaries/slices.test.js @@ -1,8 +1,7 @@ const { ESLint } = require("eslint"); const assert = require("assert"); -const { getRandomImportByLayerName } = require("./utils/tools"); -const { mockImports } = require("./utils/mock-import"); -const cfg = require(".."); +const { mockImports } = require("../../utils/mock-import"); +const cfg = require("./"); const eslint = new ESLint({ useEslintrc: false, diff --git a/public-api-boundaries.js b/rules/public-api-boundaries/index.js similarity index 83% rename from public-api-boundaries.js rename to rules/public-api-boundaries/index.js index 85842c7..618fe1e 100644 --- a/public-api-boundaries.js +++ b/rules/public-api-boundaries/index.js @@ -1,7 +1,7 @@ -const { getUpperLayers, FS_SEGMENTS, FS_LAYERS } = require("./helpers"); +const { layersLib } = require("../../utils/layers"); -const FS_SEGMENTS_REG = FS_SEGMENTS.join("|"); -const FS_LAYERS_REG = FS_LAYERS.join("|"); +const FS_SEGMENTS_REG = layersLib.FS_SEGMENTS.join("|"); +const FS_LAYERS_REG = layersLib.FS_LAYERS.join("|"); module.exports = { parserOptions: { @@ -19,7 +19,7 @@ module.exports = { * 'entities/form/ui' // Fail * 'entities/form' // Pass */ - `**/*(${getUpperLayers("shared").join("|")})/!(${FS_SEGMENTS_REG})`, + `**/*(${layersLib.getUpperLayers("shared").join("|")})/!(${FS_SEGMENTS_REG})`, /** * Allow slices with structure grouping diff --git a/rules/public-api-boundaries/index.md b/rules/public-api-boundaries/index.md new file mode 100644 index 0000000..ea36cef --- /dev/null +++ b/rules/public-api-boundaries/index.md @@ -0,0 +1,24 @@ +# @feature-sliced/public-api-boundaries + +Reference: [PublicAPI](https://feature-sliced.design/docs/concepts/public-api) + +```js +// 👎 Fail +import { Issues } from "pages/issues/ui"; +import { IssueDetails } from "widgets/issue-details/ui/details" +import { AuthForm } from "features/auth-form/ui/form" +import { Button } from "shared/ui/button/button"; +import { saveOrder } from "entities/order/model/actions"; +import { orderModel } from "entities/order/model"; +import { TicketCard } from "@/entities/ticket/ui"; + +// 👍 Pass +import { Issues } from "pages/issues"; +import { IssueDetails } from "widgets/issue-details" +import { AuthForm } from "features/auth-form" +import { Button } from "shared/ui/button"; +import { orderModel } from "entities/order"; +import { TicketCard } from "@/entities/ticket"; +import { AuthForm } from "features/auth/form" +import { Button } from "shared/ui"; +``` diff --git a/test/public-api-boundaries.test.js b/rules/public-api-boundaries/index.test.js similarity index 95% rename from test/public-api-boundaries.test.js rename to rules/public-api-boundaries/index.test.js index 81e5738..4c6d880 100644 --- a/test/public-api-boundaries.test.js +++ b/rules/public-api-boundaries/index.test.js @@ -1,7 +1,7 @@ const { ESLint } = require("eslint"); const assert = require("assert"); -const { mockImports } = require("./utils/mock-import"); -const cfg = require("../public-api-boundaries"); +const { mockImports } = require("../../utils/mock-import"); +const cfg = require("./"); const eslint = new ESLint({ useEslintrc: false, diff --git a/test/config.test.js b/test/config.test.js index aceda97..381e46f 100644 --- a/test/config.test.js +++ b/test/config.test.js @@ -1,6 +1,6 @@ const assert = require("assert"); const cfg = require("../"); -const utils = require("./utils/tools"); +const utils = require("../utils/tools"); describe("config is valid", () => { it("parserOptions ~ Record", () => { diff --git a/helpers.js b/utils/layers.js similarity index 81% rename from helpers.js rename to utils/layers.js index 8fc3287..0b0f37f 100644 --- a/helpers.js +++ b/utils/layers.js @@ -20,4 +20,4 @@ const FS_SEGMENTS = [ const getLowerLayers = (layer) => FS_LAYERS.slice(FS_LAYERS.indexOf(layer) + 1); const getUpperLayers = (layer) => FS_LAYERS.slice(0, FS_LAYERS.indexOf(layer)); -module.exports = { FS_LAYERS, FS_SEGMENTS, getLowerLayers, getUpperLayers }; +module.exports.layersLib = { FS_LAYERS, FS_SEGMENTS, getLowerLayers, getUpperLayers } ; diff --git a/test/utils/mock-import/index.js b/utils/mock-import/index.js similarity index 100% rename from test/utils/mock-import/index.js rename to utils/mock-import/index.js diff --git a/test/utils/mock-import/mock-resolver.js b/utils/mock-import/mock-resolver.js similarity index 100% rename from test/utils/mock-import/mock-resolver.js rename to utils/mock-import/mock-resolver.js diff --git a/test/utils/tools.js b/utils/tools.js similarity index 100% rename from test/utils/tools.js rename to utils/tools.js