Skip to content

RFC: new frontMatter to assign custom data to a doc #6923

Open
@slorber

Description

Have you read the Contributing Guidelines on issues?

Motivation

For some documentation use-cases, it is convenient to be able to assign additional data to a doc

It should be possible to create fancy views/tables/aggregations of a set of documents based on those extra data and display those anywhere thanks to MDX.


This has been requested/discussed in #6302 (comment)

For example, @Danielku15 wants to display a table of a subset of the documents in a page of his documentation:

https://alphatab.net/docs/reference/settings/

image


When a doc is created, Docusaurus creates data for this doc in 3 places:

  • Doc metadata: this contains every interesting data we have related to a docs (including all frontMatter). It can be heavier.
  • Version metadata: this is shared between all the pages of a given docs version, and thus should remain relatively small.
  • Global data: this is shared across the whole site page, and must stay as small as possible (so we only include id/path/sidebar here, see https://docusaurus.io/__docusaurus/debug/globalData)

For data shared between multiple pages, the smallest the better. For performance reasons, we can't pre-emptively add any doc data everywhere without penalizing the performance of all the pages.


My suggestion is to add 2 distinct frontMatter to give the ability to assign extra data to a doc on a case-by-case basis

global_custom_props: 
  a: b
  c: d
  e: ["f"]

version_custom_props: 
  x: {y: 1, z: 2}

This would allow each doc to enrich the predefined minimal version/global data that Docusaurus needs to be able to run.

These data would become available in the React components (swizzled theme components or MDX embedded) so that users can create more fancy experiences.


What if you want to inject data that is not convenient to declare through yaml/frontMatter?

I think the createFrontMatter() proposal #5568 (also frontMatterParser PR #5972) could handle that:

global_custom_props: 
  dataPath: ./data/docX_global.json

And the createFrontMatter callback would be responsible to transform the path to a JS object.

And if I want to inject data that already exists as frontMatter?

That would be a bit odd to have to do this to propagate doc title in global data

title: my title
global_custom_props: 
  title: my title

Similarly using something like to createFrontMatter would help to set up propagation of existing frontmatter like title into global data

Self-service

  • I'd be willing to do some initial work on this proposal myself.

Metadata

Assignees

No one assigned

    Labels

    domain: content pluginRelated to content plugin emitting metadata for theme consumptionproposalThis issue is a proposal, usually non-trivial change

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions