De små globala hjälparna: MAIN, REPO, FUNC, NOW, CLONE, COPY, QUERIFY och PROMISIFY
total5 skapar några globala objekt för eget bruk och några hjälpare som sparar en kodrad. Inget av detta kräver någon konfiguration.
MAIN,REPOochFUNCär tomma objekt som ramverket skapar en gång: behåll applikationsdata iMAIN, andra data iREPOoch dina egna funktioner iFUNC.TEMPär ett objekt för temporära data som ramverket byter ut då och då, så behåll inget i det som du behöver senare.NOWär aktuellt datum somDate. Det uppdateras ungefär en gång i minuten (och av vissa anrop), så användnew Date()när du behöver den exakta tiden.EMPTYARRAYochEMPTYOBJECTär frysta tomma värden att returnera i stället för att skapa nya: de kan inte ändras.MODSochPLUGINSär objekt med de laddade modulerna och pluginsen efter id.FochTotalär samma objekt, ramverket, ochprintärconsole.log.NOOPär en funktion som inte gör något.REQUIRE(name)ärrequiresom också löser paket från applikationensnode_modulesoch accepterar namn somnode:path.CLONE(value)gör en djup kopia: nästlade objekt, arrayer och datum kopieras.COPY(from, to)kopierar egenskaperna i det första objektet till det andra och returnerar det andra.QUERIFY([url], object)bygger en query string från ett objekt: tomma värden ochnullhoppas över och en array blir ett kommaseparerat värde. Med en url returnerar denurl?..., utan returnerar den?....PROMISIFY(fn, a, b, c)anroparfn(a, b, c, callback)och returnerar ett löfte som löses med callbackens svar eller avvisas med dess fel.
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 });
}