Saltar al contenido principal
Cada aplicación debe tener exactamente una llamada a defineApplication. Declara:
  • Identidad — identificador universal, nombre para mostrar, descripción.
  • Permisos — bajo qué rol se ejecutan sus funciones de lógica y componentes de frontend.
  • Variables (opcionales) — pares clave–valor expuestos a tu código como variables de entorno.
  • Hooks de preinstalación / postinstalación (opcionales) — consulta Funciones de lógica.
src/application-config.ts
Notas:
  • Los campos universalIdentifier son identificadores deterministas que te pertenecen. Genéralos una vez y mantenlos estables entre sincronizaciones.
  • applicationVariables se convierten en variables de entorno para tus funciones y componentes de frontend. En las funciones lógicas (del lado del servidor), están disponibles como process.env.VARIABLE_NAME. En los componentes de frontend, usa getApplicationVariable('VARIABLE_NAME') de twenty-sdk/front-component. Las variables marcadas con isSecret: true solo se inyectan en las funciones lógicas. Los componentes de frontend solo reciben variables no secretas.
  • El rol predeterminado se detecta automáticamente a partir del archivo de rol marcado con defineApplicationRole(); no necesitas hacer referencia a él desde defineApplication().
  • Las funciones de preinstalación y posinstalación se detectan automáticamente durante la compilación del manifiesto; no necesitas referenciarlas en defineApplication().
  • Pasar defaultRoleUniversalIdentifier explícitamente sigue siendo compatible por motivos de retrocompatibilidad, pero está en desuso en favor de defineApplicationRole().
  • serverVariables son configuraciones y secretos con ámbito de instancia (por ejemplo, claves de API). A diferencia de applicationVariables, no declaran ningún valor en el manifiesto: el operador del espacio de trabajo los completa desde la configuración de la aplicación, y se inyectan en las funciones lógicas solo una vez que se han establecido.

Tipos de variables

Tanto applicationVariables como serverVariables aceptan un type opcional (y, para SELECT / MULTI_SELECT, una lista de options). Tipos admitidos: TEXT (predeterminado), BOOLEAN, NUMBER, NUMERIC, DATE, DATE_TIME, SELECT, MULTI_SELECT, ARRAY, RAW_JSON, RICH_TEXT.
src/application-config.ts
El type solo afecta a la presentación y validación: selecciona la entrada correspondiente en la interfaz de configuración del espacio de trabajo (un interruptor, campo numérico, lista desplegable, selector de fecha, editor JSON, …) y permite que la compilación valide tu configuración (por ejemplo, SELECT / MULTI_SELECT deben declarar options no vacías). No cambia cómo el valor llega a tu código. Los valores siempre se inyectan como cadenas; esto es inherente a las variables de entorno (process.env.* solo admite cadenas). Cuando se ejecuta tu función lógica, el ejecutor serializa cada valor según su type declarado al construir process.env, por lo que el formato de cadena es coherente independientemente de cómo se haya establecido el valor (valor predeterminado del manifiesto, interfaz de configuración o una versión anterior): Analiza la cadena para volver al tipo que esperas:
Lo mismo se aplica a los componentes de interfaz que leen valores mediante getApplicationVariable('VARIABLE_NAME'): el valor devuelto es una cadena; analízalo según sea necesario.

Rol de función predeterminado

El rol declarado con defineApplicationRole() controla a qué pueden acceder las funciones de lógica y los componentes de interfaz de la aplicación:
  • El token en tiempo de ejecución inyectado como TWENTY_APP_ACCESS_TOKEN se deriva de este rol.
  • El cliente de API tipado está restringido a los permisos otorgados a ese rol.
  • Sigue el principio de mínimo privilegio: declara solo los permisos que necesitan tus funciones.
Cuando generas una nueva aplicación, la CLI crea un archivo de rol inicial en src/roles/default-role.ts. Consulta Roles y permisos para obtener la referencia completa.

Metadatos del Marketplace

Si planeas publicar tu aplicación, estos campos opcionales controlan cómo aparece en el marketplace:
logoUrl y screenshots son alias obsoletos de logo y galleryImages. Las URL absolutas externas (http:// o https://) no son compatibles para estos campos: se descartan con una advertencia en tiempo de compilación. En su lugar, incluye las imágenes en la carpeta public/ de tu aplicación.