@ztl-uwu/nuxt-content
Version:
Write your content inside your Nuxt app
51 lines (50 loc) • 1.34 kB
JavaScript
import { unified } from "unified";
import { defineTransformer } from "../utils.js";
import { fromCSV } from "./from-csv.js";
function csvParse(options) {
const parser = (doc) => {
return fromCSV(doc, options);
};
Object.assign(this, { Parser: parser });
const toJsonObject = (tree) => {
const [header, ...rows] = tree.children;
const columns = header.children.map((col) => col.children[0].value);
const data = rows.map((row) => {
return row.children.reduce((acc, col, i) => {
acc[String(columns[i])] = col.children[0]?.value;
return acc;
}, {});
});
return data;
};
const toJsonArray = (tree) => {
const data = tree.children.map((row) => {
return row.children.map((col) => col.children[0]?.value);
});
return data;
};
const compiler = (doc) => {
if (options.json) {
return toJsonObject(doc);
}
return toJsonArray(doc);
};
Object.assign(this, { Compiler: compiler });
}
export default defineTransformer({
name: "csv",
extensions: [".csv"],
parse: async (_id, content, options = {}) => {
const stream = unified().use(csvParse, {
delimiter: ",",
json: true,
...options
});
const { result } = await stream.process(content);
return {
_id,
_type: "csv",
body: result
};
}
});