Skip to content

A CLI tool that creates markdown files with frontmatter using a Zod schema.

License

Notifications You must be signed in to change notification settings

maxchang3/newmd

Repository files navigation

➕ newmd

A CLI tool that creates markdown files with frontmatter using a Zod schema.

  npx newmd blog "Hello World"

* blog is the default schema with some fields. You can define your own schema in the config file.

Usage

CLI

Run the following command in your terminal:

npx newmd blog "Hello World"

or using pnpx(pnpm dlx):

pnpx newmd blog "Hello World"

Will create a markdown file with the following content:

---
title: Hello World
description: ''
pubDate: 2025-03-09T01:57:00.000Z
---

* The pubDate field will be filled with new Date().

You can install it globally for convenience.

Options

See newmd --help for more details, following is a brief description.

newmd <schemaName> <title>
  • --content <value> Set the content of the markdown file
  • --path <value> Set the output directory
  • --slug <value> Set the slug for the filename, if not provided, it will be generated from the slugified title.
  • --cwd <value> Set the current working directory
  • --toml Whether to use TOML format for frontmatter, default is false
  • --overwrite Whether to overwrite the existing file, default is false

Config file

You need to create a config file to define the schemas for the frontmatter.

The config structure and default values are as follows:

// newmd.config.[js,mjs,ts]
import { defineConfig, z } from 'newmd'

export default defineConfig({
    // The format of the frontmatter.
    format: 'yaml',
    // Root path for the markdown file.
    path: '.',
    // Schemas for the frontmatter.
    schemas: {
        blog: z.object({
            title: z.string(),
            description: z.string().optional(),
            pubDate: z.coerce.date(),
            updatedDate: z.coerce.date().optional(),
        }),
    },
})

Integration

With Astro

Say you have this content config file:

// src/content.config.ts
import { glob } from 'astro/loaders'
import { defineCollection, z } from 'astro:content'

const blog = defineCollection({
    loader: glob({ pattern: '**/*.md', base: './src/data/blog' }),
    schema: z.object({
        title: z.string(),
        permalink: z.string().optional(),
    }),
})

export const collections = { blog }

You can create a newmd config file like this:

// newmd.config.ts
import { defineConfig, z } from 'newmd'

export default defineConfig({
    // Corresponding to the `base` option in the content config.
    path: './src/data/blog',
    schemas: { // Copy the schema from the content config.
        blog: z.object({
            title: z.string(),
            description: z.string().optional(),
            pubDate: z.coerce.date(),
            updatedDate: z.coerce.date().optional(),
        }),
    },
})

Now you can use the same schema to create markdown files with frontmatter by running npx newmd blog "Hello World".

Credits

This project won't be possible without @toiroakr's zod-empty and other open-source projects.

License

MIT License © 2024-PRESENT Max Chang

About

A CLI tool that creates markdown files with frontmatter using a Zod schema.

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published