Handle references into inactive modules

This commit is contained in:
2026-04-21 14:00:37 +00:00
parent 6d8f7a0559
commit 7d574f7c1b
12 changed files with 125 additions and 11 deletions

View File

@@ -32,7 +32,7 @@ function compareOwner(sourceScope, targetOwner) {
return "allowed";
}
export function buildFindings({ files, references, i18n }={}) {
export function buildFindings({ files, references, i18n, packageActivity }={}) {
const fileByLocator = new Map(files.map(file => [createCanonicalLocator(file.storage, file.path), file]));
const fileLocators = files.map(file => ({
storage: file.storage,
@@ -43,6 +43,7 @@ export function buildFindings({ files, references, i18n }={}) {
const refsByLocator = new Map();
const wildcardReferences = [];
const findings = [];
const inactiveModuleReferenceIds = new Set();
for (const reference of resolvedReferences) {
const normalized = reference.normalized;
@@ -84,6 +85,10 @@ export function buildFindings({ files, references, i18n }={}) {
const ownerRelation = compareOwner(reference.sourceScope, file.ownerHint);
if (ownerRelation === "non-package-to-package") {
if (isInactiveModuleTarget(file, packageActivity)) {
inactiveModuleReferenceIds.add(file.ownerHint.ownerId);
continue;
}
if (isAnchoredInOwningPackage(file, matchingReferencesForFile(file, refsByLocator, wildcardReferences))) continue;
findings.push({
kind: "non-package-to-package-reference",
@@ -137,7 +142,10 @@ export function buildFindings({ files, references, i18n }={}) {
});
}
return findings;
return {
findings,
notices: createNotices({ inactiveModuleReferenceIds, packageActivity, i18n })
};
}
function resolveReferenceTarget(reference, fileByLocator, fileLocators) {
@@ -225,6 +233,27 @@ function shouldReportOrphan(file, references) {
return false;
}
function isInactiveModuleTarget(file, packageActivity) {
if (file.ownerHint?.ownerType !== "module") return false;
const active = packageActivity?.modules?.get?.(file.ownerHint.ownerId);
return active === false;
}
function createNotices({ inactiveModuleReferenceIds, packageActivity, i18n }) {
const moduleIds = [...inactiveModuleReferenceIds].sort((a, b) => a.localeCompare(b));
if (!moduleIds.length) return [];
const moduleLabels = moduleIds.map(id => packageActivity?.moduleLabels?.get?.(id) ?? id);
return [{
kind: "inactive-module-references",
severity: "info",
moduleIds,
moduleLabels,
message: format(i18n, "KSA.Notice.InactiveModuleReferences", {
modules: moduleLabels.join(", ")
})
}];
}
function isDerivedSceneThumbnail(file) {
const path = String(file.path ?? "");
return /^worlds\/[^/]+\/assets\/scenes\/[^/]+-thumb\.(?:png|webp)$/u.test(path);