UNPKG

@dapplion/benchmark

Version:

Ensures that new code does not introduce performance regressions with CI. Tracks:

63 lines (62 loc) 1.78 kB
import fs from "node:fs"; import csvParse from "csv-parse/lib/sync.js"; import csvStringify from "csv-stringify/lib/sync.js"; export function readJson(filepath) { const jsonStr = fs.readFileSync(filepath, "utf8"); let json; try { json = JSON.parse(jsonStr); } catch (e) { throw Error(`Error parsing JSON ${filepath}: ${e.message}`); } // TODO: Validate schema return json; } export function writeJson(filepath, json) { const jsonStr = JSON.stringify(json, null, 2); fs.writeFileSync(filepath, jsonStr); } export function fromCsv(str) { const { csv, metadata } = splitCsvMetadata(str); return { data: csvParse(csv, { columns: true, cast: true }), metadata, }; } export function toCsv(data, metadata) { // Support Embedded Metadata https://www.w3.org/TR/tabular-data-model/#embedded-metadata const csv = csvStringify(data, { header: true }); if (metadata) { const metadataStr = toCsvMetadata(metadata); return `${metadataStr}\n${csv}`; } else { return csv; } } // CSV metadata export function toCsvMetadata(metadata) { return Object.entries(metadata) .map(([key, value]) => `#,${key},${value}`) .join("\n"); } /** * Embedded Metadata https://www.w3.org/TR/tabular-data-model/#embedded-metadata */ function splitCsvMetadata(str) { const metadata = {}; const rows = str.trim().split("\n"); let i = 0; for (i = 0; i < rows.length; i++) { const row = rows[i]; if (row.startsWith("#")) { const [key, value] = row.slice(2).split(","); metadata[key] = value; } else { break; } } return { csv: rows.slice(i).join("\n"), metadata }; }