Skip to content

Commit 5fa7c2c

Browse files
feat: add support for flat configs (#789)
* feat: add support for flat configs * ci: fix release replacements * chore(release): 6.2.0-next.1 [skip ci] # [6.2.0-next.1](v6.1.1...v6.2.0-next.1) (2024-03-13) ### Features * add support for flat configs ([901d52a](901d52a)) * fix: build types * fix: improve types * chore(release): 6.2.0-next.2 [skip ci] # [6.2.0-next.2](v6.2.0-next.1...v6.2.0-next.2) (2024-03-14) ### Bug Fixes * build types ([054a862](054a862)) * improve types ([2340489](2340489)) * feat: move flat configs to new "flat" subpackage * ci: fix release * chore(release): 6.2.0-next.3 [skip ci] # [6.2.0-next.3](v6.2.0-next.2...v6.2.0-next.3) (2024-03-14) ### Features * move flat configs to new "flat" subpackage ([1d3533f](1d3533f)) --------- Co-authored-by: semantic-release-bot <[email protected]>
1 parent 5fc52d1 commit 5fa7c2c

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+821
-545
lines changed

.eslintrc.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@
119119
"@typescript-eslint/no-unused-vars": "off",
120120
"@typescript-eslint/prefer-function-type": "off",
121121
"@typescript-eslint/consistent-generic-constructors": "off",
122+
"import/extensions": "off",
122123
"import/no-unresolved": "off",
123124
"init-declarations": "off",
124125
"jsdoc/require-jsdoc": "off",

.releaserc.yml

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,11 +51,35 @@ plugins:
5151
from: "\\$\\{__VERSION__\\}"
5252
to: "${nextRelease.version}"
5353
results:
54-
- file: "./lib/index.js"
54+
- file: "./lib/classic.cjs"
5555
hasChanged: true
5656
numMatches: 1
5757
numReplacements: 1
58-
- file: "./lib/index.mjs"
58+
- file: "./lib/classic.d.cts"
59+
hasChanged: false
60+
numMatches: 0
61+
numReplacements: 0
62+
- file: "./lib/classic.d.mts"
63+
hasChanged: false
64+
numMatches: 0
65+
numReplacements: 0
66+
- file: "./lib/classic.mjs"
67+
hasChanged: true
68+
numMatches: 1
69+
numReplacements: 1
70+
- file: "./lib/flat.cjs"
71+
hasChanged: true
72+
numMatches: 1
73+
numReplacements: 1
74+
- file: "./lib/flat.d.cts"
75+
hasChanged: false
76+
numMatches: 0
77+
numReplacements: 0
78+
- file: "./lib/flat.d.mts"
79+
hasChanged: false
80+
numMatches: 0
81+
numReplacements: 0
82+
- file: "./lib/flat.mjs"
5983
hasChanged: true
6084
numMatches: 1
6185
numReplacements: 1

CHANGELOG.md

Lines changed: 22 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

GETTING_STARTED.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,17 @@ pnpm add -D eslint @typescript-eslint/parser eslint-plugin-functional
3030

3131
## Usage
3232

33+
### Flat Config
34+
35+
If using the new [flat config](https://eslint.org/docs/latest/use/configure/configuration-files-new),
36+
import from `eslint-plugin-functional/flat`.
37+
38+
```ts
39+
import functional from "eslint-plugin-functional/flat";
40+
```
41+
42+
### Classic Config
43+
3344
Add `functional` to the plugins section of your `.eslintrc` configuration file. Then configure the rules you want to use under the rules section.
3445

3546
```jsonc

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ Tidelift is working with the maintainers of `eslint-plugin-functional` and a gro
3333

3434
## Rulesets
3535

36-
The following rulesets are made available by this plugin:
36+
The following rulesets are made available by this plugin.
3737

3838
Presets:
3939

eslint-doc-generator.config.ts

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,25 @@ import { format } from "prettier";
33

44
export default {
55
configEmoji: [["lite", "☑️"]],
6-
ignoreConfig: ["all", "off", "disable-type-checked"],
6+
ignoreConfig: [
7+
"all",
8+
"off",
9+
"disable-type-checked",
10+
"flat/all",
11+
"flat/currying",
12+
"flat/disable-type-checked",
13+
"flat/external-typescript-recommended",
14+
"flat/external-vanilla-recommended",
15+
"flat/lite",
16+
"flat/no-exceptions",
17+
"flat/no-mutations",
18+
"flat/no-other-paradigms",
19+
"flat/no-statements",
20+
"flat/off",
21+
"flat/recommended",
22+
"flat/strict",
23+
"flat/stylistic",
24+
],
725
ruleDocSectionInclude: ["Rule Details"],
826
ruleListSplit: "meta.docs.category",
927
postprocess: (doc) => format(doc, { parser: "markdown" }),

knip.jsonc

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
{
22
"$schema": "node_modules/knip/schema-jsonc.json",
3-
"entry": ["src/index.ts!", "tests/**/*.test.ts", "cz-adapter/index.js"],
3+
"entry": [
4+
"src/flat.ts!",
5+
"src/classic.ts!",
6+
"tests/**/*.test.ts",
7+
"cz-adapter/index.js",
8+
],
49
"project": ["src/**/*.ts!", "tests/**/*.ts", "cz-adapter/**/*.{js,ts}"],
510
"ignore": ["tests/fixture/file.ts"],
611
"ignoreDependencies": ["@types/eslint", "@vitest/coverage-istanbul"],

package.json

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,25 @@
3434
"Jonas Kello"
3535
],
3636
"exports": {
37-
"import": "./lib/index.mjs",
38-
"require": "./lib/index.cjs"
37+
".": {
38+
"types": {
39+
"import": "./lib/classic.d.mts",
40+
"require": "./lib/classic.d.cts"
41+
},
42+
"import": "./lib/classic.mjs",
43+
"require": "./lib/classic.cjs"
44+
},
45+
"./flat": {
46+
"types": {
47+
"import": "./lib/flat.d.mts",
48+
"require": "./lib/flat.d.cts"
49+
},
50+
"import": "./lib/flat.mjs",
51+
"require": "./lib/flat.cjs"
52+
}
3953
},
40-
"main": "lib/index.cjs",
54+
"main": "lib/classic.cjs",
55+
"types": "lib/classic.d.cts",
4156
"files": [
4257
"lib/",
4358
"package.json",

rollup.config.ts

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,17 @@ const treeshake = {
1212
unknownGlobalSideEffects: false,
1313
} satisfies RollupOptions["treeshake"];
1414

15-
const library = {
16-
input: "src/index.ts",
15+
const classic = {
16+
input: "src/classic.ts",
1717

1818
output: [
1919
{
20-
file: pkg.exports.import,
20+
file: pkg.exports["."].import,
2121
format: "esm",
2222
sourcemap: false,
2323
},
2424
{
25-
file: pkg.exports.require,
25+
file: pkg.exports["."].require,
2626
format: "cjs",
2727
sourcemap: false,
2828
},
@@ -42,4 +42,34 @@ const library = {
4242
treeshake,
4343
} satisfies RollupOptions;
4444

45-
export default [library];
45+
const flat = {
46+
input: "src/flat.ts",
47+
48+
output: [
49+
{
50+
file: pkg.exports["./flat"].import,
51+
format: "esm",
52+
sourcemap: false,
53+
},
54+
{
55+
file: pkg.exports["./flat"].require,
56+
format: "cjs",
57+
sourcemap: false,
58+
},
59+
],
60+
61+
plugins: [
62+
rollupPluginAutoExternal(),
63+
rollupPluginTs({
64+
transpileOnly: true,
65+
tsconfig: "tsconfig.build.json",
66+
}),
67+
rollupPluginDeassert({
68+
include: ["**/*.{js,ts}"],
69+
}),
70+
],
71+
72+
treeshake,
73+
} satisfies RollupOptions;
74+
75+
export default [classic, flat];

src/index.ts renamed to src/classic.ts

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -15,25 +15,33 @@ import recommended from "#eslint-plugin-functional/configs/recommended";
1515
import strict from "#eslint-plugin-functional/configs/strict";
1616
import stylistic from "#eslint-plugin-functional/configs/stylistic";
1717
import { rules } from "#eslint-plugin-functional/rules";
18+
import { ruleNameScope } from "#eslint-plugin-functional/utils/misc";
1819

19-
const config: Linter.Plugin = {
20+
export default {
2021
rules,
2122
configs: {
22-
all,
23-
lite,
24-
recommended,
25-
strict,
26-
off,
27-
"disable-type-checked": disableTypeChecked,
28-
"external-vanilla-recommended": externalVanillaRecommended,
29-
"external-typescript-recommended": externalTypeScriptRecommended,
30-
currying,
31-
"no-exceptions": noExceptions,
32-
"no-mutations": noMutations,
33-
"no-other-paradigms": noOtherParadigms,
34-
"no-statements": noStatements,
35-
stylistic,
23+
all: { plugins: [ruleNameScope], rules: all },
24+
lite: { plugins: [ruleNameScope], rules: lite },
25+
recommended: { plugins: [ruleNameScope], rules: recommended },
26+
strict: { plugins: [ruleNameScope], rules: strict },
27+
off: { plugins: [ruleNameScope], rules: off },
28+
"disable-type-checked": {
29+
plugins: [ruleNameScope],
30+
rules: disableTypeChecked,
31+
},
32+
"external-vanilla-recommended": {
33+
plugins: [ruleNameScope],
34+
rules: externalVanillaRecommended,
35+
},
36+
"external-typescript-recommended": {
37+
plugins: [ruleNameScope],
38+
rules: externalTypeScriptRecommended,
39+
},
40+
currying: { plugins: [ruleNameScope], rules: currying },
41+
"no-exceptions": { plugins: [ruleNameScope], rules: noExceptions },
42+
"no-mutations": { plugins: [ruleNameScope], rules: noMutations },
43+
"no-other-paradigms": { plugins: [ruleNameScope], rules: noOtherParadigms },
44+
"no-statements": { plugins: [ruleNameScope], rules: noStatements },
45+
stylistic: { plugins: [ruleNameScope], rules: stylistic },
3646
},
37-
};
38-
39-
export default config;
47+
} as Linter.Plugin;

src/configs/all.ts

Lines changed: 13 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,15 @@
1-
import { type Linter } from "@typescript-eslint/utils/ts-eslint";
1+
import { type FlatConfig } from "@typescript-eslint/utils/ts-eslint";
22

3-
import * as functionalParameters from "#eslint-plugin-functional/rules/functional-parameters";
4-
import * as immutableData from "#eslint-plugin-functional/rules/immutable-data";
5-
import * as noClasses from "#eslint-plugin-functional/rules/no-classes";
6-
import * as noConditionalStatements from "#eslint-plugin-functional/rules/no-conditional-statements";
7-
import * as noExpressionStatements from "#eslint-plugin-functional/rules/no-expression-statements";
8-
import * as noLet from "#eslint-plugin-functional/rules/no-let";
9-
import * as noLoopStatements from "#eslint-plugin-functional/rules/no-loop-statements";
10-
import * as noMixedTypes from "#eslint-plugin-functional/rules/no-mixed-types";
11-
import * as noPromiseReject from "#eslint-plugin-functional/rules/no-promise-reject";
12-
import * as noReturnVoid from "#eslint-plugin-functional/rules/no-return-void";
13-
import * as noThisExpressions from "#eslint-plugin-functional/rules/no-this-expressions";
14-
import * as noThrowStatements from "#eslint-plugin-functional/rules/no-throw-statements";
15-
import * as noTryStatements from "#eslint-plugin-functional/rules/no-try-statements";
16-
import * as preferImmutableTypes from "#eslint-plugin-functional/rules/prefer-immutable-types";
17-
import * as preferPropertySignatures from "#eslint-plugin-functional/rules/prefer-property-signatures";
18-
import * as preferTacit from "#eslint-plugin-functional/rules/prefer-tacit";
19-
import * as readonlyType from "#eslint-plugin-functional/rules/readonly-type";
20-
import * as typeDeclarationImmutability from "#eslint-plugin-functional/rules/type-declaration-immutability";
3+
import { rules } from "#eslint-plugin-functional/rules";
4+
import { ruleNameScope } from "#eslint-plugin-functional/utils/misc";
215

22-
const config: Linter.Config = {
23-
rules: {
24-
[`functional/${functionalParameters.name}`]: "error",
25-
[`functional/${immutableData.name}`]: "error",
26-
[`functional/${noClasses.name}`]: "error",
27-
[`functional/${noConditionalStatements.name}`]: "error",
28-
[`functional/${noExpressionStatements.name}`]: "error",
29-
[`functional/${noLet.name}`]: "error",
30-
[`functional/${noLoopStatements.name}`]: "error",
31-
[`functional/${noMixedTypes.name}`]: "error",
32-
[`functional/${noPromiseReject.name}`]: "error",
33-
[`functional/${noReturnVoid.name}`]: "error",
34-
[`functional/${noThisExpressions.name}`]: "error",
35-
[`functional/${noThrowStatements.name}`]: "error",
36-
[`functional/${noTryStatements.name}`]: "error",
37-
[`functional/${preferImmutableTypes.name}`]: "error",
38-
[`functional/${preferPropertySignatures.name}`]: "error",
39-
[`functional/${preferTacit.name}`]: "warn",
40-
[`functional/${readonlyType.name}`]: "error",
41-
[`functional/${typeDeclarationImmutability.name}`]: "error",
42-
},
43-
};
44-
45-
export default config;
6+
export default {
7+
...Object.fromEntries(
8+
Object.entries(rules)
9+
.filter(([, rule]) => rule.meta.deprecated !== true)
10+
.map(([name, rule]) => [
11+
`${ruleNameScope}/${name}`,
12+
rule.meta.docs.recommendedSeverity,
13+
]),
14+
),
15+
} satisfies FlatConfig.Config["rules"];

src/configs/currying.ts

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,18 @@
1-
import { type Linter } from "@typescript-eslint/utils/ts-eslint";
1+
import { type FlatConfig } from "@typescript-eslint/utils/ts-eslint";
22

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

5-
const config: Linter.Config = {
6-
rules: {
7-
[`functional/${functionalParameters.name}`]: "error",
8-
},
9-
};
10-
11-
export default config;
6+
export default Object.fromEntries(
7+
Object.entries(rules)
8+
.filter(
9+
([, rule]) =>
10+
rule.meta.deprecated !== true &&
11+
rule.meta.docs.category === "Currying" &&
12+
rule.meta.docs.recommended !== false,
13+
)
14+
.map(([name, rule]) => [
15+
`${ruleNameScope}/${name}`,
16+
rule.meta.docs.recommendedSeverity,
17+
]),
18+
) satisfies FlatConfig.Config["rules"];

src/configs/deprecated.ts

Lines changed: 0 additions & 11 deletions
This file was deleted.

0 commit comments

Comments
 (0)