

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# AWS AppSync referencia de la utilidad de plantilla de mapeo de resolución
<a name="resolver-util-reference"></a>

**nota**  
Ahora admitimos de forma básica el tiempo de ejecución APPSYNC\$1JS y su documentación. Considere la opción de utilizar el tiempo de ejecución APPSYNC\$1JS y sus guías [aquí](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-js-version.html).

AWS AppSync define un conjunto de utilidades que se pueden utilizar en un solucionador de GraphQL para simplificar las interacciones con las fuentes de datos. Algunas de estas utilidades son de uso general con cualquier fuente de datos, como la generación IDs o las marcas de tiempo. Otras son específicas de un tipo de origen de datos. Están disponibles las siguientes utilidades:
+  [Aplicaciones auxiliares en \$1util](https://docs.aws.amazon.com/appsync/latest/devguide/utility-helpers-in-util.html): la variable \$1util contiene métodos de utilidad generales que ayudan a trabajar con los datos. A menos que se especifique lo contrario, todas las utilidades usan el juego de caracteres UTF-8.
+ [ AppSync directivas](https://docs.aws.amazon.com/appsync/latest/devguide/aws-appsync-directives.html): AppSync expone las directivas para facilitar la productividad de los desarrolladores al escribir en VTL.
+  [Aplicaciones auxiliares de tiempo en \$1util.time](https://docs.aws.amazon.com/appsync/latest/devguide/time-helpers-in-util-time.html): la variable \$1util.time contiene métodos de fecha y hora útiles para ayudar a generar marcas de tiempo, convertir entre formatos de fecha y hora, y analizar cadenas de fecha y hora. La sintaxis de los formatos de fecha y hora se basa en ella [DateTimeFormatter](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html), y puede consultarla para obtener más documentación.
+ [Aplicaciones auxiliares en \$1util.list](https://docs.aws.amazon.com/appsync/latest/devguide/list-helpers-in-util-list.html): \$1util.list contiene métodos útiles para ayudar con operaciones de lista habituales, como eliminar o retener elementos de una lista para casos de uso de filtro.
+  [Aplicaciones auxiliares de mapeo en \$1util.map](https://docs.aws.amazon.com/appsync/latest/devguide/utility-helpers-in-map.html): \$1util.map contiene métodos útiles para ayudar con operaciones de mapeo habituales, como eliminar o retener elementos de un mapeo para casos de uso de filtro.
+  [Aplicaciones auxiliares de DynamoDB en \$1util.dynamodb](https://docs.aws.amazon.com/appsync/latest/devguide/dynamodb-helpers-in-util-dynamodb.html): \$1util.dynamodb contiene métodos auxiliares que facilitan la escritura y la lectura de datos en Amazon DynamoDB, como el mapeo y el formato automáticos de los tipos de datos. 
+  [Aplicaciones auxiliares de Amazon RDS en \$1util.rds](https://docs.aws.amazon.com/appsync/latest/devguide/rds-helpers-in-util-rds.html): \$1util.rds contiene métodos auxiliares que dan formato a las operaciones de RDS al eliminar los datos extraños de los resultados.
+  [Aplicaciones auxiliares de HTTP en \$1util.http](https://docs.aws.amazon.com/appsync/latest/devguide/http-helpers-in-utils-http.html) la utilidad \$1util.http proporciona métodos auxiliares que puede utilizar para gestionar parámetros de solicitud HTTP y añadir encabezados de respuesta.
+  [Aplicaciones auxiliares en \$1util.xml](https://docs.aws.amazon.com/appsync/latest/devguide/xml-helpers-in-utils-xml.html): \$1util.xml contiene métodos auxiliares que facilitan la conversión de las respuestas XML a JSON o a un diccionario.
+  [Aplicaciones auxiliares de transformación en \$1util.transform](https://docs.aws.amazon.com/appsync/latest/devguide/transformation-helpers-in-utils-transform.html): \$1util.transform contiene métodos auxiliares que facilitan las operaciones complejas sobre orígenes de datos, como las operaciones de filtro de DynamoDB.
+  [Aplicaciones auxiliares de matemáticas en \$1util.math](https://docs.aws.amazon.com/appsync/latest/devguide/math-helpers-in-util-math.html): \$1util.math contiene métodos para ayudar con operaciones matemáticas comunes.
+  [Aplicaciones auxiliares de cadena en \$1util.str](https://docs.aws.amazon.com/appsync/latest/devguide/str-helpers-in-util-str.html): \$1util.str contiene métodos para ayudar con operaciones de cadena comunes.
+  [Extensiones](https://docs.aws.amazon.com/appsync/latest/devguide/extensions.html): \$1extensions contiene un conjunto de métodos para realizar acciones adicionales en sus solucionadores.

# Aplicaciones auxiliares de utilidades en \$1util
<a name="utility-helpers-in-util"></a>

**nota**  
Ahora admitimos de forma básica el tiempo de ejecución APPSYNC\$1JS y su documentación. Considere la opción de utilizar el tiempo de ejecución APPSYNC\$1JS y sus guías [aquí](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-js-version.html).

La variable `$util` contiene métodos de utilidad generales que ayudan a trabajar con los datos. A menos que se especifique lo contrario, todas las utilidades usan el juego de caracteres UTF-8.

## Utilidades de análisis de JSON
<a name="utility-helpers-in-json-parsing"></a>

### Lista de utilidades de análisis de JSON
<a name="utility-helpers-in-json-parsing-list"></a>

** **`$util.parseJson(String) : Object`** **  
Toma un elemento JSON en forma de cadena y devuelve una representación del resultado en forma de objeto.

** **`$util.toJson(Object) : String`** **  
Toma un objeto y devuelve una representación JSON en forma de cadena de dicho objeto.

## Utilidades de codificación
<a name="utility-helpers-in-encoding"></a>

### Lista de utilidades de codificación
<a name="utility-helpers-in-encoding-list"></a>

** **`$util.urlEncode(String) : String`** **  
Devuelve la cadena de entrada como una cadena `application/x-www-form-urlencoded` codificada.

** **`$util.urlDecode(String) : String`** **  
Descodifica una cadena `application/x-www-form-urlencoded` codificada y la devuelve a su forma no codificada.

** **`$util.base64Encode( byte[] ) : String`** **  
Codifica la entrada en una cadena codificada en base64.

** **`$util.base64Decode(String) : byte[]`** **  
Descodifica los datos de una cadena codificada en base64.

## Utilidades de generación de ID
<a name="utility-helpers-in-id-gen"></a>

### Lista de utilidades de generación de ID
<a name="utility-helpers-in-id-gen-list"></a>

** **`$util.autoId() : String`** **  
Devuelve un UUID de 128 bits generado de forma aleatoria.

****`$util.autoUlid() : String`****  
Devuelve un ULID (identificador ordenable lexicográficamente único y universal) de 128 bits generado de forma aleatoria.

****`$util.autoKsuid() : String`****  
Devuelve un KSUID (identificador único ordenable por K) de 128 bits generado de forma aleatoria codificado en base62 como una cadena con una longitud de 27.

## Utilidades de error
<a name="utility-helpers-in-error"></a>

### Lista de utilidades de error
<a name="utility-helpers-in-error-list"></a>

** `$util.error(String)` **  
Genera un error personalizado. Utilícela en las plantillas de mapeo de solicitudes o de respuestas para detectar un error en la solicitud o en el resultado de la invocación.

** `$util.error(String, String)` **  
Genera un error personalizado. Utilícela en las plantillas de mapeo de solicitudes o de respuestas para detectar un error en la solicitud o en el resultado de la invocación. También puede especificar un `errorType`.

** `$util.error(String, String, Object)` **  
Genera un error personalizado. Utilícela en las plantillas de mapeo de solicitudes o de respuestas para detectar un error en la solicitud o en el resultado de la invocación. También puede especificar un campo `errorType` y `data`. El valor de `data` se añadirá al bloque `error` correspondiente dentro de `errors` en la respuesta de GraphQL.  
`data` se filtrará en función de la selección de consulta establecida.

** `$util.error(String, String, Object, Object)` **  
Genera un error personalizado. Se puede utilizar en las plantillas de mapeo de solicitud o de respuesta si la plantilla detecta un error en la solicitud o en el resultado de la invocación. También se pueden especificar los campos `errorType`, `data` y `errorInfo`. El valor de `data` se añadirá al bloque `error` correspondiente dentro de `errors` en la respuesta de GraphQL.   
`data` se filtrará en función de la selección de consulta establecida. El valor de `errorInfo` se añadirá al bloque `error` correspondiente dentro de `errors` en la respuesta de GraphQL.  
`errorInfo` **NO** se filtrará en función de la selección de consulta establecida.

** `$util.appendError(String)` **  
Adjunta un error personalizado. Se puede utilizar en las plantillas de mapeo de solicitud o de respuesta si la plantilla detecta un error en la solicitud o en el resultado de la invocación. A diferencia de `$util.error(String)`, la evaluación de la plantilla no se interrumpirá, de modo podrán devolverse datos al intermediario.

** `$util.appendError(String, String)` **  
Adjunta un error personalizado. Se puede utilizar en las plantillas de mapeo de solicitud o de respuesta si la plantilla detecta un error en la solicitud o en el resultado de la invocación. También se puede especificar un valor `errorType`. A diferencia de `$util.error(String, String)`, la evaluación de la plantilla no se interrumpirá, de modo podrán devolverse datos al intermediario.

** `$util.appendError(String, String, Object)` **  
Adjunta un error personalizado. Se puede utilizar en las plantillas de mapeo de solicitud o de respuesta si la plantilla detecta un error en la solicitud o en el resultado de la invocación. También se puede especificar un valor `errorType` y un campo `data`. A diferencia de `$util.error(String, String, Object)`, la evaluación de la plantilla no se interrumpirá, de modo podrán devolverse datos al intermediario. El valor de `data` se añadirá al bloque `error` correspondiente dentro de `errors` en la respuesta de GraphQL.   
`data` se filtrará en función de la selección de consulta establecida.

** `$util.appendError(String, String, Object, Object)` **  
Adjunta un error personalizado. Se puede utilizar en las plantillas de mapeo de solicitud o de respuesta si la plantilla detecta un error en la solicitud o en el resultado de la invocación. También se pueden especificar los campos `errorType`, `data` y `errorInfo`. A diferencia de `$util.error(String, String, Object, Object)`, la evaluación de la plantilla no se interrumpirá, de modo podrán devolverse datos al intermediario. El valor de `data` se añadirá al bloque `error` correspondiente dentro de `errors` en la respuesta de GraphQL.  
`data` se filtrará en función de la selección de consulta establecida. El valor de `errorInfo` se añadirá al bloque `error` correspondiente dentro de `errors` en la respuesta de GraphQL.  
`errorInfo` **NO** se filtrará en función de la selección de consulta establecida.

## Utilidades de validación condicional
<a name="utility-helpers-in-condition"></a>

### Lista de utilidades de validación condicional
<a name="utility-helpers-in-condition-list"></a>

** `$util.validate(Boolean, String) : void` **  
Si la condición es falsa, lanza una CustomTemplateException con el mensaje especificado.

** `$util.validate(Boolean, String, String) : void` **  
Si la condición es falsa, lanza un CustomTemplateException con el mensaje y el tipo de error especificados.

** `$util.validate(Boolean, String, String, Object) : void` **  
Si la condición es falsa, arroja a CustomTemplateException con el mensaje y el tipo de error especificados, así como los datos que desee devolver en la respuesta.

## Utilidades de comportamiento nulo
<a name="utility-helpers-in-null-behavior"></a>

### Lista de utilidades de comportamiento nulo
<a name="utility-helpers-in-null-behavior-list"></a>

** `$util.isNull(Object) : Boolean` **  
Devuelve el valor true si el objeto suministrado es nulo.

** `$util.isNullOrEmpty(String) : Boolean` **  
Devuelve el valor true si los datos proporcionados son nulos o una cadena vacía. De lo contrario, devuelve el valor false.

** `$util.isNullOrBlank(String) : Boolean` **  
Devuelve el valor true si los datos proporcionados son nulos o una cadena en blanco. De lo contrario, devuelve el valor false.

** `$util.defaultIfNull(Object, Object) : Object` **  
Devuelve el primer objeto si no es nulo. De lo contrario devuelve el segundo objeto como "objeto predeterminado".

** `$util.defaultIfNullOrEmpty(String, String) : String` **  
Devuelve la primera cadena si no es nula ni está vacía. De lo contrario devuelve la segunda cadena como "cadena predeterminada".

** `$util.defaultIfNullOrBlank(String, String) : String` **  
Devuelve la primera cadena si no es nula ni está en blanco. De lo contrario devuelve la segunda cadena como "cadena predeterminada".

## Utilidades de coincidencia de patrones
<a name="utility-helpers-in-pattern-matching"></a>

### Lista de utilidades de coincidencia de tipos y patrones
<a name="utility-helpers-in-type-pattern-matching-list"></a>

** `$util.typeOf(Object) : String` **  
Devuelve una cadena que describe el tipo de objeto. Las identificaciones de tipos admitidas son: "Null", "Number", "String", "Map", "List" y "Boolean". Si no puede identificarse un tipo, el tipo devuelto es "Object".

** `$util.matches(String, String) : Boolean` **  
Devuelve un valor true si el patrón especificado en el primer argumento coincide con los datos proporcionados en el segundo argumento. El patrón tiene que ser una expresión regular, por ejemplo `$util.matches("a*b", "aaaaab")`. La funcionalidad se basa en [Pattern](https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html), que puede consultar para obtener más información.

** `$util.authType() : String` **  
Devuelve una cadena que describe el tipo de autenticación múltiple que utiliza una solicitud y devuelve "Autorización de IAM", "Autorización del grupo de usuarios", "Autorización de Open ID Connect" o "Autorización de la clave de API".

## Utilidades de validación de objetos
<a name="utility-helpers-in-object-validation"></a>

### Lista de utilidades de validación de objetos
<a name="utility-helpers-in-object-validation-list"></a>

** `$util.isString(Object) : Boolean` **  
Devuelve el valor true si el objeto es una cadena.

** `$util.isNumber(Object) : Boolean` **  
Devuelve el valor true si el objeto es un número.

** `$util.isBoolean(Object) : Boolean` **  
Devuelve el valor true si el objeto es un valor booleano.

** `$util.isList(Object) : Boolean` **  
Devuelve el valor true si el objeto es una lista.

** `$util.isMap(Object) : Boolean` **  
Devuelve el valor true si el objeto es un mapa.

## CloudWatch utilidades de registro
<a name="utility-helpers-in-logging"></a>

### CloudWatch lista de utilidades de registro
<a name="utility-helpers-in-cloudwatch-logs"></a>

**`$util.log.info(Object) : Void`**  
Registra la representación en cadena del objeto proporcionado en el flujo de registro solicitado cuando el registro a nivel de solicitud y de campo está habilitado a nivel CloudWatch de registro o en una `ALL` API`INFO`. `DEBUG`

**`$util.log.info(String, Object...) : Void`**  
Registra la representación en cadena de los objetos proporcionados en el flujo de registro solicitado cuando el registro a nivel de solicitud y de campo está habilitado con el nivel de CloudWatch registro en una API. `ALL` Esta utilidad reemplazará todas las variables indicadas con "\$1\$1" en la primera cadena de formato de entrada por la representación de cadena de los objetos proporcionados en orden.

**`$util.log.debug(Object) : Void`**  
Registra la representación en cadena del objeto proporcionado en el flujo de registro solicitado cuando el registro a nivel de solicitud y de campo está habilitado a nivel de CloudWatch registro o en una API. `ALL` `DEBUG`

**`$util.log.debug(String, Object...) : Void`**  
Registra la representación en cadena de los objetos proporcionados en el flujo de registro solicitado cuando el registro a nivel de campo está habilitado con el nivel de CloudWatch registro `DEBUG` o el nivel de registro en una API. `ALL` Esta utilidad reemplazará todas las variables indicadas con "\$1\$1" en la primera cadena de formato de entrada por la representación de cadena de los objetos proporcionados en orden.

**`$util.log.error(Object) : Void`**  
Registra la representación en cadena del objeto proporcionado en el flujo de registro solicitado cuando el CloudWatch registro a nivel de campo está habilitado con **cualquier** nivel de registro (`ALL`,, `INFO``DEBUG`, etc.) de una API.

**`$util.log.error(String, Object...) : Void`**  
Registra la representación en cadena de los objetos proporcionados en el flujo de registro solicitado cuando el registro a nivel de campo está habilitado con el nivel de CloudWatch registro `ERROR` o el nivel de registro en una API. `ALL` Esta utilidad reemplazará todas las variables indicadas con "\$1\$1" en la primera cadena de formato de entrada por la representación de cadena de los objetos proporcionados en orden.

## Utilidades de comportamiento del valor devuelto
<a name="utility-helpers-in-return-behavior"></a>

### Lista de utilidades de comportamiento del valor devuelto
<a name="utility-helpers-in-behavior-list"></a>

****`$util.qr()`** y `$util.quiet()` **  
Ejecuta una instrucción VTL y suprime el valor devuelto. Esto resulta útil para ejecutar métodos sin utilizar marcadores de posición temporales, por ejemplo para añadir elementos a un mapa. Por ejemplo:  

```
#set ($myMap = {})
#set($discard = $myMap.put("id", "first value"))
```
se convierte en:  

```
#set ($myMap = {})
$util.qr($myMap.put("id", "first value"))
```  
** `$util.escapeJavaScript(String) : String` **  
Devuelve la cadena de entrada como cadena de JavaScript escape.  
** `$util.urlEncode(String) : String` **  
Devuelve la cadena de entrada como una cadena `application/x-www-form-urlencoded` codificada.  
** `$util.urlDecode(String) : String` **  
Descodifica una cadena `application/x-www-form-urlencoded` codificada y la devuelve a su forma no codificada.  
** `$util.base64Encode( byte[] ) : String` **  
Codifica la entrada en una cadena codificada en base64.  
** `$util.base64Decode(String) : byte[]` **  
Descodifica los datos de una cadena codificada en base64.  
** `$util.parseJson(String) : Object` **  
Toma un elemento JSON en forma de cadena y devuelve una representación del resultado en forma de objeto.  
** `$util.toJson(Object) : String` **  
Toma un objeto y devuelve una representación JSON en forma de cadena de dicho objeto.  
** `$util.autoId() : String` **  
Devuelve un UUID de 128 bits generado de forma aleatoria.  
****`$util.autoUlid() : String`****  
Devuelve un ULID (identificador ordenable lexicográficamente único y universal) de 128 bits generado de forma aleatoria.  
****`$util.autoKsuid() : String`****  
Devuelve un KSUID (identificador único ordenable por K) de 128 bits generado de forma aleatoria codificado en base62 como una cadena con una longitud de 27.  
** `$util.unauthorized()` **  
Genera el código `Unauthorized` para el campo que se está resolviendo. Utilícela en las plantillas de mapeo de solicitudes o de respuestas para determinar si se debe permitir al intermediario que resuelva el campo.  
** `$util.error(String)` **  
Genera un error personalizado. Utilícela en las plantillas de mapeo de solicitudes o de respuestas para detectar un error en la solicitud o en el resultado de la invocación.  
** `$util.error(String, String)` **  
Genera un error personalizado. Utilícela en las plantillas de mapeo de solicitudes o de respuestas para detectar un error en la solicitud o en el resultado de la invocación. También puede especificar un `errorType`.  
** `$util.error(String, String, Object)` **  
Genera un error personalizado. Utilícela en las plantillas de mapeo de solicitudes o de respuestas para detectar un error en la solicitud o en el resultado de la invocación. También puede especificar un campo `errorType` y `data`. El valor de `data` se añadirá al bloque `error` correspondiente dentro de `errors` en la respuesta de GraphQL. **Nota**: `data` se filtrará en función de la selección de consulta establecida.  
** `$util.error(String, String, Object, Object)` **  
Genera un error personalizado. Se puede utilizar en las plantillas de mapeo de solicitud o de respuesta si la plantilla detecta un error en la solicitud o en el resultado de la invocación. También se puede especificar un campo `errorType`, un campo `data` y un campo `errorInfo`. El valor de `data` se añadirá al bloque `error` correspondiente dentro de `errors` en la respuesta de GraphQL. **Nota**: `data` se filtrará en función de la selección de consulta establecida. El valor de `errorInfo` se añadirá al bloque `error` correspondiente dentro de `errors` en la respuesta de GraphQL. **Nota**: `errorInfo` **NO** se filtrará en función de la selección de consulta establecida.  
** `$util.appendError(String)` **  
Adjunta un error personalizado. Se puede utilizar en las plantillas de mapeo de solicitud o de respuesta si la plantilla detecta un error en la solicitud o en el resultado de la invocación. A diferencia de `$util.error(String)`, la evaluación de la plantilla no se interrumpirá, de modo podrán devolverse datos al intermediario.  
** `$util.appendError(String, String)` **  
Adjunta un error personalizado. Se puede utilizar en las plantillas de mapeo de solicitud o de respuesta si la plantilla detecta un error en la solicitud o en el resultado de la invocación. También se puede especificar un valor `errorType`. A diferencia de `$util.error(String, String)`, la evaluación de la plantilla no se interrumpirá, de modo podrán devolverse datos al intermediario.  
** `$util.appendError(String, String, Object)` **  
Adjunta un error personalizado. Se puede utilizar en las plantillas de mapeo de solicitud o de respuesta si la plantilla detecta un error en la solicitud o en el resultado de la invocación. También se puede especificar un valor `errorType` y un campo `data`. A diferencia de `$util.error(String, String, Object)`, la evaluación de la plantilla no se interrumpirá, de modo podrán devolverse datos al intermediario. El valor de `data` se añadirá al bloque `error` correspondiente dentro de `errors` en la respuesta de GraphQL. **Nota**: `data` se filtrará en función de la selección de consulta establecida.  
** `$util.appendError(String, String, Object, Object)` **  
Adjunta un error personalizado. Se puede utilizar en las plantillas de mapeo de solicitud o de respuesta si la plantilla detecta un error en la solicitud o en el resultado de la invocación. También se puede especificar un campo `errorType`, un campo `data` y un campo `errorInfo`. A diferencia de `$util.error(String, String, Object, Object)`, la evaluación de la plantilla no se interrumpirá, de modo podrán devolverse datos al intermediario. El valor de `data` se añadirá al bloque `error` correspondiente dentro de `errors` en la respuesta de GraphQL. **Nota**: `data` se filtrará en función de la selección de consulta establecida. El valor de `errorInfo` se añadirá al bloque `error` correspondiente dentro de `errors` en la respuesta de GraphQL. **Nota**: `errorInfo` **NO** se filtrará en función de la selección de consulta establecida.  
** `$util.validate(Boolean, String) : void` **  
Si la condición es falsa, lanza a CustomTemplateException con el mensaje especificado.  
** `$util.validate(Boolean, String, String) : void` **  
Si la condición es falsa, lanza un CustomTemplateException con el mensaje y el tipo de error especificados.  
** `$util.validate(Boolean, String, String, Object) : void` **  
Si la condición es falsa, arroja a CustomTemplateException con el mensaje y el tipo de error especificados, así como los datos que desee devolver en la respuesta.  
** `$util.isNull(Object) : Boolean` **  
Devuelve el valor true si el objeto suministrado es nulo.  
** `$util.isNullOrEmpty(String) : Boolean` **  
Devuelve el valor true si los datos proporcionados son nulos o una cadena vacía. De lo contrario, devuelve el valor false.  
** `$util.isNullOrBlank(String) : Boolean` **  
Devuelve el valor true si los datos proporcionados son nulos o una cadena en blanco. De lo contrario, devuelve el valor false.  
** `$util.defaultIfNull(Object, Object) : Object` **  
Devuelve el primer objeto si no es nulo. De lo contrario devuelve el segundo objeto como "objeto predeterminado".  
** `$util.defaultIfNullOrEmpty(String, String) : String` **  
Devuelve la primera cadena si no es nula ni está vacía. De lo contrario devuelve la segunda cadena como "cadena predeterminada".  
** `$util.defaultIfNullOrBlank(String, String) : String` **  
Devuelve la primera cadena si no es nula ni está en blanco. De lo contrario devuelve la segunda cadena como "cadena predeterminada".  
** `$util.isString(Object) : Boolean` **  
Devuelve el valor true si el objeto es una cadena.  
** `$util.isNumber(Object) : Boolean` **  
Devuelve el valor true si el objeto es un número.  
** `$util.isBoolean(Object) : Boolean` **  
Devuelve el valor true si el objeto es un valor booleano.  
** `$util.isList(Object) : Boolean` **  
Devuelve el valor true si el objeto es una lista.  
** `$util.isMap(Object) : Boolean` **  
Devuelve el valor true si el objeto es un mapa.  
** `$util.typeOf(Object) : String` **  
Devuelve una cadena que describe el tipo de objeto. Las identificaciones de tipos admitidas son: "Null", "Number", "String", "Map", "List" y "Boolean". Si no puede identificarse un tipo, el tipo devuelto es "Object".  
** `$util.matches(String, String) : Boolean` **  
Devuelve un valor true si el patrón especificado en el primer argumento coincide con los datos proporcionados en el segundo argumento. El patrón tiene que ser una expresión regular, por ejemplo `$util.matches("a*b", "aaaaab")`. La funcionalidad se basa en [Pattern](https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html), que puede consultar para obtener más información.  
** `$util.authType() : String` **  
Devuelve una cadena que describe el tipo de autenticación múltiple que utiliza una solicitud y devuelve "Autorización de IAM", "Autorización del grupo de usuarios", "Autorización de Open ID Connect" o "Autorización de la clave de API".  
****`$util.log.info(Object) : Void`****  
Registra la representación en cadena del objeto proporcionado en el flujo de registro solicitado cuando el registro a nivel de solicitud y de campo está habilitado con el nivel de CloudWatch registro en una API. `ALL`  
****`$util.log.info(String, Object...) : Void`****  
Registra la representación en cadena de los objetos proporcionados en el flujo de registro solicitado cuando el registro a nivel de solicitud y de campo está habilitado con el nivel de CloudWatch registro en una API. `ALL` Esta utilidad reemplazará todas las variables indicadas con "\$1\$1" en la primera cadena de formato de entrada por la representación de cadena de los objetos proporcionados en orden.  
****`$util.log.error(Object) : Void`****  
Registra la representación en cadena del objeto proporcionado en el flujo de registro solicitado cuando el registro a nivel de campo está habilitado con el nivel de CloudWatch registro `ERROR` o el nivel de registro en una API. `ALL`  
****`$util.log.error(String, Object...) : Void`****  
Registra la representación en cadena de los objetos proporcionados en el flujo de registro solicitado cuando el registro a nivel de campo está habilitado con el nivel de CloudWatch registro `ERROR` o el nivel de registro en una API. `ALL` Esta utilidad reemplazará todas las variables indicadas con "\$1\$1" en la primera cadena de formato de entrada por la representación de cadena de los objetos proporcionados en orden.

** `$util.escapeJavaScript(String) : String` **  
Devuelve la cadena de entrada como cadena de JavaScript escape.

## Autorización del solucionador
<a name="utility-helpers-in-resolver-auth"></a>

### Lista de autorizaciones del solucionador
<a name="utility-helpers-in-resolver-auth-list"></a>

** `$util.unauthorized()` **  
Genera el código `Unauthorized` para el campo que se está resolviendo. Utilícela en las plantillas de mapeo de solicitudes o de respuestas para determinar si se debe permitir al intermediario que resuelva el campo.

# AWS AppSync directivas
<a name="aws-appsync-directives"></a>

**nota**  
Ahora admitimos de forma básica el tiempo de ejecución APPSYNC\$1JS y su documentación. Considere la opción de utilizar el tiempo de ejecución APPSYNC\$1JS y sus guías [aquí](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-js-version.html).

AWS AppSync expone directivas para facilitar la productividad de los desarrolladores al escribir en VTL.

## Utilidades de directiva
<a name="utility-helpers-in-directives"></a>

****`#return(Object)`****  
`#return(Object)` permite volver de forma prematura de cualquier plantilla de mapeo. `#return(Object)` es análoga a la palabra clave *return* (volver) en los lenguajes de programación, ya que volverá del bloque de lógica del ámbito más cercano. Al utilizar `#return(Object)` dentro de una plantilla de mapeo de solucionador volverá desde el solucionador. Además, al usar `#return(Object)` desde una plantilla de mapeo de función volverá desde la función y continuará la ejecución a la siguiente función de la plantilla de mapeo de respuestas de solucionador o canalización.

****`#return`****  
La directiva `#return` exhibe los mismos comportamientos que `#return(Object)`, pero se devolverá `null` en su lugar.

# Aplicaciones auxiliares de tiempo en \$1util.time
<a name="time-helpers-in-util-time"></a>

**nota**  
Ahora admitimos de forma básica el tiempo de ejecución APPSYNC\$1JS y su documentación. Considere la opción de utilizar el tiempo de ejecución APPSYNC\$1JS y sus guías [aquí](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-js-version.html).

La variable `$util.time` contiene métodos de fecha y hora útiles para ayudar a generar marcas de tiempo, convertir entre formatos de fecha y hora y analizar cadenas de fecha y hora. La sintaxis de los formatos de fecha y hora se basa en ella y puede [DateTimeFormatter](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html)consultarla para obtener más documentación. A continuación se ofrecen algunos ejemplos, así como una lista de métodos disponibles y sus descripciones.

## Utilidades de tiempo
<a name="utility-helpers-in-time"></a>

### Lista de utilidades de tiempo
<a name="utility-helpers-in-time-list"></a>

** `$util.time.nowISO8601() : String` **  
[Devuelve una representación en cadena de UTC en ISO8601 formato String.](https://en.wikipedia.org/wiki/ISO_8601)

** `$util.time.nowEpochSeconds() : long` **  
Devuelve el número de segundos desde la fecha de inicio de 1970-01-01T00:00:00Z hasta ahora.

** `$util.time.nowEpochMilliSeconds() : long` **  
Devuelve el número de milisegundos desde la fecha de inicio de 1970-01-01T00:00:00Z hasta ahora.

** `$util.time.nowFormatted(String) : String` **  
Devuelve una cadena con la marca de tiempo actual en UTC utilizando el formato especificado en un tipo de entrada String.

** `$util.time.nowFormatted(String, String) : String` **  
Devuelve una cadena con la marca de tiempo actual de una zona horaria utilizando el formato y la zona horaria especificados en tipos de entrada String.

** `$util.time.parseFormattedToEpochMilliSeconds(String, String) : Long` **  
Analiza una marca de tiempo pasada como cadena junto con un formato que contiene una zona horaria y, a continuación, la devuelve como milisegundos transcurridos desde la fecha de inicio.

** `$util.time.parseFormattedToEpochMilliSeconds(String, String, String) : Long` **  
Analiza una marca de tiempo pasada como cadena junto con un formato y una zona horaria y, a continuación, la devuelve como milisegundos transcurridos desde la fecha de inicio.

** `$util.time.parseISO8601ToEpochMilliSeconds(String) : Long` **  
Analiza una ISO8601 marca de tiempo pasada como cadena y, a continuación, devuelve la marca de tiempo en milisegundos desde la época.

** `$util.time.epochMilliSecondsToSeconds(long) : long` **  
Convierte una marca de tiempo en milisegundos desde la fecha de inicio en una marca de tiempo en segundos de la fecha de inicio.

** `$util.time.epochMilliSecondsToISO8601(long) : String` **  
Convierte una marca de tiempo de milisegundos de época en una marca de tiempo. ISO8601

** `$util.time.epochMilliSecondsToFormatted(long, String) : String` **  
Convierte una marca de tiempo en milisegundos desde la fecha de inicio, pasada como tipo long, en una marca de tiempo UTC con el formato suministrado.

** `$util.time.epochMilliSecondsToFormatted(long, String, String) : String` **  
Convierte una marca de tiempo en milisegundos desde la fecha de inicio, pasada como tipo long, en una marca de tiempo para la zona horaria y con el formato suministrados.

## Ejemplos de funciones independientes
<a name="standalone-function-examples"></a>

```
$util.time.nowISO8601()                                            : 2018-02-06T19:01:35.749Z
$util.time.nowEpochSeconds()                                       : 1517943695
$util.time.nowEpochMilliSeconds()                                  : 1517943695750
$util.time.nowFormatted("yyyy-MM-dd HH:mm:ssZ")                    : 2018-02-06 19:01:35+0000
$util.time.nowFormatted("yyyy-MM-dd HH:mm:ssZ", "+08:00")          : 2018-02-07 03:01:35+0800
$util.time.nowFormatted("yyyy-MM-dd HH:mm:ssZ", "Australia/Perth") : 2018-02-07 03:01:35+0800
```

## Ejemplos de conversión
<a name="conversion-examples"></a>

```
#set( $nowEpochMillis = 1517943695758 )
$util.time.epochMilliSecondsToSeconds($nowEpochMillis)                                     : 1517943695
$util.time.epochMilliSecondsToISO8601($nowEpochMillis)                                     : 2018-02-06T19:01:35.758Z
$util.time.epochMilliSecondsToFormatted($nowEpochMillis, "yyyy-MM-dd HH:mm:ssZ")           : 2018-02-06 19:01:35+0000
$util.time.epochMilliSecondsToFormatted($nowEpochMillis, "yyyy-MM-dd HH:mm:ssZ", "+08:00") : 2018-02-07 03:01:35+0800
```

## Ejemplos de análisis
<a name="parsing-examples"></a>

```
$util.time.parseISO8601ToEpochMilliSeconds("2018-02-01T17:21:05.180+08:00")                          : 1517476865180
$util.time.parseFormattedToEpochMilliSeconds("2018-02-02 01:19:22+0800", "yyyy-MM-dd HH:mm:ssZ")     : 1517505562000
$util.time.parseFormattedToEpochMilliSeconds("2018-02-02 01:19:22", "yyyy-MM-dd HH:mm:ss", "+08:00") : 1517505562000
```

## AWS AppSync Uso con escalares definidos
<a name="usage-with-aws-scalars"></a>

Los siguientes formatos son compatibles con `AWSDate`, `AWSDateTime` y `AWSTime`.

```
$util.time.nowFormatted("yyyy-MM-dd[XXX]", "-07:00:30")               : 2018-07-11-07:00
$util.time.nowFormatted("yyyy-MM-dd'T'HH:mm:ss[XXXXX]", "-07:00:30")  : 2018-07-11T15:14:15-07:00:30
```

# Aplicaciones auxiliares de lista en \$1util.list
<a name="list-helpers-in-util-list"></a>

**nota**  
Ahora admitimos de forma básica el tiempo de ejecución APPSYNC\$1JS y su documentación. Considere la opción de utilizar el tiempo de ejecución APPSYNC\$1JS y sus guías [aquí](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-js-version.html).

`$util.list` contiene métodos útiles para ayudar con operaciones de lista habituales, como eliminar o retener elementos de una lista para casos de uso de filtro.

## Utilidades de lista
<a name="utility-helpers-in-list-utils"></a>

** `$util.list.copyAndRetainAll(List, List) : List` **  
Hace una copia superficial de la lista suministrada en el primer argumento y retiene solo los elementos especificados en el segundo argumento, si están presentes. Todos los demás elementos se eliminan de la copia.

** `$util.list.copyAndRemoveAll(List, List) : List` **  
Hace una copia superficial de la lista suministrada en el primer argumento y elimina los elementos especificados en el segundo argumento, si están presentes. Todos los demás elementos se conservan en la copia.

** `$util.list.sortList(List, Boolean, String) : List` **  
Ordena una lista de objetos, que se proporciona en el primer argumento. Si el segundo argumento tiene el valor true, la lista se ordena de forma descendente; si el segundo argumento tiene el valor false, la lista se ordena de forma ascendente. El tercer argumento es el nombre de la cadena de la propiedad utilizada para ordenar una lista de objetos personalizados. Si se trata de una lista compuesta únicamente por los tipos String, Integer, Float o Double, el tercer argumento puede ser cualquier cadena aleatoria. Si no todos los objetos son de la misma clase, se devolverá la lista original. Solo se admiten aquellas listas con un máximo de 1000 objetos. A continuación se muestra un ejemplo del uso de esta utilidad:   

```
 INPUT:      $util.list.sortList([{"description":"youngest", "age":5},{"description":"middle", "age":45}, {"description":"oldest", "age":85}], false, "description")
 OUTPUT:     [{"description":"middle", "age":45}, {"description":"oldest", "age":85}, {"description":"youngest", "age":5}]
```

# Aplicaciones auxiliares de mapas en \$1util.map
<a name="utility-helpers-in-map"></a>

**nota**  
Ahora admitimos de forma básica el tiempo de ejecución APPSYNC\$1JS y su documentación. Considere la opción de utilizar el tiempo de ejecución APPSYNC\$1JS y sus guías [aquí](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-js-version.html).

 `$util.map` contiene métodos útiles para ayudar con operaciones de mapa habituales, como eliminar o retener elementos de un mapa para casos de uso de filtro.

## Utilidades de mapa
<a name="utility-helpers-in-map-list"></a>

** `$util.map.copyAndRetainAllKeys(Map, List) : Map` **  
Hace una copia superficial del primer mapa y retiene solo las claves especificadas en la lista, si están presentes. Todas las demás claves se eliminan de la copia.

** `$util.map.copyAndRemoveAllKeys(Map, List) : Map` **  
Hace una copia superficial del primer mapa y elimina todas las entradas cuyas claves se especifican en la lista, si están presentes. Todas las demás claves se conservan en la copia.

# Aplicaciones auxiliares de DynamoDB en \$1util.dynamodb
<a name="dynamodb-helpers-in-util-dynamodb"></a>

**nota**  
Ahora admitimos de forma básica el tiempo de ejecución APPSYNC\$1JS y su documentación. Considere la opción de utilizar el tiempo de ejecución APPSYNC\$1JS y sus guías [aquí](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-js-version.html).

`$util.dynamodb` contiene métodos auxiliares que facilitan la escritura y la lectura de datos en Amazon DynamoDB, como el mapeo y el formato automáticos de los tipos de datos. Estos métodos están diseñados para mapear automáticamente los tipos primitivos y las listas al formato de entrada de DynamoDB correspondiente, creando una estructura `Map` con el formato `{ "TYPE" : VALUE }`.

Por ejemplo, anteriormente, una plantilla de mapeo de solicitudes para crear un elemento nuevo en DynamoDB podía tener el siguiente aspecto:

```
{
    "version" : "2017-02-28",
    "operation" : "PutItem",
    "key": {
        "id" : { "S" : "$util.autoId()" }
    },
    "attributeValues" : {
         "title" : { "S" : $util.toJson($ctx.args.title) },
         "author" : { "S" : $util.toJson($ctx.args.author) },
         "version" : { "N", $util.toJson($ctx.args.version) }
    }
}
```

Si queríamos añadir campos al objeto teníamos que actualizar la consulta de GraphQL en el esquema, y también la plantilla de mapeo de solicitud. Sin embargo, ahora podemos reestructurar nuestra plantilla de mapeo de solicitudes para que recoja automáticamente los nuevos campos de nuestro esquema y los añada a DynamoDB con los tipos correctos:

```
{
    "version" : "2017-02-28",
    "operation" : "PutItem",
    "key": {
        "id" : $util.dynamodb.toDynamoDBJson($util.autoId())
    },
    "attributeValues" : $util.dynamodb.toMapValuesJson($ctx.args)
}
```

En el ejemplo anterior utilizamos la aplicación auxiliar `$util.dynamodb.toDynamoDBJson(...)` para que tome automáticamente el ID generado y lo convierta en la representación en DynamoDB de un atributo de cadena. A continuación, tomamos todos los argumentos, los convertimos en sus representaciones en DynamoDB y los incluimos en el campo `attributeValues` de la plantilla.

Cada aplicación auxiliar tiene dos versiones: una que devuelve un objeto (por ejemplo, `$util.dynamodb.toString(...)`) y otra que devuelve el objeto como una cadena JSON (por ejemplo, `$util.dynamodb.toStringJson(...)`). En el ejemplo anterior, utilizamos la versión que devuelve los datos como una cadena JSON. Si desea manipular el objeto antes de usarlo en la plantilla, puede elegir que se devuelva en un objeto en su lugar, como se muestra a continuación:

```
{
    "version" : "2017-02-28",
    "operation" : "PutItem",
    "key": {
        "id" : $util.dynamodb.toDynamoDBJson($util.autoId())
    },

    #set( $myFoo = $util.dynamodb.toMapValues($ctx.args) )
    #set( $myFoo.version = $util.dynamodb.toNumber(1) )
    #set( $myFoo.timestamp = $util.dynamodb.toString($util.time.nowISO8601()))

    "attributeValues" : $util.toJson($myFoo)
}
```

En el ejemplo anterior devolvemos los argumentos convertidos como un mapa en lugar de una cadena JSON y después añadimos los campos `version` y `timestamp` antes de incluirlos finalmente en el campo `attributeValues` de la plantilla mediante `$util.toJson(...)`.

La versión JSON de cada una de las aplicaciones auxiliares equivale a encapsular la versión que no es de JSON en `$util.toJson(...)`. Por ejemplo, las siguientes instrucciones son exactamente lo mismo:

```
$util.toStringJson("Hello, World!")
$util.toJson($util.toString("Hello, World!"))
```

## toDynamoDB
<a name="utility-helpers-in-toDynamoDB"></a>

### Lista de utilidades toDynamoDB
<a name="utility-helpers-in-toDynamoDB-list"></a>

** `$util.dynamodb.toDynamoDB(Object) : Map` **  
Herramienta de conversión general de objetos para DynamoDB que convierte objetos de entrada en la representación de DynamoDB correspondiente. Es algo inflexible en cuanto al modo en que representa algunos tipos: por ejemplo, utiliza listas ("L") en lugar de conjuntos ("SS", "NS" "BS"). Esto devuelve un objeto que describe el valor del atributo de DynamoDB.  
**Ejemplo de cadena**  

```
Input:      $util.dynamodb.toDynamoDB("foo")
Output:     { "S" : "foo" }
```
**Ejemplo de número**  

```
Input:      $util.dynamodb.toDynamoDB(12345)
Output:     { "N" : 12345 }
```
**Ejemplo de booleano**  

```
Input:      $util.dynamodb.toDynamoDB(true)
Output:     { "BOOL" : true }
```
**Ejemplo de lista**  

```
Input:      $util.dynamodb.toDynamoDB([ "foo", 123, { "bar" : "baz" } ])
Output:     {
               "L" : [
                   { "S" : "foo" },
                   { "N" : 123 },
                   {
                       "M" : {
                           "bar" : { "S" : "baz" }
                       }
                   }
               ]
           }
```
**Ejemplo de mapa**  

```
Input:      $util.dynamodb.toDynamoDB({ "foo": "bar", "baz" : 1234, "beep": [ "boop"] })
Output:     {
               "M" : {
                   "foo"  : { "S" : "bar" },
                   "baz"  : { "N" : 1234 },
                   "beep" : {
                       "L" : [
                           { "S" : "boop" }
                       ]
                   }
               }
           }
```

****`$util.dynamodb.toDynamoDBJson(Object) : String`** **  
Lo mismo que `$util.dynamodb.toDynamoDB(Object) : Map`, pero devuelve un valor de atributo de DynamoDB como cadena con codificación JSON.

## Utilidades toString
<a name="utility-helpers-in-toString"></a>

### Lista de utilidades toString
<a name="utility-helpers-in-toString-list"></a>

****`$util.dynamodb.toString(String) : String`** **  
Convierte una cadena de entrada al formato de cadena de DynamoDB. Esto devuelve un objeto que describe el valor del atributo de DynamoDB.  

```
Input:      $util.dynamodb.toString("foo")
Output:     { "S" : "foo" }
```

** `$util.dynamodb.toStringJson(String) : Map` **  
Lo mismo que `$util.dynamodb.toString(String) : String`, pero devuelve un valor de atributo de DynamoDB como cadena con codificación JSON.

** `$util.dynamodb.toStringSet(List<String>) : Map` **  
Convierte una lista con cadenas al formato de conjunto de cadenas de DynamoDB. Esto devuelve un objeto que describe el valor del atributo de DynamoDB.  

```
Input:      $util.dynamodb.toStringSet([ "foo", "bar", "baz" ])
Output:     { "SS" : [ "foo", "bar", "baz" ] }
```

** `$util.dynamodb.toStringSetJson(List<String>) : String` **  
Lo mismo que `$util.dynamodb.toStringSet(List<String>) : Map`, pero devuelve un valor de atributo de DynamoDB como cadena con codificación JSON.

## Utilidades toNumber
<a name="utility-helpers-in-toNumber"></a>

### Lista de utilidades toNumber
<a name="utility-helpers-in-toNumber-list"></a>

** `$util.dynamodb.toNumber(Number) : Map` **  
Convierte un número al formato de número de DynamoDB. Esto devuelve un objeto que describe el valor del atributo de DynamoDB.  

```
Input:      $util.dynamodb.toNumber(12345)
Output:     { "N" : 12345 }
```

** `$util.dynamodb.toNumberJson(Number) : String` **  
Lo mismo que `$util.dynamodb.toNumber(Number) : Map`, pero devuelve un valor de atributo de DynamoDB como cadena con codificación JSON.

** `$util.dynamodb.toNumberSet(List<Number>) : Map` **  
Convierte una lista de números al formato de conjunto de números de DynamoDB. Esto devuelve un objeto que describe el valor del atributo de DynamoDB.  

```
Input:      $util.dynamodb.toNumberSet([ 1, 23, 4.56 ])
Output:     { "NS" : [ 1, 23, 4.56 ] }
```

** `$util.dynamodb.toNumberSetJson(List<Number>) : String` **  
Lo mismo que `$util.dynamodb.toNumberSet(List<Number>) : Map`, pero devuelve un valor de atributo de DynamoDB como cadena con codificación JSON.

## Utilidades toBinary
<a name="utility-helpers-in-toBinary"></a>

### Lista de utilidades toBinary
<a name="utility-helpers-in-toBinary-list"></a>

** `$util.dynamodb.toBinary(String) : Map` **  
Convierte datos binarios codificados como una cadena en base64 al formato binario de DynamoDB. Esto devuelve un objeto que describe el valor del atributo de DynamoDB.  

```
Input:      $util.dynamodb.toBinary("foo")
Output:     { "B" : "foo" }
```

** `$util.dynamodb.toBinaryJson(String) : String` **  
Lo mismo que `$util.dynamodb.toBinary(String) : Map`, pero devuelve un valor de atributo de DynamoDB como cadena con codificación JSON.

** `$util.dynamodb.toBinarySet(List<String>) : Map` **  
Convierte una lista de datos binarios codificados como cadenas en base64 al formato de conjunto binario de DynamoDB. Esto devuelve un objeto que describe el valor del atributo de DynamoDB.  

```
Input:      $util.dynamodb.toBinarySet([ "foo", "bar", "baz" ])
Output:     { "BS" : [ "foo", "bar", "baz" ] }
```

** `$util.dynamodb.toBinarySetJson(List<String>) : String` **  
Lo mismo que `$util.dynamodb.toBinarySet(List<String>) : Map`, pero devuelve un valor de atributo de DynamoDB como cadena con codificación JSON.

## Utilidades toBoolean
<a name="utility-helpers-in-toBoolean"></a>

### Lista de utilidades toBoolean
<a name="utility-helpers-in-toBoolean-list"></a>

** `$util.dynamodb.toBoolean(Boolean) : Map` **  
Convierte un valor booleano al formato booleano correspondiente de DynamoDB. Esto devuelve un objeto que describe el valor del atributo de DynamoDB.  

```
Input:      $util.dynamodb.toBoolean(true)
Output:     { "BOOL" : true }
```

** `$util.dynamodb.toBooleanJson(Boolean) : String` **  
Lo mismo que `$util.dynamodb.toBoolean(Boolean) : Map`, pero devuelve un valor de atributo de DynamoDB como cadena con codificación JSON.

## Utilidades toNull
<a name="utility-helpers-in-toNull"></a>

### Lista de utilidades toNull
<a name="utility-helpers-in-toNull-list"></a>

** `$util.dynamodb.toNull() : Map` **  
Devuelve un valor nulo con el formato nulo de DynamoDB. Esto devuelve un objeto que describe el valor del atributo de DynamoDB.  

```
Input:      $util.dynamodb.toNull()
Output:     { "NULL" : null }
```

** `$util.dynamodb.toNullJson() : String` **  
Lo mismo que `$util.dynamodb.toNull() : Map`, pero devuelve un valor de atributo de DynamoDB como cadena con codificación JSON.

## Utilidades toList
<a name="utility-helpers-in-toList"></a>

### Lista de utilidades toList
<a name="utility-helpers-in-toList-list"></a>

****`$util.dynamodb.toList(List) : Map`** **  
Convierte una lista de objetos al formato de lista de DynamoDB. Cada elemento de la lista se convierte también al formato correspondiente de DynamoDB. Es algo inflexible en cuanto al modo en que representa algunos objetos anidados: por ejemplo, utiliza listas ("L") en lugar de conjuntos ("SS", "NS" "BS"). Esto devuelve un objeto que describe el valor del atributo de DynamoDB.  

```
Input:      $util.dynamodb.toList([ "foo", 123, { "bar" : "baz" } ])
Output:     {
               "L" : [
                   { "S" : "foo" },
                   { "N" : 123 },
                   {
                       "M" : {
                           "bar" : { "S" : "baz" }
                       }
                   }
               ]
           }
```

** `$util.dynamodb.toListJson(List) : String` **  
Lo mismo que `$util.dynamodb.toList(List) : Map`, pero devuelve un valor de atributo de DynamoDB como cadena con codificación JSON.

## Utilidades toMap
<a name="utility-helpers-in-toMap"></a>

### Lista de utilidades toMap
<a name="utility-helpers-in-toMap-list"></a>

** `$util.dynamodb.toMap(Map) : Map` **  
Convierte un mapa al formato de mapa de DynamoDB. Cada valor del mapa se convierte también al formato de DynamoDB correspondiente. Es algo inflexible en cuanto al modo en que representa algunos objetos anidados: por ejemplo, utiliza listas ("L") en lugar de conjuntos ("SS", "NS" "BS"). Esto devuelve un objeto que describe el valor del atributo de DynamoDB.  

```
Input:      $util.dynamodb.toMap({ "foo": "bar", "baz" : 1234, "beep": [ "boop"] })
Output:     {
               "M" : {
                   "foo"  : { "S" : "bar" },
                   "baz"  : { "N" : 1234 },
                   "beep" : {
                       "L" : [
                           { "S" : "boop" }
                       ]
                   }
               }
           }
```

** `$util.dynamodb.toMapJson(Map) : String` **  
Lo mismo que `$util.dynamodb.toMap(Map) : Map`, pero devuelve un valor de atributo de DynamoDB como cadena con codificación JSON.

** `$util.dynamodb.toMapValues(Map) : Map` **  
Crea una copia del mapa en la que cada valor se convierte al formato correspondiente de DynamoDB. Es algo inflexible en cuanto al modo en que representa algunos objetos anidados: por ejemplo, utiliza listas ("L") en lugar de conjuntos ("SS", "NS" "BS").  

```
Input:      $util.dynamodb.toMapValues({ "foo": "bar", "baz" : 1234, "beep": [ "boop"] })
Output:     {
               "foo"  : { "S" : "bar" },
               "baz"  : { "N" : 1234 },
               "beep" : {
                   "L" : [
                       { "S" : "boop" }
                   ]
               }
           }
```
Esto es ligeramente diferente de `$util.dynamodb.toMap(Map) : Map`, ya que solo devuelve el contenido del valor de atributo de DynamoDB y no todo el valor de atributo en sí. Por ejemplo, las siguientes instrucciones son exactamente lo mismo:  

```
$util.dynamodb.toMapValues($map)
$util.dynamodb.toMap($map).get("M")
```

** `$util.dynamodb.toMapValuesJson(Map) : String` **  
Lo mismo que `$util.dynamodb.toMapValues(Map) : Map`, pero devuelve un valor de atributo de DynamoDB como cadena con codificación JSON.

## Utilidades S3Object
<a name="utility-helpers-in-S3Object"></a>

### Lista de utilidades S3Object
<a name="utility-helpers-in-S3Object-list"></a>

** `$util.dynamodb.toS3Object(String key, String bucket, String region) : Map` **  
Convierte la clave, el bucket y la región a la representación de objeto de S3 de DynamoDB. Esto devuelve un objeto que describe el valor del atributo de DynamoDB.  

```
Input:      $util.dynamodb.toS3Object("foo", "bar", region = "baz")
Output:     { "S" : "{ \"s3\" : { \"key\" : \"foo", \"bucket\" : \"bar", \"region\" : \"baz" } }" }
```

** `$util.dynamodb.toS3ObjectJson(String key, String bucket, String region) : String` **  
Lo mismo que `$util.dynamodb.toS3Object(String key, String bucket, String region) : Map`, pero devuelve un valor de atributo de DynamoDB como cadena con codificación JSON.

** `$util.dynamodb.toS3Object(String key, String bucket, String region, String version) : Map` **  
Convierte la clave, el bucket, la región y la versión opcional a la representación de objeto de S3 de DynamoDB. Esto devuelve un objeto que describe el valor del atributo de DynamoDB.  

```
Input:      $util.dynamodb.toS3Object("foo", "bar", "baz", "beep")
Output:     { "S" : "{ \"s3\" : { \"key\" : \"foo\", \"bucket\" : \"bar\", \"region\" : \"baz\", \"version\" = \"beep\" } }" }
```

** `$util.dynamodb.toS3ObjectJson(String key, String bucket, String region, String version) : String` **  
Lo mismo que `$util.dynamodb.toS3Object(String key, String bucket, String region, String version) : Map`, pero devuelve un valor de atributo de DynamoDB como cadena con codificación JSON.

** `$util.dynamodb.fromS3ObjectJson(String) : Map` **  
Acepta el valor de cadena de un objeto de S3 de DynamoDB y devuelve un mapa que contiene la clave, el bucket, la región y la versión opcional.  

```
Input:      $util.dynamodb.fromS3ObjectJson({ "S" : "{ \"s3\" : { \"key\" : \"foo\", \"bucket\" : \"bar\", \"region\" : \"baz\", \"version\" = \"beep\" } }" })
Output:     { "key" : "foo", "bucket" : "bar", "region" : "baz", "version" : "beep" }
```

# Auxiliares de Amazon RDS en \$1util.rds
<a name="rds-helpers-in-util-rds"></a>

**nota**  
Ahora admitimos de forma básica el tiempo de ejecución APPSYNC\$1JS y su documentación. Considere la opción de utilizar el tiempo de ejecución APPSYNC\$1JS y sus guías [aquí](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-js-version.html).

`$util.rds` contiene métodos auxiliares que dan formato a las operaciones de Amazon RDS al eliminar los datos extraños de los resultados.

## Lista de utilidades \$1util.rds
<a name="rds-helpers-in-util-rds-list"></a>

****`$util.rds.toJsonString(String serializedSQLResult): String`****  
Devuelve una `String` transformando el formato de resultado de la operación de API de datos de Amazon Relational Database Service (Amazon RDS) sin procesar stringified en una cadena más concisa. La cadena de devolución es una lista de registros de SQL en serie del conjunto de resultados. Cada registro se representa como un conjunto de pares clave-valor. Las claves son los nombres de columna correspondientes.  
Si la instrucción correspondiente en la entrada era una consulta SQL que causa una mutación (por ejemplo INSERT, UPDATE, DELETE), se devolverá una lista vacía. Por ejemplo, la consulta `select * from Books limit 2` proporciona el resultado sin procesar de la operación de datos de Amazon RDS:  

```
{
    "sqlStatementResults": [
        {
            "numberOfRecordsUpdated": 0,
            "records": [
                [
                    {
                        "stringValue": "Mark Twain"
                    },
                    {
                        "stringValue": "Adventures of Huckleberry Finn"
                    },
                    {
                        "stringValue": "978-1948132817"
                    }
                ],
                [
                    {
                        "stringValue": "Jack London"
                    },
                    {
                        "stringValue": "The Call of the Wild"
                    },
                    {
                        "stringValue": "978-1948132275"
                    }
                  ]
            ],
            "columnMetadata": [
                {
                    "isSigned": false,
                    "isCurrency": false,
                    "label": "author",
                    "precision": 200,
                    "typeName": "VARCHAR",
                    "scale": 0,
                    "isAutoIncrement": false,
                    "isCaseSensitive": false,
                    "schemaName": "",
                    "tableName": "Books",
                    "type": 12,
                    "nullable": 0,
                    "arrayBaseColumnType": 0,
                    "name": "author"
                },
                {
                    "isSigned": false,
                    "isCurrency": false,
                    "label": "title",
                    "precision": 200,
                    "typeName": "VARCHAR",
                    "scale": 0,
                    "isAutoIncrement": false,
                    "isCaseSensitive": false,
                    "schemaName": "",
                    "tableName": "Books",
                    "type": 12,
                    "nullable": 0,
                    "arrayBaseColumnType": 0,
                    "name": "title"
                },
                {
                    "isSigned": false,
                    "isCurrency": false,
                    "label": "ISBN-13",
                    "precision": 15,
                    "typeName": "VARCHAR",
                    "scale": 0,
                    "isAutoIncrement": false,
                    "isCaseSensitive": false,
                    "schemaName": "",
                    "tableName": "Books",
                    "type": 12,
                    "nullable": 0,
                    "arrayBaseColumnType": 0,
                    "name": "ISBN-13"
                }
            ]
        }
    ]
}
```
El valor de `util.rds.toJsonString` es:  

```
[
  {
    "author": "Mark Twain",
    "title": "Adventures of Huckleberry Finn",
    "ISBN-13": "978-1948132817"
  },
  {
    "author": "Jack London",
    "title": "The Call of the Wild",
    "ISBN-13": "978-1948132275"
  },
]
```

****`$util.rds.toJsonObject(String serializedSQLResult): Object`****  
Es igual que `util.rds.toJsonString`, pero el resultado es un `Object` JSON.

# Aplicaciones auxiliares para HTTP en \$1util.http
<a name="http-helpers-in-utils-http"></a>

**nota**  
Ahora admitimos de forma básica el tiempo de ejecución APPSYNC\$1JS y su documentación. Considere la opción de utilizar el tiempo de ejecución APPSYNC\$1JS y sus guías [aquí](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-js-version.html).

La utilidad `$util.http` proporciona métodos auxiliares que puede utilizar para gestionar parámetros de solicitud HTTP y añadir encabezados de respuesta.

## Lista de utilidades \$1util.http
<a name="http-helpers-in-utils-http-list"></a>

** `$util.http.copyHeaders(Map) : Map` **  
Copia los encabezados del mapa, excluidos los siguientes encabezados HTTP restringidos:  
+ transfer-encoding
+ connection
+ host
+ expect
+ keep-alive
+ upgrade
+ proxy-authenticate
+ proxy-authorization
+ te
+ content-length
Esta utilidad se puede usar para reenviar encabezados de solicitud al siguiente punto de conexión HTTP.  

```
{
    ...
    "params": {
        ...
        "headers": $util.http.copyHeaders($ctx.request.headers),
        ...
    },
    ...
}
```

**\$1util.http. addResponseHeader(Cadena, objeto)**  
Añade un único encabezado personalizado con el nombre (`String`) y el valor (`Object`) de la respuesta. Se aplican las siguientes restricciones:  
+ Además de la lista de encabezados restringidos para `copyHeaders(Map)`, los nombres del encabezado no pueden coincidir con ninguno de los siguientes:
  + Access-Control-Allow-Credentials
  + Access-Control-Allow-Origin
  + Access-Control-Expose-Headers
  + Access-Control-Max-Age
  + Access-Control-Allow-Methods
  + Access-Control-Allow-Headers
  + Vary
  + Content-Type
+ Los nombres del encabezado no pueden comenzar por los prefijos restringidos `x-amzn-` o `x-amz-`.
+ El tamaño de los encabezados de respuesta personalizada no puede superar los 4 KB. Esto incluye los nombres y valores del encabezado.
+ Debe definir cada encabezado de respuesta una vez por operación de GraphQL. Sin embargo, si define un encabezado personalizado con el mismo nombre varias veces, la definición más reciente aparecerá en la respuesta. Todos los encabezados se contabilizan para el límite de tamaño del encabezado independientemente de los nombres.
+ Los encabezados con un nombre vacío o restringido `(String)` o un valor nulo `(Object)` se ignorarán y generarán un error `ResponseHeaderError` que se agregará al resultado `errors` de la operación.

```
export function request(ctx) {
  util.http.addResponseHeader('itemsCount', 7)
  util.http.addResponseHeader('render', ctx.args.render)
  return {}
}
```

****`$util.http.addResponseHeaders(Map)`****  
Agrega varios encabezados de respuesta a la respuesta desde el mapa de nombres `(String)` y los valores `(Object)` especificados. Las mismas limitaciones enumeradas para el método `addResponseHeader(String, Object)` también se aplican a este método.  

```
export function request(ctx) {
  const headers = {
    headerInt: 12,
    headerString: 'stringValue',
    headerObject: {
      field1: 7,
      field2: 'string'
    }
  }
  util.http.addResponseHeaders(headers)
  return {}
}
```

# Aplicaciones auxiliares para XML en \$1util.xml
<a name="xml-helpers-in-utils-xml"></a>

**nota**  
Ahora admitimos de forma básica el tiempo de ejecución APPSYNC\$1JS y su documentación. Considere la opción de utilizar el tiempo de ejecución APPSYNC\$1JS y sus guías [aquí](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-js-version.html).

`$util.xml` contiene métodos auxiliares que facilitan la conversión de las respuestas XML a JSON o a un diccionario.

## Lista de utilidades \$1util.xml
<a name="xml-helpers-in-utils-xml-list"></a>

****`$util.xml.toMap(String) : Map`****  
Convierte una cadena XML a un diccionario.  

```
Input:

<?xml version="1.0" encoding="UTF-8"?>
<posts>
<post>
  <id>1</id>
  <title>Getting started with GraphQL</title>
</post>
</posts>

Output (JSON representation):

{
  "posts":{
    "post":{
      "id":1,
      "title":"Getting started with GraphQL"
    }
  }
}


Input:

<?xml version="1.0" encoding="UTF-8"?>
<posts>
<post>
  <id>1</id>
  <title>Getting started with GraphQL</title>
</post>
<post>
  <id>2</id>
  <title>Getting started with AWS AppSync</title>
</post>
</posts>

Output (JSON representation):

{
  "posts":{
    "post":[
        {
          "id":1,
          "title":"Getting started with GraphQL"
        },
        {
          "id":2,
          "title":"Getting started with AWS AppSync"
        }
    ]
  }
}
```

****`$util.xml.toJsonString(String) : String`****  
Convierte una cadena XML en una cadena JSON. Esto es similar a *toMap*, salvo que el resultado es una cadena. Esto resulta útil si se desea convertir directamente y devolver la respuesta XML de un objeto HTTP a JSON.

****`$util.xml.toJsonString(String, Boolean) : String`****  
Convierte una cadena XML en una cadena JSON con un parámetro booleano opcional para determinar si se desea codificar la cadena JSON.

# Aplicaciones auxiliares de transformación en \$1util.transform
<a name="transformation-helpers-in-utils-transform"></a>

**nota**  
Ahora admitimos de forma básica el tiempo de ejecución APPSYNC\$1JS y su documentación. Considere la opción de utilizar el tiempo de ejecución APPSYNC\$1JS y sus guías [aquí](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-js-version.html).

`$util.transform` contiene métodos auxiliares que facilitan las operaciones complejas sobre orígenes de datos, como las operaciones de filtro de Amazon DynamoDB.

## Aplicaciones auxiliares de transformación
<a name="transformation-helpers-conversions"></a>

### Lista de utilidades de aplicaciones auxiliares de transformación
<a name="transformation-helpers-in-utils-transform-list"></a>

****`$util.transform.toDynamoDBFilterExpression(Map) : Map`****  
Convierte una cadena de entrada en una expresión de filtro que puede usarse en DynamoDB.  

```
Input:

$util.transform.toDynamoDBFilterExpression({
    "title":{
      "contains":"Hello World"
    }
  })

Output:

{
    "expression" : "contains(#title, :title_contains)"
    "expressionNames" : {
        "#title" : "title",
    },
    "expressionValues" : {
        ":title_contains" : { "S" : "Hello World" }
    },
}
```

****`$util.transform.toElasticsearchQueryDSL(Map) : Map`****  
Convierte la entrada dada en su expresión de OpenSearch consulta DSL equivalente y la devuelve como una cadena JSON.  

```
Input:

$util.transform.toElasticsearchQueryDSL({
    "upvotes":{
        "ne":15,
        "range":[
            10,
            20
        ]
    },
    "title":{
        "eq":"hihihi",
        "wildcard":"h*i"
    }
  })

Output:
{
    "bool":{
      "must":[
          {
            "bool":{
              "must":[
                  {
                    "bool":{
                      "must_not":{
                        "term":{
                          "upvotes":15
                        }
                      }
                    }
                  },
                  {
                    "range":{
                      "upvotes":{
                        "gte":10,
                        "lte":20
                      }
                    }
                  }
              ]
            }
          },
          {
            "bool":{
              "must":[
                  {
                    "term":{
                      "title":"hihihi"
                    }
                  },
                  {
                  "wildcard":{
                      "title":"h*i"
                    }
                  }
              ]
            }
          }
      ]
    }
}
```
Se entiende que el operador predeterminado es AND.

## Filtros de suscripción de aplicaciones auxiliares de transformación
<a name="transformation-helpers-conversions-subscription-filters"></a>

### Lista de utilidades de filtros de suscripción de aplicaciones auxiliares de transformación
<a name="transformation-helpers-in-utils-transform-list"></a>

****`$util.transform.toSubscriptionFilter(Map) : Map`****  
Convierte un objeto de entrada `Map` en un objeto de expresión `SubscriptionFilter`. El método `$util.transform.toSubscriptionFilter` se utiliza como entrada a la extensión `$extensions.setSubscriptionFilter()`. Para obtener más información, consulte el artículo sobre [extensiones](https://docs.aws.amazon.com/appsync/latest/devguide/extensions).

****`$util.transform.toSubscriptionFilter(Map, List) : Map`****  
Convierte un objeto de entrada `Map` en un objeto de expresión `SubscriptionFilter`. El método `$util.transform.toSubscriptionFilter` se utiliza como entrada a la extensión `$extensions.setSubscriptionFilter()`. Para obtener más información, consulte el artículo sobre [extensiones](https://docs.aws.amazon.com/appsync/latest/devguide/extensions).  
El primer argumento es el objeto de entrada `Map` que se convierte en el objeto de expresión `SubscriptionFilter`. El segundo argumento es una `List` de nombres de campo que se omiten en el primer objeto de entrada `Map` al construir el objeto de expresión `SubscriptionFilter`.

****`$util.transform.toSubscriptionFilter(Map, List, Map) : Map`****  
Convierte un objeto de entrada `Map` en un objeto de expresión `SubscriptionFilter`. El método `$util.transform.toSubscriptionFilter` se utiliza como entrada a la extensión `$extensions.setSubscriptionFilter()`. Para obtener más información, consulte el artículo sobre [extensiones](https://docs.aws.amazon.com/appsync/latest/devguide/extensions).   
El primer argumento es el objeto de entrada `Map` que se convierte en el objeto de expresión `SubscriptionFilter`, el segundo argumento es una `List` de nombres de campo que se omitirán en el primer objeto de entrada `Map` y el tercer argumento es un objeto de entrada `Map` de reglas estrictas que se incluye al construir el objeto de expresión `SubscriptionFilter`. Estas reglas estrictas se incluyen en el objeto de expresión `SubscriptionFilter` de tal forma que se cumpla al menos una de las reglas para pasar el filtro de suscripción.

## Argumentos de filtro de suscripción
<a name="subscription-filter-arguments"></a>

En la siguiente tabla se explica cómo se definen los argumentos de las siguientes utilidades:
+ `$util.transform.toSubscriptionFilter(Map) : Map`
+ `$util.transform.toSubscriptionFilter(Map, List) : Map`
+ `$util.transform.toSubscriptionFilter(Map, List, Map) : Map`

------
#### [ Argument 1: Map ]

El argumento 1 es un objeto `Map` con los siguientes valores clave:
+ nombres de los campos
+ "and"
+ "or"

En el caso de los nombres de campo como claves, las condiciones de las entradas de estos campos adoptan la forma de `"operator" : "value"`. 

En el siguiente ejemplo se muestra cómo se pueden añadir entradas a `Map`:

```
"field_name" : {
                    "operator1" : value             
               }

## We can have multiple conditions for the same field_name: 

"field_name" : {
                    "operator1" : value             
                    "operator2" : value
                    .
                    .
                    .                  
               }
```

Cuando un campo tiene dos o más condiciones, se considera que todas estas condiciones utilizan la operación OR.

La entrada `Map` también puede tener "and" y "or" como claves, lo que implica que todas las entradas que incluyen deben unirse con la lógica AND u OR, según la clave. Los valores clave "and" y "or" esperan una matriz de condiciones.

```
"and" : [
            
            {
                "field_name1" : {
                    "operator1" : value             
                }
             },
             
             {
                "field_name2" : {
                    "operator1" : value             
                }
             },
             .
             .
        ].
```

Tenga en cuenta que puede anidar "and" y "or". Es decir, puede tener "and" y "or" anidados dentro de otro bloque "and" y "or". Sin embargo, no funciona para campos simples.

```
"and" : [
            
            {
                "field_name1" : {
                    "operator" : value             
                }
             },
             
             {
                "or" : [
                            {
                                "field_name2" : {
                                    "operator" : value             
                                }
                            },
                            
                            {
                                "field_name3" : {
                                    "operator" : value             
                                }
                            }
              
                        ].
```

En el siguiente ejemplo se muestra una entrada de *argumento 1* con `$util.transform.toSubscriptionFilter(Map) : Map`.

**Entradas**

Argumento 1: mapa:

```
{
  "percentageUp": {
    "lte": 50,
    "gte": 20
  },
  "and": [
    {
      "title": {
        "ne": "Book1"
      }
    },
    {
      "downvotes": {
        "gt": 2000
      }
    }
  ],
  "or": [
    {
      "author": {
        "eq": "Admin"
      }
    },
    {
      "isPublished": {
        "eq": false
      }
    }
  ]
}
```

**Salida**

El resultado es un objeto `Map`:

```
{
  "filterGroup": [
    {
      "filters": [
        {
          "fieldName": "percentageUp",
          "operator": "lte",
          "value": 50
        },
        {
          "fieldName": "title",
          "operator": "ne",
          "value": "Book1"
        },
        {
          "fieldName": "downvotes",
          "operator": "gt",
          "value": 2000
        },
        {
          "fieldName": "author",
          "operator": "eq",
          "value": "Admin"
        }
      ]
    },
    {
      "filters": [
        {
          "fieldName": "percentageUp",
          "operator": "lte",
          "value": 50
        },
        {
          "fieldName": "title",
          "operator": "ne",
          "value": "Book1"
        },
        {
          "fieldName": "downvotes",
          "operator": "gt",
          "value": 2000
        },
        {
          "fieldName": "isPublished",
          "operator": "eq",
          "value": false
        }
      ]
    },
    {
      "filters": [
        {
          "fieldName": "percentageUp",
          "operator": "gte",
          "value": 20
        },
        {
          "fieldName": "title",
          "operator": "ne",
          "value": "Book1"
        },
        {
          "fieldName": "downvotes",
          "operator": "gt",
          "value": 2000
        },
        {
          "fieldName": "author",
          "operator": "eq",
          "value": "Admin"
        }
      ]
    },
    {
      "filters": [
        {
          "fieldName": "percentageUp",
          "operator": "gte",
          "value": 20
        },
        {
          "fieldName": "title",
          "operator": "ne",
          "value": "Book1"
        },
        {
          "fieldName": "downvotes",
          "operator": "gt",
          "value": 2000
        },
        {
          "fieldName": "isPublished",
          "operator": "eq",
          "value": false
        }
      ]
    }
  ]
}
```

------
#### [ Argument 2: List ]

El argumento 2 contiene una `List` de nombres de campo que no deberían tenerse en cuenta en la entrada `Map` (argumento 1) al construir el objeto de expresión `SubscriptionFilter`. `List` también puede estar vacía.

En el siguiente ejemplo se muestran las entradas de argumento 1 y argumento 2 con `$util.transform.toSubscriptionFilter(Map, List) : Map`.

**Entradas**

Argumento 1: mapa:

```
{

  "percentageUp": {
    "lte": 50,
    "gte": 20
  },
  "and": [
    {
      "title": {
        "ne": "Book1"
      }
    },
    {
      "downvotes": {
        "gt": 20
      }
    }
  ],
  "or": [
    {
      "author": {
        "eq": "Admin"
      }
    },
    {
      "isPublished": {
        "eq": false
      }
    }
  ]
}
```

Argumento 2: lista:

```
["percentageUp", "author"]
```

**Salida**

El resultado es un objeto `Map`:

```
{
  "filterGroup": [
    {
      "filters": [
        {
          "fieldName": "title",
          "operator": "ne",
          "value": "Book1"
        },
        {
          "fieldName": "downvotes",
          "operator": "gt",
          "value": 20
        },
        {
          "fieldName": "isPublished",
          "operator": "eq",
          "value": false
        }
      ]
    }
  ]
}
```

------
#### [ Argument 3: Map ]

El argumento 3 es un objeto `Map` que tiene nombres de campo como valores clave (no puede tener "and" u "or"). En el caso de los nombres de campo como claves, las condiciones de estos campos son entradas en forma de `"operator" : "value"`. A diferencia del argumento 1, el argumento 3 no puede tener varias condiciones en la misma clave. Además, el argumento 3 no tiene una cláusula "and" u "or", por lo que tampoco hay anidamiento involucrado.

El argumento 3 representa una lista de reglas estrictas, que se añaden al objeto de expresión `SubscriptionFilter` para que se cumpla **al menos una** de estas condiciones para pasar el filtro.

```
{
  "fieldname1": {
    "operator": value
  },
  "fieldname2": {
    "operator": value
  }
}
.
.
.
```

En el siguiente ejemplo se muestran las entradas de *argumento 1*, *argumento 2* y *argumento 3* con `$util.transform.toSubscriptionFilter(Map, List, Map) : Map`.

**Entradas**

Argumento 1: mapa:

```
{
  "percentageUp": {
    "lte": 50,
    "gte": 20
  },
  "and": [
    {
      "title": {
        "ne": "Book1"
      }
    },
    {
      "downvotes": {
        "lt": 20
      }
    }
  ],
  "or": [
    {
      "author": {
        "eq": "Admin"
      }
    },
    {
      "isPublished": {
        "eq": false
      }
    }
  ]
}
```

Argumento 2: lista:

```
["percentageUp", "author"]
```

Argumento 3: mapa:

```
{
  "upvotes": {
    "gte": 250
  },
  "author": {
    "eq": "Person1"
  }
}
```

**Salida**

El resultado es un objeto `Map`:

```
{
  "filterGroup": [
    {
      "filters": [
        {
          "fieldName": "title",
          "operator": "ne",
          "value": "Book1"
        },
        {
          "fieldName": "downvotes",
          "operator": "gt",
          "value": 20
        },
        {
          "fieldName": "isPublished",
          "operator": "eq",
          "value": false
        },
        {
          "fieldName": "upvotes",
          "operator": "gte",
          "value": 250
        }
      ]
    },
    {
      "filters": [
        {
          "fieldName": "title",
          "operator": "ne",
          "value": "Book1"
        },
        {
          "fieldName": "downvotes",
          "operator": "gt",
          "value": 20
        },
        {
          "fieldName": "isPublished",
          "operator": "eq",
          "value": false
        },
        {
          "fieldName": "author",
          "operator": "eq",
          "value": "Person1"
        }
      ]
    }
  ]
}
```

------

# Aplicaciones auxiliares de matemáticas en \$1util.math
<a name="math-helpers-in-util-math"></a>

**nota**  
Ahora admitimos de forma básica el tiempo de ejecución APPSYNC\$1JS y su documentación. Considere la opción de utilizar el tiempo de ejecución APPSYNC\$1JS y sus guías [aquí](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-js-version.html).

 `$util.math` contiene métodos para ayudar con operaciones matemáticas comunes. 

## Lista de utilidades \$1util.math
<a name="math-helpers-in-util-math-list"></a>

** `$util.math.roundNum(Double) : Integer` **  
Toma un valor doble y lo redondea al entero más cercano. 

** `$util.math.minVal(Double, Double) : Double` **  
Toma dos dobles y devuelve el valor mínimo entre los dos dobles.

** `$util.math.maxVal(Double, Double) : Double` **  
Toma dos dobles y devuelve el valor máximo entre los dos dobles.

** `$util.math.randomDouble() : Double` **  
Devuelve un doble aleatorio entre 0 y 1.  
Esta función no debe usarse para nada que requiera un alto grado de aleatoriedad de entropía (por ejemplo, criptografía).

** `$util.math.randomWithinRange(Integer, Integer) : Integer` **  
Devuelve un valor entero aleatorio dentro del intervalo especificado. El primer argumento especifica el valor más bajo del intervalo y, el segundo argumento, el valor más alto.   
Esta función no debe usarse para nada que requiera un alto grado de aleatoriedad de entropía (por ejemplo, criptografía).

# Aplicaciones auxiliares de cadena en \$1util.str
<a name="str-helpers-in-util-str"></a>

**nota**  
Ahora admitimos de forma básica el tiempo de ejecución APPSYNC\$1JS y su documentación. Considere la opción de utilizar el tiempo de ejecución APPSYNC\$1JS y sus guías [aquí](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-js-version.html).

 `$util.str` contiene métodos para ayudar con operaciones de cadena comunes. 

## Lista de utilidades \$1util.str
<a name="str-helpers-in-util-str-list"></a>

** `$util.str.toUpper(String) : String` **  
Toma una cadena y la convierte para que esté completamente en mayúsculas. 

** `$util.str.toLower(String) : String` **  
Toma una cadena y la convierte para que esté completamente en minúsculas.

** `$util.str.toReplace(String, String, String) : String` **  
Sustituye una subcadena dentro de una cadena por otra cadena. El primer argumento especifica la cadena en la que se va a realizar la operación de sustitución. El segundo argumento especifica la subcadena que se va a sustituir. El tercer argumento especifica la cadena por la que se va a sustituir el segundo argumento. A continuación se muestra un ejemplo del uso de esta utilidad:   

```
 INPUT:      $util.str.toReplace("hello world", "hello", "mellow")
 OUTPUT:     "mellow world"
```

** `$util.str.normalize(String, String) : String` **  
Normaliza una cadena con uno de los cuatro formatos de normalización de Unicode: NFC, NFD, NFKC o NFKD. El primer argumento es la cadena que se va a normalizar. El segundo argumento es "nfc", "nfd", "nfkc" o "nfkd" y especifica el tipo de normalización que se utilizará en el proceso de normalización.

# Extensiones
<a name="extensions"></a>

**nota**  
Ahora admitimos de forma básica el tiempo de ejecución APPSYNC\$1JS y su documentación. Considere la opción de utilizar el tiempo de ejecución APPSYNC\$1JS y sus guías [aquí](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-js-version.html).

`$extensions` contiene un conjunto de métodos para realizar acciones adicionales en sus solucionadores.

## Almacenamiento en caché de extensiones
<a name="caching-extensions-list"></a>

**`$extensions.evictFromApiCache(String, String, Object) : Object`**  
Expulsa un elemento de la memoria caché del AWS AppSync servidor. El primer argumento es el nombre de tipo. El segundo argumento es el nombre de campo. El tercer argumento es un objeto que contiene elementos de pares clave-valor que especifican el valor clave de almacenamiento en caché. Debe colocar los elementos del objeto en el mismo orden que las claves de almacenamiento en caché del elemento `cachingKey` del solucionador almacenado en caché.  
Esta utilidad solo funciona para mutaciones, no para consultas.

## Extensiones de suscripción
<a name="subscription-extensions-list"></a>

**`$extensions.setSubscriptionFilter(filterJsonObject)`**  
Define filtros de suscripción mejorados. Cada evento de notificación de suscripción se evalúa con respecto a los filtros de suscripción proporcionados y envía notificaciones a los clientes si todos los filtros se evalúan como `true`. El argumento es `filterJsonObject`, tal y como se describe a la siguiente sección.  
Puede utilizar este método de extensión solo en las plantillas de mapeo de respuestas de un solucionador de suscripción.

**`$extensions.setSubscriptionInvalidationFilter(filterJsonObject)`**  
Define los filtros de invalidación de suscripciones. Los filtros de suscripción se evalúan con respecto a la carga de invalidación y, a continuación, invalidan una suscripción determinada si los filtros se evalúan como `true`. El argumento es `filterJsonObject`, tal y como se describe a la siguiente sección.  
Puede utilizar este método de extensión solo en las plantillas de mapeo de respuestas de un solucionador de suscripción.

**`$extensions.invalidateSubscriptions(invalidationJsonObject)`**  
Se utiliza para iniciar la invalidación de una suscripción a partir de una mutación. El argumento es `invalidationJsonObject`, tal y como se describe a la siguiente sección.  
Esta extensión solo se puede usar en las plantillas de mapeo de respuestas de los solucionadores de mutaciones.  
Solo puede usar como máximo cinco llamadas al método `$extensions.invalidateSubscriptions()` únicas en una sola solicitud. Si supera este límite, recibirá un error de GraphQL.

## Argumento: filterJsonObject
<a name="extensions-setSubscriptionInvalidationFilter"></a>

El objeto JSON define los filtros de suscripción o invalidación. Es una matriz de filtros en un `filterGroup`. Cada filtro es una colección de filtros individuales.

```
{
    "filterGroup": [
        {
           "filters" : [
                 {
                    "fieldName" : "userId",
                    "operator" : "eq",
                    "value" : 1
                }
           ]
           
        },
        {
           "filters" : [
                {
                    "fieldName" : "group",
                    "operator" : "in",
                    "value" : ["Admin", "Developer"]
                }
           ]
           
        }
    ]
}
```

Cada filtro tiene tres atributos: 
+ `fieldName`: campo de esquema de GraphQL.
+ `operator`: tipo de operador.
+ `value`: valores que se van a comparar con el valor `fieldName` de notificación de suscripción.

A continuación se muestra un ejemplo de asignación de estos atributos:

```
{
 "fieldName" : "severity",
 "operator" : "le",
 "value" : $context.result.severity
}
```

### Campo: fieldName
<a name="extensions-fieldName"></a>

El tipo de cadena `fieldName` hace referencia a un campo definido en el esquema de GraphQL que coincide con el `fieldName` en la carga útil de notificaciones de suscripción. Cuando se encuentra una coincidencia, el `value` del campo de esquema de GraphQL se compara con el `value` del filtro de notificaciones de suscripción. En el siguiente ejemplo, el filtro `fieldName` coincide con el campo `service` definido en un tipo de GraphQL determinado. Si la carga útil de notificaciones contiene un campo `service` con un `value` equivalente a `AWS AppSync`, el filtro se evalúa como `true`:

```
{
 "fieldName" : "service",
 "operator" : "eq",
 "value" : "AWS AppSync"
}
```

### Campo: valor
<a name="extensions-value"></a>

El valor puede ser de un tipo diferente según el operador:
+ Un solo número o booleano
  + Ejemplos de cadena: `"test"` y `"service"`
  + Ejemplos de número: `1`, `2` y `45.75`
  + Ejemplos de booleano: `true` y `false`
+ Pares de números o cadenas
  + Ejemplo de par de cadenas: `["test1","test2"]` y `["start","end"]`
  + Ejemplo de par de números: `[1,4]`, `[67,89]` y `[12.45, 95.45]`
+ Matrices de números o cadenas
  + Ejemplo de matriz de cadenas: `["test1","test2","test3","test4","test5"]`
  + Ejemplo de matriz de números: `[1,2,3,4,5]` y `[12.11,46.13,45.09,12.54,13.89]`

### Campo: operador
<a name="extensions-operator"></a>

Una cadena que distingue entre mayúsculas y minúsculas con los siguientes valores posibles: 


| 
| 
| Operador | Description (Descripción) | Tipos de valor posibles | 
| --- |--- |--- |
| eq | Igualdad | entero, flotante, cadena, booleano | 
| ne | Desigualdad | entero, flotante, cadena, booleano | 
| le | Menor que o igual a | entero, flotante, cadena | 
| lt | Menor que | entero, flotante, cadena | 
| edad | Mayor que o igual a | entero, flotante, cadena | 
| gt | Mayor que | entero, flotante, cadena | 
| contains | Comprueba si hay una subsecuencia o un valor en el conjunto. | entero, flotante, cadena | 
| no contiene | Comprueba la ausencia de una subsecuencia o la ausencia de un valor en el conjunto. | entero, flotante, cadena | 
| Empieza con | Comprueba si hay un prefijo. | cadena | 
| in | Comprueba si hay elementos coincidentes en la lista. | Matriz de números enteros, flotantes o cadenas | 
| notIn | Comprueba si hay elementos coincidentes que no están en la lista. | Matriz de números enteros, flotantes o cadenas | 
| entre | Entre dos valores | entero, flotante, cadena | 
| Contiene cualquier | Contiene elementos comunes | entero, flotante, cadena | 

En la siguiente tabla se describe la utilización de cada operador en la notificación de suscripción.

------
#### [ eq (equal) ]

El operador `eq` se evalúa como `true` si el valor del campo de notificación de suscripción coincide y es igual al valor del filtro de forma estricta. En el siguiente ejemplo, el filtro se evalúa como `true` si la notificación de suscripción tiene un campo `service` con el valor equivalente a `AWS AppSync`.

**Tipos de valor posibles:** entero, flotante, cadena y booleano

```
{
 "fieldName" : "service",
 "operator" : "eq",
 "value" : "AWS AppSync"
}
```

------
#### [ ne (not equal) ]

El operador `ne` se evalúa como `true` si el valor del campo de notificación de suscripción es diferente al valor del filtro. En el siguiente ejemplo, el filtro se evalúa como `true` si la notificación de suscripción tiene un campo `service` con un valor diferente a `AWS AppSync`.

**Tipos de valor posibles:** entero, flotante, cadena y booleano

```
{
 "fieldName" : "service",
 "operator" : "ne",
 "value" : "AWS AppSync"
}
```

------
#### [ le (less or equal) ]

El operador `le` se evalúa como `true` si el valor del campo de notificación de suscripción es inferior o igual al valor del filtro. En el siguiente ejemplo, el filtro se evalúa como `true` si la notificación de suscripción tiene un campo `size` con un valor inferior o igual a `5`.

**Tipos de valor posibles:** entero, flotante y cadena

```
{
 "fieldName" : "size",
 "operator" : "le",
 "value" : 5
}
```

------
#### [ lt (less than) ]

El operador `lt` se evalúa como `true` si el valor del campo de notificación de suscripción es inferior al valor del filtro. En el siguiente ejemplo, el filtro se evalúa como `true` si la notificación de suscripción tiene un campo `size` con un valor inferior a `5`.

**Tipos de valor posibles:** entero, flotante y cadena

```
{
 "fieldName" : "size",
 "operator" : "lt",
 "value" : 5
}
```

------
#### [ ge (greater or equal) ]

El operador `ge` se evalúa como `true` si el valor del campo de notificación de suscripción es superior o igual al valor del filtro. En el siguiente ejemplo, el filtro se evalúa como `true` si la notificación de suscripción tiene un campo `size` con un valor superior o igual a `5`.

**Tipos de valor posibles:** entero, flotante y cadena

```
{
 "fieldName" : "size",
 "operator" : "ge",
 "value" : 5
}
```

------
#### [ gt (greater than) ]

El operador `gt` se evalúa como `true` si el valor del campo de notificación de suscripción es superior al valor del filtro. En el siguiente ejemplo, el filtro se evalúa como `true` si la notificación de suscripción tiene un campo `size` con un valor superior a `5`.

**Tipos de valor posibles:** entero, flotante y cadena

```
{
 "fieldName" : "size",
 "operator" : "gt",
 "value" : 5
}
```

------
#### [ contains ]

El operador `contains` comprueba si hay una subcadena, una subsecuencia o un valor en un conjunto o un único elemento. Un filtro con el operador `contains` se evalúa como `true` si el valor del campo de notificación de suscripción contiene el valor del filtro. En el siguiente ejemplo, el filtro se evalúa como `true` si la notificación de suscripción tiene un campo `seats` con el valor de matriz que contiene el valor `10`.

**Tipos de valor posibles:** entero, flotante y cadena

```
{
 "fieldName" : "seats",
 "operator" : "contains",
 "value" : 10
}
```

En otro ejemplo, el filtro se evalúa como `true` si la notificación de suscripción tiene un campo `event` con `launch` como subcadena.

```
{
 "fieldName" : "event",
 "operator" : "contains",
 "value" : "launch"
}
```

------
#### [ notContains ]

El operador `notContains` busca la ausencia de una subcadena, una subsecuencia o un valor en un conjunto o un único elemento. El filtro con el operador `notContains` se evalúa como `true` si el valor del campo de notificación de suscripción no contiene el valor del filtro. En el siguiente ejemplo, el filtro se evalúa como `true` si la notificación de suscripción tiene un campo `seats` con el valor de matriz que no contiene el valor `10`.

**Tipos de valor posibles:** entero, flotante y cadena

```
{
 "fieldName" : "seats",
 "operator" : "notContains",
 "value" : 10
}
```

En otro ejemplo, el filtro se evalúa como `true` si la notificación de suscripción tiene un valor de campo `event` sin `launch` como su subsecuencia.

```
{
 "fieldName" : "event",
 "operator" : "notContains",
 "value" : "launch"
}
```

------
#### [ beginsWith ]

El operador `beginsWith` comprueba si hay un prefijo en una cadena. El filtro que contiene el operador `beginsWith` se evalúa como `true` si el valor del campo de notificación de suscripción comienza con el valor del filtro. En el siguiente ejemplo, el filtro se evalúa como `true` si la notificación de suscripción tiene un campo `service` con un valor que comienza con `AWS`.

**Tipo de valor posible:** cadena

```
{
 "fieldName" : "service",
 "operator" : "beginsWith",
 "value" : "AWS"
}
```

------
#### [ in ]

El operador `in` comprueba si hay elementos coincidentes en una matriz. El filtro que contiene el operador `in` se evalúa como `true` si el valor del campo de notificación de suscripción existe en una matriz. En el siguiente ejemplo, el filtro se evalúa como `true` si la notificación de suscripción tiene un campo `severity` con uno de los valores presentes en la matriz: `[1,2,3]`.

**Tipo de valor posible:** matriz de enteros, flotantes o cadenas

```
{
 "fieldName" : "severity",
 "operator" : "in",
 "value" : [1,2,3]
}
```

------
#### [ notIn ]

El operador `notIn` comprueba si faltan elementos en una matriz. El filtro que contiene el operador `notIn` se evalúa como `true` si el valor del campo de notificación de suscripción no existe en la matriz. En el siguiente ejemplo, el filtro se evalúa como `true` si la notificación de suscripción tiene un campo `severity` con uno de los valores no presentes en la matriz: `[1,2,3]`.

**Tipo de valor posible:** matriz de enteros, flotantes o cadenas

```
{
 "fieldName" : "severity",
 "operator" : "notIn",
 "value" : [1,2,3]
}
```

------
#### [ between ]

El operador `between` comprueba si hay valores entre dos números o cadenas. El filtro que contiene el operador `between` se evalúa como `true` si el valor del campo de notificación de suscripción se encuentra entre el par de valores del filtro. En el siguiente ejemplo, el filtro se evalúa como `true` si la notificación de suscripción tiene un campo `severity` con los valores `2`, `3` y `4`.

**Tipos de valor posibles:** par de enteros, flotantes o cadenas

```
{
 "fieldName" : "severity",
 "operator" : "between",
 "value" : [1,5]
}
```

------
#### [ containsAny ]

El operador `containsAny` comprueba si hay elementos en matrices. Un filtro con el operador `containsAny` se evalúa como `true` si la intersección del valor de conjunto de campos de notificación de suscripción y el valor de conjunto de filtros no está vacía. En el siguiente ejemplo, el filtro se evalúa como `true` si la notificación de suscripción tiene un campo `seats` con un valor de matriz que contiene `10` o `15`. Esto significa que el filtro se evaluaría como `true` si la notificación de suscripción tuviera un valor de campo `seats` de `[10,11]` o `[15,20,30]`.

**Tipos de valor posibles:** entero, flotante o cadena

```
{
 "fieldName" : "seats",
 "operator" : "containsAny",
 "value" : [10, 15]
}
```

------

### Lógica AND
<a name="extensions-AND-logic"></a>

Puede combinar varios filtros mediante la lógica AND definiendo varias entradas dentro del objeto `filters` de la matriz `filterGroup`. En el siguiente ejemplo, los filtros se evalúan como `true` si la notificación de suscripción tiene un campo `userId` con un valor equivalente a `1` Y un valor de campo `group` de `Admin` o `Developer`.

```
{
    "filterGroup": [
        {
           "filters" : [
                 {
                    "fieldName" : "userId",
                    "operator" : "eq",
                    "value" : 1
                },
                {
                    "fieldName" : "group",
                    "operator" : "in",
                    "value" : ["Admin", "Developer"]
                }
           ]
           
        }
    ]
}
```

### Lógica OR
<a name="extensions-OR-logic"></a>

Puede combinar varios filtros mediante la lógica OR definiendo varios objetos de filtro dentro de la matriz `filterGroup`. En el siguiente ejemplo, los filtros se evalúan como `true` si la notificación de suscripción tiene un campo `userId` con un valor equivalente a `1` O un valor de campo `group` de `Admin` o `Developer`.

```
{
    "filterGroup": [
        {
           "filters" : [
                 {
                    "fieldName" : "userId",
                    "operator" : "eq",
                    "value" : 1
                }
           ]
           
        },
        {
           "filters" : [
                {
                    "fieldName" : "group",
                    "operator" : "in",
                    "value" : ["Admin", "Developer"]
                }
           ]
           
        }
    ]
}
```

### Excepciones
<a name="extensions-exceptions"></a>

Tenga en cuenta que existen varias restricciones del uso de filtros:
+ En el objeto `filters`, puede haber un máximo de cinco elementos `fieldName` únicos por filtro. Esto significa que puede combinar un máximo de cinco objetos `fieldName` individuales mediante la lógica AND.
+ Puede haber un máximo de veinte valores para el operador `containsAny`.
+ Puede haber un máximo de cinco valores para los operadores `in` y `notIn`.
+ Cada cadena puede tener un máximo de 256 caracteres.
+ Cada comparación entre cadenas distingue entre mayúsculas y minúsculas.
+ El filtrado de objetos anidados permite hasta cinco niveles anidados de filtrado.
+ Cada `filterGroup` puede tener un máximo de 10 `filters`. Esto significa que puede combinar un máximo de 10 `filters` mediante la lógica OR.
  + El operador `in` es un caso especial de lógica OR. En el siguiente ejemplo, hay dos `filters`:

    ```
    {
        "filterGroup": [
            {
               "filters" : [
                     {
                        "fieldName" : "userId",
                        "operator" : "eq",
                        "value" : 1
                    },
                    {
                        "fieldName" : "group",
                        "operator" : "in",
                        "value" : ["Admin", "Developer"]
                    }
               ]  
            }
        ]
    }
    ```

    El grupo de filtros anterior se evalúa de la siguiente manera y cuenta para el límite máximo de filtros:

    ```
    {
        "filterGroup": [
            {
               "filters" : [
                     {
                        "fieldName" : "userId",
                        "operator" : "eq",
                        "value" : 1
                    },
                    {
                        "fieldName" : "group",
                        "operator" : "eq",
                        "value" : "Admin"
                    }
               ]  
            },
            {
               "filters" : [
                     {
                        "fieldName" : "userId",
                        "operator" : "eq",
                        "value" : 1
                    },
                    {
                        "fieldName" : "group",
                        "operator" : "eq",
                        "value" : "Developer"
                    }
               ]  
            }
        ]
    }
    ```

## Argumento: invalidationJsonObject
<a name="extensions-invalidationJsonObject"></a>

El `invalidationJsonObject` define lo siguiente:
+ `subscriptionField`: suscripción del esquema de GraphQL a invalidar. Se baraja la posibilidad de invalidar una suscripción única, definida como cadena en el `subscriptionField`.
+ `payload`: lista de pares clave-valor que se utiliza como entrada para la invalidación de suscripciones si el filtro de invalidación se evalúa como `true` en comparación con sus valores.

  En el siguiente ejemplo se invalida a los clientes suscritos y conectados que utilizan la suscripción `onUserDelete` cuando el filtro de invalidación definido en el solucionador de suscripción se evalúa como `true` en comparación con el valor `payload`.

  ```
  $extensions.invalidateSubscriptions({
          "subscriptionField": "onUserDelete",
          "payload": {
                  "group": "Developer"
                  "type" : "Full-Time"
        }
      })
  ```