← 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 };