Skip to main content

Feature usage linting

Default​

When using polyfills from the @tinkoff/pack-polyfills package, you can enable ESLint rules from the @tinkoff/eslint-plugin-tramvai package. To do this, add the following to your .eslintrc config:

{
"extends": {
"plugin:@tinkoff/tramvai/compat"
}
}

This config uses the default list of polyfills from @tinkoff/pack-polyfills and the default browserslist query from @tinkoff/browserslist-config, and it forbids using language features for which no polyfills are provided.

Extend Polyfill List / Custom Browserslist​

If you expand the list of polyfills or change the browserslist in your project, the rule will start producing incorrect errors because it relies on the default settings. Fortunately, @tinkoff/eslint-plugin-tramvai can generate lint rules based on your custom settings. However, since ESLint does not allow accessing project settings or passing arguments during plugin initialization, you need a small setup:

  1. Create a .js file next to your .eslintrc config (e.g., eslint-plugin-tramvai.js)

  2. In this file, get the ESLint config based on your custom settings:

const { getCustomEslintPlugin } = require('@tinkoff/eslint-plugin-tramvai');

// !important, provide root of your project (where package.json and tramvai.json are located)
// in most cases, this is __dirname
const { configs } = getCustomEslintPlugin(__dirname);

module.exports = { ...configs.compat };

The plugin will automatically use your custom browserslist config and the list of connected polyfills from the polyfill entrypoints.

  1. Extend your ESLint config:
{
"extends": {
"./eslint-plugin-tramvai"
}
}

Make sure to remove the default plugin:@tinkoff/tramvai/compat config.

Under the Hood​

Internally, the plugin uses eslint-plugin-es-x and eslint-plugin-compat. eslint-plugin-es-x is used for linting ECMAScript APIs, and eslint-plugin-compat for linting Web APIs.

By default, eslint-plugin-es-x doesn’t support browserslist queries. To address this, the plugin uses @automattic/eslint-config-target-es, which maps a browserslist query to a set of rules that forbid usage of unsupported language features.

We’ve also added functionality to parse used polyfills from the project entrypoints and automatically disable rules when a polyfill is present. Unfortunately, this automatic detection only works for core-js polyfills and a few widely used libraries (@formatjs and @petamoriken/float16).

Extending Web Polyfills​

Because we can’t predict which polyfill you’ll use for Web APIs, you need to manually add them (this is also true for Web APIs in core-js, such as structuredClone).

For example, to polyfill ResizeObserver, first add it in the polyfill entrypoint:

if (!('ResizeObserver' in window)) {
require('resize-observer-polyfill/dist/ResizeObserver.global');
}

Then, tell eslint-plugin-compat that a polyfill is available by adding this to your ESLint config:

{
"settings": {
"polyfills": ["ResizeObserver"]
}
}

Extending with Custom Polyfills​

The same applies to custom polyfills or non-core-js polyfills. You need to manually disable the relevant rule:

import './my-custom-promise-try.polyfill';
{
"rules": [
"es-x/no-promise-try": 0
]
}

Full list of rules

FAQ​

Does the custom setup work with legacy ESLint config?​

Yes, it’s fully designed for legacy config. Flat config is not supported.