kibana/packages/kbn-eslint-plugin-imports
Gerard Soldevila adb4bdf8d8
SKA: Extract list of Kibana solutions into a dedicated package (#213353)
## Summary

The intent is to have a centralised place to store the list of Kibana
solutions and serverless project types.
To that end, this PR creates a `@kbn/projects-solutions-groups` package.
It also adds the new solution type `'chat'`.

---------

Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>
2025-03-20 10:20:07 +01:00
..
src SKA: Extract list of Kibana solutions into a dedicated package (#213353) 2025-03-20 10:20:07 +01:00
index.ts Add ESLINT constraints to detect inter-group dependencies (#194810) 2024-10-22 06:34:19 -05:00
jest.config.js Adds AGPL 3.0 license (#192025) 2024-09-06 19:02:41 -06:00
kibana.jsonc Transpile packages on demand, validate all TS projects (#146212) 2022-12-22 19:00:29 -06:00
package.json Adds AGPL 3.0 license (#192025) 2024-09-06 19:02:41 -06:00
README.mdx [Obs AI Assistant] Use Mocha & Synthtrace (#173993) 2023-12-28 16:13:24 +01:00
tsconfig.json SKA: Extract list of Kibana solutions into a dedicated package (#213353) 2025-03-20 10:20:07 +01:00

---
id: kibDevDocsOpsEslintPluginImports
slug: /kibana-dev-docs/ops/kbn-eslint-plugin-imports
title: "@kbn/eslint-plugin-imports"
description: Custom ESLint rules for managing `imports` in the Kibana repository
tags: ['kibana', 'dev', 'contributor', 'operations', 'eslint', 'imports']
---

`@kbn/eslint-plugin-imports` is an ESLint plugin providing custom rules for validating imports in the Kibana repo with custom logic beyond what's possible with custom config to eslint-plugin-imports and even a custom resolver.

For the purposes of this ESLint plugin "imports" include:

 - `import` statements
 - `import()` expressions
 - `export ... from` statements
 - `require()` calls
 - `require.resolve()` calls
 - `jest.mock()` and related calls

An "import request" is the string defining the target package/module by any of the previous mentioned "import" types

## `@kbn/imports/no_unresolvable_imports`

This rule validates that every import request in the repository can be resolved by `@kbn/import-resolver`.

This rule is not configurable, should never be skipped, and is auto-fixable.

If a valid import request can't be resolved for some reason please reach out to Kibana Operations to work on either a different strategy for the import or help updating the resolve to support the new import strategy.

## `@kbn/imports/uniform_imports`

This rule validates that every import request in the repsitory follows a standard set of formatting rules. See the rule implemeation for a full breakdown but here is a breif summary:

 - imports within a single package must use relative paths
 - imports across packages must reference the other package using it's module id
 - imports to code not in a package must use relative paths
 - imports to an `index` file end with the directory name, ie `/index` or `/index.{ext}` are stripped
 - unless this is a `require.resolve()`, the imports should not mention file extensions. `require.resolve()` calls will retain the extension if added manually

This rule is not configurable, should never be skipped, and is auto-fixable.

## `@kbn/imports/require_import`

This rule validates that specific imports are present in a file. This allows you to e.g. require Mocha globals in test files automatically. Currently the only supported import type is a TypeScript reference type. This rule is auto-fixable.

## `@kbn/imports/exports_moved_packages`

This rule assists package authors who are doing the good work of breaking up large packages. The goal is to define exports which used to be part of one package as having moved to another package. The configuration maintains this mapping and is designed to be extended in the future is additional needs arrise like targetting specific package types.

Config example:
```ts
'@kbn/imports/exports_moved_packages': ['error', [
  {
    fromPackage: '@kbn/kitchen-sink',
    toPackage: '@kbn/spatula',
    exportNames: [
      'Spatula',
      'isSpatula'
    ]
  }
]]
```

This config will find any import of `@kbn/kitchen-sink` which specifically references the `Spatula` or `isSpatula` exports, remove the old exports from the import (potentially removing the entire import), and add a new import after the previous following it's style pointing to the new package.

The auto-fixer here covers the vast majority of import styles in the repository but might not cover everything, including `import * as Namespace from '@kbn/kitchen-sink'`. Imports like this will need to be found and updated manually, though TypeScript should be able to find the vast majority of those.

## `@kbn/imports/no_unused_imports`

This rule finds imports that are unused and provides an auto-fix to remove them. When ESLint appears to be running in an editor, as defined by [`helpers/running_in_editor.ts`](src/helpers/running_in_editor.ts), this rule provided suggestions instead of fixes so that the removals are not applied automatically in case you are debugging, returning early, or something else which makes ESLint think that the import is unused when it isn't. On CI and in the pre-commit hook though, this fix will be applied automatically.