← back to All Designerwallcoverings

lib/vendor-pairs.js

52 lines

'use strict';

const hostSlugify = (value) => String(value || '').toLowerCase().normalize('NFD')
  .replace(/[\u0300-\u036f]/g, '')
  .replace(/&/g, ' and ')
  .replace(/[^a-z0-9]+/g, '-')
  .replace(/^-+|-+$/g, '')
  // One DNS label is capped at 63 bytes. Reserve nine characters for the
  // required "-internal" twin and never leave a trailing separator.
  .slice(0, 54).replace(/-+$/g, '');

function buildVendorPairSeeds(vendors) {
  const seen = new Set();
  const out = [];
  for (const row of vendors || []) {
    const vendor = String(row.name || row.vendor || '').trim();
    const slug = hostSlugify(row.site_slug || vendor);
    if (!vendor || !slug || seen.has(slug)) continue;
    seen.add(slug);
    const common = {
      vendor,
      pairSlug: slug,
      source: 'dw_unified',
      activeProductsDB: Number(row.active_count || row.activeProducts || 0),
      dbSampleImage: Array.isArray(row.images) ? (row.images[0] || null) : (row.sampleImage || null),
      created_at: row.created_at || null,
    };
    out.push({ ...common, slug, type: 'vendor-public', variant: 'public' });
    out.push({ ...common, slug: `${slug}-internal`, type: 'vendor-internal', variant: 'internal' });
  }
  return out;
}

function summarizePairs(sites) {
  const pairs = new Map();
  for (const site of sites || []) {
    if (!site.pairSlug || !site.variant) continue;
    const pair = pairs.get(site.pairSlug) || { public: false, internal: false };
    pair[site.variant] = !!site.up;
    pairs.set(site.pairSlug, pair);
  }
  const values = [...pairs.values()];
  return {
    vendors: values.length,
    complete: values.filter((p) => p.public && p.internal).length,
    public_up: values.filter((p) => p.public).length,
    internal_up: values.filter((p) => p.internal).length,
  };
}

module.exports = { hostSlugify, buildVendorPairSeeds, summarizePairs };