feature-sliced / eslint-config

🍰 Lint feature-sliced concepts by existing eslint plugins
https://npmjs.com/@feature-sliced/eslint-config
MIT License
117 stars 4 forks source link

LINT: (Feedback) Make public-api-boundaries less strict #83

Closed azinit closed 2 years ago

azinit commented 2 years ago

Problem

import/no-internal-modules (со слов @Krakazybik) не может отследить место , откуда вызывается импорт

Из-за этого для плагина импорты типа entities/foo/ui/bar - то же, что и ./ui/bar внутри сущности foo

И из-за этого "весь умный линтинг" со стороны DX сводится к "ставь реэкспорты везде где можно, независимо от слоев"

Idea

Разделения на "уровни строгости" вряд ли удастся достичь в рамках конфига. Но хотелось бы тем или иным путем - отключить триггеринг на отсутствие внутренних реэкспортов (да, это все еще считается плохой практикой, лезть во внутренности внутри внутренностей, но это не так критично, по сравнению с Slices PublicAPI и Segments PublicAPI)

Solution

Example

// describe("Slices PublicAPI")
// 👎 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";

// describe("Allow internal deep-imports")
// 👍 Pass (то же, что и Fail у SlicesAPI, но "место использования" тут влияет)
/** @path widgets/issue-details/index.ts */
import { IssueDetails } from "./ui/details"
/** @path features/auth-form/index.ts */
import { AuthForm } from "./ui/form"
/** @path features/auth-form/ui/form/content.tsx */
import * as authModel from "../../model";
/** @path shared/ui */
import { Button } from "./button/button";
/** @path entities/order/index.ts */
import { saveOrder } from "./model/actions";
import { orderModel } from "./model";
import { TicketCard } from "@/entities/ticket/ui";

Reference

https://github.com/feature-sliced/eslint-config/discussions/75#discussioncomment-2036841

azinit commented 2 years ago

@Krakazybik мб тебе тут будет что добавить 🤔