Los pequeños asistentes globales: MAIN, REPO, FUNC, NOW, CLONE, COPY, QUERIFY y PROMISIFY
total5 crea unos pocos objetos globales para tu uso y unos pocos helpers que ahorran una línea de código. Nada de esto necesita configuración.
MAIN,REPOyFUNCson objetos vacíos que el framework crea una vez: guarda los datos de la aplicación enMAIN, otros datos enREPOy tus propias funciones enFUNC.TEMPes un objeto para datos temporales que el framework sustituye de vez en cuando, así que no guardes en él nada que necesites más tarde.NOWes la fecha actual comoDate. Se actualiza aproximadamente una vez por minuto (y con algunas llamadas), así que usanew Date()cuando necesites la hora exacta.EMPTYARRAYyEMPTYOBJECTson valores vacíos congelados para devolver en lugar de crear nuevos: no se pueden modificar.MODSyPLUGINSson objetos con los módulos y plugins cargados por id.FyTotalson el mismo objeto, el framework, yprintesconsole.log.NOOPes una función que no hace nada.REQUIRE(name)esrequire, que además resuelve paquetes desde elnode_modulesde la aplicación y acepta nombres comonode:path.CLONE(value)hace una copia profunda: se copian objetos anidados, arrays y fechas.COPY(from, to)copia las propiedades del primer objeto en el segundo y devuelve el segundo.QUERIFY([url], object)construye una query string a partir de un objeto: los valores vacíos ynullse omiten y un array se convierte en un valor separado por comas. Con una url devuelveurl?..., sin ella devuelve?....PROMISIFY(fn, a, b, c)llama afn(a, b, c, callback)y devuelve una promesa que se resuelve con la respuesta del callback o se rechaza con su error.
MAIN.started = 'yes';
REPO.counter = 1;
FUNC.double = n => n * 2;
exports.install = function() {
ROUTE('GET /helpers/', helpers);
ROUTE('GET /promisify/', promisify);
};
function helpers($) {
const source = { a: 1, nested: { b: [1, 2] }, date: new Date(2026, 0, 5) };
const cloned = CLONE(source);
const target = { x: 1 };
const returned = COPY({ y: 2 }, target);
$.json({
shared: [MAIN.started, REPO.counter, FUNC.double(4), typeof TEMP],
now: [NOW instanceof Date, Math.abs(Date.now() - NOW.getTime()) < 120000],
emptyarray: [EMPTYARRAY.length, Object.isFrozen(EMPTYARRAY)],
emptyobject: [Object.keys(EMPTYOBJECT).length, Object.isFrozen(EMPTYOBJECT)],
registries: [typeof MODS, typeof PLUGINS],
same: [F === Total, typeof print, NOOP() === undefined],
require: typeof REQUIRE('node:path').join,
clone: [cloned !== source, cloned.nested !== source.nested, cloned.nested.b !== source.nested.b, cloned.date instanceof Date, cloned.nested.b.join()],
copy: [returned === target, target.x, target.y],
querify: QUERIFY('/search/', { q: 'a b', page: 2, empty: '', nothing: null, list: [1, 2] }),
querify2: QUERIFY({ q: 'x' })
});
}
async function promisify($) {
const add = (a, b, callback) => setImmediate(callback, null, a + b);
const fail = (callback) => setImmediate(callback, 'It failed');
const sum = await PROMISIFY(add, 2, 3);
let error = null;
try {
await PROMISIFY(fail);
} catch (e) {
error = e.message || String(e);
}
$.json({ sum: sum, error: error });
}