@ztl-uwu/nuxt-content
Version:
Write your content inside your Nuxt app
51 lines (50 loc) • 1.86 kB
JavaScript
import { extname } from "pathe";
import { camelCase } from "scule";
import csv from "./csv/index.js";
import markdown from "./markdown.js";
import yaml from "./yaml.js";
import pathMeta from "./path-meta.js";
import json from "./json.js";
const TRANSFORMERS = [
csv,
markdown,
json,
yaml,
pathMeta
];
function getParser(ext, additionalTransformers = []) {
let parser = additionalTransformers.find((p) => ext.match(new RegExp(p.extensions.join("|"), "i")) && p.parse);
if (!parser) {
parser = TRANSFORMERS.find((p) => ext.match(new RegExp(p.extensions.join("|"), "i")) && p.parse);
}
return parser;
}
function getTransformers(ext, additionalTransformers = []) {
return [
...additionalTransformers.filter((p) => ext.match(new RegExp(p.extensions.join("|"), "i")) && p.transform),
...TRANSFORMERS.filter((p) => ext.match(new RegExp(p.extensions.join("|"), "i")) && p.transform)
];
}
export async function transformContent(id, content, options = {}) {
const { transformers = [] } = options;
const file = { _id: id, body: content };
const ext = extname(id);
const parser = getParser(ext, transformers);
if (!parser) {
console.warn(`${ext} files are not supported, "${id}" falling back to raw content`);
return file;
}
const parserOptions = options[camelCase(parser.name)] || {};
const parsed = await parser.parse(file._id, file.body, parserOptions);
const matchedTransformers = getTransformers(ext, transformers);
const result = await matchedTransformers.reduce(async (prev, cur) => {
const next = await prev || parsed;
const transformOptions = options[camelCase(cur.name)];
if (transformOptions === false) {
return next;
}
return cur.transform(next, transformOptions || {});
}, Promise.resolve(parsed));
return result;
}
export { defineTransformer } from "./utils.js";