From e7e7ee53f64ebfe3b344e525b9a8eafd3a4bc147 Mon Sep 17 00:00:00 2001 From: Slawomir Koszewski Date: Tue, 7 Apr 2026 06:55:24 +0200 Subject: [PATCH] Fix: Enhance asset filtering with dry run support and update platform architecture patterns --- src/cli.ts | 2 +- src/core/matcher.ts | 25 +++++++++++++++++++------ src/core/platform.ts | 4 ++-- 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/src/cli.ts b/src/cli.ts index 481370d..21f7964 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -180,7 +180,7 @@ async function run() { console.log(`Fetching latest release for ${repository}...`); const release = await fetchLatestRelease(repository, token); - const asset = getMatchingAsset(release.assets, platformInfo, options.fileName, options.fileType); + const asset = getMatchingAsset(release.assets, platformInfo, options.fileName, options.fileType, options.dryRun); const version = release.tag_name.replace(/^v/i, ''); const downloadUrl = asset.browser_download_url; diff --git a/src/core/matcher.ts b/src/core/matcher.ts index 5938d75..fb49591 100644 --- a/src/core/matcher.ts +++ b/src/core/matcher.ts @@ -11,9 +11,22 @@ const knownFileTypes: Record = { targz: '*.{tgz,tar.gz}', }; -function filterByRegex(assets: ReleaseAsset[], pattern: string): ReleaseAsset[] { +function debugAssetList(label: string, assets: ReleaseAsset[]): void { + console.debug(label); + for (const asset of assets) { + console.debug(`- ${asset.name}`); + } +} + +function filterByRegex(assets: ReleaseAsset[], pattern: string, dryRun?: boolean): ReleaseAsset[] { const regex = new RegExp(pattern, 'i'); - return assets.filter((asset) => regex.test(asset.name)); + const filtered = assets.filter((asset) => regex.test(asset.name)); + if (dryRun) { + console.debug(`Filtering assets with regex: ${pattern}`); + debugAssetList('Assets:', assets); + debugAssetList('Matched assets:', filtered); + } + return filtered; } function replacePlatformPlaceholders(pattern: string, platform: PlatformInfo): string { @@ -22,7 +35,7 @@ function replacePlatformPlaceholders(pattern: string, platform: PlatformInfo): s .replace(/{{ARCH}}/g, platform.archPattern); } -export function getMatchingAsset(assets: ReleaseAsset[], platform: PlatformInfo, fileName?: string, fileType?: string): ReleaseAsset { +export function getMatchingAsset(assets: ReleaseAsset[], platform: PlatformInfo, fileName?: string, fileType?: string, dryRun?: boolean): ReleaseAsset { // Filename provided as literal string (no ~): exact match. if (fileName && !fileName.startsWith('~')) { const exactMatches = assets.filter((asset) => asset.name === fileName); @@ -42,7 +55,7 @@ export function getMatchingAsset(assets: ReleaseAsset[], platform: PlatformInfo, } else if (fileType.startsWith('~')) { // 3. Custom regex fileType: match regex at end of string. const fileTypeRegex = `${fileType.substring(1)}$`; - fileTypeFilteredAssets = filterByRegex(assets, fileTypeRegex); + fileTypeFilteredAssets = filterByRegex(assets, fileTypeRegex, dryRun); } else { // 4. Custom extension fileType: treat as plain extension glob. const extension = fileType.replace(/^\./, ''); @@ -54,7 +67,7 @@ export function getMatchingAsset(assets: ReleaseAsset[], platform: PlatformInfo, // 4. Filename provided with ~: platform placeholder expansion and regex filtering. if (fileName && fileName.startsWith('~')) { const fileNamePattern = replacePlatformPlaceholders(fileName.substring(1), platform); - const fileNameFilteredAssets = filterByRegex(fileTypeFilteredAssets, fileNamePattern); + const fileNameFilteredAssets = filterByRegex(fileTypeFilteredAssets, fileNamePattern, dryRun); if (fileNameFilteredAssets.length !== 1) { throw new Error(`Expected exactly one asset to match the filename regex, matched: ${fileNameFilteredAssets.length}`); } @@ -63,7 +76,7 @@ export function getMatchingAsset(assets: ReleaseAsset[], platform: PlatformInfo, // 5. No filename: use default {{SYSTEM}}-{{ARCH}} regex. const defaultPattern = replacePlatformPlaceholders('{{SYSTEM}}[_-]{{ARCH}}', platform); - const defaultFilteredAssets = filterByRegex(fileTypeFilteredAssets, defaultPattern); + const defaultFilteredAssets = filterByRegex(fileTypeFilteredAssets, defaultPattern, dryRun); // 6. Zero or multiple matches are errors. if (defaultFilteredAssets.length !== 1) { diff --git a/src/core/platform.ts b/src/core/platform.ts index 48146fa..c1f6187 100644 --- a/src/core/platform.ts +++ b/src/core/platform.ts @@ -19,8 +19,8 @@ export const systemPatterns: Record = { }; export const archPatterns: Record = { - x64: '(x86_64|x64|amd64)', - arm64: '(aarch64|arm64)' + x64: '(x86_64|x64|amd64|universal)', + arm64: '(aarch64|arm64|universal)' }; export function getPlatformInfo(overrides?: PlatformOverrides): PlatformInfo {