Malí globální pomocníci: MAIN, REPO, FUNC, NOW, CLONE, COPY, QUERIFY a PROMISIFY
total5 vytváří několik globálních objektů pro vaše použití a několik helperů, které ušetří řádek kódu. Nic z toho nepotřebuje nastavení.
MAIN,REPOaFUNCjsou prázdné objekty, které framework vytvoří jednou: data aplikace držte vMAIN, jiná data vREPOa vlastní funkce veFUNC.TEMPje objekt pro dočasná data, který framework čas od času vymění, takže v něm nic nedržte, pokud to budete potřebovat později.NOWje aktuální datum jakoDate. Obnovuje se přibližně jednou za minutu (a některými voláními), takže když potřebujete přesný čas, použijtenew Date().EMPTYARRAYaEMPTYOBJECTjsou zmrazené prázdné hodnoty, které lze vrátit místo vytváření nových: nelze je změnit.MODSaPLUGINSjsou objekty s načtenými moduly a pluginy podle id.FaTotaljsou tentýž objekt, framework, aprintjeconsole.log.NOOPje funkce, která nedělá nic.REQUIRE(name)jerequire, který navíc řeší balíčky znode_modulesaplikace a přijímá názvy jakonode:path.CLONE(value)vytvoří hlubokou kopii: zkopírují se vnořené objekty, pole a data.COPY(from, to)zkopíruje vlastnosti prvního objektu do druhého a vrátí druhý.QUERIFY([url], object)sestaví query string z objektu: prázdné hodnoty anullse přeskočí a pole se stane hodnotou oddělenou čárkami. S url vrátíurl?..., bez ní vrátí?....PROMISIFY(fn, a, b, c)zavoláfn(a, b, c, callback)a vrátí promise, který se vyřeší odpovědí callbacku nebo zamítne jeho chybou.
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 });
}