Skip to content

Add support for named scopes ("computed collection") #71

Description

@seancdavis

Defining a document type brings the entirety of content for that document into the data object that we import into pages. I'm potentially importing much more information than I need to work with. It also forces me to write filtering logic in the template. And while this is a fairly typical pattern with Next.js, it's not a pleasant developer experience.

Proposal is to allow for named scopes when defining a document type. Something like this:

const Doc = defineDocumentType(() => ({
  name: "Doc",
  // ...
  fields: { /* ... */ },
  scopes: [
    {
      name: "mostRecent",
      resolve: (docs) => /* sorting/filtering logic ... */
    }
  ]
))

I don't have a strong opinion on how this would then be used, but maybe something like this:

import { allDocs, mostRecentDocs } from ".contentlayer/data"

The key decision here is finding a balance between being too magical (appending "Docs" to the scope name) and having to validate that scopes across all types be unique.

(Inpsired from a conversation with @smnh.)

Metadata

Metadata

Assignees

No one assigned

    Labels

    featureNew feature or request

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions