Малките глобални помощници: MAIN, REPO, FUNC, NOW, CLONE, COPY, QUERIFY и PROMISIFY
total5 създава няколко глобални обекта за ваша употреба и няколко помощници, които спестяват един ред код. Нищо от това не изисква настройка.
MAIN,REPOиFUNCса празни обекти, които frameworkът създава веднъж: пазете данните на приложението вMAIN, други данни вREPOи собствените си функции въвFUNC.TEMPе обект за временни данни, който frameworkът подменя от време на време, така че не пазете в него нищо, от което ще имате нужда по-късно.NOWе текущата дата катоDate. Обновява се приблизително веднъж на минута (и от някои извиквания), така че използвайтеnew Date(), когато ви трябва точното време.EMPTYARRAYиEMPTYOBJECTса замразени празни стойности, които можете да върнете вместо да създавате нови: не могат да се променят.MODSиPLUGINSса обекти със заредените модули и плъгини по id.FиTotalса един и същ обект, frameworkът, аprintеconsole.log.NOOPе функция, която не прави нищо.REQUIRE(name)еrequire, който също разрешава пакети отnode_modulesна приложението и приема имена катоnode:path.CLONE(value)прави дълбоко копие: вложените обекти, масиви и дати се копират.COPY(from, to)копира свойствата на първия обект във втория и връща втория.QUERIFY([url], object)изгражда query string от обект: празните стойности иnullсе пропускат, а масивът става стойност, разделена със запетаи. С url връщаurl?..., без него връща?....PROMISIFY(fn, a, b, c)извикваfn(a, b, c, callback)и връща promise, който се изпълнява с отговора на callback или се отхвърля с неговата грешка.
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 });
}