@kernlang/review 3.4.3 → 3.4.4-canary.12.1.6ccc1ff6
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.
|
@@ -8,6 +8,25 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import { Node, SyntaxKind } from 'ts-morph';
|
|
10
10
|
import { finding } from './utils.js';
|
|
11
|
+
/**
|
|
12
|
+
* Structural top-level nullability check. Replaces the substring scan
|
|
13
|
+
* over `type.getText()` that was firing on safe array values like
|
|
14
|
+
* `(string | undefined)[]`: the rendered type contains the substring
|
|
15
|
+
* "undefined", but the array itself is never null/undefined — only its
|
|
16
|
+
* elements are. Calling `.length` / `.join` / etc. on it is totally
|
|
17
|
+
* safe.
|
|
18
|
+
*
|
|
19
|
+
* The right question is: does the TOP-LEVEL type include `null` or
|
|
20
|
+
* `undefined` as a union member? `arr.find()` returns `T | undefined`
|
|
21
|
+
* — yes, flag. `[a,b].filter(...)` returns `(T | undefined)[]` — no,
|
|
22
|
+
* the array is the top-level type and it's not nullable.
|
|
23
|
+
*/
|
|
24
|
+
function topLevelIsNullable(type) {
|
|
25
|
+
if (type.isUnion()) {
|
|
26
|
+
return type.getUnionTypes().some((t) => t.isUndefined() || t.isNull());
|
|
27
|
+
}
|
|
28
|
+
return type.isUndefined() || type.isNull();
|
|
29
|
+
}
|
|
11
30
|
// ── Rule 1: unchecked-find ───────────────────────────────────────────────
|
|
12
31
|
// .find() returns T | undefined — using result without null check is a bug.
|
|
13
32
|
const NULLABLE_METHODS = new Set(['find', 'querySelector', 'getElementById', 'get']);
|
|
@@ -134,10 +153,14 @@ function typeCheckedNullable(ctx) {
|
|
|
134
153
|
}
|
|
135
154
|
try {
|
|
136
155
|
const returnType = obj.getReturnType();
|
|
137
|
-
|
|
138
|
-
//
|
|
139
|
-
|
|
156
|
+
// Structural top-level nullability check (see `topLevelIsNullable`).
|
|
157
|
+
// Replaces the previous substring scan over `getText()` which
|
|
158
|
+
// false-positived on `(string | undefined)[]` and other arrays
|
|
159
|
+
// whose ELEMENT type was nullable but whose TOP-LEVEL type is
|
|
160
|
+
// a non-nullable Array.
|
|
161
|
+
if (topLevelIsNullable(returnType)) {
|
|
140
162
|
const callText = obj.getExpression().getText().substring(0, 30);
|
|
163
|
+
const typeText = returnType.getText();
|
|
141
164
|
findings.push(finding('unchecked-find', 'warning', 'bug', `Property access on nullable return from '${callText}(...)' (type: ${typeText.substring(0, 50)}). May throw at runtime.`, ctx.filePath, prop.getStartLineNumber(), 1, { suggestion: `Use optional chaining (?.) or add a null guard before accessing .${prop.getName()}.` }));
|
|
142
165
|
}
|
|
143
166
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"null-safety.js","sourceRoot":"","sources":["../../src/rules/null-safety.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,IAAI,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"null-safety.js","sourceRoot":"","sources":["../../src/rules/null-safety.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kernlang/review",
|
|
3
|
-
"version": "3.4.
|
|
3
|
+
"version": "3.4.4-canary.12.1.6ccc1ff6",
|
|
4
4
|
"description": "Kern Review — scan TS, infer .kern IR, roundtrip diff, report",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
"license": "AGPL-3.0",
|
|
27
27
|
"dependencies": {
|
|
28
28
|
"ts-morph": "^28.0.0",
|
|
29
|
-
"@kernlang/core": "3.4.
|
|
29
|
+
"@kernlang/core": "3.4.4-canary.12.1.6ccc1ff6"
|
|
30
30
|
},
|
|
31
31
|
"scripts": {
|
|
32
32
|
"build": "tsc -b",
|