Format options
Keystatic is capable to store your data in multiple formats: YAML
, JSON
and Markdoc
.
By default, entries will be stored in a YAML
file, with the exception of document
fields, which will generate a sperate .mdoc
file.
The name and directory structure of entries is also affected by the path
settings on a given collection or singleton. See the Content organisation page for more details.
Example (default format options)
blog: collection({
label: 'Blog',
slugField: 'title',
schema: {
title: fields.slug({ name: { label: 'Title' } })
publishedDate: fields.date({ label: 'Published date' }),
body: fields.document({
label: 'Body',
formatting: true,
links: true
})
}
})
With the above config, creating a new blog
entry with a what-a-day slug
will generate the following files:
blog/what-a-day
├── index.yaml
└── body.mdoc
The index.yaml
file will look like so:
title: What a day
publishedDate: 2023-07-27
The body.mdoc
file will look like so:
What a **beautiful** day!
## Let's go to the beach
I say we pack our swimmers and towels and head to the beach.
Who's with me?
Example with JSON data
We can specifically ask for JSON
data instead of YAML
with the format.data
option in our blog
collection:
blog: collection({
label: 'Blog',
slugField: 'title',
+ format: { data: 'JSON' },
schema: { //... }
})
The files generated will now look like this:
blog/what-a-day
├── index.json
└── body.mdoc
The index.json
file will look like so:
{
"title": "What a day",
"publishedDate": "2023-07-27"
}
The body.mdoc
file will look like so:
What a **beautiful** day!
## Let's go to the beach
I say we pack our swimmers and towels and head to the beach.
Who's with me?
Example with single file output
Quite often, you may want Keystatic to output all the fields within the same file, with the "metadata" fields placed in a frontmatter on top of the file.
The format.contentField
option lets you do that.
You need to reference a document
field from the schema as the contentField
value for it to work:
blog: collection({
label: 'Blog',
slugField: 'title',
+ format: { contentField: 'body' },
schema: {
title: fields.slug({ name: { label: 'Title' } })
publishedDate: fields.date({ label: 'Published date' }),
body: fields.document({
label: 'Body',
formatting: true,
links: true
})
}
})
Instead of outputting the data for the body
field in a separate file, Keystatic will now output everything inside a single index.mdoc
file:
blog/what-a-day
└── index.mdoc
The index.mdoc
file will look like this:
---
title: What a day
publishedDate: 2023-07-27
---
What a **beautiful** day!
## Let's go to the beach
I say we pack our swimmers and towels and head to the beach.
Who's with me?
Type signature
Find the latest version of the Format
type signature at: https://docsmill.dev/npm/@keystatic/core@latest#/.Format