# Хранилището с компоненти на Flow: 146 компонента, каталогът и тестерът

> Разходка из totaljs/flowstreamcomponents, компонентите с отворен код на Flow: какви групи покрива, как се генерира db.json, как Flow зарежда каталога и как да тествате компонент с включения тестер.

Framework: flow
Product: Flow (flow@11.1)
Language: bg
Content-SHA256: 3b31e6b145e0cd3f7a99e903959392e82c8f0e13ab395543f8ff9d1c8ec70fd6
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: 
Review: not-recorded

[`totaljs/flowstreamcomponents`](https://github.com/totaljs/flowstreamcomponents) съдържа компонентите с отворен код, които предлага редакторът на Flow. В документираната тук ревизия (`e34d283`) има **146 компонента** в `components/`, 32 по-стари в `archived/`, генератора на каталога (`db.js`), самия каталог (`db.json`) и тестер.

## Какво покрива каталогът

Компонентите са организирани в групи. Някои от по-големите:

| Група | Компоненти (примери) |
|---|---|
| Common (40) | `delay`, `print`, `counter`, `switch`, `merge`, `code`, `request`, `throttle`, `transform`, `macro`, `modify`, `stringoperations` |
| Total.js (17) | `taction`, `troute`, `tschema`, `tcors`, `tresponse`, `tauthtoken`, `twebsocketroute`, `tuploadedfiles`, `tsql`, `querybuilderpg` |
| Total.js API Services (13) | `tapiocrapi`, `tapigeoipapi`, `tapiweatherapi`, `tapismsapi`, `tapichatgptapi`, `tapiinvoiceparserapi`, `tapicheckvatapi`, `tapiprintapi` |
| Databases (8) | `postgresql`, `mysql`, `sqlite3`, `mongodb-query`, `mongodb-insert`, `influxdb`, `nosql`, `localstorage` |
| Triggers (7) | `timer`, `trigger`, `crontab`, `minutely`, `notify` |
| Files (6) | `filewriter`, `filewatcher`, `fileswatcher`, `fsrename`, `fstouch`, `fsunlink` |
| Flow, FlowStream, Stats, Checks, Security... | `debug`, `flowstats`, `input`, `output`, `publish`, `subscribe`, `stopwatch`, `checkurl`, `checklog`, `checkfreespace`, `totp`, `iplimiter` |
| MQTT, AI, Ollama | `mqtt-broker`, `mqtt-publish`, `mqtt-subscribe`, `aiagent`, `aitool`, `aicontext`, `chatgpt`, `ollamaprompt`, `ollamals`, `ollamawebsearch` |

Освен това има компоненти за анализ (`xmlparser`, `dataparser`, `csvdataset`, `cheerio`), дати и часови зони (`date`, `timezone`, `duration`), текст и шаблони (`tangular`, `qrcode`), OAuth2 (`oauth2`), изтегляния (`downloader`, `urldownload`), известия (`sms`, `rssreader`, `openweather`, `googlesearch`) и хардуера на Linux (`nvidiasmi`). Папката `archived/` пази за справка по-старото поколение на семейството (GPIO и I2C на Raspberry Pi, RabbitMQ, системни метрики).

## Как ги намира Flow: `db.json`

Flow не изтегля HTML на всеки компонент. Той изтегля **каталог**, JSON файл (по подразбиране `https://cdn.totaljs.com/flowstream/webcomponents/db.json`, задава се в [настройките](/en/flow/settings-and-files/)) с по един запис за компонент:

```json
{
  "id": "taction",
  "group": "Total.js",
  "name": "Action",
  "url": "https://cdn.totaljs.com/flowstream/webcomponents/taction.html",
  "author": "Peter Širka | Total.js",
  "icon": "ti ti-totaljs",
  "color": "",
  "version": "2",
  "kind": "",
  "readme": "This component creates similar functionality as Total.js Actions. ..."
}
```

Редакторът показва списъка с `readme` и изтегля `url` на компонента, когато го добавите. За да предлагате собствени компоненти до официалните, публикувайте своите HTML файлове и собствен `db.json` и запишете адреса му в настройката `components2`.

`db.js` генерира каталога: чете всеки файл от `components/`, взема `group`, `name`, `author`, `icon`, `color`, `version` и `kind` от неговите `exports`, взема текста от `<readme>`, изгражда `url` в CDN и записва `db.json`, подреден по име. Изпълнете го с Node.js, след като добавите или промените компонент.

## Тестерът

`tester.js` изпълнява компонент без редактора, а `tests/` съдържа примери (`counter.js`, `example.js`, `example-multiple.js`, `influxdb.js`, `sqlite3.js`, `trigger.js`) и `readme.md` с всички опции. Един тест изглежда така:

```js
require('../tester')(async function(describe, done) {

	await describe(function(test, next) {

		let messages = 0;
		let status = 0;

		test.status = function(data) {
			status = data;
		};

		test.input('Hello World!');
		messages++;

		setTimeout(function() {
			test.ok(status === messages, 'Counting');
			next();
		}, 2000);

	});

	done();
});
```

`describe` зарежда компонента, `test.input(data)` му изпраща съобщение, `test.output` и `test.message` получават каквото изпраща, `test.configure({...})` променя конфигурацията му, `test.trigger()` извиква неговия trigger, а `test.ok()` и `test.fail()` отбелязват резултата. За да изпълните всички тестове: `cd flowstreamcomponents`, веднъж `npm install total4` и `node tester.js`. Тестерът на тази ревизия е написан за Total.js 4 (`require('total4')`), както казва неговият readme.

## Принос

Хранилището моли да се спазват стандартите и насоките за код на Total.js, а неговият readme ги свързва; контактът е `info@totaljs.com`. За да напишете компонент, вижте [напишете компонент](/en/flow/write-a-component/).
