@stride.it/appoint-lint-governance 0.1.31 → 0.1.32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +76 -3
- package/dist/index.d.ts +31 -15
- package/dist/index.js +228 -123
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -5,9 +5,14 @@
|
|
|
5
5
|
[](https://www.typescriptlang.org/)
|
|
6
6
|
[](https://eslint.org/)
|
|
7
7
|
|
|
8
|
-
Shareable ESLint v9 flat-config builders to normalize
|
|
8
|
+
Shareable ESLint v9 flat-config builders to normalize linting across repositories.
|
|
9
9
|
|
|
10
|
-
This package
|
|
10
|
+
This package provides two domains:
|
|
11
|
+
|
|
12
|
+
- **TypeScript domain**: framework-agnostic TypeScript quality gates (correctness, imports hygiene, security, maintainability, and optional type-aware checks).
|
|
13
|
+
- **Framework domain**: React + Next.js + Accessibility (a11y) presets.
|
|
14
|
+
|
|
15
|
+
Everything is designed to be composed in consumer repos (flat config is order-dependent); this is not an all-or-nothing mega-config.
|
|
11
16
|
|
|
12
17
|
## What you get
|
|
13
18
|
|
|
@@ -19,7 +24,7 @@ This package focuses on framework-agnostic TypeScript quality gates (correctness
|
|
|
19
24
|
|
|
20
25
|
Non-goals:
|
|
21
26
|
|
|
22
|
-
- No
|
|
27
|
+
- No test-runner targeting (Vitest/Jest/Playwright rules are out of scope for now).
|
|
23
28
|
- No formatting (Prettier remains the formatter; ESLint formatting conflicts are disabled via the interop preset).
|
|
24
29
|
|
|
25
30
|
## Install
|
|
@@ -61,6 +66,12 @@ These builders return arrays you spread into your `eslint.config.*`:
|
|
|
61
66
|
- `typescriptPrettierInterop(options?)`\
|
|
62
67
|
Disables formatting-rule conflicts when the consumer repo uses Prettier.
|
|
63
68
|
|
|
69
|
+
Framework domain builders/presets:
|
|
70
|
+
|
|
71
|
+
- `react(options?)`, `reactRecommended`
|
|
72
|
+
- `a11y(options?)`, `a11yRecommended`
|
|
73
|
+
- `nextjs(options?)`, `nextjsRecommended` (composes React + A11y + Next rules)
|
|
74
|
+
|
|
64
75
|
Additionally:
|
|
65
76
|
|
|
66
77
|
- `plugin`\
|
|
@@ -100,6 +111,68 @@ const tsconfigRootDir = fileURLToPath(new URL(".", import.meta.url));
|
|
|
100
111
|
|
|
101
112
|
Then pass `tsconfigRootDir` into `typescriptRecommended({ ... })`.
|
|
102
113
|
|
|
114
|
+
## Framework domain examples (React / A11y / Next.js)
|
|
115
|
+
|
|
116
|
+
### A) Domain linting (simple): Next.js preset
|
|
117
|
+
|
|
118
|
+
Use this when you want “framework linting” as a single preset. This includes **React + A11y + Next.js** rules.
|
|
119
|
+
|
|
120
|
+
```js
|
|
121
|
+
import { nextjsRecommended, typescriptRecommended } from "@stride.it/appoint-lint-governance";
|
|
122
|
+
|
|
123
|
+
export default [
|
|
124
|
+
...typescriptRecommended({
|
|
125
|
+
typeChecked: true,
|
|
126
|
+
tsconfigPath: "./tsconfig.json",
|
|
127
|
+
tsconfigRootDir: import.meta.dirname,
|
|
128
|
+
}),
|
|
129
|
+
...nextjsRecommended,
|
|
130
|
+
];
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### B) Domain linting (explicit): one line per domain
|
|
134
|
+
|
|
135
|
+
Use this when you want React / A11y / Next.js as separate “domain lines”.
|
|
136
|
+
|
|
137
|
+
Important: do **not** use `nextjsRecommended` together with `reactRecommended` and `a11yRecommended` (it would duplicate rules).
|
|
138
|
+
|
|
139
|
+
```js
|
|
140
|
+
import {
|
|
141
|
+
a11yRecommended,
|
|
142
|
+
nextjs,
|
|
143
|
+
reactRecommended,
|
|
144
|
+
typescriptRecommended,
|
|
145
|
+
} from "@stride.it/appoint-lint-governance";
|
|
146
|
+
|
|
147
|
+
export default [
|
|
148
|
+
...typescriptRecommended({
|
|
149
|
+
typeChecked: true,
|
|
150
|
+
tsconfigPath: "./tsconfig.json",
|
|
151
|
+
tsconfigRootDir: import.meta.dirname,
|
|
152
|
+
}),
|
|
153
|
+
...reactRecommended,
|
|
154
|
+
...a11yRecommended,
|
|
155
|
+
...nextjs(),
|
|
156
|
+
];
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### C) Running domains independently (separate configs)
|
|
160
|
+
|
|
161
|
+
Flat config is a single array, but you can run “per-domain” by creating multiple config files and selecting them with `eslint --config`.
|
|
162
|
+
|
|
163
|
+
Example scripts:
|
|
164
|
+
|
|
165
|
+
```json
|
|
166
|
+
{
|
|
167
|
+
"scripts": {
|
|
168
|
+
"lint:ts": "eslint --config ./eslint.typescript-only.config.mjs \"src/**/*.{ts,tsx}\"",
|
|
169
|
+
"lint:react": "eslint --config ./eslint.react-only.config.mjs \"src/**/*.{tsx,jsx}\"",
|
|
170
|
+
"lint:a11y": "eslint --config ./eslint.a11y-only.config.mjs \"src/**/*.{tsx,jsx}\"",
|
|
171
|
+
"lint:next": "eslint --config ./eslint.nextjs-only.config.mjs \"src/**/*.{tsx,jsx}\""
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
```
|
|
175
|
+
|
|
103
176
|
## Prettier interop (optional)
|
|
104
177
|
|
|
105
178
|
If your project uses Prettier, include the interop preset last so it can override earlier formatting rules:
|
package/dist/index.d.ts
CHANGED
|
@@ -41,13 +41,29 @@ declare const a11yRecommended: eslint.Linter.Config<RulesConfig>[];
|
|
|
41
41
|
|
|
42
42
|
type NextjsOptions = {
|
|
43
43
|
files?: string[];
|
|
44
|
+
coreWebVitals?: boolean;
|
|
45
|
+
rootDir?: string | string[];
|
|
44
46
|
};
|
|
45
47
|
declare function nextjs(options?: NextjsOptions): Linter.Config[];
|
|
46
48
|
|
|
49
|
+
type ImportZone = {
|
|
50
|
+
target: string | string[];
|
|
51
|
+
from: string | string[];
|
|
52
|
+
except?: string[];
|
|
53
|
+
message: string;
|
|
54
|
+
};
|
|
55
|
+
type NextjsBoundariesOptions = {
|
|
56
|
+
files?: string[];
|
|
57
|
+
basePath: string;
|
|
58
|
+
zones: ImportZone[];
|
|
59
|
+
};
|
|
60
|
+
declare function nextjsImportBoundaries(options: NextjsBoundariesOptions): Linter.Config[];
|
|
61
|
+
|
|
47
62
|
declare const nextjsRecommended: eslint.Linter.Config<RulesConfig>[];
|
|
48
63
|
|
|
49
64
|
type ReactOptions = {
|
|
50
65
|
files?: string[];
|
|
66
|
+
compilerRules?: boolean;
|
|
51
67
|
};
|
|
52
68
|
declare function react(options?: ReactOptions): Linter.Config[];
|
|
53
69
|
|
|
@@ -63,6 +79,20 @@ type TypescriptConventionsOptions = {
|
|
|
63
79
|
};
|
|
64
80
|
declare function typescriptConventions(options?: TypescriptConventionsOptions): Linter.Config[];
|
|
65
81
|
|
|
82
|
+
type TypescriptPrettierOptions = {
|
|
83
|
+
files?: string[];
|
|
84
|
+
};
|
|
85
|
+
declare function typescriptPrettierInterop(options?: TypescriptPrettierOptions): Linter.Config[];
|
|
86
|
+
|
|
87
|
+
type TypescriptSecurityOptions = {
|
|
88
|
+
files?: string[];
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
type TypescriptSizeComplexityOptions = {
|
|
92
|
+
files?: string[];
|
|
93
|
+
};
|
|
94
|
+
declare function typescriptSizeComplexity(options?: TypescriptSizeComplexityOptions): Linter.Config[];
|
|
95
|
+
|
|
66
96
|
type TypescriptConfigFiles = string[];
|
|
67
97
|
type TypescriptMinimalOptions = {
|
|
68
98
|
files?: TypescriptConfigFiles;
|
|
@@ -77,11 +107,6 @@ type TypescriptMinimalOptions = {
|
|
|
77
107
|
*/
|
|
78
108
|
declare function typescriptMinimal(options?: TypescriptMinimalOptions): Linter.Config[];
|
|
79
109
|
|
|
80
|
-
type TypescriptPrettierOptions = {
|
|
81
|
-
files?: string[];
|
|
82
|
-
};
|
|
83
|
-
declare function typescriptPrettierInterop(options?: TypescriptPrettierOptions): Linter.Config[];
|
|
84
|
-
|
|
85
110
|
type TypescriptRecommendedOptions = {
|
|
86
111
|
/**
|
|
87
112
|
* When set, enables type-aware rules (more powerful, can be slower).
|
|
@@ -106,15 +131,6 @@ type TypescriptRecommendedOptions = {
|
|
|
106
131
|
};
|
|
107
132
|
declare function typescriptRecommended(options?: TypescriptRecommendedOptions): Linter.Config[];
|
|
108
133
|
|
|
109
|
-
type TypescriptSecurityOptions = {
|
|
110
|
-
files?: string[];
|
|
111
|
-
};
|
|
112
|
-
|
|
113
|
-
type TypescriptSizeComplexityOptions = {
|
|
114
|
-
files?: string[];
|
|
115
|
-
};
|
|
116
|
-
declare function typescriptSizeComplexity(options?: TypescriptSizeComplexityOptions): Linter.Config[];
|
|
117
|
-
|
|
118
134
|
/**
|
|
119
135
|
* Placeholder for future custom rules.
|
|
120
136
|
*
|
|
@@ -123,4 +139,4 @@ declare function typescriptSizeComplexity(options?: TypescriptSizeComplexityOpti
|
|
|
123
139
|
*/
|
|
124
140
|
declare const plugin: ESLint.Plugin;
|
|
125
141
|
|
|
126
|
-
export { type A11yOptions, type NextjsOptions, type ReactOptions, type TypescriptBaseOptions, type TypescriptConventionsOptions, type TypescriptMinimalOptions, type TypescriptPrettierOptions, type TypescriptRecommendedOptions, type TypescriptSecurityOptions, type TypescriptSizeComplexityOptions, a11y, a11yRecommended, nextjs, nextjsRecommended, plugin, react, reactRecommended, typescriptBase, typescriptConventions, typescriptMinimal, typescriptPrettierInterop, typescriptRecommended, typescriptSizeComplexity };
|
|
142
|
+
export { type A11yOptions, type ImportZone, type NextjsBoundariesOptions, type NextjsOptions, type ReactOptions, type TypescriptBaseOptions, type TypescriptConventionsOptions, type TypescriptMinimalOptions, type TypescriptPrettierOptions, type TypescriptRecommendedOptions, type TypescriptSecurityOptions, type TypescriptSizeComplexityOptions, a11y, a11yRecommended, nextjs, nextjsImportBoundaries, nextjsRecommended, plugin, react, reactRecommended, typescriptBase, typescriptConventions, typescriptMinimal, typescriptPrettierInterop, typescriptRecommended, typescriptSizeComplexity };
|
package/dist/index.js
CHANGED
|
@@ -13,6 +13,7 @@ var jsxA11yRules = {
|
|
|
13
13
|
"jsx-a11y/aria-unsupported-elements": "error",
|
|
14
14
|
"jsx-a11y/autocomplete-valid": "error",
|
|
15
15
|
"jsx-a11y/click-events-have-key-events": "error",
|
|
16
|
+
"jsx-a11y/control-has-associated-label": "error",
|
|
16
17
|
"jsx-a11y/heading-has-content": "error",
|
|
17
18
|
"jsx-a11y/html-has-lang": "error",
|
|
18
19
|
"jsx-a11y/iframe-has-title": "error",
|
|
@@ -24,10 +25,58 @@ var jsxA11yRules = {
|
|
|
24
25
|
"jsx-a11y/no-access-key": "error",
|
|
25
26
|
"jsx-a11y/no-autofocus": "error",
|
|
26
27
|
"jsx-a11y/no-distracting-elements": "error",
|
|
27
|
-
"jsx-a11y/no-interactive-element-to-noninteractive-role":
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
28
|
+
"jsx-a11y/no-interactive-element-to-noninteractive-role": [
|
|
29
|
+
"error",
|
|
30
|
+
{
|
|
31
|
+
tr: ["none", "presentation"]
|
|
32
|
+
}
|
|
33
|
+
],
|
|
34
|
+
"jsx-a11y/no-noninteractive-element-interactions": [
|
|
35
|
+
"error",
|
|
36
|
+
{
|
|
37
|
+
handlers: [
|
|
38
|
+
"onClick",
|
|
39
|
+
"onMouseDown",
|
|
40
|
+
"onMouseUp",
|
|
41
|
+
"onKeyPress",
|
|
42
|
+
"onKeyDown",
|
|
43
|
+
"onKeyUp"
|
|
44
|
+
]
|
|
45
|
+
}
|
|
46
|
+
],
|
|
47
|
+
"jsx-a11y/no-noninteractive-element-to-interactive-role": [
|
|
48
|
+
"error",
|
|
49
|
+
{
|
|
50
|
+
ul: [
|
|
51
|
+
"listbox",
|
|
52
|
+
"menu",
|
|
53
|
+
"menubar",
|
|
54
|
+
"radiogroup",
|
|
55
|
+
"tablist",
|
|
56
|
+
"tree",
|
|
57
|
+
"treegrid"
|
|
58
|
+
],
|
|
59
|
+
ol: [
|
|
60
|
+
"listbox",
|
|
61
|
+
"menu",
|
|
62
|
+
"menubar",
|
|
63
|
+
"radiogroup",
|
|
64
|
+
"tablist",
|
|
65
|
+
"tree",
|
|
66
|
+
"treegrid"
|
|
67
|
+
],
|
|
68
|
+
li: ["menuitem", "option", "row", "tab", "treeitem"],
|
|
69
|
+
table: ["grid"],
|
|
70
|
+
td: ["gridcell"]
|
|
71
|
+
}
|
|
72
|
+
],
|
|
73
|
+
"jsx-a11y/no-noninteractive-tabindex": [
|
|
74
|
+
"error",
|
|
75
|
+
{
|
|
76
|
+
tags: [],
|
|
77
|
+
roles: ["tabpanel"]
|
|
78
|
+
}
|
|
79
|
+
],
|
|
31
80
|
"jsx-a11y/no-redundant-roles": "error",
|
|
32
81
|
"jsx-a11y/no-static-element-interactions": "error",
|
|
33
82
|
"jsx-a11y/role-has-required-aria-props": "error",
|
|
@@ -38,7 +87,13 @@ var jsxA11yRules = {
|
|
|
38
87
|
|
|
39
88
|
// src/configs/framework/a11y/index.ts
|
|
40
89
|
function a11y(options = {}) {
|
|
41
|
-
const files = options.files ?? [
|
|
90
|
+
const files = options.files ?? [
|
|
91
|
+
"**/app/**/*.{jsx,tsx}",
|
|
92
|
+
"**/pages/**/*.{jsx,tsx}",
|
|
93
|
+
"**/components/**/*.{jsx,tsx}",
|
|
94
|
+
"**/ui/**/*.{jsx,tsx}",
|
|
95
|
+
"**/features/**/*.{jsx,tsx}"
|
|
96
|
+
];
|
|
42
97
|
return [
|
|
43
98
|
{
|
|
44
99
|
files,
|
|
@@ -55,45 +110,58 @@ function a11y(options = {}) {
|
|
|
55
110
|
// src/configs/framework/a11y/recommended.ts
|
|
56
111
|
var a11yRecommended = a11y();
|
|
57
112
|
|
|
58
|
-
// src/configs/framework/nextjs/
|
|
113
|
+
// src/configs/framework/nextjs/builders/core.ts
|
|
59
114
|
import nextPlugin from "@next/eslint-plugin-next";
|
|
60
|
-
|
|
61
|
-
// src/configs/framework/nextjs/definitions/core-next-r.ts
|
|
62
|
-
var nextCoreRules = {
|
|
63
|
-
"@next/next/google-font-display": "error",
|
|
64
|
-
"@next/next/google-font-preconnect": "error",
|
|
65
|
-
"@next/next/inline-script-id": "error",
|
|
66
|
-
"@next/next/next-script-for-ga": "error",
|
|
67
|
-
"@next/next/no-assign-module-variable": "error",
|
|
68
|
-
"@next/next/no-async-client-component": "warn",
|
|
69
|
-
"@next/next/no-before-interactive-script-outside-document": "error",
|
|
70
|
-
"@next/next/no-css-tags": "error",
|
|
71
|
-
"@next/next/no-document-import-in-page": "error",
|
|
72
|
-
"@next/next/no-duplicate-head": "error",
|
|
73
|
-
"@next/next/no-head-element": "error",
|
|
74
|
-
"@next/next/no-head-import-in-document": "error",
|
|
75
|
-
"@next/next/no-html-link-for-pages": "off",
|
|
76
|
-
"@next/next/no-img-element": "error",
|
|
77
|
-
"@next/next/no-page-custom-font": "error",
|
|
78
|
-
"@next/next/no-script-component-in-head": "error",
|
|
79
|
-
"@next/next/no-styled-jsx-in-document": "error",
|
|
80
|
-
"@next/next/no-sync-scripts": "error",
|
|
81
|
-
"@next/next/no-title-in-document-head": "error",
|
|
82
|
-
"@next/next/no-typos": "error",
|
|
83
|
-
"@next/next/no-unwanted-polyfillio": "error"
|
|
84
|
-
};
|
|
85
|
-
|
|
86
|
-
// src/configs/framework/nextjs/index.ts
|
|
87
115
|
function nextjs(options = {}) {
|
|
88
116
|
const files = options.files ?? ["**/*.{js,jsx,ts,tsx}"];
|
|
117
|
+
const isCoreWebVitals = options.coreWebVitals ?? false;
|
|
118
|
+
const plugin2 = nextPlugin;
|
|
119
|
+
const rules = isCoreWebVitals ? {
|
|
120
|
+
...plugin2.configs.recommended.rules,
|
|
121
|
+
...plugin2.configs["core-web-vitals"].rules
|
|
122
|
+
} : {
|
|
123
|
+
...plugin2.configs.recommended.rules
|
|
124
|
+
};
|
|
125
|
+
if (isCoreWebVitals) {
|
|
126
|
+
rules["@next/next/no-async-client-component"] = "error";
|
|
127
|
+
rules["@next/next/no-img-element"] = "error";
|
|
128
|
+
}
|
|
89
129
|
return [
|
|
90
130
|
{
|
|
91
131
|
files,
|
|
92
132
|
plugins: {
|
|
93
133
|
"@next/next": nextPlugin
|
|
94
134
|
},
|
|
135
|
+
settings: {
|
|
136
|
+
next: {
|
|
137
|
+
rootDir: options.rootDir
|
|
138
|
+
}
|
|
139
|
+
},
|
|
140
|
+
rules: {
|
|
141
|
+
...rules
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
];
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// src/configs/framework/nextjs/builders/import-boundaries.ts
|
|
148
|
+
import importPlugin from "eslint-plugin-import";
|
|
149
|
+
function nextjsImportBoundaries(options) {
|
|
150
|
+
const files = options.files ?? ["**/*.{ts,tsx}"];
|
|
151
|
+
return [
|
|
152
|
+
{
|
|
153
|
+
files,
|
|
154
|
+
plugins: {
|
|
155
|
+
import: importPlugin
|
|
156
|
+
},
|
|
95
157
|
rules: {
|
|
96
|
-
|
|
158
|
+
"import/no-restricted-paths": [
|
|
159
|
+
"error",
|
|
160
|
+
{
|
|
161
|
+
basePath: options.basePath,
|
|
162
|
+
zones: options.zones
|
|
163
|
+
}
|
|
164
|
+
]
|
|
97
165
|
}
|
|
98
166
|
}
|
|
99
167
|
];
|
|
@@ -134,12 +202,42 @@ var reactCoreRules = {
|
|
|
134
202
|
// src/configs/framework/react/definitions/hooks-r.ts
|
|
135
203
|
var reactHooksRules = {
|
|
136
204
|
"react-hooks/rules-of-hooks": "error",
|
|
137
|
-
"react-hooks/exhaustive-deps": "
|
|
205
|
+
"react-hooks/exhaustive-deps": "error"
|
|
138
206
|
};
|
|
139
207
|
|
|
140
208
|
// src/configs/framework/react/index.ts
|
|
209
|
+
function toRecord(value) {
|
|
210
|
+
if (typeof value !== "object" || value === null) {
|
|
211
|
+
return {};
|
|
212
|
+
}
|
|
213
|
+
return value;
|
|
214
|
+
}
|
|
215
|
+
function getPluginFlatConfigs(plugin2) {
|
|
216
|
+
const pluginRecord = toRecord(plugin2);
|
|
217
|
+
const configsRecord = toRecord(pluginRecord.configs);
|
|
218
|
+
return toRecord(configsRecord.flat);
|
|
219
|
+
}
|
|
220
|
+
function getRules(config) {
|
|
221
|
+
const configRecord = toRecord(config);
|
|
222
|
+
const rules = configRecord.rules;
|
|
223
|
+
if (typeof rules !== "object" || rules === null) {
|
|
224
|
+
return {};
|
|
225
|
+
}
|
|
226
|
+
return rules;
|
|
227
|
+
}
|
|
141
228
|
function react(options = {}) {
|
|
142
229
|
const files = options.files ?? ["**/*.{jsx,tsx}"];
|
|
230
|
+
const compilerRules = options.compilerRules ?? false;
|
|
231
|
+
const reactFlat = getPluginFlatConfigs(reactPlugin);
|
|
232
|
+
const reactHooksFlat = getPluginFlatConfigs(reactHooksPlugin);
|
|
233
|
+
const rules = {
|
|
234
|
+
...getRules(reactFlat.recommended),
|
|
235
|
+
...getRules(reactFlat["jsx-runtime"]),
|
|
236
|
+
...getRules(reactHooksFlat.recommended),
|
|
237
|
+
...compilerRules ? getRules(reactHooksFlat["recommended-latest"]) : {},
|
|
238
|
+
...reactCoreRules,
|
|
239
|
+
...reactHooksRules
|
|
240
|
+
};
|
|
143
241
|
return [
|
|
144
242
|
{
|
|
145
243
|
files,
|
|
@@ -160,8 +258,7 @@ function react(options = {}) {
|
|
|
160
258
|
}
|
|
161
259
|
},
|
|
162
260
|
rules: {
|
|
163
|
-
...
|
|
164
|
-
...reactHooksRules
|
|
261
|
+
...rules
|
|
165
262
|
}
|
|
166
263
|
}
|
|
167
264
|
];
|
|
@@ -177,7 +274,7 @@ var nextjsRecommended = [
|
|
|
177
274
|
...nextjs()
|
|
178
275
|
];
|
|
179
276
|
|
|
180
|
-
// src/configs/typescript/base.ts
|
|
277
|
+
// src/configs/typescript/builders/base.ts
|
|
181
278
|
import tseslint from "typescript-eslint";
|
|
182
279
|
function typescriptBase(options = {}) {
|
|
183
280
|
const files = options.files ?? ["**/*.{ts,tsx,mts,cts}"];
|
|
@@ -199,7 +296,7 @@ function typescriptBase(options = {}) {
|
|
|
199
296
|
"@typescript-eslint/no-unused-vars": "error",
|
|
200
297
|
"@typescript-eslint/no-shadow": "error",
|
|
201
298
|
"@typescript-eslint/ban-ts-comment": "error",
|
|
202
|
-
"@typescript-eslint/no-explicit-any": "
|
|
299
|
+
"@typescript-eslint/no-explicit-any": "error",
|
|
203
300
|
"@typescript-eslint/no-inferrable-types": "error",
|
|
204
301
|
"no-undef": "off",
|
|
205
302
|
"no-unused-vars": "off",
|
|
@@ -212,15 +309,17 @@ function typescriptBase(options = {}) {
|
|
|
212
309
|
];
|
|
213
310
|
}
|
|
214
311
|
|
|
215
|
-
// src/configs/typescript/conventions.ts
|
|
216
|
-
import
|
|
312
|
+
// src/configs/typescript/builders/conventions.ts
|
|
313
|
+
import importPlugin2 from "eslint-plugin-import";
|
|
314
|
+
import tseslint2 from "typescript-eslint";
|
|
217
315
|
function typescriptConventions(options = {}) {
|
|
218
316
|
const files = options.files ?? ["**/*.{ts,tsx,mts,cts}"];
|
|
219
317
|
return [
|
|
220
318
|
{
|
|
221
319
|
files,
|
|
222
320
|
plugins: {
|
|
223
|
-
import:
|
|
321
|
+
import: importPlugin2,
|
|
322
|
+
"@typescript-eslint": tseslint2.plugin
|
|
224
323
|
},
|
|
225
324
|
rules: {
|
|
226
325
|
// 6.1 Rule table
|
|
@@ -245,7 +344,7 @@ function typescriptConventions(options = {}) {
|
|
|
245
344
|
];
|
|
246
345
|
}
|
|
247
346
|
|
|
248
|
-
// src/configs/typescript/docs.ts
|
|
347
|
+
// src/configs/typescript/builders/docs.ts
|
|
249
348
|
import comments from "@eslint-community/eslint-plugin-eslint-comments";
|
|
250
349
|
import jsdoc from "eslint-plugin-jsdoc";
|
|
251
350
|
function typescriptDocs(options = {}) {
|
|
@@ -270,8 +369,8 @@ function typescriptDocs(options = {}) {
|
|
|
270
369
|
];
|
|
271
370
|
}
|
|
272
371
|
|
|
273
|
-
// src/configs/typescript/functional.ts
|
|
274
|
-
import
|
|
372
|
+
// src/configs/typescript/builders/functional.ts
|
|
373
|
+
import tseslint3 from "typescript-eslint";
|
|
275
374
|
var FUNCTIONAL_RULES = {
|
|
276
375
|
// Type Safety
|
|
277
376
|
"@typescript-eslint/explicit-module-boundary-types": "warn",
|
|
@@ -289,15 +388,15 @@ function typescriptFunctional(options = {}) {
|
|
|
289
388
|
{
|
|
290
389
|
files,
|
|
291
390
|
plugins: {
|
|
292
|
-
"@typescript-eslint":
|
|
391
|
+
"@typescript-eslint": tseslint3.plugin
|
|
293
392
|
},
|
|
294
393
|
rules: FUNCTIONAL_RULES
|
|
295
394
|
}
|
|
296
395
|
];
|
|
297
396
|
}
|
|
298
397
|
|
|
299
|
-
// src/configs/typescript/imports.ts
|
|
300
|
-
import
|
|
398
|
+
// src/configs/typescript/builders/imports.ts
|
|
399
|
+
import importPlugin3 from "eslint-plugin-import";
|
|
301
400
|
import simpleImportSort from "eslint-plugin-simple-import-sort";
|
|
302
401
|
var IMPORTS_RULES = {
|
|
303
402
|
"import/no-duplicates": "error",
|
|
@@ -333,7 +432,7 @@ function typescriptImports(options = {}) {
|
|
|
333
432
|
{
|
|
334
433
|
files,
|
|
335
434
|
plugins: {
|
|
336
|
-
import:
|
|
435
|
+
import: importPlugin3,
|
|
337
436
|
"simple-import-sort": simpleImportSort
|
|
338
437
|
},
|
|
339
438
|
settings: {
|
|
@@ -353,12 +452,7 @@ function typescriptImports(options = {}) {
|
|
|
353
452
|
];
|
|
354
453
|
}
|
|
355
454
|
|
|
356
|
-
// src/configs/typescript/
|
|
357
|
-
function typescriptMinimal(options = {}) {
|
|
358
|
-
return typescriptBase(options);
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
// src/configs/typescript/naming-env.ts
|
|
455
|
+
// src/configs/typescript/builders/naming-env.ts
|
|
362
456
|
import unicorn from "eslint-plugin-unicorn";
|
|
363
457
|
var NAMING_RULES = {
|
|
364
458
|
"unicorn/filename-case": [
|
|
@@ -386,7 +480,7 @@ function typescriptNamingEnv(options = {}) {
|
|
|
386
480
|
];
|
|
387
481
|
}
|
|
388
482
|
|
|
389
|
-
// src/configs/typescript/prettier.ts
|
|
483
|
+
// src/configs/typescript/builders/prettier.ts
|
|
390
484
|
import eslintConfigPrettier from "eslint-config-prettier";
|
|
391
485
|
function typescriptPrettierInterop(options = {}) {
|
|
392
486
|
const files = options.files ?? ["**/*.{ts,tsx,mts,cts}"];
|
|
@@ -400,68 +494,7 @@ function typescriptPrettierInterop(options = {}) {
|
|
|
400
494
|
];
|
|
401
495
|
}
|
|
402
496
|
|
|
403
|
-
// src/configs/typescript/
|
|
404
|
-
import tseslint4 from "typescript-eslint";
|
|
405
|
-
|
|
406
|
-
// src/configs/typescript/quality.ts
|
|
407
|
-
import sonarjs from "eslint-plugin-sonarjs";
|
|
408
|
-
import unicorn2 from "eslint-plugin-unicorn";
|
|
409
|
-
var UNICORN_ABBREVIATIONS = {
|
|
410
|
-
allowList: {
|
|
411
|
-
Props: true,
|
|
412
|
-
props: true,
|
|
413
|
-
Ref: true,
|
|
414
|
-
ref: true,
|
|
415
|
-
Src: true,
|
|
416
|
-
src: true,
|
|
417
|
-
Params: true,
|
|
418
|
-
params: true,
|
|
419
|
-
Env: true,
|
|
420
|
-
env: true,
|
|
421
|
-
Args: true,
|
|
422
|
-
args: true,
|
|
423
|
-
Docs: true,
|
|
424
|
-
docs: true,
|
|
425
|
-
arg: true,
|
|
426
|
-
err: true,
|
|
427
|
-
req: true,
|
|
428
|
-
res: true,
|
|
429
|
-
ctx: true,
|
|
430
|
-
val: true
|
|
431
|
-
}
|
|
432
|
-
};
|
|
433
|
-
function typescriptQuality(options = {}) {
|
|
434
|
-
const files = options.files ?? ["**/*.{ts,tsx,mts,cts}"];
|
|
435
|
-
return [
|
|
436
|
-
{
|
|
437
|
-
files,
|
|
438
|
-
plugins: {
|
|
439
|
-
unicorn: unicorn2,
|
|
440
|
-
sonarjs
|
|
441
|
-
},
|
|
442
|
-
rules: {
|
|
443
|
-
// Unicorn
|
|
444
|
-
"unicorn/prefer-node-protocol": "error",
|
|
445
|
-
"unicorn/no-useless-undefined": "error",
|
|
446
|
-
"unicorn/no-lonely-if": "error",
|
|
447
|
-
"unicorn/prefer-optional-catch-binding": "error",
|
|
448
|
-
"unicorn/prefer-string-replace-all": "error",
|
|
449
|
-
"unicorn/prevent-abbreviations": ["warn", UNICORN_ABBREVIATIONS],
|
|
450
|
-
// Best Practices
|
|
451
|
-
"consistent-return": "error",
|
|
452
|
-
"no-implicit-coercion": "error",
|
|
453
|
-
// SonarJS
|
|
454
|
-
"sonarjs/cognitive-complexity": ["error", 15],
|
|
455
|
-
"sonarjs/no-identical-functions": "error",
|
|
456
|
-
"sonarjs/no-duplicated-branches": "error",
|
|
457
|
-
"sonarjs/no-redundant-boolean": "error",
|
|
458
|
-
"sonarjs/no-inverted-boolean-check": "error"
|
|
459
|
-
}
|
|
460
|
-
}
|
|
461
|
-
];
|
|
462
|
-
}
|
|
463
|
-
|
|
464
|
-
// src/configs/typescript/security.ts
|
|
497
|
+
// src/configs/typescript/builders/security.ts
|
|
465
498
|
import regexpPlugin from "eslint-plugin-regexp";
|
|
466
499
|
import securityPlugin from "eslint-plugin-security";
|
|
467
500
|
function typescriptSecurity(options = {}) {
|
|
@@ -486,7 +519,7 @@ function typescriptSecurity(options = {}) {
|
|
|
486
519
|
];
|
|
487
520
|
}
|
|
488
521
|
|
|
489
|
-
// src/configs/typescript/size-complexity.ts
|
|
522
|
+
// src/configs/typescript/builders/size-complexity.ts
|
|
490
523
|
function typescriptSizeComplexity(options = {}) {
|
|
491
524
|
const files = options.files ?? ["**/*.{ts,tsx,mts,cts}"];
|
|
492
525
|
return [
|
|
@@ -511,15 +544,15 @@ function typescriptSizeComplexity(options = {}) {
|
|
|
511
544
|
];
|
|
512
545
|
}
|
|
513
546
|
|
|
514
|
-
// src/configs/typescript/type-aware.ts
|
|
515
|
-
import
|
|
547
|
+
// src/configs/typescript/builders/type-aware.ts
|
|
548
|
+
import tseslint4 from "typescript-eslint";
|
|
516
549
|
function typescriptTypeAware(options = {}) {
|
|
517
550
|
const files = options.files ?? ["**/*.{ts,tsx,mts,cts}"];
|
|
518
551
|
return [
|
|
519
552
|
{
|
|
520
553
|
files,
|
|
521
554
|
plugins: {
|
|
522
|
-
"@typescript-eslint":
|
|
555
|
+
"@typescript-eslint": tseslint4.plugin
|
|
523
556
|
},
|
|
524
557
|
languageOptions: {
|
|
525
558
|
parserOptions: {
|
|
@@ -528,6 +561,11 @@ function typescriptTypeAware(options = {}) {
|
|
|
528
561
|
}
|
|
529
562
|
},
|
|
530
563
|
rules: {
|
|
564
|
+
"@typescript-eslint/no-unsafe-assignment": "error",
|
|
565
|
+
"@typescript-eslint/no-unsafe-argument": "error",
|
|
566
|
+
"@typescript-eslint/no-unsafe-call": "error",
|
|
567
|
+
"@typescript-eslint/no-unsafe-member-access": "error",
|
|
568
|
+
"@typescript-eslint/no-unsafe-return": "error",
|
|
531
569
|
"@typescript-eslint/require-await": "error",
|
|
532
570
|
"@typescript-eslint/no-floating-promises": "error",
|
|
533
571
|
"@typescript-eslint/no-misused-promises": "error",
|
|
@@ -545,11 +583,77 @@ function typescriptTypeAware(options = {}) {
|
|
|
545
583
|
];
|
|
546
584
|
}
|
|
547
585
|
|
|
586
|
+
// src/configs/typescript/minimal.ts
|
|
587
|
+
function typescriptMinimal(options = {}) {
|
|
588
|
+
return typescriptBase(options);
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
// src/configs/typescript/recommended.ts
|
|
592
|
+
import tseslint5 from "typescript-eslint";
|
|
593
|
+
|
|
594
|
+
// src/configs/typescript/builders/quality.ts
|
|
595
|
+
import sonarjs from "eslint-plugin-sonarjs";
|
|
596
|
+
import unicorn2 from "eslint-plugin-unicorn";
|
|
597
|
+
var UNICORN_ABBREVIATIONS = {
|
|
598
|
+
allowList: {
|
|
599
|
+
Props: true,
|
|
600
|
+
props: true,
|
|
601
|
+
Ref: true,
|
|
602
|
+
ref: true,
|
|
603
|
+
Src: true,
|
|
604
|
+
src: true,
|
|
605
|
+
Params: true,
|
|
606
|
+
params: true,
|
|
607
|
+
Env: true,
|
|
608
|
+
env: true,
|
|
609
|
+
Args: true,
|
|
610
|
+
args: true,
|
|
611
|
+
Docs: true,
|
|
612
|
+
docs: true,
|
|
613
|
+
arg: true,
|
|
614
|
+
err: true,
|
|
615
|
+
req: true,
|
|
616
|
+
res: true,
|
|
617
|
+
ctx: true,
|
|
618
|
+
val: true
|
|
619
|
+
}
|
|
620
|
+
};
|
|
621
|
+
function typescriptQuality(options = {}) {
|
|
622
|
+
const files = options.files ?? ["**/*.{ts,tsx,mts,cts}"];
|
|
623
|
+
return [
|
|
624
|
+
{
|
|
625
|
+
files,
|
|
626
|
+
plugins: {
|
|
627
|
+
unicorn: unicorn2,
|
|
628
|
+
sonarjs
|
|
629
|
+
},
|
|
630
|
+
rules: {
|
|
631
|
+
// Unicorn
|
|
632
|
+
"unicorn/prefer-node-protocol": "error",
|
|
633
|
+
"unicorn/no-useless-undefined": "error",
|
|
634
|
+
"unicorn/no-lonely-if": "error",
|
|
635
|
+
"unicorn/prefer-optional-catch-binding": "error",
|
|
636
|
+
"unicorn/prefer-string-replace-all": "error",
|
|
637
|
+
"unicorn/prevent-abbreviations": ["warn", UNICORN_ABBREVIATIONS],
|
|
638
|
+
// Best Practices
|
|
639
|
+
"consistent-return": "error",
|
|
640
|
+
"no-implicit-coercion": "error",
|
|
641
|
+
// SonarJS
|
|
642
|
+
"sonarjs/cognitive-complexity": ["error", 15],
|
|
643
|
+
"sonarjs/no-identical-functions": "error",
|
|
644
|
+
"sonarjs/no-duplicated-branches": "error",
|
|
645
|
+
"sonarjs/no-redundant-boolean": "error",
|
|
646
|
+
"sonarjs/no-inverted-boolean-check": "error"
|
|
647
|
+
}
|
|
648
|
+
}
|
|
649
|
+
];
|
|
650
|
+
}
|
|
651
|
+
|
|
548
652
|
// src/configs/typescript/recommended.ts
|
|
549
653
|
function typescriptRecommended(options = {}) {
|
|
550
654
|
const files = options.files ?? ["**/*.{ts,tsx,mts,cts}"];
|
|
551
655
|
const enableConventions = options.enableConventions ?? true;
|
|
552
|
-
const upstreamConfigs = options.typeChecked ?
|
|
656
|
+
const upstreamConfigs = options.typeChecked ? tseslint5.configs.recommendedTypeChecked : tseslint5.configs.recommended;
|
|
553
657
|
const typeAwareConfig = options.typeChecked ? typescriptTypeAware({
|
|
554
658
|
files,
|
|
555
659
|
tsconfigPath: options.tsconfigPath,
|
|
@@ -582,6 +686,7 @@ export {
|
|
|
582
686
|
a11y,
|
|
583
687
|
a11yRecommended,
|
|
584
688
|
nextjs,
|
|
689
|
+
nextjsImportBoundaries,
|
|
585
690
|
nextjsRecommended,
|
|
586
691
|
plugin,
|
|
587
692
|
react,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/configs/framework/a11y/index.ts","../src/configs/framework/a11y/definitions/jsx-a11y-r.ts","../src/configs/framework/a11y/recommended.ts","../src/configs/framework/nextjs/index.ts","../src/configs/framework/nextjs/definitions/core-next-r.ts","../src/configs/framework/react/index.ts","../src/configs/framework/react/definitions/core-r.ts","../src/configs/framework/react/definitions/hooks-r.ts","../src/configs/framework/react/recommended.ts","../src/configs/framework/nextjs/recommended.ts","../src/configs/typescript/base.ts","../src/configs/typescript/conventions.ts","../src/configs/typescript/docs.ts","../src/configs/typescript/functional.ts","../src/configs/typescript/imports.ts","../src/configs/typescript/minimal.ts","../src/configs/typescript/naming-env.ts","../src/configs/typescript/prettier.ts","../src/configs/typescript/recommended.ts","../src/configs/typescript/quality.ts","../src/configs/typescript/security.ts","../src/configs/typescript/size-complexity.ts","../src/configs/typescript/type-aware.ts","../src/plugin/index.ts"],"sourcesContent":["import type { Linter } from \"eslint\";\nimport jsxA11yPlugin from \"eslint-plugin-jsx-a11y\";\n\nimport { jsxA11yRules } from \"./definitions/jsx-a11y-r\";\n\nexport type A11yOptions = {\n files?: string[];\n};\n\nexport function a11y(options: A11yOptions = {}): Linter.Config[] {\n const files = options.files ?? [\"**/*.{jsx,tsx}\"];\n\n return [\n {\n files,\n plugins: {\n \"jsx-a11y\": jsxA11yPlugin,\n },\n rules: {\n ...jsxA11yRules,\n },\n },\n ];\n}\n","import type { Linter } from \"eslint\";\n\nexport const jsxA11yRules: Linter.RulesRecord = {\n \"jsx-a11y/alt-text\": \"error\",\n \"jsx-a11y/anchor-has-content\": \"error\",\n \"jsx-a11y/anchor-is-valid\": \"error\",\n \"jsx-a11y/aria-activedescendant-has-tabindex\": \"error\",\n \"jsx-a11y/aria-props\": \"error\",\n \"jsx-a11y/aria-proptypes\": \"error\",\n \"jsx-a11y/aria-role\": \"error\",\n \"jsx-a11y/aria-unsupported-elements\": \"error\",\n \"jsx-a11y/autocomplete-valid\": \"error\",\n \"jsx-a11y/click-events-have-key-events\": \"error\",\n \"jsx-a11y/heading-has-content\": \"error\",\n \"jsx-a11y/html-has-lang\": \"error\",\n \"jsx-a11y/iframe-has-title\": \"error\",\n \"jsx-a11y/img-redundant-alt\": \"error\",\n \"jsx-a11y/interactive-supports-focus\": \"error\",\n \"jsx-a11y/label-has-associated-control\": \"error\",\n \"jsx-a11y/media-has-caption\": \"error\",\n \"jsx-a11y/mouse-events-have-key-events\": \"error\",\n \"jsx-a11y/no-access-key\": \"error\",\n \"jsx-a11y/no-autofocus\": \"error\",\n \"jsx-a11y/no-distracting-elements\": \"error\",\n \"jsx-a11y/no-interactive-element-to-noninteractive-role\": \"error\",\n \"jsx-a11y/no-noninteractive-element-interactions\": \"error\",\n \"jsx-a11y/no-noninteractive-element-to-interactive-role\": \"error\",\n \"jsx-a11y/no-noninteractive-tabindex\": \"error\",\n \"jsx-a11y/no-redundant-roles\": \"error\",\n \"jsx-a11y/no-static-element-interactions\": \"error\",\n \"jsx-a11y/role-has-required-aria-props\": \"error\",\n \"jsx-a11y/role-supports-aria-props\": \"error\",\n \"jsx-a11y/scope\": \"error\",\n \"jsx-a11y/tabindex-no-positive\": \"error\",\n};\n","import { a11y } from \"./index\";\n\nexport const a11yRecommended = a11y();\n","import nextPlugin from \"@next/eslint-plugin-next\";\nimport type { Linter } from \"eslint\";\n\nimport { nextCoreRules } from \"./definitions/core-next-r\";\n\nexport type NextjsOptions = {\n files?: string[];\n};\n\nexport function nextjs(options: NextjsOptions = {}): Linter.Config[] {\n const files = options.files ?? [\"**/*.{js,jsx,ts,tsx}\"];\n\n return [\n {\n files,\n plugins: {\n \"@next/next\": nextPlugin,\n },\n rules: {\n ...nextCoreRules,\n },\n },\n ];\n}\n","import type { Linter } from \"eslint\";\n\nexport const nextCoreRules: Linter.RulesRecord = {\n \"@next/next/google-font-display\": \"error\",\n \"@next/next/google-font-preconnect\": \"error\",\n \"@next/next/inline-script-id\": \"error\",\n \"@next/next/next-script-for-ga\": \"error\",\n \"@next/next/no-assign-module-variable\": \"error\",\n \"@next/next/no-async-client-component\": \"warn\",\n \"@next/next/no-before-interactive-script-outside-document\": \"error\",\n \"@next/next/no-css-tags\": \"error\",\n \"@next/next/no-document-import-in-page\": \"error\",\n \"@next/next/no-duplicate-head\": \"error\",\n \"@next/next/no-head-element\": \"error\",\n \"@next/next/no-head-import-in-document\": \"error\",\n \"@next/next/no-html-link-for-pages\": \"off\",\n \"@next/next/no-img-element\": \"error\",\n \"@next/next/no-page-custom-font\": \"error\",\n \"@next/next/no-script-component-in-head\": \"error\",\n \"@next/next/no-styled-jsx-in-document\": \"error\",\n \"@next/next/no-sync-scripts\": \"error\",\n \"@next/next/no-title-in-document-head\": \"error\",\n \"@next/next/no-typos\": \"error\",\n \"@next/next/no-unwanted-polyfillio\": \"error\",\n};\n","import type { Linter } from \"eslint\";\nimport reactPlugin from \"eslint-plugin-react\";\nimport reactHooksPlugin from \"eslint-plugin-react-hooks\";\n\nimport { reactCoreRules } from \"./definitions/core-r\";\nimport { reactHooksRules } from \"./definitions/hooks-r\";\n\nexport type ReactOptions = {\n files?: string[];\n};\n\nexport function react(options: ReactOptions = {}): Linter.Config[] {\n const files = options.files ?? [\"**/*.{jsx,tsx}\"];\n\n return [\n {\n files,\n plugins: {\n react: reactPlugin,\n \"react-hooks\": reactHooksPlugin,\n },\n languageOptions: {\n parserOptions: {\n ecmaFeatures: {\n jsx: true,\n },\n },\n },\n settings: {\n react: {\n version: \"detect\",\n },\n },\n rules: {\n ...reactCoreRules,\n ...reactHooksRules,\n },\n },\n ];\n}\n","import type { Linter } from \"eslint\";\n\n/**\n * Core React rules (validation, JSX, etc).\n * Disables rules that conflict with TypeScript or new React versions.\n */\nexport const reactCoreRules: Linter.RulesRecord = {\n \"react/display-name\": \"error\",\n \"react/jsx-key\": \"error\",\n \"react/jsx-no-comment-textnodes\": \"error\",\n \"react/jsx-no-duplicate-props\": \"error\",\n \"react/jsx-no-target-blank\": \"error\",\n \"react/jsx-no-undef\": \"error\",\n \"react/jsx-uses-react\": \"off\", // Not needed in React 17+\n \"react/jsx-uses-vars\": \"error\",\n \"react/no-children-prop\": \"error\",\n \"react/no-danger-with-children\": \"error\",\n \"react/no-deprecated\": \"error\",\n \"react/no-direct-mutation-state\": \"error\",\n \"react/no-find-dom-node\": \"error\",\n \"react/no-is-mounted\": \"error\",\n \"react/no-render-return-value\": \"error\",\n \"react/no-string-refs\": \"error\",\n \"react/no-unknown-property\": \"error\",\n \"react/no-unsafe\": \"off\",\n \"react/prop-types\": \"off\", // We use TypeScript\n \"react/react-in-jsx-scope\": \"off\", // Not needed in React 17+\n \"react/require-render-return\": \"error\",\n};\n","import type { Linter } from \"eslint\";\n\nexport const reactHooksRules: Linter.RulesRecord = {\n \"react-hooks/rules-of-hooks\": \"error\",\n \"react-hooks/exhaustive-deps\": \"warn\",\n};\n","import { react } from \"./index\";\n\nexport const reactRecommended = react();\n","import { a11yRecommended } from \"../a11y/recommended\";\nimport { reactRecommended } from \"../react/recommended\";\nimport { nextjs } from \"./index\";\n\nexport const nextjsRecommended = [\n ...reactRecommended,\n ...a11yRecommended,\n ...nextjs(),\n];\n","import type { Linter } from \"eslint\";\nimport tseslint from \"typescript-eslint\";\n\nexport type TypescriptBaseOptions = {\n files?: string[];\n};\n\nexport function typescriptBase(\n options: TypescriptBaseOptions = {},\n): Linter.Config[] {\n const files = options.files ?? [\"**/*.{ts,tsx,mts,cts}\"];\n\n return [\n {\n files,\n plugins: {\n \"@typescript-eslint\": tseslint.plugin,\n },\n languageOptions: {\n parser: tseslint.parser,\n parserOptions: {\n ecmaVersion: \"latest\",\n sourceType: \"module\",\n },\n },\n rules: {\n \"@typescript-eslint/consistent-type-imports\": \"error\",\n \"@typescript-eslint/no-unused-vars\": \"error\",\n \"@typescript-eslint/no-shadow\": \"error\",\n \"@typescript-eslint/ban-ts-comment\": \"error\",\n \"@typescript-eslint/no-explicit-any\": \"warn\",\n \"@typescript-eslint/no-inferrable-types\": \"error\",\n \"no-undef\": \"off\",\n \"no-unused-vars\": \"off\",\n \"no-var\": \"error\",\n \"prefer-const\": \"error\",\n eqeqeq: [\"error\", \"always\", { null: \"ignore\" }],\n \"no-implicit-coercion\": \"error\",\n },\n },\n ];\n}\n","import type { Linter } from \"eslint\";\nimport importPlugin from \"eslint-plugin-import\";\n\nexport type TypescriptConventionsOptions = {\n files?: string[];\n};\n\nexport function typescriptConventions(\n options: TypescriptConventionsOptions = {},\n): Linter.Config[] {\n const files = options.files ?? [\"**/*.{ts,tsx,mts,cts}\"];\n\n return [\n {\n files,\n plugins: {\n import: importPlugin,\n },\n rules: {\n // 6.1 Rule table\n \"import/no-default-export\": \"error\",\n \"@typescript-eslint/consistent-type-definitions\": [\"error\", \"type\"],\n \"@typescript-eslint/consistent-type-imports\": \"error\",\n \"prefer-arrow-callback\": \"error\",\n },\n },\n // 6.2 Overrides\n {\n files: [\n \"**/*.config.{js,mjs,ts}\",\n \"**/app/**/{page,layout,template,not-found,global-error,loading,error}.tsx\",\n \"**/*.stories.tsx\",\n \"**/*.d.ts\",\n ],\n rules: {\n \"import/no-default-export\": \"off\",\n },\n },\n ];\n}\n","import comments from \"@eslint-community/eslint-plugin-eslint-comments\";\nimport type { Linter } from \"eslint\";\nimport jsdoc from \"eslint-plugin-jsdoc\";\n\nexport type TypescriptDocsOptions = {\n files?: string[];\n};\n\nexport function typescriptDocs(\n options: TypescriptDocsOptions = {},\n): Linter.Config[] {\n const files = options.files ?? [\"**/*.{ts,tsx,mts,cts}\"];\n\n return [\n {\n files,\n plugins: {\n jsdoc: jsdoc,\n \"eslint-comments\": comments,\n },\n rules: {\n \"eslint-comments/no-unused-disable\": \"error\",\n \"eslint-comments/no-unlimited-disable\": \"error\",\n \"eslint-comments/require-description\": \"error\",\n \"eslint-comments/disable-enable-pair\": \"error\",\n \"jsdoc/check-alignment\": \"error\",\n \"jsdoc/require-param\": \"error\",\n \"jsdoc/require-returns\": \"error\",\n },\n },\n ];\n}\n","import type { Linter } from \"eslint\";\nimport tseslint from \"typescript-eslint\";\n\nexport type TypescriptFunctionalOptions = {\n files?: string[];\n};\n\nconst FUNCTIONAL_RULES: Linter.RulesRecord = {\n // Type Safety\n \"@typescript-eslint/explicit-module-boundary-types\": \"warn\",\n\n // Modern Syntax\n \"@typescript-eslint/default-param-last\": \"error\",\n \"prefer-rest-params\": \"error\",\n \"prefer-spread\": \"error\",\n \"no-new-func\": \"error\",\n\n // Clean Code\n \"@typescript-eslint/no-empty-function\": \"error\",\n};\n\nexport function typescriptFunctional(\n options: TypescriptFunctionalOptions = {},\n): Linter.Config[] {\n const files = options.files ?? [\"**/*.{ts,tsx,mts,cts}\"];\n\n return [\n {\n files,\n plugins: {\n \"@typescript-eslint\": tseslint.plugin,\n },\n rules: FUNCTIONAL_RULES,\n },\n ];\n}\n","import type { Linter } from \"eslint\";\nimport importPlugin from \"eslint-plugin-import\";\nimport simpleImportSort from \"eslint-plugin-simple-import-sort\";\n\nconst IMPORTS_RULES: Linter.RulesRecord = {\n \"import/no-duplicates\": \"error\",\n \"import/no-cycle\": \"error\",\n \"import/no-mutable-exports\": \"error\",\n \"import/first\": \"error\",\n \"import/newline-after-import\": \"error\",\n \"import/no-extraneous-dependencies\": [\n \"error\",\n {\n devDependencies: [\n \"**/*.test.ts\",\n \"**/*.spec.ts\",\n \"test/**\",\n \"tests/**\",\n \"**/*.config.{js,ts,mjs}\",\n \"**/*.stories.tsx\",\n \"scripts/**\",\n \"src/configs/framework/**\",\n ],\n optionalDependencies: false,\n peerDependencies: true,\n },\n ],\n\n \"simple-import-sort/imports\": \"error\",\n \"simple-import-sort/exports\": \"error\",\n\n \"import/no-deprecated\": \"error\",\n \"no-restricted-imports\": \"off\",\n};\n\nexport type TypescriptImportsOptions = {\n files?: string[];\n};\n\nexport function typescriptImports(\n options: TypescriptImportsOptions = {},\n): Linter.Config[] {\n const files = options.files ?? [\"**/*.{ts,tsx,mts,cts}\"];\n\n return [\n {\n files,\n plugins: {\n import: importPlugin,\n \"simple-import-sort\": simpleImportSort,\n },\n settings: {\n \"import/parsers\": {\n \"@typescript-eslint/parser\": [\".ts\", \".tsx\", \".mts\", \".cts\"],\n },\n \"import/resolver\": {\n typescript: {\n alwaysTryTypes: true,\n project: [\"tsconfig.json\", \"*/tsconfig.json\"],\n },\n node: true,\n },\n },\n rules: IMPORTS_RULES,\n },\n ];\n}\n","import type { Linter } from \"eslint\";\n\nimport { typescriptBase } from \"./base.js\";\n\nexport type TypescriptConfigFiles = string[];\n\nexport type TypescriptMinimalOptions = {\n files?: TypescriptConfigFiles;\n};\n\n/**\n * MVP TypeScript profile.\n *\n * Intentionally minimal: enables TypeScript parsing and one rule to prove\n * end-to-end packaging + consumption.\n * @param options - Configuration options.\n * @returns The ESLint configuration.\n */\nexport function typescriptMinimal(\n options: TypescriptMinimalOptions = {},\n): Linter.Config[] {\n return typescriptBase(options);\n}\n","import type { Linter } from \"eslint\";\nimport unicorn from \"eslint-plugin-unicorn\";\n\nexport type TypescriptNamingEnvOptions = {\n files?: string[];\n};\n\nconst NAMING_RULES: Linter.RulesRecord = {\n \"unicorn/filename-case\": [\n \"error\",\n {\n cases: {\n kebabCase: true,\n pascalCase: true,\n },\n ignore: [\"NEXT_\", \"README\", \"CHANGELOG\", \"LICENSE\", \"Dockerfile\", \"^_\"],\n },\n ],\n \"no-restricted-globals\": [\"error\", \"event\", \"fdescribe\"],\n};\n\nexport function typescriptNamingEnv(\n options: TypescriptNamingEnvOptions = {},\n): Linter.Config[] {\n const files = options.files ?? [\"**/*.{ts,tsx,mts,cts}\"];\n\n return [\n {\n files,\n plugins: {\n unicorn,\n },\n rules: NAMING_RULES,\n },\n ];\n}\n","import type { Linter } from \"eslint\";\nimport eslintConfigPrettier from \"eslint-config-prettier\";\n\nexport type TypescriptPrettierOptions = {\n files?: string[];\n};\n\nexport function typescriptPrettierInterop(\n options: TypescriptPrettierOptions = {},\n): Linter.Config[] {\n const files = options.files ?? [\"**/*.{ts,tsx,mts,cts}\"];\n\n return [\n {\n files,\n rules: {\n ...eslintConfigPrettier.rules,\n },\n },\n ];\n}\n","import type { Linter } from \"eslint\";\nimport tseslint from \"typescript-eslint\";\n\nimport { typescriptBase } from \"./base.js\";\nimport { typescriptConventions } from \"./conventions.js\";\nimport { typescriptDocs } from \"./docs.js\";\nimport { typescriptFunctional } from \"./functional.js\";\nimport { typescriptImports } from \"./imports.js\";\nimport { typescriptNamingEnv } from \"./naming-env.js\";\nimport { typescriptQuality } from \"./quality.js\";\nimport { typescriptSecurity } from \"./security.js\";\nimport { typescriptSizeComplexity } from \"./size-complexity.js\";\nimport { typescriptTypeAware } from \"./type-aware.js\";\n\nexport type TypescriptRecommendedOptions = {\n /**\n * When set, enables type-aware rules (more powerful, can be slower).\n *\n * Recommended for mature codebases, but not required for MVP.\n */\n typeChecked?: boolean;\n\n /**\n * Type-aware linting requires a project TSConfig.\n * Example: \"./tsconfig.json\".\n */\n tsconfigPath?: string | string[];\n\n /**\n * tsconfigRootDir should usually be import.meta.dirname from the consumer repo.\n */\n tsconfigRootDir?: string;\n\n files?: string[];\n\n /**\n * When true (default), enables strict conventions (e.g. no default exports).\n */\n enableConventions?: boolean;\n};\n\nexport function typescriptRecommended(\n options: TypescriptRecommendedOptions = {},\n): Linter.Config[] {\n const files = options.files ?? [\"**/*.{ts,tsx,mts,cts}\"];\n const enableConventions = options.enableConventions ?? true;\n\n const upstreamConfigs = (\n options.typeChecked\n ? tseslint.configs.recommendedTypeChecked\n : tseslint.configs.recommended\n ) as Linter.Config[];\n\n const typeAwareConfig: Linter.Config[] = options.typeChecked\n ? typescriptTypeAware({\n files,\n tsconfigPath: options.tsconfigPath,\n tsconfigRootDir: options.tsconfigRootDir,\n })\n : [];\n\n const conventionsConfig: Linter.Config[] = enableConventions\n ? typescriptConventions({ files })\n : [];\n\n return [\n ...typescriptBase({ files }),\n ...(typescriptQuality({ files }) as Linter.Config[]),\n ...typescriptImports({ files }),\n ...typescriptSecurity({ files }),\n ...typescriptNamingEnv({ files }),\n ...typescriptFunctional({ files }),\n ...typescriptDocs({ files }),\n ...typescriptSizeComplexity({ files }),\n ...conventionsConfig,\n ...typeAwareConfig,\n ...(upstreamConfigs.map((config) => ({\n ...config,\n files,\n })) as Linter.Config[]),\n ];\n}\n","import sonarjs from \"eslint-plugin-sonarjs\";\nimport unicorn from \"eslint-plugin-unicorn\";\n\nexport type TypescriptQualityOptions = {\n files?: string[];\n};\n\nconst UNICORN_ABBREVIATIONS = {\n allowList: {\n Props: true,\n props: true,\n Ref: true,\n ref: true,\n Src: true,\n src: true,\n Params: true,\n params: true,\n Env: true,\n env: true,\n Args: true,\n args: true,\n Docs: true,\n docs: true,\n arg: true,\n err: true,\n req: true,\n res: true,\n ctx: true,\n val: true,\n },\n};\n\nexport function typescriptQuality(\n options: TypescriptQualityOptions = {},\n): Linter.Config[] {\n const files = options.files ?? [\"**/*.{ts,tsx,mts,cts}\"];\n\n return [\n {\n files,\n plugins: {\n unicorn,\n sonarjs,\n },\n rules: {\n // Unicorn\n \"unicorn/prefer-node-protocol\": \"error\",\n \"unicorn/no-useless-undefined\": \"error\",\n \"unicorn/no-lonely-if\": \"error\",\n \"unicorn/prefer-optional-catch-binding\": \"error\",\n \"unicorn/prefer-string-replace-all\": \"error\",\n \"unicorn/prevent-abbreviations\": [\"warn\", UNICORN_ABBREVIATIONS],\n\n // Best Practices\n \"consistent-return\": \"error\",\n \"no-implicit-coercion\": \"error\",\n\n // SonarJS\n \"sonarjs/cognitive-complexity\": [\"error\", 15],\n \"sonarjs/no-identical-functions\": \"error\",\n \"sonarjs/no-duplicated-branches\": \"error\",\n \"sonarjs/no-redundant-boolean\": \"error\",\n \"sonarjs/no-inverted-boolean-check\": \"error\",\n },\n },\n ];\n}\n","import type { Linter } from \"eslint\";\nimport regexpPlugin from \"eslint-plugin-regexp\";\nimport securityPlugin from \"eslint-plugin-security\";\n\nexport type TypescriptSecurityOptions = {\n files?: string[];\n};\n\nexport function typescriptSecurity(\n options: TypescriptSecurityOptions = {},\n): Linter.Config[] {\n const files = options.files ?? [\"**/*.{ts,tsx,mts,cts}\"];\n\n return [\n {\n files,\n plugins: {\n security: securityPlugin,\n regexp: regexpPlugin,\n },\n rules: {\n // eslint-plugin-security\n \"security/detect-object-injection\": \"error\",\n \"security/detect-unsafe-regex\": \"error\",\n\n // eslint-plugin-regexp\n \"regexp/no-super-linear-backtracking\": \"error\",\n \"regexp/no-useless-escape\": \"error\",\n \"regexp/no-empty-capturing-group\": \"error\",\n },\n },\n ];\n}\n","import type { Linter } from \"eslint\";\n\nexport type TypescriptSizeComplexityOptions = {\n files?: string[];\n};\n\nexport function typescriptSizeComplexity(\n options: TypescriptSizeComplexityOptions = {},\n): Linter.Config[] {\n const files = options.files ?? [\"**/*.{ts,tsx,mts,cts}\"];\n\n return [\n {\n files,\n rules: {\n \"max-lines\": [\n \"error\",\n { max: 100, skipBlankLines: true, skipComments: true },\n ],\n \"max-lines-per-function\": [\n \"error\",\n { max: 50, skipBlankLines: true, skipComments: true },\n ],\n complexity: [\"error\", 15],\n \"max-params\": [\"error\", 3],\n \"max-depth\": [\"error\", 4],\n \"no-var\": \"error\",\n \"prefer-const\": \"warn\",\n },\n },\n ];\n}\n","import type { Linter } from \"eslint\";\nimport tseslint from \"typescript-eslint\";\n\nexport type TypescriptTypeAwareOptions = {\n /**\n * Type-aware linting requires a project TSConfig.\n * Example: \"./tsconfig.json\".\n */\n tsconfigPath?: string | string[];\n\n /**\n * tsconfigRootDir should usually be import.meta.dirname from the consumer repo.\n */\n tsconfigRootDir?: string;\n\n files?: string[];\n};\n\nexport function typescriptTypeAware(\n options: TypescriptTypeAwareOptions = {},\n): Linter.Config[] {\n const files = options.files ?? [\"**/*.{ts,tsx,mts,cts}\"];\n\n return [\n {\n files,\n plugins: {\n \"@typescript-eslint\": tseslint.plugin,\n },\n languageOptions: {\n parserOptions: {\n project: options.tsconfigPath ?? \"./tsconfig.json\",\n tsconfigRootDir: options.tsconfigRootDir,\n },\n },\n rules: {\n \"@typescript-eslint/require-await\": \"error\",\n \"@typescript-eslint/no-floating-promises\": \"error\",\n \"@typescript-eslint/no-misused-promises\": \"error\",\n \"@typescript-eslint/await-thenable\": \"error\",\n \"@typescript-eslint/no-unnecessary-condition\": \"warn\",\n \"@typescript-eslint/no-unnecessary-type-assertion\": \"error\",\n \"@typescript-eslint/restrict-template-expressions\": \"error\",\n \"@typescript-eslint/prefer-nullish-coalescing\": \"error\",\n \"@typescript-eslint/prefer-optional-chain\": \"error\",\n \"@typescript-eslint/switch-exhaustiveness-check\": \"error\",\n \"@typescript-eslint/no-deprecated\": \"error\",\n \"@typescript-eslint/consistent-type-exports\": \"error\",\n },\n },\n ];\n}\n","import type { ESLint } from \"eslint\";\n\n/**\n * Placeholder for future custom rules.\n *\n * Exporting a plugin object now keeps the package structure stable as you add\n * domain-specific rules later.\n */\nexport const plugin: ESLint.Plugin = {\n rules: {},\n};\n"],"mappings":"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","names":["tseslint","importPlugin","tseslint","unicorn","tseslint","tseslint"]}
|
|
1
|
+
{"version":3,"sources":["../src/configs/framework/a11y/index.ts","../src/configs/framework/a11y/definitions/jsx-a11y-r.ts","../src/configs/framework/a11y/recommended.ts","../src/configs/framework/nextjs/builders/core.ts","../src/configs/framework/nextjs/builders/import-boundaries.ts","../src/configs/framework/react/index.ts","../src/configs/framework/react/definitions/core-r.ts","../src/configs/framework/react/definitions/hooks-r.ts","../src/configs/framework/react/recommended.ts","../src/configs/framework/nextjs/recommended.ts","../src/configs/typescript/builders/base.ts","../src/configs/typescript/builders/conventions.ts","../src/configs/typescript/builders/docs.ts","../src/configs/typescript/builders/functional.ts","../src/configs/typescript/builders/imports.ts","../src/configs/typescript/builders/naming-env.ts","../src/configs/typescript/builders/prettier.ts","../src/configs/typescript/builders/security.ts","../src/configs/typescript/builders/size-complexity.ts","../src/configs/typescript/builders/type-aware.ts","../src/configs/typescript/minimal.ts","../src/configs/typescript/recommended.ts","../src/configs/typescript/builders/quality.ts","../src/plugin/index.ts"],"sourcesContent":["import type { Linter } from \"eslint\";\nimport jsxA11yPlugin from \"eslint-plugin-jsx-a11y\";\n\nimport { jsxA11yRules } from \"./definitions/jsx-a11y-r\";\n\nexport type A11yOptions = {\n files?: string[];\n};\n\nexport function a11y(options: A11yOptions = {}): Linter.Config[] {\n const files = options.files ?? [\n \"**/app/**/*.{jsx,tsx}\",\n \"**/pages/**/*.{jsx,tsx}\",\n \"**/components/**/*.{jsx,tsx}\",\n \"**/ui/**/*.{jsx,tsx}\",\n \"**/features/**/*.{jsx,tsx}\",\n ];\n\n return [\n {\n files,\n plugins: {\n \"jsx-a11y\": jsxA11yPlugin,\n },\n rules: {\n ...jsxA11yRules,\n },\n },\n ];\n}\n","import type { Linter } from \"eslint\";\n\nexport const jsxA11yRules: Linter.RulesRecord = {\n \"jsx-a11y/alt-text\": \"error\",\n \"jsx-a11y/anchor-has-content\": \"error\",\n \"jsx-a11y/anchor-is-valid\": \"error\",\n \"jsx-a11y/aria-activedescendant-has-tabindex\": \"error\",\n \"jsx-a11y/aria-props\": \"error\",\n \"jsx-a11y/aria-proptypes\": \"error\",\n \"jsx-a11y/aria-role\": \"error\",\n \"jsx-a11y/aria-unsupported-elements\": \"error\",\n \"jsx-a11y/autocomplete-valid\": \"error\",\n \"jsx-a11y/click-events-have-key-events\": \"error\",\n \"jsx-a11y/control-has-associated-label\": \"error\",\n \"jsx-a11y/heading-has-content\": \"error\",\n \"jsx-a11y/html-has-lang\": \"error\",\n \"jsx-a11y/iframe-has-title\": \"error\",\n \"jsx-a11y/img-redundant-alt\": \"error\",\n \"jsx-a11y/interactive-supports-focus\": \"error\",\n \"jsx-a11y/label-has-associated-control\": \"error\",\n \"jsx-a11y/media-has-caption\": \"error\",\n \"jsx-a11y/mouse-events-have-key-events\": \"error\",\n \"jsx-a11y/no-access-key\": \"error\",\n \"jsx-a11y/no-autofocus\": \"error\",\n \"jsx-a11y/no-distracting-elements\": \"error\",\n \"jsx-a11y/no-interactive-element-to-noninteractive-role\": [\n \"error\",\n {\n tr: [\"none\", \"presentation\"],\n },\n ],\n \"jsx-a11y/no-noninteractive-element-interactions\": [\n \"error\",\n {\n handlers: [\n \"onClick\",\n \"onMouseDown\",\n \"onMouseUp\",\n \"onKeyPress\",\n \"onKeyDown\",\n \"onKeyUp\",\n ],\n },\n ],\n \"jsx-a11y/no-noninteractive-element-to-interactive-role\": [\n \"error\",\n {\n ul: [\n \"listbox\",\n \"menu\",\n \"menubar\",\n \"radiogroup\",\n \"tablist\",\n \"tree\",\n \"treegrid\",\n ],\n ol: [\n \"listbox\",\n \"menu\",\n \"menubar\",\n \"radiogroup\",\n \"tablist\",\n \"tree\",\n \"treegrid\",\n ],\n li: [\"menuitem\", \"option\", \"row\", \"tab\", \"treeitem\"],\n table: [\"grid\"],\n td: [\"gridcell\"],\n },\n ],\n \"jsx-a11y/no-noninteractive-tabindex\": [\n \"error\",\n {\n tags: [],\n roles: [\"tabpanel\"],\n },\n ],\n \"jsx-a11y/no-redundant-roles\": \"error\",\n \"jsx-a11y/no-static-element-interactions\": \"error\",\n \"jsx-a11y/role-has-required-aria-props\": \"error\",\n \"jsx-a11y/role-supports-aria-props\": \"error\",\n \"jsx-a11y/scope\": \"error\",\n \"jsx-a11y/tabindex-no-positive\": \"error\",\n};\n","import { a11y } from \"./index\";\n\nexport const a11yRecommended = a11y();\n","import nextPlugin from \"@next/eslint-plugin-next\";\nimport type { Linter } from \"eslint\";\n\nexport type NextjsOptions = {\n files?: string[];\n coreWebVitals?: boolean;\n rootDir?: string | string[];\n};\n\nexport function nextjs(options: NextjsOptions = {}): Linter.Config[] {\n const files = options.files ?? [\"**/*.{js,jsx,ts,tsx}\"];\n const isCoreWebVitals = options.coreWebVitals ?? false;\n\n const plugin = nextPlugin as unknown as {\n configs: {\n recommended: { rules: Linter.RulesRecord };\n \"core-web-vitals\": { rules: Linter.RulesRecord };\n };\n };\n\n const rules: Linter.RulesRecord = isCoreWebVitals\n ? {\n ...plugin.configs.recommended.rules,\n ...plugin.configs[\"core-web-vitals\"].rules,\n }\n : {\n ...plugin.configs.recommended.rules,\n };\n\n if (isCoreWebVitals) {\n rules[\"@next/next/no-async-client-component\"] = \"error\";\n rules[\"@next/next/no-img-element\"] = \"error\";\n }\n\n return [\n {\n files,\n plugins: {\n \"@next/next\": nextPlugin,\n },\n settings: {\n next: {\n rootDir: options.rootDir,\n },\n },\n rules: {\n ...rules,\n },\n },\n ];\n}\n","import type { Linter } from \"eslint\";\nimport importPlugin from \"eslint-plugin-import\";\n\nexport type ImportZone = {\n target: string | string[];\n from: string | string[];\n except?: string[];\n message: string;\n};\n\nexport type NextjsBoundariesOptions = {\n files?: string[];\n basePath: string;\n zones: ImportZone[];\n};\n\nexport function nextjsImportBoundaries(\n options: NextjsBoundariesOptions,\n): Linter.Config[] {\n const files = options.files ?? [\"**/*.{ts,tsx}\"];\n\n return [\n {\n files,\n plugins: {\n import: importPlugin,\n },\n rules: {\n \"import/no-restricted-paths\": [\n \"error\",\n {\n basePath: options.basePath,\n zones: options.zones,\n },\n ],\n },\n },\n ];\n}\n","import type { Linter } from \"eslint\";\nimport reactPlugin from \"eslint-plugin-react\";\nimport reactHooksPlugin from \"eslint-plugin-react-hooks\";\n\nimport { reactCoreRules } from \"./definitions/core-r\";\nimport { reactHooksRules } from \"./definitions/hooks-r\";\n\nfunction toRecord(value: unknown): Record<string, unknown> {\n if (typeof value !== \"object\" || value === null) {\n return {};\n }\n\n return value as Record<string, unknown>;\n}\n\nfunction getPluginFlatConfigs(plugin: unknown): Record<string, unknown> {\n const pluginRecord = toRecord(plugin);\n const configsRecord = toRecord(pluginRecord.configs);\n return toRecord(configsRecord.flat);\n}\n\nfunction getRules(config: unknown): Linter.RulesRecord {\n const configRecord = toRecord(config);\n const rules = configRecord.rules;\n\n if (typeof rules !== \"object\" || rules === null) {\n return {};\n }\n\n return rules as Linter.RulesRecord;\n}\n\nexport type ReactOptions = {\n files?: string[];\n compilerRules?: boolean;\n};\n\nexport function react(options: ReactOptions = {}): Linter.Config[] {\n const files = options.files ?? [\"**/*.{jsx,tsx}\"];\n const compilerRules = options.compilerRules ?? false;\n\n const reactFlat = getPluginFlatConfigs(reactPlugin);\n const reactHooksFlat = getPluginFlatConfigs(reactHooksPlugin);\n\n const rules: Linter.RulesRecord = {\n ...getRules(reactFlat.recommended),\n ...getRules(reactFlat[\"jsx-runtime\"]),\n ...getRules(reactHooksFlat.recommended),\n ...(compilerRules ? getRules(reactHooksFlat[\"recommended-latest\"]) : {}),\n ...reactCoreRules,\n ...reactHooksRules,\n };\n\n return [\n {\n files,\n plugins: {\n react: reactPlugin,\n \"react-hooks\": reactHooksPlugin,\n },\n languageOptions: {\n parserOptions: {\n ecmaFeatures: {\n jsx: true,\n },\n },\n },\n settings: {\n react: {\n version: \"detect\",\n },\n },\n rules: {\n ...rules,\n },\n },\n ];\n}\n","import type { Linter } from \"eslint\";\n\n/**\n * Core React rules (validation, JSX, etc).\n * Disables rules that conflict with TypeScript or new React versions.\n */\nexport const reactCoreRules: Linter.RulesRecord = {\n \"react/display-name\": \"error\",\n \"react/jsx-key\": \"error\",\n \"react/jsx-no-comment-textnodes\": \"error\",\n \"react/jsx-no-duplicate-props\": \"error\",\n \"react/jsx-no-target-blank\": \"error\",\n \"react/jsx-no-undef\": \"error\",\n \"react/jsx-uses-react\": \"off\", // Not needed in React 17+\n \"react/jsx-uses-vars\": \"error\",\n \"react/no-children-prop\": \"error\",\n \"react/no-danger-with-children\": \"error\",\n \"react/no-deprecated\": \"error\",\n \"react/no-direct-mutation-state\": \"error\",\n \"react/no-find-dom-node\": \"error\",\n \"react/no-is-mounted\": \"error\",\n \"react/no-render-return-value\": \"error\",\n \"react/no-string-refs\": \"error\",\n \"react/no-unknown-property\": \"error\",\n \"react/no-unsafe\": \"off\",\n \"react/prop-types\": \"off\", // We use TypeScript\n \"react/react-in-jsx-scope\": \"off\", // Not needed in React 17+\n \"react/require-render-return\": \"error\",\n};\n","import type { Linter } from \"eslint\";\n\nexport const reactHooksRules: Linter.RulesRecord = {\n \"react-hooks/rules-of-hooks\": \"error\",\n \"react-hooks/exhaustive-deps\": \"error\",\n};\n","import { react } from \"./index\";\n\nexport const reactRecommended = react();\n","import { a11yRecommended } from \"../a11y/recommended\";\nimport { reactRecommended } from \"../react/recommended\";\nimport { nextjs } from \"./index\";\n\nexport const nextjsRecommended = [\n ...reactRecommended,\n ...a11yRecommended,\n ...nextjs(),\n];\n","import type { Linter } from \"eslint\";\nimport tseslint from \"typescript-eslint\";\n\nexport type TypescriptBaseOptions = {\n files?: string[];\n};\n\nexport function typescriptBase(\n options: TypescriptBaseOptions = {},\n): Linter.Config[] {\n const files = options.files ?? [\"**/*.{ts,tsx,mts,cts}\"];\n\n return [\n {\n files,\n plugins: {\n \"@typescript-eslint\": tseslint.plugin,\n },\n languageOptions: {\n parser: tseslint.parser,\n parserOptions: {\n ecmaVersion: \"latest\",\n sourceType: \"module\",\n },\n },\n rules: {\n \"@typescript-eslint/consistent-type-imports\": \"error\",\n \"@typescript-eslint/no-unused-vars\": \"error\",\n \"@typescript-eslint/no-shadow\": \"error\",\n \"@typescript-eslint/ban-ts-comment\": \"error\",\n \"@typescript-eslint/no-explicit-any\": \"error\",\n \"@typescript-eslint/no-inferrable-types\": \"error\",\n \"no-undef\": \"off\",\n \"no-unused-vars\": \"off\",\n \"no-var\": \"error\",\n \"prefer-const\": \"error\",\n eqeqeq: [\"error\", \"always\", { null: \"ignore\" }],\n \"no-implicit-coercion\": \"error\",\n },\n },\n ];\n}\n","import type { Linter } from \"eslint\";\nimport importPlugin from \"eslint-plugin-import\";\nimport tseslint from \"typescript-eslint\";\n\nexport type TypescriptConventionsOptions = {\n files?: string[];\n};\n\nexport function typescriptConventions(\n options: TypescriptConventionsOptions = {},\n): Linter.Config[] {\n const files = options.files ?? [\"**/*.{ts,tsx,mts,cts}\"];\n\n return [\n {\n files,\n plugins: {\n import: importPlugin,\n \"@typescript-eslint\": tseslint.plugin,\n },\n rules: {\n // 6.1 Rule table\n \"import/no-default-export\": \"error\",\n \"@typescript-eslint/consistent-type-definitions\": [\"error\", \"type\"],\n \"@typescript-eslint/consistent-type-imports\": \"error\",\n \"prefer-arrow-callback\": \"error\",\n },\n },\n // 6.2 Overrides\n {\n files: [\n \"**/*.config.{js,mjs,ts}\",\n \"**/app/**/{page,layout,template,not-found,global-error,loading,error}.tsx\",\n \"**/*.stories.tsx\",\n \"**/*.d.ts\",\n ],\n rules: {\n \"import/no-default-export\": \"off\",\n },\n },\n ];\n}\n","import comments from \"@eslint-community/eslint-plugin-eslint-comments\";\nimport type { Linter } from \"eslint\";\nimport jsdoc from \"eslint-plugin-jsdoc\";\n\nexport type TypescriptDocsOptions = {\n files?: string[];\n};\n\nexport function typescriptDocs(\n options: TypescriptDocsOptions = {},\n): Linter.Config[] {\n const files = options.files ?? [\"**/*.{ts,tsx,mts,cts}\"];\n\n return [\n {\n files,\n plugins: {\n jsdoc: jsdoc,\n \"eslint-comments\": comments,\n },\n rules: {\n \"eslint-comments/no-unused-disable\": \"error\",\n \"eslint-comments/no-unlimited-disable\": \"error\",\n \"eslint-comments/require-description\": \"error\",\n \"eslint-comments/disable-enable-pair\": \"error\",\n \"jsdoc/check-alignment\": \"error\",\n \"jsdoc/require-param\": \"error\",\n \"jsdoc/require-returns\": \"error\",\n },\n },\n ];\n}\n","import type { Linter } from \"eslint\";\nimport tseslint from \"typescript-eslint\";\n\nexport type TypescriptFunctionalOptions = {\n files?: string[];\n};\n\nconst FUNCTIONAL_RULES: Linter.RulesRecord = {\n // Type Safety\n \"@typescript-eslint/explicit-module-boundary-types\": \"warn\",\n\n // Modern Syntax\n \"@typescript-eslint/default-param-last\": \"error\",\n \"prefer-rest-params\": \"error\",\n \"prefer-spread\": \"error\",\n \"no-new-func\": \"error\",\n\n // Clean Code\n \"@typescript-eslint/no-empty-function\": \"error\",\n};\n\nexport function typescriptFunctional(\n options: TypescriptFunctionalOptions = {},\n): Linter.Config[] {\n const files = options.files ?? [\"**/*.{ts,tsx,mts,cts}\"];\n\n return [\n {\n files,\n plugins: {\n \"@typescript-eslint\": tseslint.plugin,\n },\n rules: FUNCTIONAL_RULES,\n },\n ];\n}\n","import type { Linter } from \"eslint\";\nimport importPlugin from \"eslint-plugin-import\";\nimport simpleImportSort from \"eslint-plugin-simple-import-sort\";\n\nconst IMPORTS_RULES: Linter.RulesRecord = {\n \"import/no-duplicates\": \"error\",\n \"import/no-cycle\": \"error\",\n \"import/no-mutable-exports\": \"error\",\n \"import/first\": \"error\",\n \"import/newline-after-import\": \"error\",\n \"import/no-extraneous-dependencies\": [\n \"error\",\n {\n devDependencies: [\n \"**/*.test.ts\",\n \"**/*.spec.ts\",\n \"test/**\",\n \"tests/**\",\n \"**/*.config.{js,ts,mjs}\",\n \"**/*.stories.tsx\",\n \"scripts/**\",\n \"src/configs/framework/**\",\n ],\n optionalDependencies: false,\n peerDependencies: true,\n },\n ],\n\n \"simple-import-sort/imports\": \"error\",\n \"simple-import-sort/exports\": \"error\",\n\n \"import/no-deprecated\": \"error\",\n \"no-restricted-imports\": \"off\",\n};\n\nexport type TypescriptImportsOptions = {\n files?: string[];\n};\n\nexport function typescriptImports(\n options: TypescriptImportsOptions = {},\n): Linter.Config[] {\n const files = options.files ?? [\"**/*.{ts,tsx,mts,cts}\"];\n\n return [\n {\n files,\n plugins: {\n import: importPlugin,\n \"simple-import-sort\": simpleImportSort,\n },\n settings: {\n \"import/parsers\": {\n \"@typescript-eslint/parser\": [\".ts\", \".tsx\", \".mts\", \".cts\"],\n },\n \"import/resolver\": {\n typescript: {\n alwaysTryTypes: true,\n project: [\"tsconfig.json\", \"*/tsconfig.json\"],\n },\n node: true,\n },\n },\n rules: IMPORTS_RULES,\n },\n ];\n}\n","import type { Linter } from \"eslint\";\nimport unicorn from \"eslint-plugin-unicorn\";\n\nexport type TypescriptNamingEnvOptions = {\n files?: string[];\n};\n\nconst NAMING_RULES: Linter.RulesRecord = {\n \"unicorn/filename-case\": [\n \"error\",\n {\n cases: {\n kebabCase: true,\n pascalCase: true,\n },\n ignore: [\"NEXT_\", \"README\", \"CHANGELOG\", \"LICENSE\", \"Dockerfile\", \"^_\"],\n },\n ],\n \"no-restricted-globals\": [\"error\", \"event\", \"fdescribe\"],\n};\n\nexport function typescriptNamingEnv(\n options: TypescriptNamingEnvOptions = {},\n): Linter.Config[] {\n const files = options.files ?? [\"**/*.{ts,tsx,mts,cts}\"];\n\n return [\n {\n files,\n plugins: {\n unicorn,\n },\n rules: NAMING_RULES,\n },\n ];\n}\n","import type { Linter } from \"eslint\";\nimport eslintConfigPrettier from \"eslint-config-prettier\";\n\nexport type TypescriptPrettierOptions = {\n files?: string[];\n};\n\nexport function typescriptPrettierInterop(\n options: TypescriptPrettierOptions = {},\n): Linter.Config[] {\n const files = options.files ?? [\"**/*.{ts,tsx,mts,cts}\"];\n\n return [\n {\n files,\n rules: {\n ...eslintConfigPrettier.rules,\n },\n },\n ];\n}\n","import type { Linter } from \"eslint\";\nimport regexpPlugin from \"eslint-plugin-regexp\";\nimport securityPlugin from \"eslint-plugin-security\";\n\nexport type TypescriptSecurityOptions = {\n files?: string[];\n};\n\nexport function typescriptSecurity(\n options: TypescriptSecurityOptions = {},\n): Linter.Config[] {\n const files = options.files ?? [\"**/*.{ts,tsx,mts,cts}\"];\n\n return [\n {\n files,\n plugins: {\n security: securityPlugin,\n regexp: regexpPlugin,\n },\n rules: {\n // eslint-plugin-security\n \"security/detect-object-injection\": \"error\",\n \"security/detect-unsafe-regex\": \"error\",\n\n // eslint-plugin-regexp\n \"regexp/no-super-linear-backtracking\": \"error\",\n \"regexp/no-useless-escape\": \"error\",\n \"regexp/no-empty-capturing-group\": \"error\",\n },\n },\n ];\n}\n","import type { Linter } from \"eslint\";\n\nexport type TypescriptSizeComplexityOptions = {\n files?: string[];\n};\n\nexport function typescriptSizeComplexity(\n options: TypescriptSizeComplexityOptions = {},\n): Linter.Config[] {\n const files = options.files ?? [\"**/*.{ts,tsx,mts,cts}\"];\n\n return [\n {\n files,\n rules: {\n \"max-lines\": [\n \"error\",\n { max: 100, skipBlankLines: true, skipComments: true },\n ],\n \"max-lines-per-function\": [\n \"error\",\n { max: 50, skipBlankLines: true, skipComments: true },\n ],\n complexity: [\"error\", 15],\n \"max-params\": [\"error\", 3],\n \"max-depth\": [\"error\", 4],\n \"no-var\": \"error\",\n \"prefer-const\": \"warn\",\n },\n },\n ];\n}\n","import type { Linter } from \"eslint\";\nimport tseslint from \"typescript-eslint\";\n\nexport type TypescriptTypeAwareOptions = {\n /**\n * Type-aware linting requires a project TSConfig.\n * Example: \"./tsconfig.json\".\n */\n tsconfigPath?: string | string[];\n\n /**\n * tsconfigRootDir should usually be import.meta.dirname from the consumer repo.\n */\n tsconfigRootDir?: string;\n\n files?: string[];\n};\n\nexport function typescriptTypeAware(\n options: TypescriptTypeAwareOptions = {},\n): Linter.Config[] {\n const files = options.files ?? [\"**/*.{ts,tsx,mts,cts}\"];\n\n return [\n {\n files,\n plugins: {\n \"@typescript-eslint\": tseslint.plugin,\n },\n languageOptions: {\n parserOptions: {\n project: options.tsconfigPath ?? \"./tsconfig.json\",\n tsconfigRootDir: options.tsconfigRootDir,\n },\n },\n rules: {\n \"@typescript-eslint/no-unsafe-assignment\": \"error\",\n \"@typescript-eslint/no-unsafe-argument\": \"error\",\n \"@typescript-eslint/no-unsafe-call\": \"error\",\n \"@typescript-eslint/no-unsafe-member-access\": \"error\",\n \"@typescript-eslint/no-unsafe-return\": \"error\",\n \"@typescript-eslint/require-await\": \"error\",\n \"@typescript-eslint/no-floating-promises\": \"error\",\n \"@typescript-eslint/no-misused-promises\": \"error\",\n \"@typescript-eslint/await-thenable\": \"error\",\n \"@typescript-eslint/no-unnecessary-condition\": \"warn\",\n \"@typescript-eslint/no-unnecessary-type-assertion\": \"error\",\n \"@typescript-eslint/restrict-template-expressions\": \"error\",\n \"@typescript-eslint/prefer-nullish-coalescing\": \"error\",\n \"@typescript-eslint/prefer-optional-chain\": \"error\",\n \"@typescript-eslint/switch-exhaustiveness-check\": \"error\",\n \"@typescript-eslint/no-deprecated\": \"error\",\n \"@typescript-eslint/consistent-type-exports\": \"error\",\n },\n },\n ];\n}\n","import type { Linter } from \"eslint\";\n\nimport { typescriptBase } from \"./builders/base.js\";\n\nexport type TypescriptConfigFiles = string[];\n\nexport type TypescriptMinimalOptions = {\n files?: TypescriptConfigFiles;\n};\n\n/**\n * MVP TypeScript profile.\n *\n * Intentionally minimal: enables TypeScript parsing and one rule to prove\n * end-to-end packaging + consumption.\n * @param options - Configuration options.\n * @returns The ESLint configuration.\n */\nexport function typescriptMinimal(\n options: TypescriptMinimalOptions = {},\n): Linter.Config[] {\n return typescriptBase(options);\n}\n","import type { Linter } from \"eslint\";\nimport tseslint from \"typescript-eslint\";\n\nimport { typescriptBase } from \"./builders/base.js\";\nimport { typescriptConventions } from \"./builders/conventions.js\";\nimport { typescriptDocs } from \"./builders/docs.js\";\nimport { typescriptFunctional } from \"./builders/functional.js\";\nimport { typescriptImports } from \"./builders/imports.js\";\nimport { typescriptNamingEnv } from \"./builders/naming-env.js\";\nimport { typescriptQuality } from \"./builders/quality.js\";\nimport { typescriptSecurity } from \"./builders/security.js\";\nimport { typescriptSizeComplexity } from \"./builders/size-complexity.js\";\nimport { typescriptTypeAware } from \"./builders/type-aware.js\";\n\nexport type TypescriptRecommendedOptions = {\n /**\n * When set, enables type-aware rules (more powerful, can be slower).\n *\n * Recommended for mature codebases, but not required for MVP.\n */\n typeChecked?: boolean;\n\n /**\n * Type-aware linting requires a project TSConfig.\n * Example: \"./tsconfig.json\".\n */\n tsconfigPath?: string | string[];\n\n /**\n * tsconfigRootDir should usually be import.meta.dirname from the consumer repo.\n */\n tsconfigRootDir?: string;\n\n files?: string[];\n\n /**\n * When true (default), enables strict conventions (e.g. no default exports).\n */\n enableConventions?: boolean;\n};\n\nexport function typescriptRecommended(\n options: TypescriptRecommendedOptions = {},\n): Linter.Config[] {\n const files = options.files ?? [\"**/*.{ts,tsx,mts,cts}\"];\n const enableConventions = options.enableConventions ?? true;\n\n const upstreamConfigs = (\n options.typeChecked\n ? tseslint.configs.recommendedTypeChecked\n : tseslint.configs.recommended\n ) as Linter.Config[];\n\n const typeAwareConfig: Linter.Config[] = options.typeChecked\n ? typescriptTypeAware({\n files,\n tsconfigPath: options.tsconfigPath,\n tsconfigRootDir: options.tsconfigRootDir,\n })\n : [];\n\n const conventionsConfig: Linter.Config[] = enableConventions\n ? typescriptConventions({ files })\n : [];\n\n return [\n ...typescriptBase({ files }),\n ...typescriptQuality({ files }),\n ...typescriptImports({ files }),\n ...typescriptSecurity({ files }),\n ...typescriptNamingEnv({ files }),\n ...typescriptFunctional({ files }),\n ...typescriptDocs({ files }),\n ...typescriptSizeComplexity({ files }),\n ...conventionsConfig,\n ...typeAwareConfig,\n ...(upstreamConfigs.map((config) => ({\n ...config,\n files,\n })) as Linter.Config[]),\n ];\n}\n","import type { Linter } from \"eslint\";\nimport sonarjs from \"eslint-plugin-sonarjs\";\nimport unicorn from \"eslint-plugin-unicorn\";\n\nexport type TypescriptQualityOptions = {\n files?: string[];\n};\n\nconst UNICORN_ABBREVIATIONS = {\n allowList: {\n Props: true,\n props: true,\n Ref: true,\n ref: true,\n Src: true,\n src: true,\n Params: true,\n params: true,\n Env: true,\n env: true,\n Args: true,\n args: true,\n Docs: true,\n docs: true,\n arg: true,\n err: true,\n req: true,\n res: true,\n ctx: true,\n val: true,\n },\n};\n\nexport function typescriptQuality(\n options: TypescriptQualityOptions = {},\n): Linter.Config[] {\n const files = options.files ?? [\"**/*.{ts,tsx,mts,cts}\"];\n\n return [\n {\n files,\n plugins: {\n unicorn,\n sonarjs,\n },\n rules: {\n // Unicorn\n \"unicorn/prefer-node-protocol\": \"error\",\n \"unicorn/no-useless-undefined\": \"error\",\n \"unicorn/no-lonely-if\": \"error\",\n \"unicorn/prefer-optional-catch-binding\": \"error\",\n \"unicorn/prefer-string-replace-all\": \"error\",\n \"unicorn/prevent-abbreviations\": [\"warn\", UNICORN_ABBREVIATIONS],\n\n // Best Practices\n \"consistent-return\": \"error\",\n \"no-implicit-coercion\": \"error\",\n\n // SonarJS\n \"sonarjs/cognitive-complexity\": [\"error\", 15],\n \"sonarjs/no-identical-functions\": \"error\",\n \"sonarjs/no-duplicated-branches\": \"error\",\n \"sonarjs/no-redundant-boolean\": \"error\",\n \"sonarjs/no-inverted-boolean-check\": \"error\",\n },\n },\n ];\n}\n","import type { ESLint } from \"eslint\";\n\n/**\n * Placeholder for future custom rules.\n *\n * Exporting a plugin object now keeps the package structure stable as you add\n * domain-specific rules later.\n */\nexport const plugin: ESLint.Plugin = {\n rules: {},\n};\n"],"mappings":";AACA,OAAO,mBAAmB;;;ACCnB,IAAM,eAAmC;AAAA,EAC9C,qBAAqB;AAAA,EACrB,+BAA+B;AAAA,EAC/B,4BAA4B;AAAA,EAC5B,+CAA+C;AAAA,EAC/C,uBAAuB;AAAA,EACvB,2BAA2B;AAAA,EAC3B,sBAAsB;AAAA,EACtB,sCAAsC;AAAA,EACtC,+BAA+B;AAAA,EAC/B,yCAAyC;AAAA,EACzC,yCAAyC;AAAA,EACzC,gCAAgC;AAAA,EAChC,0BAA0B;AAAA,EAC1B,6BAA6B;AAAA,EAC7B,8BAA8B;AAAA,EAC9B,uCAAuC;AAAA,EACvC,yCAAyC;AAAA,EACzC,8BAA8B;AAAA,EAC9B,yCAAyC;AAAA,EACzC,0BAA0B;AAAA,EAC1B,yBAAyB;AAAA,EACzB,oCAAoC;AAAA,EACpC,0DAA0D;AAAA,IACxD;AAAA,IACA;AAAA,MACE,IAAI,CAAC,QAAQ,cAAc;AAAA,IAC7B;AAAA,EACF;AAAA,EACA,mDAAmD;AAAA,IACjD;AAAA,IACA;AAAA,MACE,UAAU;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA,0DAA0D;AAAA,IACxD;AAAA,IACA;AAAA,MACE,IAAI;AAAA,QACF;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,IAAI;AAAA,QACF;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,IAAI,CAAC,YAAY,UAAU,OAAO,OAAO,UAAU;AAAA,MACnD,OAAO,CAAC,MAAM;AAAA,MACd,IAAI,CAAC,UAAU;AAAA,IACjB;AAAA,EACF;AAAA,EACA,uCAAuC;AAAA,IACrC;AAAA,IACA;AAAA,MACE,MAAM,CAAC;AAAA,MACP,OAAO,CAAC,UAAU;AAAA,IACpB;AAAA,EACF;AAAA,EACA,+BAA+B;AAAA,EAC/B,2CAA2C;AAAA,EAC3C,yCAAyC;AAAA,EACzC,qCAAqC;AAAA,EACrC,kBAAkB;AAAA,EAClB,iCAAiC;AACnC;;;AD1EO,SAAS,KAAK,UAAuB,CAAC,GAAoB;AAC/D,QAAM,QAAQ,QAAQ,SAAS;AAAA,IAC7B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,MACE;AAAA,MACA,SAAS;AAAA,QACP,YAAY;AAAA,MACd;AAAA,MACA,OAAO;AAAA,QACL,GAAG;AAAA,MACL;AAAA,IACF;AAAA,EACF;AACF;;;AE3BO,IAAM,kBAAkB,KAAK;;;ACFpC,OAAO,gBAAgB;AAShB,SAAS,OAAO,UAAyB,CAAC,GAAoB;AACnE,QAAM,QAAQ,QAAQ,SAAS,CAAC,sBAAsB;AACtD,QAAM,kBAAkB,QAAQ,iBAAiB;AAEjD,QAAMA,UAAS;AAOf,QAAM,QAA4B,kBAC9B;AAAA,IACE,GAAGA,QAAO,QAAQ,YAAY;AAAA,IAC9B,GAAGA,QAAO,QAAQ,iBAAiB,EAAE;AAAA,EACvC,IACA;AAAA,IACE,GAAGA,QAAO,QAAQ,YAAY;AAAA,EAChC;AAEJ,MAAI,iBAAiB;AACnB,UAAM,sCAAsC,IAAI;AAChD,UAAM,2BAA2B,IAAI;AAAA,EACvC;AAEA,SAAO;AAAA,IACL;AAAA,MACE;AAAA,MACA,SAAS;AAAA,QACP,cAAc;AAAA,MAChB;AAAA,MACA,UAAU;AAAA,QACR,MAAM;AAAA,UACJ,SAAS,QAAQ;AAAA,QACnB;AAAA,MACF;AAAA,MACA,OAAO;AAAA,QACL,GAAG;AAAA,MACL;AAAA,IACF;AAAA,EACF;AACF;;;ACjDA,OAAO,kBAAkB;AAelB,SAAS,uBACd,SACiB;AACjB,QAAM,QAAQ,QAAQ,SAAS,CAAC,eAAe;AAE/C,SAAO;AAAA,IACL;AAAA,MACE;AAAA,MACA,SAAS;AAAA,QACP,QAAQ;AAAA,MACV;AAAA,MACA,OAAO;AAAA,QACL,8BAA8B;AAAA,UAC5B;AAAA,UACA;AAAA,YACE,UAAU,QAAQ;AAAA,YAClB,OAAO,QAAQ;AAAA,UACjB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;ACrCA,OAAO,iBAAiB;AACxB,OAAO,sBAAsB;;;ACItB,IAAM,iBAAqC;AAAA,EAChD,sBAAsB;AAAA,EACtB,iBAAiB;AAAA,EACjB,kCAAkC;AAAA,EAClC,gCAAgC;AAAA,EAChC,6BAA6B;AAAA,EAC7B,sBAAsB;AAAA,EACtB,wBAAwB;AAAA;AAAA,EACxB,uBAAuB;AAAA,EACvB,0BAA0B;AAAA,EAC1B,iCAAiC;AAAA,EACjC,uBAAuB;AAAA,EACvB,kCAAkC;AAAA,EAClC,0BAA0B;AAAA,EAC1B,uBAAuB;AAAA,EACvB,gCAAgC;AAAA,EAChC,wBAAwB;AAAA,EACxB,6BAA6B;AAAA,EAC7B,mBAAmB;AAAA,EACnB,oBAAoB;AAAA;AAAA,EACpB,4BAA4B;AAAA;AAAA,EAC5B,+BAA+B;AACjC;;;AC1BO,IAAM,kBAAsC;AAAA,EACjD,8BAA8B;AAAA,EAC9B,+BAA+B;AACjC;;;AFEA,SAAS,SAAS,OAAyC;AACzD,MAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C,WAAO,CAAC;AAAA,EACV;AAEA,SAAO;AACT;AAEA,SAAS,qBAAqBC,SAA0C;AACtE,QAAM,eAAe,SAASA,OAAM;AACpC,QAAM,gBAAgB,SAAS,aAAa,OAAO;AACnD,SAAO,SAAS,cAAc,IAAI;AACpC;AAEA,SAAS,SAAS,QAAqC;AACrD,QAAM,eAAe,SAAS,MAAM;AACpC,QAAM,QAAQ,aAAa;AAE3B,MAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C,WAAO,CAAC;AAAA,EACV;AAEA,SAAO;AACT;AAOO,SAAS,MAAM,UAAwB,CAAC,GAAoB;AACjE,QAAM,QAAQ,QAAQ,SAAS,CAAC,gBAAgB;AAChD,QAAM,gBAAgB,QAAQ,iBAAiB;AAE/C,QAAM,YAAY,qBAAqB,WAAW;AAClD,QAAM,iBAAiB,qBAAqB,gBAAgB;AAE5D,QAAM,QAA4B;AAAA,IAChC,GAAG,SAAS,UAAU,WAAW;AAAA,IACjC,GAAG,SAAS,UAAU,aAAa,CAAC;AAAA,IACpC,GAAG,SAAS,eAAe,WAAW;AAAA,IACtC,GAAI,gBAAgB,SAAS,eAAe,oBAAoB,CAAC,IAAI,CAAC;AAAA,IACtE,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AAEA,SAAO;AAAA,IACL;AAAA,MACE;AAAA,MACA,SAAS;AAAA,QACP,OAAO;AAAA,QACP,eAAe;AAAA,MACjB;AAAA,MACA,iBAAiB;AAAA,QACf,eAAe;AAAA,UACb,cAAc;AAAA,YACZ,KAAK;AAAA,UACP;AAAA,QACF;AAAA,MACF;AAAA,MACA,UAAU;AAAA,QACR,OAAO;AAAA,UACL,SAAS;AAAA,QACX;AAAA,MACF;AAAA,MACA,OAAO;AAAA,QACL,GAAG;AAAA,MACL;AAAA,IACF;AAAA,EACF;AACF;;;AG3EO,IAAM,mBAAmB,MAAM;;;ACE/B,IAAM,oBAAoB;AAAA,EAC/B,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG,OAAO;AACZ;;;ACPA,OAAO,cAAc;AAMd,SAAS,eACd,UAAiC,CAAC,GACjB;AACjB,QAAM,QAAQ,QAAQ,SAAS,CAAC,uBAAuB;AAEvD,SAAO;AAAA,IACL;AAAA,MACE;AAAA,MACA,SAAS;AAAA,QACP,sBAAsB,SAAS;AAAA,MACjC;AAAA,MACA,iBAAiB;AAAA,QACf,QAAQ,SAAS;AAAA,QACjB,eAAe;AAAA,UACb,aAAa;AAAA,UACb,YAAY;AAAA,QACd;AAAA,MACF;AAAA,MACA,OAAO;AAAA,QACL,8CAA8C;AAAA,QAC9C,qCAAqC;AAAA,QACrC,gCAAgC;AAAA,QAChC,qCAAqC;AAAA,QACrC,sCAAsC;AAAA,QACtC,0CAA0C;AAAA,QAC1C,YAAY;AAAA,QACZ,kBAAkB;AAAA,QAClB,UAAU;AAAA,QACV,gBAAgB;AAAA,QAChB,QAAQ,CAAC,SAAS,UAAU,EAAE,MAAM,SAAS,CAAC;AAAA,QAC9C,wBAAwB;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AACF;;;ACxCA,OAAOC,mBAAkB;AACzB,OAAOC,eAAc;AAMd,SAAS,sBACd,UAAwC,CAAC,GACxB;AACjB,QAAM,QAAQ,QAAQ,SAAS,CAAC,uBAAuB;AAEvD,SAAO;AAAA,IACL;AAAA,MACE;AAAA,MACA,SAAS;AAAA,QACP,QAAQD;AAAA,QACR,sBAAsBC,UAAS;AAAA,MACjC;AAAA,MACA,OAAO;AAAA;AAAA,QAEL,4BAA4B;AAAA,QAC5B,kDAAkD,CAAC,SAAS,MAAM;AAAA,QAClE,8CAA8C;AAAA,QAC9C,yBAAyB;AAAA,MAC3B;AAAA,IACF;AAAA;AAAA,IAEA;AAAA,MACE,OAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAO;AAAA,QACL,4BAA4B;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AACF;;;ACzCA,OAAO,cAAc;AAErB,OAAO,WAAW;AAMX,SAAS,eACd,UAAiC,CAAC,GACjB;AACjB,QAAM,QAAQ,QAAQ,SAAS,CAAC,uBAAuB;AAEvD,SAAO;AAAA,IACL;AAAA,MACE;AAAA,MACA,SAAS;AAAA,QACP;AAAA,QACA,mBAAmB;AAAA,MACrB;AAAA,MACA,OAAO;AAAA,QACL,qCAAqC;AAAA,QACrC,wCAAwC;AAAA,QACxC,uCAAuC;AAAA,QACvC,uCAAuC;AAAA,QACvC,yBAAyB;AAAA,QACzB,uBAAuB;AAAA,QACvB,yBAAyB;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AACF;;;AC9BA,OAAOC,eAAc;AAMrB,IAAM,mBAAuC;AAAA;AAAA,EAE3C,qDAAqD;AAAA;AAAA,EAGrD,yCAAyC;AAAA,EACzC,sBAAsB;AAAA,EACtB,iBAAiB;AAAA,EACjB,eAAe;AAAA;AAAA,EAGf,wCAAwC;AAC1C;AAEO,SAAS,qBACd,UAAuC,CAAC,GACvB;AACjB,QAAM,QAAQ,QAAQ,SAAS,CAAC,uBAAuB;AAEvD,SAAO;AAAA,IACL;AAAA,MACE;AAAA,MACA,SAAS;AAAA,QACP,sBAAsBA,UAAS;AAAA,MACjC;AAAA,MACA,OAAO;AAAA,IACT;AAAA,EACF;AACF;;;AClCA,OAAOC,mBAAkB;AACzB,OAAO,sBAAsB;AAE7B,IAAM,gBAAoC;AAAA,EACxC,wBAAwB;AAAA,EACxB,mBAAmB;AAAA,EACnB,6BAA6B;AAAA,EAC7B,gBAAgB;AAAA,EAChB,+BAA+B;AAAA,EAC/B,qCAAqC;AAAA,IACnC;AAAA,IACA;AAAA,MACE,iBAAiB;AAAA,QACf;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,sBAAsB;AAAA,MACtB,kBAAkB;AAAA,IACpB;AAAA,EACF;AAAA,EAEA,8BAA8B;AAAA,EAC9B,8BAA8B;AAAA,EAE9B,wBAAwB;AAAA,EACxB,yBAAyB;AAC3B;AAMO,SAAS,kBACd,UAAoC,CAAC,GACpB;AACjB,QAAM,QAAQ,QAAQ,SAAS,CAAC,uBAAuB;AAEvD,SAAO;AAAA,IACL;AAAA,MACE;AAAA,MACA,SAAS;AAAA,QACP,QAAQA;AAAA,QACR,sBAAsB;AAAA,MACxB;AAAA,MACA,UAAU;AAAA,QACR,kBAAkB;AAAA,UAChB,6BAA6B,CAAC,OAAO,QAAQ,QAAQ,MAAM;AAAA,QAC7D;AAAA,QACA,mBAAmB;AAAA,UACjB,YAAY;AAAA,YACV,gBAAgB;AAAA,YAChB,SAAS,CAAC,iBAAiB,iBAAiB;AAAA,UAC9C;AAAA,UACA,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA,OAAO;AAAA,IACT;AAAA,EACF;AACF;;;ACjEA,OAAO,aAAa;AAMpB,IAAM,eAAmC;AAAA,EACvC,yBAAyB;AAAA,IACvB;AAAA,IACA;AAAA,MACE,OAAO;AAAA,QACL,WAAW;AAAA,QACX,YAAY;AAAA,MACd;AAAA,MACA,QAAQ,CAAC,SAAS,UAAU,aAAa,WAAW,cAAc,IAAI;AAAA,IACxE;AAAA,EACF;AAAA,EACA,yBAAyB,CAAC,SAAS,SAAS,WAAW;AACzD;AAEO,SAAS,oBACd,UAAsC,CAAC,GACtB;AACjB,QAAM,QAAQ,QAAQ,SAAS,CAAC,uBAAuB;AAEvD,SAAO;AAAA,IACL;AAAA,MACE;AAAA,MACA,SAAS;AAAA,QACP;AAAA,MACF;AAAA,MACA,OAAO;AAAA,IACT;AAAA,EACF;AACF;;;AClCA,OAAO,0BAA0B;AAM1B,SAAS,0BACd,UAAqC,CAAC,GACrB;AACjB,QAAM,QAAQ,QAAQ,SAAS,CAAC,uBAAuB;AAEvD,SAAO;AAAA,IACL;AAAA,MACE;AAAA,MACA,OAAO;AAAA,QACL,GAAG,qBAAqB;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AACF;;;ACnBA,OAAO,kBAAkB;AACzB,OAAO,oBAAoB;AAMpB,SAAS,mBACd,UAAqC,CAAC,GACrB;AACjB,QAAM,QAAQ,QAAQ,SAAS,CAAC,uBAAuB;AAEvD,SAAO;AAAA,IACL;AAAA,MACE;AAAA,MACA,SAAS;AAAA,QACP,UAAU;AAAA,QACV,QAAQ;AAAA,MACV;AAAA,MACA,OAAO;AAAA;AAAA,QAEL,oCAAoC;AAAA,QACpC,gCAAgC;AAAA;AAAA,QAGhC,uCAAuC;AAAA,QACvC,4BAA4B;AAAA,QAC5B,mCAAmC;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AACF;;;AC1BO,SAAS,yBACd,UAA2C,CAAC,GAC3B;AACjB,QAAM,QAAQ,QAAQ,SAAS,CAAC,uBAAuB;AAEvD,SAAO;AAAA,IACL;AAAA,MACE;AAAA,MACA,OAAO;AAAA,QACL,aAAa;AAAA,UACX;AAAA,UACA,EAAE,KAAK,KAAK,gBAAgB,MAAM,cAAc,KAAK;AAAA,QACvD;AAAA,QACA,0BAA0B;AAAA,UACxB;AAAA,UACA,EAAE,KAAK,IAAI,gBAAgB,MAAM,cAAc,KAAK;AAAA,QACtD;AAAA,QACA,YAAY,CAAC,SAAS,EAAE;AAAA,QACxB,cAAc,CAAC,SAAS,CAAC;AAAA,QACzB,aAAa,CAAC,SAAS,CAAC;AAAA,QACxB,UAAU;AAAA,QACV,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AACF;;;AC9BA,OAAOC,eAAc;AAiBd,SAAS,oBACd,UAAsC,CAAC,GACtB;AACjB,QAAM,QAAQ,QAAQ,SAAS,CAAC,uBAAuB;AAEvD,SAAO;AAAA,IACL;AAAA,MACE;AAAA,MACA,SAAS;AAAA,QACP,sBAAsBA,UAAS;AAAA,MACjC;AAAA,MACA,iBAAiB;AAAA,QACf,eAAe;AAAA,UACb,SAAS,QAAQ,gBAAgB;AAAA,UACjC,iBAAiB,QAAQ;AAAA,QAC3B;AAAA,MACF;AAAA,MACA,OAAO;AAAA,QACL,2CAA2C;AAAA,QAC3C,yCAAyC;AAAA,QACzC,qCAAqC;AAAA,QACrC,8CAA8C;AAAA,QAC9C,uCAAuC;AAAA,QACvC,oCAAoC;AAAA,QACpC,2CAA2C;AAAA,QAC3C,0CAA0C;AAAA,QAC1C,qCAAqC;AAAA,QACrC,+CAA+C;AAAA,QAC/C,oDAAoD;AAAA,QACpD,oDAAoD;AAAA,QACpD,gDAAgD;AAAA,QAChD,4CAA4C;AAAA,QAC5C,kDAAkD;AAAA,QAClD,oCAAoC;AAAA,QACpC,8CAA8C;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AACF;;;ACtCO,SAAS,kBACd,UAAoC,CAAC,GACpB;AACjB,SAAO,eAAe,OAAO;AAC/B;;;ACrBA,OAAOC,eAAc;;;ACArB,OAAO,aAAa;AACpB,OAAOC,cAAa;AAMpB,IAAM,wBAAwB;AAAA,EAC5B,WAAW;AAAA,IACT,OAAO;AAAA,IACP,OAAO;AAAA,IACP,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,KAAK;AAAA,IACL,KAAK;AAAA,IACL,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,EACP;AACF;AAEO,SAAS,kBACd,UAAoC,CAAC,GACpB;AACjB,QAAM,QAAQ,QAAQ,SAAS,CAAC,uBAAuB;AAEvD,SAAO;AAAA,IACL;AAAA,MACE;AAAA,MACA,SAAS;AAAA,QACP,SAAAA;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAO;AAAA;AAAA,QAEL,gCAAgC;AAAA,QAChC,gCAAgC;AAAA,QAChC,wBAAwB;AAAA,QACxB,yCAAyC;AAAA,QACzC,qCAAqC;AAAA,QACrC,iCAAiC,CAAC,QAAQ,qBAAqB;AAAA;AAAA,QAG/D,qBAAqB;AAAA,QACrB,wBAAwB;AAAA;AAAA,QAGxB,gCAAgC,CAAC,SAAS,EAAE;AAAA,QAC5C,kCAAkC;AAAA,QAClC,kCAAkC;AAAA,QAClC,gCAAgC;AAAA,QAChC,qCAAqC;AAAA,MACvC;AAAA,IACF;AAAA,EACF;AACF;;;AD1BO,SAAS,sBACd,UAAwC,CAAC,GACxB;AACjB,QAAM,QAAQ,QAAQ,SAAS,CAAC,uBAAuB;AACvD,QAAM,oBAAoB,QAAQ,qBAAqB;AAEvD,QAAM,kBACJ,QAAQ,cACJC,UAAS,QAAQ,yBACjBA,UAAS,QAAQ;AAGvB,QAAM,kBAAmC,QAAQ,cAC7C,oBAAoB;AAAA,IAClB;AAAA,IACA,cAAc,QAAQ;AAAA,IACtB,iBAAiB,QAAQ;AAAA,EAC3B,CAAC,IACD,CAAC;AAEL,QAAM,oBAAqC,oBACvC,sBAAsB,EAAE,MAAM,CAAC,IAC/B,CAAC;AAEL,SAAO;AAAA,IACL,GAAG,eAAe,EAAE,MAAM,CAAC;AAAA,IAC3B,GAAG,kBAAkB,EAAE,MAAM,CAAC;AAAA,IAC9B,GAAG,kBAAkB,EAAE,MAAM,CAAC;AAAA,IAC9B,GAAG,mBAAmB,EAAE,MAAM,CAAC;AAAA,IAC/B,GAAG,oBAAoB,EAAE,MAAM,CAAC;AAAA,IAChC,GAAG,qBAAqB,EAAE,MAAM,CAAC;AAAA,IACjC,GAAG,eAAe,EAAE,MAAM,CAAC;AAAA,IAC3B,GAAG,yBAAyB,EAAE,MAAM,CAAC;AAAA,IACrC,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAI,gBAAgB,IAAI,CAAC,YAAY;AAAA,MACnC,GAAG;AAAA,MACH;AAAA,IACF,EAAE;AAAA,EACJ;AACF;;;AEzEO,IAAM,SAAwB;AAAA,EACnC,OAAO,CAAC;AACV;","names":["plugin","plugin","importPlugin","tseslint","tseslint","importPlugin","tseslint","tseslint","unicorn","tseslint"]}
|
package/package.json
CHANGED