typescript - Förhindra importer utanför modulen utom genom index


Finns det en enkel lösning (kanske en lint-regel?) som kan hjälpa till att säkerställa rena kodimporter genom indexfiler? Jag skulle vilja förhindra att man importerar kod från "kusin"-filer, förutom om den görs tillgänglig via en indexfil.

Ex :

- app
  + dogs
  | + index.ts  
  | + breeds
  | |  + retriever.ts
  | |  + schnauzer.ts
  | + activities
  |    + playing.ts
  |    + walking.ts
  + cats
    + index.ts
    + breeds
    |  + siamese.ts
    |  + persion.ts
    + activities
       + sleeping.ts
       + hunting.ts  

Importering från perspektivet av cats/activities/hunting.ts:

import { sleeping } from './sleeping'       // VALID - inside same folder
import { siamese } from '../breeds/siamese' // VALID - inside cats module
import { playing } from '../../dogs'        // VALID - importing from an index

import { retriever} from '../../dogs/activities/breeds' // INVALID - cousin file outside module possibly not exported from index

Svar #1

Du kan använda eslints import/no-internal-modules-regel och konfigurera separata .eslintrc-regler per "root"-modul.

I din dogs-mapp, skapa en ny .eslintrc-fil med detta innehåll:

{
  "rules": {
    "import/no-internal-modules": [ "error", {
      "allow": [ "app/dogs/**", "app/*" ],
    } ]
  }
}

Detta betyder att vilken js/ts-fil som helst i dogs-mappen (eller någon undermapp till dogs) kan importera filer från sitt eget paket ELLER vilket paket som helst som /cats

Gör samma sak för dina cats och alla andra "root"-moduler.

Svar #2

Regeln no-restricted-imports i eslint kan användas för att tillhandahålla anpassade regler för importmönster. Detta mönster förhindrar allt 2+ nivåer upp och sedan 2+ nivåer ner, vilket förhindrar kusinimporter.

"no-restricted-imports": [
  "warn",
  {
    "patterns": [
      {
        "group": ["**/../../[a-zA-Z]*/[a-zA-Z]*/**"],
        "message": "File not exposed from the module. Consider exporting it from an index"
      }
    ]
  }
]

Relaterade artiklar