Modelo de Contenido

En esta página

Tu modelo de contenido es el conjunto de colecciones y campos que almacena tu sitio. Lo defines en el panel de administración o con la CLI, lo cambias cuando lo necesitas y opcionalmente generas tipos TypeScript a partir de él. Esta página cubre cómo trabajar con él.

Colecciones y campos

Una colección es un tipo de contenido (posts, productos, autores). Cada colección tiene campos que defines (un título, un cuerpo, un precio). Cada entrada también tiene campos del sistema que EmDash gestiona por ti.

Creas y editas colecciones y campos visualmente en el panel de administración bajo Content Types, o con la CLI. Los cambios surten efecto de inmediato, y una persona sin conocimientos de desarrollo puede hacerlo.

Campos del sistema

Además de los campos que defines, cada entrada tiene estos, siempre presentes:

CampoPropósito
idIdentificador único estable
slugIdentificador seguro para URL, único por locale
statusdraft, published o scheduled
author_idEl usuario que creó la entrada
created_at / updated_at / published_atMarcas de tiempo
deleted_atSe establece en eliminación suave; la fila se mantiene
versionSe incrementa en cada guardado

Eliminar una entrada es una eliminación suave: puede restaurarse.

Cambiar el modelo en cualquier momento

Puedes agregar, renombrar, eliminar o recambiar el tipo de un campo en una colección en vivo en cualquier momento, a través del panel de administración o la CLI. El contenido existente se preserva.

Tipos TypeScript

La generación de tipos es opcional pero recomendada. Genera tipos desde tu modelo actual:

npx emdash types

Esto escribe .emdash/types.ts con una interfaz por colección y sobrecargas de consulta tipadas, por lo que getEmDashCollection("posts") devuelve entradas completamente tipadas:

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

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

Vuelve a ejecutar el comando después de cambiar el modelo para mantener los tipos sincronizados.

Flujos de trabajo

Ambos flujos de trabajo cambian el mismo modelo.

Una persona sin conocimientos de desarrollo usa el panel de administración:

  1. Abre Content Types en el panel de administración.
  2. Haz clic en Add Collection.
  3. Define campos con el constructor visual.
  4. Comienza a crear contenido.

Un desarrollador puede usar la CLI para generar tipos y mover el modelo entre entornos:

npx emdash types                     # generar tipos TypeScript
npx emdash export-seed > seed.json   # exportar el modelo como archivo seed

Archivos seed

Un archivo seed es una descripción JSON de colecciones, taxonomías y menús. Las plantillas incluyen uno, y puedes exportar el tuyo propio para control de versiones o para configurar otro entorno.

{
	"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 un seed es idempotente, por lo que es seguro volver a ejecutarlo:

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" });

Consulta Formato de archivo seed para el esquema completo.

Próximos pasos