@kevinrabun/judges 3.58.0 → 3.60.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.
- package/CHANGELOG.md +24 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +112 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/adoption-track.d.ts +5 -0
- package/dist/commands/adoption-track.d.ts.map +1 -0
- package/dist/commands/adoption-track.js +247 -0
- package/dist/commands/adoption-track.js.map +1 -0
- package/dist/commands/api-misuse.d.ts +5 -0
- package/dist/commands/api-misuse.d.ts.map +1 -0
- package/dist/commands/api-misuse.js +261 -0
- package/dist/commands/api-misuse.js.map +1 -0
- package/dist/commands/completion-audit.d.ts +5 -0
- package/dist/commands/completion-audit.d.ts.map +1 -0
- package/dist/commands/completion-audit.js +297 -0
- package/dist/commands/completion-audit.js.map +1 -0
- package/dist/commands/context-blind.d.ts +5 -0
- package/dist/commands/context-blind.d.ts.map +1 -0
- package/dist/commands/context-blind.js +273 -0
- package/dist/commands/context-blind.js.map +1 -0
- package/dist/commands/cross-file-consistency.d.ts +5 -0
- package/dist/commands/cross-file-consistency.d.ts.map +1 -0
- package/dist/commands/cross-file-consistency.js +255 -0
- package/dist/commands/cross-file-consistency.js.map +1 -0
- package/dist/commands/example-leak.d.ts +5 -0
- package/dist/commands/example-leak.d.ts.map +1 -0
- package/dist/commands/example-leak.js +233 -0
- package/dist/commands/example-leak.js.map +1 -0
- package/dist/commands/finding-budget.d.ts +5 -0
- package/dist/commands/finding-budget.d.ts.map +1 -0
- package/dist/commands/finding-budget.js +233 -0
- package/dist/commands/finding-budget.js.map +1 -0
- package/dist/commands/hallucination-detect.d.ts +5 -0
- package/dist/commands/hallucination-detect.d.ts.map +1 -0
- package/dist/commands/hallucination-detect.js +351 -0
- package/dist/commands/hallucination-detect.js.map +1 -0
- package/dist/commands/logic-lint.d.ts +5 -0
- package/dist/commands/logic-lint.d.ts.map +1 -0
- package/dist/commands/logic-lint.js +256 -0
- package/dist/commands/logic-lint.js.map +1 -0
- package/dist/commands/over-abstraction.d.ts +5 -0
- package/dist/commands/over-abstraction.d.ts.map +1 -0
- package/dist/commands/over-abstraction.js +308 -0
- package/dist/commands/over-abstraction.js.map +1 -0
- package/dist/commands/phantom-import.d.ts +5 -0
- package/dist/commands/phantom-import.d.ts.map +1 -0
- package/dist/commands/phantom-import.js +261 -0
- package/dist/commands/phantom-import.js.map +1 -0
- package/dist/commands/review-digest.d.ts +5 -0
- package/dist/commands/review-digest.d.ts.map +1 -0
- package/dist/commands/review-digest.js +266 -0
- package/dist/commands/review-digest.js.map +1 -0
- package/dist/commands/review-focus.d.ts +5 -0
- package/dist/commands/review-focus.d.ts.map +1 -0
- package/dist/commands/review-focus.js +197 -0
- package/dist/commands/review-focus.js.map +1 -0
- package/dist/commands/security-theater.d.ts +5 -0
- package/dist/commands/security-theater.d.ts.map +1 -0
- package/dist/commands/security-theater.js +279 -0
- package/dist/commands/security-theater.js.map +1 -0
- package/dist/commands/spec-conform.d.ts +5 -0
- package/dist/commands/spec-conform.d.ts.map +1 -0
- package/dist/commands/spec-conform.js +305 -0
- package/dist/commands/spec-conform.js.map +1 -0
- package/dist/commands/stale-pattern.d.ts +5 -0
- package/dist/commands/stale-pattern.d.ts.map +1 -0
- package/dist/commands/stale-pattern.js +294 -0
- package/dist/commands/stale-pattern.js.map +1 -0
- package/package.json +1 -1
- package/server.json +2 -2
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spec conform — check code conformance to project conventions and style patterns.
|
|
3
|
+
*/
|
|
4
|
+
import { readFileSync, readdirSync, statSync } from "fs";
|
|
5
|
+
import { join, extname, basename } from "path";
|
|
6
|
+
// ─── File Collection ────────────────────────────────────────────────────────
|
|
7
|
+
const CODE_EXTS = new Set([".ts", ".tsx", ".js", ".jsx"]);
|
|
8
|
+
function collectFiles(dir, max = 300) {
|
|
9
|
+
const files = [];
|
|
10
|
+
function walk(d) {
|
|
11
|
+
if (files.length >= max)
|
|
12
|
+
return;
|
|
13
|
+
let entries;
|
|
14
|
+
try {
|
|
15
|
+
entries = readdirSync(d);
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
for (const e of entries) {
|
|
21
|
+
if (files.length >= max)
|
|
22
|
+
return;
|
|
23
|
+
if (e.startsWith(".") || e === "node_modules" || e === "dist" || e === "build")
|
|
24
|
+
continue;
|
|
25
|
+
const full = join(d, e);
|
|
26
|
+
try {
|
|
27
|
+
if (statSync(full).isDirectory())
|
|
28
|
+
walk(full);
|
|
29
|
+
else if (CODE_EXTS.has(extname(full)))
|
|
30
|
+
files.push(full);
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
/* skip */
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
walk(dir);
|
|
38
|
+
return files;
|
|
39
|
+
}
|
|
40
|
+
function detectConventions(dir, files) {
|
|
41
|
+
const conv = {
|
|
42
|
+
useSemicolons: null,
|
|
43
|
+
quoteStyle: null,
|
|
44
|
+
indentStyle: null,
|
|
45
|
+
indentSize: null,
|
|
46
|
+
namingStyle: null,
|
|
47
|
+
hasEslint: false,
|
|
48
|
+
hasPrettier: false,
|
|
49
|
+
hasEditorConfig: false,
|
|
50
|
+
fileNamingPattern: null,
|
|
51
|
+
};
|
|
52
|
+
// Check for config files
|
|
53
|
+
try {
|
|
54
|
+
const entries = readdirSync(dir);
|
|
55
|
+
conv.hasEslint = entries.some((e) => /^\.?eslint/.test(e));
|
|
56
|
+
conv.hasPrettier = entries.some((e) => /^\.?prettier/.test(e));
|
|
57
|
+
conv.hasEditorConfig = entries.includes(".editorconfig");
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
/* skip */
|
|
61
|
+
}
|
|
62
|
+
// Analyze existing file conventions from first 20 files
|
|
63
|
+
let semiCount = 0;
|
|
64
|
+
let noSemiCount = 0;
|
|
65
|
+
let singleQuote = 0;
|
|
66
|
+
let doubleQuote = 0;
|
|
67
|
+
let tabIndent = 0;
|
|
68
|
+
let spaceIndent = 0;
|
|
69
|
+
const indentSizes = [];
|
|
70
|
+
let camelCount = 0;
|
|
71
|
+
let snakeCount = 0;
|
|
72
|
+
const sampleFiles = files.slice(0, 20);
|
|
73
|
+
for (const filepath of sampleFiles) {
|
|
74
|
+
let content;
|
|
75
|
+
try {
|
|
76
|
+
content = readFileSync(filepath, "utf-8");
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
const fileLines = content.split("\n");
|
|
82
|
+
for (const line of fileLines.slice(0, 50)) {
|
|
83
|
+
// Semicolons
|
|
84
|
+
if (/;\s*$/.test(line.trim()) && !/\/\/|\/\*|\*/.test(line.trim().slice(0, 2)))
|
|
85
|
+
semiCount++;
|
|
86
|
+
if (/[^;{}\s]\s*$/.test(line.trim()) && line.trim().length > 5 && !/\/\/|\/\*|\*|=>/.test(line.trim()))
|
|
87
|
+
noSemiCount++;
|
|
88
|
+
// Quotes
|
|
89
|
+
const singles = (line.match(/'/g) || []).length;
|
|
90
|
+
const doubles = (line.match(/"/g) || []).length;
|
|
91
|
+
singleQuote += singles;
|
|
92
|
+
doubleQuote += doubles;
|
|
93
|
+
// Indentation
|
|
94
|
+
const indent = line.match(/^(\s+)/);
|
|
95
|
+
if (indent) {
|
|
96
|
+
if (indent[1].includes("\t"))
|
|
97
|
+
tabIndent++;
|
|
98
|
+
else {
|
|
99
|
+
spaceIndent++;
|
|
100
|
+
indentSizes.push(indent[1].length);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// Variable naming
|
|
105
|
+
const varDecls = content.match(/(?:const|let|var)\s+([a-z]\w+)/g) || [];
|
|
106
|
+
for (const decl of varDecls) {
|
|
107
|
+
const name = decl.split(/\s+/)[1];
|
|
108
|
+
if (name.includes("_"))
|
|
109
|
+
snakeCount++;
|
|
110
|
+
else
|
|
111
|
+
camelCount++;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
conv.useSemicolons = semiCount > noSemiCount * 2 ? true : noSemiCount > semiCount * 2 ? false : null;
|
|
115
|
+
conv.quoteStyle = singleQuote > doubleQuote * 1.5 ? "single" : doubleQuote > singleQuote * 1.5 ? "double" : null;
|
|
116
|
+
conv.indentStyle = tabIndent > spaceIndent ? "tabs" : spaceIndent > tabIndent ? "spaces" : null;
|
|
117
|
+
if (indentSizes.length > 0) {
|
|
118
|
+
const mode = indentSizes.sort((a, b) => a - b)[Math.floor(indentSizes.length / 2)];
|
|
119
|
+
conv.indentSize = mode <= 4 ? mode : null;
|
|
120
|
+
}
|
|
121
|
+
conv.namingStyle = camelCount > snakeCount * 2 ? "camelCase" : snakeCount > camelCount * 2 ? "snake_case" : null;
|
|
122
|
+
// File naming pattern
|
|
123
|
+
const fileNames = files.map((f) => basename(f, extname(f)));
|
|
124
|
+
const kebab = fileNames.filter((n) => /^[a-z][a-z0-9-]*$/.test(n)).length;
|
|
125
|
+
const camel = fileNames.filter((n) => /^[a-z][a-zA-Z0-9]*$/.test(n) && /[A-Z]/.test(n)).length;
|
|
126
|
+
const pascal = fileNames.filter((n) => /^[A-Z][a-zA-Z0-9]*$/.test(n)).length;
|
|
127
|
+
const snake = fileNames.filter((n) => /^[a-z][a-z0-9_]*$/.test(n) && n.includes("_")).length;
|
|
128
|
+
const counts = [
|
|
129
|
+
{ style: "kebab-case", count: kebab },
|
|
130
|
+
{ style: "camelCase", count: camel },
|
|
131
|
+
{ style: "PascalCase", count: pascal },
|
|
132
|
+
{ style: "snake_case", count: snake },
|
|
133
|
+
].sort((a, b) => b.count - a.count);
|
|
134
|
+
if (counts[0].count > files.length * 0.5)
|
|
135
|
+
conv.fileNamingPattern = counts[0].style;
|
|
136
|
+
return conv;
|
|
137
|
+
}
|
|
138
|
+
// ─── Analysis ───────────────────────────────────────────────────────────────
|
|
139
|
+
function analyzeFile(filepath, conv) {
|
|
140
|
+
const issues = [];
|
|
141
|
+
let content;
|
|
142
|
+
try {
|
|
143
|
+
content = readFileSync(filepath, "utf-8");
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
return issues;
|
|
147
|
+
}
|
|
148
|
+
const lines = content.split("\n");
|
|
149
|
+
const fname = basename(filepath, extname(filepath));
|
|
150
|
+
// File naming convention
|
|
151
|
+
if (conv.fileNamingPattern === "kebab-case" && !/^[a-z][a-z0-9.-]*$/.test(fname) && !fname.startsWith("_")) {
|
|
152
|
+
issues.push({
|
|
153
|
+
file: filepath,
|
|
154
|
+
line: 1,
|
|
155
|
+
issue: "File name breaks project convention",
|
|
156
|
+
severity: "low",
|
|
157
|
+
detail: `Project uses kebab-case filenames but this file is named \`${fname}\``,
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
if (conv.fileNamingPattern === "PascalCase" && !/^[A-Z]/.test(fname)) {
|
|
161
|
+
issues.push({
|
|
162
|
+
file: filepath,
|
|
163
|
+
line: 1,
|
|
164
|
+
issue: "File name breaks project convention",
|
|
165
|
+
severity: "low",
|
|
166
|
+
detail: `Project uses PascalCase filenames but this file is named \`${fname}\``,
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
for (let i = 0; i < lines.length; i++) {
|
|
170
|
+
const line = lines[i];
|
|
171
|
+
const trimmed = line.trim();
|
|
172
|
+
// Semicolon consistency
|
|
173
|
+
if (conv.useSemicolons === true && /[a-zA-Z0-9)\]'"]\s*$/.test(trimmed) && trimmed.length > 10) {
|
|
174
|
+
if (!/^\s*(?:\/\/|\/\*|\*|import|export|if|else|for|while|do|switch|try|catch|finally|class|interface|type|enum|function|=>|\{|\}|\(|\)|,)/.test(trimmed)) {
|
|
175
|
+
issues.push({
|
|
176
|
+
file: filepath,
|
|
177
|
+
line: i + 1,
|
|
178
|
+
issue: "Missing semicolon (project uses semicolons)",
|
|
179
|
+
severity: "low",
|
|
180
|
+
detail: "Line ends without semicolon — inconsistent with project style",
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
// Quote style consistency
|
|
185
|
+
if (conv.quoteStyle === "single" && /"[^"]*"/.test(trimmed) && !/import\s/.test(trimmed)) {
|
|
186
|
+
if (!trimmed.includes("'") && !trimmed.includes("`") && !/console\.|require|JSON/.test(trimmed)) {
|
|
187
|
+
// Only flag if it's clearly a string, not a JSON key or HTML attribute
|
|
188
|
+
const dqCount = (trimmed.match(/"/g) || []).length;
|
|
189
|
+
if (dqCount === 2) {
|
|
190
|
+
issues.push({
|
|
191
|
+
file: filepath,
|
|
192
|
+
line: i + 1,
|
|
193
|
+
issue: "Double quotes (project uses single)",
|
|
194
|
+
severity: "low",
|
|
195
|
+
detail: "Project convention is single quotes — AI generated double-quoted string",
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
// Variable naming convention
|
|
201
|
+
if (conv.namingStyle === "camelCase") {
|
|
202
|
+
const snakeMatch = trimmed.match(/(?:const|let|var)\s+([a-z]+_[a-z_]+)/);
|
|
203
|
+
if (snakeMatch) {
|
|
204
|
+
issues.push({
|
|
205
|
+
file: filepath,
|
|
206
|
+
line: i + 1,
|
|
207
|
+
issue: "snake_case variable in camelCase project",
|
|
208
|
+
severity: "medium",
|
|
209
|
+
detail: `\`${snakeMatch[1]}\` uses snake_case — project convention is camelCase`,
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
if (conv.namingStyle === "snake_case") {
|
|
214
|
+
const camelMatch = trimmed.match(/(?:const|let|var)\s+([a-z]+[A-Z]\w+)/);
|
|
215
|
+
if (camelMatch) {
|
|
216
|
+
issues.push({
|
|
217
|
+
file: filepath,
|
|
218
|
+
line: i + 1,
|
|
219
|
+
issue: "camelCase variable in snake_case project",
|
|
220
|
+
severity: "medium",
|
|
221
|
+
detail: `\`${camelMatch[1]}\` uses camelCase — project convention is snake_case`,
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
// Mixed indentation
|
|
226
|
+
if (conv.indentStyle === "spaces" && /^\t/.test(line)) {
|
|
227
|
+
issues.push({
|
|
228
|
+
file: filepath,
|
|
229
|
+
line: i + 1,
|
|
230
|
+
issue: "Tab indentation in spaces-only project",
|
|
231
|
+
severity: "low",
|
|
232
|
+
detail: "Project uses spaces for indentation — AI generated tab-indented code",
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
if (conv.indentStyle === "tabs" && /^ {2,}/.test(line) && !/^\s*\*/.test(line)) {
|
|
236
|
+
issues.push({
|
|
237
|
+
file: filepath,
|
|
238
|
+
line: i + 1,
|
|
239
|
+
issue: "Space indentation in tabs-only project",
|
|
240
|
+
severity: "low",
|
|
241
|
+
detail: "Project uses tabs for indentation — AI generated space-indented code",
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
return issues;
|
|
246
|
+
}
|
|
247
|
+
// ─── CLI ────────────────────────────────────────────────────────────────────
|
|
248
|
+
export function runSpecConform(argv) {
|
|
249
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
250
|
+
console.log(`
|
|
251
|
+
judges spec-conform — Check code conformance to project conventions
|
|
252
|
+
|
|
253
|
+
Usage:
|
|
254
|
+
judges spec-conform [dir]
|
|
255
|
+
judges spec-conform src/ --format json
|
|
256
|
+
|
|
257
|
+
Options:
|
|
258
|
+
[dir] Directory to scan (default: .)
|
|
259
|
+
--format json JSON output
|
|
260
|
+
--help, -h Show this help
|
|
261
|
+
|
|
262
|
+
Auto-detects: semicolon usage, quote style, indentation, variable naming, file naming.
|
|
263
|
+
Flags AI-generated code that breaks detected project conventions.
|
|
264
|
+
`);
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
|
|
268
|
+
const dir = argv.find((a) => !a.startsWith("-") && argv.indexOf(a) > 0) || ".";
|
|
269
|
+
const files = collectFiles(dir);
|
|
270
|
+
const conv = detectConventions(dir, files);
|
|
271
|
+
const allIssues = [];
|
|
272
|
+
for (const f of files)
|
|
273
|
+
allIssues.push(...analyzeFile(f, conv));
|
|
274
|
+
const highCount = allIssues.filter((i) => i.severity === "high").length;
|
|
275
|
+
const medCount = allIssues.filter((i) => i.severity === "medium").length;
|
|
276
|
+
const score = Math.max(0, 100 - highCount * 10 - medCount * 4 - allIssues.filter((i) => i.severity === "low").length);
|
|
277
|
+
if (format === "json") {
|
|
278
|
+
console.log(JSON.stringify({
|
|
279
|
+
conventions: conv,
|
|
280
|
+
issues: allIssues,
|
|
281
|
+
score,
|
|
282
|
+
summary: { high: highCount, medium: medCount, total: allIssues.length },
|
|
283
|
+
timestamp: new Date().toISOString(),
|
|
284
|
+
}, null, 2));
|
|
285
|
+
}
|
|
286
|
+
else {
|
|
287
|
+
const badge = score >= 80 ? "✅ CONFORMING" : score >= 50 ? "⚠️ DRIFTING" : "❌ NONCONFORMING";
|
|
288
|
+
console.log(`\n Spec Conform: ${badge} (${score}/100)\n ─────────────────────────────`);
|
|
289
|
+
console.log(` Detected: semis=${conv.useSemicolons ?? "?"} quotes=${conv.quoteStyle ?? "?"} indent=${conv.indentStyle ?? "?"}(${conv.indentSize ?? "?"}) naming=${conv.namingStyle ?? "?"} files=${conv.fileNamingPattern ?? "?"}`);
|
|
290
|
+
if (allIssues.length === 0) {
|
|
291
|
+
console.log(" No convention violations detected.\n");
|
|
292
|
+
return;
|
|
293
|
+
}
|
|
294
|
+
for (const issue of allIssues.slice(0, 25)) {
|
|
295
|
+
const icon = issue.severity === "high" ? "🔴" : issue.severity === "medium" ? "🟡" : "🔵";
|
|
296
|
+
console.log(` ${icon} ${issue.issue}`);
|
|
297
|
+
console.log(` ${issue.file}:${issue.line}`);
|
|
298
|
+
console.log(` ${issue.detail}`);
|
|
299
|
+
}
|
|
300
|
+
if (allIssues.length > 25)
|
|
301
|
+
console.log(` ... and ${allIssues.length - 25} more`);
|
|
302
|
+
console.log(`\n Total: ${allIssues.length} | High: ${highCount} | Medium: ${medCount} | Score: ${score}/100\n`);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
//# sourceMappingURL=spec-conform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec-conform.js","sourceRoot":"","sources":["../../src/commands/spec-conform.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stale-pattern.d.ts","sourceRoot":"","sources":["../../src/commands/stale-pattern.ts"],"names":[],"mappings":"AAAA;;GAEG;AA6QH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAiEpD"}
|
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stale-pattern — identify outdated idioms when modern alternatives exist.
|
|
3
|
+
*/
|
|
4
|
+
import { readFileSync, readdirSync, statSync } from "fs";
|
|
5
|
+
import { join, extname } from "path";
|
|
6
|
+
// ─── File Collection ────────────────────────────────────────────────────────
|
|
7
|
+
const CODE_EXTS = new Set([".ts", ".tsx", ".js", ".jsx"]);
|
|
8
|
+
function collectFiles(dir, max = 300) {
|
|
9
|
+
const files = [];
|
|
10
|
+
function walk(d) {
|
|
11
|
+
if (files.length >= max)
|
|
12
|
+
return;
|
|
13
|
+
let entries;
|
|
14
|
+
try {
|
|
15
|
+
entries = readdirSync(d);
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
for (const e of entries) {
|
|
21
|
+
if (files.length >= max)
|
|
22
|
+
return;
|
|
23
|
+
if (e.startsWith(".") || e === "node_modules" || e === "dist" || e === "build")
|
|
24
|
+
continue;
|
|
25
|
+
const full = join(d, e);
|
|
26
|
+
try {
|
|
27
|
+
if (statSync(full).isDirectory())
|
|
28
|
+
walk(full);
|
|
29
|
+
else if (CODE_EXTS.has(extname(full)))
|
|
30
|
+
files.push(full);
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
/* skip */
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
walk(dir);
|
|
38
|
+
return files;
|
|
39
|
+
}
|
|
40
|
+
const STALE_PATTERNS = [
|
|
41
|
+
// Node.js deprecated APIs
|
|
42
|
+
{
|
|
43
|
+
regex: /new\s+Buffer\s*\(/,
|
|
44
|
+
name: "new Buffer()",
|
|
45
|
+
severity: "high",
|
|
46
|
+
modern: "Buffer.from() / Buffer.alloc()",
|
|
47
|
+
detail: "new Buffer() is deprecated due to security issues (uninitialized memory)",
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
regex: /url\.parse\s*\(/,
|
|
51
|
+
name: "url.parse()",
|
|
52
|
+
severity: "medium",
|
|
53
|
+
modern: "new URL()",
|
|
54
|
+
detail: "url.parse() is deprecated — use the WHATWG URL API",
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
regex: /require\s*\(\s*['"]domain['"]/,
|
|
58
|
+
name: "domain module",
|
|
59
|
+
severity: "medium",
|
|
60
|
+
modern: "AsyncLocalStorage or structured error handling",
|
|
61
|
+
detail: "The domain module is deprecated and should not be used for error handling",
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
regex: /require\s*\(\s*['"]punycode['"]/,
|
|
65
|
+
name: "punycode module",
|
|
66
|
+
severity: "low",
|
|
67
|
+
modern: "url.domainToASCII() / url.domainToUnicode()",
|
|
68
|
+
detail: "Built-in punycode module is deprecated",
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
regex: /fs\.exists\s*\(/,
|
|
72
|
+
name: "fs.exists()",
|
|
73
|
+
severity: "medium",
|
|
74
|
+
modern: "fs.access() or fs.stat()",
|
|
75
|
+
detail: "fs.exists() is deprecated — use fs.access() for existence checks",
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
regex: /path\._makeLong\s*\(/,
|
|
79
|
+
name: "path._makeLong()",
|
|
80
|
+
severity: "low",
|
|
81
|
+
modern: "path.toNamespacedPath()",
|
|
82
|
+
detail: "path._makeLong() is an internal API — use toNamespacedPath()",
|
|
83
|
+
},
|
|
84
|
+
// Callback patterns vs async/await
|
|
85
|
+
{
|
|
86
|
+
regex: /(\w+)\s*\(\s*(?:function\s*\(|[(]\s*)\s*(?:err|error)\s*,\s*(?:data|result|res|body|response)/,
|
|
87
|
+
name: "Error-first callback",
|
|
88
|
+
severity: "medium",
|
|
89
|
+
modern: "async/await with promises",
|
|
90
|
+
detail: "Error-first callbacks should be replaced with async/await for readability and error handling",
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
regex: /\.then\s*\(\s*(?:function|[(])\s*\w*\s*[)]*\s*\{[^}]*\.then\s*\(/,
|
|
94
|
+
name: "Nested .then() chains",
|
|
95
|
+
severity: "medium",
|
|
96
|
+
modern: "async/await",
|
|
97
|
+
detail: "Nested promise chains are hard to read — use async/await",
|
|
98
|
+
},
|
|
99
|
+
// Old JavaScript patterns
|
|
100
|
+
{
|
|
101
|
+
regex: /var\s+\w+\s*=/,
|
|
102
|
+
name: "var declaration",
|
|
103
|
+
severity: "low",
|
|
104
|
+
modern: "const / let",
|
|
105
|
+
detail: "var has function scoping issues — use const or let for block scoping",
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
regex: /typeof\s+\w+\s*[!=]==?\s*['"]undefined['"]/,
|
|
109
|
+
name: "typeof undefined check",
|
|
110
|
+
severity: "low",
|
|
111
|
+
modern: "Optional chaining (?.) or nullish coalescing (??)",
|
|
112
|
+
detail: "typeof undefined checks can often be replaced with optional chaining",
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
regex: /\.apply\s*\(\s*(?:null|this)\s*,\s*arguments\s*\)/,
|
|
116
|
+
name: ".apply(null, arguments)",
|
|
117
|
+
severity: "low",
|
|
118
|
+
modern: "...rest parameters and spread",
|
|
119
|
+
detail: "Use rest parameters and spread syntax instead of arguments object",
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
regex: /arguments\s*\[\s*\d+\s*\]/,
|
|
123
|
+
name: "arguments[] indexing",
|
|
124
|
+
severity: "low",
|
|
125
|
+
modern: "Named parameters or rest (...args)",
|
|
126
|
+
detail: "The arguments object is a legacy feature — use named or rest parameters",
|
|
127
|
+
},
|
|
128
|
+
// Old testing patterns
|
|
129
|
+
{
|
|
130
|
+
regex: /(?:it|test)\s*\(\s*['"][^'"]+['"]\s*,\s*function\s*\(\s*done\s*\)/,
|
|
131
|
+
name: "done() callback test",
|
|
132
|
+
severity: "medium",
|
|
133
|
+
modern: "async test functions",
|
|
134
|
+
detail: "Test done() callbacks are error-prone — use async/await in tests",
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
regex: /\.should\.\w+/,
|
|
138
|
+
name: "should-style assertions",
|
|
139
|
+
severity: "low",
|
|
140
|
+
modern: "expect() or assert()",
|
|
141
|
+
detail: "Should-style assertions modify Object.prototype — use expect() or assert()",
|
|
142
|
+
},
|
|
143
|
+
// React class components
|
|
144
|
+
{
|
|
145
|
+
regex: /class\s+\w+\s+extends\s+(?:React\.)?(?:Component|PureComponent)\s*[<{]/,
|
|
146
|
+
name: "React class component",
|
|
147
|
+
severity: "medium",
|
|
148
|
+
modern: "Function components with hooks",
|
|
149
|
+
detail: "React class components are legacy — prefer function components with hooks",
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
regex: /componentWillMount\s*\(/,
|
|
153
|
+
name: "componentWillMount",
|
|
154
|
+
severity: "high",
|
|
155
|
+
modern: "useEffect hook",
|
|
156
|
+
detail: "componentWillMount is removed in React 18 — use useEffect",
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
regex: /componentWillReceiveProps\s*\(/,
|
|
160
|
+
name: "componentWillReceiveProps",
|
|
161
|
+
severity: "high",
|
|
162
|
+
modern: "getDerivedStateFromProps or useEffect",
|
|
163
|
+
detail: "componentWillReceiveProps is removed in React 18",
|
|
164
|
+
},
|
|
165
|
+
// Promise constructor anti-pattern
|
|
166
|
+
{
|
|
167
|
+
regex: /new\s+Promise\s*\(\s*(?:async|[(]\s*(?:resolve|reject))/,
|
|
168
|
+
name: "Async executor in Promise",
|
|
169
|
+
severity: "medium",
|
|
170
|
+
modern: "Direct async function",
|
|
171
|
+
detail: "async function inside Promise executor is an anti-pattern — errors won't reject the promise",
|
|
172
|
+
},
|
|
173
|
+
// Old module patterns
|
|
174
|
+
{
|
|
175
|
+
regex: /module\.exports\s*=/,
|
|
176
|
+
name: "CommonJS module.exports",
|
|
177
|
+
severity: "low",
|
|
178
|
+
modern: "ES module export",
|
|
179
|
+
detail: "CommonJS is legacy in TypeScript — use ES module exports",
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
regex: /exports\.\w+\s*=/,
|
|
183
|
+
name: "CommonJS exports.x",
|
|
184
|
+
severity: "low",
|
|
185
|
+
modern: "ES module named export",
|
|
186
|
+
detail: "CommonJS exports are legacy in TypeScript — use ES module named exports",
|
|
187
|
+
},
|
|
188
|
+
// Deprecated string methods
|
|
189
|
+
{
|
|
190
|
+
regex: /\.substr\s*\(/,
|
|
191
|
+
name: ".substr()",
|
|
192
|
+
severity: "low",
|
|
193
|
+
modern: ".substring() or .slice()",
|
|
194
|
+
detail: ".substr() is deprecated in favor of .substring() or .slice()",
|
|
195
|
+
},
|
|
196
|
+
// Old error handling
|
|
197
|
+
{
|
|
198
|
+
regex: /process\.on\s*\(\s*['"]uncaughtException['"]/,
|
|
199
|
+
name: "uncaughtException handler",
|
|
200
|
+
severity: "medium",
|
|
201
|
+
modern: "Structured error handling or process.on('unhandledRejection')",
|
|
202
|
+
detail: "Catching uncaughtException and continuing is dangerous — fix the root cause or exit",
|
|
203
|
+
},
|
|
204
|
+
];
|
|
205
|
+
// ─── Analysis ───────────────────────────────────────────────────────────────
|
|
206
|
+
function analyzeFile(filepath) {
|
|
207
|
+
const issues = [];
|
|
208
|
+
let content;
|
|
209
|
+
try {
|
|
210
|
+
content = readFileSync(filepath, "utf-8");
|
|
211
|
+
}
|
|
212
|
+
catch {
|
|
213
|
+
return issues;
|
|
214
|
+
}
|
|
215
|
+
const lines = content.split("\n");
|
|
216
|
+
for (let i = 0; i < lines.length; i++) {
|
|
217
|
+
const line = lines[i];
|
|
218
|
+
// Skip comments
|
|
219
|
+
const trimmed = line.trim();
|
|
220
|
+
if (trimmed.startsWith("//") || trimmed.startsWith("*") || trimmed.startsWith("/*"))
|
|
221
|
+
continue;
|
|
222
|
+
for (const pattern of STALE_PATTERNS) {
|
|
223
|
+
if (pattern.regex.test(line)) {
|
|
224
|
+
issues.push({
|
|
225
|
+
file: filepath,
|
|
226
|
+
line: i + 1,
|
|
227
|
+
pattern: pattern.name,
|
|
228
|
+
severity: pattern.severity,
|
|
229
|
+
detail: pattern.detail,
|
|
230
|
+
modernAlternative: pattern.modern,
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
return issues;
|
|
236
|
+
}
|
|
237
|
+
// ─── CLI ────────────────────────────────────────────────────────────────────
|
|
238
|
+
export function runStalePattern(argv) {
|
|
239
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
240
|
+
console.log(`
|
|
241
|
+
judges stale-pattern — Identify outdated idioms when modern alternatives exist
|
|
242
|
+
|
|
243
|
+
Usage:
|
|
244
|
+
judges stale-pattern [dir]
|
|
245
|
+
judges stale-pattern src/ --format json
|
|
246
|
+
|
|
247
|
+
Options:
|
|
248
|
+
[dir] Directory to scan (default: .)
|
|
249
|
+
--format json JSON output
|
|
250
|
+
--help, -h Show this help
|
|
251
|
+
|
|
252
|
+
Checks: deprecated Node APIs (new Buffer, url.parse, fs.exists), callback patterns,
|
|
253
|
+
var declarations, old testing patterns, React class components, Promise anti-patterns,
|
|
254
|
+
CommonJS modules, deprecated string methods, old error handling.
|
|
255
|
+
`);
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
|
|
259
|
+
const dir = argv.find((a) => !a.startsWith("-") && argv.indexOf(a) > 0) || ".";
|
|
260
|
+
const files = collectFiles(dir);
|
|
261
|
+
const allIssues = [];
|
|
262
|
+
for (const f of files)
|
|
263
|
+
allIssues.push(...analyzeFile(f));
|
|
264
|
+
const highCount = allIssues.filter((i) => i.severity === "high").length;
|
|
265
|
+
const medCount = allIssues.filter((i) => i.severity === "medium").length;
|
|
266
|
+
const score = Math.max(0, 100 - highCount * 10 - medCount * 5 - allIssues.filter((i) => i.severity === "low").length * 2);
|
|
267
|
+
if (format === "json") {
|
|
268
|
+
console.log(JSON.stringify({
|
|
269
|
+
issues: allIssues,
|
|
270
|
+
score,
|
|
271
|
+
summary: { high: highCount, medium: medCount, total: allIssues.length },
|
|
272
|
+
timestamp: new Date().toISOString(),
|
|
273
|
+
}, null, 2));
|
|
274
|
+
}
|
|
275
|
+
else {
|
|
276
|
+
const badge = score >= 80 ? "✅ MODERN" : score >= 50 ? "⚠️ DATED" : "❌ STALE";
|
|
277
|
+
console.log(`\n Stale-Pattern: ${badge} (${score}/100)\n ─────────────────────────────`);
|
|
278
|
+
if (allIssues.length === 0) {
|
|
279
|
+
console.log(" No stale patterns detected.\n");
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
for (const issue of allIssues.slice(0, 25)) {
|
|
283
|
+
const icon = issue.severity === "high" ? "🔴" : issue.severity === "medium" ? "🟡" : "🔵";
|
|
284
|
+
console.log(` ${icon} ${issue.pattern}`);
|
|
285
|
+
console.log(` ${issue.file}:${issue.line}`);
|
|
286
|
+
console.log(` ${issue.detail}`);
|
|
287
|
+
console.log(` ↳ Use: ${issue.modernAlternative}`);
|
|
288
|
+
}
|
|
289
|
+
if (allIssues.length > 25)
|
|
290
|
+
console.log(` ... and ${allIssues.length - 25} more`);
|
|
291
|
+
console.log(`\n Total: ${allIssues.length} | High: ${highCount} | Medium: ${medCount} | Score: ${score}/100\n`);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
//# sourceMappingURL=stale-pattern.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stale-pattern.js","sourceRoot":"","sources":["../../src/commands/stale-pattern.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AACzD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAarC,+EAA+E;AAE/E,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;AAE1D,SAAS,YAAY,CAAC,GAAW,EAAE,GAAG,GAAG,GAAG;IAC1C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,SAAS,IAAI,CAAC,CAAS;QACrB,IAAI,KAAK,CAAC,MAAM,IAAI,GAAG;YAAE,OAAO;QAChC,IAAI,OAAiB,CAAC;QACtB,IAAI,CAAC;YACH,OAAO,GAAG,WAAW,CAAC,CAAC,CAAwB,CAAC;QAClD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,IAAI,KAAK,CAAC,MAAM,IAAI,GAAG;gBAAE,OAAO;YAChC,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,cAAc,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,OAAO;gBAAE,SAAS;YACzF,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACxB,IAAI,CAAC;gBACH,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE;oBAAE,IAAI,CAAC,IAAI,CAAC,CAAC;qBACxC,IAAI,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;oBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1D,CAAC;YAAC,MAAM,CAAC;gBACP,UAAU;YACZ,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,KAAK,CAAC;AACf,CAAC;AAYD,MAAM,cAAc,GAAiB;IACnC,0BAA0B;IAC1B;QACE,KAAK,EAAE,mBAAmB;QAC1B,IAAI,EAAE,cAAc;QACpB,QAAQ,EAAE,MAAM;QAChB,MAAM,EAAE,gCAAgC;QACxC,MAAM,EAAE,0EAA0E;KACnF;IACD;QACE,KAAK,EAAE,iBAAiB;QACxB,IAAI,EAAE,aAAa;QACnB,QAAQ,EAAE,QAAQ;QAClB,MAAM,EAAE,WAAW;QACnB,MAAM,EAAE,oDAAoD;KAC7D;IACD;QACE,KAAK,EAAE,+BAA+B;QACtC,IAAI,EAAE,eAAe;QACrB,QAAQ,EAAE,QAAQ;QAClB,MAAM,EAAE,gDAAgD;QACxD,MAAM,EAAE,2EAA2E;KACpF;IACD;QACE,KAAK,EAAE,iCAAiC;QACxC,IAAI,EAAE,iBAAiB;QACvB,QAAQ,EAAE,KAAK;QACf,MAAM,EAAE,6CAA6C;QACrD,MAAM,EAAE,wCAAwC;KACjD;IACD;QACE,KAAK,EAAE,iBAAiB;QACxB,IAAI,EAAE,aAAa;QACnB,QAAQ,EAAE,QAAQ;QAClB,MAAM,EAAE,0BAA0B;QAClC,MAAM,EAAE,kEAAkE;KAC3E;IACD;QACE,KAAK,EAAE,sBAAsB;QAC7B,IAAI,EAAE,kBAAkB;QACxB,QAAQ,EAAE,KAAK;QACf,MAAM,EAAE,yBAAyB;QACjC,MAAM,EAAE,8DAA8D;KACvE;IAED,mCAAmC;IACnC;QACE,KAAK,EAAE,+FAA+F;QACtG,IAAI,EAAE,sBAAsB;QAC5B,QAAQ,EAAE,QAAQ;QAClB,MAAM,EAAE,2BAA2B;QACnC,MAAM,EAAE,8FAA8F;KACvG;IACD;QACE,KAAK,EAAE,kEAAkE;QACzE,IAAI,EAAE,uBAAuB;QAC7B,QAAQ,EAAE,QAAQ;QAClB,MAAM,EAAE,aAAa;QACrB,MAAM,EAAE,0DAA0D;KACnE;IAED,0BAA0B;IAC1B;QACE,KAAK,EAAE,eAAe;QACtB,IAAI,EAAE,iBAAiB;QACvB,QAAQ,EAAE,KAAK;QACf,MAAM,EAAE,aAAa;QACrB,MAAM,EAAE,sEAAsE;KAC/E;IACD;QACE,KAAK,EAAE,4CAA4C;QACnD,IAAI,EAAE,wBAAwB;QAC9B,QAAQ,EAAE,KAAK;QACf,MAAM,EAAE,mDAAmD;QAC3D,MAAM,EAAE,sEAAsE;KAC/E;IACD;QACE,KAAK,EAAE,mDAAmD;QAC1D,IAAI,EAAE,yBAAyB;QAC/B,QAAQ,EAAE,KAAK;QACf,MAAM,EAAE,+BAA+B;QACvC,MAAM,EAAE,mEAAmE;KAC5E;IACD;QACE,KAAK,EAAE,2BAA2B;QAClC,IAAI,EAAE,sBAAsB;QAC5B,QAAQ,EAAE,KAAK;QACf,MAAM,EAAE,oCAAoC;QAC5C,MAAM,EAAE,yEAAyE;KAClF;IAED,uBAAuB;IACvB;QACE,KAAK,EAAE,mEAAmE;QAC1E,IAAI,EAAE,sBAAsB;QAC5B,QAAQ,EAAE,QAAQ;QAClB,MAAM,EAAE,sBAAsB;QAC9B,MAAM,EAAE,kEAAkE;KAC3E;IACD;QACE,KAAK,EAAE,eAAe;QACtB,IAAI,EAAE,yBAAyB;QAC/B,QAAQ,EAAE,KAAK;QACf,MAAM,EAAE,sBAAsB;QAC9B,MAAM,EAAE,4EAA4E;KACrF;IAED,yBAAyB;IACzB;QACE,KAAK,EAAE,wEAAwE;QAC/E,IAAI,EAAE,uBAAuB;QAC7B,QAAQ,EAAE,QAAQ;QAClB,MAAM,EAAE,gCAAgC;QACxC,MAAM,EAAE,2EAA2E;KACpF;IACD;QACE,KAAK,EAAE,yBAAyB;QAChC,IAAI,EAAE,oBAAoB;QAC1B,QAAQ,EAAE,MAAM;QAChB,MAAM,EAAE,gBAAgB;QACxB,MAAM,EAAE,2DAA2D;KACpE;IACD;QACE,KAAK,EAAE,gCAAgC;QACvC,IAAI,EAAE,2BAA2B;QACjC,QAAQ,EAAE,MAAM;QAChB,MAAM,EAAE,uCAAuC;QAC/C,MAAM,EAAE,kDAAkD;KAC3D;IAED,mCAAmC;IACnC;QACE,KAAK,EAAE,yDAAyD;QAChE,IAAI,EAAE,2BAA2B;QACjC,QAAQ,EAAE,QAAQ;QAClB,MAAM,EAAE,uBAAuB;QAC/B,MAAM,EAAE,6FAA6F;KACtG;IAED,sBAAsB;IACtB;QACE,KAAK,EAAE,qBAAqB;QAC5B,IAAI,EAAE,yBAAyB;QAC/B,QAAQ,EAAE,KAAK;QACf,MAAM,EAAE,kBAAkB;QAC1B,MAAM,EAAE,0DAA0D;KACnE;IACD;QACE,KAAK,EAAE,kBAAkB;QACzB,IAAI,EAAE,oBAAoB;QAC1B,QAAQ,EAAE,KAAK;QACf,MAAM,EAAE,wBAAwB;QAChC,MAAM,EAAE,yEAAyE;KAClF;IAED,4BAA4B;IAC5B;QACE,KAAK,EAAE,eAAe;QACtB,IAAI,EAAE,WAAW;QACjB,QAAQ,EAAE,KAAK;QACf,MAAM,EAAE,0BAA0B;QAClC,MAAM,EAAE,8DAA8D;KACvE;IAED,qBAAqB;IACrB;QACE,KAAK,EAAE,8CAA8C;QACrD,IAAI,EAAE,2BAA2B;QACjC,QAAQ,EAAE,QAAQ;QAClB,MAAM,EAAE,+DAA+D;QACvE,MAAM,EAAE,qFAAqF;KAC9F;CACF,CAAC;AAEF,+EAA+E;AAE/E,SAAS,WAAW,CAAC,QAAgB;IACnC,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAElC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAEtB,gBAAgB;QAChB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,SAAS;QAE9F,KAAK,MAAM,OAAO,IAAI,cAAc,EAAE,CAAC;YACrC,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7B,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,CAAC,GAAG,CAAC;oBACX,OAAO,EAAE,OAAO,CAAC,IAAI;oBACrB,QAAQ,EAAE,OAAO,CAAC,QAAQ;oBAC1B,MAAM,EAAE,OAAO,CAAC,MAAM;oBACtB,iBAAiB,EAAE,OAAO,CAAC,MAAM;iBAClC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,+EAA+E;AAE/E,MAAM,UAAU,eAAe,CAAC,IAAc;IAC5C,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;CAef,CAAC,CAAC;QACC,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,UAAU,CAAC,IAAI,MAAM,CAAC;IAC1F,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC;IAE/E,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,SAAS,GAAiB,EAAE,CAAC;IACnC,KAAK,MAAM,CAAC,IAAI,KAAK;QAAE,SAAS,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAEzD,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;IACxE,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,MAAM,CAAC;IACzE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CACpB,CAAC,EACD,GAAG,GAAG,SAAS,GAAG,EAAE,GAAG,QAAQ,GAAG,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAC/F,CAAC;IAEF,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CACT,IAAI,CAAC,SAAS,CACZ;YACE,MAAM,EAAE,SAAS;YACjB,KAAK;YACL,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE;YACvE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,EACD,IAAI,EACJ,CAAC,CACF,CACF,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,MAAM,KAAK,GAAG,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;QAC/E,OAAO,CAAC,GAAG,CAAC,sBAAsB,KAAK,KAAK,KAAK,wCAAwC,CAAC,CAAC;QAC3F,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;YACjD,OAAO;QACT,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;YAC3C,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YAC1F,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAC5C,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;YACvC,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,CAAC,iBAAiB,EAAE,CAAC,CAAC;QAC3D,CAAC;QACD,IAAI,SAAS,CAAC,MAAM,GAAG,EAAE;YAAE,OAAO,CAAC,GAAG,CAAC,eAAe,SAAS,CAAC,MAAM,GAAG,EAAE,OAAO,CAAC,CAAC;QACpF,OAAO,CAAC,GAAG,CAAC,gBAAgB,SAAS,CAAC,MAAM,YAAY,SAAS,cAAc,QAAQ,aAAa,KAAK,QAAQ,CAAC,CAAC;IACrH,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED