nuxt / content

The file-based CMS for your Nuxt application, powered by Markdown and Vue components.
https://content.nuxt.com
MIT License
3.14k stars 628 forks source link

Ability to pass in an unpublished remark plugin as a function to nuxt.config.ts #2834

Open JessicaSachs opened 2 weeks ago

JessicaSachs commented 2 weeks ago

Is your feature request related to a problem? Please describe

Currently, developing and testing custom remark plugins locally is unnecessarily complicated due to two main issues:

  1. Module Resolution Conflict: When passing a resolved remark plugin, the module loader bypasses the local version and assumes I have a package installed and tries to resolve it by the key 🙄.

  2. Forced Package Resolution: Even after working around the initial import check, the compiled mdc-imports.mjs file still attempts to resolve plugins via the key specified in the Nuxt Content config, ignoring locally provided implementations.

Technical demonstration of the issue: Image

Describe the solution you'd like

We need the ability to use local remark plugins without the requirement to:

Ideal implementation would look like this:

// content-plugins/remark-jess-has-a-plugin.ts
export default function myPlugin() {
}

// Nuxt Config
import remarkPublicThingyPlugin from 'remark-public-thingy'
import remarkJessHasAPlugin from './content-plugins/remark-jess-has-a-plugin'

export default defineNuxtConfig({
  content: {
    markdown: {
      remarkPlugins: {
        'remark-public-thingy': remarkPublicThingyPlugin,
        'remark-jess-has-a-plugin': myPlugin,
      }
    }
  }
})

Additional context

This feature would greatly improve the developer experience for:

farnabaz commented 2 weeks ago

It it not possible to pass the plugin function directly in config. However, the MDC module supports the src field to define the plugin path.

Try passing your custom plugin into mdc.remarkPlugins with src.

export default defineNuxtConfig({
  mdc: {
    remarkPlugins: {
      'remark-jess-has-a-plugin': {
        src: resolve(__dirname, './content-plugins/remark-jess-has-a-plugin')
      }
    }
  }
})