@hookwarden/engine 0.0.1 → 0.1.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/dist/adapters/django.d.ts +4 -0
- package/dist/adapters/django.d.ts.map +1 -0
- package/dist/adapters/django.js +148 -0
- package/dist/adapters/django.js.map +1 -0
- package/dist/adapters/fastapi.d.ts +4 -0
- package/dist/adapters/fastapi.d.ts.map +1 -0
- package/dist/adapters/fastapi.js +118 -0
- package/dist/adapters/fastapi.js.map +1 -0
- package/dist/adapters/index.d.ts +9 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +10 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/nextjs.d.ts +4 -0
- package/dist/adapters/nextjs.d.ts.map +1 -0
- package/dist/adapters/nextjs.js +82 -0
- package/dist/adapters/nextjs.js.map +1 -0
- package/dist/evaluate.d.ts +6 -0
- package/dist/evaluate.d.ts.map +1 -0
- package/dist/evaluate.js +108 -0
- package/dist/evaluate.js.map +1 -0
- package/dist/evaluator/index.d.ts +4 -0
- package/dist/evaluator/index.d.ts.map +1 -0
- package/dist/evaluator/index.js +4 -0
- package/dist/evaluator/index.js.map +1 -0
- package/dist/evaluator/matchers.d.ts +13 -0
- package/dist/evaluator/matchers.d.ts.map +1 -0
- package/dist/evaluator/matchers.js +124 -0
- package/dist/evaluator/matchers.js.map +1 -0
- package/dist/evaluator/parse-error.d.ts +4 -0
- package/dist/evaluator/parse-error.d.ts.map +1 -0
- package/dist/evaluator/parse-error.js +46 -0
- package/dist/evaluator/parse-error.js.map +1 -0
- package/dist/evaluator/path-severity-overrides.d.ts +4 -0
- package/dist/evaluator/path-severity-overrides.d.ts.map +1 -0
- package/dist/evaluator/path-severity-overrides.js +29 -0
- package/dist/evaluator/path-severity-overrides.js.map +1 -0
- package/dist/evaluator/visit.d.ts +16 -0
- package/dist/evaluator/visit.d.ts.map +1 -0
- package/dist/evaluator/visit.js +96 -0
- package/dist/evaluator/visit.js.map +1 -0
- package/dist/findings/fingerprint.d.ts +22 -0
- package/dist/findings/fingerprint.d.ts.map +1 -0
- package/dist/findings/fingerprint.js +39 -0
- package/dist/findings/fingerprint.js.map +1 -0
- package/dist/findings/index.d.ts +3 -0
- package/dist/findings/index.d.ts.map +1 -0
- package/dist/findings/index.js +4 -0
- package/dist/findings/index.js.map +1 -0
- package/dist/findings/webcrypto.d.ts +2 -0
- package/dist/findings/webcrypto.d.ts.map +1 -0
- package/dist/findings/webcrypto.js +15 -0
- package/dist/findings/webcrypto.js.map +1 -0
- package/dist/index.d.ts +8 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -4
- package/dist/index.js.map +1 -1
- package/dist/model/build.d.ts +12 -0
- package/dist/model/build.d.ts.map +1 -0
- package/dist/model/build.js +154 -0
- package/dist/model/build.js.map +1 -0
- package/dist/model/catalog.d.ts +17 -0
- package/dist/model/catalog.d.ts.map +1 -0
- package/dist/model/catalog.js +303 -0
- package/dist/model/catalog.js.map +1 -0
- package/dist/model/evidence.d.ts +18 -0
- package/dist/model/evidence.d.ts.map +1 -0
- package/dist/model/evidence.js +114 -0
- package/dist/model/evidence.js.map +1 -0
- package/dist/model/index.d.ts +6 -0
- package/dist/model/index.d.ts.map +1 -0
- package/dist/model/index.js +7 -0
- package/dist/model/index.js.map +1 -0
- package/dist/model/middleware.d.ts +10 -0
- package/dist/model/middleware.d.ts.map +1 -0
- package/dist/model/middleware.js +140 -0
- package/dist/model/middleware.js.map +1 -0
- package/dist/model/reachability.d.ts +11 -0
- package/dist/model/reachability.d.ts.map +1 -0
- package/dist/model/reachability.js +260 -0
- package/dist/model/reachability.js.map +1 -0
- package/dist/parsers/babel.d.ts +11 -0
- package/dist/parsers/babel.d.ts.map +1 -0
- package/dist/parsers/babel.js +121 -0
- package/dist/parsers/babel.js.map +1 -0
- package/dist/parsers/index.d.ts +6 -0
- package/dist/parsers/index.d.ts.map +1 -0
- package/dist/parsers/index.js +7 -0
- package/dist/parsers/index.js.map +1 -0
- package/dist/parsers/literals.d.ts +4 -0
- package/dist/parsers/literals.d.ts.map +1 -0
- package/dist/parsers/literals.js +37 -0
- package/dist/parsers/literals.js.map +1 -0
- package/dist/parsers/python-literals.d.ts +5 -0
- package/dist/parsers/python-literals.d.ts.map +1 -0
- package/dist/parsers/python-literals.js +62 -0
- package/dist/parsers/python-literals.js.map +1 -0
- package/dist/parsers/python-loader.d.ts +9 -0
- package/dist/parsers/python-loader.d.ts.map +1 -0
- package/dist/parsers/python-loader.js +16 -0
- package/dist/parsers/python-loader.js.map +1 -0
- package/dist/parsers/python.d.ts +8 -0
- package/dist/parsers/python.d.ts.map +1 -0
- package/dist/parsers/python.js +125 -0
- package/dist/parsers/python.js.map +1 -0
- package/dist/parsers/walk.d.ts +15 -0
- package/dist/parsers/walk.d.ts.map +1 -0
- package/dist/parsers/walk.js +66 -0
- package/dist/parsers/walk.js.map +1 -0
- package/dist/redaction/index.d.ts +3 -0
- package/dist/redaction/index.d.ts.map +1 -0
- package/dist/redaction/index.js +2 -0
- package/dist/redaction/index.js.map +1 -0
- package/dist/redaction/structural.d.ts +14 -0
- package/dist/redaction/structural.d.ts.map +1 -0
- package/dist/redaction/structural.js +37 -0
- package/dist/redaction/structural.js.map +1 -0
- package/dist/types/config.d.ts +7 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +6 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/finding.d.ts +32 -0
- package/dist/types/finding.d.ts.map +1 -0
- package/dist/types/finding.js +12 -0
- package/dist/types/finding.js.map +1 -0
- package/dist/types/handler.d.ts +39 -0
- package/dist/types/handler.d.ts.map +1 -0
- package/dist/types/handler.js +7 -0
- package/dist/types/handler.js.map +1 -0
- package/dist/types/index.d.ts +7 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +4 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/project-model.d.ts +42 -0
- package/dist/types/project-model.d.ts.map +1 -0
- package/dist/types/project-model.js +5 -0
- package/dist/types/project-model.js.map +1 -0
- package/dist/types/rule-set.d.ts +42 -0
- package/dist/types/rule-set.d.ts.map +1 -0
- package/dist/types/rule-set.js +6 -0
- package/dist/types/rule-set.js.map +1 -0
- package/dist/types/scan-result.d.ts +19 -0
- package/dist/types/scan-result.d.ts.map +1 -0
- package/dist/types/scan-result.js +8 -0
- package/dist/types/scan-result.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +5 -0
- package/dist/version.js.map +1 -0
- package/package.json +12 -1
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
// D-28: declarative matcher implementations. Each returns Verdict | null.
|
|
2
|
+
// null = matcher does not apply to this handler (engine emits no Finding for that rule).
|
|
3
|
+
// Pure: WebhookHandler + ProjectModel + ProviderCatalog inputs only. No I/O.
|
|
4
|
+
//
|
|
5
|
+
// Issue #6 fix: argumentEquals is fully implemented. It walks the handler's source-file AST
|
|
6
|
+
// for a CallExpression whose callee matches the rule's `call`, then compares args[arg_index]'s
|
|
7
|
+
// literal value to `equals`.
|
|
8
|
+
import { walkBabelAst } from "../parsers/walk.js";
|
|
9
|
+
export function applyMatcher(input) {
|
|
10
|
+
const { matcher, handler, emits_state } = input;
|
|
11
|
+
const args = matcher.args;
|
|
12
|
+
switch (matcher.name) {
|
|
13
|
+
case "importMissing": {
|
|
14
|
+
const module = String(args["module"] ?? "");
|
|
15
|
+
const file = input.model.parsed_files.find((f) => f.file_path === handler.file_path);
|
|
16
|
+
const present = file?.imports.some((i) => i.to_module === module) ?? false;
|
|
17
|
+
return present ? null : emits_state;
|
|
18
|
+
}
|
|
19
|
+
case "callMatches": {
|
|
20
|
+
const qn = String(args["qualified_name"] ?? "");
|
|
21
|
+
const present = handler.reachable_symbols.some((s) => s.qualified_name === qn || s.qualified_name.endsWith(`.${qn}`));
|
|
22
|
+
return present ? emits_state : null;
|
|
23
|
+
}
|
|
24
|
+
case "secretLiteralPrefix": {
|
|
25
|
+
const prefix = String(args["prefix"] ?? "");
|
|
26
|
+
const present = handler.evidence.some((e) => e.kind === "secret_literal_match" && e.detail === prefix);
|
|
27
|
+
return present ? emits_state : null;
|
|
28
|
+
}
|
|
29
|
+
case "signatureHeaderRead": {
|
|
30
|
+
const header = String(args["header"] ?? "").toLowerCase();
|
|
31
|
+
const present = handler.evidence.some((e) => e.kind === "signature_header_read" && e.detail.toLowerCase() === header);
|
|
32
|
+
return present ? emits_state : null;
|
|
33
|
+
}
|
|
34
|
+
case "middlewareOrder": {
|
|
35
|
+
const before = String(args["before"] ?? "");
|
|
36
|
+
const after = String(args["after"] ?? "");
|
|
37
|
+
const chain = handler.middleware_chain;
|
|
38
|
+
const idxBefore = chain.findIndex((m) => m.name === before);
|
|
39
|
+
const idxAfter = chain.findIndex((m) => m.name === after);
|
|
40
|
+
if (idxBefore < 0 || idxAfter < 0)
|
|
41
|
+
return null;
|
|
42
|
+
return idxBefore < idxAfter ? emits_state : null;
|
|
43
|
+
}
|
|
44
|
+
case "argumentEquals": {
|
|
45
|
+
// Issue #6 fix — IMPLEMENTED. Walk the handler's source file AST for a CallExpression whose
|
|
46
|
+
// callee matches `call`; compare args[arg_index]'s literal value to `equals`.
|
|
47
|
+
const callName = String(args["call"] ?? "");
|
|
48
|
+
const argIndex = typeof args["arg_index"] === "number" ? args["arg_index"] : 0;
|
|
49
|
+
const equals = args["equals"];
|
|
50
|
+
// Quick reachability gate — if the call isn't even reachable, the matcher cannot apply.
|
|
51
|
+
const reachable = handler.reachable_symbols.some((s) => s.qualified_name === callName || s.qualified_name.endsWith(`.${callName}`));
|
|
52
|
+
if (!reachable)
|
|
53
|
+
return null;
|
|
54
|
+
const file = input.model.parsed_files.find((f) => f.file_path === handler.file_path);
|
|
55
|
+
if (!file || file.parse_error !== null || file.raw_ast === null)
|
|
56
|
+
return null;
|
|
57
|
+
if (file.dialect !== "babel") {
|
|
58
|
+
// Python AST argument inspection has a different tree-sitter shape. v1 supports Babel;
|
|
59
|
+
// Python rules that need argumentEquals can use a TS predicate (D-28 escape hatch).
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
const matched = findCallArgEquals(file.raw_ast, callName, argIndex, equals);
|
|
63
|
+
if (matched === null)
|
|
64
|
+
return null;
|
|
65
|
+
return matched ? emits_state : null;
|
|
66
|
+
}
|
|
67
|
+
default: {
|
|
68
|
+
// Exhaustiveness check — TS will error here if a new MatcherName is added without a case.
|
|
69
|
+
const exhaustiveCheck = matcher.name;
|
|
70
|
+
throw new Error(`unsupported matcher name: ${String(exhaustiveCheck)}`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// Babel AST walker: returns true if any CallExpression with matching callee qname has its
|
|
75
|
+
// argN literal === equals; false if a matching call exists but the arg differs; null if no
|
|
76
|
+
// matching call exists at all (matcher does not apply).
|
|
77
|
+
function findCallArgEquals(ast, callName, argIndex, equals) {
|
|
78
|
+
let foundAnyCall = false;
|
|
79
|
+
let foundMatch = false;
|
|
80
|
+
walkBabelAst(ast, (node) => {
|
|
81
|
+
if (node.type !== "CallExpression")
|
|
82
|
+
return;
|
|
83
|
+
const qn = qnameBabel(node.callee);
|
|
84
|
+
if (qn === null)
|
|
85
|
+
return;
|
|
86
|
+
if (qn !== callName && !qn.endsWith(`.${callName}`))
|
|
87
|
+
return;
|
|
88
|
+
foundAnyCall = true;
|
|
89
|
+
const arg = node.arguments[argIndex];
|
|
90
|
+
if (!arg)
|
|
91
|
+
return;
|
|
92
|
+
if (arg.type === "StringLiteral" && typeof equals === "string" && arg.value === equals) {
|
|
93
|
+
foundMatch = true;
|
|
94
|
+
}
|
|
95
|
+
else if (arg.type === "NumericLiteral" &&
|
|
96
|
+
typeof equals === "number" &&
|
|
97
|
+
arg.value === equals) {
|
|
98
|
+
foundMatch = true;
|
|
99
|
+
}
|
|
100
|
+
else if (typeof equals === "string" && equals === "") {
|
|
101
|
+
// Rule emits "" to mean "no value" — match against null/undefined args.
|
|
102
|
+
if (arg.type === "NullLiteral")
|
|
103
|
+
foundMatch = true;
|
|
104
|
+
else if (arg.type === "Identifier" && arg.name === "undefined")
|
|
105
|
+
foundMatch = true;
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
if (!foundAnyCall)
|
|
109
|
+
return null;
|
|
110
|
+
return foundMatch;
|
|
111
|
+
}
|
|
112
|
+
function qnameBabel(node) {
|
|
113
|
+
if (node.type === "Identifier")
|
|
114
|
+
return node.name;
|
|
115
|
+
if (node.type === "MemberExpression") {
|
|
116
|
+
const obj = qnameBabel(node.object);
|
|
117
|
+
if (!obj)
|
|
118
|
+
return null;
|
|
119
|
+
if (node.property.type === "Identifier")
|
|
120
|
+
return `${obj}.${node.property.name}`;
|
|
121
|
+
}
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=matchers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matchers.js","sourceRoot":"","sources":["../../src/evaluator/matchers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-error.d.ts","sourceRoot":"","sources":["../../src/evaluator/parse-error.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAE5D,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,CAuC/E"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
// D-27 + ENGINE-07: every file with parse_error produces exactly ONE Finding.
|
|
2
|
+
// rule_id is engine-internal: "engine/parse-error". Severity high (locked). State manual-review
|
|
3
|
+
// (the engine cannot say verified/not-verified about a file it can't parse).
|
|
4
|
+
import { computeFindingId, computePrimaryLocationLineHash } from "../findings/fingerprint.js";
|
|
5
|
+
import { redactSnippet } from "../redaction/structural.js";
|
|
6
|
+
export async function buildParseErrorFinding(file) {
|
|
7
|
+
if (file.parse_error === null) {
|
|
8
|
+
throw new Error("buildParseErrorFinding called on a file without parse_error");
|
|
9
|
+
}
|
|
10
|
+
const { line, col } = file.parse_error.location;
|
|
11
|
+
// Snippet: the source line where the parse failed, with literals redacted (D-39).
|
|
12
|
+
// We can't extract literals without a parse, so we redact the whole line as a single placeholder.
|
|
13
|
+
const lines = file.source_text.split(/\r?\n/);
|
|
14
|
+
const lineText = lines[Math.max(0, line - 1)] ?? "";
|
|
15
|
+
const snippet = redactSnippet({
|
|
16
|
+
source_text: lineText,
|
|
17
|
+
literals: [{ kind: "string", start: 0, end: lineText.length, value: lineText }],
|
|
18
|
+
});
|
|
19
|
+
const primaryLocationLineHash = await computePrimaryLocationLineHash({
|
|
20
|
+
rule_id: "engine/parse-error",
|
|
21
|
+
file_path: file.file_path,
|
|
22
|
+
node_kind: "ParseError",
|
|
23
|
+
line_text: lineText,
|
|
24
|
+
});
|
|
25
|
+
const id = await computeFindingId({
|
|
26
|
+
rule_id: "engine/parse-error",
|
|
27
|
+
handler_id: null,
|
|
28
|
+
file_path: file.file_path,
|
|
29
|
+
primary_location_line_hash: primaryLocationLineHash,
|
|
30
|
+
});
|
|
31
|
+
return {
|
|
32
|
+
id,
|
|
33
|
+
rule_id: "engine/parse-error",
|
|
34
|
+
provider: "unknown",
|
|
35
|
+
severity: "high",
|
|
36
|
+
state: "manual-review",
|
|
37
|
+
file_path: file.file_path,
|
|
38
|
+
location: { line, col, end_line: line, end_col: col + 1 },
|
|
39
|
+
snippet,
|
|
40
|
+
handler_id: null,
|
|
41
|
+
primary_location_line_hash: primaryLocationLineHash,
|
|
42
|
+
message: file.parse_error.message,
|
|
43
|
+
metadata: { source: file.parse_error.source },
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=parse-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-error.js","sourceRoot":"","sources":["../../src/evaluator/parse-error.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,gGAAgG;AAChG,6EAA6E;AAE7E,OAAO,EAAE,gBAAgB,EAAE,8BAA8B,EAAE,MAAM,4BAA4B,CAAC;AAC9F,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAI3D,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,IAAgB;IAC3D,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;IACjF,CAAC;IACD,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;IAChD,kFAAkF;IAClF,kGAAkG;IAClG,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACpD,MAAM,OAAO,GAAG,aAAa,CAAC;QAC5B,WAAW,EAAE,QAAQ;QACrB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;KAChF,CAAC,CAAC;IACH,MAAM,uBAAuB,GAAG,MAAM,8BAA8B,CAAC;QACnE,OAAO,EAAE,oBAAoB;QAC7B,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,SAAS,EAAE,YAAY;QACvB,SAAS,EAAE,QAAQ;KACpB,CAAC,CAAC;IACH,MAAM,EAAE,GAAG,MAAM,gBAAgB,CAAC;QAChC,OAAO,EAAE,oBAAoB;QAC7B,UAAU,EAAE,IAAI;QAChB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,0BAA0B,EAAE,uBAAuB;KACpD,CAAC,CAAC;IACH,OAAO;QACL,EAAE;QACF,OAAO,EAAE,oBAAoB;QAC7B,QAAQ,EAAE,SAAS;QACnB,QAAQ,EAAE,MAAM;QAChB,KAAK,EAAE,eAAe;QACtB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,QAAQ,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,EAAE;QACzD,OAAO;QACP,UAAU,EAAE,IAAI;QAChB,0BAA0B,EAAE,uBAAuB;QACnD,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,OAAO;QACjC,QAAQ,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE;KAC9C,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-severity-overrides.d.ts","sourceRoot":"","sources":["../../src/evaluator/path-severity-overrides.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAa1F"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// D-57 RULES-05: post-emit severity rewriter. Pure: no fs / http / network / process / node:*.
|
|
2
|
+
// Engine purity guard at .dependency-cruiser.cjs lines 4–38 forbids those imports here.
|
|
3
|
+
//
|
|
4
|
+
// Matches finding.file_path against each override's glob patterns (picomatch). On the FIRST
|
|
5
|
+
// matching override, replaces Finding.severity. Returns the finding unchanged when:
|
|
6
|
+
// - rule.path_severity_overrides is null
|
|
7
|
+
// - no override has a matching pattern
|
|
8
|
+
//
|
|
9
|
+
// Verification state (Finding.state, D-29) is NEVER touched — a hardcoded test secret is still
|
|
10
|
+
// `not-verified`, just at `info` severity.
|
|
11
|
+
import picomatch from "picomatch";
|
|
12
|
+
export function applyPathSeverityOverrides(finding, rule) {
|
|
13
|
+
const overrides = rule.path_severity_overrides;
|
|
14
|
+
if (overrides === null || overrides.length === 0)
|
|
15
|
+
return finding;
|
|
16
|
+
for (const override of overrides) {
|
|
17
|
+
if (override.patterns.length === 0)
|
|
18
|
+
continue;
|
|
19
|
+
const isMatch = picomatch(override.patterns, { dot: true });
|
|
20
|
+
if (isMatch(finding.file_path)) {
|
|
21
|
+
// Identity: do not produce a new object when severity is already the override target.
|
|
22
|
+
if (finding.severity === override.severity)
|
|
23
|
+
return finding;
|
|
24
|
+
return { ...finding, severity: override.severity };
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return finding;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=path-severity-overrides.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-severity-overrides.js","sourceRoot":"","sources":["../../src/evaluator/path-severity-overrides.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAC/F,wFAAwF;AACxF,EAAE;AACF,4FAA4F;AAC5F,oFAAoF;AACpF,2CAA2C;AAC3C,yCAAyC;AACzC,EAAE;AACF,+FAA+F;AAC/F,2CAA2C;AAE3C,OAAO,SAAS,MAAM,WAAW,CAAC;AAIlC,MAAM,UAAU,0BAA0B,CAAC,OAAgB,EAAE,IAAoB;IAC/E,MAAM,SAAS,GAAG,IAAI,CAAC,uBAAuB,CAAC;IAC/C,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC;IACjE,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAC7C,MAAM,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAC,QAAoB,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;QACxE,IAAI,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YAC/B,sFAAsF;YACtF,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,QAAQ;gBAAE,OAAO,OAAO,CAAC;YAC3D,OAAO,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACrD,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Finding, FindingId, Verdict } from "../types/finding.js";
|
|
2
|
+
import type { WebhookHandler } from "../types/handler.js";
|
|
3
|
+
import type { ProjectModel } from "../types/project-model.js";
|
|
4
|
+
import type { RuleSet } from "../types/rule-set.js";
|
|
5
|
+
export interface EvaluateForHandlerInput {
|
|
6
|
+
readonly handler: WebhookHandler;
|
|
7
|
+
readonly ruleSet: RuleSet;
|
|
8
|
+
readonly model: ProjectModel;
|
|
9
|
+
}
|
|
10
|
+
export interface EvaluateForHandlerOutput {
|
|
11
|
+
readonly findings: ReadonlyArray<Finding>;
|
|
12
|
+
readonly findings_ref: ReadonlyArray<FindingId>;
|
|
13
|
+
readonly worst_state: Verdict;
|
|
14
|
+
}
|
|
15
|
+
export declare function evaluateRulesForHandler(input: EvaluateForHandlerInput): Promise<EvaluateForHandlerOutput>;
|
|
16
|
+
//# sourceMappingURL=visit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visit.d.ts","sourceRoot":"","sources":["../../src/evaluator/visit.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EAAkB,OAAO,EAAE,MAAM,sBAAsB,CAAC;AASpE,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;CAC9B;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;IAC1C,QAAQ,CAAC,YAAY,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;IAChD,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;CAC/B;AAED,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,uBAAuB,GAC7B,OAAO,CAAC,wBAAwB,CAAC,CAenC"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
// Per-handler rule visitor. Walks ruleSet.rules, applies matcher OR predicate per D-28,
|
|
2
|
+
// emits one Finding per (rule, handler) match per D-30 (engine never dedups; renderer rollups).
|
|
3
|
+
import { computeFindingId, computePrimaryLocationLineHash } from "../findings/fingerprint.js";
|
|
4
|
+
import { applyMatcher } from "./matchers.js";
|
|
5
|
+
const VERDICT_RANK = {
|
|
6
|
+
verified: 0,
|
|
7
|
+
"manual-review": 1,
|
|
8
|
+
"not-verified": 2,
|
|
9
|
+
};
|
|
10
|
+
export async function evaluateRulesForHandler(input) {
|
|
11
|
+
const { handler, ruleSet, model } = input;
|
|
12
|
+
const findings = [];
|
|
13
|
+
const findingsRef = [];
|
|
14
|
+
let worst = "verified"; // optimistic baseline; rules promote toward not-verified
|
|
15
|
+
for (const rule of ruleSet.rules) {
|
|
16
|
+
if (!ruleAppliesToFramework(rule, handler.framework))
|
|
17
|
+
continue;
|
|
18
|
+
const verdict = await runRule(rule, handler, model, ruleSet);
|
|
19
|
+
if (verdict === null)
|
|
20
|
+
continue; // rule does not apply
|
|
21
|
+
const finding = await buildFinding(rule, handler, verdict);
|
|
22
|
+
findings.push(finding);
|
|
23
|
+
findingsRef.push(finding.id);
|
|
24
|
+
if (VERDICT_RANK[verdict] > VERDICT_RANK[worst])
|
|
25
|
+
worst = verdict;
|
|
26
|
+
}
|
|
27
|
+
return { findings, findings_ref: findingsRef, worst_state: worst };
|
|
28
|
+
}
|
|
29
|
+
function ruleAppliesToFramework(rule, framework) {
|
|
30
|
+
if (rule.applies_to === "all")
|
|
31
|
+
return true;
|
|
32
|
+
return rule.applies_to.includes(framework);
|
|
33
|
+
}
|
|
34
|
+
async function runRule(rule, handler, model, ruleSet) {
|
|
35
|
+
// D-28: a rule may have a matcher, a predicate, or both. If both are present, BOTH must agree
|
|
36
|
+
// (return same verdict) for the rule to fire — conservative. If only one is present, its
|
|
37
|
+
// verdict is the rule's verdict. Unmatched rule → null.
|
|
38
|
+
let matcherVerdict = null;
|
|
39
|
+
if (rule.matcher !== null) {
|
|
40
|
+
matcherVerdict = applyMatcher({
|
|
41
|
+
matcher: rule.matcher,
|
|
42
|
+
handler,
|
|
43
|
+
model,
|
|
44
|
+
providers: ruleSet.providers,
|
|
45
|
+
emits_state: rule.emits_state,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
let predicateVerdict = null;
|
|
49
|
+
if (rule.predicate_name !== null) {
|
|
50
|
+
const fn = ruleSet.predicates[rule.predicate_name];
|
|
51
|
+
if (fn)
|
|
52
|
+
predicateVerdict = await fn(handler, model);
|
|
53
|
+
}
|
|
54
|
+
if (rule.matcher !== null && rule.predicate_name !== null) {
|
|
55
|
+
if (matcherVerdict === null || predicateVerdict === null)
|
|
56
|
+
return null;
|
|
57
|
+
return matcherVerdict === predicateVerdict ? matcherVerdict : null;
|
|
58
|
+
}
|
|
59
|
+
return matcherVerdict ?? predicateVerdict;
|
|
60
|
+
}
|
|
61
|
+
async function buildFinding(rule, handler, verdict) {
|
|
62
|
+
const lineText = extractLineFromHandler(handler);
|
|
63
|
+
const primaryLocationLineHash = await computePrimaryLocationLineHash({
|
|
64
|
+
rule_id: rule.rule_id,
|
|
65
|
+
file_path: handler.file_path,
|
|
66
|
+
node_kind: "WebhookHandler",
|
|
67
|
+
line_text: lineText,
|
|
68
|
+
});
|
|
69
|
+
const id = await computeFindingId({
|
|
70
|
+
rule_id: rule.rule_id,
|
|
71
|
+
handler_id: handler.id,
|
|
72
|
+
file_path: handler.file_path,
|
|
73
|
+
primary_location_line_hash: primaryLocationLineHash,
|
|
74
|
+
});
|
|
75
|
+
return {
|
|
76
|
+
id,
|
|
77
|
+
rule_id: rule.rule_id,
|
|
78
|
+
provider: rule.provider,
|
|
79
|
+
severity: rule.severity,
|
|
80
|
+
state: verdict,
|
|
81
|
+
file_path: handler.file_path,
|
|
82
|
+
location: handler.location,
|
|
83
|
+
snippet: handler.redacted_snippet,
|
|
84
|
+
handler_id: handler.id,
|
|
85
|
+
primary_location_line_hash: primaryLocationLineHash,
|
|
86
|
+
message: rule.message,
|
|
87
|
+
metadata: { framework: handler.framework, route_pattern: handler.route_pattern },
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
function extractLineFromHandler(handler) {
|
|
91
|
+
// First line of the handler's redacted snippet — sufficient for the SARIF-style fingerprint
|
|
92
|
+
// (Plan 02's computePrimaryLocationLineHash normalizes whitespace before hashing).
|
|
93
|
+
const firstNl = handler.redacted_snippet.indexOf("\n");
|
|
94
|
+
return firstNl < 0 ? handler.redacted_snippet : handler.redacted_snippet.slice(0, firstNl);
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=visit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visit.js","sourceRoot":"","sources":["../../src/evaluator/visit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export interface PrimaryLocationLineHashInput {
|
|
2
|
+
readonly rule_id: string;
|
|
3
|
+
readonly file_path: string;
|
|
4
|
+
readonly node_kind: string;
|
|
5
|
+
readonly line_text: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function computePrimaryLocationLineHash(input: PrimaryLocationLineHashInput): Promise<string>;
|
|
8
|
+
export interface HandlerIdInput {
|
|
9
|
+
readonly file_path: string;
|
|
10
|
+
readonly route_pattern: string;
|
|
11
|
+
readonly http_methods: ReadonlyArray<string>;
|
|
12
|
+
readonly handler_function_name: string | null;
|
|
13
|
+
}
|
|
14
|
+
export declare function computeHandlerId(input: HandlerIdInput): Promise<string>;
|
|
15
|
+
export interface FindingIdInput {
|
|
16
|
+
readonly rule_id: string;
|
|
17
|
+
readonly handler_id: string | null;
|
|
18
|
+
readonly file_path: string;
|
|
19
|
+
readonly primary_location_line_hash: string;
|
|
20
|
+
}
|
|
21
|
+
export declare function computeFindingId(input: FindingIdInput): Promise<string>;
|
|
22
|
+
//# sourceMappingURL=fingerprint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fingerprint.d.ts","sourceRoot":"","sources":["../../src/findings/fingerprint.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,wBAAsB,8BAA8B,CAClD,KAAK,EAAE,4BAA4B,GAClC,OAAO,CAAC,MAAM,CAAC,CAQjB;AAID,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,YAAY,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC7C,QAAQ,CAAC,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/C;AAED,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAQ7E;AAID,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,0BAA0B,EAAE,MAAM,CAAC;CAC7C;AAED,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAQ7E"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { sha256Hex } from "./webcrypto.js";
|
|
2
|
+
// SARIF 2.1.0 partialFingerprints.primaryLocationLineHash semantic:
|
|
3
|
+
// - stable across unrelated line shifts in the same file
|
|
4
|
+
// - input includes the rule id, file path, AST node kind, and a normalized version of the line text
|
|
5
|
+
// - hex-encoded sha256 is GitHub Code Scanning's accepted format
|
|
6
|
+
//
|
|
7
|
+
// We normalize the line text by collapsing runs of whitespace to single spaces and trimming.
|
|
8
|
+
// This means cosmetic reformatting does not change identity, but a real edit does.
|
|
9
|
+
function normalizeLine(text) {
|
|
10
|
+
return text.replace(/[ \t]+/g, " ").trim();
|
|
11
|
+
}
|
|
12
|
+
export async function computePrimaryLocationLineHash(input) {
|
|
13
|
+
const canonical = [
|
|
14
|
+
input.rule_id,
|
|
15
|
+
input.file_path,
|
|
16
|
+
input.node_kind,
|
|
17
|
+
normalizeLine(input.line_text),
|
|
18
|
+
].join("|");
|
|
19
|
+
return sha256Hex(canonical);
|
|
20
|
+
}
|
|
21
|
+
export async function computeHandlerId(input) {
|
|
22
|
+
const methodsSorted = [...input.http_methods]
|
|
23
|
+
.map((m) => m.toUpperCase())
|
|
24
|
+
.sort()
|
|
25
|
+
.join(",");
|
|
26
|
+
const fnName = input.handler_function_name ?? "<anonymous>";
|
|
27
|
+
const canonical = `${input.file_path}|${input.route_pattern}|${methodsSorted}|${fnName}`;
|
|
28
|
+
return sha256Hex(canonical);
|
|
29
|
+
}
|
|
30
|
+
export async function computeFindingId(input) {
|
|
31
|
+
const canonical = [
|
|
32
|
+
input.rule_id,
|
|
33
|
+
input.handler_id ?? "<no-handler>",
|
|
34
|
+
input.file_path,
|
|
35
|
+
input.primary_location_line_hash,
|
|
36
|
+
].join("|");
|
|
37
|
+
return sha256Hex(canonical);
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=fingerprint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fingerprint.js","sourceRoot":"","sources":["../../src/findings/fingerprint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,oEAAoE;AACpE,yDAAyD;AACzD,oGAAoG;AACpG,iEAAiE;AACjE,EAAE;AACF,6FAA6F;AAC7F,mFAAmF;AACnF,SAAS,aAAa,CAAC,IAAY;IACjC,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAC7C,CAAC;AASD,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAClD,KAAmC;IAEnC,MAAM,SAAS,GAAG;QAChB,KAAK,CAAC,OAAO;QACb,KAAK,CAAC,SAAS;QACf,KAAK,CAAC,SAAS;QACf,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC;KAC/B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACZ,OAAO,SAAS,CAAC,SAAS,CAAC,CAAC;AAC9B,CAAC;AAWD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,KAAqB;IAC1D,MAAM,aAAa,GAAG,CAAC,GAAG,KAAK,CAAC,YAAY,CAAC;SAC1C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;SAC3B,IAAI,EAAE;SACN,IAAI,CAAC,GAAG,CAAC,CAAC;IACb,MAAM,MAAM,GAAG,KAAK,CAAC,qBAAqB,IAAI,aAAa,CAAC;IAC5D,MAAM,SAAS,GAAG,GAAG,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,aAAa,IAAI,aAAa,IAAI,MAAM,EAAE,CAAC;IACzF,OAAO,SAAS,CAAC,SAAS,CAAC,CAAC;AAC9B,CAAC;AAWD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,KAAqB;IAC1D,MAAM,SAAS,GAAG;QAChB,KAAK,CAAC,OAAO;QACb,KAAK,CAAC,UAAU,IAAI,cAAc;QAClC,KAAK,CAAC,SAAS;QACf,KAAK,CAAC,0BAA0B;KACjC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACZ,OAAO,SAAS,CAAC,SAAS,CAAC,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/findings/index.ts"],"names":[],"mappings":"AAGA,YAAY,EACV,cAAc,EACd,cAAc,EACd,4BAA4B,GAC7B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,8BAA8B,GAC/B,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
// findings/ barrel — internal-use only. The engine package's public surface re-exports nothing
|
|
2
|
+
// from here; downstream rules query the public `Finding` type from src/types/.
|
|
3
|
+
export { computeFindingId, computeHandlerId, computePrimaryLocationLineHash, } from "./fingerprint.js";
|
|
4
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/findings/index.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAC/F,+EAA+E;AAO/E,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,8BAA8B,GAC/B,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webcrypto.d.ts","sourceRoot":"","sources":["../../src/findings/webcrypto.ts"],"names":[],"mappings":"AAIA,wBAAsB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAU9D"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// Engine-internal helper. Wraps WebCrypto's verbose `subtle.digest` API.
|
|
2
|
+
// D-02: engine uses globalThis.crypto.subtle for hashing — no Node `crypto` import.
|
|
3
|
+
// Browser-safe: works wherever the Web Crypto API is present (Node 22+, modern browsers).
|
|
4
|
+
export async function sha256Hex(input) {
|
|
5
|
+
const bytes = new TextEncoder().encode(input);
|
|
6
|
+
const buffer = await globalThis.crypto.subtle.digest("SHA-256", bytes);
|
|
7
|
+
const view = new Uint8Array(buffer);
|
|
8
|
+
let out = "";
|
|
9
|
+
for (let i = 0; i < view.length; i++) {
|
|
10
|
+
const byte = view[i] ?? 0;
|
|
11
|
+
out += byte.toString(16).padStart(2, "0");
|
|
12
|
+
}
|
|
13
|
+
return out;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=webcrypto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webcrypto.js","sourceRoot":"","sources":["../../src/findings/webcrypto.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,oFAAoF;AACpF,0FAA0F;AAE1F,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,KAAa;IAC3C,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACvE,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;IACpC,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC1B,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
export type
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
};
|
|
5
|
-
export type
|
|
6
|
-
export type
|
|
7
|
-
export type Config
|
|
8
|
-
export
|
|
1
|
+
export { ALL_ADAPTERS, type FrameworkAdapter } from "./adapters/index.js";
|
|
2
|
+
export { evaluate } from "./evaluate.js";
|
|
3
|
+
export { type BuildProjectModelInput, buildProjectModel } from "./model/index.js";
|
|
4
|
+
export { type ParseJsTsInput, parseJsTs } from "./parsers/babel.js";
|
|
5
|
+
export { type ParsePythonInput, parsePython } from "./parsers/python.js";
|
|
6
|
+
export { type InitPythonRuntimeInput, initPythonRuntime, type PythonRuntime, } from "./parsers/python-loader.js";
|
|
7
|
+
export type { Config, DeclarativeMatcher, Finding, FindingId, Framework, ImportEdge, MatcherName, MiddlewareRegistration, ParsedFile, ParseErrorRecord, ProjectModel, ProviderCatalog, ProviderCatalogEntry, ReachableSymbol, ResolvedMiddleware, RuleDefinition, RulePredicate, RuleSet, ScanMetadata, ScanResult, Severity, SourceLocation, SuppressedPayload, SuppressionSource, Verdict, WebhookEvidence, WebhookEvidenceKind, WebhookHandler, } from "./types/index.js";
|
|
8
|
+
export { ENGINE_VERSION } from "./version.js";
|
|
9
9
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,YAAY,EAAE,KAAK,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,KAAK,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAClF,OAAO,EAAE,KAAK,cAAc,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,KAAK,gBAAgB,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EACL,KAAK,sBAAsB,EAC3B,iBAAiB,EACjB,KAAK,aAAa,GACnB,MAAM,4BAA4B,CAAC;AAEpC,YAAY,EACV,MAAM,EACN,kBAAkB,EAClB,OAAO,EACP,SAAS,EACT,SAAS,EACT,UAAU,EACV,WAAW,EACX,sBAAsB,EACtB,UAAU,EACV,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,oBAAoB,EACpB,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,aAAa,EACb,OAAO,EACP,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,OAAO,EACP,eAAe,EACf,mBAAmB,EACnB,cAAc,GACf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -2,8 +2,13 @@
|
|
|
2
2
|
// Decision D-01: no Node built-ins, no network libs.
|
|
3
3
|
// Decision D-02: evaluate() is async (uses globalThis.crypto.subtle).
|
|
4
4
|
// Decision D-03: RuleSet is pre-parsed by the caller; engine never reads files.
|
|
5
|
-
//
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
}
|
|
5
|
+
// Decision D-23: engine source lives only in the public OSS repo.
|
|
6
|
+
// Public function surface.
|
|
7
|
+
export { ALL_ADAPTERS } from "./adapters/index.js";
|
|
8
|
+
export { evaluate } from "./evaluate.js";
|
|
9
|
+
export { buildProjectModel } from "./model/index.js";
|
|
10
|
+
export { parseJsTs } from "./parsers/babel.js";
|
|
11
|
+
export { parsePython } from "./parsers/python.js";
|
|
12
|
+
export { initPythonRuntime, } from "./parsers/python-loader.js";
|
|
13
|
+
export { ENGINE_VERSION } from "./version.js";
|
|
9
14
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,qDAAqD;AACrD,sEAAsE;AACtE,gFAAgF;AAChF,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,qDAAqD;AACrD,sEAAsE;AACtE,gFAAgF;AAChF,kEAAkE;AAElE,2BAA2B;AAC3B,OAAO,EAAE,YAAY,EAAyB,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAA+B,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAClF,OAAO,EAAuB,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAyB,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAEL,iBAAiB,GAElB,MAAM,4BAA4B,CAAC;AAgCpC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Config } from "../types/config.js";
|
|
2
|
+
import type { ParsedFile, ProjectModel } from "../types/project-model.js";
|
|
3
|
+
import type { RuleSet } from "../types/rule-set.js";
|
|
4
|
+
import { type CandidateHandler } from "./catalog.js";
|
|
5
|
+
export interface BuildProjectModelInput {
|
|
6
|
+
readonly parsedFiles: ReadonlyArray<ParsedFile>;
|
|
7
|
+
readonly ruleSet: RuleSet;
|
|
8
|
+
readonly config: Config;
|
|
9
|
+
readonly bespokeAdapters?: ReadonlyArray<(file: ParsedFile, allFiles: ReadonlyArray<ParsedFile>) => ReadonlyArray<CandidateHandler>>;
|
|
10
|
+
}
|
|
11
|
+
export declare function buildProjectModel(input: BuildProjectModelInput): Promise<ProjectModel>;
|
|
12
|
+
//# sourceMappingURL=build.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/model/build.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAOjD,OAAO,KAAK,EAGV,UAAU,EACV,YAAY,EACb,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,KAAK,gBAAgB,EAAyB,MAAM,cAAc,CAAC;AAK5E,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IAChD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAExB,QAAQ,CAAC,eAAe,CAAC,EAAE,aAAa,CACtC,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,KAAK,aAAa,CAAC,gBAAgB,CAAC,CAC3F,CAAC;CACH;AAED,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,YAAY,CAAC,CAmC5F"}
|