@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 CHANGED
@@ -5,9 +5,14 @@
5
5
  [![TypeScript](https://img.shields.io/badge/TypeScript-5.9-blue.svg)](https://www.typescriptlang.org/)
6
6
  [![ESLint](https://img.shields.io/badge/ESLint-9.0-purple.svg)](https://eslint.org/)
7
7
 
8
- Shareable ESLint v9 flat-config builders to normalize TypeScript linting across repositories.
8
+ Shareable ESLint v9 flat-config builders to normalize linting across repositories.
9
9
 
10
- This package focuses on framework-agnostic TypeScript quality gates (correctness, imports hygiene, security, maintainability, and optional type-aware checks). It is designed to be composed in consumer repos, not to enforce an all-or-nothing mega-config.
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 framework/domain targeting (React/Next/Vue/a11y/test-runner plugins are out of scope).
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
- declare const nextjsRecommended: eslint.Linter.Config<RulesConfig>[];
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: eslint.Linter.Config<RulesConfig>[];
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": "error",
28
- "jsx-a11y/no-noninteractive-element-interactions": "error",
29
- "jsx-a11y/no-noninteractive-element-to-interactive-role": "error",
30
- "jsx-a11y/no-noninteractive-tabindex": "error",
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 ?? ["**/*.{jsx,tsx}"];
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/index.ts
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
- ...nextCoreRules
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": "warn"
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
- ...reactCoreRules,
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/typescript/base.ts
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": "warn",
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 importPlugin from "eslint-plugin-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: importPlugin
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 tseslint2 from "typescript-eslint";
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": tseslint2.plugin
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 importPlugin2 from "eslint-plugin-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: importPlugin2,
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/minimal.ts
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/recommended.ts
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 tseslint3 from "typescript-eslint";
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": tseslint3.plugin
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 upstreamConfigs = options.typeChecked ? tseslint4.configs.recommendedTypeChecked : tseslint4.configs.recommended;
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":"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","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.31",
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
  }