@stride.it/appoint-lint-governance 0.1.23 → 0.1.25

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
@@ -1,91 +1,162 @@
1
- # @stride-info-tech/appoint-lint-governance
1
+ # @stride.it/appoint-lint-governance
2
2
 
3
- Shareable ESLint **flat-config** profiles for normalizing lint rules across repositories.
3
+ Shareable ESLint v9 flat-config builders to normalize TypeScript linting across repositories.
4
4
 
5
- ## TypeScript profiles
5
+ 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.
6
6
 
7
- Profiles are flat-config builders intended to be composed:
7
+ ## What you get
8
8
 
9
- - `typescriptBase()` parser + baseline correctness/hygiene
10
- - `typescriptMinimal()` MVP (currently the same as Base)
11
- - `typescriptQuality()` unicorn + sonarjs maintainability rules
12
- - `typescriptImports()` import correctness + deterministic sorting
13
- - `typescriptSecurity()` rushstack security + regexp safety
14
- - `typescriptDocs()` — eslint-comments hygiene + jsdoc basics
15
- - `typescriptTypeAware()` — type-checked rules (opt-in via project/tsconfig)
16
- - `typescriptPrettierInterop()` — disable formatting conflicts when using Prettier
17
- - `typescriptRecommended()` composes Base + Quality + Imports + Security + Docs; optionally type-aware via `typeChecked: true`
9
+ - Composable flat-config builders (arrays of ESLint config objects).
10
+ - A minimal baseline for fast adoption.
11
+ - A recommended preset that composes the major rule groups.
12
+ - Optional type-aware rules (requires a TSConfig project).
13
+ - Optional Prettier interop preset to disable formatting-rule conflicts.
14
+
15
+ Non-goals:
16
+
17
+ - No framework/domain targeting (React/Next/Vue/a11y/test-runner plugins are out of scope).
18
+ - No formatting (Prettier remains the formatter; ESLint formatting conflicts are disabled via the interop preset).
18
19
 
19
20
  ## Install
20
21
 
21
22
  In a consumer repo:
22
23
 
23
24
  ```bash
24
- pnpm add -D @stride-info-tech/appoint-lint-governance eslint
25
+ pnpm add -D @stride.it/appoint-lint-governance eslint
25
26
  ```
26
27
 
27
- ## Use in a consumer repo (ESLint v9 flat config)
28
+ ESLint is a peer dependency; your repo owns the ESLint version.
29
+
30
+ ## Quick start (ESLint v9 flat config)
28
31
 
29
32
  Create (or edit) `eslint.config.mjs`:
30
33
 
31
34
  ```js
32
35
  import { typescriptMinimal } from "@stride.it/appoint-lint-governance";
33
36
 
34
- export default [
35
- ...typescriptMinimal(),
36
- ];
37
+ export default [...typescriptMinimal()];
37
38
  ```
38
39
 
39
- ### Type-Aware Linting (Optional)
40
+ Run ESLint in your repo as usual:
41
+
42
+ ```bash
43
+ pnpm lint
44
+ ```
45
+
46
+ ## Public API
47
+
48
+ These builders return arrays you spread into your `eslint.config.*`:
49
+
50
+ - `typescriptBase(options?)`\
51
+ Baseline correctness + safe defaults (files globs, languageOptions).
52
+ - `typescriptMinimal(options?)`\
53
+ Minimal preset (fast adoption baseline).
54
+ - `typescriptRecommended(options?)`\
55
+ Recommended preset that composes core groups and can optionally enable type-aware rules.
56
+ - `typescriptPrettierInterop(options?)`\
57
+ Disables formatting-rule conflicts when the consumer repo uses Prettier.
40
58
 
41
- To enable powerful Type-Aware rules (verifies promise handling, proper awaiting, etc.), provide `typeChecked: true` and project details:
59
+ Additionally:
60
+
61
+ - `plugin`\
62
+ Optional plugin export used by internal configs.
63
+
64
+ ## Recommended preset (most repos)
65
+
66
+ ```js
67
+ import { typescriptRecommended } from "@stride.it/appoint-lint-governance";
68
+
69
+ export default [...typescriptRecommended()];
70
+ ```
71
+
72
+ ### Type-aware linting (optional)
73
+
74
+ Type-aware rules can catch issues ESLint cannot detect from syntax alone (for example: misused promises, unsafe operations). They require a TSConfig project.
42
75
 
43
76
  ```js
44
77
  import { typescriptRecommended } from "@stride.it/appoint-lint-governance";
45
78
 
46
79
  export default [
47
- ...typescriptRecommended({
48
- typeChecked: true,
49
- tsconfigPath: "./tsconfig.json",
50
- tsconfigRootDir: import.meta.dirname, // Requires Node.js 20.11+ or 22+
51
- }),
80
+ ...typescriptRecommended({
81
+ typeChecked: true,
82
+ tsconfigPath: "./tsconfig.json",
83
+ tsconfigRootDir: import.meta.dirname,
84
+ }),
52
85
  ];
53
86
  ```
54
87
 
55
- ### Prettier Interop (Optional)
88
+ If your Node.js version does not support `import.meta.dirname`, use this portable alternative:
56
89
 
57
- If your project uses [Prettier](https://prettier.io/) for formatting, you must disable conflicting formatting rules. Include this **last** to ensure it overrides any other formatting rules:
90
+ ```js
91
+ import { fileURLToPath } from "node:url";
92
+
93
+ const tsconfigRootDir = fileURLToPath(new URL(".", import.meta.url));
94
+ ```
95
+
96
+ Then pass `tsconfigRootDir` into `typescriptRecommended({ ... })`.
97
+
98
+ ## Prettier interop (optional)
99
+
100
+ If your project uses Prettier, include the interop preset last so it can override earlier formatting rules:
58
101
 
59
102
  ```js
60
- import { typescriptRecommended, typescriptPrettierInterop } from "@stride.it/appoint-lint-governance";
103
+ import {
104
+ typescriptPrettierInterop,
105
+ typescriptRecommended,
106
+ } from "@stride.it/appoint-lint-governance";
61
107
 
62
108
  export default [
63
- ...typescriptRecommended(),
64
- // ... other configs
65
- ...typescriptPrettierInterop(), // Must be last
109
+ ...typescriptRecommended(),
110
+ ...typescriptPrettierInterop(),
66
111
  ];
67
112
  ```
68
113
 
69
- ## Local testing (before publishing to npm)
114
+ ## Overriding rules in consumer repos
115
+
116
+ Flat config is order-dependent: later entries win. Consumers can override by appending their own config object after spreading a preset.
117
+
118
+ If your organization wants to prevent overrides, ESLint itself cannot lock consumer rules; enforce that with CI/policy checks on the consumer repo’s `eslint.config.*`.
119
+
120
+ ## Suggested companion quality gates (outside ESLint)
121
+
122
+ This package intentionally focuses on ESLint rules. Many teams also enforce these CI gates:
123
+
124
+ - Type checking: `tsc --noEmit`
125
+ - Dependency audit: `pnpm audit` (or your org-approved alternative)
126
+ - Secret scanning and SAST (org-dependent)
70
127
 
71
- From this repo:
128
+ ## Development (this repo)
72
129
 
73
130
  ```bash
74
131
  pnpm install
132
+ pnpm test
75
133
  pnpm build
134
+ ```
135
+
136
+ To validate the publish output locally:
137
+
138
+ ```bash
76
139
  npm pack
77
140
  ```
78
141
 
79
- Then in a different repo, install the generated `.tgz`:
142
+ Then install the generated `.tgz` into a consumer repo.
143
+
144
+ ## Publishing
145
+
146
+ 1) Bump version:
80
147
 
81
148
  ```bash
82
- pnpm add -D ../appoint-lint-governance/<generated-file>.tgz
149
+ pnpm version patch
83
150
  ```
84
151
 
85
- ## Can consumer repos override rules?
152
+ 1) Dry run:
86
153
 
87
- Yes.
154
+ ```bash
155
+ pnpm publish --dry-run
156
+ ```
88
157
 
89
- In flat config, **later config entries win**. So a consumer can override by adding their own config object after spreading the profile (as shown above).
158
+ 1) Publish (requires npm credentials with access to the `@stride.it` scope):
90
159
 
91
- If you want to prevent overrides for governance reasons, ESLint itself cannot “lock” consumer rules — you’d enforce that via policy/CI (for example: validate `eslint.config.*` in consumers and fail if it sets forbidden overrides).
160
+ ```bash
161
+ pnpm publish --access public
162
+ ```
package/dist/index.d.ts CHANGED
@@ -1411,6 +1411,12 @@ declare function typescriptRecommended(options?: TypescriptRecommendedOptions):
1411
1411
  "jsdoc/require-param": string;
1412
1412
  "jsdoc/require-returns": string;
1413
1413
  };
1414
+ } | {
1415
+ files: string[];
1416
+ plugins: {
1417
+ "@typescript-eslint": CompatiblePlugin;
1418
+ };
1419
+ rules: RulesConfig;
1414
1420
  } | {
1415
1421
  files: string[];
1416
1422
  plugins: {
package/dist/index.js CHANGED
@@ -91,6 +91,32 @@ function typescriptDocs(options = {}) {
91
91
  ];
92
92
  }
93
93
 
94
+ // src/configs/typescript/functional.ts
95
+ import tseslint2 from "typescript-eslint";
96
+ var FUNCTIONAL_RULES = {
97
+ // Type Safety
98
+ "@typescript-eslint/explicit-module-boundary-types": "warn",
99
+ // Modern Syntax
100
+ "@typescript-eslint/default-param-last": "error",
101
+ "prefer-rest-params": "error",
102
+ "prefer-spread": "error",
103
+ "no-new-func": "error",
104
+ // Clean Code
105
+ "@typescript-eslint/no-empty-function": "error"
106
+ };
107
+ function typescriptFunctional(options = {}) {
108
+ const files = options.files ?? ["**/*.{ts,tsx,mts,cts}"];
109
+ return [
110
+ {
111
+ files,
112
+ plugins: {
113
+ "@typescript-eslint": tseslint2.plugin
114
+ },
115
+ rules: FUNCTIONAL_RULES
116
+ }
117
+ ];
118
+ }
119
+
94
120
  // src/configs/typescript/imports.ts
95
121
  import importPlugin2 from "eslint-plugin-import";
96
122
  import simpleImportSort from "eslint-plugin-simple-import-sort";
@@ -195,7 +221,7 @@ function typescriptPrettierInterop(options = {}) {
195
221
  }
196
222
 
197
223
  // src/configs/typescript/recommended.ts
198
- import tseslint3 from "typescript-eslint";
224
+ import tseslint4 from "typescript-eslint";
199
225
 
200
226
  // src/configs/typescript/quality.ts
201
227
  import sonarjs from "eslint-plugin-sonarjs";
@@ -306,14 +332,14 @@ function typescriptSizeComplexity(options = {}) {
306
332
  }
307
333
 
308
334
  // src/configs/typescript/type-aware.ts
309
- import tseslint2 from "typescript-eslint";
335
+ import tseslint3 from "typescript-eslint";
310
336
  function typescriptTypeAware(options = {}) {
311
337
  const files = options.files ?? ["**/*.{ts,tsx,mts,cts}"];
312
338
  return [
313
339
  {
314
340
  files,
315
341
  plugins: {
316
- "@typescript-eslint": tseslint2.plugin
342
+ "@typescript-eslint": tseslint3.plugin
317
343
  },
318
344
  languageOptions: {
319
345
  parserOptions: {
@@ -343,7 +369,7 @@ function typescriptTypeAware(options = {}) {
343
369
  function typescriptRecommended(options = {}) {
344
370
  const files = options.files ?? ["**/*.{ts,tsx,mts,cts}"];
345
371
  const enableConventions = options.enableConventions ?? true;
346
- const upstreamConfigs = options.typeChecked ? tseslint3.configs.recommendedTypeChecked : tseslint3.configs.recommended;
372
+ const upstreamConfigs = options.typeChecked ? tseslint4.configs.recommendedTypeChecked : tseslint4.configs.recommended;
347
373
  const typeAwareConfig = options.typeChecked ? typescriptTypeAware({
348
374
  files,
349
375
  tsconfigPath: options.tsconfigPath,
@@ -356,6 +382,7 @@ function typescriptRecommended(options = {}) {
356
382
  ...typescriptImports({ files }),
357
383
  ...typescriptSecurity({ files }),
358
384
  ...typescriptNamingEnv({ files }),
385
+ ...typescriptFunctional({ files }),
359
386
  ...typescriptDocs({ files }),
360
387
  ...typescriptSizeComplexity({ files }),
361
388
  ...conventionsConfig,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/configs/typescript/base.ts","../src/configs/typescript/conventions.ts","../src/configs/typescript/docs.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 tseslint from \"typescript-eslint\";\r\n\r\nexport type TypescriptBaseOptions = {\r\n files?: string[];\r\n};\r\n\r\nexport function typescriptBase(options: TypescriptBaseOptions = {}) {\r\n const files = options.files ?? [\"**/*.{ts,tsx,mts,cts}\"];\r\n\r\n return [\r\n {\r\n files,\r\n plugins: {\r\n \"@typescript-eslint\": tseslint.plugin,\r\n },\r\n languageOptions: {\r\n parser: tseslint.parser,\r\n parserOptions: {\r\n ecmaVersion: \"latest\",\r\n sourceType: \"module\",\r\n },\r\n },\r\n rules: {\r\n \"@typescript-eslint/consistent-type-imports\": \"error\",\r\n \"@typescript-eslint/no-unused-vars\": \"error\",\r\n \"@typescript-eslint/no-shadow\": \"error\",\r\n \"@typescript-eslint/ban-ts-comment\": \"error\",\r\n \"@typescript-eslint/no-explicit-any\": \"warn\",\r\n \"@typescript-eslint/no-inferrable-types\": \"error\",\r\n \"no-undef\": \"off\",\r\n \"no-unused-vars\": \"off\",\r\n \"no-var\": \"error\",\r\n \"prefer-const\": \"error\",\r\n eqeqeq: [\"error\", \"always\", { null: \"ignore\" }],\r\n \"no-implicit-coercion\": \"error\",\r\n },\r\n },\r\n ];\r\n}\r\n","import importPlugin from \"eslint-plugin-import\";\r\n\r\nexport type TypescriptConventionsOptions = {\r\n files?: string[];\r\n};\r\n\r\nexport function typescriptConventions(\r\n options: TypescriptConventionsOptions = {}\r\n) {\r\n const files = options.files ?? [\"**/*.{ts,tsx,mts,cts}\"];\r\n\r\n return [\r\n {\r\n files,\r\n plugins: {\r\n import: importPlugin,\r\n },\r\n rules: {\r\n // 6.1 Rule table\r\n \"import/no-default-export\": \"error\",\r\n \"@typescript-eslint/consistent-type-definitions\": [\"error\", \"type\"],\r\n \"@typescript-eslint/consistent-type-imports\": \"error\",\r\n \"prefer-arrow-callback\": \"error\",\r\n },\r\n },\r\n // 6.2 Overrides\r\n {\r\n files: [\r\n \"**/*.config.{js,mjs,ts}\",\r\n \"**/app/**/{page,layout,template,not-found,global-error,loading,error}.tsx\",\r\n \"**/*.stories.tsx\",\r\n \"**/*.d.ts\",\r\n ],\r\n rules: {\r\n \"import/no-default-export\": \"off\",\r\n },\r\n },\r\n ];\r\n}\r\n","import comments from \"@eslint-community/eslint-plugin-eslint-comments\";\r\nimport jsdoc from \"eslint-plugin-jsdoc\";\r\n\r\nexport type TypescriptDocsOptions = {\r\n files?: string[];\r\n};\r\n\r\nexport function typescriptDocs(options: TypescriptDocsOptions = {}) {\r\n const files = options.files ?? [\"**/*.{ts,tsx,mts,cts}\"];\r\n\r\n return [\r\n {\r\n files,\r\n plugins: {\r\n jsdoc: jsdoc,\r\n \"eslint-comments\": comments,\r\n },\r\n rules: {\r\n \"eslint-comments/no-unused-disable\": \"error\",\r\n \"eslint-comments/no-unlimited-disable\": \"error\",\r\n \"eslint-comments/require-description\": \"error\",\r\n \"eslint-comments/disable-enable-pair\": \"error\",\r\n \"jsdoc/check-alignment\": \"error\",\r\n \"jsdoc/require-param\": \"error\",\r\n \"jsdoc/require-returns\": \"error\",\r\n },\r\n },\r\n ];\r\n}\r\n","import type { Linter } from \"eslint\";\r\nimport importPlugin from \"eslint-plugin-import\";\r\nimport simpleImportSort from \"eslint-plugin-simple-import-sort\";\r\n\r\nconst IMPORTS_RULES: Linter.RulesRecord = {\r\n \"import/no-duplicates\": \"error\",\r\n \"import/no-cycle\": \"error\",\r\n \"import/no-mutable-exports\": \"error\",\r\n \"import/first\": \"error\",\r\n \"import/newline-after-import\": \"error\",\r\n \"import/no-extraneous-dependencies\": [\r\n \"error\",\r\n {\r\n devDependencies: [\r\n \"**/*.test.ts\",\r\n \"**/*.spec.ts\",\r\n \"test/**\",\r\n \"tests/**\",\r\n \"**/*.config.{js,ts,mjs}\",\r\n \"**/*.stories.tsx\",\r\n \"scripts/**\",\r\n ],\r\n optionalDependencies: false,\r\n peerDependencies: false,\r\n },\r\n ],\r\n\r\n \"simple-import-sort/imports\": \"error\",\r\n \"simple-import-sort/exports\": \"error\",\r\n\r\n \"import/no-deprecated\": \"error\",\r\n \"no-restricted-imports\": \"off\",\r\n};\r\n\r\nexport type TypescriptImportsOptions = {\r\n files?: string[];\r\n};\r\n\r\nexport function typescriptImports(options: TypescriptImportsOptions = {}) {\r\n const files = options.files ?? [\"**/*.{ts,tsx,mts,cts}\"];\r\n\r\n return [\r\n {\r\n files,\r\n plugins: {\r\n import: importPlugin,\r\n \"simple-import-sort\": simpleImportSort,\r\n },\r\n settings: {\r\n \"import/parsers\": {\r\n \"@typescript-eslint/parser\": [\".ts\", \".tsx\", \".mts\", \".cts\"],\r\n },\r\n \"import/resolver\": {\r\n typescript: {\r\n alwaysTryTypes: true,\r\n project: [\"tsconfig.json\", \"*/tsconfig.json\"],\r\n },\r\n node: true,\r\n },\r\n },\r\n rules: IMPORTS_RULES,\r\n },\r\n ];\r\n}\r\n","import { typescriptBase } from \"./base.js\";\r\n\r\nexport type TypescriptConfigFiles = string[];\r\n\r\nexport type TypescriptMinimalOptions = {\r\n files?: TypescriptConfigFiles;\r\n}\r\n\r\n/**\r\n * MVP TypeScript profile.\r\n *\r\n * Intentionally minimal: enables TypeScript parsing and one rule to prove\r\n * end-to-end packaging + consumption.\r\n * @param options - Configuration options.\r\n * @returns The ESLint configuration.\r\n */\r\nexport function typescriptMinimal(options: TypescriptMinimalOptions = {}) {\r\n return typescriptBase(options);\r\n}\r\n","import type { Linter } from \"eslint\";\r\nimport unicorn from \"eslint-plugin-unicorn\";\r\n\r\nexport type TypescriptNamingEnvOptions = {\r\n files?: string[];\r\n};\r\n\r\nconst NAMING_RULES: Linter.RulesRecord = {\r\n \"unicorn/filename-case\": [\r\n \"error\",\r\n {\r\n cases: {\r\n kebabCase: true,\r\n pascalCase: true,\r\n },\r\n ignore: [\"NEXT_\", \"README\", \"CHANGELOG\", \"LICENSE\", \"Dockerfile\", \"^_\"],\r\n },\r\n ],\r\n \"no-restricted-globals\": [\"error\", \"event\", \"fdescribe\"],\r\n};\r\n\r\nexport function typescriptNamingEnv(options: TypescriptNamingEnvOptions = {}) {\r\n const files = options.files ?? [\"**/*.{ts,tsx,mts,cts}\"];\r\n\r\n return [\r\n {\r\n files,\r\n plugins: {\r\n unicorn,\r\n },\r\n rules: NAMING_RULES,\r\n },\r\n ];\r\n}\r\n","import eslintConfigPrettier from \"eslint-config-prettier\";\r\n\r\nexport type TypescriptPrettierOptions = {\r\n files?: string[];\r\n};\r\n\r\nexport function typescriptPrettierInterop(\r\n options: TypescriptPrettierOptions = {}\r\n) {\r\n const files = options.files ?? [\"**/*.{ts,tsx,mts,cts}\"];\r\n\r\n return [\r\n {\r\n files,\r\n rules: {\r\n ...eslintConfigPrettier.rules,\r\n },\r\n },\r\n ];\r\n}\r\n","import tseslint from \"typescript-eslint\";\r\n\r\nimport { typescriptBase } from \"./base.js\";\r\nimport { typescriptConventions } from \"./conventions.js\";\r\nimport { typescriptDocs } from \"./docs.js\";\r\nimport { typescriptImports } from \"./imports.js\";\r\nimport { typescriptNamingEnv } from \"./naming-env.js\";\r\nimport { typescriptQuality } from \"./quality.js\";\r\nimport { typescriptSecurity } from \"./security.js\";\r\nimport { typescriptSizeComplexity } from \"./size-complexity.js\";\r\nimport { typescriptTypeAware } from \"./type-aware.js\";\r\n\r\nexport type TypescriptRecommendedOptions = {\r\n /**\r\n * When set, enables type-aware rules (more powerful, can be slower).\r\n *\r\n * Recommended for mature codebases, but not required for MVP.\r\n */\r\n typeChecked?: boolean;\r\n\r\n /**\r\n * Type-aware linting requires a project TSConfig.\r\n * Example: \"./tsconfig.json\".\r\n */\r\n tsconfigPath?: string | string[];\r\n\r\n /**\r\n * tsconfigRootDir should usually be import.meta.dirname from the consumer repo.\r\n */\r\n tsconfigRootDir?: string;\r\n\r\n files?: string[];\r\n\r\n /**\r\n * When true (default), enables strict conventions (e.g. no default exports).\r\n */\r\n enableConventions?: boolean;\r\n};\r\n\r\nexport function typescriptRecommended(\r\n options: TypescriptRecommendedOptions = {}\r\n) {\r\n const files = options.files ?? [\"**/*.{ts,tsx,mts,cts}\"];\r\n const enableConventions = options.enableConventions ?? true;\r\n\r\n const upstreamConfigs = options.typeChecked\r\n ? tseslint.configs.recommendedTypeChecked\r\n : tseslint.configs.recommended;\r\n\r\n const typeAwareConfig = options.typeChecked\r\n ? typescriptTypeAware({\r\n files,\r\n tsconfigPath: options.tsconfigPath,\r\n tsconfigRootDir: options.tsconfigRootDir,\r\n })\r\n : [];\r\n\r\n const conventionsConfig = enableConventions\r\n ? typescriptConventions({ files })\r\n : [];\r\n\r\n return [\r\n ...typescriptBase({ files }),\r\n ...typescriptQuality({ files }),\r\n ...typescriptImports({ files }),\r\n ...typescriptSecurity({ files }),\r\n ...typescriptNamingEnv({ files }),\r\n ...typescriptDocs({ files }),\r\n ...typescriptSizeComplexity({ files }),\r\n ...conventionsConfig,\r\n ...typeAwareConfig,\r\n ...upstreamConfigs.map((config) => ({\r\n ...config,\r\n files,\r\n })),\r\n ];\r\n}\r\n","import sonarjs from \"eslint-plugin-sonarjs\";\r\nimport unicorn from \"eslint-plugin-unicorn\";\r\n\r\nexport type TypescriptQualityOptions = {\r\n files?: string[];\r\n};\r\n\r\nconst UNICORN_ABBREVIATIONS = {\r\n allowList: {\r\n Props: true,\r\n props: true,\r\n Ref: true,\r\n ref: true,\r\n Src: true,\r\n src: true,\r\n Params: true,\r\n params: true,\r\n Env: true,\r\n env: true,\r\n Args: true,\r\n args: true,\r\n Docs: true,\r\n docs: true,\r\n arg: true,\r\n err: true,\r\n req: true,\r\n res: true,\r\n ctx: true,\r\n val: true,\r\n },\r\n};\r\n\r\nexport function typescriptQuality(options: TypescriptQualityOptions = {}) {\r\n const files = options.files ?? [\"**/*.{ts,tsx,mts,cts}\"];\r\n\r\n return [\r\n {\r\n files,\r\n plugins: {\r\n unicorn,\r\n sonarjs,\r\n },\r\n rules: {\r\n // Unicorn\r\n \"unicorn/prefer-node-protocol\": \"error\",\r\n \"unicorn/no-useless-undefined\": \"error\",\r\n \"unicorn/no-lonely-if\": \"error\",\r\n \"unicorn/prefer-optional-catch-binding\": \"error\",\r\n \"unicorn/prefer-string-replace-all\": \"error\",\r\n \"unicorn/prevent-abbreviations\": [\"warn\", UNICORN_ABBREVIATIONS],\r\n\r\n // Best Practices\r\n \"consistent-return\": \"error\",\r\n \"no-implicit-coercion\": \"error\",\r\n\r\n // SonarJS\r\n \"sonarjs/cognitive-complexity\": [\"error\", 15],\r\n \"sonarjs/no-identical-functions\": \"error\",\r\n \"sonarjs/no-duplicated-branches\": \"error\",\r\n \"sonarjs/no-redundant-boolean\": \"error\",\r\n \"sonarjs/no-inverted-boolean-check\": \"error\",\r\n },\r\n },\r\n ];\r\n}\r\n","import regexpPlugin from \"eslint-plugin-regexp\";\r\nimport securityPlugin from \"eslint-plugin-security\";\r\nimport type { FlatConfig } from \"typescript-eslint\";\r\n\r\nexport type TypescriptSecurityOptions = {\r\n files?: string[];\r\n};\r\n\r\nexport function typescriptSecurity(options: TypescriptSecurityOptions = {}) {\r\n const files = options.files ?? [\"**/*.{ts,tsx,mts,cts}\"];\r\n\r\n return [\r\n {\r\n files,\r\n plugins: {\r\n security: securityPlugin as unknown as FlatConfig.Plugin,\r\n regexp: regexpPlugin,\r\n },\r\n rules: {\r\n // eslint-plugin-security\r\n \"security/detect-object-injection\": \"error\",\r\n \"security/detect-unsafe-regex\": \"error\",\r\n\r\n // eslint-plugin-regexp\r\n \"regexp/no-super-linear-backtracking\": \"error\",\r\n \"regexp/no-useless-escape\": \"error\",\r\n \"regexp/no-empty-capturing-group\": \"error\",\r\n },\r\n },\r\n ];\r\n}\r\n","export type TypescriptSizeComplexityOptions = {\r\n files?: string[];\r\n};\r\n\r\nexport function typescriptSizeComplexity(\r\n options: TypescriptSizeComplexityOptions = {}\r\n) {\r\n const files = options.files ?? [\"**/*.{ts,tsx,mts,cts}\"];\r\n\r\n return [\r\n {\r\n files,\r\n rules: {\r\n \"max-lines\": [\r\n \"error\",\r\n { max: 100, skipBlankLines: true, skipComments: true },\r\n ],\r\n \"max-lines-per-function\": [\r\n \"error\",\r\n { max: 50, skipBlankLines: true, skipComments: true },\r\n ],\r\n complexity: [\"error\", 15],\r\n \"max-params\": [\"error\", 3],\r\n \"max-depth\": [\"error\", 4],\r\n \"no-var\": \"error\",\r\n \"prefer-const\": \"warn\",\r\n },\r\n },\r\n ];\r\n}\r\n","import tseslint from \"typescript-eslint\";\r\n\r\nexport type TypescriptTypeAwareOptions = {\r\n /**\r\n * Type-aware linting requires a project TSConfig.\r\n * Example: \"./tsconfig.json\".\r\n */\r\n tsconfigPath?: string | string[];\r\n\r\n /**\r\n * tsconfigRootDir should usually be import.meta.dirname from the consumer repo.\r\n */\r\n tsconfigRootDir?: string;\r\n\r\n files?: string[];\r\n};\r\n\r\nexport function typescriptTypeAware(options: TypescriptTypeAwareOptions = {}) {\r\n const files = options.files ?? [\"**/*.{ts,tsx,mts,cts}\"];\r\n\r\n return [\r\n {\r\n files,\r\n plugins: {\r\n \"@typescript-eslint\": tseslint.plugin,\r\n },\r\n languageOptions: {\r\n parserOptions: {\r\n project: options.tsconfigPath ?? \"./tsconfig.json\",\r\n tsconfigRootDir: options.tsconfigRootDir,\r\n },\r\n },\r\n rules: {\r\n \"@typescript-eslint/require-await\": \"error\",\r\n \"@typescript-eslint/no-floating-promises\": \"error\",\r\n \"@typescript-eslint/no-misused-promises\": \"error\",\r\n \"@typescript-eslint/await-thenable\": \"error\",\r\n \"@typescript-eslint/no-unnecessary-condition\": \"warn\",\r\n \"@typescript-eslint/no-unnecessary-type-assertion\": \"error\",\r\n \"@typescript-eslint/restrict-template-expressions\": \"error\",\r\n \"@typescript-eslint/prefer-nullish-coalescing\": \"error\",\r\n \"@typescript-eslint/prefer-optional-chain\": \"error\",\r\n \"@typescript-eslint/switch-exhaustiveness-check\": \"error\",\r\n \"@typescript-eslint/no-deprecated\": \"error\",\r\n \"@typescript-eslint/consistent-type-exports\": \"error\",\r\n },\r\n },\r\n ];\r\n}\r\n","import type { ESLint } from \"eslint\";\r\n\r\n/**\r\n * Placeholder for future custom rules.\r\n *\r\n * Exporting a plugin object now keeps the package structure stable as you add\r\n * domain-specific rules later.\r\n */\r\nexport const plugin: ESLint.Plugin = {\r\n rules: {},\r\n};\r\n"],"mappings":"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","names":["importPlugin","tseslint","unicorn","tseslint","tseslint"]}
1
+ {"version":3,"sources":["../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 tseslint from \"typescript-eslint\";\r\n\r\nexport type TypescriptBaseOptions = {\r\n files?: string[];\r\n};\r\n\r\nexport function typescriptBase(options: TypescriptBaseOptions = {}) {\r\n const files = options.files ?? [\"**/*.{ts,tsx,mts,cts}\"];\r\n\r\n return [\r\n {\r\n files,\r\n plugins: {\r\n \"@typescript-eslint\": tseslint.plugin,\r\n },\r\n languageOptions: {\r\n parser: tseslint.parser,\r\n parserOptions: {\r\n ecmaVersion: \"latest\",\r\n sourceType: \"module\",\r\n },\r\n },\r\n rules: {\r\n \"@typescript-eslint/consistent-type-imports\": \"error\",\r\n \"@typescript-eslint/no-unused-vars\": \"error\",\r\n \"@typescript-eslint/no-shadow\": \"error\",\r\n \"@typescript-eslint/ban-ts-comment\": \"error\",\r\n \"@typescript-eslint/no-explicit-any\": \"warn\",\r\n \"@typescript-eslint/no-inferrable-types\": \"error\",\r\n \"no-undef\": \"off\",\r\n \"no-unused-vars\": \"off\",\r\n \"no-var\": \"error\",\r\n \"prefer-const\": \"error\",\r\n eqeqeq: [\"error\", \"always\", { null: \"ignore\" }],\r\n \"no-implicit-coercion\": \"error\",\r\n },\r\n },\r\n ];\r\n}\r\n","import importPlugin from \"eslint-plugin-import\";\r\n\r\nexport type TypescriptConventionsOptions = {\r\n files?: string[];\r\n};\r\n\r\nexport function typescriptConventions(\r\n options: TypescriptConventionsOptions = {}\r\n) {\r\n const files = options.files ?? [\"**/*.{ts,tsx,mts,cts}\"];\r\n\r\n return [\r\n {\r\n files,\r\n plugins: {\r\n import: importPlugin,\r\n },\r\n rules: {\r\n // 6.1 Rule table\r\n \"import/no-default-export\": \"error\",\r\n \"@typescript-eslint/consistent-type-definitions\": [\"error\", \"type\"],\r\n \"@typescript-eslint/consistent-type-imports\": \"error\",\r\n \"prefer-arrow-callback\": \"error\",\r\n },\r\n },\r\n // 6.2 Overrides\r\n {\r\n files: [\r\n \"**/*.config.{js,mjs,ts}\",\r\n \"**/app/**/{page,layout,template,not-found,global-error,loading,error}.tsx\",\r\n \"**/*.stories.tsx\",\r\n \"**/*.d.ts\",\r\n ],\r\n rules: {\r\n \"import/no-default-export\": \"off\",\r\n },\r\n },\r\n ];\r\n}\r\n","import comments from \"@eslint-community/eslint-plugin-eslint-comments\";\r\nimport jsdoc from \"eslint-plugin-jsdoc\";\r\n\r\nexport type TypescriptDocsOptions = {\r\n files?: string[];\r\n};\r\n\r\nexport function typescriptDocs(options: TypescriptDocsOptions = {}) {\r\n const files = options.files ?? [\"**/*.{ts,tsx,mts,cts}\"];\r\n\r\n return [\r\n {\r\n files,\r\n plugins: {\r\n jsdoc: jsdoc,\r\n \"eslint-comments\": comments,\r\n },\r\n rules: {\r\n \"eslint-comments/no-unused-disable\": \"error\",\r\n \"eslint-comments/no-unlimited-disable\": \"error\",\r\n \"eslint-comments/require-description\": \"error\",\r\n \"eslint-comments/disable-enable-pair\": \"error\",\r\n \"jsdoc/check-alignment\": \"error\",\r\n \"jsdoc/require-param\": \"error\",\r\n \"jsdoc/require-returns\": \"error\",\r\n },\r\n },\r\n ];\r\n}\r\n","import type { Linter } from \"eslint\";\r\nimport tseslint from \"typescript-eslint\";\r\n\r\nexport type TypescriptFunctionalOptions = {\r\n files?: string[];\r\n};\r\n\r\nconst FUNCTIONAL_RULES: Linter.RulesRecord = {\r\n // Type Safety\r\n \"@typescript-eslint/explicit-module-boundary-types\": \"warn\",\r\n\r\n // Modern Syntax\r\n \"@typescript-eslint/default-param-last\": \"error\",\r\n \"prefer-rest-params\": \"error\",\r\n \"prefer-spread\": \"error\",\r\n \"no-new-func\": \"error\",\r\n\r\n // Clean Code\r\n \"@typescript-eslint/no-empty-function\": \"error\",\r\n};\r\n\r\nexport function typescriptFunctional(\r\n options: TypescriptFunctionalOptions = {}\r\n) {\r\n const files = options.files ?? [\"**/*.{ts,tsx,mts,cts}\"];\r\n\r\n return [\r\n {\r\n files,\r\n plugins: {\r\n \"@typescript-eslint\": tseslint.plugin,\r\n },\r\n rules: FUNCTIONAL_RULES,\r\n },\r\n ];\r\n}\r\n","import type { Linter } from \"eslint\";\r\nimport importPlugin from \"eslint-plugin-import\";\r\nimport simpleImportSort from \"eslint-plugin-simple-import-sort\";\r\n\r\nconst IMPORTS_RULES: Linter.RulesRecord = {\r\n \"import/no-duplicates\": \"error\",\r\n \"import/no-cycle\": \"error\",\r\n \"import/no-mutable-exports\": \"error\",\r\n \"import/first\": \"error\",\r\n \"import/newline-after-import\": \"error\",\r\n \"import/no-extraneous-dependencies\": [\r\n \"error\",\r\n {\r\n devDependencies: [\r\n \"**/*.test.ts\",\r\n \"**/*.spec.ts\",\r\n \"test/**\",\r\n \"tests/**\",\r\n \"**/*.config.{js,ts,mjs}\",\r\n \"**/*.stories.tsx\",\r\n \"scripts/**\",\r\n ],\r\n optionalDependencies: false,\r\n peerDependencies: false,\r\n },\r\n ],\r\n\r\n \"simple-import-sort/imports\": \"error\",\r\n \"simple-import-sort/exports\": \"error\",\r\n\r\n \"import/no-deprecated\": \"error\",\r\n \"no-restricted-imports\": \"off\",\r\n};\r\n\r\nexport type TypescriptImportsOptions = {\r\n files?: string[];\r\n};\r\n\r\nexport function typescriptImports(options: TypescriptImportsOptions = {}) {\r\n const files = options.files ?? [\"**/*.{ts,tsx,mts,cts}\"];\r\n\r\n return [\r\n {\r\n files,\r\n plugins: {\r\n import: importPlugin,\r\n \"simple-import-sort\": simpleImportSort,\r\n },\r\n settings: {\r\n \"import/parsers\": {\r\n \"@typescript-eslint/parser\": [\".ts\", \".tsx\", \".mts\", \".cts\"],\r\n },\r\n \"import/resolver\": {\r\n typescript: {\r\n alwaysTryTypes: true,\r\n project: [\"tsconfig.json\", \"*/tsconfig.json\"],\r\n },\r\n node: true,\r\n },\r\n },\r\n rules: IMPORTS_RULES,\r\n },\r\n ];\r\n}\r\n","import { typescriptBase } from \"./base.js\";\r\n\r\nexport type TypescriptConfigFiles = string[];\r\n\r\nexport type TypescriptMinimalOptions = {\r\n files?: TypescriptConfigFiles;\r\n}\r\n\r\n/**\r\n * MVP TypeScript profile.\r\n *\r\n * Intentionally minimal: enables TypeScript parsing and one rule to prove\r\n * end-to-end packaging + consumption.\r\n * @param options - Configuration options.\r\n * @returns The ESLint configuration.\r\n */\r\nexport function typescriptMinimal(options: TypescriptMinimalOptions = {}) {\r\n return typescriptBase(options);\r\n}\r\n","import type { Linter } from \"eslint\";\r\nimport unicorn from \"eslint-plugin-unicorn\";\r\n\r\nexport type TypescriptNamingEnvOptions = {\r\n files?: string[];\r\n};\r\n\r\nconst NAMING_RULES: Linter.RulesRecord = {\r\n \"unicorn/filename-case\": [\r\n \"error\",\r\n {\r\n cases: {\r\n kebabCase: true,\r\n pascalCase: true,\r\n },\r\n ignore: [\"NEXT_\", \"README\", \"CHANGELOG\", \"LICENSE\", \"Dockerfile\", \"^_\"],\r\n },\r\n ],\r\n \"no-restricted-globals\": [\"error\", \"event\", \"fdescribe\"],\r\n};\r\n\r\nexport function typescriptNamingEnv(options: TypescriptNamingEnvOptions = {}) {\r\n const files = options.files ?? [\"**/*.{ts,tsx,mts,cts}\"];\r\n\r\n return [\r\n {\r\n files,\r\n plugins: {\r\n unicorn,\r\n },\r\n rules: NAMING_RULES,\r\n },\r\n ];\r\n}\r\n","import eslintConfigPrettier from \"eslint-config-prettier\";\r\n\r\nexport type TypescriptPrettierOptions = {\r\n files?: string[];\r\n};\r\n\r\nexport function typescriptPrettierInterop(\r\n options: TypescriptPrettierOptions = {}\r\n) {\r\n const files = options.files ?? [\"**/*.{ts,tsx,mts,cts}\"];\r\n\r\n return [\r\n {\r\n files,\r\n rules: {\r\n ...eslintConfigPrettier.rules,\r\n },\r\n },\r\n ];\r\n}\r\n","import tseslint from \"typescript-eslint\";\r\n\r\nimport { typescriptBase } from \"./base.js\";\r\nimport { typescriptConventions } from \"./conventions.js\";\r\nimport { typescriptDocs } from \"./docs.js\";\r\nimport { typescriptFunctional } from \"./functional.js\";\r\nimport { typescriptImports } from \"./imports.js\";\r\nimport { typescriptNamingEnv } from \"./naming-env.js\";\r\nimport { typescriptQuality } from \"./quality.js\";\r\nimport { typescriptSecurity } from \"./security.js\";\r\nimport { typescriptSizeComplexity } from \"./size-complexity.js\";\r\nimport { typescriptTypeAware } from \"./type-aware.js\";\r\n\r\nexport type TypescriptRecommendedOptions = {\r\n /**\r\n * When set, enables type-aware rules (more powerful, can be slower).\r\n *\r\n * Recommended for mature codebases, but not required for MVP.\r\n */\r\n typeChecked?: boolean;\r\n\r\n /**\r\n * Type-aware linting requires a project TSConfig.\r\n * Example: \"./tsconfig.json\".\r\n */\r\n tsconfigPath?: string | string[];\r\n\r\n /**\r\n * tsconfigRootDir should usually be import.meta.dirname from the consumer repo.\r\n */\r\n tsconfigRootDir?: string;\r\n\r\n files?: string[];\r\n\r\n /**\r\n * When true (default), enables strict conventions (e.g. no default exports).\r\n */\r\n enableConventions?: boolean;\r\n};\r\n\r\nexport function typescriptRecommended(\r\n options: TypescriptRecommendedOptions = {}\r\n) {\r\n const files = options.files ?? [\"**/*.{ts,tsx,mts,cts}\"];\r\n const enableConventions = options.enableConventions ?? true;\r\n\r\n const upstreamConfigs = options.typeChecked\r\n ? tseslint.configs.recommendedTypeChecked\r\n : tseslint.configs.recommended;\r\n\r\n const typeAwareConfig = options.typeChecked\r\n ? typescriptTypeAware({\r\n files,\r\n tsconfigPath: options.tsconfigPath,\r\n tsconfigRootDir: options.tsconfigRootDir,\r\n })\r\n : [];\r\n\r\n const conventionsConfig = enableConventions\r\n ? typescriptConventions({ files })\r\n : [];\r\n\r\n return [\r\n ...typescriptBase({ files }),\r\n ...typescriptQuality({ files }),\r\n ...typescriptImports({ files }),\r\n ...typescriptSecurity({ files }),\r\n ...typescriptNamingEnv({ files }),\r\n ...typescriptFunctional({ files }),\r\n ...typescriptDocs({ files }),\r\n ...typescriptSizeComplexity({ files }),\r\n ...conventionsConfig,\r\n ...typeAwareConfig,\r\n ...upstreamConfigs.map((config) => ({\r\n ...config,\r\n files,\r\n })),\r\n ];\r\n}\r\n","import sonarjs from \"eslint-plugin-sonarjs\";\r\nimport unicorn from \"eslint-plugin-unicorn\";\r\n\r\nexport type TypescriptQualityOptions = {\r\n files?: string[];\r\n};\r\n\r\nconst UNICORN_ABBREVIATIONS = {\r\n allowList: {\r\n Props: true,\r\n props: true,\r\n Ref: true,\r\n ref: true,\r\n Src: true,\r\n src: true,\r\n Params: true,\r\n params: true,\r\n Env: true,\r\n env: true,\r\n Args: true,\r\n args: true,\r\n Docs: true,\r\n docs: true,\r\n arg: true,\r\n err: true,\r\n req: true,\r\n res: true,\r\n ctx: true,\r\n val: true,\r\n },\r\n};\r\n\r\nexport function typescriptQuality(options: TypescriptQualityOptions = {}) {\r\n const files = options.files ?? [\"**/*.{ts,tsx,mts,cts}\"];\r\n\r\n return [\r\n {\r\n files,\r\n plugins: {\r\n unicorn,\r\n sonarjs,\r\n },\r\n rules: {\r\n // Unicorn\r\n \"unicorn/prefer-node-protocol\": \"error\",\r\n \"unicorn/no-useless-undefined\": \"error\",\r\n \"unicorn/no-lonely-if\": \"error\",\r\n \"unicorn/prefer-optional-catch-binding\": \"error\",\r\n \"unicorn/prefer-string-replace-all\": \"error\",\r\n \"unicorn/prevent-abbreviations\": [\"warn\", UNICORN_ABBREVIATIONS],\r\n\r\n // Best Practices\r\n \"consistent-return\": \"error\",\r\n \"no-implicit-coercion\": \"error\",\r\n\r\n // SonarJS\r\n \"sonarjs/cognitive-complexity\": [\"error\", 15],\r\n \"sonarjs/no-identical-functions\": \"error\",\r\n \"sonarjs/no-duplicated-branches\": \"error\",\r\n \"sonarjs/no-redundant-boolean\": \"error\",\r\n \"sonarjs/no-inverted-boolean-check\": \"error\",\r\n },\r\n },\r\n ];\r\n}\r\n","import regexpPlugin from \"eslint-plugin-regexp\";\r\nimport securityPlugin from \"eslint-plugin-security\";\r\nimport type { FlatConfig } from \"typescript-eslint\";\r\n\r\nexport type TypescriptSecurityOptions = {\r\n files?: string[];\r\n};\r\n\r\nexport function typescriptSecurity(options: TypescriptSecurityOptions = {}) {\r\n const files = options.files ?? [\"**/*.{ts,tsx,mts,cts}\"];\r\n\r\n return [\r\n {\r\n files,\r\n plugins: {\r\n security: securityPlugin as unknown as FlatConfig.Plugin,\r\n regexp: regexpPlugin,\r\n },\r\n rules: {\r\n // eslint-plugin-security\r\n \"security/detect-object-injection\": \"error\",\r\n \"security/detect-unsafe-regex\": \"error\",\r\n\r\n // eslint-plugin-regexp\r\n \"regexp/no-super-linear-backtracking\": \"error\",\r\n \"regexp/no-useless-escape\": \"error\",\r\n \"regexp/no-empty-capturing-group\": \"error\",\r\n },\r\n },\r\n ];\r\n}\r\n","export type TypescriptSizeComplexityOptions = {\r\n files?: string[];\r\n};\r\n\r\nexport function typescriptSizeComplexity(\r\n options: TypescriptSizeComplexityOptions = {}\r\n) {\r\n const files = options.files ?? [\"**/*.{ts,tsx,mts,cts}\"];\r\n\r\n return [\r\n {\r\n files,\r\n rules: {\r\n \"max-lines\": [\r\n \"error\",\r\n { max: 100, skipBlankLines: true, skipComments: true },\r\n ],\r\n \"max-lines-per-function\": [\r\n \"error\",\r\n { max: 50, skipBlankLines: true, skipComments: true },\r\n ],\r\n complexity: [\"error\", 15],\r\n \"max-params\": [\"error\", 3],\r\n \"max-depth\": [\"error\", 4],\r\n \"no-var\": \"error\",\r\n \"prefer-const\": \"warn\",\r\n },\r\n },\r\n ];\r\n}\r\n","import tseslint from \"typescript-eslint\";\r\n\r\nexport type TypescriptTypeAwareOptions = {\r\n /**\r\n * Type-aware linting requires a project TSConfig.\r\n * Example: \"./tsconfig.json\".\r\n */\r\n tsconfigPath?: string | string[];\r\n\r\n /**\r\n * tsconfigRootDir should usually be import.meta.dirname from the consumer repo.\r\n */\r\n tsconfigRootDir?: string;\r\n\r\n files?: string[];\r\n};\r\n\r\nexport function typescriptTypeAware(options: TypescriptTypeAwareOptions = {}) {\r\n const files = options.files ?? [\"**/*.{ts,tsx,mts,cts}\"];\r\n\r\n return [\r\n {\r\n files,\r\n plugins: {\r\n \"@typescript-eslint\": tseslint.plugin,\r\n },\r\n languageOptions: {\r\n parserOptions: {\r\n project: options.tsconfigPath ?? \"./tsconfig.json\",\r\n tsconfigRootDir: options.tsconfigRootDir,\r\n },\r\n },\r\n rules: {\r\n \"@typescript-eslint/require-await\": \"error\",\r\n \"@typescript-eslint/no-floating-promises\": \"error\",\r\n \"@typescript-eslint/no-misused-promises\": \"error\",\r\n \"@typescript-eslint/await-thenable\": \"error\",\r\n \"@typescript-eslint/no-unnecessary-condition\": \"warn\",\r\n \"@typescript-eslint/no-unnecessary-type-assertion\": \"error\",\r\n \"@typescript-eslint/restrict-template-expressions\": \"error\",\r\n \"@typescript-eslint/prefer-nullish-coalescing\": \"error\",\r\n \"@typescript-eslint/prefer-optional-chain\": \"error\",\r\n \"@typescript-eslint/switch-exhaustiveness-check\": \"error\",\r\n \"@typescript-eslint/no-deprecated\": \"error\",\r\n \"@typescript-eslint/consistent-type-exports\": \"error\",\r\n },\r\n },\r\n ];\r\n}\r\n","import type { ESLint } from \"eslint\";\r\n\r\n/**\r\n * Placeholder for future custom rules.\r\n *\r\n * Exporting a plugin object now keeps the package structure stable as you add\r\n * domain-specific rules later.\r\n */\r\nexport const plugin: ESLint.Plugin = {\r\n rules: {},\r\n};\r\n"],"mappings":"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","names":["tseslint","importPlugin","tseslint","unicorn","tseslint","tseslint"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stride.it/appoint-lint-governance",
3
- "version": "0.1.23",
3
+ "version": "0.1.25",
4
4
  "description": "Shareable ESLint flat-config profiles (MVP: TypeScript) for normalizing lint across repos.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -11,7 +11,6 @@
11
11
  "import": "./dist/index.js"
12
12
  }
13
13
  },
14
- "packageManager": "pnpm@9.0.0",
15
14
  "files": [
16
15
  "dist",
17
16
  "README.md"
@@ -19,13 +18,6 @@
19
18
  "publishConfig": {
20
19
  "access": "public"
21
20
  },
22
- "scripts": {
23
- "build": "tsup",
24
- "lint": "eslint . --fix",
25
- "lint:fix": "eslint . --fix",
26
- "prepack": "pnpm build",
27
- "test": "vitest run --passWithNoTests"
28
- },
29
21
  "dependencies": {
30
22
  "@eslint-community/eslint-plugin-eslint-comments": "^4.6.0",
31
23
  "eslint-config-prettier": "^10.1.8",
@@ -51,5 +43,11 @@
51
43
  "tsup": "^8.5.0",
52
44
  "typescript": "^5.9.3",
53
45
  "vitest": "^4.0.17"
46
+ },
47
+ "scripts": {
48
+ "build": "tsup",
49
+ "lint": "eslint . --fix",
50
+ "lint:fix": "eslint . --fix",
51
+ "test": "vitest run --passWithNoTests"
54
52
  }
55
- }
53
+ }