@stride.it/appoint-lint-governance 0.1.31 → 0.1.33
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 +78 -3
- package/dist/index.d.ts +52 -50
- package/dist/index.js +282 -124
- package/dist/index.js.map +1 -1
- package/package.json +4 -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`\
|
|
@@ -86,6 +97,8 @@ export default [
|
|
|
86
97
|
typeChecked: true,
|
|
87
98
|
tsconfigPath: "./tsconfig.json",
|
|
88
99
|
tsconfigRootDir: import.meta.dirname,
|
|
100
|
+
// Optional: fail CI on deprecated APIs surfaced by type definitions
|
|
101
|
+
reportDeprecated: true,
|
|
89
102
|
}),
|
|
90
103
|
];
|
|
91
104
|
```
|
|
@@ -100,6 +113,68 @@ const tsconfigRootDir = fileURLToPath(new URL(".", import.meta.url));
|
|
|
100
113
|
|
|
101
114
|
Then pass `tsconfigRootDir` into `typescriptRecommended({ ... })`.
|
|
102
115
|
|
|
116
|
+
## Framework domain examples (React / A11y / Next.js)
|
|
117
|
+
|
|
118
|
+
### A) Domain linting (simple): Next.js preset
|
|
119
|
+
|
|
120
|
+
Use this when you want “framework linting” as a single preset. This includes **React + A11y + Next.js** rules.
|
|
121
|
+
|
|
122
|
+
```js
|
|
123
|
+
import { nextjsRecommended, typescriptRecommended } from "@stride.it/appoint-lint-governance";
|
|
124
|
+
|
|
125
|
+
export default [
|
|
126
|
+
...typescriptRecommended({
|
|
127
|
+
typeChecked: true,
|
|
128
|
+
tsconfigPath: "./tsconfig.json",
|
|
129
|
+
tsconfigRootDir: import.meta.dirname,
|
|
130
|
+
}),
|
|
131
|
+
...nextjsRecommended,
|
|
132
|
+
];
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### B) Domain linting (explicit): one line per domain
|
|
136
|
+
|
|
137
|
+
Use this when you want React / A11y / Next.js as separate “domain lines”.
|
|
138
|
+
|
|
139
|
+
Important: do **not** use `nextjsRecommended` together with `reactRecommended` and `a11yRecommended` (it would duplicate rules).
|
|
140
|
+
|
|
141
|
+
```js
|
|
142
|
+
import {
|
|
143
|
+
a11yRecommended,
|
|
144
|
+
nextjs,
|
|
145
|
+
reactRecommended,
|
|
146
|
+
typescriptRecommended,
|
|
147
|
+
} from "@stride.it/appoint-lint-governance";
|
|
148
|
+
|
|
149
|
+
export default [
|
|
150
|
+
...typescriptRecommended({
|
|
151
|
+
typeChecked: true,
|
|
152
|
+
tsconfigPath: "./tsconfig.json",
|
|
153
|
+
tsconfigRootDir: import.meta.dirname,
|
|
154
|
+
}),
|
|
155
|
+
...reactRecommended,
|
|
156
|
+
...a11yRecommended,
|
|
157
|
+
...nextjs(),
|
|
158
|
+
];
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
### C) Running domains independently (separate configs)
|
|
162
|
+
|
|
163
|
+
Flat config is a single array, but you can run “per-domain” by creating multiple config files and selecting them with `eslint --config`.
|
|
164
|
+
|
|
165
|
+
Example scripts:
|
|
166
|
+
|
|
167
|
+
```json
|
|
168
|
+
{
|
|
169
|
+
"scripts": {
|
|
170
|
+
"lint:ts": "eslint --config ./eslint.typescript-only.config.mjs \"src/**/*.{ts,tsx}\"",
|
|
171
|
+
"lint:react": "eslint --config ./eslint.react-only.config.mjs \"src/**/*.{tsx,jsx}\"",
|
|
172
|
+
"lint:a11y": "eslint --config ./eslint.a11y-only.config.mjs \"src/**/*.{tsx,jsx}\"",
|
|
173
|
+
"lint:next": "eslint --config ./eslint.nextjs-only.config.mjs \"src/**/*.{tsx,jsx}\""
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
```
|
|
177
|
+
|
|
103
178
|
## Prettier interop (optional)
|
|
104
179
|
|
|
105
180
|
If your project uses Prettier, include the interop preset last so it can override earlier formatting rules:
|
package/dist/index.d.ts
CHANGED
|
@@ -1,57 +1,53 @@
|
|
|
1
|
-
import * as eslint from 'eslint';
|
|
2
1
|
import { Linter, ESLint } from 'eslint';
|
|
3
2
|
|
|
4
3
|
type A11yOptions = {
|
|
5
4
|
files?: string[];
|
|
5
|
+
ignores?: string[];
|
|
6
6
|
};
|
|
7
7
|
declare function a11y(options?: A11yOptions): Linter.Config[];
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
* @fileoverview Shared types for ESLint Core.
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* The human readable severity level used in a configuration.
|
|
15
|
-
*/
|
|
16
|
-
type SeverityName = "off" | "warn" | "error";
|
|
17
|
-
/**
|
|
18
|
-
* The numeric severity level for a rule.
|
|
19
|
-
*
|
|
20
|
-
* - `0` means off.
|
|
21
|
-
* - `1` means warn.
|
|
22
|
-
* - `2` means error.
|
|
23
|
-
*/
|
|
24
|
-
type SeverityLevel = 0 | 1 | 2;
|
|
25
|
-
/**
|
|
26
|
-
* The severity of a rule in a configuration.
|
|
27
|
-
*/
|
|
28
|
-
type Severity = SeverityName | SeverityLevel;
|
|
29
|
-
/**
|
|
30
|
-
* The configuration for a rule.
|
|
31
|
-
*/
|
|
32
|
-
type RuleConfig<RuleOptions extends unknown[] = unknown[]> = Severity | [Severity, ...Partial<RuleOptions>];
|
|
33
|
-
/**
|
|
34
|
-
* A collection of rules and their configurations.
|
|
35
|
-
*/
|
|
36
|
-
interface RulesConfig {
|
|
37
|
-
[key: string]: RuleConfig;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
declare const a11yRecommended: eslint.Linter.Config<RulesConfig>[];
|
|
9
|
+
declare const a11yRecommended: Linter.Config[];
|
|
41
10
|
|
|
42
11
|
type NextjsOptions = {
|
|
43
12
|
files?: string[];
|
|
13
|
+
ignores?: string[];
|
|
14
|
+
coreWebVitals?: boolean;
|
|
15
|
+
rootDir?: string | string[];
|
|
44
16
|
};
|
|
45
17
|
declare function nextjs(options?: NextjsOptions): Linter.Config[];
|
|
46
18
|
|
|
47
|
-
|
|
19
|
+
type ImportZone = {
|
|
20
|
+
target: string | string[];
|
|
21
|
+
from: string | string[];
|
|
22
|
+
except?: string[];
|
|
23
|
+
message: string;
|
|
24
|
+
};
|
|
25
|
+
type NextjsBoundariesOptions = {
|
|
26
|
+
files?: string[];
|
|
27
|
+
basePath: string;
|
|
28
|
+
zones: ImportZone[];
|
|
29
|
+
};
|
|
30
|
+
declare function nextjsImportBoundaries(options: NextjsBoundariesOptions): Linter.Config[];
|
|
31
|
+
|
|
32
|
+
declare const nextjsRecommended: Linter.Config[];
|
|
33
|
+
|
|
34
|
+
type NextjsRecommendedIsolatedOptions = {
|
|
35
|
+
routeFiles?: string[];
|
|
36
|
+
uiFiles?: string[];
|
|
37
|
+
routeIgnores?: string[];
|
|
38
|
+
uiIgnores?: string[];
|
|
39
|
+
compilerRules?: boolean;
|
|
40
|
+
};
|
|
41
|
+
declare function nextjsRecommendedIsolated(options?: NextjsRecommendedIsolatedOptions): Linter.Config[];
|
|
48
42
|
|
|
49
43
|
type ReactOptions = {
|
|
50
44
|
files?: string[];
|
|
45
|
+
ignores?: string[];
|
|
46
|
+
compilerRules?: boolean;
|
|
51
47
|
};
|
|
52
48
|
declare function react(options?: ReactOptions): Linter.Config[];
|
|
53
49
|
|
|
54
|
-
declare const reactRecommended:
|
|
50
|
+
declare const reactRecommended: Linter.Config[];
|
|
55
51
|
|
|
56
52
|
type TypescriptBaseOptions = {
|
|
57
53
|
files?: string[];
|
|
@@ -63,6 +59,20 @@ type TypescriptConventionsOptions = {
|
|
|
63
59
|
};
|
|
64
60
|
declare function typescriptConventions(options?: TypescriptConventionsOptions): Linter.Config[];
|
|
65
61
|
|
|
62
|
+
type TypescriptPrettierOptions = {
|
|
63
|
+
files?: string[];
|
|
64
|
+
};
|
|
65
|
+
declare function typescriptPrettierInterop(options?: TypescriptPrettierOptions): Linter.Config[];
|
|
66
|
+
|
|
67
|
+
type TypescriptSecurityOptions = {
|
|
68
|
+
files?: string[];
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
type TypescriptSizeComplexityOptions = {
|
|
72
|
+
files?: string[];
|
|
73
|
+
};
|
|
74
|
+
declare function typescriptSizeComplexity(options?: TypescriptSizeComplexityOptions): Linter.Config[];
|
|
75
|
+
|
|
66
76
|
type TypescriptConfigFiles = string[];
|
|
67
77
|
type TypescriptMinimalOptions = {
|
|
68
78
|
files?: TypescriptConfigFiles;
|
|
@@ -77,11 +87,6 @@ type TypescriptMinimalOptions = {
|
|
|
77
87
|
*/
|
|
78
88
|
declare function typescriptMinimal(options?: TypescriptMinimalOptions): Linter.Config[];
|
|
79
89
|
|
|
80
|
-
type TypescriptPrettierOptions = {
|
|
81
|
-
files?: string[];
|
|
82
|
-
};
|
|
83
|
-
declare function typescriptPrettierInterop(options?: TypescriptPrettierOptions): Linter.Config[];
|
|
84
|
-
|
|
85
90
|
type TypescriptRecommendedOptions = {
|
|
86
91
|
/**
|
|
87
92
|
* When set, enables type-aware rules (more powerful, can be slower).
|
|
@@ -103,18 +108,15 @@ type TypescriptRecommendedOptions = {
|
|
|
103
108
|
* When true (default), enables strict conventions (e.g. no default exports).
|
|
104
109
|
*/
|
|
105
110
|
enableConventions?: boolean;
|
|
111
|
+
/**
|
|
112
|
+
* When true, reports usage of APIs marked as deprecated in type definitions.
|
|
113
|
+
*
|
|
114
|
+
* Only applies when `typeChecked: true`.
|
|
115
|
+
*/
|
|
116
|
+
reportDeprecated?: boolean;
|
|
106
117
|
};
|
|
107
118
|
declare function typescriptRecommended(options?: TypescriptRecommendedOptions): Linter.Config[];
|
|
108
119
|
|
|
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
120
|
/**
|
|
119
121
|
* Placeholder for future custom rules.
|
|
120
122
|
*
|
|
@@ -123,4 +125,4 @@ declare function typescriptSizeComplexity(options?: TypescriptSizeComplexityOpti
|
|
|
123
125
|
*/
|
|
124
126
|
declare const plugin: ESLint.Plugin;
|
|
125
127
|
|
|
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 };
|
|
128
|
+
export { type A11yOptions, type ImportZone, type NextjsBoundariesOptions, type NextjsOptions, type NextjsRecommendedIsolatedOptions, type ReactOptions, type TypescriptBaseOptions, type TypescriptConventionsOptions, type TypescriptMinimalOptions, type TypescriptPrettierOptions, type TypescriptRecommendedOptions, type TypescriptSecurityOptions, type TypescriptSizeComplexityOptions, a11y, a11yRecommended, nextjs, nextjsImportBoundaries, nextjsRecommended, nextjsRecommendedIsolated, 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,10 +87,18 @@ 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
|
+
];
|
|
97
|
+
const ignores = options.ignores;
|
|
42
98
|
return [
|
|
43
99
|
{
|
|
44
100
|
files,
|
|
101
|
+
...ignores ? { ignores } : {},
|
|
45
102
|
plugins: {
|
|
46
103
|
"jsx-a11y": jsxA11yPlugin
|
|
47
104
|
},
|
|
@@ -55,45 +112,60 @@ function a11y(options = {}) {
|
|
|
55
112
|
// src/configs/framework/a11y/recommended.ts
|
|
56
113
|
var a11yRecommended = a11y();
|
|
57
114
|
|
|
58
|
-
// src/configs/framework/nextjs/
|
|
115
|
+
// src/configs/framework/nextjs/builders/core.ts
|
|
59
116
|
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
117
|
function nextjs(options = {}) {
|
|
88
118
|
const files = options.files ?? ["**/*.{js,jsx,ts,tsx}"];
|
|
119
|
+
const ignores = options.ignores;
|
|
120
|
+
const isCoreWebVitals = options.coreWebVitals ?? false;
|
|
121
|
+
const plugin2 = nextPlugin;
|
|
122
|
+
const rules = isCoreWebVitals ? {
|
|
123
|
+
...plugin2.configs.recommended.rules,
|
|
124
|
+
...plugin2.configs["core-web-vitals"].rules
|
|
125
|
+
} : {
|
|
126
|
+
...plugin2.configs.recommended.rules
|
|
127
|
+
};
|
|
128
|
+
if (isCoreWebVitals) {
|
|
129
|
+
rules["@next/next/no-async-client-component"] = "error";
|
|
130
|
+
rules["@next/next/no-img-element"] = "error";
|
|
131
|
+
}
|
|
89
132
|
return [
|
|
90
133
|
{
|
|
91
134
|
files,
|
|
135
|
+
...ignores ? { ignores } : {},
|
|
92
136
|
plugins: {
|
|
93
137
|
"@next/next": nextPlugin
|
|
94
138
|
},
|
|
139
|
+
settings: {
|
|
140
|
+
next: {
|
|
141
|
+
rootDir: options.rootDir
|
|
142
|
+
}
|
|
143
|
+
},
|
|
95
144
|
rules: {
|
|
96
|
-
...
|
|
145
|
+
...rules
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
];
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// src/configs/framework/nextjs/builders/import-boundaries.ts
|
|
152
|
+
import importPlugin from "eslint-plugin-import";
|
|
153
|
+
function nextjsImportBoundaries(options) {
|
|
154
|
+
const files = options.files ?? ["**/*.{ts,tsx}"];
|
|
155
|
+
return [
|
|
156
|
+
{
|
|
157
|
+
files,
|
|
158
|
+
plugins: {
|
|
159
|
+
import: importPlugin
|
|
160
|
+
},
|
|
161
|
+
rules: {
|
|
162
|
+
"import/no-restricted-paths": [
|
|
163
|
+
"error",
|
|
164
|
+
{
|
|
165
|
+
basePath: options.basePath,
|
|
166
|
+
zones: options.zones
|
|
167
|
+
}
|
|
168
|
+
]
|
|
97
169
|
}
|
|
98
170
|
}
|
|
99
171
|
];
|
|
@@ -134,15 +206,47 @@ var reactCoreRules = {
|
|
|
134
206
|
// src/configs/framework/react/definitions/hooks-r.ts
|
|
135
207
|
var reactHooksRules = {
|
|
136
208
|
"react-hooks/rules-of-hooks": "error",
|
|
137
|
-
"react-hooks/exhaustive-deps": "
|
|
209
|
+
"react-hooks/exhaustive-deps": "error"
|
|
138
210
|
};
|
|
139
211
|
|
|
140
212
|
// src/configs/framework/react/index.ts
|
|
213
|
+
function toRecord(value) {
|
|
214
|
+
if (typeof value !== "object" || value === null) {
|
|
215
|
+
return {};
|
|
216
|
+
}
|
|
217
|
+
return value;
|
|
218
|
+
}
|
|
219
|
+
function getPluginFlatConfigs(plugin2) {
|
|
220
|
+
const pluginRecord = toRecord(plugin2);
|
|
221
|
+
const configsRecord = toRecord(pluginRecord.configs);
|
|
222
|
+
return toRecord(configsRecord.flat);
|
|
223
|
+
}
|
|
224
|
+
function getRules(config) {
|
|
225
|
+
const configRecord = toRecord(config);
|
|
226
|
+
const rules = configRecord.rules;
|
|
227
|
+
if (typeof rules !== "object" || rules === null) {
|
|
228
|
+
return {};
|
|
229
|
+
}
|
|
230
|
+
return rules;
|
|
231
|
+
}
|
|
141
232
|
function react(options = {}) {
|
|
142
233
|
const files = options.files ?? ["**/*.{jsx,tsx}"];
|
|
234
|
+
const ignores = options.ignores;
|
|
235
|
+
const compilerRules = options.compilerRules ?? false;
|
|
236
|
+
const reactFlat = getPluginFlatConfigs(reactPlugin);
|
|
237
|
+
const reactHooksFlat = getPluginFlatConfigs(reactHooksPlugin);
|
|
238
|
+
const rules = {
|
|
239
|
+
...getRules(reactFlat.recommended),
|
|
240
|
+
...getRules(reactFlat["jsx-runtime"]),
|
|
241
|
+
...getRules(reactHooksFlat.recommended),
|
|
242
|
+
...compilerRules ? getRules(reactHooksFlat["recommended-latest"]) : {},
|
|
243
|
+
...reactCoreRules,
|
|
244
|
+
...reactHooksRules
|
|
245
|
+
};
|
|
143
246
|
return [
|
|
144
247
|
{
|
|
145
248
|
files,
|
|
249
|
+
...ignores ? { ignores } : {},
|
|
146
250
|
plugins: {
|
|
147
251
|
react: reactPlugin,
|
|
148
252
|
"react-hooks": reactHooksPlugin
|
|
@@ -160,8 +264,7 @@ function react(options = {}) {
|
|
|
160
264
|
}
|
|
161
265
|
},
|
|
162
266
|
rules: {
|
|
163
|
-
...
|
|
164
|
-
...reactHooksRules
|
|
267
|
+
...rules
|
|
165
268
|
}
|
|
166
269
|
}
|
|
167
270
|
];
|
|
@@ -177,7 +280,43 @@ var nextjsRecommended = [
|
|
|
177
280
|
...nextjs()
|
|
178
281
|
];
|
|
179
282
|
|
|
180
|
-
// src/configs/
|
|
283
|
+
// src/configs/framework/nextjs/recommended-isolated.ts
|
|
284
|
+
function nextjsRecommendedIsolated(options = {}) {
|
|
285
|
+
const routeFiles = options.routeFiles ?? [
|
|
286
|
+
"**/app/**/*.{js,jsx,ts,tsx}",
|
|
287
|
+
"**/pages/**/*.{js,jsx,ts,tsx}"
|
|
288
|
+
];
|
|
289
|
+
const uiFiles = options.uiFiles ?? [
|
|
290
|
+
"**/components/**/*.{jsx,tsx}",
|
|
291
|
+
"**/ui/**/*.{jsx,tsx}",
|
|
292
|
+
"**/features/**/*.{jsx,tsx}"
|
|
293
|
+
];
|
|
294
|
+
const routeIgnores = options.routeIgnores;
|
|
295
|
+
const uiIgnores = options.uiIgnores ?? ["**/app/**", "**/pages/**"];
|
|
296
|
+
const a11yFiles = [
|
|
297
|
+
"**/app/**/*.{jsx,tsx}",
|
|
298
|
+
"**/pages/**/*.{jsx,tsx}",
|
|
299
|
+
"**/components/**/*.{jsx,tsx}",
|
|
300
|
+
"**/ui/**/*.{jsx,tsx}",
|
|
301
|
+
"**/features/**/*.{jsx,tsx}"
|
|
302
|
+
];
|
|
303
|
+
return [
|
|
304
|
+
...react({
|
|
305
|
+
files: uiFiles,
|
|
306
|
+
ignores: uiIgnores,
|
|
307
|
+
compilerRules: options.compilerRules
|
|
308
|
+
}),
|
|
309
|
+
...a11y({
|
|
310
|
+
files: a11yFiles
|
|
311
|
+
}),
|
|
312
|
+
...nextjs({
|
|
313
|
+
files: routeFiles,
|
|
314
|
+
ignores: routeIgnores
|
|
315
|
+
})
|
|
316
|
+
];
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
// src/configs/typescript/builders/base.ts
|
|
181
320
|
import tseslint from "typescript-eslint";
|
|
182
321
|
function typescriptBase(options = {}) {
|
|
183
322
|
const files = options.files ?? ["**/*.{ts,tsx,mts,cts}"];
|
|
@@ -199,7 +338,7 @@ function typescriptBase(options = {}) {
|
|
|
199
338
|
"@typescript-eslint/no-unused-vars": "error",
|
|
200
339
|
"@typescript-eslint/no-shadow": "error",
|
|
201
340
|
"@typescript-eslint/ban-ts-comment": "error",
|
|
202
|
-
"@typescript-eslint/no-explicit-any": "
|
|
341
|
+
"@typescript-eslint/no-explicit-any": "error",
|
|
203
342
|
"@typescript-eslint/no-inferrable-types": "error",
|
|
204
343
|
"no-undef": "off",
|
|
205
344
|
"no-unused-vars": "off",
|
|
@@ -212,15 +351,17 @@ function typescriptBase(options = {}) {
|
|
|
212
351
|
];
|
|
213
352
|
}
|
|
214
353
|
|
|
215
|
-
// src/configs/typescript/conventions.ts
|
|
216
|
-
import
|
|
354
|
+
// src/configs/typescript/builders/conventions.ts
|
|
355
|
+
import importPlugin2 from "eslint-plugin-import";
|
|
356
|
+
import tseslint2 from "typescript-eslint";
|
|
217
357
|
function typescriptConventions(options = {}) {
|
|
218
358
|
const files = options.files ?? ["**/*.{ts,tsx,mts,cts}"];
|
|
219
359
|
return [
|
|
220
360
|
{
|
|
221
361
|
files,
|
|
222
362
|
plugins: {
|
|
223
|
-
import:
|
|
363
|
+
import: importPlugin2,
|
|
364
|
+
"@typescript-eslint": tseslint2.plugin
|
|
224
365
|
},
|
|
225
366
|
rules: {
|
|
226
367
|
// 6.1 Rule table
|
|
@@ -245,7 +386,7 @@ function typescriptConventions(options = {}) {
|
|
|
245
386
|
];
|
|
246
387
|
}
|
|
247
388
|
|
|
248
|
-
// src/configs/typescript/docs.ts
|
|
389
|
+
// src/configs/typescript/builders/docs.ts
|
|
249
390
|
import comments from "@eslint-community/eslint-plugin-eslint-comments";
|
|
250
391
|
import jsdoc from "eslint-plugin-jsdoc";
|
|
251
392
|
function typescriptDocs(options = {}) {
|
|
@@ -270,8 +411,8 @@ function typescriptDocs(options = {}) {
|
|
|
270
411
|
];
|
|
271
412
|
}
|
|
272
413
|
|
|
273
|
-
// src/configs/typescript/functional.ts
|
|
274
|
-
import
|
|
414
|
+
// src/configs/typescript/builders/functional.ts
|
|
415
|
+
import tseslint3 from "typescript-eslint";
|
|
275
416
|
var FUNCTIONAL_RULES = {
|
|
276
417
|
// Type Safety
|
|
277
418
|
"@typescript-eslint/explicit-module-boundary-types": "warn",
|
|
@@ -289,15 +430,15 @@ function typescriptFunctional(options = {}) {
|
|
|
289
430
|
{
|
|
290
431
|
files,
|
|
291
432
|
plugins: {
|
|
292
|
-
"@typescript-eslint":
|
|
433
|
+
"@typescript-eslint": tseslint3.plugin
|
|
293
434
|
},
|
|
294
435
|
rules: FUNCTIONAL_RULES
|
|
295
436
|
}
|
|
296
437
|
];
|
|
297
438
|
}
|
|
298
439
|
|
|
299
|
-
// src/configs/typescript/imports.ts
|
|
300
|
-
import
|
|
440
|
+
// src/configs/typescript/builders/imports.ts
|
|
441
|
+
import importPlugin3 from "eslint-plugin-import";
|
|
301
442
|
import simpleImportSort from "eslint-plugin-simple-import-sort";
|
|
302
443
|
var IMPORTS_RULES = {
|
|
303
444
|
"import/no-duplicates": "error",
|
|
@@ -333,7 +474,7 @@ function typescriptImports(options = {}) {
|
|
|
333
474
|
{
|
|
334
475
|
files,
|
|
335
476
|
plugins: {
|
|
336
|
-
import:
|
|
477
|
+
import: importPlugin3,
|
|
337
478
|
"simple-import-sort": simpleImportSort
|
|
338
479
|
},
|
|
339
480
|
settings: {
|
|
@@ -353,12 +494,7 @@ function typescriptImports(options = {}) {
|
|
|
353
494
|
];
|
|
354
495
|
}
|
|
355
496
|
|
|
356
|
-
// src/configs/typescript/
|
|
357
|
-
function typescriptMinimal(options = {}) {
|
|
358
|
-
return typescriptBase(options);
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
// src/configs/typescript/naming-env.ts
|
|
497
|
+
// src/configs/typescript/builders/naming-env.ts
|
|
362
498
|
import unicorn from "eslint-plugin-unicorn";
|
|
363
499
|
var NAMING_RULES = {
|
|
364
500
|
"unicorn/filename-case": [
|
|
@@ -386,7 +522,7 @@ function typescriptNamingEnv(options = {}) {
|
|
|
386
522
|
];
|
|
387
523
|
}
|
|
388
524
|
|
|
389
|
-
// src/configs/typescript/prettier.ts
|
|
525
|
+
// src/configs/typescript/builders/prettier.ts
|
|
390
526
|
import eslintConfigPrettier from "eslint-config-prettier";
|
|
391
527
|
function typescriptPrettierInterop(options = {}) {
|
|
392
528
|
const files = options.files ?? ["**/*.{ts,tsx,mts,cts}"];
|
|
@@ -400,68 +536,7 @@ function typescriptPrettierInterop(options = {}) {
|
|
|
400
536
|
];
|
|
401
537
|
}
|
|
402
538
|
|
|
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
|
|
539
|
+
// src/configs/typescript/builders/security.ts
|
|
465
540
|
import regexpPlugin from "eslint-plugin-regexp";
|
|
466
541
|
import securityPlugin from "eslint-plugin-security";
|
|
467
542
|
function typescriptSecurity(options = {}) {
|
|
@@ -486,7 +561,7 @@ function typescriptSecurity(options = {}) {
|
|
|
486
561
|
];
|
|
487
562
|
}
|
|
488
563
|
|
|
489
|
-
// src/configs/typescript/size-complexity.ts
|
|
564
|
+
// src/configs/typescript/builders/size-complexity.ts
|
|
490
565
|
function typescriptSizeComplexity(options = {}) {
|
|
491
566
|
const files = options.files ?? ["**/*.{ts,tsx,mts,cts}"];
|
|
492
567
|
return [
|
|
@@ -511,15 +586,15 @@ function typescriptSizeComplexity(options = {}) {
|
|
|
511
586
|
];
|
|
512
587
|
}
|
|
513
588
|
|
|
514
|
-
// src/configs/typescript/type-aware.ts
|
|
515
|
-
import
|
|
589
|
+
// src/configs/typescript/builders/type-aware.ts
|
|
590
|
+
import tseslint4 from "typescript-eslint";
|
|
516
591
|
function typescriptTypeAware(options = {}) {
|
|
517
592
|
const files = options.files ?? ["**/*.{ts,tsx,mts,cts}"];
|
|
518
593
|
return [
|
|
519
594
|
{
|
|
520
595
|
files,
|
|
521
596
|
plugins: {
|
|
522
|
-
"@typescript-eslint":
|
|
597
|
+
"@typescript-eslint": tseslint4.plugin
|
|
523
598
|
},
|
|
524
599
|
languageOptions: {
|
|
525
600
|
parserOptions: {
|
|
@@ -528,6 +603,11 @@ function typescriptTypeAware(options = {}) {
|
|
|
528
603
|
}
|
|
529
604
|
},
|
|
530
605
|
rules: {
|
|
606
|
+
"@typescript-eslint/no-unsafe-assignment": "error",
|
|
607
|
+
"@typescript-eslint/no-unsafe-argument": "error",
|
|
608
|
+
"@typescript-eslint/no-unsafe-call": "error",
|
|
609
|
+
"@typescript-eslint/no-unsafe-member-access": "error",
|
|
610
|
+
"@typescript-eslint/no-unsafe-return": "error",
|
|
531
611
|
"@typescript-eslint/require-await": "error",
|
|
532
612
|
"@typescript-eslint/no-floating-promises": "error",
|
|
533
613
|
"@typescript-eslint/no-misused-promises": "error",
|
|
@@ -545,11 +625,79 @@ function typescriptTypeAware(options = {}) {
|
|
|
545
625
|
];
|
|
546
626
|
}
|
|
547
627
|
|
|
628
|
+
// src/configs/typescript/minimal.ts
|
|
629
|
+
function typescriptMinimal(options = {}) {
|
|
630
|
+
return typescriptBase(options);
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
// src/configs/typescript/recommended.ts
|
|
634
|
+
import tseslint5 from "typescript-eslint";
|
|
635
|
+
|
|
636
|
+
// src/configs/typescript/builders/quality.ts
|
|
637
|
+
import sonarjs from "eslint-plugin-sonarjs";
|
|
638
|
+
import unicorn2 from "eslint-plugin-unicorn";
|
|
639
|
+
var UNICORN_ABBREVIATIONS = {
|
|
640
|
+
allowList: {
|
|
641
|
+
Props: true,
|
|
642
|
+
props: true,
|
|
643
|
+
Ref: true,
|
|
644
|
+
ref: true,
|
|
645
|
+
Src: true,
|
|
646
|
+
src: true,
|
|
647
|
+
Params: true,
|
|
648
|
+
params: true,
|
|
649
|
+
Env: true,
|
|
650
|
+
env: true,
|
|
651
|
+
Args: true,
|
|
652
|
+
args: true,
|
|
653
|
+
Docs: true,
|
|
654
|
+
docs: true,
|
|
655
|
+
arg: true,
|
|
656
|
+
err: true,
|
|
657
|
+
req: true,
|
|
658
|
+
res: true,
|
|
659
|
+
ctx: true,
|
|
660
|
+
val: true
|
|
661
|
+
}
|
|
662
|
+
};
|
|
663
|
+
function typescriptQuality(options = {}) {
|
|
664
|
+
const files = options.files ?? ["**/*.{ts,tsx,mts,cts}"];
|
|
665
|
+
return [
|
|
666
|
+
{
|
|
667
|
+
files,
|
|
668
|
+
plugins: {
|
|
669
|
+
unicorn: unicorn2,
|
|
670
|
+
sonarjs
|
|
671
|
+
},
|
|
672
|
+
rules: {
|
|
673
|
+
// Unicorn
|
|
674
|
+
"unicorn/prefer-node-protocol": "error",
|
|
675
|
+
"unicorn/no-useless-undefined": "error",
|
|
676
|
+
"unicorn/no-lonely-if": "error",
|
|
677
|
+
"unicorn/prefer-optional-catch-binding": "error",
|
|
678
|
+
"unicorn/prefer-string-replace-all": "error",
|
|
679
|
+
"unicorn/prevent-abbreviations": ["warn", UNICORN_ABBREVIATIONS],
|
|
680
|
+
// Best Practices
|
|
681
|
+
"consistent-return": "error",
|
|
682
|
+
"no-implicit-coercion": "error",
|
|
683
|
+
// SonarJS
|
|
684
|
+
"sonarjs/cognitive-complexity": ["error", 15],
|
|
685
|
+
"sonarjs/no-identical-functions": "error",
|
|
686
|
+
"sonarjs/no-duplicated-branches": "error",
|
|
687
|
+
"sonarjs/no-redundant-boolean": "error",
|
|
688
|
+
"sonarjs/no-inverted-boolean-check": "error"
|
|
689
|
+
}
|
|
690
|
+
}
|
|
691
|
+
];
|
|
692
|
+
}
|
|
693
|
+
|
|
548
694
|
// src/configs/typescript/recommended.ts
|
|
549
695
|
function typescriptRecommended(options = {}) {
|
|
550
696
|
const files = options.files ?? ["**/*.{ts,tsx,mts,cts}"];
|
|
551
697
|
const enableConventions = options.enableConventions ?? true;
|
|
552
|
-
const
|
|
698
|
+
const reportDeprecated = options.reportDeprecated ?? true;
|
|
699
|
+
const noDeprecatedRule = reportDeprecated ? [2] : [0];
|
|
700
|
+
const upstreamConfigs = options.typeChecked ? tseslint5.configs.recommendedTypeChecked : tseslint5.configs.recommended;
|
|
553
701
|
const typeAwareConfig = options.typeChecked ? typescriptTypeAware({
|
|
554
702
|
files,
|
|
555
703
|
tsconfigPath: options.tsconfigPath,
|
|
@@ -570,7 +718,15 @@ function typescriptRecommended(options = {}) {
|
|
|
570
718
|
...upstreamConfigs.map((config) => ({
|
|
571
719
|
...config,
|
|
572
720
|
files
|
|
573
|
-
}))
|
|
721
|
+
})),
|
|
722
|
+
...options.typeChecked ? [
|
|
723
|
+
{
|
|
724
|
+
files,
|
|
725
|
+
rules: {
|
|
726
|
+
"@typescript-eslint/no-deprecated": noDeprecatedRule
|
|
727
|
+
}
|
|
728
|
+
}
|
|
729
|
+
] : []
|
|
574
730
|
];
|
|
575
731
|
}
|
|
576
732
|
|
|
@@ -582,7 +738,9 @@ export {
|
|
|
582
738
|
a11y,
|
|
583
739
|
a11yRecommended,
|
|
584
740
|
nextjs,
|
|
741
|
+
nextjsImportBoundaries,
|
|
585
742
|
nextjsRecommended,
|
|
743
|
+
nextjsRecommendedIsolated,
|
|
586
744
|
plugin,
|
|
587
745
|
react,
|
|
588
746
|
reactRecommended,
|
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/framework/nextjs/recommended-isolated.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 ignores?: 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 const ignores = options.ignores;\n\n return [\n {\n files,\n ...(ignores ? { ignores } : {}),\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 type { Linter } from \"eslint\";\n\nimport { a11y } from \"./index\";\n\nexport const a11yRecommended: Linter.Config[] = a11y();\n","import nextPlugin from \"@next/eslint-plugin-next\";\nimport type { Linter } from \"eslint\";\n\nexport type NextjsOptions = {\n files?: string[];\n ignores?: 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 ignores = options.ignores;\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 ...(ignores ? { ignores } : {}),\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 ignores?: string[];\n compilerRules?: boolean;\n};\n\nexport function react(options: ReactOptions = {}): Linter.Config[] {\n const files = options.files ?? [\"**/*.{jsx,tsx}\"];\n const ignores = options.ignores;\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 ...(ignores ? { ignores } : {}),\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 type { Linter } from \"eslint\";\n\nimport { react } from \"./index\";\n\nexport const reactRecommended: Linter.Config[] = react();\n","import type { Linter } from \"eslint\";\n\nimport { a11yRecommended } from \"../a11y/recommended\";\nimport { reactRecommended } from \"../react/recommended\";\nimport { nextjs } from \"./index\";\n\nexport const nextjsRecommended: Linter.Config[] = [\n ...reactRecommended,\n ...a11yRecommended,\n ...nextjs(),\n];\n","import type { Linter } from \"eslint\";\n\nimport { a11y } from \"../a11y\";\nimport { react } from \"../react\";\nimport { nextjs } from \"./index\";\n\nexport type NextjsRecommendedIsolatedOptions = {\n routeFiles?: string[];\n uiFiles?: string[];\n routeIgnores?: string[];\n uiIgnores?: string[];\n compilerRules?: boolean;\n};\n\nexport function nextjsRecommendedIsolated(\n options: NextjsRecommendedIsolatedOptions = {},\n): Linter.Config[] {\n const routeFiles = options.routeFiles ?? [\n \"**/app/**/*.{js,jsx,ts,tsx}\",\n \"**/pages/**/*.{js,jsx,ts,tsx}\",\n ];\n\n const uiFiles = options.uiFiles ?? [\n \"**/components/**/*.{jsx,tsx}\",\n \"**/ui/**/*.{jsx,tsx}\",\n \"**/features/**/*.{jsx,tsx}\",\n ];\n\n const routeIgnores = options.routeIgnores;\n const uiIgnores = options.uiIgnores ?? [\"**/app/**\", \"**/pages/**\"];\n\n const a11yFiles = [\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 ...react({\n files: uiFiles,\n ignores: uiIgnores,\n compilerRules: options.compilerRules,\n }),\n ...a11y({\n files: a11yFiles,\n }),\n ...nextjs({\n files: routeFiles,\n ignores: routeIgnores,\n }),\n ];\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 /**\n * When true, reports usage of APIs marked as deprecated in type definitions.\n *\n * Only applies when `typeChecked: true`.\n */\n reportDeprecated?: 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 const reportDeprecated = options.reportDeprecated ?? true;\n const noDeprecatedRule: [2] | [0] = reportDeprecated ? [2] : [0];\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 ...(options.typeChecked\n ? [\n {\n files,\n rules: {\n \"@typescript-eslint/no-deprecated\": noDeprecatedRule,\n },\n },\n ]\n : []),\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;;;ADzEO,SAAS,KAAK,UAAuB,CAAC,GAAoB;AAC/D,QAAM,QAAQ,QAAQ,SAAS;AAAA,IAC7B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,UAAU,QAAQ;AAExB,SAAO;AAAA,IACL;AAAA,MACE;AAAA,MACA,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;AAAA,MAC7B,SAAS;AAAA,QACP,YAAY;AAAA,MACd;AAAA,MACA,OAAO;AAAA,QACL,GAAG;AAAA,MACL;AAAA,IACF;AAAA,EACF;AACF;;;AE5BO,IAAM,kBAAmC,KAAK;;;ACJrD,OAAO,gBAAgB;AAUhB,SAAS,OAAO,UAAyB,CAAC,GAAoB;AACnE,QAAM,QAAQ,QAAQ,SAAS,CAAC,sBAAsB;AACtD,QAAM,UAAU,QAAQ;AACxB,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,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;AAAA,MAC7B,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;;;ACpDA,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;AAQO,SAAS,MAAM,UAAwB,CAAC,GAAoB;AACjE,QAAM,QAAQ,QAAQ,SAAS,CAAC,gBAAgB;AAChD,QAAM,UAAU,QAAQ;AACxB,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,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;AAAA,MAC7B,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;;;AG5EO,IAAM,mBAAoC,MAAM;;;ACEhD,IAAM,oBAAqC;AAAA,EAChD,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG,OAAO;AACZ;;;ACIO,SAAS,0BACd,UAA4C,CAAC,GAC5B;AACjB,QAAM,aAAa,QAAQ,cAAc;AAAA,IACvC;AAAA,IACA;AAAA,EACF;AAEA,QAAM,UAAU,QAAQ,WAAW;AAAA,IACjC;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,eAAe,QAAQ;AAC7B,QAAM,YAAY,QAAQ,aAAa,CAAC,aAAa,aAAa;AAElE,QAAM,YAAY;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAG,MAAM;AAAA,MACP,OAAO;AAAA,MACP,SAAS;AAAA,MACT,eAAe,QAAQ;AAAA,IACzB,CAAC;AAAA,IACD,GAAG,KAAK;AAAA,MACN,OAAO;AAAA,IACT,CAAC;AAAA,IACD,GAAG,OAAO;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACF;;;ACpDA,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;;;ADnBO,SAAS,sBACd,UAAwC,CAAC,GACxB;AACjB,QAAM,QAAQ,QAAQ,SAAS,CAAC,uBAAuB;AACvD,QAAM,oBAAoB,QAAQ,qBAAqB;AACvD,QAAM,mBAAmB,QAAQ,oBAAoB;AACrD,QAAM,mBAA8B,mBAAmB,CAAC,CAAC,IAAI,CAAC,CAAC;AAE/D,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,IACF,GAAI,QAAQ,cACR;AAAA,MACE;AAAA,QACE;AAAA,QACA,OAAO;AAAA,UACL,oCAAoC;AAAA,QACtC;AAAA,MACF;AAAA,IACF,IACA,CAAC;AAAA,EACP;AACF;;;AE5FO,IAAM,SAAwB;AAAA,EACnC,OAAO,CAAC;AACV;","names":["plugin","plugin","importPlugin","tseslint","tseslint","importPlugin","tseslint","tseslint","unicorn","tseslint"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stride.it/appoint-lint-governance",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.33",
|
|
4
4
|
"description": "Shareable ESLint flat-config profiles (MVP: TypeScript) for normalizing lint across repos.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"keywords": [
|
|
@@ -75,6 +75,9 @@
|
|
|
75
75
|
"build": "tsup",
|
|
76
76
|
"lint": "eslint . --fix",
|
|
77
77
|
"lint:fix": "eslint . --fix",
|
|
78
|
+
"typecheck:build": "tsc -p tsconfig.build.json --noEmit",
|
|
79
|
+
"typecheck:docs": "tsc -p tsconfig.eslint-docs.json --noEmit",
|
|
80
|
+
"typecheck": "pnpm typecheck:build && pnpm build && pnpm typecheck:docs",
|
|
78
81
|
"test": "vitest run --passWithNoTests"
|
|
79
82
|
}
|
|
80
83
|
}
|