# A kis globális segédek: MAIN, REPO, FUNC, NOW, CLONE, COPY, QUERIFY és PROMISIFY

> Használja az alkalmazás globálok, dátumok, mély másolatok, lekérdezés vonalak és ígéretes segédek.

Framework: total5
Product: Total.js 5 (total5@0.0.19)
Language: hu
Content-SHA256: bc2708270da5c298ef987bd993f14c4b8d6fa90cae1d3bd146ffcebf54b8d7e4
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: total5-installed@total5@0.0.19
Review: not-recorded

A `total5` néhány globális objektumot hoz létre az Ön használatára, és néhány helpert, amely egy sornyi kódot megspórol. Egyik sem igényel beállítást.

- A `MAIN`, a `REPO` és a `FUNC` üres objektumok, amelyeket a framework egyszer hoz létre: az alkalmazás adatait a `MAIN`-ben, más adatokat a `REPO`-ban, a saját függvényeit a `FUNC`-ban tartsa. A `TEMP` ideiglenes adatok objektuma, amelyet a framework időnként lecserél, ezért ne tartson benne semmit, amire később szüksége lesz.
- A `NOW` az aktuális dátum `Date`-ként. Nagyjából percenként (és egyes hívásokkal) frissül, ezért pontos időhöz használja a `new Date()` hívást.
- Az `EMPTYARRAY` és az `EMPTYOBJECT` befagyasztott üres értékek, amelyeket új létrehozása helyett visszaadhat: nem módosíthatók.
- A `MODS` és a `PLUGINS` a betöltött modulokat és pluginokat tartalmazó objektumok id szerint. Az `F` és a `Total` ugyanaz az objektum, a framework, a `print` pedig a `console.log`. A `NOOP` egy függvény, amely nem csinál semmit.
- A `REQUIRE(name)` a `require`, amely az alkalmazás `node_modules` mappájából is feloldja a csomagokat, és elfogad olyan neveket, mint a `node:path`.
- A `CLONE(value)` mély másolatot készít: a beágyazott objektumokat, tömböket és dátumokat is másolja. A `COPY(from, to)` az első objektum tulajdonságait a másodikba másolja, és a másodikat adja vissza.
- A `QUERIFY([url], object)` egy objektumból query stringet épít: az üres értékeket és a `null`-t kihagyja, a tömb vesszővel elválasztott értékké válik. Url-lel `url?...`-t ad vissza, anélkül `?...`-t.
- A `PROMISIFY(fn, a, b, c)` meghívja a `fn(a, b, c, callback)` függvényt, és egy promise-t ad vissza, amely a callback válaszával teljesül vagy a hibájával elutasításra kerül.

```js 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 });
}
```
