Modelo de Conteúdo

Nesta página

Seu modelo de conteúdo é o conjunto de coleções e campos que seu site armazena. Você o define no painel de administração ou com a CLI, altera quando precisar e opcionalmente gera tipos TypeScript a partir dele. Esta página cobre como trabalhar com ele.

Coleções e campos

Uma coleção é um tipo de conteúdo (posts, produtos, autores). Cada coleção tem campos que você define (um título, um corpo, um preço). Cada entrada também tem campos do sistema que o EmDash gerencia para você.

Você cria e edita coleções e campos visualmente no painel de administração em Content Types, ou com a CLI. As alterações têm efeito imediato, e uma pessoa não-desenvolvedora pode fazer isso.

Campos do sistema

Além dos campos que você define, cada entrada tem estes, sempre presentes:

CampoPropósito
idIdentificador único estável
slugIdentificador seguro para URL, único por locale
statusdraft, published ou scheduled
author_idO usuário que criou a entrada
created_at / updated_at / published_atTimestamps
deleted_atDefinido em exclusão suave; a linha é mantida
versionIncrementa a cada salvamento

Excluir uma entrada é uma exclusão suave: ela pode ser restaurada.

Alterar o modelo a qualquer momento

Você pode adicionar, renomear, remover ou alterar o tipo de um campo em uma coleção ativa a qualquer momento, através do painel de administração ou da CLI. O conteúdo existente é preservado.

Tipos TypeScript

A geração de tipos é opcional, mas recomendada. Gere tipos do seu modelo atual:

npx emdash types

Isso escreve .emdash/types.ts com uma interface por coleção e sobrecargas de consulta tipadas, então getEmDashCollection("posts") retorna entradas totalmente tipadas:

export interface Post {
	title: string;
	content: PortableTextBlock[];
	excerpt?: string;
}

declare module "emdash" {
	export function getEmDashCollection(
		type: "posts",
	): Promise<{ entries: ContentEntry<Post>[]; error?: Error }>;
}

Execute novamente o comando após alterar o modelo para manter os tipos sincronizados.

Fluxos de trabalho

Ambos os fluxos de trabalho alteram o mesmo modelo.

Uma pessoa não-desenvolvedora usa o painel de administração:

  1. Abra Content Types no painel de administração.
  2. Clique em Add Collection.
  3. Defina campos com o construtor visual.
  4. Comece a criar conteúdo.

Um desenvolvedor pode usar a CLI para gerar tipos e mover o modelo entre ambientes:

npx emdash types                     # gerar tipos TypeScript
npx emdash export-seed > seed.json   # exportar o modelo como arquivo seed

Arquivos seed

Um arquivo seed é uma descrição JSON de coleções, taxonomias e menus. Templates vêm com um, e você pode exportar o seu próprio para controle de versão ou para configurar outro ambiente.

{
	"version": "1",
	"collections": [
		{
			"slug": "posts",
			"label": "Blog Posts",
			"labelSingular": "Post",
			"supports": ["drafts", "revisions", "preview"],
			"fields": [
				{ "slug": "title", "type": "string", "required": true },
				{ "slug": "content", "type": "portableText" }
			]
		}
	],
	"taxonomies": [{ "name": "category", "label": "Categories", "hierarchical": true }],
	"menus": [{ "name": "primary", "label": "Primary Navigation" }]
}

Aplicar um seed é idempotente, então é seguro executar novamente:

import { applySeed, validateSeed } from "emdash/seed";
import seedData from "./.emdash/seed.json";

const { valid, errors } = validateSeed(seedData);
await applySeed(db, seedData, { includeContent: true, onConflict: "skip" });

Veja Formato de arquivo seed para o esquema completo.

Próximos passos