invar-tools 1.17.2__py3-none-any.whl → 1.17.3__py3-none-any.whl

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 (58) hide show
  1. invar/node_tools/.gitignore +10 -6
  2. invar/node_tools/eslint-plugin/rules/__tests__/behavior.test.js +1321 -0
  3. invar/node_tools/eslint-plugin/rules/__tests__/behavior.test.js.map +1 -0
  4. invar/node_tools/eslint-plugin/rules/__tests__/e2e-scenarios.test.js +414 -0
  5. invar/node_tools/eslint-plugin/rules/__tests__/e2e-scenarios.test.js.map +1 -0
  6. invar/node_tools/eslint-plugin/rules/__tests__/fixtures/core/function-lengths.js +142 -0
  7. invar/node_tools/eslint-plugin/rules/__tests__/fixtures/core/function-lengths.js.map +1 -0
  8. invar/node_tools/eslint-plugin/rules/__tests__/fixtures/core/has-io-imports.js +15 -0
  9. invar/node_tools/eslint-plugin/rules/__tests__/fixtures/core/has-io-imports.js.map +1 -0
  10. invar/node_tools/eslint-plugin/rules/__tests__/fixtures/core/valid-small.js +27 -0
  11. invar/node_tools/eslint-plugin/rules/__tests__/fixtures/core/valid-small.js.map +1 -0
  12. invar/node_tools/eslint-plugin/rules/__tests__/fixtures/exported-functions.js +43 -0
  13. invar/node_tools/eslint-plugin/rules/__tests__/fixtures/exported-functions.js.map +1 -0
  14. invar/node_tools/eslint-plugin/rules/__tests__/fixtures/shell/with-io.js +27 -0
  15. invar/node_tools/eslint-plugin/rules/__tests__/fixtures/shell/with-io.js.map +1 -0
  16. invar/node_tools/eslint-plugin/rules/__tests__/fixtures/tests/large.test.js +260 -0
  17. invar/node_tools/eslint-plugin/rules/__tests__/fixtures/tests/large.test.js.map +1 -0
  18. invar/node_tools/eslint-plugin/rules/max-file-lines.js +105 -0
  19. invar/node_tools/eslint-plugin/rules/max-file-lines.js.map +1 -0
  20. invar/node_tools/eslint-plugin/rules/max-function-lines.js +133 -0
  21. invar/node_tools/eslint-plugin/rules/max-function-lines.js.map +1 -0
  22. invar/node_tools/eslint-plugin/rules/no-any-in-schema.js +39 -0
  23. invar/node_tools/eslint-plugin/rules/no-any-in-schema.js.map +1 -0
  24. invar/node_tools/eslint-plugin/rules/no-empty-schema.js +69 -0
  25. invar/node_tools/eslint-plugin/rules/no-empty-schema.js.map +1 -0
  26. invar/node_tools/eslint-plugin/rules/no-impure-calls-in-core.js +52 -0
  27. invar/node_tools/eslint-plugin/rules/no-impure-calls-in-core.js.map +1 -0
  28. invar/node_tools/eslint-plugin/rules/no-io-in-core.js +99 -0
  29. invar/node_tools/eslint-plugin/rules/no-io-in-core.js.map +1 -0
  30. invar/node_tools/eslint-plugin/rules/no-pure-logic-in-shell.js +197 -0
  31. invar/node_tools/eslint-plugin/rules/no-pure-logic-in-shell.js.map +1 -0
  32. invar/node_tools/eslint-plugin/rules/no-redundant-type-schema.js +99 -0
  33. invar/node_tools/eslint-plugin/rules/no-redundant-type-schema.js.map +1 -0
  34. invar/node_tools/eslint-plugin/rules/no-runtime-imports.js +66 -0
  35. invar/node_tools/eslint-plugin/rules/no-runtime-imports.js.map +1 -0
  36. invar/node_tools/eslint-plugin/rules/require-complete-validation.js +104 -0
  37. invar/node_tools/eslint-plugin/rules/require-complete-validation.js.map +1 -0
  38. invar/node_tools/eslint-plugin/rules/require-jsdoc-example.js +81 -0
  39. invar/node_tools/eslint-plugin/rules/require-jsdoc-example.js.map +1 -0
  40. invar/node_tools/eslint-plugin/rules/require-schema-validation.js +308 -0
  41. invar/node_tools/eslint-plugin/rules/require-schema-validation.js.map +1 -0
  42. invar/node_tools/eslint-plugin/rules/shell-complexity.js +273 -0
  43. invar/node_tools/eslint-plugin/rules/shell-complexity.js.map +1 -0
  44. invar/node_tools/eslint-plugin/rules/shell-result-type.js +138 -0
  45. invar/node_tools/eslint-plugin/rules/shell-result-type.js.map +1 -0
  46. invar/node_tools/eslint-plugin/rules/thin-entry-points.js +174 -0
  47. invar/node_tools/eslint-plugin/rules/thin-entry-points.js.map +1 -0
  48. invar/node_tools/eslint-plugin/utils/layer-detection.js +91 -0
  49. invar/node_tools/eslint-plugin/utils/layer-detection.js.map +1 -0
  50. invar/node_tools/eslint-plugin/utils/math-example.js +31 -0
  51. invar/node_tools/eslint-plugin/utils/math-example.js.map +1 -0
  52. {invar_tools-1.17.2.dist-info → invar_tools-1.17.3.dist-info}/METADATA +1 -1
  53. {invar_tools-1.17.2.dist-info → invar_tools-1.17.3.dist-info}/RECORD +58 -8
  54. {invar_tools-1.17.2.dist-info → invar_tools-1.17.3.dist-info}/WHEEL +0 -0
  55. {invar_tools-1.17.2.dist-info → invar_tools-1.17.3.dist-info}/entry_points.txt +0 -0
  56. {invar_tools-1.17.2.dist-info → invar_tools-1.17.3.dist-info}/licenses/LICENSE +0 -0
  57. {invar_tools-1.17.2.dist-info → invar_tools-1.17.3.dist-info}/licenses/LICENSE-GPL +0 -0
  58. {invar_tools-1.17.2.dist-info → invar_tools-1.17.3.dist-info}/licenses/NOTICE +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"valid-small.js","sourceRoot":"","sources":["../../../../../src/rules/__tests__/fixtures/core/valid-small.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;GAKG;AACH,MAAM,UAAU,QAAQ,CAAC,CAAS,EAAE,CAAS;IAC3C,OAAO,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,GAAG,CAAC,CAAS,EAAE,CAAS;IACtC,OAAO,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED,+CAA+C;AAC/C,SAAS,MAAM;IACb,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AACxB,CAAC"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Test require-jsdoc-example rule
3
+ * Tests exported functions and arrow functions
4
+ */
5
+ /**
6
+ * Valid: Exported function with @example
7
+ *
8
+ * @example
9
+ * validFunction() // => 'valid'
10
+ */
11
+ export function validFunction() {
12
+ return 'valid';
13
+ }
14
+ /**
15
+ * Invalid: Exported function WITHOUT @example
16
+ */
17
+ export function invalidFunction() {
18
+ return 'invalid';
19
+ }
20
+ /**
21
+ * Valid: Exported arrow function with @example
22
+ *
23
+ * @example
24
+ * validArrow() // => 'valid'
25
+ */
26
+ export const validArrow = () => {
27
+ return 'valid';
28
+ };
29
+ /**
30
+ * Invalid: Exported arrow function WITHOUT @example
31
+ */
32
+ export const invalidArrow = () => {
33
+ return 'invalid';
34
+ };
35
+ // Valid: Non-exported function without @example (allowed)
36
+ function privateFunction() {
37
+ return 'private';
38
+ }
39
+ // Valid: Non-exported arrow function without @example (allowed)
40
+ const privateArrow = () => {
41
+ return 'private';
42
+ };
43
+ //# sourceMappingURL=exported-functions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exported-functions.js","sourceRoot":"","sources":["../../../../src/rules/__tests__/fixtures/exported-functions.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;GAKG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,GAAW,EAAE;IACrC,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,GAAW,EAAE;IACvC,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF,0DAA0D;AAC1D,SAAS,eAAe;IACtB,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,gEAAgE;AAChE,MAAM,YAAY,GAAG,GAAW,EAAE;IAChC,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Valid Shell file - I/O imports allowed
3
+ * Tests: no-io-in-core (should pass in /shell/ directory)
4
+ */
5
+ import * as fs from 'fs'; // ✅ Allowed in Shell
6
+ import axios from 'axios'; // ✅ Allowed in Shell
7
+ /**
8
+ * Shell function with I/O operations
9
+ *
10
+ * @example
11
+ * readConfig('/path') // => { ... }
12
+ */
13
+ export function readConfig(path) {
14
+ const content = fs.readFileSync(path, 'utf-8');
15
+ return JSON.parse(content);
16
+ }
17
+ /**
18
+ * Shell function with HTTP operations
19
+ *
20
+ * @example
21
+ * fetchData('url') // => Promise<data>
22
+ */
23
+ export async function fetchData(url) {
24
+ const response = await axios.get(url);
25
+ return response.data;
26
+ }
27
+ //# sourceMappingURL=with-io.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"with-io.js","sourceRoot":"","sources":["../../../../../src/rules/__tests__/fixtures/shell/with-io.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC,CAAC,qBAAqB;AAE/C,OAAO,KAAK,MAAM,OAAO,CAAC,CAAC,qBAAqB;AAGhD;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC/C,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AAC7B,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAW;IACzC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACtC,OAAO,QAAQ,CAAC,IAAI,CAAC;AACvB,CAAC"}
@@ -0,0 +1,260 @@
1
+ /**
2
+ * Valid Tests file - tests layer has highest limits
3
+ * Tests: layer-detection (tests), max-file-lines (tests: 1300), max-function-lines (tests: 260)
4
+ */
5
+ import { describe, it, expect } from 'vitest';
6
+ describe('Example test suite', () => {
7
+ it('should pass', () => {
8
+ expect(true).toBe(true);
9
+ });
10
+ /**
11
+ * Large test function - valid for tests layer (260 line limit)
12
+ * This would fail in Core (65) or Shell (130)
13
+ */
14
+ it('large test function - within 260 line limit', () => {
15
+ const data = [];
16
+ // Line 20
17
+ data.push(1);
18
+ data.push(2);
19
+ data.push(3);
20
+ data.push(4);
21
+ data.push(5);
22
+ data.push(6);
23
+ data.push(7);
24
+ data.push(8);
25
+ data.push(9);
26
+ data.push(10); // Line 30
27
+ data.push(11);
28
+ data.push(12);
29
+ data.push(13);
30
+ data.push(14);
31
+ data.push(15);
32
+ data.push(16);
33
+ data.push(17);
34
+ data.push(18);
35
+ data.push(19);
36
+ data.push(20); // Line 40
37
+ data.push(21);
38
+ data.push(22);
39
+ data.push(23);
40
+ data.push(24);
41
+ data.push(25);
42
+ data.push(26);
43
+ data.push(27);
44
+ data.push(28);
45
+ data.push(29);
46
+ data.push(30); // Line 50
47
+ data.push(31);
48
+ data.push(32);
49
+ data.push(33);
50
+ data.push(34);
51
+ data.push(35);
52
+ data.push(36);
53
+ data.push(37);
54
+ data.push(38);
55
+ data.push(39);
56
+ data.push(40); // Line 60
57
+ data.push(41);
58
+ data.push(42);
59
+ data.push(43);
60
+ data.push(44);
61
+ data.push(45);
62
+ data.push(46);
63
+ data.push(47);
64
+ data.push(48);
65
+ data.push(49);
66
+ data.push(50); // Line 70
67
+ data.push(51);
68
+ data.push(52);
69
+ data.push(53);
70
+ data.push(54);
71
+ data.push(55);
72
+ data.push(56);
73
+ data.push(57);
74
+ data.push(58);
75
+ data.push(59);
76
+ data.push(60); // Line 80
77
+ data.push(61);
78
+ data.push(62);
79
+ data.push(63);
80
+ data.push(64);
81
+ data.push(65);
82
+ data.push(66);
83
+ data.push(67);
84
+ data.push(68);
85
+ data.push(69);
86
+ data.push(70); // Line 90
87
+ data.push(71);
88
+ data.push(72);
89
+ data.push(73);
90
+ data.push(74);
91
+ data.push(75);
92
+ data.push(76);
93
+ data.push(77);
94
+ data.push(78);
95
+ data.push(79);
96
+ data.push(80); // Line 100
97
+ data.push(81);
98
+ data.push(82);
99
+ data.push(83);
100
+ data.push(84);
101
+ data.push(85);
102
+ data.push(86);
103
+ data.push(87);
104
+ data.push(88);
105
+ data.push(89);
106
+ data.push(90); // Line 110
107
+ data.push(91);
108
+ data.push(92);
109
+ data.push(93);
110
+ data.push(94);
111
+ data.push(95);
112
+ data.push(96);
113
+ data.push(97);
114
+ data.push(98);
115
+ data.push(99);
116
+ data.push(100); // Line 120
117
+ data.push(101);
118
+ data.push(102);
119
+ data.push(103);
120
+ data.push(104);
121
+ data.push(105);
122
+ data.push(106);
123
+ data.push(107);
124
+ data.push(108);
125
+ data.push(109);
126
+ data.push(110); // Line 130
127
+ data.push(111);
128
+ data.push(112);
129
+ data.push(113);
130
+ data.push(114);
131
+ data.push(115);
132
+ data.push(116);
133
+ data.push(117);
134
+ data.push(118);
135
+ data.push(119);
136
+ data.push(120); // Line 140
137
+ data.push(121);
138
+ data.push(122);
139
+ data.push(123);
140
+ data.push(124);
141
+ data.push(125);
142
+ data.push(126);
143
+ data.push(127);
144
+ data.push(128);
145
+ data.push(129);
146
+ data.push(130); // Line 150
147
+ data.push(131);
148
+ data.push(132);
149
+ data.push(133);
150
+ data.push(134);
151
+ data.push(135);
152
+ data.push(136);
153
+ data.push(137);
154
+ data.push(138);
155
+ data.push(139);
156
+ data.push(140); // Line 160
157
+ data.push(141);
158
+ data.push(142);
159
+ data.push(143);
160
+ data.push(144);
161
+ data.push(145);
162
+ data.push(146);
163
+ data.push(147);
164
+ data.push(148);
165
+ data.push(149);
166
+ data.push(150); // Line 170
167
+ data.push(151);
168
+ data.push(152);
169
+ data.push(153);
170
+ data.push(154);
171
+ data.push(155);
172
+ data.push(156);
173
+ data.push(157);
174
+ data.push(158);
175
+ data.push(159);
176
+ data.push(160); // Line 180
177
+ data.push(161);
178
+ data.push(162);
179
+ data.push(163);
180
+ data.push(164);
181
+ data.push(165);
182
+ data.push(166);
183
+ data.push(167);
184
+ data.push(168);
185
+ data.push(169);
186
+ data.push(170); // Line 190
187
+ data.push(171);
188
+ data.push(172);
189
+ data.push(173);
190
+ data.push(174);
191
+ data.push(175);
192
+ data.push(176);
193
+ data.push(177);
194
+ data.push(178);
195
+ data.push(179);
196
+ data.push(180); // Line 200
197
+ data.push(181);
198
+ data.push(182);
199
+ data.push(183);
200
+ data.push(184);
201
+ data.push(185);
202
+ data.push(186);
203
+ data.push(187);
204
+ data.push(188);
205
+ data.push(189);
206
+ data.push(190); // Line 210
207
+ data.push(191);
208
+ data.push(192);
209
+ data.push(193);
210
+ data.push(194);
211
+ data.push(195);
212
+ data.push(196);
213
+ data.push(197);
214
+ data.push(198);
215
+ data.push(199);
216
+ data.push(200); // Line 220
217
+ data.push(201);
218
+ data.push(202);
219
+ data.push(203);
220
+ data.push(204);
221
+ data.push(205);
222
+ data.push(206);
223
+ data.push(207);
224
+ data.push(208);
225
+ data.push(209);
226
+ data.push(210); // Line 230
227
+ data.push(211);
228
+ data.push(212);
229
+ data.push(213);
230
+ data.push(214);
231
+ data.push(215);
232
+ data.push(216);
233
+ data.push(217);
234
+ data.push(218);
235
+ data.push(219);
236
+ data.push(220); // Line 240
237
+ data.push(221);
238
+ data.push(222);
239
+ data.push(223);
240
+ data.push(224);
241
+ data.push(225);
242
+ data.push(226);
243
+ data.push(227);
244
+ data.push(228);
245
+ data.push(229);
246
+ data.push(230); // Line 250
247
+ data.push(231);
248
+ data.push(232);
249
+ data.push(233);
250
+ data.push(234);
251
+ data.push(235);
252
+ data.push(236);
253
+ data.push(237);
254
+ data.push(238);
255
+ data.push(239);
256
+ data.push(240); // Line 260
257
+ expect(data.length).toBe(240);
258
+ }); // Line 262 - within 260 limit
259
+ });
260
+ //# sourceMappingURL=large.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"large.test.js","sourceRoot":"","sources":["../../../../../src/rules/__tests__/fixtures/tests/large.test.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE9C,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,aAAa,EAAE,GAAG,EAAE;QACrB,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH;;;OAGG;IACH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,UAAU;QACV,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACb,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACb,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACb,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACb,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACb,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACb,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACb,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACb,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACb,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU;QACzB,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU;QACzB,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU;QACzB,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU;QACzB,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU;QACzB,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU;QACzB,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU;QACzB,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW;QAC1B,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW;QAC1B,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW;QAC3B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW;QAC3B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW;QAC3B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW;QAC3B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW;QAC3B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW;QAC3B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW;QAC3B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW;QAC3B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW;QAC3B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW;QAC3B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW;QAC3B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW;QAC3B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW;QAC3B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW;QAC3B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW;QAC3B,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC,CAAC,8BAA8B;AACpC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Rule: max-file-lines
3
+ *
4
+ * Enforce maximum file length with layer-based limits.
5
+ *
6
+ * TypeScript layered limits (LX-10, Python × 1.3):
7
+ * - Core: 650 lines (strict, pure logic)
8
+ * - Shell: 910 lines (I/O operations)
9
+ * - Tests: 1300 lines (test files)
10
+ * - Default: 780 lines (other files)
11
+ */
12
+ import { getLayer, getLimits } from '../utils/layer-detection.js';
13
+ export const maxFileLines = {
14
+ meta: {
15
+ type: 'problem',
16
+ docs: {
17
+ description: 'Enforce maximum file length with layer-based limits',
18
+ recommended: true,
19
+ },
20
+ schema: [
21
+ {
22
+ type: 'object',
23
+ properties: {
24
+ max: {
25
+ type: 'number',
26
+ minimum: 1,
27
+ },
28
+ skipBlankLines: {
29
+ type: 'boolean',
30
+ },
31
+ skipComments: {
32
+ type: 'boolean',
33
+ },
34
+ },
35
+ additionalProperties: false,
36
+ },
37
+ ],
38
+ messages: {
39
+ tooManyLines: 'File has {{actual}} lines ({{layer}} layer max: {{max}}). Consider splitting into smaller modules.',
40
+ },
41
+ },
42
+ create(context) {
43
+ const filename = context.filename || context.getFilename();
44
+ const layer = getLayer(filename);
45
+ const limits = getLimits(filename);
46
+ // Allow override via options
47
+ const options = context.options[0] || {};
48
+ const maxLines = options.max !== undefined ? options.max : limits.maxFileLines;
49
+ const skipBlankLines = options.skipBlankLines || false;
50
+ const skipComments = options.skipComments || false;
51
+ return {
52
+ Program(node) {
53
+ const sourceCode = context.sourceCode || context.getSourceCode();
54
+ const lines = sourceCode.lines;
55
+ let actualLines = lines.length;
56
+ // Count non-blank/non-comment lines if requested
57
+ if (skipBlankLines || skipComments) {
58
+ const allComments = sourceCode.getAllComments();
59
+ const commentLines = new Set();
60
+ if (skipComments) {
61
+ allComments.forEach(comment => {
62
+ if (!comment.loc)
63
+ return; // Skip comments without location info
64
+ const start = comment.loc.start.line;
65
+ const end = comment.loc.end.line;
66
+ for (let i = start; i <= end; i++) {
67
+ commentLines.add(i);
68
+ }
69
+ });
70
+ }
71
+ actualLines = 0;
72
+ for (let i = 0; i < lines.length; i++) {
73
+ const lineNum = i + 1;
74
+ const line = lines[i];
75
+ // Skip if line doesn't exist (edge case)
76
+ if (!line)
77
+ continue;
78
+ // Skip comment lines
79
+ if (skipComments && commentLines.has(lineNum)) {
80
+ continue;
81
+ }
82
+ // Skip blank lines
83
+ if (skipBlankLines && line.trim().length === 0) {
84
+ continue;
85
+ }
86
+ actualLines++;
87
+ }
88
+ }
89
+ if (actualLines > maxLines) {
90
+ context.report({
91
+ node: node,
92
+ messageId: 'tooManyLines',
93
+ data: {
94
+ actual: String(actualLines),
95
+ max: String(maxLines),
96
+ layer,
97
+ },
98
+ });
99
+ }
100
+ },
101
+ };
102
+ },
103
+ };
104
+ export default maxFileLines;
105
+ //# sourceMappingURL=max-file-lines.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"max-file-lines.js","sourceRoot":"","sources":["../../src/rules/max-file-lines.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Rule: max-function-lines
3
+ *
4
+ * Enforce maximum function length with layer-based limits.
5
+ *
6
+ * TypeScript layered limits (LX-10, Python × 1.3):
7
+ * - Core: 65 lines (strict, pure logic)
8
+ * - Shell: 130 lines (I/O operations)
9
+ * - Tests: 260 lines (test functions)
10
+ * - Default: 104 lines (other files)
11
+ */
12
+ import { getLayer, getLimits } from '../utils/layer-detection.js';
13
+ function getFunctionName(node) {
14
+ const anyNode = node;
15
+ // FunctionDeclaration with name
16
+ if (anyNode.id?.name) {
17
+ return anyNode.id.name;
18
+ }
19
+ // MethodDefinition
20
+ if (anyNode.key?.name) {
21
+ return anyNode.key.name;
22
+ }
23
+ // Arrow function assigned to variable
24
+ if (anyNode.parent?.type === 'VariableDeclarator' && anyNode.parent.id?.name) {
25
+ return anyNode.parent.id.name;
26
+ }
27
+ return '(anonymous)';
28
+ }
29
+ export const maxFunctionLines = {
30
+ meta: {
31
+ type: 'problem',
32
+ docs: {
33
+ description: 'Enforce maximum function length with layer-based limits',
34
+ recommended: true,
35
+ },
36
+ schema: [
37
+ {
38
+ type: 'object',
39
+ properties: {
40
+ max: {
41
+ type: 'number',
42
+ minimum: 1,
43
+ },
44
+ skipBlankLines: {
45
+ type: 'boolean',
46
+ },
47
+ skipComments: {
48
+ type: 'boolean',
49
+ },
50
+ },
51
+ additionalProperties: false,
52
+ },
53
+ ],
54
+ messages: {
55
+ tooManyLines: 'Function "{{name}}" has {{actual}} lines ({{layer}} layer max: {{max}}). Consider breaking into smaller functions.',
56
+ },
57
+ },
58
+ create(context) {
59
+ const filename = context.filename || context.getFilename();
60
+ const layer = getLayer(filename);
61
+ const limits = getLimits(filename);
62
+ // Allow override via options
63
+ const options = context.options[0] || {};
64
+ const maxLines = options.max !== undefined ? options.max : limits.maxFunctionLines;
65
+ const skipBlankLines = options.skipBlankLines || false;
66
+ const skipComments = options.skipComments || false;
67
+ function checkFunction(node) {
68
+ const sourceCode = context.sourceCode || context.getSourceCode();
69
+ const loc = node.loc;
70
+ if (!loc)
71
+ return;
72
+ let actualLines = loc.end.line - loc.start.line + 1;
73
+ // Count non-blank/non-comment lines if requested
74
+ if (skipBlankLines || skipComments) {
75
+ const allComments = sourceCode.getAllComments();
76
+ const commentLines = new Set();
77
+ if (skipComments) {
78
+ allComments.forEach((comment) => {
79
+ if (!comment.loc)
80
+ return; // Skip comments without location info
81
+ const start = comment.loc.start.line;
82
+ const end = comment.loc.end.line;
83
+ for (let i = start; i <= end; i++) {
84
+ commentLines.add(i);
85
+ }
86
+ });
87
+ }
88
+ actualLines = 0;
89
+ for (let lineNum = loc.start.line; lineNum <= loc.end.line; lineNum++) {
90
+ const line = sourceCode.lines[lineNum - 1];
91
+ // Skip if line doesn't exist (edge case with trailing newlines)
92
+ if (!line)
93
+ continue;
94
+ // Skip comment lines
95
+ if (skipComments && commentLines.has(lineNum)) {
96
+ continue;
97
+ }
98
+ // Skip blank lines
99
+ if (skipBlankLines && line.trim().length === 0) {
100
+ continue;
101
+ }
102
+ actualLines++;
103
+ }
104
+ }
105
+ if (actualLines > maxLines) {
106
+ const name = getFunctionName(node);
107
+ context.report({
108
+ node,
109
+ messageId: 'tooManyLines',
110
+ data: {
111
+ name,
112
+ actual: String(actualLines),
113
+ max: String(maxLines),
114
+ layer,
115
+ },
116
+ });
117
+ }
118
+ }
119
+ return {
120
+ FunctionDeclaration(node) {
121
+ checkFunction(node);
122
+ },
123
+ FunctionExpression(node) {
124
+ checkFunction(node);
125
+ },
126
+ ArrowFunctionExpression(node) {
127
+ checkFunction(node);
128
+ },
129
+ };
130
+ },
131
+ };
132
+ export default maxFunctionLines;
133
+ //# sourceMappingURL=max-function-lines.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"max-function-lines.js","sourceRoot":"","sources":["../../src/rules/max-function-lines.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Rule: no-any-in-schema
3
+ *
4
+ * Forbid z.any() in Zod schemas.
5
+ * z.any() defeats the purpose of schema validation.
6
+ */
7
+ export const noAnyInSchema = {
8
+ meta: {
9
+ type: 'problem',
10
+ docs: {
11
+ description: 'Forbid z.any() in Zod schemas',
12
+ recommended: true,
13
+ },
14
+ schema: [],
15
+ messages: {
16
+ noAny: 'Avoid z.any() - use a specific type or z.unknown() with refinement',
17
+ },
18
+ },
19
+ create(context) {
20
+ return {
21
+ CallExpression(node) {
22
+ const callee = node.callee;
23
+ // Check for z.any()
24
+ if (callee.type === 'MemberExpression' &&
25
+ callee.object.type === 'Identifier' &&
26
+ callee.object.name === 'z' &&
27
+ callee.property.type === 'Identifier' &&
28
+ callee.property.name === 'any') {
29
+ context.report({
30
+ node: node,
31
+ messageId: 'noAny',
32
+ });
33
+ }
34
+ },
35
+ };
36
+ },
37
+ };
38
+ export default noAnyInSchema;
39
+ //# sourceMappingURL=no-any-in-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-any-in-schema.js","sourceRoot":"","sources":["../../src/rules/no-any-in-schema.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,CAAC,MAAM,aAAa,GAAoB;IAC5C,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EAAE,+BAA+B;YAC5C,WAAW,EAAE,IAAI;SAClB;QACD,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE;YACR,KAAK,EACH,oEAAoE;SACvE;KACF;IAED,MAAM,CAAC,OAAO;QACZ,OAAO;YACL,cAAc,CAAC,IAAI;gBACjB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;gBAE3B,oBAAoB;gBACpB,IACE,MAAM,CAAC,IAAI,KAAK,kBAAkB;oBAClC,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,YAAY;oBACnC,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,GAAG;oBAC1B,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,YAAY;oBACrC,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,KAAK,EAC9B,CAAC;oBACD,OAAO,CAAC,MAAM,CAAC;wBACb,IAAI,EAAE,IAA4B;wBAClC,SAAS,EAAE,OAAO;qBACnB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,eAAe,aAAa,CAAC"}