Source: catalog-providers.js

/**
 * Catalog Providers (Phase 1D foundation)
 * Note: CatalogProvider base class is defined in catalog-api.js
 */

class NumistaCatalogProvider extends CatalogProvider {
  constructor(){ super({ name: 'Numista', key: 'numista' }); }
  normalizeId(id){
    return id ? id.replace(/^[NS]?#?\s*/i, '').trim() : null;
  }
  buildLink(id){
    const nid = this.normalizeId(id);
    if (!nid) return null;
    const isSet = /^S/i.test(id);
    if (isSet) {
      return `https://en.numista.com/catalogue/set.php?id=${nid}`;
    }
    return `https://en.numista.com/catalogue/pieces${nid}.html`;
  }
  isValid(id){ return /^[NS]?#?\d+$/i.test(id) || /^\d+$/.test(id); }
}

const CatalogProviders = (function(){
  const map = Object.create(null);
  function register(p){ map[p.key || p.name.toLowerCase()] = p; }
  function get(key){ return map[key] || map['numista']; }
  function list(){ return Object.values(map); }
  register(new NumistaCatalogProvider());
  return { register, get, list };
})();

if (typeof window!=='undefined'){ window.NumistaCatalogProvider=NumistaCatalogProvider; window.CatalogProviders=CatalogProviders; }