eslint-plugin-llm-core 0.1.0

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.
Files changed (54) hide show
  1. package/README.md +99 -0
  2. package/dist/index.d.ts +12 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +75 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/rules/filename-match-export.d.ts +5 -0
  7. package/dist/rules/filename-match-export.d.ts.map +1 -0
  8. package/dist/rules/filename-match-export.js +198 -0
  9. package/dist/rules/filename-match-export.js.map +1 -0
  10. package/dist/rules/index.d.ts +11 -0
  11. package/dist/rules/index.d.ts.map +1 -0
  12. package/dist/rules/index.js +27 -0
  13. package/dist/rules/index.js.map +1 -0
  14. package/dist/rules/max-file-length.d.ts +12 -0
  15. package/dist/rules/max-file-length.d.ts.map +1 -0
  16. package/dist/rules/max-file-length.js +85 -0
  17. package/dist/rules/max-file-length.js.map +1 -0
  18. package/dist/rules/max-function-length.d.ts +11 -0
  19. package/dist/rules/max-function-length.d.ts.map +1 -0
  20. package/dist/rules/max-function-length.js +100 -0
  21. package/dist/rules/max-function-length.js.map +1 -0
  22. package/dist/rules/max-nesting-depth.d.ts +10 -0
  23. package/dist/rules/max-nesting-depth.d.ts.map +1 -0
  24. package/dist/rules/max-nesting-depth.js +106 -0
  25. package/dist/rules/max-nesting-depth.js.map +1 -0
  26. package/dist/rules/max-params.d.ts +11 -0
  27. package/dist/rules/max-params.d.ts.map +1 -0
  28. package/dist/rules/max-params.js +120 -0
  29. package/dist/rules/max-params.js.map +1 -0
  30. package/dist/rules/naming-conventions.d.ts +6 -0
  31. package/dist/rules/naming-conventions.d.ts.map +1 -0
  32. package/dist/rules/naming-conventions.js +79 -0
  33. package/dist/rules/naming-conventions.js.map +1 -0
  34. package/dist/rules/no-exported-function-expressions.d.ts +6 -0
  35. package/dist/rules/no-exported-function-expressions.d.ts.map +1 -0
  36. package/dist/rules/no-exported-function-expressions.js +130 -0
  37. package/dist/rules/no-exported-function-expressions.js.map +1 -0
  38. package/dist/rules/no-inline-disable.d.ts +5 -0
  39. package/dist/rules/no-inline-disable.d.ts.map +1 -0
  40. package/dist/rules/no-inline-disable.js +47 -0
  41. package/dist/rules/no-inline-disable.js.map +1 -0
  42. package/dist/rules/no-magic-numbers.d.ts +13 -0
  43. package/dist/rules/no-magic-numbers.d.ts.map +1 -0
  44. package/dist/rules/no-magic-numbers.js +162 -0
  45. package/dist/rules/no-magic-numbers.js.map +1 -0
  46. package/dist/rules/structured-logging.d.ts +11 -0
  47. package/dist/rules/structured-logging.d.ts.map +1 -0
  48. package/dist/rules/structured-logging.js +119 -0
  49. package/dist/rules/structured-logging.js.map +1 -0
  50. package/dist/utils/create-rule.d.ts +5 -0
  51. package/dist/utils/create-rule.d.ts.map +1 -0
  52. package/dist/utils/create-rule.js +6 -0
  53. package/dist/utils/create-rule.js.map +1 -0
  54. package/package.json +71 -0
package/README.md ADDED
@@ -0,0 +1,99 @@
1
+ # eslint-plugin-llm-core
2
+
3
+ ESLint rules that catch the patterns LLM agents get wrong — and teach them to self-correct through structured error messages.
4
+
5
+ LLMs generate code that _works_ but drifts: arrow functions everywhere, magic numbers, deep nesting, string-interpolated logs, oversized files. These aren't style nitpicks — they compound into codebases that are harder to debug, review, and maintain.
6
+
7
+ This plugin catches those patterns at lint time and provides error messages designed for LLM comprehension: **what's wrong**, **why it matters**, and **a concrete fix**. The result is AI-generated code that reads like it was written by a senior engineer.
8
+
9
+ ## Why this plugin?
10
+
11
+ - **Targeted rules** — Every rule addresses a real pattern LLMs consistently get wrong, from `export const fn = () => {}` to `logger.error(\`Failed for ${userId}\`)`
12
+ - **Teaching error messages** — Structured feedback that LLMs can parse and learn from across iterations
13
+ - **Works for humans too** — These are solid code quality rules regardless of who wrote the code
14
+ - **Zero config** — The `recommended` preset is ready out of the box
15
+ - **Suggestions, not auto-fixes** — Transformations that could change semantics are offered as suggestions, keeping you in control
16
+
17
+ ## Installation
18
+
19
+ ```bash
20
+ npm install eslint-plugin-llm-core --save-dev
21
+ ```
22
+
23
+ ## Quick Start
24
+
25
+ ```js
26
+ // eslint.config.mjs
27
+ import llmCore from "eslint-plugin-llm-core";
28
+
29
+ export default [
30
+ ...llmCore.configs.recommended,
31
+ ];
32
+ ```
33
+
34
+ That's it. All recommended rules are now active.
35
+
36
+ ### Available Configs
37
+
38
+ | Config | Description |
39
+ | ------------- | ---------------------------------------------------- |
40
+ | `recommended` | Safe defaults — rules most codebases should use |
41
+ | `all` | Every rule at `error` — for strict codebases |
42
+
43
+ ### Manual Rule Configuration
44
+
45
+ ```js
46
+ // eslint.config.mjs
47
+ import llmCore from "eslint-plugin-llm-core";
48
+
49
+ export default [
50
+ {
51
+ plugins: {
52
+ "llm-core": llmCore,
53
+ },
54
+ rules: {
55
+ "llm-core/no-exported-function-expressions": "error",
56
+ "llm-core/structured-logging": "error",
57
+ },
58
+ },
59
+ ];
60
+ ```
61
+
62
+ ## Rules
63
+
64
+ <!-- begin auto-generated rules list -->
65
+
66
+ 💼 Configurations enabled in.\
67
+ 🌐 Set in the `all` configuration.\
68
+ ✅ Set in the `recommended` configuration.\
69
+ 💡 Manually fixable by [editor suggestions](https://eslint.org/docs/latest/use/core-concepts#rule-suggestions).
70
+
71
+ | Name                             | Description | 💼 | 💡 |
72
+ | :--------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------- | :---- | :-- |
73
+ | [filename-match-export](docs/rules/filename-match-export.md) | Enforce that filenames match their single exported function, class, or component name | 🌐 ✅ | |
74
+ | [max-file-length](docs/rules/max-file-length.md) | Enforce a maximum number of lines per file to encourage proper module separation | 🌐 ✅ | |
75
+ | [max-function-length](docs/rules/max-function-length.md) | Enforce a maximum number of lines per function to encourage decomposition | 🌐 ✅ | |
76
+ | [max-nesting-depth](docs/rules/max-nesting-depth.md) | Enforce a maximum nesting depth for control flow statements to reduce cognitive complexity | 🌐 ✅ | |
77
+ | [max-params](docs/rules/max-params.md) | Enforce a maximum number of function parameters to encourage object parameter patterns | 🌐 ✅ | |
78
+ | [naming-conventions](docs/rules/naming-conventions.md) | Enforce naming conventions: Base prefix for abstract classes, Error suffix for error classes | 🌐 ✅ | |
79
+ | [no-exported-function-expressions](docs/rules/no-exported-function-expressions.md) | Enforce that exported functions use function declarations instead of function expressions or arrow functions | 🌐 ✅ | 💡 |
80
+ | [no-inline-disable](docs/rules/no-inline-disable.md) | Disallow eslint-disable comments that suppress lint errors instead of fixing them | 🌐 ✅ | |
81
+ | [no-magic-numbers](docs/rules/no-magic-numbers.md) | Disallow magic numbers and enforce named constants for clarity | 🌐 ✅ | |
82
+ | [structured-logging](docs/rules/structured-logging.md) | Enforce structured logging with static messages and dynamic values as separate metadata | 🌐 ✅ | |
83
+
84
+ <!-- end auto-generated rules list -->
85
+
86
+ ## Contributing
87
+
88
+ ```bash
89
+ npm install
90
+ npm run build
91
+ npm run test
92
+ npm run lint
93
+ ```
94
+
95
+ See [CLAUDE.md](CLAUDE.md) for architecture details and how to add new rules.
96
+
97
+ ## License
98
+
99
+ ISC
@@ -0,0 +1,12 @@
1
+ import type { TSESLint } from "@typescript-eslint/utils";
2
+ import * as rules from "./rules";
3
+ declare const plugin: {
4
+ meta: {
5
+ name: string;
6
+ version: string;
7
+ };
8
+ rules: typeof rules;
9
+ configs: Record<string, TSESLint.FlatConfig.ConfigArray>;
10
+ };
11
+ export = plugin;
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,KAAK,KAAK,MAAM,SAAS,CAAC;AAIjC,QAAA,MAAM,MAAM;;;;;;aAMK,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC;CAC/D,CAAC;AAqCF,SAAS,MAAM,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ const rules = __importStar(require("./rules"));
36
+ const plugin = {
37
+ meta: {
38
+ name: "eslint-plugin-llm-core",
39
+ version: "0.1.0",
40
+ },
41
+ rules,
42
+ configs: {},
43
+ };
44
+ const recommendedRules = {
45
+ "llm-core/no-exported-function-expressions": "error",
46
+ "llm-core/filename-match-export": "error",
47
+ "llm-core/structured-logging": "error",
48
+ "llm-core/max-nesting-depth": "error",
49
+ "llm-core/no-inline-disable": "error",
50
+ "llm-core/max-params": "error",
51
+ "llm-core/max-function-length": "error",
52
+ "llm-core/max-file-length": "error",
53
+ "llm-core/no-magic-numbers": "error",
54
+ "llm-core/naming-conventions": "error",
55
+ };
56
+ const allRules = Object.fromEntries(Object.keys(rules).map((rule) => [
57
+ `llm-core/${rule}`,
58
+ "error",
59
+ ]));
60
+ plugin.configs = {
61
+ recommended: [
62
+ {
63
+ plugins: { "llm-core": plugin },
64
+ rules: recommendedRules,
65
+ },
66
+ ],
67
+ all: [
68
+ {
69
+ plugins: { "llm-core": plugin },
70
+ rules: allRules,
71
+ },
72
+ ],
73
+ };
74
+ module.exports = plugin;
75
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,+CAAiC;AAIjC,MAAM,MAAM,GAAG;IACb,IAAI,EAAE;QACJ,IAAI,EAAE,wBAAwB;QAC9B,OAAO,EAAE,OAAO;KACjB;IACD,KAAK;IACL,OAAO,EAAE,EAAqD;CAC/D,CAAC;AAEF,MAAM,gBAAgB,GAA8B;IAClD,2CAA2C,EAAE,OAAO;IACpD,gCAAgC,EAAE,OAAO;IACzC,6BAA6B,EAAE,OAAO;IACtC,4BAA4B,EAAE,OAAO;IACrC,4BAA4B,EAAE,OAAO;IACrC,qBAAqB,EAAE,OAAO;IAC9B,8BAA8B,EAAE,OAAO;IACvC,0BAA0B,EAAE,OAAO;IACnC,2BAA2B,EAAE,OAAO;IACpC,6BAA6B,EAAE,OAAO;CACvC,CAAC;AAEF,MAAM,QAAQ,GAA8B,MAAM,CAAC,WAAW,CAC5D,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;IAC/B,YAAY,IAAe,EAAE;IAC7B,OAAgB;CACjB,CAAC,CACH,CAAC;AAEF,MAAM,CAAC,OAAO,GAAG;IACf,WAAW,EAAE;QACX;YACE,OAAO,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE;YAC/B,KAAK,EAAE,gBAAgB;SACxB;KACF;IACD,GAAG,EAAE;QACH;YACE,OAAO,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE;YAC/B,KAAK,EAAE,QAAQ;SAChB;KACF;CACF,CAAC;AAEF,iBAAS,MAAM,CAAC"}
@@ -0,0 +1,5 @@
1
+ declare const _default: import("@typescript-eslint/utils/dist/ts-eslint").RuleModule<"filenameMismatch", [], unknown, import("@typescript-eslint/utils/dist/ts-eslint").RuleListener> & {
2
+ name: string;
3
+ };
4
+ export default _default;
5
+ //# sourceMappingURL=filename-match-export.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filename-match-export.d.ts","sourceRoot":"","sources":["../../src/rules/filename-match-export.ts"],"names":[],"mappings":";;;AAmDA,wBAwKG"}
@@ -0,0 +1,198 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const path_1 = __importDefault(require("path"));
7
+ const utils_1 = require("@typescript-eslint/utils");
8
+ const create_rule_1 = require("../utils/create-rule");
9
+ const IGNORED_FILENAMES = new Set([
10
+ "index",
11
+ "types",
12
+ "constants",
13
+ "enums",
14
+ "errors",
15
+ "utils",
16
+ "helpers",
17
+ ]);
18
+ function kebabToCamel(str) {
19
+ return str.replace(/-([a-z])/g, (_, c) => c.toUpperCase());
20
+ }
21
+ function kebabToPascal(str) {
22
+ const camel = kebabToCamel(str);
23
+ return camel.charAt(0).toUpperCase() + camel.slice(1);
24
+ }
25
+ function getBaseName(filename) {
26
+ return filename.replace(/(\.(test|spec))?\.(ts|tsx|js|jsx|mjs|cjs)$/, "");
27
+ }
28
+ function filenameMatchesExport(filename, exportName) {
29
+ const base = getBaseName(filename);
30
+ if (base === exportName)
31
+ return true;
32
+ if (kebabToCamel(base) === exportName)
33
+ return true;
34
+ if (kebabToPascal(base) === exportName)
35
+ return true;
36
+ // Also handle PascalCase filename matching camelCase export
37
+ const lowerFirst = base.charAt(0).toLowerCase() + base.slice(1);
38
+ if (lowerFirst === exportName)
39
+ return true;
40
+ return false;
41
+ }
42
+ function isIgnoredFile(filename) {
43
+ return IGNORED_FILENAMES.has(getBaseName(filename));
44
+ }
45
+ function isTestFile(filename) {
46
+ return /\.(test|spec)\.(ts|tsx|js|jsx|mjs|cjs)$/.test(filename);
47
+ }
48
+ exports.default = (0, create_rule_1.createRule)({
49
+ name: "filename-match-export",
50
+ meta: {
51
+ type: "suggestion",
52
+ docs: {
53
+ description: "Enforce that filenames match their single exported function, class, or component name",
54
+ },
55
+ messages: {
56
+ filenameMismatch: [
57
+ "Filename '{{ filename }}' does not match its single export '{{ exportName }}'.",
58
+ "",
59
+ "Why: Mismatched filenames make code harder to navigate and search.",
60
+ "When a file exports a single function or class, the filename should reflect what it contains.",
61
+ "",
62
+ "How to fix:",
63
+ " Rename the file to match: {{ expectedFilename }}",
64
+ " Or rename the export to match the filename.",
65
+ ].join("\n"),
66
+ },
67
+ schema: [],
68
+ },
69
+ defaultOptions: [],
70
+ create(context) {
71
+ const filename = path_1.default.basename(context.filename);
72
+ if (isIgnoredFile(filename) || isTestFile(filename)) {
73
+ return {};
74
+ }
75
+ const base = getBaseName(filename);
76
+ if (base === "index") {
77
+ return {};
78
+ }
79
+ const exportedNames = [];
80
+ return {
81
+ ExportNamedDeclaration(node) {
82
+ // Re-exports: export { x } from './y' — skip
83
+ if (node.source)
84
+ return;
85
+ if (node.declaration) {
86
+ if (node.declaration.type === utils_1.AST_NODE_TYPES.FunctionDeclaration &&
87
+ node.declaration.id) {
88
+ exportedNames.push({
89
+ name: node.declaration.id.name,
90
+ node: node.declaration.id,
91
+ });
92
+ }
93
+ else if (node.declaration.type === utils_1.AST_NODE_TYPES.ClassDeclaration &&
94
+ node.declaration.id) {
95
+ exportedNames.push({
96
+ name: node.declaration.id.name,
97
+ node: node.declaration.id,
98
+ });
99
+ }
100
+ else if (node.declaration.type === utils_1.AST_NODE_TYPES.VariableDeclaration) {
101
+ for (const declarator of node.declaration.declarations) {
102
+ if (declarator.id.type === utils_1.AST_NODE_TYPES.Identifier) {
103
+ exportedNames.push({
104
+ name: declarator.id.name,
105
+ node: declarator.id,
106
+ });
107
+ }
108
+ }
109
+ }
110
+ else if (node.declaration.type === utils_1.AST_NODE_TYPES.TSEnumDeclaration &&
111
+ node.declaration.id) {
112
+ exportedNames.push({
113
+ name: node.declaration.id.name,
114
+ node: node.declaration.id,
115
+ });
116
+ }
117
+ else if (node.declaration.type === utils_1.AST_NODE_TYPES.TSTypeAliasDeclaration &&
118
+ node.declaration.id) {
119
+ exportedNames.push({
120
+ name: node.declaration.id.name,
121
+ node: node.declaration.id,
122
+ });
123
+ }
124
+ else if (node.declaration.type === utils_1.AST_NODE_TYPES.TSInterfaceDeclaration &&
125
+ node.declaration.id) {
126
+ exportedNames.push({
127
+ name: node.declaration.id.name,
128
+ node: node.declaration.id,
129
+ });
130
+ }
131
+ }
132
+ // Named specifiers: export { foo, bar }
133
+ for (const specifier of node.specifiers) {
134
+ if (specifier.type === utils_1.AST_NODE_TYPES.ExportSpecifier) {
135
+ const exported = specifier.exported;
136
+ if (exported.type === utils_1.AST_NODE_TYPES.Identifier) {
137
+ exportedNames.push({ name: exported.name, node: exported });
138
+ }
139
+ }
140
+ }
141
+ },
142
+ ExportDefaultDeclaration(node) {
143
+ const declaration = node.declaration;
144
+ if (declaration.type === utils_1.AST_NODE_TYPES.FunctionDeclaration &&
145
+ declaration.id) {
146
+ exportedNames.push({
147
+ name: declaration.id.name,
148
+ node: declaration.id,
149
+ });
150
+ }
151
+ else if (declaration.type === utils_1.AST_NODE_TYPES.ClassDeclaration &&
152
+ declaration.id) {
153
+ exportedNames.push({
154
+ name: declaration.id.name,
155
+ node: declaration.id,
156
+ });
157
+ }
158
+ else if (declaration.type === utils_1.AST_NODE_TYPES.Identifier) {
159
+ exportedNames.push({
160
+ name: declaration.name,
161
+ node: declaration,
162
+ });
163
+ }
164
+ // Anonymous defaults are not named — nothing to match
165
+ },
166
+ "Program:exit"() {
167
+ if (exportedNames.length !== 1)
168
+ return;
169
+ const { name: exportName, node: exportNode } = exportedNames[0];
170
+ if (filenameMatchesExport(filename, exportName))
171
+ return;
172
+ const ext = filename.slice(filename.indexOf("."));
173
+ // Determine expected filename style based on current filename convention
174
+ const hasKebab = base.includes("-");
175
+ let expectedBase;
176
+ if (hasKebab) {
177
+ // Convert export name to kebab-case
178
+ expectedBase = exportName
179
+ .replace(/([a-z])([A-Z])/g, "$1-$2")
180
+ .toLowerCase();
181
+ }
182
+ else {
183
+ expectedBase = exportName;
184
+ }
185
+ context.report({
186
+ node: exportNode,
187
+ messageId: "filenameMismatch",
188
+ data: {
189
+ filename,
190
+ exportName,
191
+ expectedFilename: `${expectedBase}${ext}`,
192
+ },
193
+ });
194
+ },
195
+ };
196
+ },
197
+ });
198
+ //# sourceMappingURL=filename-match-export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filename-match-export.js","sourceRoot":"","sources":["../../src/rules/filename-match-export.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export { default as "no-exported-function-expressions" } from "./no-exported-function-expressions";
2
+ export { default as "filename-match-export" } from "./filename-match-export";
3
+ export { default as "structured-logging" } from "./structured-logging";
4
+ export { default as "max-nesting-depth" } from "./max-nesting-depth";
5
+ export { default as "no-inline-disable" } from "./no-inline-disable";
6
+ export { default as "max-params" } from "./max-params";
7
+ export { default as "max-function-length" } from "./max-function-length";
8
+ export { default as "max-file-length" } from "./max-file-length";
9
+ export { default as "no-magic-numbers" } from "./no-magic-numbers";
10
+ export { default as "naming-conventions" } from "./naming-conventions";
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rules/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,kCAAkC,EAAE,MAAM,oCAAoC,CAAC;AACnG,OAAO,EAAE,OAAO,IAAI,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAC7E,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports["naming-conventions"] = exports["no-magic-numbers"] = exports["max-file-length"] = exports["max-function-length"] = exports["max-params"] = exports["no-inline-disable"] = exports["max-nesting-depth"] = exports["structured-logging"] = exports["filename-match-export"] = exports["no-exported-function-expressions"] = void 0;
7
+ var no_exported_function_expressions_1 = require("./no-exported-function-expressions");
8
+ Object.defineProperty(exports, "no-exported-function-expressions", { enumerable: true, get: function () { return __importDefault(no_exported_function_expressions_1).default; } });
9
+ var filename_match_export_1 = require("./filename-match-export");
10
+ Object.defineProperty(exports, "filename-match-export", { enumerable: true, get: function () { return __importDefault(filename_match_export_1).default; } });
11
+ var structured_logging_1 = require("./structured-logging");
12
+ Object.defineProperty(exports, "structured-logging", { enumerable: true, get: function () { return __importDefault(structured_logging_1).default; } });
13
+ var max_nesting_depth_1 = require("./max-nesting-depth");
14
+ Object.defineProperty(exports, "max-nesting-depth", { enumerable: true, get: function () { return __importDefault(max_nesting_depth_1).default; } });
15
+ var no_inline_disable_1 = require("./no-inline-disable");
16
+ Object.defineProperty(exports, "no-inline-disable", { enumerable: true, get: function () { return __importDefault(no_inline_disable_1).default; } });
17
+ var max_params_1 = require("./max-params");
18
+ Object.defineProperty(exports, "max-params", { enumerable: true, get: function () { return __importDefault(max_params_1).default; } });
19
+ var max_function_length_1 = require("./max-function-length");
20
+ Object.defineProperty(exports, "max-function-length", { enumerable: true, get: function () { return __importDefault(max_function_length_1).default; } });
21
+ var max_file_length_1 = require("./max-file-length");
22
+ Object.defineProperty(exports, "max-file-length", { enumerable: true, get: function () { return __importDefault(max_file_length_1).default; } });
23
+ var no_magic_numbers_1 = require("./no-magic-numbers");
24
+ Object.defineProperty(exports, "no-magic-numbers", { enumerable: true, get: function () { return __importDefault(no_magic_numbers_1).default; } });
25
+ var naming_conventions_1 = require("./naming-conventions");
26
+ Object.defineProperty(exports, "naming-conventions", { enumerable: true, get: function () { return __importDefault(naming_conventions_1).default; } });
27
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rules/index.ts"],"names":[],"mappings":";;;;;;AAAA,uFAAmG;AAA1F,qKAAA,OAAO,OAAsC;AACtD,iEAA6E;AAApE,+IAAA,OAAO,OAA2B;AAC3C,2DAAuE;AAA9D,yIAAA,OAAO,OAAwB;AACxC,yDAAqE;AAA5D,uIAAA,OAAO,OAAuB;AACvC,yDAAqE;AAA5D,uIAAA,OAAO,OAAuB;AACvC,2CAAuD;AAA9C,yHAAA,OAAO,OAAgB;AAChC,6DAAyE;AAAhE,2IAAA,OAAO,OAAyB;AACzC,qDAAiE;AAAxD,mIAAA,OAAO,OAAqB;AACrC,uDAAmE;AAA1D,qIAAA,OAAO,OAAsB;AACtC,2DAAuE;AAA9D,yIAAA,OAAO,OAAwB"}
@@ -0,0 +1,12 @@
1
+ type Options = [
2
+ {
3
+ max?: number;
4
+ skipBlankLines?: boolean;
5
+ skipTestFiles?: boolean;
6
+ }
7
+ ];
8
+ declare const _default: import("@typescript-eslint/utils/dist/ts-eslint").RuleModule<"maxFileLength", Options, unknown, import("@typescript-eslint/utils/dist/ts-eslint").RuleListener> & {
9
+ name: string;
10
+ };
11
+ export default _default;
12
+ //# sourceMappingURL=max-file-length.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"max-file-length.d.ts","sourceRoot":"","sources":["../../src/rules/max-file-length.ts"],"names":[],"mappings":"AAKA,KAAK,OAAO,GAAG;IACb;QACE,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,cAAc,CAAC,EAAE,OAAO,CAAC;QACzB,aAAa,CAAC,EAAE,OAAO,CAAC;KACzB;CACF,CAAC;;;;AAEF,wBAkFG"}
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const path_1 = __importDefault(require("path"));
7
+ const create_rule_1 = require("../utils/create-rule");
8
+ exports.default = (0, create_rule_1.createRule)({
9
+ name: "max-file-length",
10
+ meta: {
11
+ type: "suggestion",
12
+ docs: {
13
+ description: "Enforce a maximum number of lines per file to encourage proper module separation",
14
+ },
15
+ messages: {
16
+ maxFileLength: [
17
+ "File has {{ lines }} lines, exceeding the maximum of {{ max }}.",
18
+ "",
19
+ "Why: Large files are hard to navigate and often contain unrelated logic.",
20
+ "They indicate poor module separation and make code review harder.",
21
+ "",
22
+ "How to fix:",
23
+ " 1. Split the file by responsibility — each file should have a clear, single purpose",
24
+ " 2. Extract related functions into their own module (e.g., validation.ts, formatting.ts)",
25
+ " 3. Move types/interfaces to a separate types.ts file",
26
+ " 4. Move constants to a constants.ts file",
27
+ ].join("\n"),
28
+ },
29
+ schema: [
30
+ {
31
+ type: "object",
32
+ properties: {
33
+ max: {
34
+ type: "integer",
35
+ minimum: 1,
36
+ description: "Maximum allowed lines per file (default: 250)",
37
+ },
38
+ skipBlankLines: {
39
+ type: "boolean",
40
+ description: "Whether to skip blank lines when counting (default: true)",
41
+ },
42
+ skipTestFiles: {
43
+ type: "boolean",
44
+ description: "Whether to skip test files (.test.ts, .spec.ts) (default: true)",
45
+ },
46
+ },
47
+ additionalProperties: false,
48
+ },
49
+ ],
50
+ },
51
+ defaultOptions: [{ max: 250, skipBlankLines: true, skipTestFiles: true }],
52
+ create(context, [options]) {
53
+ const max = options.max ?? 250;
54
+ const skipBlankLines = options.skipBlankLines ?? true;
55
+ const skipTestFiles = options.skipTestFiles ?? true;
56
+ const sourceCode = context.sourceCode;
57
+ return {
58
+ "Program:exit"(node) {
59
+ if (skipTestFiles) {
60
+ const filename = path_1.default.basename(context.filename);
61
+ if (/\.(test|spec)\.(ts|tsx|js|jsx|mjs|cjs)$/.test(filename)) {
62
+ return;
63
+ }
64
+ }
65
+ const text = sourceCode.getText(node);
66
+ const allLines = text.split("\n");
67
+ const lines = skipBlankLines
68
+ ? allLines.filter((line) => line.trim().length > 0).length
69
+ : allLines.length;
70
+ if (lines <= max)
71
+ return;
72
+ context.report({
73
+ node,
74
+ loc: { line: 1, column: 0 },
75
+ messageId: "maxFileLength",
76
+ data: {
77
+ lines: String(lines),
78
+ max: String(max),
79
+ },
80
+ });
81
+ },
82
+ };
83
+ },
84
+ });
85
+ //# sourceMappingURL=max-file-length.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"max-file-length.js","sourceRoot":"","sources":["../../src/rules/max-file-length.ts"],"names":[],"mappings":";;;;;AAAA,gDAAwB;AACxB,sDAAkD;AAYlD,kBAAe,IAAA,wBAAU,EAAsB;IAC7C,IAAI,EAAE,iBAAiB;IACvB,IAAI,EAAE;QACJ,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE;YACJ,WAAW,EACT,kFAAkF;SACrF;QACD,QAAQ,EAAE;YACR,aAAa,EAAE;gBACb,iEAAiE;gBACjE,EAAE;gBACF,0EAA0E;gBAC1E,mEAAmE;gBACnE,EAAE;gBACF,aAAa;gBACb,uFAAuF;gBACvF,2FAA2F;gBAC3F,wDAAwD;gBACxD,4CAA4C;aAC7C,CAAC,IAAI,CAAC,IAAI,CAAC;SACb;QACD,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,GAAG,EAAE;wBACH,IAAI,EAAE,SAAS;wBACf,OAAO,EAAE,CAAC;wBACV,WAAW,EAAE,+CAA+C;qBAC7D;oBACD,cAAc,EAAE;wBACd,IAAI,EAAE,SAAS;wBACf,WAAW,EACT,2DAA2D;qBAC9D;oBACD,aAAa,EAAE;wBACb,IAAI,EAAE,SAAS;wBACf,WAAW,EACT,iEAAiE;qBACpE;iBACF;gBACD,oBAAoB,EAAE,KAAK;aAC5B;SACF;KACF;IACD,cAAc,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;IACzE,MAAM,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC;QACvB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC;QAC/B,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,IAAI,CAAC;QACtD,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,IAAI,CAAC;QACpD,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QAEtC,OAAO;YACL,cAAc,CAAC,IAAI;gBACjB,IAAI,aAAa,EAAE,CAAC;oBAClB,MAAM,QAAQ,GAAG,cAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;oBACjD,IAAI,yCAAyC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;wBAC7D,OAAO;oBACT,CAAC;gBACH,CAAC;gBAED,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAClC,MAAM,KAAK,GAAG,cAAc;oBAC1B,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM;oBAC1D,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAEpB,IAAI,KAAK,IAAI,GAAG;oBAAE,OAAO;gBAEzB,OAAO,CAAC,MAAM,CAAC;oBACb,IAAI;oBACJ,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;oBAC3B,SAAS,EAAE,eAAe;oBAC1B,IAAI,EAAE;wBACJ,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;wBACpB,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC;qBACjB;iBACF,CAAC,CAAC;YACL,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,11 @@
1
+ type Options = [
2
+ {
3
+ max?: number;
4
+ skipBlankLines?: boolean;
5
+ }
6
+ ];
7
+ declare const _default: import("@typescript-eslint/utils/dist/ts-eslint").RuleModule<"maxFunctionLength", Options, unknown, import("@typescript-eslint/utils/dist/ts-eslint").RuleListener> & {
8
+ name: string;
9
+ };
10
+ export default _default;
11
+ //# sourceMappingURL=max-function-length.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"max-function-length.d.ts","sourceRoot":"","sources":["../../src/rules/max-function-length.ts"],"names":[],"mappings":"AAKA,KAAK,OAAO,GAAG;IACb;QACE,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,cAAc,CAAC,EAAE,OAAO,CAAC;KAC1B;CACF,CAAC;;;;AAEF,wBA2HG"}