cognium-dev 4.9.8 → 4.9.10

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 (2) hide show
  1. package/dist/cli.js +280 -190
  2. package/package.json +3 -3
package/dist/cli.js CHANGED
@@ -3232,7 +3232,7 @@ var Query = class {
3232
3232
  }
3233
3233
  };
3234
3234
 
3235
- // ../circle-ir/dist/core/parser.js
3235
+ // node_modules/circle-ir/dist/core/parser.js
3236
3236
  var nodeModules = null;
3237
3237
  var moduleDir = null;
3238
3238
  async function getNodeModules() {
@@ -3472,7 +3472,7 @@ async function getDefaultLanguagePath(language) {
3472
3472
  }
3473
3473
  return `wasm/tree-sitter-${language}.wasm`;
3474
3474
  }
3475
- // ../circle-ir/dist/core/extractors/meta.js
3475
+ // node_modules/circle-ir/dist/core/extractors/meta.js
3476
3476
  function extractMeta(code, tree, filePath, language) {
3477
3477
  const loc = countLinesOfCode(code);
3478
3478
  const hash = computeHash(code);
@@ -3554,7 +3554,7 @@ function extractPackage(tree, language) {
3554
3554
  }
3555
3555
  return null;
3556
3556
  }
3557
- // ../circle-ir/dist/core/extractors/types.js
3557
+ // node_modules/circle-ir/dist/core/extractors/types.js
3558
3558
  function detectLanguage(tree) {
3559
3559
  const root = tree.rootNode;
3560
3560
  const jsNodeTypes = new Set([
@@ -5222,7 +5222,7 @@ function findChildByType(node, type) {
5222
5222
  }
5223
5223
  return null;
5224
5224
  }
5225
- // ../circle-ir/dist/core/extractors/calls.js
5225
+ // node_modules/circle-ir/dist/core/extractors/calls.js
5226
5226
  function detectLanguageFromTree(tree, cache) {
5227
5227
  const rustStructs = getNodesFromCache(tree.rootNode, "struct_item", cache);
5228
5228
  const rustImpls = getNodesFromCache(tree.rootNode, "impl_item", cache);
@@ -7274,7 +7274,7 @@ function extractGoTypeLastSegment(typeNode) {
7274
7274
  }
7275
7275
  return null;
7276
7276
  }
7277
- // ../circle-ir/dist/core/extractors/imports.js
7277
+ // node_modules/circle-ir/dist/core/extractors/imports.js
7278
7278
  function detectLanguage2(tree) {
7279
7279
  const root = tree.rootNode;
7280
7280
  const jsNodeTypes = new Set([
@@ -7961,7 +7961,7 @@ function findGoChildByType(node, type) {
7961
7961
  }
7962
7962
  return null;
7963
7963
  }
7964
- // ../circle-ir/dist/core/extractors/exports.js
7964
+ // node_modules/circle-ir/dist/core/extractors/exports.js
7965
7965
  function extractExports(types) {
7966
7966
  const exports = [];
7967
7967
  for (const type of types) {
@@ -8014,7 +8014,7 @@ function getVisibilityFromModifiers(modifiers) {
8014
8014
  }
8015
8015
  return "package";
8016
8016
  }
8017
- // ../circle-ir/dist/core/extractors/cfg.js
8017
+ // node_modules/circle-ir/dist/core/extractors/cfg.js
8018
8018
  function detectLanguage3(tree) {
8019
8019
  const root = tree.rootNode;
8020
8020
  const jsNodeTypes = new Set([
@@ -8663,7 +8663,7 @@ function isGoStatement(node) {
8663
8663
  ]);
8664
8664
  return goStatementTypes.has(node.type);
8665
8665
  }
8666
- // ../circle-ir/dist/core/extractors/dfg.js
8666
+ // node_modules/circle-ir/dist/core/extractors/dfg.js
8667
8667
  function detectLanguage4(tree) {
8668
8668
  const root = tree.rootNode;
8669
8669
  const jsNodeTypes = new Set([
@@ -10184,7 +10184,7 @@ function extractGoAddressableVarName(node) {
10184
10184
  }
10185
10185
  return null;
10186
10186
  }
10187
- // ../circle-ir/dist/core/extractors/runtime-registrations.js
10187
+ // node_modules/circle-ir/dist/core/extractors/runtime-registrations.js
10188
10188
  var HTTP_VERB_METHODS = new Set([
10189
10189
  "get",
10190
10190
  "post",
@@ -10932,7 +10932,7 @@ function parseDistributedSliceAttribute(attrItem) {
10932
10932
  }
10933
10933
  };
10934
10934
  }
10935
- // ../circle-ir/dist/analysis/config-loader.js
10935
+ // node_modules/circle-ir/dist/analysis/config-loader.js
10936
10936
  var DEFAULT_SOURCES = [
10937
10937
  { method: "getParameter", class: "HttpServletRequest", type: "http_param", severity: "high", return_tainted: true },
10938
10938
  { method: "getParameterValues", class: "HttpServletRequest", type: "http_param", severity: "high", return_tainted: true },
@@ -13011,7 +13011,7 @@ var DEFAULT_HEADER_RULES = [
13011
13011
  note: "Fires when the value is not a string literal (likely reflected from request)"
13012
13012
  }
13013
13013
  ];
13014
- // ../circle-ir/dist/analysis/arg-type-resolver.js
13014
+ // node_modules/circle-ir/dist/analysis/arg-type-resolver.js
13015
13015
  function findEnclosingType(callInMethod, types) {
13016
13016
  if (!callInMethod)
13017
13017
  return null;
@@ -13089,7 +13089,7 @@ function isArgvContainerType(rawType) {
13089
13089
  return /^(?:List|ArrayList|LinkedList|Collection|Iterable|Deque|Queue)\s*<\s*(?:String|CharSequence|java\.lang\.String)\b/.test(s);
13090
13090
  }
13091
13091
 
13092
- // ../circle-ir/dist/analysis/taint-matcher.js
13092
+ // node_modules/circle-ir/dist/analysis/taint-matcher.js
13093
13093
  var PYTHON_TAINTED_PATTERNS = [
13094
13094
  { pattern: /\brequest\.args\b/, sourceType: "http_param" },
13095
13095
  { pattern: /\brequest\.form\b/, sourceType: "http_body" },
@@ -13764,17 +13764,27 @@ function isSafeCSharpProcessStartCall(call, pattern, language, sourceLines) {
13764
13764
  function stripCsLiterals(line) {
13765
13765
  return line.replace(/\/\/.*$/, "").replace(/@?"(?:[^"\\]|\\.)*"/g, '""').replace(/'(?:[^'\\]|\\.)'/g, "''");
13766
13766
  }
13767
+ var _csDepthLines;
13768
+ var _csDepthPrefix;
13767
13769
  function csBraceDepthBefore(lines, idx) {
13768
- let depth = 0;
13769
- for (let i2 = 0;i2 < idx && i2 < lines.length; i2++) {
13770
- for (const ch of stripCsLiterals(lines[i2])) {
13771
- if (ch === "{")
13772
- depth++;
13773
- else if (ch === "}")
13774
- depth--;
13770
+ if (lines !== _csDepthLines) {
13771
+ const pref = new Int32Array(lines.length + 1);
13772
+ let depth = 0;
13773
+ for (let i2 = 0;i2 < lines.length; i2++) {
13774
+ pref[i2] = depth;
13775
+ for (const ch of stripCsLiterals(lines[i2])) {
13776
+ if (ch === "{")
13777
+ depth++;
13778
+ else if (ch === "}")
13779
+ depth--;
13780
+ }
13775
13781
  }
13782
+ pref[lines.length] = depth;
13783
+ _csDepthLines = lines;
13784
+ _csDepthPrefix = pref;
13776
13785
  }
13777
- return depth;
13786
+ const clamped = idx < 0 ? 0 : idx > lines.length ? lines.length : idx;
13787
+ return _csDepthPrefix[clamped];
13778
13788
  }
13779
13789
  function netBraces(fragment) {
13780
13790
  let n = 0;
@@ -13885,6 +13895,33 @@ function csThenBlock(lines, ifIdx, rest) {
13885
13895
  }
13886
13896
  return { start: ifIdx, end: firstIdx, earlyExit: isExit(firstText.trim()) };
13887
13897
  }
13898
+ var _csGuardLines;
13899
+ var _csGuardMap;
13900
+ function csEqualityGuardIndex(lines) {
13901
+ if (lines === _csGuardLines && _csGuardMap)
13902
+ return _csGuardMap;
13903
+ const map = new Map;
13904
+ for (let i2 = 0;i2 < lines.length; i2++) {
13905
+ const parts2 = splitCsIf(lines[i2]);
13906
+ if (!parts2)
13907
+ continue;
13908
+ const guard = csEqualityGuard(parts2.cond);
13909
+ if (!guard)
13910
+ continue;
13911
+ const entry = { i: i2, rest: parts2.rest, ifCol: parts2.ifCol, op: guard.op };
13912
+ for (const id of csIdentifiers(guard.exprSide)) {
13913
+ let arr = map.get(id);
13914
+ if (!arr) {
13915
+ arr = [];
13916
+ map.set(id, arr);
13917
+ }
13918
+ arr.push(entry);
13919
+ }
13920
+ }
13921
+ _csGuardLines = lines;
13922
+ _csGuardMap = map;
13923
+ return map;
13924
+ }
13888
13925
  function isCSharpSsrfHostAllowlistGuarded(call, pattern, language, sourceLines) {
13889
13926
  if (language !== "csharp")
13890
13927
  return false;
@@ -13903,24 +13940,25 @@ function isCSharpSsrfHostAllowlistGuarded(call, pattern, language, sourceLines)
13903
13940
  return false;
13904
13941
  const sinkIdx = call.location.line - 1;
13905
13942
  const sinkDepth = csBraceDepthBefore(sourceLines, sinkIdx);
13906
- for (let i2 = 0;i2 < sinkIdx; i2++) {
13907
- const parts2 = splitCsIf(sourceLines[i2]);
13908
- if (!parts2)
13909
- continue;
13910
- const guard = csEqualityGuard(parts2.cond);
13911
- if (!guard)
13912
- continue;
13913
- const guardIds = csIdentifiers(guard.exprSide);
13914
- if (![...guardIds].some((id) => candidates.has(id)))
13915
- continue;
13916
- const block = csThenBlock(sourceLines, i2, parts2.rest);
13917
- if (guard.op === "==") {
13918
- if (sinkIdx >= block.start && sinkIdx <= block.end)
13919
- return true;
13920
- } else {
13921
- const guardDepth = csBraceDepthBefore(sourceLines, i2) + netBraces(stripCsLiterals(sourceLines[i2]).slice(0, parts2.ifCol));
13922
- if (block.earlyExit && sinkIdx > block.end && guardDepth === sinkDepth) {
13923
- return true;
13943
+ const guardMap = csEqualityGuardIndex(sourceLines);
13944
+ const checked = new Set;
13945
+ for (const cand of candidates) {
13946
+ const guards = guardMap.get(cand);
13947
+ if (!guards)
13948
+ continue;
13949
+ for (const g of guards) {
13950
+ if (g.i >= sinkIdx || checked.has(g))
13951
+ continue;
13952
+ checked.add(g);
13953
+ const block = csThenBlock(sourceLines, g.i, g.rest);
13954
+ if (g.op === "==") {
13955
+ if (sinkIdx >= block.start && sinkIdx <= block.end)
13956
+ return true;
13957
+ } else {
13958
+ const guardDepth = csBraceDepthBefore(sourceLines, g.i) + netBraces(stripCsLiterals(sourceLines[g.i]).slice(0, g.ifCol));
13959
+ if (block.earlyExit && sinkIdx > block.end && guardDepth === sinkDepth) {
13960
+ return true;
13961
+ }
13924
13962
  }
13925
13963
  }
13926
13964
  }
@@ -15056,7 +15094,7 @@ function formatSanitizerMethod(call) {
15056
15094
  return `${call.method_name}()`;
15057
15095
  }
15058
15096
 
15059
- // ../circle-ir/dist/analysis/unresolved.js
15097
+ // node_modules/circle-ir/dist/analysis/unresolved.js
15060
15098
  function detectUnresolved(calls, types, dfg) {
15061
15099
  const unresolved = [];
15062
15100
  unresolved.push(...detectVirtualDispatch(calls));
@@ -15220,7 +15258,7 @@ function formatCallCode(call) {
15220
15258
  }
15221
15259
  return `${call.method_name}(${args2})`;
15222
15260
  }
15223
- // ../circle-ir/dist/analysis/non-executable-lines.js
15261
+ // node_modules/circle-ir/dist/analysis/non-executable-lines.js
15224
15262
  function isNonExecutableSourceLine(sourceCode, line, language) {
15225
15263
  if (!sourceCode || line < 1)
15226
15264
  return false;
@@ -15280,7 +15318,7 @@ function isNonExecutablePython(trimmed) {
15280
15318
  return false;
15281
15319
  }
15282
15320
 
15283
- // ../circle-ir/dist/analysis/sanitizer-index.js
15321
+ // node_modules/circle-ir/dist/analysis/sanitizer-index.js
15284
15322
  var SANITIZER_SET_CACHE = new WeakMap;
15285
15323
  function getSanitizesSet(san) {
15286
15324
  let s = SANITIZER_SET_CACHE.get(san);
@@ -15294,7 +15332,7 @@ function sanitizerCoversSink(san, sinkType) {
15294
15332
  return getSanitizesSet(san).has(sinkType);
15295
15333
  }
15296
15334
 
15297
- // ../circle-ir/dist/analysis/dfg-walk.js
15335
+ // node_modules/circle-ir/dist/analysis/dfg-walk.js
15298
15336
  var walkBackwardDefsMemo = new WeakMap;
15299
15337
  function walkBackwardDefs(startDefId, chainsByToDef, defById, options = {}) {
15300
15338
  const maxHops = options.maxHops ?? 32;
@@ -15347,7 +15385,7 @@ function walkBackwardDefs(startDefId, chainsByToDef, defById, options = {}) {
15347
15385
  return result;
15348
15386
  }
15349
15387
 
15350
- // ../circle-ir/dist/analysis/findings.js
15388
+ // node_modules/circle-ir/dist/analysis/findings.js
15351
15389
  function canSourceReachSink(sourceType, sinkType) {
15352
15390
  const sourceToSinkMapping = {
15353
15391
  http_param: ["sql_injection", "command_injection", "path_traversal", "xss", "xpath_injection", "ldap_injection", "ssrf", "mybatis_mapper_call", "code_injection", "crlf", "mass_assignment", "open_redirect", "trust_boundary", "deserialization", "log_injection", "format_string", "nosql_injection", "prompt_injection"],
@@ -15378,7 +15416,7 @@ function sourceSemanticsAllowed(source, sinkType) {
15378
15416
  return true;
15379
15417
  }
15380
15418
 
15381
- // ../circle-ir/dist/analysis/findings-instrumentation.js
15419
+ // node_modules/circle-ir/dist/analysis/findings-instrumentation.js
15382
15420
  var instrumentEnabled = false;
15383
15421
  function setFindingsInstrumentation(enabled) {
15384
15422
  instrumentEnabled = enabled;
@@ -15441,7 +15479,7 @@ function emitFindingsInstrumentation(filePath, findings, taint) {
15441
15479
  };
15442
15480
  console.error(`[findings-summary] ${JSON.stringify(summary)}`);
15443
15481
  }
15444
- // ../circle-ir/dist/graph/code-graph.js
15482
+ // node_modules/circle-ir/dist/graph/code-graph.js
15445
15483
  class CodeGraph {
15446
15484
  ir;
15447
15485
  constructor(ir) {
@@ -15651,7 +15689,7 @@ class CodeGraph {
15651
15689
  return result;
15652
15690
  }
15653
15691
  }
15654
- // ../circle-ir/dist/resolution/type-hierarchy.js
15692
+ // node_modules/circle-ir/dist/resolution/type-hierarchy.js
15655
15693
  class TypeHierarchyResolver {
15656
15694
  types = new Map;
15657
15695
  nameToFqn = new Map;
@@ -16223,7 +16261,7 @@ function registerCommonLibraries(resolver) {
16223
16261
  resolver.registerFactoryReturnType("HttpClients", "createSystem", "org.apache.http.impl.client.CloseableHttpClient");
16224
16262
  resolver.registerFactoryReturnType("HttpClients", "createMinimal", "org.apache.http.impl.client.MinimalHttpClient");
16225
16263
  }
16226
- // ../circle-ir/dist/resolution/symbol-table.js
16264
+ // node_modules/circle-ir/dist/resolution/symbol-table.js
16227
16265
  class SymbolTable {
16228
16266
  exports = new Map;
16229
16267
  nameToFqns = new Map;
@@ -16446,7 +16484,7 @@ class SymbolTable {
16446
16484
  return "package";
16447
16485
  }
16448
16486
  }
16449
- // ../circle-ir/dist/resolution/cross-file.js
16487
+ // node_modules/circle-ir/dist/resolution/cross-file.js
16450
16488
  function buildFileIndex(ir) {
16451
16489
  const callsByLine = new Map;
16452
16490
  for (const c of ir.calls) {
@@ -17534,7 +17572,7 @@ class CrossFileResolver {
17534
17572
  return this.fieldTaintInfo.get(`${typeFqn}.${fieldName}`);
17535
17573
  }
17536
17574
  }
17537
- // ../circle-ir/dist/graph/project-graph.js
17575
+ // node_modules/circle-ir/dist/graph/project-graph.js
17538
17576
  class ProjectGraph {
17539
17577
  files = new Map;
17540
17578
  _symbolTable = null;
@@ -17586,7 +17624,7 @@ class ProjectGraph {
17586
17624
  return this._resolver;
17587
17625
  }
17588
17626
  }
17589
- // ../circle-ir/dist/graph/analysis-pass.js
17627
+ // node_modules/circle-ir/dist/graph/analysis-pass.js
17590
17628
  class AnalysisPipeline {
17591
17629
  passes = [];
17592
17630
  add(pass) {
@@ -17633,7 +17671,7 @@ class AnalysisPipeline {
17633
17671
  return { results, findings };
17634
17672
  }
17635
17673
  }
17636
- // ../circle-ir/dist/analysis/taint-propagation.js
17674
+ // node_modules/circle-ir/dist/analysis/taint-propagation.js
17637
17675
  function buildSanitizersByLine(sanitizers) {
17638
17676
  const out2 = new Map;
17639
17677
  for (const san of sanitizers) {
@@ -17932,7 +17970,7 @@ function buildTaintFlow(source, sink, taintInfo) {
17932
17970
  confidence: taintInfo.confidence * 0.9
17933
17971
  };
17934
17972
  }
17935
- // ../circle-ir/dist/analysis/constant-propagation/ast-utils.js
17973
+ // node_modules/circle-ir/dist/analysis/constant-propagation/ast-utils.js
17936
17974
  function isKnown(cv) {
17937
17975
  return cv.type !== "unknown";
17938
17976
  }
@@ -17949,7 +17987,7 @@ function getNodeLine(node) {
17949
17987
  return node.startPosition.row + 1;
17950
17988
  }
17951
17989
 
17952
- // ../circle-ir/dist/analysis/constant-propagation/evaluator.js
17990
+ // node_modules/circle-ir/dist/analysis/constant-propagation/evaluator.js
17953
17991
  class ExpressionEvaluator {
17954
17992
  source;
17955
17993
  getSymbol;
@@ -18219,7 +18257,7 @@ class ExpressionEvaluator {
18219
18257
  }
18220
18258
  }
18221
18259
 
18222
- // ../circle-ir/dist/analysis/constant-propagation/patterns.js
18260
+ // node_modules/circle-ir/dist/analysis/constant-propagation/patterns.js
18223
18261
  var TAINT_PATTERNS = [
18224
18262
  "request.getParameter",
18225
18263
  "request.getHeader",
@@ -18414,7 +18452,7 @@ var PROPAGATOR_METHODS = new Set([
18414
18452
  "decodeRequestString"
18415
18453
  ]);
18416
18454
 
18417
- // ../circle-ir/dist/analysis/constant-propagation/propagator.js
18455
+ // node_modules/circle-ir/dist/analysis/constant-propagation/propagator.js
18418
18456
  class ConstantPropagator {
18419
18457
  symbols = new Map;
18420
18458
  tainted = new Set;
@@ -20271,7 +20309,7 @@ class ConstantPropagator {
20271
20309
  }
20272
20310
  }
20273
20311
 
20274
- // ../circle-ir/dist/analysis/constant-propagation/index.js
20312
+ // node_modules/circle-ir/dist/analysis/constant-propagation/index.js
20275
20313
  function analyzeConstantPropagation(tree, sourceCode, options = {}) {
20276
20314
  const propagator = new ConstantPropagator;
20277
20315
  return propagator.analyze(tree, sourceCode, options.additionalTaintPatterns ?? [], options.sanitizerMethods ?? [], options.taintedParameters ?? []);
@@ -20359,7 +20397,7 @@ function normalizeCondition(cond) {
20359
20397
  }
20360
20398
  return normalized;
20361
20399
  }
20362
- // ../circle-ir/dist/utils/logger.js
20400
+ // node_modules/circle-ir/dist/utils/logger.js
20363
20401
  var LOG_LEVELS = {
20364
20402
  trace: 0,
20365
20403
  debug: 1,
@@ -20431,7 +20469,7 @@ var logger = {
20431
20469
  }
20432
20470
  };
20433
20471
 
20434
- // ../circle-ir/dist/analysis/per-file-finding-cap.js
20472
+ // node_modules/circle-ir/dist/analysis/per-file-finding-cap.js
20435
20473
  var DEFAULT_PER_FILE_FINDING_CAP = 1000;
20436
20474
  var SATURATED_FILE_RULE_ID = "saturated-file";
20437
20475
  function applyPerFileFindingCap(filePath, findings, cap) {
@@ -20467,7 +20505,7 @@ function applyPerFileFindingCap(filePath, findings, cap) {
20467
20505
  return [advisory];
20468
20506
  }
20469
20507
 
20470
- // ../circle-ir/dist/analysis/confidence-filter.js
20508
+ // node_modules/circle-ir/dist/analysis/confidence-filter.js
20471
20509
  function applyConfidenceFilter(findings, includeSpeculative) {
20472
20510
  if (includeSpeculative)
20473
20511
  return findings;
@@ -20477,7 +20515,7 @@ function isHighConfidence(finding) {
20477
20515
  return finding.confidence === undefined || finding.confidence === "high";
20478
20516
  }
20479
20517
 
20480
- // ../circle-ir/dist/analysis/library-api-surface-downgrade.js
20518
+ // node_modules/circle-ir/dist/analysis/library-api-surface-downgrade.js
20481
20519
  var LIBRARY_API_SURFACE_TAG = "library-api-surface:caller-responsibility";
20482
20520
  function applyLibraryApiSurfaceDowngrade(findings) {
20483
20521
  return findings.map((f) => {
@@ -20494,7 +20532,7 @@ function applyLibraryApiSurfaceDowngrade(findings) {
20494
20532
  });
20495
20533
  }
20496
20534
 
20497
- // ../circle-ir/dist/analysis/note-coalescer.js
20535
+ // node_modules/circle-ir/dist/analysis/note-coalescer.js
20498
20536
  var CLICKJACKING_PAIR = new Set(["missing-x-frame-options", "missing-csp-frame-ancestors"]);
20499
20537
  function levelRank(level) {
20500
20538
  return level === "error" ? 0 : level === "warning" ? 1 : 2;
@@ -20558,7 +20596,7 @@ function coalesceNoteLevelFindings(findings) {
20558
20596
  return out2;
20559
20597
  }
20560
20598
 
20561
- // ../circle-ir/dist/analysis/entry-point-detection.js
20599
+ // node_modules/circle-ir/dist/analysis/entry-point-detection.js
20562
20600
  var TIER_1_METHOD_ANNOTATIONS = new Set([
20563
20601
  "RequestMapping",
20564
20602
  "GetMapping",
@@ -21215,7 +21253,7 @@ function methodIsRuntimeRegistrationHandler(method, regs) {
21215
21253
  return false;
21216
21254
  }
21217
21255
 
21218
- // ../circle-ir/dist/analysis/require-entry-path.js
21256
+ // node_modules/circle-ir/dist/analysis/require-entry-path.js
21219
21257
  var RULE_ID_REQUIRE_ENTRY_PATH = "require-entry-path";
21220
21258
  var MAX_VISITED_METHODS = 2000;
21221
21259
  var TAINT_FLOW_RULE_IDS = new Set([
@@ -21604,7 +21642,7 @@ function normalizeDisabled(input) {
21604
21642
  return new Set(input);
21605
21643
  }
21606
21644
 
21607
- // ../circle-ir/dist/analysis/project-profile-transform.js
21645
+ // node_modules/circle-ir/dist/analysis/project-profile-transform.js
21608
21646
  var DOWNGRADE_ELIGIBLE_RULE_IDS = new Set([
21609
21647
  "code_injection",
21610
21648
  "template_injection",
@@ -21666,7 +21704,7 @@ function applyProjectProfileTransform(findings, resolveProfile) {
21666
21704
  });
21667
21705
  }
21668
21706
 
21669
- // ../circle-ir/dist/languages/registry.js
21707
+ // node_modules/circle-ir/dist/languages/registry.js
21670
21708
  class DefaultLanguageRegistry {
21671
21709
  plugins = new Map;
21672
21710
  extensionMap = new Map;
@@ -21713,7 +21751,7 @@ function registerLanguage(plugin) {
21713
21751
  function getLanguagePlugin(language) {
21714
21752
  return getLanguageRegistry().get(language);
21715
21753
  }
21716
- // ../circle-ir/dist/languages/plugins/base.js
21754
+ // node_modules/circle-ir/dist/languages/plugins/base.js
21717
21755
  class BaseLanguagePlugin {
21718
21756
  parser = null;
21719
21757
  async initialize(parser) {
@@ -21774,7 +21812,7 @@ class BaseLanguagePlugin {
21774
21812
  }
21775
21813
  }
21776
21814
 
21777
- // ../circle-ir/dist/languages/plugins/java.js
21815
+ // node_modules/circle-ir/dist/languages/plugins/java.js
21778
21816
  class JavaPlugin extends BaseLanguagePlugin {
21779
21817
  id = "java";
21780
21818
  name = "Java";
@@ -22031,7 +22069,7 @@ class JavaPlugin extends BaseLanguagePlugin {
22031
22069
  }
22032
22070
  }
22033
22071
 
22034
- // ../circle-ir/dist/languages/plugins/javascript.js
22072
+ // node_modules/circle-ir/dist/languages/plugins/javascript.js
22035
22073
  class JavaScriptPlugin extends BaseLanguagePlugin {
22036
22074
  id = "javascript";
22037
22075
  name = "JavaScript/TypeScript";
@@ -22697,7 +22735,7 @@ class JavaScriptPlugin extends BaseLanguagePlugin {
22697
22735
  }
22698
22736
  }
22699
22737
 
22700
- // ../circle-ir/dist/languages/plugins/python.js
22738
+ // node_modules/circle-ir/dist/languages/plugins/python.js
22701
22739
  class PythonPlugin extends BaseLanguagePlugin {
22702
22740
  id = "python";
22703
22741
  name = "Python";
@@ -22973,7 +23011,7 @@ class PythonPlugin extends BaseLanguagePlugin {
22973
23011
  }
22974
23012
  }
22975
23013
 
22976
- // ../circle-ir/dist/languages/plugins/rust.js
23014
+ // node_modules/circle-ir/dist/languages/plugins/rust.js
22977
23015
  class RustPlugin extends BaseLanguagePlugin {
22978
23016
  id = "rust";
22979
23017
  name = "Rust";
@@ -23213,7 +23251,7 @@ class RustPlugin extends BaseLanguagePlugin {
23213
23251
  }
23214
23252
  }
23215
23253
 
23216
- // ../circle-ir/dist/languages/plugins/bash.js
23254
+ // node_modules/circle-ir/dist/languages/plugins/bash.js
23217
23255
  class BashPlugin extends BaseLanguagePlugin {
23218
23256
  id = "bash";
23219
23257
  name = "Bash/Shell";
@@ -23419,7 +23457,7 @@ class BashPlugin extends BaseLanguagePlugin {
23419
23457
  }
23420
23458
  }
23421
23459
 
23422
- // ../circle-ir/dist/languages/plugins/html.js
23460
+ // node_modules/circle-ir/dist/languages/plugins/html.js
23423
23461
  class HtmlPlugin extends BaseLanguagePlugin {
23424
23462
  id = "html";
23425
23463
  name = "HTML";
@@ -23484,7 +23522,7 @@ class HtmlPlugin extends BaseLanguagePlugin {
23484
23522
  }
23485
23523
  }
23486
23524
 
23487
- // ../circle-ir/dist/languages/plugins/vue.js
23525
+ // node_modules/circle-ir/dist/languages/plugins/vue.js
23488
23526
  class VuePlugin extends BaseLanguagePlugin {
23489
23527
  id = "vue";
23490
23528
  name = "Vue";
@@ -23549,7 +23587,7 @@ class VuePlugin extends BaseLanguagePlugin {
23549
23587
  }
23550
23588
  }
23551
23589
 
23552
- // ../circle-ir/dist/languages/plugins/go.js
23590
+ // node_modules/circle-ir/dist/languages/plugins/go.js
23553
23591
  class GoPlugin extends BaseLanguagePlugin {
23554
23592
  id = "go";
23555
23593
  name = "Go";
@@ -24198,7 +24236,7 @@ class GoPlugin extends BaseLanguagePlugin {
24198
24236
  }
24199
24237
  }
24200
24238
 
24201
- // ../circle-ir/dist/languages/plugins/csharp.js
24239
+ // node_modules/circle-ir/dist/languages/plugins/csharp.js
24202
24240
  class CSharpPlugin extends BaseLanguagePlugin {
24203
24241
  id = "csharp";
24204
24242
  name = "C#";
@@ -24257,7 +24295,7 @@ class CSharpPlugin extends BaseLanguagePlugin {
24257
24295
  }
24258
24296
  }
24259
24297
 
24260
- // ../circle-ir/dist/languages/plugins/index.js
24298
+ // node_modules/circle-ir/dist/languages/plugins/index.js
24261
24299
  function registerBuiltinPlugins() {
24262
24300
  registerLanguage(new JavaPlugin);
24263
24301
  registerLanguage(new JavaScriptPlugin);
@@ -24269,7 +24307,7 @@ function registerBuiltinPlugins() {
24269
24307
  registerLanguage(new GoPlugin);
24270
24308
  registerLanguage(new CSharpPlugin);
24271
24309
  }
24272
- // ../circle-ir/dist/analysis/passes/cross-file-pass.js
24310
+ // node_modules/circle-ir/dist/analysis/passes/cross-file-pass.js
24273
24311
  class CrossFilePass {
24274
24312
  run(projectGraph, sourceLines, options = {}) {
24275
24313
  const resolver = projectGraph.resolver;
@@ -24595,7 +24633,7 @@ function findCrossInstanceAliasingPaths(projectGraph, _sourceLines) {
24595
24633
  return paths;
24596
24634
  }
24597
24635
 
24598
- // ../circle-ir/dist/analysis/html/html-extractor.js
24636
+ // node_modules/circle-ir/dist/analysis/html/html-extractor.js
24599
24637
  var EVENT_HANDLER_ATTRS = new Set([
24600
24638
  "onclick",
24601
24639
  "ondblclick",
@@ -24750,7 +24788,7 @@ function stripQuotes2(text) {
24750
24788
  return text;
24751
24789
  }
24752
24790
 
24753
- // ../circle-ir/dist/analysis/html/html-attribute-security-pass.js
24791
+ // node_modules/circle-ir/dist/analysis/html/html-attribute-security-pass.js
24754
24792
  function runHtmlAttributeSecurityChecks(rootNode, filePath) {
24755
24793
  const findings = [];
24756
24794
  walkForSecurityChecks(rootNode, filePath, findings);
@@ -24976,7 +25014,7 @@ function truncate(s, maxLen) {
24976
25014
  return s.length > maxLen ? s.slice(0, maxLen) + "..." : s;
24977
25015
  }
24978
25016
 
24979
- // ../circle-ir/dist/analysis/html/vue-template-xss-pass.js
25017
+ // node_modules/circle-ir/dist/analysis/html/vue-template-xss-pass.js
24980
25018
  var DANGEROUS_BINDINGS = new Set([
24981
25019
  "v-html",
24982
25020
  "v-bind:innerhtml",
@@ -25096,7 +25134,7 @@ function collectTaintedNames(blocks) {
25096
25134
  return names;
25097
25135
  }
25098
25136
 
25099
- // ../circle-ir/dist/analysis/html/html-merge.js
25137
+ // node_modules/circle-ir/dist/analysis/html/html-merge.js
25100
25138
  function mergeHtmlResults(htmlMeta, scriptResults, attributeFindings) {
25101
25139
  const allTypes = [];
25102
25140
  const allCalls = [];
@@ -25246,7 +25284,7 @@ function mergeHtmlResults(htmlMeta, scriptResults, attributeFindings) {
25246
25284
  };
25247
25285
  }
25248
25286
 
25249
- // ../circle-ir/dist/analysis/passes/taint-matcher-pass.js
25287
+ // node_modules/circle-ir/dist/analysis/passes/taint-matcher-pass.js
25250
25288
  class TaintMatcherPass {
25251
25289
  name = "taint-matcher";
25252
25290
  category = "security";
@@ -25307,7 +25345,7 @@ class TaintMatcherPass {
25307
25345
  }
25308
25346
  }
25309
25347
 
25310
- // ../circle-ir/dist/analysis/passes/constant-propagation-pass.js
25348
+ // node_modules/circle-ir/dist/analysis/passes/constant-propagation-pass.js
25311
25349
  class ConstantPropagationPass {
25312
25350
  tree;
25313
25351
  name = "constant-propagation";
@@ -25337,7 +25375,7 @@ class ConstantPropagationPass {
25337
25375
  }
25338
25376
  }
25339
25377
 
25340
- // ../circle-ir/dist/analysis/passes/language-sources-pass.js
25378
+ // node_modules/circle-ir/dist/analysis/passes/language-sources-pass.js
25341
25379
  var JS_DOM_XSS_SINKS = [
25342
25380
  { pattern: /\.innerHTML\s*=/, type: "xss", cwe: "CWE-79", severity: "critical" },
25343
25381
  { pattern: /\.outerHTML\s*=/, type: "xss", cwe: "CWE-79", severity: "critical" },
@@ -26939,6 +26977,13 @@ function buildJavaTaintedVars(sourceCode, seedVars) {
26939
26977
  "interface",
26940
26978
  "enum"
26941
26979
  ]);
26980
+ const complexTaintedRes = [];
26981
+ for (const v of knownTainted) {
26982
+ if (!/^[\p{L}\p{N}_]+$/u.test(v)) {
26983
+ const esc = v.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
26984
+ complexTaintedRes.push(new RegExp(`(?<![\\p{L}\\p{N}_])${esc}(?![\\p{L}\\p{N}_])`, "u"));
26985
+ }
26986
+ }
26942
26987
  let changed = true;
26943
26988
  let guard = 0;
26944
26989
  while (changed && guard < lines.length + 2) {
@@ -26960,9 +27005,9 @@ function buildJavaTaintedVars(sourceCode, seedVars) {
26960
27005
  continue;
26961
27006
  if (knownTainted.has(lhs))
26962
27007
  continue;
26963
- const escaped = (v) => v.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
26964
27008
  const rhsCode = rhs.replace(/\$@?"(?:[^"\\]|\\.)*"/g, (lit) => " " + [...lit.matchAll(/\{([^}]*)\}/g)].map((x) => x[1]).join(" ") + " ").replace(/@?"(?:[^"\\]|\\.)*"/g, " ").replace(/'(?:[^'\\]|\\.)'/g, " ");
26965
- const ref = [...knownTainted].some((v) => new RegExp(`(?<![\\p{L}\\p{N}_])${escaped(v)}(?![\\p{L}\\p{N}_])`, "u").test(rhsCode));
27009
+ const rhsIdents = rhsCode.match(/[\p{L}\p{N}_]+/gu);
27010
+ const ref = rhsIdents !== null && rhsIdents.some((t) => knownTainted.has(t)) || complexTaintedRes.length > 0 && complexTaintedRes.some((re) => re.test(rhsCode));
26966
27011
  if (ref) {
26967
27012
  derived.set(lhs, i2 + 1);
26968
27013
  knownTainted.add(lhs);
@@ -32378,7 +32423,7 @@ function findJsTemplateInjectionSstiFindings(code, file) {
32378
32423
  return findings;
32379
32424
  }
32380
32425
 
32381
- // ../circle-ir/dist/analysis/passes/source-semantics-pass.js
32426
+ // node_modules/circle-ir/dist/analysis/passes/source-semantics-pass.js
32382
32427
  var DEMO_PATH_RE = /(?:^|\/)(?:demo|example|examples|samples|integration-tests|integration_tests)(?:\/|$)/i;
32383
32428
  var CONST_STRING_ASSIGN_RE = /^\s*(?:final\s+|static\s+final\s+)?[A-Za-z_][\w.<>\[\]]*\s+[A-Za-z_]\w*\s*=\s*"[^"]*"\s*;?\s*$/;
32384
32429
  var STATIC_FINAL_RE = /^\s*(?:public\s+|private\s+|protected\s+)?static\s+final\s+/;
@@ -32466,7 +32511,7 @@ class SourceSemanticsPass {
32466
32511
  }
32467
32512
  }
32468
32513
 
32469
- // ../circle-ir/dist/analysis/passes/library-profile-source-gate-pass.js
32514
+ // node_modules/circle-ir/dist/analysis/passes/library-profile-source-gate-pass.js
32470
32515
  var SPECULATIVE_SOURCE_TYPES = new Set([
32471
32516
  "interprocedural_param",
32472
32517
  "constructor_field"
@@ -32521,7 +32566,7 @@ class LibraryProfileSourceGatePass {
32521
32566
  }
32522
32567
  }
32523
32568
 
32524
- // ../circle-ir/dist/analysis/passes/mybatis-annotation-sql-sink-pass.js
32569
+ // node_modules/circle-ir/dist/analysis/passes/mybatis-annotation-sql-sink-pass.js
32525
32570
  var MYBATIS_SQL_ANNOTATIONS = new Set([
32526
32571
  "Select",
32527
32572
  "Update",
@@ -32748,7 +32793,7 @@ class MyBatisAnnotationSqlSinkPass {
32748
32793
  }
32749
32794
  }
32750
32795
 
32751
- // ../circle-ir/dist/analysis/passes/sink-filter-pass.js
32796
+ // node_modules/circle-ir/dist/analysis/passes/sink-filter-pass.js
32752
32797
  function escapeReSf(s) {
32753
32798
  return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
32754
32799
  }
@@ -34552,7 +34597,7 @@ function isXPathQuoteEscapedOnLine(lineText, varName) {
34552
34597
  return seen > 0;
34553
34598
  }
34554
34599
 
34555
- // ../circle-ir/dist/analysis/passes/sink-semantics-pass.js
34600
+ // node_modules/circle-ir/dist/analysis/passes/sink-semantics-pass.js
34556
34601
  function buildRegistry(entries) {
34557
34602
  const registry = new Map;
34558
34603
  for (const entry of entries) {
@@ -34600,7 +34645,7 @@ class SinkSemanticsPass {
34600
34645
  }
34601
34646
  }
34602
34647
 
34603
- // ../circle-ir/dist/analysis/dependency-versions.js
34648
+ // node_modules/circle-ir/dist/analysis/dependency-versions.js
34604
34649
  function resolveFastjsonFromPom(pomXml) {
34605
34650
  if (!pomXml)
34606
34651
  return null;
@@ -34778,7 +34823,7 @@ function fileConfiguresSnakeYamlSafely(source) {
34778
34823
  return false;
34779
34824
  }
34780
34825
 
34781
- // ../circle-ir/dist/analysis/passes/deserialization-safety-gate-pass.js
34826
+ // node_modules/circle-ir/dist/analysis/passes/deserialization-safety-gate-pass.js
34782
34827
  var FASTJSON_METHODS = new Set(["parseObject", "parse"]);
34783
34828
  var FASTJSON_CLASSES = new Set(["JSON", "JSONObject"]);
34784
34829
  var JACKSON_METHODS = new Set(["readValue", "convertValue", "treeToValue"]);
@@ -34855,7 +34900,7 @@ class DeserializationSafetyGatePass {
34855
34900
  }
34856
34901
  }
34857
34902
 
34858
- // ../circle-ir/dist/analysis/passes/prompt-injection-safety-gate-pass.js
34903
+ // node_modules/circle-ir/dist/analysis/passes/prompt-injection-safety-gate-pass.js
34859
34904
  function isDelimiterLiteral(lit) {
34860
34905
  const s = lit.trim();
34861
34906
  if (s.length === 0)
@@ -35098,7 +35143,7 @@ class PromptInjectionSafetyGatePass {
35098
35143
  }
35099
35144
  }
35100
35145
 
35101
- // ../circle-ir/dist/analysis/passes/speculative-prompt-param-source-pass.js
35146
+ // node_modules/circle-ir/dist/analysis/passes/speculative-prompt-param-source-pass.js
35102
35147
  function returnOrAssignRhs(text) {
35103
35148
  const t = text.trim();
35104
35149
  const ret = t.match(/^return\s+(.+?);?$/);
@@ -35224,7 +35269,7 @@ class SpeculativePromptParamSourcePass {
35224
35269
  }
35225
35270
  }
35226
35271
 
35227
- // ../circle-ir/dist/analysis/passes/cli-main-reflection-suppress-pass.js
35272
+ // node_modules/circle-ir/dist/analysis/passes/cli-main-reflection-suppress-pass.js
35228
35273
  var REFLECTION_SINK_METHODS = new Set([
35229
35274
  "forName",
35230
35275
  "newInstance",
@@ -35412,7 +35457,7 @@ class CliMainReflectionSuppressPass {
35412
35457
  }
35413
35458
  }
35414
35459
 
35415
- // ../circle-ir/dist/analysis/passes/library-profile-sink-gate-pass.js
35460
+ // node_modules/circle-ir/dist/analysis/passes/library-profile-sink-gate-pass.js
35416
35461
  var DROPPED_SINK_TYPES = new Set([
35417
35462
  "log_injection"
35418
35463
  ]);
@@ -35518,7 +35563,7 @@ class LibraryProfileCwe22PathGatePass {
35518
35563
  }
35519
35564
  }
35520
35565
 
35521
- // ../circle-ir/dist/analysis/passes/library-profile-xss-gate-pass.js
35566
+ // node_modules/circle-ir/dist/analysis/passes/library-profile-xss-gate-pass.js
35522
35567
  var XSS_NON_HTML_OUTPUT_CLASSES = new Set([
35523
35568
  "StringBuilder",
35524
35569
  "StringBuffer",
@@ -35599,7 +35644,7 @@ class LibraryProfileXssGatePass {
35599
35644
  }
35600
35645
  }
35601
35646
 
35602
- // ../circle-ir/dist/analysis/passes/taint-propagation-pass.js
35647
+ // node_modules/circle-ir/dist/analysis/passes/taint-propagation-pass.js
35603
35648
  class TaintPropagationPass {
35604
35649
  name = "taint-propagation";
35605
35650
  category = "security";
@@ -36283,13 +36328,22 @@ function detectParameterSinkFlows(types, calls, sources, sinks, unreachableLines
36283
36328
  }
36284
36329
  return flows;
36285
36330
  }
36331
+ var _reassignSplitCode;
36332
+ var _reassignSplitLines;
36333
+ function splitLinesCached(code) {
36334
+ if (code === _reassignSplitCode && _reassignSplitLines)
36335
+ return _reassignSplitLines;
36336
+ _reassignSplitCode = code;
36337
+ _reassignSplitLines = code.split(`
36338
+ `);
36339
+ return _reassignSplitLines;
36340
+ }
36286
36341
  function isReassignedToLiteralBetween(code, variable, srcLine, sinkLine) {
36287
36342
  if (!variable || sinkLine - srcLine < 2)
36288
36343
  return false;
36289
36344
  if (!/^[A-Za-z_][\w]*$/.test(variable))
36290
36345
  return false;
36291
- const lines = code.split(`
36292
- `);
36346
+ const lines = splitLinesCached(code);
36293
36347
  const lo = Math.max(0, srcLine);
36294
36348
  const hi = Math.min(lines.length, sinkLine - 1);
36295
36349
  const strLit = `(?:"[^"\\\\]*(?:\\\\.[^"\\\\]*)*"|'[^'\\\\]*(?:\\\\.[^'\\\\]*)*'|\`[^\`\\\\]*(?:\\\\.[^\`\\\\]*)*\`)`;
@@ -36627,9 +36681,10 @@ function detectExpressionScanFlows(calls, sources, sinks, sanitizers, unreachabl
36627
36681
  }
36628
36682
  }
36629
36683
  }
36684
+ const SIMPLE_IDENT = /^[\p{L}\p{N}_]+$/u;
36630
36685
  const reCache = new Map;
36631
36686
  for (const s of sourcesWithVar) {
36632
- if (reCache.has(s.variable))
36687
+ if (SIMPLE_IDENT.test(s.variable) || reCache.has(s.variable))
36633
36688
  continue;
36634
36689
  const escaped = s.variable.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
36635
36690
  reCache.set(s.variable, new RegExp(`(?<![\\p{L}\\p{N}_])${escaped}(?![\\p{L}\\p{N}_])`, "u"));
@@ -36640,6 +36695,23 @@ function detectExpressionScanFlows(calls, sources, sinks, sanitizers, unreachabl
36640
36695
  existing.push(call);
36641
36696
  callsByLine.set(call.location.line, existing);
36642
36697
  }
36698
+ const sourcesByVar = new Map;
36699
+ const complexSources = [];
36700
+ sourcesWithVar.forEach((source, ord) => {
36701
+ const complex = !SIMPLE_IDENT.test(source.variable);
36702
+ const entry = { source, ord, complex };
36703
+ if (!complex) {
36704
+ let list = sourcesByVar.get(source.variable);
36705
+ if (!list) {
36706
+ list = [];
36707
+ sourcesByVar.set(source.variable, list);
36708
+ }
36709
+ list.push(entry);
36710
+ } else {
36711
+ complexSources.push(entry);
36712
+ }
36713
+ });
36714
+ const flowKeys = new Set;
36643
36715
  for (const sink of sinks) {
36644
36716
  if (unreachableLines.has(sink.line))
36645
36717
  continue;
@@ -36652,18 +36724,35 @@ function detectExpressionScanFlows(calls, sources, sinks, sanitizers, unreachabl
36652
36724
  const expr = arg.expression;
36653
36725
  if (!expr)
36654
36726
  continue;
36655
- for (const source of sourcesWithVar) {
36727
+ const exprIdentMatches = expr.match(/[\p{L}\p{N}_]+/gu);
36728
+ let candidates = complexSources.length > 0 ? complexSources.slice() : null;
36729
+ if (exprIdentMatches) {
36730
+ for (const id of new Set(exprIdentMatches)) {
36731
+ const list = sourcesByVar.get(id);
36732
+ if (!list)
36733
+ continue;
36734
+ (candidates ??= []).push(...list);
36735
+ }
36736
+ }
36737
+ if (!candidates)
36738
+ continue;
36739
+ if (candidates.length > 1)
36740
+ candidates.sort((a, b) => a.ord - b.ord);
36741
+ for (const { source, complex } of candidates) {
36656
36742
  if (source.line >= sink.line)
36657
36743
  continue;
36658
36744
  if (source.in_method && call.in_method && source.in_method !== call.in_method) {
36659
36745
  continue;
36660
36746
  }
36661
- const re = reCache.get(source.variable);
36662
- if (!re || !re.test(expr))
36663
- continue;
36747
+ if (complex) {
36748
+ const re = reCache.get(source.variable);
36749
+ if (!re || !re.test(expr))
36750
+ continue;
36751
+ }
36664
36752
  if (!sourceSemanticsAllowed(source, sink.type))
36665
36753
  continue;
36666
- if (flows.some((f) => f.source_line === source.line && f.sink_line === sink.line && f.sink_type === sink.type))
36754
+ const dedupKey = `${source.line}:${sink.line}:${sink.type}`;
36755
+ if (flowKeys.has(dedupKey))
36667
36756
  continue;
36668
36757
  if (aliasSanitizedFor.get(source.variable)?.has(sink.type)) {
36669
36758
  break;
@@ -36683,6 +36772,7 @@ function detectExpressionScanFlows(calls, sources, sinks, sanitizers, unreachabl
36683
36772
  confidence: source.confidence * sink.confidence * 0.7,
36684
36773
  sanitized: false
36685
36774
  });
36775
+ flowKeys.add(dedupKey);
36686
36776
  break;
36687
36777
  }
36688
36778
  }
@@ -36784,7 +36874,7 @@ function pickScopedSource(sources, sinkLine, methodName, types, taintedVar) {
36784
36874
  return sources[0];
36785
36875
  }
36786
36876
 
36787
- // ../circle-ir/dist/analysis/interprocedural.js
36877
+ // node_modules/circle-ir/dist/analysis/interprocedural.js
36788
36878
  function analyzeInterprocedural2(graphOrTypes, callsOrSources, dfgOrSinks, sourcesOrSanitizers, sinksOrOptions, sanitizersArg, optionsArg = {}) {
36789
36879
  let graph;
36790
36880
  let sources;
@@ -37298,7 +37388,7 @@ function findTaintBridges2(result) {
37298
37388
  return bridges;
37299
37389
  }
37300
37390
 
37301
- // ../circle-ir/dist/analysis/passes/interprocedural-pass.js
37391
+ // node_modules/circle-ir/dist/analysis/passes/interprocedural-pass.js
37302
37392
  class InterproceduralPass {
37303
37393
  name = "interprocedural";
37304
37394
  category = "security";
@@ -37504,7 +37594,7 @@ class InterproceduralPass {
37504
37594
  }
37505
37595
  }
37506
37596
 
37507
- // ../circle-ir/dist/analysis/passes/dead-code-pass.js
37597
+ // node_modules/circle-ir/dist/analysis/passes/dead-code-pass.js
37508
37598
  class DeadCodePass {
37509
37599
  name = "dead-code";
37510
37600
  category = "reliability";
@@ -37580,7 +37670,7 @@ class DeadCodePass {
37580
37670
  }
37581
37671
  }
37582
37672
 
37583
- // ../circle-ir/dist/analysis/passes/missing-await-pass.js
37673
+ // node_modules/circle-ir/dist/analysis/passes/missing-await-pass.js
37584
37674
  var ASYNC_METHODS = new Set([
37585
37675
  "readFile",
37586
37676
  "writeFile",
@@ -37659,7 +37749,7 @@ class MissingAwaitPass {
37659
37749
  }
37660
37750
  }
37661
37751
 
37662
- // ../circle-ir/dist/analysis/passes/n-plus-one-pass.js
37752
+ // node_modules/circle-ir/dist/analysis/passes/n-plus-one-pass.js
37663
37753
  var HIGH_CONFIDENCE_DB_METHODS = new Set([
37664
37754
  "executeQuery",
37665
37755
  "executeUpdate",
@@ -37782,7 +37872,7 @@ class NPlusOnePass {
37782
37872
  }
37783
37873
  }
37784
37874
 
37785
- // ../circle-ir/dist/analysis/passes/missing-public-doc-pass.js
37875
+ // node_modules/circle-ir/dist/analysis/passes/missing-public-doc-pass.js
37786
37876
  var TEST_PATH_RE = /[/._](test|tests|spec|specs|__tests?__|__mocks?__)[/._]/i;
37787
37877
  var UTIL_DIR_RE = /[/](utils?|helpers?|internal|private|common|shared)[/]/i;
37788
37878
  function hasDocCommentBefore(lines, startLine) {
@@ -37889,7 +37979,7 @@ class MissingPublicDocPass {
37889
37979
  }
37890
37980
  }
37891
37981
 
37892
- // ../circle-ir/dist/analysis/passes/todo-in-prod-pass.js
37982
+ // node_modules/circle-ir/dist/analysis/passes/todo-in-prod-pass.js
37893
37983
  var TEST_PATH_RE2 = /[/._](test|tests|spec|specs|__tests?__|__mocks?__)[/._]/i;
37894
37984
  var MARKER_RE = /(?:\/\/|#|--|^\s*\*)\s*(TODO|FIXME|HACK|XXX)\b/i;
37895
37985
  function markerSeverity(marker) {
@@ -37935,7 +38025,7 @@ class TodoInProdPass {
37935
38025
  }
37936
38026
  }
37937
38027
 
37938
- // ../circle-ir/dist/analysis/passes/string-concat-loop-pass.js
38028
+ // node_modules/circle-ir/dist/analysis/passes/string-concat-loop-pass.js
37939
38029
  var CONCAT_RE = /\b([a-zA-Z_$][a-zA-Z0-9_$]*)\s*\+=/;
37940
38030
  var NUMERIC_VAR_RE = /^(i|j|k|n|m|x|y|z|count|sum|total|size|index|len|length|num|idx|score|counter|offset|pos|col|row|result|ret|value|acc|bits|byte|bytes|flag|flags|step|delta|diff|dist|min|max|avg|mean|page|line|err|error)$/i;
37941
38031
  var NUMERIC_SUFFIX_RE = /(Count|Sum|Total|Size|Index|Length|Offset|Position|Score|Counter|Num|Amount|Val|Idx|Len|Max|Min|Avg|Delta|Diff|Step|Flag|Flags|Bits|Byte|Bytes|Calls|Items|Nodes|Edges|Blocks|Lines|Chars|Entries|Records|Rows)$/;
@@ -37998,7 +38088,7 @@ class StringConcatLoopPass {
37998
38088
  }
37999
38089
  }
38000
38090
 
38001
- // ../circle-ir/dist/analysis/passes/sync-io-async-pass.js
38091
+ // node_modules/circle-ir/dist/analysis/passes/sync-io-async-pass.js
38002
38092
  var BLOCKING_METHODS = new Set([
38003
38093
  "sleep"
38004
38094
  ]);
@@ -38059,7 +38149,7 @@ class SyncIoAsyncPass {
38059
38149
  }
38060
38150
  }
38061
38151
 
38062
- // ../circle-ir/dist/analysis/passes/unchecked-return-pass.js
38152
+ // node_modules/circle-ir/dist/analysis/passes/unchecked-return-pass.js
38063
38153
  var MUST_CHECK_HIGH = new Set([
38064
38154
  "createNewFile",
38065
38155
  "mkdir",
@@ -38132,7 +38222,7 @@ class UncheckedReturnPass {
38132
38222
  }
38133
38223
  }
38134
38224
 
38135
- // ../circle-ir/dist/analysis/passes/null-deref-pass.js
38225
+ // node_modules/circle-ir/dist/analysis/passes/null-deref-pass.js
38136
38226
  var NULL_EXPR_RE = /^\s*(null|None|undefined)\s*$/;
38137
38227
  function escRe(s) {
38138
38228
  return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
@@ -38214,7 +38304,7 @@ class NullDerefPass {
38214
38304
  }
38215
38305
  }
38216
38306
 
38217
- // ../circle-ir/dist/analysis/passes/resource-leak-pass.js
38307
+ // node_modules/circle-ir/dist/analysis/passes/resource-leak-pass.js
38218
38308
  function escapeRegex2(s) {
38219
38309
  return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
38220
38310
  }
@@ -38491,7 +38581,7 @@ class ResourceLeakPass {
38491
38581
  }
38492
38582
  }
38493
38583
 
38494
- // ../circle-ir/dist/graph/scope-graph.js
38584
+ // node_modules/circle-ir/dist/graph/scope-graph.js
38495
38585
  function hasDeclKeyword(lineText, language) {
38496
38586
  switch (language) {
38497
38587
  case "java":
@@ -38531,7 +38621,7 @@ class ScopeGraph {
38531
38621
  }
38532
38622
  }
38533
38623
 
38534
- // ../circle-ir/dist/analysis/passes/variable-shadowing-pass.js
38624
+ // node_modules/circle-ir/dist/analysis/passes/variable-shadowing-pass.js
38535
38625
  var SKIP_NAMES = new Set([
38536
38626
  "let",
38537
38627
  "const",
@@ -38689,7 +38779,7 @@ class VariableShadowingPass {
38689
38779
  }
38690
38780
  }
38691
38781
 
38692
- // ../circle-ir/dist/analysis/passes/leaked-global-pass.js
38782
+ // node_modules/circle-ir/dist/analysis/passes/leaked-global-pass.js
38693
38783
  var SKIP_NAMES2 = new Set([
38694
38784
  "_",
38695
38785
  "e",
@@ -38776,7 +38866,7 @@ class LeakedGlobalPass {
38776
38866
  }
38777
38867
  }
38778
38868
 
38779
- // ../circle-ir/dist/analysis/passes/unused-variable-pass.js
38869
+ // node_modules/circle-ir/dist/analysis/passes/unused-variable-pass.js
38780
38870
  var SKIP_NAMES3 = new Set([
38781
38871
  "_",
38782
38872
  "unused",
@@ -38921,7 +39011,7 @@ class UnusedVariablePass {
38921
39011
  }
38922
39012
  }
38923
39013
 
38924
- // ../circle-ir/dist/analysis/passes/dependency-fan-out-pass.js
39014
+ // node_modules/circle-ir/dist/analysis/passes/dependency-fan-out-pass.js
38925
39015
  var DEFAULT_THRESHOLD = 20;
38926
39016
 
38927
39017
  class DependencyFanOutPass {
@@ -38953,7 +39043,7 @@ class DependencyFanOutPass {
38953
39043
  }
38954
39044
  }
38955
39045
 
38956
- // ../circle-ir/dist/analysis/passes/stale-doc-ref-pass.js
39046
+ // node_modules/circle-ir/dist/analysis/passes/stale-doc-ref-pass.js
38957
39047
  var DOC_BLOCK_RE = /\/\*\*([\s\S]*?)\*\//g;
38958
39048
  var LINK_RE = /\{@link\s+([\w.#]+)/g;
38959
39049
  var SEE_RE = /@see\s+([\w.#]+)/g;
@@ -39032,7 +39122,7 @@ class StaleDocRefPass {
39032
39122
  }
39033
39123
  }
39034
39124
 
39035
- // ../circle-ir/dist/analysis/passes/infinite-loop-pass.js
39125
+ // node_modules/circle-ir/dist/analysis/passes/infinite-loop-pass.js
39036
39126
  var EXIT_KEYWORDS = /\b(return|throw|raise|break|System\.exit|process\.exit|os\._exit|exit!\()\b/;
39037
39127
  var ITERATOR_LOOP_PATTERNS = [
39038
39128
  /\bfor\s*\([^)]*\s+of\s+/,
@@ -39151,7 +39241,7 @@ class InfiniteLoopPass {
39151
39241
  }
39152
39242
  }
39153
39243
 
39154
- // ../circle-ir/dist/analysis/passes/deep-inheritance-pass.js
39244
+ // node_modules/circle-ir/dist/analysis/passes/deep-inheritance-pass.js
39155
39245
  var DEPTH_THRESHOLD = 5;
39156
39246
  var CYCLE_GUARD = 20;
39157
39247
 
@@ -39214,7 +39304,7 @@ class DeepInheritancePass {
39214
39304
  }
39215
39305
  }
39216
39306
 
39217
- // ../circle-ir/dist/analysis/passes/redundant-loop-pass.js
39307
+ // node_modules/circle-ir/dist/analysis/passes/redundant-loop-pass.js
39218
39308
  var LENGTH_PATTERN = /\b([A-Za-z_$][A-Za-z0-9_$]*)\s*\.\s*(?:length|size\(\)|count\(\))/g;
39219
39309
  var LENGTH_PATTERN_METHODS = /\b([A-Za-z_$][A-Za-z0-9_$]*)\s*\.\s*(?:size\(\)|count\(\))/g;
39220
39310
  var OBJECT_STATIC_PATTERN = /\bObject\s*\.\s*(?:keys|values|entries)\s*\(\s*([A-Za-z_$][A-Za-z0-9_$]*)\s*\)/g;
@@ -39337,7 +39427,7 @@ class RedundantLoopPass {
39337
39427
  }
39338
39428
  }
39339
39429
 
39340
- // ../circle-ir/dist/analysis/passes/unbounded-collection-pass.js
39430
+ // node_modules/circle-ir/dist/analysis/passes/unbounded-collection-pass.js
39341
39431
  var GROW_METHODS = {
39342
39432
  java: new Set(["add", "put", "offer", "push", "addAll", "addFirst", "addLast", "enqueue", "insert"]),
39343
39433
  javascript: new Set(["push", "set", "add", "unshift", "append", "prepend"]),
@@ -39461,7 +39551,7 @@ class UnboundedCollectionPass {
39461
39551
  }
39462
39552
  }
39463
39553
 
39464
- // ../circle-ir/dist/analysis/passes/serial-await-pass.js
39554
+ // node_modules/circle-ir/dist/analysis/passes/serial-await-pass.js
39465
39555
  var AWAIT_ASSIGN_RE = /(?:const|let|var)?\s*(\w+)\s*=\s*await\s/;
39466
39556
  var AWAIT_RE = /\bawait\s/;
39467
39557
 
@@ -39557,7 +39647,7 @@ class SerialAwaitPass {
39557
39647
  }
39558
39648
  }
39559
39649
 
39560
- // ../circle-ir/dist/analysis/passes/react-inline-jsx-pass.js
39650
+ // node_modules/circle-ir/dist/analysis/passes/react-inline-jsx-pass.js
39561
39651
  var JSX_COMPONENT_RE = /<[A-Z][A-Za-z0-9]*/;
39562
39652
  var INLINE_OBJECT_RE = /\s([A-Za-z][A-Za-z0-9_]*)=\{\{/g;
39563
39653
  var INLINE_ARROW_RE = /\s([A-Za-z][A-Za-z0-9_]*)=\{(?:\(|[A-Za-z_$]).*?=>/g;
@@ -39661,7 +39751,7 @@ class ReactInlineJsxPass {
39661
39751
  }
39662
39752
  }
39663
39753
 
39664
- // ../circle-ir/dist/graph/exception-flow-graph.js
39754
+ // node_modules/circle-ir/dist/graph/exception-flow-graph.js
39665
39755
  class ExceptionFlowGraph2 {
39666
39756
  pairs;
39667
39757
  catchEntryIds;
@@ -39712,7 +39802,7 @@ class ExceptionFlowGraph2 {
39712
39802
  }
39713
39803
  }
39714
39804
 
39715
- // ../circle-ir/dist/analysis/passes/swallowed-exception-pass.js
39805
+ // node_modules/circle-ir/dist/analysis/passes/swallowed-exception-pass.js
39716
39806
  var MEANINGFUL_ACTION_RE = /\b(throw|raise|log|logger|console\.(error|warn|log|debug|info)|System\.(out|err)\.|print(?:ln|f)?|warn|error|debug|info|fatal|LOGGER|LOG|logging\.(warning|error|debug|info|critical))\b|\breturn\s+\S/;
39717
39807
 
39718
39808
  class SwallowedExceptionPass {
@@ -39810,7 +39900,7 @@ class SwallowedExceptionPass {
39810
39900
  }
39811
39901
  }
39812
39902
 
39813
- // ../circle-ir/dist/analysis/passes/broad-catch-pass.js
39903
+ // node_modules/circle-ir/dist/analysis/passes/broad-catch-pass.js
39814
39904
  var JAVA_BROAD_RE = /catch\s*\(\s*(Exception|Throwable|RuntimeException|Error)\s/;
39815
39905
  var PYTHON_BROAD_RE = /^\s*except\s*:|except\s+(Exception|BaseException)\b/;
39816
39906
 
@@ -39866,7 +39956,7 @@ class BroadCatchPass {
39866
39956
  }
39867
39957
  }
39868
39958
 
39869
- // ../circle-ir/dist/analysis/passes/unhandled-exception-pass.js
39959
+ // node_modules/circle-ir/dist/analysis/passes/unhandled-exception-pass.js
39870
39960
  var JS_THROW_RE = /^\s*throw\s+/;
39871
39961
  var PYTHON_RAISE_RE = /^\s*raise\b/;
39872
39962
  function isValidationThrow(lines, throwLine) {
@@ -40036,7 +40126,7 @@ class UnhandledExceptionPass {
40036
40126
  }
40037
40127
  }
40038
40128
 
40039
- // ../circle-ir/dist/analysis/passes/double-close-pass.js
40129
+ // node_modules/circle-ir/dist/analysis/passes/double-close-pass.js
40040
40130
  var RESOURCE_CTORS2 = new Set([
40041
40131
  "FileInputStream",
40042
40132
  "FileOutputStream",
@@ -40151,7 +40241,7 @@ class DoubleClosePass {
40151
40241
  }
40152
40242
  }
40153
40243
 
40154
- // ../circle-ir/dist/analysis/passes/use-after-close-pass.js
40244
+ // node_modules/circle-ir/dist/analysis/passes/use-after-close-pass.js
40155
40245
  var RESOURCE_CTORS3 = new Set([
40156
40246
  "FileInputStream",
40157
40247
  "FileOutputStream",
@@ -40259,7 +40349,7 @@ class UseAfterClosePass {
40259
40349
  }
40260
40350
  }
40261
40351
 
40262
- // ../circle-ir/dist/graph/dominator-graph.js
40352
+ // node_modules/circle-ir/dist/graph/dominator-graph.js
40263
40353
  function computeRPO(cfg, entryId) {
40264
40354
  const outgoing = new Map;
40265
40355
  for (const edge of cfg.edges) {
@@ -40424,7 +40514,7 @@ class DominatorGraph2 {
40424
40514
  }
40425
40515
  }
40426
40516
 
40427
- // ../circle-ir/dist/analysis/passes/cleanup-verify-pass.js
40517
+ // node_modules/circle-ir/dist/analysis/passes/cleanup-verify-pass.js
40428
40518
  var RESOURCE_CTORS4 = new Set([
40429
40519
  "FileInputStream",
40430
40520
  "FileOutputStream",
@@ -40549,7 +40639,7 @@ class CleanupVerifyPass {
40549
40639
  }
40550
40640
  }
40551
40641
 
40552
- // ../circle-ir/dist/analysis/passes/missing-override-pass.js
40642
+ // node_modules/circle-ir/dist/analysis/passes/missing-override-pass.js
40553
40643
  class MissingOverridePass {
40554
40644
  name = "missing-override";
40555
40645
  category = "maintainability";
@@ -40636,7 +40726,7 @@ class MissingOverridePass {
40636
40726
  }
40637
40727
  }
40638
40728
 
40639
- // ../circle-ir/dist/analysis/passes/unused-interface-method-pass.js
40729
+ // node_modules/circle-ir/dist/analysis/passes/unused-interface-method-pass.js
40640
40730
  class UnusedInterfaceMethodPass {
40641
40731
  name = "unused-interface-method";
40642
40732
  category = "maintainability";
@@ -40679,7 +40769,7 @@ class UnusedInterfaceMethodPass {
40679
40769
  }
40680
40770
  }
40681
40771
 
40682
- // ../circle-ir/dist/analysis/passes/blocking-main-thread-pass.js
40772
+ // node_modules/circle-ir/dist/analysis/passes/blocking-main-thread-pass.js
40683
40773
  var HTTP_DECORATORS = new Set([
40684
40774
  "Get",
40685
40775
  "Post",
@@ -40782,7 +40872,7 @@ class BlockingMainThreadPass {
40782
40872
  }
40783
40873
  }
40784
40874
 
40785
- // ../circle-ir/dist/analysis/passes/excessive-allocation-pass.js
40875
+ // node_modules/circle-ir/dist/analysis/passes/excessive-allocation-pass.js
40786
40876
  var ALLOC_PATTERNS = {
40787
40877
  javascript: /\bnew\s+(Array|Map|Set|Object|WeakMap|WeakSet|Error|RegExp|Date|Buffer|Uint8Array|Int8Array|Float32Array|ArrayBuffer)\s*[(<]|\bArray\.from\s*\(|\bstructuredClone\s*\(|\bObject\.create\s*\(/,
40788
40878
  typescript: /\bnew\s+(Array|Map|Set|Object|WeakMap|WeakSet|Error|RegExp|Date|Buffer|Uint8Array|Int8Array|Float32Array|ArrayBuffer)\s*[(<]|\bArray\.from\s*\(|\bstructuredClone\s*\(|\bObject\.create\s*\(/,
@@ -40849,7 +40939,7 @@ class ExcessiveAllocationPass {
40849
40939
  }
40850
40940
  }
40851
40941
 
40852
- // ../circle-ir/dist/analysis/passes/missing-stream-pass.js
40942
+ // node_modules/circle-ir/dist/analysis/passes/missing-stream-pass.js
40853
40943
  var JS_WHOLE_LOAD_RE = /\b(?:readFileSync|fs\.readFile\b|response\.text\b|response\.json\b|res\.text\b|res\.json\b|body\.text\b|body\.json\b)\s*\(/;
40854
40944
  var JS_STREAM_RE = /\.pipe\s*\(|\.on\s*\(\s*['"]data['"]|for\s+await\s*\(|\bcreateReadStream\b|\bstream\b/i;
40855
40945
  var JAVA_WHOLE_READ_RE = /\bFiles\.readAllBytes\s*\(|\bFiles\.readAllLines\s*\(|\bFiles\.readString\s*\(|\bnew\s+BufferedReader\s*\(|\bFileInputStream\b/;
@@ -40996,7 +41086,7 @@ class MissingStreamPass {
40996
41086
  }
40997
41087
  }
40998
41088
 
40999
- // ../circle-ir/dist/analysis/passes/god-class-pass.js
41089
+ // node_modules/circle-ir/dist/analysis/passes/god-class-pass.js
41000
41090
  var WMC_THRESHOLD = 47;
41001
41091
  var LCOM2_THRESHOLD = 0.8;
41002
41092
  var CBO_THRESHOLD = 14;
@@ -41162,7 +41252,7 @@ class GodClassPass {
41162
41252
  }
41163
41253
  }
41164
41254
 
41165
- // ../circle-ir/dist/analysis/passes/naming-convention-pass.js
41255
+ // node_modules/circle-ir/dist/analysis/passes/naming-convention-pass.js
41166
41256
  var PASCAL_CASE_RE = /^[A-Z][A-Za-z0-9]*$/;
41167
41257
  var CAMEL_CASE_RE = /^[a-z][a-zA-Z0-9]*$/;
41168
41258
  var SNAKE_CASE_RE = /^[a-z_][a-z0-9_]*$/;
@@ -41302,7 +41392,7 @@ class NamingConventionPass {
41302
41392
  }
41303
41393
  }
41304
41394
 
41305
- // ../circle-ir/dist/analysis/passes/security-headers-pass.js
41395
+ // node_modules/circle-ir/dist/analysis/passes/security-headers-pass.js
41306
41396
  var HEADER_WRITE_METHODS = new Set([
41307
41397
  "setHeader",
41308
41398
  "addHeader",
@@ -41763,7 +41853,7 @@ function mapReturnValueToCorsRule(returnValue) {
41763
41853
  };
41764
41854
  }
41765
41855
 
41766
- // ../circle-ir/dist/analysis/passes/_fp-allowlists.js
41856
+ // node_modules/circle-ir/dist/analysis/passes/_fp-allowlists.js
41767
41857
  var PEM_BODY_RE = /[A-Za-z0-9+/]{30,}/;
41768
41858
  function pemHasInlineBody(lines, hitLineIdx) {
41769
41859
  const end = Math.min(hitLineIdx + 5, lines.length);
@@ -41790,7 +41880,7 @@ function isProtocolMandatedCryptoFile(file, code) {
41790
41880
  return false;
41791
41881
  }
41792
41882
 
41793
- // ../circle-ir/dist/analysis/passes/scan-secrets-pass.js
41883
+ // node_modules/circle-ir/dist/analysis/passes/scan-secrets-pass.js
41794
41884
  function applyDemoDowngrade(demoPath, severity, level) {
41795
41885
  if (!demoPath)
41796
41886
  return { severity, level };
@@ -42368,7 +42458,7 @@ class ScanSecretsPass {
42368
42458
  }
42369
42459
  }
42370
42460
 
42371
- // ../circle-ir/dist/analysis/passes/python-receiver-taint-format-pass.js
42461
+ // node_modules/circle-ir/dist/analysis/passes/python-receiver-taint-format-pass.js
42372
42462
  class PythonReceiverTaintFormatPass {
42373
42463
  name = "python-receiver-taint-format";
42374
42464
  category = "security";
@@ -42420,7 +42510,7 @@ class PythonReceiverTaintFormatPass {
42420
42510
  }
42421
42511
  }
42422
42512
 
42423
- // ../circle-ir/dist/analysis/passes/spring4shell-pass.js
42513
+ // node_modules/circle-ir/dist/analysis/passes/spring4shell-pass.js
42424
42514
  var CONTROLLER_ANNOTATIONS = new Set([
42425
42515
  "Controller",
42426
42516
  "RestController",
@@ -42628,7 +42718,7 @@ function isPotentialPojo(type) {
42628
42718
  return first >= 65 && first <= 90;
42629
42719
  }
42630
42720
 
42631
- // ../circle-ir/dist/analysis/passes/insecure-cookie-pass.js
42721
+ // node_modules/circle-ir/dist/analysis/passes/insecure-cookie-pass.js
42632
42722
  var COOKIE_RESPONSE_RECEIVERS = new Set([
42633
42723
  "res",
42634
42724
  "response",
@@ -42864,7 +42954,7 @@ class InsecureCookiePass {
42864
42954
  }
42865
42955
  }
42866
42956
 
42867
- // ../circle-ir/dist/analysis/passes/weak-hash-pass.js
42957
+ // node_modules/circle-ir/dist/analysis/passes/weak-hash-pass.js
42868
42958
  var WEAK_HASH_NAMES = new Set([
42869
42959
  "md2",
42870
42960
  "md4",
@@ -43084,7 +43174,7 @@ class WeakHashPass {
43084
43174
  }
43085
43175
  }
43086
43176
 
43087
- // ../circle-ir/dist/analysis/path-classification.js
43177
+ // node_modules/circle-ir/dist/analysis/path-classification.js
43088
43178
  var TEST_PATH_PATTERNS = [
43089
43179
  /(^|\/)test\//i,
43090
43180
  /(^|\/)tests\//i,
@@ -43121,7 +43211,7 @@ function isTestPath(filepath) {
43121
43211
  return false;
43122
43212
  }
43123
43213
 
43124
- // ../circle-ir/dist/analysis/passes/weak-crypto-pass.js
43214
+ // node_modules/circle-ir/dist/analysis/passes/weak-crypto-pass.js
43125
43215
  var WEAK_CIPHER_BASES = new Set([
43126
43216
  "des",
43127
43217
  "3des",
@@ -43626,7 +43716,7 @@ class WeakCryptoPass {
43626
43716
  }
43627
43717
  }
43628
43718
 
43629
- // ../circle-ir/dist/analysis/passes/weak-random-pass.js
43719
+ // node_modules/circle-ir/dist/analysis/passes/weak-random-pass.js
43630
43720
  var JAVA_RANDOM_METHODS = new Set([
43631
43721
  "nextInt",
43632
43722
  "nextLong",
@@ -43799,7 +43889,7 @@ class WeakRandomPass {
43799
43889
  }
43800
43890
  }
43801
43891
 
43802
- // ../circle-ir/dist/analysis/passes/_credential-helpers.js
43892
+ // node_modules/circle-ir/dist/analysis/passes/_credential-helpers.js
43803
43893
  var CRED_KEYWORD_RE2 = /(?:password|passwd|pwd|secret|api[_-]?key|auth[_-]?token|private[_-]?key|access[_-]?key|credential)/i;
43804
43894
  function isCredentialIdentifier(name2) {
43805
43895
  if (!name2)
@@ -43892,7 +43982,7 @@ function priorHashOf(varName, priorCalls) {
43892
43982
  return false;
43893
43983
  }
43894
43984
 
43895
- // ../circle-ir/dist/analysis/passes/weak-password-hash-pass.js
43985
+ // node_modules/circle-ir/dist/analysis/passes/weak-password-hash-pass.js
43896
43986
  var FAST_HASH_NAMES = new Set([
43897
43987
  "sha224",
43898
43988
  "sha-224",
@@ -44051,7 +44141,7 @@ class WeakPasswordHashPass {
44051
44141
  }
44052
44142
  }
44053
44143
 
44054
- // ../circle-ir/dist/analysis/passes/weak-password-encoding-pass.js
44144
+ // node_modules/circle-ir/dist/analysis/passes/weak-password-encoding-pass.js
44055
44145
  function isBasicAuthContext(call, code) {
44056
44146
  const line = call.location.line;
44057
44147
  if (line < 1)
@@ -44163,7 +44253,7 @@ class WeakPasswordEncodingPass {
44163
44253
  }
44164
44254
  }
44165
44255
 
44166
- // ../circle-ir/dist/analysis/passes/info-disclosure-stacktrace-pass.js
44256
+ // node_modules/circle-ir/dist/analysis/passes/info-disclosure-stacktrace-pass.js
44167
44257
  var RESPONSE_RECEIVER_RE = /^(res|response|w|writer|ctx|c)$/i;
44168
44258
  var LOGGER_RECEIVER_RE = /^(log|logger|slog|console|pino|winston|sentry)$/i;
44169
44259
  var RESPONSE_SEND_METHODS = new Set([
@@ -44349,7 +44439,7 @@ class InfoDisclosureStacktracePass {
44349
44439
  }
44350
44440
  }
44351
44441
 
44352
- // ../circle-ir/dist/analysis/passes/unrestricted-file-upload-pass.js
44442
+ // node_modules/circle-ir/dist/analysis/passes/unrestricted-file-upload-pass.js
44353
44443
  var UPLOAD_NAME_RE = /(?:getOriginalFilename|getSubmittedFileName|originalname|originalName|\.filename|\.Filename|FileHeader\.Filename|UploadFile)/;
44354
44444
  var FILE_SAFE_CALL_RE = /(?:secure_filename|FilenameUtils\.getExtension|\.lastIndexOf\(['"]\.['"]\)|ALLOWED_EXT|ALLOWED_EXTENSIONS|allowedExtensions|\bfileFilter\b|filepath\.Ext|path\.extname)/;
44355
44445
  function lineWindow(lines, startLine, endLine) {
@@ -44500,7 +44590,7 @@ class UnrestrictedFileUploadPass {
44500
44590
  }
44501
44591
  }
44502
44592
 
44503
- // ../circle-ir/dist/analysis/passes/missing-sanitizer-gate-pass.js
44593
+ // node_modules/circle-ir/dist/analysis/passes/missing-sanitizer-gate-pass.js
44504
44594
  var HTML_OUTPUT_SINKS = new Set([
44505
44595
  "addAttribute",
44506
44596
  "setAttribute",
@@ -44648,7 +44738,7 @@ function methodAcceptsHtmlShapedParam(method) {
44648
44738
  return false;
44649
44739
  }
44650
44740
 
44651
- // ../circle-ir/dist/analysis/passes/insecure-deserialization-config-pass.js
44741
+ // node_modules/circle-ir/dist/analysis/passes/insecure-deserialization-config-pass.js
44652
44742
  var ANY_TYPE_PERMISSION_RE = /\bAnyTypePermission\b/;
44653
44743
 
44654
44744
  class InsecureDeserializationConfigPass {
@@ -44726,7 +44816,7 @@ class InsecureDeserializationConfigPass {
44726
44816
  }
44727
44817
  var INSECURE_TYPE_NAME_HANDLING_RE = /\bTypeNameHandling\s*=\s*(?:Newtonsoft\.Json\.)?TypeNameHandling\.(All|Auto|Objects|Arrays)\b/;
44728
44818
 
44729
- // ../circle-ir/dist/analysis/passes/plaintext-password-storage-pass.js
44819
+ // node_modules/circle-ir/dist/analysis/passes/plaintext-password-storage-pass.js
44730
44820
  function isWriteStorageCall(call, language) {
44731
44821
  const method = call.method_name ?? "";
44732
44822
  const receiver = call.receiver ?? "";
@@ -44837,7 +44927,7 @@ class PlaintextPasswordStoragePass {
44837
44927
  }
44838
44928
  }
44839
44929
 
44840
- // ../circle-ir/dist/analysis/passes/cleartext-credential-transport-pass.js
44930
+ // node_modules/circle-ir/dist/analysis/passes/cleartext-credential-transport-pass.js
44841
44931
  var LOCALHOST_RE = /^(?:localhost|127\.0\.0\.1|0\.0\.0\.0)(?::\d+)?$/i;
44842
44932
  function isInsecureHttpUrl(urlLiteral) {
44843
44933
  if (!urlLiteral)
@@ -44965,7 +45055,7 @@ class CleartextCredentialTransportPass {
44965
45055
  }
44966
45056
  }
44967
45057
 
44968
- // ../circle-ir/dist/analysis/passes/tls-verify-disabled-pass.js
45058
+ // node_modules/circle-ir/dist/analysis/passes/tls-verify-disabled-pass.js
44969
45059
  var PY_HTTP_METHODS = new Set([
44970
45060
  "get",
44971
45061
  "post",
@@ -45178,7 +45268,7 @@ class TlsVerifyDisabledPass {
45178
45268
  }
45179
45269
  }
45180
45270
 
45181
- // ../circle-ir/dist/analysis/passes/module-side-effect-pass.js
45271
+ // node_modules/circle-ir/dist/analysis/passes/module-side-effect-pass.js
45182
45272
  var JS_EXEC_METHODS = new Set([
45183
45273
  "exec",
45184
45274
  "spawn",
@@ -45409,7 +45499,7 @@ class ModuleSideEffectPass {
45409
45499
  }
45410
45500
  }
45411
45501
 
45412
- // ../circle-ir/dist/analysis/passes/cache-no-vary-pass.js
45502
+ // node_modules/circle-ir/dist/analysis/passes/cache-no-vary-pass.js
45413
45503
  function isSharedCacheable(value) {
45414
45504
  const v = value.toLowerCase();
45415
45505
  if (/\b(private|no-store|no-cache)\b/.test(v))
@@ -45696,7 +45786,7 @@ class CacheNoVaryPass {
45696
45786
  }
45697
45787
  }
45698
45788
 
45699
- // ../circle-ir/dist/analysis/passes/jwt-verify-disabled-pass.js
45789
+ // node_modules/circle-ir/dist/analysis/passes/jwt-verify-disabled-pass.js
45700
45790
  var PY_VERIFY_SIGNATURE_FALSE_RE = /["']verify_signature["']\s*:\s*False\b/;
45701
45791
  var PY_VERIFY_KW_FALSE_RE = /\bverify\s*=\s*False\b/;
45702
45792
  var PY_ALG_NONE_RE = /\balgorithms\s*=\s*[\[\(]\s*["']none["']/i;
@@ -45821,7 +45911,7 @@ class JwtVerifyDisabledPass {
45821
45911
  }
45822
45912
  }
45823
45913
 
45824
- // ../circle-ir/dist/analysis/passes/csrf-protection-disabled-pass.js
45914
+ // node_modules/circle-ir/dist/analysis/passes/csrf-protection-disabled-pass.js
45825
45915
  var JAVA_CSRF_DISABLE_RE = /\.csrf\s*\([^)]*\)\s*\.\s*disable\b/;
45826
45916
  var JAVA_CSRF_LAMBDA_DISABLE_RE = /\bcsrf\s*\(\s*\w+\s*->\s*\w+\s*\.\s*disable\s*\(/;
45827
45917
  var JAVA_CSRF_METHODREF_RE = /\bcsrf\s*\(\s*[\w.]+::disable\s*\)/;
@@ -45957,7 +46047,7 @@ class CsrfProtectionDisabledPass {
45957
46047
  }
45958
46048
  }
45959
46049
 
45960
- // ../circle-ir/dist/analysis/passes/xml-entity-expansion-pass.js
46050
+ // node_modules/circle-ir/dist/analysis/passes/xml-entity-expansion-pass.js
45961
46051
  var JAVA_FACTORIES = new Set([
45962
46052
  "SAXParserFactory",
45963
46053
  "DocumentBuilderFactory",
@@ -46097,7 +46187,7 @@ class XmlEntityExpansionPass {
46097
46187
  }
46098
46188
  }
46099
46189
 
46100
- // ../circle-ir/dist/analysis/passes/mass-assignment-pass.js
46190
+ // node_modules/circle-ir/dist/analysis/passes/mass-assignment-pass.js
46101
46191
  var PY_KWARGS_SPLAT_RE = /\*\*\s*(?:request|self\.request|flask\.request|ctx|self)\s*\.\s*(?:form|args|values|json|get_json\s*\(\s*\)|files|data)/;
46102
46192
  var JS_OBJECT_SPREAD_RE = /\{\s*\.\.\.\s*(?:req|request|ctx|context)(?:\.request)?\s*\.\s*(?:body|query|params|form)\b/;
46103
46193
 
@@ -46181,7 +46271,7 @@ class MassAssignmentPass {
46181
46271
  }
46182
46272
  }
46183
46273
 
46184
- // ../circle-ir/dist/graph/import-graph.js
46274
+ // node_modules/circle-ir/dist/graph/import-graph.js
46185
46275
  function dirname(filePath) {
46186
46276
  const idx = filePath.lastIndexOf("/");
46187
46277
  return idx >= 0 ? filePath.slice(0, idx) : "";
@@ -46314,7 +46404,7 @@ class ImportGraph2 {
46314
46404
  }
46315
46405
  }
46316
46406
 
46317
- // ../circle-ir/dist/analysis/passes/circular-dependency-pass.js
46407
+ // node_modules/circle-ir/dist/analysis/passes/circular-dependency-pass.js
46318
46408
  class CircularDependencyPass {
46319
46409
  run(_projectGraph, importGraph) {
46320
46410
  const findings = [];
@@ -46341,7 +46431,7 @@ class CircularDependencyPass {
46341
46431
  }
46342
46432
  }
46343
46433
 
46344
- // ../circle-ir/dist/analysis/passes/orphan-module-pass.js
46434
+ // node_modules/circle-ir/dist/analysis/passes/orphan-module-pass.js
46345
46435
  class OrphanModulePass {
46346
46436
  run(_projectGraph, importGraph) {
46347
46437
  const findings = [];
@@ -46365,7 +46455,7 @@ class OrphanModulePass {
46365
46455
  }
46366
46456
  }
46367
46457
 
46368
- // ../circle-ir/dist/analysis/metrics/passes/size-metrics-pass.js
46458
+ // node_modules/circle-ir/dist/analysis/metrics/passes/size-metrics-pass.js
46369
46459
  class SizeMetricsPass {
46370
46460
  name = "size-metrics";
46371
46461
  run(ctx) {
@@ -46421,7 +46511,7 @@ class SizeMetricsPass {
46421
46511
  }
46422
46512
  }
46423
46513
 
46424
- // ../circle-ir/dist/analysis/metrics/passes/complexity-metrics-pass.js
46514
+ // node_modules/circle-ir/dist/analysis/metrics/passes/complexity-metrics-pass.js
46425
46515
  class ComplexityMetricsPass {
46426
46516
  name = "complexity-metrics";
46427
46517
  run(ctx) {
@@ -46485,7 +46575,7 @@ class ComplexityMetricsPass {
46485
46575
  }
46486
46576
  }
46487
46577
 
46488
- // ../circle-ir/dist/analysis/metrics/passes/halstead-metrics-pass.js
46578
+ // node_modules/circle-ir/dist/analysis/metrics/passes/halstead-metrics-pass.js
46489
46579
  var KEYWORDS = new Set([
46490
46580
  "if",
46491
46581
  "else",
@@ -46640,7 +46730,7 @@ class HalsteadMetricsPass {
46640
46730
  }
46641
46731
  }
46642
46732
 
46643
- // ../circle-ir/dist/analysis/metrics/passes/data-flow-metrics-pass.js
46733
+ // node_modules/circle-ir/dist/analysis/metrics/passes/data-flow-metrics-pass.js
46644
46734
  class DataFlowMetricsPass {
46645
46735
  name = "data-flow-metrics";
46646
46736
  run(ctx) {
@@ -46658,7 +46748,7 @@ class DataFlowMetricsPass {
46658
46748
  }
46659
46749
  }
46660
46750
 
46661
- // ../circle-ir/dist/analysis/metrics/passes/coupling-metrics-pass.js
46751
+ // node_modules/circle-ir/dist/analysis/metrics/passes/coupling-metrics-pass.js
46662
46752
  class CouplingMetricsPass {
46663
46753
  name = "coupling-metrics";
46664
46754
  run(ctx) {
@@ -46736,7 +46826,7 @@ class CouplingMetricsPass {
46736
46826
  }
46737
46827
  }
46738
46828
 
46739
- // ../circle-ir/dist/analysis/metrics/passes/inheritance-metrics-pass.js
46829
+ // node_modules/circle-ir/dist/analysis/metrics/passes/inheritance-metrics-pass.js
46740
46830
  class InheritanceMetricsPass {
46741
46831
  name = "inheritance-metrics";
46742
46832
  run(ctx) {
@@ -46796,7 +46886,7 @@ class InheritanceMetricsPass {
46796
46886
  }
46797
46887
  }
46798
46888
 
46799
- // ../circle-ir/dist/analysis/metrics/passes/cohesion-metrics-pass.js
46889
+ // node_modules/circle-ir/dist/analysis/metrics/passes/cohesion-metrics-pass.js
46800
46890
  class CohesionMetricsPass {
46801
46891
  name = "cohesion-metrics";
46802
46892
  run(ctx) {
@@ -46879,7 +46969,7 @@ class CohesionMetricsPass {
46879
46969
  }
46880
46970
  }
46881
46971
 
46882
- // ../circle-ir/dist/analysis/metrics/passes/documentation-metrics-pass.js
46972
+ // node_modules/circle-ir/dist/analysis/metrics/passes/documentation-metrics-pass.js
46883
46973
  class DocumentationMetricsPass {
46884
46974
  name = "documentation-metrics";
46885
46975
  run(ctx) {
@@ -46932,7 +47022,7 @@ class DocumentationMetricsPass {
46932
47022
  }
46933
47023
  }
46934
47024
 
46935
- // ../circle-ir/dist/analysis/metrics/passes/composite-metrics-pass.js
47025
+ // node_modules/circle-ir/dist/analysis/metrics/passes/composite-metrics-pass.js
46936
47026
  class CompositeMetricsPass {
46937
47027
  name = "composite-metrics";
46938
47028
  run(ctx) {
@@ -46991,7 +47081,7 @@ class CompositeMetricsPass {
46991
47081
  }
46992
47082
  }
46993
47083
 
46994
- // ../circle-ir/dist/analysis/metrics/metric-runner.js
47084
+ // node_modules/circle-ir/dist/analysis/metrics/metric-runner.js
46995
47085
  class MetricRunner {
46996
47086
  passes = [
46997
47087
  new SizeMetricsPass,
@@ -47013,7 +47103,7 @@ class MetricRunner {
47013
47103
  return accumulated;
47014
47104
  }
47015
47105
  }
47016
- // ../circle-ir/dist/analyzer.js
47106
+ // node_modules/circle-ir/dist/analyzer.js
47017
47107
  var initialized = false;
47018
47108
  async function initAnalyzer(options = {}) {
47019
47109
  if (initialized)
@@ -47685,7 +47775,7 @@ function deriveProjectRoot(paths) {
47685
47775
  }
47686
47776
  return common.join("/") || "/";
47687
47777
  }
47688
- // ../circle-ir/dist/analysis/sbom.js
47778
+ // node_modules/circle-ir/dist/analysis/sbom.js
47689
47779
  function purlVersion(spec) {
47690
47780
  const stripped = spec.trim().replace(/^[\s^~=<>]+/, "");
47691
47781
  if (/^v?[0-9][\w.\-+]*$/.test(stripped))
@@ -48731,7 +48821,7 @@ var colors = {
48731
48821
  };
48732
48822
 
48733
48823
  // src/version.ts
48734
- var version = "4.9.8";
48824
+ var version = "4.9.10";
48735
48825
 
48736
48826
  // src/formatters.ts
48737
48827
  var LIBRARY_API_SURFACE_TAG2 = "library-api-surface:caller-responsibility";
@@ -49284,8 +49374,8 @@ function generateSarifResults(results, crossFileData) {
49284
49374
 
49285
49375
  // src/build-info.ts
49286
49376
  var buildInfo = {
49287
- gitSha: "5e6bcc1",
49288
- builtAt: "2026-08-25T19:50:02.936Z"
49377
+ gitSha: "132eaf6",
49378
+ builtAt: "2026-09-02T06:21:26.855Z"
49289
49379
  };
49290
49380
 
49291
49381
  // src/utils/args.ts