Skip to content

useImportExtensions

Enforce file extensions for relative imports.

Browsers, Deno, and Node.js do not natively support importing files without extensions from JavaScript modules. This rule enforces the use of file extensions for relative imports to make the code more consistent — and correct.

In some cases, tooling can also benefit from explicit file extensions, because they do not need to guess which file to resolve.

The rule checks both static imports (import ... from "...") as well as dynamic imports such as import(...) and require(...).

The following examples assume these imports will resolve to a file with an extension. Imports that don’t resolve at all will not trigger a diagnostic.

import "./foo";
import "./foo/";
import "../";
import "../.";
import("./foo");
require("./foo");
import "biome";
import "./foo.js";
import "./bar/index.js";
import("./foo.js");
require("./foo.js");

The rule provides the options described below.

Normally, this rule suggests to use the extension of the module that is found in your project. For instance, .ts or .tsx for a TypeScript file. If this option is set to true, the rule will always suggest to use .js regardless of the extension in your project.

This is useful if you use the "module": "node16" setting when building your code with tsc.

Default: false

{
"options": {
"forceJsExtensions": true
}
}

If you use Visual Studio Code, you can ensure that it adds the file extension when automatically importing a variable by configuring javascript.preferences.importModuleSpecifierEnding and typescript.preferences.importModuleSpecifierEnding in your settings.

If you are using TypeScript, TypeScript version 5.0 or later is required, also make sure to set allowImportingTsExtensions: true in your tsconfig.json.

biome.json
{
"linter": {
"rules": {
"correctness": {
"useImportExtensions": "error"
}
}
}
}