From 8c47fe6da84d11a266effa49c8ed9282b897e182 Mon Sep 17 00:00:00 2001 From: Dariusz L Date: Wed, 5 Aug 2026 02:15:22 +0200 Subject: [PATCH] refactor: reuse missing category collector --- tests/test_downloads_tab_workflow_route.mjs | 41 +++++++++++++++++++ .../search/download_target_methods.js | 28 +++---------- 2 files changed, 47 insertions(+), 22 deletions(-) diff --git a/tests/test_downloads_tab_workflow_route.mjs b/tests/test_downloads_tab_workflow_route.mjs index eadaff0..5ac2dfb 100644 --- a/tests/test_downloads_tab_workflow_route.mjs +++ b/tests/test_downloads_tab_workflow_route.mjs @@ -5558,6 +5558,47 @@ test('download category normalization maps gguf folder keys to diffusion models' assert.equal(normalizeDownloadCategory('model_gguf'), 'diffusion_models'); }); +test('missing model categories preserve node priority and fallback order', () => { + const getMissingSupportedDownloadCategories = eval( + `(${extractMethod(downloadTargetMethodsSource, 'getMissingSupportedDownloadCategories')})` + ); + const dialog = { + downloadDirectories: { + checkpoints: [], + loras: [], + vae: [], + }, + getDefaultDownloadCategoryKeys() { + return []; + }, + getKnownDownloadCategorySet() { + return new Set(Object.keys(this.downloadDirectories)); + }, + normalizeDownloadCategory(value = '') { + return String(value || '').trim().toLowerCase(); + }, + getMissingNodeTypeDownloadCategory(missing) { + return missing.node_category || ''; + }, + }; + + assert.deepEqual( + getMissingSupportedDownloadCategories.call(dialog, { + node_category: 'loras', + category: 'checkpoints', + directory: 'vae', + }), + ['loras'] + ); + assert.deepEqual( + getMissingSupportedDownloadCategories.call(dialog, { + category: 'checkpoints, checkpoints', + directory: 'vae|loras', + }), + ['checkpoints', 'vae', 'loras'] + ); +}); + test('download category normalization maps select safetensors alias to diffusion models', () => { const normalizeDownloadCategory = eval(`(${extractMethod(downloadTargetMethodsSource, 'normalizeDownloadCategory')})`); diff --git a/web/resolver/search/download_target_methods.js b/web/resolver/search/download_target_methods.js index e329186..102ff4b 100644 --- a/web/resolver/search/download_target_methods.js +++ b/web/resolver/search/download_target_methods.js @@ -158,30 +158,14 @@ export const downloadTargetMethods = { return chooseSupported(supported); } - const fallbackSupported = []; - const addCategory = (value) => { - if (value === undefined || value === null || String(value).trim() === '') return; - if (Array.isArray(value)) { - value.forEach(addCategory); - return; - } - String(value).split(/[,|;]/).forEach(part => { - const normalized = this.normalizeDownloadCategory(part); - if (normalized && knownCategories.has(normalized) && !fallbackSupported.includes(normalized)) { - fallbackSupported.push(normalized); - } - }); - }; - - addCategory(this.getMissingNodeTypeDownloadCategory(missing)); - if (fallbackSupported.length) { - return fallbackSupported; + const nodeSupported = collectCategories( + this.getMissingNodeTypeDownloadCategory(missing) + ); + if (nodeSupported.length) { + return nodeSupported; } - addCategory(missing.category); - addCategory(missing.directory); - - return fallbackSupported; + return collectCategories(missing.category, missing.directory); }, getSourceResultDownloadCategory(source = {}, fallbackCategory = '', missing = null) {