@stride.it/appoint-lint-governance 0.1.24 → 0.1.26

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,169 @@
1
- # @stride-info-tech/appoint-lint-governance
2
-
3
- Shareable ESLint **flat-config** profiles for normalizing lint rules across repositories.
4
-
5
- ## TypeScript profiles
6
-
7
- Profiles are flat-config builders intended to be composed:
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`
18
-
19
- ## Install
20
-
21
- In a consumer repo:
22
-
23
- ```bash
24
- pnpm add -D @stride-info-tech/appoint-lint-governance eslint
25
- ```
26
-
27
- ## Use in a consumer repo (ESLint v9 flat config)
28
-
29
- Create (or edit) `eslint.config.mjs`:
30
-
31
- ```js
32
- import { typescriptMinimal } from "@stride.it/appoint-lint-governance";
33
-
34
- export default [
35
- ...typescriptMinimal(),
36
- ];
37
- ```
38
-
39
- ### Type-Aware Linting (Optional)
40
-
41
- To enable powerful Type-Aware rules (verifies promise handling, proper awaiting, etc.), provide `typeChecked: true` and project details:
42
-
43
- ```js
44
- import { typescriptRecommended } from "@stride.it/appoint-lint-governance";
45
-
46
- export default [
47
- ...typescriptRecommended({
48
- typeChecked: true,
49
- tsconfigPath: "./tsconfig.json",
50
- tsconfigRootDir: import.meta.dirname, // Requires Node.js 20.11+ or 22+
51
- }),
52
- ];
53
- ```
54
-
55
- ### Prettier Interop (Optional)
56
-
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:
58
-
59
- ```js
60
- import { typescriptRecommended, typescriptPrettierInterop } from "@stride.it/appoint-lint-governance";
61
-
62
- export default [
63
- ...typescriptRecommended(),
64
- // ... other configs
65
- ...typescriptPrettierInterop(), // Must be last
66
- ];
67
- ```
68
-
69
- ## Local testing (before publishing to npm)
70
-
71
- From this repo:
72
-
73
- ```bash
74
- pnpm install
75
- pnpm build
76
- npm pack
77
- ```
78
-
79
- Then in a different repo, install the generated `.tgz`:
80
-
81
- ```bash
82
- pnpm add -D ../appoint-lint-governance/<generated-file>.tgz
83
- ```
84
-
85
- ## Can consumer repos override rules?
86
-
87
- Yes.
88
-
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).
90
-
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).
1
+ # @stride.it/appoint-lint-governance
2
+
3
+ [![npm version](https://badge.fury.io/js/@stride.it%2Fappoint-lint-governance.svg)](https://www.npmjs.com/package/@stride.it/appoint-lint-governance)
4
+ [![npm downloads](https://img.shields.io/npm/dm/@stride.it/appoint-lint-governance.svg)](https://www.npmjs.com/package/@stride.it/appoint-lint-governance)
5
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
6
+ [![TypeScript](https://img.shields.io/badge/TypeScript-5.9-blue.svg)](https://www.typescriptlang.org/)
7
+ [![ESLint](https://img.shields.io/badge/ESLint-9.0-purple.svg)](https://eslint.org/)
8
+ [![Bundle Size](https://img.shields.io/bundlephobia/minzip/@stride.it/appoint-lint-governance)](https://bundlephobia.com/package/@stride.it/appoint-lint-governance)
9
+
10
+ Shareable ESLint v9 flat-config builders to normalize TypeScript linting across repositories.
11
+
12
+ 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.
13
+
14
+ ## What you get
15
+
16
+ - Composable flat-config builders (arrays of ESLint config objects).
17
+ - A minimal baseline for fast adoption.
18
+ - A recommended preset that composes the major rule groups.
19
+ - Optional type-aware rules (requires a TSConfig project).
20
+ - Optional Prettier interop preset to disable formatting-rule conflicts.
21
+
22
+ Non-goals:
23
+
24
+ - No framework/domain targeting (React/Next/Vue/a11y/test-runner plugins are out of scope).
25
+ - No formatting (Prettier remains the formatter; ESLint formatting conflicts are disabled via the interop preset).
26
+
27
+ ## Install
28
+
29
+ In a consumer repo:
30
+
31
+ ```bash
32
+ pnpm add -D @stride.it/appoint-lint-governance eslint
33
+ ```
34
+
35
+ ESLint is a peer dependency; your repo owns the ESLint version.
36
+
37
+ ## Quick start (ESLint v9 flat config)
38
+
39
+ Create (or edit) `eslint.config.mjs`:
40
+
41
+ ```js
42
+ import { typescriptMinimal } from "@stride.it/appoint-lint-governance";
43
+
44
+ export default [...typescriptMinimal()];
45
+ ```
46
+
47
+ Run ESLint in your repo as usual:
48
+
49
+ ```bash
50
+ pnpm lint
51
+ ```
52
+
53
+ ## Public API
54
+
55
+ These builders return arrays you spread into your `eslint.config.*`:
56
+
57
+ - `typescriptBase(options?)`\
58
+ Baseline correctness + safe defaults (files globs, languageOptions).
59
+ - `typescriptMinimal(options?)`\
60
+ Minimal preset (fast adoption baseline).
61
+ - `typescriptRecommended(options?)`\
62
+ Recommended preset that composes core groups and can optionally enable type-aware rules.
63
+ - `typescriptPrettierInterop(options?)`\
64
+ Disables formatting-rule conflicts when the consumer repo uses Prettier.
65
+
66
+ Additionally:
67
+
68
+ - `plugin`\
69
+ Optional plugin export used by internal configs.
70
+
71
+ ## Recommended preset (most repos)
72
+
73
+ ```js
74
+ import { typescriptRecommended } from "@stride.it/appoint-lint-governance";
75
+
76
+ export default [...typescriptRecommended()];
77
+ ```
78
+
79
+ ### Type-aware linting (optional)
80
+
81
+ Type-aware rules can catch issues ESLint cannot detect from syntax alone (for example: misused promises, unsafe operations). They require a TSConfig project.
82
+
83
+ ```js
84
+ import { typescriptRecommended } from "@stride.it/appoint-lint-governance";
85
+
86
+ export default [
87
+ ...typescriptRecommended({
88
+ typeChecked: true,
89
+ tsconfigPath: "./tsconfig.json",
90
+ tsconfigRootDir: import.meta.dirname,
91
+ }),
92
+ ];
93
+ ```
94
+
95
+ If your Node.js version does not support `import.meta.dirname`, use this portable alternative:
96
+
97
+ ```js
98
+ import { fileURLToPath } from "node:url";
99
+
100
+ const tsconfigRootDir = fileURLToPath(new URL(".", import.meta.url));
101
+ ```
102
+
103
+ Then pass `tsconfigRootDir` into `typescriptRecommended({ ... })`.
104
+
105
+ ## Prettier interop (optional)
106
+
107
+ If your project uses Prettier, include the interop preset last so it can override earlier formatting rules:
108
+
109
+ ```js
110
+ import {
111
+ typescriptPrettierInterop,
112
+ typescriptRecommended,
113
+ } from "@stride.it/appoint-lint-governance";
114
+
115
+ export default [
116
+ ...typescriptRecommended(),
117
+ ...typescriptPrettierInterop(),
118
+ ];
119
+ ```
120
+
121
+ ## Overriding rules in consumer repos
122
+
123
+ Flat config is order-dependent: later entries win. Consumers can override by appending their own config object after spreading a preset.
124
+
125
+ 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.*`.
126
+
127
+ ## Suggested companion quality gates (outside ESLint)
128
+
129
+ This package intentionally focuses on ESLint rules. Many teams also enforce these CI gates:
130
+
131
+ - Type checking: `tsc --noEmit`
132
+ - Dependency audit: `pnpm audit` (or your org-approved alternative)
133
+ - Secret scanning and SAST (org-dependent)
134
+
135
+ ## Development (this repo)
136
+
137
+ ```bash
138
+ pnpm install
139
+ pnpm test
140
+ pnpm build
141
+ ```
142
+
143
+ To validate the publish output locally:
144
+
145
+ ```bash
146
+ npm pack
147
+ ```
148
+
149
+ Then install the generated `.tgz` into a consumer repo.
150
+
151
+ ## Publishing
152
+
153
+ 1) Bump version:
154
+
155
+ ```bash
156
+ pnpm version patch
157
+ ```
158
+
159
+ 1) Dry run:
160
+
161
+ ```bash
162
+ pnpm publish --dry-run
163
+ ```
164
+
165
+ 1) Publish (requires npm credentials with access to the `@stride.it` scope):
166
+
167
+ ```bash
168
+ pnpm publish --access public
169
+ ```
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/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"]}
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\";\n\nexport type TypescriptBaseOptions = {\n files?: string[];\n};\n\nexport function typescriptBase(options: TypescriptBaseOptions = {}) {\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 importPlugin from \"eslint-plugin-import\";\n\nexport type TypescriptConventionsOptions = {\n files?: string[];\n};\n\nexport function typescriptConventions(\n options: TypescriptConventionsOptions = {}\n) {\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 jsdoc from \"eslint-plugin-jsdoc\";\n\nexport type TypescriptDocsOptions = {\n files?: string[];\n};\n\nexport function typescriptDocs(options: TypescriptDocsOptions = {}) {\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) {\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 ],\n optionalDependencies: false,\n peerDependencies: false,\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(options: TypescriptImportsOptions = {}) {\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 { 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(options: TypescriptMinimalOptions = {}) {\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(options: TypescriptNamingEnvOptions = {}) {\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 eslintConfigPrettier from \"eslint-config-prettier\";\n\nexport type TypescriptPrettierOptions = {\n files?: string[];\n};\n\nexport function typescriptPrettierInterop(\n options: TypescriptPrettierOptions = {}\n) {\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 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) {\n const files = options.files ?? [\"**/*.{ts,tsx,mts,cts}\"];\n const enableConventions = options.enableConventions ?? true;\n\n const upstreamConfigs = options.typeChecked\n ? tseslint.configs.recommendedTypeChecked\n : tseslint.configs.recommended;\n\n const typeAwareConfig = options.typeChecked\n ? typescriptTypeAware({\n files,\n tsconfigPath: options.tsconfigPath,\n tsconfigRootDir: options.tsconfigRootDir,\n })\n : [];\n\n const conventionsConfig = 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 })),\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(options: TypescriptQualityOptions = {}) {\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 regexpPlugin from \"eslint-plugin-regexp\";\nimport securityPlugin from \"eslint-plugin-security\";\nimport type { FlatConfig } from \"typescript-eslint\";\n\nexport type TypescriptSecurityOptions = {\n files?: string[];\n};\n\nexport function typescriptSecurity(options: TypescriptSecurityOptions = {}) {\n const files = options.files ?? [\"**/*.{ts,tsx,mts,cts}\"];\n\n return [\n {\n files,\n plugins: {\n security: securityPlugin as unknown as FlatConfig.Plugin,\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","export type TypescriptSizeComplexityOptions = {\n files?: string[];\n};\n\nexport function typescriptSizeComplexity(\n options: TypescriptSizeComplexityOptions = {}\n) {\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 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(options: TypescriptTypeAwareOptions = {}) {\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"]}
package/package.json CHANGED
@@ -1,7 +1,19 @@
1
1
  {
2
2
  "name": "@stride.it/appoint-lint-governance",
3
- "version": "0.1.24",
3
+ "version": "0.1.26",
4
4
  "description": "Shareable ESLint flat-config profiles (MVP: TypeScript) for normalizing lint across repos.",
5
+ "keywords": [
6
+ "eslint",
7
+ "eslint-config",
8
+ "typescript",
9
+ "flat-config",
10
+ "linting",
11
+ "code-quality",
12
+ "static-analysis",
13
+ "typescript-eslint",
14
+ "governance",
15
+ "shareable-config"
16
+ ],
5
17
  "type": "module",
6
18
  "main": "./dist/index.js",
7
19
  "types": "./dist/index.d.ts",
@@ -11,20 +23,21 @@
11
23
  "import": "./dist/index.js"
12
24
  }
13
25
  },
14
- "packageManager": "pnpm@9.0.0",
15
26
  "files": [
16
27
  "dist",
17
28
  "README.md"
18
29
  ],
19
30
  "publishConfig": {
20
- "access": "public"
31
+ "access": "public",
32
+ "registry": "https://registry.npmjs.org"
21
33
  },
22
- "scripts": {
23
- "build": "tsup",
24
- "lint": "eslint . --fix",
25
- "lint:fix": "eslint . --fix",
26
- "prepack": "pnpm build",
27
- "test": "vitest run --passWithNoTests"
34
+ "repository": {
35
+ "type": "git",
36
+ "url": "git+https://github.com/Stride-Info-Tech/appoint-lint-governance.git"
37
+ },
38
+ "homepage": "https://github.com/Stride-Info-Tech/appoint-lint-governance#readme",
39
+ "bugs": {
40
+ "url": "https://github.com/Stride-Info-Tech/appoint-lint-governance/issues"
28
41
  },
29
42
  "dependencies": {
30
43
  "@eslint-community/eslint-plugin-eslint-comments": "^4.6.0",
@@ -51,5 +64,11 @@
51
64
  "tsup": "^8.5.0",
52
65
  "typescript": "^5.9.3",
53
66
  "vitest": "^4.0.17"
67
+ },
68
+ "scripts": {
69
+ "build": "tsup",
70
+ "lint": "eslint . --fix",
71
+ "lint:fix": "eslint . --fix",
72
+ "test": "vitest run --passWithNoTests"
54
73
  }
55
74
  }