sourceverity 1.0.3 → 1.0.5

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 (81) hide show
  1. package/README.md +91 -3
  2. package/dist/analysis/arrayBounds.d.ts +4 -0
  3. package/dist/analysis/arrayBounds.d.ts.map +1 -0
  4. package/dist/analysis/arrayBounds.js +4 -0
  5. package/dist/analysis/arrayBounds.js.map +1 -0
  6. package/dist/analysis/arrayBoundsCore.d.ts +69 -0
  7. package/dist/analysis/arrayBoundsCore.d.ts.map +1 -0
  8. package/dist/analysis/arrayBoundsCore.js +957 -0
  9. package/dist/analysis/arrayBoundsCore.js.map +1 -0
  10. package/dist/analysis/arrayConstructionBounds.d.ts +14 -0
  11. package/dist/analysis/arrayConstructionBounds.d.ts.map +1 -0
  12. package/dist/analysis/arrayConstructionBounds.js +445 -0
  13. package/dist/analysis/arrayConstructionBounds.js.map +1 -0
  14. package/dist/analysis/arrayIterationBounds.d.ts +12 -0
  15. package/dist/analysis/arrayIterationBounds.d.ts.map +1 -0
  16. package/dist/analysis/arrayIterationBounds.js +578 -0
  17. package/dist/analysis/arrayIterationBounds.js.map +1 -0
  18. package/dist/analysis/{controlFlow.d.ts → controlFlowGuards.d.ts} +1 -9
  19. package/dist/analysis/controlFlowGuards.d.ts.map +1 -0
  20. package/dist/analysis/controlFlowGuards.js +119 -0
  21. package/dist/analysis/controlFlowGuards.js.map +1 -0
  22. package/dist/analysis/controlFlowTypes.d.ts +5 -0
  23. package/dist/analysis/controlFlowTypes.d.ts.map +1 -0
  24. package/dist/analysis/controlFlowTypes.js +2 -0
  25. package/dist/analysis/controlFlowTypes.js.map +1 -0
  26. package/dist/analysis/frameworks.d.ts.map +1 -1
  27. package/dist/analysis/frameworks.js +11 -23
  28. package/dist/analysis/frameworks.js.map +1 -1
  29. package/dist/analysis/functions.d.ts.map +1 -1
  30. package/dist/analysis/functions.js +70 -30
  31. package/dist/analysis/functions.js.map +1 -1
  32. package/dist/analysis/nonNullGuards.d.ts +7 -0
  33. package/dist/analysis/nonNullGuards.d.ts.map +1 -0
  34. package/dist/analysis/nonNullGuards.js +409 -0
  35. package/dist/analysis/nonNullGuards.js.map +1 -0
  36. package/dist/analysis/promiseFlow.d.ts +5 -0
  37. package/dist/analysis/promiseFlow.d.ts.map +1 -1
  38. package/dist/analysis/promiseFlow.js +331 -1
  39. package/dist/analysis/promiseFlow.js.map +1 -1
  40. package/dist/analysis/reactStateBounds.d.ts +8 -0
  41. package/dist/analysis/reactStateBounds.d.ts.map +1 -0
  42. package/dist/analysis/reactStateBounds.js +390 -0
  43. package/dist/analysis/reactStateBounds.js.map +1 -0
  44. package/dist/analysis/values.d.ts.map +1 -1
  45. package/dist/analysis/values.js +3 -0
  46. package/dist/analysis/values.js.map +1 -1
  47. package/dist/baseline/manager.d.ts +2 -0
  48. package/dist/baseline/manager.d.ts.map +1 -1
  49. package/dist/baseline/manager.js +45 -18
  50. package/dist/baseline/manager.js.map +1 -1
  51. package/dist/cli/help.js +1 -1
  52. package/dist/cli/main.d.ts.map +1 -1
  53. package/dist/cli/main.js +22 -1
  54. package/dist/cli/main.js.map +1 -1
  55. package/dist/core/config.d.ts +7 -0
  56. package/dist/core/config.d.ts.map +1 -0
  57. package/dist/core/config.js +42 -0
  58. package/dist/core/config.js.map +1 -0
  59. package/dist/engine/runner.js +1 -1
  60. package/dist/engine/runner.js.map +1 -1
  61. package/dist/engine/symbols.d.ts +0 -1
  62. package/dist/engine/symbols.d.ts.map +1 -1
  63. package/dist/engine/symbols.js +2 -12
  64. package/dist/engine/symbols.js.map +1 -1
  65. package/dist/repository/detector.d.ts.map +1 -1
  66. package/dist/repository/detector.js +31 -11
  67. package/dist/repository/detector.js.map +1 -1
  68. package/dist/rules/async/floatingPromise.d.ts.map +1 -1
  69. package/dist/rules/async/floatingPromise.js +23 -3
  70. package/dist/rules/async/floatingPromise.js.map +1 -1
  71. package/dist/rules/network/fetchStatusUnchecked.js +1 -1
  72. package/dist/rules/network/fetchStatusUnchecked.js.map +1 -1
  73. package/dist/rules/react/derivedStateEffect.d.ts.map +1 -1
  74. package/dist/rules/react/derivedStateEffect.js +60 -5
  75. package/dist/rules/react/derivedStateEffect.js.map +1 -1
  76. package/dist/rules/typescript/nonNullAssertionRisk.js +1 -1
  77. package/dist/rules/typescript/nonNullAssertionRisk.js.map +1 -1
  78. package/package.json +1 -1
  79. package/dist/analysis/controlFlow.d.ts.map +0 -1
  80. package/dist/analysis/controlFlow.js +0 -2592
  81. package/dist/analysis/controlFlow.js.map +0 -1
@@ -0,0 +1,409 @@
1
+ import { hasArrayMutation, hasMutationBeforeNode, isCompleteBoundsExitGuard, isConstructedArrayCardinalityBoundedIndex, isFindIndexBoundedIndex, isFixedLengthGuardedIndex, isLoopOrCallbackBoundedIndex, isPositiveBoundsEntryGuard, isSearchProvenanceBoundedIndex, isStaticArrayLiteralBoundedIndex, normalizeArrayTarget, normalizeIndexExpression, } from "./arrayBounds.js";
2
+ import { hasVariableReassignment, statementExitsControlFlow, } from "./controlFlowGuards.js";
3
+ import { isReactStateBoundedIndex } from "./reactStateBounds.js";
4
+ import { unwrapExpression } from "./values.js";
5
+ function identifiersMatch(left, right, checker) {
6
+ if (!checker)
7
+ return left.text === right.text;
8
+ const leftSymbol = checker.getSymbolAtLocation(left);
9
+ const rightSymbol = checker.getSymbolAtLocation(right);
10
+ return leftSymbol && rightSymbol ? leftSymbol === rightSymbol : left.text === right.text;
11
+ }
12
+ function getConstIdentifierDeclaration(identifier, ts, checker) {
13
+ const symbol = checker?.getSymbolAtLocation(identifier);
14
+ const declaration = symbol?.valueDeclaration ?? symbol?.declarations?.[0];
15
+ if (!declaration || !ts.isVariableDeclaration(declaration) || !ts.isIdentifier(declaration.name)) {
16
+ return undefined;
17
+ }
18
+ const declarationList = declaration.parent;
19
+ return ts.isVariableDeclarationList(declarationList) &&
20
+ (declarationList.flags & ts.NodeFlags.Const) !== 0
21
+ ? declaration
22
+ : undefined;
23
+ }
24
+ function isNullishLiteral(node, ts) {
25
+ return (node.kind === ts.SyntaxKind.NullKeyword ||
26
+ node.kind === ts.SyntaxKind.UndefinedKeyword ||
27
+ (ts.isIdentifier(node) && node.text === "undefined"));
28
+ }
29
+ function getNullCheckedIdentifier(expression, ts) {
30
+ const condition = unwrapExpression(expression, ts);
31
+ if (!ts.isBinaryExpression(condition))
32
+ return undefined;
33
+ const operator = condition.operatorToken.kind;
34
+ if (operator !== ts.SyntaxKind.EqualsEqualsToken &&
35
+ operator !== ts.SyntaxKind.EqualsEqualsEqualsToken) {
36
+ return undefined;
37
+ }
38
+ const left = unwrapExpression(condition.left, ts);
39
+ const right = unwrapExpression(condition.right, ts);
40
+ if (ts.isIdentifier(left) && isNullishLiteral(right, ts))
41
+ return left;
42
+ if (ts.isIdentifier(right) && isNullishLiteral(left, ts))
43
+ return right;
44
+ return undefined;
45
+ }
46
+ function getConditionalNullSentinelSource(initializer, ts) {
47
+ const conditional = unwrapExpression(initializer, ts);
48
+ if (!ts.isConditionalExpression(conditional))
49
+ return undefined;
50
+ if (!isNullishLiteral(unwrapExpression(conditional.whenTrue, ts), ts))
51
+ return undefined;
52
+ return getNullCheckedIdentifier(conditional.condition, ts);
53
+ }
54
+ function isConstConditionalSentinelGuarded(operand, statements, targetIndex, ts, checker) {
55
+ if (!checker)
56
+ return false;
57
+ for (let guardIndex = 0; guardIndex < targetIndex; guardIndex++) {
58
+ const guard = statements[guardIndex];
59
+ if (!guard ||
60
+ !ts.isIfStatement(guard) ||
61
+ !statementExitsControlFlow(guard.thenStatement, ts)) {
62
+ continue;
63
+ }
64
+ const sentinel = getNullCheckedIdentifier(guard.expression, ts);
65
+ if (!sentinel)
66
+ continue;
67
+ const sentinelDeclaration = getConstIdentifierDeclaration(sentinel, ts, checker);
68
+ if (!sentinelDeclaration ||
69
+ !sentinelDeclaration.initializer ||
70
+ sentinelDeclaration.getStart() >= guard.getStart()) {
71
+ continue;
72
+ }
73
+ const source = getConditionalNullSentinelSource(sentinelDeclaration.initializer, ts);
74
+ const sourceDeclaration = source
75
+ ? getConstIdentifierDeclaration(source, ts, checker)
76
+ : undefined;
77
+ if (source &&
78
+ sourceDeclaration &&
79
+ sourceDeclaration.getStart() < sentinelDeclaration.getStart() &&
80
+ identifiersMatch(source, operand, checker)) {
81
+ return true;
82
+ }
83
+ }
84
+ return false;
85
+ }
86
+ function isConstConditionalSentinelGuardedInAncestorScopes(node, operand, ts, checker) {
87
+ let child = node;
88
+ while (child.parent) {
89
+ const parent = child.parent;
90
+ if (ts.isBlock(parent) || ts.isSourceFile(parent)) {
91
+ let statement = child;
92
+ while (statement.parent && statement.parent !== parent) {
93
+ statement = statement.parent;
94
+ }
95
+ const statementIndex = parent.statements.indexOf(statement);
96
+ if (statementIndex > 0 &&
97
+ isConstConditionalSentinelGuarded(operand, parent.statements, statementIndex, ts, checker)) {
98
+ return true;
99
+ }
100
+ if (parent.parent &&
101
+ (ts.isFunctionDeclaration(parent.parent) ||
102
+ ts.isFunctionExpression(parent.parent) ||
103
+ ts.isArrowFunction(parent.parent) ||
104
+ ts.isMethodDeclaration(parent.parent))) {
105
+ return false;
106
+ }
107
+ }
108
+ child = parent;
109
+ }
110
+ return false;
111
+ }
112
+ /**
113
+ * Checks if a non-null assertion operand is guarded against null/undefined or out-of-bounds access.
114
+ */
115
+ export function isGuardedNonNullAssertion(node, ts, checker) {
116
+ const operand = unwrapExpression(node.expression, ts);
117
+ // Case 1: Indexed access non-null assertion: `array[index]!`
118
+ if (ts.isElementAccessExpression(operand)) {
119
+ // 1a. Check static array literal bounded index: e.g. tiers[0]! or colW[2]!
120
+ const staticLiteralCheck = isStaticArrayLiteralBoundedIndex(operand, ts, checker);
121
+ if (staticLiteralCheck?.isGuarded) {
122
+ return staticLiteralCheck;
123
+ }
124
+ // 1b. Check fixed-length equality or comparison guards: e.g. if (sliceArgs.length === 2) sliceArgs[0]!
125
+ const fixedLengthCheck = isFixedLengthGuardedIndex(node, operand, ts, checker);
126
+ if (fixedLengthCheck?.isGuarded) {
127
+ return fixedLengthCheck;
128
+ }
129
+ // 1c. Check constructed array cardinality: e.g. amplitudes[numLayers]! or coeffs[0]!
130
+ const cardinalityCheck = isConstructedArrayCardinalityBoundedIndex(node, operand, ts, checker);
131
+ if (cardinalityCheck?.isGuarded) {
132
+ return cardinalityCheck;
133
+ }
134
+ // 1d. Check loop or callback bounds: e.g. for (let i = 0; i < arr.length; i++) arr[i]!
135
+ const loopCheck = isLoopOrCallbackBoundedIndex(node, operand, ts, checker);
136
+ if (loopCheck?.isGuarded) {
137
+ return loopCheck;
138
+ }
139
+ // 1d. Check React state bounds: e.g. STEPS[step]! with constrained setStep transitions
140
+ const reactStateCheck = isReactStateBoundedIndex(operand, ts, checker);
141
+ if (reactStateCheck?.isGuarded) {
142
+ return reactStateCheck;
143
+ }
144
+ // 1e. Check search provenance: e.g. copy[victimIdx]!
145
+ const provenanceCheck = isSearchProvenanceBoundedIndex(node, operand, ts, checker);
146
+ if (provenanceCheck?.isGuarded) {
147
+ return provenanceCheck;
148
+ }
149
+ // 1f. Check findIndex contract: e.g. const i = arr.findIndex(...); if (i !== -1) arr[i]!
150
+ const findIndexCheck = isFindIndexBoundedIndex(node, operand, ts, checker);
151
+ if (findIndexCheck?.isGuarded) {
152
+ return findIndexCheck;
153
+ }
154
+ // 1g. Dominating statement-level bounds exit check: if (index < 0 || index >= array.length) return;
155
+ const arrayInfo = normalizeArrayTarget(operand.expression, ts, checker);
156
+ const indexInfo = normalizeIndexExpression(operand.argumentExpression, ts, checker);
157
+ if (arrayInfo && indexInfo) {
158
+ let walk = node;
159
+ while (walk.parent &&
160
+ !ts.isFunctionDeclaration(walk.parent) &&
161
+ !ts.isFunctionExpression(walk.parent) &&
162
+ !ts.isArrowFunction(walk.parent) &&
163
+ !ts.isSourceFile(walk.parent)) {
164
+ if (ts.isIfStatement(walk.parent)) {
165
+ if (walk.parent.thenStatement === walk ||
166
+ (ts.isBlock(walk.parent.thenStatement) &&
167
+ walk.parent.thenStatement.statements.includes(walk))) {
168
+ if (isPositiveBoundsEntryGuard(walk.parent.expression, indexInfo, arrayInfo, ts)) {
169
+ return {
170
+ isGuarded: true,
171
+ evidence: `Enclosing guard '${walk.parent.expression.getText()}' proves index '${indexInfo.baseText}${indexInfo.offset ? ` + ${indexInfo.offset}` : ""}' is strictly in-bounds for '${arrayInfo.text}'.`,
172
+ };
173
+ }
174
+ }
175
+ }
176
+ walk = walk.parent;
177
+ }
178
+ // Ancestor block dominating bounds exit check
179
+ let childNode = node;
180
+ while (childNode.parent) {
181
+ const parent = childNode.parent;
182
+ // Requirement 7: Do NOT cross function boundaries
183
+ if (ts.isFunctionDeclaration(parent) ||
184
+ ts.isFunctionExpression(parent) ||
185
+ ts.isArrowFunction(parent) ||
186
+ ts.isMethodDeclaration(parent) ||
187
+ ts.isConstructorDeclaration(parent) ||
188
+ ts.isGetAccessor(parent) ||
189
+ ts.isSetAccessor(parent)) {
190
+ break;
191
+ }
192
+ if (ts.isBlock(parent) ||
193
+ ts.isSourceFile(parent) ||
194
+ ts.isCaseClause(parent) ||
195
+ ts.isDefaultClause(parent)) {
196
+ let stmtInBlock = childNode;
197
+ while (stmtInBlock.parent && stmtInBlock.parent !== parent) {
198
+ stmtInBlock = stmtInBlock.parent;
199
+ }
200
+ const statements = parent.statements;
201
+ const targetIndex = statements.indexOf(stmtInBlock);
202
+ if (targetIndex > 0) {
203
+ for (let i = 0; i < targetIndex; i++) {
204
+ const prior = statements[i];
205
+ if (!prior)
206
+ continue;
207
+ if (ts.isIfStatement(prior)) {
208
+ // Requirement 8: Do NOT treat guards inside conditional branches as globally dominating
209
+ if (statementExitsControlFlow(prior.thenStatement, ts)) {
210
+ if (isCompleteBoundsExitGuard(prior.expression, indexInfo, arrayInfo, ts, checker)) {
211
+ let invalidated = false;
212
+ // 1. Invalidate if index variable or array was reassigned/mutated between prior and stmtInBlock
213
+ for (let j = i + 1; j < targetIndex; j++) {
214
+ const betweenStmt = statements[j];
215
+ if (!betweenStmt)
216
+ continue;
217
+ if (hasVariableReassignment(betweenStmt, indexInfo.baseText, indexInfo.baseSymbol, ts, checker)) {
218
+ invalidated = true;
219
+ break;
220
+ }
221
+ if (hasArrayMutation(betweenStmt, arrayInfo.text, ts, checker, arrayInfo.symbol)) {
222
+ invalidated = true;
223
+ break;
224
+ }
225
+ }
226
+ // 2. Invalidate if index variable or array was reassigned/mutated inside stmtInBlock before node
227
+ if (!invalidated) {
228
+ if (hasVariableReassignment(stmtInBlock, indexInfo.baseText, indexInfo.baseSymbol, ts, checker, node.pos)) {
229
+ invalidated = true;
230
+ }
231
+ if (!invalidated && hasMutationBeforeNode(stmtInBlock, node, arrayInfo.text, ts, checker, arrayInfo.symbol)) {
232
+ invalidated = true;
233
+ }
234
+ }
235
+ // 3. Invalidate if node is inside a loop between parent and node whose body reassigns index or mutates array
236
+ if (!invalidated) {
237
+ let loopCheck = node;
238
+ while (loopCheck.parent && loopCheck.parent !== parent) {
239
+ const lp = loopCheck.parent;
240
+ if (ts.isForStatement(lp) ||
241
+ ts.isForInStatement(lp) ||
242
+ ts.isForOfStatement(lp) ||
243
+ ts.isWhileStatement(lp) ||
244
+ ts.isDoStatement(lp)) {
245
+ const body = lp.statement;
246
+ if (hasVariableReassignment(body, indexInfo.baseText, indexInfo.baseSymbol, ts, checker)) {
247
+ invalidated = true;
248
+ break;
249
+ }
250
+ if (hasArrayMutation(body, arrayInfo.text, ts, checker, arrayInfo.symbol)) {
251
+ invalidated = true;
252
+ break;
253
+ }
254
+ }
255
+ loopCheck = lp;
256
+ }
257
+ }
258
+ if (!invalidated) {
259
+ return {
260
+ isGuarded: true,
261
+ evidence: `Dominating guard '${prior.expression.getText()}' proves index '${indexInfo.baseText}${indexInfo.offset ? ` + ${indexInfo.offset}` : ""}' is strictly in-bounds for '${arrayInfo.text}'.`,
262
+ };
263
+ }
264
+ }
265
+ }
266
+ }
267
+ }
268
+ }
269
+ }
270
+ childNode = parent;
271
+ }
272
+ }
273
+ }
274
+ // Case 2: Direct variable / identifier non-null assertion: `target!`
275
+ if (ts.isIdentifier(operand)) {
276
+ const targetName = operand.text;
277
+ const targetSymbol = checker?.getSymbolAtLocation(operand);
278
+ let resolvedTargetSymbol = targetSymbol;
279
+ if (resolvedTargetSymbol && (resolvedTargetSymbol.flags & ts.SymbolFlags.Alias) !== 0) {
280
+ try {
281
+ resolvedTargetSymbol = checker?.getAliasedSymbol(resolvedTargetSymbol);
282
+ }
283
+ catch {
284
+ // ignore
285
+ }
286
+ }
287
+ if (isConstConditionalSentinelGuardedInAncestorScopes(node, operand, ts, checker)) {
288
+ return {
289
+ isGuarded: true,
290
+ evidence: "A const conditional sentinel is null exactly when the asserted operand is null, and its null guard exits control flow.",
291
+ };
292
+ }
293
+ let stmt = node;
294
+ while (stmt.parent && !ts.isBlock(stmt.parent) && !ts.isSourceFile(stmt.parent)) {
295
+ stmt = stmt.parent;
296
+ }
297
+ if (stmt.parent && (ts.isBlock(stmt.parent) || ts.isSourceFile(stmt.parent))) {
298
+ const statements = ts.isBlock(stmt.parent) ? stmt.parent.statements : stmt.parent.statements;
299
+ const targetIndex = statements.indexOf(stmt);
300
+ if (targetIndex > 0) {
301
+ if (isConstConditionalSentinelGuarded(operand, statements, targetIndex, ts, checker)) {
302
+ return {
303
+ isGuarded: true,
304
+ evidence: "A const conditional sentinel is null exactly when the asserted operand is null, and its null guard exits control flow.",
305
+ };
306
+ }
307
+ for (let i = 0; i < targetIndex; i++) {
308
+ const prior = statements[i];
309
+ if (!prior)
310
+ continue;
311
+ if (ts.isIfStatement(prior) && statementExitsControlFlow(prior.thenStatement, ts)) {
312
+ const cond = unwrapExpression(prior.expression, ts);
313
+ let isGuardMatched = false;
314
+ let evidenceStr = "";
315
+ // 1. if (!target) return;
316
+ if (ts.isPrefixUnaryExpression(cond) && cond.operator === ts.SyntaxKind.ExclamationToken) {
317
+ const inner = unwrapExpression(cond.operand, ts);
318
+ if (ts.isIdentifier(inner)) {
319
+ const innerSym = checker?.getSymbolAtLocation(inner);
320
+ let resolvedInnerSym = innerSym;
321
+ if (resolvedInnerSym && (resolvedInnerSym.flags & ts.SymbolFlags.Alias) !== 0) {
322
+ try {
323
+ resolvedInnerSym = checker?.getAliasedSymbol(resolvedInnerSym);
324
+ }
325
+ catch {
326
+ // ignore
327
+ }
328
+ }
329
+ const matchesSymbol = resolvedTargetSymbol && resolvedInnerSym
330
+ ? resolvedInnerSym === resolvedTargetSymbol
331
+ : inner.text === targetName;
332
+ if (matchesSymbol) {
333
+ isGuardMatched = true;
334
+ evidenceStr = `Dominating guard '!${targetName}' proves operand is non-null.`;
335
+ }
336
+ }
337
+ }
338
+ // 2. if (target === null || target === undefined || target == null) return;
339
+ if (!isGuardMatched && ts.isBinaryExpression(cond)) {
340
+ const left = unwrapExpression(cond.left, ts);
341
+ const right = unwrapExpression(cond.right, ts);
342
+ const op = cond.operatorToken.kind;
343
+ if (op === ts.SyntaxKind.EqualsEqualsEqualsToken ||
344
+ op === ts.SyntaxKind.EqualsEqualsToken) {
345
+ let targetSide;
346
+ let nullSide;
347
+ if (ts.isIdentifier(left)) {
348
+ targetSide = left;
349
+ nullSide = right;
350
+ }
351
+ else if (ts.isIdentifier(right)) {
352
+ targetSide = right;
353
+ nullSide = left;
354
+ }
355
+ if (targetSide && nullSide) {
356
+ const innerSym = checker?.getSymbolAtLocation(targetSide);
357
+ let resolvedInnerSym = innerSym;
358
+ if (resolvedInnerSym && (resolvedInnerSym.flags & ts.SymbolFlags.Alias) !== 0) {
359
+ try {
360
+ resolvedInnerSym = checker?.getAliasedSymbol(resolvedInnerSym);
361
+ }
362
+ catch {
363
+ // ignore
364
+ }
365
+ }
366
+ const matchesSymbol = resolvedTargetSymbol && resolvedInnerSym
367
+ ? resolvedInnerSym === resolvedTargetSymbol
368
+ : targetSide.text === targetName;
369
+ if (matchesSymbol &&
370
+ (nullSide.kind === ts.SyntaxKind.NullKeyword ||
371
+ nullSide.kind === ts.SyntaxKind.UndefinedKeyword ||
372
+ (ts.isIdentifier(nullSide) && nullSide.text === "undefined"))) {
373
+ isGuardMatched = true;
374
+ evidenceStr = `Dominating null check proves '${targetName}' is non-null.`;
375
+ }
376
+ }
377
+ }
378
+ }
379
+ if (isGuardMatched) {
380
+ // Invalidation check: verify target was NOT reassigned between guard and assertion!
381
+ let isReassigned = false;
382
+ for (let j = i + 1; j < targetIndex; j++) {
383
+ const s = statements[j];
384
+ if (s && hasVariableReassignment(s, targetName, resolvedTargetSymbol, ts, checker)) {
385
+ isReassigned = true;
386
+ break;
387
+ }
388
+ }
389
+ if (!isReassigned) {
390
+ const currentStmt = statements[targetIndex];
391
+ if (currentStmt && hasVariableReassignment(currentStmt, targetName, resolvedTargetSymbol, ts, checker, node.pos)) {
392
+ isReassigned = true;
393
+ }
394
+ }
395
+ if (!isReassigned) {
396
+ return {
397
+ isGuarded: true,
398
+ evidence: evidenceStr,
399
+ };
400
+ }
401
+ }
402
+ }
403
+ }
404
+ }
405
+ }
406
+ }
407
+ return { isGuarded: false };
408
+ }
409
+ //# sourceMappingURL=nonNullGuards.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nonNullGuards.js","sourceRoot":"","sources":["../../src/analysis/nonNullGuards.ts"],"names":[],"mappings":"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"}
@@ -31,6 +31,11 @@ export declare function hasTerminalRejectionHandling(expr: tsType.Expression, ts
31
31
  * - Detects and rejects overwrites: cached = load(); cached = null; return fallback;
32
32
  */
33
33
  export declare function isVariableTargetReturnedInScope(node: tsType.Node, targetName: string, ts: typeof tsType): boolean;
34
+ /**
35
+ * Verifies whether a Promise initialized in a variable declaration reaches a legitimate,
36
+ * provably safe consumption site on every execution continuation.
37
+ */
38
+ export declare function isPromiseVariableConsumedInScope(declNode: tsType.Node, targetIdent: tsType.Identifier, ts: typeof tsType, checker?: tsType.TypeChecker | undefined): boolean;
34
39
  export interface PromiseConsumptionResult {
35
40
  readonly isConsumed: boolean;
36
41
  readonly reason?: string | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"promiseFlow.d.ts","sourceRoot":"","sources":["../../src/analysis/promiseFlow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,MAAM,YAAY,CAAC;AAG1C,OAAO,EAGL,KAAK,sBAAsB,EAC5B,MAAM,gBAAgB,CAAC;AAGxB,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;IACpC,QAAQ,CAAC,sBAAsB,EAAE,OAAO,CAAC;CAC1C;AAID;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,CAAC,IAAI,GAAG,SAAS,EAC7B,OAAO,EAAE,MAAM,CAAC,WAAW,EAC3B,EAAE,EAAE,OAAO,MAAM,GAChB,qBAAqB,CA6CvB;AAQD;;;;;;;;;;;;GAYG;AACH,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,MAAM,CAAC,UAAU,EACvB,EAAE,EAAE,OAAO,MAAM,EACjB,OAAO,CAAC,EAAE,MAAM,CAAC,WAAW,GAAG,SAAS,GACvC,OAAO,CAuCT;AAED;;;;;;GAMG;AACH,wBAAgB,+BAA+B,CAC7C,IAAI,EAAE,MAAM,CAAC,IAAI,EACjB,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,OAAO,MAAM,GAChB,OAAO,CAqMT;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;CACtC;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,MAAM,CAAC,UAAU,EACvB,EAAE,EAAE,OAAO,MAAM,EACjB,OAAO,CAAC,EAAE,MAAM,CAAC,WAAW,GAAG,SAAS,EACxC,OAAO,CAAC,EAAE,sBAAsB,GAAG,SAAS,GAC3C,wBAAwB,CA8C1B"}
1
+ {"version":3,"file":"promiseFlow.d.ts","sourceRoot":"","sources":["../../src/analysis/promiseFlow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,MAAM,YAAY,CAAC;AAG1C,OAAO,EAGL,KAAK,sBAAsB,EAC5B,MAAM,gBAAgB,CAAC;AAGxB,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;IACpC,QAAQ,CAAC,sBAAsB,EAAE,OAAO,CAAC;CAC1C;AAID;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,CAAC,IAAI,GAAG,SAAS,EAC7B,OAAO,EAAE,MAAM,CAAC,WAAW,EAC3B,EAAE,EAAE,OAAO,MAAM,GAChB,qBAAqB,CA6CvB;AAQD;;;;;;;;;;;;GAYG;AACH,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,MAAM,CAAC,UAAU,EACvB,EAAE,EAAE,OAAO,MAAM,EACjB,OAAO,CAAC,EAAE,MAAM,CAAC,WAAW,GAAG,SAAS,GACvC,OAAO,CAuCT;AAED;;;;;;GAMG;AACH,wBAAgB,+BAA+B,CAC7C,IAAI,EAAE,MAAM,CAAC,IAAI,EACjB,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,OAAO,MAAM,GAChB,OAAO,CAqMT;AA0QD;;;GAGG;AACH,wBAAgB,gCAAgC,CAC9C,QAAQ,EAAE,MAAM,CAAC,IAAI,EACrB,WAAW,EAAE,MAAM,CAAC,UAAU,EAC9B,EAAE,EAAE,OAAO,MAAM,EACjB,OAAO,CAAC,EAAE,MAAM,CAAC,WAAW,GAAG,SAAS,GACvC,OAAO,CA+IT;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;CACtC;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,MAAM,CAAC,UAAU,EACvB,EAAE,EAAE,OAAO,MAAM,EACjB,OAAO,CAAC,EAAE,MAAM,CAAC,WAAW,GAAG,SAAS,EACxC,OAAO,CAAC,EAAE,sBAAsB,GAAG,SAAS,GAC3C,wBAAwB,CA8C1B"}