camouf 0.9.0 → 0.10.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/README.md +5 -3
- package/dist/cli/version.d.ts +1 -1
- package/dist/cli/version.d.ts.map +1 -1
- package/dist/cli/version.js +1 -1
- package/dist/cli/version.js.map +1 -1
- package/dist/core/rules/builtin/async-discrepancies.rule.d.ts +63 -0
- package/dist/core/rules/builtin/async-discrepancies.rule.d.ts.map +1 -0
- package/dist/core/rules/builtin/async-discrepancies.rule.js +452 -0
- package/dist/core/rules/builtin/async-discrepancies.rule.js.map +1 -0
- package/dist/core/rules/rule-engine.d.ts.map +1 -1
- package/dist/core/rules/rule-engine.js +2 -0
- package/dist/core/rules/rule-engine.js.map +1 -1
- package/dist/types/config.types.d.ts +2 -0
- package/dist/types/config.types.d.ts.map +1 -1
- package/dist/types/config.types.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -106,7 +106,7 @@ npx camouf fix --id sig-001 # Fix a specific mismatch
|
|
|
106
106
|
|
|
107
107
|
## Features
|
|
108
108
|
|
|
109
|
-
- **
|
|
109
|
+
- **19 Built-in Rules**: AI-specific and architecture validation rules
|
|
110
110
|
- **Function/Field Matching**: Fuzzy matching to detect AI naming drift
|
|
111
111
|
- **Circular Dependency Detection**: Find and break dependency cycles
|
|
112
112
|
- **Real-time Watch Mode**: Continuous architecture monitoring
|
|
@@ -157,7 +157,7 @@ Running `npx camouf` or `npx camouf help` displays the full interactive help:
|
|
|
157
157
|
██║ ███████║██╔████╔██║██║ ██║██║ ██║█████╗
|
|
158
158
|
██║ ██╔══██║██║╚██╔╝██║██║ ██║██║ ██║██╔══╝
|
|
159
159
|
╚██████╗██║ ██║██║ ╚═╝ ██║╚██████╔╝╚██████╔╝██║
|
|
160
|
-
╚═════╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ╚═╝ v0.
|
|
160
|
+
╚═════╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ╚═╝ v0.10.0
|
|
161
161
|
|
|
162
162
|
Architecture guardrails for AI-generated code
|
|
163
163
|
|
|
@@ -234,7 +234,7 @@ Running `npx camouf` or `npx camouf help` displays the full interactive help:
|
|
|
234
234
|
|
|
235
235
|
AI Safety: ai-hallucinated-imports, inconsistent-casing,
|
|
236
236
|
orphaned-functions, phantom-type-references,
|
|
237
|
-
context-drift-patterns
|
|
237
|
+
context-drift-patterns, async-discrepancies
|
|
238
238
|
Architecture: layer-dependencies, circular-dependencies,
|
|
239
239
|
function-signature-matching, contract-mismatch
|
|
240
240
|
Code Quality: type-safety, performance-antipatterns,
|
|
@@ -374,6 +374,7 @@ This creates a **feedback loop** where AI catches its own mistakes before you se
|
|
|
374
374
|
- [AI Agent Challenges](docs/ai-agent-challenges.md)
|
|
375
375
|
- [MCP Agent Tutorial](docs/mcp-agent-tutorial.md)
|
|
376
376
|
- [Configuring Rules](docs/configuring-rules.md)
|
|
377
|
+
- [Async Discrepancies Guide](docs/async-discrepancies.md)
|
|
377
378
|
- [CI/CD Integration](docs/ci-cd-integration.md)
|
|
378
379
|
- [Changelog](CHANGELOG.md)
|
|
379
380
|
|
|
@@ -495,6 +496,7 @@ These rules catch mistakes that AI coding assistants commonly make:
|
|
|
495
496
|
| `phantom-type-references` | Catches references to types that don't exist | `warn` |
|
|
496
497
|
| `inconsistent-casing` | Detects mixing of camelCase/snake_case in the same codebase | `warn` |
|
|
497
498
|
| `orphaned-functions` | Finds functions declared but never called anywhere | `warn` |
|
|
499
|
+
| `async-discrepancies` | Detects async/await misuse: floating promises, unnecessary async, mixed patterns | `warn` |
|
|
498
500
|
|
|
499
501
|
> **See examples:** Check `test-fixtures/ai-errors/` in the repository for concrete examples of what each rule catches.
|
|
500
502
|
|
package/dist/cli/version.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Version and metadata for Camouf CLI
|
|
3
3
|
*/
|
|
4
|
-
export declare const version = "0.
|
|
4
|
+
export declare const version = "0.10.0";
|
|
5
5
|
export declare const name = "camouf";
|
|
6
6
|
export declare const description = "Architecture guardrails for AI-generated code";
|
|
7
7
|
export declare const metadata: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/cli/version.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,OAAO,
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/cli/version.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,OAAO,WAAW,CAAC;AAChC,eAAO,MAAM,IAAI,WAAW,CAAC;AAC7B,eAAO,MAAM,WAAW,kDAAkD,CAAC;AAE3E,eAAO,MAAM,QAAQ;;;;;;;;CAQpB,CAAC"}
|
package/dist/cli/version.js
CHANGED
package/dist/cli/version.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/cli/version.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/cli/version.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,QAAQ,CAAC;AAChC,MAAM,CAAC,MAAM,IAAI,GAAG,QAAQ,CAAC;AAC7B,MAAM,CAAC,MAAM,WAAW,GAAG,+CAA+C,CAAC;AAE3E,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,IAAI;IACJ,OAAO;IACP,WAAW;IACX,QAAQ,EAAE,oCAAoC;IAC9C,UAAU,EAAE,oCAAoC;IAChD,MAAM,EAAE,SAAS;IACjB,OAAO,EAAE,YAAY;CACtB,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Async Discrepancies Rule
|
|
3
|
+
*
|
|
4
|
+
* Detects async/await misuse patterns commonly introduced by AI coding assistants.
|
|
5
|
+
* These discrepancies arise when AI agents lose context about whether a function
|
|
6
|
+
* is synchronous or asynchronous, leading to subtle runtime bugs.
|
|
7
|
+
*
|
|
8
|
+
* Detections:
|
|
9
|
+
* 1. Missing `await` on async function calls
|
|
10
|
+
* 2. `async` functions that never use `await` (unnecessary async)
|
|
11
|
+
* 3. Async/sync signature drift between declaration and usage
|
|
12
|
+
* 4. Floating promises (async calls without await or .then/.catch)
|
|
13
|
+
* 5. `await` on non-async/non-promise expressions
|
|
14
|
+
* 6. Mixed async patterns (mixing callbacks with async/await)
|
|
15
|
+
*/
|
|
16
|
+
import { IRule, RuleContext, RuleConfig, RuleResult, RuleCategory, RuleDocumentation } from '../rule.interface.js';
|
|
17
|
+
interface AsyncDiscrepanciesConfig extends RuleConfig {
|
|
18
|
+
/** Check for missing await on async calls */
|
|
19
|
+
checkMissingAwait?: boolean;
|
|
20
|
+
/** Check for unnecessary async keywords */
|
|
21
|
+
checkUnnecessaryAsync?: boolean;
|
|
22
|
+
/** Check for floating promises (unawaited async calls) */
|
|
23
|
+
checkFloatingPromises?: boolean;
|
|
24
|
+
/** Check for await on non-promise values */
|
|
25
|
+
checkAwaitNonPromise?: boolean;
|
|
26
|
+
/** Check for mixed async patterns (callbacks + async/await) */
|
|
27
|
+
checkMixedPatterns?: boolean;
|
|
28
|
+
/** File extensions to analyze */
|
|
29
|
+
includeExtensions?: string[];
|
|
30
|
+
/** Ignore patterns for function names */
|
|
31
|
+
ignorePatterns?: string[];
|
|
32
|
+
}
|
|
33
|
+
export declare class AsyncDiscrepanciesRule implements IRule {
|
|
34
|
+
readonly id = "async-discrepancies";
|
|
35
|
+
readonly name = "Async Discrepancies Detection";
|
|
36
|
+
readonly description = "Detects async/await misuse patterns commonly introduced by AI coding assistants";
|
|
37
|
+
readonly severity: "warning";
|
|
38
|
+
readonly tags: string[];
|
|
39
|
+
readonly category: RuleCategory;
|
|
40
|
+
readonly supportsIncremental = true;
|
|
41
|
+
readonly defaultSeverity: "warning";
|
|
42
|
+
private config;
|
|
43
|
+
private violationCounter;
|
|
44
|
+
/** Known async functions discovered across the project */
|
|
45
|
+
private knownAsyncFunctions;
|
|
46
|
+
configure(options: Partial<AsyncDiscrepanciesConfig>): void;
|
|
47
|
+
check(context: RuleContext): Promise<RuleResult>;
|
|
48
|
+
checkFile(filePath: string, context: RuleContext): Promise<RuleResult>;
|
|
49
|
+
getDocumentation(): RuleDocumentation;
|
|
50
|
+
private collectAsyncFunctions;
|
|
51
|
+
private buildAsyncFunctionInfo;
|
|
52
|
+
private checkUnnecessaryAsyncFunctions;
|
|
53
|
+
private checkFloatingPromisesAndMissingAwait;
|
|
54
|
+
private checkAwaitOnNonPromise;
|
|
55
|
+
private checkMixedAsyncPatterns;
|
|
56
|
+
private reportMixedPatterns;
|
|
57
|
+
private shouldAnalyzeFile;
|
|
58
|
+
private shouldIgnoreFunction;
|
|
59
|
+
private escapeRegex;
|
|
60
|
+
private createViolation;
|
|
61
|
+
}
|
|
62
|
+
export {};
|
|
63
|
+
//# sourceMappingURL=async-discrepancies.rule.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"async-discrepancies.rule.d.ts","sourceRoot":"","sources":["../../../../src/core/rules/builtin/async-discrepancies.rule.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAGnH,UAAU,wBAAyB,SAAQ,UAAU;IACnD,6CAA6C;IAC7C,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,2CAA2C;IAC3C,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,0DAA0D;IAC1D,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,4CAA4C;IAC5C,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,+DAA+D;IAC/D,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,iCAAiC;IACjC,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,yCAAyC;IACzC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAuBD,qBAAa,sBAAuB,YAAW,KAAK;IAClD,QAAQ,CAAC,EAAE,yBAAyB;IACpC,QAAQ,CAAC,IAAI,mCAAmC;IAChD,QAAQ,CAAC,WAAW,qFAAqF;IACzG,QAAQ,CAAC,QAAQ,EAAG,SAAS,CAAU;IACvC,QAAQ,CAAC,IAAI,WAAqD;IAClE,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAiB;IAChD,QAAQ,CAAC,mBAAmB,QAAQ;IACpC,QAAQ,CAAC,eAAe,EAAG,SAAS,CAAU;IAE9C,OAAO,CAAC,MAAM,CAiBZ;IAEF,OAAO,CAAC,gBAAgB,CAAK;IAE7B,0DAA0D;IAC1D,OAAO,CAAC,mBAAmB,CAAwC;IAEnE,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,wBAAwB,CAAC,GAAG,IAAI;IAIrD,KAAK,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;IA4ChD,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;IAK5E,gBAAgB,IAAI,iBAAiB;IAuErC,OAAO,CAAC,qBAAqB;IAuC7B,OAAO,CAAC,sBAAsB;IA4D9B,OAAO,CAAC,8BAA8B;IAwBtC,OAAO,CAAC,oCAAoC;IA0G5C,OAAO,CAAC,sBAAsB;IA2C9B,OAAO,CAAC,uBAAuB;IAiE/B,OAAO,CAAC,mBAAmB;IAiC3B,OAAO,CAAC,iBAAiB;IAKzB,OAAO,CAAC,oBAAoB;IAK5B,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,eAAe;CAkBxB"}
|
|
@@ -0,0 +1,452 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Async Discrepancies Rule
|
|
3
|
+
*
|
|
4
|
+
* Detects async/await misuse patterns commonly introduced by AI coding assistants.
|
|
5
|
+
* These discrepancies arise when AI agents lose context about whether a function
|
|
6
|
+
* is synchronous or asynchronous, leading to subtle runtime bugs.
|
|
7
|
+
*
|
|
8
|
+
* Detections:
|
|
9
|
+
* 1. Missing `await` on async function calls
|
|
10
|
+
* 2. `async` functions that never use `await` (unnecessary async)
|
|
11
|
+
* 3. Async/sync signature drift between declaration and usage
|
|
12
|
+
* 4. Floating promises (async calls without await or .then/.catch)
|
|
13
|
+
* 5. `await` on non-async/non-promise expressions
|
|
14
|
+
* 6. Mixed async patterns (mixing callbacks with async/await)
|
|
15
|
+
*/
|
|
16
|
+
export class AsyncDiscrepanciesRule {
|
|
17
|
+
id = 'async-discrepancies';
|
|
18
|
+
name = 'Async Discrepancies Detection';
|
|
19
|
+
description = 'Detects async/await misuse patterns commonly introduced by AI coding assistants';
|
|
20
|
+
severity = 'warning';
|
|
21
|
+
tags = ['ai-safety', 'async', 'promises', 'correctness'];
|
|
22
|
+
category = 'ai-specific';
|
|
23
|
+
supportsIncremental = true;
|
|
24
|
+
defaultSeverity = 'warning';
|
|
25
|
+
config = {
|
|
26
|
+
enabled: true,
|
|
27
|
+
severity: 'warning',
|
|
28
|
+
checkMissingAwait: true,
|
|
29
|
+
checkUnnecessaryAsync: true,
|
|
30
|
+
checkFloatingPromises: true,
|
|
31
|
+
checkAwaitNonPromise: true,
|
|
32
|
+
checkMixedPatterns: true,
|
|
33
|
+
includeExtensions: ['.ts', '.tsx', '.js', '.jsx'],
|
|
34
|
+
ignorePatterns: [
|
|
35
|
+
'^_', // Private/internal
|
|
36
|
+
'^main$', // Entry points
|
|
37
|
+
'^bootstrap$', // Bootstrap functions
|
|
38
|
+
'Middleware$', // Middleware (often async by convention)
|
|
39
|
+
'Handler$', // Handlers (often async by convention)
|
|
40
|
+
'Controller$', // Controllers
|
|
41
|
+
],
|
|
42
|
+
};
|
|
43
|
+
violationCounter = 0;
|
|
44
|
+
/** Known async functions discovered across the project */
|
|
45
|
+
knownAsyncFunctions = new Map();
|
|
46
|
+
configure(options) {
|
|
47
|
+
this.config = { ...this.config, ...options };
|
|
48
|
+
}
|
|
49
|
+
async check(context) {
|
|
50
|
+
const violations = [];
|
|
51
|
+
this.violationCounter = 0;
|
|
52
|
+
this.knownAsyncFunctions.clear();
|
|
53
|
+
const fileContents = [];
|
|
54
|
+
// First pass: collect all async function declarations
|
|
55
|
+
for (const nodeId of context.graph.nodes()) {
|
|
56
|
+
const node = context.getNodeData(nodeId);
|
|
57
|
+
if (!node)
|
|
58
|
+
continue;
|
|
59
|
+
const filePath = node.data.relativePath;
|
|
60
|
+
if (!this.shouldAnalyzeFile(filePath))
|
|
61
|
+
continue;
|
|
62
|
+
const content = context.fileContents?.get(filePath);
|
|
63
|
+
if (!content)
|
|
64
|
+
continue;
|
|
65
|
+
fileContents.push({ filePath, content });
|
|
66
|
+
this.collectAsyncFunctions(filePath, content);
|
|
67
|
+
}
|
|
68
|
+
// Second pass: detect discrepancies
|
|
69
|
+
for (const { filePath, content } of fileContents) {
|
|
70
|
+
if (this.config.checkUnnecessaryAsync) {
|
|
71
|
+
this.checkUnnecessaryAsyncFunctions(filePath, content, violations);
|
|
72
|
+
}
|
|
73
|
+
if (this.config.checkFloatingPromises || this.config.checkMissingAwait) {
|
|
74
|
+
this.checkFloatingPromisesAndMissingAwait(filePath, content, violations);
|
|
75
|
+
}
|
|
76
|
+
if (this.config.checkAwaitNonPromise) {
|
|
77
|
+
this.checkAwaitOnNonPromise(filePath, content, violations);
|
|
78
|
+
}
|
|
79
|
+
if (this.config.checkMixedPatterns) {
|
|
80
|
+
this.checkMixedAsyncPatterns(filePath, content, violations);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return { violations };
|
|
84
|
+
}
|
|
85
|
+
async checkFile(filePath, context) {
|
|
86
|
+
// For incremental checks, run the full check (we need cross-file context)
|
|
87
|
+
return this.check(context);
|
|
88
|
+
}
|
|
89
|
+
getDocumentation() {
|
|
90
|
+
return {
|
|
91
|
+
summary: this.description,
|
|
92
|
+
details: `This rule detects async/await discrepancies that AI coding assistants commonly introduce
|
|
93
|
+
when they lose context about function signatures. These bugs are particularly insidious because
|
|
94
|
+
they often don't cause immediate errors but lead to race conditions, unhandled promise rejections,
|
|
95
|
+
and subtle data corruption.`,
|
|
96
|
+
examples: [
|
|
97
|
+
{
|
|
98
|
+
title: 'Unnecessary async function',
|
|
99
|
+
bad: `async function getUser(id: string) {
|
|
100
|
+
return users.find(u => u.id === id); // No await needed
|
|
101
|
+
}`,
|
|
102
|
+
good: `function getUser(id: string) {
|
|
103
|
+
return users.find(u => u.id === id);
|
|
104
|
+
}`,
|
|
105
|
+
explanation: 'Function marked as async but never uses await. This wraps the return value in an unnecessary Promise.',
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
title: 'Missing await on async call',
|
|
109
|
+
bad: `async function processOrder(orderId: string) {
|
|
110
|
+
const order = getOrderById(orderId); // Missing await!
|
|
111
|
+
console.log(order.status); // order is a Promise, not the actual value
|
|
112
|
+
}`,
|
|
113
|
+
good: `async function processOrder(orderId: string) {
|
|
114
|
+
const order = await getOrderById(orderId);
|
|
115
|
+
console.log(order.status);
|
|
116
|
+
}`,
|
|
117
|
+
explanation: 'Calling an async function without await returns a Promise instead of the resolved value.',
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
title: 'Floating promise',
|
|
121
|
+
bad: `function handleRequest(req: Request) {
|
|
122
|
+
saveToDatabase(req.body); // Floating promise - errors silently swallowed
|
|
123
|
+
return { success: true };
|
|
124
|
+
}`,
|
|
125
|
+
good: `async function handleRequest(req: Request) {
|
|
126
|
+
await saveToDatabase(req.body);
|
|
127
|
+
return { success: true };
|
|
128
|
+
}`,
|
|
129
|
+
explanation: 'Async function called without await, .then(), or .catch() — errors will be silently lost.',
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
title: 'Mixed async patterns',
|
|
133
|
+
bad: `async function fetchData() {
|
|
134
|
+
const result = await fetch('/api/data');
|
|
135
|
+
result.json().then(data => {
|
|
136
|
+
processData(data); // Mixing await with .then()
|
|
137
|
+
});
|
|
138
|
+
}`,
|
|
139
|
+
good: `async function fetchData() {
|
|
140
|
+
const result = await fetch('/api/data');
|
|
141
|
+
const data = await result.json();
|
|
142
|
+
processData(data);
|
|
143
|
+
}`,
|
|
144
|
+
explanation: 'Mixing await and .then() in the same function creates confusing control flow.',
|
|
145
|
+
},
|
|
146
|
+
],
|
|
147
|
+
options: [
|
|
148
|
+
{ name: 'checkMissingAwait', type: 'boolean', description: 'Check for missing await on async function calls', default: true },
|
|
149
|
+
{ name: 'checkUnnecessaryAsync', type: 'boolean', description: 'Detect async functions that never use await', default: true },
|
|
150
|
+
{ name: 'checkFloatingPromises', type: 'boolean', description: 'Detect unawaited async calls (floating promises)', default: true },
|
|
151
|
+
{ name: 'checkAwaitNonPromise', type: 'boolean', description: 'Detect await on values that are not Promises', default: true },
|
|
152
|
+
{ name: 'checkMixedPatterns', type: 'boolean', description: 'Detect mixing of callbacks with async/await', default: true },
|
|
153
|
+
],
|
|
154
|
+
relatedRules: ['function-signature-matching', 'performance-antipatterns'],
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
// ─── Detection: Collect async function declarations ─────────────────
|
|
158
|
+
collectAsyncFunctions(filePath, content) {
|
|
159
|
+
const lines = content.split('\n');
|
|
160
|
+
for (let i = 0; i < lines.length; i++) {
|
|
161
|
+
const line = lines[i];
|
|
162
|
+
// Match: async function name(...)
|
|
163
|
+
const asyncFnMatch = line.match(/\basync\s+function\s+(\w+)\s*\(/);
|
|
164
|
+
if (asyncFnMatch) {
|
|
165
|
+
const info = this.buildAsyncFunctionInfo(asyncFnMatch[1], filePath, i, lines);
|
|
166
|
+
if (info)
|
|
167
|
+
this.knownAsyncFunctions.set(info.name, info);
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
// Match: export async function name(...)
|
|
171
|
+
const exportAsyncFnMatch = line.match(/\bexport\s+(?:default\s+)?async\s+function\s+(\w+)\s*\(/);
|
|
172
|
+
if (exportAsyncFnMatch) {
|
|
173
|
+
const info = this.buildAsyncFunctionInfo(exportAsyncFnMatch[1], filePath, i, lines);
|
|
174
|
+
if (info)
|
|
175
|
+
this.knownAsyncFunctions.set(info.name, info);
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
// Match: const name = async (...) => or const name = async function(...)
|
|
179
|
+
const arrowAsyncMatch = line.match(/\b(?:const|let|var)\s+(\w+)\s*=\s*async\s/);
|
|
180
|
+
if (arrowAsyncMatch) {
|
|
181
|
+
const info = this.buildAsyncFunctionInfo(arrowAsyncMatch[1], filePath, i, lines);
|
|
182
|
+
if (info)
|
|
183
|
+
this.knownAsyncFunctions.set(info.name, info);
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
// Match: async methodName(...) inside a class
|
|
187
|
+
const asyncMethodMatch = line.match(/^\s+(?:public\s+|private\s+|protected\s+)?(?:static\s+)?async\s+(\w+)\s*\(/);
|
|
188
|
+
if (asyncMethodMatch && asyncMethodMatch[1] !== 'function') {
|
|
189
|
+
const info = this.buildAsyncFunctionInfo(asyncMethodMatch[1], filePath, i, lines);
|
|
190
|
+
if (info)
|
|
191
|
+
this.knownAsyncFunctions.set(info.name, info);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
buildAsyncFunctionInfo(name, filePath, startLine, lines) {
|
|
196
|
+
// Find the function body boundaries
|
|
197
|
+
let braceCount = 0;
|
|
198
|
+
let bodyStartLine = startLine;
|
|
199
|
+
let bodyEndLine = startLine;
|
|
200
|
+
let foundBody = false;
|
|
201
|
+
let hasAwaitInBody = false;
|
|
202
|
+
let returnsPromise = false;
|
|
203
|
+
for (let i = startLine; i < lines.length; i++) {
|
|
204
|
+
const line = lines[i];
|
|
205
|
+
// Check return type annotation for Promise
|
|
206
|
+
if (i === startLine || i === startLine + 1) {
|
|
207
|
+
if (/:\s*Promise\s*</.test(line)) {
|
|
208
|
+
returnsPromise = true;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
const openBraces = (line.match(/{/g) || []).length;
|
|
212
|
+
const closeBraces = (line.match(/}/g) || []).length;
|
|
213
|
+
if (openBraces > 0 && !foundBody) {
|
|
214
|
+
foundBody = true;
|
|
215
|
+
bodyStartLine = i;
|
|
216
|
+
}
|
|
217
|
+
braceCount += openBraces - closeBraces;
|
|
218
|
+
// Check for await usage in the body
|
|
219
|
+
if (foundBody && /\bawait\s/.test(line)) {
|
|
220
|
+
hasAwaitInBody = true;
|
|
221
|
+
}
|
|
222
|
+
if (foundBody && braceCount <= 0) {
|
|
223
|
+
bodyEndLine = i;
|
|
224
|
+
break;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
if (!foundBody)
|
|
228
|
+
return null;
|
|
229
|
+
return {
|
|
230
|
+
name,
|
|
231
|
+
file: filePath,
|
|
232
|
+
line: startLine + 1,
|
|
233
|
+
hasAwaitInBody,
|
|
234
|
+
returnsPromise,
|
|
235
|
+
bodyStartLine: bodyStartLine + 1,
|
|
236
|
+
bodyEndLine: bodyEndLine + 1,
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
// ─── Detection 1: Unnecessary async functions ──────────────────────
|
|
240
|
+
checkUnnecessaryAsyncFunctions(filePath, _content, violations) {
|
|
241
|
+
for (const [name, info] of this.knownAsyncFunctions) {
|
|
242
|
+
if (info.file !== filePath)
|
|
243
|
+
continue;
|
|
244
|
+
if (this.shouldIgnoreFunction(name))
|
|
245
|
+
continue;
|
|
246
|
+
// async function that never uses await and doesn't explicitly return Promise
|
|
247
|
+
if (!info.hasAwaitInBody && !info.returnsPromise) {
|
|
248
|
+
violations.push(this.createViolation(filePath, `Function '${name}' is declared async but never uses 'await'`, info.line, `Remove the 'async' keyword if the function doesn't need to await any asynchronous operations. ` +
|
|
249
|
+
`Unnecessary async wraps the return value in a Promise, adding overhead and misleading callers.`));
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
// ─── Detection 2: Floating promises & missing await ────────────────
|
|
254
|
+
checkFloatingPromisesAndMissingAwait(filePath, content, violations) {
|
|
255
|
+
const lines = content.split('\n');
|
|
256
|
+
// Build set of known async function names for this project
|
|
257
|
+
const asyncFunctionNames = new Set();
|
|
258
|
+
for (const [name] of this.knownAsyncFunctions) {
|
|
259
|
+
asyncFunctionNames.add(name);
|
|
260
|
+
}
|
|
261
|
+
// Also add common async APIs
|
|
262
|
+
const commonAsyncApis = new Set([
|
|
263
|
+
'fetch', 'axios', 'request',
|
|
264
|
+
'readFile', 'writeFile', 'readdir', 'mkdir', 'unlink', 'stat',
|
|
265
|
+
'findOne', 'findMany', 'findById', 'findAll',
|
|
266
|
+
'create', 'update', 'delete', 'save', 'remove',
|
|
267
|
+
'query', 'execute', 'transaction',
|
|
268
|
+
'connect', 'disconnect', 'close',
|
|
269
|
+
'send', 'sendMail', 'publish', 'subscribe',
|
|
270
|
+
]);
|
|
271
|
+
// Track whether we're inside an async function
|
|
272
|
+
let inAsyncFunction = false;
|
|
273
|
+
let asyncBraceDepth = 0;
|
|
274
|
+
let braceCount = 0;
|
|
275
|
+
for (let i = 0; i < lines.length; i++) {
|
|
276
|
+
const line = lines[i];
|
|
277
|
+
const trimmed = line.trim();
|
|
278
|
+
// Skip comments and empty lines
|
|
279
|
+
if (trimmed.startsWith('//') || trimmed.startsWith('*') || trimmed.startsWith('/*') || trimmed === '') {
|
|
280
|
+
continue;
|
|
281
|
+
}
|
|
282
|
+
// Track async function scope
|
|
283
|
+
if (/\basync\s+(function\s+\w+|(\w+)\s*=\s*async|\w+\s*\()/.test(line) ||
|
|
284
|
+
/\basync\s+\w+\s*\(/.test(line)) {
|
|
285
|
+
inAsyncFunction = true;
|
|
286
|
+
asyncBraceDepth = braceCount;
|
|
287
|
+
}
|
|
288
|
+
const openBraces = (line.match(/{/g) || []).length;
|
|
289
|
+
const closeBraces = (line.match(/}/g) || []).length;
|
|
290
|
+
braceCount += openBraces - closeBraces;
|
|
291
|
+
if (inAsyncFunction && braceCount <= asyncBraceDepth) {
|
|
292
|
+
inAsyncFunction = false;
|
|
293
|
+
}
|
|
294
|
+
// Look for function calls that are known async but not awaited
|
|
295
|
+
for (const asyncName of asyncFunctionNames) {
|
|
296
|
+
// Pattern: bare call statement — functionName(...) not preceded by await, return, or assignment
|
|
297
|
+
const callPattern = new RegExp(`(?<!\\bawait\\s)(?<!\\breturn\\s)(?<!=\\s)(?<!\\bvoid\\s)\\b${this.escapeRegex(asyncName)}\\s*\\(`, 'g');
|
|
298
|
+
if (callPattern.test(trimmed)) {
|
|
299
|
+
// Make sure it's a standalone statement (not part of assignment or return)
|
|
300
|
+
const isAssigned = /(?:const|let|var|=)\s*.*\b/.test(trimmed.split(asyncName)[0] || '');
|
|
301
|
+
const isReturned = trimmed.startsWith('return ');
|
|
302
|
+
const isAwaited = new RegExp(`\\bawait\\s+.*\\b${this.escapeRegex(asyncName)}`).test(trimmed);
|
|
303
|
+
const isChained = new RegExp(`${this.escapeRegex(asyncName)}\\s*\\([^)]*\\)\\s*\\.\\s*(then|catch|finally)\\b`).test(trimmed);
|
|
304
|
+
const isVoid = trimmed.startsWith('void ');
|
|
305
|
+
if (!isAssigned && !isReturned && !isAwaited && !isChained && !isVoid) {
|
|
306
|
+
violations.push(this.createViolation(filePath, `Async function '${asyncName}()' called without 'await', '.then()', or error handling — floating promise`, i + 1, inAsyncFunction
|
|
307
|
+
? `Add 'await' before '${asyncName}()' to properly handle its result and errors.`
|
|
308
|
+
: `Either await this call inside an async function, or chain '.then().catch()' to handle the promise.`));
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
// Check for common async API calls without await in async functions
|
|
313
|
+
if (inAsyncFunction) {
|
|
314
|
+
for (const apiName of commonAsyncApis) {
|
|
315
|
+
// More conservative: only flag when it looks like a standalone statement
|
|
316
|
+
const stmtPattern = new RegExp(`^\\s*(?:\\w+\\.)?${this.escapeRegex(apiName)}\\s*\\(`);
|
|
317
|
+
if (stmtPattern.test(trimmed)) {
|
|
318
|
+
const isAwaited = new RegExp(`\\bawait\\b`).test(trimmed);
|
|
319
|
+
const isAssigned = /(?:const|let|var)\s+\w+\s*=/.test(trimmed);
|
|
320
|
+
const isReturned = trimmed.startsWith('return ');
|
|
321
|
+
const isChained = /\)\s*\.\s*(then|catch|finally)\b/.test(trimmed);
|
|
322
|
+
if (!isAwaited && !isAssigned && !isReturned && !isChained) {
|
|
323
|
+
violations.push(this.createViolation(filePath, `Potential floating promise: '${apiName}()' called without 'await' in async function`, i + 1, `Add 'await' before '${apiName}()' to ensure proper execution order and error propagation.`));
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
// ─── Detection 3: await on non-promise values ──────────────────────
|
|
331
|
+
checkAwaitOnNonPromise(filePath, content, violations) {
|
|
332
|
+
const lines = content.split('\n');
|
|
333
|
+
// Patterns that are clearly not promises
|
|
334
|
+
const nonPromisePatterns = [
|
|
335
|
+
// await on literal values
|
|
336
|
+
/\bawait\s+(['"`])/, // await "string", await `template`
|
|
337
|
+
/\bawait\s+\d+/, // await 42
|
|
338
|
+
/\bawait\s+(true|false|null|undefined)\b/, // await true/false/null/undefined
|
|
339
|
+
/\bawait\s+\[(?!\s*\.\.\.)(?!.*Promise)/, // await [array] (not Promise.all style)
|
|
340
|
+
/\bawait\s+{\s*\w+/, // await {object}
|
|
341
|
+
];
|
|
342
|
+
for (let i = 0; i < lines.length; i++) {
|
|
343
|
+
const line = lines[i];
|
|
344
|
+
const trimmed = line.trim();
|
|
345
|
+
// Skip comments
|
|
346
|
+
if (trimmed.startsWith('//') || trimmed.startsWith('*') || trimmed.startsWith('/*')) {
|
|
347
|
+
continue;
|
|
348
|
+
}
|
|
349
|
+
for (const pattern of nonPromisePatterns) {
|
|
350
|
+
if (pattern.test(trimmed)) {
|
|
351
|
+
violations.push(this.createViolation(filePath, `Suspicious 'await' on a value that is likely not a Promise`, i + 1, `'await' on non-Promise values is unnecessary and may indicate AI-generated code that ` +
|
|
352
|
+
`confused sync and async APIs. Remove 'await' if the expression doesn't return a Promise.`));
|
|
353
|
+
break;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
// ─── Detection 4: Mixed async patterns ─────────────────────────────
|
|
359
|
+
checkMixedAsyncPatterns(filePath, content, violations) {
|
|
360
|
+
const lines = content.split('\n');
|
|
361
|
+
// Track function scopes to detect mixing
|
|
362
|
+
let inAsyncFunction = false;
|
|
363
|
+
let asyncFuncStartLine = 0;
|
|
364
|
+
let asyncBraceDepth = 0;
|
|
365
|
+
let braceCount = 0;
|
|
366
|
+
let hasAwait = false;
|
|
367
|
+
let hasThenCatch = false;
|
|
368
|
+
let hasCallback = false;
|
|
369
|
+
let thenLine = 0;
|
|
370
|
+
let callbackLine = 0;
|
|
371
|
+
for (let i = 0; i < lines.length; i++) {
|
|
372
|
+
const line = lines[i];
|
|
373
|
+
const trimmed = line.trim();
|
|
374
|
+
// Detect async function start
|
|
375
|
+
if (/\basync\s+(?:function\s+\w+|\w+\s*=\s*async|\(\s*\w)|\basync\s+\w+\s*\(/.test(line)) {
|
|
376
|
+
// Report previous function if mixed
|
|
377
|
+
if (inAsyncFunction) {
|
|
378
|
+
this.reportMixedPatterns(filePath, asyncFuncStartLine, hasAwait, hasThenCatch, hasCallback, thenLine, callbackLine, violations);
|
|
379
|
+
}
|
|
380
|
+
inAsyncFunction = true;
|
|
381
|
+
asyncFuncStartLine = i + 1;
|
|
382
|
+
asyncBraceDepth = braceCount;
|
|
383
|
+
hasAwait = false;
|
|
384
|
+
hasThenCatch = false;
|
|
385
|
+
hasCallback = false;
|
|
386
|
+
thenLine = 0;
|
|
387
|
+
callbackLine = 0;
|
|
388
|
+
}
|
|
389
|
+
const openBraces = (line.match(/{/g) || []).length;
|
|
390
|
+
const closeBraces = (line.match(/}/g) || []).length;
|
|
391
|
+
braceCount += openBraces - closeBraces;
|
|
392
|
+
if (inAsyncFunction) {
|
|
393
|
+
if (/\bawait\s/.test(trimmed))
|
|
394
|
+
hasAwait = true;
|
|
395
|
+
if (/\.\s*then\s*\(/.test(trimmed)) {
|
|
396
|
+
hasThenCatch = true;
|
|
397
|
+
thenLine = i + 1;
|
|
398
|
+
}
|
|
399
|
+
// Detect callback patterns: function(err, result) or (err, data) =>
|
|
400
|
+
if (/\(err(?:or)?\s*,\s*\w+\)\s*(?:=>|{)/.test(trimmed) ||
|
|
401
|
+
/function\s*\(\s*err(?:or)?\s*,/.test(trimmed)) {
|
|
402
|
+
hasCallback = true;
|
|
403
|
+
callbackLine = i + 1;
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
if (inAsyncFunction && braceCount <= asyncBraceDepth) {
|
|
407
|
+
this.reportMixedPatterns(filePath, asyncFuncStartLine, hasAwait, hasThenCatch, hasCallback, thenLine, callbackLine, violations);
|
|
408
|
+
inAsyncFunction = false;
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
// Handle last function
|
|
412
|
+
if (inAsyncFunction) {
|
|
413
|
+
this.reportMixedPatterns(filePath, asyncFuncStartLine, hasAwait, hasThenCatch, hasCallback, thenLine, callbackLine, violations);
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
reportMixedPatterns(filePath, funcStartLine, hasAwait, hasThenCatch, hasCallback, thenLine, callbackLine, violations) {
|
|
417
|
+
if (hasAwait && hasThenCatch) {
|
|
418
|
+
violations.push(this.createViolation(filePath, `Mixed async patterns: function uses both 'await' and '.then()' chains`, thenLine || funcStartLine, `Convert '.then()' chains to 'await' for consistent async style. ` +
|
|
419
|
+
`Mixing patterns makes control flow harder to follow and may indicate AI-generated code drift.`));
|
|
420
|
+
}
|
|
421
|
+
if (hasAwait && hasCallback) {
|
|
422
|
+
violations.push(this.createViolation(filePath, `Mixed async patterns: function uses both 'await' and error-first callbacks`, callbackLine || funcStartLine, `Convert callback-style code to async/await using 'util.promisify()' or manual Promise wrapping. ` +
|
|
423
|
+
`Mixing callbacks with async/await often indicates AI context confusion.`));
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
// ─── Helpers ───────────────────────────────────────────────────────
|
|
427
|
+
shouldAnalyzeFile(filePath) {
|
|
428
|
+
const extensions = this.config.includeExtensions || ['.ts', '.tsx', '.js', '.jsx'];
|
|
429
|
+
return extensions.some(ext => filePath.endsWith(ext));
|
|
430
|
+
}
|
|
431
|
+
shouldIgnoreFunction(name) {
|
|
432
|
+
const patterns = this.config.ignorePatterns || [];
|
|
433
|
+
return patterns.some(pattern => new RegExp(pattern).test(name));
|
|
434
|
+
}
|
|
435
|
+
escapeRegex(str) {
|
|
436
|
+
return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
437
|
+
}
|
|
438
|
+
createViolation(file, message, line, suggestion) {
|
|
439
|
+
this.violationCounter++;
|
|
440
|
+
return {
|
|
441
|
+
id: `async-discrepancies-${this.violationCounter}`,
|
|
442
|
+
ruleId: this.id,
|
|
443
|
+
ruleName: this.name,
|
|
444
|
+
severity: this.config.severity || 'warning',
|
|
445
|
+
message,
|
|
446
|
+
file,
|
|
447
|
+
line,
|
|
448
|
+
suggestion,
|
|
449
|
+
};
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
//# sourceMappingURL=async-discrepancies.rule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"async-discrepancies.rule.js","sourceRoot":"","sources":["../../../../src/core/rules/builtin/async-discrepancies.rule.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rule-engine.d.ts","sourceRoot":"","sources":["../../../src/core/rules/rule-engine.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAA8B,MAAM,6BAA6B,CAAC;AACvF,OAAO,EAAE,SAAS,EAAqB,MAAM,2BAA2B,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAEhE,OAAO,EAAE,KAAK,EAA2B,MAAM,qBAAqB,CAAC;AACrE,OAAO,EAAE,YAAY,EAAsB,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"rule-engine.d.ts","sourceRoot":"","sources":["../../../src/core/rules/rule-engine.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAA8B,MAAM,6BAA6B,CAAC;AACvF,OAAO,EAAE,SAAS,EAAqB,MAAM,2BAA2B,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAEhE,OAAO,EAAE,KAAK,EAA2B,MAAM,qBAAqB,CAAC;AACrE,OAAO,EAAE,YAAY,EAAsB,MAAM,6BAA6B,CAAC;AAuB/E,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,YAAY,CAA0B;IAC9C,OAAO,CAAC,YAAY,CAA6B;gBAErC,MAAM,EAAE,YAAY;IAKhC;;OAEG;IACG,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBvD;;OAEG;IACH,eAAe,IAAI,YAAY,GAAG,IAAI;IAItC;;OAEG;IACH,OAAO,CAAC,eAAe;IAwCvB;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,KAAK,GAAG,IAAI;IAI/B;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAKpC;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAMhC;;OAEG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIjC;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI;IAWpC;;OAEG;IACG,QAAQ,CAAC,KAAK,EAAE,eAAe,EAAE,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IA4BhG;;OAEG;IACG,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IA8BtH;;OAEG;IACG,OAAO,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAmBvD;;OAEG;IACH,QAAQ,IAAI,KAAK,EAAE;IAInB;;OAEG;IACH,eAAe,IAAI,KAAK,EAAE;IAM1B;;OAEG;IACH,OAAO,CAAC,aAAa;IAarB;;OAEG;IACH,OAAO,CAAC,aAAa;IAMrB;;OAEG;IACH,OAAO,CAAC,eAAe;CASxB"}
|
|
@@ -24,6 +24,7 @@ import { FunctionSignatureMatchingRule } from './builtin/function-signature-matc
|
|
|
24
24
|
import { HardcodedSecretsRule } from './builtin/hardcoded-secrets.rule.js';
|
|
25
25
|
import { InconsistentCasingRule } from './builtin/inconsistent-casing.rule.js';
|
|
26
26
|
import { OrphanedFunctionsRule } from './builtin/orphaned-functions.rule.js';
|
|
27
|
+
import { AsyncDiscrepanciesRule } from './builtin/async-discrepancies.rule.js';
|
|
27
28
|
export class RuleEngine {
|
|
28
29
|
config;
|
|
29
30
|
rules = new Map();
|
|
@@ -85,6 +86,7 @@ export class RuleEngine {
|
|
|
85
86
|
new HardcodedSecretsRule(),
|
|
86
87
|
new InconsistentCasingRule(),
|
|
87
88
|
new OrphanedFunctionsRule(),
|
|
89
|
+
new AsyncDiscrepanciesRule(),
|
|
88
90
|
];
|
|
89
91
|
for (const rule of builtinRules) {
|
|
90
92
|
this.registerRule(rule);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rule-engine.js","sourceRoot":"","sources":["../../../src/core/rules/rule-engine.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,OAAO,EAAgB,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAE/E,wBAAwB;AACxB,OAAO,EAAE,yBAAyB,EAAE,MAAM,2CAA2C,CAAC;AACtF,OAAO,EAAE,wBAAwB,EAAE,MAAM,0CAA0C,CAAC;AACpF,OAAO,EAAE,yBAAyB,EAAE,MAAM,2CAA2C,CAAC;AACtF,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,EAAE,wBAAwB,EAAE,MAAM,yCAAyC,CAAC;AACnF,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,2BAA2B,EAAE,MAAM,4CAA4C,CAAC;AACzF,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAC9E,OAAO,EAAE,2BAA2B,EAAE,MAAM,4CAA4C,CAAC;AACzF,OAAO,EAAE,0BAA0B,EAAE,MAAM,kCAAkC,CAAC;AAC9E,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAC/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,6BAA6B,EAAE,MAAM,+CAA+C,CAAC;AAC9F,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;
|
|
1
|
+
{"version":3,"file":"rule-engine.js","sourceRoot":"","sources":["../../../src/core/rules/rule-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -100,6 +100,8 @@ export interface BuiltinRulesConfig {
|
|
|
100
100
|
'hardcoded-secrets'?: RuleLevel;
|
|
101
101
|
/** Function signature matching across boundaries */
|
|
102
102
|
'function-signature-matching'?: RuleLevel;
|
|
103
|
+
/** Async/await discrepancies detection */
|
|
104
|
+
'async-discrepancies'?: RuleLevel;
|
|
103
105
|
}
|
|
104
106
|
export type RuleLevel = 'off' | 'warn' | 'error' | RuleLevelConfig;
|
|
105
107
|
export interface RuleLevelConfig {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.types.d.ts","sourceRoot":"","sources":["../../src/types/config.types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"config.types.d.ts","sourceRoot":"","sources":["../../src/types/config.types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,WAAW,YAAY;IAC3B,mBAAmB;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC;IAEb,2BAA2B;IAC3B,SAAS,EAAE,iBAAiB,EAAE,CAAC;IAE/B,qCAAqC;IACrC,MAAM,EAAE,WAAW,EAAE,CAAC;IAEtB,yBAAyB;IACzB,WAAW,EAAE,eAAe,CAAC;IAE7B,0BAA0B;IAC1B,KAAK,EAAE,WAAW,CAAC;IAEnB,sBAAsB;IACtB,OAAO,CAAC,EAAE,CAAC,MAAM,GAAG,YAAY,CAAC,EAAE,CAAC;IAEpC,4BAA4B;IAC5B,OAAO,CAAC,EAAE,aAAa,CAAC;IAExB,uCAAuC;IACvC,QAAQ,EAAE,cAAc,CAAC;IAEzB,mCAAmC;IACnC,MAAM,CAAC,EAAE,YAAY,CAAC;IAEtB,uBAAuB;IACvB,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;AAED,MAAM,MAAM,iBAAiB,GACzB,YAAY,GACZ,YAAY,GACZ,QAAQ,GACR,MAAM,GACN,IAAI,GACJ,MAAM,GACN,QAAQ,GACR,QAAQ,CAAC;AAEb,MAAM,WAAW,WAAW;IAC1B,iBAAiB;IACjB,IAAI,EAAE,MAAM,CAAC;IAEb,sCAAsC;IACtC,IAAI,EAAE,cAAc,GAAG,aAAa,GAAG,QAAQ,GAAG,gBAAgB,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAEzF,0CAA0C;IAC1C,WAAW,EAAE,MAAM,EAAE,CAAC;IAEtB,+CAA+C;IAC/C,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAE9B,iDAAiD;IACjD,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,eAAe;IAC9B,kCAAkC;IAClC,MAAM,EAAE,MAAM,EAAE,CAAC;IAEjB,iCAAiC;IACjC,MAAM,EAAE,MAAM,EAAE,CAAC;IAEjB,gCAAgC;IAChC,MAAM,EAAE,MAAM,EAAE,CAAC;IAEjB,uBAAuB;IACvB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IAEjB,gCAAgC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,WAAW;IAC1B,mCAAmC;IACnC,OAAO,EAAE,kBAAkB,CAAC;IAE5B,oDAAoD;IACpD,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAEnC,mBAAmB;IACnB,MAAM,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAE5B,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,YAAY,CAAC;CACzB;AAED,MAAM,WAAW,kBAAkB;IACjC,wCAAwC;IACxC,yBAAyB,CAAC,EAAE,SAAS,CAAC;IAEtC,uCAAuC;IACvC,wBAAwB,CAAC,EAAE,SAAS,CAAC;IAErC,wCAAwC;IACxC,yBAAyB,CAAC,EAAE,SAAS,CAAC;IAEtC,oCAAoC;IACpC,qBAAqB,CAAC,EAAE,SAAS,CAAC;IAElC,mCAAmC;IACnC,oBAAoB,CAAC,EAAE,SAAS,CAAC;IAEjC,kCAAkC;IAClC,mBAAmB,CAAC,EAAE,SAAS,CAAC;IAEhC,kCAAkC;IAClC,oBAAoB,CAAC,EAAE,SAAS,CAAC;IAEjC,oCAAoC;IACpC,uBAAuB,CAAC,EAAE,SAAS,CAAC;IAEpC,0BAA0B;IAC1B,qBAAqB,CAAC,EAAE,SAAS,CAAC;IAElC,yCAAyC;IACzC,0BAA0B,CAAC,EAAE,SAAS,CAAC;IAEvC,+BAA+B;IAC/B,gBAAgB,CAAC,EAAE,SAAS,CAAC;IAE7B,mCAAmC;IACnC,kBAAkB,CAAC,EAAE,SAAS,CAAC;IAE/B,gCAAgC;IAChC,0BAA0B,CAAC,EAAE,SAAS,CAAC;IAEvC,oCAAoC;IACpC,qBAAqB,CAAC,EAAE,SAAS,CAAC;IAElC,qBAAqB;IACrB,gBAAgB,CAAC,EAAE,SAAS,CAAC;IAE7B,iCAAiC;IACjC,aAAa,CAAC,EAAE,SAAS,CAAC;IAE1B,kCAAkC;IAClC,mBAAmB,CAAC,EAAE,SAAS,CAAC;IAEhC,oDAAoD;IACpD,6BAA6B,CAAC,EAAE,SAAS,CAAC;IAE1C,0CAA0C;IAC1C,qBAAqB,CAAC,EAAE,SAAS,CAAC;CACnC;AAED,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,eAAe,CAAC;AAEnE,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,gBAAgB;IAC/B,sBAAsB;IACtB,EAAE,EAAE,MAAM,CAAC;IAEX,gBAAgB;IAChB,IAAI,EAAE,MAAM,CAAC;IAEb,uBAAuB;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,qBAAqB;IACrB,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IAExB,4CAA4C;IAC5C,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,kCAAkC;IAClC,WAAW,CAAC,EAAE,eAAe,CAAC;CAC/B;AAED,MAAM,WAAW,eAAe;IAC9B,mBAAmB;IACnB,IAAI,EAAE,QAAQ,GAAG,YAAY,GAAG,QAAQ,GAAG,WAAW,CAAC;IAEvD,uBAAuB;IACvB,OAAO,EAAE,MAAM,CAAC;IAEhB,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAC;IAEf,4BAA4B;IAC5B,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC;IAEzB,mCAAmC;IACnC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,yDAAyD;IACzD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,6CAA6C;IAC7C,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,aAAa;IAC5B,2CAA2C;IAC3C,UAAU,CAAC,EAAE;QACX,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,MAAM,CAAC,EAAE,OAAO,CAAC;KAClB,CAAC;IAEF,4BAA4B;IAC5B,MAAM,CAAC,EAAE;QACP,OAAO,CAAC,EAAE,GAAG,GAAG,GAAG,CAAC;KACrB,CAAC;IAEF,0BAA0B;IAC1B,IAAI,CAAC,EAAE;QACL,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC;CACH;AAED,MAAM,WAAW,cAAc;IAC7B,+BAA+B;IAC/B,OAAO,EAAE,MAAM,EAAE,CAAC;IAElB,+BAA+B;IAC/B,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,oBAAoB;IACpB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC;IAEtD,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,yBAAyB;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,qBAAqB;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB,sBAAsB;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,2BAA2B;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,wBAAwB;IACxB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,OAAO,CAAC,YAAY,CAwB/C,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.types.js","sourceRoot":"","sources":["../../src/types/config.types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"config.types.js","sourceRoot":"","sources":["../../src/types/config.types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAmQH;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAA0B;IAClD,SAAS,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC;IACvC,QAAQ,EAAE;QACR,OAAO,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,CAAC;QACvD,OAAO,EAAE;YACP,oBAAoB;YACpB,YAAY;YACZ,aAAa;YACb,YAAY;YACZ,gBAAgB;SACjB;KACF;IACD,KAAK,EAAE;QACL,OAAO,EAAE;YACP,oBAAoB,EAAE,OAAO;YAC7B,uBAAuB,EAAE,MAAM;YAC/B,0BAA0B,EAAE,MAAM;YAClC,aAAa,EAAE,MAAM;SACtB;KACF;IACD,QAAQ,EAAE;QACR,KAAK,EAAE,IAAI;QACX,UAAU,EAAE,CAAC;KACd;CACF,CAAC"}
|