# Ajudantes de dados: QUERIFY, STRINGIFY, ENCRYPT, FN, CL, TRANSLATE, UNAUTHORIZED e Thelpers

> Construa cadeias de consulta, escreva JSON sem o que não quer, codifique um valor com uma chave, compile uma expressão, carregue listas de valores, traduza textos, verifique permissões e acrescente ajudantes aos modelos.

Framework: jcomponent20
Product: jComponent 20 (jcomponent@20)
Language: pt
Content-SHA256: 131cf44990bfc4f9cdeced140c4781cb9e0aa81b4985629376addac1e21f90a4
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: jcomponent20@3fedd009a277f50fddc608b97afbec553b67c51b
Review: not-recorded

- `QUERIFY([url], object)` constrói uma cadeia de consulta: os valores `null` são ignorados, os arrays são unidos por vírgulas, as datas passam a textos ISO e tudo é codificado. Com um url é acrescentada a ele (`?` ou `&`), também depois de um método como em `'POST /api/x'`.
- `STRINGIFY(object, [compress], [fields])` é `JSON.stringify()` com duas opções: `compress: true` omite textos vazios, `null` e `false`, e apara os textos; `fields` é uma lista dos nomes que se mantêm, uma função `(key, value)` que decide, ou um objeto em que `name: false` omite um campo.
- `ENCRYPT(value, [key], [type])` transforma um texto ou um objeto num texto hexadecimal que termina com uma verificação da chave, e `DECRYPT(text, [key], [type])` devolve o valor, ou `undefined` quando a chave ou o tipo não são iguais. **É uma ofuscação para o navegador, não segurança:** qualquer pessoa o pode ler sem a chave.
- `FN('n => n * 2')` compila uma expressão numa função e memoriza-a; sem `=>` o texto é o corpo e o argumento chama-se `value`.
- `NOOP`, `EMPTYARRAY` e `EMPTYOBJECT` (congelados: não se podem alterar por engano), `MONTHS` e `DAYS` (os nomes em inglês) e `NOW` (um `Date` que o jComponent mantém atualizado).
- **Listas de códigos:** `CLINIT(name, function(next) {}, [expire], [init])` regista uma lista que `function` carrega (chama `next(value)`; com um texto em vez de uma função, um endereço como `GET /api/countries/`). `CL('a,b', callback)` carrega as listas que não estão carregadas e guarda cada uma em `DEF.cl.<name>` (e no estado nesse caminho); `CLRELOAD(name, callback)` carrega-as de novo.
- **Tradução:** `LOCALIZE(text)` carrega um dicionário no formato dos ficheiros de recursos do Total.js (`key : translation`, um por linha, `//` para comentários) e `TRANSLATE(text)` substitui cada `@(text)` pela sua tradução (o mesmo texto quando não há nenhuma). A chave é `T` mais o `HASH()` do texto em base 36.
- `UNAUTHORIZED(...names)` devolve `false` quando `window.user` tem uma das permissões (`user.permissions` ou `user.roles`, uma lista ou um objeto) ou é `sa` / `su`, e `true` caso contrário (também quando não há utilizador).
- `Thelpers` (o mesmo objeto que `Tangular.helpers`, e `Ta` é `Tangular`) contém os ajudantes dos modelos: acrescente um com `Thelpers.name = function(value, ...arguments)`, onde `this` é o modelo, e use-o 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>
```
