UNPKG

@ztl-uwu/nuxt-content

Version:

Write your content inside your Nuxt app

51 lines (50 loc) 1.86 kB
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";