From a702b4ad969081d133fc9aec5adc2830871343fa Mon Sep 17 00:00:00 2001 From: James Garbutt <43081j@users.noreply.github.com> Date: Sun, 11 Jan 2026 17:47:36 +0000 Subject: [PATCH 1/3] feat: group dependency updates When listing dependency additions and removals, this will group them as an "update" instead of having two separate entries. This means we can better render the individual change in size. Fixes #89. --- src/checks/dependency-size.ts | 86 +++++++++++++++++++++++++++++++++-- 1 file changed, 82 insertions(+), 4 deletions(-) diff --git a/src/checks/dependency-size.ts b/src/checks/dependency-size.ts index 8dcec76..d41ba99 100644 --- a/src/checks/dependency-size.ts +++ b/src/checks/dependency-size.ts @@ -7,6 +7,82 @@ import { } from '../npm.js'; import {formatBytes} from '../common.js'; +interface PackageGroup { + added: Array<{version: string; size: number | null}>; + removed: Array<{version: string; size: number | null}>; +} + +interface DisplayEntry { + label: string; + size: number | null; + sortSize: number; +} + +function buildPackageGroups( + packageSizes: Map +): Map { + const packageGroups = new Map(); + + for (const [pkgKey, size] of packageSizes.entries()) { + const atIndex = pkgKey.lastIndexOf('@'); + const name = pkgKey.substring(0, atIndex); + const version = pkgKey.substring(atIndex + 1); + + const group = packageGroups.get(name) ?? {added: [], removed: []}; + + if (size !== null && size < 0) { + group.removed.push({version, size}); + } else { + group.added.push({version, size}); + } + + packageGroups.set(name, group); + } + + return packageGroups; +} + +function createDisplayEntries( + packageGroups: Map +): DisplayEntry[] { + const displayEntries: DisplayEntry[] = []; + + for (const [name, group] of packageGroups.entries()) { + if ( + group.added.length === 1 && + group.removed.length === 1 && + group.added[0].size !== null && + group.removed[0].size !== null + ) { + const netSize = group.added[0].size + group.removed[0].size; + displayEntries.push({ + label: `${name}@${group.removed[0].version} → ${name}@${group.added[0].version}`, + size: netSize, + sortSize: netSize + }); + } else { + for (const added of group.added) { + displayEntries.push({ + label: `${name}@${added.version}`, + size: added.size, + sortSize: added.size ?? 0 + }); + } + for (const removed of group.removed) { + displayEntries.push({ + label: `${name}@${removed.version}`, + size: removed.size, + sortSize: removed.size ?? 0 + }); + } + } + } + + displayEntries.sort((a, b) => Math.abs(b.sortSize) - Math.abs(a.sortSize)); + + return displayEntries; +} + async function removeUnsupportedOptionalDependencies( lockFile: ParsedLockFile, versionInfo: Array<{name: string; version: string; isNewPackage?: boolean}> @@ -118,11 +194,13 @@ export async function scanForDependencySize( (sizeData !== null && sizeData.totalSize >= threshold); if (shouldShow && sizeData !== null) { - const packageRows = Array.from(sizeData.packageSizes.entries()) - .sort(([, a], [, b]) => (b ?? Infinity) - (a ?? Infinity)) + const packageGroups = buildPackageGroups(sizeData.packageSizes); + const displayEntries = createDisplayEntries(packageGroups); + + const packageRows = displayEntries .map( - ([pkg, size]) => - `| ${pkg} | ${size === null ? '_Unknown_' : formatBytes(size)} |` + ({label, size}) => + `| ${label} | ${size === null ? '_Unknown_' : formatBytes(size)} |` ) .join('\n'); From b1ad818a7a5751efaa17ac5687b78c20acab6e86 Mon Sep 17 00:00:00 2001 From: James Garbutt <43081j@users.noreply.github.com> Date: Sun, 11 Jan 2026 18:25:02 +0000 Subject: [PATCH 2/3] chore: run build --- build/main.js | 1046 ++++++++++++++++++++++++++++----------------- package-lock.json | 39 +- package.json | 4 +- 3 files changed, 668 insertions(+), 421 deletions(-) diff --git a/build/main.js b/build/main.js index 9407692..67dac06 100644 --- a/build/main.js +++ b/build/main.js @@ -38,7 +38,8 @@ var require_utils = __commonJS({ "node_modules/@actions/core/lib/utils.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); - exports.toCommandProperties = exports.toCommandValue = void 0; + exports.toCommandValue = toCommandValue; + exports.toCommandProperties = toCommandProperties; function toCommandValue(input) { if (input === null || input === void 0) { return ""; @@ -47,7 +48,6 @@ var require_utils = __commonJS({ } return JSON.stringify(input); } - exports.toCommandValue = toCommandValue; function toCommandProperties(annotationProperties) { if (!Object.keys(annotationProperties).length) { return {}; @@ -61,7 +61,6 @@ var require_utils = __commonJS({ endColumn: annotationProperties.endColumn }; } - exports.toCommandProperties = toCommandProperties; } }); @@ -87,28 +86,37 @@ var require_command = __commonJS({ }) : function(o, v) { o["default"] = v; }); - var __importStar = exports && exports.__importStar || function(mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) { - for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - } - __setModuleDefault(result, mod); - return result; - }; + var __importStar = exports && exports.__importStar || /* @__PURE__ */ (function() { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function(o2) { + var ar = []; + for (var k in o2) if (Object.prototype.hasOwnProperty.call(o2, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function(mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) { + for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + } + __setModuleDefault(result, mod); + return result; + }; + })(); Object.defineProperty(exports, "__esModule", { value: true }); - exports.issue = exports.issueCommand = void 0; + exports.issueCommand = issueCommand; + exports.issue = issue; var os = __importStar(__require("os")); var utils_1 = require_utils(); function issueCommand(command, properties, message) { const cmd = new Command(command, properties, message); process.stdout.write(cmd.toString() + os.EOL); } - exports.issueCommand = issueCommand; function issue(name, message = "") { issueCommand(name, {}, message); } - exports.issue = issue; var CMD_STRING = "::"; var Command = class { constructor(command, properties, message) { @@ -173,17 +181,28 @@ var require_file_command = __commonJS({ }) : function(o, v) { o["default"] = v; }); - var __importStar = exports && exports.__importStar || function(mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) { - for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - } - __setModuleDefault(result, mod); - return result; - }; + var __importStar = exports && exports.__importStar || /* @__PURE__ */ (function() { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function(o2) { + var ar = []; + for (var k in o2) if (Object.prototype.hasOwnProperty.call(o2, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function(mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) { + for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + } + __setModuleDefault(result, mod); + return result; + }; + })(); Object.defineProperty(exports, "__esModule", { value: true }); - exports.prepareKeyValueMessage = exports.issueFileCommand = void 0; + exports.issueFileCommand = issueFileCommand; + exports.prepareKeyValueMessage = prepareKeyValueMessage; var crypto = __importStar(__require("crypto")); var fs2 = __importStar(__require("fs")); var os = __importStar(__require("os")); @@ -200,7 +219,6 @@ var require_file_command = __commonJS({ encoding: "utf8" }); } - exports.issueFileCommand = issueFileCommand; function prepareKeyValueMessage(key, value) { const delimiter = `ghadelimiter_${crypto.randomUUID()}`; const convertedValue = (0, utils_1.toCommandValue)(value); @@ -212,7 +230,6 @@ var require_file_command = __commonJS({ } return `${key}<<${delimiter}${os.EOL}${convertedValue}${os.EOL}${delimiter}`; } - exports.prepareKeyValueMessage = prepareKeyValueMessage; } }); @@ -221,7 +238,8 @@ var require_proxy = __commonJS({ "node_modules/@actions/http-client/lib/proxy.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); - exports.checkBypass = exports.getProxyUrl = void 0; + exports.getProxyUrl = getProxyUrl; + exports.checkBypass = checkBypass; function getProxyUrl(reqUrl) { const usingSsl = reqUrl.protocol === "https:"; if (checkBypass(reqUrl)) { @@ -245,7 +263,6 @@ var require_proxy = __commonJS({ return void 0; } } - exports.getProxyUrl = getProxyUrl; function checkBypass(reqUrl) { if (!reqUrl.hostname) { return false; @@ -277,7 +294,6 @@ var require_proxy = __commonJS({ } return false; } - exports.checkBypass = checkBypass; function isLoopbackAddress(host) { const hostLower = host.toLowerCase(); return hostLower === "localhost" || hostLower.startsWith("127.") || hostLower.startsWith("[::1]") || hostLower.startsWith("[0:0:0:0:0:0:0:1]"); @@ -539,67 +555,67 @@ var require_tunnel2 = __commonJS({ var require_symbols = __commonJS({ "node_modules/undici/lib/core/symbols.js"(exports, module) { module.exports = { - kClose: Symbol("close"), - kDestroy: Symbol("destroy"), - kDispatch: Symbol("dispatch"), - kUrl: Symbol("url"), - kWriting: Symbol("writing"), - kResuming: Symbol("resuming"), - kQueue: Symbol("queue"), - kConnect: Symbol("connect"), - kConnecting: Symbol("connecting"), - kHeadersList: Symbol("headers list"), - kKeepAliveDefaultTimeout: Symbol("default keep alive timeout"), - kKeepAliveMaxTimeout: Symbol("max keep alive timeout"), - kKeepAliveTimeoutThreshold: Symbol("keep alive timeout threshold"), - kKeepAliveTimeoutValue: Symbol("keep alive timeout"), - kKeepAlive: Symbol("keep alive"), - kHeadersTimeout: Symbol("headers timeout"), - kBodyTimeout: Symbol("body timeout"), - kServerName: Symbol("server name"), - kLocalAddress: Symbol("local address"), - kHost: Symbol("host"), - kNoRef: Symbol("no ref"), - kBodyUsed: Symbol("used"), - kRunning: Symbol("running"), - kBlocking: Symbol("blocking"), - kPending: Symbol("pending"), - kSize: Symbol("size"), - kBusy: Symbol("busy"), - kQueued: Symbol("queued"), - kFree: Symbol("free"), - kConnected: Symbol("connected"), - kClosed: Symbol("closed"), - kNeedDrain: Symbol("need drain"), - kReset: Symbol("reset"), - kDestroyed: Symbol.for("nodejs.stream.destroyed"), - kMaxHeadersSize: Symbol("max headers size"), - kRunningIdx: Symbol("running index"), - kPendingIdx: Symbol("pending index"), - kError: Symbol("error"), - kClients: Symbol("clients"), - kClient: Symbol("client"), - kParser: Symbol("parser"), - kOnDestroyed: Symbol("destroy callbacks"), - kPipelining: Symbol("pipelining"), - kSocket: Symbol("socket"), - kHostHeader: Symbol("host header"), - kConnector: Symbol("connector"), - kStrictContentLength: Symbol("strict content length"), - kMaxRedirections: Symbol("maxRedirections"), - kMaxRequests: Symbol("maxRequestsPerClient"), - kProxy: Symbol("proxy agent options"), - kCounter: Symbol("socket request counter"), - kInterceptors: Symbol("dispatch interceptors"), - kMaxResponseSize: Symbol("max response size"), - kHTTP2Session: Symbol("http2Session"), - kHTTP2SessionState: Symbol("http2Session state"), - kHTTP2BuildRequest: Symbol("http2 build request"), - kHTTP1BuildRequest: Symbol("http1 build request"), - kHTTP2CopyHeaders: Symbol("http2 copy headers"), - kHTTPConnVersion: Symbol("http connection version"), - kRetryHandlerDefaultRetry: Symbol("retry agent default retry"), - kConstruct: Symbol("constructable") + kClose: /* @__PURE__ */ Symbol("close"), + kDestroy: /* @__PURE__ */ Symbol("destroy"), + kDispatch: /* @__PURE__ */ Symbol("dispatch"), + kUrl: /* @__PURE__ */ Symbol("url"), + kWriting: /* @__PURE__ */ Symbol("writing"), + kResuming: /* @__PURE__ */ Symbol("resuming"), + kQueue: /* @__PURE__ */ Symbol("queue"), + kConnect: /* @__PURE__ */ Symbol("connect"), + kConnecting: /* @__PURE__ */ Symbol("connecting"), + kHeadersList: /* @__PURE__ */ Symbol("headers list"), + kKeepAliveDefaultTimeout: /* @__PURE__ */ Symbol("default keep alive timeout"), + kKeepAliveMaxTimeout: /* @__PURE__ */ Symbol("max keep alive timeout"), + kKeepAliveTimeoutThreshold: /* @__PURE__ */ Symbol("keep alive timeout threshold"), + kKeepAliveTimeoutValue: /* @__PURE__ */ Symbol("keep alive timeout"), + kKeepAlive: /* @__PURE__ */ Symbol("keep alive"), + kHeadersTimeout: /* @__PURE__ */ Symbol("headers timeout"), + kBodyTimeout: /* @__PURE__ */ Symbol("body timeout"), + kServerName: /* @__PURE__ */ Symbol("server name"), + kLocalAddress: /* @__PURE__ */ Symbol("local address"), + kHost: /* @__PURE__ */ Symbol("host"), + kNoRef: /* @__PURE__ */ Symbol("no ref"), + kBodyUsed: /* @__PURE__ */ Symbol("used"), + kRunning: /* @__PURE__ */ Symbol("running"), + kBlocking: /* @__PURE__ */ Symbol("blocking"), + kPending: /* @__PURE__ */ Symbol("pending"), + kSize: /* @__PURE__ */ Symbol("size"), + kBusy: /* @__PURE__ */ Symbol("busy"), + kQueued: /* @__PURE__ */ Symbol("queued"), + kFree: /* @__PURE__ */ Symbol("free"), + kConnected: /* @__PURE__ */ Symbol("connected"), + kClosed: /* @__PURE__ */ Symbol("closed"), + kNeedDrain: /* @__PURE__ */ Symbol("need drain"), + kReset: /* @__PURE__ */ Symbol("reset"), + kDestroyed: /* @__PURE__ */ Symbol.for("nodejs.stream.destroyed"), + kMaxHeadersSize: /* @__PURE__ */ Symbol("max headers size"), + kRunningIdx: /* @__PURE__ */ Symbol("running index"), + kPendingIdx: /* @__PURE__ */ Symbol("pending index"), + kError: /* @__PURE__ */ Symbol("error"), + kClients: /* @__PURE__ */ Symbol("clients"), + kClient: /* @__PURE__ */ Symbol("client"), + kParser: /* @__PURE__ */ Symbol("parser"), + kOnDestroyed: /* @__PURE__ */ Symbol("destroy callbacks"), + kPipelining: /* @__PURE__ */ Symbol("pipelining"), + kSocket: /* @__PURE__ */ Symbol("socket"), + kHostHeader: /* @__PURE__ */ Symbol("host header"), + kConnector: /* @__PURE__ */ Symbol("connector"), + kStrictContentLength: /* @__PURE__ */ Symbol("strict content length"), + kMaxRedirections: /* @__PURE__ */ Symbol("maxRedirections"), + kMaxRequests: /* @__PURE__ */ Symbol("maxRequestsPerClient"), + kProxy: /* @__PURE__ */ Symbol("proxy agent options"), + kCounter: /* @__PURE__ */ Symbol("socket request counter"), + kInterceptors: /* @__PURE__ */ Symbol("dispatch interceptors"), + kMaxResponseSize: /* @__PURE__ */ Symbol("max response size"), + kHTTP2Session: /* @__PURE__ */ Symbol("http2Session"), + kHTTP2SessionState: /* @__PURE__ */ Symbol("http2Session state"), + kHTTP2BuildRequest: /* @__PURE__ */ Symbol("http2 build request"), + kHTTP1BuildRequest: /* @__PURE__ */ Symbol("http1 build request"), + kHTTP2CopyHeaders: /* @__PURE__ */ Symbol("http2 copy headers"), + kHTTPConnVersion: /* @__PURE__ */ Symbol("http connection version"), + kRetryHandlerDefaultRetry: /* @__PURE__ */ Symbol("retry agent default retry"), + kConstruct: /* @__PURE__ */ Symbol("constructable") }; } }); @@ -3594,7 +3610,7 @@ var require_constants2 = __commonJS({ var require_global = __commonJS({ "node_modules/undici/lib/fetch/global.js"(exports, module) { "use strict"; - var globalOrigin = Symbol.for("undici.globalOrigin.1"); + var globalOrigin = /* @__PURE__ */ Symbol.for("undici.globalOrigin.1"); function getGlobalOrigin() { return globalThis[globalOrigin]; } @@ -4246,12 +4262,12 @@ var require_symbols2 = __commonJS({ "node_modules/undici/lib/fetch/symbols.js"(exports, module) { "use strict"; module.exports = { - kUrl: Symbol("url"), - kHeaders: Symbol("headers"), - kSignal: Symbol("signal"), - kState: Symbol("state"), - kGuard: Symbol("guard"), - kRealm: Symbol("realm") + kUrl: /* @__PURE__ */ Symbol("url"), + kHeaders: /* @__PURE__ */ Symbol("headers"), + kSignal: /* @__PURE__ */ Symbol("signal"), + kState: /* @__PURE__ */ Symbol("state"), + kGuard: /* @__PURE__ */ Symbol("guard"), + kRealm: /* @__PURE__ */ Symbol("realm") }; } }); @@ -5644,7 +5660,7 @@ var require_request = __commonJS({ var tokenRegExp = /^[\^_`a-zA-Z\-0-9!#$%&'*+.|~]+$/; var headerCharRegex = /[^\t\x20-\x7e\x80-\xff]/; var invalidPathRegex = /[^\u0021-\u00ff]/; - var kHandler = Symbol("handler"); + var kHandler = /* @__PURE__ */ Symbol("handler"); var channels = {}; var extractBody; try { @@ -6031,11 +6047,11 @@ var require_dispatcher_base = __commonJS({ InvalidArgumentError } = require_errors(); var { kDestroy, kClose, kDispatch, kInterceptors } = require_symbols(); - var kDestroyed = Symbol("destroyed"); - var kClosed = Symbol("closed"); - var kOnDestroyed = Symbol("onDestroyed"); - var kOnClosed = Symbol("onClosed"); - var kInterceptedDispatch = Symbol("Intercepted Dispatch"); + var kDestroyed = /* @__PURE__ */ Symbol("destroyed"); + var kClosed = /* @__PURE__ */ Symbol("closed"); + var kOnDestroyed = /* @__PURE__ */ Symbol("onDestroyed"); + var kOnClosed = /* @__PURE__ */ Symbol("onClosed"); + var kInterceptedDispatch = /* @__PURE__ */ Symbol("Intercepted Dispatch"); var DispatcherBase = class extends Dispatcher { constructor() { super(); @@ -6690,7 +6706,7 @@ var require_RedirectHandler = __commonJS({ var { InvalidArgumentError } = require_errors(); var EE = __require("events"); var redirectableStatusCodes = [300, 301, 302, 303, 307, 308]; - var kBody = Symbol("body"); + var kBody = /* @__PURE__ */ Symbol("body"); var BodyAsyncIterable = class { constructor(body) { this[kBody] = body; @@ -6964,7 +6980,7 @@ var require_client = __commonJS({ } = http2; var h2ExperimentalWarned = false; var FastBuffer = Buffer[Symbol.species]; - var kClosedResolve = Symbol("kClosedResolve"); + var kClosedResolve = /* @__PURE__ */ Symbol("kClosedResolve"); var channels = {}; try { const diagnosticsChannel = __require("diagnostics_channel"); @@ -8634,7 +8650,7 @@ var require_fixed_queue = __commonJS({ var require_pool_stats = __commonJS({ "node_modules/undici/lib/pool-stats.js"(exports, module) { var { kFree, kConnected, kPending, kQueued, kRunning, kSize } = require_symbols(); - var kPool = Symbol("pool"); + var kPool = /* @__PURE__ */ Symbol("pool"); var PoolStats = class { constructor(pool) { this[kPool] = pool; @@ -8670,18 +8686,18 @@ var require_pool_base = __commonJS({ var FixedQueue = require_fixed_queue(); var { kConnected, kSize, kRunning, kPending, kQueued, kBusy, kFree, kUrl, kClose, kDestroy, kDispatch } = require_symbols(); var PoolStats = require_pool_stats(); - var kClients = Symbol("clients"); - var kNeedDrain = Symbol("needDrain"); - var kQueue = Symbol("queue"); - var kClosedResolve = Symbol("closed resolve"); - var kOnDrain = Symbol("onDrain"); - var kOnConnect = Symbol("onConnect"); - var kOnDisconnect = Symbol("onDisconnect"); - var kOnConnectionError = Symbol("onConnectionError"); - var kGetDispatcher = Symbol("get dispatcher"); - var kAddClient = Symbol("add client"); - var kRemoveClient = Symbol("remove client"); - var kStats = Symbol("stats"); + var kClients = /* @__PURE__ */ Symbol("clients"); + var kNeedDrain = /* @__PURE__ */ Symbol("needDrain"); + var kQueue = /* @__PURE__ */ Symbol("queue"); + var kClosedResolve = /* @__PURE__ */ Symbol("closed resolve"); + var kOnDrain = /* @__PURE__ */ Symbol("onDrain"); + var kOnConnect = /* @__PURE__ */ Symbol("onConnect"); + var kOnDisconnect = /* @__PURE__ */ Symbol("onDisconnect"); + var kOnConnectionError = /* @__PURE__ */ Symbol("onConnectionError"); + var kGetDispatcher = /* @__PURE__ */ Symbol("get dispatcher"); + var kAddClient = /* @__PURE__ */ Symbol("add client"); + var kRemoveClient = /* @__PURE__ */ Symbol("remove client"); + var kStats = /* @__PURE__ */ Symbol("stats"); var PoolBase = class extends DispatcherBase { constructor() { super(); @@ -8835,9 +8851,9 @@ var require_pool = __commonJS({ var util = require_util(); var { kUrl, kInterceptors } = require_symbols(); var buildConnector = require_connect(); - var kOptions = Symbol("options"); - var kConnections = Symbol("connections"); - var kFactory = Symbol("factory"); + var kOptions = /* @__PURE__ */ Symbol("options"); + var kConnections = /* @__PURE__ */ Symbol("connections"); + var kFactory = /* @__PURE__ */ Symbol("factory"); function defaultFactory(origin, opts) { return new Client(origin, opts); } @@ -8926,14 +8942,14 @@ var require_balanced_pool = __commonJS({ var Pool = require_pool(); var { kUrl, kInterceptors } = require_symbols(); var { parseOrigin } = require_util(); - var kFactory = Symbol("factory"); - var kOptions = Symbol("options"); - var kGreatestCommonDivisor = Symbol("kGreatestCommonDivisor"); - var kCurrentWeight = Symbol("kCurrentWeight"); - var kIndex = Symbol("kIndex"); - var kWeight = Symbol("kWeight"); - var kMaxWeightPerServer = Symbol("kMaxWeightPerServer"); - var kErrorPenalty = Symbol("kErrorPenalty"); + var kFactory = /* @__PURE__ */ Symbol("factory"); + var kOptions = /* @__PURE__ */ Symbol("options"); + var kGreatestCommonDivisor = /* @__PURE__ */ Symbol("kGreatestCommonDivisor"); + var kCurrentWeight = /* @__PURE__ */ Symbol("kCurrentWeight"); + var kIndex = /* @__PURE__ */ Symbol("kIndex"); + var kWeight = /* @__PURE__ */ Symbol("kWeight"); + var kMaxWeightPerServer = /* @__PURE__ */ Symbol("kMaxWeightPerServer"); + var kErrorPenalty = /* @__PURE__ */ Symbol("kErrorPenalty"); function getGreatestCommonDivisor(a, b) { if (b === 0) return a; return getGreatestCommonDivisor(b, a % b); @@ -9096,14 +9112,14 @@ var require_agent = __commonJS({ var util = require_util(); var createRedirectInterceptor = require_redirectInterceptor(); var { WeakRef: WeakRef2, FinalizationRegistry } = require_dispatcher_weakref()(); - var kOnConnect = Symbol("onConnect"); - var kOnDisconnect = Symbol("onDisconnect"); - var kOnConnectionError = Symbol("onConnectionError"); - var kMaxRedirections = Symbol("maxRedirections"); - var kOnDrain = Symbol("onDrain"); - var kFactory = Symbol("factory"); - var kFinalizer = Symbol("finalizer"); - var kOptions = Symbol("options"); + var kOnConnect = /* @__PURE__ */ Symbol("onConnect"); + var kOnDisconnect = /* @__PURE__ */ Symbol("onDisconnect"); + var kOnConnectionError = /* @__PURE__ */ Symbol("onConnectionError"); + var kMaxRedirections = /* @__PURE__ */ Symbol("maxRedirections"); + var kOnDrain = /* @__PURE__ */ Symbol("onDrain"); + var kFactory = /* @__PURE__ */ Symbol("factory"); + var kFinalizer = /* @__PURE__ */ Symbol("finalizer"); + var kOptions = /* @__PURE__ */ Symbol("options"); function defaultFactory(origin, opts) { return opts && opts.connections === 1 ? new Client(origin, opts) : new Pool(origin, opts); } @@ -9212,11 +9228,11 @@ var require_readable = __commonJS({ var util = require_util(); var { ReadableStreamFrom, toUSVString } = require_util(); var Blob2; - var kConsume = Symbol("kConsume"); - var kReading = Symbol("kReading"); - var kBody = Symbol("kBody"); - var kAbort = Symbol("abort"); - var kContentType = Symbol("kContentType"); + var kConsume = /* @__PURE__ */ Symbol("kConsume"); + var kReading = /* @__PURE__ */ Symbol("kReading"); + var kBody = /* @__PURE__ */ Symbol("kBody"); + var kAbort = /* @__PURE__ */ Symbol("abort"); + var kContentType = /* @__PURE__ */ Symbol("kContentType"); var noop = () => { }; module.exports = class BodyReadable extends Readable { @@ -9502,8 +9518,8 @@ var require_abort_signal = __commonJS({ "node_modules/undici/lib/api/abort-signal.js"(exports, module) { var { addAbortListener } = require_util(); var { RequestAbortedError } = require_errors(); - var kListener = Symbol("kListener"); - var kSignal = Symbol("kSignal"); + var kListener = /* @__PURE__ */ Symbol("kListener"); + var kSignal = /* @__PURE__ */ Symbol("kSignal"); function abort(self) { if (self.abort) { self.abort(); @@ -9892,7 +9908,7 @@ var require_api_pipeline = __commonJS({ var { AsyncResource } = __require("async_hooks"); var { addSignal, removeSignal } = require_abort_signal(); var assert = __require("assert"); - var kResume = Symbol("resume"); + var kResume = /* @__PURE__ */ Symbol("resume"); var PipelineRequest = class extends Readable { constructor() { super({ autoDestroy: true }); @@ -10286,25 +10302,25 @@ var require_mock_symbols = __commonJS({ "node_modules/undici/lib/mock/mock-symbols.js"(exports, module) { "use strict"; module.exports = { - kAgent: Symbol("agent"), - kOptions: Symbol("options"), - kFactory: Symbol("factory"), - kDispatches: Symbol("dispatches"), - kDispatchKey: Symbol("dispatch key"), - kDefaultHeaders: Symbol("default headers"), - kDefaultTrailers: Symbol("default trailers"), - kContentLength: Symbol("content length"), - kMockAgent: Symbol("mock agent"), - kMockAgentSet: Symbol("mock agent set"), - kMockAgentGet: Symbol("mock agent get"), - kMockDispatch: Symbol("mock dispatch"), - kClose: Symbol("close"), - kOriginalClose: Symbol("original agent close"), - kOrigin: Symbol("origin"), - kIsMockActive: Symbol("is mock active"), - kNetConnect: Symbol("net connect"), - kGetNetConnect: Symbol("get net connect"), - kConnected: Symbol("connected") + kAgent: /* @__PURE__ */ Symbol("agent"), + kOptions: /* @__PURE__ */ Symbol("options"), + kFactory: /* @__PURE__ */ Symbol("factory"), + kDispatches: /* @__PURE__ */ Symbol("dispatches"), + kDispatchKey: /* @__PURE__ */ Symbol("dispatch key"), + kDefaultHeaders: /* @__PURE__ */ Symbol("default headers"), + kDefaultTrailers: /* @__PURE__ */ Symbol("default trailers"), + kContentLength: /* @__PURE__ */ Symbol("content length"), + kMockAgent: /* @__PURE__ */ Symbol("mock agent"), + kMockAgentSet: /* @__PURE__ */ Symbol("mock agent set"), + kMockAgentGet: /* @__PURE__ */ Symbol("mock agent get"), + kMockDispatch: /* @__PURE__ */ Symbol("mock dispatch"), + kClose: /* @__PURE__ */ Symbol("close"), + kOriginalClose: /* @__PURE__ */ Symbol("original agent close"), + kOrigin: /* @__PURE__ */ Symbol("origin"), + kIsMockActive: /* @__PURE__ */ Symbol("is mock active"), + kNetConnect: /* @__PURE__ */ Symbol("net connect"), + kGetNetConnect: /* @__PURE__ */ Symbol("get net connect"), + kConnected: /* @__PURE__ */ Symbol("connected") }; } }); @@ -11076,12 +11092,12 @@ var require_proxy_agent = __commonJS({ var DispatcherBase = require_dispatcher_base(); var { InvalidArgumentError, RequestAbortedError } = require_errors(); var buildConnector = require_connect(); - var kAgent = Symbol("proxy agent"); - var kClient = Symbol("proxy client"); - var kProxyHeaders = Symbol("proxy headers"); - var kRequestTls = Symbol("request tls settings"); - var kProxyTls = Symbol("proxy tls settings"); - var kConnectEndpoint = Symbol("connect endpoint function"); + var kAgent = /* @__PURE__ */ Symbol("proxy agent"); + var kClient = /* @__PURE__ */ Symbol("proxy client"); + var kProxyHeaders = /* @__PURE__ */ Symbol("proxy headers"); + var kRequestTls = /* @__PURE__ */ Symbol("request tls settings"); + var kProxyTls = /* @__PURE__ */ Symbol("proxy tls settings"); + var kConnectEndpoint = /* @__PURE__ */ Symbol("connect endpoint function"); function defaultProtocolPort(protocol) { return protocol === "https:" ? 443 : 80; } @@ -11488,7 +11504,7 @@ var require_RetryHandler = __commonJS({ var require_global2 = __commonJS({ "node_modules/undici/lib/global.js"(exports, module) { "use strict"; - var globalDispatcher = Symbol.for("undici.globalDispatcher.1"); + var globalDispatcher = /* @__PURE__ */ Symbol.for("undici.globalDispatcher.1"); var { InvalidArgumentError } = require_errors(); var Agent = require_agent(); if (getGlobalDispatcher() === void 0) { @@ -11563,8 +11579,8 @@ var require_headers = __commonJS({ var util = __require("util"); var { webidl } = require_webidl(); var assert = __require("assert"); - var kHeadersMap = Symbol("headers map"); - var kHeadersSortedMap = Symbol("headers map sorted"); + var kHeadersMap = /* @__PURE__ */ Symbol("headers map"); + var kHeadersSortedMap = /* @__PURE__ */ Symbol("headers map sorted"); function isHTTPWhiteSpaceCharCode(code) { return code === 10 || code === 13 || code === 9 || code === 32; } @@ -11891,7 +11907,7 @@ var require_headers = __commonJS({ callbackFn.apply(thisArg, [value, key, this]); } } - [Symbol.for("nodejs.util.inspect.custom")]() { + [/* @__PURE__ */ Symbol.for("nodejs.util.inspect.custom")]() { webidl.brandCheck(this, _Headers); return this[kHeadersList]; } @@ -12351,7 +12367,7 @@ var require_request2 = __commonJS({ var assert = __require("assert"); var { getMaxListeners, setMaxListeners, getEventListeners, defaultMaxListeners } = __require("events"); var TransformStream = globalThis.TransformStream; - var kAbortController = Symbol("abortController"); + var kAbortController = /* @__PURE__ */ Symbol("abortController"); var requestFinalizer = new FinalizationRegistry(({ signal, abort }) => { signal.removeEventListener("abort", abort); }); @@ -13997,12 +14013,12 @@ var require_symbols3 = __commonJS({ "node_modules/undici/lib/fileapi/symbols.js"(exports, module) { "use strict"; module.exports = { - kState: Symbol("FileReader state"), - kResult: Symbol("FileReader result"), - kError: Symbol("FileReader error"), - kLastProgressEventFired: Symbol("FileReader last progress event fired timestamp"), - kEvents: Symbol("FileReader events"), - kAborted: Symbol("FileReader aborted") + kState: /* @__PURE__ */ Symbol("FileReader state"), + kResult: /* @__PURE__ */ Symbol("FileReader result"), + kError: /* @__PURE__ */ Symbol("FileReader error"), + kLastProgressEventFired: /* @__PURE__ */ Symbol("FileReader last progress event fired timestamp"), + kEvents: /* @__PURE__ */ Symbol("FileReader events"), + kAborted: /* @__PURE__ */ Symbol("FileReader aborted") }; } }); @@ -14012,7 +14028,7 @@ var require_progressevent = __commonJS({ "node_modules/undici/lib/fileapi/progressevent.js"(exports, module) { "use strict"; var { webidl } = require_webidl(); - var kState = Symbol("ProgressEvent state"); + var kState = /* @__PURE__ */ Symbol("ProgressEvent state"); var ProgressEvent = class _ProgressEvent extends Event { constructor(type, eventInitDict = {}) { type = webidl.converters.DOMString(type); @@ -15962,14 +15978,14 @@ var require_symbols5 = __commonJS({ "node_modules/undici/lib/websocket/symbols.js"(exports, module) { "use strict"; module.exports = { - kWebSocketURL: Symbol("url"), - kReadyState: Symbol("ready state"), - kController: Symbol("controller"), - kResponse: Symbol("response"), - kBinaryType: Symbol("binary type"), - kSentClose: Symbol("sent close"), - kReceivedClose: Symbol("received close"), - kByteParser: Symbol("byte parser") + kWebSocketURL: /* @__PURE__ */ Symbol("url"), + kReadyState: /* @__PURE__ */ Symbol("ready state"), + kController: /* @__PURE__ */ Symbol("controller"), + kResponse: /* @__PURE__ */ Symbol("response"), + kBinaryType: /* @__PURE__ */ Symbol("binary type"), + kSentClose: /* @__PURE__ */ Symbol("sent close"), + kReceivedClose: /* @__PURE__ */ Symbol("received close"), + kByteParser: /* @__PURE__ */ Symbol("byte parser") }; } }); @@ -17314,15 +17330,25 @@ var require_lib = __commonJS({ }) : function(o, v) { o["default"] = v; }); - var __importStar = exports && exports.__importStar || function(mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) { - for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - } - __setModuleDefault(result, mod); - return result; - }; + var __importStar = exports && exports.__importStar || /* @__PURE__ */ (function() { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function(o2) { + var ar = []; + for (var k in o2) if (Object.prototype.hasOwnProperty.call(o2, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function(mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) { + for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + } + __setModuleDefault(result, mod); + return result; + }; + })(); var __awaiter = exports && exports.__awaiter || function(thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function(resolve) { @@ -17351,7 +17377,9 @@ var require_lib = __commonJS({ }); }; Object.defineProperty(exports, "__esModule", { value: true }); - exports.HttpClient = exports.isHttps = exports.HttpClientResponse = exports.HttpClientError = exports.getProxyUrl = exports.MediaTypes = exports.Headers = exports.HttpCodes = void 0; + exports.HttpClient = exports.HttpClientResponse = exports.HttpClientError = exports.MediaTypes = exports.Headers = exports.HttpCodes = void 0; + exports.getProxyUrl = getProxyUrl; + exports.isHttps = isHttps; var http = __importStar(__require("http")); var https = __importStar(__require("https")); var pm = __importStar(require_proxy()); @@ -17400,7 +17428,6 @@ var require_lib = __commonJS({ const proxyUrl = pm.getProxyUrl(new URL(serverUrl)); return proxyUrl ? proxyUrl.href : ""; } - exports.getProxyUrl = getProxyUrl; var HttpRedirectCodes = [ HttpCodes.MovedPermanently, HttpCodes.ResourceMoved, @@ -17461,7 +17488,6 @@ var require_lib = __commonJS({ const parsedUrl = new URL(requestUrl); return parsedUrl.protocol === "https:"; } - exports.isHttps = isHttps; var HttpClient = class { constructor(userAgent, handlers, requestOptions) { this._ignoreSslError = false; @@ -17472,7 +17498,7 @@ var require_lib = __commonJS({ this._maxRetries = 1; this._keepAlive = false; this._disposed = false; - this.userAgent = userAgent; + this.userAgent = this._getUserAgentWithOrchestrationId(userAgent); this.handlers = handlers || []; this.requestOptions = requestOptions; if (requestOptions) { @@ -17544,36 +17570,36 @@ var require_lib = __commonJS({ * Gets a typed object from an endpoint * Be aware that not found returns a null. Other errors (4xx, 5xx) reject the promise */ - getJson(requestUrl, additionalHeaders = {}) { - return __awaiter(this, void 0, void 0, function* () { + getJson(requestUrl_1) { + return __awaiter(this, arguments, void 0, function* (requestUrl, additionalHeaders = {}) { additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); const res = yield this.get(requestUrl, additionalHeaders); return this._processResponse(res, this.requestOptions); }); } - postJson(requestUrl, obj, additionalHeaders = {}) { - return __awaiter(this, void 0, void 0, function* () { + postJson(requestUrl_1, obj_1) { + return __awaiter(this, arguments, void 0, function* (requestUrl, obj, additionalHeaders = {}) { const data = JSON.stringify(obj, null, 2); additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); - additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); + additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultContentTypeHeader(additionalHeaders, MediaTypes.ApplicationJson); const res = yield this.post(requestUrl, data, additionalHeaders); return this._processResponse(res, this.requestOptions); }); } - putJson(requestUrl, obj, additionalHeaders = {}) { - return __awaiter(this, void 0, void 0, function* () { + putJson(requestUrl_1, obj_1) { + return __awaiter(this, arguments, void 0, function* (requestUrl, obj, additionalHeaders = {}) { const data = JSON.stringify(obj, null, 2); additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); - additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); + additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultContentTypeHeader(additionalHeaders, MediaTypes.ApplicationJson); const res = yield this.put(requestUrl, data, additionalHeaders); return this._processResponse(res, this.requestOptions); }); } - patchJson(requestUrl, obj, additionalHeaders = {}) { - return __awaiter(this, void 0, void 0, function* () { + patchJson(requestUrl_1, obj_1) { + return __awaiter(this, arguments, void 0, function* (requestUrl, obj, additionalHeaders = {}) { const data = JSON.stringify(obj, null, 2); additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); - additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); + additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultContentTypeHeader(additionalHeaders, MediaTypes.ApplicationJson); const res = yield this.patch(requestUrl, data, additionalHeaders); return this._processResponse(res, this.requestOptions); }); @@ -17769,12 +17795,65 @@ var require_lib = __commonJS({ } return lowercaseKeys(headers || {}); } + /** + * Gets an existing header value or returns a default. + * Handles converting number header values to strings since HTTP headers must be strings. + * Note: This returns string | string[] since some headers can have multiple values. + * For headers that must always be a single string (like Content-Type), use the + * specialized _getExistingOrDefaultContentTypeHeader method instead. + */ _getExistingOrDefaultHeader(additionalHeaders, header, _default) { let clientHeader; if (this.requestOptions && this.requestOptions.headers) { - clientHeader = lowercaseKeys(this.requestOptions.headers)[header]; + const headerValue = lowercaseKeys(this.requestOptions.headers)[header]; + if (headerValue) { + clientHeader = typeof headerValue === "number" ? headerValue.toString() : headerValue; + } + } + const additionalValue = additionalHeaders[header]; + if (additionalValue !== void 0) { + return typeof additionalValue === "number" ? additionalValue.toString() : additionalValue; + } + if (clientHeader !== void 0) { + return clientHeader; + } + return _default; + } + /** + * Specialized version of _getExistingOrDefaultHeader for Content-Type header. + * Always returns a single string (not an array) since Content-Type should be a single value. + * Converts arrays to comma-separated strings and numbers to strings to ensure type safety. + * This was split from _getExistingOrDefaultHeader to provide stricter typing for callers + * that assign the result to places expecting a string (e.g., additionalHeaders[Headers.ContentType]). + */ + _getExistingOrDefaultContentTypeHeader(additionalHeaders, _default) { + let clientHeader; + if (this.requestOptions && this.requestOptions.headers) { + const headerValue = lowercaseKeys(this.requestOptions.headers)[Headers.ContentType]; + if (headerValue) { + if (typeof headerValue === "number") { + clientHeader = String(headerValue); + } else if (Array.isArray(headerValue)) { + clientHeader = headerValue.join(", "); + } else { + clientHeader = headerValue; + } + } } - return additionalHeaders[header] || clientHeader || _default; + const additionalValue = additionalHeaders[Headers.ContentType]; + if (additionalValue !== void 0) { + if (typeof additionalValue === "number") { + return String(additionalValue); + } else if (Array.isArray(additionalValue)) { + return additionalValue.join(", "); + } else { + return additionalValue; + } + } + if (clientHeader !== void 0) { + return clientHeader; + } + return _default; } _getAgent(parsedUrl) { let agent; @@ -17844,6 +17923,15 @@ var require_lib = __commonJS({ } return proxyAgent; } + _getUserAgentWithOrchestrationId(userAgent) { + const baseUserAgent = userAgent || "actions/http-client"; + const orchId = process.env["ACTIONS_ORCHESTRATION_ID"]; + if (orchId) { + const sanitizedId = orchId.replace(/[^a-z0-9_.-]/gi, "_"); + return `${baseUserAgent} actions_orchestration_id/${sanitizedId}`; + } + return baseUserAgent; + } _performExponentialBackoff(retryNumber) { return __awaiter(this, void 0, void 0, function* () { retryNumber = Math.min(ExponentialBackoffCeiling, retryNumber); @@ -18074,8 +18162,8 @@ var require_oidc_utils = __commonJS({ return runtimeUrl; } static getCall(id_token_url) { - var _a; return __awaiter(this, void 0, void 0, function* () { + var _a; const httpclient = _OidcClient.createHttpClient(); const res = yield httpclient.getJson(id_token_url).catch((error3) => { throw new Error(`Failed to get ID Token. @@ -18429,30 +18517,39 @@ var require_path_utils = __commonJS({ }) : function(o, v) { o["default"] = v; }); - var __importStar = exports && exports.__importStar || function(mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) { - for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - } - __setModuleDefault(result, mod); - return result; - }; + var __importStar = exports && exports.__importStar || /* @__PURE__ */ (function() { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function(o2) { + var ar = []; + for (var k in o2) if (Object.prototype.hasOwnProperty.call(o2, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function(mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) { + for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + } + __setModuleDefault(result, mod); + return result; + }; + })(); Object.defineProperty(exports, "__esModule", { value: true }); - exports.toPlatformPath = exports.toWin32Path = exports.toPosixPath = void 0; + exports.toPosixPath = toPosixPath; + exports.toWin32Path = toWin32Path; + exports.toPlatformPath = toPlatformPath; var path2 = __importStar(__require("path")); function toPosixPath(pth) { return pth.replace(/[\\]/g, "/"); } - exports.toPosixPath = toPosixPath; function toWin32Path(pth) { return pth.replace(/[/]/g, "\\"); } - exports.toWin32Path = toWin32Path; function toPlatformPath(pth) { return pth.replace(/[/\\]/g, path2.sep); } - exports.toPlatformPath = toPlatformPath; } }); @@ -18462,9 +18559,13 @@ var require_io_util = __commonJS({ "use strict"; var __createBinding = exports && exports.__createBinding || (Object.create ? (function(o, m, k, k2) { if (k2 === void 0) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { - return m[k]; - } }); + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === void 0) k2 = k; o[k2] = m[k]; @@ -18474,15 +18575,25 @@ var require_io_util = __commonJS({ }) : function(o, v) { o["default"] = v; }); - var __importStar = exports && exports.__importStar || function(mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) { - for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - } - __setModuleDefault(result, mod); - return result; - }; + var __importStar = exports && exports.__importStar || /* @__PURE__ */ (function() { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function(o2) { + var ar = []; + for (var k in o2) if (Object.prototype.hasOwnProperty.call(o2, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function(mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) { + for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + } + __setModuleDefault(result, mod); + return result; + }; + })(); var __awaiter = exports && exports.__awaiter || function(thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function(resolve) { @@ -18512,17 +18623,32 @@ var require_io_util = __commonJS({ }; var _a; Object.defineProperty(exports, "__esModule", { value: true }); - exports.getCmdPath = exports.tryGetExecutablePath = exports.isRooted = exports.isDirectory = exports.exists = exports.READONLY = exports.UV_FS_O_EXLOCK = exports.IS_WINDOWS = exports.unlink = exports.symlink = exports.stat = exports.rmdir = exports.rm = exports.rename = exports.readlink = exports.readdir = exports.open = exports.mkdir = exports.lstat = exports.copyFile = exports.chmod = void 0; + exports.READONLY = exports.UV_FS_O_EXLOCK = exports.IS_WINDOWS = exports.unlink = exports.symlink = exports.stat = exports.rmdir = exports.rm = exports.rename = exports.readdir = exports.open = exports.mkdir = exports.lstat = exports.copyFile = exports.chmod = void 0; + exports.readlink = readlink; + exports.exists = exists; + exports.isDirectory = isDirectory; + exports.isRooted = isRooted; + exports.tryGetExecutablePath = tryGetExecutablePath; + exports.getCmdPath = getCmdPath; var fs2 = __importStar(__require("fs")); var path2 = __importStar(__require("path")); - _a = fs2.promises, exports.chmod = _a.chmod, exports.copyFile = _a.copyFile, exports.lstat = _a.lstat, exports.mkdir = _a.mkdir, exports.open = _a.open, exports.readdir = _a.readdir, exports.readlink = _a.readlink, exports.rename = _a.rename, exports.rm = _a.rm, exports.rmdir = _a.rmdir, exports.stat = _a.stat, exports.symlink = _a.symlink, exports.unlink = _a.unlink; + _a = fs2.promises, exports.chmod = _a.chmod, exports.copyFile = _a.copyFile, exports.lstat = _a.lstat, exports.mkdir = _a.mkdir, exports.open = _a.open, exports.readdir = _a.readdir, exports.rename = _a.rename, exports.rm = _a.rm, exports.rmdir = _a.rmdir, exports.stat = _a.stat, exports.symlink = _a.symlink, exports.unlink = _a.unlink; exports.IS_WINDOWS = process.platform === "win32"; + function readlink(fsPath) { + return __awaiter(this, void 0, void 0, function* () { + const result = yield fs2.promises.readlink(fsPath); + if (exports.IS_WINDOWS && !result.endsWith("\\")) { + return `${result}\\`; + } + return result; + }); + } exports.UV_FS_O_EXLOCK = 268435456; exports.READONLY = fs2.constants.O_RDONLY; function exists(fsPath) { return __awaiter(this, void 0, void 0, function* () { try { - yield exports.stat(fsPath); + yield (0, exports.stat)(fsPath); } catch (err) { if (err.code === "ENOENT") { return false; @@ -18532,14 +18658,12 @@ var require_io_util = __commonJS({ return true; }); } - exports.exists = exists; - function isDirectory(fsPath, useStat = false) { - return __awaiter(this, void 0, void 0, function* () { - const stats = useStat ? yield exports.stat(fsPath) : yield exports.lstat(fsPath); + function isDirectory(fsPath_1) { + return __awaiter(this, arguments, void 0, function* (fsPath, useStat = false) { + const stats = useStat ? yield (0, exports.stat)(fsPath) : yield (0, exports.lstat)(fsPath); return stats.isDirectory(); }); } - exports.isDirectory = isDirectory; function isRooted(p) { p = normalizeSeparators(p); if (!p) { @@ -18550,12 +18674,11 @@ var require_io_util = __commonJS({ } return p.startsWith("/"); } - exports.isRooted = isRooted; function tryGetExecutablePath(filePath, extensions) { return __awaiter(this, void 0, void 0, function* () { let stats = void 0; try { - stats = yield exports.stat(filePath); + stats = yield (0, exports.stat)(filePath); } catch (err) { if (err.code !== "ENOENT") { console.log(`Unexpected error attempting to determine if executable file exists '${filePath}': ${err}`); @@ -18578,7 +18701,7 @@ var require_io_util = __commonJS({ filePath = originalFilePath + extension; stats = void 0; try { - stats = yield exports.stat(filePath); + stats = yield (0, exports.stat)(filePath); } catch (err) { if (err.code !== "ENOENT") { console.log(`Unexpected error attempting to determine if executable file exists '${filePath}': ${err}`); @@ -18589,7 +18712,7 @@ var require_io_util = __commonJS({ try { const directory = path2.dirname(filePath); const upperName = path2.basename(filePath).toUpperCase(); - for (const actualName of yield exports.readdir(directory)) { + for (const actualName of yield (0, exports.readdir)(directory)) { if (upperName === actualName.toUpperCase()) { filePath = path2.join(directory, actualName); break; @@ -18609,7 +18732,6 @@ var require_io_util = __commonJS({ return ""; }); } - exports.tryGetExecutablePath = tryGetExecutablePath; function normalizeSeparators(p) { p = p || ""; if (exports.IS_WINDOWS) { @@ -18619,13 +18741,12 @@ var require_io_util = __commonJS({ return p.replace(/\/\/+/g, "/"); } function isUnixExecutable(stats) { - return (stats.mode & 1) > 0 || (stats.mode & 8) > 0 && stats.gid === process.getgid() || (stats.mode & 64) > 0 && stats.uid === process.getuid(); + return (stats.mode & 1) > 0 || (stats.mode & 8) > 0 && process.getgid !== void 0 && stats.gid === process.getgid() || (stats.mode & 64) > 0 && process.getuid !== void 0 && stats.uid === process.getuid(); } function getCmdPath() { var _a2; return (_a2 = process.env["COMSPEC"]) !== null && _a2 !== void 0 ? _a2 : `cmd.exe`; } - exports.getCmdPath = getCmdPath; } }); @@ -18635,9 +18756,13 @@ var require_io = __commonJS({ "use strict"; var __createBinding = exports && exports.__createBinding || (Object.create ? (function(o, m, k, k2) { if (k2 === void 0) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { - return m[k]; - } }); + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === void 0) k2 = k; o[k2] = m[k]; @@ -18647,15 +18772,25 @@ var require_io = __commonJS({ }) : function(o, v) { o["default"] = v; }); - var __importStar = exports && exports.__importStar || function(mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) { - for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - } - __setModuleDefault(result, mod); - return result; - }; + var __importStar = exports && exports.__importStar || /* @__PURE__ */ (function() { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function(o2) { + var ar = []; + for (var k in o2) if (Object.prototype.hasOwnProperty.call(o2, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function(mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) { + for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + } + __setModuleDefault(result, mod); + return result; + }; + })(); var __awaiter = exports && exports.__awaiter || function(thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function(resolve) { @@ -18684,12 +18819,17 @@ var require_io = __commonJS({ }); }; Object.defineProperty(exports, "__esModule", { value: true }); - exports.findInPath = exports.which = exports.mkdirP = exports.rmRF = exports.mv = exports.cp = void 0; + exports.cp = cp; + exports.mv = mv; + exports.rmRF = rmRF; + exports.mkdirP = mkdirP; + exports.which = which; + exports.findInPath = findInPath; var assert_1 = __require("assert"); var path2 = __importStar(__require("path")); var ioUtil = __importStar(require_io_util()); - function cp(source, dest, options = {}) { - return __awaiter(this, void 0, void 0, function* () { + function cp(source_1, dest_1) { + return __awaiter(this, arguments, void 0, function* (source, dest, options = {}) { const { force, recursive, copySourceDirectory } = readCopyOptions(options); const destStat = (yield ioUtil.exists(dest)) ? yield ioUtil.stat(dest) : null; if (destStat && destStat.isFile() && !force) { @@ -18714,9 +18854,8 @@ var require_io = __commonJS({ } }); } - exports.cp = cp; - function mv(source, dest, options = {}) { - return __awaiter(this, void 0, void 0, function* () { + function mv(source_1, dest_1) { + return __awaiter(this, arguments, void 0, function* (source, dest, options = {}) { if (yield ioUtil.exists(dest)) { let destExists = true; if (yield ioUtil.isDirectory(dest)) { @@ -18735,7 +18874,6 @@ var require_io = __commonJS({ yield ioUtil.rename(source, dest); }); } - exports.mv = mv; function rmRF(inputPath) { return __awaiter(this, void 0, void 0, function* () { if (ioUtil.IS_WINDOWS) { @@ -18755,14 +18893,12 @@ var require_io = __commonJS({ } }); } - exports.rmRF = rmRF; function mkdirP(fsPath) { return __awaiter(this, void 0, void 0, function* () { - assert_1.ok(fsPath, "a path argument must be provided"); + (0, assert_1.ok)(fsPath, "a path argument must be provided"); yield ioUtil.mkdir(fsPath, { recursive: true }); }); } - exports.mkdirP = mkdirP; function which(tool, check) { return __awaiter(this, void 0, void 0, function* () { if (!tool) { @@ -18786,7 +18922,6 @@ var require_io = __commonJS({ return ""; }); } - exports.which = which; function findInPath(tool) { return __awaiter(this, void 0, void 0, function* () { if (!tool) { @@ -18828,7 +18963,6 @@ var require_io = __commonJS({ return matches; }); } - exports.findInPath = findInPath; function readCopyOptions(options) { const force = options.force == null ? true : options.force; const recursive = Boolean(options.recursive); @@ -18883,9 +19017,13 @@ var require_toolrunner = __commonJS({ "use strict"; var __createBinding = exports && exports.__createBinding || (Object.create ? (function(o, m, k, k2) { if (k2 === void 0) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { - return m[k]; - } }); + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === void 0) k2 = k; o[k2] = m[k]; @@ -18895,15 +19033,25 @@ var require_toolrunner = __commonJS({ }) : function(o, v) { o["default"] = v; }); - var __importStar = exports && exports.__importStar || function(mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) { - for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - } - __setModuleDefault(result, mod); - return result; - }; + var __importStar = exports && exports.__importStar || /* @__PURE__ */ (function() { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function(o2) { + var ar = []; + for (var k in o2) if (Object.prototype.hasOwnProperty.call(o2, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function(mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) { + for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + } + __setModuleDefault(result, mod); + return result; + }; + })(); var __awaiter = exports && exports.__awaiter || function(thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function(resolve) { @@ -18932,7 +19080,8 @@ var require_toolrunner = __commonJS({ }); }; Object.defineProperty(exports, "__esModule", { value: true }); - exports.argStringToArray = exports.ToolRunner = void 0; + exports.ToolRunner = void 0; + exports.argStringToArray = argStringToArray; var os = __importStar(__require("os")); var events = __importStar(__require("events")); var child = __importStar(__require("child_process")); @@ -19295,7 +19444,6 @@ var require_toolrunner = __commonJS({ } return args; } - exports.argStringToArray = argStringToArray; var ExecState = class _ExecState extends events.EventEmitter { constructor(options, toolPath) { super(); @@ -19323,7 +19471,7 @@ var require_toolrunner = __commonJS({ if (this.processClosed) { this._setResult(); } else if (this.processExited) { - this.timeout = timers_1.setTimeout(_ExecState.HandleTimeout, this.delay, this); + this.timeout = (0, timers_1.setTimeout)(_ExecState.HandleTimeout, this.delay, this); } } _debug(message) { @@ -19367,9 +19515,13 @@ var require_exec = __commonJS({ "use strict"; var __createBinding = exports && exports.__createBinding || (Object.create ? (function(o, m, k, k2) { if (k2 === void 0) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { - return m[k]; - } }); + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === void 0) k2 = k; o[k2] = m[k]; @@ -19379,15 +19531,25 @@ var require_exec = __commonJS({ }) : function(o, v) { o["default"] = v; }); - var __importStar = exports && exports.__importStar || function(mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) { - for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - } - __setModuleDefault(result, mod); - return result; - }; + var __importStar = exports && exports.__importStar || /* @__PURE__ */ (function() { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function(o2) { + var ar = []; + for (var k in o2) if (Object.prototype.hasOwnProperty.call(o2, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function(mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) { + for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + } + __setModuleDefault(result, mod); + return result; + }; + })(); var __awaiter = exports && exports.__awaiter || function(thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function(resolve) { @@ -19416,7 +19578,8 @@ var require_exec = __commonJS({ }); }; Object.defineProperty(exports, "__esModule", { value: true }); - exports.getExecOutput = exports.exec = void 0; + exports.exec = exec; + exports.getExecOutput = getExecOutput; var string_decoder_1 = __require("string_decoder"); var tr = __importStar(require_toolrunner()); function exec(commandLine, args, options) { @@ -19431,10 +19594,9 @@ var require_exec = __commonJS({ return runner.exec(); }); } - exports.exec = exec; function getExecOutput(commandLine, args, options) { - var _a, _b; return __awaiter(this, void 0, void 0, function* () { + var _a, _b; let stdout = ""; let stderr = ""; const stdoutDecoder = new string_decoder_1.StringDecoder("utf8"); @@ -19464,7 +19626,6 @@ var require_exec = __commonJS({ }; }); } - exports.getExecOutput = getExecOutput; } }); @@ -19490,15 +19651,25 @@ var require_platform = __commonJS({ }) : function(o, v) { o["default"] = v; }); - var __importStar = exports && exports.__importStar || function(mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) { - for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - } - __setModuleDefault(result, mod); - return result; - }; + var __importStar = exports && exports.__importStar || /* @__PURE__ */ (function() { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function(o2) { + var ar = []; + for (var k in o2) if (Object.prototype.hasOwnProperty.call(o2, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function(mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) { + for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + } + __setModuleDefault(result, mod); + return result; + }; + })(); var __awaiter = exports && exports.__awaiter || function(thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function(resolve) { @@ -19530,7 +19701,8 @@ var require_platform = __commonJS({ return mod && mod.__esModule ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); - exports.getDetails = exports.isLinux = exports.isMacOS = exports.isWindows = exports.arch = exports.platform = void 0; + exports.isLinux = exports.isMacOS = exports.isWindows = exports.arch = exports.platform = void 0; + exports.getDetails = getDetails; var os_1 = __importDefault(__require("os")); var exec = __importStar(require_exec()); var getWindowsInfo = () => __awaiter(void 0, void 0, void 0, function* () { @@ -19583,7 +19755,6 @@ var require_platform = __commonJS({ }); }); } - exports.getDetails = getDetails; } }); @@ -19609,15 +19780,25 @@ var require_core = __commonJS({ }) : function(o, v) { o["default"] = v; }); - var __importStar = exports && exports.__importStar || function(mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) { - for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - } - __setModuleDefault(result, mod); - return result; - }; + var __importStar = exports && exports.__importStar || /* @__PURE__ */ (function() { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function(o2) { + var ar = []; + for (var k in o2) if (Object.prototype.hasOwnProperty.call(o2, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function(mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) { + for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + } + __setModuleDefault(result, mod); + return result; + }; + })(); var __awaiter = exports && exports.__awaiter || function(thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function(resolve) { @@ -19646,7 +19827,28 @@ var require_core = __commonJS({ }); }; Object.defineProperty(exports, "__esModule", { value: true }); - exports.platform = exports.toPlatformPath = exports.toWin32Path = exports.toPosixPath = exports.markdownSummary = exports.summary = exports.getIDToken = exports.getState = exports.saveState = exports.group = exports.endGroup = exports.startGroup = exports.info = exports.notice = exports.warning = exports.error = exports.debug = exports.isDebug = exports.setFailed = exports.setCommandEcho = exports.setOutput = exports.getBooleanInput = exports.getMultilineInput = exports.getInput = exports.addPath = exports.setSecret = exports.exportVariable = exports.ExitCode = void 0; + exports.platform = exports.toPlatformPath = exports.toWin32Path = exports.toPosixPath = exports.markdownSummary = exports.summary = exports.ExitCode = void 0; + exports.exportVariable = exportVariable; + exports.setSecret = setSecret; + exports.addPath = addPath; + exports.getInput = getInput3; + exports.getMultilineInput = getMultilineInput; + exports.getBooleanInput = getBooleanInput2; + exports.setOutput = setOutput; + exports.setCommandEcho = setCommandEcho; + exports.setFailed = setFailed2; + exports.isDebug = isDebug; + exports.debug = debug; + exports.error = error3; + exports.warning = warning; + exports.notice = notice; + exports.info = info7; + exports.startGroup = startGroup; + exports.endGroup = endGroup; + exports.group = group; + exports.saveState = saveState; + exports.getState = getState; + exports.getIDToken = getIDToken; var command_1 = require_command(); var file_command_1 = require_file_command(); var utils_1 = require_utils(); @@ -19667,11 +19869,9 @@ var require_core = __commonJS({ } (0, command_1.issueCommand)("set-env", { name }, convertedVal); } - exports.exportVariable = exportVariable; function setSecret(secret) { (0, command_1.issueCommand)("add-mask", {}, secret); } - exports.setSecret = setSecret; function addPath(inputPath) { const filePath = process.env["GITHUB_PATH"] || ""; if (filePath) { @@ -19681,7 +19881,6 @@ var require_core = __commonJS({ } process.env["PATH"] = `${inputPath}${path2.delimiter}${process.env["PATH"]}`; } - exports.addPath = addPath; function getInput3(name, options) { const val = process.env[`INPUT_${name.replace(/ /g, "_").toUpperCase()}`] || ""; if (options && options.required && !val) { @@ -19692,7 +19891,6 @@ var require_core = __commonJS({ } return val.trim(); } - exports.getInput = getInput3; function getMultilineInput(name, options) { const inputs = getInput3(name, options).split("\n").filter((x) => x !== ""); if (options && options.trimWhitespace === false) { @@ -19700,7 +19898,6 @@ var require_core = __commonJS({ } return inputs.map((input) => input.trim()); } - exports.getMultilineInput = getMultilineInput; function getBooleanInput2(name, options) { const trueValue = ["true", "True", "TRUE"]; const falseValue = ["false", "False", "FALSE"]; @@ -19712,7 +19909,6 @@ var require_core = __commonJS({ throw new TypeError(`Input does not meet YAML 1.2 "Core Schema" specification: ${name} Support boolean input list: \`true | True | TRUE | false | False | FALSE\``); } - exports.getBooleanInput = getBooleanInput2; function setOutput(name, value) { const filePath = process.env["GITHUB_OUTPUT"] || ""; if (filePath) { @@ -19721,48 +19917,37 @@ Support boolean input list: \`true | True | TRUE | false | False | FALSE\``); process.stdout.write(os.EOL); (0, command_1.issueCommand)("set-output", { name }, (0, utils_1.toCommandValue)(value)); } - exports.setOutput = setOutput; function setCommandEcho(enabled) { (0, command_1.issue)("echo", enabled ? "on" : "off"); } - exports.setCommandEcho = setCommandEcho; function setFailed2(message) { process.exitCode = ExitCode.Failure; error3(message); } - exports.setFailed = setFailed2; function isDebug() { return process.env["RUNNER_DEBUG"] === "1"; } - exports.isDebug = isDebug; function debug(message) { (0, command_1.issueCommand)("debug", {}, message); } - exports.debug = debug; function error3(message, properties = {}) { (0, command_1.issueCommand)("error", (0, utils_1.toCommandProperties)(properties), message instanceof Error ? message.toString() : message); } - exports.error = error3; function warning(message, properties = {}) { (0, command_1.issueCommand)("warning", (0, utils_1.toCommandProperties)(properties), message instanceof Error ? message.toString() : message); } - exports.warning = warning; function notice(message, properties = {}) { (0, command_1.issueCommand)("notice", (0, utils_1.toCommandProperties)(properties), message instanceof Error ? message.toString() : message); } - exports.notice = notice; function info7(message) { process.stdout.write(message + os.EOL); } - exports.info = info7; function startGroup(name) { (0, command_1.issue)("group", name); } - exports.startGroup = startGroup; function endGroup() { (0, command_1.issue)("endgroup"); } - exports.endGroup = endGroup; function group(name, fn) { return __awaiter(this, void 0, void 0, function* () { startGroup(name); @@ -19775,7 +19960,6 @@ Support boolean input list: \`true | True | TRUE | false | False | FALSE\``); return result; }); } - exports.group = group; function saveState(name, value) { const filePath = process.env["GITHUB_STATE"] || ""; if (filePath) { @@ -19783,17 +19967,14 @@ Support boolean input list: \`true | True | TRUE | false | False | FALSE\``); } (0, command_1.issueCommand)("save-state", { name }, (0, utils_1.toCommandValue)(value)); } - exports.saveState = saveState; function getState(name) { return process.env[`STATE_${name}`] || ""; } - exports.getState = getState; function getIDToken(aud) { return __awaiter(this, void 0, void 0, function* () { return yield oidc_utils_1.OidcClient.getIDToken(aud); }); } - exports.getIDToken = getIDToken; var summary_1 = require_summary(); Object.defineProperty(exports, "summary", { enumerable: true, get: function() { return summary_1.summary; @@ -19897,15 +20078,25 @@ var require_utils3 = __commonJS({ }) : function(o, v) { o["default"] = v; }); - var __importStar = exports && exports.__importStar || function(mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) { - for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - } - __setModuleDefault(result, mod); - return result; - }; + var __importStar = exports && exports.__importStar || /* @__PURE__ */ (function() { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function(o2) { + var ar = []; + for (var k in o2) if (Object.prototype.hasOwnProperty.call(o2, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function(mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) { + for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + } + __setModuleDefault(result, mod); + return result; + }; + })(); var __awaiter = exports && exports.__awaiter || function(thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function(resolve) { @@ -19934,7 +20125,11 @@ var require_utils3 = __commonJS({ }); }; Object.defineProperty(exports, "__esModule", { value: true }); - exports.getApiBaseUrl = exports.getProxyFetch = exports.getProxyAgentDispatcher = exports.getProxyAgent = exports.getAuthString = void 0; + exports.getAuthString = getAuthString; + exports.getProxyAgent = getProxyAgent; + exports.getProxyAgentDispatcher = getProxyAgentDispatcher; + exports.getProxyFetch = getProxyFetch; + exports.getApiBaseUrl = getApiBaseUrl; var httpClient = __importStar(require_lib()); var undici_1 = require_undici(); function getAuthString(token, options) { @@ -19945,17 +20140,14 @@ var require_utils3 = __commonJS({ } return typeof options.auth === "string" ? options.auth : `token ${token}`; } - exports.getAuthString = getAuthString; function getProxyAgent(destinationUrl) { const hc = new httpClient.HttpClient(); return hc.getAgent(destinationUrl); } - exports.getProxyAgent = getProxyAgent; function getProxyAgentDispatcher(destinationUrl) { const hc = new httpClient.HttpClient(); return hc.getAgentDispatcher(destinationUrl); } - exports.getProxyAgentDispatcher = getProxyAgentDispatcher; function getProxyFetch(destinationUrl) { const httpDispatcher = getProxyAgentDispatcher(destinationUrl); const proxyFetch = (url, opts) => __awaiter(this, void 0, void 0, function* () { @@ -19963,11 +20155,9 @@ var require_utils3 = __commonJS({ }); return proxyFetch; } - exports.getProxyFetch = getProxyFetch; function getApiBaseUrl() { return process.env["GITHUB_API_URL"] || "https://api.github.com"; } - exports.getApiBaseUrl = getApiBaseUrl; } }); @@ -23803,17 +23993,28 @@ var require_utils4 = __commonJS({ }) : function(o, v) { o["default"] = v; }); - var __importStar = exports && exports.__importStar || function(mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) { - for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - } - __setModuleDefault(result, mod); - return result; - }; + var __importStar = exports && exports.__importStar || /* @__PURE__ */ (function() { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function(o2) { + var ar = []; + for (var k in o2) if (Object.prototype.hasOwnProperty.call(o2, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function(mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) { + for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + } + __setModuleDefault(result, mod); + return result; + }; + })(); Object.defineProperty(exports, "__esModule", { value: true }); - exports.getOctokitOptions = exports.GitHub = exports.defaults = exports.context = void 0; + exports.GitHub = exports.defaults = exports.context = void 0; + exports.getOctokitOptions = getOctokitOptions; var Context = __importStar(require_context()); var Utils = __importStar(require_utils3()); var core_1 = require_dist_node8(); @@ -23837,7 +24038,6 @@ var require_utils4 = __commonJS({ } return opts; } - exports.getOctokitOptions = getOctokitOptions; } }); @@ -23863,17 +24063,28 @@ var require_github = __commonJS({ }) : function(o, v) { o["default"] = v; }); - var __importStar = exports && exports.__importStar || function(mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) { - for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - } - __setModuleDefault(result, mod); - return result; - }; + var __importStar = exports && exports.__importStar || /* @__PURE__ */ (function() { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function(o2) { + var ar = []; + for (var k in o2) if (Object.prototype.hasOwnProperty.call(o2, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function(mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) { + for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + } + __setModuleDefault(result, mod); + return result; + }; + })(); Object.defineProperty(exports, "__esModule", { value: true }); - exports.getOctokit = exports.context = void 0; + exports.context = void 0; + exports.getOctokit = getOctokit2; var Context = __importStar(require_context()); var utils_1 = require_utils4(); exports.context = new Context.Context(); @@ -23881,7 +24092,6 @@ var require_github = __commonJS({ const GitHubWithPlugins = utils_1.GitHub.plugin(...additionalPlugins); return new GitHubWithPlugins((0, utils_1.getOctokitOptions)(token, options)); } - exports.getOctokit = getOctokit2; } }); @@ -24992,6 +25202,52 @@ function formatBytes(bytes) { } // src/checks/dependency-size.ts +function buildPackageGroups(packageSizes) { + const packageGroups = /* @__PURE__ */ new Map(); + for (const [pkgKey, size] of packageSizes.entries()) { + const atIndex = pkgKey.lastIndexOf("@"); + const name = pkgKey.substring(0, atIndex); + const version = pkgKey.substring(atIndex + 1); + const group = packageGroups.get(name) ?? { added: [], removed: [] }; + if (size !== null && size < 0) { + group.removed.push({ version, size }); + } else { + group.added.push({ version, size }); + } + packageGroups.set(name, group); + } + return packageGroups; +} +function createDisplayEntries(packageGroups) { + const displayEntries = []; + for (const [name, group] of packageGroups.entries()) { + if (group.added.length === 1 && group.removed.length === 1 && group.added[0].size !== null && group.removed[0].size !== null) { + const netSize = group.added[0].size + group.removed[0].size; + displayEntries.push({ + label: `${name}@${group.removed[0].version} \u2192 ${name}@${group.added[0].version}`, + size: netSize, + sortSize: netSize + }); + } else { + for (const added of group.added) { + displayEntries.push({ + label: `${name}@${added.version}`, + size: added.size, + sortSize: added.size ?? 0 + }); + } + for (const removed of group.removed) { + displayEntries.push({ + label: `${name}@${removed.version}`, + size: removed.size, + sortSize: removed.size ?? 0 + }); + } + } + } + displayEntries.sort((a, b) => Math.abs(b.sortSize) - Math.abs(a.sortSize)); + return displayEntries; +} async function removeUnsupportedOptionalDependencies(lockFile, versionInfo) { const allOptionalVersions = /* @__PURE__ */ new Map(); for (const pkg of lockFile.packages) { @@ -25064,8 +25320,10 @@ async function scanForDependencySize(messages, threshold, currentDeps, baseDeps, ); const shouldShow = threshold === -1 || sizeData !== null && sizeData.totalSize >= threshold; if (shouldShow && sizeData !== null) { - const packageRows = Array.from(sizeData.packageSizes.entries()).sort(([, a], [, b]) => (b ?? Infinity) - (a ?? Infinity)).map( - ([pkg, size]) => `| ${pkg} | ${size === null ? "_Unknown_" : formatBytes(size)} |` + const packageGroups = buildPackageGroups(sizeData.packageSizes); + const displayEntries = createDisplayEntries(packageGroups); + const packageRows = displayEntries.map( + ({ label, size }) => `| ${label} | ${size === null ? "_Unknown_" : formatBytes(size)} |` ).join("\n"); let alert = ""; if (threshold !== -1 && sizeData.totalSize >= threshold) { diff --git a/package-lock.json b/package-lock.json index 24f0e18..d987ed0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,8 +9,8 @@ "version": "0.0.1", "license": "MIT", "devDependencies": { - "@actions/core": "^2.0.1", - "@actions/github": "^6.0.1", + "@actions/core": "^2.0.2", + "@actions/github": "^7.0.0", "@eslint/js": "^9.39.2", "@types/node": "^25.0.3", "esbuild": "^0.27.2", @@ -25,25 +25,14 @@ } }, "node_modules/@actions/core": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@actions/core/-/core-2.0.1.tgz", - "integrity": "sha512-oBfqT3GwkvLlo1fjvhQLQxuwZCGTarTE5OuZ2Wg10hvhBj7LRIlF611WT4aZS6fDhO5ZKlY7lCAZTlpmyaHaeg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@actions/core/-/core-2.0.2.tgz", + "integrity": "sha512-Ast1V7yHbGAhplAsuVlnb/5J8Mtr/Zl6byPPL+Qjq3lmfIgWF1ak1iYfF/079cRERiuTALTXkSuEUdZeDCfGtA==", "dev": true, "license": "MIT", "dependencies": { "@actions/exec": "^2.0.0", - "@actions/http-client": "^3.0.0" - } - }, - "node_modules/@actions/core/node_modules/@actions/http-client": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-3.0.0.tgz", - "integrity": "sha512-1s3tXAfVMSz9a4ZEBkXXRQD4QhY3+GAsWSbaYpeknPOKEeyRiU3lH+bHiLMZdo2x/fIeQ/hscL1wCkDLVM2DZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "tunnel": "^0.0.6", - "undici": "^5.28.5" + "@actions/http-client": "^3.0.1" } }, "node_modules/@actions/exec": { @@ -57,13 +46,13 @@ } }, "node_modules/@actions/github": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@actions/github/-/github-6.0.1.tgz", - "integrity": "sha512-xbZVcaqD4XnQAe35qSQqskb3SqIAfRyLBrHMd/8TuL7hJSz2QtbDwnNM8zWx4zO5l2fnGtseNE3MbEvD7BxVMw==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@actions/github/-/github-7.0.0.tgz", + "integrity": "sha512-PyGODO938aoBTZd/IfN/+e+Pd5hUcVpyf+thm4CPESLeqhdSkq5QwMTGX9v84XHE1ifmHWBQ60KB8kIgm96opw==", "dev": true, "license": "MIT", "dependencies": { - "@actions/http-client": "^2.2.0", + "@actions/http-client": "^3.0.1", "@octokit/core": "^5.0.1", "@octokit/plugin-paginate-rest": "^9.2.2", "@octokit/plugin-rest-endpoint-methods": "^10.4.0", @@ -73,14 +62,14 @@ } }, "node_modules/@actions/http-client": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.2.3.tgz", - "integrity": "sha512-mx8hyJi/hjFvbPokCg4uRd4ZX78t+YyRPtnKWwIl+RzNaVuFpQHfmlGVfsKEJN8LwTCvL+DfVgAM04XaHkm6bA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-3.0.1.tgz", + "integrity": "sha512-SbGS8c/vySbNO3kjFgSW77n83C4MQx/Yoe+b1hAdpuvfHxnkHzDq2pWljUpAA56Si1Gae/7zjeZsV0CYjmLo/w==", "dev": true, "license": "MIT", "dependencies": { "tunnel": "^0.0.6", - "undici": "^5.25.4" + "undici": "^5.28.5" } }, "node_modules/@actions/io": { diff --git a/package.json b/package.json index 767ada5..285ed29 100644 --- a/package.json +++ b/package.json @@ -38,8 +38,8 @@ "test": "vitest run" }, "devDependencies": { - "@actions/core": "^2.0.1", - "@actions/github": "^6.0.1", + "@actions/core": "^2.0.2", + "@actions/github": "^7.0.0", "@eslint/js": "^9.39.2", "@types/node": "^25.0.3", "esbuild": "^0.27.2", From 8c89e90d11c9c048e9a46b044bfc38a49021f618 Mon Sep 17 00:00:00 2001 From: James Garbutt <43081j@users.noreply.github.com> Date: Sun, 11 Jan 2026 21:31:03 +0000 Subject: [PATCH 3/3] test: add a buncha tests! --- .../dependency-size_test.ts.snap | 133 +++++++++++ test/checks/dependency-size_test.ts | 218 ++++++++++++++++++ test/git_test.ts | 85 ++++--- test/npm_test.ts | 48 ++-- test/setup.ts | 19 ++ test/util.ts | 13 ++ vitest.config.ts | 3 +- 7 files changed, 445 insertions(+), 74 deletions(-) create mode 100644 test/checks/__snapshots__/dependency-size_test.ts.snap create mode 100644 test/checks/dependency-size_test.ts create mode 100644 test/setup.ts create mode 100644 test/util.ts diff --git a/test/checks/__snapshots__/dependency-size_test.ts.snap b/test/checks/__snapshots__/dependency-size_test.ts.snap new file mode 100644 index 0000000..70188f1 --- /dev/null +++ b/test/checks/__snapshots__/dependency-size_test.ts.snap @@ -0,0 +1,133 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`scanForDependencySize > should not report changes below the threshold 1`] = ` +{ + "debug": [], + "error": [], + "info": [ + "Found 1 new package versions", + "Found 0 removed package versions.", + "Added 27023 bytes for tinyexec@1.0.0", + "Total dependency size increase: 27 kB", + ], + "warning": [], +} +`; + +exports[`scanForDependencySize > should report negative upgrades on one line 1`] = ` +[ + "## 📊 Dependency Size Changes + +> [!NOTE] +> :tada: This PR removes 138.5 kB of dependencies. + +| 📦 Package | 📏 Size | +| --- | --- | +| chai@5.0.0 → chai@5.0.2 | -138.5 kB | + +**Total size change:** -138.5 kB", +] +`; + +exports[`scanForDependencySize > should report negative upgrades on one line 2`] = ` +{ + "debug": [], + "error": [], + "info": [ + "Found 1 new package versions", + "Found 1 removed package versions.", + "Added 368262 bytes for chai@5.0.2", + "Subtracted 506753 bytes for chai@5.0.0", + "Total dependency size increase: -138.5 kB", + ], + "warning": [], +} +`; + +exports[`scanForDependencySize > should report new dependencies exceeding the threshold 1`] = ` +[ + "## 📊 Dependency Size Changes + +> [!WARNING] +> This PR adds 23.6 MB of new dependencies, which exceeds the threshold of 1 kB. + +| 📦 Package | 📏 Size | +| --- | --- | +| typescript@5.9.3 | 23.6 MB | + +**Total size change:** 23.6 MB", +] +`; + +exports[`scanForDependencySize > should report new dependencies exceeding the threshold 2`] = ` +{ + "debug": [], + "error": [], + "info": [ + "Found 1 new package versions", + "Found 0 removed package versions.", + "Added 23625066 bytes for typescript@5.9.3", + "Total dependency size increase: 23.6 MB", + ], + "warning": [], +} +`; + +exports[`scanForDependencySize > should report removals when threshold is -1 1`] = ` +[ + "## 📊 Dependency Size Changes + +> [!NOTE] +> :tada: This PR removes 27 kB of dependencies. + +| 📦 Package | 📏 Size | +| --- | --- | +| tinyexec@1.0.0 | -27 kB | + +**Total size change:** -27 kB", +] +`; + +exports[`scanForDependencySize > should report removals when threshold is -1 2`] = ` +{ + "debug": [], + "error": [], + "info": [ + "Found 0 new package versions", + "Found 1 removed package versions.", + "Subtracted 27023 bytes for tinyexec@1.0.0", + "Total dependency size increase: -27 kB", + ], + "warning": [], +} +`; + +exports[`scanForDependencySize > should report upgrades on one line 1`] = ` +[ + "## 📊 Dependency Size Changes + +> [!WARNING] +> This PR adds 137.8 kB of new dependencies, which exceeds the threshold of 1 B. + +| 📦 Package | 📏 Size | +| --- | --- | +| chai@5.0.2 → chai@5.0.3 | 137.8 kB | + +**Total size change:** 137.8 kB", +] +`; + +exports[`scanForDependencySize > should report upgrades on one line 2`] = ` +{ + "debug": [], + "error": [], + "info": [ + "Found 1 new package versions", + "Found 1 removed package versions.", + "Added 506025 bytes for chai@5.0.3", + "Subtracted 368262 bytes for chai@5.0.2", + "Total dependency size increase: 137.8 kB", + ], + "warning": [], +} +`; diff --git a/test/checks/dependency-size_test.ts b/test/checks/dependency-size_test.ts new file mode 100644 index 0000000..ebe562c --- /dev/null +++ b/test/checks/dependency-size_test.ts @@ -0,0 +1,218 @@ +import {describe, expect, it, afterEach} from 'vitest'; +import {scanForDependencySize} from '../../src/checks/dependency-size.js'; +import {coreLogs, clearCoreLogs} from '../util.js'; +import type {ParsedLockFile} from 'lockparse'; + +function createMockObjects( + fromDependencies: Record, + toDependencies: Record +): { + currentDeps: Map>; + baseDeps: Map>; + currentLockFile: ParsedLockFile; + baseLockFile: ParsedLockFile; +} { + const baseDeps = new Map>([]); + const currentDeps = new Map>([]); + const currentLockFile: ParsedLockFile = { + type: 'npm', + packages: [], + root: { + name: 'root-package', + version: '1.0.0', + dependencies: [], + devDependencies: [], + optionalDependencies: [], + peerDependencies: [] + } + }; + const baseLockFile: ParsedLockFile = { + type: 'npm', + packages: [], + root: { + name: 'root-package', + version: '1.0.0', + dependencies: [], + devDependencies: [], + optionalDependencies: [], + peerDependencies: [] + } + }; + + for (const [depName, versions] of Object.entries(fromDependencies)) { + baseDeps.set(depName, new Set(versions)); + for (const version of versions) { + baseLockFile.packages.push({ + name: depName, + version: version, + dependencies: [], + devDependencies: [], + optionalDependencies: [], + peerDependencies: [] + }); + } + } + + for (const [depName, versions] of Object.entries(toDependencies)) { + currentDeps.set(depName, new Set(versions)); + for (const version of versions) { + currentLockFile.packages.push({ + name: depName, + version: version, + dependencies: [], + devDependencies: [], + optionalDependencies: [], + peerDependencies: [] + }); + } + } + return {currentDeps, baseDeps, currentLockFile, baseLockFile}; +} + +describe('scanForDependencySize', () => { + afterEach(() => { + clearCoreLogs(); + }); + + it('should do nothing if no dependency changes', async () => { + const messages: string[] = []; + const threshold = 1; + const {currentDeps, baseDeps, currentLockFile, baseLockFile} = + createMockObjects({}, {}); + + await scanForDependencySize( + messages, + threshold, + currentDeps, + baseDeps, + currentLockFile, + baseLockFile + ); + + expect(messages).toHaveLength(0); + }); + + it('should report new dependencies exceeding the threshold', async () => { + const messages: string[] = []; + const threshold = 1000; + const {currentDeps, baseDeps, currentLockFile, baseLockFile} = + createMockObjects( + {}, + { + typescript: ['5.9.3'] + } + ); + + await scanForDependencySize( + messages, + threshold, + currentDeps, + baseDeps, + currentLockFile, + baseLockFile + ); + + expect(messages).toMatchSnapshot(); + expect(coreLogs).toMatchSnapshot(); + }); + + it('should report removals when threshold is -1', async () => { + const messages: string[] = []; + const threshold = -1; + const {currentDeps, baseDeps, currentLockFile, baseLockFile} = + createMockObjects( + { + tinyexec: ['1.0.0'] + }, + {} + ); + + await scanForDependencySize( + messages, + threshold, + currentDeps, + baseDeps, + currentLockFile, + baseLockFile + ); + + expect(messages).toMatchSnapshot(); + expect(coreLogs).toMatchSnapshot(); + }); + + it('should not report changes below the threshold', async () => { + const messages: string[] = []; + const threshold = 50_000; + const {currentDeps, baseDeps, currentLockFile, baseLockFile} = + createMockObjects( + {}, + { + tinyexec: ['1.0.0'] + } + ); + + await scanForDependencySize( + messages, + threshold, + currentDeps, + baseDeps, + currentLockFile, + baseLockFile + ); + + expect(messages).toHaveLength(0); + expect(coreLogs).toMatchSnapshot(); + }); + + it('should report upgrades on one line', async () => { + const messages: string[] = []; + const threshold = 1; + const {currentDeps, baseDeps, currentLockFile, baseLockFile} = + createMockObjects( + { + chai: ['5.0.2'] + }, + { + chai: ['5.0.3'] + } + ); + + await scanForDependencySize( + messages, + threshold, + currentDeps, + baseDeps, + currentLockFile, + baseLockFile + ); + + expect(messages).toMatchSnapshot(); + expect(coreLogs).toMatchSnapshot(); + }); + + it('should report negative upgrades on one line', async () => { + const messages: string[] = []; + const threshold = -1; + const {currentDeps, baseDeps, currentLockFile, baseLockFile} = + createMockObjects( + { + chai: ['5.0.0'] + }, + { + chai: ['5.0.2'] + } + ); + + await scanForDependencySize( + messages, + threshold, + currentDeps, + baseDeps, + currentLockFile, + baseLockFile + ); + + expect(messages).toMatchSnapshot(); + expect(coreLogs).toMatchSnapshot(); + }); +}); diff --git a/test/git_test.ts b/test/git_test.ts index 16be422..030ce05 100644 --- a/test/git_test.ts +++ b/test/git_test.ts @@ -1,18 +1,10 @@ -import { - describe, - it, - expect, - beforeEach, - vi, - afterEach, - type MockInstance -} from 'vitest'; +import {describe, it, expect, vi, afterEach} from 'vitest'; import * as git from '../src/git.js'; +import {coreLogs, clearCoreLogs} from './util.js'; import * as github from '@actions/github'; import * as process from 'process'; import {fileURLToPath} from 'node:url'; import * as path from 'node:path'; -import * as core from '@actions/core'; const currentDir = path.dirname(fileURLToPath(import.meta.url)); const rootDir = path.join(currentDir, '..'); @@ -69,79 +61,82 @@ describe('getBaseRef', () => { }); describe('getFileFromRef', () => { - let errorSpy: MockInstance<(typeof core)['error']>; - - beforeEach(() => { - vi.mock(import('@actions/core'), async (importModule) => { - const mod = await importModule(); - return {...mod, error: vi.fn()}; - }); - errorSpy = vi.mocked(core.error); - }); - afterEach(() => { vi.clearAllMocks(); + clearCoreLogs(); }); it('should return file content from a given ref', () => { const content = git.getFileFromRef('HEAD', 'package.json', rootDir); expect(content).toBeDefined(); expect(content).toContain('"name":'); - expect(errorSpy.mock.calls).toEqual([]); + expect(coreLogs).toEqual({ + debug: [], + error: [], + info: [], + warning: [] + }); }); it('should return null if file does not exist in the given ref', () => { const content = git.getFileFromRef('HEAD', 'nonexistentfile.txt', rootDir); expect(content).toBeNull(); - expect(errorSpy.mock.calls).toEqual([ - [ + expect(coreLogs).toEqual({ + debug: [], + error: [ 'Failed to get file from ref "HEAD:nonexistentfile.txt": Error: Command failed: git show HEAD:nonexistentfile.txt\n' + "fatal: path 'nonexistentfile.txt' does not exist in 'HEAD'\n" - ] - ]); + ], + info: [], + warning: [] + }); }); }); describe('tryGetJSONFromRef', () => { - let errorSpy: MockInstance<(typeof core)['error']>; - - beforeEach(() => { - vi.mock(import('@actions/core'), async (importModule) => { - const mod = await importModule(); - return {...mod, error: vi.fn()}; - }); - errorSpy = vi.mocked(core.error); - }); - afterEach(() => { vi.clearAllMocks(); + clearCoreLogs(); }); it('returns null for non-existent file', () => { const result = git.tryGetJSONFromRef('HEAD', 'nonexistent.json', rootDir); expect(result).toBeNull(); - expect(errorSpy.mock.calls).toEqual([ - [ + expect(coreLogs).toEqual({ + debug: [], + error: [ 'Failed to get file from ref "HEAD:nonexistent.json": Error: Command failed: git show HEAD:nonexistent.json\n' + "fatal: path 'nonexistent.json' does not exist in 'HEAD'\n" - ] - ]); + ], + info: [], + warning: [] + }); }); it('returns null for invalid JSON content', () => { const result = git.tryGetJSONFromRef('HEAD', 'README.md', rootDir); expect(result).toBeNull(); - expect(errorSpy.mock.calls).toEqual([ - [ - `Failed to get json from ref "HEAD:README.md": SyntaxError: Unexpected token '#', "# e18e/act"... is not valid JSON` - ] - ]); + expect(coreLogs).toEqual({ + debug: [], + error: [ + expect.stringContaining( + 'Failed to get json from ref "HEAD:README.md": SyntaxError:' + ) + ], + info: [], + warning: [] + }); }); it('returns parsed JSON object for valid JSON content', () => { const result = git.tryGetJSONFromRef('HEAD', 'package.json', rootDir); expect(result).toBeDefined(); expect(result).toHaveProperty('name'); - expect(errorSpy.mock.calls).toEqual([]); + expect(coreLogs).toEqual({ + debug: [], + error: [], + info: [], + warning: [] + }); }); }); diff --git a/test/npm_test.ts b/test/npm_test.ts index 99ee47d..226a590 100644 --- a/test/npm_test.ts +++ b/test/npm_test.ts @@ -1,4 +1,3 @@ -import * as core from '@actions/core'; import type {PackageJson} from 'pkg-types'; import { describe, @@ -22,26 +21,20 @@ import { type PackageMetadata, calculateTotalDependencySizeIncrease } from '../src/npm.js'; +import {coreLogs, clearCoreLogs} from './util.js'; describe('fetchPackageMetadata', () => { let fetchMock: MockInstance; beforeEach(() => { fetchMock = vi.spyOn(globalThis, 'fetch'); - vi.mock(import('@actions/core'), async (importModule) => { - const mod = await importModule(); - return { - ...mod, - info: vi.fn(), - error: vi.fn() - }; - }); }); afterEach(() => { fetchMock.mockRestore(); vi.clearAllMocks(); metaCache.clear(); + clearCoreLogs(); }); it('should return null if request fails', async () => { @@ -63,13 +56,17 @@ describe('fetchPackageMetadata', () => { }); it('should return null if fetch fails', async () => { - const infoSpy = vi.mocked(core.info); fetchMock.mockRejectedValue(new Error('Network error')); const result = await fetchPackageMetadata('some-package', '1.0.0'); expect(result).toBeNull(); - expect(infoSpy).toHaveBeenCalledWith( - 'Failed to fetch metadata for some-package@1.0.0: Error: Network error' - ); + expect(coreLogs).toEqual({ + info: [ + 'Failed to fetch metadata for some-package@1.0.0: Error: Network error' + ], + warning: [], + debug: [], + error: [] + }); }); }); @@ -96,6 +93,7 @@ describe('calculateTotalDependencySizeIncrease', () => { afterEach(() => { fetchMock.mockRestore(); vi.clearAllMocks(); + clearCoreLogs(); }); it('returns 0 for empty version list', async () => { @@ -165,7 +163,6 @@ describe('calculateTotalDependencySizeIncrease', () => { {name: 'package-a', version: '1.0.0'}, {name: 'package-c', version: '1.0.0'} ]; - const infoSpy = vi.mocked(core.info); const output = await calculateTotalDependencySizeIncrease(newVersions, []); expect(output?.totalSize).toEqual(1500); expect(output?.packageSizes).toEqual( @@ -174,12 +171,15 @@ describe('calculateTotalDependencySizeIncrease', () => { ['package-c@1.0.0', null] ]) ); - expect(infoSpy).toHaveBeenCalledWith( - 'Added 1500 bytes for package-a@1.0.0' - ); - expect(infoSpy).toHaveBeenCalledWith( - 'No unpacked size info for package-c@1.0.0, skipping' - ); + expect(coreLogs).toEqual({ + info: [ + 'Added 1500 bytes for package-a@1.0.0', + 'No unpacked size info for package-c@1.0.0, skipping' + ], + warning: [], + debug: [], + error: [] + }); }); }); @@ -251,14 +251,6 @@ describe('getProvenanceForPackageVersions', () => { beforeEach(() => { fetchMock = vi.spyOn(globalThis, 'fetch'); - vi.mock(import('@actions/core'), async (importModule) => { - const mod = await importModule(); - return { - ...mod, - info: vi.fn(), - error: vi.fn() - }; - }); }); afterEach(() => { diff --git a/test/setup.ts b/test/setup.ts new file mode 100644 index 0000000..b62b9cd --- /dev/null +++ b/test/setup.ts @@ -0,0 +1,19 @@ +import {vi} from 'vitest'; +import {coreLogs} from './util.js'; + +function createLogger(output: string[]): (message: string | Error) => void { + return (message: string | Error) => { + output.push(message.toString()); + }; +} + +vi.mock(import('@actions/core'), async (importModule) => { + const mod = await importModule(); + return { + ...mod, + info: createLogger(coreLogs.info), + error: createLogger(coreLogs.error), + warning: createLogger(coreLogs.warning), + debug: createLogger(coreLogs.debug) + }; +}); diff --git a/test/util.ts b/test/util.ts new file mode 100644 index 0000000..23154cf --- /dev/null +++ b/test/util.ts @@ -0,0 +1,13 @@ +export const coreLogs = { + info: [] as string[], + error: [] as string[], + warning: [] as string[], + debug: [] as string[] +}; + +export function clearCoreLogs() { + coreLogs.info.length = 0; + coreLogs.error.length = 0; + coreLogs.warning.length = 0; + coreLogs.debug.length = 0; +} diff --git a/vitest.config.ts b/vitest.config.ts index de135b0..04c201b 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -4,6 +4,7 @@ export default defineConfig({ test: { include: [ 'test/**/*_test.ts' - ] + ], + setupFiles: ['test/setup.ts'] } })