@stride.it/appoint-lint-governance 0.1.31 → 0.1.32

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