# Ayudantes de datos: QUERIFY, STRINGIFY, ENCRYPT, FN, CL, TRANSLATE, UNAUTHORIZED y Thelpers

> Construye cadenas de consulta, escribe JSON sin lo que no quieres, codifica un valor con una clave, compila una expresión, carga listas de valores, traduce textos, comprueba permisos y añade ayudantes a las plantillas.

Framework: jcomponent20
Product: jComponent 20 (jcomponent@20)
Language: es
Content-SHA256: 42ef8e4e3bc3bb8f0f8e09978ebdba003c644b346fd8a07a725083312919c724
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: jcomponent20@3fedd009a277f50fddc608b97afbec553b67c51b
Review: not-recorded

- `QUERIFY([url], object)` construye una cadena de consulta: los valores `null` se omiten, los arrays se unen con comas, las fechas se convierten en textos ISO y todo se codifica. Con una url se añade a ella (`?` o `&`), también tras un método como en `'POST /api/x'`.
- `STRINGIFY(object, [compress], [fields])` es `JSON.stringify()` con dos opciones: `compress: true` omite textos vacíos, `null` y `false`, y recorta los textos; `fields` es una lista de los nombres que se conservan, una función `(key, value)` que decide, o un objeto donde `name: false` omite un campo.
- `ENCRYPT(value, [key], [type])` convierte un texto o un objeto en un texto hexadecimal que termina con una comprobación de la clave, y `DECRYPT(text, [key], [type])` devuelve el valor, o `undefined` cuando la clave o el tipo no coinciden. **Es una ofuscación para el navegador, no seguridad:** cualquiera puede leerlo sin la clave.
- `FN('n => n * 2')` compila una expresión en una función y la recuerda; sin `=>` el texto es el cuerpo y el argumento se llama `value`.
- `NOOP`, `EMPTYARRAY` y `EMPTYOBJECT` (congelados: no se pueden cambiar por error), `MONTHS` y `DAYS` (los nombres en inglés) y `NOW` (un `Date` que jComponent mantiene actualizado).
- **Listas de códigos:** `CLINIT(name, function(next) {}, [expire], [init])` registra una lista que `function` carga (llama a `next(value)`; con un texto en lugar de una función, una dirección como `GET /api/countries/`). `CL('a,b', callback)` carga las listas que no están cargadas y guarda cada una en `DEF.cl.<name>` (y en el estado en esa ruta); `CLRELOAD(name, callback)` las carga de nuevo.
- **Traducción:** `LOCALIZE(text)` carga un diccionario en el formato de los archivos de recursos de Total.js (`key : translation`, uno por línea, `//` para comentarios) y `TRANSLATE(text)` reemplaza cada `@(text)` por su traducción (el mismo texto cuando no hay ninguna). La clave es `T` más el `HASH()` del texto en base 36.
- `UNAUTHORIZED(...names)` devuelve `false` cuando `window.user` tiene uno de los permisos (`user.permissions` o `user.roles`, una lista o un objeto) o es `sa` / `su`, y `true` en caso contrario (también cuando no hay usuario).
- `Thelpers` (el mismo objeto que `Tangular.helpers`, y `Ta` es `Tangular`) contiene los ayudantes de las plantillas: añade uno con `Thelpers.name = function(value, ...arguments)`, donde `this` es el modelo, y úsalo como `{{ value | name(argument) }}`.

```html public/index.html
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8" />
	<title>jComponent</title>
	<link rel="stylesheet" href="//cdn.componentator.com/spa.min@20.css" />
	<script src="//cdn.componentator.com/spa.min@20.js"></script>
</head>
<body>
	<p class="out"></p>
</body>
</html>
```
