ForgeTotal.js 5
nl

Total.js 5

De kleine wereldwijde assistenten: MAIN, REPO, FUNC, NOW, CLONE, COPY, QUERIFY en PROMISIFY

Total.js 5 · total5@0.0.19 globalsutilitieshelpers Uitgevoerd met Total.js 5

total5 maakt een paar globale objecten voor eigen gebruik en een paar helpers die een regel code besparen. Niets hiervan vraagt om configuratie.

  • MAIN, REPO en FUNC zijn lege objecten die het framework één keer maakt: bewaar applicatiegegevens in MAIN, andere gegevens in REPO en je eigen functies in FUNC. TEMP is een object voor tijdelijke gegevens dat het framework af en toe vervangt, bewaar er dus niets in dat je later nodig hebt.
  • NOW is de huidige datum als Date. Hij wordt ongeveer eens per minuut (en door sommige aanroepen) ververst, gebruik dus new Date() als je de exacte tijd nodig hebt.
  • EMPTYARRAY en EMPTYOBJECT zijn bevroren lege waarden die je kunt teruggeven in plaats van nieuwe te maken: ze kunnen niet worden gewijzigd.
  • MODS en PLUGINS zijn objecten met de geladen modules en plugins op id. F en Total zijn hetzelfde object, het framework, en print is console.log. NOOP is een functie die niets doet.
  • REQUIRE(name) is require, dat ook pakketten uit de node_modules van de applicatie oplost en namen als node:path accepteert.
  • CLONE(value) maakt een diepe kopie: geneste objecten, arrays en datums worden gekopieerd. COPY(from, to) kopieert de eigenschappen van het eerste object naar het tweede en geeft het tweede terug.
  • QUERIFY([url], object) bouwt een query string uit een object: lege waarden en null worden overgeslagen en een array wordt een door komma's gescheiden waarde. Met een url geeft het url?... terug, zonder ?....
  • PROMISIFY(fn, a, b, c) roept fn(a, b, c, callback) aan en geeft een promise terug die wordt opgelost met het antwoord van de callback of wordt afgewezen met zijn fout.
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 });
}