@dapplion/benchmark
Version:
Ensures that new code does not introduce performance regressions with CI. Tracks:
63 lines (62 loc) • 1.78 kB
JavaScript
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 };
}