Prosty i Nowoczesny Framework dla Vue.js
7 godz. 2 min · Vue.js · Full-stack i Programowanie
Wojciech PołowniakSr. Fullstack EngineerW tym projekcie tworzyć będziemy praktyczny projekt - klona Wikipedii! Minipedia pobierze dane z prawdziwego źrodła danych, zewnętrznego API WikiMedia - będzie łudząco podobna do oryginału oraz współdzieliła najważniejsze funkcjonalności, takie jak dostarczanie treści w różnych wersjach językowych, możliwość wyszukiwania artykułów, czy pobieranie najpopularniejszych wpisów dla danego języka. Stworzymy także podstronę wyświetlającą za każdym razem losowy artykuł w danej wersji językowej.Zobaczysz też, jak dokonać migracji ze statycznej strony HTML na Nuxt - oraz jak tworzyć przykładowe komponenty podczas tego procesu.Dzięki temu wszystkiemu, dowiesz się jak wykorzystać nabytą wiedzę w praktyce.
Dzięki Nuxtowi dowiesz się jak optymalizować Twoje strony www z duchem idei progressive enhancement, dostarczając coraz to lepsze doświadczenia dla swoich użytkowników oraz tworząc aplikację napisaną w 100% w JavaScript, która będzie działała nawet wtedy, gdy użytkownik jawnie wyłączy go w przeglądarce! To wszystko za SSR (Server Side Rendering), dzięki któremu treści będą gotowe do konsumpcji już przy wstępnej, pierwszej odpowiedzi z serwera WWW.Oczywiście, ma to swoje implikacje na wydajność naszej aplikacji - sprawiając że Lighthouse czy optymalizacja pod SEO staje się coraz prostsza!
Czymże jest ekosystem danego frameworka bez wsparcia społeczności! Dlatego podczas tego kursu nauczysz się instalować i wykorzystywać różne pluginy i moduły, które zaoszczędzą Ci dużo czasu. Dowiesz się też, jak tworzyć własne moduły - które rozszerzą działanie Twojej aplikacji Nuxt w sposób czysty i zarządzalny.
Nuxt jest frameworkiem w którym pracujemy zarówno po stronie front-endu, jak i back-endu. W związku z czym, stworzymy swoje własne API (bazujące na express.js) które będzie pewnego rodzaju pośrednikiem pomiędzy API WikiMedia oraz Twoją aplikacją internetową.
W tym kursie, dowiesz się także jak tworzyć swoje własne Middleware'y - czyli fragmenty kodu wywoływane pomiędzy przechodzeniem między stronami, czy podczas innych zapytań HTTP.Dodatkowo, zobaczysz jakie narzędzia daje nam Nuxt aby tworzyć progresywne aplikacje internetowe, oferując wsparcie dla takich funkcjonalności jak np. animacje między przejściami pojedynczymi podstronami naszego serwisu.
Tajemnicze i18n - czyli numeronim odpowiadający angielskiemu słowu "internalisation" - odnosi się w kontekście web developmentu do tłumaczenia danych na różne języki. Podczas realizacji projektu Minipedii, nie tylko wykorzystamy standardowe podejście do tłumaczeń stałych elementów naszego interfejsu użytkownika, ale także przetłumaczymy same dane zwracane z API, wykorzystując inną wersję językową w zależności od preferencji użytkownika!
Poznasz też kilka ciekawych pluginów i rozwiązań dotyczących optymalizacji pod SEO - poza faktem, że podejście spełniające intencje użytkownika jest najlepszym, co możemy zrobić - pluginy generujące nam mapę stron automatycznie na podstawie zadeklarowanych przez nas podstron, czy generatory danych jsonld pomogą w pozycjonowaniu Twojej wydajnej aplikacji jeszcze wyżej w hierarchii wyszukiwarek.
Aby móc efektywnie korzystać z tego kursu, powinieneś posiadać średnio zaawansowaną wiedzę z kategorii Front End, z naciskiem na umiejętność posługiwania się JavaScriptem oraz solidne podstawy NodeJS. Konieczna jest znajomość Vue, jako że Nuxt jest frameworkiem korzystającym z niego u swoich podstaw. Jeśli czujesz się dość swobodnie w wyżej wymienionych aspektach web developmentu, ten kurs będzie idealny dla Ciebie.
Część tej lekcji w końcu zaktualizuje nasze API, aby korzystało z innej wersji
językowej i aby to zrobić musimy skorzystać z modułu, który już
zainstalowaliśmy, czyli Next International.
I tak jak wspominałem wcześniej o kontekście, gdy mówiłem o Ask Data czy o
Routing middleware, to w kontekście mamy również dostępne informacje o
module Interaction i możemy się do niego dostać poprzez link tutaj.
Na takiej zasadzie, że z AP bezpośrednio bierzemy jeszcze moduł.
I 18.
I korzystamy z niego praktycznie identycznie, tak jak korzystamy z niego na
front endzie, czyli tam, gdzie robiliśmy dollar.
C i nazwa translacji to tak naprawdę
jesteśmy w stanie zrobić dokładnie to samo tutaj tylko dając przedrostek i 18,
ale nam nie zależy tyle na samych transakcjach co obecnie wybranym.
Języku, to znaczy tak jak pobieramy sobie tutaj z parametrów root
obecny identyfikator strony, do której chcemy się przenieść.
To analogicznie możemy dostać się do i 18m obecnego języka poprzez i 18 lokalne.
I to co musimy zrobić na początku być może
to wykonać, zalogować i zobaczyć czy to faktycznie działa.
Zapiszmy więc w tym momencie, gdy poruszymy się po naszej stronie
internetowej w tym momencie w języku tutaj francuskim, jak widzimy w pasku adresu.
To jest istotnie PVR i jeśli zmienimy to na język powiedzmy angielski zapiszmy.
To zobaczymy, że faktycznie jest język angielski.
W związku z czym co trzeba następnie
zrobić to zaktualizować nasze rady, aby przyjmowały parametr najwyższy lokalny.
W związku z czym przejdźmy do naszego wiki.
GS.
Dodajmy może po każdym property, albo w sumie po identyfikatorze ID.
Kolejny parametr opcjonalny.
Tutaj Być może tego już nie chcieliśmy.
Pozbądźmy się.
Dodajemy tutaj parametr lang.
I który będzie przyjmował faktycznie nazwę zmiennej lang.
Czyli tutaj to jest jakby ciąg znaków
na sztywno, który będzie wskazywał nam w parametrach jaka jest wartość.
Dla danej zmiennej zmiennej link i tutaj ją przechwytuje.
W związku z czym możemy sobie zduplikowane jeszcze raz te wszystkie Parents id.
Tutaj to full info w sumie nie jest
zupełnie używane, nie wiem czy jest tam w ogóle jeszcze potrzebne.
Więc ja tutaj dodam sobie
const planned równa się reg param lang czyli pobieramy z questa.
Parametr language.
Pozbądźmy się może tego naszego info.
Nie jest ono już nam potrzebne.
Nie ma sensu utrzymywać państw, które nie są tak czy siak używane.
To co musimy zrobić to jest troszkę różnica.
Tak naprawdę powinniśmy
robić nową instancję Wiki w każdym z tych wpisów, czyli tutaj skopiuję sobie
fragment listu, pikuje kursor, robię strzałkę w prawo,
enter i teraz zmodyfikuję każdy endpoint równolegle i w każdym z nich.
Ustawię nową instancję Wiki.
Ten user agent powinniśmy tak naprawdę
przenieść do zmiennych środowiskowych i chyba tak zrobimy.
Czyli tutaj zrobimy proces end user agent.
Bad user agent.
Zapiszemy.
Plik kropka nv.
Bad user agent równa się taki oto ciąg znaków.
Zapiszemy, ale robimy to po to, żeby mieć pewność, że to nie jest coś.
Co jest daną wrażliwą
w naszej aplikacji i możemy też oczywiście rozszerzyć nasz build czyli invalid.
Dodatkowe pole tutaj jako string wymagane możemy zapisać.
I w tym momencie w wiki. Teraz mamy już dostęp do.
Obecnego języka.
Więc to co musimy zrobić, to w każdym z
tych przypadków podmienić API URL na odpowiednie dla danej wersji językowej.
I całe szczęście.
Powinno to nam zadziałać na takiej zasadzie, że jeśli zduplikowane sobie ten
language, przeniesiemy go ze strzałką w górę.
Tutaj nawet każde wiki tutaj niektóre.
Funkcje mają troszkę inną strukturę, więc
to nam się nie udało, więc teoretycznie tutaj poprawia po prostu.
Link na samej górze, a będzie nam potrzebny link na samej górze.
Na samej górze.
Całkiem sporo mamy tych punktów.
I ostatni na samej górze.
Nie jesteśmy w stanie skopiować tutaj tego stringa.
Podmienić go na tępe stringi, bo tak nam będzie po prostu łatwiej.
I zamienić zahartowane na nasz language.
Czyli po zapisaniu tam powinno zadziałać i w tym momencie
będziemy odpytywać odpowiednią wersję językową naszego API.
Napiszmy.
I teraz musimy oczywiście przekazać te wartości również tutaj, w związku z czym
ponownie skopiuję sobie jakiś fragment kodu.
Tutaj jest to pass.
Zamienimy to na tępe stringi.
Lang.
Lang.
I na samym początku API też tutaj nam się coś przebudowuje non-stop.
Ciekawa sprawa.
Dobrze więc zróbmy to tak, że zabijemy proces na porcie 8000.
Jest ich całkiem dużo.
Możemy to zrobić w ps.
X y.
Kijem bez.
I zabić po prostu ten proces.
Tego typu rzeczy są powiązane z.
Poczekajcie chwilkę, ja postaram się tutaj
posprzątać na serwer i wrócę do Was za chwilę.
Dobrze, że wróciłem po krótkiej przerwie.
Tam okazało się generalnie, że
problem jest taki, że zaktualizowałem endpoint, a wszystkie
middleware korzystały jeszcze ze starej struktury Endpoint.
I choć może owy loading na start próbował przebudować serwer,
ale nie mógł go przebudować, bo ciągle ten sam widok był zepsute.
W związku z czym to co zmieniłem to zmieniłem.
Na początku.
Fakt, skomentowałem chwilowo wiki translation oraz link links.
Ustawiłem zaraz domyślnie na. Nuda.
Ustawiłem na pustą ramkę
aby w razie w przypadku gdzie nie mamy żadnych linków bo np.
endpoint tam leży.
Nasza aplikacja non stop się nie przygotowywała.
Jest to taki efekt jest, który czasem może się zdarzyć.
W każdym razie nie powinno się to zdarzać często jako właśnie, że jest to.
I w tym momencie tak naprawdę zostawię tutaj te przebudowane wersja z procesem
Batch User event w naszych environment wpisach.
Dalej jest to tutaj ustawione.
W związku z czym nie powinno być z tym już problemu na tym etapie przynajmniej.
I teraz tak jak zaktualizuje nasz wiki routing aby korzystał z tej nowej
struktury endpoint to na co możemy to zapisać?
I tak samo wiki translation link links.
Podejrzewam, że nie muszą być
zlokalizowane, chociaż już dla spójności moglibyśmy to zrobić.
Podejrzewam, że nie będzie z tym problemu.
Czyli po prostu kopiemy całą ścieżkę
i podmieniamy po prostu to na bank links links.
I tutaj.
Również pobierzemy sobie i 18.
Tutaj zapiszemy.
I musimy oczywiście nasz lang ustawić,
czyli connect lang równa się i 18 cal.
Zapiszmy.
W tym momencie mam nadzieję, że to się buduje poprawnie.
Jeśli nie, to ponownie skomentuję po prostu.
Treść tego komponentu.
I tutaj tak samo lokalnie.
Tutaj dostajemy 400 czwórki Request White Status, kod 404.
Nie mamy dokładnej informacji, który z tych wpisów nie zadziałał.
Wydaje mi się, że wszystkie powinny być zaktualizowane.
Content posiada atrybut lang page posiada a lang.
Lang. Lang lang.
Full info image.
I gdzie jest nasze Lang links.
Na samej górze też posiada atrybut.
W związku z czym to już powinno nam działać w tym momencie.
Taką mam nadzieję.
A jeśli nie, to ponownie komentujemy z naszego.
Middleware i zobaczmy czy to faktycznie coś zmieni.
Wiki Translation. Na początek.
Mam nadzieję, że coś przewiduje jeszcze bez.
Poczekamy aż pliki się przewidują.
Miejmy nadzieję, że tym razem nam to zaskoczy.
Jak odświeżyć stronę?
Czy ona tutaj zadziała?
Niestety nie, ale tutaj dostajemy informacje o.
Brak pamięci.
Niestety serwer
nam się wysypał, więc ponownie ja zabije wszystkie serwery powiązane z narodem.
PS. X, y.
Ten.
Nie powinno już tego tutaj być.
Spróbujmy ponownie.
Możemy jeszcze w międzyczasie tutaj w
naszym wiki dzieje się ustawić fall back dla naszego atrybutu lang.
Na domyślnie angielski.
I teraz nasza aplikacja faktycznie się załadowała.
Troszkę to zajęło.
Tutaj nie mamy naszych.
Language kodów.
Ponieważ skomentowali byśmy ten mit, stąd
miejmy nadzieję, że tym razem nam to zaskoczy.
Dostajemy błąd, że wartość klucza wielką nie jest ani string, ani funkcją.
To jest dosyć ciekawe,
bo oznacza to, że nasze translację przestały z jakiegoś powodu działać.
A to prawdopodobnie dlatego, że faktycznie nie mamy na stronie głównej przynajmniej.
Żadnego digit.
A tak wygląda nasz endpoint.
W związku z czym przejdźmy do Janusza Korczaka.
Ponownie.
Hiszpański.
I jeśli nam to zadziała.
I faktycznie zadziałało, to będziemy mogli naprawić.
Stronę główną i pozostałe wersje językowe.
I faktycznie widzimy, że po przełączeniu
się na hiszpańską wersję Wikipedii tutaj nam się angielski wypisał.
W związku z czym ja dochodzę do wniosku,
że po prostu API zwraca nam informację na takiej zasadzie, że.
Jeśli jesteśmy na obecnym języku to on się nie wyświetli tutaj w linkach.
Tylko kwestia jest taka, że jeśli nie mamy
zdefiniowanego pasa musimy gdzieś to przekierować.
Zastanawiam się czy jesteśmy w stanie tutaj przekazać jakąś pustą wartość.
Zerknijmy na wiki czy jest.
I wchodzimy do dokumentacji do Langley
i zobaczmy, czy jesteśmy w stanie tutaj przekazać.
Pustego Page'a?
Wydaje mi się, że nie i nie ma też innego API powiązanego z językami, w związku z
czym no niestety tutaj w przypadku jeśli nie ma.
Zdefiniowanego pasa.
Czyli powiedzmy, że właśnie path jest undefined.
No to powinniśmy zrobić tutaj może i na razie wystarczy.
If not pas.
Return.
Po prostu na sztywno.
Lista języków.
Którą sobie pobierzemy ze.
API w tym momencie.
Lang.
Ten.
To jesteśmy w stanie to sobie skopiować.
Być może.
W rozszerzeniach.
Do WU.
Akurat nie mam zainstalowanego dodatku do debugowania WU, niestety.
W każdym razie jesteśmy w stanie tutaj
podejrzeć język na takiej zasadzie, że po prostu.
Pobierzemy sobie kody krajów stąd.
Czyli jest to angielski.
Francuski, hiszpański.
URL też możemy kodować.
Nie jest to oczywiście idealny scenariusz, ale musimy pracować z
tym, co jest nam dane, w związku z czym tutaj URL.
URL.
URL.
Tutaj przecinek.
I w tym wypadku będzie to.
W tym wypadku będzie to pies.
I tutaj.
Również.
Nie jest to też o tyle idealne, bo jeżeli faktycznie ścieżka różni się w różnych
wersjach językowych, to oczywiście tam nie zadziała.
Ale jest to tak zwany hack, żeby po prostu
móc coś z tym zrobić i zamiast marnować tę wartość na to, możemy zrobić tutaj Elsa.
Wstawić to w tym miejscu.
I ustawić dane sektora na tę wartość, czyli link links.
Średnik.
Albo inna data.
I zapiszemy.
Mam nadzieję, że teraz się normalnie przygotujesz.
Tekst Wróćmy na stronę główną.
Tutaj już widzimy, że faktycznie nasze
strony dynamiczne są w pełni przetłumaczone.
Jest to w języku hiszpańskim.
Przejdź na stronę główną.
Pokazało się nam Page Fund.
Z jakiegoś powodu
język się chyba nie ustawił poprawnie, ponieważ linki nie są linkami naftowymi.
Tutaj jest bezpośredni link html owy, ale to co jesteśmy w stanie zrobić to
przeglądać różne informacje na temat różnych autorów.
W. 3.
W tym momencie języka czy jesteśmy w stanie przełączyć na francuski?
I faktycznie przeglądać informacje w języku francuskim.
Jak widzimy, nie wszystkie informacje są dostępne w każdym języku.
Po angielsku jest ich tutaj najwięcej.
W przypadku Janusza Korczaka
i tutaj też moglibyśmy pozbyć się tego przejścia, aby ładnie mieć przeładowanie
całej strony, a nie, że niezależnie jak się przeładowuje translację, Julia ma
niezależnie translację treści naszej strony.
Tutaj jest jeszcze nie przetłumaczone to zachowane referencja.
W związku z czym przejdźmy na szybko do index.php.
Który zmieniliśmy nazwę na inny.
I tutaj w tym miejscu.
Pozbądźmy się tych referencji.
Moglibyśmy oczywiście je wyrenderować.
One nie zawsze wracają z API w pełni.
Uzupełnione.
W związku z czym mamy ten komponent już w czystym stanie.
Niestety nie było to najprostsze, bo
musieliśmy zmienić kilka kluczowych miejsc w naszej aplikacji.
Ale jesteśmy w stanie
serwować różne strony w ich specyficznych wersjach językowych.
Zmiany wprowadzone w lekcji · 17 min
diff --git a/29/minipedia/.env b/29/minipedia/.env
index 249a01d..4546942 100644
--- a/29/minipedia/.env
+++ b/29/minipedia/.env
@@ -1,3 +1,4 @@
BASIC_ENABLED=false
PASSWORD=password
-USERNAME=admin
\ No newline at end of file
+USERNAME=admin
+BOT_USER_AGENT=api-test (https://api-test; my@email) wiki.js
\ No newline at end of file
diff --git a/29/minipedia/api/routes/wiki.js b/29/minipedia/api/routes/wiki.js
index 194cd4a..5e8b930 100644
--- a/29/minipedia/api/routes/wiki.js
+++ b/29/minipedia/api/routes/wiki.js
@@ -2,24 +2,17 @@ import { Router } from 'express';
import WikiJs from 'wikijs';
const router = Router();
-const Wiki = WikiJs({
- apiUrl: 'https://en.wikipedia.org/w/api.php',
- headers: { 'User-Agent': 'api-test (https://api-test; my@email) wiki.js'}
-});
-router.get('/info/page/:id/property/:property', async (req, res) => {
- const id = req.params.id;
- const property = req.params.property;
+router.get('/content/page/:id/lang/:lang', async (req, res) => {
+ const lang = req.params.lang || 'en';
+ const Wiki = WikiJs({
+ apiUrl: `https://${lang}.wikipedia.org/w/api.php`,
+ headers: { 'User-Agent': process.env.BOT_USER_AGENT}
+ });
- const page = await Wiki.page(id);
- const info = await page.info(property);
-
- return res.status(200).json({ info });
-});
-
-router.get('/content/page/:id', async (req, res) => {
try {
const id = req.params.id;
+
const page = await Wiki.page(id);
const content = await page.content();
return res.status(200).json(content);
@@ -30,9 +23,16 @@ router.get('/content/page/:id', async (req, res) => {
}
});
-router.get('/rawImages/page/:id', async (req, res) => {
+router.get('/rawImages/page/:id/lang/:lang', async (req, res) => {
+ const lang = req.params.lang || 'en';
+ const Wiki = WikiJs({
+ apiUrl: `https://${lang}.wikipedia.org/w/api.php`,
+ headers: { 'User-Agent': process.env.BOT_USER_AGENT}
+ });
+
try {
const id = req.params.id;
+
const page = await Wiki.page(id);
const content = await page.rawImages();
return res.status(200).json(content);
@@ -43,9 +43,15 @@ router.get('/rawImages/page/:id', async (req, res) => {
}
});
-router.get('/summary/page/:id', async (req, res) => {
+router.get('/summary/page/:id/lang/:lang', async (req, res) => {
+ const lang = req.params.lang || 'en';
+ const Wiki = WikiJs({
+ apiUrl: `https://${lang}.wikipedia.org/w/api.php`,
+ headers: { 'User-Agent': process.env.BOT_USER_AGENT}
+ });
try {
const id = req.params.id;
+
const page = await Wiki.page(id);
const content = await page.summary();
return res.status(200).json(content);
@@ -56,9 +62,15 @@ router.get('/summary/page/:id', async (req, res) => {
}
});
-router.get('/langlinks/page/:id', async (req, res) => {
+router.get('/langlinks/page/:id/lang/:lang', async (req, res) => {
+ const lang = req.params.lang || 'en';
+ const Wiki = WikiJs({
+ apiUrl: `https://${lang}.wikipedia.org/w/api.php`,
+ headers: { 'User-Agent': process.env.BOT_USER_AGENT}
+ });
try {
const id = req.params.id;
+
const page = await Wiki.page(id);
const content = await page.langlinks();
return res.status(200).json(content);
@@ -68,9 +80,16 @@ router.get('/langlinks/page/:id', async (req, res) => {
return res.status(500).json(e);
}
});
-router.get('/summary/page/:id', async (req, res) => {
+
+router.get('/summary/page/:id/lang/:lang', async (req, res) => {
+ const lang = req.params.lang || 'en';
+ const Wiki = WikiJs({
+ apiUrl: `https://${lang}.wikipedia.org/w/api.php`,
+ headers: { 'User-Agent': process.env.BOT_USER_AGENT}
+ });
try {
const id = req.params.id;
+
const page = await Wiki.page(id);
const content = await page.summary();
return res.status(200).json(content);
@@ -81,9 +100,15 @@ router.get('/summary/page/:id', async (req, res) => {
}
});
-router.get('/mainImage/page/:id', async (req, res) => {
+router.get('/mainImage/page/:id/lang/:lang', async (req, res) => {
+ const lang = req.params.lang || 'en';
+ const Wiki = WikiJs({
+ apiUrl: `https://${lang}.wikipedia.org/w/api.php`,
+ headers: { 'User-Agent': process.env.BOT_USER_AGENT}
+ });
try {
const id = req.params.id;
+
const page = await Wiki.page(id);
const content = await page.mainImage();
return res.status(200).json(content);
@@ -94,9 +119,15 @@ router.get('/mainImage/page/:id', async (req, res) => {
});
-router.get('/fullInfo/page/:id', async (req, res) => {
+router.get('/fullInfo/page/:id/lang/:lang', async (req, res) => {
+ const lang = req.params.lang || 'en';
+ const Wiki = WikiJs({
+ apiUrl: `https://${lang}.wikipedia.org/w/api.php`,
+ headers: { 'User-Agent': process.env.BOT_USER_AGENT}
+ });
try {
const id = req.params.id;
+
const page = await Wiki.page(id);
const content = await page.fullInfo();
return res.status(200).json(content);
diff --git a/29/minipedia/middleware/wiki-routing.js b/29/minipedia/middleware/wiki-routing.js
index 6b125b9..e1b3904 100644
--- a/29/minipedia/middleware/wiki-routing.js
+++ b/29/minipedia/middleware/wiki-routing.js
@@ -1,13 +1,14 @@
export default async function ({ store, route, $axios, app: { i18n }}) {
const path = route.params.id;
+ const lang = i18n.locale;
+
try {
- store.commit('setFullInfo', await $axios.$get('/api/wiki/fullInfo/page/' + path))
- store.commit('setContent', await $axios.$get('/api/wiki/content/page/' + path))
- store.commit('setSummary', await $axios.$get('/api/wiki/summary/page/' + path))
- store.commit('setRawImages', await $axios.$get('/api/wiki/rawImages/page/' + path))
- store.commit('setMainImage', await $axios.$get('/api/wiki/mainImage/page/' + path))
+ store.commit('setFullInfo', await $axios.$get(`/api/wiki/fullInfo/page/${path}/lang/${lang}`))
+ store.commit('setContent', await $axios.$get(`/api/wiki/content/page/${path}/lang/${lang}`))
+ store.commit('setSummary', await $axios.$get(`/api/wiki/summary/page/${path}/lang/${lang}`))
+ store.commit('setRawImages', await $axios.$get(`/api/wiki/rawImages/page/${path}/lang/${lang}`))
+ store.commit('setMainImage', await $axios.$get(`/api/wiki/mainImage/page/${path}/lang/${lang}`))
} catch (e) {
console.error(e);
}
-
}
diff --git a/29/minipedia/middleware/wiki-translations.js b/29/minipedia/middleware/wiki-translations.js
index 69831be..f0487c3 100644
--- a/29/minipedia/middleware/wiki-translations.js
+++ b/29/minipedia/middleware/wiki-translations.js
@@ -1,15 +1,29 @@
-export default async function ({ store, route, $axios }) {
+export default async function ({ store, route, $axios, app: { i18n }}) {
const path = route.params.id;
- try {
- const data = await $axios.$get('/api/wiki/langlinks/page/' + path);
+ const lang = i18n.locale;
- data.push({
- lang: 'en',
- title: null,
- url: 'https://en.wikipedia.org/w/api.php',
- })
- store.commit('setLangLinks', data);
- } catch (e) {
- console.error(e);
- }
+ if (!path) {
+ const data = [
+ {
+ lang: 'en',
+ url: `https://en.wikipedia.org/w/api.php`,
+ },
+ {
+ url: `https://en.wikipedia.org/w/api.php`,
+ lang: 'fr',
+ },
+ {
+ url: `https://es.wikipedia.org/w/api.php`,
+ lang: 'es',
+ },
+ ];
+ store.commit('setLangLinks', data);
+ } else {
+ try {
+ const data = await $axios.$get(`/api/wiki/langlinks/page/${path}/lang/${lang}`);
+ store.commit('setLangLinks', data);
+ } catch (e) {
+ console.error(e);
+ }
+ }
}
diff --git a/29/minipedia/modules/envalid.js b/29/minipedia/modules/envalid.js
index 8c082f2..5284681 100644
--- a/29/minipedia/modules/envalid.js
+++ b/29/minipedia/modules/envalid.js
@@ -13,6 +13,7 @@ export default function () {
cleanEnv(process.env, {
USERNAME: str(),
PASSWORD: str(),
+ BOT_USER_AGENT: str(),
BASIC_ENABLED: bool()
})
}
diff --git a/29/minipedia/report.20210507.121354.76528.0.001.json b/29/minipedia/report.20210507.121354.76528.0.001.json
new file mode 100644
index 0000000..d545784
--- /dev/null
+++ b/29/minipedia/report.20210507.121354.76528.0.001.json
@@ -0,0 +1,715 @@
+
+{
+ "header": {
+ "reportVersion": 1,
+ "event": "Allocation failed - JavaScript heap out of memory",
+ "trigger": "FatalError",
+ "filename": "report.20210507.121354.76528.0.001.json",
+ "dumpEventTime": "2021-05-07T12:13:54Z",
+ "dumpEventTimeStamp": "1620382434999",
+ "processId": 76528,
+ "cwd": "/Users/Worie/Documents/Programowanie/company/eduweb/nuxt/29/minipedia",
+ "commandLine": [
+ "node",
+ "/Users/Worie/Documents/Programowanie/company/eduweb/nuxt/29/minipedia/node_modules/.bin/nuxt"
+ ],
+ "nodejsVersion": "v12.12.0",
+ "wordSize": 64,
+ "arch": "x64",
+ "platform": "darwin",
+ "componentVersions": {
+ "node": "12.12.0",
+ "v8": "7.7.299.13-node.12",
+ "uv": "1.32.0",
+ "zlib": "1.2.11",
+ "brotli": "1.0.7",
+ "ares": "1.15.0",
+ "modules": "72",
+ "nghttp2": "1.39.2",
+ "napi": "5",
+ "llhttp": "1.1.4",
+ "http_parser": "2.8.0",
+ "openssl": "1.1.1d",
+ "cldr": "35.1",
+ "icu": "64.2",
+ "tz": "2019a",
+ "unicode": "12.1"
+ },
+ "release": {
+ "name": "node",
+ "headersUrl": "https://nodejs.org/download/release/v12.12.0/node-v12.12.0-headers.tar.gz",
+ "sourceUrl": "https://nodejs.org/download/release/v12.12.0/node-v12.12.0.tar.gz"
+ },
+ "osName": "Darwin",
+ "osRelease": "20.4.0",
+ "osVersion": "Darwin Kernel Version 20.4.0: Fri Mar 5 01:14:14 PST 2021; root:xnu-7195.101.1~3/RELEASE_X86_64",
+ "osMachine": "x86_64",
+ "cpus": [
+ {
+ "model": "Intel(R) Core(TM) i5-7267U CPU @ 3.10GHz",
+ "speed": 3100,
+ "user": 29865930,
+ "nice": 0,
+ "sys": 32985420,
+ "idle": 63390160,
+ "irq": 0
+ },
+ {
+ "model": "Intel(R) Core(TM) i5-7267U CPU @ 3.10GHz",
+ "speed": 3100,
+ "user": 12032500,
+ "nice": 0,
+ "sys": 20008280,
+ "idle": 94185640,
+ "irq": 0
+ },
+ {
+ "model": "Intel(R) Core(TM) i5-7267U CPU @ 3.10GHz",
+ "speed": 3100,
+ "user": 29383100,
+ "nice": 0,
+ "sys": 32421920,
+ "idle": 64421500,
+ "irq": 0
+ },
+ {
+ "model": "Intel(R) Core(TM) i5-7267U CPU @ 3.10GHz",
+ "speed": 3100,
+ "user": 11059480,
+ "nice": 0,
+ "sys": 18744570,
+ "idle": 96422330,
+ "irq": 0
+ }
+ ],
+ "networkInterfaces": [
+ {
+ "name": "lo0",
+ "internal": true,
+ "mac": "00:00:00:00:00:00",
+ "address": "127.0.0.1",
+ "netmask": "255.0.0.0",
+ "family": "IPv4"
+ },
+ {
+ "name": "lo0",
+ "internal": true,
+ "mac": "00:00:00:00:00:00",
+ "address": "::1",
+ "netmask": "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff",
+ "family": "IPv6",
+ "scopeid": 0
+ },
+ {
+ "name": "lo0",
+ "internal": true,
+ "mac": "00:00:00:00:00:00",
+ "address": "fe80::1",
+ "netmask": "ffff:ffff:ffff:ffff::",
+ "family": "IPv6",
+ "scopeid": 1
+ },
+ {
+ "name": "en0",
+ "internal": false,
+ "mac": "88:e9:fe:75:6b:b4",
+ "address": "fe80::c9a:714b:b34c:4913",
+ "netmask": "ffff:ffff:ffff:ffff::",
+ "family": "IPv6",
+ "scopeid": 8
+ },
+ {
+ "name": "en0",
+ "internal": false,
+ "mac": "88:e9:fe:75:6b:b4",
+ "address": "192.168.0.28",
+ "netmask": "255.255.255.0",
+ "family": "IPv4"
+ },
+ {
+ "name": "awdl0",
+ "internal": false,
+ "mac": "86:95:6b:01:3e:f8",
+ "address": "fe80::8495:6bff:fe01:3ef8",
+ "netmask": "ffff:ffff:ffff:ffff::",
+ "family": "IPv6",
+ "scopeid": 15
+ },
+ {
+ "name": "llw0",
+ "internal": false,
+ "mac": "86:95:6b:01:3e:f8",
+ "address": "fe80::8495:6bff:fe01:3ef8",
+ "netmask": "ffff:ffff:ffff:ffff::",
+ "family": "IPv6",
+ "scopeid": 16
+ },
+ {
+ "name": "utun0",
+ "internal": false,
+ "mac": "00:00:00:00:00:00",
+ "address": "fe80::55ae:3528:5962:ff63",
+ "netmask": "ffff:ffff:ffff:ffff::",
+ "family": "IPv6",
+ "scopeid": 17
+ },
+ {
+ "name": "utun1",
+ "internal": false,
+ "mac": "00:00:00:00:00:00",
+ "address": "fe80::f7d1:74c2:e035:edb2",
+ "netmask": "ffff:ffff:ffff:ffff::",
+ "family": "IPv6",
+ "scopeid": 18
+ },
+ {
+ "name": "en11",
+ "internal": false,
+ "mac": "ac:de:48:00:11:22",
+ "address": "fe80::aede:48ff:fe00:1122",
+ "netmask": "ffff:ffff:ffff:ffff::",
+ "family": "IPv6",
+ "scopeid": 7
+ }
+ ],
+ "host": "localhost"
+ },
+ "javascriptStack": {
+ "message": "No stack.",
+ "stack": [
+ "Unavailable."
+ ]
+ },
+ "nativeStack": [
+ {
+ "pc": "0x000000010014d93c",
+ "symbol": "report::TriggerNodeReport(v8::Isolate*, node::Environment*, char const*, char const*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, v8::Local<v8::String>) [/Users/Worie/.nvm/versions/node/v12.12.0/bin/node]"
+ },
+ {
+ "pc": "0x000000010007e87b",
+ "symbol": "node::OnFatalError(char const*, char const*) [/Users/Worie/.nvm/versions/node/v12.12.0/bin/node]"
+ },
+ {
+ "pc": "0x0000000100176137",
+ "symbol": "v8::Utils::ReportOOMFailure(v8::internal::Isolate*, char const*, bool) [/Users/Worie/.nvm/versions/node/v12.12.0/bin/node]"
+ },
+ {
+ "pc": "0x00000001001760d3",
+ "symbol": "v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, bool) [/Users/Worie/.nvm/versions/node/v12.12.0/bin/node]"
+ },
+ {
+ "pc": "0x00000001002fa185",
+ "symbol": "v8::internal::Heap::FatalProcessOutOfMemory(char const*) [/Users/Worie/.nvm/versions/node/v12.12.0/bin/node]"
+ },
+ {
+ "pc": "0x00000001002fb854",
+ "symbol": "v8::internal::Heap::RecomputeLimits(v8::internal::GarbageCollector) [/Users/Worie/.nvm/versions/node/v12.12.0/bin/node]"
+ },
+ {
+ "pc": "0x00000001002f8727",
+ "symbol": "v8::internal::Heap::PerformGarbageCollection(v8::internal::GarbageCollector, v8::GCCallbackFlags) [/Users/Worie/.nvm/versions/node/v12.12.0/bin/node]"
+ },
+ {
+ "pc": "0x00000001002f670d",
+ "symbol": "v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [/Users/Worie/.nvm/versions/node/v12.12.0/bin/node]"
+ },
+ {
+ "pc": "0x0000000100301e24",
+ "symbol": "v8::internal::Heap::AllocateRawWithLightRetry(int, v8::internal::AllocationType, v8::internal::AllocationAlignment) [/Users/Worie/.nvm/versions/node/v12.12.0/bin/node]"
+ },
+ {
+ "pc": "0x0000000100301e9f",
+ "symbol": "v8::internal::Heap::AllocateRawWithRetryOrFail(int, v8::internal::AllocationType, v8::internal::AllocationAlignment) [/Users/Worie/.nvm/versions/node/v12.12.0/bin/node]"
+ },
+ {
+ "pc": "0x00000001002cea97",
+ "symbol": "v8::internal::Factory::NewFillerObject(int, bool, v8::internal::AllocationType) [/Users/Worie/.nvm/versions/node/v12.12.0/bin/node]"
+ },
+ {
+ "pc": "0x00000001005f75f5",
+ "symbol": "v8::internal::Runtime_AllocateInYoungGeneration(int, unsigned long*, v8::internal::Isolate*) [/Users/Worie/.nvm/versions/node/v12.12.0/bin/node]"
+ },
+ {
+ "pc": "0x000000010092fa99",
+ "symbol": "Builtins_CEntry_Return1_DontSaveFPRegs_ArgvOnStack_NoBuiltinExit [/Users/Worie/.nvm/versions/node/v12.12.0/bin/node]"
+ }
+ ],
+ "javascriptHeap": {
+ "totalMemory": 2153562112,
+ "totalCommittedMemory": 2150029896,
+ "usedMemory": 2077693664,
+ "availableMemory": 48606928,
+ "memoryLimit": 2197815296,
+ "heapSpaces": {
+ "read_only_space": {
+ "memorySize": 262144,
+ "committedMemory": 32568,
+ "capacity": 261872,
+ "used": 32296,
+ "available": 229576
+ },
+ "new_space": {
+ "memorySize": 4194304,
+ "committedMemory": 1303968,
+ "capacity": 2094976,
+ "used": 317296,
+ "available": 1777680
+ },
+ "old_space": {
+ "memorySize": 1933946880,
+ "committedMemory": 1933860784,
+ "capacity": 1898102480,
+ "used": 1897850968,
+ "available": 251512
+ },
+ "code_space": {
+ "memorySize": 3309568,
+ "committedMemory": 3232608,
+ "capacity": 2663392,
+ "used": 2663392,
+ "available": 0
+ },
+ "map_space": {
+ "memorySize": 172232704,
+ "committedMemory": 171983456,
+ "capacity": 137462400,
+ "used": 137462400,
+ "available": 0
+ },
+ "large_object_space": {
+ "memorySize": 38412288,
+ "committedMemory": 38412288,
+ "capacity": 38266576,
+ "used": 38266576,
+ "available": 0
+ },
+ "code_large_object_space": {
+ "memorySize": 1204224,
+ "committedMemory": 1204224,
+ "capacity": 1100736,
+ "used": 1100736,
+ "available": 0
+ },
+ "new_large_object_space": {
+ "memorySize": 0,
+ "committedMemory": 0,
+ "capacity": 2094976,
+ "used": 0,
+ "available": 2094976
+ }
+ }
+ },
+ "resourceUsage": {
+ "userCpuSeconds": 137.337,
+ "kernelCpuSeconds": 6.46221,
+ "cpuConsumptionPercent": 17.3044,
+ "maxRss": 2321161388032,
+ "pageFaults": {
+ "IORequired": 38,
+ "IONotRequired": 796464
+ },
+ "fsActivity": {
+ "reads": 0,
+ "writes": 0
+ }
+ },
+ "libuv": [
+ ],
+ "environmentVariables": {
+ "npm_config_save_dev": "",
+ "npm_config_legacy_bundling": "",
+ "npm_config_dry_run": "",
+ "npm_config_viewer": "man",
+ "npm_config_only": "",
+ "npm_config_commit_hooks": "true",
+ "npm_config_browser": "",
+ "npm_config_also": "",
+ "npm_config_sign_git_commit": "",
+ "npm_config_rollback": "true",
+ "TERM_PROGRAM": "vscode",
+ "NODE": "/Users/Worie/.nvm/versions/node/v12.12.0/bin/node",
+ "npm_config_usage": "",
+ "npm_config_audit": "true",
+ "INIT_CWD": "/Users/Worie/Documents/Programowanie/company/eduweb/nuxt/29/minipedia",
+ "NVM_CD_FLAGS": "",
+ "npm_config_globalignorefile": "/Users/Worie/.nvm/versions/node/v12.12.0/etc/npmignore",
+ "SHELL": "/usr/local/bin/fish",
+ "TERM": "xterm-256color",
+ "npm_config_shell": "/usr/local/bin/fish",
+ "npm_config_maxsockets": "50",
+ "npm_config_init_author_url": "",
+ "OMF_CONFIG": "/Users/Worie/.config/omf",
+ "npm_config_shrinkwrap": "true",
+ "npm_config_parseable": "",
+ "npm_config_metrics_registry": "https://registry.npmjs.org/",
+ "TMPDIR": "/var/folders/07/pk_w4g594tj1_2xbx67vq9hw0000gp/T/",
+ "npm_config_timing": "",
+ "npm_config_init_license": "ISC",
+ "npm_package_dependencies__nuxtjs_axios": "^5.13.1",
+ "npm_package_scripts_lint": "npm run lint:js",
+ "npm_config_if_present": "",
+ "TERM_PROGRAM_VERSION": "1.55.2",
+ "npm_package_scripts_dev": "nuxt",
+ "npm_config_sign_git_tag": "",
+ "npm_config_init_author_email": "",
+ "npm_config_cache_max": "Infinity",
+ "ORIGINAL_XDG_CURRENT_DESKTOP": "undefined",
+ "npm_config_preid": "",
+ "npm_config_long": "",
+ "npm_config_local_address": "",
+ "npm_config_git_tag_version": "true",
+ "npm_config_cert": "",
+ "TERM_SESSION_ID": "w0t0p0:85405BDF-F097-4F58-8EAB-43CB78654DBC",
+ "npm_config_registry": "https://registry.npmjs.org/",
+ "npm_config_noproxy": "",
+ "npm_config_fetch_retries": "2",
+ "npm_package_private": "true",
+ "npm_package_scripts_generate": "nuxt generate",
+ "npm_config_versions": "",
+ "npm_config_message": "%s",
+ "npm_config_key": "",
+ "npm_config_kie_content_path": "/Users/Worie/Desktop/cwiczenie-flex/cwiczenie-flex/flex-exercise-5",
+ "npm_package_readmeFilename": "README.md",
+ "npm_package_description": "## Build Setup",
+ "USER": "worie",
+ "NVM_DIR": "/Users/Worie/.nvm",
+ "COMMAND_MODE": "unix2003",
+ "npm_config_globalconfig": "/Users/Worie/.nvm/versions/node/v12.12.0/etc/npmrc",
+ "npm_config_prefer_online": "",
+ "npm_config_logs_max": "10",
+ "npm_config_always_auth": "",
+ "npm_package_dependencies_lodash": "^4.17.21",
+ "npm_package_dependencies_envalid": "^7.1.0",
+ "SSH_AUTH_SOCK": "/private/tmp/com.apple.launchd.dG7lSiToP9/Listeners",
+ "npm_package_devDependencies_eslint": "^7.22.0",
+ "__CF_USER_TEXT_ENCODING": "0x1F6:0x0:0x2",
+ "npm_execpath": "/Users/Worie/.nvm/versions/node/v12.12.0/lib/node_modules/npm/bin/npm-cli.js",
+ "npm_config_global_style": "",
+ "npm_config_cache_lock_retries": "10",
+ "npm_config_update_notifier": "true",
+ "npm_config_cafile": "",
+ "npm_config_heading": "npm",
+ "npm_config_audit_level": "low",
+ "npm_config_searchlimit": "20",
+ "npm_config_read_only": "",
+ "npm_config_offline": "",
+ "npm_config_fetch_retry_mintimeout": "10000",
+ "npm_config_json": "",
+ "npm_config_access": "",
+ "npm_config_argv": "{\"remain\":[],\"cooked\":[\"run\",\"dev\"],\"original\":[\"run\",\"dev\"]}",
+ "npm_package_dependencies_v_tooltip": "^2.1.3",
+ "PATH": "/Users/Worie/.nvm/versions/node/v12.12.0/lib/node_modules/npm/node_modules/npm-lifecycle/node-gyp-bin:/Users/Worie/Documents/Programowanie/company/eduweb/nuxt/29/minipedia/node_modules/.bin:/Users/Worie/.nvm/versions/node/v12.12.0/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/aria2/bin:/Applications/Little Snitch.app/Contents/Components:/usr/local/share/dotnet:~/.dotnet/tools:./node_modules/.bin",
+ "npm_config_allow_same_version": "",
+ "npm_config_https_proxy": "",
+ "npm_config_engine_strict": "",
+ "npm_config_description": "true",
+ "LaunchInstanceID": "984E9555-3E7B-483A-869F-ACB88DE693A7",
+ "npm_config_userconfig": "/Users/Worie/.npmrc",
+ "npm_config_init_module": "/Users/Worie/.npm-init.js",
+ "__CFBundleIdentifier": "com.googlecode.iterm2",
+ "npm_config_cidr": "",
+ "PWD": "/Users/Worie/Documents/Programowanie/company/eduweb/nuxt/29/minipedia",
+ "npm_config_user": "502",
+ "npm_config_node_version": "12.12.0",
+ "npm_package_dependencies_core_js": "^3.9.1",
+ "npm_lifecycle_event": "dev",
+ "npm_config_save": "true",
+ "npm_config_ignore_prepublish": "",
+ "npm_config_editor": "vi",
+ "npm_config_auth_type": "legacy",
+ "npm_package_name": "minipedia",
+ "LANG": "en_GB.UTF-8",
+ "npm_config_tag": "latest",
+ "npm_config_script_shell": "",
+ "npm_package_dependencies_body_parser": "^1.19.0",
+ "ITERM_PROFILE": "Hotkey Window",
+ "npm_config_progress": "true",
+ "npm_config_global": "",
+ "npm_config_before": "",
+ "npm_package_scripts_start": "nuxt start",
+ "npm_package_scripts_build": "nuxt build",
+ "npm_config_searchstaleness": "900",
+ "npm_config_optional": "true",
+ "npm_config_ham_it_up": "",
+ "XPC_FLAGS": "0x0",
+ "npm_config_save_prod": "",
+ "npm_config_force": "",
+ "npm_config_bin_links": "true",
+ "npm_config_searchopts": "",
+ "npm_config_node_gyp": "/Users/Worie/.nvm/versions/node/v12.12.0/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js",
+ "npm_config_depth": "Infinity",
+ "npm_config_sso_poll_frequency": "500",
+ "npm_config_rebuild_bundle": "true",
+ "npm_package_version": "1.0.0",
+ "XPC_SERVICE_NAME": "0",
+ "npm_config_unicode": "true",
+ "SHLVL": "4",
+ "HOME": "/Users/Worie",
+ "COLORFGBG": "15;0",
+ "npm_config_fetch_retry_maxtimeout": "60000",
+ "npm_package_devDependencies_eslint_plugin_vue": "^7.7.0",
+ "VSCODE_GIT_ASKPASS_MAIN": "/Applications/Visual Studio Code.app/Contents/Resources/app/extensions/git/dist/askpass-main.js",
+ "APPLICATION_INSIGHTS_NO_DIAGNOSTIC_CHANNEL": "true",
+ "npm_config_tag_version_prefix": "v",
+ "npm_config_strict_ssl": "true",
+ "npm_config_sso_type": "oauth",
+ "npm_config_scripts_prepend_node_path": "warn-only",
+ "npm_config_save_prefix": "^",
+ "npm_config_loglevel": "notice",
+ "npm_config_ca": "",
+ "npm_package_dependencies_dotenv": "^9.0.0",
+ "LC_TERMINAL_VERSION": "3.4.4",
+ "npm_config_save_exact": "",
+ "npm_config_group": "20",
+ "npm_config_fetch_retry_factor": "10",
+ "npm_config_dev": "",
+ "npm_package_devDependencies_babel_eslint": "^10.1.0",
+ "OMF_PATH": "/Users/Worie/.local/share/omf",
+ "npm_config_version": "",
+ "npm_config_prefer_offline": "",
+ "npm_config_cache_lock_stale": "60000",
+ "npm_package_dependencies_nuxt_i18n": "^6.27.0",
+ "npm_package_dependencies_nuxt_basic_auth_module": "^1.4.0",
+ "npm_package_scripts_lint_js": "eslint --ext \".js,.vue\" --ignore-path .gitignore .",
+ "npm_config_otp": "",
+ "npm_config_cache_min": "10",
+ "ITERM_SESSION_ID": "w0t0p0:85405BDF-F097-4F58-8EAB-43CB78654DBC",
+ "npm_config_searchexclude": "",
+ "npm_config_cache": "/Users/Worie/.npm",
+ "LOGNAME": "worie",
+ "npm_lifecycle_script": "nuxt",
+ "npm_config_color": "true",
+ "npm_config_proxy": "",
+ "npm_config_package_lock": "true",
+ "npm_package_devDependencies_eslint_plugin_nuxt": "^2.0.0",
+ "LC_CTYPE": "UTF-8",
+ "VSCODE_GIT_IPC_HANDLE": "/var/folders/07/pk_w4g594tj1_2xbx67vq9hw0000gp/T/vscode-git-8cae7e089a.sock",
+ "npm_config_package_lock_only": "",
+ "npm_config_save_optional": "",
+ "NVM_BIN": "/Users/Worie/.nvm/versions/node/v12.12.0/bin",
+ "npm_config_ignore_scripts": "",
+ "npm_config_user_agent": "npm/6.11.3 node/v12.12.0 darwin x64",
+ "npm_package_devDependencies__nuxtjs_eslint_config": "^6.0.0",
+ "npm_config_cache_lock_wait": "10000",
+ "VSCODE_GIT_ASKPASS_NODE": "/Applications/Visual Studio Code.app/Contents/Frameworks/Code Helper (Renderer).app/Contents/MacOS/Code Helper (Renderer)",
+ "GIT_ASKPASS": "/Applications/Visual Studio Code.app/Contents/Resources/app/extensions/git/dist/askpass.sh",
+ "npm_config_production": "",
+ "npm_package_dependencies_nuxt": "^2.15.3",
+ "LC_TERMINAL": "iTerm2",
+ "npm_config_send_metrics": "",
+ "npm_config_save_bundle": "",
+ "npm_package_dependencies_express": "^4.17.1",
+ "npm_config_umask": "0022",
+ "npm_config_node_options": "",
+ "npm_config_init_version": "1.0.0",
+ "npm_config_init_author_name": "",
+ "npm_config_git": "git",
+ "npm_config_scope": "",
+ "SECURITYSESSIONID": "186be",
+ "npm_config_unsafe_perm": "true",
+ "npm_config_tmp": "/var/folders/07/pk_w4g594tj1_2xbx67vq9hw0000gp/T",
+ "npm_config_onload_script": "",
+ "npm_package_devDependencies__nuxtjs_eslint_module": "^3.0.2",
+ "npm_node_execpath": "/Users/Worie/.nvm/versions/node/v12.12.0/bin/node",
+ "npm_config_prefix": "/Users/Worie/.nvm/versions/node/v12.12.0",
+ "npm_config_link": "",
+ "COLORTERM": "truecolor",
+ "_": "/Users/Worie/Documents/Programowanie/company/eduweb/nuxt/29/minipedia/node_modules/.bin/nuxt",
+ "NODE_ENV": "development",
+ "_applied": "true",
+ "BASIC_ENABLED": "false",
+ "PASSWORD": "password",
+ "USERNAME": "admin",
+ "VUE_ENV": "server",
+ "_AXIOS_BASE_URL_": "http://localhost:8000",
+ "BOT_USER_AGENT": "api-test (https://api-test; my@email) wiki.js"
+ },
+ "userLimits": {
+ "core_file_size_blocks": {
+ "soft": 0,
+ "hard": "unlimited"
+ },
+ "data_seg_size_kbytes": {
+ "soft": "unlimited",
+ "hard": "unlimited"
+ },
+ "file_size_blocks": {
+ "soft": "unlimited",
+ "hard": "unlimited"
+ },
+ "max_locked_memory_bytes": {
+ "soft": "unlimited",
+ "hard": "unlimited"
+ },
+ "max_memory_size_kbytes": {
+ "soft": "unlimited",
+ "hard": "unlimited"
+ },
+ "open_files": {
+ "soft": 1048575,
+ "hard": "unlimited"
+ },
+ "stack_size_bytes": {
+ "soft": 8388608,
+ "hard": 67104768
+ },
+ "cpu_time_seconds": {
+ "soft": "unlimited",
+ "hard": "unlimited"
+ },
+ "max_user_processes": {
+ "soft": 2784,
+ "hard": 4176
+ },
+ "virtual_memory_kbytes": {
+ "soft": "unlimited",
+ "hard": "unlimited"
+ }
+ },
+ "sharedObjects": [
+ "/Users/Worie/.nvm/versions/node/v12.12.0/bin/node",
+ "/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation",
+ "/usr/lib/libSystem.B.dylib",
+ "/usr/lib/libc++.1.dylib",
+ "/usr/lib/libobjc.A.dylib",
+ "/usr/lib/liboah.dylib",
+ "/usr/lib/libfakelink.dylib",
+ "/usr/lib/libicucore.A.dylib",
+ "/System/Library/PrivateFrameworks/SoftLinking.framework/Versions/A/SoftLinking",
+ "/usr/lib/libc++abi.dylib",
+ "/usr/lib/system/libcache.dylib",
+ "/usr/lib/system/libcommonCrypto.dylib",
+ "/usr/lib/system/libcompiler_rt.dylib",
+ "/usr/lib/system/libcopyfile.dylib",
+ "/usr/lib/system/libcorecrypto.dylib",
+ "/usr/lib/system/libdispatch.dylib",
+ "/usr/lib/system/libdyld.dylib",
+ "/usr/lib/system/libkeymgr.dylib",
+ "/usr/lib/system/liblaunch.dylib",
+ "/usr/lib/system/libmacho.dylib",
+ "/usr/lib/system/libquarantine.dylib",
+ "/usr/lib/system/libremovefile.dylib",
+ "/usr/lib/system/libsystem_asl.dylib",
+ "/usr/lib/system/libsystem_blocks.dylib",
+ "/usr/lib/system/libsystem_c.dylib",
+ "/usr/lib/system/libsystem_collections.dylib",
+ "/usr/lib/system/libsystem_configuration.dylib",
+ "/usr/lib/system/libsystem_containermanager.dylib",
+ "/usr/lib/system/libsystem_coreservices.dylib",
+ "/usr/lib/system/libsystem_darwin.dylib",
+ "/usr/lib/system/libsystem_dnssd.dylib",
+ "/usr/lib/system/libsystem_featureflags.dylib",
+ "/usr/lib/system/libsystem_info.dylib",
+ "/usr/lib/system/libsystem_m.dylib",
+ "/usr/lib/system/libsystem_malloc.dylib",
+ "/usr/lib/system/libsystem_networkextension.dylib",
+ "/usr/lib/system/libsystem_notify.dylib",
+ "/usr/lib/system/libsystem_product_info_filter.dylib",
+ "/usr/lib/system/libsystem_sandbox.dylib",
+ "/usr/lib/system/libsystem_secinit.dylib",
+ "/usr/lib/system/libsystem_kernel.dylib",
+ "/usr/lib/system/libsystem_platform.dylib",
+ "/usr/lib/system/libsystem_pthread.dylib",
+ "/usr/lib/system/libsystem_symptoms.dylib",
+ "/usr/lib/system/libsystem_trace.dylib",
+ "/usr/lib/system/libunwind.dylib",
+ "/usr/lib/system/libxpc.dylib",
+ "/Users/Worie/Documents/Programowanie/company/eduweb/nuxt/29/minipedia/node_modules/fsevents/fsevents.node",
+ "/System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices",
+ "/System/Library/Frameworks/CFNetwork.framework/Versions/A/CFNetwork",
+ "/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/FSEvents.framework/Versions/A/FSEvents",
+ "/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/CarbonCore.framework/Versions/A/CarbonCore",
+ "/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/Metadata.framework/Versions/A/Metadata",
+ "/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/OSServices.framework/Versions/A/OSServices",
+ "/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/SearchKit.framework/Versions/A/SearchKit",
+ "/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/AE.framework/Versions/A/AE",
+ "/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/LaunchServices",
+ "/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/DictionaryServices.framework/Versions/A/DictionaryServices",
+ "/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/SharedFileList.framework/Versions/A/SharedFileList",
+ "/System/Library/Frameworks/IOKit.framework/Versions/A/IOKit",
+ "/System/Library/Frameworks/Security.framework/Versions/A/Security",
+ "/System/Library/Frameworks/SystemConfiguration.framework/Versions/A/SystemConfiguration",
+ "/usr/lib/libapple_nghttp2.dylib",
+ "/usr/lib/libnetwork.dylib",
+ "/usr/lib/libsqlite3.dylib",
+ "/usr/lib/libz.1.dylib",
+ "/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation",
+ "/usr/lib/libDiagnosticMessagesClient.dylib",
+ "/usr/lib/libenergytrace.dylib",
+ "/usr/lib/libbsm.0.dylib",
+ "/usr/lib/system/libkxld.dylib",
+ "/usr/lib/libMobileGestalt.dylib",
+ "/System/Library/PrivateFrameworks/AppleFSCompression.framework/Versions/A/AppleFSCompression",
+ "/usr/lib/libcoretls.dylib",
+ "/usr/lib/libcoretls_cfhelpers.dylib",
+ "/usr/lib/libpam.2.dylib",
+ "/usr/lib/libxar.1.dylib",
+ "/System/Library/PrivateFrameworks/CoreAutoLayout.framework/Versions/A/CoreAutoLayout",
+ "/usr/lib/libcompression.dylib",
+ "/System/Library/Frameworks/DiskArbitration.framework/Versions/A/DiskArbitration",
+ "/usr/lib/libarchive.2.dylib",
+ "/usr/lib/libxml2.2.dylib",
+ "/usr/lib/liblangid.dylib",
+ "/usr/lib/libCRFSuite.dylib",
+ "/usr/lib/libpcap.A.dylib",
+ "/usr/lib/libdns_services.dylib",
+ "/usr/lib/liblzma.5.dylib",
+ "/usr/lib/libbz2.1.0.dylib",
+ "/usr/lib/libiconv.2.dylib",
+ "/usr/lib/libcharset.1.dylib",
+ "/System/Library/PrivateFrameworks/AppleSystemInfo.framework/Versions/A/AppleSystemInfo",
+ "/System/Library/PrivateFrameworks/IOMobileFramebuffer.framework/Versions/A/IOMobileFramebuffer",
+ "/System/Library/Frameworks/IOSurface.framework/Versions/A/IOSurface",
+ "/usr/lib/libCheckFix.dylib",
+ "/System/Library/PrivateFrameworks/TCC.framework/Versions/A/TCC",
+ "/System/Library/PrivateFrameworks/CoreNLP.framework/Versions/A/CoreNLP",
+ "/System/Library/PrivateFrameworks/MetadataUtilities.framework/Versions/A/MetadataUtilities",
+ "/usr/lib/libmecabra.dylib",
+ "/System/Library/Frameworks/MLCompute.framework/Versions/A/MLCompute",
+ "/System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate",
+ "/usr/lib/libmecab.dylib",
+ "/usr/lib/libgermantok.dylib",
+ "/usr/lib/libThaiTokenizer.dylib",
+ "/usr/lib/libChineseTokenizer.dylib",
+ "/System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/MetalPerformanceShaders",
+ "/System/Library/Frameworks/Metal.framework/Versions/A/Metal",
+ "/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vImage.framework/Versions/A/vImage",
+ "/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/vecLib",
+ "/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libvMisc.dylib",
+ "/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libvDSP.dylib",
+ "/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib",
+ "/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libLAPACK.dylib",
+ "/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libLinearAlgebra.dylib",
+ "/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libSparseBLAS.dylib",
+ "/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libQuadrature.dylib",
+ "/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBNNS.dylib",
+ "/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libSparse.dylib",
+ "/System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSCore.framework/Versions/A/MPSCore",
+ "/System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSImage.framework/Versions/A/MPSImage",
+ "/System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSNeuralNetwork.framework/Versions/A/MPSNeuralNetwork",
+ "/System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSMatrix.framework/Versions/A/MPSMatrix",
+ "/System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSRayIntersector.framework/Versions/A/MPSRayIntersector",
+ "/System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSNDArray.framework/Versions/A/MPSNDArray",
+ "/System/Library/PrivateFrameworks/MetalTools.framework/Versions/A/MetalTools",
+ "/System/Library/PrivateFrameworks/AggregateDictionary.framework/Versions/A/AggregateDictionary",
+ "/System/Library/PrivateFrameworks/CoreAnalytics.framework/Versions/A/CoreAnalytics",
+ "/System/Library/PrivateFrameworks/AppleSauce.framework/Versions/A/AppleSauce",
+ "/System/Library/PrivateFrameworks/IOAccelerator.framework/Versions/A/IOAccelerator",
+ "/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libCoreFSCache.dylib",
+ "/System/Library/PrivateFrameworks/LanguageModeling.framework/Versions/A/LanguageModeling",
+ "/System/Library/PrivateFrameworks/CoreEmoji.framework/Versions/A/CoreEmoji",
+ "/System/Library/PrivateFrameworks/LinguisticData.framework/Versions/A/LinguisticData",
+ "/System/Library/PrivateFrameworks/Lexicon.framework/Versions/A/Lexicon",
+ "/usr/lib/libcmph.dylib",
+ "/System/Library/Frameworks/OpenDirectory.framework/Versions/A/Frameworks/CFOpenDirectory.framework/Versions/A/CFOpenDirectory",
+ "/System/Library/Frameworks/OpenDirectory.framework/Versions/A/OpenDirectory",
+ "/System/Library/PrivateFrameworks/APFS.framework/Versions/A/APFS",
+ "/System/Library/Frameworks/SecurityFoundation.framework/Versions/A/SecurityFoundation",
+ "/usr/lib/libutil.dylib",
+ "/usr/lib/libapp_launch_measurement.dylib",
+ "/System/Library/PrivateFrameworks/CoreServicesStore.framework/Versions/A/CoreServicesStore",
+ "/System/Library/Frameworks/ServiceManagement.framework/Versions/A/ServiceManagement",
+ "/usr/lib/libxslt.1.dylib",
+ "/System/Library/PrivateFrameworks/BackgroundTaskManagement.framework/Versions/A/BackgroundTaskManagement"
+ ]
+}
\ No newline at end of file
diff --git a/29/minipedia/store/index.js b/29/minipedia/store/index.js
index 279a5b1..4d6bdeb 100644
--- a/29/minipedia/store/index.js
+++ b/29/minipedia/store/index.js
@@ -4,7 +4,7 @@ export const state = () => ({
summary: null,
rawImages: null,
mainImage: null,
- langlinks: null,
+ langlinks: [],
})
export const mutations = {