sourceverity 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +188 -0
- package/bin/sourceverity.js +12 -0
- package/dist/analysis/controlFlow.d.ts +10 -0
- package/dist/analysis/controlFlow.d.ts.map +1 -0
- package/dist/analysis/controlFlow.js +278 -0
- package/dist/analysis/controlFlow.js.map +1 -0
- package/dist/analysis/frameworks.d.ts +11 -0
- package/dist/analysis/frameworks.d.ts.map +1 -0
- package/dist/analysis/frameworks.js +189 -0
- package/dist/analysis/frameworks.js.map +1 -0
- package/dist/analysis/functions.d.ts +27 -0
- package/dist/analysis/functions.d.ts.map +1 -0
- package/dist/analysis/functions.js +628 -0
- package/dist/analysis/functions.js.map +1 -0
- package/dist/analysis/promiseFlow.d.ts +44 -0
- package/dist/analysis/promiseFlow.d.ts.map +1 -0
- package/dist/analysis/promiseFlow.js +261 -0
- package/dist/analysis/promiseFlow.js.map +1 -0
- package/dist/analysis/values.d.ts +24 -0
- package/dist/analysis/values.d.ts.map +1 -0
- package/dist/analysis/values.js +189 -0
- package/dist/analysis/values.js.map +1 -0
- package/dist/baseline/manager.d.ts +20 -0
- package/dist/baseline/manager.d.ts.map +1 -0
- package/dist/baseline/manager.js +77 -0
- package/dist/baseline/manager.js.map +1 -0
- package/dist/baseline/types.d.ts +20 -0
- package/dist/baseline/types.d.ts.map +1 -0
- package/dist/baseline/types.js +2 -0
- package/dist/baseline/types.js.map +1 -0
- package/dist/cli/args.d.ts +26 -0
- package/dist/cli/args.d.ts.map +1 -0
- package/dist/cli/args.js +126 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/exitCodes.d.ts +8 -0
- package/dist/cli/exitCodes.d.ts.map +1 -0
- package/dist/cli/exitCodes.js +7 -0
- package/dist/cli/exitCodes.js.map +1 -0
- package/dist/cli/help.d.ts +5 -0
- package/dist/cli/help.d.ts.map +1 -0
- package/dist/cli/help.js +46 -0
- package/dist/cli/help.js.map +1 -0
- package/dist/cli/main.d.ts +7 -0
- package/dist/cli/main.d.ts.map +1 -0
- package/dist/cli/main.js +156 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/core/fingerprint.d.ts +18 -0
- package/dist/core/fingerprint.d.ts.map +1 -0
- package/dist/core/fingerprint.js +26 -0
- package/dist/core/fingerprint.js.map +1 -0
- package/dist/core/paths.d.ts +10 -0
- package/dist/core/paths.d.ts.map +1 -0
- package/dist/core/paths.js +30 -0
- package/dist/core/paths.js.map +1 -0
- package/dist/core/suppressions.d.ts +24 -0
- package/dist/core/suppressions.d.ts.map +1 -0
- package/dist/core/suppressions.js +100 -0
- package/dist/core/suppressions.js.map +1 -0
- package/dist/core/terminal.d.ts +18 -0
- package/dist/core/terminal.d.ts.map +1 -0
- package/dist/core/terminal.js +39 -0
- package/dist/core/terminal.js.map +1 -0
- package/dist/core/types.d.ts +119 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/engine/context.d.ts +16 -0
- package/dist/engine/context.d.ts.map +1 -0
- package/dist/engine/context.js +57 -0
- package/dist/engine/context.js.map +1 -0
- package/dist/engine/registry.d.ts +26 -0
- package/dist/engine/registry.d.ts.map +1 -0
- package/dist/engine/registry.js +38 -0
- package/dist/engine/registry.js.map +1 -0
- package/dist/engine/runner.d.ts +14 -0
- package/dist/engine/runner.d.ts.map +1 -0
- package/dist/engine/runner.js +166 -0
- package/dist/engine/runner.js.map +1 -0
- package/dist/engine/symbols.d.ts +46 -0
- package/dist/engine/symbols.d.ts.map +1 -0
- package/dist/engine/symbols.js +278 -0
- package/dist/engine/symbols.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -0
- package/dist/reporters/agent.d.ts +45 -0
- package/dist/reporters/agent.d.ts.map +1 -0
- package/dist/reporters/agent.js +40 -0
- package/dist/reporters/agent.js.map +1 -0
- package/dist/reporters/json.d.ts +6 -0
- package/dist/reporters/json.d.ts.map +1 -0
- package/dist/reporters/json.js +7 -0
- package/dist/reporters/json.js.map +1 -0
- package/dist/reporters/sarif.d.ts +6 -0
- package/dist/reporters/sarif.d.ts.map +1 -0
- package/dist/reporters/sarif.js +60 -0
- package/dist/reporters/sarif.js.map +1 -0
- package/dist/reporters/terminal.d.ts +10 -0
- package/dist/reporters/terminal.d.ts.map +1 -0
- package/dist/reporters/terminal.js +105 -0
- package/dist/reporters/terminal.js.map +1 -0
- package/dist/repository/detector.d.ts +6 -0
- package/dist/repository/detector.d.ts.map +1 -0
- package/dist/repository/detector.js +231 -0
- package/dist/repository/detector.js.map +1 -0
- package/dist/repository/fileFilter.d.ts +10 -0
- package/dist/repository/fileFilter.d.ts.map +1 -0
- package/dist/repository/fileFilter.js +78 -0
- package/dist/repository/fileFilter.js.map +1 -0
- package/dist/repository/git.d.ts +7 -0
- package/dist/repository/git.d.ts.map +1 -0
- package/dist/repository/git.js +53 -0
- package/dist/repository/git.js.map +1 -0
- package/dist/repository/tsLoader.d.ts +15 -0
- package/dist/repository/tsLoader.d.ts.map +1 -0
- package/dist/repository/tsLoader.js +27 -0
- package/dist/repository/tsLoader.js.map +1 -0
- package/dist/repository/types.d.ts +38 -0
- package/dist/repository/types.d.ts.map +1 -0
- package/dist/repository/types.js +2 -0
- package/dist/repository/types.js.map +1 -0
- package/dist/rules/async/asyncForeach.d.ts +3 -0
- package/dist/rules/async/asyncForeach.d.ts.map +1 -0
- package/dist/rules/async/asyncForeach.js +76 -0
- package/dist/rules/async/asyncForeach.js.map +1 -0
- package/dist/rules/async/floatingPromise.d.ts +3 -0
- package/dist/rules/async/floatingPromise.d.ts.map +1 -0
- package/dist/rules/async/floatingPromise.js +359 -0
- package/dist/rules/async/floatingPromise.js.map +1 -0
- package/dist/rules/browser/eventListenerCleanup.d.ts +3 -0
- package/dist/rules/browser/eventListenerCleanup.d.ts.map +1 -0
- package/dist/rules/browser/eventListenerCleanup.js +378 -0
- package/dist/rules/browser/eventListenerCleanup.js.map +1 -0
- package/dist/rules/browser/observerCleanup.d.ts +3 -0
- package/dist/rules/browser/observerCleanup.d.ts.map +1 -0
- package/dist/rules/browser/observerCleanup.js +184 -0
- package/dist/rules/browser/observerCleanup.js.map +1 -0
- package/dist/rules/browser/timerCleanup.d.ts +3 -0
- package/dist/rules/browser/timerCleanup.d.ts.map +1 -0
- package/dist/rules/browser/timerCleanup.js +115 -0
- package/dist/rules/browser/timerCleanup.js.map +1 -0
- package/dist/rules/index.d.ts +19 -0
- package/dist/rules/index.d.ts.map +1 -0
- package/dist/rules/index.js +41 -0
- package/dist/rules/index.js.map +1 -0
- package/dist/rules/network/fetchStatusUnchecked.d.ts +3 -0
- package/dist/rules/network/fetchStatusUnchecked.d.ts.map +1 -0
- package/dist/rules/network/fetchStatusUnchecked.js +96 -0
- package/dist/rules/network/fetchStatusUnchecked.js.map +1 -0
- package/dist/rules/react/asyncEffectCallback.d.ts +3 -0
- package/dist/rules/react/asyncEffectCallback.d.ts.map +1 -0
- package/dist/rules/react/asyncEffectCallback.js +62 -0
- package/dist/rules/react/asyncEffectCallback.js.map +1 -0
- package/dist/rules/react/derivedStateEffect.d.ts +3 -0
- package/dist/rules/react/derivedStateEffect.d.ts.map +1 -0
- package/dist/rules/react/derivedStateEffect.js +172 -0
- package/dist/rules/react/derivedStateEffect.js.map +1 -0
- package/dist/rules/react/missingEffectCleanup.d.ts +3 -0
- package/dist/rules/react/missingEffectCleanup.d.ts.map +1 -0
- package/dist/rules/react/missingEffectCleanup.js +86 -0
- package/dist/rules/react/missingEffectCleanup.js.map +1 -0
- package/dist/rules/typescript/nonNullAssertionRisk.d.ts +3 -0
- package/dist/rules/typescript/nonNullAssertionRisk.d.ts.map +1 -0
- package/dist/rules/typescript/nonNullAssertionRisk.js +65 -0
- package/dist/rules/typescript/nonNullAssertionRisk.js.map +1 -0
- package/dist/rules/typescript/uncheckedIndexAccess.d.ts +3 -0
- package/dist/rules/typescript/uncheckedIndexAccess.d.ts.map +1 -0
- package/dist/rules/typescript/uncheckedIndexAccess.js +79 -0
- package/dist/rules/typescript/uncheckedIndexAccess.js.map +1 -0
- package/dist/rules/typescript/unsafeUnvalidatedAssertion.d.ts +3 -0
- package/dist/rules/typescript/unsafeUnvalidatedAssertion.d.ts.map +1 -0
- package/dist/rules/typescript/unsafeUnvalidatedAssertion.js +94 -0
- package/dist/rules/typescript/unsafeUnvalidatedAssertion.js.map +1 -0
- package/dist/strictness/evaluator.d.ts +28 -0
- package/dist/strictness/evaluator.d.ts.map +1 -0
- package/dist/strictness/evaluator.js +141 -0
- package/dist/strictness/evaluator.js.map +1 -0
- package/dist/strictness/matrix.d.ts +8 -0
- package/dist/strictness/matrix.d.ts.map +1 -0
- package/dist/strictness/matrix.js +63 -0
- package/dist/strictness/matrix.js.map +1 -0
- package/dist/typescript/programManager.d.ts +18 -0
- package/dist/typescript/programManager.d.ts.map +1 -0
- package/dist/typescript/programManager.js +46 -0
- package/dist/typescript/programManager.js.map +1 -0
- package/dist/typescript/projectResolver.d.ts +17 -0
- package/dist/typescript/projectResolver.d.ts.map +1 -0
- package/dist/typescript/projectResolver.js +75 -0
- package/dist/typescript/projectResolver.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import { unwrapExpression, resolveConstantValue } from "./values.js";
|
|
2
|
+
/**
|
|
3
|
+
* Checks if a property access or call argument contains `{ throwOnError: true }`.
|
|
4
|
+
*/
|
|
5
|
+
function hasThrowOnErrorOption(args, ts, checker) {
|
|
6
|
+
for (const arg of args) {
|
|
7
|
+
const unwrapped = unwrapExpression(arg, ts);
|
|
8
|
+
if (ts.isObjectLiteralExpression(unwrapped)) {
|
|
9
|
+
for (const prop of unwrapped.properties) {
|
|
10
|
+
if (ts.isPropertyAssignment(prop)) {
|
|
11
|
+
const propName = prop.name.getText();
|
|
12
|
+
if (propName === "throwOnError") {
|
|
13
|
+
const val = resolveConstantValue(prop.initializer, ts, checker);
|
|
14
|
+
if (val.isStatic && val.kind === "boolean" && val.value === true) {
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
if (prop.initializer.kind === ts.SyntaxKind.TrueKeyword) {
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Checks if an argument expression represents a callable function or callback.
|
|
29
|
+
*/
|
|
30
|
+
function isCallableArgument(arg, ts, checker) {
|
|
31
|
+
const unwrapped = unwrapExpression(arg, ts);
|
|
32
|
+
if (ts.isArrowFunction(unwrapped) || ts.isFunctionExpression(unwrapped)) {
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
if (checker) {
|
|
36
|
+
try {
|
|
37
|
+
const type = checker.getTypeAtLocation(unwrapped);
|
|
38
|
+
if (type.getCallSignatures().length > 0) {
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
// ignore
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Evaluates whether a CallExpression represents a verified, handled framework API call.
|
|
50
|
+
*/
|
|
51
|
+
export function evaluateFrameworkPromiseCall(callExpr, ts, checker) {
|
|
52
|
+
if (!checker)
|
|
53
|
+
return { isHandled: false };
|
|
54
|
+
const callee = unwrapExpression(callExpr.expression, ts);
|
|
55
|
+
let targetIdentifier;
|
|
56
|
+
let methodName = "";
|
|
57
|
+
if (ts.isPropertyAccessExpression(callee)) {
|
|
58
|
+
targetIdentifier = callee.name;
|
|
59
|
+
methodName = callee.name.text;
|
|
60
|
+
}
|
|
61
|
+
else if (ts.isIdentifier(callee)) {
|
|
62
|
+
targetIdentifier = callee;
|
|
63
|
+
methodName = callee.text;
|
|
64
|
+
}
|
|
65
|
+
if (!targetIdentifier)
|
|
66
|
+
return { isHandled: false };
|
|
67
|
+
const symbol = checker.getSymbolAtLocation(targetIdentifier);
|
|
68
|
+
if (!symbol)
|
|
69
|
+
return { isHandled: false };
|
|
70
|
+
let targetSymbol = symbol;
|
|
71
|
+
if (targetSymbol.flags & ts.SymbolFlags.Alias) {
|
|
72
|
+
try {
|
|
73
|
+
targetSymbol = checker.getAliasedSymbol(targetSymbol);
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
// ignore
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
const declarations = [...(targetSymbol?.getDeclarations() ?? [])];
|
|
80
|
+
// Also collect declarations from the type of the callee/target (e.g. NavigateFunction)
|
|
81
|
+
try {
|
|
82
|
+
const typeAtLoc = checker.getTypeAtLocation(targetIdentifier);
|
|
83
|
+
const typeSymbol = typeAtLoc.getSymbol() ?? typeAtLoc.aliasSymbol;
|
|
84
|
+
if (typeSymbol) {
|
|
85
|
+
let resolvedTypeSymbol = typeSymbol;
|
|
86
|
+
if (resolvedTypeSymbol.flags & ts.SymbolFlags.Alias) {
|
|
87
|
+
try {
|
|
88
|
+
resolvedTypeSymbol = checker.getAliasedSymbol(resolvedTypeSymbol);
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
// ignore
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
if (resolvedTypeSymbol?.name === "NavigateFunction") {
|
|
95
|
+
return {
|
|
96
|
+
isHandled: true,
|
|
97
|
+
reason: "React Router NavigateFunction optional navigation contract.",
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
const typeDecls = resolvedTypeSymbol?.getDeclarations();
|
|
101
|
+
if (typeDecls) {
|
|
102
|
+
declarations.push(...typeDecls);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
// ignore
|
|
108
|
+
}
|
|
109
|
+
if (declarations.length === 0)
|
|
110
|
+
return { isHandled: false };
|
|
111
|
+
for (const decl of declarations) {
|
|
112
|
+
const fileName = decl.getSourceFile().fileName.replace(/\\/g, "/");
|
|
113
|
+
// 1. TanStack Query / React Query: invalidateQueries, resetQueries, cancelQueries, removeQueries, refetchQueries
|
|
114
|
+
if (fileName.includes("@tanstack/query-core") ||
|
|
115
|
+
fileName.includes("@tanstack/react-query") ||
|
|
116
|
+
fileName.includes("react-query/")) {
|
|
117
|
+
if (methodName === "invalidateQueries" ||
|
|
118
|
+
methodName === "resetQueries" ||
|
|
119
|
+
methodName === "cancelQueries" ||
|
|
120
|
+
methodName === "removeQueries" ||
|
|
121
|
+
methodName === "refetchQueries" ||
|
|
122
|
+
methodName === "setQueryData") {
|
|
123
|
+
// If throwOnError: true is explicitly specified, the returned Promise will reject on query failure!
|
|
124
|
+
if (hasThrowOnErrorOption(callExpr.arguments, ts, checker)) {
|
|
125
|
+
return {
|
|
126
|
+
isHandled: false,
|
|
127
|
+
reason: "QueryClient method configured with throwOnError: true may reject unhandled.",
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
return {
|
|
131
|
+
isHandled: true,
|
|
132
|
+
reason: "TanStack Query default query management handles failures internally without unhandled rejection.",
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// 2. i18next: i18n.init(...)
|
|
137
|
+
const isI18next = fileName.includes("i18next/") ||
|
|
138
|
+
fileName.includes("i18next") ||
|
|
139
|
+
(decl.parent &&
|
|
140
|
+
(ts.isInterfaceDeclaration(decl.parent) || ts.isTypeAliasDeclaration(decl.parent)) &&
|
|
141
|
+
/^(i18n|i18next|I18n|I18nInstance)$/i.test(decl.parent.name.text));
|
|
142
|
+
if (isI18next) {
|
|
143
|
+
if (methodName === "init") {
|
|
144
|
+
// i18next init has two callback signatures:
|
|
145
|
+
// 1. i18n.init(callback) -> 1 argument where arg[0] is callable
|
|
146
|
+
// 2. i18n.init(options, callback) -> 2 arguments where arg[1] is callable
|
|
147
|
+
const args = callExpr.arguments;
|
|
148
|
+
const hasCallback = (args.length === 1 && args[0] !== undefined && isCallableArgument(args[0], ts, checker)) ||
|
|
149
|
+
(args.length >= 2 && args[1] !== undefined && isCallableArgument(args[1], ts, checker));
|
|
150
|
+
if (hasCallback) {
|
|
151
|
+
return {
|
|
152
|
+
isHandled: true,
|
|
153
|
+
reason: "i18next init called with error/completion callback handler.",
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
// Bare i18n.init(options) returns a Promise that can reject on init failure; must not be blanket-suppressed
|
|
157
|
+
return {
|
|
158
|
+
isHandled: false,
|
|
159
|
+
isKnownRejecting: true,
|
|
160
|
+
reason: "i18next 'init' returns a Promise that rejects on initialization failure, which will escape unhandled if not caught.",
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
// 3. React Hook Form: UseFormRegisterReturn.onChange / onBlur or ChangeHandler
|
|
165
|
+
if (fileName.includes("react-hook-form/")) {
|
|
166
|
+
if (methodName === "onChange" ||
|
|
167
|
+
methodName === "onBlur" ||
|
|
168
|
+
targetSymbol.name === "ChangeHandler") {
|
|
169
|
+
return {
|
|
170
|
+
isHandled: true,
|
|
171
|
+
reason: "React Hook Form synthetic change handler handles internal async validation safely.",
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
// 4. React Router / Remix: NavigateFunction
|
|
176
|
+
if (fileName.includes("react-router/") ||
|
|
177
|
+
fileName.includes("react-router-dom/") ||
|
|
178
|
+
fileName.includes("@remix-run/router/")) {
|
|
179
|
+
if (methodName === "navigate" || targetSymbol.name === "NavigateFunction") {
|
|
180
|
+
return {
|
|
181
|
+
isHandled: true,
|
|
182
|
+
reason: "React Router NavigateFunction optional navigation contract.",
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
return { isHandled: false };
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=frameworks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frameworks.js","sourceRoot":"","sources":["../../src/analysis/frameworks.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAQrE;;GAEG;AACH,SAAS,qBAAqB,CAC5B,IAAkC,EAClC,EAAiB,EACjB,OAA2B;IAE3B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC5C,IAAI,EAAE,CAAC,yBAAyB,CAAC,SAAS,CAAC,EAAE,CAAC;YAC5C,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,UAAU,EAAE,CAAC;gBACxC,IAAI,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;oBAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;oBACrC,IAAI,QAAQ,KAAK,cAAc,EAAE,CAAC;wBAChC,MAAM,GAAG,GAAG,oBAAoB,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;wBAChE,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,IAAI,GAAG,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;4BACjE,OAAO,IAAI,CAAC;wBACd,CAAC;wBACD,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC;4BACxD,OAAO,IAAI,CAAC;wBACd,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CACzB,GAAsB,EACtB,EAAiB,EACjB,OAAwC;IAExC,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC5C,IAAI,EAAE,CAAC,eAAe,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,oBAAoB,CAAC,SAAS,CAAC,EAAE,CAAC;QACxE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,OAAO,EAAE,CAAC;QACZ,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,OAAO,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YAClD,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxC,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,4BAA4B,CAC1C,QAA+B,EAC/B,EAAiB,EACjB,OAAwC;IAExC,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAE1C,MAAM,MAAM,GAAG,gBAAgB,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IACzD,IAAI,gBAAyC,CAAC;IAC9C,IAAI,UAAU,GAAG,EAAE,CAAC;IAEpB,IAAI,EAAE,CAAC,0BAA0B,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1C,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC;QAC/B,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;IAChC,CAAC;SAAM,IAAI,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;QACnC,gBAAgB,GAAG,MAAM,CAAC;QAC1B,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC;IAC3B,CAAC;IAED,IAAI,CAAC,gBAAgB;QAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAEnD,MAAM,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;IAC7D,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAEzC,IAAI,YAAY,GAA8B,MAAM,CAAC;IACrD,IAAI,YAAY,CAAC,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QAC9C,IAAI,CAAC;YACH,YAAY,GAAG,OAAO,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;QACxD,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;IAED,MAAM,YAAY,GAAG,CAAC,GAAG,CAAC,YAAY,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAElE,uFAAuF;IACvF,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,OAAO,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;QAC9D,MAAM,UAAU,GAAG,SAAS,CAAC,SAAS,EAAE,IAAI,SAAS,CAAC,WAAW,CAAC;QAClE,IAAI,UAAU,EAAE,CAAC;YACf,IAAI,kBAAkB,GAA8B,UAAU,CAAC;YAC/D,IAAI,kBAAkB,CAAC,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;gBACpD,IAAI,CAAC;oBACH,kBAAkB,GAAG,OAAO,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,CAAC;gBACpE,CAAC;gBAAC,MAAM,CAAC;oBACP,SAAS;gBACX,CAAC;YACH,CAAC;YACD,IAAI,kBAAkB,EAAE,IAAI,KAAK,kBAAkB,EAAE,CAAC;gBACpD,OAAO;oBACL,SAAS,EAAE,IAAI;oBACf,MAAM,EAAE,6DAA6D;iBACtE,CAAC;YACJ,CAAC;YACD,MAAM,SAAS,GAAG,kBAAkB,EAAE,eAAe,EAAE,CAAC;YACxD,IAAI,SAAS,EAAE,CAAC;gBACd,YAAY,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,SAAS;IACX,CAAC;IAED,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAE3D,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAEnE,iHAAiH;QACjH,IACE,QAAQ,CAAC,QAAQ,CAAC,sBAAsB,CAAC;YACzC,QAAQ,CAAC,QAAQ,CAAC,uBAAuB,CAAC;YAC1C,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,EACjC,CAAC;YACD,IACE,UAAU,KAAK,mBAAmB;gBAClC,UAAU,KAAK,cAAc;gBAC7B,UAAU,KAAK,eAAe;gBAC9B,UAAU,KAAK,eAAe;gBAC9B,UAAU,KAAK,gBAAgB;gBAC/B,UAAU,KAAK,cAAc,EAC7B,CAAC;gBACD,oGAAoG;gBACpG,IAAI,qBAAqB,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,CAAC;oBAC3D,OAAO;wBACL,SAAS,EAAE,KAAK;wBAChB,MAAM,EAAE,6EAA6E;qBACtF,CAAC;gBACJ,CAAC;gBAED,OAAO;oBACL,SAAS,EAAE,IAAI;oBACf,MAAM,EAAE,kGAAkG;iBAC3G,CAAC;YACJ,CAAC;QACH,CAAC;QAED,6BAA6B;QAC7B,MAAM,SAAS,GACb,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC;YAC7B,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC;YAC5B,CAAC,IAAI,CAAC,MAAM;gBACV,CAAC,EAAE,CAAC,sBAAsB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,sBAAsB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAClF,qCAAqC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAEvE,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;gBAC1B,4CAA4C;gBAC5C,gEAAgE;gBAChE,0EAA0E;gBAC1E,MAAM,IAAI,GAAG,QAAQ,CAAC,SAAS,CAAC;gBAChC,MAAM,WAAW,GACf,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;oBACxF,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;gBAE1F,IAAI,WAAW,EAAE,CAAC;oBAChB,OAAO;wBACL,SAAS,EAAE,IAAI;wBACf,MAAM,EAAE,6DAA6D;qBACtE,CAAC;gBACJ,CAAC;gBACD,4GAA4G;gBAC5G,OAAO;oBACL,SAAS,EAAE,KAAK;oBAChB,gBAAgB,EAAE,IAAI;oBACtB,MAAM,EAAE,qHAAqH;iBAC9H,CAAC;YACJ,CAAC;QACH,CAAC;QAED,+EAA+E;QAC/E,IAAI,QAAQ,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAC1C,IACE,UAAU,KAAK,UAAU;gBACzB,UAAU,KAAK,QAAQ;gBACvB,YAAY,CAAC,IAAI,KAAK,eAAe,EACrC,CAAC;gBACD,OAAO;oBACL,SAAS,EAAE,IAAI;oBACf,MAAM,EAAE,oFAAoF;iBAC7F,CAAC;YACJ,CAAC;QACH,CAAC;QAED,4CAA4C;QAC5C,IACE,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC;YAClC,QAAQ,CAAC,QAAQ,CAAC,mBAAmB,CAAC;YACtC,QAAQ,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EACvC,CAAC;YACD,IAAI,UAAU,KAAK,UAAU,IAAI,YAAY,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;gBAC1E,OAAO;oBACL,SAAS,EAAE,IAAI;oBACf,MAAM,EAAE,6DAA6D;iBACtE,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type * as tsType from "typescript";
|
|
2
|
+
export type PromiseBehavior = "handles-known-rejections" | "propagates" | "may-reject" | "unknown";
|
|
3
|
+
export interface FunctionSummary {
|
|
4
|
+
readonly symbol?: tsType.Symbol | undefined;
|
|
5
|
+
readonly isAsync: boolean;
|
|
6
|
+
readonly returnsPromiseLike: boolean;
|
|
7
|
+
readonly returnsOptionalPromiseUnion: boolean;
|
|
8
|
+
readonly promiseBehavior: PromiseBehavior;
|
|
9
|
+
readonly returnsCreatedPromise: boolean;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Context for managing function summary analysis, caching, and recursion cycle detection.
|
|
13
|
+
*/
|
|
14
|
+
export declare class FunctionSummaryContext {
|
|
15
|
+
readonly ts: typeof tsType;
|
|
16
|
+
readonly checker?: tsType.TypeChecker | undefined;
|
|
17
|
+
private readonly cache;
|
|
18
|
+
private readonly inProgress;
|
|
19
|
+
constructor(ts: typeof tsType, checker?: tsType.TypeChecker | undefined);
|
|
20
|
+
getSummary(funcNode: tsType.Node): FunctionSummary;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Public helper to obtain a function summary (creates or reuses a context).
|
|
24
|
+
*/
|
|
25
|
+
export declare function getFunctionSummary(funcNode: tsType.Node, ts: typeof tsType, checker?: tsType.TypeChecker | undefined, context?: FunctionSummaryContext | undefined): FunctionSummary;
|
|
26
|
+
export declare function resolveLocalOrProjectFunctionDeclaration(callExpr: tsType.CallExpression, ts: typeof tsType, checker?: tsType.TypeChecker | undefined): tsType.Node | undefined;
|
|
27
|
+
//# sourceMappingURL=functions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"functions.d.ts","sourceRoot":"","sources":["../../src/analysis/functions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,MAAM,YAAY,CAAC;AAI1C,MAAM,MAAM,eAAe,GACvB,0BAA0B,GAC1B,YAAY,GACZ,YAAY,GACZ,SAAS,CAAC;AAEd,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC;IAC5C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;IACrC,QAAQ,CAAC,2BAA2B,EAAE,OAAO,CAAC;IAC9C,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;IAC1C,QAAQ,CAAC,qBAAqB,EAAE,OAAO,CAAC;CACzC;AAED;;GAEG;AACH,qBAAa,sBAAsB;IAK/B,QAAQ,CAAC,EAAE,EAAE,OAAO,MAAM;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,WAAW,GAAG,SAAS;IALnD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA2C;IACjE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA0B;gBAG1C,EAAE,EAAE,OAAO,MAAM,EACjB,OAAO,CAAC,EAAE,MAAM,CAAC,WAAW,GAAG,SAAS;IAGnD,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,GAAG,eAAe;CAwBnD;AAwfD;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,CAAC,IAAI,EACrB,EAAE,EAAE,OAAO,MAAM,EACjB,OAAO,CAAC,EAAE,MAAM,CAAC,WAAW,GAAG,SAAS,EACxC,OAAO,CAAC,EAAE,sBAAsB,GAAG,SAAS,GAC3C,eAAe,CAgBjB;AAwCD,wBAAgB,wCAAwC,CACtD,QAAQ,EAAE,MAAM,CAAC,cAAc,EAC/B,EAAE,EAAE,OAAO,MAAM,EACjB,OAAO,CAAC,EAAE,MAAM,CAAC,WAAW,GAAG,SAAS,GACvC,MAAM,CAAC,IAAI,GAAG,SAAS,CAgBzB"}
|