Οι μικροί παγκόσμιοι βοηθούς: MAIN, REPO, FUNC, NOW, CLONE, COPY, QUERIFY και PROMISIFY
Το total5 δημιουργεί μερικά καθολικά αντικείμενα για δική σας χρήση και μερικούς helpers που γλιτώνουν μια γραμμή κώδικα. Τίποτα από αυτά δεν χρειάζεται ρύθμιση.
- Τα
MAIN,REPOκαιFUNCείναι κενά αντικείμενα που το framework δημιουργεί μία φορά: κρατήστε τα δεδομένα της εφαρμογής στοMAIN, άλλα δεδομένα στοREPOκαι τις δικές σας συναρτήσεις στοFUNC. ΤοTEMPείναι ένα αντικείμενο για προσωρινά δεδομένα που το framework αντικαθιστά κατά διαστήματα, οπότε μην κρατάτε σε αυτό κάτι που θα χρειαστείτε αργότερα. - Το
NOWείναι η τρέχουσα ημερομηνία ωςDate. Ανανεώνεται περίπου μία φορά το λεπτό (και από ορισμένες κλήσεις), οπότε χρησιμοποιήστε τοnew Date()όταν χρειάζεστε την ακριβή ώρα. - Τα
EMPTYARRAYκαιEMPTYOBJECTείναι παγωμένες κενές τιμές που μπορείτε να επιστρέψετε αντί να δημιουργήσετε νέες: δεν μπορούν να αλλάξουν. - Τα
MODSκαιPLUGINSείναι αντικείμενα με τις φορτωμένες ενότητες και τα 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 });
}