1- import { fileURLToPath } from 'node:url';
2- import { createRequire as topLevelCreateRequire } from 'node:module';
1+ import { createRequire as topLevelCreateRequire } from 'node:module';
32 import { dirname as topLevelDirname } from 'path';
43 const require = topLevelCreateRequire(import.meta.url);
54var __create = Object.create;
@@ -19702,7 +19701,7 @@ var require_core = __commonJS({
1970219701 return inputs.map((input) => input.trim());
1970319702 }
1970419703 exports.getMultilineInput = getMultilineInput;
19705- function getBooleanInput (name, options) {
19704+ function getBooleanInput2 (name, options) {
1970619705 const trueValue = ["true", "True", "TRUE"];
1970719706 const falseValue = ["false", "False", "FALSE"];
1970819707 const val = getInput3(name, options);
@@ -19713,7 +19712,7 @@ var require_core = __commonJS({
1971319712 throw new TypeError(`Input does not meet YAML 1.2 "Core Schema" specification: ${name}
1971419713Support boolean input list: \`true | True | TRUE | false | False | FALSE\``);
1971519714 }
19716- exports.getBooleanInput = getBooleanInput ;
19715+ exports.getBooleanInput = getBooleanInput2 ;
1971719716 function setOutput(name, value) {
1971819717 const filePath = process.env["GITHUB_OUTPUT"] || "";
1971919718 if (filePath) {
@@ -24143,6 +24142,17 @@ function getFileFromRef(ref, filePath, cwd2) {
2414324142 return null;
2414424143 }
2414524144}
24145+ function tryGetJSONFromRef(ref, filePath, cwd2) {
24146+ const content = getFileFromRef(ref, filePath, cwd2);
24147+ if (content) {
24148+ try {
24149+ return JSON.parse(content);
24150+ } catch {
24151+ return null;
24152+ }
24153+ }
24154+ return null;
24155+ }
2414624156function getBaseRef() {
2414724157 const inputBaseRef = core.getInput("base-ref");
2414824158 if (inputBaseRef) {
@@ -24251,6 +24261,28 @@ async function calculateTotalDependencySizeIncrease(newVersions) {
2425124261 }
2425224262 return { totalSize, packageSizes };
2425324263}
24264+ var dependencyTypeMap = {
24265+ prod: "dependencies",
24266+ dev: "devDependencies",
24267+ optional: "optionalDependencies",
24268+ peer: "peerDependencies"
24269+ };
24270+ function getDependenciesFromPackageJson(pkg, types) {
24271+ const result = /* @__PURE__ */ new Map();
24272+ for (const type of types) {
24273+ const value = pkg[dependencyTypeMap[type]];
24274+ if (value === void 0) {
24275+ continue;
24276+ }
24277+ for (const [name, version] of Object.entries(value)) {
24278+ if (typeof version !== "string") {
24279+ continue;
24280+ }
24281+ result.set(name, version);
24282+ }
24283+ }
24284+ return result;
24285+ }
2425424286
2425524287// src/packs.ts
2425624288var core3 = __toESM(require_core(), 1);
@@ -24374,6 +24406,70 @@ function comparePackSizes(basePacks, sourcePacks, threshold) {
2437424406 };
2437524407}
2437624408
24409+ // src/replacements.ts
24410+ import nativeManifest from "./native-O77SEK3D.json" with { type: "json" };
24411+ import microUtilsManifest from "./micro-utilities-74AZJTCK.json" with { type: "json" };
24412+ import preferredManifest from "./preferred-UDJHBJAQ.json" with { type: "json" };
24413+ var allReplacements = [
24414+ ...nativeManifest.moduleReplacements,
24415+ ...microUtilsManifest.moduleReplacements,
24416+ ...preferredManifest.moduleReplacements
24417+ ];
24418+ function scanForReplacements(messages, baseDependencies, currentDependencies) {
24419+ const replacementMessages = [];
24420+ for (const [name] of currentDependencies) {
24421+ if (!baseDependencies.has(name)) {
24422+ const replacement = allReplacements.find(
24423+ (modReplacement) => modReplacement.moduleName === name
24424+ );
24425+ if (replacement) {
24426+ switch (replacement.type) {
24427+ case "none":
24428+ replacementMessages.push(
24429+ `| ${name} | This package is no longer necessary |`
24430+ );
24431+ break;
24432+ case "native": {
24433+ const mdnUrl = replacement.mdnPath ? `https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/${replacement.mdnPath}` : "";
24434+ const nativeReplacement = mdnUrl ? `[${replacement.replacement}](${mdnUrl})` : replacement.replacement;
24435+ replacementMessages.push(`| ${name} | Use ${nativeReplacement} |`);
24436+ break;
24437+ }
24438+ case "simple":
24439+ replacementMessages.push(
24440+ `| ${name} | ${replacement.replacement} |`
24441+ );
24442+ break;
24443+ case "documented": {
24444+ const docUrl = `https://github.com/es-tooling/module-replacements/blob/main/docs/modules/${replacement.docPath}.md`;
24445+ replacementMessages.push(
24446+ `| ${name} | [See documentation](${docUrl}) |`
24447+ );
24448+ break;
24449+ }
24450+ }
24451+ }
24452+ }
24453+ }
24454+ if (replacementMessages.length > 0) {
24455+ messages.push(
24456+ `## \u26A0\uFE0F Recommended Package Replacements
24457+
24458+ The following new packages or versions have community recommended replacements:
24459+
24460+ | \u{1F4E6} Package | \u{1F4A1} Recommendation |
24461+ | --- | --- |
24462+ ${replacementMessages.join("\n")}
24463+
24464+ > [!NOTE]
24465+ > These recommendations have been defined by the [e18e](https://e18e.dev) community.
24466+ > They may not always be a straightforward migration, so please review carefully
24467+ > and use the exclusion feature if you want to ignore any of them in future.
24468+ `
24469+ );
24470+ }
24471+ }
24472+
2437724473// src/main.ts
2437824474function formatBytes(bytes) {
2437924475 if (bytes === 0) return "0 B";
@@ -24406,6 +24502,23 @@ async function run() {
2440624502 const lockfilePath = detectLockfile(workspacePath);
2440724503 const token = core4.getInput("github-token", { required: true });
2440824504 const prNumber = parseInt(core4.getInput("pr-number", { required: true }), 10);
24505+ const detectReplacements = core4.getBooleanInput("detect-replacements");
24506+ const dependencyThreshold = parseInt(
24507+ core4.getInput("dependency-threshold") || "10",
24508+ 10
24509+ );
24510+ const sizeThreshold = parseInt(
24511+ core4.getInput("size-threshold") || "100000",
24512+ 10
24513+ );
24514+ const duplicateThreshold = parseInt(
24515+ core4.getInput("duplicate-threshold") || "1",
24516+ 10
24517+ );
24518+ const packSizeThreshold = parseInt(
24519+ core4.getInput("pack-size-threshold") || "50000",
24520+ 10
24521+ );
2440924522 if (Number.isNaN(prNumber) || prNumber < 1) {
2441024523 core4.info("No valid pull request number was found. Skipping.");
2441124524 return;
@@ -24435,24 +24548,18 @@ async function run() {
2443524548 core4.info("No package-lock.json found in current ref");
2443624549 return;
2443724550 }
24438- const currentDeps = parseLockfile(lockfilePath, currentPackageLock);
24439- const baseDeps = parseLockfile(lockfilePath, basePackageLock);
24440- const dependencyThreshold = parseInt(
24441- core4.getInput("dependency-threshold") || "10",
24442- 10
24443- );
24444- const sizeThreshold = parseInt(
24445- core4.getInput("size-threshold") || "100000",
24446- 10
24447- );
24448- const duplicateThreshold = parseInt(
24449- core4.getInput("duplicate-threshold") || "1",
24450- 10
24551+ const basePackageJson = tryGetJSONFromRef(
24552+ baseRef,
24553+ "package.json",
24554+ workspacePath
2445124555 );
24452- const packSizeThreshold = parseInt(
24453- core4.getInput("pack-size-threshold") || "50000",
24454- 10
24556+ const currentPackageJson = tryGetJSONFromRef(
24557+ currentRef,
24558+ "package.json",
24559+ workspacePath
2445524560 );
24561+ const currentDeps = parseLockfile(lockfilePath, currentPackageLock);
24562+ const baseDeps = parseLockfile(lockfilePath, basePackageLock);
2445624563 core4.info(`Dependency threshold set to ${dependencyThreshold}`);
2445724564 core4.info(`Size threshold set to ${formatBytes(sizeThreshold)}`);
2445824565 core4.info(`Duplicate threshold set to ${duplicateThreshold}`);
@@ -24619,6 +24726,25 @@ ${packRows}`
2461924726 core4.info(`Failed to compare pack sizes: ${err}`);
2462024727 }
2462124728 }
24729+ if (detectReplacements) {
24730+ if (!basePackageJson || !currentPackageJson) {
24731+ core4.setFailed(
24732+ "detect-replacements requires both base and current package.json to be present"
24733+ );
24734+ return;
24735+ }
24736+ const baseDependencies = getDependenciesFromPackageJson(basePackageJson, [
24737+ "optional",
24738+ "peer",
24739+ "dev",
24740+ "prod"
24741+ ]);
24742+ const currentDependencies = getDependenciesFromPackageJson(
24743+ currentPackageJson,
24744+ ["optional", "peer", "dev", "prod"]
24745+ );
24746+ scanForReplacements(messages, baseDependencies, currentDependencies);
24747+ }
2462224748 if (messages.length === 0) {
2462324749 core4.info("No dependency warnings found. Skipping comment creation.");
2462424750 return;
0 commit comments