# Construye un pipeline de procesamiento con transforms

> Registra varios pasos bajo un mismo nombre con NEWTRANSFORM() y haz pasar un valor por ellos en orden con TRANSFORM().

Framework: total5
Product: Total.js 5 (total5@0.0.19)
Language: es
Content-SHA256: 9816c6365f3b1a51f2c1c33cde34b9c2c9e16d38aa231d732e9d39a0a4899061
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: total5-installed@total5@0.0.19
Review: not-recorded

Un transform es una cadena de pasos con nombre. `NEWTRANSFORM(name, fn, [id])` añade un paso a la cadena `name`; los pasos se ejecutan en el orden en que se registraron, y cada uno recibe el objeto de opciones `$` y el valor actual. Cambia el valor con `$.value = ...` y llama a `$.next()` para continuar con el siguiente paso. `$.invalid(message)` añade un error. `TRANSFORM(name, value)` inicia la cadena y devuelve una promesa con el valor final; la promesa se rechaza cuando algún paso ha informado de un error. Con un callback en su lugar, `TRANSFORM(name, value, function(err, value) {})`. Un nombre sin ningún paso devuelve el valor tal cual.

Úsalo para el trabajo que debe poder ampliarse desde varios sitios, como limpiar un comentario antes de guardarlo: un filtro de spam, un recortador de espacios y un comprobador de enlaces pueden vivir cada uno en su propio archivo y añadirse o quitarse sin tocar el código que llama a `TRANSFORM()`. El `id` opcional permite quitar un paso más tarde con `NEWTRANSFORM(name, null, id)`.

```js definitions/transforms.js
NEWTRANSFORM('comment', function($, value) {
	$.value = value.trim();
	$.next();
}, 'trim');

NEWTRANSFORM('comment', function($, value) {
	if (/spam/i.test(value))
		$.invalid('Spam is not allowed');
	$.next();
}, 'spam');

NEWTRANSFORM('comment', function($, value) {
	$.value = value.replace(/\s+/g, ' ');
	$.next();
}, 'spaces');
```

```js controllers/comments.js
exports.install = function() {
	ROUTE('POST /comment/ @json', comment);
	ROUTE('DELETE /comment/spaces/', remove_step);
};

async function comment($) {
	try {
		var text = await TRANSFORM('comment', $.body.text);
		$.json({ text: text });
	} catch (err) {
		$.json({ error: true });
	}
}

function remove_step($) {
	NEWTRANSFORM('comment', null, 'spaces');
	$.success();
}
```
