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.
Files changed (37) hide show
  1. package/dist/analysis/controlFlow.d.ts.map +1 -1
  2. package/dist/analysis/controlFlow.js +1867 -9
  3. package/dist/analysis/controlFlow.js.map +1 -1
  4. package/dist/analysis/frameworks.d.ts.map +1 -1
  5. package/dist/analysis/frameworks.js +52 -0
  6. package/dist/analysis/frameworks.js.map +1 -1
  7. package/dist/analysis/functions.d.ts.map +1 -1
  8. package/dist/analysis/functions.js +44 -12
  9. package/dist/analysis/functions.js.map +1 -1
  10. package/dist/cli/main.d.ts.map +1 -1
  11. package/dist/cli/main.js +2 -1
  12. package/dist/cli/main.js.map +1 -1
  13. package/dist/core/version.d.ts +9 -0
  14. package/dist/core/version.d.ts.map +1 -0
  15. package/dist/core/version.js +51 -0
  16. package/dist/core/version.js.map +1 -0
  17. package/dist/index.d.ts +1 -0
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +1 -0
  20. package/dist/index.js.map +1 -1
  21. package/dist/reporters/agent.d.ts +1 -1
  22. package/dist/reporters/agent.d.ts.map +1 -1
  23. package/dist/reporters/agent.js +2 -1
  24. package/dist/reporters/agent.js.map +1 -1
  25. package/dist/reporters/sarif.d.ts.map +1 -1
  26. package/dist/reporters/sarif.js +2 -1
  27. package/dist/reporters/sarif.js.map +1 -1
  28. package/dist/reporters/terminal.d.ts.map +1 -1
  29. package/dist/reporters/terminal.js +2 -1
  30. package/dist/reporters/terminal.js.map +1 -1
  31. package/dist/rules/browser/timerCleanup.d.ts.map +1 -1
  32. package/dist/rules/browser/timerCleanup.js +198 -20
  33. package/dist/rules/browser/timerCleanup.js.map +1 -1
  34. package/dist/rules/typescript/unsafeUnvalidatedAssertion.d.ts.map +1 -1
  35. package/dist/rules/typescript/unsafeUnvalidatedAssertion.js +49 -17
  36. package/dist/rules/typescript/unsafeUnvalidatedAssertion.js.map +1 -1
  37. 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
@@ -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"}
@@ -25,7 +25,7 @@ export interface AgentReport {
25
25
  readonly schemaVersion: 1;
26
26
  readonly tool: {
27
27
  readonly name: "sourceverity";
28
- readonly version: "1.0.0";
28
+ readonly version: string;
29
29
  };
30
30
  readonly repository: {
31
31
  readonly typescript?: string | undefined;
@@ -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;AAE7D,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,OAAO,CAAC;KAC3B,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"}
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"}
@@ -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: "1.0.0",
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":"AAqCA;;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,OAAO;SACjB;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
+ {"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;AAEpD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CA4D7D"}
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"}
@@ -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: "1.0.0",
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":"AAEA;;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,OAAO;wBAChB,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
+ {"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;AAE3E,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
+ {"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("SourceVerity 1.0.0"));
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":"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"}
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,IAgI9B,CAAC"}
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 cleanups = new Set();
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: const id = setInterval(...) or setInterval(...)
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
- let varName;
40
- if (n.parent && ts.isVariableDeclaration(n.parent) && ts.isIdentifier(n.parent.name)) {
41
- varName = n.parent.name.text;
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
- if (ts && n !== effectCallback && (ts.isFunctionDeclaration(n) || ts.isArrowFunction(n) || ts.isFunctionExpression(n))) {
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 && ts.isCallExpression(cn) && ts.isIdentifier(cn.expression)) {
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
- cleanups.add(fnName);
115
+ scalarCleanups.add(fnName);
69
116
  const arg = cn.arguments[0];
70
117
  if (arg && ts.isIdentifier(arg)) {
71
- cleanups.add(arg.text);
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
- const expectedClear = timer.timerKind === "setInterval" ? "clearInterval" : "clearTimeout";
84
- if (cleanups.has(expectedClear)) {
85
- if (!timer.varName || cleanups.has(timer.varName)) {
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: `Active ${timer.timerKind} timers that outlive the component lifecycle cause state leaks and background CPU consumption.`,
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: `Clear the timer in the returned cleanup function: return () => ${isInterval ? "clearInterval" : "clearTimeout"}(id);`,
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,IA+F5C,CAAC"}
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
- context.report({
74
- ruleId: "typescript/unsafe-unvalidated-assertion",
75
- category: "typescript",
76
- severity: "error",
77
- confidence: "high",
78
- message: `Runtime boundary data from ${boundaryName} is asserted to type without runtime validation.`,
79
- file: sourceFile.fileName,
80
- range,
81
- evidence: [
82
- {
83
- message: "Type assertions bypass compiler checking without verifying that runtime structure satisfies the target type.",
84
- range,
85
- },
86
- ],
87
- suggestedAction: "Validate payload with a runtime schema validator before asserting or casting.",
88
- safeAutomaticFix: false,
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
  },