Coleções e Campos

Nesta página

Uma coleção (collection) é um tipo de conteúdo (posts, páginas, produtos). Suas definições de campo definem a estrutura dos dados de cada entrada.

Criar coleções

Crie coleções através do painel de administração em Tipos de Conteúdo. Cada coleção tem as seguintes propriedades:

Tipos de conteúdo EmDash mostrando Páginas, Posts e coleções personalizadas com seus recursos
PropriedadeDescrição
slugIdentificador seguro para URL (ex., posts, products)
labelNome de exibição (ex., “Posts do Blog”)
labelSingularForma singular (ex., “Post”)
descriptionDescrição opcional para editores
iconNome do ícone Lucide para a barra lateral de administração
supportsRecursos como rascunhos, revisões, pré-visualização, agendamento, busca, SEO

Recursos de coleção

Ao criar uma coleção, ative os recursos que você precisa:

RecursoDescrição
draftsAtivar fluxo de trabalho rascunho/publicado
revisionsRastrear histórico de conteúdo com snapshots de versão
previewGerar URLs de pré-visualização assinadas para conteúdo em rascunho
schedulingAgendar conteúdo para publicar em uma data futura

A seguinte coleção ativa todos os quatro recursos:

{
  slug: "posts",
  label: "Blog Posts",
  labelSingular: "Post",
  supports: ["drafts", "revisions", "preview", "scheduling"]
}

Tipos de campo

EmDash suporta 16 tipos de campo que mapeiam para tipos de coluna SQLite.

Campos de texto

string

Entrada de texto curto. Mapeia para coluna TEXT.

{ slug: "title", type: "string", label: "Title" }

text

Área de texto multilinha. Mapeia para coluna TEXT.

{ slug: "excerpt", type: "text", label: "Excerpt" }

slug

Campo slug seguro para URL. Mapeia para coluna TEXT.

{ slug: "handle", type: "slug", label: "URL Handle" }

Conteúdo rico

portableText

Editor de texto rico (TipTap/ProseMirror). Armazenado como JSON.

{ slug: "content", type: "portableText", label: "Content" }

Portable Text é um formato baseado em blocos que preserva a estrutura sem incorporar HTML.

json

Dados JSON arbitrários. Armazenados como JSON.

{ slug: "metadata", type: "json", label: "Custom Metadata" }

Números

number

Números decimais. Mapeia para coluna REAL.

{ slug: "price", type: "number", label: "Price" }

integer

Números inteiros. Mapeia para coluna INTEGER.

{ slug: "quantity", type: "integer", label: "Stock Quantity" }

Booleanos e datas

boolean

Alternância verdadeiro/falso. Mapeia para INTEGER (0/1).

{ slug: "featured", type: "boolean", label: "Featured Post" }

datetime

Seletor de data e hora. Armazenado como string ISO 8601.

{ slug: "eventDate", type: "datetime", label: "Event Date" }

Seleção

select

Opção única de uma lista. Mapeia para coluna TEXT.

{
  slug: "status",
  type: "select",
  label: "Product Status",
  validation: {
    options: ["active", "discontinued", "coming_soon"]
  }
}

multiSelect

Múltiplas opções de uma lista. Armazenado como array JSON.

{
  slug: "features",
  type: "multiSelect",
  label: "Product Features",
  validation: {
    options: ["wireless", "waterproof", "eco-friendly"]
  }
}

Mídia e referências

image

Seletor de imagem da biblioteca de mídia. Armazena ID de mídia como TEXT.

{ slug: "featuredImage", type: "image", label: "Featured Image" }

file

Seletor de arquivo da biblioteca de mídia. Armazena ID de mídia como TEXT.

{ slug: "attachment", type: "file", label: "PDF Attachment" }

reference

Referência à entrada de outra coleção. Armazena ID de entrada como TEXT.

{
  slug: "author",
  type: "reference",
  label: "Author",
  options: {
    collection: "authors"
  }
}

Propriedades de campo

Cada campo suporta estas propriedades:

PropriedadeTipoDescrição
slugstringNome da coluna no banco de dados
labelstringRótulo de exibição na interface administrativa
typeFieldTypeUm dos 16 tipos de campo
requiredbooleanSe o campo deve ter um valor
uniquebooleanSe os valores devem ser únicos entre entradas
defaultValueunknownValor padrão para novas entradas
validationobjectRegras de validação específicas do tipo
widgetstringIdentificador de widget personalizado
optionsobjectConfiguração específica do widget
sortOrdernumberOrdem de exibição no editor

Regras de validação

O objeto validation varia de acordo com o tipo de campo. Sua forma completa é:

interface FieldValidation {
	required?: boolean; // All types
	min?: number; // number, integer
	max?: number; // number, integer
	minLength?: number; // string, text
	maxLength?: number; // string, text
	pattern?: string; // string (regex)
	options?: string[]; // select, multiSelect
}

O seguinte campo requer um endereço de e-mail único que corresponda a um padrão:

{
  slug: "email",
  type: "string",
  label: "Email Address",
  required: true,
  unique: true,
  validation: {
    pattern: "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$"
  }
}

Opções de widget

O objeto options configura o comportamento da interface específico do campo. Sua forma completa é:

interface FieldWidgetOptions {
	rows?: number; // text (textarea rows)
	showPreview?: boolean; // image, file
	collection?: string; // reference (target collection)
	allowMultiple?: boolean; // reference (multiple refs)
	[key: string]: unknown; // Custom widget options
}

O seguinte campo de referência vincula múltiplos produtos:

{
  slug: "relatedProducts",
  type: "reference",
  label: "Related Products",
  options: {
    collection: "products",
    allowMultiple: true
  }
}

Consultar coleções

Use as funções de consulta fornecidas para buscar conteúdo. Estas seguem o padrão de coleções ao vivo do Astro, retornando resultados estruturados. O seguinte exemplo mostra as opções de consulta comuns:

import { getEmDashCollection, getEmDashEntry } from "emdash";

// Get all entries - returns { entries, error }
const { entries: posts } = await getEmDashCollection("posts");

// Filter by status
const { entries: drafts } = await getEmDashCollection("posts", {
	status: "draft",
});

// Limit results
const { entries: recent } = await getEmDashCollection("posts", {
	limit: 5,
});

// Filter by taxonomy
const { entries: newsPosts } = await getEmDashCollection("posts", {
	where: { category: "news" },
});

// Get a single entry by slug - returns { entry, error, isPreview }
const { entry: post } = await getEmDashEntry("posts", "my-post-slug");

// Handle errors
const { entries, error } = await getEmDashCollection("posts");
if (error) {
	console.error("Failed to load posts:", error);
}

Geração de tipos

Execute npx emdash types para gerar tipos TypeScript do seu esquema. O arquivo gerado contém uma interface por coleção:

export interface Post {
	title: string;
	content: PortableTextBlock[];
	excerpt?: string;
	featuredImage?: string;
	author: string; // reference ID
}

export interface Product {
	title: string;
	price: number;
	description: PortableTextBlock[];
}

Mapeamento de banco de dados

Os tipos de campo mapeiam para tipos de coluna SQLite da seguinte forma:

Tipo de CampoTipo SQLiteNotas
stringTEXT
textTEXT
slugTEXT
urlTEXT
numberREALPonto flutuante de 64 bits
integerINTEGERInteiro com sinal de 64 bits
booleanINTEGER0 ou 1
datetimeTEXTFormato ISO 8601
selectTEXT
multiSelectJSONArray de strings
portableTextJSONArray de blocos
imageTEXTID de mídia
fileTEXTID de mídia
referenceTEXTID de entrada
jsonJSONJSON arbitrário
repeaterJSONArray de subcampos

Próximos passos