Construye un pipeline de procesamiento con transforms
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).
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');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();
}