sourceverity 1.0.0 → 1.0.2
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/dist/analysis/controlFlow.d.ts.map +1 -1
- package/dist/analysis/controlFlow.js +1867 -9
- package/dist/analysis/controlFlow.js.map +1 -1
- package/dist/analysis/frameworks.d.ts.map +1 -1
- package/dist/analysis/frameworks.js +52 -0
- package/dist/analysis/frameworks.js.map +1 -1
- package/dist/analysis/functions.d.ts.map +1 -1
- package/dist/analysis/functions.js +44 -12
- package/dist/analysis/functions.js.map +1 -1
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +2 -1
- package/dist/cli/main.js.map +1 -1
- package/dist/core/version.d.ts +9 -0
- package/dist/core/version.d.ts.map +1 -0
- package/dist/core/version.js +51 -0
- package/dist/core/version.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/reporters/agent.d.ts +1 -1
- package/dist/reporters/agent.d.ts.map +1 -1
- package/dist/reporters/agent.js +2 -1
- package/dist/reporters/agent.js.map +1 -1
- package/dist/reporters/sarif.d.ts.map +1 -1
- package/dist/reporters/sarif.js +2 -1
- package/dist/reporters/sarif.js.map +1 -1
- package/dist/reporters/terminal.d.ts.map +1 -1
- package/dist/reporters/terminal.js +2 -1
- package/dist/reporters/terminal.js.map +1 -1
- package/dist/rules/browser/timerCleanup.d.ts.map +1 -1
- package/dist/rules/browser/timerCleanup.js +198 -20
- package/dist/rules/browser/timerCleanup.js.map +1 -1
- package/dist/rules/typescript/unsafeUnvalidatedAssertion.d.ts.map +1 -1
- package/dist/rules/typescript/unsafeUnvalidatedAssertion.js +49 -17
- package/dist/rules/typescript/unsafeUnvalidatedAssertion.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authoritative runtime version of SourceVerity.
|
|
3
|
+
*/
|
|
4
|
+
export declare const SOURCEVERITY_VERSION: string;
|
|
5
|
+
/**
|
|
6
|
+
* Returns the authoritative runtime version of SourceVerity.
|
|
7
|
+
*/
|
|
8
|
+
export declare function getSourceVerityVersion(): string;
|
|
9
|
+
//# sourceMappingURL=version.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/core/version.ts"],"names":[],"mappings":"AA8CA;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,MAAgC,CAAC;AAEpE;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
/**
|
|
5
|
+
* Resolves the authoritative SourceVerity package version by locating and reading
|
|
6
|
+
* SourceVerity's package.json relative to this module's location.
|
|
7
|
+
*
|
|
8
|
+
* This guarantees reliable, deterministic version resolution across development,
|
|
9
|
+
* compiled distribution, npm tarball, npx, npm link, and programmatic ESM imports
|
|
10
|
+
* without depending on process.cwd() or searching upward from analyzed repositories.
|
|
11
|
+
*/
|
|
12
|
+
function resolvePackageVersion() {
|
|
13
|
+
let currentDir = path.dirname(fileURLToPath(import.meta.url));
|
|
14
|
+
while (true) {
|
|
15
|
+
const candidatePath = path.join(currentDir, "package.json");
|
|
16
|
+
try {
|
|
17
|
+
if (fs.existsSync(candidatePath)) {
|
|
18
|
+
const raw = fs.readFileSync(candidatePath, "utf-8");
|
|
19
|
+
const parsed = JSON.parse(raw);
|
|
20
|
+
if (typeof parsed === "object" &&
|
|
21
|
+
parsed !== null &&
|
|
22
|
+
"name" in parsed &&
|
|
23
|
+
"version" in parsed &&
|
|
24
|
+
parsed.name === "sourceverity" &&
|
|
25
|
+
typeof parsed.version === "string") {
|
|
26
|
+
return parsed.version;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
// Continue searching parent directories if candidate is unreadable or malformed
|
|
32
|
+
}
|
|
33
|
+
const parentDir = path.dirname(currentDir);
|
|
34
|
+
if (parentDir === currentDir) {
|
|
35
|
+
break;
|
|
36
|
+
}
|
|
37
|
+
currentDir = parentDir;
|
|
38
|
+
}
|
|
39
|
+
throw new Error("Unable to locate authoritative SourceVerity package.json");
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Authoritative runtime version of SourceVerity.
|
|
43
|
+
*/
|
|
44
|
+
export const SOURCEVERITY_VERSION = resolvePackageVersion();
|
|
45
|
+
/**
|
|
46
|
+
* Returns the authoritative runtime version of SourceVerity.
|
|
47
|
+
*/
|
|
48
|
+
export function getSourceVerityVersion() {
|
|
49
|
+
return SOURCEVERITY_VERSION;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/core/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC;;;;;;;GAOG;AACH,SAAS,qBAAqB;IAC5B,IAAI,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAE9D,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;QAC5D,IAAI,CAAC;YACH,IAAI,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;gBACjC,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;gBACpD,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACxC,IACE,OAAO,MAAM,KAAK,QAAQ;oBAC1B,MAAM,KAAK,IAAI;oBACf,MAAM,IAAI,MAAM;oBAChB,SAAS,IAAI,MAAM;oBACnB,MAAM,CAAC,IAAI,KAAK,cAAc;oBAC9B,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,EAClC,CAAC;oBACD,OAAO,MAAM,CAAC,OAAO,CAAC;gBACxB,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,gFAAgF;QAClF,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC3C,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;YAC7B,MAAM;QACR,CAAC;QACD,UAAU,GAAG,SAAS,CAAC;IACzB,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;AAC9E,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAW,qBAAqB,EAAE,CAAC;AAEpE;;GAEG;AACH,MAAM,UAAU,sBAAsB;IACpC,OAAO,oBAAoB,CAAC;AAC9B,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -17,4 +17,5 @@ export type { StrictnessReport, StrictnessFlagStatus };
|
|
|
17
17
|
export type * from "./core/types.js";
|
|
18
18
|
export type * from "./baseline/types.js";
|
|
19
19
|
export { createBaseline, compareWithBaseline, loadBaseline, saveBaseline } from "./baseline/manager.js";
|
|
20
|
+
export { SOURCEVERITY_VERSION, getSourceVerityVersion } from "./core/version.js";
|
|
20
21
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAyB,KAAK,gBAAgB,EAAE,KAAK,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACpH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;IAC/D,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IACvD,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;CACvD;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,SAAS,kDASrE;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,SAAS,SAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAU7F;AACD,YAAY,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,CAAC;AACvD,mBAAmB,iBAAiB,CAAC;AACrC,mBAAmB,qBAAqB,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAyB,KAAK,gBAAgB,EAAE,KAAK,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACpH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;IAC/D,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IACvD,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;CACvD;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,SAAS,kDASrE;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,SAAS,SAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAU7F;AACD,YAAY,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,CAAC;AACvD,mBAAmB,iBAAiB,CAAC;AACrC,mBAAmB,qBAAqB,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACxG,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -29,4 +29,5 @@ export async function evaluateStrictness(targetDir = process.cwd()) {
|
|
|
29
29
|
return evaluateStrictnessGap(repo, tsInst);
|
|
30
30
|
}
|
|
31
31
|
export { createBaseline, compareWithBaseline, loadBaseline, saveBaseline } from "./baseline/manager.js";
|
|
32
|
+
export { SOURCEVERITY_VERSION, getSourceVerityVersion } from "./core/version.js";
|
|
32
33
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAwB,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAoD,MAAM,2BAA2B,CAAC;AAQpH;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAiC;IACpE,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACtD,MAAM,SAAS,GAAoB;QACjC,SAAS;QACT,aAAa,EAAE,OAAO,EAAE,aAAa,IAAI,QAAQ;QACjD,aAAa,EAAE,OAAO,EAAE,aAAa;QACrC,YAAY,EAAE,OAAO,EAAE,YAAY;KACpC,CAAC;IACF,OAAO,QAAQ,CAAC,SAAS,CAAC,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE;IAChE,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAG,MAAM,kBAAkB,CAAC,cAAc,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,wBAAwB,CAAC,cAAc,CAAC,CAAC;IAExD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,mDAAmD,cAAc,GAAG,CAAC,CAAC;IACxF,CAAC;IAED,OAAO,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC7C,CAAC;AAID,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAwB,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAoD,MAAM,2BAA2B,CAAC;AAQpH;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAiC;IACpE,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACtD,MAAM,SAAS,GAAoB;QACjC,SAAS;QACT,aAAa,EAAE,OAAO,EAAE,aAAa,IAAI,QAAQ;QACjD,aAAa,EAAE,OAAO,EAAE,aAAa;QACrC,YAAY,EAAE,OAAO,EAAE,YAAY;KACpC,CAAC;IACF,OAAO,QAAQ,CAAC,SAAS,CAAC,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE;IAChE,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAG,MAAM,kBAAkB,CAAC,cAAc,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,wBAAwB,CAAC,cAAc,CAAC,CAAC;IAExD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,mDAAmD,cAAc,GAAG,CAAC,CAAC;IACxF,CAAC;IAED,OAAO,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC7C,CAAC;AAID,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACxG,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/reporters/agent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAW,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/reporters/agent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAW,MAAM,kBAAkB,CAAC;AAG7D,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE;QACd,QAAQ,CAAC,KAAK,EAAE;YAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;QACnE,QAAQ,CAAC,GAAG,EAAE;YAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;KAClE,CAAC;IACF,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;CACpC;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE;QACb,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;QAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;KAC1B,CAAC;IACF,QAAQ,CAAC,UAAU,EAAE;QACnB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QACzC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;KACrC,CAAC;IACF,QAAQ,CAAC,OAAO,EAAE;QAChB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,QAAQ,CAAC,QAAQ,EAAE,SAAS,YAAY,EAAE,CAAC;CAC5C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAqC7D"}
|
package/dist/reporters/agent.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { SOURCEVERITY_VERSION } from "../core/version.js";
|
|
1
2
|
/**
|
|
2
3
|
* Formats AuditResult into structured Agent JSON format for LLMs/Codex.
|
|
3
4
|
*/
|
|
@@ -22,7 +23,7 @@ export function renderAgentReport(result) {
|
|
|
22
23
|
schemaVersion: 1,
|
|
23
24
|
tool: {
|
|
24
25
|
name: "sourceverity",
|
|
25
|
-
version:
|
|
26
|
+
version: SOURCEVERITY_VERSION,
|
|
26
27
|
},
|
|
27
28
|
repository: {
|
|
28
29
|
typescript: result.repository.typescriptVersion,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/reporters/agent.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/reporters/agent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAqC1D;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAmB;IACnD,MAAM,aAAa,GAAmB,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAU,EAAE,EAAE,CAAC,CAAC;QACzE,WAAW,EAAE,CAAC,CAAC,WAAW;QAC1B,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,UAAU,EAAE,CAAC,CAAC,UAAU;QACxB,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,KAAK,EAAE;YACL,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE;YACjE,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE;SAC5D;QACD,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QAC1C,eAAe,EAAE,CAAC,CAAC,eAAe,IAAI,IAAI;QAC1C,gBAAgB,EAAE,CAAC,CAAC,gBAAgB;KACrC,CAAC,CAAC,CAAC;IAEJ,MAAM,MAAM,GAAgB;QAC1B,aAAa,EAAE,CAAC;QAChB,IAAI,EAAE;YACJ,IAAI,EAAE,cAAc;YACpB,OAAO,EAAE,oBAAoB;SAC9B;QACD,UAAU,EAAE;YACV,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,iBAAiB;YAC/C,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,YAAY;SACtC;QACD,OAAO,EAAE;YACP,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM;YAC7B,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ;YACjC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI;SAC1B;QACD,QAAQ,EAAE,aAAa;KACxB,CAAC;IAEF,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACzC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sarif.d.ts","sourceRoot":"","sources":["../../src/reporters/sarif.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"sarif.d.ts","sourceRoot":"","sources":["../../src/reporters/sarif.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAGpD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CA4D7D"}
|
package/dist/reporters/sarif.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { SOURCEVERITY_VERSION } from "../core/version.js";
|
|
1
2
|
/**
|
|
2
3
|
* Formats AuditResult as standard SARIF 2.1.0 log format for GitHub Code Scanning.
|
|
3
4
|
*/
|
|
@@ -44,7 +45,7 @@ export function renderSarifReport(result) {
|
|
|
44
45
|
tool: {
|
|
45
46
|
driver: {
|
|
46
47
|
name: "sourceverity",
|
|
47
|
-
version:
|
|
48
|
+
version: SOURCEVERITY_VERSION,
|
|
48
49
|
rules: Array.from(ruleMap.values()).map((r) => ({
|
|
49
50
|
id: r.id,
|
|
50
51
|
name: r.name,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sarif.js","sourceRoot":"","sources":["../../src/reporters/sarif.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sarif.js","sourceRoot":"","sources":["../../src/reporters/sarif.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE1D;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAmB;IACnD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAwC,CAAC;IAEhE,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QAChC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC7C,MAAM,KAAK,GAAG,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;QAE/F,OAAO;YACL,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,KAAK;YACL,OAAO,EAAE;gBACP,IAAI,EAAE,CAAC,CAAC,OAAO;aAChB;YACD,SAAS,EAAE;gBACT;oBACE,gBAAgB,EAAE;wBAChB,gBAAgB,EAAE;4BAChB,GAAG,EAAE,CAAC,CAAC,IAAI;yBACZ;wBACD,MAAM,EAAE;4BACN,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI;4BAC7B,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM;4BACjC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI;4BACzB,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM;yBAC9B;qBACF;iBACF;aACF;YACD,mBAAmB,EAAE;gBACnB,uBAAuB,EAAE,CAAC,CAAC,WAAW;aACvC;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG;QACf,OAAO,EAAE,gGAAgG;QACzG,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE;YACJ;gBACE,IAAI,EAAE;oBACJ,MAAM,EAAE;wBACN,IAAI,EAAE,cAAc;wBACpB,OAAO,EAAE,oBAAoB;wBAC7B,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;4BAC9C,EAAE,EAAE,CAAC,CAAC,EAAE;4BACR,IAAI,EAAE,CAAC,CAAC,IAAI;yBACb,CAAC,CAAC;qBACJ;iBACF;gBACD,OAAO,EAAE,YAAY;aACtB;SACF;KACF,CAAC;IAEF,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAC3C,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../../src/reporters/terminal.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAyB,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../../src/reporters/terminal.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAyB,MAAM,kBAAkB,CAAC;AAG3E,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACxC;AAcD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,uBAAuB,GAAG,SAAS,GAAG,MAAM,CAyE/G"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { createStyler } from "../core/terminal.js";
|
|
2
|
+
import { SOURCEVERITY_VERSION } from "../core/version.js";
|
|
2
3
|
const CATEGORY_NAMES = {
|
|
3
4
|
typescript: "Type safety",
|
|
4
5
|
react: "React",
|
|
@@ -17,7 +18,7 @@ export function renderTerminalReport(result, options) {
|
|
|
17
18
|
const styler = createStyler(options?.color !== undefined ? { color: options.color } : undefined);
|
|
18
19
|
const lines = [];
|
|
19
20
|
// 1. Header & Repository Overview
|
|
20
|
-
lines.push(styler.bold(
|
|
21
|
+
lines.push(styler.bold(`SourceVerity ${SOURCEVERITY_VERSION}`));
|
|
21
22
|
lines.push("");
|
|
22
23
|
lines.push(styler.bold("Repository"));
|
|
23
24
|
if (result.repository.typescriptVersion) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminal.js","sourceRoot":"","sources":["../../src/reporters/terminal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAuB,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"terminal.js","sourceRoot":"","sources":["../../src/reporters/terminal.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timerCleanup.d.ts","sourceRoot":"","sources":["../../../src/rules/browser/timerCleanup.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAe,MAAM,qBAAqB,CAAC;AAE7D,eAAO,MAAM,gBAAgB,EAAE,
|
|
1
|
+
{"version":3,"file":"timerCleanup.d.ts","sourceRoot":"","sources":["../../../src/rules/browser/timerCleanup.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAe,MAAM,qBAAqB,CAAC;AAE7D,eAAO,MAAM,gBAAgB,EAAE,IAyU9B,CAAC"}
|
|
@@ -29,25 +29,68 @@ export const timerCleanupRule = {
|
|
|
29
29
|
return;
|
|
30
30
|
}
|
|
31
31
|
const timers = [];
|
|
32
|
-
const
|
|
32
|
+
const collections = new Map();
|
|
33
|
+
const scalarCleanups = new Set();
|
|
34
|
+
const cleanedCollections = new Map();
|
|
33
35
|
let hasCleanupReturn = false;
|
|
34
36
|
function inspectEffectBody(n) {
|
|
35
|
-
// Look for:
|
|
37
|
+
// Look for: timers.push(setTimeout(...)) or timers.push(someValue)
|
|
38
|
+
if (ts && ts.isCallExpression(n) && ts.isPropertyAccessExpression(n.expression)) {
|
|
39
|
+
const propAccess = n.expression;
|
|
40
|
+
if (propAccess.name.text === "push" && ts.isIdentifier(propAccess.expression)) {
|
|
41
|
+
const collName = propAccess.expression.text;
|
|
42
|
+
let collInfo = collections.get(collName);
|
|
43
|
+
if (!collInfo) {
|
|
44
|
+
collInfo = { count: 0, hasNonTimerPush: false };
|
|
45
|
+
collections.set(collName, collInfo);
|
|
46
|
+
}
|
|
47
|
+
for (const arg of n.arguments) {
|
|
48
|
+
if (ts.isCallExpression(arg) && ts.isIdentifier(arg.expression)) {
|
|
49
|
+
const fnName = arg.expression.text;
|
|
50
|
+
if (fnName === "setInterval" || fnName === "setTimeout") {
|
|
51
|
+
timers.push({
|
|
52
|
+
node: arg,
|
|
53
|
+
timerKind: fnName,
|
|
54
|
+
collectionName: collName,
|
|
55
|
+
});
|
|
56
|
+
collInfo.count++;
|
|
57
|
+
if (!collInfo.timerKind) {
|
|
58
|
+
collInfo.timerKind = fnName;
|
|
59
|
+
}
|
|
60
|
+
else if (collInfo.timerKind !== fnName) {
|
|
61
|
+
collInfo.timerKind = "mixed";
|
|
62
|
+
}
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// Non-timer pushed to this collection
|
|
67
|
+
collInfo.hasNonTimerPush = true;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// Look for: const id = setInterval(...) or scalar setInterval(...)
|
|
36
72
|
if (ts && ts.isCallExpression(n) && ts.isIdentifier(n.expression)) {
|
|
37
73
|
const fnName = n.expression.text;
|
|
38
74
|
if (fnName === "setInterval" || fnName === "setTimeout") {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
75
|
+
// Check if this was already captured as a collection push argument
|
|
76
|
+
const isPushed = n.parent &&
|
|
77
|
+
ts.isCallExpression(n.parent) &&
|
|
78
|
+
ts.isPropertyAccessExpression(n.parent.expression) &&
|
|
79
|
+
n.parent.expression.name.text === "push";
|
|
80
|
+
if (!isPushed) {
|
|
81
|
+
let varName;
|
|
82
|
+
if (n.parent && ts.isVariableDeclaration(n.parent) && ts.isIdentifier(n.parent.name)) {
|
|
83
|
+
varName = n.parent.name.text;
|
|
84
|
+
}
|
|
85
|
+
timers.push({
|
|
86
|
+
node: n,
|
|
87
|
+
timerKind: fnName,
|
|
88
|
+
varName,
|
|
89
|
+
});
|
|
42
90
|
}
|
|
43
|
-
timers.push({
|
|
44
|
-
node: n,
|
|
45
|
-
timerKind: fnName,
|
|
46
|
-
varName,
|
|
47
|
-
});
|
|
48
91
|
}
|
|
49
92
|
}
|
|
50
|
-
// Check for return statement
|
|
93
|
+
// Check for return statement in effect callback
|
|
51
94
|
if (ts && ts.isReturnStatement(n) && n.expression) {
|
|
52
95
|
const retExpr = n.expression;
|
|
53
96
|
if (ts.isArrowFunction(retExpr) || ts.isFunctionExpression(retExpr)) {
|
|
@@ -55,20 +98,138 @@ export const timerCleanupRule = {
|
|
|
55
98
|
inspectCleanupBody(retExpr);
|
|
56
99
|
}
|
|
57
100
|
}
|
|
58
|
-
|
|
101
|
+
// Continue traversal (descend into inner callbacks/loops such as forEach to find pushed timers)
|
|
102
|
+
if (ts && n !== effectCallback && ts.isReturnStatement(n)) {
|
|
59
103
|
return;
|
|
60
104
|
}
|
|
61
105
|
n.forEachChild(inspectEffectBody);
|
|
62
106
|
}
|
|
63
107
|
function inspectCleanupBody(cleanupFn) {
|
|
64
108
|
function walkCleanup(cn) {
|
|
65
|
-
if (ts
|
|
109
|
+
if (!ts)
|
|
110
|
+
return;
|
|
111
|
+
// 1. Direct scalar call: clearTimeout(id) or clearInterval(id)
|
|
112
|
+
if (ts.isCallExpression(cn) && ts.isIdentifier(cn.expression)) {
|
|
66
113
|
const fnName = cn.expression.text;
|
|
67
114
|
if (fnName === "clearInterval" || fnName === "clearTimeout") {
|
|
68
|
-
|
|
115
|
+
scalarCleanups.add(fnName);
|
|
69
116
|
const arg = cn.arguments[0];
|
|
70
117
|
if (arg && ts.isIdentifier(arg)) {
|
|
71
|
-
|
|
118
|
+
scalarCleanups.add(arg.text);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// 2. Collection forEach: timers.forEach(clearTimeout) or timers.forEach((id) => clearTimeout(id))
|
|
123
|
+
if (ts.isCallExpression(cn) &&
|
|
124
|
+
ts.isPropertyAccessExpression(cn.expression) &&
|
|
125
|
+
cn.expression.name.text === "forEach" &&
|
|
126
|
+
ts.isIdentifier(cn.expression.expression)) {
|
|
127
|
+
const collName = cn.expression.expression.text;
|
|
128
|
+
const firstArg = cn.arguments[0];
|
|
129
|
+
// Pattern 2a: Point-free: timers.forEach(clearTimeout) / timers.forEach(clearInterval)
|
|
130
|
+
if (firstArg && ts.isIdentifier(firstArg)) {
|
|
131
|
+
const clearerName = firstArg.text;
|
|
132
|
+
if (clearerName === "clearTimeout" || clearerName === "clearInterval") {
|
|
133
|
+
cleanedCollections.set(collName, clearerName);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// Pattern 2b: Callback: timers.forEach((id) => clearTimeout(id))
|
|
137
|
+
if (firstArg && (ts.isArrowFunction(firstArg) || ts.isFunctionExpression(firstArg))) {
|
|
138
|
+
const param = firstArg.parameters[0];
|
|
139
|
+
if (param && ts.isIdentifier(param.name)) {
|
|
140
|
+
const paramName = param.name.text;
|
|
141
|
+
let foundClearer;
|
|
142
|
+
function findCallbackClear(inner) {
|
|
143
|
+
if (foundClearer || !ts)
|
|
144
|
+
return;
|
|
145
|
+
if (ts.isCallExpression(inner) && ts.isIdentifier(inner.expression)) {
|
|
146
|
+
const fnName = inner.expression.text;
|
|
147
|
+
if (fnName === "clearTimeout" || fnName === "clearInterval") {
|
|
148
|
+
const arg = inner.arguments[0];
|
|
149
|
+
if (arg && ts.isIdentifier(arg) && arg.text === paramName) {
|
|
150
|
+
foundClearer = fnName;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
inner.forEachChild(findCallbackClear);
|
|
155
|
+
}
|
|
156
|
+
findCallbackClear(firstArg.body);
|
|
157
|
+
if (foundClearer) {
|
|
158
|
+
cleanedCollections.set(collName, foundClearer);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// 3. For...of loop: for (const timer of timers) clearTimeout(timer);
|
|
164
|
+
if (ts.isForOfStatement(cn)) {
|
|
165
|
+
const expression = cn.expression;
|
|
166
|
+
if (ts.isIdentifier(expression)) {
|
|
167
|
+
const collName = expression.text;
|
|
168
|
+
let loopVarName;
|
|
169
|
+
if (ts.isVariableDeclarationList(cn.initializer)) {
|
|
170
|
+
const decl = cn.initializer.declarations[0];
|
|
171
|
+
if (decl && ts.isIdentifier(decl.name)) {
|
|
172
|
+
loopVarName = decl.name.text;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
else if (ts.isIdentifier(cn.initializer)) {
|
|
176
|
+
loopVarName = cn.initializer.text;
|
|
177
|
+
}
|
|
178
|
+
if (loopVarName) {
|
|
179
|
+
let foundClearer;
|
|
180
|
+
function findForOfClear(inner) {
|
|
181
|
+
if (foundClearer || !ts)
|
|
182
|
+
return;
|
|
183
|
+
if (ts.isCallExpression(inner) && ts.isIdentifier(inner.expression)) {
|
|
184
|
+
const fnName = inner.expression.text;
|
|
185
|
+
if (fnName === "clearTimeout" || fnName === "clearInterval") {
|
|
186
|
+
const arg = inner.arguments[0];
|
|
187
|
+
if (arg && ts.isIdentifier(arg) && arg.text === loopVarName) {
|
|
188
|
+
foundClearer = fnName;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
inner.forEachChild(findForOfClear);
|
|
193
|
+
}
|
|
194
|
+
findForOfClear(cn.statement);
|
|
195
|
+
if (foundClearer) {
|
|
196
|
+
cleanedCollections.set(collName, foundClearer);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
// 4. Classic for loop: for (let i = 0; i < timers.length; i++) clearTimeout(timers[i]);
|
|
202
|
+
if (ts.isForStatement(cn)) {
|
|
203
|
+
let collName;
|
|
204
|
+
if (cn.condition &&
|
|
205
|
+
ts.isBinaryExpression(cn.condition) &&
|
|
206
|
+
ts.isPropertyAccessExpression(cn.condition.right) &&
|
|
207
|
+
cn.condition.right.name.text === "length" &&
|
|
208
|
+
ts.isIdentifier(cn.condition.right.expression)) {
|
|
209
|
+
collName = cn.condition.right.expression.text;
|
|
210
|
+
}
|
|
211
|
+
if (collName) {
|
|
212
|
+
let foundClearer;
|
|
213
|
+
function findForClear(inner) {
|
|
214
|
+
if (foundClearer || !ts)
|
|
215
|
+
return;
|
|
216
|
+
if (ts.isCallExpression(inner) && ts.isIdentifier(inner.expression)) {
|
|
217
|
+
const fnName = inner.expression.text;
|
|
218
|
+
if (fnName === "clearTimeout" || fnName === "clearInterval") {
|
|
219
|
+
const arg = inner.arguments[0];
|
|
220
|
+
if (arg &&
|
|
221
|
+
ts.isElementAccessExpression(arg) &&
|
|
222
|
+
ts.isIdentifier(arg.expression) &&
|
|
223
|
+
arg.expression.text === collName) {
|
|
224
|
+
foundClearer = fnName;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
inner.forEachChild(findForClear);
|
|
229
|
+
}
|
|
230
|
+
findForClear(cn.statement);
|
|
231
|
+
if (foundClearer) {
|
|
232
|
+
cleanedCollections.set(collName, foundClearer);
|
|
72
233
|
}
|
|
73
234
|
}
|
|
74
235
|
}
|
|
@@ -79,10 +240,23 @@ export const timerCleanupRule = {
|
|
|
79
240
|
inspectEffectBody(effectCallback.body);
|
|
80
241
|
for (const timer of timers) {
|
|
81
242
|
let isCleaned = false;
|
|
243
|
+
const expectedClear = timer.timerKind === "setInterval" ? "clearInterval" : "clearTimeout";
|
|
82
244
|
if (hasCleanupReturn) {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
245
|
+
if (timer.collectionName) {
|
|
246
|
+
const collInfo = collections.get(timer.collectionName);
|
|
247
|
+
const cleanedWith = cleanedCollections.get(timer.collectionName);
|
|
248
|
+
if (collInfo && !collInfo.hasNonTimerPush && cleanedWith === expectedClear) {
|
|
249
|
+
isCleaned = true;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
else if (timer.varName) {
|
|
253
|
+
if (scalarCleanups.has(expectedClear) && scalarCleanups.has(timer.varName)) {
|
|
254
|
+
isCleaned = true;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
else {
|
|
258
|
+
// Bare timer without variable or collection name
|
|
259
|
+
if (scalarCleanups.has(expectedClear)) {
|
|
86
260
|
isCleaned = true;
|
|
87
261
|
}
|
|
88
262
|
}
|
|
@@ -100,11 +274,15 @@ export const timerCleanupRule = {
|
|
|
100
274
|
range,
|
|
101
275
|
evidence: [
|
|
102
276
|
{
|
|
103
|
-
message:
|
|
277
|
+
message: isInterval
|
|
278
|
+
? "An uncleared interval continues executing after the owning component has unmounted, retaining its callback and performing unnecessary background work."
|
|
279
|
+
: "A pending timeout may fire after the component has unmounted and execute stale lifecycle work.",
|
|
104
280
|
range,
|
|
105
281
|
},
|
|
106
282
|
],
|
|
107
|
-
suggestedAction:
|
|
283
|
+
suggestedAction: isInterval
|
|
284
|
+
? `Clear the interval in the returned cleanup function: return () => clearInterval(${timer.varName ?? "id"});`
|
|
285
|
+
: "Store the timeout handle and clear it in the effect cleanup when post-unmount execution is not intended.",
|
|
108
286
|
safeAutomaticFix: false,
|
|
109
287
|
});
|
|
110
288
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timerCleanup.js","sourceRoot":"","sources":["../../../src/rules/browser/timerCleanup.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"timerCleanup.js","sourceRoot":"","sources":["../../../src/rules/browser/timerCleanup.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unsafeUnvalidatedAssertion.d.ts","sourceRoot":"","sources":["../../../src/rules/typescript/unsafeUnvalidatedAssertion.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAe,MAAM,qBAAqB,CAAC;AAU7D,eAAO,MAAM,8BAA8B,EAAE,
|
|
1
|
+
{"version":3,"file":"unsafeUnvalidatedAssertion.d.ts","sourceRoot":"","sources":["../../../src/rules/typescript/unsafeUnvalidatedAssertion.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAe,MAAM,qBAAqB,CAAC;AAU7D,eAAO,MAAM,8BAA8B,EAAE,IAiI5C,CAAC"}
|
|
@@ -69,24 +69,56 @@ export const unsafeUnvalidatedAssertionRule = {
|
|
|
69
69
|
}
|
|
70
70
|
}
|
|
71
71
|
if (isRuntimeBoundary) {
|
|
72
|
+
let isInsideTryCatch = false;
|
|
73
|
+
let curr = node;
|
|
74
|
+
while (curr.parent && !ts.isSourceFile(curr.parent)) {
|
|
75
|
+
if (ts.isTryStatement(curr.parent) && curr.parent.tryBlock === curr) {
|
|
76
|
+
if (curr.parent.catchClause) {
|
|
77
|
+
isInsideTryCatch = true;
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
curr = curr.parent;
|
|
82
|
+
}
|
|
72
83
|
const range = getNodeSourceRange(node, sourceFile);
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
84
|
+
if (isInsideTryCatch) {
|
|
85
|
+
context.report({
|
|
86
|
+
ruleId: "typescript/unsafe-unvalidated-assertion",
|
|
87
|
+
category: "typescript",
|
|
88
|
+
severity: "warning",
|
|
89
|
+
confidence: "medium",
|
|
90
|
+
message: `Runtime boundary data from ${boundaryName} is asserted to type without runtime validation (exceptions caught by local try/catch).`,
|
|
91
|
+
file: sourceFile.fileName,
|
|
92
|
+
range,
|
|
93
|
+
evidence: [
|
|
94
|
+
{
|
|
95
|
+
message: "Type assertions bypass compiler checking. While the surrounding try/catch prevents uncaught runtime crashes, untyped runtime structures may silently degrade domain state.",
|
|
96
|
+
range,
|
|
97
|
+
},
|
|
98
|
+
],
|
|
99
|
+
suggestedAction: "Validate payload with a runtime schema validator or type guard before asserting.",
|
|
100
|
+
safeAutomaticFix: false,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
context.report({
|
|
105
|
+
ruleId: "typescript/unsafe-unvalidated-assertion",
|
|
106
|
+
category: "typescript",
|
|
107
|
+
severity: "error",
|
|
108
|
+
confidence: "high",
|
|
109
|
+
message: `Runtime boundary data from ${boundaryName} is asserted to type without runtime validation.`,
|
|
110
|
+
file: sourceFile.fileName,
|
|
111
|
+
range,
|
|
112
|
+
evidence: [
|
|
113
|
+
{
|
|
114
|
+
message: "Type assertions bypass compiler checking without verifying that runtime structure satisfies the target type.",
|
|
115
|
+
range,
|
|
116
|
+
},
|
|
117
|
+
],
|
|
118
|
+
suggestedAction: "Validate payload with a runtime schema validator before asserting or casting.",
|
|
119
|
+
safeAutomaticFix: false,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
90
122
|
}
|
|
91
123
|
});
|
|
92
124
|
},
|