@@ -24157,7 +24157,50 @@ function getBaseRef() {
2415724157
2415824158// src/npm.ts
2415924159var core2 = __toESM(require_core(), 1);
24160- async function fetchPackageMetadata(packageName, version) {
24160+ function getProvenance(meta) {
24161+ if (meta._npmUser?.trustedPublisher) {
24162+ return "trusted";
24163+ }
24164+ if (meta.dist?.attestations?.provenance) {
24165+ return "provenance";
24166+ }
24167+ return "none";
24168+ }
24169+ function getTrustLevel(status) {
24170+ switch (status) {
24171+ case "trusted":
24172+ return 2;
24173+ case "provenance":
24174+ return 1;
24175+ case "none":
24176+ return 0;
24177+ default:
24178+ return 0;
24179+ }
24180+ }
24181+ async function getProvenanceForPackageVersions(packageName, versions) {
24182+ const result = /* @__PURE__ */ new Map();
24183+ for (const version of versions) {
24184+ const metadata = await fetchPackageMetadata(packageName, version);
24185+ if (metadata) {
24186+ result.set(version, getProvenance(metadata));
24187+ }
24188+ }
24189+ return result;
24190+ }
24191+ function getMinTrustLevel(statuses) {
24192+ const result = { level: 2, status: "trusted" };
24193+ for (const status of statuses) {
24194+ const level = getTrustLevel(status);
24195+ if (level < result.level) {
24196+ result.level = level;
24197+ result.status = status;
24198+ }
24199+ }
24200+ return result;
24201+ }
24202+ var metaCache = /* @__PURE__ */ new Map();
24203+ async function fetchPackageMetadataImmediate(packageName, version) {
2416124204 try {
2416224205 const url = `https://registry.npmjs.org/${packageName}/${version}`;
2416324206 const response = await fetch(url);
@@ -24170,6 +24213,18 @@ async function fetchPackageMetadata(packageName, version) {
2417024213 return null;
2417124214 }
2417224215}
24216+ async function fetchPackageMetadata(packageName, version) {
24217+ const cacheKey = `${packageName}@${version}`;
24218+ const cached = metaCache.get(cacheKey);
24219+ if (cached) {
24220+ return cached;
24221+ }
24222+ const meta = fetchPackageMetadataImmediate(packageName, version);
24223+ metaCache.set(cacheKey, meta);
24224+ const result = await meta;
24225+ metaCache.set(cacheKey, result);
24226+ return result;
24227+ }
2417324228async function calculateTotalDependencySizeIncrease(newVersions) {
2417424229 let totalSize = 0;
2417524230 const processedPackages = /* @__PURE__ */ new Set();
@@ -24473,6 +24528,50 @@ ${packageRows}`
2447324528 core4.info(`Failed to calculate total dependency size increase: ${err}`);
2447424529 }
2447524530 }
24531+ const provenanceWarnings = [];
24532+ for (const [packageName, currentVersionSet] of currentDeps) {
24533+ const baseVersionSet = baseDeps.get(packageName);
24534+ if (!baseVersionSet || baseVersionSet.size === 0) {
24535+ continue;
24536+ }
24537+ if (baseVersionSet.isSubsetOf(currentVersionSet)) {
24538+ continue;
24539+ }
24540+ try {
24541+ const baseProvenances = await getProvenanceForPackageVersions(
24542+ packageName,
24543+ baseVersionSet
24544+ );
24545+ const currentProvenances = await getProvenanceForPackageVersions(
24546+ packageName,
24547+ currentVersionSet
24548+ );
24549+ if (baseProvenances.size === 0 || currentProvenances.size === 0) {
24550+ continue;
24551+ }
24552+ const minBaseTrust = getMinTrustLevel(baseProvenances.values());
24553+ const minCurrentTrust = getMinTrustLevel(currentProvenances.values());
24554+ if (minCurrentTrust.level < minBaseTrust.level) {
24555+ provenanceWarnings.push(
24556+ `\u{1F512} **${packageName}**: trust level decreased (${minBaseTrust.status} \u2192 ${minCurrentTrust.status})`
24557+ );
24558+ }
24559+ } catch (err) {
24560+ core4.info(`Failed to check provenance for ${packageName}: ${err}`);
24561+ }
24562+ }
24563+ if (provenanceWarnings.length > 0) {
24564+ messages.push(
24565+ `## \u26A0\uFE0F Package Trust Level Decreased
24566+
24567+ > [!CAUTION]
24568+ > Decreased trust levels may indicate a higher risk of supply chain attacks. Please review these changes carefully.
24569+
24570+ These packages have decreased trust levels:
24571+
24572+ ${provenanceWarnings.join("\n")}`
24573+ );
24574+ }
2447624575 const basePackagesPattern = core4.getInput("base-packages");
2447724576 const sourcePackagesPattern = core4.getInput("source-packages");
2447824577 if (basePackagesPattern && sourcePackagesPattern) {
0 commit comments