Generar

Vela proporciona un generador para crear modelos de base de datos, formularios, recursos, esquemas y scaffolds CRUD completos. Todos comparten una sintaxis común. Dentro de esa sintaxis, las formas singular y plural tienen significado.

Sintaxis

$ vela generate <type> <name> [fields...]

Tipos

  • form - Un formulario y un esquema Zod, sin modelo de base de datos
  • schema - Un esquema Zod por sí solo
  • resource - Un modelo de base de datos y su esquema, sin frontend
  • scaffold - Una interfaz CRUD completa, modelo, esquema y migración
  • migration - Una migración que altera una colección existente
  • workflow - Un workflow en segundo plano, sin modelo de base de datos

form y schema funcionan en cualquier proyecto SvelteKit, con o sin backend. El resto necesita un backend, y scaffold --remote también necesita shadcn-svelte.

Nombre

El nombre en plural del modelo, formulario, recurso, esquema o scaffold, por ejemplo pets o todos. Los nombres de modelo siempre son plurales y se convertirán al plural si se proporciona la forma singular. Los nombres pueden anidarse en directorios usando una barra (/) como separador. Por ejemplo, users/pets creará un recurso en /users/pets.

Campos

Los campos se definen como pares name:type, por ejemplo name:string o age:number. Si el modelo ya existe en la base de datos, la opción fields puede omitirse y el generador usará los campos existentes.

Tipos de campo

Vela admite los siguientes tipos de campo:

text
number
bool
date
email
password
url
editor
autodate
select
file/files
json
geoPoint
relation

Alias

Se aceptan nombres familiares de otros ecosistemas y se normalizan a los tipos anteriores:

string                               → text
boolean                              → bool
integer, int, float, decimal, double → number
datetime, timestamp                  → date
geopoint                             → geoPoint
references                           → relation

autodate

El tipo de campo autodate es un tipo especial que asigna automáticamente al campo la fecha y hora actuales al crear o actualizar. Los nombres de campo para autodate pueden ser: created/created_at o updated/updated_at.

select

El campo select tiene una sintaxis especial para definir las opciones. Las opciones se definen como pares value:label. La forma singular o plural del nombre del campo determina si el select es de selección simple o múltiple.

$ vela generate scaffold pets type:select(dog:Dog,cat:Cat,bird:Bird)
$ vela generate scaffold products colors:select(red:Red,green:Green,blue:Blue)

file

El campo file se usa para subir archivos al servidor. La forma singular o plural del nombre del campo determina si el campo acepta un solo archivo o un array de archivos.

$ vela generate scaffold owners avatar:file
$ vela generate scaffold pets photos:files

Campos obligatorios

Los campos se marcan como obligatorios añadiendo ! al nombre del campo. Esto marca el campo como obligatorio en la base de datos y en el esquema Zod para la validación del formulario.

$ vela generate scaffold pets name:string! age:number!

Relaciones

Además de los tipos de campo anteriores, Vela admite pasar el nombre de cualquier modelo existente para crear una relación. Singular frente a plural tiene significado aquí, ya que determina si la relación es uno-a-muchos o muchos-a-muchos.

$ vela generate scaffold pets name:string owner:user
$ vela generate scaffold teams name:string members:users

De forma similar a Ruby on Rails, se puede usar el atajo references para crear relaciones a partir del nombre del campo.

$ vela generate scaffold posts title:string author:user tags:references

Cambiar un modelo existente

Una vez que una colección existe, los campos se añaden, eliminan y renombran con vela generate migration:

$ vela generate migration pets add birthday:date

Propiedad y permisos

Si la autenticación está habilitada con el comando vela enable auth, es posible asociar modelos con el usuario autenticado. Esto puede hacerse directamente en el modelo con el tipo de campo especial current_user, que asignará automáticamente al campo el usuario autenticado en la creación (y excluirá el campo del formulario del frontend).

$ vela generate scaffold posts title:string author:current_user

Si el modelo está anidado dentro de otro modelo, vela recorre la jerarquía de modelos para encontrar el modelo padre más cercano con una relación con el usuario autenticado.

$ vela generate resource teams name:string
$ vela generate resource users email:string team:references
$ vela generate scaffold projects title:text team:references

En este ejemplo, el modelo users está asociado con el modelo teams. El acceso al modelo projects está restringido a los usuarios que son miembros del equipo del proyecto.

Uso

En el proyecto de SvelteKit generado hay dos formas de recuperar datos de la base de datos. La primera es la API de administración locals.admin, equivalente a consultar la base de datos directamente. La segunda es la API con ámbito de usuario locals.pb, que da acceso a la base de datos limitado al usuario autenticado.

API de administración

export const load = async ({ locals }) => {
    const posts = await locals.admin.collection('posts').getFullList();
    return { posts };
}

API con ámbito de usuario

export const load = async ({ locals }) => {
    const posts = await locals.pb.collection('posts').getFullList();
    return { posts };
}

Limitaciones

La propiedad mediante referencia inversa no está soportada.