@hatem427/code-guard-ci 3.5.4 → 3.5.6
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/config/angular.config.ts +24 -24
- package/config/guidelines.config.ts +152 -68
- package/config/nextjs.config.ts +46 -1
- package/dist/config/angular.config.js +24 -22
- package/dist/config/angular.config.js.map +1 -1
- package/dist/config/guidelines.config.d.ts.map +1 -1
- package/dist/config/guidelines.config.js +139 -77
- package/dist/config/guidelines.config.js.map +1 -1
- package/dist/config/nextjs.config.d.ts.map +1 -1
- package/dist/config/nextjs.config.js +39 -1
- package/dist/config/nextjs.config.js.map +1 -1
- package/dist/scripts/cli.js +450 -115
- package/dist/scripts/cli.js.map +1 -1
- package/package.json +1 -1
- package/scripts/cli.ts +487 -125
|
@@ -28,17 +28,17 @@ exports.sharedRules = [
|
|
|
28
28
|
},
|
|
29
29
|
{
|
|
30
30
|
id: 'max-component-lines',
|
|
31
|
-
label: 'Component size ≤
|
|
32
|
-
description: 'Components should not exceed
|
|
33
|
-
severity: '
|
|
31
|
+
label: 'Component size ≤ 500 lines',
|
|
32
|
+
description: 'Components should not exceed 500 lines. Split large components into smaller, focused ones.',
|
|
33
|
+
severity: 'warning',
|
|
34
34
|
fileExtensions: ['ts', 'tsx', 'jsx'],
|
|
35
35
|
pattern: null,
|
|
36
36
|
customCheck: (file) => {
|
|
37
|
-
if (file.lineCount >
|
|
37
|
+
if (file.lineCount > 500) {
|
|
38
38
|
return [
|
|
39
39
|
{
|
|
40
40
|
line: null,
|
|
41
|
-
message: `File has ${file.lineCount} lines (max
|
|
41
|
+
message: `File has ${file.lineCount} lines (max 500). Consider splitting into smaller components.`,
|
|
42
42
|
},
|
|
43
43
|
];
|
|
44
44
|
}
|
|
@@ -136,68 +136,59 @@ exports.sharedRules = [
|
|
|
136
136
|
applicableTo: [],
|
|
137
137
|
category: 'Code Quality',
|
|
138
138
|
},
|
|
139
|
-
{
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
});
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
return violations.slice(0, 3); // Limit to 3 to avoid spam
|
|
197
|
-
},
|
|
198
|
-
applicableTo: [],
|
|
199
|
-
category: 'Code Quality',
|
|
200
|
-
},
|
|
139
|
+
// {
|
|
140
|
+
// id: 'no-magic-numbers',
|
|
141
|
+
// label: 'Avoid magic numbers',
|
|
142
|
+
// description: 'Use named constants instead of magic numbers for better code readability.',
|
|
143
|
+
// severity: 'info',
|
|
144
|
+
// fileExtensions: ['ts', 'tsx', 'js', 'jsx'],
|
|
145
|
+
// pattern: null,
|
|
146
|
+
// customCheck: (file) => {
|
|
147
|
+
// const violations: Array<{ line: number | null; message: string }> = [];
|
|
148
|
+
// const lines = file.lines;
|
|
149
|
+
// for (let i = 0; i < lines.length; i++) {
|
|
150
|
+
// const line = lines[i].trim();
|
|
151
|
+
// // ── Skip lines where numbers are expected ──
|
|
152
|
+
// // Skip JSX/HTML attributes (width={100}, height={20}, colspan={3}, etc.)
|
|
153
|
+
// if (/\w+=\{?\d+\}?/.test(line) && /<|className|style|width|height|cols|rows|span|size|max|min|step|tabIndex|priority/.test(line)) continue;
|
|
154
|
+
// // Skip Tailwind / CSS class strings (w-64, p-4, mt-8, grid-cols-3, etc.)
|
|
155
|
+
// if (/className|class\s*=/.test(line)) continue;
|
|
156
|
+
// // Skip JSX return / render lines (pure template markup)
|
|
157
|
+
// if (/^\s*</.test(line) || /return\s*\(/.test(line)) continue;
|
|
158
|
+
// // Skip import/export statements
|
|
159
|
+
// if (/^\s*(import|export)\s/.test(line)) continue;
|
|
160
|
+
// // Skip comments
|
|
161
|
+
// if (/^\s*(\/\/|\/\*|\*)/.test(line)) continue;
|
|
162
|
+
// // Skip common safe patterns
|
|
163
|
+
// if (/setTimeout|setInterval|Array\(|\.length|\.indexOf|\.slice|\.substring|port|status|code|index|Math\.|\.toFixed/.test(line)) continue;
|
|
164
|
+
// // Skip array access like arr[0], arr[2]
|
|
165
|
+
// if (/\[\d+\]/.test(line)) continue;
|
|
166
|
+
// // Skip enums and object literals with number values
|
|
167
|
+
// if (/^\s*\w+\s*:\s*\d+/.test(line) && !/const|let|var/.test(line)) continue;
|
|
168
|
+
// // ── Only flag: assignments with raw numbers (const x = 365, let y = 86400)
|
|
169
|
+
// // and comparisons/returns with unexplained numbers
|
|
170
|
+
// const isAssignment = /(?:const|let|var)\s+\w+\s*=\s*.*\d{2,}/.test(line);
|
|
171
|
+
// const isComparison = /[><=!]+\s*\d{3,}|if\s*\(.*\d{3,}/.test(line);
|
|
172
|
+
// const isReturn = /return\s+\d{3,}/.test(line);
|
|
173
|
+
// if (isAssignment || isComparison || isReturn) {
|
|
174
|
+
// // Extract the magic number
|
|
175
|
+
// const match = line.match(/(?<![\w.#-])\d{3,}(?![\w.px%remsvhw-])/);
|
|
176
|
+
// if (match) {
|
|
177
|
+
// // Skip common acceptable numbers
|
|
178
|
+
// const num = parseInt(match[0], 10);
|
|
179
|
+
// if ([100, 200, 300, 400, 404, 500, 1000, 1024, 2048].includes(num)) continue;
|
|
180
|
+
// violations.push({
|
|
181
|
+
// line: i + 1,
|
|
182
|
+
// message: `Magic number found: ${match[0]}. Consider using a named constant.`,
|
|
183
|
+
// });
|
|
184
|
+
// }
|
|
185
|
+
// }
|
|
186
|
+
// }
|
|
187
|
+
// return violations.slice(0, 3); // Limit to 3 to avoid spam
|
|
188
|
+
// },
|
|
189
|
+
// applicableTo: [],
|
|
190
|
+
// category: 'Code Quality',
|
|
191
|
+
// },
|
|
201
192
|
// NOTE: 'prefer-template-literals' removed — covered by ESLint 'prefer-template' rule
|
|
202
193
|
{
|
|
203
194
|
id: 'no-unnecessary-bind',
|
|
@@ -209,16 +200,16 @@ exports.sharedRules = [
|
|
|
209
200
|
applicableTo: [],
|
|
210
201
|
category: 'Modern Syntax',
|
|
211
202
|
},
|
|
212
|
-
{
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
},
|
|
203
|
+
// {
|
|
204
|
+
// id: 'prefer-early-return',
|
|
205
|
+
// label: 'Prefer early returns',
|
|
206
|
+
// description: 'Use early returns to avoid deep nesting and improve code readability.',
|
|
207
|
+
// severity: 'info',
|
|
208
|
+
// fileExtensions: ['ts', 'tsx', 'js', 'jsx'],
|
|
209
|
+
// pattern: null,
|
|
210
|
+
// applicableTo: [],
|
|
211
|
+
// category: 'Code Quality',
|
|
212
|
+
// },
|
|
222
213
|
// NOTE: 'no-var-keyword' removed — covered by ESLint 'no-var' rule
|
|
223
214
|
{
|
|
224
215
|
id: 'prefer-arrow-functions',
|
|
@@ -230,6 +221,77 @@ exports.sharedRules = [
|
|
|
230
221
|
applicableTo: [],
|
|
231
222
|
category: 'Modern Syntax',
|
|
232
223
|
},
|
|
224
|
+
{
|
|
225
|
+
id: 'function-formatting',
|
|
226
|
+
label: 'Function formatting conventions',
|
|
227
|
+
description: 'Functions must have a blank line before them, no space before (), and a space before and after {}.',
|
|
228
|
+
severity: 'error',
|
|
229
|
+
fileExtensions: ['ts', 'tsx', 'js', 'jsx'],
|
|
230
|
+
pattern: null,
|
|
231
|
+
customCheck: (file) => {
|
|
232
|
+
const violations = [];
|
|
233
|
+
const lines = file.lines;
|
|
234
|
+
for (let i = 0; i < lines.length; i++) {
|
|
235
|
+
const line = lines[i];
|
|
236
|
+
const trimmed = line.trim();
|
|
237
|
+
// Skip empty lines, comments, imports, decorators
|
|
238
|
+
if (!trimmed ||
|
|
239
|
+
trimmed.startsWith('//') ||
|
|
240
|
+
trimmed.startsWith('/*') ||
|
|
241
|
+
trimmed.startsWith('*') ||
|
|
242
|
+
trimmed.startsWith('@') ||
|
|
243
|
+
trimmed.startsWith('import '))
|
|
244
|
+
continue;
|
|
245
|
+
// Detect named function declarations:
|
|
246
|
+
// function foo(), async function foo(), export function foo(), export default function foo()
|
|
247
|
+
const isFunctionDecl = /^\s*(export\s+)?(default\s+)?(async\s+)?function\s+\w+/.test(line);
|
|
248
|
+
// Detect arrow/regular function assignments:
|
|
249
|
+
// const foo = () =>, const foo = async () =>, const foo = function() {}
|
|
250
|
+
const isArrowAssign = /^\s*(export\s+)?(const|let|var)\s+\w+\s*=\s*(async\s+)?(\(|function\s*\()/.test(line);
|
|
251
|
+
if (!isFunctionDecl && !isArrowAssign)
|
|
252
|
+
continue;
|
|
253
|
+
// ── Check 1: Blank line before function ──────────────────────────
|
|
254
|
+
// Allowed to have no blank line: when preceded by opening brace, another decorator,
|
|
255
|
+
// a comment line, or when it is the very first meaningful line in the file
|
|
256
|
+
if (i > 0) {
|
|
257
|
+
const prevTrimmed = lines[i - 1].trim();
|
|
258
|
+
const isAllowedPrev = prevTrimmed === '' || // blank line — correct
|
|
259
|
+
prevTrimmed === '{' || // opening brace of class/block
|
|
260
|
+
prevTrimmed === '(' || // opening paren
|
|
261
|
+
prevTrimmed.startsWith('//') ||
|
|
262
|
+
prevTrimmed.startsWith('/*') ||
|
|
263
|
+
prevTrimmed.startsWith('*') ||
|
|
264
|
+
prevTrimmed.startsWith('@'); // decorator on previous line
|
|
265
|
+
if (!isAllowedPrev) {
|
|
266
|
+
violations.push({
|
|
267
|
+
line: i + 1,
|
|
268
|
+
message: `Missing blank line before function declaration. Previous line: "${prevTrimmed.substring(0, 60)}"`,
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
// ── Check 2: No space before () ──────────────────────────────────
|
|
273
|
+
// Catches: function foo (...) — space between name and paren
|
|
274
|
+
if (isFunctionDecl && /function\s+\w+\s+\(/.test(line)) {
|
|
275
|
+
violations.push({
|
|
276
|
+
line: i + 1,
|
|
277
|
+
message: 'No space allowed before (). Use `function name()` not `function name ()`.',
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
// ── Check 3: Space before { ──────────────────────────────────────
|
|
281
|
+
// Catches: function foo(){ or () => { missing space
|
|
282
|
+
// Note: Prettier handles this, so only flag if Prettier isn't running
|
|
283
|
+
if (/\)\{/.test(line)) {
|
|
284
|
+
violations.push({
|
|
285
|
+
line: i + 1,
|
|
286
|
+
message: 'Missing space before `{`. Use `) {` not `){`.',
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
return violations.slice(0, 10);
|
|
291
|
+
},
|
|
292
|
+
applicableTo: [],
|
|
293
|
+
category: 'Code Style',
|
|
294
|
+
},
|
|
233
295
|
];
|
|
234
296
|
// ── Rule registry (populated by project-specific configs) ───────────────────
|
|
235
297
|
const ruleRegistry = new Map();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guidelines.config.js","sourceRoot":"","sources":["../../config/guidelines.config.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;
|
|
1
|
+
{"version":3,"file":"guidelines.config.js","sourceRoot":"","sources":["../../config/guidelines.config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nextjs.config.d.ts","sourceRoot":"","sources":["../../config/nextjs.config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAiB,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAE1D,QAAA,MAAM,WAAW,EAAE,IAAI,
|
|
1
|
+
{"version":3,"file":"nextjs.config.d.ts","sourceRoot":"","sources":["../../config/nextjs.config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAiB,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAE1D,QAAA,MAAM,WAAW,EAAE,IAAI,EAsLtB,CAAC;AAKF,OAAO,EAAE,WAAW,EAAE,CAAC"}
|
|
@@ -74,7 +74,7 @@ const nextjsRules = [
|
|
|
74
74
|
id: 'nextjs-api-error-handling',
|
|
75
75
|
label: 'API routes must have error handling',
|
|
76
76
|
description: 'All API route handlers (GET, POST, etc.) must wrap logic in try/catch and return proper error responses.',
|
|
77
|
-
severity: '
|
|
77
|
+
severity: 'info',
|
|
78
78
|
fileExtensions: ['ts', 'js'],
|
|
79
79
|
pattern: null,
|
|
80
80
|
customCheck: (file) => {
|
|
@@ -98,6 +98,44 @@ const nextjsRules = [
|
|
|
98
98
|
applicableTo: ['nextjs'],
|
|
99
99
|
category: 'Next.js API Routes',
|
|
100
100
|
},
|
|
101
|
+
// ── Sharp optimizer ───────────────────────────────────────────────────
|
|
102
|
+
{
|
|
103
|
+
id: 'nextjs-require-sharp',
|
|
104
|
+
label: 'Install sharp for image optimization',
|
|
105
|
+
description: 'Next.js requires the "sharp" package for optimized image processing in production. Add it as a dependency: npm install sharp',
|
|
106
|
+
severity: 'warning',
|
|
107
|
+
fileExtensions: ['json'],
|
|
108
|
+
pattern: null,
|
|
109
|
+
customCheck: (file) => {
|
|
110
|
+
const violations = [];
|
|
111
|
+
// Only check package.json at the project root
|
|
112
|
+
const basename = file.relativePath.split('/').pop() || '';
|
|
113
|
+
if (basename !== 'package.json')
|
|
114
|
+
return [];
|
|
115
|
+
let pkg;
|
|
116
|
+
try {
|
|
117
|
+
pkg = JSON.parse(file.content);
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
return [];
|
|
121
|
+
}
|
|
122
|
+
const allDeps = {
|
|
123
|
+
...pkg.dependencies,
|
|
124
|
+
...pkg.devDependencies,
|
|
125
|
+
...pkg.peerDependencies,
|
|
126
|
+
...pkg.optionalDependencies,
|
|
127
|
+
};
|
|
128
|
+
if (!allDeps['sharp']) {
|
|
129
|
+
violations.push({
|
|
130
|
+
line: null,
|
|
131
|
+
message: 'Missing "sharp" package. Next.js uses sharp for production image optimization. Run: npm install sharp',
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
return violations;
|
|
135
|
+
},
|
|
136
|
+
applicableTo: ['nextjs'],
|
|
137
|
+
category: 'Next.js Performance',
|
|
138
|
+
},
|
|
101
139
|
// ── Metadata ──────────────────────────────────────────────────────────
|
|
102
140
|
{
|
|
103
141
|
id: 'nextjs-page-metadata',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nextjs.config.js","sourceRoot":"","sources":["../../config/nextjs.config.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;GAaG;;;AAEH,2DAA0D;AAE1D,MAAM,WAAW,GAAW;IAC1B,0EAA0E;IAE1E;QACE,EAAE,EAAE,6BAA6B;QACjC,KAAK,EAAE,+CAA+C;QACtD,WAAW,EACT,gIAAgI;QAClI,QAAQ,EAAE,OAAO;QACjB,cAAc,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC;QAC1C,OAAO,EAAE,IAAI;QACb,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE;YACpB,MAAM,UAAU,GAAoD,EAAE,CAAC;YAEvE,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;YACpG,MAAM,QAAQ,GAAG,0DAA0D,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC/F,MAAM,gBAAgB,GAAG,sDAAsD,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAEnG,8DAA8D;YAC9D,IAAI,CAAC,QAAQ,IAAI,gBAAgB,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;gBACpD,0EAA0E;gBAC1E,MAAM,WAAW,GAAG,wCAAwC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;oBAC5D,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAChE,IAAI,WAAW,EAAE,CAAC;oBAChB,UAAU,CAAC,IAAI,CAAC;wBACd,IAAI,EAAE,CAAC;wBACP,OAAO,EAAE,4EAA4E;qBACtF,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,OAAO,UAAU,CAAC;QACpB,CAAC;QACD,YAAY,EAAE,CAAC,QAAQ,CAAC;QACxB,QAAQ,EAAE,oBAAoB;KAC/B;IAED,0EAA0E;IAE1E;QACE,EAAE,EAAE,4BAA4B;QAChC,KAAK,EAAE,iCAAiC;QACxC,WAAW,EACT,uGAAuG;QACzG,QAAQ,EAAE,SAAS;QACnB,cAAc,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC;QAC9B,OAAO,EAAE,SAAS;QAClB,YAAY,EAAE,CAAC,QAAQ,CAAC;QACxB,QAAQ,EAAE,qBAAqB;KAChC;IAED,yEAAyE;IAEzE;QACE,EAAE,EAAE,2BAA2B;QAC/B,KAAK,EAAE,8BAA8B;QACrC,WAAW,EACT,uGAAuG;QACzG,QAAQ,EAAE,SAAS;QACnB,cAAc,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC;QAC9B,OAAO,EAAE,+BAA+B;QACxC,YAAY,EAAE,CAAC,QAAQ,CAAC;QACxB,QAAQ,EAAE,oBAAoB;KAC/B;IAED,0EAA0E;IAE1E;QACE,EAAE,EAAE,2BAA2B;QAC/B,KAAK,EAAE,qCAAqC;QAC5C,WAAW,EACT,0GAA0G;QAC5G,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"nextjs.config.js","sourceRoot":"","sources":["../../config/nextjs.config.ts"],"names":[],"mappings":"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"}
|