Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add support for flat configs #789

Merged
merged 12 commits into from
Mar 20, 2024
1 change: 1 addition & 0 deletions .eslintrc.json
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,7 @@
"@typescript-eslint/no-unused-vars": "off",
"@typescript-eslint/prefer-function-type": "off",
"@typescript-eslint/consistent-generic-constructors": "off",
"import/extensions": "off",
"import/no-unresolved": "off",
"init-declarations": "off",
"jsdoc/require-jsdoc": "off",
Expand Down
28 changes: 26 additions & 2 deletions .releaserc.yml
Original file line number Diff line number Diff line change
Expand Up @@ -51,11 +51,35 @@ plugins:
from: "\\$\\{__VERSION__\\}"
to: "${nextRelease.version}"
results:
- file: "./lib/index.js"
- file: "./lib/classic.cjs"
hasChanged: true
numMatches: 1
numReplacements: 1
- file: "./lib/index.mjs"
- file: "./lib/classic.d.cts"
hasChanged: false
numMatches: 0
numReplacements: 0
- file: "./lib/classic.d.mts"
hasChanged: false
numMatches: 0
numReplacements: 0
- file: "./lib/classic.mjs"
hasChanged: true
numMatches: 1
numReplacements: 1
- file: "./lib/flat.cjs"
hasChanged: true
numMatches: 1
numReplacements: 1
- file: "./lib/flat.d.cts"
hasChanged: false
numMatches: 0
numReplacements: 0
- file: "./lib/flat.d.mts"
hasChanged: false
numMatches: 0
numReplacements: 0
- file: "./lib/flat.mjs"
hasChanged: true
numMatches: 1
numReplacements: 1
Expand Down
22 changes: 22 additions & 0 deletions CHANGELOG.md

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 11 additions & 0 deletions GETTING_STARTED.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,17 @@ pnpm add -D eslint @typescript-eslint/parser eslint-plugin-functional

## Usage

### Flat Config

If using the new [flat config](https://eslint.org/docs/latest/use/configure/configuration-files-new),
import from `eslint-plugin-functional/flat`.

```ts
import functional from "eslint-plugin-functional/flat";
```

### Classic Config

Add `functional` to the plugins section of your `.eslintrc` configuration file. Then configure the rules you want to use under the rules section.

```jsonc
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ Tidelift is working with the maintainers of `eslint-plugin-functional` and a gro

## Rulesets

The following rulesets are made available by this plugin:
The following rulesets are made available by this plugin.

Presets:

Expand Down
20 changes: 19 additions & 1 deletion eslint-doc-generator.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,25 @@ import { format } from "prettier";

export default {
configEmoji: [["lite", "☑️"]],
ignoreConfig: ["all", "off", "disable-type-checked"],
ignoreConfig: [
"all",
"off",
"disable-type-checked",
"flat/all",
"flat/currying",
"flat/disable-type-checked",
"flat/external-typescript-recommended",
"flat/external-vanilla-recommended",
"flat/lite",
"flat/no-exceptions",
"flat/no-mutations",
"flat/no-other-paradigms",
"flat/no-statements",
"flat/off",
"flat/recommended",
"flat/strict",
"flat/stylistic",
],
ruleDocSectionInclude: ["Rule Details"],
ruleListSplit: "meta.docs.category",
postprocess: (doc) => format(doc, { parser: "markdown" }),
Expand Down
7 changes: 6 additions & 1 deletion knip.jsonc
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
{
"$schema": "node_modules/knip/schema-jsonc.json",
"entry": ["src/index.ts!", "tests/**/*.test.ts", "cz-adapter/index.js"],
"entry": [
"src/flat.ts!",
"src/classic.ts!",
"tests/**/*.test.ts",
"cz-adapter/index.js",
],
"project": ["src/**/*.ts!", "tests/**/*.ts", "cz-adapter/**/*.{js,ts}"],
"ignore": ["tests/fixture/file.ts"],
"ignoreDependencies": ["@types/eslint", "@vitest/coverage-istanbul"],
Expand Down
21 changes: 18 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,25 @@
"Jonas Kello"
],
"exports": {
"import": "./lib/index.mjs",
"require": "./lib/index.cjs"
".": {
"types": {
"import": "./lib/classic.d.mts",
"require": "./lib/classic.d.cts"
},
"import": "./lib/classic.mjs",
"require": "./lib/classic.cjs"
},
"./flat": {
"types": {
"import": "./lib/flat.d.mts",
"require": "./lib/flat.d.cts"
},
"import": "./lib/flat.mjs",
"require": "./lib/flat.cjs"
}
},
"main": "lib/index.cjs",
"main": "lib/classic.cjs",
"types": "lib/classic.d.cts",
"files": [
"lib/",
"package.json",
Expand Down
40 changes: 35 additions & 5 deletions rollup.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,17 +12,17 @@ const treeshake = {
unknownGlobalSideEffects: false,
} satisfies RollupOptions["treeshake"];

const library = {
input: "src/index.ts",
const classic = {
input: "src/classic.ts",

output: [
{
file: pkg.exports.import,
file: pkg.exports["."].import,
format: "esm",
sourcemap: false,
},
{
file: pkg.exports.require,
file: pkg.exports["."].require,
format: "cjs",
sourcemap: false,
},
Expand All @@ -42,4 +42,34 @@ const library = {
treeshake,
} satisfies RollupOptions;

export default [library];
const flat = {
input: "src/flat.ts",

output: [
{
file: pkg.exports["./flat"].import,
format: "esm",
sourcemap: false,
},
{
file: pkg.exports["./flat"].require,
format: "cjs",
sourcemap: false,
},
],

plugins: [
rollupPluginAutoExternal(),
rollupPluginTs({
transpileOnly: true,
tsconfig: "tsconfig.build.json",
}),
rollupPluginDeassert({
include: ["**/*.{js,ts}"],
}),
],

treeshake,
} satisfies RollupOptions;

export default [classic, flat];
44 changes: 26 additions & 18 deletions src/index.ts → src/classic.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,25 +15,33 @@ import recommended from "#eslint-plugin-functional/configs/recommended";
import strict from "#eslint-plugin-functional/configs/strict";
import stylistic from "#eslint-plugin-functional/configs/stylistic";
import { rules } from "#eslint-plugin-functional/rules";
import { ruleNameScope } from "#eslint-plugin-functional/utils/misc";

const config: Linter.Plugin = {
export default {
rules,
configs: {
all,
lite,
recommended,
strict,
off,
"disable-type-checked": disableTypeChecked,
"external-vanilla-recommended": externalVanillaRecommended,
"external-typescript-recommended": externalTypeScriptRecommended,
currying,
"no-exceptions": noExceptions,
"no-mutations": noMutations,
"no-other-paradigms": noOtherParadigms,
"no-statements": noStatements,
stylistic,
all: { plugins: [ruleNameScope], rules: all },
lite: { plugins: [ruleNameScope], rules: lite },
recommended: { plugins: [ruleNameScope], rules: recommended },
strict: { plugins: [ruleNameScope], rules: strict },
off: { plugins: [ruleNameScope], rules: off },
"disable-type-checked": {
plugins: [ruleNameScope],
rules: disableTypeChecked,
},
"external-vanilla-recommended": {
plugins: [ruleNameScope],
rules: externalVanillaRecommended,
},
"external-typescript-recommended": {
plugins: [ruleNameScope],
rules: externalTypeScriptRecommended,
},
currying: { plugins: [ruleNameScope], rules: currying },
"no-exceptions": { plugins: [ruleNameScope], rules: noExceptions },
"no-mutations": { plugins: [ruleNameScope], rules: noMutations },
"no-other-paradigms": { plugins: [ruleNameScope], rules: noOtherParadigms },
"no-statements": { plugins: [ruleNameScope], rules: noStatements },
stylistic: { plugins: [ruleNameScope], rules: stylistic },
},
};

export default config;
} as Linter.Plugin;
56 changes: 13 additions & 43 deletions src/configs/all.ts
Original file line number Diff line number Diff line change
@@ -1,45 +1,15 @@
import { type Linter } from "@typescript-eslint/utils/ts-eslint";
import { type FlatConfig } from "@typescript-eslint/utils/ts-eslint";

import * as functionalParameters from "#eslint-plugin-functional/rules/functional-parameters";
import * as immutableData from "#eslint-plugin-functional/rules/immutable-data";
import * as noClasses from "#eslint-plugin-functional/rules/no-classes";
import * as noConditionalStatements from "#eslint-plugin-functional/rules/no-conditional-statements";
import * as noExpressionStatements from "#eslint-plugin-functional/rules/no-expression-statements";
import * as noLet from "#eslint-plugin-functional/rules/no-let";
import * as noLoopStatements from "#eslint-plugin-functional/rules/no-loop-statements";
import * as noMixedTypes from "#eslint-plugin-functional/rules/no-mixed-types";
import * as noPromiseReject from "#eslint-plugin-functional/rules/no-promise-reject";
import * as noReturnVoid from "#eslint-plugin-functional/rules/no-return-void";
import * as noThisExpressions from "#eslint-plugin-functional/rules/no-this-expressions";
import * as noThrowStatements from "#eslint-plugin-functional/rules/no-throw-statements";
import * as noTryStatements from "#eslint-plugin-functional/rules/no-try-statements";
import * as preferImmutableTypes from "#eslint-plugin-functional/rules/prefer-immutable-types";
import * as preferPropertySignatures from "#eslint-plugin-functional/rules/prefer-property-signatures";
import * as preferTacit from "#eslint-plugin-functional/rules/prefer-tacit";
import * as readonlyType from "#eslint-plugin-functional/rules/readonly-type";
import * as typeDeclarationImmutability from "#eslint-plugin-functional/rules/type-declaration-immutability";
import { rules } from "#eslint-plugin-functional/rules";
import { ruleNameScope } from "#eslint-plugin-functional/utils/misc";

const config: Linter.Config = {
rules: {
[`functional/${functionalParameters.name}`]: "error",
[`functional/${immutableData.name}`]: "error",
[`functional/${noClasses.name}`]: "error",
[`functional/${noConditionalStatements.name}`]: "error",
[`functional/${noExpressionStatements.name}`]: "error",
[`functional/${noLet.name}`]: "error",
[`functional/${noLoopStatements.name}`]: "error",
[`functional/${noMixedTypes.name}`]: "error",
[`functional/${noPromiseReject.name}`]: "error",
[`functional/${noReturnVoid.name}`]: "error",
[`functional/${noThisExpressions.name}`]: "error",
[`functional/${noThrowStatements.name}`]: "error",
[`functional/${noTryStatements.name}`]: "error",
[`functional/${preferImmutableTypes.name}`]: "error",
[`functional/${preferPropertySignatures.name}`]: "error",
[`functional/${preferTacit.name}`]: "warn",
[`functional/${readonlyType.name}`]: "error",
[`functional/${typeDeclarationImmutability.name}`]: "error",
},
};

export default config;
export default {
...Object.fromEntries(
Object.entries(rules)
.filter(([, rule]) => rule.meta.deprecated !== true)
.map(([name, rule]) => [
`${ruleNameScope}/${name}`,
rule.meta.docs.recommendedSeverity,
]),
),
} satisfies FlatConfig.Config["rules"];
25 changes: 16 additions & 9 deletions src/configs/currying.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,18 @@
import { type Linter } from "@typescript-eslint/utils/ts-eslint";
import { type FlatConfig } from "@typescript-eslint/utils/ts-eslint";

import * as functionalParameters from "#eslint-plugin-functional/rules/functional-parameters";
import { rules } from "#eslint-plugin-functional/rules";
import { ruleNameScope } from "#eslint-plugin-functional/utils/misc";

const config: Linter.Config = {
rules: {
[`functional/${functionalParameters.name}`]: "error",
},
};

export default config;
export default Object.fromEntries(
Object.entries(rules)
.filter(
([, rule]) =>
rule.meta.deprecated !== true &&
rule.meta.docs.category === "Currying" &&
rule.meta.docs.recommended !== false,
)
.map(([name, rule]) => [
`${ruleNameScope}/${name}`,
rule.meta.docs.recommendedSeverity,
]),
) satisfies FlatConfig.Config["rules"];
11 changes: 0 additions & 11 deletions src/configs/deprecated.ts

This file was deleted.

Loading
Loading