ForgeTotal.js 5
el

Total.js 5

Οι μικροί παγκόσμιοι βοηθούς: MAIN, REPO, FUNC, NOW, CLONE, COPY, QUERIFY και PROMISIFY

Total.js 5 · total5@0.0.19 globalsutilitieshelpers Εκτελέστηκε με το Total.js 5

Το 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 ή απορρίπτεται με το σφάλμα του.
controllers/helpers.js
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 });
}