import { json } from "remix"; import path from "path"; import fs from "fs/promises"; import parseFrontMatter from "front-matter"; import invariant from "tiny-invariant"; import { marked } from "marked"; export type Post = { slug: string; title: string; html: string; }; export type PostMarkdownAttributes = { title: string; }; type NewPost = { title: string; slug: string; markdown: string; }; function isValidPostAttributes( attributes: any ): attributes is PostMarkdownAttributes { return attributes?.title; } const postsPath = path.join(__dirname, "..", "posts"); export async function getPost(slug: string): Promise<Post> { const filepath = path.join(postsPath, slug + ".md"); const file = await fs.readFile(filepath); const { attributes, body } = parseFrontMatter(file.toString()); invariant( isValidPostAttributes(attributes), `Post ${filepath} is missing attributes` ); const html = marked(body); return { slug, html, title: attributes.title }; }
export const action: ActionFunction = async ({ request }) => { const formData = await request.formData(); await new Promise((res) => setTimeout(res, 1000)); const title = formData.get("title"); const slug = formData.get("slug"); const markdown = formData.get("markdown"); const errors: PostError = {}; if (!title) errors.title = true; if (!slug) errors.slug = true; if (!markdown) errors.markdown = true; if (Object.keys(errors).length) { return json(errors); } invariant(typeof title === "string"); invariant(typeof slug === "string"); invariant(typeof markdown === "string"); await createPost({ title, slug, markdown }); return redirect("/admin"); };
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。