nuxt / nuxt/content

feat(content): support data schema validation on build

Open
#3,351 8 comments 5 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

enhancement
Dominant language
TypeScript
Stars
3.7k
Forks
746
Avg merge
1d 16h
Merged PRs (30d)
3

Description

Is your feature request related to a problem? Please describe

For the development of the new website for the 3D printing conference Printed-Amsterdam, I chose Nuxt 3 with @nuxt/content in combination with Nuxt Studio. This setup was intended to provide an intuitive and user-friendly experience, especially for non-technical users.

However, while creating the data schema, I encountered two fundamental missing features:

  • Content files with type == data schemas are not validated (this enhancement issue).
  • Nested collections for relationships are not supported (see #3352 ).

The code is available in this open-source repository for the community:
https://github.com/toddeTV/printed-amsterdam.com

Describe the solution you'd like

It would be helpful if, during the build process, all files within the content folder were validated. Since all collections are already loaded during the build, it would be feasible to crawl the corresponding source folders, open all related files, and validate them against a schema - if one is provided.

Currently, it's possible to define a content config like this:

import { defineCollection, defineContentConfig, z } from '@nuxt/content'

export default defineContentConfig({
  collections: {
    talks: defineCollection({
      type: 'data',
      source: 'talks/**/*.json',
      schema: z.object({
        title: z.string(),
        description: z.string(),
      }),
    }),
  },
})

And include a file like /content/talks/foo.json with the following content:

{
  "title": 2
}

This file passes through the build without errors and is even included in the SQLite database under the talks collection. However, this should not happen: the description field is missing - even though it's required - and the title field is a number instead of a string.

Describe alternatives you've considered

Validating a collection's schema against all its files naturally incurs a performance cost. However, skipping validation allows errors to slip through easily and makes scaling with @nuxt/content more difficult.

A possible solution would be to make schema validation optional - controlled via a flag or configuration option. For example, validation could be enabled in feature branches via CI workflows, enforced as a required step before merging, and disabled on the main branch to speed up regular builds.

Additional context

None.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with the build-time collection loading described for defineContentConfig and defineCollection, including the talks/**/*.json source under content. Trace where schemas are applied and how files enter the SQLite database. Done means an invalid content/talks/foo.json file is rejected for the missing description and non-string title, with coverage for data collections.

Written by the indexing model from the issue text.

Assessment

Tech stack
nuxt, typescript
Domain
build-system, content
Issue type
Feature
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
48/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.