Collections
Collection of content data for your app
Define Collections
Define a collection to parse a certain set of files.
import { defineCollections } from 'fumadocs-mdx/config';
import { z } from 'zod';
export const blog = defineCollections({
type: 'doc',
dir: './content/blog',
schema: z.object({
// schema
}),
// other options
});
type
The accepted type of collection.
import { defineCollections } from 'fumadocs-mdx/config';
// only scan for json/yaml files
export const metaFiles = defineCollections({
type: 'meta',
// options
});
-
type: meta
Accept JSON/YAML Files, available options:
Prop Type Default type
"meta"
- transform
(entry: { data: output<Schema>; file: FileInfo; }, globalConfig?: GlobalConfig | undefined) => TransformOutput | Promise<...>
- dir
string | string[]
- files
string[]
- schema
Schema | ((ctx: TransformContext) => Schema)
- -
type: doc
Markdown/MDX Documents, available options:
Prop Type Default type
"doc"
- transform
(entry: { data: output<Schema>; file: FileInfo; mdx: Async extends true ? MarkdownProps : never; }, globalConfig?: GlobalConfig | undefined) => TransformOutput | Promise<...>
- mdxOptions
MDXOptions
- async
Async
- dir
string | string[]
- files
string[]
- schema
Schema | ((ctx: TransformContext) => Schema)
-
dir
Directories to scan input files.
schema
The Zod schema to validate file data (frontmatter on doc
type, content on meta
type).
import { defineCollections } from 'fumadocs-mdx/config';
import { z } from 'zod';
export const blog = defineCollections({
type: 'doc',
dir: './content/blog',
schema: z.object({
name: z.string(),
}),
});
You can add additional properties to the output. Note that the validation is done by build time, hence the output must be serializable.
You can also pass a function and receives the transform context.
import { defineCollections } from 'fumadocs-mdx/config';
import { z } from 'zod';
export const blog = defineCollections({
type: 'doc',
dir: './content/blog',
schema: (ctx) => {
return z.object({
name: z.string(),
testPath: z.string().default(ctx.path),
});
},
});
mdxOptions
Customise MDX options on collection level.
import { defineCollections, getDefaultMDXOptions } from 'fumadocs-mdx/config';
export const blog = defineCollections({
type: 'doc',
mdxOptions: {
// mdx options
},
});
By design, this will remove all default settings applied by your global config and Fumadocs MDX. You have full control over MDX options.
You can use getDefaultMDXOptions
to apply default configurations, it accepts the Extended MDX Options.
import { defineCollections, getDefaultMDXOptions } from 'fumadocs-mdx/config';
export const blog = defineCollections({
type: 'doc',
mdxOptions: getDefaultMDXOptions({
// extended mdx options
}),
});
This API only available on doc
type.
Define Docs
You can use defineDocs
to define the required collections to work with Fumadocs.
It offers the same API as defineCollections
.
import { defineDocs } from 'fumadocs-mdx/config';
export const { docs, meta } = defineDocs({
docs: {
// optional, you can pass options to each collection
},
meta: {
// optional, you can pass options to each collection
},
});
The docs
and meta
are collections on their own.
You can pass collection options to them as shown above.
dir
Instead of per collection, you should customise dir
from defineDocs
:
import { defineDocs } from 'fumadocs-mdx/config';
export const { docs, meta } = defineDocs({
dir: 'my/content/dir',
});
schema
You can extend the default Zod schema of docs
and meta
.
import { frontmatterSchema, metaSchema, defineDocs } from 'fumadocs-mdx/config';
import { z } from 'zod';
export const { docs, meta } = defineDocs({
docs: {
schema: frontmatterSchema.extend({
index: z.boolean().default(false),
}),
},
meta: {
schema: metaSchema.extend({
// other props
}),
},
});
Last updated on 1/18/2025