fix(javascript): select JSON and addon loaders by exact suffix (#7821)

Node's CommonJS loader matches registered extensions case-sensitively, so
require("./data.JSON") and require("./addon.NODE") run as JavaScript.
Derive target_json_status and the native loads relation from the exact
loader suffix instead of the inventory's case-folded file kind.

Fixes #7623
This commit is contained in:
RRFZ authored and GitHub committed 2026-10-29 13:43:55 +08:00
1 parent 4fbce5c122
commit fca331804a
4 files changed
+70 -6

No files matched your search

@@ -36,6 +36,7 @@ import {
import {
moduleResolutionModeForJavaScriptReference,
isJsonModuleTarget,
isNativeAddonModuleTarget,
} from "../../domain/javascript/javascriptModuleResolutionMode.js";
type StaticReference = JavaScriptStaticAnalysis["references"][number];
@@ -309,7 +310,8 @@ const addReference = (
coverage: input.coverage,
relation:
input.value.operation === "load" &&
resolved?.file?.kind === "native-addon"
resolved?.path != null &&
isNativeAddonModuleTarget(resolved.path, resolved.file?.kind)
? "loads"
: "imports",
properties: {
@@ -18,7 +18,10 @@ import type {
JavaScriptModuleOrigin,
JavaScriptSemanticModuleLink,
} from "../../domain/javascript/javascriptSemanticIr.js";
import { moduleResolutionModeForJavaScriptReference } from "../../domain/javascript/javascriptModuleResolutionMode.js";
import {
isJsonModuleTarget,
moduleResolutionModeForJavaScriptReference,
} from "../../domain/javascript/javascriptModuleResolutionMode.js";
import type { JavaScriptArtifactFile } from "../../domain/javascript/javascriptArtifactFiles.js";
import {
addAstContainsEdge,
@@ -327,10 +330,9 @@ const resolveModuleTarget = (
node,
path,
file,
jsonStatus:
file.kind === "json" || file.kind === "package-json"
? input.context.analysis.jsonDocuments.read(file).status
: null,
jsonStatus: isJsonModuleTarget(path, file.kind)
? input.context.analysis.jsonDocuments.read(file).status
: null,
status: "resolved",
limitations: resolution.limitations,
resolution,