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:
| Propriedade | Descrição |
|---|---|
slug | Identificador seguro para URL (ex., posts, products) |
label | Nome de exibição (ex., “Posts do Blog”) |
labelSingular | Forma singular (ex., “Post”) |
description | Descrição opcional para editores |
icon | Nome do ícone Lucide para a barra lateral de administração |
supports | Recursos 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:
| Recurso | 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 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:
| Propriedade | Tipo | Descrição |
|---|---|---|
slug | string | Nome da coluna no banco de dados |
label | string | Rótulo de exibição na interface administrativa |
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 |
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 |
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 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.