ForgeTotal.js 5
es

Total.js 5

Los pequeños asistentes globales: MAIN, REPO, FUNC, NOW, CLONE, COPY, QUERIFY y PROMISIFY

Total.js 5 · total5@0.0.19 globalsutilitieshelpers Ejecutada con Total.js 5

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, REPO y FUNC son objetos vacíos que el framework crea una vez: guarda los datos de la aplicación en MAIN, otros datos en REPO y tus propias funciones en FUNC. TEMP es 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.
  • NOW es la fecha actual como Date. Se actualiza aproximadamente una vez por minuto (y con algunas llamadas), así que usa new Date() cuando necesites la hora exacta.
  • EMPTYARRAY y EMPTYOBJECT son valores vacíos congelados para devolver en lugar de crear nuevos: no se pueden modificar.
  • MODS y PLUGINS son objetos con los módulos y plugins cargados por id. F y Total son el mismo objeto, el framework, y print es console.log. NOOP es una función que no hace nada.
  • REQUIRE(name) es require, que además resuelve paquetes desde el node_modules de la aplicación y acepta nombres como node: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 y null se omiten y un array se convierte en un valor separado por comas. Con una url devuelve url?..., sin ella devuelve ?....
  • PROMISIFY(fn, a, b, c) llama a fn(a, b, c, callback) y devuelve una promesa que se resuelve con la respuesta del callback o se rechaza con su error.
controllers/helpers.js
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 });
}