Uma coleção é um tipo de conteúdo (publicações, páginas, produtos). Suas definições de campo definem a estrutura dos dados de cada entrada.
Criando coleções
Crie coleções através do painel de administração em Content Types. Cada coleção tem as seguintes propriedades:
| Propriedade | Descrição |
|---|---|
slug | Identificador seguro para URL (ex., posts, products) |
label | Nome de exibição (ex., “Blog Posts”) |
labelSingular | Forma singular (ex., “Post”) |
description | Descrição opcional para editores |
icon | Nome do ícone Lucide para a barra lateral admin |
supports | Funcionalidades como rascunhos, revisões, pré-visualização, agendamento, pesquisa, seo |
Funcionalidades de coleção
Ao criar uma coleção, ative as funcionalidades que você precisa:
| Funcionalidade | Descrição |
|---|---|
drafts | Ativar fluxo de trabalho rascunho/publicado |
revisions | Rastrear histórico de conteúdo com snapshots de versão |
preview | Gerar URLs de pré-visualização assinadas para conteúdo em rascunho |
scheduling | Agendar conteúdo para publicar em uma data futura |
A seguinte coleção ativa todas as quatro funcionalidades:
{
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. Armazenado 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 para a entrada de outra coleção. Armazena ID da entrada como TEXT.
{
slug: "author",
type: "reference",
label: "Author",
options: {
collection: "authors"
}
} Propriedades de campo
Todo campo suporta estas propriedades:
| Propriedade | Tipo | Descrição |
|---|---|---|
slug | string | Nome da coluna no banco de dados |
label | string | Rótulo de exibição na interface admin |
type | FieldType | Um dos 16 tipos de campo |
required | boolean | Se o campo deve ter um valor |
unique | boolean | Se os valores devem ser únicos entre entradas |
indexed | boolean | Permitir ordenação e filtragem eficientes por este campo |
defaultValue | unknown | Valor padrão para novas entradas |
validation | object | Regras de validação específicas do tipo |
widget | string | Identificador de widget personalizado |
options | object | Configuração específica do widget |
sortOrder | number | Ordem de exibição no editor |
Defina indexed: true quando uma consulta de coleção precisar usar um campo personalizado em orderBy ou um filtro de campo. Índices são suportados para campos string, url, number, integer, boolean, datetime, select, reference e slug. EmDash rejeita campos JSON indexados, conteúdo rico e outros tipos de campo não escalares.
Regras de validação
O objeto validation varia por tipo de campo. Sua forma completa é:
interface FieldValidation {
required?: boolean; // Todos os tipos
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 email único e validado por 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 de UI específico do campo. Sua forma completa é:
interface FieldWidgetOptions {
rows?: number; // text (linhas da área de texto)
showPreview?: boolean; // image, file
collection?: string; // reference (coleção de destino)
allowMultiple?: boolean; // reference (múltiplas refs)
[key: string]: unknown; // Opções de widget personalizadas
}
O seguinte campo de referência vincula a múltiplos produtos:
{
slug: "relatedProducts",
type: "reference",
label: "Related Products",
options: {
collection: "products",
allowMultiple: true
}
}
Consultando 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";
// Obter todas as entradas - retorna { entries, error }
const { entries: posts } = await getEmDashCollection("posts");
// Filtrar por status
const { entries: drafts } = await getEmDashCollection("posts", {
status: "draft",
});
// Limitar resultados
const { entries: recent } = await getEmDashCollection("posts", {
limit: 5,
});
// Filtrar por taxonomia
const { entries: newsPosts } = await getEmDashCollection("posts", {
where: { category: "news" },
});
// Obter uma entrada por slug - retorna { entry, error, isPreview }
const { entry: post } = await getEmDashEntry("posts", "my-post-slug");
// Tratamento de erros
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 a partir do seu schema. O arquivo gerado contém uma interface por coleção:
export interface Post {
title: string;
content: PortableTextBlock[];
excerpt?: string;
featuredImage?: string;
author: string; // ID de referência
}
export interface Product {
title: string;
price: number;
description: PortableTextBlock[];
}
Mapeamento de banco de dados
Tipos de campo mapeiam para tipos de coluna SQLite da seguinte forma:
| Tipo de campo | Tipo SQLite | Notas |
|---|---|---|
string | TEXT | |
text | TEXT | |
slug | TEXT | |
url | TEXT | |
number | REAL | Ponto flutuante de 64 bits |
integer | INTEGER | Inteiro com sinal de 64 bits |
boolean | INTEGER | 0 ou 1 |
datetime | TEXT | Formato ISO 8601 |
select | TEXT | |
multiSelect | JSON | Array de strings |
portableText | JSON | Array de blocos |
image | TEXT | ID de mídia |
file | TEXT | ID de mídia |
reference | TEXT | ID de entrada |
json | JSON | JSON arbitrário |
repeater | JSON | Array de subcampos |
Próximos passos
Modelo de conteúdo
Entenda o modelo de conteúdo.
Taxonomias
Organize conteúdo com categorias e tags.
Biblioteca de mídia
Gerencie imagens e arquivos.