@czlonkowski/n8n-nodes-librus 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -1
- package/README.md +55 -119
- package/dist/nodes/Librus/transport.js +10 -2
- package/dist/nodes/Librus/transport.js.map +1 -1
- package/docs/development.md +69 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
## 0.1.
|
|
3
|
+
## 0.1.1 — 2026-09-08
|
|
4
|
+
|
|
5
|
+
- Fix credential connection tests failing with PROTOCOL_ERROR on empty HTTP redirects returned by n8n's legacy request helper.
|
|
6
|
+
- Normalize missing response bodies without accepting malformed JSON or exposing request metadata.
|
|
7
|
+
- Add regression coverage for the complete credential login flow and invalid inbox responses.
|
|
8
|
+
- Simplify the Polish README around community node installation and usage; move development and release instructions to docs/development.md.
|
|
9
|
+
|
|
10
|
+
## 0.1.0 — 2026-09-07
|
|
4
11
|
|
|
5
12
|
- Scaffold an MIT-licensed, unofficial self-hosted n8n community node.
|
|
6
13
|
- Add browser-session credentials and a credential connection test.
|
package/README.md
CHANGED
|
@@ -1,152 +1,88 @@
|
|
|
1
|
-
<img src="nodes/Librus/librus.png" alt="Logo integracji Librus
|
|
1
|
+
<img src="https://raw.githubusercontent.com/czlonkowski/n8n-nodes-librus/main/nodes/Librus/librus.png" alt="Logo integracji Librus" width="112" height="112">
|
|
2
2
|
|
|
3
|
-
#
|
|
3
|
+
# Librus dla n8n
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
Pobieraj wiadomości z Librus Synergia i uruchamiaj automatyzacje po otrzymaniu nowych wiadomości. Paczka zawiera dwa węzły: **Librus** i **Librus Trigger**.
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
To nieoficjalna, eksperymentalna integracja do **samodzielnie hostowanego n8n**. Nie jest dostępna w n8n Cloud. Instancja n8n musi korzystać z Node.js 24 lub nowszego.
|
|
8
8
|
|
|
9
|
-
##
|
|
9
|
+
## Instalacja
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
1. W n8n przejdź do **Settings → Community nodes → Install**.
|
|
12
|
+
2. Wklej pełną nazwę paczki, razem ze znakiem `@`:
|
|
12
13
|
|
|
13
|
-
|
|
14
|
+
```text
|
|
15
|
+
@czlonkowski/n8n-nodes-librus
|
|
16
|
+
```
|
|
14
17
|
|
|
15
|
-
|
|
16
|
-
| --- | --- |
|
|
17
|
-
| **Preview** — domyślnie | Skrót z listy wiadomości. Może urwać się w środku zdania. |
|
|
18
|
-
| **Full Message** | Treść pobrana osobno ze szczegółów każdej wiadomości. |
|
|
19
|
-
|
|
20
|
-
W obu trybach treść jest dekodowana z base64 do UTF-8, z zachowaniem HTML. Pole `contentSource` w wyniku ma wartość `preview` albo `full`. Przy wyłączonym **Include Content** oba pola są pomijane.
|
|
21
|
-
|
|
22
|
-
**Aby otrzymać pełną treść, włącz Include Content i wybierz Content Source → Full Message.** Samo włączenie Include Content zachowuje dotychczasowe działanie — podgląd z listy. W próbie na rzeczywistym koncie podgląd miał 95 znaków, a odpowiedź ze szczegółów tej samej wiadomości zawierała 463 znaki i zaczynała się od całego podglądu.
|
|
23
|
-
|
|
24
|
-
Pobranie szczegółów **może oznaczyć wiadomość jako przeczytaną w Librusie**. Nie sprawdzono jeszcze tego efektu na nieprzeczytanej wiadomości; próbę wykonano na wiadomości już przeczytanej. Wybierz Full Message świadomie, szczególnie w przepływach uruchamianych automatycznie.
|
|
25
|
-
|
|
26
|
-
**Librus → Message → Get Content** pobiera pełną treść pojedynczej wiadomości po **Message ID** i zwraca `messageId`, `content` oraz `contentSource: "full"`. Można przekazać ID z triggera wyrażeniem `{{ $json.messageId }}`. Metadane pozostają dostępne w danych poprzedniego węzła. Także ta operacja może oznaczyć wiadomość jako przeczytaną.
|
|
27
|
-
|
|
28
|
-
Paczka nie udostępnia wysyłania, usuwania, pobierania załączników ani osobnych operacji **Mark as Read / Mark as Unread**. W zbadanym interfejsie nowego modułu wiadomości Librusa nie znaleziono operacji przywracania statusu nieprzeczytanej; dlatego nie deklarujemy jej obsługi. Nadal trzeba sprawdzić, czy samo pobranie listy przez Librusa zmienia status odczytania.
|
|
29
|
-
|
|
30
|
-
Dla każdego elementu wejściowego powstaje nowa sesja oparta na ciasteczkach. Nie ma jeszcze trwałego przechowywania sesji ani obsługi tokena odświeżającego. Jeśli podczas pobierania wiadomości zostanie rozpoznane wygaśnięcie sesji, węzeł może zalogować się ponownie jeden raz. Błędne dane logowania, brak dostępu, ograniczenie liczby żądań i błędy serwera nie uruchamiają pętli logowania.
|
|
31
|
-
|
|
32
|
-
## Uruchomienie lokalne
|
|
33
|
-
|
|
34
|
-
Wymagane są **Node.js 24 LTS** i npm. Testowano na Node.js 24.20.0.
|
|
35
|
-
|
|
36
|
-
```sh
|
|
37
|
-
git clone https://github.com/czlonkowski/n8n-nodes-librus.git
|
|
38
|
-
cd n8n-nodes-librus
|
|
39
|
-
npm ci
|
|
40
|
-
npm run check
|
|
41
|
-
N8N_LISTEN_ADDRESS=127.0.0.1 N8N_PORT=5689 npm run dev
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
Edytor n8n będzie dostępny pod adresem **http://localhost:5689**.
|
|
45
|
-
|
|
46
|
-
Przed uruchomieniem sprawdź `node --version`: potrzebna jest wersja 24 lub nowsza. Plik `.nvmrc` nie przełącza wersji Node.js automatycznie. Jeśli używasz nvm, wykonaj najpierw `nvm use`.
|
|
47
|
-
|
|
48
|
-
Projekt korzysta z oficjalnego narzędzia `@n8n/node-cli` do budowania paczki, sprawdzania kodu i uruchamiania środowiska deweloperskiego. Skrypt `dev` przechowuje osobny profil n8n w katalogu **`../.n8n-librus-dev`**, poza repozytorium. Nie przenoś profilu do środka projektu: narzędzie tworzy w nim dowiązanie do repozytorium, co prowadziłoby do zapętlenia skanowania katalogów i błędu `ENAMETOOLONG`.
|
|
49
|
-
|
|
50
|
-
Nie dodawaj do repozytorium profilu n8n ani danych konta. Testy automatyczne korzystają wyłącznie z fikcyjnych odpowiedzi HTTP — nie łączą się z Librusem i nie wymagają prawdziwych danych logowania.
|
|
51
|
-
|
|
52
|
-
Szczegóły techniczne opisano w dokumentach: [architektura](docs/architecture.md), [testy na rzeczywistym koncie](docs/live-verification.md), [wyniki weryfikacji](docs/verification.md) i [bezpieczeństwo](SECURITY.md). Te dokumenty techniczne są obecnie po angielsku.
|
|
53
|
-
|
|
54
|
-
## Instalacja we własnej instancji n8n
|
|
18
|
+
3. Zatwierdź instalację. W edytorze workflow wyszukaj **Librus** lub **Librus Trigger**.
|
|
55
19
|
|
|
56
|
-
|
|
20
|
+
Jeśli widzisz błąd `Failed to check package version existence`, sprawdź nazwę: `czlonkowski/n8n-nodes-librus` bez początkowego `@` jest niepoprawne. [Paczka w npm](https://www.npmjs.com/package/@czlonkowski/n8n-nodes-librus).
|
|
57
21
|
|
|
58
|
-
|
|
59
|
-
npm ci
|
|
60
|
-
npm run check
|
|
61
|
-
npm pack
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
Zainstaluj powstały plik `.tgz` w katalogu węzłów społecznościowych swojej **testowej instancji n8n**, a następnie uruchom ją ponownie. Przy standardowym profilu jest to katalog `~/.n8n/nodes`. Jeśli korzystasz z kontenera, skopiuj archiwum do kontenera i zadbaj o trwały wolumen z danymi użytkownika n8n. Pomocna jest [instrukcja ręcznej instalacji n8n](https://docs.n8n.io/integrations/community-nodes/installation-and-management/manual-installation/).
|
|
65
|
-
|
|
66
|
-
Do czasu publikacji paczki nie używaj polecenia `npm install @czlonkowski/n8n-nodes-librus`.
|
|
67
|
-
|
|
68
|
-
Projekt jest przeznaczony do **samodzielnie hostowanego n8n jako niezweryfikowany węzeł społecznościowy**. Biblioteka `tough-cookie` zapewnia obsługę ciasteczek z uwzględnieniem ich domen i ścieżek. Ta zależność wyklucza obecną wersję z weryfikacji n8n Cloud według wymogu braku zależności uruchomieniowych, dlatego `n8n.strict` ma wartość `false`.
|
|
69
|
-
|
|
70
|
-
Zgodnie z konwencją paczek n8n pole `peerDependencies` zawiera `n8n-workflow: "*"`. Nie oznacza to zgodności ze wszystkimi wersjami n8n. Typy używane podczas budowania pochodzą z `n8n-workflow` 2.38.1; próbę na rzeczywistym koncie przeprowadzono w n8n 2.37.10.
|
|
71
|
-
|
|
72
|
-
## Konfiguracja i pierwszy test
|
|
73
|
-
|
|
74
|
-
1. W interfejsie n8n utwórz dane uwierzytelniające typu **Librus Session API**. Podaj login i hasło akceptowane przez formularz Synergii — login może różnić się od adresu e-mail konta LIBRUS. n8n szyfruje te dane swoim kluczem instancji.
|
|
75
|
-
2. W dzienniku zanotuj, które z ostatnich wiadomości są nieprzeczytane, bez otwierania ich. Zrób to przed testem połączenia: test danych logowania również pobiera jeden wpis z listy wiadomości, choć nie zwraca jego zawartości.
|
|
76
|
-
3. Utwórz przepływ **Manual Trigger → Librus**. Wybierz **Message → Get Many**, wyłącz **Return All**, ustaw **Limit: 10** i pozostaw **Include Content** wyłączone.
|
|
77
|
-
4. Uruchom węzeł i porównaj wyniki z dziennikiem. Odśwież listę w Librusie i sprawdź, czy status nieprzeczytanych wiadomości się nie zmienił.
|
|
78
|
-
5. Włącz **Include Content**, wybierz **Content Source → Full Message** i porównaj treść wiadomości wcześniej przeczytanej w dzienniku. Sprawdź także polskie znaki i formatowanie. Na pierwszą próbę ustaw **Limit: 1**.
|
|
79
|
-
|
|
80
|
-
Parametr **Maximum Pages** domyślnie wynosi 20, a jego maksymalna wartość to 50. Jedno żądanie pobiera do 50 wpisów. Po osiągnięciu limitu stron, żądań lub czasu węzeł zgłasza błąd zamiast zwracać niepełny wynik. Daty pozostają w formacie źródłowym, ponieważ interpretacja strefy czasowej nie została jeszcze zweryfikowana.
|
|
81
|
-
|
|
82
|
-
Tryb **Full Message** obsługuje do **50 wiadomości na wykonanie**. Szczegóły są pobierane kolejno, w tej samej sesji, dopiero po zakończeniu pobierania listy, zastosowaniu limitu i usunięciu duplikatów identyfikatorów. Jeśli wynik zawiera więcej niż 50 wiadomości, węzeł zgłosi `FULL_CONTENT_LIMIT` przed pobraniem szczegółów. Wyłącz wtedy Return All i ustaw Limit na 50 lub mniej.
|
|
22
|
+
## Połączenie z Librusem
|
|
83
23
|
|
|
84
|
-
|
|
24
|
+
W wybranym węźle utwórz dane uwierzytelniające **Librus Session API** i wpisz login oraz hasło używane do logowania w Synergii. Login może różnić się od adresu e-mail konta LIBRUS.
|
|
85
25
|
|
|
86
|
-
|
|
26
|
+
Zapisz dane i sprawdź połączenie. Jeśli pojawi się `ACTION_REQUIRED`, zaloguj się w [serwisie Librus](https://portal.librus.pl/rodzina/synergia/loguj), uzupełnij wymagane potwierdzenia i ponów próbę w n8n.
|
|
87
27
|
|
|
88
|
-
|
|
28
|
+
Dane logowania są przechowywane jako credentials w n8n. Węzeł nie zwraca hasła ani ciasteczek sesji w wynikach.
|
|
89
29
|
|
|
90
|
-
|
|
30
|
+
## Pobieranie wiadomości
|
|
91
31
|
|
|
92
|
-
|
|
93
|
-
2. Ustaw **Poll Times** na **Every X → 5 → Minutes** lub rzadziej. n8n domyślnie ustawia minutę, więc zmień ten parametr. Bezpieczna częstotliwość dla Librusa nadal wymaga sprawdzenia.
|
|
94
|
-
3. Użyj ręcznego testu triggera: zwróci jedną bieżącą wiadomość jako próbkę, niezależnie od jej wieku i statusu. Pusta skrzynka nie zwróci próbki. Test nie zmienia historii wykrytych wiadomości.
|
|
95
|
-
4. Połącz kolejne kroki i zapisz przepływ. Przykład: **Librus Trigger → Librus (Get Content, Message ID: `{{ $json.messageId }}`) → wybrany kanał powiadomień**. Do powiadomienia z samym tematem i podglądem wystarczy bezpośrednie wyjście triggera.
|
|
96
|
-
5. Po opublikowaniu/aktywacji przepływu pierwsze automatyczne sprawdzenie zapamięta całą obecną skrzynkę i nie uruchomi dalszych kroków. Dopiero kolejne sprawdzenia zwrócą nowe wiadomości. Zwykłe zapisanie nieaktywnego workflow nie uruchamia harmonogramu.
|
|
32
|
+
W węźle **Librus** wybierz **Message → Get Many**.
|
|
97
33
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
34
|
+
| Ustawienie | Działanie |
|
|
35
|
+
| --- | --- |
|
|
36
|
+
| **Read Status → All** | Wszystkie wiadomości. |
|
|
37
|
+
| **Read Status → Unread** | Tylko nieprzeczytane. |
|
|
38
|
+
| **Read Status → Read** | Tylko przeczytane. |
|
|
39
|
+
| **Limit** | Maksymalna liczba wiadomości pasujących do filtra. |
|
|
40
|
+
| **Return All** | Wszystkie pasujące wiadomości, w granicach limitu stron. |
|
|
41
|
+
| **Include Content** | Dołączenie treści wiadomości. |
|
|
42
|
+
| **Content Source → Preview** | Skrócony podgląd z listy; może urwać się w środku zdania. |
|
|
43
|
+
| **Content Source → Full Message** | Pełna treść ze szczegółów wiadomości. |
|
|
103
44
|
|
|
104
|
-
|
|
45
|
+
Każda wiadomość jest osobnym elementem danych z polami m.in. `messageId`, `senderName`, `topic`, `sendDate`, `readDate` i `isAnyFileAttached`. Po włączeniu treści wynik zawiera także `content` oraz `contentSource` (`preview` lub `full`).
|
|
105
46
|
|
|
106
|
-
|
|
47
|
+
**Aby pobrać pełną treść, włącz Include Content i wybierz Full Message.** Pobranie szczegółów może oznaczyć wiadomość jako przeczytaną w Librusie. W jednym wykonaniu można pobrać pełną treść maksymalnie 50 wiadomości.
|
|
107
48
|
|
|
108
|
-
|
|
49
|
+
Jeśli znasz ID wiadomości, wybierz **Message → Get Content** i podaj **Message ID**. Ta operacja zwraca `messageId`, `content` i `contentSource: "full"`.
|
|
109
50
|
|
|
110
|
-
|
|
51
|
+
## Automatyzacja po nowej wiadomości
|
|
111
52
|
|
|
112
|
-
|
|
53
|
+
1. Dodaj **Librus Trigger** i wybierz zapisane dane logowania.
|
|
54
|
+
2. Wybierz **Event → New Message**.
|
|
55
|
+
3. Ustaw **Poll Times**, np. **Every X → 5 → Minutes**. Węzeł sprawdza skrzynkę cyklicznie; powiadomienie pojawi się po kolejnym sprawdzeniu.
|
|
56
|
+
4. Ręcznie przetestuj węzeł. Zwróci jedną obecną wiadomość jako próbkę; pusta skrzynka nie zwróci danych.
|
|
57
|
+
5. Dodaj dalsze kroki i opublikuj/aktywuj workflow.
|
|
113
58
|
|
|
114
|
-
|
|
59
|
+
**Pierwsze automatyczne sprawdzenie zapamiętuje obecną skrzynkę bez uruchamiania workflow dla starych wiadomości.** Kolejne sprawdzenia wykrywają nowe ID, również gdy wiadomość została już przeczytana w aplikacji Librusa. Zmiana statusu starej wiadomości nie uruchamia triggera ponownie. Ręczne testy nie zmieniają tej historii.
|
|
115
60
|
|
|
116
|
-
|
|
61
|
+
Trigger domyślnie zwraca metadane i skrócony podgląd. Aby dołączyć pełną treść, dodaj po nim **Librus → Get Content** i ustaw **Message ID** na:
|
|
117
62
|
|
|
118
|
-
```
|
|
119
|
-
|
|
63
|
+
```text
|
|
64
|
+
{{ $json.messageId }}
|
|
120
65
|
```
|
|
121
66
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
Pierwsza publikacja przygotowanej wersji:
|
|
67
|
+
Przykładowy workflow: **Librus Trigger → Librus (Get Content) → wybrany kanał powiadomień**. Jeśli wystarczy temat i podgląd, pomiń Get Content.
|
|
125
68
|
|
|
126
|
-
|
|
127
|
-
npm login --registry=https://registry.npmjs.org
|
|
128
|
-
npm whoami
|
|
129
|
-
npm run release
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
Użyj konta **czlonkowski**. Przed właściwą publikacją wszystkie zmiany muszą być zapisane w commicie. npm może poprosić o potwierdzenie logowania/publikacji w przeglądarce lub kod 2FA — wykonaj ten krok bezpośrednio w npm. Nie zapisuj kodów ani tokenów w repozytorium.
|
|
69
|
+
## Ograniczenia i rozwiązywanie problemów
|
|
133
70
|
|
|
134
|
-
|
|
71
|
+
- **Mark as Unread / Mark as Read**, wysyłanie, usuwanie i pobieranie załączników nie są obsługiwane. Odczyt pełnej treści może sam zmienić status wiadomości w Librusie.
|
|
72
|
+
- **`SCAN_INCOMPLETE`**: zwiększ **Maximum Pages** (domyślnie 20, maksymalnie 50). Przy Get Many możesz też ograniczyć liczbę wyników. Trigger musi sprawdzić całą skrzynkę; niepełny skan nie aktualizuje jego historii.
|
|
73
|
+
- **`FULL_CONTENT_LIMIT`**: wyłącz Return All i ustaw Limit na 50 lub mniej.
|
|
74
|
+
- **Błąd dalszego kroku workflow**: ponów nieudane wykonanie w n8n. Kolejne sprawdzenie triggera nie wyemituje tej samej wiadomości ponownie. Przy równoległych wykonaniach lub wielu instancjach możliwe są duplikaty.
|
|
75
|
+
- Historia triggera obejmuje do **10 000 ID**. Po osiągnięciu limitu utwórz nowy trigger, który zapamięta aktualną skrzynkę jako stan początkowy. Zmiana konta lub utrata zapisanej historii również ustala nowy stan początkowy.
|
|
76
|
+
- Wiadomość usunięta lub przeniesiona poza skrzynkę pomiędzy sprawdzeniami może nie zostać wykryta.
|
|
135
77
|
|
|
136
|
-
|
|
137
|
-
npm view @czlonkowski/n8n-nodes-librus version
|
|
138
|
-
```
|
|
78
|
+
Integracja korzysta z nieoficjalnych tras Librusa. Długotrwałe działanie harmonogramu i wpływ pobierania listy na status odczytania wymagają jeszcze weryfikacji. Treść wiadomości trafia do danych wykonania workflow — jej przechowywaniem zarządzają ustawienia historii n8n.
|
|
139
79
|
|
|
140
|
-
|
|
80
|
+
## Pomoc
|
|
141
81
|
|
|
142
|
-
|
|
143
|
-
npm version patch --no-git-tag-version
|
|
144
|
-
# Uzupełnij CHANGELOG.md, następnie zapisz zmiany w Git.
|
|
145
|
-
npm run release
|
|
146
|
-
```
|
|
82
|
+
Błędy i propozycje zgłaszaj w [GitHub Issues](https://github.com/czlonkowski/n8n-nodes-librus/issues). Nie umieszczaj w zgłoszeniach loginów, haseł, ciasteczek ani treści prawdziwych wiadomości.
|
|
147
83
|
|
|
148
|
-
|
|
84
|
+
Instrukcje pracy nad kodem: [dokumentacja deweloperska](docs/development.md).
|
|
149
85
|
|
|
150
|
-
## Licencja
|
|
86
|
+
## Licencja
|
|
151
87
|
|
|
152
|
-
|
|
88
|
+
[MIT](LICENSE). Projekt nie jest powiązany z firmą LIBRUS ani przez nią zatwierdzony. [Informacje o autorstwie i źródłach](NOTICE.md).
|
|
@@ -2,6 +2,14 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.createTransport = createTransport;
|
|
4
4
|
exports.createCredentialTestTransport = createCredentialTestTransport;
|
|
5
|
+
function normalizeResponse(value) {
|
|
6
|
+
const response = value;
|
|
7
|
+
return {
|
|
8
|
+
statusCode: response.statusCode,
|
|
9
|
+
headers: response.headers,
|
|
10
|
+
body: response.body === undefined ? '' : response.body,
|
|
11
|
+
};
|
|
12
|
+
}
|
|
5
13
|
function createTransport(httpRequest) {
|
|
6
14
|
return async (request) => {
|
|
7
15
|
const response = await httpRequest({
|
|
@@ -12,11 +20,11 @@ function createTransport(httpRequest) {
|
|
|
12
20
|
json: false,
|
|
13
21
|
encoding: 'text',
|
|
14
22
|
});
|
|
15
|
-
return response;
|
|
23
|
+
return normalizeResponse(response);
|
|
16
24
|
};
|
|
17
25
|
}
|
|
18
26
|
function createCredentialTestTransport(requestHelper) {
|
|
19
|
-
return async (request) => (await requestHelper({
|
|
27
|
+
return async (request) => normalizeResponse(await requestHelper({
|
|
20
28
|
uri: request.url,
|
|
21
29
|
method: request.method,
|
|
22
30
|
headers: request.headers,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../nodes/Librus/transport.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../nodes/Librus/transport.ts"],"names":[],"mappings":";;AAcA,0CAcC;AAGD,sEAmBC;AA7CD,SAAS,iBAAiB,CAAC,KAAc;IACxC,MAAM,QAAQ,GAAG,KAAiB,CAAC;IACnC,OAAO;QACN,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,IAAI,EAAE,QAAQ,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI;KACtD,CAAC;AACH,CAAC;AAED,SAAgB,eAAe,CAC9B,WAA+D;IAE/D,OAAO,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC;YAClC,GAAG,OAAO;YACV,qBAAqB,EAAE,IAAI;YAC3B,kBAAkB,EAAE,IAAI;YACxB,sBAAsB,EAAE,IAAI;YAC5B,IAAI,EAAE,KAAK;YACX,QAAQ,EAAE,MAAM;SAChB,CAAC,CAAC;QACH,OAAO,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC,CAAC;AACH,CAAC;AAGD,SAAgB,6BAA6B,CAC5C,aAAoD;IAEpD,OAAO,KAAK,EAAE,OAAO,EAAE,EAAE,CACxB,iBAAiB,CAChB,MAAM,aAAa,CAAC;QACnB,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,cAAc,EAAE,KAAK;QACrB,kBAAkB,EAAE,KAAK;QACzB,uBAAuB,EAAE,IAAI;QAC7B,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,KAAK;QACX,QAAQ,EAAE,MAAM;KAChB,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# Rozwój i wydawanie paczki
|
|
2
|
+
|
|
3
|
+
Instrukcja dla osób pracujących nad kodem. Instalację gotowej paczki opisuje [README](../README.md).
|
|
4
|
+
|
|
5
|
+
## Uruchomienie lokalne
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
Wymagane są **Node.js 24 LTS** i npm. Testowano na Node.js 24.20.0.
|
|
9
|
+
|
|
10
|
+
```sh
|
|
11
|
+
git clone https://github.com/czlonkowski/n8n-nodes-librus.git
|
|
12
|
+
cd n8n-nodes-librus
|
|
13
|
+
npm ci
|
|
14
|
+
npm run check
|
|
15
|
+
N8N_LISTEN_ADDRESS=127.0.0.1 N8N_PORT=5689 npm run dev
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Edytor n8n będzie dostępny pod adresem **http://localhost:5689**.
|
|
19
|
+
|
|
20
|
+
Przed uruchomieniem sprawdź `node --version`: potrzebna jest wersja 24 lub nowsza. Plik `.nvmrc` nie przełącza wersji Node.js automatycznie. Jeśli używasz nvm, wykonaj najpierw `nvm use`.
|
|
21
|
+
|
|
22
|
+
Projekt korzysta z oficjalnego narzędzia `@n8n/node-cli` do budowania paczki, sprawdzania kodu i uruchamiania środowiska deweloperskiego. Skrypt `dev` przechowuje osobny profil n8n w katalogu **`../.n8n-librus-dev`**, poza repozytorium. Nie przenoś profilu do środka projektu: narzędzie tworzy w nim dowiązanie do repozytorium, co prowadziłoby do zapętlenia skanowania katalogów i błędu `ENAMETOOLONG`.
|
|
23
|
+
|
|
24
|
+
Nie dodawaj do repozytorium profilu n8n ani danych konta. Testy automatyczne korzystają wyłącznie z fikcyjnych odpowiedzi HTTP — nie łączą się z Librusem i nie wymagają prawdziwych danych logowania.
|
|
25
|
+
|
|
26
|
+
Szczegóły techniczne opisano w dokumentach: [architektura](architecture.md), [testy na rzeczywistym koncie](live-verification.md), [wyniki weryfikacji](verification.md) i [bezpieczeństwo](../SECURITY.md). Te dokumenty techniczne są obecnie po angielsku.
|
|
27
|
+
|
|
28
|
+
## Ręczna publikacja w npm
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
Paczka używa nazwy **`@czlonkowski/n8n-nodes-librus`**. Niescopowana nazwa `n8n-nodes-librus` była wcześniej używana przez innego autora. Repozytorium GitHub zachowuje dotychczasową nazwę.
|
|
32
|
+
|
|
33
|
+
Przy Node.js 24 lub nowszym najpierw wykonaj próbę bez publikacji:
|
|
34
|
+
|
|
35
|
+
```sh
|
|
36
|
+
npm run release -- --dry-run
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Skrypt instaluje zależności zgodnie z lockfile, uruchamia lint, kompilację i testy, przygotowuje archiwum oraz sprawdza jego zawartość. Tryb próbny nie wymaga zalogowania do npm. Oba tryby wymagają połączenia z rejestrem npm.
|
|
40
|
+
|
|
41
|
+
Publikacja przygotowanej, jeszcze niewydanej wersji:
|
|
42
|
+
|
|
43
|
+
```sh
|
|
44
|
+
npm login --registry=https://registry.npmjs.org
|
|
45
|
+
npm whoami
|
|
46
|
+
npm run release
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Użyj konta **czlonkowski**. Przed właściwą publikacją wszystkie zmiany muszą być zapisane w commicie. npm może poprosić o potwierdzenie logowania/publikacji w przeglądarce lub kod 2FA — wykonaj ten krok bezpośrednio w npm. Nie zapisuj kodów ani tokenów w repozytorium.
|
|
50
|
+
|
|
51
|
+
Skrypt publikuje dokładnie sprawdzone archiwum jako paczkę publiczną. Wersje stabilne otrzymują tag `latest`, a wersje z sufiksem (np. `0.2.0-beta.1`) — `next`. Nie tworzy tagów Git ani GitHub Release i nie korzysta z GitHub Actions do publikacji. Jeżeli npm zgłosi błąd po wysłaniu paczki, sprawdź rejestr przed ponowieniem; opublikowanej wersji nie można nadpisać:
|
|
52
|
+
|
|
53
|
+
```sh
|
|
54
|
+
npm view @czlonkowski/n8n-nodes-librus version
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Przy każdym pushu nowej wersji na GitHub podbij numer w `package.json` i `package-lock.json` oraz uzupełnij `CHANGELOG.md`. Zapisz i wypchnij commit, a potem uruchom skrypt:
|
|
58
|
+
|
|
59
|
+
```sh
|
|
60
|
+
npm version patch --no-git-tag-version
|
|
61
|
+
# Uzupełnij CHANGELOG.md, następnie zapisz zmiany w Git.
|
|
62
|
+
npm run release
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Zmiana README na GitHub nie aktualizuje opisu już opublikowanej wersji w npm; nowy README trafi do npm wraz z kolejnym wydaniem.
|
|
66
|
+
|
|
67
|
+
## Testy na rzeczywistym koncie
|
|
68
|
+
|
|
69
|
+
Procedura i ograniczenia: [testy integracji](live-verification.md), [wyniki](verification.md), [architektura](architecture.md). Nie dodawaj prawdziwych danych konta ani wiadomości do testów, logów lub zgłoszeń.
|