'use strict'; (function () { let catalog = { sets: [], stats: {} }; const esc = value => String(value ?? '').replace(/[&<>"']/g, char => ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' })[char]); const tr = (key, fallback) => window.t?.(key, fallback) || fallback; if (!document.querySelector('link[data-package-library-style]')) { const link = document.createElement('link'); Object.assign(link, { rel: 'stylesheet', href: 'styles/package-library.css' }); link.dataset.packageLibraryStyle = 'true'; document.head.appendChild(link); } const componentHtml = component => `
  • ${esc(component.type)}${esc(component.componentId)} ${tr(`packageLibrary.${component.required ? 'required' : 'optional'}`, component.required ? 'required' : 'optional')}
    v${esc(component.version || '?')} ${esc(component.region || '')}${esc(component.sha256)}
  • `; const recipeHtml = item => `
  • ${esc(item.label || item.recipeKey)}v${esc(item.version)} ${esc(item.state)} ${esc(item.recipeSha256.slice(0, 12))}...
  • `; function setHtml(set) { const recipes = set.recipes.length ? set.recipes.map(recipeHtml).join('') : `
  • ${esc(tr('packageLibrary.noRecipes', 'No recipes yet'))}
  • `; return `
    ${esc(set.title.externalTitleId)}

    ${esc(set.title.name)}

    ${esc(set.label || set.setKey)}${esc(set.platform)} ${esc(set.region || '')} ${esc(set.confidence)} ${esc(set.source)}

    ${esc(tr('packageLibrary.components', 'Components'))} (${set.components.length})

      ${set.components.map(componentHtml).join('')}

    ${esc(tr('packageLibrary.recipes', 'Recipes'))} (${set.recipes.length})

      ${recipes}
    `; } function render() { const host = document.getElementById('package-library-content'); if (!host) return; const query = document.getElementById('package-library-search')?.value.trim().toLowerCase(); const sets = catalog.sets.filter(set => !query || JSON.stringify(set).toLowerCase().includes(query)); host.innerHTML = sets.length ? `
    ${sets.map(setHtml).join('')}
    ` : `
    ${esc(tr('packageLibrary.empty', 'No package sets match'))}${esc(tr('packageLibrary.emptyDetail', 'Import or adjust the search. Package inventory never implies installation.'))}
    `; const stats = document.getElementById('package-library-stats'); if (stats) stats.textContent = [['titles', 'titles'], ['sets', 'sets'], ['components', 'componentsLower'], ['recipes', 'recipesLower']].map(([field, key]) => `${catalog.stats[field] || 0} ${tr(`packageLibrary.${key}`, field)}`).join(' / '); } window.loadPackages = async () => { catalog = await window.pork.packageCatalog(); render(); }; document.getElementById('package-library-search')?.addEventListener('input', render); })();