Małymi globalnymi pomocnikami: MAIN, REPO, FUNC, NOW, CLONE, COPY, QUERIFY i PROMISIFY
total5 tworzy kilka globalnych obiektów do Twojego użytku i kilka helperów, które oszczędzają linijkę kodu. Nic z tego nie wymaga konfiguracji.
MAIN,REPOiFUNCto puste obiekty, które framework tworzy raz: dane aplikacji trzymaj wMAIN, inne dane wREPO, a własne funkcje weFUNC.TEMPto obiekt na dane tymczasowe, który framework co jakiś czas wymienia, więc nie trzymaj w nim niczego, czego będziesz potrzebować później.NOWto bieżąca data jakoDate. Odświeża się mniej więcej raz na minutę (i przez niektóre wywołania), więc użyjnew Date(), gdy potrzebujesz dokładnego czasu.EMPTYARRAYiEMPTYOBJECTto zamrożone puste wartości, które można zwracać zamiast tworzyć nowe: nie da się ich zmienić.MODSiPLUGINSto obiekty z załadowanymi modułami i pluginami według id.FiTotalto ten sam obiekt, framework, aprinttoconsole.log.NOOPto funkcja, która nic nie robi.REQUIRE(name)torequire, który dodatkowo rozwiązuje pakiety znode_modulesaplikacji i przyjmuje nazwy takie jaknode:path.CLONE(value)robi głęboką kopię: zagnieżdżone obiekty, tablice i daty są kopiowane.COPY(from, to)kopiuje właściwości pierwszego obiektu do drugiego i zwraca drugi.QUERIFY([url], object)buduje query string z obiektu: puste wartości inullsą pomijane, a tablica staje się wartością rozdzieloną przecinkami. Z adresem url zwracaurl?..., bez niego zwraca?....PROMISIFY(fn, a, b, c)wywołujefn(a, b, c, callback)i zwraca obietnicę, która rozwiązuje się odpowiedzią callbacku albo jest odrzucana jego błędem.
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 });
}