https://github.com/jaydenseric/eslint-plugin-optimal-modules
An ESLint plugin to enforce optimal JavaScript module design.
https://github.com/jaydenseric/eslint-plugin-optimal-modules
eslint esm maintained mjs node npm typescript
Last synced: about 1 year ago
JSON representation
An ESLint plugin to enforce optimal JavaScript module design.
- Host: GitHub
- URL: https://github.com/jaydenseric/eslint-plugin-optimal-modules
- Owner: jaydenseric
- License: mit
- Created: 2023-06-28T22:10:45.000Z (almost 3 years ago)
- Default Branch: main
- Last Pushed: 2024-09-26T02:51:14.000Z (over 1 year ago)
- Last Synced: 2025-05-03T22:47:12.762Z (about 1 year ago)
- Topics: eslint, esm, maintained, mjs, node, npm, typescript
- Language: JavaScript
- Homepage: https://npm.im/eslint-plugin-optimal-modules
- Size: 23.4 KB
- Stars: 4
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: readme.md
- Changelog: changelog.md
- Funding: .github/funding.yml
- License: license.md
Awesome Lists containing this project
README
# eslint-plugin-optimal-modules
An [ESLint plugin](https://eslint.org/docs/latest/use/configure/plugins) to enforce [optimal JavaScript module design](https://jaydenseric.com/blog/optimal-javascript-module-design).
## Installation
To install [`eslint-plugin-optimal-modules`](https://npm.im/eslint-plugin-optimal-modules) with [npm](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm), run:
```sh
npm install eslint-plugin-optimal-modules --save-dev
```
To use the [recommended config](#config-recommended), add the following ESLint “flat” config in [`eslint.config.mjs`](https://eslint.org/docs/latest/use/configure/configuration-files#configuration-file):
```js
// @ts-check
import eslintPluginOptimalModules from "eslint-plugin-optimal-modules";
/**
* ESLint config.
* @satisfies {Array}
*/
const eslintConfig = [eslintPluginOptimalModules.configs.recommended];
export default eslintConfig;
```
Alternatively, manually configure the plugin and the desired rules:
```js
// @ts-check
import eslintPluginOptimalModules from "eslint-plugin-optimal-modules";
/**
* ESLint config.
* @satisfies {Array}
*/
const eslintConfig = [
{
plugins: {
"optimal-modules": eslintPluginOptimalModules,
},
rules: {
"optimal-modules/no-named-exports": "error",
},
},
];
export default eslintConfig;
```
To allow named exports in [Storybook](https://storybook.js.org) story modules that have a [Component Story Format (CSF)](https://github.com/ComponentDriven/csf):
```js
// @ts-check
import eslintPluginOptimalModules from "eslint-plugin-optimal-modules";
/**
* ESLint config.
* @satisfies {Array}
*/
const eslintConfig = [
eslintPluginOptimalModules.configs.recommended,
{
files: ["**/*.stories.{mjs,cjs,js,mts,cts,ts,tsx}"],
rules: {
"optimal-modules/no-named-exports": "off",
},
},
];
export default eslintConfig;
```
## Rules
### Rule `no-named-exports`
Prohibits using named exports for [optimal module design](https://jaydenseric.com/blog/optimal-javascript-module-design).
**Valid** examples:
```js
// No exports.
const a = true;
```
```js
// Default export.
export default true;
```
```js
// Default export.
const a = true;
export { a as default };
```
```ts
// TypeScript type default export.
type A = boolean;
export type { A as default };
```
**Invalid** examples:
```js
// Named export.
export const a = true;
```
```js
// Named export.
const a = true;
export { a };
```
```ts
// TypeScript type named export.
export type A = boolean;
```
To fix the above errors, move the thing being exported to its own module as a default export.
## Configs
### Config `recommended`
Enabled rules:
- [`no-named-exports`](#rule-no-named-exports) (error).
## Requirements
Supported runtime environments:
- [Node.js](https://nodejs.org) versions `^18.18.0 || ^20.9.0 || >=21.1.0`.
Projects must configure [TypeScript](https://typescriptlang.org) to use types from the CommonJS modules that have a `// @ts-check` comment:
- [`compilerOptions.allowJs`](https://typescriptlang.org/tsconfig#allowJs) should be `true`.
- [`compilerOptions.maxNodeModuleJsDepth`](https://typescriptlang.org/tsconfig#maxNodeModuleJsDepth) should be reasonably large, e.g. `10`.
- [`compilerOptions.module`](https://typescriptlang.org/tsconfig#module) should be `"node16"` or `"nodenext"`.
## Exports
These CommonJS modules are exported via the [`package.json`](./package.json) field [`exports`](https://nodejs.org/api/packages.html#exports):
- [`eslintPluginOptimalModules.js`](./eslintPluginOptimalModules.js)