Referencia de Tipos de Campo

En esta página

EmDash soporta 16 tipos de campo para definir esquemas de contenido. Cada tipo se mapea a un tipo de columna SQLite y proporciona una interfaz de administración apropiada.

Descripción General

La siguiente tabla lista cada tipo de campo y su columna SQLite:

TipoColumna SQLiteDescripción
stringTEXTEntrada de texto corto
textTEXTTexto multilínea
urlTEXTValor URL
numberREALNúmero decimal
integerINTEGERNúmero entero
booleanINTEGERVerdadero/falso
datetimeTEXTFecha y hora
selectTEXTSelección única desde opciones
multiSelectJSONSelecciones múltiples
portableTextJSONContenido de texto enriquecido
imageTEXTReferencia de imagen
fileTEXTReferencia de archivo
referenceTEXTReferencia a otra entrada
jsonJSONDatos JSON arbitrarios
slugTEXTIdentificador seguro para URL
repeaterJSONGrupo de campos repetitivos

Tipos de Texto

string

Texto corto de una sola línea. Úselo para títulos, nombres y valores cortos.

{
  slug: "title",
  label: "Title",
  type: "string",
  required: true,
  validation: {
    minLength: 1,
    maxLength: 200,
  },
}

Opciones de validación:

  • minLength — Conteo mínimo de caracteres
  • maxLength — Conteo máximo de caracteres
  • pattern — Patrón regex a coincidir

Opciones de widget:

  • Ninguna específica

text

Texto plano multilínea. Úselo para descripciones, extractos y texto plano más largo.

{
  slug: "excerpt",
  label: "Excerpt",
  type: "text",
  options: {
    rows: 3,
  },
}

Opciones de validación:

  • minLength — Conteo mínimo de caracteres
  • maxLength — Conteo máximo de caracteres

Opciones de widget:

  • rows — Número de filas en textarea (predeterminado: 3)

slug

Identificador seguro para URL. Generado automáticamente desde otro campo o ingresado manualmente.

{
  slug: "slug",
  label: "URL Slug",
  type: "slug",
  required: true,
  unique: true,
}

Los slugs se sanitizan automáticamente: minúsculas, espacios reemplazados por guiones, caracteres especiales eliminados.

Tipos Numéricos

number

Número decimal. Úselo para precios, calificaciones y mediciones.

{
  slug: "price",
  label: "Price",
  type: "number",
  required: true,
  validation: {
    min: 0,
    max: 999999.99,
  },
}

Opciones de validación:

  • min — Valor mínimo
  • max — Valor máximo

Almacenado como SQLite REAL (punto flotante de 64 bits).

integer

Número entero. Úselo para cantidades, conteos y valores de orden.

{
  slug: "quantity",
  label: "Quantity",
  type: "integer",
  defaultValue: 1,
  validation: {
    min: 0,
    max: 1000,
  },
}

Opciones de validación:

  • min — Valor mínimo
  • max — Valor máximo

Almacenado como SQLite INTEGER.

boolean

Verdadero o falso. Úselo para interruptores y banderas.

{
  slug: "featured",
  label: "Featured",
  type: "boolean",
  defaultValue: false,
}

Almacenado como SQLite INTEGER (0 o 1).

Fecha y Hora

datetime

Valor de fecha y hora. Almacenado en formato ISO 8601.

{
  slug: "publishedAt",
  label: "Published At",
  type: "datetime",
}

Opciones de validación:

  • min — Fecha mínima (cadena ISO)
  • max — Fecha máxima (cadena ISO)

Formato de almacenamiento: 2025-01-24T12:00:00.000Z

Tipos de Selección

select

Selección única desde opciones predefinidas.

{
  slug: "status",
  label: "Status",
  type: "select",
  required: true,
  defaultValue: "draft",
  validation: {
    options: ["draft", "published", "archived"],
  },
}

Opciones de validación:

  • options — Array de valores permitidos (requerido)

Almacenado como TEXT conteniendo el valor seleccionado.

multiSelect

Selecciones múltiples desde opciones predefinidas.

{
  slug: "tags",
  label: "Tags",
  type: "multiSelect",
  validation: {
    options: ["news", "tutorial", "review", "opinion"],
  },
}

Opciones de validación:

  • options — Array de valores permitidos (requerido)

Almacenado como array JSON: ["news", "tutorial"]

Contenido Enriquecido

portableText

Contenido de texto enriquecido usando formato Portable Text. Soporta encabezados, listas, enlaces, imágenes y bloques personalizados.

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

El valor se almacena como un array JSON de bloques Portable Text, por ejemplo:

[
	{
		"_type": "block",
		"style": "normal",
		"children": [{ "_type": "span", "text": "Hello world" }]
	}
]

Los plugins pueden agregar tipos de bloques personalizados (incrustaciones, widgets, etc.) al editor. Estos aparecen en el menú de comandos slash y se renderizan automáticamente en el sitio. Ver componentes de renderizado de Portable Text.

Tipos de Medios

image

Referencia a una imagen cargada. Incluye metadatos como dimensiones y texto alternativo.

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

Opciones de widget:

  • showPreview — Mostrar vista previa de imagen en admin (predeterminado: true)

El valor se almacena como un objeto con la referencia del medio y sus metadatos:

{
	"id": "01HXK5MZSN...",
	"url": "https://cdn.example.com/image.jpg",
	"alt": "Description",
	"width": 1920,
	"height": 1080
}

file

Referencia a un archivo cargado como un documento o PDF.

{
  slug: "document",
  label: "Document",
  type: "file",
}

El valor se almacena como un objeto con la referencia del archivo y sus metadatos:

{
	"id": "01HXK5MZSN...",
	"url": "https://cdn.example.com/doc.pdf",
	"filename": "report.pdf",
	"mimeType": "application/pdf",
	"size": 102400
}

Tipos Relacionales

reference

Referencia a otra entrada de contenido.

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

Opciones de widget:

  • collection — Slug de colección objetivo (requerido)
  • allowMultiple — Permitir múltiples referencias (predeterminado: false)

Una referencia única se almacena como el ID de la entrada objetivo:

"01HXK5MZSN..."

Múltiples referencias se almacenan como un array de IDs de entrada:

["01HXK5MZSN...", "01HXK6NATS..."]

Tipos Flexibles

json

Datos JSON arbitrarios. Úselo para estructuras anidadas complejas, integraciones de terceros o datos sin un esquema fijo.

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

Almacenado tal cual en la columna JSON de SQLite.

Propiedades de Campo

Todos los campos soportan estas propiedades comunes:

PropiedadTipoDescripción
slugstringIdentificador único (requerido)
labelstringNombre de visualización (requerido)
typeFieldTypeTipo de campo (requerido)
requiredbooleanRequerir un valor (predeterminado: false)
uniquebooleanForzar unicidad (predeterminado: false)
defaultValueunknownValor predeterminado para nuevas entradas
validationobjectReglas de validación específicas del tipo
widgetstringAnulación de widget personalizado
optionsobjectConfiguración de widget
sortOrdernumberOrden de visualización en admin

Slugs de campo reservados

Estos slugs están reservados y no se pueden usar:

  • id
  • slug
  • status
  • author_id
  • primary_byline_id
  • created_at
  • updated_at
  • published_at
  • scheduled_at
  • deleted_at
  • version
  • live_revision_id
  • draft_revision_id
  • terms
  • bylines
  • byline

Tipos TypeScript

Importe las definiciones de tipo de campo para uso programático:

import type { FieldType, Field, CreateFieldInput } from "emdash";

const fieldTypes: FieldType[] = [
	"string",
	"text",
	"url",
	"number",
	"integer",
	"boolean",
	"datetime",
	"select",
	"multiSelect",
	"portableText",
	"image",
	"file",
	"reference",
	"json",
	"slug",
	"repeater",
];