fix(javascript): preserve loader authority for exact suffixes (#9477)

* fix(javascript): require exact loader suffix case

* fix(javascript): share exact loader mode across import resolution

* test(process): align symlink fixture with filesystem checkpoints

* test(javascript): normalize the module resolution oracle path separators

* test(frida): assert the CLI spawn Evidence contract

* test(mcp): use an unsupported analysis-view parent

* test(browser): separate source-location line bounds from parity

* fix(javascript): preserve uncertain loader provenance

* test(javascript): cover uncertain require resolution

* fix(javascript): retain conditional Electron evidence

* fix(javascript): preserve timed semantic provenance

* fix(javascript): retain conditional builtin effects

* test(javascript): distinguish bundled host authority

* fix(javascript): preserve nested loader invocation identity

* test(javascript): qualify Electron fixture authority

* fix(javascript): preserve loader invocation authority

* fix(javascript): respect source order for resolver escapes

* fix(javascript): check nested loader callable mutations

* fix(javascript): retain conditional constructor requests

* fix(reference): retain constructor loader relationships

* fix(reference): follow nested loader callable paths

* refactor(javascript): share callable mutation interpretation

* fix(javascript): require exact package loader suffixes

* refactor(javascript): unify conditional relation evidence

* refactor(javascript): unify conditional node evidence

* fix(javascript): retain unknown authority for mixed case sources

* fix(javascript): preserve loader uncertainty for dotfiles

* fix(reference): classify javascript suffix dotfiles

* test(reference): cover suffix dotfiles through cli

* fix(javascript): retain equivalent conditional built-in origins

* fix(javascript): preserve wrapped resolver operation

* fix(javascript): retain nested conditional built-in receivers

* test(javascript): declare CommonJS in native addon fixtures

* fix(javascript): retain wrapped resolver candidates

* style: format merged native command schema

* fix(javascript): preserve uncertain loader authority

* test(javascript): require candidate preload evidence

* test(javascript): cover reference loader member writes

---------

Co-authored-by: ShuaixinHuang <1836656514@qq.com>
This commit is contained in:
morlutoandShuaixinHuang authored and GitHub committed 2026-11-09 13:21:24 +08:00
1 parent 78a84d75c0
commit b46f4fcebd
112 files changed
+5156 -797

No files matched your search

@@ -20,7 +20,7 @@ import {
type JavaScriptSemanticBindingState,
} from "./javascriptSemanticState.js";
import {
builtinDataEffectMethod,
builtinDataEffectIdentity,
dataEffectMemberCallee,
outerDataEffectBinding,
traverseDataEffects,
@@ -45,6 +45,7 @@ const releaseMethodsFor = (
};
interface ResourceCandidate {
readonly builtinAuthority?: "candidate";
readonly node: t.CallExpression | t.OptionalCallExpression;
readonly specifier: string;
readonly method: JavaScriptSemanticResourceOperation["method"];
@@ -339,6 +340,9 @@ const collectAcquisitions = (
node,
specifier: reference.specifier,
method: reference.method,
...(reference.builtinAuthority === undefined
? {}
: { builtinAuthority: reference.builtinAuthority }),
ownerCallableId: context.callableStack.at(-1) ?? null,
resultBindingId: outerDataEffectBinding(node, context),
});
@@ -391,6 +395,9 @@ const collectReleases = (
ownerCallableId: context.callableStack.at(-1) ?? null,
resultBindingId: binding.bindingId,
linkedResourceIds: linked.map(resourceCandidateId).sort(),
...(linked.some((value) => value.builtinAuthority === "candidate")
? { builtinAuthority: "candidate" as const }
: {}),
resolution:
linked.length === 1 &&
holdsOnlyAcquisitions(binding, linked, context.state)
@@ -440,6 +447,9 @@ const immutableAcquisition = (
resourceId: resourceCandidateId(candidate),
kind: "acquire",
method: candidate.method,
...(candidate.builtinAuthority === undefined
? {}
: { builtinAuthority: candidate.builtinAuthority }),
location: range(candidate.node),
ownerCallableId: candidate.ownerCallableId,
resultBindingId: candidate.resultBindingId,
@@ -448,6 +458,7 @@ const immutableAcquisition = (
});
interface AcquisitionReference {
readonly builtinAuthority?: "candidate";
readonly specifier: string;
readonly method: JavaScriptSemanticResourceOperation["method"];
}
@@ -457,7 +468,9 @@ const acquisitionMethod = (
state: JavaScriptSemanticAnalysisState,
): AcquisitionReference | null => {
for (const specifier of BUILTIN_RESOURCE_SPECIFIERS) {
const method = builtinDataEffectMethod(callee, state, [specifier]);
const identity = builtinDataEffectIdentity(callee, state, [specifier]);
const method =
identity?.path.length === 1 ? (identity.path[0] ?? null) : null;
if (
method !== null &&
(
@@ -468,6 +481,9 @@ const acquisitionMethod = (
)
return {
specifier,
...(identity?.builtinAuthority === undefined
? {}
: { builtinAuthority: identity.builtinAuthority }),
method: method as JavaScriptSemanticResourceOperation["method"],
};
}