UNPKG

@qiwi/tech-radar

Version:

Fully automated tech-radar generator

73 lines (69 loc) 2.38 kB
import { parse as parseCsv } from 'csv-parse/sync' import fse from 'fs-extra' /** * read .csv file and generate radarDocument * @param csvPath * @returns {{data: any[], meta: {}, quadrantAliases?: {}}} radarDocument */ export const parseCsvRadar = async (csvPath) => { const radarContents = normalizeCsv(await fse.readFile(csvPath, 'utf8')) const radarDocument = { meta: {}, data: [], quadrantAliases: {}, quadrantTitles: {}, // Flex sections. Populated when the source uses `sector,*` / `ring,*` // rows. Left empty for legacy 4x4 radars — the normaliser derives a // unified `sectors`/`rings` view downstream. sectorTitles: {}, sectorAliases: {}, ringTitles: {}, } radarContents.split('===').forEach((radarChunks) => { const records = parseCsv(radarChunks, { columns: true, skip_empty_lines: true, }) const header = Object.keys(records[0]) if ( header.includes('name') && (header.includes('quadrant') || header.includes('sector')) ) { radarDocument.data = [...radarDocument.data, ...records] } else if (header.includes('alias') && header.includes('sector')) { records.forEach((r) => { radarDocument.sectorAliases[r.alias.toLowerCase()] = r.sector.toLowerCase() }) } else if (header.includes('alias')) { records.forEach((r) => { radarDocument.quadrantAliases[r.alias.toLowerCase()] = r.quadrant.toLowerCase() }) } else if (header.includes('title') && header.includes('sector')) { records.forEach((r) => { radarDocument.sectorTitles[r.sector.toLowerCase()] = r.title }) } else if (header.includes('title') && header.includes('ring')) { records.forEach((r) => { radarDocument.ringTitles[r.ring.toLowerCase()] = r.title }) } else if (header.includes('title') && header.includes('quadrant')) { records.forEach((r) => { radarDocument.quadrantTitles[r.quadrant.toLowerCase()] = r.title }) } else { Object.assign(radarDocument.meta, records[0]) } }) return radarDocument } export const normalizeCsv = (fileContents) => fileContents .split(/("[^"]+")/g) .map((item) => { if (item[0] === '"') return item return item .split(',') .map((i) => i.replace(/^ *| *$/gm, '')) .join(',') }) .join('')