De kleine wereldwijde assistenten: MAIN, REPO, FUNC, NOW, CLONE, COPY, QUERIFY en PROMISIFY
total5 maakt een paar globale objecten voor eigen gebruik en een paar helpers die een regel code besparen. Niets hiervan vraagt om configuratie.
MAIN,REPOenFUNCzijn lege objecten die het framework één keer maakt: bewaar applicatiegegevens inMAIN, andere gegevens inREPOen je eigen functies inFUNC.TEMPis een object voor tijdelijke gegevens dat het framework af en toe vervangt, bewaar er dus niets in dat je later nodig hebt.NOWis de huidige datum alsDate. Hij wordt ongeveer eens per minuut (en door sommige aanroepen) ververst, gebruik dusnew Date()als je de exacte tijd nodig hebt.EMPTYARRAYenEMPTYOBJECTzijn bevroren lege waarden die je kunt teruggeven in plaats van nieuwe te maken: ze kunnen niet worden gewijzigd.MODSenPLUGINSzijn objecten met de geladen modules en plugins op id.FenTotalzijn hetzelfde object, het framework, enprintisconsole.log.NOOPis een functie die niets doet.REQUIRE(name)isrequire, dat ook pakketten uit denode_modulesvan de applicatie oplost en namen alsnode:pathaccepteert.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 ennullworden overgeslagen en een array wordt een door komma's gescheiden waarde. Met een url geeft heturl?...terug, zonder?....PROMISIFY(fn, a, b, c)roeptfn(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.
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 });
}