@salesforce/uibundle-sourcemap-validator-engine 11.35.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.txt +82 -0
- package/README.md +243 -0
- package/dist/engine.d.ts +17 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +142 -0
- package/dist/engine.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/plugin.d.ts +12 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +22 -0
- package/dist/plugin.js.map +1 -0
- package/dist/rules.d.ts +9 -0
- package/dist/rules.d.ts.map +1 -0
- package/dist/rules.js +108 -0
- package/dist/rules.js.map +1 -0
- package/dist/validators/classification.d.ts +51 -0
- package/dist/validators/classification.d.ts.map +1 -0
- package/dist/validators/classification.js +120 -0
- package/dist/validators/classification.js.map +1 -0
- package/dist/validators/coverage-analysis.d.ts +32 -0
- package/dist/validators/coverage-analysis.d.ts.map +1 -0
- package/dist/validators/coverage-analysis.js +147 -0
- package/dist/validators/coverage-analysis.js.map +1 -0
- package/dist/validators/invalid-source-references.d.ts +9 -0
- package/dist/validators/invalid-source-references.d.ts.map +1 -0
- package/dist/validators/invalid-source-references.js +56 -0
- package/dist/validators/invalid-source-references.js.map +1 -0
- package/dist/validators/missing-sourcemap.d.ts +9 -0
- package/dist/validators/missing-sourcemap.d.ts.map +1 -0
- package/dist/validators/missing-sourcemap.js +92 -0
- package/dist/validators/missing-sourcemap.js.map +1 -0
- package/dist/validators/path-leakage.d.ts +9 -0
- package/dist/validators/path-leakage.d.ts.map +1 -0
- package/dist/validators/path-leakage.js +38 -0
- package/dist/validators/path-leakage.js.map +1 -0
- package/dist/validators/source-content-verification.d.ts +13 -0
- package/dist/validators/source-content-verification.d.ts.map +1 -0
- package/dist/validators/source-content-verification.js +465 -0
- package/dist/validators/source-content-verification.js.map +1 -0
- package/dist/validators/sourcemap-io.d.ts +21 -0
- package/dist/validators/sourcemap-io.d.ts.map +1 -0
- package/dist/validators/sourcemap-io.js +44 -0
- package/dist/validators/sourcemap-io.js.map +1 -0
- package/dist/validators/structural-coherence.d.ts +29 -0
- package/dist/validators/structural-coherence.d.ts.map +1 -0
- package/dist/validators/structural-coherence.js +247 -0
- package/dist/validators/structural-coherence.js.map +1 -0
- package/dist/validators/token-consistency.d.ts +32 -0
- package/dist/validators/token-consistency.d.ts.map +1 -0
- package/dist/validators/token-consistency.js +260 -0
- package/dist/validators/token-consistency.js.map +1 -0
- package/dist/validators/types.d.ts +19 -0
- package/dist/validators/types.d.ts.map +1 -0
- package/dist/validators/types.js +7 -0
- package/dist/validators/types.js.map +1 -0
- package/dist/validators/vlq-integrity.d.ts +9 -0
- package/dist/validators/vlq-integrity.d.ts.map +1 -0
- package/dist/validators/vlq-integrity.js +93 -0
- package/dist/validators/vlq-integrity.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026, Salesforce, Inc.,
|
|
3
|
+
* All rights reserved.
|
|
4
|
+
* For full license text, see the LICENSE.txt file
|
|
5
|
+
*/
|
|
6
|
+
import { promises as fs } from "node:fs";
|
|
7
|
+
import * as path from "node:path";
|
|
8
|
+
import { containsDangerousApi, DANGEROUS_API_PATTERNS } from "./classification.js";
|
|
9
|
+
export const MISSING_SOURCEMAP_RULE = "missing-sourcemap";
|
|
10
|
+
export async function validateMissingSourcemaps(distPath) {
|
|
11
|
+
let distStat;
|
|
12
|
+
try {
|
|
13
|
+
distStat = await fs.stat(distPath);
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return { findings: [], skipped: { reason: `dist path not found: ${distPath}` } };
|
|
17
|
+
}
|
|
18
|
+
if (!distStat.isDirectory()) {
|
|
19
|
+
return { findings: [], skipped: { reason: `dist path is not a directory: ${distPath}` } };
|
|
20
|
+
}
|
|
21
|
+
const jsFiles = await collectJsFiles(distPath);
|
|
22
|
+
const findings = [];
|
|
23
|
+
for (const jsFile of jsFiles) {
|
|
24
|
+
if (await hasSourcemap(jsFile))
|
|
25
|
+
continue;
|
|
26
|
+
// Base finding — no sourcemap
|
|
27
|
+
findings.push({
|
|
28
|
+
ruleName: MISSING_SOURCEMAP_RULE,
|
|
29
|
+
message: `No sourcemap found for ${path.relative(distPath, jsFile)}. Expected a co-located .js.map or a //# sourceMappingURL comment.`,
|
|
30
|
+
file: jsFile,
|
|
31
|
+
startLine: 1,
|
|
32
|
+
startColumn: 1,
|
|
33
|
+
});
|
|
34
|
+
// Orphan-JS dangerous-API scan (ported from lib.rs::contains_dangerous_apis).
|
|
35
|
+
// Rust bumps missing-map findings to a hard fail when the orphan file contains
|
|
36
|
+
// exfil/backdoor API patterns; we surface it as a distinct, more severe
|
|
37
|
+
// finding under the same rule.
|
|
38
|
+
let content;
|
|
39
|
+
try {
|
|
40
|
+
content = await fs.readFile(jsFile, "utf8");
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
if (containsDangerousApi(content)) {
|
|
46
|
+
const hits = DANGEROUS_API_PATTERNS.filter((p) => content.includes(p));
|
|
47
|
+
findings.push({
|
|
48
|
+
ruleName: MISSING_SOURCEMAP_RULE,
|
|
49
|
+
message: `Orphan JS file (no sourcemap) contains dangerous API pattern(s): ${hits.join(", ")}. This looks like unmapped/injected code rather than a bundler runtime.`,
|
|
50
|
+
file: jsFile,
|
|
51
|
+
startLine: 1,
|
|
52
|
+
startColumn: 1,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return { findings };
|
|
57
|
+
}
|
|
58
|
+
async function collectJsFiles(root) {
|
|
59
|
+
const out = [];
|
|
60
|
+
async function walk(dir) {
|
|
61
|
+
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
62
|
+
for (const entry of entries) {
|
|
63
|
+
const full = path.join(dir, entry.name);
|
|
64
|
+
if (entry.isDirectory()) {
|
|
65
|
+
await walk(full);
|
|
66
|
+
}
|
|
67
|
+
else if (entry.isFile() && entry.name.endsWith(".js")) {
|
|
68
|
+
out.push(full);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
await walk(root);
|
|
73
|
+
return out;
|
|
74
|
+
}
|
|
75
|
+
async function hasSourcemap(jsFile) {
|
|
76
|
+
const colocated = `${jsFile}.map`;
|
|
77
|
+
try {
|
|
78
|
+
await fs.access(colocated);
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
// fall through to inline check
|
|
83
|
+
}
|
|
84
|
+
try {
|
|
85
|
+
const contents = await fs.readFile(jsFile, "utf8");
|
|
86
|
+
return /^[/\s]*[#@]\s*sourceMappingURL\s*=/m.test(contents);
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=missing-sourcemap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"missing-sourcemap.js","sourceRoot":"","sources":["../../src/validators/missing-sourcemap.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026, Salesforce, Inc.,
|
|
3
|
+
* All rights reserved.
|
|
4
|
+
* For full license text, see the LICENSE.txt file
|
|
5
|
+
*/
|
|
6
|
+
import type { ValidatorResult } from "./types.js";
|
|
7
|
+
export declare const PATH_LEAKAGE_RULE = "path-leakage";
|
|
8
|
+
export declare function validatePathLeakage(distPath: string): Promise<ValidatorResult>;
|
|
9
|
+
//# sourceMappingURL=path-leakage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-leakage.d.ts","sourceRoot":"","sources":["../../src/validators/path-leakage.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAoB,eAAe,EAAE,MAAM,YAAY,CAAC;AAEpE,eAAO,MAAM,iBAAiB,iBAAiB,CAAC;AAOhD,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAmBpF"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026, Salesforce, Inc.,
|
|
3
|
+
* All rights reserved.
|
|
4
|
+
* For full license text, see the LICENSE.txt file
|
|
5
|
+
*/
|
|
6
|
+
import { collectSourceMaps } from "./sourcemap-io.js";
|
|
7
|
+
export const PATH_LEAKAGE_RULE = "path-leakage";
|
|
8
|
+
const ABSOLUTE_UNIX_HOME = /^\/(?:Users|home|root)\//;
|
|
9
|
+
const ABSOLUTE_WIN_DRIVE = /^[A-Za-z]:[\\/]/;
|
|
10
|
+
const WIN_UNC = /^\\\\/;
|
|
11
|
+
const FILE_URL = /^file:\/\//i;
|
|
12
|
+
export async function validatePathLeakage(distPath) {
|
|
13
|
+
const maps = await collectSourceMaps(distPath);
|
|
14
|
+
const findings = [];
|
|
15
|
+
for (const { path: mapPath, map } of maps) {
|
|
16
|
+
for (const source of map.sources) {
|
|
17
|
+
if (!source)
|
|
18
|
+
continue;
|
|
19
|
+
if (isLeaking(source)) {
|
|
20
|
+
findings.push({
|
|
21
|
+
ruleName: PATH_LEAKAGE_RULE,
|
|
22
|
+
message: `Sourcemap references an absolute local path: "${source}". Sources should be relative to protect developer environment details.`,
|
|
23
|
+
file: mapPath,
|
|
24
|
+
startLine: 1,
|
|
25
|
+
startColumn: 1,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return { findings };
|
|
31
|
+
}
|
|
32
|
+
function isLeaking(source) {
|
|
33
|
+
return (ABSOLUTE_UNIX_HOME.test(source) ||
|
|
34
|
+
ABSOLUTE_WIN_DRIVE.test(source) ||
|
|
35
|
+
WIN_UNC.test(source) ||
|
|
36
|
+
FILE_URL.test(source));
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=path-leakage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-leakage.js","sourceRoot":"","sources":["../../src/validators/path-leakage.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAGtD,MAAM,CAAC,MAAM,iBAAiB,GAAG,cAAc,CAAC;AAEhD,MAAM,kBAAkB,GAAG,0BAA0B,CAAC;AACtD,MAAM,kBAAkB,GAAG,iBAAiB,CAAC;AAC7C,MAAM,OAAO,GAAG,OAAO,CAAC;AACxB,MAAM,QAAQ,GAAG,aAAa,CAAC;AAE/B,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,QAAgB;IACzD,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAuB,EAAE,CAAC;IAExC,KAAK,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,IAAI,EAAE,CAAC;QAC3C,KAAK,MAAM,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAClC,IAAI,CAAC,MAAM;gBAAE,SAAS;YACtB,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;gBACvB,QAAQ,CAAC,IAAI,CAAC;oBACb,QAAQ,EAAE,iBAAiB;oBAC3B,OAAO,EAAE,iDAAiD,MAAM,yEAAyE;oBACzI,IAAI,EAAE,OAAO;oBACb,SAAS,EAAE,CAAC;oBACZ,WAAW,EAAE,CAAC;iBACd,CAAC,CAAC;YACJ,CAAC;QACF,CAAC;IACF,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,CAAC;AACrB,CAAC;AAED,SAAS,SAAS,CAAC,MAAc;IAChC,OAAO,CACN,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC;QAC/B,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC;QAC/B,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;QACpB,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CACrB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026, Salesforce, Inc.,
|
|
3
|
+
* All rights reserved.
|
|
4
|
+
* For full license text, see the LICENSE.txt file
|
|
5
|
+
*/
|
|
6
|
+
import type { ValidatorResult } from "./types.js";
|
|
7
|
+
export declare const SOURCE_CONTENT_VERIFICATION_RULE = "source-content-verification";
|
|
8
|
+
export interface SourceContentOptions {
|
|
9
|
+
sourcePath: string;
|
|
10
|
+
distPath: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function validateSourceContent(options: SourceContentOptions): Promise<ValidatorResult>;
|
|
13
|
+
//# sourceMappingURL=source-content-verification.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-content-verification.d.ts","sourceRoot":"","sources":["../../src/validators/source-content-verification.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAgBH,OAAO,KAAK,EAAoB,eAAe,EAAE,MAAM,YAAY,CAAC;AAKpE,eAAO,MAAM,gCAAgC,gCAAgC,CAAC;AAoE9E,MAAM,WAAW,oBAAoB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,qBAAqB,CAC1C,OAAO,EAAE,oBAAoB,GAC3B,OAAO,CAAC,eAAe,CAAC,CAoE1B"}
|
|
@@ -0,0 +1,465 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026, Salesforce, Inc.,
|
|
3
|
+
* All rights reserved.
|
|
4
|
+
* For full license text, see the LICENSE.txt file
|
|
5
|
+
*/
|
|
6
|
+
import { promises as fs } from "node:fs";
|
|
7
|
+
import * as path from "node:path";
|
|
8
|
+
import { parse } from "@babel/parser";
|
|
9
|
+
import _traverse from "@babel/traverse";
|
|
10
|
+
import { TraceMap, originalPositionFor } from "@jridgewell/trace-mapping";
|
|
11
|
+
import { containsDangerousPattern, isAsset, isDependency, isVirtualSource, normalizeSourcePath, } from "./classification.js";
|
|
12
|
+
import { walk } from "./sourcemap-io.js";
|
|
13
|
+
// @babel/traverse ships its callable as a default export; ESM/CJS interop puts it under `.default`.
|
|
14
|
+
const traverse = _traverse.default ?? _traverse;
|
|
15
|
+
export const SOURCE_CONTENT_VERIFICATION_RULE = "source-content-verification";
|
|
16
|
+
// Ported from uibundle-sourcemap-validator/src/ast_validator.rs
|
|
17
|
+
const COVERAGE_THRESHOLD_LARGE = 95;
|
|
18
|
+
const COVERAGE_THRESHOLD_SMALL = 70;
|
|
19
|
+
const SMALL_FILE_NODE_COUNT = 500;
|
|
20
|
+
const TYPE_MISMATCH_THRESHOLD = 0.2;
|
|
21
|
+
const AST_MATCH_TOLERANCE_BYTES = 5;
|
|
22
|
+
// Ported from uibundle-sourcemap-validator/src/lib.rs::validate_sourcemap
|
|
23
|
+
const VIRTUAL_SOURCE_RATIO_THRESHOLD_PCT = 20;
|
|
24
|
+
const PARSER_OPTIONS = {
|
|
25
|
+
sourceType: "unambiguous",
|
|
26
|
+
allowReturnOutsideFunction: true,
|
|
27
|
+
allowImportExportEverywhere: true,
|
|
28
|
+
errorRecovery: true,
|
|
29
|
+
plugins: ["jsx", "typescript", "decorators-legacy"],
|
|
30
|
+
};
|
|
31
|
+
/** Ported set of node types the Rust ast_validator emits into SignificantNode. */
|
|
32
|
+
const SIGNIFICANT_NODE_TYPES = new Set([
|
|
33
|
+
"FunctionDeclaration",
|
|
34
|
+
"FunctionExpression",
|
|
35
|
+
"ArrowFunctionExpression",
|
|
36
|
+
"ClassDeclaration",
|
|
37
|
+
"ClassExpression",
|
|
38
|
+
"ClassMethod",
|
|
39
|
+
"ClassProperty",
|
|
40
|
+
"JSXElement",
|
|
41
|
+
"JSXFragment",
|
|
42
|
+
"CallExpression",
|
|
43
|
+
"NewExpression",
|
|
44
|
+
"MemberExpression",
|
|
45
|
+
"OptionalMemberExpression",
|
|
46
|
+
"AssignmentExpression",
|
|
47
|
+
"VariableDeclaration",
|
|
48
|
+
"ImportDeclaration",
|
|
49
|
+
"ExportNamedDeclaration",
|
|
50
|
+
"ExportDefaultDeclaration",
|
|
51
|
+
"ExportAllDeclaration",
|
|
52
|
+
"ReturnStatement",
|
|
53
|
+
"ThrowStatement",
|
|
54
|
+
"AwaitExpression",
|
|
55
|
+
"YieldExpression",
|
|
56
|
+
]);
|
|
57
|
+
/** Normalize Babel node types so parity with Rust's flattened labels holds
|
|
58
|
+
* (Rust emits `ExportDeclaration` for all three export forms). */
|
|
59
|
+
function normalizeNodeType(t) {
|
|
60
|
+
if (t === "ExportNamedDeclaration" ||
|
|
61
|
+
t === "ExportDefaultDeclaration" ||
|
|
62
|
+
t === "ExportAllDeclaration") {
|
|
63
|
+
return "ExportDeclaration";
|
|
64
|
+
}
|
|
65
|
+
return t;
|
|
66
|
+
}
|
|
67
|
+
export async function validateSourceContent(options) {
|
|
68
|
+
let sourceStat, distStat;
|
|
69
|
+
try {
|
|
70
|
+
sourceStat = await fs.stat(options.sourcePath);
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return { findings: [], skipped: { reason: `source path not found: ${options.sourcePath}` } };
|
|
74
|
+
}
|
|
75
|
+
try {
|
|
76
|
+
distStat = await fs.stat(options.distPath);
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
return { findings: [], skipped: { reason: `dist path not found: ${options.distPath}` } };
|
|
80
|
+
}
|
|
81
|
+
if (!sourceStat.isDirectory() || !distStat.isDirectory()) {
|
|
82
|
+
return { findings: [], skipped: { reason: "source and dist must both be directories" } };
|
|
83
|
+
}
|
|
84
|
+
const sourceIndex = await indexSourceFiles(options.sourcePath);
|
|
85
|
+
const findings = [];
|
|
86
|
+
const sourcePathBase = path.basename(options.sourcePath);
|
|
87
|
+
await walk(options.distPath, async (jsPath) => {
|
|
88
|
+
if (!jsPath.endsWith(".js"))
|
|
89
|
+
return;
|
|
90
|
+
const mapPath = `${jsPath}.map`;
|
|
91
|
+
let mapRaw;
|
|
92
|
+
try {
|
|
93
|
+
mapRaw = await fs.readFile(mapPath, "utf8");
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
return; // missing-sourcemap rule handles this
|
|
97
|
+
}
|
|
98
|
+
let rawMap;
|
|
99
|
+
try {
|
|
100
|
+
rawMap = JSON.parse(mapRaw);
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
findings.push({
|
|
104
|
+
ruleName: SOURCE_CONTENT_VERIFICATION_RULE,
|
|
105
|
+
message: `Sourcemap is not valid JSON: ${err.message}`,
|
|
106
|
+
file: mapPath,
|
|
107
|
+
});
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
let tracer;
|
|
111
|
+
try {
|
|
112
|
+
tracer = new TraceMap(mapRaw);
|
|
113
|
+
}
|
|
114
|
+
catch (err) {
|
|
115
|
+
findings.push({
|
|
116
|
+
ruleName: SOURCE_CONTENT_VERIFICATION_RULE,
|
|
117
|
+
message: `Sourcemap could not be loaded for AST verification: ${err.message}`,
|
|
118
|
+
file: mapPath,
|
|
119
|
+
});
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
// --- Layer 1: byte-equal sourcesContent check + virtual-source ratio gate ---
|
|
123
|
+
await runByteEqualAndRatioChecks(rawMap, mapPath, sourceIndex, sourcePathBase, findings);
|
|
124
|
+
// --- Layer 1 (AST): coverage + type-mismatch + dangerous-unmapped-snippets ---
|
|
125
|
+
let compiledJs;
|
|
126
|
+
try {
|
|
127
|
+
compiledJs = await fs.readFile(jsPath, "utf8");
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
await runAstChecks(jsPath, mapPath, compiledJs, tracer, sourceIndex, sourcePathBase, findings);
|
|
133
|
+
});
|
|
134
|
+
return { findings };
|
|
135
|
+
}
|
|
136
|
+
async function runByteEqualAndRatioChecks(map, mapPath, sourceIndex, sourcePathBase, findings) {
|
|
137
|
+
const sources = map.sources ?? [];
|
|
138
|
+
if (sources.length === 0)
|
|
139
|
+
return;
|
|
140
|
+
let virtualCount = 0;
|
|
141
|
+
let total = 0;
|
|
142
|
+
for (let i = 0; i < sources.length; i++) {
|
|
143
|
+
const raw = sources[i];
|
|
144
|
+
if (raw == null)
|
|
145
|
+
continue;
|
|
146
|
+
total++;
|
|
147
|
+
const normalized = normalizeSourcePath(raw);
|
|
148
|
+
if (isVirtualSource(normalized)) {
|
|
149
|
+
virtualCount++;
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
if (isDependency(normalized) || isAsset(normalized)) {
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
const submitted = lookupSubmitted(sourceIndex, normalized, sourcePathBase);
|
|
156
|
+
const embedded = map.sourcesContent?.[i] ?? null;
|
|
157
|
+
if (submitted == null) {
|
|
158
|
+
findings.push({
|
|
159
|
+
ruleName: SOURCE_CONTENT_VERIFICATION_RULE,
|
|
160
|
+
message: `Sourcemap references source "${raw}" (normalized "${normalized}") which is not present in the submitted source tree.`,
|
|
161
|
+
file: mapPath,
|
|
162
|
+
});
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
if (embedded == null) {
|
|
166
|
+
findings.push({
|
|
167
|
+
ruleName: SOURCE_CONTENT_VERIFICATION_RULE,
|
|
168
|
+
message: `Sourcemap source "${normalized}" is missing inline sourcesContent — required for byte-equal verification against the submitted source.`,
|
|
169
|
+
file: mapPath,
|
|
170
|
+
});
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
if (embedded.trim() !== submitted.trim()) {
|
|
174
|
+
findings.push({
|
|
175
|
+
ruleName: SOURCE_CONTENT_VERIFICATION_RULE,
|
|
176
|
+
message: `Sourcemap sourcesContent for "${normalized}" differs from the submitted source file (byte-equal check).`,
|
|
177
|
+
file: mapPath,
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
if (total > 0) {
|
|
182
|
+
const virtualPct = (virtualCount / total) * 100;
|
|
183
|
+
if (virtualPct > VIRTUAL_SOURCE_RATIO_THRESHOLD_PCT) {
|
|
184
|
+
findings.push({
|
|
185
|
+
ruleName: SOURCE_CONTENT_VERIFICATION_RULE,
|
|
186
|
+
message: `Excessive virtual sources: ${virtualPct.toFixed(0)}% of ${total} sources are virtual (webpack/vite/unknown). Threshold is ${VIRTUAL_SOURCE_RATIO_THRESHOLD_PCT}%; potential Layer-1 bypass attempt.`,
|
|
187
|
+
file: mapPath,
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
// ---------------------------------------------------------------------------
|
|
193
|
+
// Layer 1 — AST-based coverage + type mismatch + dangerous snippets
|
|
194
|
+
// ---------------------------------------------------------------------------
|
|
195
|
+
async function runAstChecks(jsPath, mapPath, compiledJs, tracer, sourceIndex, sourcePathBase, findings) {
|
|
196
|
+
let significantNodes;
|
|
197
|
+
try {
|
|
198
|
+
significantNodes = collectSignificantNodes(compiledJs);
|
|
199
|
+
}
|
|
200
|
+
catch (err) {
|
|
201
|
+
findings.push({
|
|
202
|
+
ruleName: SOURCE_CONTENT_VERIFICATION_RULE,
|
|
203
|
+
message: `Compiled JS failed to parse for AST verification: ${err.message}`,
|
|
204
|
+
file: jsPath,
|
|
205
|
+
});
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
if (significantNodes.length === 0)
|
|
209
|
+
return;
|
|
210
|
+
// Cache: normalized source path -> significant nodes AST + line offsets
|
|
211
|
+
const sourceAstCache = new Map();
|
|
212
|
+
let mappedCount = 0;
|
|
213
|
+
let typeMismatchCount = 0;
|
|
214
|
+
const unmapped = [];
|
|
215
|
+
const typeMismatches = [];
|
|
216
|
+
const orphanSources = new Set();
|
|
217
|
+
for (const node of significantNodes) {
|
|
218
|
+
// Babel columns are 0-based; TraceMap wants (line: 1-based, column: 0-based)
|
|
219
|
+
const orig = originalPositionFor(tracer, { line: node.line, column: node.column });
|
|
220
|
+
if (orig.source == null || orig.line == null) {
|
|
221
|
+
unmapped.push(node);
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
mappedCount++;
|
|
225
|
+
const normalized = normalizeSourcePath(orig.source);
|
|
226
|
+
// Dependencies and static assets aren't part of the submitted source tree —
|
|
227
|
+
// Rust filters them at the top-level Layer-1 gate, so mirror that here to
|
|
228
|
+
// avoid flagging every third-party file as "orphan".
|
|
229
|
+
if (isDependency(normalized) || isAsset(normalized))
|
|
230
|
+
continue;
|
|
231
|
+
const submittedContent = lookupSubmitted(sourceIndex, normalized, sourcePathBase);
|
|
232
|
+
if (submittedContent == null) {
|
|
233
|
+
orphanSources.add(normalized);
|
|
234
|
+
continue;
|
|
235
|
+
}
|
|
236
|
+
// Parse source and compare node type
|
|
237
|
+
const sourceAst = getSourceAst(normalized, submittedContent, sourceAstCache);
|
|
238
|
+
if (!sourceAst)
|
|
239
|
+
continue;
|
|
240
|
+
const srcByteOffset = lineColToByteOffset(sourceAst.lineOffsets, orig.line, orig.column ?? 0);
|
|
241
|
+
const srcNode = findNodeAtOffset(sourceAst.nodes, srcByteOffset);
|
|
242
|
+
if (srcNode && !nodeTypesCompatible(node.type, srcNode.type)) {
|
|
243
|
+
typeMismatchCount++;
|
|
244
|
+
if (typeMismatches.length < 5) {
|
|
245
|
+
typeMismatches.push(`${node.type} at ${node.line}:${node.column} → ${srcNode.type} at ${normalized}:${orig.line}:${orig.column ?? 0}`);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
const total = significantNodes.length;
|
|
250
|
+
const coverage = (mappedCount / total) * 100;
|
|
251
|
+
const threshold = total >= SMALL_FILE_NODE_COUNT ? COVERAGE_THRESHOLD_LARGE : COVERAGE_THRESHOLD_SMALL;
|
|
252
|
+
const typeMismatchRatio = mappedCount > 0 ? typeMismatchCount / mappedCount : 0;
|
|
253
|
+
// Coverage finding
|
|
254
|
+
if (coverage < threshold) {
|
|
255
|
+
findings.push({
|
|
256
|
+
ruleName: SOURCE_CONTENT_VERIFICATION_RULE,
|
|
257
|
+
message: `Sourcemap coverage ${coverage.toFixed(1)}% is below threshold ${threshold}% (${mappedCount}/${total} significant AST nodes mapped). Compiled JS may include code not present in submitted source.`,
|
|
258
|
+
file: jsPath,
|
|
259
|
+
});
|
|
260
|
+
for (const node of unmapped.slice(0, 5)) {
|
|
261
|
+
findings.push({
|
|
262
|
+
ruleName: SOURCE_CONTENT_VERIFICATION_RULE,
|
|
263
|
+
message: `Unmapped ${node.type} at ${node.line}:${node.column} — "${truncate(node.snippet, 80)}"`,
|
|
264
|
+
file: jsPath,
|
|
265
|
+
startLine: node.line,
|
|
266
|
+
startColumn: node.column,
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
// Type-mismatch finding
|
|
271
|
+
if (typeMismatchRatio >= TYPE_MISMATCH_THRESHOLD) {
|
|
272
|
+
findings.push({
|
|
273
|
+
ruleName: SOURCE_CONTENT_VERIFICATION_RULE,
|
|
274
|
+
message: `AST type-mismatch ratio ${(typeMismatchRatio * 100).toFixed(1)}% meets or exceeds ${TYPE_MISMATCH_THRESHOLD * 100}% threshold (${typeMismatchCount}/${mappedCount} mapped nodes have incompatible source AST types). Mappings may be fabricated.`,
|
|
275
|
+
file: jsPath,
|
|
276
|
+
});
|
|
277
|
+
for (const mm of typeMismatches) {
|
|
278
|
+
findings.push({
|
|
279
|
+
ruleName: SOURCE_CONTENT_VERIFICATION_RULE,
|
|
280
|
+
message: `Type mismatch: ${mm}`,
|
|
281
|
+
file: jsPath,
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
// Dangerous-pattern check on unmapped snippets — exempt line 1 (bundler preamble)
|
|
286
|
+
const dangerousUnmapped = unmapped.filter((n) => n.line > 1 && containsDangerousPattern(n.snippet));
|
|
287
|
+
for (const n of dangerousUnmapped.slice(0, 10)) {
|
|
288
|
+
findings.push({
|
|
289
|
+
ruleName: SOURCE_CONTENT_VERIFICATION_RULE,
|
|
290
|
+
message: `Unmapped ${n.type} at ${n.line}:${n.column} contains a dangerous API pattern: "${truncate(n.snippet, 100)}"`,
|
|
291
|
+
file: jsPath,
|
|
292
|
+
startLine: n.line,
|
|
293
|
+
startColumn: n.column,
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
// Orphan-source aggregate finding
|
|
297
|
+
if (orphanSources.size > 0) {
|
|
298
|
+
findings.push({
|
|
299
|
+
ruleName: SOURCE_CONTENT_VERIFICATION_RULE,
|
|
300
|
+
message: `${orphanSources.size} mapped AST node source(s) not present in the submitted source tree: ${[...orphanSources].slice(0, 5).join(", ")}${orphanSources.size > 5 ? ", …" : ""}`,
|
|
301
|
+
file: jsPath,
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
void mapPath;
|
|
305
|
+
}
|
|
306
|
+
// ---------------------------------------------------------------------------
|
|
307
|
+
// AST collection & source-side helpers
|
|
308
|
+
// ---------------------------------------------------------------------------
|
|
309
|
+
function collectSignificantNodes(code) {
|
|
310
|
+
const ast = parse(code, PARSER_OPTIONS);
|
|
311
|
+
const out = [];
|
|
312
|
+
traverse(ast, {
|
|
313
|
+
enter(nodePath) {
|
|
314
|
+
const node = nodePath.node;
|
|
315
|
+
if (!SIGNIFICANT_NODE_TYPES.has(node.type))
|
|
316
|
+
return;
|
|
317
|
+
if (!node.loc)
|
|
318
|
+
return;
|
|
319
|
+
const start = node.loc.start;
|
|
320
|
+
const byteOffset = node.start ?? 0;
|
|
321
|
+
const snippet = extractSnippet(code, byteOffset, 60);
|
|
322
|
+
out.push({
|
|
323
|
+
type: normalizeNodeType(node.type),
|
|
324
|
+
line: start.line,
|
|
325
|
+
column: start.column,
|
|
326
|
+
byteOffset,
|
|
327
|
+
snippet,
|
|
328
|
+
});
|
|
329
|
+
},
|
|
330
|
+
});
|
|
331
|
+
return out;
|
|
332
|
+
}
|
|
333
|
+
function getSourceAst(normalized, content, cache) {
|
|
334
|
+
if (cache.has(normalized))
|
|
335
|
+
return cache.get(normalized) ?? null;
|
|
336
|
+
try {
|
|
337
|
+
const nodes = collectSignificantNodes(content);
|
|
338
|
+
const lineOffsets = buildLineOffsets(content);
|
|
339
|
+
const val = { nodes, lineOffsets };
|
|
340
|
+
cache.set(normalized, val);
|
|
341
|
+
return val;
|
|
342
|
+
}
|
|
343
|
+
catch {
|
|
344
|
+
cache.set(normalized, null);
|
|
345
|
+
return null;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
/** Build a `line -> byte offset of first char` index. 0-based line indexing. */
|
|
349
|
+
function buildLineOffsets(text) {
|
|
350
|
+
const offsets = [0];
|
|
351
|
+
for (let i = 0; i < text.length; i++) {
|
|
352
|
+
if (text.charCodeAt(i) === 10 /* \n */)
|
|
353
|
+
offsets.push(i + 1);
|
|
354
|
+
}
|
|
355
|
+
return offsets;
|
|
356
|
+
}
|
|
357
|
+
/** Convert a 1-based line + 0-based column to a byte offset. Trace-mapping
|
|
358
|
+
* reports 1-based lines like Babel; we normalize by subtracting 1 for the
|
|
359
|
+
* lookup into the 0-based line offsets array. */
|
|
360
|
+
function lineColToByteOffset(lineOffsets, line1, col0) {
|
|
361
|
+
const line = Math.max(0, line1 - 1);
|
|
362
|
+
if (line < lineOffsets.length)
|
|
363
|
+
return lineOffsets[line] + col0;
|
|
364
|
+
return (lineOffsets[lineOffsets.length - 1] ?? 0) + col0;
|
|
365
|
+
}
|
|
366
|
+
/** Ported from ast_validator.rs::find_node_at_offset — finds the significant
|
|
367
|
+
* node whose byteOffset is closest to `byteOffset` within a 5-byte tolerance. */
|
|
368
|
+
function findNodeAtOffset(nodes, byteOffset) {
|
|
369
|
+
const tol = AST_MATCH_TOLERANCE_BYTES;
|
|
370
|
+
let best = null;
|
|
371
|
+
let bestDist = Number.POSITIVE_INFINITY;
|
|
372
|
+
for (const n of nodes) {
|
|
373
|
+
const dist = Math.abs(n.byteOffset - byteOffset);
|
|
374
|
+
if (dist <= tol && dist < bestDist) {
|
|
375
|
+
bestDist = dist;
|
|
376
|
+
best = n;
|
|
377
|
+
}
|
|
378
|
+
if (n.byteOffset > byteOffset + tol)
|
|
379
|
+
break;
|
|
380
|
+
}
|
|
381
|
+
return best;
|
|
382
|
+
}
|
|
383
|
+
/** Ported from ast_validator.rs::node_types_compatible. Rust flattens the three
|
|
384
|
+
* export forms into a single "ExportDeclaration" label, so declarations that
|
|
385
|
+
* live inside `export …` become compatible with their bare form via that alias
|
|
386
|
+
* (see normalizeNodeType). */
|
|
387
|
+
function nodeTypesCompatible(generated, source) {
|
|
388
|
+
if (generated === source)
|
|
389
|
+
return true;
|
|
390
|
+
const funcs = new Set(["FunctionDeclaration", "FunctionExpression", "ArrowFunctionExpression"]);
|
|
391
|
+
if (funcs.has(generated) && funcs.has(source))
|
|
392
|
+
return true;
|
|
393
|
+
if ((generated === "CallExpression" || generated === "NewExpression") &&
|
|
394
|
+
(source === "CallExpression" || source === "NewExpression"))
|
|
395
|
+
return true;
|
|
396
|
+
if ((generated === "AssignmentExpression" && source === "VariableDeclaration") ||
|
|
397
|
+
(generated === "VariableDeclaration" && source === "AssignmentExpression"))
|
|
398
|
+
return true;
|
|
399
|
+
if ((generated === "MemberExpression" && source === "CallExpression") ||
|
|
400
|
+
(generated === "CallExpression" && source === "MemberExpression"))
|
|
401
|
+
return true;
|
|
402
|
+
// ExportDeclaration wraps a top-level declaration; the compiled side often
|
|
403
|
+
// exposes the inner declaration (function/class/var) while the source side
|
|
404
|
+
// reports the wrapper.
|
|
405
|
+
const declarations = new Set([
|
|
406
|
+
"FunctionDeclaration",
|
|
407
|
+
"ClassDeclaration",
|
|
408
|
+
"VariableDeclaration",
|
|
409
|
+
"FunctionExpression",
|
|
410
|
+
"ArrowFunctionExpression",
|
|
411
|
+
]);
|
|
412
|
+
if (generated === "ExportDeclaration" && declarations.has(source))
|
|
413
|
+
return true;
|
|
414
|
+
if (source === "ExportDeclaration" && declarations.has(generated))
|
|
415
|
+
return true;
|
|
416
|
+
return false;
|
|
417
|
+
}
|
|
418
|
+
function extractSnippet(text, byteOffset, maxLen) {
|
|
419
|
+
const start = byteOffset;
|
|
420
|
+
if (start >= text.length)
|
|
421
|
+
return "";
|
|
422
|
+
const end = Math.min(text.length, start + maxLen);
|
|
423
|
+
return text.slice(start, end).replace(/\n/g, " ").replace(/\r/g, "");
|
|
424
|
+
}
|
|
425
|
+
function truncate(s, n) {
|
|
426
|
+
return s.length <= n ? s : s.slice(0, n) + "…";
|
|
427
|
+
}
|
|
428
|
+
// ---------------------------------------------------------------------------
|
|
429
|
+
// Source-file indexing (ported from lib.rs::index_source_files)
|
|
430
|
+
// ---------------------------------------------------------------------------
|
|
431
|
+
const INDEX_IGNORE_PREFIXES = ["node_modules", ".git", "dist"];
|
|
432
|
+
/**
|
|
433
|
+
* Look up a normalized sourcemap path against the source-tree index.
|
|
434
|
+
* Sourcemap `sources[]` entries typically look like `../src/foo.ts`, which
|
|
435
|
+
* normalizes to `src/foo.ts`. The source index, however, is keyed by paths
|
|
436
|
+
* relative to `<bundleRoot>/src`, so the leading `src/` segment needs to be
|
|
437
|
+
* stripped before the lookup.
|
|
438
|
+
*/
|
|
439
|
+
function lookupSubmitted(index, normalized, sourcePathBase) {
|
|
440
|
+
const direct = index.get(normalized);
|
|
441
|
+
if (direct != null)
|
|
442
|
+
return direct;
|
|
443
|
+
const prefix = `${sourcePathBase}/`;
|
|
444
|
+
if (normalized.startsWith(prefix)) {
|
|
445
|
+
return index.get(normalized.slice(prefix.length));
|
|
446
|
+
}
|
|
447
|
+
return undefined;
|
|
448
|
+
}
|
|
449
|
+
async function indexSourceFiles(sourcePath) {
|
|
450
|
+
const index = new Map();
|
|
451
|
+
await walk(sourcePath, async (abs) => {
|
|
452
|
+
const rel = path.relative(sourcePath, abs);
|
|
453
|
+
if (INDEX_IGNORE_PREFIXES.some((prefix) => rel.startsWith(prefix)))
|
|
454
|
+
return;
|
|
455
|
+
try {
|
|
456
|
+
const content = await fs.readFile(abs, "utf8");
|
|
457
|
+
index.set(rel, content);
|
|
458
|
+
}
|
|
459
|
+
catch {
|
|
460
|
+
// binary or unreadable — skip
|
|
461
|
+
}
|
|
462
|
+
});
|
|
463
|
+
return index;
|
|
464
|
+
}
|
|
465
|
+
//# sourceMappingURL=source-content-verification.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-content-verification.js","sourceRoot":"","sources":["../../src/validators/source-content-verification.ts"],"names":[],"mappings":"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"}
|