diff --git a/README.md b/README.md index f17a0af..a17bb18 100644 --- a/README.md +++ b/README.md @@ -36,17 +36,25 @@ Follow these simple steps to set up **Vacabulary Assistant** in your browser. No ### **1️⃣ Install Dependencies** Open a terminal and run the following command to install all required dependencies: ```sh -npm install +npm install --legacy-peer-deps ``` ### **2️⃣ Build the Extension** -Compile the project by running: + +**Для разработки и отладки:** ```sh -npm run build +npm run dev ``` -This will generate the necessary files: -- `page/page.ts` -- `popup/popup.ts` +Это создаст файлы с source maps для отладки: +- `dist/page/page.js` + `dist/page/page.js.map` +- `dist/popup/popup.js` + `dist/popup/popup.js.map` +- `dist/popup/popup.html` + +**Для production:** +```sh +npm run build:prod +``` +Это создаст минифицированные файлы для продакшена. ### **3️⃣ Enable Developer Mode in Chrome** 1. Open Google Chrome and navigate to: @@ -64,7 +72,25 @@ This will generate the necessary files: - You should see an option to save it to your vocabulary list. - Open the extension popup to view and manage your saved words. -### **6️⃣ You're All Set! 🎉** +### **6️⃣ Debugging 🔧** + +**Для отладки ошибок:** +1. Используйте `npm run dev` для сборки с source maps +2. Откройте DevTools в Chrome (F12) +3. Перейдите на вкладку Sources +4. Найдите файлы в папке `webpack://` → `src/` +5. Установите breakpoints для отладки + +**Пример отладки ошибки:** +```javascript +// Вместо минифицированного кода: +// TypeError: e.getBoundingClientRect is not a function at page.js:1:36036 + +// Теперь вы увидите исходный код: +// TypeError: e.getBoundingClientRect is not a function at ApiPageService.js:45:12 +``` + +### **7️⃣ You're All Set! 🎉** Your **Vacabulary Assistant** extension is now installed and ready to help you expand your vocabulary! If you encounter any issues, check the [GitHub Issues](https://github.com/Reckue/reckue-langs/issues) page or contribute improvements. ## Updates History: diff --git a/check-version.sh b/check-version.sh new file mode 100755 index 0000000..9df88e7 --- /dev/null +++ b/check-version.sh @@ -0,0 +1,29 @@ +#!/bin/bash + +echo "🔍 Проверка версии плагина..." + +# Проверяем версию в package.json +PACKAGE_VERSION=$(grep '"version"' package.json | cut -d'"' -f4) +echo "📦 Package.json версия: $PACKAGE_VERSION" + +# Проверяем версию в manifest.json +MANIFEST_VERSION=$(grep '"version"' manifest.json | cut -d'"' -f4) +echo "📋 Manifest.json версия: $MANIFEST_VERSION" + +# Проверяем имя в manifest.json +MANIFEST_NAME=$(grep '"name"' manifest.json | cut -d'"' -f4) +echo "🏷️ Имя плагина: $MANIFEST_NAME" + +# Определяем тип версии +if [[ $PACKAGE_VERSION == *"api"* ]]; then + echo "✅ Текущая версия: API (синхронизация с сервером)" +elif [[ $PACKAGE_VERSION == *"local"* ]]; then + echo "✅ Текущая версия: Local (локальное хранение)" +else + echo "❓ Неизвестная версия" +fi + +echo "" +echo "📝 Для переключения версий используйте:" +echo " ./switch-to-api.sh - переключиться на API версию" +echo " ./switch-to-local.sh - переключиться на локальную версию" \ No newline at end of file diff --git a/dist/page/page.js b/dist/page/page.js index 6633b57..6e0502e 100644 --- a/dist/page/page.js +++ b/dist/page/page.js @@ -1 +1,3648 @@ -(()=>{var e={14:(e,t,s)=>{var i=s(345);e.exports=(i.default||i).apply(i,[])},63:(e,t,s)=>{var i=s(623);e.exports=(i.default||i).apply(i,[])},827:(e,t,s)=>{var i=s(70);e.exports=(i.default||i).apply(i,[])},345:(e,t,s)=>{s(55),e.exports=function(e){return""+''}},748:(e,t,s)=>{var i=s(55);e.exports=function(e){var t,s="",n=e||{};return function(e,n){s=s+'
+'+i.escape(null==(t=e)?"":t)+'-
'}.call(this,"number"in n?n.number:"undefined"!=typeof number?number:void 0,"width"in n?n.width:"undefined"!=typeof width?width:void 0),s}},623:(e,t,s)=>{s(55),e.exports=function(e){return""+'
'}},138:(e,t,s)=>{var i=s(55);e.exports=function(e){var t,s="",n=e||{};return function(e,n,r){s=s+'
"+i.escape(null==(t=r)?"":t)+"
cursor-x:"+i.escape(null==(t=n.cursor.x)?"":t)+"
cursor-y:"+i.escape(null==(t=n.cursor.y)?"":t)+"
block-width:"+i.escape(null==(t=n.block.width)?"":t)+"
block-height:"+i.escape(null==(t=n.block.height)?"":t)+"
text-length:"+i.escape(null==(t=n.textLength)?"":t)+"
text-blocks-count:"+i.escape(null==(t=n.textBlocksCount)?"":t)+"
text-block-index:"+i.escape(null==(t=n.currentLine)?"":t)+"
text-block-size-width:"+i.escape(null==(t=n.currentTextBlockSize.width)?"":t)+"
text-block-size-height:"+i.escape(null==(t=n.currentTextBlockSize.height)?"":t)+"
\x3c!--div--\x3e\x3c!-- span gap-height:--\x3e\x3c!-- span= netGraph.gapHeight--\x3e\x3c!----\x3e\x3c!--div--\x3e\x3c!-- span count-gaps:--\x3e\x3c!-- span= netGraph.countGaps--\x3e
real-height:"+i.escape(null==(t=n.realHeight)?"":t)+"
coefficient:"+i.escape(null==(t=n.coefficient)?"":t)+"
\x3c!--div--\x3e\x3c!-- span text-block-width:--\x3e\x3c!-- span= textBlock.width--\x3e\x3c!--div--\x3e\x3c!-- span text-block-height:--\x3e\x3c!-- span= textBlock.height--\x3e\x3c!--div--\x3e\x3c!-- span index:--\x3e\x3c!-- span= index--\x3e\x3c!--div--\x3e\x3c!-- span line:--\x3e\x3c!-- span= line--\x3e\x3c!--div--\x3e\x3c!-- span text-length:--\x3e\x3c!-- span= length--\x3e\x3c!--div--\x3e\x3c!-- span one-symbol-width:--\x3e\x3c!-- span= one--\x3e\x3c!--div--\x3e\x3c!-- span cursor-offset-width:--\x3e\x3c!-- span= offset.width--\x3e\x3c!--div--\x3e\x3c!-- span cursor-offset-height:--\x3e\x3c!-- span= offset.height--\x3e\x3c!--div--\x3e\x3c!-- span block-width:--\x3e\x3c!-- span= block.width--\x3e\x3c!--div--\x3e\x3c!-- span block-height:--\x3e\x3c!-- span= block.height--\x3e\x3c!--div--\x3e\x3c!-- span cursor-x:--\x3e\x3c!-- span= eventInfo.x--\x3e\x3c!--div--\x3e\x3c!-- span cursor-y:--\x3e\x3c!-- span= eventInfo.y--\x3e\x3c!--.edit-button EDIT--\x3e
"}.call(this,"href"in n?n.href:"undefined"!=typeof href?href:void 0,"netGraph"in n?n.netGraph:"undefined"!=typeof netGraph?netGraph:void 0,"word"in n?n.word:"undefined"!=typeof word?word:void 0),s}},70:(e,t,s)=>{s(55),e.exports=function(e){return""+""}},55:(e,t,s)=>{"use strict";var i=Object.prototype.hasOwnProperty;function n(e,t){return Array.isArray(e)?function(e,t){for(var s,i="",r="",o=Array.isArray(t),a=0;a]/;function c(e){var t=""+e,s=a.exec(t);if(!s)return e;var i,n,r,o="";for(i=s.index,n=0;i ":" ")+s+"| "+e})).join("\n"),t.path=i,t.message=(i||"Pug")+":"+n+"\n"+o+"\n\n"+t.message,t}},835:()=>{}},t={};function s(i){var n=t[i];if(void 0!==n)return n.exports;var r=t[i]={exports:{}};return e[i](r,r.exports,s),r.exports}(()=>{"use strict";class e{log=e=>{window.console.log("Reckue language app: "+e)};#e=e=>{window.console.log(e.textContent),window.console.log(e.toString()),window.console.log(e.parentNode.toString()),window.console.log(e.parentNode.nodeName),window.console.log(e.parentNode.role)}}const t=new Map;class i{static add=(e,s)=>{t.set(e,s)};static get=e=>t.get(e);static getWordbookService=()=>{const e=i.get("wordbook");if(e)return e}}class n{appParams=()=>new Promise((e=>{chrome.storage.local.get(["enable","russian","english","china","korean"],(t=>{i.add("settings",t),e(t.enable)}))}));saveWordbooks=e=>{chrome.storage.local.set(e)};getByName=e=>new Promise((t=>chrome.storage.local.get([e],(s=>t(s[e])))))}class r{#t;#s;#i;constructor(e,t){this.#t=e,this.#i=t}getCount=()=>this.#s;calcPagesCount=()=>(this.#s=Math.ceil(this.#t/this.#i),this.#s);isIndexOnPage=(e,t)=>t>=this.#n(e)&&te*this.#i;#r=e=>(e+1)*this.#i}class o{#o;#a;constructor(){this.#a=new Map,this.#o=new r(0,0)}remove=e=>{this.#a.delete(e),this.#o=new r(this.#a.size,50),this.#o.calcPagesCount()};set=e=>(e.forEach((e=>{this.#a.set(e.word,e.level)})),this.#o=new r(this.#a.size,50),this.#o.calcPagesCount(),this);get=()=>this.#a;getPages=()=>this.#o;getPage=e=>{let t=0;const s=new Map;return this.#a.forEach(((i,n)=>{this.#o.isIndexOnPage(e,t)&&s.set(n,i),t++})),s};toObject=()=>{const e={};return this.#c().forEach(((t,s)=>{e[this.getName(s)]=t})),e};getName=e=>"wordbook"+e;#h=()=>{const e=[];return this.#a.forEach(((t,s)=>{e.push({word:s,level:t})})),e};#c=()=>{const e=[[]];return this.#h().forEach((t=>this.#l(e,t))),e};#l=(e,t)=>{const s=e.length-1;e[s].length<100?e[s].push(t):(e.push([]),this.#l(e,t))}}class a{#d;#u;#p;#g;executeAfter=e=>{this.#g=e};constructor(){this.#d=new n,this.#u=new e,this.#p=new o}set=e=>{this.#p.set(e),this.#f()};remove=e=>{this.#p.remove(e),this.#f()};#f=()=>{const e=this.#p.toObject();this.#d.saveWordbooks(e)};getWordbook=()=>this.#p;getFilteredWordbook=e=>{const t=[];this.#p.get().forEach(((s,i)=>i&&i.includes(e)&&t.push({word:i,level:s})));const s=new o;return s.set(t),s};getWordbookCache=()=>this.#p.get();loadWordbooks=()=>{this.#w(0)};#w=e=>{const t=this.#p.getName(e);this.#u.log(`Loaded ${t} from storage`),this.#d.getByName(t).then((t=>this.#v(t,e)))};#v=(e,t)=>{e?(this.#p.set(e),this.#m(t)):this.#g()};#m=e=>{const t=e+1;this.#w(t)}}class c{constructor(){this.toElement=e=>{const t=window.document.createElement("div");return t.innerHTML=e.trim(),t.firstChild}}}class h{#x;constructor(){this.#x=new c}append=()=>{const e=s(827),t=this.#x.toElement(e);window.document.querySelector("head").appendChild(t)}}class l{constructor(){this.getHTMLMapper=()=>this.HTMLMapper,this.HTMLMapper=new c}}var d,u=function(e,t,s,i,n){if("m"===i)throw new TypeError("Private method is not writable");if("a"===i&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===i?n.call(e,s):n?n.value=s:t.set(e,s),s},p=function(e,t,s,i){if("a"===s&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!i:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===s?i:"a"===s?i.call(e):i?i.value:t.get(e)};class g extends l{constructor(e){super(),d.set(this,void 0),this.setRef=e=>{u(this,d,e,"f")},this.getRef=()=>p(this,d,"f");const t=s(14);u(this,d,this.getHTMLMapper().toElement(t),"f"),e.appendChild(p(this,d,"f"))}}d=new WeakMap;const f=Object.freeze({NATIVE:{name:"native",hex:"#2e8801",number:4},ADVANCED:{name:"advanced",hex:"#72d400",number:3},INTERMEDIATE:{name:"intermediate",hex:"#ef9f00",number:2},ELEMENTARY:{name:"elementary",hex:"#ab0000",number:1},BEGINNER:{name:"beginner",hex:"#ff2a00",number:0}});class w{onHover(e,t){const s=i.get("menu");e.addEventListener("click",(e=>this.#b(e,s,t))),e.addEventListener("mouseout",s.displayOff)}#b=(e,t,s)=>{t.displayOn(),t.setPosition(e.clientX,e.clientY),t.setContent(s)};onHoverAll=e=>{i.get("refs").get(e).forEach((t=>{this.onHover(t,e)}))};renderAll=(e,t)=>{i.get("refs").get(e).forEach((e=>{this.resolveColor(e,t)}))};createRef=e=>{const t=document.createElement("a");return e=e.replace(/\r?\n/g,""),t.innerText=e,t.style.cursor="pointer",t};resolveColor=(e,t)=>{switch(t){case f.NATIVE.name:e.style.color=f.NATIVE.hex;break;case f.ADVANCED.name:e.style.color=f.ADVANCED.hex;break;case f.INTERMEDIATE.name:e.style.color=f.INTERMEDIATE.hex;break;case f.ELEMENTARY.name:e.style.color=f.ELEMENTARY.hex;break;case f.BEGINNER.name:e.style.color=f.BEGINNER.hex}}}class v extends g{#y;#k;#E;constructor(e,t){super(e),this.#y=i.getWordbookService(),this.#E=t,this.#k=new w}updateLevel=()=>{const e=this.#y.getWordbookCache().get(this.#E);this.#S(f[e.toUpperCase()].number)};setWord=e=>{this.#E=e};#C=e=>{const t=e+1;this.#P(t)};#T=e=>{if(e>0){const t=e-1;this.#P(t)}};#P=e=>{this.#M(e,((e,t)=>{this.#S(e),this.#k.renderAll(this.#E,t.name),this.#y.set([{word:this.#E,level:t.name}])}))};#M=(e,t)=>{var s,i;s=f,i=s=>s.number===e&&t(e,s),Object.entries(s).forEach((e=>{const t=e[1];i(t)}))};#S=e=>{const t=s(748),i=this.getHTMLMapper().toElement(t(this.#R(e)));this.#W(i),this.#A(e)};#W=e=>{this.getRef().replaceWith(e),this.setRef(e)};#A=e=>{const t=this.getRef().getElementsByClassName("wb-level-controller");t[0].addEventListener("click",(()=>this.#C(e))),t[1].addEventListener("click",(()=>this.#T(e)))};#R=e=>({number:e,width:i.get("POPUP_WIDTH")+"px"})}class m extends g{#I;#L;constructor(e){super(e),this.#I=s(138),this.#L=e,this.#L.prepend(this.getRef())}updateLink=(e,t)=>{const s=this.#I({word:e,netGraph:t}),i=this.getHTMLMapper().toElement(s),n=this.getRef();this.setRef(i),this.#L.replaceChild(this.getRef(),n)};#N=e=>{const t=i.get("language"),s=`${i.get("TRANSLATE_URL")}&sl=${t.sl}&tl=${t.tl}&text=${e}`;return this.#B(s),s};#B=e=>{window.console.log(chrome.tabs),window.open(e,"_blank").close()}}var x,b,y,k,E,S,C,P,T,M,R,W,A,I=function(e,t,s,i,n){if("m"===i)throw new TypeError("Private method is not writable");if("a"===i&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===i?n.call(e,s):n?n.value=s:t.set(e,s),s},L=function(e,t,s,i){if("a"===s&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!i:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===s?i:"a"===s?i.call(e):i?i.value:t.get(e)};class N{constructor(){x.add(this),b.set(this,void 0),y.set(this,void 0),k.set(this,void 0),E.set(this,void 0),S.set(this,"0"),C.set(this,"0"),this.getRef=()=>L(this,b,"f"),this.setContent=(e,t)=>{L(this,E,"f").setWord(e),L(this,k,"f").updateLink(e,t),L(this,W,"f").call(this)},this.setPosition=(e,t)=>{const s=i.get("POPUP_WIDTH")/2;I(this,S,e-s+"px","f"),I(this,C,`${t}px`,"f"),L(this,M,"f").call(this)},this.displayOn=()=>{L(this,b,"f").style.visibility="visible"},this.displayOff=()=>{L(this,b,"f").style.visibility="hidden"},P.set(this,(()=>{window.document.querySelector("body").appendChild(L(this,b,"f"))})),T.set(this,(()=>{const e=s(63);I(this,b,L(this,y,"f").toElement(e),"f"),this.displayOff(),L(this,x,"m",R).call(this),I(this,k,new m(L(this,b,"f")),"f"),I(this,E,new v(L(this,b,"f")),"f"),L(this,P,"f").call(this)})),M.set(this,(()=>{L(this,b,"f").style.left=L(this,S,"f"),L(this,b,"f").style.top=L(this,C,"f")})),W.set(this,(()=>{const e=L(this,A,"f").call(this,L(this,k,"f").getRef().offsetWidth),t=L(this,A,"f").call(this,i.get("POPUP_WIDTH"))-e;L(this,k,"f").getRef().style.left=`${t}px`})),A.set(this,(e=>e/2)),I(this,y,new c,"f"),i.add("POPUP_WIDTH",120),i.add("TRANSLATE_URL","https://translate.google.com/#view=home&op=translate"),L(this,T,"f").call(this)}}b=new WeakMap,y=new WeakMap,k=new WeakMap,E=new WeakMap,S=new WeakMap,C=new WeakMap,P=new WeakMap,T=new WeakMap,M=new WeakMap,W=new WeakMap,A=new WeakMap,x=new WeakSet,R=function(){L(this,b,"f").addEventListener("mouseover",(()=>this.displayOn())),L(this,b,"f").addEventListener("mouseout",(()=>this.displayOff()))};class B{#y;#E;#H;constructor(e){this.#E=e,this.#H=new w,this.#y=i.getWordbookService()}create=()=>{if(""===this.#E.get())return this.#z();const e=this.#H.createRef(this.#E.get().trim()),t=this.#y.getWordbookCache().get(this.#E.getClear());return this.#O(t)?this.#Q(e,t):this.#q(e)};#z=()=>document.createTextNode(this.#E.get());#Q=(e,t)=>(this.#H.onHover(e,this.#E.getClear()),this.#H.resolveColor(e,t),e);#q=e=>(this.#D(),e.addEventListener("click",this.#U,{once:!0}),e);#U=()=>{const e=f.BEGINNER.name,t=this.#E.getClear();this.#y.set([{word:t,level:e}]),this.#H.renderAll(t,e),this.#H.onHoverAll(this.#E.getClear())};#D=()=>" "!==this.#E.getClear()&&i.get("notSavedWords").add(this.#E.getClear());#O=e=>void 0!==e}class H{#u=new e;constructor(){i.add("menu",new N),i.add("notSavedWords",new Set),i.add("refs",new Map)}rebuildPage=()=>{this.#j((e=>this.#G(e.ref,e.words)))};#j=e=>{this.#u.log("Rebuilding page..."),i.get("render-queue").takeTurns(e),this.#u.log("Rebuilding page complete!"),this.#u.log(`Found not saved words - ${i.get("notSavedWords").size}`)};#G=(e,t)=>{"A"!==e.parentNode.nodeName&&(t.forEach((t=>{const s=this.#$(t);""!==s.textContent&&(this.#F(t.getClear(),s),this.#V(s,e))})),e.textContent="")};#F=(e,t)=>{const s=i.get("refs");let n=s.get(e);!n&&(n=[]),n.push(t),s.set(e,n)};#$=e=>""!==e.get()?new B(e).create():this.#_(" ");#V=(e,t)=>{t.after(e,t)};#_=e=>document.createTextNode(e)}class z{#Y;constructor(){this.#Y=new MutationObserver((e=>this.#J(e)))}listen=e=>{this.#Y.observe(e,{childList:!0})};#J=e=>{i.get("render-queue").isActive()||e.forEach((e=>this.#X(e)))};#X=e=>{e.addedNodes.forEach((e=>{i.get("page-elements-queue").queueUp(e)}))}}class O{#u;#K;#Z;#ee;constructor(){this.#u=new e,this.#K=new z,this.#Z=i.get("page-elements-queue"),this.#ee=i.get("text-elements-queue")}putInQueue=e=>{this.#Z.queueUp(e)};parse=()=>{this.#u.log("Started queued node."),this.#Z.takeTurns(this.#te)};#se=(e,t)=>{if("BODY"===e.nodeName){const s=(100*t/e.childNodes.length).toFixed(2);this.#u.log(`processed ${s}% of the page!`)}};#te=e=>{e.childNodes.forEach(((t,s)=>{this.#se(e,s),this.#ie(t)&&this.#ne(t)}))};#ie=e=>!(this.#re(e)||this.#oe(e)||this.#ae(e)||this.#ce(e)||this.#he(e)||this.#le(e)||this.#de(e)||this.#ue(e)||this.#pe(e)||this.#ge(e));#re=e=>e instanceof HTMLScriptElement;#ue=e=>e instanceof HTMLFormElement;#ae=e=>e instanceof HTMLImageElement;#ce=e=>e instanceof HTMLInputElement;#he=e=>e instanceof HTMLLinkElement;#de=e=>e instanceof HTMLStyleElement;#le=e=>e instanceof HTMLBRElement;#oe=e=>e instanceof SVGSVGElement;#pe=e=>e instanceof Comment;#ge=e=>"CODE"===e.nodeName||"A"===e.nodeName;#ne=e=>{e.hasChildNodes()?(this.#K.listen(e),this.#te(e)):this.#ee.queueUp(e)}}class Q{getRegex=()=>new RegExp(this.#fe(this.#we()));#fe=e=>`[^${e}]+`;#we=()=>""===this.#ve()?"\\w":this.#ve();#ve=()=>this.#me()+this.#me().toUpperCase()+this.#xe()+this.#xe().toUpperCase()+this.#be()+this.#ye();#me=()=>i.get("settings").russian?"йцукенгшщзхъфывапролджэячсмитьбю":"";#xe=()=>i.get("settings").english?"yqwertuiopasdfghjklzxcvbnm":"";#be=()=>i.get("settings").korean?"ㄱㄴㄷㄹㅁㅂㅅㅇㅈㅊㅋㅌㅍㅎㅏㅓㅗㅜㅡㅣㅑㅕㅛㅠㄲㄸㅃㅆㅉㄳㄵㄶㄺㄻㄼㄽㄾㄿㅀㅄㅐㅒㅔㅖㅘㅙㅚㅝㅞㅟㅢ":"";#ye=()=>i.get("settings").china?"一丁丂七丄丅丆万丈三上下丌不与丏丐丑丒专且丕世丗丘丙业丛东丝丞丟丠両丢丣两严並丧丨丩个丫丬中丮丯丰丱串丳临丵丶丷丸丹为主丼丽举丿乀乁乂乃乄久乆乇么义乊之乌乍乎乏乐乑乒乓乔乕乪乫乬乭乮乯买乱乲乳乴乵乶乷乸乹乺乻乼乽乾乿亀亁亂亃亄亅了亇予争亊事二亍于亏亐云互亓五井亖亗亘亙亚些亜亝亞亟亠亡亢亣交亥亦产亨亩亪享京亭亮亯亰亱亲亳亴亵亶亷亸亹人亻亼亽亾亿什仁仂仃仄仅仆仇仈仉今介仌仍从仏仐仑仒仓仔仕他仗付仙仚仛仜仝仞仟仠仡仢代令以仦仧仨仩仪仫们仭仮仯仰仱仲仳仴仵件价仸仹仺任仼份仾仿伀企伂伃伄伅伆伇伈伉伊伋伌伍伎伏伐休伒伓伔伕伖众优伙会伛伜伝伞伟传伡伢伣伤伥伦伧伨伩伪伫伬伭伮伯估伱伲伳伴伵伶伷伸伹伺伻似伽伾伿佀佁佂佃佄佅但佇佈佉佊佋佌位低住佐佑佒体佔何佖佗佘余佚佛作佝佞佟你佡佢佣佤佥佦佧佨佩佪佫佬佭佮佯佰佱佲佳佴併佶佷佸佹佺佻佼佽佾使侀侁侂侃侄侅來侇侈侉侊例侌侍侎侏侐侑侒侓侔侕侖侗侘侙侚供侜依侞侟侠価侢侣侤侥侦侧侨侩侪侫侬侭侮侯侰侱侲侳侴侵侶侷侸侹侺侻侼侽侾便俀俁係促俄俅俆俇俈俉俊俋俌俍俎俏俐俑俒俓俔俕俖俗俘俙俚俛俜保俞俟俠信俢俣俤俥俦俧俨俩俪俫俬俭修俯俰俱俲俳俴俵俶俷俸俹俺俻俼俽俾俿倀倁倂倃倄倅倆倇倈倉倊個倌倍倎倏倐們倒倓倔倕倖倗倘候倚倛倜倝倞借倠倡倢倣値倥倦倧倨倩倪倫倬倭倮倯倰倱倲倳倴倵倶倷倸倹债倻值倽倾倿偀偁偂偃偄偅偆假偈偉偊偋偌偍偎偏偐偑偒偓偔偕偖偗偘偙做偛停偝偞偟偠偡偢偣偤健偦偧偨偩偪偫偬偭偮偯偰偱偲偳側偵偶偷偸偹偺偻偼偽偾偿傀傁傂傃傄傅傆傇傈傉傊傋傌傍傎傏傐傑傒傓傔傕傖傗傘備傚傛傜傝傞傟傠傡傢傣傤傥傦傧储傩傪傫催傭傮傯傰傱傲傳傴債傶傷傸傹傺傻傼傽傾傿僀僁僂僃僄僅僆僇僈僉僊僋僌働僎像僐僑僒僓僔僕僖僗僘僙僚僛僜僝僞僟僠僡僢僣僤僥僦僧僨僩僪僫僬僭僮僯僰僱僲僳僴僵僶僷僸價僺僻僼僽僾僿儀儁儂儃億儅儆儇儈儉儊儋儌儍儎儏儐儑儒儓儔儕儖儗儘儙儚儛儜儝儞償儠儡儢儣儤儥儦儧儨儩優儫儬儭儮儯儰儱儲儳儴儵儶儷儸儹儺儻儼儽儾儿兀允兂元兄充兆兇先光兊克兌免兎兏児兑兒兓兔兕兖兗兘兙党兛兜兝兞兟兠兡兢兣兤入兦內全兩兪八公六兮兯兰共兲关兴兵其具典兹兺养兼兽兾兿冀冁冂冃冄内円冇冈冉冊冋册再冎冏冐冑冒冓冔冕冖冗冘写冚军农冝冞冟冠冡冢冣冤冥冦冧冨冩冪冫冬冭冮冯冰冱冲决冴况冶冷冸冹冺冻冼冽冾冿净凁凂凃凄凅准凇凈凉凊凋凌凍凎减凐凑凒凓凔凕凖凗凘凙凚凛凜凝凞凟几凡凢凣凤凥処凧凨凩凪凫凬凭凮凯凰凱凲凳凴凵凶凷凸凹出击凼函凾凿刀刁刂刃刄刅分切刈刉刊刋刌刍刎刏乖乗乘乙乚乛乜九乞也习乡乢乣乤乥书乧乨乩":""}class q{#fe;#ke;#Ee;constructor(e){this.#fe=new Q,this.#ke=e,this.#Se()}get=()=>this.#ke;getClear=()=>this.#Ee;#Se=()=>{this.#Ee=this.#ke.toString().toLowerCase().replace(this.#fe.getRegex(),""),this.#Ce(this.#Ee)||this.#Pe()};#Pe=()=>{let e=null;this.#Ee.endsWith("s")&&(e="s"),this.#Ee.endsWith("ed")&&(e="ed"),this.#Ee.endsWith("ing")&&(e="ing"),null!==e&&this.#Te(e)};#Me=()=>{this.#Ee.startsWith("un")&&this.#Re("un")};#Te=e=>{this.#Ee=this.#Ee.substr(0,this.#Ee.length-e.length),this.#We(this.#Ee)};#Re=e=>{this.#Ee=this.#Ee.substr(e.length-1)};#We=e=>{this.#Ce(e)||(this.#Ce(e+"s")&&(this.#Ee=e+"s"),this.#Ce(e+"e")&&(this.#Ee=e+"e"))};#Ce=e=>i.getWordbookService().getWordbookCache().get(e)}class D{#ee;#Ae;#p;constructor(){this.#p=i.getWordbookService().getWordbookCache(),this.#ee=i.get("text-elements-queue"),this.#Ae=i.get("render-queue")}parse=()=>{this.#ee.takeTurns((e=>{const t=this.#Ie(e);this.#Le(e,t)}))};#Ie=e=>{const t=e.textContent.split(" ");return this.#Ne(t)};#Ne=e=>{const t=[];return e.forEach(((e,s)=>{0!==s&&t.push(""),this.#Be(t,e,"-")||this.#Be(t,e,".")||this.#Be(t,e,"...")||this.#Be(t,e,",")||this.#He(t,e)})),t};#He=(e,t)=>{t.endsWith("n't")&&!t.includes("can't")?this.#ze(e,t,"n't","not"):t.endsWith("'ll")?this.#ze(e,t,"'ll","will"):e.push(t)};#ze=(e,t,s,i)=>{const n=this.#Oe(t,s);e.push(n,"",i)};#Oe=(e,t)=>{const s=this.#Qe(e,t);return this.#qe(s)};#Qe=(e,t)=>e.substr(0,e.length-t.length);#qe=e=>this.#Ce(e)?e:this.#Ce(e+"e")?e+"e":e;#Ce=e=>this.#p.get(e);#Be=(e,t,s)=>{const i=t.split(s);if(2===i.length){const t=i[0],n=i[1];return e.push(t,s,n),!0}return!1};#Le=(e,t)=>{const s=[];t.forEach((e=>s.push(new q(e)))),this.#Ae.queueUp({ref:e,words:s})}}class U{#De;#Ue;constructor(){this.#De=new O,this.#Ue=new D}textBlocksParsing=e=>this.#Ue.parse(e);parsePage=()=>{this.#De.parse()};putInQueue=e=>{this.#De.putInQueue(e)}}class j{#je;#Ge;constructor(){this.#je=!1,this.#Ge=new Set}queueUp=e=>{this.#Ge.add(e)};takeTurns=e=>{this.#je=!0,this.#Ge.forEach((t=>e(t))),this.#Ge.clear(),this.#je=!1};isEmpty=()=>0===this.#Ge.size;isActive=()=>this.#je}class G{#$e;#Fe;#u;constructor(){i.add("render-queue",new j),i.add("page-elements-queue",new j),i.add("text-elements-queue",new j),this.#u=new e,this.#Fe=new U,this.#$e=new H}runInfinityParsing=()=>{this.#Ve(),this.#_e()};#Ve=()=>{let e=window.document.querySelector("body");this.#Fe.putInQueue(e),setInterval((()=>{this.#Ye()&&this.#Je()&&this.#Fe.parsePage()}),100)};#_e=()=>{setInterval((()=>{this.#Ye()&&this.#Xe()&&this.#Fe.textBlocksParsing()}),100)};runInfinityRender=()=>{setInterval((()=>{this.#Ke()&&this.#$e.rebuildPage()}),100)};#Ke=()=>{const e=i.get("render-queue");return!e.isActive()&&!e.isEmpty()};#Ye=()=>!i.get("render-queue").isActive();#Je=()=>{const e=i.get("page-elements-queue");return!e.isActive()&&!e.isEmpty()};#Xe=()=>{const e=i.get("text-elements-queue");return!e.isActive()&&!e.isEmpty()}}class ${constructor(e){this.clone=e}}class F{constructor(e){this.getRef=()=>this.ref,this.getSize=()=>this.size,this.getPosition=()=>this.position,this.setupPosition=()=>{const e=this.rect.x+window.scrollX,t=this.rect.y+window.scrollY;this.position={x:e,y:t}},this.setupSize=()=>{const e=this.rect.width,t=this.rect.height;this.size={width:e,height:t}},this.ref=e.target,this.rect=this.ref.getBoundingClientRect(),this.setupSize(),this.setupPosition()}}class V{constructor(e,t){this.width=e,this.height=t}}class _{constructor(e){this.executeInAppendTiming=e=>{parent.document.body.appendChild(this.cloneRef);const t=e.map((e=>e()));return parent.document.body.removeChild(this.cloneRef),t},this.getParameterizedSize=(e,t)=>(this.attributeStylesService.fillCloneAttributeStyles(e,t),this.buildSize()),this.appendAttributeStyles=e=>{this.cloneRef.style.width="auto",this.cloneRef.style.wordBreak="normal",this.cloneRef.setAttribute("style",e)},this.buildSize=()=>new V(this.cloneRef.offsetWidth,this.cloneRef.offsetHeight),this.cloneRef=document.createElement(e)}setAttributeStylesService(e){this.attributeStylesService=e}fillCloneContent(e,t){this.cloneRef.innerHTML=e,this.cloneRef.innerText=t}}class Y{constructor(){this.HIDDEN_STYLES="left:0;top:0;position:absolute;z-index:100",this.buildAttributeStyles=(e,t,s)=>`${this.HIDDEN_STYLES};font-size:${e};font-family:${t};${s}`,this.getWidthHeightInlineAttributes=()=>"width:auto;height:auto;white-space:nowrap",this.getWidthHeightBlockAttributes=e=>`width:${e.width}px;height:auto`}}class J{constructor(){this.getComputedStyles=e=>window.getComputedStyle(e)}}class X{constructor(e,t){this.inline=e,this.block=t}}class K{constructor(e,t){this.fillCloneAttributeStyles=(e,t)=>{const s=e.fontSize,i=e.fontFamily,n=this.stylesProvider.buildAttributeStyles(s,i,t);this.elementExactSizeController.appendAttributeStyles(n)},this.stylesProvider=t,this.elementExactSizeController=e}}class Z{constructor(){this.ELEMENT_TYPE_NAME="div",this.getSize=(e,t,s)=>{const i=this.computedStylesController.getComputedStyles(e);this.cloneBlockController.fillCloneContent(e.innerHTML,t);const n=this.cloneBlockController.executeInAppendTiming([()=>this.cloneBlockController.getParameterizedSize(i,this.stylesProvider.getWidthHeightInlineAttributes()),()=>this.cloneBlockController.getParameterizedSize(i,this.stylesProvider.getWidthHeightBlockAttributes(s))]);return new X(n[0],n[1])},this.cloneBlockController=new _(this.ELEMENT_TYPE_NAME),this.computedStylesController=new J,this.stylesProvider=new Y,this.attributeStylesService=new K(this.cloneBlockController,this.stylesProvider),this.cloneBlockController.setAttributeStylesService(this.attributeStylesService)}}var ee,te,se,ie,ne,re=function(e,t,s,i,n){if("m"===i)throw new TypeError("Private method is not writable");if("a"===i&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===i?n.call(e,s):n?n.value=s:t.set(e,s),s},oe=function(e,t,s,i){if("a"===s&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!i:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===s?i:"a"===s?i.call(e):i?i.value:t.get(e)};class ae{constructor(){ee.set(this,void 0),te.set(this,void 0),this.getOrUpdateCache=e=>{let t=this.getCache(e);return t||(oe(this,ne,"f").call(this,e).length>0?t=oe(this,se,"f").call(this,e):oe(this,ee,"f").add(e.target)),t},this.getCache=e=>oe(this,te,"f").get(e.target),this.validateNoneBlackListElement=(e,t)=>{oe(this,ee,"f").has(e.target)||t()},se.set(this,(e=>{const t=e.target,s=t.innerText,{width:i,height:n}=t.getBoundingClientRect(),r=this.cloneBlockService.getSize(t,s,new V(i,n)),o=new $(r);return oe(this,te,"f").set(e.target,o),o})),ie.set(this,(e=>new F(e))),ne.set(this,(e=>Array.from(e.target.childNodes).filter((e=>"#text"===e.nodeName)))),re(this,ee,new Set,"f"),re(this,te,new Map,"f"),this.cloneBlockService=new Z}}ee=new WeakMap,te=new WeakMap,se=new WeakMap,ie=new WeakMap,ne=new WeakMap;var ce,he=function(e,t,s,i){if("a"===s&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!i:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===s?i:"a"===s?i.call(e):i?i.value:t.get(e)};class le{constructor(e){ce.set(this,void 0),this.updatePopup=(e,t)=>{const s=he(this,ce,"f").getRef();he(this,ce,"f").displayOn(),he(this,ce,"f").setContent(e,t),he(this,ce,"f").setPosition(window.innerWidth-s.offsetWidth,window.innerHeight-s.offsetHeight-20)},function(e,t,s,i,n){if("m"===i)throw new TypeError("Private method is not writable");if("a"===i&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");"a"===i?n.call(e,s):n?n.value=s:t.set(e,s)}(this,ce,i.get(e),"f")}}ce=new WeakMap;class de{constructor(){this.getUpdatedBlockWithColor=(e,t)=>{const s=e;return s.color=t,s},this.getHighlightingElement=e=>{const t=window.document.createElement("div");return t.style.left=`${e.x}px`,t.style.top=`${e.y}px`,t.style.width=`${e.width}px`,t.style.height=`${e.height}px`,t.style.position="absolute",t.style.zIndex="1000",t.style.opacity="0.25",t.style.pointerEvents="none",t.style.background=e.color,t}}}class ue{constructor(){this.appendRef=e=>{this.updateHighlightBlockRef();const t=this.highlightingProvider.getUpdatedBlockWithColor(e,"blue"),s=this.highlightingProvider.getHighlightingElement(t);ue.highlightBlockRef.appendChild(s)},this.updateHighlightBlockRef=()=>{ue.highlightBlockRef||(ue.highlightBlockRef=window.document.createElement("div"),window.document.body.appendChild(ue.highlightBlockRef))},this.destructRef=()=>{ue.highlightBlockRef&&window.document.body.removeChild(ue.highlightBlockRef)},this.highlightingProvider=new de}}class pe{constructor(){this.drawHighlight=e=>{this.highlightingController.destructRef(),e.getBlocks().forEach(((t,s)=>{const i=e.getPosition(s);[t.x,t.y]=[i.x,i.y],this.highlightingController.appendRef(t)}))},this.drawWordHighlight=e=>{const t=document.createElement("span");return t.style.border="1px solid black",t.className="highlight",t.innerText=e,t},this.highlightingController=new ue}}class ge{constructor(e,t){this.x=e,this.y=t}}class fe{constructor(){this.cacheManager=new ae}getIndex(e,t){let s=this.cacheManager.getOrUpdateCache(e);const i=new ge(e.offsetX,e.offsetY),n=s.clone.block.width,r=s.clone.inline.height,o=s.clone.inline.width,a=Math.round(i.y/r);console.log("currentLine: "+a);const c=(n*(a-1)+i.x)/o;return Math.round(t.length*c)}}class we{constructor(){this.notInteractiveElement=e=>!(this.isScript(e)||this.isSVG(e)||this.isImage(e)||this.isInput(e)||this.isBr(e)||this.isStyle(e)||this.isForm(e)||this.isComment(e)||this.isUnverifiableInteractiveElement(e)),this.isScript=e=>e instanceof HTMLScriptElement,this.isForm=e=>e instanceof HTMLFormElement,this.isImage=e=>e instanceof HTMLImageElement,this.isInput=e=>e instanceof HTMLInputElement,this.isStyle=e=>e instanceof HTMLStyleElement,this.isBr=e=>e instanceof HTMLBRElement,this.isSVG=e=>e instanceof SVGSVGElement,this.isComment=e=>e instanceof Comment,this.isUnverifiableInteractiveElement=e=>"CODE"===e.nodeName,this.resultArray=[],this.getChildNodes=e=>{if(!e)return;const t=[];for(const s of e.childNodes)this.notInteractiveElement(s)&&t.push(s);return t},this.getTextNodes=e=>{const t=this.getChildNodes(e);for(const e of t)3===e.nodeType?(console.log(e.textContent),this.resultArray.push(e)):1===e.nodeType&&this.getTextNodes(e);return this.resultArray}}}class ve{constructor(){this.run=()=>{const e=document.querySelector("body"),t=this.nodeManager.getTextNodes(e);console.log(t);const s=t.map((e=>{const{width:t,height:s}=e.getBoundingClientRect();return this.cloneBlockService.getSize(e,e.textContent,new V(t,s))}));console.log(s.length),s.forEach((e=>{console.log(e.inline.width),console.log(e.inline.height),console.log(e.block.width),console.log(e.block.height)}))},this.cacheManager=new ae,this.popupManager=new le("menu"),this.highlightingService=new pe,this.cloneBlockService=new Z,this.indexService=new fe,this.nodeManager=new we}}var me,xe,be,ye,ke,Ee=function(e,t,s,i,n){if("m"===i)throw new TypeError("Private method is not writable");if("a"===i&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===i?n.call(e,s):n?n.value=s:t.set(e,s),s},Se=function(e,t,s,i){if("a"===s&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!i:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===s?i:"a"===s?i.call(e):i?i.value:t.get(e)};me=new WeakMap,xe=new WeakMap,be=new WeakMap,ye=new WeakMap,ke=new WeakMap;const Ce=new class{constructor(){me.set(this,void 0),xe.set(this,void 0),be.set(this,void 0),this.run=()=>{Se(this,xe,"f").appParams().then((e=>{Se(this,ye,"f").call(this,e)}))},ye.set(this,(e=>{e&&(Se(this,me,"f").append(),Se(this,be,"f").run())})),ke.set(this,(()=>{i.add("language",{sl:"en",tl:"ru"});const e=new G;e.runInfinityParsing(),e.runInfinityRender()})),Ee(this,xe,new n,"f"),Ee(this,me,new h,"f"),i.add("menu",new N),Ee(this,be,new ve,"f")}};new class{#Ze;#y;#et;constructor(e){this.#Ze=new i,this.#et=e,this.#y=new a}start=()=>{this.#y.executeAfter(this.#tt),this.#y.loadWordbooks()};#tt=()=>{i.add("wordbook",this.#y),this.#et.run()}}(Ce).start()})()})(); \ No newline at end of file +/******/ (() => { // webpackBootstrap +/******/ var __webpack_modules__ = ({ + +/***/ "./node_modules/apply-loader/index.js!./node_modules/pug-loader/index.js!./src/page/block/popup/templates/container.pug": +/*!******************************************************************************************************************************!*\ + !*** ./node_modules/apply-loader/index.js!./node_modules/pug-loader/index.js!./src/page/block/popup/templates/container.pug ***! + \******************************************************************************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var req = __webpack_require__(/*! !!./node_modules/pug-loader/index.js!./src/page/block/popup/templates/container.pug */ "./node_modules/pug-loader/index.js!./src/page/block/popup/templates/container.pug"); +module.exports = (req['default'] || req).apply(req, []) + +/***/ }), + +/***/ "./node_modules/apply-loader/index.js!./node_modules/pug-loader/index.js!./src/page/block/popup/templates/popup.pug": +/*!**************************************************************************************************************************!*\ + !*** ./node_modules/apply-loader/index.js!./node_modules/pug-loader/index.js!./src/page/block/popup/templates/popup.pug ***! + \**************************************************************************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var req = __webpack_require__(/*! !!./node_modules/pug-loader/index.js!./src/page/block/popup/templates/popup.pug */ "./node_modules/pug-loader/index.js!./src/page/block/popup/templates/popup.pug"); +module.exports = (req['default'] || req).apply(req, []) + +/***/ }), + +/***/ "./node_modules/apply-loader/index.js!./node_modules/pug-loader/index.js!./src/page/render/styles/style.pug": +/*!******************************************************************************************************************!*\ + !*** ./node_modules/apply-loader/index.js!./node_modules/pug-loader/index.js!./src/page/render/styles/style.pug ***! + \******************************************************************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var req = __webpack_require__(/*! !!./node_modules/pug-loader/index.js!./src/page/render/styles/style.pug */ "./node_modules/pug-loader/index.js!./src/page/render/styles/style.pug"); +module.exports = (req['default'] || req).apply(req, []) + +/***/ }), + +/***/ "./node_modules/pug-loader/index.js!./src/page/block/popup/templates/container.pug": +/*!*****************************************************************************************!*\ + !*** ./node_modules/pug-loader/index.js!./src/page/block/popup/templates/container.pug ***! + \*****************************************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var pug = __webpack_require__(/*! !../../../../../node_modules/pug-runtime/index.js */ "./node_modules/pug-runtime/index.js"); + +function template(locals) {var pug_html = "", pug_mixins = {}, pug_interp;pug_html = pug_html + "\u003Cdiv class=\"menu-container\"\u003E\u003C\u002Fdiv\u003E";;return pug_html;}; +module.exports = template; + +/***/ }), + +/***/ "./node_modules/pug-loader/index.js!./src/page/block/popup/templates/level-display.pug": +/*!*********************************************************************************************!*\ + !*** ./node_modules/pug-loader/index.js!./src/page/block/popup/templates/level-display.pug ***! + \*********************************************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var pug = __webpack_require__(/*! !../../../../../node_modules/pug-runtime/index.js */ "./node_modules/pug-runtime/index.js"); + +function template(locals) {var pug_html = "", pug_mixins = {}, pug_interp;; + var locals_for_with = (locals || {}); + + (function (number, width) { + pug_html = pug_html + "\u003Cdiv" + (" class=\"change-level-menu\""+pug.attr("style", pug.style(`width: ${width}`), true, true)) + "\u003E\u003Ca class=\"wb-level-controller\"\u003E+\u003C\u002Fa\u003E\u003Ca class=\"wb-level-number\"\u003E" + (pug.escape(null == (pug_interp = number) ? "" : pug_interp)) + "\u003C\u002Fa\u003E\u003Ca class=\"wb-level-controller\"\u003E-\u003C\u002Fa\u003E\u003C\u002Fdiv\u003E"; + }.call(this, "number" in locals_for_with ? + locals_for_with.number : + typeof number !== 'undefined' ? number : undefined, "width" in locals_for_with ? + locals_for_with.width : + typeof width !== 'undefined' ? width : undefined)); + ;;return pug_html;}; +module.exports = template; + +/***/ }), + +/***/ "./node_modules/pug-loader/index.js!./src/page/block/popup/templates/popup.pug": +/*!*************************************************************************************!*\ + !*** ./node_modules/pug-loader/index.js!./src/page/block/popup/templates/popup.pug ***! + \*************************************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var pug = __webpack_require__(/*! !../../../../../node_modules/pug-runtime/index.js */ "./node_modules/pug-runtime/index.js"); + +function template(locals) {var pug_html = "", pug_mixins = {}, pug_interp;pug_html = pug_html + "\u003Cdiv class=\"page-popup-menu\"\u003E\u003C\u002Fdiv\u003E";;return pug_html;}; +module.exports = template; + +/***/ }), + +/***/ "./node_modules/pug-loader/index.js!./src/page/block/popup/templates/word-display.pug": +/*!********************************************************************************************!*\ + !*** ./node_modules/pug-loader/index.js!./src/page/block/popup/templates/word-display.pug ***! + \********************************************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var pug = __webpack_require__(/*! !../../../../../node_modules/pug-runtime/index.js */ "./node_modules/pug-runtime/index.js"); + +function template(locals) {var pug_html = "", pug_mixins = {}, pug_interp;; + var locals_for_with = (locals || {}); + + (function (href, netGraph, word) { + pug_html = pug_html + "\u003Cdiv class=\"display-word-menu\"\u003E\u003Ca" + (" class=\"translate-link\""+" target=\"_blank\""+pug.attr("href", href, true, true)) + "\u003E" + (pug.escape(null == (pug_interp = word) ? "" : pug_interp)) + "\u003C\u002Fa\u003E\u003Cdiv\u003E\u003Cspan\u003Ecursor-x:\u003C\u002Fspan\u003E\u003Cspan\u003E" + (pug.escape(null == (pug_interp = netGraph.cursor.x) ? "" : pug_interp)) + "\u003C\u002Fspan\u003E\u003C\u002Fdiv\u003E\u003Cdiv\u003E\u003Cspan\u003Ecursor-y:\u003C\u002Fspan\u003E\u003Cspan\u003E" + (pug.escape(null == (pug_interp = netGraph.cursor.y) ? "" : pug_interp)) + "\u003C\u002Fspan\u003E\u003C\u002Fdiv\u003E\u003Cdiv\u003E\u003Cspan\u003Eblock-width:\u003C\u002Fspan\u003E\u003Cspan\u003E" + (pug.escape(null == (pug_interp = netGraph.block.width) ? "" : pug_interp)) + "\u003C\u002Fspan\u003E\u003C\u002Fdiv\u003E\u003Cdiv\u003E\u003Cspan\u003Eblock-height:\u003C\u002Fspan\u003E\u003Cspan\u003E" + (pug.escape(null == (pug_interp = netGraph.block.height) ? "" : pug_interp)) + "\u003C\u002Fspan\u003E\u003C\u002Fdiv\u003E\u003Cdiv\u003E\u003Cspan\u003Etext-length:\u003C\u002Fspan\u003E\u003Cspan\u003E" + (pug.escape(null == (pug_interp = netGraph.textLength) ? "" : pug_interp)) + "\u003C\u002Fspan\u003E\u003C\u002Fdiv\u003E\u003Cdiv\u003E\u003Cspan\u003Etext-blocks-count:\u003C\u002Fspan\u003E\u003Cspan\u003E" + (pug.escape(null == (pug_interp = netGraph.textBlocksCount) ? "" : pug_interp)) + "\u003C\u002Fspan\u003E\u003C\u002Fdiv\u003E\u003Cdiv\u003E\u003Cspan\u003Etext-block-index:\u003C\u002Fspan\u003E\u003Cspan\u003E" + (pug.escape(null == (pug_interp = netGraph.currentLine) ? "" : pug_interp)) + "\u003C\u002Fspan\u003E\u003C\u002Fdiv\u003E\u003Cdiv\u003E\u003Cspan\u003Etext-block-size-width:\u003C\u002Fspan\u003E\u003Cspan\u003E" + (pug.escape(null == (pug_interp = netGraph.currentTextBlockSize.width) ? "" : pug_interp)) + "\u003C\u002Fspan\u003E\u003C\u002Fdiv\u003E\u003Cdiv\u003E\u003Cspan\u003Etext-block-size-height:\u003C\u002Fspan\u003E\u003Cspan\u003E" + (pug.escape(null == (pug_interp = netGraph.currentTextBlockSize.height) ? "" : pug_interp)) + "\u003C\u002Fspan\u003E\u003C\u002Fdiv\u003E\u003C!--div--\u003E\u003C!-- span gap-height:--\u003E\u003C!-- span= netGraph.gapHeight--\u003E\u003C!----\u003E\u003C!--div--\u003E\u003C!-- span count-gaps:--\u003E\u003C!-- span= netGraph.countGaps--\u003E\u003Cdiv\u003E\u003Cspan\u003Ereal-height:\u003C\u002Fspan\u003E\u003Cspan\u003E" + (pug.escape(null == (pug_interp = netGraph.realHeight) ? "" : pug_interp)) + "\u003C\u002Fspan\u003E\u003C\u002Fdiv\u003E\u003Cdiv\u003E\u003Cspan\u003Ecoefficient:\u003C\u002Fspan\u003E\u003Cspan\u003E" + (pug.escape(null == (pug_interp = netGraph.coefficient) ? "" : pug_interp)) + "\u003C\u002Fspan\u003E\u003C\u002Fdiv\u003E\u003C!--div--\u003E\u003C!-- span text-block-width:--\u003E\u003C!-- span= textBlock.width--\u003E\u003C!--div--\u003E\u003C!-- span text-block-height:--\u003E\u003C!-- span= textBlock.height--\u003E\u003C!--div--\u003E\u003C!-- span index:--\u003E\u003C!-- span= index--\u003E\u003C!--div--\u003E\u003C!-- span line:--\u003E\u003C!-- span= line--\u003E\u003C!--div--\u003E\u003C!-- span text-length:--\u003E\u003C!-- span= length--\u003E\u003C!--div--\u003E\u003C!-- span one-symbol-width:--\u003E\u003C!-- span= one--\u003E\u003C!--div--\u003E\u003C!-- span cursor-offset-width:--\u003E\u003C!-- span= offset.width--\u003E\u003C!--div--\u003E\u003C!-- span cursor-offset-height:--\u003E\u003C!-- span= offset.height--\u003E\u003C!--div--\u003E\u003C!-- span block-width:--\u003E\u003C!-- span= block.width--\u003E\u003C!--div--\u003E\u003C!-- span block-height:--\u003E\u003C!-- span= block.height--\u003E\u003C!--div--\u003E\u003C!-- span cursor-x:--\u003E\u003C!-- span= eventInfo.x--\u003E\u003C!--div--\u003E\u003C!-- span cursor-y:--\u003E\u003C!-- span= eventInfo.y--\u003E\u003C!--.edit-button EDIT--\u003E\u003C\u002Fdiv\u003E"; + }.call(this, "href" in locals_for_with ? + locals_for_with.href : + typeof href !== 'undefined' ? href : undefined, "netGraph" in locals_for_with ? + locals_for_with.netGraph : + typeof netGraph !== 'undefined' ? netGraph : undefined, "word" in locals_for_with ? + locals_for_with.word : + typeof word !== 'undefined' ? word : undefined)); + ;;return pug_html;}; +module.exports = template; + +/***/ }), + +/***/ "./node_modules/pug-loader/index.js!./src/page/render/styles/style.pug": +/*!*****************************************************************************!*\ + !*** ./node_modules/pug-loader/index.js!./src/page/render/styles/style.pug ***! + \*****************************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var pug = __webpack_require__(/*! !../../../../node_modules/pug-runtime/index.js */ "./node_modules/pug-runtime/index.js"); + +function template(locals) {var pug_html = "", pug_mixins = {}, pug_interp;pug_html = pug_html + "\u003Cstyle\u003E.menu-container {\n text-align: center;\n}\n\n.page-popup-menu {\n position: fixed;\n user-select: none;\n color: #1e81c6;\n z-index: 1000;\n transition: all 0.2s ease;\n background: white;\n border: 1px #1e81c6 solid;\n padding: 2px;\n border-radius: 4px;\n}\n\na {\n text-decoration: none;\n}\n\na:hover {\n text-decoration: none;\n}\n\n.wb-level-controller {\n cursor: pointer;\n}\n\n.wb-level-number {\n color: #444\n}\n\n.change-level-menu {\n height: 30px;\n display: flex;\n flex-direction: row;\n justify-content: space-around;\n align-items: center;\n font-family: Impact, serif;\n position: relative;\n font-size: 18px;\n z-index: 1001;\n border-radius: 8px;\n background: #f9f9ff;\n border: 1px #1e81c6 solid;\n}\n\n.display-word-menu {\n display: flex;\n flex-direction: column;\n grid-gap:4px;\n margin: 4px 8px;\n padding-bottom: 2px;\n font-size: 12px;\n}\n\n.display-word-menu a {\n line-height: normal;\n text-decoration: none;\n color: #1e81c6;\n border-bottom: 1px #1e81c6 solid;\n}\n\n.display-word-menu div {\n display: flex;\n flex-direction: row;\n grid-gap: 4px;\n}\n\n.display-word-menu .edit-button {\n margin-left: 4px;\n font-family: Impact, serif;\n}\u003C\u002Fstyle\u003E";;return pug_html;}; +module.exports = template; + +/***/ }), + +/***/ "./node_modules/pug-runtime/index.js": +/*!*******************************************!*\ + !*** ./node_modules/pug-runtime/index.js ***! + \*******************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + + +var pug_has_own_property = Object.prototype.hasOwnProperty; + +/** + * Merge two attribute objects giving precedence + * to values in object `b`. Classes are special-cased + * allowing for arrays and merging/joining appropriately + * resulting in a string. + * + * @param {Object} a + * @param {Object} b + * @return {Object} a + * @api private + */ + +exports.merge = pug_merge; +function pug_merge(a, b) { + if (arguments.length === 1) { + var attrs = a[0]; + for (var i = 1; i < a.length; i++) { + attrs = pug_merge(attrs, a[i]); + } + return attrs; + } + + for (var key in b) { + if (key === 'class') { + var valA = a[key] || []; + a[key] = (Array.isArray(valA) ? valA : [valA]).concat(b[key] || []); + } else if (key === 'style') { + var valA = pug_style(a[key]); + valA = valA && valA[valA.length - 1] !== ';' ? valA + ';' : valA; + var valB = pug_style(b[key]); + valB = valB && valB[valB.length - 1] !== ';' ? valB + ';' : valB; + a[key] = valA + valB; + } else { + a[key] = b[key]; + } + } + + return a; +} + +/** + * Process array, object, or string as a string of classes delimited by a space. + * + * If `val` is an array, all members of it and its subarrays are counted as + * classes. If `escaping` is an array, then whether or not the item in `val` is + * escaped depends on the corresponding item in `escaping`. If `escaping` is + * not an array, no escaping is done. + * + * If `val` is an object, all the keys whose value is truthy are counted as + * classes. No escaping is done. + * + * If `val` is a string, it is counted as a class. No escaping is done. + * + * @param {(Array.|Object.|string)} val + * @param {?Array.} escaping + * @return {String} + */ +exports.classes = pug_classes; +function pug_classes_array(val, escaping) { + var classString = '', + className, + padding = '', + escapeEnabled = Array.isArray(escaping); + for (var i = 0; i < val.length; i++) { + className = pug_classes(val[i]); + if (!className) continue; + escapeEnabled && escaping[i] && (className = pug_escape(className)); + classString = classString + padding + className; + padding = ' '; + } + return classString; +} +function pug_classes_object(val) { + var classString = '', + padding = ''; + for (var key in val) { + if (key && val[key] && pug_has_own_property.call(val, key)) { + classString = classString + padding + key; + padding = ' '; + } + } + return classString; +} +function pug_classes(val, escaping) { + if (Array.isArray(val)) { + return pug_classes_array(val, escaping); + } else if (val && typeof val === 'object') { + return pug_classes_object(val); + } else { + return val || ''; + } +} + +/** + * Convert object or string to a string of CSS styles delimited by a semicolon. + * + * @param {(Object.|string)} val + * @return {String} + */ + +exports.style = pug_style; +function pug_style(val) { + if (!val) return ''; + if (typeof val === 'object') { + var out = ''; + for (var style in val) { + /* istanbul ignore else */ + if (pug_has_own_property.call(val, style)) { + out = out + style + ':' + val[style] + ';'; + } + } + return out; + } else { + return val + ''; + } +} + +/** + * Render the given attribute. + * + * @param {String} key + * @param {String} val + * @param {Boolean} escaped + * @param {Boolean} terse + * @return {String} + */ +exports.attr = pug_attr; +function pug_attr(key, val, escaped, terse) { + if ( + val === false || + val == null || + (!val && (key === 'class' || key === 'style')) + ) { + return ''; + } + if (val === true) { + return ' ' + (terse ? key : key + '="' + key + '"'); + } + var type = typeof val; + if ( + (type === 'object' || type === 'function') && + typeof val.toJSON === 'function' + ) { + val = val.toJSON(); + } + if (typeof val !== 'string') { + val = JSON.stringify(val); + if (!escaped && val.indexOf('"') !== -1) { + return ' ' + key + "='" + val.replace(/'/g, ''') + "'"; + } + } + if (escaped) val = pug_escape(val); + return ' ' + key + '="' + val + '"'; +} + +/** + * Render the given attributes object. + * + * @param {Object} obj + * @param {Object} terse whether to use HTML5 terse boolean attributes + * @return {String} + */ +exports.attrs = pug_attrs; +function pug_attrs(obj, terse) { + var attrs = ''; + + for (var key in obj) { + if (pug_has_own_property.call(obj, key)) { + var val = obj[key]; + + if ('class' === key) { + val = pug_classes(val); + attrs = pug_attr(key, val, false, terse) + attrs; + continue; + } + if ('style' === key) { + val = pug_style(val); + } + attrs += pug_attr(key, val, false, terse); + } + } + + return attrs; +} + +/** + * Escape the given string of `html`. + * + * @param {String} html + * @return {String} + * @api private + */ + +var pug_match_html = /["&<>]/; +exports.escape = pug_escape; +function pug_escape(_html) { + var html = '' + _html; + var regexResult = pug_match_html.exec(html); + if (!regexResult) return _html; + + var result = ''; + var i, lastIndex, escape; + for (i = regexResult.index, lastIndex = 0; i < html.length; i++) { + switch (html.charCodeAt(i)) { + case 34: + escape = '"'; + break; + case 38: + escape = '&'; + break; + case 60: + escape = '<'; + break; + case 62: + escape = '>'; + break; + default: + continue; + } + if (lastIndex !== i) result += html.substring(lastIndex, i); + lastIndex = i + 1; + result += escape; + } + if (lastIndex !== i) return result + html.substring(lastIndex, i); + else return result; +} + +/** + * Re-throw the given `err` in context to the + * the pug in `filename` at the given `lineno`. + * + * @param {Error} err + * @param {String} filename + * @param {String} lineno + * @param {String} str original source + * @api private + */ + +exports.rethrow = pug_rethrow; +function pug_rethrow(err, filename, lineno, str) { + if (!(err instanceof Error)) throw err; + if ((typeof window != 'undefined' || !filename) && !str) { + err.message += ' on line ' + lineno; + throw err; + } + var context, lines, start, end; + try { + str = str || (__webpack_require__(/*! fs */ "?8f63").readFileSync)(filename, {encoding: 'utf8'}); + context = 3; + lines = str.split('\n'); + start = Math.max(lineno - context, 0); + end = Math.min(lines.length, lineno + context); + } catch (ex) { + err.message += + ' - could not read from ' + filename + ' (' + ex.message + ')'; + pug_rethrow(err, null, lineno); + return; + } + + // Error context + context = lines + .slice(start, end) + .map(function(line, i) { + var curr = i + start + 1; + return (curr == lineno ? ' > ' : ' ') + curr + '| ' + line; + }) + .join('\n'); + + // Alter exception message + err.path = filename; + try { + err.message = + (filename || 'Pug') + + ':' + + lineno + + '\n' + + context + + '\n\n' + + err.message; + } catch (e) {} + throw err; +} + + +/***/ }), + +/***/ "./src/core/HTMLMapper.ts": +/*!********************************!*\ + !*** ./src/core/HTMLMapper.ts ***! + \********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ HTMLMapper: () => (/* binding */ HTMLMapper) +/* harmony export */ }); +class HTMLMapper { + constructor() { + this.toElement = (html) => { + const template = window.document.createElement("div"); + template.innerHTML = html.trim(); + return template.firstChild; + }; + } +} + + +/***/ }), + +/***/ "./src/core/builder/AbstractView.ts": +/*!******************************************!*\ + !*** ./src/core/builder/AbstractView.ts ***! + \******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ AbstractView: () => (/* binding */ AbstractView) +/* harmony export */ }); +/* harmony import */ var _HTMLMapper__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../HTMLMapper */ "./src/core/HTMLMapper.ts"); + +class AbstractView { + constructor() { + this.getHTMLMapper = () => { + return this.HTMLMapper; + }; + this.HTMLMapper = new _HTMLMapper__WEBPACK_IMPORTED_MODULE_0__.HTMLMapper(); + } +} + + +/***/ }), + +/***/ "./src/lib/controllers/CloneBlockController.ts": +/*!*****************************************************!*\ + !*** ./src/lib/controllers/CloneBlockController.ts ***! + \*****************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ CloneBlockController: () => (/* binding */ CloneBlockController) +/* harmony export */ }); +/* harmony import */ var _models_SizeModel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../models/SizeModel */ "./src/lib/models/SizeModel.ts"); + +class CloneBlockController { + constructor(tagName) { + this.executeInAppendTiming = (executeList) => { + parent.document.body.appendChild(this.cloneRef); + const result = executeList.map(execute => execute()); + parent.document.body.removeChild(this.cloneRef); + return result; + }; + this.getParameterizedSize = (computedStyles, attributes) => { + this.attributeStylesService.fillCloneAttributeStyles(computedStyles, attributes); + return this.buildSize(); + }; + this.appendAttributeStyles = (attributeStyles) => { + this.cloneRef.style.width = "auto"; + this.cloneRef.style.wordBreak = "normal"; + this.cloneRef.setAttribute('style', attributeStyles); + }; + // fillCloneStyles = (computedStyles: CSSStyleDeclaration) => { + // // @ts-ignore + // this.cloneRef["style"] = computedStyles; + // } + this.buildSize = () => { + return new _models_SizeModel__WEBPACK_IMPORTED_MODULE_0__.SizeModel(this.cloneRef.offsetWidth, this.cloneRef.offsetHeight); + }; + this.cloneRef = document.createElement(tagName); + } + setAttributeStylesService(attributeStylesService) { + this.attributeStylesService = attributeStylesService; + } + fillCloneContent(html, text) { + //this.#ref.innerHTML + this.cloneRef.innerHTML = html; + this.cloneRef.innerText = text; + } +} + + +/***/ }), + +/***/ "./src/lib/controllers/ComputedStylesController.ts": +/*!*********************************************************!*\ + !*** ./src/lib/controllers/ComputedStylesController.ts ***! + \*********************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ ComputedStylesController: () => (/* binding */ ComputedStylesController) +/* harmony export */ }); +class ComputedStylesController { + constructor() { + this.getComputedStyles = (ref) => { + return window.getComputedStyle(ref); + }; + } +} + + +/***/ }), + +/***/ "./src/lib/models/CloneBlockModel.ts": +/*!*******************************************!*\ + !*** ./src/lib/models/CloneBlockModel.ts ***! + \*******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ CloneBlockModel: () => (/* binding */ CloneBlockModel) +/* harmony export */ }); +class CloneBlockModel { + constructor(inline, block) { + this.inline = inline; + this.block = block; + } +} + + +/***/ }), + +/***/ "./src/lib/models/SizeModel.ts": +/*!*************************************!*\ + !*** ./src/lib/models/SizeModel.ts ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ SizeModel: () => (/* binding */ SizeModel) +/* harmony export */ }); +class SizeModel { + constructor(width, height) { + this.width = width; + this.height = height; + } +} + + +/***/ }), + +/***/ "./src/lib/provider/StylesProvider.ts": +/*!********************************************!*\ + !*** ./src/lib/provider/StylesProvider.ts ***! + \********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ StylesProvider: () => (/* binding */ StylesProvider) +/* harmony export */ }); +class StylesProvider { + constructor() { + this.HIDDEN_STYLES = "left:0;top:0;position:absolute;z-index:100"; + this.buildAttributeStyles = (fontSize, fontFamily, widthHeightAttributes) => { + const mainAttributeStyles = `${this.HIDDEN_STYLES};font-size:${fontSize};font-family:${fontFamily};`; + return `${mainAttributeStyles}${widthHeightAttributes}`; + }; + this.getWidthHeightInlineAttributes = () => "width:auto;height:auto;white-space:nowrap"; + this.getWidthHeightBlockAttributes = (size) => `width:${size.width}px;height:auto`; + } +} + + +/***/ }), + +/***/ "./src/lib/services/AttributeStylesService.ts": +/*!****************************************************!*\ + !*** ./src/lib/services/AttributeStylesService.ts ***! + \****************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ AttributeStylesService: () => (/* binding */ AttributeStylesService) +/* harmony export */ }); +class AttributeStylesService { + constructor(cloneBlockController, stylesProvider) { + this.fillCloneAttributeStyles = (computedStyles, widthHeightAttributes) => { + const fontSize = computedStyles["fontSize"]; + const fontFamily = computedStyles["fontFamily"]; + const attributeStyles = this.stylesProvider.buildAttributeStyles(fontSize, fontFamily, widthHeightAttributes); + this.elementExactSizeController.appendAttributeStyles(attributeStyles); + }; + this.stylesProvider = stylesProvider; + this.elementExactSizeController = cloneBlockController; + } +} + + +/***/ }), + +/***/ "./src/lib/services/CloneBlockService.ts": +/*!***********************************************!*\ + !*** ./src/lib/services/CloneBlockService.ts ***! + \***********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ CloneBlockService: () => (/* binding */ CloneBlockService) +/* harmony export */ }); +/* harmony import */ var _controllers_CloneBlockController__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../controllers/CloneBlockController */ "./src/lib/controllers/CloneBlockController.ts"); +/* harmony import */ var _provider_StylesProvider__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../provider/StylesProvider */ "./src/lib/provider/StylesProvider.ts"); +/* harmony import */ var _controllers_ComputedStylesController__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../controllers/ComputedStylesController */ "./src/lib/controllers/ComputedStylesController.ts"); +/* harmony import */ var _models_CloneBlockModel__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../models/CloneBlockModel */ "./src/lib/models/CloneBlockModel.ts"); +/* harmony import */ var _AttributeStylesService__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./AttributeStylesService */ "./src/lib/services/AttributeStylesService.ts"); + + + + + +class CloneBlockService { + constructor() { + this.ELEMENT_TYPE_NAME = "div"; + this.getSize = (ref, text, refSize) => { + const computedStyles = this.computedStylesController.getComputedStyles(ref); + //this.elementExactSizeController.fillCloneStyles(computedStyles); + this.cloneBlockController.fillCloneContent(ref.innerHTML, text); + const sizes = this.cloneBlockController.executeInAppendTiming([ + () => { + return this.cloneBlockController.getParameterizedSize(computedStyles, this.stylesProvider.getWidthHeightInlineAttributes()); + }, + () => { + return this.cloneBlockController.getParameterizedSize(computedStyles, this.stylesProvider.getWidthHeightBlockAttributes(refSize)); + } + ]); + return new _models_CloneBlockModel__WEBPACK_IMPORTED_MODULE_3__.CloneBlockModel(sizes[0], sizes[1]); + }; + this.cloneBlockController = new _controllers_CloneBlockController__WEBPACK_IMPORTED_MODULE_0__.CloneBlockController(this.ELEMENT_TYPE_NAME); + this.computedStylesController = new _controllers_ComputedStylesController__WEBPACK_IMPORTED_MODULE_2__.ComputedStylesController(); + this.stylesProvider = new _provider_StylesProvider__WEBPACK_IMPORTED_MODULE_1__.StylesProvider(); + this.attributeStylesService = new _AttributeStylesService__WEBPACK_IMPORTED_MODULE_4__.AttributeStylesService(this.cloneBlockController, this.stylesProvider); + this.cloneBlockController.setAttributeStylesService(this.attributeStylesService); + } +} + + +/***/ }), + +/***/ "./src/page/ApiPageService.ts": +/*!************************************!*\ + !*** ./src/page/ApiPageService.ts ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ ApiPageService: () => (/* binding */ ApiPageService) +/* harmony export */ }); +/* harmony import */ var _core_ApiStore__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../core/ApiStore */ "./src/core/ApiStore.js"); +/* harmony import */ var _render_styles_Styles__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./render/styles/Styles */ "./src/page/render/styles/Styles.js"); +/* harmony import */ var _core_Context__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../core/Context */ "./src/core/Context.js"); +/* harmony import */ var _queue_QueueProcessor__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./queue/QueueProcessor */ "./src/page/queue/QueueProcessor.js"); +/* harmony import */ var _block_popup_controllers_PopupController__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./block/popup/controllers/PopupController */ "./src/page/block/popup/controllers/PopupController.ts"); +/* harmony import */ var _block_PageManager__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./block/PageManager */ "./src/page/block/PageManager.ts"); +var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __classPrivateFieldSet = (undefined && undefined.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; +}; +var __classPrivateFieldGet = (undefined && undefined.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); +}; +var _ApiPageService_styles, _ApiPageService_storage, _ApiPageService_manager, _ApiPageService_joinPoint, _ApiPageService_old; + + + + + + +class ApiPageService { + constructor() { + _ApiPageService_styles.set(this, void 0); + _ApiPageService_storage.set(this, void 0); + _ApiPageService_manager.set(this, void 0); + this.run = () => __awaiter(this, void 0, void 0, function* () { + try { + // Проверяем авторизацию в API + const isAuth = yield __classPrivateFieldGet(this, _ApiPageService_storage, "f").ensureAuth(); + __classPrivateFieldGet(this, _ApiPageService_storage, "f").appParams().then(enable => { + __classPrivateFieldGet(this, _ApiPageService_joinPoint, "f").call(this, enable, isAuth); + }); + } + catch (error) { + // В случае ошибки API, запускаем в локальном режиме + __classPrivateFieldGet(this, _ApiPageService_storage, "f").appParams().then(enable => { + __classPrivateFieldGet(this, _ApiPageService_joinPoint, "f").call(this, enable, false); + }); + } + }); + /** + * Добавляется в тег head новые css-стили. + * Если доступен парсинг на сервере, делаем на сервере, иначе на локальной машине + */ + _ApiPageService_joinPoint.set(this, (enable, isApiAvailable) => { + if (enable) { + __classPrivateFieldGet(this, _ApiPageService_styles, "f").append(); + __classPrivateFieldGet(this, _ApiPageService_manager, "f").run(); + // Добавляем информацию о доступности API в контекст + _core_Context__WEBPACK_IMPORTED_MODULE_2__.Context.add("apiAvailable", isApiAvailable); + } + } + /** + * Устанавливаются настройки языка + * Запускается бесконечный процесс парсинга и рендеринга страницы локально + */ + ); + /** + * Устанавливаются настройки языка + * Запускается бесконечный процесс парсинга и рендеринга страницы локально + */ + _ApiPageService_old.set(this, () => { + _core_Context__WEBPACK_IMPORTED_MODULE_2__.Context.add("language", { sl: "en", tl: "ru" }); + const processor = new _queue_QueueProcessor__WEBPACK_IMPORTED_MODULE_3__.QueueProcessor(); + processor.runInfinityParsing(); + processor.runInfinityRender(); + }); + __classPrivateFieldSet(this, _ApiPageService_storage, new _core_ApiStore__WEBPACK_IMPORTED_MODULE_0__.ApiStore(), "f"); + __classPrivateFieldSet(this, _ApiPageService_styles, new _render_styles_Styles__WEBPACK_IMPORTED_MODULE_1__.Styles(), "f"); + _core_Context__WEBPACK_IMPORTED_MODULE_2__.Context.add("menu", new _block_popup_controllers_PopupController__WEBPACK_IMPORTED_MODULE_4__.PopupController()); + __classPrivateFieldSet(this, _ApiPageService_manager, new _block_PageManager__WEBPACK_IMPORTED_MODULE_5__.PageManager(), "f"); + } +} +_ApiPageService_styles = new WeakMap(), _ApiPageService_storage = new WeakMap(), _ApiPageService_manager = new WeakMap(), _ApiPageService_joinPoint = new WeakMap(), _ApiPageService_old = new WeakMap(); + + +/***/ }), + +/***/ "./src/page/block/IndexService.ts": +/*!****************************************!*\ + !*** ./src/page/block/IndexService.ts ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ IndexService: () => (/* binding */ IndexService) +/* harmony export */ }); +/* harmony import */ var _realtime_parser_models_CursorModel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../realtime/parser/models/CursorModel */ "./src/page/realtime/parser/models/CursorModel.ts"); +/* harmony import */ var _cache_CacheManager__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./cache/CacheManager */ "./src/page/block/cache/CacheManager.ts"); + + +class IndexService { + constructor() { + this.cacheManager = new _cache_CacheManager__WEBPACK_IMPORTED_MODULE_1__.CacheManager(); + } + getIndex(event, blockInnerText) { + let cache = this.cacheManager.getOrUpdateCache(event); + const cursor = new _realtime_parser_models_CursorModel__WEBPACK_IMPORTED_MODULE_0__.CursorModel(event.offsetX, event.offsetY); + const blockWidth = cache.clone.block.width; + const inlineHeight = cache.clone.inline.height; + const inlineWidth = cache.clone.inline.width; + const currentLine = Math.round(cursor.y / inlineHeight); + console.log('currentLine: ' + currentLine); + const currentPositionByXInline = (blockWidth * (currentLine - 1)) + cursor.x; + const offsetPercent = currentPositionByXInline / inlineWidth; + const symbolIndexInline = Math.round(blockInnerText.length * offsetPercent); + return symbolIndexInline; + } +} + + +/***/ }), + +/***/ "./src/page/block/NodeManager.ts": +/*!***************************************!*\ + !*** ./src/page/block/NodeManager.ts ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ NodeManager: () => (/* binding */ NodeManager) +/* harmony export */ }); +class NodeManager { + constructor() { + this.notInteractiveElement = (node) => { + return !this.isScript(node) && !this.isSVG(node) && !this.isImage(node) + && !this.isInput(node) && /*!this.isLink(node) &&*/ !this.isBr(node) + && !this.isStyle(node) && !this.isForm(node) && !this.isComment(node) + && !this.isUnverifiableInteractiveElement(node); + }; + this.isScript = (node) => node instanceof HTMLScriptElement; + this.isForm = (node) => node instanceof HTMLFormElement; + this.isImage = (node) => node instanceof HTMLImageElement; + this.isInput = (node) => node instanceof HTMLInputElement; + // private isLink = (node: Node) => node instanceof HTMLLinkElement; + this.isStyle = (node) => node instanceof HTMLStyleElement; + this.isBr = (node) => node instanceof HTMLBRElement; + this.isSVG = (node) => node instanceof SVGSVGElement; + this.isComment = (node) => node instanceof Comment; + this.isUnverifiableInteractiveElement = (node) => node.nodeName === "CODE" /*|| node.nodeName === "A"*/; + this.resultArray = []; + this.getChildNodes = (element) => { + if (!element) + return; + const childNodes = []; + for (const node of element.childNodes) { + if (this.notInteractiveElement(node)) + childNodes.push(node); + } + return childNodes; + }; + this.getTextNodes = (element) => { + const ELEMENT_NODE = 1; + const TEXT_NODE = 3; + const childNodes = this.getChildNodes(element); + // Очищаем массив перед новым поиском + this.resultArray = []; + for (const elememt of childNodes) { + if (elememt.nodeType === TEXT_NODE) { + console.log(elememt.textContent); + this.resultArray.push(elememt); + } + else if (elememt.nodeType === ELEMENT_NODE) { + this.getTextNodes(elememt); + } + } + return this.resultArray; + }; + } +} + + +/***/ }), + +/***/ "./src/page/block/PageManager.ts": +/*!***************************************!*\ + !*** ./src/page/block/PageManager.ts ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ PageManager: () => (/* binding */ PageManager) +/* harmony export */ }); +/* harmony import */ var _cache_CacheManager__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./cache/CacheManager */ "./src/page/block/cache/CacheManager.ts"); +/* harmony import */ var _popup_PopupManager__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./popup/PopupManager */ "./src/page/block/popup/PopupManager.ts"); +/* harmony import */ var _highlighting_HighlightingService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./highlighting/HighlightingService */ "./src/page/block/highlighting/HighlightingService.ts"); +/* harmony import */ var _lib_services_CloneBlockService__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../lib/services/CloneBlockService */ "./src/lib/services/CloneBlockService.ts"); +/* harmony import */ var _IndexService__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./IndexService */ "./src/page/block/IndexService.ts"); +/* harmony import */ var _NodeManager__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./NodeManager */ "./src/page/block/NodeManager.ts"); +/* harmony import */ var _lib_models_SizeModel__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../lib/models/SizeModel */ "./src/lib/models/SizeModel.ts"); + + + + + + + +class PageManager { + constructor() { + this.run = () => { + const body = document.querySelector('body'); + const textNodeArray = this.nodeManager.getTextNodes(body); + console.log(textNodeArray); + const cloneArray = textNodeArray.map((node) => { + // Для текстовых узлов нужно получить родительский элемент + const parentElement = node.parentElement; + if (!parentElement) { + console.warn('Parent element not found for text node:', node); + return null; + } + const { width, height } = parentElement.getBoundingClientRect(); + return this.cloneBlockService.getSize(parentElement, node.textContent, new _lib_models_SizeModel__WEBPACK_IMPORTED_MODULE_6__.SizeModel(width, height)); + }).filter(Boolean); // Убираем null значения + console.log(cloneArray.length); + cloneArray.forEach((el) => { + console.log(el.inline.width); + console.log(el.inline.height); + console.log(el.block.width); + console.log(el.block.height); + }); + }; + this.cacheManager = new _cache_CacheManager__WEBPACK_IMPORTED_MODULE_0__.CacheManager(); + this.popupManager = new _popup_PopupManager__WEBPACK_IMPORTED_MODULE_1__.PopupManager("menu"); + this.highlightingService = new _highlighting_HighlightingService__WEBPACK_IMPORTED_MODULE_2__.HighlightingService(); + this.cloneBlockService = new _lib_services_CloneBlockService__WEBPACK_IMPORTED_MODULE_3__.CloneBlockService(); + this.indexService = new _IndexService__WEBPACK_IMPORTED_MODULE_4__.IndexService(); + this.nodeManager = new _NodeManager__WEBPACK_IMPORTED_MODULE_5__.NodeManager(); + } +} +// const nodes = span.childNodes +// for (let i = 0; i < nodes.length; i++) { +// const item = nodes[i]; +// if (item.innerHTML == undefined) { +// const split = item.textContent.split(' ') +// console.log(split) +// } +// } +// onclick = (event: MouseEvent) => { +// let cache: CacheModel = this.cacheManager.getCache(event); +// if (cache) { +// } +// } +// onmousemove = (event: MouseEvent) => { +// this.cacheManager.validateNoneBlackListElement(event, () => { +// // let cache: CacheModel = this.cacheManager.getOrUpdateCache(event); +// const blockInnerText = ( event.target).innerText +// const index = new IndexService().getIndex(event, blockInnerText) +// const parser = new ParserService(); +// const word = parser.getWord(index, blockInnerText); +// console.log(word) +// // const highlighting = new BlockHighlighting( +// // cache.focusBlock, +// // cache.textBlocks +// // ); +// // highlighting.draw(); +// this.onclick(event); +// }); +// } + + +/***/ }), + +/***/ "./src/page/block/cache/CacheManager.ts": +/*!**********************************************!*\ + !*** ./src/page/block/cache/CacheManager.ts ***! + \**********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ CacheManager: () => (/* binding */ CacheManager) +/* harmony export */ }); +/* harmony import */ var _models_CacheModel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./models/CacheModel */ "./src/page/block/cache/models/CacheModel.ts"); +/* harmony import */ var _realtime_blocks_FocusBlockModel__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../realtime/blocks/FocusBlockModel */ "./src/page/realtime/blocks/FocusBlockModel.ts"); +/* harmony import */ var _lib_services_CloneBlockService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../lib/services/CloneBlockService */ "./src/lib/services/CloneBlockService.ts"); +/* harmony import */ var _lib_models_SizeModel__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../lib/models/SizeModel */ "./src/lib/models/SizeModel.ts"); +var __classPrivateFieldSet = (undefined && undefined.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; +}; +var __classPrivateFieldGet = (undefined && undefined.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); +}; +var _CacheManager_blackList, _CacheManager_cachedBlocks, _CacheManager_updateCache, _CacheManager_whereWeAre, _CacheManager_getTextNodes; + + + + +class CacheManager { + constructor() { + _CacheManager_blackList.set(this, void 0); + _CacheManager_cachedBlocks.set(this, void 0); + this.getOrUpdateCache = (event) => { + let cache = this.getCache(event); + if (!cache) { + if (__classPrivateFieldGet(this, _CacheManager_getTextNodes, "f").call(this, event).length > 0) { + cache = __classPrivateFieldGet(this, _CacheManager_updateCache, "f").call(this, event); + } + else { + __classPrivateFieldGet(this, _CacheManager_blackList, "f").add(event.target); + } + } + return cache; + }; + this.getCache = (event) => { + return __classPrivateFieldGet(this, _CacheManager_cachedBlocks, "f").get(event.target); + }; + this.validateNoneBlackListElement = (event, execute) => { + if (!__classPrivateFieldGet(this, _CacheManager_blackList, "f").has(event.target)) { + execute(); + } + }; + _CacheManager_updateCache.set(this, (event) => { + const ref = event.target; + const text = ref.innerText; + const { width, height } = ref.getBoundingClientRect(); + const clone = this.cloneBlockService.getSize(ref, text, new _lib_models_SizeModel__WEBPACK_IMPORTED_MODULE_3__.SizeModel(width, height)); + const cache = new _models_CacheModel__WEBPACK_IMPORTED_MODULE_0__.CacheModel(clone); + __classPrivateFieldGet(this, _CacheManager_cachedBlocks, "f").set(event.target, cache); + return cache; + }); + _CacheManager_whereWeAre.set(this, (event) => { + return new _realtime_blocks_FocusBlockModel__WEBPACK_IMPORTED_MODULE_1__.FocusBlockModel(event); + } + // What is this!? + ); + // What is this!? + _CacheManager_getTextNodes.set(this, (event) => { + const array = Array + .from(event.target.childNodes) + .filter(node => node.nodeName === "#text"); + //Почему пропускает вложенные элементы? + //array.map((el) => console.log(el)); + return array; + }); + __classPrivateFieldSet(this, _CacheManager_blackList, new Set(), "f"); + __classPrivateFieldSet(this, _CacheManager_cachedBlocks, new Map(), "f"); + this.cloneBlockService = new _lib_services_CloneBlockService__WEBPACK_IMPORTED_MODULE_2__.CloneBlockService(); + } +} +_CacheManager_blackList = new WeakMap(), _CacheManager_cachedBlocks = new WeakMap(), _CacheManager_updateCache = new WeakMap(), _CacheManager_whereWeAre = new WeakMap(), _CacheManager_getTextNodes = new WeakMap(); + + +/***/ }), + +/***/ "./src/page/block/cache/models/CacheModel.ts": +/*!***************************************************!*\ + !*** ./src/page/block/cache/models/CacheModel.ts ***! + \***************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ CacheModel: () => (/* binding */ CacheModel) +/* harmony export */ }); +class CacheModel { + constructor(clone) { + this.clone = clone; + } +} + + +/***/ }), + +/***/ "./src/page/block/highlighting/HighlightingController.ts": +/*!***************************************************************!*\ + !*** ./src/page/block/highlighting/HighlightingController.ts ***! + \***************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ HighlightingController: () => (/* binding */ HighlightingController) +/* harmony export */ }); +/* harmony import */ var _HighlightingProvider__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./HighlightingProvider */ "./src/page/block/highlighting/HighlightingProvider.ts"); + +class HighlightingController { + constructor() { + this.appendRef = (block) => { + this.updateHighlightBlockRef(); + const highlightBlock = this.highlightingProvider.getUpdatedBlockWithColor(block, "blue"); + const element = this.highlightingProvider.getHighlightingElement(highlightBlock); + HighlightingController.highlightBlockRef.appendChild(element); + }; + this.updateHighlightBlockRef = () => { + if (!HighlightingController.highlightBlockRef) { + HighlightingController.highlightBlockRef = window.document.createElement("div"); + window.document.body.appendChild(HighlightingController.highlightBlockRef); + } + }; + this.destructRef = () => { + if (HighlightingController.highlightBlockRef) { + window.document.body.removeChild(HighlightingController.highlightBlockRef); + } + }; + this.highlightingProvider = new _HighlightingProvider__WEBPACK_IMPORTED_MODULE_0__.HighlightingProvider(); + } +} + + +/***/ }), + +/***/ "./src/page/block/highlighting/HighlightingProvider.ts": +/*!*************************************************************!*\ + !*** ./src/page/block/highlighting/HighlightingProvider.ts ***! + \*************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ HighlightingProvider: () => (/* binding */ HighlightingProvider) +/* harmony export */ }); +class HighlightingProvider { + constructor() { + this.getUpdatedBlockWithColor = (block, color) => { + const highlightBlock = block; + highlightBlock.color = color; + return highlightBlock; + }; + this.getHighlightingElement = (block) => { + const draw = window.document.createElement("div"); + draw.style.left = `${block.x}px`; + draw.style.top = `${block.y}px`; + draw.style.width = `${block.width}px`; + draw.style.height = `${block.height}px`; + draw.style.position = "absolute"; + draw.style.zIndex = "1000"; + draw.style.opacity = "0.25"; + draw.style.pointerEvents = "none"; + draw.style.background = block.color; + return draw; + }; + } +} + + +/***/ }), + +/***/ "./src/page/block/highlighting/HighlightingService.ts": +/*!************************************************************!*\ + !*** ./src/page/block/highlighting/HighlightingService.ts ***! + \************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ HighlightingService: () => (/* binding */ HighlightingService) +/* harmony export */ }); +/* harmony import */ var _HighlightingController__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./HighlightingController */ "./src/page/block/highlighting/HighlightingController.ts"); + +class HighlightingService { + constructor() { + this.drawHighlight = (innerTextBlocks) => { + this.highlightingController.destructRef(); + innerTextBlocks.getBlocks().forEach((block, index) => { + const position = innerTextBlocks.getPosition(index); + [block.x, block.y] = [position.x, position.y]; + this.highlightingController.appendRef(block); + }); + }; + this.drawWordHighlight = (text) => { + const highlight = document.createElement('span'); + highlight.style.border = "1px solid black"; + highlight.className = 'highlight'; + highlight.innerText = text; + return highlight; + }; + this.highlightingController = new _HighlightingController__WEBPACK_IMPORTED_MODULE_0__.HighlightingController(); + } +} + + +/***/ }), + +/***/ "./src/page/block/popup/PopupManager.ts": +/*!**********************************************!*\ + !*** ./src/page/block/popup/PopupManager.ts ***! + \**********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ PopupManager: () => (/* binding */ PopupManager) +/* harmony export */ }); +/* harmony import */ var _core_Context__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../core/Context */ "./src/core/Context.js"); +var __classPrivateFieldSet = (undefined && undefined.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; +}; +var __classPrivateFieldGet = (undefined && undefined.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); +}; +var _PopupManager_popupController; + +class PopupManager { + constructor(popupName) { + _PopupManager_popupController.set(this, void 0); + this.updatePopup = (word, netGraph) => { + const ref = __classPrivateFieldGet(this, _PopupManager_popupController, "f").getRef(); + __classPrivateFieldGet(this, _PopupManager_popupController, "f").displayOn(); + __classPrivateFieldGet(this, _PopupManager_popupController, "f").setContent(word, netGraph); + __classPrivateFieldGet(this, _PopupManager_popupController, "f").setPosition(window.innerWidth - ref.offsetWidth, window.innerHeight - ref.offsetHeight - 20); + }; + __classPrivateFieldSet(this, _PopupManager_popupController, _core_Context__WEBPACK_IMPORTED_MODULE_0__.Context.get(popupName), "f"); + } +} +_PopupManager_popupController = new WeakMap(); + + +/***/ }), + +/***/ "./src/page/block/popup/controllers/PopupController.ts": +/*!*************************************************************!*\ + !*** ./src/page/block/popup/controllers/PopupController.ts ***! + \*************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ PopupController: () => (/* binding */ PopupController) +/* harmony export */ }); +/* harmony import */ var _view_LevelView__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../view/LevelView */ "./src/page/block/popup/view/LevelView.js"); +/* harmony import */ var _core_Context__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../core/Context */ "./src/core/Context.js"); +/* harmony import */ var _core_HTMLMapper__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../../core/HTMLMapper */ "./src/core/HTMLMapper.ts"); +/* harmony import */ var _view_WordView__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../view/WordView */ "./src/page/block/popup/view/WordView.js"); +var __classPrivateFieldSet = (undefined && undefined.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; +}; +var __classPrivateFieldGet = (undefined && undefined.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); +}; +var _PopupController_instances, _PopupController_ref, _PopupController_HTMLMapper, _PopupController_wordContainer, _PopupController_levelContainer, _PopupController_left, _PopupController_top, _PopupController_appendPopup, _PopupController_createPopup, _PopupController_updatePosition, _PopupController_onMouseOver, _PopupController_setWordPosition, _PopupController_getOffset; + + + + +class PopupController { + constructor() { + _PopupController_instances.add(this); + _PopupController_ref.set(this, void 0); + _PopupController_HTMLMapper.set(this, void 0); + _PopupController_wordContainer.set(this, void 0); + _PopupController_levelContainer.set(this, void 0); + _PopupController_left.set(this, "0"); + _PopupController_top.set(this, "0"); + this.getRef = () => { + return __classPrivateFieldGet(this, _PopupController_ref, "f"); + }; + this.setContent = (word, netGraph) => { + __classPrivateFieldGet(this, _PopupController_levelContainer, "f").setWord(word); + //this.#levelContainer.updateLevel(); + __classPrivateFieldGet(this, _PopupController_wordContainer, "f").updateLink(word, netGraph); + __classPrivateFieldGet(this, _PopupController_setWordPosition, "f").call(this); + }; + this.setPosition = (left, top) => { + const offset = _core_Context__WEBPACK_IMPORTED_MODULE_1__.Context.get("POPUP_WIDTH") / 2; + __classPrivateFieldSet(this, _PopupController_left, `${left - offset}px`, "f"); + __classPrivateFieldSet(this, _PopupController_top, `${top}px`, "f"); + __classPrivateFieldGet(this, _PopupController_updatePosition, "f").call(this); + }; + /* + * Показывать попап + */ + this.displayOn = () => { + __classPrivateFieldGet(this, _PopupController_ref, "f").style.visibility = "visible"; + }; + /* + * Скрывать попап + */ + this.displayOff = () => { + __classPrivateFieldGet(this, _PopupController_ref, "f").style.visibility = "hidden"; + }; + /* + * Добавление попапа в body + */ + _PopupController_appendPopup.set(this, () => { + const body = window.document.querySelector('body'); + body.appendChild(__classPrivateFieldGet(this, _PopupController_ref, "f")); + } + /* + * Добавляем препроцессор popup'а в обертку HTMLMapper + * По дефолту попап скрыт, но на него вешаем addEventListner'ы с открытием\закрытием попапа + * Создаем контейнеры для слов и для уровня + */ + ); + /* + * Добавляем препроцессор popup'а в обертку HTMLMapper + * По дефолту попап скрыт, но на него вешаем addEventListner'ы с открытием\закрытием попапа + * Создаем контейнеры для слов и для уровня + */ + _PopupController_createPopup.set(this, () => { + const html = __webpack_require__(/*! apply-loader!pug-loader!../templates/popup.pug */ "./node_modules/apply-loader/index.js!./node_modules/pug-loader/index.js!./src/page/block/popup/templates/popup.pug"); + __classPrivateFieldSet(this, _PopupController_ref, __classPrivateFieldGet(this, _PopupController_HTMLMapper, "f").toElement(html), "f"); + this.displayOff(); + __classPrivateFieldGet(this, _PopupController_instances, "m", _PopupController_onMouseOver).call(this); + __classPrivateFieldSet(this, _PopupController_wordContainer, new _view_WordView__WEBPACK_IMPORTED_MODULE_3__.WordView(__classPrivateFieldGet(this, _PopupController_ref, "f")), "f"); + __classPrivateFieldSet(this, _PopupController_levelContainer, new _view_LevelView__WEBPACK_IMPORTED_MODULE_0__.LevelView(__classPrivateFieldGet(this, _PopupController_ref, "f")), "f"); + __classPrivateFieldGet(this, _PopupController_appendPopup, "f").call(this); + }); + _PopupController_updatePosition.set(this, () => { + __classPrivateFieldGet(this, _PopupController_ref, "f").style.left = __classPrivateFieldGet(this, _PopupController_left, "f"); + __classPrivateFieldGet(this, _PopupController_ref, "f").style.top = __classPrivateFieldGet(this, _PopupController_top, "f"); + }); + /* + * Определяем положение слова, используя ширину wordContaner'a и ширину попапа + */ + _PopupController_setWordPosition.set(this, () => { + const offset = __classPrivateFieldGet(this, _PopupController_getOffset, "f").call(this, __classPrivateFieldGet(this, _PopupController_wordContainer, "f").getRef().offsetWidth); + const position = __classPrivateFieldGet(this, _PopupController_getOffset, "f").call(this, _core_Context__WEBPACK_IMPORTED_MODULE_1__.Context.get("POPUP_WIDTH")) - offset; + __classPrivateFieldGet(this, _PopupController_wordContainer, "f").getRef().style.left = `${position}px`; + }); + _PopupController_getOffset.set(this, (width) => width / 2); + __classPrivateFieldSet(this, _PopupController_HTMLMapper, new _core_HTMLMapper__WEBPACK_IMPORTED_MODULE_2__.HTMLMapper(), "f"); + _core_Context__WEBPACK_IMPORTED_MODULE_1__.Context.add("POPUP_WIDTH", 120); + _core_Context__WEBPACK_IMPORTED_MODULE_1__.Context.add("TRANSLATE_URL", "https://translate.google.com/#view=home&op=translate"); + __classPrivateFieldGet(this, _PopupController_createPopup, "f").call(this); + } +} +_PopupController_ref = new WeakMap(), _PopupController_HTMLMapper = new WeakMap(), _PopupController_wordContainer = new WeakMap(), _PopupController_levelContainer = new WeakMap(), _PopupController_left = new WeakMap(), _PopupController_top = new WeakMap(), _PopupController_appendPopup = new WeakMap(), _PopupController_createPopup = new WeakMap(), _PopupController_updatePosition = new WeakMap(), _PopupController_setWordPosition = new WeakMap(), _PopupController_getOffset = new WeakMap(), _PopupController_instances = new WeakSet(), _PopupController_onMouseOver = function _PopupController_onMouseOver() { + __classPrivateFieldGet(this, _PopupController_ref, "f").addEventListener("mouseover", () => this.displayOn()); + __classPrivateFieldGet(this, _PopupController_ref, "f").addEventListener("mouseout", () => this.displayOff()); +}; + + +/***/ }), + +/***/ "./src/page/block/popup/view/AbstractContainerView.ts": +/*!************************************************************!*\ + !*** ./src/page/block/popup/view/AbstractContainerView.ts ***! + \************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ AbstractContainerView: () => (/* binding */ AbstractContainerView) +/* harmony export */ }); +/* harmony import */ var _core_builder_AbstractView__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../../core/builder/AbstractView */ "./src/core/builder/AbstractView.ts"); +var __classPrivateFieldSet = (undefined && undefined.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; +}; +var __classPrivateFieldGet = (undefined && undefined.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); +}; +var _AbstractContainerView_ref; + +class AbstractContainerView extends _core_builder_AbstractView__WEBPACK_IMPORTED_MODULE_0__.AbstractView { + constructor(parent) { + super(); + _AbstractContainerView_ref.set(this, void 0); + this.setRef = (ref) => { + __classPrivateFieldSet(this, _AbstractContainerView_ref, ref, "f"); + }; + this.getRef = () => { + return __classPrivateFieldGet(this, _AbstractContainerView_ref, "f"); + }; + const html = __webpack_require__(/*! apply-loader!pug-loader!../templates/container.pug */ "./node_modules/apply-loader/index.js!./node_modules/pug-loader/index.js!./src/page/block/popup/templates/container.pug"); + __classPrivateFieldSet(this, _AbstractContainerView_ref, this.getHTMLMapper().toElement(html), "f"); + parent.appendChild(__classPrivateFieldGet(this, _AbstractContainerView_ref, "f")); + } +} +_AbstractContainerView_ref = new WeakMap(); + + +/***/ }), + +/***/ "./src/page/realtime/blocks/FocusBlockModel.ts": +/*!*****************************************************!*\ + !*** ./src/page/realtime/blocks/FocusBlockModel.ts ***! + \*****************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ FocusBlockModel: () => (/* binding */ FocusBlockModel) +/* harmony export */ }); +class FocusBlockModel { + constructor(event) { + this.getRef = () => { + return this.ref; + }; + this.getSize = () => { + return this.size; + }; + this.getPosition = () => { + return this.position; + }; + this.setupPosition = () => { + const x = this.rect.x + window.scrollX; + const y = this.rect.y + window.scrollY; + this.position = { x, y }; + }; + this.setupSize = () => { + const width = this.rect.width; + const height = this.rect.height; + this.size = { width, height }; + }; + this.ref = event.target; + this.rect = this.ref.getBoundingClientRect(); + this.setupSize(); + this.setupPosition(); + } +} + + +/***/ }), + +/***/ "./src/page/realtime/parser/models/CursorModel.ts": +/*!********************************************************!*\ + !*** ./src/page/realtime/parser/models/CursorModel.ts ***! + \********************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ CursorModel: () => (/* binding */ CursorModel) +/* harmony export */ }); +class CursorModel { + constructor(x, y) { + this.x = x; + this.y = y; + } +} + + +/***/ }), + +/***/ "./src/core/ApiApp.js": +/*!****************************!*\ + !*** ./src/core/ApiApp.js ***! + \****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ ApiApp: () => (/* binding */ ApiApp) +/* harmony export */ }); +/* harmony import */ var _words_ApiWordbookService_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./words/ApiWordbookService.js */ "./src/core/words/ApiWordbookService.js"); +/* harmony import */ var _Context__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Context */ "./src/core/Context.js"); + + + +class ApiApp { + + #context; + #wordbookService; + #logicService; + + constructor(logicService) { + this.#context = new _Context__WEBPACK_IMPORTED_MODULE_1__.Context(); + this.#logicService = logicService; + this.#wordbookService = new _words_ApiWordbookService_js__WEBPACK_IMPORTED_MODULE_0__.ApiWordbookService(); + } + + start = async () => { + // Инициализируем API сервис + const isInitialized = await this.#wordbookService.initialize(); + + if (isInitialized) { + this.#wordbookService.executeAfter(this.#runService); + await this.#wordbookService.loadWords(); + } else { + // Если API недоступен, запускаем логику без инициализации + this.#runService(); + } + } + + #runService = () => { + _Context__WEBPACK_IMPORTED_MODULE_1__.Context.add("wordbook", this.#wordbookService); + this.#logicService.run(); + } +} + +/***/ }), + +/***/ "./src/core/ApiStore.js": +/*!******************************!*\ + !*** ./src/core/ApiStore.js ***! + \******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ ApiStore: () => (/* binding */ ApiStore) +/* harmony export */ }); +/* harmony import */ var _Context__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Context */ "./src/core/Context.js"); +/* harmony import */ var _api_ApiService__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./api/ApiService */ "./src/core/api/ApiService.js"); + + + +class ApiStore { + + #apiService; + + constructor() { + this.#apiService = new _api_ApiService__WEBPACK_IMPORTED_MODULE_1__.ApiService(); + } + + appParams = () => { + return new Promise(async (resolve) => { + try { + // Проверяем авторизацию + const isAuth = await this.#apiService.ensureAuth(); + + // Загружаем настройки из localStorage (для совместимости) + chrome.storage.local.get(['enable', "russian", "english", "china", "korean"], (app) => { + _Context__WEBPACK_IMPORTED_MODULE_0__.Context.add("settings", app); + resolve(app.enable); + }); + } catch (error) { + // В случае ошибки API, используем локальные настройки + chrome.storage.local.get(['enable', "russian", "english", "china", "korean"], (app) => { + _Context__WEBPACK_IMPORTED_MODULE_0__.Context.add("settings", app); + resolve(app.enable); + }); + } + }); + } + + saveWordbooks = (wordbooks) => { + // Для совместимости сохраняем в localStorage + chrome.storage.local.set(wordbooks); + } + + getByName = (name) => { + return new Promise(resolve => chrome.storage.local.get([name], (app) => resolve(app[name]))); + } + + /** + * Получает API сервис + */ + getApiService = () => { + return this.#apiService; + } + + /** + * Проверяет авторизацию + */ + ensureAuth = async () => { + return await this.#apiService.ensureAuth(); + } + + /** + * Получает текущего пользователя + */ + getCurrentUser = async () => { + return await this.#apiService.getCurrentUser(); + } +} + +/***/ }), + +/***/ "./src/core/Context.js": +/*!*****************************!*\ + !*** ./src/core/Context.js ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ Context: () => (/* binding */ Context) +/* harmony export */ }); +const context = new Map(); + +class Context { + + /** + * bean - компонент\класс из Java + */ + static add = (name, bean) => { + context.set(name, bean); + } + + static get = (beanName) => { + return context.get(beanName); + } + + static getWordbookService = () => { + const wordbook = Context.get("wordbook"); + if (wordbook) { + return wordbook; + } + } +} + +/***/ }), + +/***/ "./src/core/Logger.js": +/*!****************************!*\ + !*** ./src/core/Logger.js ***! + \****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ Logger: () => (/* binding */ Logger) +/* harmony export */ }); +class Logger { + log = (massage) => { + window.console.log("Reckue language app: " + massage); + } + + /** + * Считывает всю информацию о ноде и её родителе, пишет её в консоль. + * Рекомендуется для использования в методе pushLastNode, после запонения листа. + * + * @param node - Вся нужная информация для дебага содержится в этой ноде. + */ + #debugNode = (node) => { + window.console.log(node.textContent); + window.console.log(node.toString()); + window.console.log(node.parentNode.toString()); + window.console.log(node.parentNode.nodeName); + window.console.log(node.parentNode.role); + } +} + +/***/ }), + +/***/ "./src/core/api/ApiService.js": +/*!************************************!*\ + !*** ./src/core/api/ApiService.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ ApiService: () => (/* binding */ ApiService) +/* harmony export */ }); +/* harmony import */ var _Logger__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Logger */ "./src/core/Logger.js"); + + +class ApiService { + #baseUrl = 'https://api.reckue.com/api/1'; + #tempToken = null; + #logger = new _Logger__WEBPACK_IMPORTED_MODULE_0__.Logger(); + + constructor() { + this.#loadTempToken(); + } + + /** + * Загружает временный токен из localStorage + */ + #loadTempToken = () => { + this.#tempToken = localStorage.getItem('reckue_temp_token'); + } + + /** + * Сохраняет временный токен в localStorage + */ + #saveTempToken = (token) => { + this.#tempToken = token; + localStorage.setItem('reckue_temp_token', token); + } + + /** + * Выполняет HTTP запрос с авторизацией + */ + #request = async (endpoint, options = {}) => { + const url = `${this.#baseUrl}${endpoint}`; + const headers = { + 'Content-Type': 'application/json', + ...options.headers + }; + + if (this.#tempToken) { + headers['Authorization'] = `Bearer ${this.#tempToken}`; + } + + try { + const response = await fetch(url, { + ...options, + headers + }); + + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + + return await response.json(); + } catch (error) { + this.#logger.log(`API request failed: ${error.message}`); + throw error; + } + } + + /** + * Авторизация через temp-in + */ + tempAuth = async () => { + try { + const response = await this.#request('/auth/tempin', { + method: 'POST', + body: JSON.stringify({}) + }); + + if (response.token) { + this.#saveTempToken(response.token); + this.#logger.log('Temporary authentication successful'); + return true; + } + return false; + } catch (error) { + this.#logger.log('Temporary authentication failed'); + return false; + } + } + + /** + * Получение информации о текущем пользователе + */ + getCurrentUser = async () => { + try { + return await this.#request('/auth/whoami'); + } catch (error) { + this.#logger.log('Failed to get current user'); + return null; + } + } + + /** + * Получение всех словарей пользователя + */ + getWordbooks = async () => { + try { + return await this.#request('/wordbooks'); + } catch (error) { + this.#logger.log('Failed to get wordbooks'); + return []; + } + } + + /** + * Получение основного словаря + */ + getMainWordbook = async () => { + try { + return await this.#request('/wordbooks/main'); + } catch (error) { + this.#logger.log('Failed to get main wordbook'); + return null; + } + } + + /** + * Получение слов из словаря с пагинацией + */ + getWords = async (wordbookId, page = 0, size = 50, filter = '') => { + try { + const body = { + page: page, + size: size + }; + + if (filter) { + body.filter = filter; + } + + return await this.#request(`/wordbook/words/${wordbookId}`, { + method: 'POST', + body: JSON.stringify(body) + }); + } catch (error) { + this.#logger.log('Failed to get words'); + return { content: [], totalElements: 0 }; + } + } + + /** + * Добавление слова в словарь + */ + addWord = async (wordbookId, word, level = 1) => { + try { + return await this.#request('/wordbook/words', { + method: 'POST', + body: JSON.stringify({ + wordbookId: wordbookId, + word: word, + level: level + }) + }); + } catch (error) { + this.#logger.log('Failed to add word'); + return null; + } + } + + /** + * Добавление списка слов + */ + addWordsList = async (wordbookId, words) => { + try { + const wordsList = words.map(word => ({ + wordbookId: wordbookId, + word: word.word || word, + level: word.level || 1 + })); + + return await this.#request('/wordbook/words/list', { + method: 'POST', + body: JSON.stringify(wordsList) + }); + } catch (error) { + this.#logger.log('Failed to add words list'); + return null; + } + } + + /** + * Обновление уровня слова + */ + updateWordLevel = async (wordbookId, wordId, level) => { + try { + return await this.#request('/wordbook/words/levels', { + method: 'POST', + body: JSON.stringify({ + wordbookId: wordbookId, + wordId: wordId, + level: level + }) + }); + } catch (error) { + this.#logger.log('Failed to update word level'); + return null; + } + } + + /** + * Удаление слова + */ + deleteWord = async (wordbookId, wordId) => { + try { + return await this.#request('/wordbook/words', { + method: 'DELETE', + body: JSON.stringify({ + wordbookId: wordbookId, + wordId: wordId + }) + }); + } catch (error) { + this.#logger.log('Failed to delete word'); + return null; + } + } + + /** + * Создание нового словаря + */ + createWordbook = async (language) => { + try { + return await this.#request('/wordbooks', { + method: 'POST', + body: JSON.stringify({ + language: language + }) + }); + } catch (error) { + this.#logger.log('Failed to create wordbook'); + return null; + } + } + + /** + * Получение словарей по языку + */ + getWordbooksByLanguage = async (language) => { + try { + return await this.#request(`/wordbooks/language/${language}`); + } catch (error) { + this.#logger.log('Failed to get wordbooks by language'); + return []; + } + } + + /** + * Проверка авторизации и автоматическая авторизация при необходимости + */ + ensureAuth = async () => { + if (!this.#tempToken) { + return await this.tempAuth(); + } + + // Проверяем, что токен еще действителен + try { + await this.getCurrentUser(); + return true; + } catch (error) { + // Токен истек, получаем новый + return await this.tempAuth(); + } + } +} + +/***/ }), + +/***/ "./src/core/enum.js": +/*!**************************!*\ + !*** ./src/core/enum.js ***! + \**************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ enumForEach: () => (/* binding */ enumForEach) +/* harmony export */ }); +/** + * Обёртка над классической записью чтобы не писать каждый раз Object.entries(...).forEach((...) => {...}) + * Вытаскивает entry из массива value, где 0 элемент это ключь енама, а 1 значение это объект - содержимое + * После передаёт entry в callback функцию, которая и будет являться обработчиком цыкла forEach. + * + * @param Enum - enum который нужно распарсить + * @param callback - функция обрабатывающая входящие в enum объекты. + */ +const enumForEach = (Enum, callback) => { + Object.entries(Enum).forEach((value) => { + const entry = value[1]; + callback(entry); + }); +} + +/***/ }), + +/***/ "./src/core/enum/Levels.js": +/*!*********************************!*\ + !*** ./src/core/enum/Levels.js ***! + \*********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ Levels: () => (/* binding */ Levels) +/* harmony export */ }); +const Levels = Object.freeze({ + NATIVE: { name: "native", hex: "#2e8801", number: 4}, + ADVANCED: { name: "advanced", hex: "#72d400" , number: 3 }, + INTERMEDIATE: { name: "intermediate", hex: "#ef9f00", number: 2 }, + ELEMENTARY: { name: "elementary", hex: "#ab0000", number: 1 }, + BEGINNER: { name: "beginner", hex: "#ff2a00", number: 0 } +}); + +/***/ }), + +/***/ "./src/core/words/ApiWordbookService.js": +/*!**********************************************!*\ + !*** ./src/core/words/ApiWordbookService.js ***! + \**********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ ApiWordbookService: () => (/* binding */ ApiWordbookService) +/* harmony export */ }); +/* harmony import */ var _Logger__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Logger */ "./src/core/Logger.js"); +/* harmony import */ var _api_ApiService__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../api/ApiService */ "./src/core/api/ApiService.js"); +/* harmony import */ var _Wordbook__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Wordbook */ "./src/core/words/Wordbook.js"); + + + + +class ApiWordbookService { + + #apiService; + #logger; + #wordbook; + #currentWordbookId; + #executeAfter; + + executeAfter = (after) => { + this.#executeAfter = after; + } + + constructor() { + this.#apiService = new _api_ApiService__WEBPACK_IMPORTED_MODULE_1__.ApiService(); + this.#logger = new _Logger__WEBPACK_IMPORTED_MODULE_0__.Logger(); + this.#wordbook = new _Wordbook__WEBPACK_IMPORTED_MODULE_2__.Wordbook(); + } + + /** + * Инициализация сервиса с авторизацией + */ + initialize = async () => { + try { + const isAuth = await this.#apiService.ensureAuth(); + if (!isAuth) { + this.#logger.log('Failed to authenticate with API'); + return false; + } + + // Получаем основной словарь + const mainWordbook = await this.#apiService.getMainWordbook(); + if (mainWordbook) { + this.#currentWordbookId = mainWordbook.id; + this.#logger.log(`Using main wordbook: ${this.#currentWordbookId}`); + } else { + // Если основного словаря нет, создаем его + const newWordbook = await this.#apiService.createWordbook('ENGLISH'); + if (newWordbook) { + this.#currentWordbookId = newWordbook.id; + this.#logger.log(`Created new wordbook: ${this.#currentWordbookId}`); + } + } + + return true; + } catch (error) { + this.#logger.log('Failed to initialize API wordbook service'); + return false; + } + } + + /** + * Загружает слова из API + */ + loadWords = async () => { + if (!this.#currentWordbookId) { + this.#logger.log('No wordbook ID available'); + if (this.#executeAfter) { + this.#executeAfter(); + } + return; + } + + try { + let page = 0; + const allWords = []; + + while (true) { + const response = await this.#apiService.getWords(this.#currentWordbookId, page, 50); + + if (!response.content || response.content.length === 0) { + break; + } + + // Преобразуем формат слов для совместимости с Wordbook + const words = response.content.map(word => ({ + word: word.word, + level: word.level || 1 + })); + + allWords.push(...words); + + if (response.content.length < 50) { + break; + } + + page++; + } + + this.set(allWords); + this.#logger.log(`Loaded ${allWords.length} words from API`); + + if (this.#executeAfter) { + this.#executeAfter(); + } + } catch (error) { + this.#logger.log('Failed to load words from API'); + if (this.#executeAfter) { + this.#executeAfter(); + } + } + } + + /** + * Устанавливает слова в wordbook + */ + set = (words) => { + this.#wordbook.set(words); + } + + /** + * Добавляет слово в API и локальный wordbook + */ + addWord = async (word, level = 1) => { + if (!this.#currentWordbookId) { + this.#logger.log('No wordbook ID available for adding word'); + return false; + } + + try { + const result = await this.#apiService.addWord(this.#currentWordbookId, word, level); + if (result) { + // Добавляем в локальный wordbook + this.#wordbook.set([{word, level}]); + this.#logger.log(`Added word to API: ${word}`); + return true; + } + return false; + } catch (error) { + this.#logger.log(`Failed to add word to API: ${word}`); + return false; + } + } + + /** + * Добавляет список слов в API + */ + addWordsList = async (words) => { + if (!this.#currentWordbookId) { + this.#logger.log('No wordbook ID available for adding words list'); + return false; + } + + try { + const result = await this.#apiService.addWordsList(this.#currentWordbookId, words); + if (result) { + // Добавляем в локальный wordbook + this.#wordbook.set(words); + this.#logger.log(`Added ${words.length} words to API`); + return true; + } + return false; + } catch (error) { + this.#logger.log('Failed to add words list to API'); + return false; + } + } + + /** + * Удаляет слово из API и локального wordbook + */ + remove = async (word) => { + if (!this.#currentWordbookId) { + this.#logger.log('No wordbook ID available for removing word'); + return false; + } + + try { + // Находим wordId для удаления + const words = await this.#apiService.getWords(this.#currentWordbookId, 0, 1000, word); + const wordToDelete = words.content.find(w => w.word === word); + + if (wordToDelete) { + const result = await this.#apiService.deleteWord(this.#currentWordbookId, wordToDelete.id); + if (result) { + this.#wordbook.remove(word); + this.#logger.log(`Removed word from API: ${word}`); + return true; + } + } + return false; + } catch (error) { + this.#logger.log(`Failed to remove word from API: ${word}`); + return false; + } + } + + /** + * Обновляет уровень слова в API + */ + updateWordLevel = async (word, level) => { + if (!this.#currentWordbookId) { + this.#logger.log('No wordbook ID available for updating word level'); + return false; + } + + try { + // Находим wordId для обновления + const words = await this.#apiService.getWords(this.#currentWordbookId, 0, 1000, word); + const wordToUpdate = words.content.find(w => w.word === word); + + if (wordToUpdate) { + const result = await this.#apiService.updateWordLevel(this.#currentWordbookId, wordToUpdate.id, level); + if (result) { + // Обновляем в локальном wordbook + this.#wordbook.remove(word); + this.#wordbook.set([{word, level}]); + this.#logger.log(`Updated word level in API: ${word} -> ${level}`); + return true; + } + } + return false; + } catch (error) { + this.#logger.log(`Failed to update word level in API: ${word}`); + return false; + } + } + + /** + * Получает wordbook + */ + getWordbook = () => { + return this.#wordbook; + } + + /** + * Получает отфильтрованный wordbook + */ + getFilteredWordbook = (filter) => { + const filtered = []; + this.#wordbook.get().forEach((level, word) => word && word.includes(filter) && filtered.push({word, level})); + const wordbook = new _Wordbook__WEBPACK_IMPORTED_MODULE_2__.Wordbook(); + wordbook.set(filtered); + return wordbook; + } + + /** + * Получает кэш wordbook + */ + getWordbookCache = () => { + return this.#wordbook.get(); + } + + /** + * Загружает словари (совместимость со старым API) + */ + loadWordbooks = async () => { + await this.loadWords(); + } + + /** + * Получает текущий ID словаря + */ + getCurrentWordbookId = () => { + return this.#currentWordbookId; + } + + /** + * Устанавливает текущий словарь + */ + setCurrentWordbook = async (wordbookId) => { + this.#currentWordbookId = wordbookId; + await this.loadWords(); + } + + /** + * Получает все словари пользователя + */ + getUserWordbooks = async () => { + try { + return await this.#apiService.getWordbooks(); + } catch (error) { + this.#logger.log('Failed to get user wordbooks'); + return []; + } + } +} + +/***/ }), + +/***/ "./src/core/words/Pages.js": +/*!*********************************!*\ + !*** ./src/core/words/Pages.js ***! + \*********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ Pages: () => (/* binding */ Pages) +/* harmony export */ }); +class Pages { + + #wordsCount; + + #pagesCount; + #scale; + + constructor(wordsCount, scale) { + this.#wordsCount = wordsCount; + this.#scale = scale; + } + + getCount = () => { + return this.#pagesCount; + } + + calcPagesCount = () => { + this.#pagesCount = Math.ceil(this.#wordsCount / this.#scale); + return this.#pagesCount; + } + + isIndexOnPage = (page, index) => index >= this.#getPageStart(page) && index < this.#getPageEnd(page); + + #getPageStart = (page) => page * this.#scale; + + #getPageEnd = (page) => (page + 1) * this.#scale; +} + +/***/ }), + +/***/ "./src/core/words/UnicodeLanguages.js": +/*!********************************************!*\ + !*** ./src/core/words/UnicodeLanguages.js ***! + \********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ UnicodeLanguages: () => (/* binding */ UnicodeLanguages) +/* harmony export */ }); +/* harmony import */ var _Context__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Context */ "./src/core/Context.js"); + + +class UnicodeLanguages { + + getRegex = () => { + return new RegExp(this.#unicode(this.#combinedLanguages())); + } + + #unicode = (string) => { + return `[^${string}]+`; + } + + #combinedLanguages = () => { + return this.#combine() === "" ? "\\w" : this.#combine(); + } + + #combine = () => { + return this.#russian() + this.#russian().toUpperCase() + + this.#english() + this.#english().toUpperCase() + + this.#korean() + this.#china(); + } + + #russian = () => { + return _Context__WEBPACK_IMPORTED_MODULE_0__.Context.get("settings").russian ? "йцукенгшщзхъфывапролджэячсмитьбю" : ""; + } + + #english = () => { + return _Context__WEBPACK_IMPORTED_MODULE_0__.Context.get("settings").english ? "yqwertuiopasdfghjklzxcvbnm" : ""; + } + + #korean = () => { + return _Context__WEBPACK_IMPORTED_MODULE_0__.Context.get("settings").korean ? "ㄱㄴㄷㄹㅁㅂㅅㅇㅈㅊㅋㅌㅍㅎㅏㅓㅗㅜㅡㅣㅑㅕㅛㅠㄲㄸㅃㅆㅉㄳㄵ" + + "ㄶㄺㄻㄼㄽㄾㄿㅀㅄㅐㅒㅔㅖㅘㅙㅚㅝㅞㅟㅢ" : ""; + } + + #china = () => { + return _Context__WEBPACK_IMPORTED_MODULE_0__.Context.get("settings").china ? "一丁丂七丄丅丆万丈三上下丌不与丏丐丑丒专且丕世丗丘丙业丛东丝丞丟" + + "丠両丢丣两严並丧丨丩个丫丬中丮丯丰丱串丳临丵丶丷丸丹为主丼丽举丿乀乁乂乃乄久乆乇么义乊之乌乍乎乏乐乑乒乓乔乕" + + "乪乫乬乭乮乯买乱乲乳乴乵乶乷乸乹乺乻乼乽乾乿亀亁亂亃亄亅了亇予争亊事二亍于亏亐云互亓五井亖亗亘亙亚些亜亝亞亟" + + "亠亡亢亣交亥亦产亨亩亪享京亭亮亯亰亱亲亳亴亵亶亷亸亹人亻亼亽亾亿什仁仂仃仄仅仆仇仈仉今介仌仍从仏仐仑仒仓仔仕" + + "他仗付仙仚仛仜仝仞仟仠仡仢代令以仦仧仨仩仪仫们仭仮仯仰仱仲仳仴仵件价仸仹仺任仼份仾仿伀企伂伃伄伅伆伇伈伉伊伋" + + "伌伍伎伏伐休伒伓伔伕伖众优伙会伛伜伝伞伟传伡伢伣伤伥伦伧伨伩伪伫伬伭伮伯估伱伲伳伴伵伶伷伸伹伺伻似伽伾伿佀佁" + + "佂佃佄佅但佇佈佉佊佋佌位低住佐佑佒体佔何佖佗佘余佚佛作佝佞佟你佡佢佣佤佥佦佧佨佩佪佫佬佭佮佯佰佱佲佳佴併佶佷" + + "佸佹佺佻佼佽佾使侀侁侂侃侄侅來侇侈侉侊例侌侍侎侏侐侑侒侓侔侕侖侗侘侙侚供侜依侞侟侠価侢侣侤侥侦侧侨侩侪侫侬侭" + + "侮侯侰侱侲侳侴侵侶侷侸侹侺侻侼侽侾便俀俁係促俄俅俆俇俈俉俊俋俌俍俎俏俐俑俒俓俔俕俖俗俘俙俚俛俜保俞俟俠信俢俣" + + "俤俥俦俧俨俩俪俫俬俭修俯俰俱俲俳俴俵俶俷俸俹俺俻俼俽俾俿倀倁倂倃倄倅倆倇倈倉倊個倌倍倎倏倐們倒倓倔倕倖倗倘候" + + "倚倛倜倝倞借倠倡倢倣値倥倦倧倨倩倪倫倬倭倮倯倰倱倲倳倴倵倶倷倸倹债倻值倽倾倿偀偁偂偃偄偅偆假偈偉偊偋偌偍偎偏" + + "偐偑偒偓偔偕偖偗偘偙做偛停偝偞偟偠偡偢偣偤健偦偧偨偩偪偫偬偭偮偯偰偱偲偳側偵偶偷偸偹偺偻偼偽偾偿傀傁傂傃傄傅" + + "傆傇傈傉傊傋傌傍傎傏傐傑傒傓傔傕傖傗傘備傚傛傜傝傞傟傠傡傢傣傤傥傦傧储傩傪傫催傭傮傯傰傱傲傳傴債傶傷傸傹傺傻" + + "傼傽傾傿僀僁僂僃僄僅僆僇僈僉僊僋僌働僎像僐僑僒僓僔僕僖僗僘僙僚僛僜僝僞僟僠僡僢僣僤僥僦僧僨僩僪僫僬僭僮僯僰僱" + + "僲僳僴僵僶僷僸價僺僻僼僽僾僿儀儁儂儃億儅儆儇儈儉儊儋儌儍儎儏儐儑儒儓儔儕儖儗儘儙儚儛儜儝儞償儠儡儢儣儤儥儦儧" + + "儨儩優儫儬儭儮儯儰儱儲儳儴儵儶儷儸儹儺儻儼儽儾儿兀允兂元兄充兆兇先光兊克兌免兎兏児兑兒兓兔兕兖兗兘兙党兛兜兝" + + "兞兟兠兡兢兣兤入兦內全兩兪八公六兮兯兰共兲关兴兵其具典兹兺养兼兽兾兿冀冁冂冃冄内円冇冈冉冊冋册再冎冏冐冑冒冓" + + "冔冕冖冗冘写冚军农冝冞冟冠冡冢冣冤冥冦冧冨冩冪冫冬冭冮冯冰冱冲决冴况冶冷冸冹冺冻冼冽冾冿净凁凂凃凄凅准凇凈凉" + + "凊凋凌凍凎减凐凑凒凓凔凕凖凗凘凙凚凛凜凝凞凟几凡凢凣凤凥処凧凨凩凪凫凬凭凮凯凰凱凲凳凴凵凶凷凸凹出击凼函凾凿" + + "刀刁刂刃刄刅分切刈刉刊刋刌刍刎刏乖乗乘乙乚乛乜九乞也习乡乢乣乤乥书乧乨乩" : ""; + } +} + +/***/ }), + +/***/ "./src/core/words/Word.js": +/*!********************************!*\ + !*** ./src/core/words/Word.js ***! + \********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ Word: () => (/* binding */ Word) +/* harmony export */ }); +/* harmony import */ var _Context__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Context */ "./src/core/Context.js"); +/* harmony import */ var _UnicodeLanguages__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./UnicodeLanguages */ "./src/core/words/UnicodeLanguages.js"); + + + +class Word { + + #unicode; + #original; + #clear; + + constructor(word) { + this.#unicode = new _UnicodeLanguages__WEBPACK_IMPORTED_MODULE_1__.UnicodeLanguages(); + this.#original = word; + this.#setupClear(); + } + + get = () => { + return this.#original; + } + + getClear = () => { + return this.#clear; + } + + #setupClear = () => { + this.#clear = this.#original.toString().toLowerCase().replace(this.#unicode.getRegex(), ""); + if (!this.#found(this.#clear)) { + this.#checkEnding(); + // this.#checkPrefix(); + } + } + + #checkEnding = () => { + let ending = null; + this.#clear.endsWith('s') && (ending = "s"); + this.#clear.endsWith('ed') && (ending = "ed"); + this.#clear.endsWith('ing') && (ending = "ing"); + (ending !== null) && this.#trimEnding(ending); + } + + #checkPrefix = () => { + this.#clear.startsWith('un') && this.#trimPrefix('un'); + } + + #trimEnding = (ending) => { + this.#clear = this.#clear.substr(0,this.#clear.length - ending.length); + this.#enrichEnding(this.#clear); + } + + #trimPrefix = (prefix) => { + //TODO:: Косячный метод, пока что убрал его из алгоритма. + this.#clear = this.#clear.substr(prefix.length - 1); + } + + #enrichEnding = (shorted) => { + if (!this.#found(shorted)) { + this.#found(shorted + 's') && (this.#clear = shorted + 's'); + this.#found(shorted + 'e') && (this.#clear = shorted + 'e'); + } + } + + #found = (word) => _Context__WEBPACK_IMPORTED_MODULE_0__.Context.getWordbookService().getWordbookCache().get(word); +} + +/***/ }), + +/***/ "./src/core/words/Wordbook.js": +/*!************************************!*\ + !*** ./src/core/words/Wordbook.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ Wordbook: () => (/* binding */ Wordbook) +/* harmony export */ }); +/* harmony import */ var _Pages__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Pages */ "./src/core/words/Pages.js"); + + +class Wordbook { + + #pages; + #cache; + + constructor() { + this.#cache = new Map(); + this.#pages = new _Pages__WEBPACK_IMPORTED_MODULE_0__.Pages(0, 0); + } + + remove = (word) => { + this.#cache.delete(word); + this.#pages = new _Pages__WEBPACK_IMPORTED_MODULE_0__.Pages(this.#cache.size, 50); + this.#pages.calcPagesCount(); + } + + set = (list) => { + list.forEach((bundle) => { + this.#cache.set(bundle.word, bundle.level); + }); + this.#pages = new _Pages__WEBPACK_IMPORTED_MODULE_0__.Pages(this.#cache.size, 50); + this.#pages.calcPagesCount(); + return this; + } + + get = () => { + return this.#cache; + } + + getPages = () => { + return this.#pages; + } + + getPage = (page) => { + let index = 0; + const result = new Map(); + this.#cache.forEach((level, word) => { + this.#pages.isIndexOnPage(page, index) && result.set(word, level); + index++; + }); + return result; + } + + toObject = () => { + const wordbooks = {}; + this.#toPieces().forEach((wordbook, index) => { + wordbooks[this.getName(index)] = wordbook; + }); + return wordbooks; + } + + getName = (number) => { + return "wordbook" + number; + } + + #toList = () => { + const list = []; + this.#cache.forEach((level, word) => { + list.push({word: word, level: level}) ; + }); + return list; + } + + #toPieces = () => { + const pieces = [[]]; + this.#toList().forEach((bundle) => this.#putInPiece(pieces, bundle)); + return pieces; + } + + #putInPiece = (pieces, bundle) => { + const counter = pieces.length - 1; + if (pieces[counter].length < 100) { + pieces[counter].push(bundle); + } else { + pieces.push([]); + this.#putInPiece(pieces, bundle); + } + } +} + +/***/ }), + +/***/ "./src/page/block/popup/view/LevelView.js": +/*!************************************************!*\ + !*** ./src/page/block/popup/view/LevelView.js ***! + \************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ LevelView: () => (/* binding */ LevelView) +/* harmony export */ }); +/* harmony import */ var _AbstractContainerView__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AbstractContainerView */ "./src/page/block/popup/view/AbstractContainerView.ts"); +/* harmony import */ var _core_enum_Levels__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../core/enum/Levels */ "./src/core/enum/Levels.js"); +/* harmony import */ var _core_enum__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../../core/enum */ "./src/core/enum.js"); +/* harmony import */ var _core_Context__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../../core/Context */ "./src/core/Context.js"); +/* harmony import */ var _render_WordRenderer__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../render/WordRenderer */ "./src/page/render/WordRenderer.js"); + + + + + + +class LevelView extends _AbstractContainerView__WEBPACK_IMPORTED_MODULE_0__.AbstractContainerView { + + #wordbookService; + #wordRenderer; + #word; + + constructor(parent, word) { + super(parent); + this.#wordbookService = _core_Context__WEBPACK_IMPORTED_MODULE_3__.Context.getWordbookService(); + this.#word = word; + this.#wordRenderer = new _render_WordRenderer__WEBPACK_IMPORTED_MODULE_4__.WordRenderer(); + } + + updateLevel = () => { + const level = this.#wordbookService.getWordbookCache().get(this.#word); + this.#renderLevelDisplay(_core_enum_Levels__WEBPACK_IMPORTED_MODULE_1__.Levels[level.toUpperCase()].number); + } + + setWord = (word) => { + this.#word = word; + } + + /** + * Далее создаём некст (Большее на 1) и пробуем менять уровень. + * + * @param current - текущее число. + */ + #increaseLevel = (current) => { + const next = current + 1; + this.#changeLevel(next); + } + + /** + * Делаем проверку что не 0. Чем немного упрощаем сложность алгоритма. + * (При current = 0, мы не заходим в цикл для провеки уровней) + * + * Далее создаём некст (Меньшее на 1) и меняем уровень. + * + * Потенциально можно не заходить в matchConcurrence, но нужно точно убедиться что этим мы не сломем логику. + * Потенциально это мало что даст. Преждевременна оптимизация корень всех зол. + * + * @param current - текущее число. + */ + #decreaseLevel = (current) => { + if (current > 0) { + const next = current - 1; + //TODO:: Потенциально стоит поменять (не заходить в matchConcurrence). + this.#changeLevel(next); + } + } + + /** + * Делаем проверку, что уровень можно менять. + * + * Если можно, то вызываем функцию которая перерендерит дисплей по templates шаблону. + * Также выгрузим render функцию из контекста. (Эта функция заменит цвет слов на странице в соотвествии с их новым уровнем). + * И под конец выгрузим изменения в storage и cache. После чего они сохранятся и после перезагрузки страницы. + * + * @param next - Число обозначающее уровень после изменений + */ + #changeLevel = (next) => { + this.#matchConcurrence(next, (next, level) => { + this.#renderLevelDisplay(next) + this.#wordRenderer.renderAll(this.#word, level.name); + this.#wordbookService.set([{word: this.#word, level: level.name}]); + }); + } + + /** + * Если находим соответствие в массиве уровней, тогда меняем везде current на next. + * + * current - текущее число обозначающее уровень + * @param next - Число обозначающее уровень после изменений + * @param doChange - Функция которая заменит уровень + */ + #matchConcurrence = (next, doChange) => { + ;(0,_core_enum__WEBPACK_IMPORTED_MODULE_2__.enumForEach)(_core_enum_Levels__WEBPACK_IMPORTED_MODULE_1__.Levels, (level) => (level.number === next) && doChange(next, level)); + } + + /** + * Заполняем display из templates шаблона. + * Полностью заменяем старые элементы на новые. + * Также отвязываем старую ссылку дисплея в родительском классе. + * После возвращаем EventListener's на кнопки + и - (Уровни). + * + * Метод вызывается в самом начале и при каждом изменении уровня. + * + * @param number - текущее число обозначающее уровень + */ + #renderLevelDisplay = (number) => { + const pug = __webpack_require__(/*! pug-loader!../templates/level-display.pug */ "./node_modules/pug-loader/index.js!./src/page/block/popup/templates/level-display.pug"); + const display = this.getHTMLMapper().toElement(pug(this.#buildOptions(number))); + this.#replaceReferences(display); + this.#setupControllers(number); + } + + #replaceReferences = (ref) => { + this.getRef().replaceWith(ref); + this.setRef(ref); + } + + /** + * Добавляем click событие на новые кнопки + и - (Уровень) + * Для корректной работы нужен заполненный display + */ + #setupControllers = (current) => { + const controllers = this.getRef().getElementsByClassName("wb-level-controller"); + controllers[0].addEventListener("click", () => this.#increaseLevel(current)); + controllers[1].addEventListener("click", () => this.#decreaseLevel(current)); + } + + /** + * Заполняем + * @param number + * @returns {{number, width: string}} + */ + #buildOptions = (number) => { + return { + number: number, + width: _core_Context__WEBPACK_IMPORTED_MODULE_3__.Context.get("POPUP_WIDTH") + "px" + } + } +} + +/***/ }), + +/***/ "./src/page/block/popup/view/WordView.js": +/*!***********************************************!*\ + !*** ./src/page/block/popup/view/WordView.js ***! + \***********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ WordView: () => (/* binding */ WordView) +/* harmony export */ }); +/* harmony import */ var _AbstractContainerView__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AbstractContainerView */ "./src/page/block/popup/view/AbstractContainerView.ts"); +/* harmony import */ var _core_Context__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../core/Context */ "./src/core/Context.js"); + + + +class WordView extends _AbstractContainerView__WEBPACK_IMPORTED_MODULE_0__.AbstractContainerView { + + #templateFunction; + #parent; + + constructor(parent) { + super(parent); + this.#templateFunction = __webpack_require__(/*! pug-loader!../templates/word-display.pug */ "./node_modules/pug-loader/index.js!./src/page/block/popup/templates/word-display.pug"); + this.#parent = parent; + this.#parent.prepend(this.getRef()); + } + /** + * Берем собранный Href > делаем через pug ссылку со словом + * > оборачиваем через HTMLMapper в див + * Заменяем old контейнер на новый ref + */ + updateLink = (word, netGraph) => { + //const href = this.#buildHref(word); + const html = this.#templateFunction({word, netGraph}); + const ref = this.getHTMLMapper().toElement(html); + const old = this.getRef(); + this.setRef(ref); + this.#parent.replaceChild(this.getRef(), old); + } + + /* + *Делаем ссылку на слово в гугл-переводчик + */ + #buildHref = (word) => { + const language = _core_Context__WEBPACK_IMPORTED_MODULE_1__.Context.get("language"); + const url = `${_core_Context__WEBPACK_IMPORTED_MODULE_1__.Context.get("TRANSLATE_URL")}&sl=${language.sl}&tl=${language.tl}&text=${word}`; + this.#printPageContent(url); + return url; + } + + /* + * window.open(url, name, params) - метод возвращает ссылку на объект window нового окна. + * Name - имя, params - настройки окна (не обязательные) + */ + #printPageContent = (url) => { + window.console.log(chrome.tabs); + const opened = window.open(url, "_blank"); + opened.close(); + } +} + +/***/ }), + +/***/ "./src/page/parser/Parser.js": +/*!***********************************!*\ + !*** ./src/page/parser/Parser.js ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ Parser: () => (/* binding */ Parser) +/* harmony export */ }); +/* harmony import */ var _page_PageParser__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./page/PageParser */ "./src/page/parser/page/PageParser.js"); +/* harmony import */ var _text_TextBlocksParser__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./text/TextBlocksParser */ "./src/page/parser/text/TextBlocksParser.js"); +/* harmony import */ var _core_Context__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../core/Context */ "./src/core/Context.js"); + + + + +class Parser { + + #page; + #textBlocks; + + constructor() { + this.#page = new _page_PageParser__WEBPACK_IMPORTED_MODULE_0__.PageParser(); + this.#textBlocks = new _text_TextBlocksParser__WEBPACK_IMPORTED_MODULE_1__.TextBlocksParser(); + } + + textBlocksParsing = (textBlocks) => { + return this.#textBlocks.parse(textBlocks); + } + + parsePage = () => { + this.#page.parse(); + } + + /** + * + */ + putInQueue = (node) => { + this.#page.putInQueue(node); + } +} + +/***/ }), + +/***/ "./src/page/parser/page/PageParser.js": +/*!********************************************!*\ + !*** ./src/page/parser/page/PageParser.js ***! + \********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ PageParser: () => (/* binding */ PageParser) +/* harmony export */ }); +/* harmony import */ var _core_Logger__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../core/Logger */ "./src/core/Logger.js"); +/* harmony import */ var _core_Context__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../core/Context */ "./src/core/Context.js"); +/* harmony import */ var _render_PageChangeListener__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../render/PageChangeListener */ "./src/page/render/PageChangeListener.js"); + + + + +class PageParser { + + #logger; + #listener; + #pageQueue; + #textsQueue; + + constructor() { + this.#logger = new _core_Logger__WEBPACK_IMPORTED_MODULE_0__.Logger(); + this.#listener = new _render_PageChangeListener__WEBPACK_IMPORTED_MODULE_2__.PageChangeListener(); + this.#pageQueue = _core_Context__WEBPACK_IMPORTED_MODULE_1__.Context.get("page-elements-queue"); + this.#textsQueue = _core_Context__WEBPACK_IMPORTED_MODULE_1__.Context.get("text-elements-queue"); + } + + putInQueue = (node) => { + this.#pageQueue.queueUp(node); + } + + /** + * Заходим в алгоритм парсинга с началной нодой. + * Это может быть body или добавочные ноды из листнера. + * + * @returns {*[]} - textBlocks + * Список всего текста на странице с привязкой к элементам. + * Эти элементы это всегда конечные child ноды. + */ + parse = () => { + this.#logger.log("Started queued node."); + this.#pageQueue.takeTurns(this.#parsingTextBlocks); + } + + /** + * Логирует процент парсинга страницы в спискок референсов, пока что работает топорно от тега BODY. + * По какой-то причине ускоряет работу алгоритма парсинга. Магия не иначе :b + * + * @param node - берём отсюда название тега (определяем BODY) и общий объём работы (количество всех тэгов) + * @param currIndex - текущий тэг, который и опредяет наш процент выполненной работы. + * Когда currIndex === maxIndex (node.childNodes.length) - мы распарсили страницу. + */ + #logPercent = (node, currIndex) => { + if (node.nodeName === "BODY") { + const maxIndex = node.childNodes.length; + const percent = (currIndex * 100 / maxIndex).toFixed(2); + this.#logger.log(`processed ${percent}% of the page!`); + } + } + + /** + * Принимает тэг и возвращает список всех TEXT элементов + * (Они всегда расположены на вершинах дерева html документа) + * + * @param node - Текущий тэг + * @returns {[]} + */ + #parsingTextBlocks = (node) => { + node.childNodes.forEach((childNode, index) => { + this.#logPercent(node, index); + if (this.#notInteractiveElement(childNode)) { + this.#parseCurrentNode(childNode); + } + }); + } + + /** + * Этот метод и методы под ним используются для отсеивания тэгов, которые мы точно не хотим парсить. + * Различный динамический контент, то что переводить не надо, картинки, вспомогательные файлы, скрипты и тд. + * + * @param node - Тэг, который подвергается проверке. + * @returns {boolean} - ответ на вопрос: парсим мы тэг или нет? + */ + #notInteractiveElement = (node) => { + return !this.#isScript(node) && !this.#isSVG(node) && !this.#isImage(node) + && !this.#isInput(node) && !this.#isLink(node) && !this.#isBr(node) + && !this.#isStyle(node) && !this.#isForm(node) && !this.#isComment(node) + && !this.#isUnverifiableInteractiveElement(node); + } + #isScript = (node) => node instanceof HTMLScriptElement; + #isForm = (node) => node instanceof HTMLFormElement; + #isImage = (node) => node instanceof HTMLImageElement; + #isInput = (node) => node instanceof HTMLInputElement; + #isLink = (node) => node instanceof HTMLLinkElement; + #isStyle = (node) => node instanceof HTMLStyleElement; + #isBr = (node) => node instanceof HTMLBRElement; + #isSVG = (node) => node instanceof SVGSVGElement; + #isComment = (node) => node instanceof Comment; + #isUnverifiableInteractiveElement = (node) => node.nodeName === "CODE" || node.nodeName === "A"; + + /** + * Если текущий элемент не в конце дерева, идём парсить дальше, + * иначе пробуем добавить его в массив всех TEXT элементов + * + * @param node - текущий элемент + */ + #parseCurrentNode = (node) => { + if (node.hasChildNodes()) { + this.#listener.listen(node); + this.#parsingTextBlocks(node); + } else { + this.#textsQueue.queueUp(node); + } + } +} + +/***/ }), + +/***/ "./src/page/parser/text/TextBlocksParser.js": +/*!**************************************************!*\ + !*** ./src/page/parser/text/TextBlocksParser.js ***! + \**************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ TextBlocksParser: () => (/* binding */ TextBlocksParser) +/* harmony export */ }); +/* harmony import */ var _core_Context__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../core/Context */ "./src/core/Context.js"); +/* harmony import */ var _core_words_Word__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../core/words/Word */ "./src/core/words/Word.js"); +/* harmony import */ var _queue_Queue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../queue/Queue */ "./src/page/queue/Queue.js"); + + + + +class TextBlocksParser { + + #textsQueue; + #renderQueue; + #wordbook; + + constructor() { + this.#wordbook = _core_Context__WEBPACK_IMPORTED_MODULE_0__.Context.getWordbookService().getWordbookCache(); + this.#textsQueue = _core_Context__WEBPACK_IMPORTED_MODULE_0__.Context.get("text-elements-queue"); + this.#renderQueue = _core_Context__WEBPACK_IMPORTED_MODULE_0__.Context.get("render-queue"); + } + + parse = () => { + this.#textsQueue.takeTurns((ref) => { + const originals = this.#parseWords(ref) + this.#collectWords(ref, originals); + }); + } + + #parseWords = (ref) => { + const text = ref.textContent; + const wordsList = text.split(' '); + return this.#restoreSpacesAndSymbols(wordsList); + } + + /** + * Метод который добавляет пробелы в список, чтобы они не терялись после разделения методом split + * Также проверяет слова на наличие тире, в случае наличия - делит слова на два и добавляет дэш. + * На случай если слово сливается с запятой или точкой также проверяет и эти случаи. Аналогично с тире. + * + * @param wordsList + * @returns {[]} + */ + #restoreSpacesAndSymbols = (wordsList) => { + const wordsListWithSpaces = []; + wordsList.forEach((word, index) => { + if (index !== 0) { + wordsListWithSpaces.push(""); + } + this.#restoreSymbols(wordsListWithSpaces, word, "-") || + this.#restoreSymbols(wordsListWithSpaces, word, ".") || + this.#restoreSymbols(wordsListWithSpaces, word, "...") || + this.#restoreSymbols(wordsListWithSpaces, word, ",") || + this.#restoreEndings(wordsListWithSpaces, word); + }) + return wordsListWithSpaces; + } + + #restoreEndings = (words, word) => { + if (word.endsWith("n't") && !word.includes("can't")) { + this.#restoreSpecificEnding(words, word, "n't", "not"); + } else if (word.endsWith("'ll")) { + this.#restoreSpecificEnding(words, word, "'ll", "will"); + } else { + words.push(word); + } + } + + #restoreSpecificEnding = (words, word, ending, restored) => { + const clear = this.#checkByEnding(word, ending); + words.push(clear, "", restored); + } + + #checkByEnding = (word, ending) => { + const removedPastEndingWord = this.#removeEnding(word, ending); + return this.#findMatches(removedPastEndingWord); + } + + #removeEnding = (word, ending) => word.substr(0,word.length - ending.length); + + #findMatches = (word) => { + if (this.#found(word)) return word; + if (this.#found(word + 'e')) return word + 'e'; + return word; + } + + #found = (word) => this.#wordbook.get(word); + + /** + * Непосредственно проверка наличия символа, разделение слова на + * два и добавление их вместе с символом в общий массив слов. + * + * @param words - общий массив слов + * @param word - слово, которое проверяем на наличие символа. + * @param symbol - символ, который проверяем + * + * @returns {boolean} - если сделали restore - вернём true, в дальнейшем проверяем это условие. + * Если ни один из символов не будет найден, то в итоге просто добавим word в общий массив слов. + */ + #restoreSymbols = (words, word, symbol) => { + const splinted = word.split(symbol); + if (splinted.length === 2) { + const first = splinted[0]; + const second = splinted[1]; + words.push(first, symbol, second); + return true; + } + return false; + } + + /** + * Создаём связку слов и чистых слов без всяких точек, запятых, пробелов и тд. + * Это нужно чтобы упростить сложность алгоритма построения страницы в дальнейшем. + * + * Складываем связку вместе с ссылкой на изначальный элемент. + * + * @param ref - ссылка на элемент, из которого построен массив слов. + * @param originals - список изначальных слов (В том виде в котором они на странице). + * @returns {[]} - список связок (слов и чистых слов) + */ + #collectWords = (ref, originals) => { + const words = []; + originals.forEach((original) => words.push(new _core_words_Word__WEBPACK_IMPORTED_MODULE_1__.Word(original))); + this.#renderQueue.queueUp({ref, words}); + } +} + +/***/ }), + +/***/ "./src/page/queue/Queue.js": +/*!*********************************!*\ + !*** ./src/page/queue/Queue.js ***! + \*********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ Queue: () => (/* binding */ Queue) +/* harmony export */ }); +class Queue { + + #inProgress; + #elements; + + constructor() { + this.#inProgress = false; + this.#elements = new Set(); + } + + /** + * Добавляет элемент страницы в коллекцию для дальнейшей работы с ним + */ + queueUp = (element) => { + this.#elements.add(element); + } + + /** + * Ставим статус запуска работы функции true. + * Выполняем с каждым элементом коллекции некоторые действия. + * После чего очищаем коллекцию для оптимизации. + * После чего меняем статус работы функции на false, дабы обозначить завершение работы функции. + */ + takeTurns = (func) => { + this.#inProgress = true; + this.#elements.forEach((element) => func(element)); + this.#elements.clear(); + this.#inProgress = false; + } + + /** + * Проверка, пустая ли коллекция элементов + */ + isEmpty = () => { + return this.#elements.size === 0; + } + + /** + * Проверка, какой статус выполнения + */ + isActive = () => { + return this.#inProgress; + } +} + +/***/ }), + +/***/ "./src/page/queue/QueueProcessor.js": +/*!******************************************!*\ + !*** ./src/page/queue/QueueProcessor.js ***! + \******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ QueueProcessor: () => (/* binding */ QueueProcessor) +/* harmony export */ }); +/* harmony import */ var _render_DOMBuilder__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../render/DOMBuilder */ "./src/page/render/DOMBuilder.js"); +/* harmony import */ var _core_Context__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/Context */ "./src/core/Context.js"); +/* harmony import */ var _parser_Parser__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../parser/Parser */ "./src/page/parser/Parser.js"); +/* harmony import */ var _Queue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Queue */ "./src/page/queue/Queue.js"); +/* harmony import */ var _core_Logger__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../core/Logger */ "./src/core/Logger.js"); + + + + + + +class QueueProcessor { + + #builder; + #parser; + #logger; + + constructor() { + _core_Context__WEBPACK_IMPORTED_MODULE_1__.Context.add("render-queue", new _Queue__WEBPACK_IMPORTED_MODULE_3__.Queue()); + _core_Context__WEBPACK_IMPORTED_MODULE_1__.Context.add("page-elements-queue", new _Queue__WEBPACK_IMPORTED_MODULE_3__.Queue()); + _core_Context__WEBPACK_IMPORTED_MODULE_1__.Context.add("text-elements-queue", new _Queue__WEBPACK_IMPORTED_MODULE_3__.Queue()); + this.#logger = new _core_Logger__WEBPACK_IMPORTED_MODULE_4__.Logger(); + this.#parser = new _parser_Parser__WEBPACK_IMPORTED_MODULE_2__.Parser(); + this.#builder = new _render_DOMBuilder__WEBPACK_IMPORTED_MODULE_0__.DOMBuilder(); + } + + runInfinityParsing = () => { + this.#startPageParsing(); + this.#startTextsParsing(); + } + + /** + * Находим body, ставим в очередь на парсинг страницу. Если выполняются условия: + * 1) isParsingQueueReady - проверка готовности очереди на парсинг + * и + * 2) isParsingPageQueueReady - проверка готовности и не пустой страницы + * Парсим страницу + */ + #startPageParsing = () => { + let body = window.document.querySelector('body'); + this.#parser.putInQueue(body); + setInterval(() => { + if (this.#isParsingQueueReady() && this.#isParsingPageQueueReady()) { + this.#parser.parsePage(); + } + }, 100); + } + + /** + * Через интервал 100 парсим текст страницы, если: + * 1) isParsingQueueReady - проверка готовности очереди на парсинг + * и + * 2) isParsingTextsQueueReady - проверка готовности текста и коллекции text-элементов + */ + #startTextsParsing = () => { + setInterval(() => { + if (this.#isParsingQueueReady() && this.#isParsingTextsQueueReady()) { + this.#parser.textBlocksParsing(); + } + }, 100); + } + + runInfinityRender = () => { + setInterval(() => { + if (this.#isRenderQueueReady()) { + this.#builder.rebuildPage(); + } + }, 100); + } + + #isRenderQueueReady = () => { + const queue = _core_Context__WEBPACK_IMPORTED_MODULE_1__.Context.get("render-queue"); + return !queue.isActive() && !queue.isEmpty(); + } + + #isParsingQueueReady = () => { + const render = _core_Context__WEBPACK_IMPORTED_MODULE_1__.Context.get("render-queue"); + return !render.isActive(); + } + + #isParsingPageQueueReady = () => { + const page = _core_Context__WEBPACK_IMPORTED_MODULE_1__.Context.get("page-elements-queue"); + return !page.isActive() && !page.isEmpty(); + } + + #isParsingTextsQueueReady = () => { + const texts = _core_Context__WEBPACK_IMPORTED_MODULE_1__.Context.get("text-elements-queue"); + return !texts.isActive() && !texts.isEmpty(); + } +} + +/***/ }), + +/***/ "./src/page/render/DOMBuilder.js": +/*!***************************************!*\ + !*** ./src/page/render/DOMBuilder.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ DOMBuilder: () => (/* binding */ DOMBuilder) +/* harmony export */ }); +/* harmony import */ var _core_Logger__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../core/Logger */ "./src/core/Logger.js"); +/* harmony import */ var _block_popup_controllers_PopupController__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../block/popup/controllers/PopupController */ "./src/page/block/popup/controllers/PopupController.ts"); +/* harmony import */ var _PageWord__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./PageWord */ "./src/page/render/PageWord.js"); +/* harmony import */ var _core_Context__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../core/Context */ "./src/core/Context.js"); + + + + + +class DOMBuilder { + + #logger = new _core_Logger__WEBPACK_IMPORTED_MODULE_0__.Logger(); + + constructor() { + _core_Context__WEBPACK_IMPORTED_MODULE_3__.Context.add("menu", new _block_popup_controllers_PopupController__WEBPACK_IMPORTED_MODULE_1__.PopupController()); + _core_Context__WEBPACK_IMPORTED_MODULE_3__.Context.add("notSavedWords", new Set()); + _core_Context__WEBPACK_IMPORTED_MODULE_3__.Context.add("refs", new Map()); + } + + rebuildPage = () => { + this.#logAspect((bundle) => this.#appendText(bundle.ref, bundle.words)); + } + + #logAspect = (logic) => { + this.#logger.log("Rebuilding page..."); + const queue = _core_Context__WEBPACK_IMPORTED_MODULE_3__.Context.get("render-queue"); + queue.takeTurns(logic); + this.#logger.log("Rebuilding page complete!"); + this.#logger.log(`Found not saved words - ${_core_Context__WEBPACK_IMPORTED_MODULE_3__.Context.get("notSavedWords").size}`); + } + + #appendText = (textRef, list) => { + if (textRef.parentNode.nodeName !== "A") { + list.forEach((word) => { + const wordRef = this.#createRef(word); + if (wordRef.textContent !== "") { + this.#saveRef(word.getClear(), wordRef); + this.#doAppend(wordRef, textRef); + } + }); + textRef.textContent = ""; + } + } + + #saveRef = (clear, wordRef) => { + const map = _core_Context__WEBPACK_IMPORTED_MODULE_3__.Context.get("refs"); + let refs = map.get(clear); + !refs && (refs = []); + refs.push(wordRef); + map.set(clear, refs); + } + + #createRef = (word) => { + if (word.get() !== "") { + const pageWord = new _PageWord__WEBPACK_IMPORTED_MODULE_2__.PageWord(word); + return pageWord.create(); + } + return this.#createTextNode(" "); + } + + #doAppend = (updated, previous) => { + previous.after(updated, previous); + } + + #createTextNode = (word) => { + return document.createTextNode(word); + } +} + +/***/ }), + +/***/ "./src/page/render/PageChangeListener.js": +/*!***********************************************!*\ + !*** ./src/page/render/PageChangeListener.js ***! + \***********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ PageChangeListener: () => (/* binding */ PageChangeListener) +/* harmony export */ }); +/* harmony import */ var _core_Context__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../core/Context */ "./src/core/Context.js"); + + +class PageChangeListener { + + #observer; + + constructor() { + this.#observer = new MutationObserver((mutations) => this.#parseCandidate(mutations)); + } + + listen = (node) => { + const config = { childList: true }; + this.#observer.observe(node, config); + } + + #parseCandidate = (mutations) => { + if (!_core_Context__WEBPACK_IMPORTED_MODULE_0__.Context.get("render-queue").isActive()) { + mutations.forEach((mutation) => this.#putInQueue(mutation)); + } + } + + #putInQueue = (mutation) => { + mutation.addedNodes.forEach(node => { + const pageQueue = _core_Context__WEBPACK_IMPORTED_MODULE_0__.Context.get("page-elements-queue"); + pageQueue.queueUp(node); + }) + } +} + +/***/ }), + +/***/ "./src/page/render/PageWord.js": +/*!*************************************!*\ + !*** ./src/page/render/PageWord.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ PageWord: () => (/* binding */ PageWord) +/* harmony export */ }); +/* harmony import */ var _core_Context__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../core/Context */ "./src/core/Context.js"); +/* harmony import */ var _core_enum_Levels__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/enum/Levels */ "./src/core/enum/Levels.js"); +/* harmony import */ var _WordRenderer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./WordRenderer */ "./src/page/render/WordRenderer.js"); + + + + +class PageWord { + + #wordbookService; + #word; + #renderer; + + constructor(word) { + this.#word = word; + this.#renderer = new _WordRenderer__WEBPACK_IMPORTED_MODULE_2__.WordRenderer(); + this.#wordbookService = _core_Context__WEBPACK_IMPORTED_MODULE_0__.Context.getWordbookService(); + } + + create = () => { + if (this.#word.get() === "") return this.#blank(); + const ref = this.#renderer.createRef(this.#word.get().trim()); + const level = this.#wordbookService.getWordbookCache().get(this.#word.getClear()); + if (this.#isSaved(level)) return this.#saved(ref, level); + return this.#notSaved(ref); + } + + #blank = () => { + return document.createTextNode(this.#word.get()); + } + + #saved = (ref, level) => { + this.#renderer.onHover(ref, this.#word.getClear()); + this.#renderer.resolveColor(ref, level) + return ref; + } + + #notSaved = (ref) => { + this.#pullInContext(); + ref.addEventListener("click", this.#saveWord, {once: true}); + return ref; + } + + #saveWord = () => { + const level = _core_enum_Levels__WEBPACK_IMPORTED_MODULE_1__.Levels.BEGINNER.name; + const word = this.#word.getClear(); + this.#wordbookService.set([{word, level}]); + this.#renderer.renderAll(word, level); + this.#renderer.onHoverAll(this.#word.getClear()); + } + + #pullInContext = () => (this.#word.getClear() !== " ") && _core_Context__WEBPACK_IMPORTED_MODULE_0__.Context.get("notSavedWords").add(this.#word.getClear()); + + #isSaved = (level) => level !== undefined; +} + +/***/ }), + +/***/ "./src/page/render/WordRenderer.js": +/*!*****************************************!*\ + !*** ./src/page/render/WordRenderer.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ WordRenderer: () => (/* binding */ WordRenderer) +/* harmony export */ }); +/* harmony import */ var _core_Context__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../core/Context */ "./src/core/Context.js"); +/* harmony import */ var _core_enum_Levels__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/enum/Levels */ "./src/core/enum/Levels.js"); + + + +class WordRenderer { + + onHover(ref, word) { + const popup = _core_Context__WEBPACK_IMPORTED_MODULE_0__.Context.get("menu"); + ref.addEventListener("click", (event) => this.#showPopup(event, popup, word)); + ref.addEventListener("mouseout", popup.displayOff); + } + + #showPopup = (event, popup, word) => { + popup.displayOn(); + popup.setPosition(event.clientX, event.clientY); + popup.setContent(word); + } + + onHoverAll = (clear) => { + const refs = _core_Context__WEBPACK_IMPORTED_MODULE_0__.Context.get("refs"); + const words = refs.get(clear); + words.forEach((word) => { + this.onHover(word, clear); + }); + } + + renderAll = (clear, level) => { + const refs = _core_Context__WEBPACK_IMPORTED_MODULE_0__.Context.get("refs"); + const words = refs.get(clear); + words.forEach((word) => { + this.resolveColor(word, level) + }); + } + + createRef = (word) => { + const ref = document.createElement('a'); + word = word.replace(/\r?\n/g, ""); + ref.innerText = word; + ref.style.cursor = "pointer"; + return ref; + } + + resolveColor = (ref, level) => { + switch (level) { + case _core_enum_Levels__WEBPACK_IMPORTED_MODULE_1__.Levels.NATIVE.name: + ref.style.color = _core_enum_Levels__WEBPACK_IMPORTED_MODULE_1__.Levels.NATIVE.hex; + break; + case _core_enum_Levels__WEBPACK_IMPORTED_MODULE_1__.Levels.ADVANCED.name: + ref.style.color = _core_enum_Levels__WEBPACK_IMPORTED_MODULE_1__.Levels.ADVANCED.hex; + break; + case _core_enum_Levels__WEBPACK_IMPORTED_MODULE_1__.Levels.INTERMEDIATE.name: + ref.style.color = _core_enum_Levels__WEBPACK_IMPORTED_MODULE_1__.Levels.INTERMEDIATE.hex; + break; + case _core_enum_Levels__WEBPACK_IMPORTED_MODULE_1__.Levels.ELEMENTARY.name: + ref.style.color = _core_enum_Levels__WEBPACK_IMPORTED_MODULE_1__.Levels.ELEMENTARY.hex; + break; + case _core_enum_Levels__WEBPACK_IMPORTED_MODULE_1__.Levels.BEGINNER.name: + ref.style.color = _core_enum_Levels__WEBPACK_IMPORTED_MODULE_1__.Levels.BEGINNER.hex; + break; + } + } +} + +/***/ }), + +/***/ "./src/page/render/styles/Styles.js": +/*!******************************************!*\ + !*** ./src/page/render/styles/Styles.js ***! + \******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ Styles: () => (/* binding */ Styles) +/* harmony export */ }); +/* harmony import */ var _core_HTMLMapper__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../core/HTMLMapper */ "./src/core/HTMLMapper.ts"); + + +class Styles { + + #HTMLMapper; + + constructor() { + this.#HTMLMapper = new _core_HTMLMapper__WEBPACK_IMPORTED_MODULE_0__.HTMLMapper(); + } + + append = () => { + const html = __webpack_require__(/*! apply-loader!pug-loader!./style.pug */ "./node_modules/apply-loader/index.js!./node_modules/pug-loader/index.js!./src/page/render/styles/style.pug"); + const styles = this.#HTMLMapper.toElement(html); + window.document.querySelector("head").appendChild(styles); + } +} + +/***/ }), + +/***/ "?8f63": +/*!********************!*\ + !*** fs (ignored) ***! + \********************/ +/***/ (() => { + +/* (ignored) */ + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; +// This entry need to be wrapped in an IIFE because it need to be in strict mode. +(() => { +"use strict"; +/*!*************************!*\ + !*** ./src/api-page.ts ***! + \*************************/ +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _core_ApiApp__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./core/ApiApp */ "./src/core/ApiApp.js"); +/* harmony import */ var _page_ApiPageService__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./page/ApiPageService */ "./src/page/ApiPageService.ts"); + + +const service = new _page_ApiPageService__WEBPACK_IMPORTED_MODULE_1__.ApiPageService(); +const app = new _core_ApiApp__WEBPACK_IMPORTED_MODULE_0__.ApiApp(service); +app.start(); + +})(); + +/******/ })() +; +//# sourceMappingURL=page.js.map \ No newline at end of file diff --git a/dist/popup/popup.js b/dist/popup/popup.js index b29ecb5..e8987ca 100644 --- a/dist/popup/popup.js +++ b/dist/popup/popup.js @@ -1 +1,2315 @@ -(()=>{var e={482:(e,t,s)=>{var n=s(420);e.exports=(n.default||n).apply(n,[])},85:(e,t,s)=>{var n=s(55);e.exports=function(e){var t,s="",i=e||{};return function(e){s=s+""+n.escape(null==(t=e.title)?"":t)+""}.call(this,"buttonInfo"in i?i.buttonInfo:"undefined"!=typeof buttonInfo?buttonInfo:void 0),s}},420:(e,t,s)=>{s(55),e.exports=function(e){return""+'
'}},227:(e,t,s)=>{var n=s(55);e.exports=function(e){var t,s="",i=e||{};return function(e,i,r){s=s+'
"}.call(this,"clear"in i?i.clear:"undefined"!=typeof clear?clear:void 0,"level"in i?i.level:"undefined"!=typeof level?level:void 0,"options"in i?i.options:"undefined"!=typeof options?options:void 0),s}},474:(e,t,s)=>{s(55),e.exports=function(e){return""+'
Languages
'}},696:(e,t,s)=>{var n=s(55);e.exports=function(e){var t,s="",i=e||{};return function(e){s=s+'
"+n.escape(null==(t=e.title)?"":t)+':
|||
'}.call(this,"language"in i?i.language:"undefined"!=typeof language?language:void 0),s}},55:(e,t,s)=>{"use strict";var n=Object.prototype.hasOwnProperty;function i(e,t){return Array.isArray(e)?function(e,t){for(var s,n="",r="",o=Array.isArray(t),a=0;a]/;function l(e){var t=""+e,s=a.exec(t);if(!s)return e;var n,i,r,o="";for(n=s.index,i=0;n ":" ")+s+"| "+e})).join("\n"),t.path=n,t.message=(n||"Pug")+":"+i+"\n"+o+"\n\n"+t.message,t}},835:()=>{},218:e=>{"use strict";e.exports=JSON.parse('{"name":"Reckue Languages","version":"0.5.7","description":"Interactive language learning assistant","permissions":["storage","activeTab","tabs"],"background":{"service_worker":"background/application.js"},"action":{"default_popup":"dist/popup/index.html","default_icon":{"16":"images/coach16.png","32":"images/coach32.png","48":"images/coach48.png","128":"images/coach128.png"}},"content_scripts":[{"matches":["http://*/*","https://*/*"],"exclude_matches":["https://translate.google.com/*"],"run_at":"document_idle","js":["dist/page/page.js"]}],"icons":{"16":"images/coach16.png","32":"images/coach32.png","48":"images/coach48.png","128":"images/coach128.png"},"manifest_version":3}')}},t={};function s(n){var i=t[n];if(void 0!==i)return i.exports;var r=t[n]={exports:{}};return e[n](r,r.exports,s),r.exports}(()=>{"use strict";class e{log=e=>{window.console.log("Reckue language app: "+e)};#e=e=>{window.console.log(e.textContent),window.console.log(e.toString()),window.console.log(e.parentNode.toString()),window.console.log(e.parentNode.nodeName),window.console.log(e.parentNode.role)}}const t=new Map;class n{static add=(e,s)=>{t.set(e,s)};static get=e=>t.get(e);static getWordbookService=()=>{const e=n.get("wordbook");if(e)return e}}class i{appParams=()=>new Promise((e=>{chrome.storage.local.get(["enable","russian","english","china","korean"],(t=>{n.add("settings",t),e(t.enable)}))}));saveWordbooks=e=>{chrome.storage.local.set(e)};getByName=e=>new Promise((t=>chrome.storage.local.get([e],(s=>t(s[e])))))}class r{#t;#s;#n;constructor(e,t){this.#t=e,this.#n=t}getCount=()=>this.#s;calcPagesCount=()=>(this.#s=Math.ceil(this.#t/this.#n),this.#s);isIndexOnPage=(e,t)=>t>=this.#i(e)&&te*this.#n;#r=e=>(e+1)*this.#n}class o{#o;#a;constructor(){this.#a=new Map,this.#o=new r(0,0)}remove=e=>{this.#a.delete(e),this.#o=new r(this.#a.size,50),this.#o.calcPagesCount()};set=e=>(e.forEach((e=>{this.#a.set(e.word,e.level)})),this.#o=new r(this.#a.size,50),this.#o.calcPagesCount(),this);get=()=>this.#a;getPages=()=>this.#o;getPage=e=>{let t=0;const s=new Map;return this.#a.forEach(((n,i)=>{this.#o.isIndexOnPage(e,t)&&s.set(i,n),t++})),s};toObject=()=>{const e={};return this.#l().forEach(((t,s)=>{e[this.getName(s)]=t})),e};getName=e=>"wordbook"+e;#c=()=>{const e=[];return this.#a.forEach(((t,s)=>{e.push({word:s,level:t})})),e};#l=()=>{const e=[[]];return this.#c().forEach((t=>this.#d(e,t))),e};#d=(e,t)=>{const s=e.length-1;e[s].length<100?e[s].push(t):(e.push([]),this.#d(e,t))}}class a{#h;#u;#g;#p;executeAfter=e=>{this.#p=e};constructor(){this.#h=new i,this.#u=new e,this.#g=new o}set=e=>{this.#g.set(e),this.#v()};remove=e=>{this.#g.remove(e),this.#v()};#v=()=>{const e=this.#g.toObject();this.#h.saveWordbooks(e)};getWordbook=()=>this.#g;getFilteredWordbook=e=>{const t=[];this.#g.get().forEach(((s,n)=>n&&n.includes(e)&&t.push({word:n,level:s})));const s=new o;return s.set(t),s};getWordbookCache=()=>this.#g.get();loadWordbooks=()=>{this.#b(0)};#b=e=>{const t=this.#g.getName(e);this.#u.log(`Loaded ${t} from storage`),this.#h.getByName(t).then((t=>this.#f(t,e)))};#f=(e,t)=>{e?(this.#g.set(e),this.#w(t)):this.#p()};#w=e=>{const t=e+1;this.#b(t)}}class l{constructor(){this.toElement=e=>{const t=window.document.createElement("div");return t.innerHTML=e.trim(),t.firstChild}}}class c{constructor(){this.getHTMLMapper=()=>this.HTMLMapper,this.HTMLMapper=new l}}class d extends c{#m;constructor(){super(),this.#m=window.document.getElementById("content")}getContent=()=>this.#m}class h extends d{#E;buildSettingsContentStructure=()=>{const e=s(474)(),t=this.getHTMLMapper().toElement(e);this.getContent().appendChild(t);const n=this.getContent().getElementsByClassName("block")[0];this.appendSlider(n,{id:"russian",title:"Russian"}),this.appendSlider(n,{id:"korean",title:"Korean"}),this.appendSlider(n,{id:"english",title:"English"}),this.appendSlider(n,{id:"china",title:"China"})};appendSlider=(e,t)=>{const n=s(696)({language:t}),i=this.getHTMLMapper().toElement(n);e.appendChild(i)};loadLevers=()=>{this.#E=window.document.getElementsByClassName("lever")};setupAppEnableLever=e=>{this.#L(this.#E[0],e,"enable")};renderAppEnableLever=e=>{this.renderLever(this.#E[0],e)};setupRussianEnableLever=e=>{this.#L(this.#E[1],e,"russian")};renderRussianEnableLever=e=>{this.renderLever(this.#E[1],e)};setupKoreanEnableLever=e=>{this.#L(this.#E[2],e,"korean")};renderKoreanEnableLever=e=>{this.renderLever(this.#E[2],e)};setupEnglishEnableLever=e=>{this.#L(this.#E[3],e,"english")};renderEnglishEnableLever=e=>{this.renderLever(this.#E[3],e)};setupChinaEnableLever=e=>{this.#L(this.#E[4],e,"china")};renderChinaEnableLever=e=>{this.renderLever(this.#E[4],e)};#L=(e,t,s)=>{e.addEventListener("click",(()=>t(e,s)))};renderLever=(e,t)=>{e.style.justifyContent=t?"flex-end":"flex-start",e.style.background=t?"#c2d7bf":"#ffffff"}}class u{#k;#S;constructor(){this.#k=new h,this.#S={enable:!0,russian:!0,english:!0,china:!0,korean:!0}}fillSettings=()=>{chrome.storage.local.get(["enable","russian","english","china","korean"],(e=>this.#C(e)))};#C=e=>{this.#S=e,this.#k.loadLevers(),this.#y(),this.#B()};#y=()=>{this.#k.setupAppEnableLever(this.#x),this.#k.renderAppEnableLever(this.#S.enable)};#B=()=>{this.#k.setupRussianEnableLever(this.#x),this.#k.renderRussianEnableLever(this.#S.russian),this.#k.setupKoreanEnableLever(this.#x),this.#k.renderKoreanEnableLever(this.#S.korean),this.#k.setupEnglishEnableLever(this.#x),this.#k.renderEnglishEnableLever(this.#S.english),this.#k.setupChinaEnableLever(this.#x),this.#k.renderChinaEnableLever(this.#S.china)};#x=(e,t)=>{this.#S[t]=!this.#S[t],chrome.storage.local.set(this.#S,(()=>{this.#k.renderLever(e,this.#S[t])}))}}const g=(e,t)=>{Object.entries(e).forEach((e=>{const s=e[1];t(s)}))},p=Object.freeze({WORDBOOK:{title:"Wordbook",className:"nav-button",disabled:!0},SETTINGS:{title:"Settings",className:"nav-button"},REFRESH:{title:"↺ page",className:"refresh-btn"}}),v=(e,t,s)=>{e.addEventListener(t,(e=>{s(e)}))},b=(e,t)=>void 0!==t?window.document.getElementsByClassName(e)[t]:b(e,0);class f extends d{#P;constructor(){super(),this.#P=b("navbar")}buildButtons=()=>{const e=s(85);g(p,(t=>{const s=e({buttonInfo:t}),n=this.getHTMLMapper().toElement(s);this.#P.appendChild(n)}))};setContentVisibility=(e,t)=>{const s=this.getContent().getElementsByClassName(e)[0];s.style.visibility=this.#N(t),s.style.transform=this.#W(t)};#N=e=>e?"visible":"hidden";#W=e=>e?"translate(0px)":"translate(-400px)"}const w=Object.freeze({NATIVE:{name:"native",hex:"#2e8801",number:4},ADVANCED:{name:"advanced",hex:"#72d400",number:3},INTERMEDIATE:{name:"intermediate",hex:"#ef9f00",number:2},ELEMENTARY:{name:"elementary",hex:"#ab0000",number:1},BEGINNER:{name:"beginner",hex:"#ff2a00",number:0}});class m extends c{#A;#M;constructor(){super(),this.#A=s(227),this.#M=[],g(w,(e=>{this.#M.push(e.name)}))}addWord=(e,t)=>{const s=this.#T(),n=this.#I(e,t);return s.appendChild(n),n};#I=(e,t)=>{const s=this.#M,n=this.#A({clear:e,level:t,options:s});return this.getHTMLMapper().toElement(n)};clearScroll=()=>{this.#T().innerHTML=""};#T=()=>window.document.getElementById("words")}class E{#O;#R;#j;#H;#V;constructor(e,t){this.#j=n.getWordbookService(),this.#R=window.document.getElementById("pages"),this.#H=e,this.#V=t}buildPageButtons=e=>{this.#O=e,this.#F();const t=this.#j.getFilteredWordbook(n.get("filter").get()).getPages().getCount();if(t<10)1!==t&&this.#_(0,t);else{const e=this.#D(t),s=this.#K(t);this.#z(e,s)}};#F=()=>{this.#R.innerHTML=""};#z=(e,t)=>{this.#_(e[0],e[1]),this.#J(),this.#_(t[0],t[1])};#J=()=>{const e=window.document.createTextNode("...");this.#R.appendChild(e)};#D=e=>this.#O>=2&&this.#O<=e-5?this.#O>=e-8?[e-10,e-5]:[this.#O-2,this.#O+3]:[0,5];#K=e=>[e-5,e];#_=(e,t)=>{for(let s=e;sthis.#H(s))),this.#R.appendChild(e)}}}class L{#V;#$;#H;constructor(e,t){this.#V="",this.#$=e,this.#H=t,this.#q()}#q=()=>{window.document.getElementById("filter-terms").addEventListener("change",(e=>{this.#V=e.target.value,this.#$(0),this.#H(0)}))};get=()=>this.#V}class k{#j;#G;#Y;#V;constructor(){this.#j=n.getWordbookService(),this.#G=new m,this.#Y=new E(this.fillScroll),this.#V=new L(this.#Y.buildPageButtons,this.fillScroll),n.add("filter",this.#V)}fillScroll=e=>{this.#Y.buildPageButtons(e);const t=this.#Q(e);this.#U(t)};#Q=e=>this.#j.getFilteredWordbook(this.#V.get()).getPage(e);#U=e=>{this.#G.clearScroll(),e.forEach(((e,t)=>{const s=this.#G.addWord(t,e);this.#X(s,t),this.#Z(s,t)}))};#Z=(e,t)=>{e.getElementsByTagName("input")[0].addEventListener("change",(e=>this.#ee(e,t)))};#X=(e,t)=>{e.getElementsByClassName("level")[0].addEventListener("change",(e=>this.#te(e,t)))};#ee=(e,t)=>{const s=this.#j.getWordbookCache().get(t),n=e.target.value;this.#j.remove(t),this.#se(n,s),this.fillScroll(0)};#te=(e,t)=>{const s=e.target.value;this.#se(t,s)};#se=(e,t)=>{this.#j.set([{word:e,level:t}])}}class S{#k;#P;#ne;#m;#ie;constructor(){this.#k=new f,this.#P=b("navbar")}onClickNavButtons=()=>{this.#re(),v(this.#ne,"click",this.#oe),g(this.#ie,(e=>v(e,"click",this.#ae)))};#re=()=>{this.#ne=b("refresh-btn"),this.#ie=this.#P.getElementsByClassName("nav-button"),this.#m=b("content")};#ae=e=>{g(this.#ie,(e=>e.disabled=!1)),e.target.disabled=!0,this.checkButtonsAndSetContentVisibility()};checkButtonsAndSetContentVisibility=()=>{g(this.#ie,(e=>{const t=e.innerText.toLowerCase();this.#k.setContentVisibility(t,e.disabled)}))};#oe=()=>{chrome.tabs.query({active:!0,currentWindow:!0},(e=>{chrome.tabs.executeScript(e[0].id,{file:"./page/page.ts"})}))}}class C extends d{build=()=>{const e=s(482),t=this.getHTMLMapper().toElement(e);this.getContent().appendChild(t)}}class y{#le;#ce;constructor(){const e=s(218);this.#ce=e.version,this.#le=b("infobar"),this.#de()}#de=()=>{this.#le.textContent=`Version ${this.#ce}`}}const B=new class{#he;#ue;#ge;#pe;constructor(){this.#ue=new h,this.#he=new f,this.#ge=new C,this.#pe=new y}run=()=>{this.#ve(),(new u).fillSettings(),(new k).fillScroll(0),this.#be()};#ve=()=>{this.#he.buildButtons(),this.#ue.buildSettingsContentStructure(),this.#ge.build()};#be=()=>{const e=new S;e.onClickNavButtons(),e.checkButtonsAndSetContentVisibility()}};new class{#fe;#j;#we;constructor(e){this.#fe=new n,this.#we=e,this.#j=new a}start=()=>{this.#j.executeAfter(this.#me),this.#j.loadWordbooks()};#me=()=>{n.add("wordbook",this.#j),this.#we.run()}}(B).start()})()})(); \ No newline at end of file +/******/ (() => { // webpackBootstrap +/******/ var __webpack_modules__ = ({ + +/***/ "./node_modules/apply-loader/index.js!./node_modules/pug-loader/index.js!./src/popup/scroll/templates/scroll.pug": +/*!***********************************************************************************************************************!*\ + !*** ./node_modules/apply-loader/index.js!./node_modules/pug-loader/index.js!./src/popup/scroll/templates/scroll.pug ***! + \***********************************************************************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var req = __webpack_require__(/*! !!./node_modules/pug-loader/index.js!./src/popup/scroll/templates/scroll.pug */ "./node_modules/pug-loader/index.js!./src/popup/scroll/templates/scroll.pug"); +module.exports = (req['default'] || req).apply(req, []) + +/***/ }), + +/***/ "./node_modules/pug-loader/index.js!./src/popup/navbar/nav-button.pug": +/*!****************************************************************************!*\ + !*** ./node_modules/pug-loader/index.js!./src/popup/navbar/nav-button.pug ***! + \****************************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var pug = __webpack_require__(/*! !../../../node_modules/pug-runtime/index.js */ "./node_modules/pug-runtime/index.js"); + +function template(locals) {var pug_html = "", pug_mixins = {}, pug_interp;; + var locals_for_with = (locals || {}); + + (function (buttonInfo) { + pug_html = pug_html + "\u003Cbutton" + (pug.attr("class", pug.classes([buttonInfo.className], [true]), false, true)+pug.attr("disabled", buttonInfo.disabled, true, true)) + "\u003E" + (pug.escape(null == (pug_interp = buttonInfo.title) ? "" : pug_interp)) + "\u003C\u002Fbutton\u003E"; + }.call(this, "buttonInfo" in locals_for_with ? + locals_for_with.buttonInfo : + typeof buttonInfo !== 'undefined' ? buttonInfo : undefined)); + ;;return pug_html;}; +module.exports = template; + +/***/ }), + +/***/ "./node_modules/pug-loader/index.js!./src/popup/scroll/templates/scroll.pug": +/*!**********************************************************************************!*\ + !*** ./node_modules/pug-loader/index.js!./src/popup/scroll/templates/scroll.pug ***! + \**********************************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var pug = __webpack_require__(/*! !../../../../node_modules/pug-runtime/index.js */ "./node_modules/pug-runtime/index.js"); + +function template(locals) {var pug_html = "", pug_mixins = {}, pug_interp;pug_html = pug_html + "\u003Cdiv class=\"wordbook\"\u003E\u003Cdiv class=\"header\"\u003E\u003Cdiv class=\"filter\"\u003E\u003Cinput id=\"filter-terms\" placeholder=\"Search or filter words...\"\u003E\u003C\u002Fdiv\u003E\u003C\u002Fdiv\u003E\u003Cdiv class=\"words\" id=\"words\"\u003E\u003C\u002Fdiv\u003E\u003Cdiv id=\"pages\"\u003E\u003C\u002Fdiv\u003E\u003C\u002Fdiv\u003E";;return pug_html;}; +module.exports = template; + +/***/ }), + +/***/ "./node_modules/pug-loader/index.js!./src/popup/scroll/templates/word.pug": +/*!********************************************************************************!*\ + !*** ./node_modules/pug-loader/index.js!./src/popup/scroll/templates/word.pug ***! + \********************************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var pug = __webpack_require__(/*! !../../../../node_modules/pug-runtime/index.js */ "./node_modules/pug-runtime/index.js"); + +function template(locals) {var pug_html = "", pug_mixins = {}, pug_interp;; + var locals_for_with = (locals || {}); + + (function (clear, level, options) { + pug_html = pug_html + "\u003Cdiv class=\"word\"\u003E\u003Cinput" + (" class=\"clear\""+pug.attr("value", clear, true, true)) + "\u003E\u003Cselect class=\"level\"\u003E"; +// iterate options +;(function(){ + var $$obj = options; + if ('number' == typeof $$obj.length) { + for (var pug_index0 = 0, $$l = $$obj.length; pug_index0 < $$l; pug_index0++) { + var option = $$obj[pug_index0]; +pug_html = pug_html + "\u003Coption" + (pug.attr("value", option, true, true)+pug.attr("selected", (level === option), true, true)) + "\u003E" + (pug.escape(null == (pug_interp = option) ? "" : pug_interp)) + "\u003C\u002Foption\u003E"; + } + } else { + var $$l = 0; + for (var pug_index0 in $$obj) { + $$l++; + var option = $$obj[pug_index0]; +pug_html = pug_html + "\u003Coption" + (pug.attr("value", option, true, true)+pug.attr("selected", (level === option), true, true)) + "\u003E" + (pug.escape(null == (pug_interp = option) ? "" : pug_interp)) + "\u003C\u002Foption\u003E"; + } + } +}).call(this); + +pug_html = pug_html + "\u003C\u002Fselect\u003E\u003C\u002Fdiv\u003E"; + }.call(this, "clear" in locals_for_with ? + locals_for_with.clear : + typeof clear !== 'undefined' ? clear : undefined, "level" in locals_for_with ? + locals_for_with.level : + typeof level !== 'undefined' ? level : undefined, "options" in locals_for_with ? + locals_for_with.options : + typeof options !== 'undefined' ? options : undefined)); + ;;return pug_html;}; +module.exports = template; + +/***/ }), + +/***/ "./node_modules/pug-loader/index.js!./src/popup/settings/template/settings.pug": +/*!*************************************************************************************!*\ + !*** ./node_modules/pug-loader/index.js!./src/popup/settings/template/settings.pug ***! + \*************************************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var pug = __webpack_require__(/*! !../../../../node_modules/pug-runtime/index.js */ "./node_modules/pug-runtime/index.js"); + +function template(locals) {var pug_html = "", pug_mixins = {}, pug_interp;pug_html = pug_html + "\u003Cdiv class=\"settings\"\u003E\u003Cdiv class=\"block\"\u003E\u003Cdiv class=\"title\"\u003ELanguages\u003C\u002Fdiv\u003E\u003C\u002Fdiv\u003E\u003C\u002Fdiv\u003E";;return pug_html;}; +module.exports = template; + +/***/ }), + +/***/ "./node_modules/pug-loader/index.js!./src/popup/settings/template/slider.pug": +/*!***********************************************************************************!*\ + !*** ./node_modules/pug-loader/index.js!./src/popup/settings/template/slider.pug ***! + \***********************************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var pug = __webpack_require__(/*! !../../../../node_modules/pug-runtime/index.js */ "./node_modules/pug-runtime/index.js"); + +function template(locals) {var pug_html = "", pug_mixins = {}, pug_interp;; + var locals_for_with = (locals || {}); + + (function (language) { + pug_html = pug_html + "\u003Cdiv" + (" class=\"enable\""+pug.attr("id", language.id, true, true)) + "\u003E\u003Cspan\u003E" + (pug.escape(null == (pug_interp = language.title) ? "" : pug_interp)) + ":\u003C\u002Fspan\u003E\u003Cdiv class=\"lever\"\u003E\u003Cdiv class=\"slider\"\u003E|||\u003C\u002Fdiv\u003E\u003C\u002Fdiv\u003E\u003C\u002Fdiv\u003E"; + }.call(this, "language" in locals_for_with ? + locals_for_with.language : + typeof language !== 'undefined' ? language : undefined)); + ;;return pug_html;}; +module.exports = template; + +/***/ }), + +/***/ "./node_modules/pug-runtime/index.js": +/*!*******************************************!*\ + !*** ./node_modules/pug-runtime/index.js ***! + \*******************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + + +var pug_has_own_property = Object.prototype.hasOwnProperty; + +/** + * Merge two attribute objects giving precedence + * to values in object `b`. Classes are special-cased + * allowing for arrays and merging/joining appropriately + * resulting in a string. + * + * @param {Object} a + * @param {Object} b + * @return {Object} a + * @api private + */ + +exports.merge = pug_merge; +function pug_merge(a, b) { + if (arguments.length === 1) { + var attrs = a[0]; + for (var i = 1; i < a.length; i++) { + attrs = pug_merge(attrs, a[i]); + } + return attrs; + } + + for (var key in b) { + if (key === 'class') { + var valA = a[key] || []; + a[key] = (Array.isArray(valA) ? valA : [valA]).concat(b[key] || []); + } else if (key === 'style') { + var valA = pug_style(a[key]); + valA = valA && valA[valA.length - 1] !== ';' ? valA + ';' : valA; + var valB = pug_style(b[key]); + valB = valB && valB[valB.length - 1] !== ';' ? valB + ';' : valB; + a[key] = valA + valB; + } else { + a[key] = b[key]; + } + } + + return a; +} + +/** + * Process array, object, or string as a string of classes delimited by a space. + * + * If `val` is an array, all members of it and its subarrays are counted as + * classes. If `escaping` is an array, then whether or not the item in `val` is + * escaped depends on the corresponding item in `escaping`. If `escaping` is + * not an array, no escaping is done. + * + * If `val` is an object, all the keys whose value is truthy are counted as + * classes. No escaping is done. + * + * If `val` is a string, it is counted as a class. No escaping is done. + * + * @param {(Array.|Object.|string)} val + * @param {?Array.} escaping + * @return {String} + */ +exports.classes = pug_classes; +function pug_classes_array(val, escaping) { + var classString = '', + className, + padding = '', + escapeEnabled = Array.isArray(escaping); + for (var i = 0; i < val.length; i++) { + className = pug_classes(val[i]); + if (!className) continue; + escapeEnabled && escaping[i] && (className = pug_escape(className)); + classString = classString + padding + className; + padding = ' '; + } + return classString; +} +function pug_classes_object(val) { + var classString = '', + padding = ''; + for (var key in val) { + if (key && val[key] && pug_has_own_property.call(val, key)) { + classString = classString + padding + key; + padding = ' '; + } + } + return classString; +} +function pug_classes(val, escaping) { + if (Array.isArray(val)) { + return pug_classes_array(val, escaping); + } else if (val && typeof val === 'object') { + return pug_classes_object(val); + } else { + return val || ''; + } +} + +/** + * Convert object or string to a string of CSS styles delimited by a semicolon. + * + * @param {(Object.|string)} val + * @return {String} + */ + +exports.style = pug_style; +function pug_style(val) { + if (!val) return ''; + if (typeof val === 'object') { + var out = ''; + for (var style in val) { + /* istanbul ignore else */ + if (pug_has_own_property.call(val, style)) { + out = out + style + ':' + val[style] + ';'; + } + } + return out; + } else { + return val + ''; + } +} + +/** + * Render the given attribute. + * + * @param {String} key + * @param {String} val + * @param {Boolean} escaped + * @param {Boolean} terse + * @return {String} + */ +exports.attr = pug_attr; +function pug_attr(key, val, escaped, terse) { + if ( + val === false || + val == null || + (!val && (key === 'class' || key === 'style')) + ) { + return ''; + } + if (val === true) { + return ' ' + (terse ? key : key + '="' + key + '"'); + } + var type = typeof val; + if ( + (type === 'object' || type === 'function') && + typeof val.toJSON === 'function' + ) { + val = val.toJSON(); + } + if (typeof val !== 'string') { + val = JSON.stringify(val); + if (!escaped && val.indexOf('"') !== -1) { + return ' ' + key + "='" + val.replace(/'/g, ''') + "'"; + } + } + if (escaped) val = pug_escape(val); + return ' ' + key + '="' + val + '"'; +} + +/** + * Render the given attributes object. + * + * @param {Object} obj + * @param {Object} terse whether to use HTML5 terse boolean attributes + * @return {String} + */ +exports.attrs = pug_attrs; +function pug_attrs(obj, terse) { + var attrs = ''; + + for (var key in obj) { + if (pug_has_own_property.call(obj, key)) { + var val = obj[key]; + + if ('class' === key) { + val = pug_classes(val); + attrs = pug_attr(key, val, false, terse) + attrs; + continue; + } + if ('style' === key) { + val = pug_style(val); + } + attrs += pug_attr(key, val, false, terse); + } + } + + return attrs; +} + +/** + * Escape the given string of `html`. + * + * @param {String} html + * @return {String} + * @api private + */ + +var pug_match_html = /["&<>]/; +exports.escape = pug_escape; +function pug_escape(_html) { + var html = '' + _html; + var regexResult = pug_match_html.exec(html); + if (!regexResult) return _html; + + var result = ''; + var i, lastIndex, escape; + for (i = regexResult.index, lastIndex = 0; i < html.length; i++) { + switch (html.charCodeAt(i)) { + case 34: + escape = '"'; + break; + case 38: + escape = '&'; + break; + case 60: + escape = '<'; + break; + case 62: + escape = '>'; + break; + default: + continue; + } + if (lastIndex !== i) result += html.substring(lastIndex, i); + lastIndex = i + 1; + result += escape; + } + if (lastIndex !== i) return result + html.substring(lastIndex, i); + else return result; +} + +/** + * Re-throw the given `err` in context to the + * the pug in `filename` at the given `lineno`. + * + * @param {Error} err + * @param {String} filename + * @param {String} lineno + * @param {String} str original source + * @api private + */ + +exports.rethrow = pug_rethrow; +function pug_rethrow(err, filename, lineno, str) { + if (!(err instanceof Error)) throw err; + if ((typeof window != 'undefined' || !filename) && !str) { + err.message += ' on line ' + lineno; + throw err; + } + var context, lines, start, end; + try { + str = str || (__webpack_require__(/*! fs */ "?8f63").readFileSync)(filename, {encoding: 'utf8'}); + context = 3; + lines = str.split('\n'); + start = Math.max(lineno - context, 0); + end = Math.min(lines.length, lineno + context); + } catch (ex) { + err.message += + ' - could not read from ' + filename + ' (' + ex.message + ')'; + pug_rethrow(err, null, lineno); + return; + } + + // Error context + context = lines + .slice(start, end) + .map(function(line, i) { + var curr = i + start + 1; + return (curr == lineno ? ' > ' : ' ') + curr + '| ' + line; + }) + .join('\n'); + + // Alter exception message + err.path = filename; + try { + err.message = + (filename || 'Pug') + + ':' + + lineno + + '\n' + + context + + '\n\n' + + err.message; + } catch (e) {} + throw err; +} + + +/***/ }), + +/***/ "./src/core/HTMLMapper.ts": +/*!********************************!*\ + !*** ./src/core/HTMLMapper.ts ***! + \********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ HTMLMapper: () => (/* binding */ HTMLMapper) +/* harmony export */ }); +class HTMLMapper { + constructor() { + this.toElement = (html) => { + const template = window.document.createElement("div"); + template.innerHTML = html.trim(); + return template.firstChild; + }; + } +} + + +/***/ }), + +/***/ "./src/core/builder/AbstractView.ts": +/*!******************************************!*\ + !*** ./src/core/builder/AbstractView.ts ***! + \******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ AbstractView: () => (/* binding */ AbstractView) +/* harmony export */ }); +/* harmony import */ var _HTMLMapper__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../HTMLMapper */ "./src/core/HTMLMapper.ts"); + +class AbstractView { + constructor() { + this.getHTMLMapper = () => { + return this.HTMLMapper; + }; + this.HTMLMapper = new _HTMLMapper__WEBPACK_IMPORTED_MODULE_0__.HTMLMapper(); + } +} + + +/***/ }), + +/***/ "./src/core/ApiApp.js": +/*!****************************!*\ + !*** ./src/core/ApiApp.js ***! + \****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ ApiApp: () => (/* binding */ ApiApp) +/* harmony export */ }); +/* harmony import */ var _words_ApiWordbookService_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./words/ApiWordbookService.js */ "./src/core/words/ApiWordbookService.js"); +/* harmony import */ var _Context__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Context */ "./src/core/Context.js"); + + + +class ApiApp { + + #context; + #wordbookService; + #logicService; + + constructor(logicService) { + this.#context = new _Context__WEBPACK_IMPORTED_MODULE_1__.Context(); + this.#logicService = logicService; + this.#wordbookService = new _words_ApiWordbookService_js__WEBPACK_IMPORTED_MODULE_0__.ApiWordbookService(); + } + + start = async () => { + // Инициализируем API сервис + const isInitialized = await this.#wordbookService.initialize(); + + if (isInitialized) { + this.#wordbookService.executeAfter(this.#runService); + await this.#wordbookService.loadWords(); + } else { + // Если API недоступен, запускаем логику без инициализации + this.#runService(); + } + } + + #runService = () => { + _Context__WEBPACK_IMPORTED_MODULE_1__.Context.add("wordbook", this.#wordbookService); + this.#logicService.run(); + } +} + +/***/ }), + +/***/ "./src/core/ApiStore.js": +/*!******************************!*\ + !*** ./src/core/ApiStore.js ***! + \******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ ApiStore: () => (/* binding */ ApiStore) +/* harmony export */ }); +/* harmony import */ var _Context__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Context */ "./src/core/Context.js"); +/* harmony import */ var _api_ApiService__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./api/ApiService */ "./src/core/api/ApiService.js"); + + + +class ApiStore { + + #apiService; + + constructor() { + this.#apiService = new _api_ApiService__WEBPACK_IMPORTED_MODULE_1__.ApiService(); + } + + appParams = () => { + return new Promise(async (resolve) => { + try { + // Проверяем авторизацию + const isAuth = await this.#apiService.ensureAuth(); + + // Загружаем настройки из localStorage (для совместимости) + chrome.storage.local.get(['enable', "russian", "english", "china", "korean"], (app) => { + _Context__WEBPACK_IMPORTED_MODULE_0__.Context.add("settings", app); + resolve(app.enable); + }); + } catch (error) { + // В случае ошибки API, используем локальные настройки + chrome.storage.local.get(['enable', "russian", "english", "china", "korean"], (app) => { + _Context__WEBPACK_IMPORTED_MODULE_0__.Context.add("settings", app); + resolve(app.enable); + }); + } + }); + } + + saveWordbooks = (wordbooks) => { + // Для совместимости сохраняем в localStorage + chrome.storage.local.set(wordbooks); + } + + getByName = (name) => { + return new Promise(resolve => chrome.storage.local.get([name], (app) => resolve(app[name]))); + } + + /** + * Получает API сервис + */ + getApiService = () => { + return this.#apiService; + } + + /** + * Проверяет авторизацию + */ + ensureAuth = async () => { + return await this.#apiService.ensureAuth(); + } + + /** + * Получает текущего пользователя + */ + getCurrentUser = async () => { + return await this.#apiService.getCurrentUser(); + } +} + +/***/ }), + +/***/ "./src/core/Context.js": +/*!*****************************!*\ + !*** ./src/core/Context.js ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ Context: () => (/* binding */ Context) +/* harmony export */ }); +const context = new Map(); + +class Context { + + /** + * bean - компонент\класс из Java + */ + static add = (name, bean) => { + context.set(name, bean); + } + + static get = (beanName) => { + return context.get(beanName); + } + + static getWordbookService = () => { + const wordbook = Context.get("wordbook"); + if (wordbook) { + return wordbook; + } + } +} + +/***/ }), + +/***/ "./src/core/Logger.js": +/*!****************************!*\ + !*** ./src/core/Logger.js ***! + \****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ Logger: () => (/* binding */ Logger) +/* harmony export */ }); +class Logger { + log = (massage) => { + window.console.log("Reckue language app: " + massage); + } + + /** + * Считывает всю информацию о ноде и её родителе, пишет её в консоль. + * Рекомендуется для использования в методе pushLastNode, после запонения листа. + * + * @param node - Вся нужная информация для дебага содержится в этой ноде. + */ + #debugNode = (node) => { + window.console.log(node.textContent); + window.console.log(node.toString()); + window.console.log(node.parentNode.toString()); + window.console.log(node.parentNode.nodeName); + window.console.log(node.parentNode.role); + } +} + +/***/ }), + +/***/ "./src/core/api/ApiService.js": +/*!************************************!*\ + !*** ./src/core/api/ApiService.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ ApiService: () => (/* binding */ ApiService) +/* harmony export */ }); +/* harmony import */ var _Logger__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Logger */ "./src/core/Logger.js"); + + +class ApiService { + #baseUrl = 'https://api.reckue.com/api/1'; + #tempToken = null; + #logger = new _Logger__WEBPACK_IMPORTED_MODULE_0__.Logger(); + + constructor() { + this.#loadTempToken(); + } + + /** + * Загружает временный токен из localStorage + */ + #loadTempToken = () => { + this.#tempToken = localStorage.getItem('reckue_temp_token'); + } + + /** + * Сохраняет временный токен в localStorage + */ + #saveTempToken = (token) => { + this.#tempToken = token; + localStorage.setItem('reckue_temp_token', token); + } + + /** + * Выполняет HTTP запрос с авторизацией + */ + #request = async (endpoint, options = {}) => { + const url = `${this.#baseUrl}${endpoint}`; + const headers = { + 'Content-Type': 'application/json', + ...options.headers + }; + + if (this.#tempToken) { + headers['Authorization'] = `Bearer ${this.#tempToken}`; + } + + try { + const response = await fetch(url, { + ...options, + headers + }); + + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + + return await response.json(); + } catch (error) { + this.#logger.log(`API request failed: ${error.message}`); + throw error; + } + } + + /** + * Авторизация через temp-in + */ + tempAuth = async () => { + try { + const response = await this.#request('/auth/tempin', { + method: 'POST', + body: JSON.stringify({}) + }); + + if (response.token) { + this.#saveTempToken(response.token); + this.#logger.log('Temporary authentication successful'); + return true; + } + return false; + } catch (error) { + this.#logger.log('Temporary authentication failed'); + return false; + } + } + + /** + * Получение информации о текущем пользователе + */ + getCurrentUser = async () => { + try { + return await this.#request('/auth/whoami'); + } catch (error) { + this.#logger.log('Failed to get current user'); + return null; + } + } + + /** + * Получение всех словарей пользователя + */ + getWordbooks = async () => { + try { + return await this.#request('/wordbooks'); + } catch (error) { + this.#logger.log('Failed to get wordbooks'); + return []; + } + } + + /** + * Получение основного словаря + */ + getMainWordbook = async () => { + try { + return await this.#request('/wordbooks/main'); + } catch (error) { + this.#logger.log('Failed to get main wordbook'); + return null; + } + } + + /** + * Получение слов из словаря с пагинацией + */ + getWords = async (wordbookId, page = 0, size = 50, filter = '') => { + try { + const body = { + page: page, + size: size + }; + + if (filter) { + body.filter = filter; + } + + return await this.#request(`/wordbook/words/${wordbookId}`, { + method: 'POST', + body: JSON.stringify(body) + }); + } catch (error) { + this.#logger.log('Failed to get words'); + return { content: [], totalElements: 0 }; + } + } + + /** + * Добавление слова в словарь + */ + addWord = async (wordbookId, word, level = 1) => { + try { + return await this.#request('/wordbook/words', { + method: 'POST', + body: JSON.stringify({ + wordbookId: wordbookId, + word: word, + level: level + }) + }); + } catch (error) { + this.#logger.log('Failed to add word'); + return null; + } + } + + /** + * Добавление списка слов + */ + addWordsList = async (wordbookId, words) => { + try { + const wordsList = words.map(word => ({ + wordbookId: wordbookId, + word: word.word || word, + level: word.level || 1 + })); + + return await this.#request('/wordbook/words/list', { + method: 'POST', + body: JSON.stringify(wordsList) + }); + } catch (error) { + this.#logger.log('Failed to add words list'); + return null; + } + } + + /** + * Обновление уровня слова + */ + updateWordLevel = async (wordbookId, wordId, level) => { + try { + return await this.#request('/wordbook/words/levels', { + method: 'POST', + body: JSON.stringify({ + wordbookId: wordbookId, + wordId: wordId, + level: level + }) + }); + } catch (error) { + this.#logger.log('Failed to update word level'); + return null; + } + } + + /** + * Удаление слова + */ + deleteWord = async (wordbookId, wordId) => { + try { + return await this.#request('/wordbook/words', { + method: 'DELETE', + body: JSON.stringify({ + wordbookId: wordbookId, + wordId: wordId + }) + }); + } catch (error) { + this.#logger.log('Failed to delete word'); + return null; + } + } + + /** + * Создание нового словаря + */ + createWordbook = async (language) => { + try { + return await this.#request('/wordbooks', { + method: 'POST', + body: JSON.stringify({ + language: language + }) + }); + } catch (error) { + this.#logger.log('Failed to create wordbook'); + return null; + } + } + + /** + * Получение словарей по языку + */ + getWordbooksByLanguage = async (language) => { + try { + return await this.#request(`/wordbooks/language/${language}`); + } catch (error) { + this.#logger.log('Failed to get wordbooks by language'); + return []; + } + } + + /** + * Проверка авторизации и автоматическая авторизация при необходимости + */ + ensureAuth = async () => { + if (!this.#tempToken) { + return await this.tempAuth(); + } + + // Проверяем, что токен еще действителен + try { + await this.getCurrentUser(); + return true; + } catch (error) { + // Токен истек, получаем новый + return await this.tempAuth(); + } + } +} + +/***/ }), + +/***/ "./src/core/builder/ContentView.js": +/*!*****************************************!*\ + !*** ./src/core/builder/ContentView.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ ContentView: () => (/* binding */ ContentView) +/* harmony export */ }); +/* harmony import */ var _AbstractView__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AbstractView */ "./src/core/builder/AbstractView.ts"); + + +class ContentView extends _AbstractView__WEBPACK_IMPORTED_MODULE_0__.AbstractView { + + #content; + + constructor() { + super(); + this.#content = window.document.getElementById("content"); + } + + getContent = () => { + return this.#content; + } +} + +/***/ }), + +/***/ "./src/core/enum.js": +/*!**************************!*\ + !*** ./src/core/enum.js ***! + \**************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ enumForEach: () => (/* binding */ enumForEach) +/* harmony export */ }); +/** + * Обёртка над классической записью чтобы не писать каждый раз Object.entries(...).forEach((...) => {...}) + * Вытаскивает entry из массива value, где 0 элемент это ключь енама, а 1 значение это объект - содержимое + * После передаёт entry в callback функцию, которая и будет являться обработчиком цыкла forEach. + * + * @param Enum - enum который нужно распарсить + * @param callback - функция обрабатывающая входящие в enum объекты. + */ +const enumForEach = (Enum, callback) => { + Object.entries(Enum).forEach((value) => { + const entry = value[1]; + callback(entry); + }); +} + +/***/ }), + +/***/ "./src/core/enum/Levels.js": +/*!*********************************!*\ + !*** ./src/core/enum/Levels.js ***! + \*********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ Levels: () => (/* binding */ Levels) +/* harmony export */ }); +const Levels = Object.freeze({ + NATIVE: { name: "native", hex: "#2e8801", number: 4}, + ADVANCED: { name: "advanced", hex: "#72d400" , number: 3 }, + INTERMEDIATE: { name: "intermediate", hex: "#ef9f00", number: 2 }, + ELEMENTARY: { name: "elementary", hex: "#ab0000", number: 1 }, + BEGINNER: { name: "beginner", hex: "#ff2a00", number: 0 } +}); + +/***/ }), + +/***/ "./src/core/enum/NavbarButtons.js": +/*!****************************************!*\ + !*** ./src/core/enum/NavbarButtons.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ NavbarButtons: () => (/* binding */ NavbarButtons) +/* harmony export */ }); +const NavbarButtons = Object.freeze({ + WORDBOOK: {title: "Wordbook", className: "nav-button", disabled: true}, + SETTINGS: {title: "Settings", className: "nav-button"}, + REFRESH: { title: "↺ page", className: "refresh-btn" } + +}); + + + +/***/ }), + +/***/ "./src/core/words/ApiWordbookService.js": +/*!**********************************************!*\ + !*** ./src/core/words/ApiWordbookService.js ***! + \**********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ ApiWordbookService: () => (/* binding */ ApiWordbookService) +/* harmony export */ }); +/* harmony import */ var _Logger__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Logger */ "./src/core/Logger.js"); +/* harmony import */ var _api_ApiService__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../api/ApiService */ "./src/core/api/ApiService.js"); +/* harmony import */ var _Wordbook__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Wordbook */ "./src/core/words/Wordbook.js"); + + + + +class ApiWordbookService { + + #apiService; + #logger; + #wordbook; + #currentWordbookId; + #executeAfter; + + executeAfter = (after) => { + this.#executeAfter = after; + } + + constructor() { + this.#apiService = new _api_ApiService__WEBPACK_IMPORTED_MODULE_1__.ApiService(); + this.#logger = new _Logger__WEBPACK_IMPORTED_MODULE_0__.Logger(); + this.#wordbook = new _Wordbook__WEBPACK_IMPORTED_MODULE_2__.Wordbook(); + } + + /** + * Инициализация сервиса с авторизацией + */ + initialize = async () => { + try { + const isAuth = await this.#apiService.ensureAuth(); + if (!isAuth) { + this.#logger.log('Failed to authenticate with API'); + return false; + } + + // Получаем основной словарь + const mainWordbook = await this.#apiService.getMainWordbook(); + if (mainWordbook) { + this.#currentWordbookId = mainWordbook.id; + this.#logger.log(`Using main wordbook: ${this.#currentWordbookId}`); + } else { + // Если основного словаря нет, создаем его + const newWordbook = await this.#apiService.createWordbook('ENGLISH'); + if (newWordbook) { + this.#currentWordbookId = newWordbook.id; + this.#logger.log(`Created new wordbook: ${this.#currentWordbookId}`); + } + } + + return true; + } catch (error) { + this.#logger.log('Failed to initialize API wordbook service'); + return false; + } + } + + /** + * Загружает слова из API + */ + loadWords = async () => { + if (!this.#currentWordbookId) { + this.#logger.log('No wordbook ID available'); + if (this.#executeAfter) { + this.#executeAfter(); + } + return; + } + + try { + let page = 0; + const allWords = []; + + while (true) { + const response = await this.#apiService.getWords(this.#currentWordbookId, page, 50); + + if (!response.content || response.content.length === 0) { + break; + } + + // Преобразуем формат слов для совместимости с Wordbook + const words = response.content.map(word => ({ + word: word.word, + level: word.level || 1 + })); + + allWords.push(...words); + + if (response.content.length < 50) { + break; + } + + page++; + } + + this.set(allWords); + this.#logger.log(`Loaded ${allWords.length} words from API`); + + if (this.#executeAfter) { + this.#executeAfter(); + } + } catch (error) { + this.#logger.log('Failed to load words from API'); + if (this.#executeAfter) { + this.#executeAfter(); + } + } + } + + /** + * Устанавливает слова в wordbook + */ + set = (words) => { + this.#wordbook.set(words); + } + + /** + * Добавляет слово в API и локальный wordbook + */ + addWord = async (word, level = 1) => { + if (!this.#currentWordbookId) { + this.#logger.log('No wordbook ID available for adding word'); + return false; + } + + try { + const result = await this.#apiService.addWord(this.#currentWordbookId, word, level); + if (result) { + // Добавляем в локальный wordbook + this.#wordbook.set([{word, level}]); + this.#logger.log(`Added word to API: ${word}`); + return true; + } + return false; + } catch (error) { + this.#logger.log(`Failed to add word to API: ${word}`); + return false; + } + } + + /** + * Добавляет список слов в API + */ + addWordsList = async (words) => { + if (!this.#currentWordbookId) { + this.#logger.log('No wordbook ID available for adding words list'); + return false; + } + + try { + const result = await this.#apiService.addWordsList(this.#currentWordbookId, words); + if (result) { + // Добавляем в локальный wordbook + this.#wordbook.set(words); + this.#logger.log(`Added ${words.length} words to API`); + return true; + } + return false; + } catch (error) { + this.#logger.log('Failed to add words list to API'); + return false; + } + } + + /** + * Удаляет слово из API и локального wordbook + */ + remove = async (word) => { + if (!this.#currentWordbookId) { + this.#logger.log('No wordbook ID available for removing word'); + return false; + } + + try { + // Находим wordId для удаления + const words = await this.#apiService.getWords(this.#currentWordbookId, 0, 1000, word); + const wordToDelete = words.content.find(w => w.word === word); + + if (wordToDelete) { + const result = await this.#apiService.deleteWord(this.#currentWordbookId, wordToDelete.id); + if (result) { + this.#wordbook.remove(word); + this.#logger.log(`Removed word from API: ${word}`); + return true; + } + } + return false; + } catch (error) { + this.#logger.log(`Failed to remove word from API: ${word}`); + return false; + } + } + + /** + * Обновляет уровень слова в API + */ + updateWordLevel = async (word, level) => { + if (!this.#currentWordbookId) { + this.#logger.log('No wordbook ID available for updating word level'); + return false; + } + + try { + // Находим wordId для обновления + const words = await this.#apiService.getWords(this.#currentWordbookId, 0, 1000, word); + const wordToUpdate = words.content.find(w => w.word === word); + + if (wordToUpdate) { + const result = await this.#apiService.updateWordLevel(this.#currentWordbookId, wordToUpdate.id, level); + if (result) { + // Обновляем в локальном wordbook + this.#wordbook.remove(word); + this.#wordbook.set([{word, level}]); + this.#logger.log(`Updated word level in API: ${word} -> ${level}`); + return true; + } + } + return false; + } catch (error) { + this.#logger.log(`Failed to update word level in API: ${word}`); + return false; + } + } + + /** + * Получает wordbook + */ + getWordbook = () => { + return this.#wordbook; + } + + /** + * Получает отфильтрованный wordbook + */ + getFilteredWordbook = (filter) => { + const filtered = []; + this.#wordbook.get().forEach((level, word) => word && word.includes(filter) && filtered.push({word, level})); + const wordbook = new _Wordbook__WEBPACK_IMPORTED_MODULE_2__.Wordbook(); + wordbook.set(filtered); + return wordbook; + } + + /** + * Получает кэш wordbook + */ + getWordbookCache = () => { + return this.#wordbook.get(); + } + + /** + * Загружает словари (совместимость со старым API) + */ + loadWordbooks = async () => { + await this.loadWords(); + } + + /** + * Получает текущий ID словаря + */ + getCurrentWordbookId = () => { + return this.#currentWordbookId; + } + + /** + * Устанавливает текущий словарь + */ + setCurrentWordbook = async (wordbookId) => { + this.#currentWordbookId = wordbookId; + await this.loadWords(); + } + + /** + * Получает все словари пользователя + */ + getUserWordbooks = async () => { + try { + return await this.#apiService.getWordbooks(); + } catch (error) { + this.#logger.log('Failed to get user wordbooks'); + return []; + } + } +} + +/***/ }), + +/***/ "./src/core/words/Pages.js": +/*!*********************************!*\ + !*** ./src/core/words/Pages.js ***! + \*********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ Pages: () => (/* binding */ Pages) +/* harmony export */ }); +class Pages { + + #wordsCount; + + #pagesCount; + #scale; + + constructor(wordsCount, scale) { + this.#wordsCount = wordsCount; + this.#scale = scale; + } + + getCount = () => { + return this.#pagesCount; + } + + calcPagesCount = () => { + this.#pagesCount = Math.ceil(this.#wordsCount / this.#scale); + return this.#pagesCount; + } + + isIndexOnPage = (page, index) => index >= this.#getPageStart(page) && index < this.#getPageEnd(page); + + #getPageStart = (page) => page * this.#scale; + + #getPageEnd = (page) => (page + 1) * this.#scale; +} + +/***/ }), + +/***/ "./src/core/words/Wordbook.js": +/*!************************************!*\ + !*** ./src/core/words/Wordbook.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ Wordbook: () => (/* binding */ Wordbook) +/* harmony export */ }); +/* harmony import */ var _Pages__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Pages */ "./src/core/words/Pages.js"); + + +class Wordbook { + + #pages; + #cache; + + constructor() { + this.#cache = new Map(); + this.#pages = new _Pages__WEBPACK_IMPORTED_MODULE_0__.Pages(0, 0); + } + + remove = (word) => { + this.#cache.delete(word); + this.#pages = new _Pages__WEBPACK_IMPORTED_MODULE_0__.Pages(this.#cache.size, 50); + this.#pages.calcPagesCount(); + } + + set = (list) => { + list.forEach((bundle) => { + this.#cache.set(bundle.word, bundle.level); + }); + this.#pages = new _Pages__WEBPACK_IMPORTED_MODULE_0__.Pages(this.#cache.size, 50); + this.#pages.calcPagesCount(); + return this; + } + + get = () => { + return this.#cache; + } + + getPages = () => { + return this.#pages; + } + + getPage = (page) => { + let index = 0; + const result = new Map(); + this.#cache.forEach((level, word) => { + this.#pages.isIndexOnPage(page, index) && result.set(word, level); + index++; + }); + return result; + } + + toObject = () => { + const wordbooks = {}; + this.#toPieces().forEach((wordbook, index) => { + wordbooks[this.getName(index)] = wordbook; + }); + return wordbooks; + } + + getName = (number) => { + return "wordbook" + number; + } + + #toList = () => { + const list = []; + this.#cache.forEach((level, word) => { + list.push({word: word, level: level}) ; + }); + return list; + } + + #toPieces = () => { + const pieces = [[]]; + this.#toList().forEach((bundle) => this.#putInPiece(pieces, bundle)); + return pieces; + } + + #putInPiece = (pieces, bundle) => { + const counter = pieces.length - 1; + if (pieces[counter].length < 100) { + pieces[counter].push(bundle); + } else { + pieces.push([]); + this.#putInPiece(pieces, bundle); + } + } +} + +/***/ }), + +/***/ "./src/popup/ApiPopupService.js": +/*!**************************************!*\ + !*** ./src/popup/ApiPopupService.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ ApiPopupService: () => (/* binding */ ApiPopupService) +/* harmony export */ }); +/* harmony import */ var _settings_SettingsService__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./settings/SettingsService */ "./src/popup/settings/SettingsService.js"); +/* harmony import */ var _navbar_NavbarBuilder__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./navbar/NavbarBuilder */ "./src/popup/navbar/NavbarBuilder.js"); +/* harmony import */ var _scroll_WordbookScroll__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./scroll/WordbookScroll */ "./src/popup/scroll/WordbookScroll.js"); +/* harmony import */ var _core_Context__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../core/Context */ "./src/core/Context.js"); +/* harmony import */ var _settings_SettingsBuilder__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./settings/SettingsBuilder */ "./src/popup/settings/SettingsBuilder.js"); +/* harmony import */ var _navbar_NavButtons__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./navbar/NavButtons */ "./src/popup/navbar/NavButtons.js"); +/* harmony import */ var _scroll_ScrollBuilder__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./scroll/ScrollBuilder */ "./src/popup/scroll/ScrollBuilder.js"); +/* harmony import */ var _info_InfoBarBuilder__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./info/InfoBarBuilder */ "./src/popup/info/InfoBarBuilder.js"); +/* harmony import */ var _core_ApiStore__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../core/ApiStore */ "./src/core/ApiStore.js"); + + + + + + + + + + +class ApiPopupService { + + #navbarBuilder; + #settingsBuilder; + #scrollBuilder; + #infoBarBuilder; + #apiStore; + + constructor() { + this.#settingsBuilder = new _settings_SettingsBuilder__WEBPACK_IMPORTED_MODULE_4__.SettingsBuilder(); + this.#navbarBuilder = new _navbar_NavbarBuilder__WEBPACK_IMPORTED_MODULE_1__.NavbarBuilder(); + this.#scrollBuilder = new _scroll_ScrollBuilder__WEBPACK_IMPORTED_MODULE_6__.ScrollBuilder(); + this.#infoBarBuilder = new _info_InfoBarBuilder__WEBPACK_IMPORTED_MODULE_7__.InfoBarBuilder(); + this.#apiStore = new _core_ApiStore__WEBPACK_IMPORTED_MODULE_8__.ApiStore(); + } + + run = async () => { + try { + // Проверяем авторизацию в API + const isAuth = await this.#apiStore.ensureAuth(); + _core_Context__WEBPACK_IMPORTED_MODULE_3__.Context.add("apiAvailable", isAuth); + + if (isAuth) { + // Получаем информацию о пользователе + const user = await this.#apiStore.getCurrentUser(); + _core_Context__WEBPACK_IMPORTED_MODULE_3__.Context.add("currentUser", user); + } + } catch (error) { + _core_Context__WEBPACK_IMPORTED_MODULE_3__.Context.add("apiAvailable", false); + } + + this.#buildPopupDOM(); + const settings = new _settings_SettingsService__WEBPACK_IMPORTED_MODULE_0__.SettingsService(); + settings.fillSettings(); + const scroll = new _scroll_WordbookScroll__WEBPACK_IMPORTED_MODULE_2__.WordbookScroll(); + scroll.fillScroll(0); + this.#setupNavButtons(); + } + + #buildPopupDOM = () => { + this.#navbarBuilder.buildButtons(); + this.#settingsBuilder.buildSettingsContentStructure(); + this.#scrollBuilder.build(); + } + + #setupNavButtons = () => { + const navButtons = new _navbar_NavButtons__WEBPACK_IMPORTED_MODULE_5__.NavButtons(); + navButtons.onClickNavButtons(); + navButtons.checkButtonsAndSetContentVisibility(); + } +} + +/***/ }), + +/***/ "./src/popup/deprecated/html.js": +/*!**************************************!*\ + !*** ./src/popup/deprecated/html.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ addClass: () => (/* binding */ addClass), +/* harmony export */ addListener: () => (/* binding */ addListener), +/* harmony export */ create: () => (/* binding */ create), +/* harmony export */ selectByClass: () => (/* binding */ selectByClass) +/* harmony export */ }); +/** + * Функция для создания html тэга + * + * @param name - название тэга + * @returns {*} - готовый html тэг, пока не привязаный ни к чему. + */ +const create = (name) => document.createElement(name); + +/** + * Добавляет атрибут class для тэга, + * по нему будут прописаны определённые css стили. + * + * @param element - тэг для которого нужно добавть класс + * @param className - имя класса + */ +const addClass = (element, className) => { + element.classList.add(className); +} + +/** + * Добавляет EventListener для элемента + * + * @param element - тэг эвенты которого будем слушать + * @param eventType - тип требуемого эвента, на который будем реагировать + * @param callback - функция которая будет выполнена. + */ +const addListener = (element, eventType, callback) => { + element.addEventListener(eventType, event => { + callback(event); + }); +} + +const selectByClass = (className, index) => { + if (index !== undefined) { + return window.document.getElementsByClassName(className)[index]; + } + return selectByClass(className,0); +}; + +/***/ }), + +/***/ "./src/popup/info/InfoBarBuilder.js": +/*!******************************************!*\ + !*** ./src/popup/info/InfoBarBuilder.js ***! + \******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ InfoBarBuilder: () => (/* binding */ InfoBarBuilder) +/* harmony export */ }); +/* harmony import */ var _deprecated_html__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../deprecated/html */ "./src/popup/deprecated/html.js"); + + +class InfoBarBuilder { + + #element; + #version; + + constructor() { + const jsonData = __webpack_require__(/*! ../../../manifest.json */ "./manifest.json"); + this.#version = jsonData.version; + this.#element = (0,_deprecated_html__WEBPACK_IMPORTED_MODULE_0__.selectByClass)('infobar'); + this.#appendVersion(); + } + + #appendVersion = () => { + this.#element.textContent = `Version ${this.#version}`; + } +} + +/***/ }), + +/***/ "./src/popup/navbar/NavButtons.js": +/*!****************************************!*\ + !*** ./src/popup/navbar/NavButtons.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ NavButtons: () => (/* binding */ NavButtons) +/* harmony export */ }); +/* harmony import */ var _deprecated_html__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../deprecated/html */ "./src/popup/deprecated/html.js"); +/* harmony import */ var _NavbarBuilder__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./NavbarBuilder */ "./src/popup/navbar/NavbarBuilder.js"); +/* harmony import */ var _core_enum__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../core/enum */ "./src/core/enum.js"); + + + + +class NavButtons { + + #builder; + #navbar; + #refresh; + #content; + #buttons; + + constructor() { + this.#builder = new _NavbarBuilder__WEBPACK_IMPORTED_MODULE_1__.NavbarBuilder(); + this.#navbar = (0,_deprecated_html__WEBPACK_IMPORTED_MODULE_0__.selectByClass)('navbar'); + } + + onClickNavButtons = () => { + this.#loadButtons(); + (0,_deprecated_html__WEBPACK_IMPORTED_MODULE_0__.addListener)(this.#refresh, "click", this.#callParser); + (0,_core_enum__WEBPACK_IMPORTED_MODULE_2__.enumForEach)(this.#buttons,button => (0,_deprecated_html__WEBPACK_IMPORTED_MODULE_0__.addListener)(button, "click", this.#onClick)) + } + + #loadButtons = () => { + this.#refresh = (0,_deprecated_html__WEBPACK_IMPORTED_MODULE_0__.selectByClass)('refresh-btn'); + this.#buttons = this.#navbar.getElementsByClassName('nav-button'); + this.#content = (0,_deprecated_html__WEBPACK_IMPORTED_MODULE_0__.selectByClass)('content'); + } + + #onClick = (event) => { + ;(0,_core_enum__WEBPACK_IMPORTED_MODULE_2__.enumForEach)(this.#buttons,button => button.disabled = false); + event.target.disabled = true; + this.checkButtonsAndSetContentVisibility(); + }; + + checkButtonsAndSetContentVisibility = () => { + (0,_core_enum__WEBPACK_IMPORTED_MODULE_2__.enumForEach)(this.#buttons,button => { + const className = button.innerText.toLowerCase(); + this.#builder.setContentVisibility(className, button.disabled); + }); + }; + + #callParser = () => { + chrome.tabs.query({active: true, currentWindow: true}, (tabs) => { + chrome.tabs.executeScript(tabs[0].id, {file: './page/page.ts'}); + }); + }; +} + +/***/ }), + +/***/ "./src/popup/navbar/NavbarBuilder.js": +/*!*******************************************!*\ + !*** ./src/popup/navbar/NavbarBuilder.js ***! + \*******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ NavbarBuilder: () => (/* binding */ NavbarBuilder) +/* harmony export */ }); +/* harmony import */ var _core_enum__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../core/enum */ "./src/core/enum.js"); +/* harmony import */ var _core_enum_NavbarButtons__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/enum/NavbarButtons */ "./src/core/enum/NavbarButtons.js"); +/* harmony import */ var _deprecated_html__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../deprecated/html */ "./src/popup/deprecated/html.js"); +/* harmony import */ var _core_builder_ContentView__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../core/builder/ContentView */ "./src/core/builder/ContentView.js"); + + + + + +class NavbarBuilder extends _core_builder_ContentView__WEBPACK_IMPORTED_MODULE_3__.ContentView { + + #navbar; + + constructor() { + super(); + this.#navbar = (0,_deprecated_html__WEBPACK_IMPORTED_MODULE_2__.selectByClass)('navbar'); + } + + buildButtons = () => { + const getHtml = __webpack_require__(/*! pug-loader!./nav-button.pug */ "./node_modules/pug-loader/index.js!./src/popup/navbar/nav-button.pug"); + (0,_core_enum__WEBPACK_IMPORTED_MODULE_0__.enumForEach)(_core_enum_NavbarButtons__WEBPACK_IMPORTED_MODULE_1__.NavbarButtons, (buttonInfo) => { + const html = getHtml({buttonInfo}); + const button = this.getHTMLMapper().toElement(html); + this.#navbar.appendChild(button); + }); + } + + setContentVisibility = (className, disabled) => { + const entry = this.getContent().getElementsByClassName(className)[0]; + entry.style.visibility = this.#getVisibility(disabled); + entry.style.transform = this.#getTranslate(disabled); + }; + + #getVisibility = (disabled) => { + return disabled ? 'visible' : 'hidden'; + } + + #getTranslate = (disabled) => { + return disabled ? 'translate(0px)' : 'translate(-400px)'; + } +} + +/***/ }), + +/***/ "./src/popup/scroll/ChangePageButtons.js": +/*!***********************************************!*\ + !*** ./src/popup/scroll/ChangePageButtons.js ***! + \***********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ ChangePageButtons: () => (/* binding */ ChangePageButtons) +/* harmony export */ }); +/* harmony import */ var _core_Context__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../core/Context */ "./src/core/Context.js"); + + +class ChangePageButtons { + + #current + #pagesList; + #wordbookService; + #fillScroll; + #filter; + + constructor(fillScroll, filter) { + this.#wordbookService = _core_Context__WEBPACK_IMPORTED_MODULE_0__.Context.getWordbookService(); + this.#pagesList = window.document.getElementById("pages"); + this.#fillScroll = fillScroll; + this.#filter = filter; + } + + buildPageButtons = (page) => { + this.#current = page; + this.#clearPageButtonsElement(); + const countPages = this.#wordbookService.getFilteredWordbook(_core_Context__WEBPACK_IMPORTED_MODULE_0__.Context.get("filter").get()).getPages().getCount(); + if (countPages < 10) { + countPages !== 1 && this.#renderPageButtons(0, countPages); + } else { + const first = this.#getFirstLimits(countPages); + const second = this.#getSecondLimits(countPages); + this.#buildTwoRowsPageButtons(first, second); + } + } + + #clearPageButtonsElement = () => { + this.#pagesList.innerHTML = ""; + } + + #buildTwoRowsPageButtons = (first, second) => { + this.#renderPageButtons(first[0], first[1]); + this.#divideRows(); + this.#renderPageButtons(second[0], second[1]); + } + + #divideRows = () => { + const separator = window.document.createTextNode("..."); + this.#pagesList.appendChild(separator); + } + + #getFirstLimits = (countPages) => { + if (this.#current >= 2 && this.#current <= countPages - 5) { + if (this.#current >= countPages - 8) { + return [countPages - 10, countPages - 5]; + } + return [this.#current - 2, this.#current + 3]; + } + return [0, 5]; + } + + #getSecondLimits = (countPages) => [countPages - 5, countPages]; + + #renderPageButtons = (start, end) => { + for (let number = start; number < end; number++) { + const page = window.document.createElement("a"); + page.target = "_blank"; + page.textContent = `${number}`; + page.style.cursor = "pointer"; + page.addEventListener("click", () => this.#fillScroll(number)); + this.#pagesList.appendChild(page); + } + } +} + +/***/ }), + +/***/ "./src/popup/scroll/Filter.js": +/*!************************************!*\ + !*** ./src/popup/scroll/Filter.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ Filter: () => (/* binding */ Filter) +/* harmony export */ }); +class Filter { + + #filter; + #buildPageButtons; + #fillScroll; + + constructor(buildPageButtons, fillScroll) { + this.#filter = ""; + this.#buildPageButtons = buildPageButtons; + this.#fillScroll = fillScroll; + this.#setupInput(); + } + + #setupInput = () => { + const filterInput = window.document.getElementById("filter-terms"); + filterInput.addEventListener("change", (e) => { + this.#filter = e.target.value; + this.#buildPageButtons(0); + this.#fillScroll(0); + }); + } + + get = () => { + return this.#filter; + } +} + +/***/ }), + +/***/ "./src/popup/scroll/ScrollBuilder.js": +/*!*******************************************!*\ + !*** ./src/popup/scroll/ScrollBuilder.js ***! + \*******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ ScrollBuilder: () => (/* binding */ ScrollBuilder) +/* harmony export */ }); +/* harmony import */ var _core_builder_ContentView__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../core/builder/ContentView */ "./src/core/builder/ContentView.js"); + + +class ScrollBuilder extends _core_builder_ContentView__WEBPACK_IMPORTED_MODULE_0__.ContentView { + + build = () => { + const html = __webpack_require__(/*! apply-loader!pug-loader!./templates/scroll.pug */ "./node_modules/apply-loader/index.js!./node_modules/pug-loader/index.js!./src/popup/scroll/templates/scroll.pug"); + const scroll = this.getHTMLMapper().toElement(html); + this.getContent().appendChild(scroll); + } +} + +/***/ }), + +/***/ "./src/popup/scroll/WordbookScroll.js": +/*!********************************************!*\ + !*** ./src/popup/scroll/WordbookScroll.js ***! + \********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ WordbookScroll: () => (/* binding */ WordbookScroll) +/* harmony export */ }); +/* harmony import */ var _core_Context__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../core/Context */ "./src/core/Context.js"); +/* harmony import */ var _WordsAppender__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./WordsAppender */ "./src/popup/scroll/WordsAppender.js"); +/* harmony import */ var _ChangePageButtons__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ChangePageButtons */ "./src/popup/scroll/ChangePageButtons.js"); +/* harmony import */ var _Filter__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Filter */ "./src/popup/scroll/Filter.js"); + + + + + +class WordbookScroll { + + #wordbookService; + #wordsAppender; + #pageButtons; + #filter; + + constructor() { + this.#wordbookService = _core_Context__WEBPACK_IMPORTED_MODULE_0__.Context.getWordbookService(); + this.#wordsAppender = new _WordsAppender__WEBPACK_IMPORTED_MODULE_1__.WordsAppender(); + this.#pageButtons = new _ChangePageButtons__WEBPACK_IMPORTED_MODULE_2__.ChangePageButtons(this.fillScroll); + this.#filter = new _Filter__WEBPACK_IMPORTED_MODULE_3__.Filter(this.#pageButtons.buildPageButtons, this.fillScroll); + _core_Context__WEBPACK_IMPORTED_MODULE_0__.Context.add("filter", this.#filter); + } + + fillScroll = (page) => { + this.#pageButtons.buildPageButtons(page); + const loaded = this.#loadWords(page); + this.#fillWords(loaded); + } + + #loadWords = (page) => { + return this.#wordbookService.getFilteredWordbook(this.#filter.get()).getPage(page); + } + + #fillWords = (loaded) => { + this.#wordsAppender.clearScroll(); + loaded.forEach((level, word) => { + const ref = this.#wordsAppender.addWord(word, level); + this.#whenChangeOption(ref, word); + this.#whenEditWord(ref, word); + }); + } + + #whenEditWord = (ref, word) => { + const input = ref.getElementsByTagName("input")[0]; + input.addEventListener("change", (event) => this.#changeWord(event, word)); + } + + #whenChangeOption = (ref, word) => { + const select = ref.getElementsByClassName("level")[0]; + select.addEventListener("change", (event) => this.#changeLevel(event, word)); + } + + #changeWord = (event, word) => { + const level = this.#wordbookService.getWordbookCache().get(word); + const edited = event.target.value; + this.#wordbookService.remove(word); + this.#updateWord(edited, level); + this.fillScroll(0); + } + + #changeLevel = (event, word) => { + const level = event.target.value; + this.#updateWord(word, level); + } + + #updateWord = (word, level) => { + this.#wordbookService.set([{word, level}]); + } +} + +/***/ }), + +/***/ "./src/popup/scroll/WordsAppender.js": +/*!*******************************************!*\ + !*** ./src/popup/scroll/WordsAppender.js ***! + \*******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ WordsAppender: () => (/* binding */ WordsAppender) +/* harmony export */ }); +/* harmony import */ var _core_enum__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../core/enum */ "./src/core/enum.js"); +/* harmony import */ var _core_enum_Levels__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/enum/Levels */ "./src/core/enum/Levels.js"); +/* harmony import */ var _core_builder_AbstractView__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../core/builder/AbstractView */ "./src/core/builder/AbstractView.ts"); + + + + +class WordsAppender extends _core_builder_AbstractView__WEBPACK_IMPORTED_MODULE_2__.AbstractView { + + #templateFunction; + #options; + + constructor() { + super(); + this.#templateFunction = __webpack_require__(/*! pug-loader!./templates/word.pug */ "./node_modules/pug-loader/index.js!./src/popup/scroll/templates/word.pug"); + this.#options = []; + (0,_core_enum__WEBPACK_IMPORTED_MODULE_0__.enumForEach)(_core_enum_Levels__WEBPACK_IMPORTED_MODULE_1__.Levels, (level) => { + this.#options.push(level.name) + }); + } + + addWord = (clear, level) => { + const words = this.#getWordsElement(); + const ref = this.#buildWord(clear, level); + words.appendChild(ref); + return ref; + } + + #buildWord = (clear, level) => { + const options = this.#options; + const html = this.#templateFunction({clear, level, options}) + return this.getHTMLMapper().toElement(html); + }; + + clearScroll = () => { + this.#getWordsElement().innerHTML = ""; + } + + #getWordsElement = () => window.document.getElementById('words'); +} + +/***/ }), + +/***/ "./src/popup/settings/SettingsBuilder.js": +/*!***********************************************!*\ + !*** ./src/popup/settings/SettingsBuilder.js ***! + \***********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ SettingsBuilder: () => (/* binding */ SettingsBuilder) +/* harmony export */ }); +/* harmony import */ var _core_builder_ContentView__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../core/builder/ContentView */ "./src/core/builder/ContentView.js"); + + + +class SettingsBuilder extends _core_builder_ContentView__WEBPACK_IMPORTED_MODULE_0__.ContentView { + + #levers; + + buildSettingsContentStructure = () => { + const templateLoader = __webpack_require__(/*! pug-loader!./template/settings.pug */ "./node_modules/pug-loader/index.js!./src/popup/settings/template/settings.pug"); + const html = templateLoader(); + const settings = this.getHTMLMapper().toElement(html); + this.getContent().appendChild(settings); + const block = this.getContent().getElementsByClassName("block")[0]; + this.appendSlider(block, {id: "russian", title: "Russian"}) + this.appendSlider(block, {id: "korean", title: "Korean"}) + this.appendSlider(block, {id: "english", title: "English"}) + this.appendSlider(block, {id: "china", title: "China"}) + + } + + appendSlider = (parent, language) => { + const templateLoader = __webpack_require__(/*! pug-loader!./template/slider.pug */ "./node_modules/pug-loader/index.js!./src/popup/settings/template/slider.pug"); + const html = templateLoader({language}); + const slider = this.getHTMLMapper().toElement(html); + parent.appendChild(slider); + } + loadLevers = () => { + this.#levers = window.document.getElementsByClassName('lever'); + } + + setupAppEnableLever = (changeEnable) => { + this.#setupLever(this.#levers[0], changeEnable, "enable"); + } + + renderAppEnableLever = (enable) => { + this.renderLever(this.#levers[0], enable); + }; + + setupRussianEnableLever = (changeEnable) => { + this.#setupLever(this.#levers[1], changeEnable, "russian"); + } + + renderRussianEnableLever = (enable) => { + this.renderLever(this.#levers[1], enable); + }; + + setupKoreanEnableLever = (changeEnable) => { + this.#setupLever(this.#levers[2], changeEnable, "korean"); + } + + renderKoreanEnableLever = (enable) => { + this.renderLever(this.#levers[2], enable); + }; + + setupEnglishEnableLever = (changeEnable) => { + this.#setupLever(this.#levers[3], changeEnable, "english"); + } + + renderEnglishEnableLever = (enable) => { + this.renderLever(this.#levers[3], enable); + }; + + setupChinaEnableLever = (changeEnable) => { + this.#setupLever(this.#levers[4], changeEnable, "china"); + } + + renderChinaEnableLever = (enable) => { + this.renderLever(this.#levers[4], enable); + }; + + #setupLever = (lever, changeEnable, name) => { + lever.addEventListener('click', () => changeEnable(lever, name)); + } + + renderLever = (lever, enable) => { + lever.style.justifyContent = enable ? 'flex-end' : 'flex-start'; + lever.style.background = enable ? '#c2d7bf' : '#ffffff'; + } + +} + + +/***/ }), + +/***/ "./src/popup/settings/SettingsService.js": +/*!***********************************************!*\ + !*** ./src/popup/settings/SettingsService.js ***! + \***********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ SettingsService: () => (/* binding */ SettingsService) +/* harmony export */ }); +/* harmony import */ var _SettingsBuilder__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./SettingsBuilder */ "./src/popup/settings/SettingsBuilder.js"); + + +class SettingsService { + + #builder; + #settings; + + constructor() { + this.#builder = new _SettingsBuilder__WEBPACK_IMPORTED_MODULE_0__.SettingsBuilder(); + this.#settings = {enable: true, russian: true, english: true, china: true, korean: true} + } + + fillSettings = () => { + chrome.storage.local.get(['enable', 'russian', "english", "china", "korean"], (settings) => this.#setupSettings(settings)); + } + + #setupSettings = (settings) => { + this.#settings = settings; + this.#builder.loadLevers(); + this.#setupEnableAppLever(); + this.#setupLangLevers(); + } + + #setupEnableAppLever = () => { + this.#builder.setupAppEnableLever(this.#changeEnable); + this.#builder.renderAppEnableLever(this.#settings.enable); + } + + #setupLangLevers = () => { + //TODO:: Clean code (Remove duplicate) + this.#builder.setupRussianEnableLever(this.#changeEnable); + this.#builder.renderRussianEnableLever(this.#settings.russian); + this.#builder.setupKoreanEnableLever(this.#changeEnable); + this.#builder.renderKoreanEnableLever(this.#settings.korean); + this.#builder.setupEnglishEnableLever(this.#changeEnable); + this.#builder.renderEnglishEnableLever(this.#settings.english); + this.#builder.setupChinaEnableLever(this.#changeEnable); + this.#builder.renderChinaEnableLever(this.#settings.china); + } + + #changeEnable = (lever, name) => { + this.#settings[name] = !this.#settings[name]; + chrome.storage.local.set(this.#settings, () => { + this.#builder.renderLever(lever, this.#settings[name]); + }); + }; +} + +/***/ }), + +/***/ "?8f63": +/*!********************!*\ + !*** fs (ignored) ***! + \********************/ +/***/ (() => { + +/* (ignored) */ + +/***/ }), + +/***/ "./manifest.json": +/*!***********************!*\ + !*** ./manifest.json ***! + \***********************/ +/***/ ((module) => { + +"use strict"; +module.exports = /*#__PURE__*/JSON.parse('{"name":"Reckue Languages (API)","version":"0.6.0","description":"Interactive language learning assistant with API integration","permissions":["storage","activeTab","tabs"],"host_permissions":["https://api.reckue.com/*"],"background":{"service_worker":"background/application.js"},"action":{"default_popup":"dist/popup/popup.html","default_icon":{"16":"images/coach16.png","32":"images/coach32.png","48":"images/coach48.png","128":"images/coach128.png"}},"content_scripts":[{"matches":["http://*/*","https://*/*"],"exclude_matches":["https://translate.google.com/*"],"run_at":"document_idle","js":["dist/page/page.js"]}],"icons":{"16":"images/coach16.png","32":"images/coach32.png","48":"images/coach48.png","128":"images/coach128.png"},"manifest_version":3}'); + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; +// This entry need to be wrapped in an IIFE because it need to be in strict mode. +(() => { +"use strict"; +/*!**************************!*\ + !*** ./src/api-popup.ts ***! + \**************************/ +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _core_ApiApp_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./core/ApiApp.js */ "./src/core/ApiApp.js"); +/* harmony import */ var _popup_ApiPopupService_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./popup/ApiPopupService.js */ "./src/popup/ApiPopupService.js"); + + +const service = new _popup_ApiPopupService_js__WEBPACK_IMPORTED_MODULE_1__.ApiPopupService(); +const app = new _core_ApiApp_js__WEBPACK_IMPORTED_MODULE_0__.ApiApp(service); +app.start(); + +})(); + +/******/ })() +; +//# sourceMappingURL=popup.js.map \ No newline at end of file diff --git a/manifest.json b/manifest.json index d170b30..3877b80 100644 --- a/manifest.json +++ b/manifest.json @@ -1,13 +1,14 @@ { - "name": "Reckue Languages", - "version": "0.5.7", - "description": "Interactive language learning assistant", + "name": "Reckue Languages (API)", + "version": "0.6.0", + "description": "Interactive language learning assistant with API integration", "permissions": ["storage", "activeTab", "tabs"], + "host_permissions": ["https://api.reckue.com/*"], "background": { "service_worker": "background/application.js" }, "action": { - "default_popup": "dist/popup/index.html", + "default_popup": "dist/popup/popup.html", "default_icon": { "16": "images/coach16.png", "32": "images/coach32.png", @@ -32,4 +33,4 @@ "128": "images/coach128.png" }, "manifest_version": 3 -} +} \ No newline at end of file diff --git a/manifest.json.backup b/manifest.json.backup new file mode 100644 index 0000000..02540d0 --- /dev/null +++ b/manifest.json.backup @@ -0,0 +1,35 @@ +{ + "name": "Reckue Languages (Local)", + "version": "0.5.7-local", + "description": "Interactive language learning assistant", + "permissions": ["storage", "activeTab", "tabs"], + "background": { + "service_worker": "background/application.js" + }, + "action": { + "default_popup": "dist/popup/index.html", + "default_icon": { + "16": "images/coach16.png", + "32": "images/coach32.png", + "48": "images/coach48.png", + "128": "images/coach128.png" + } + }, + "content_scripts": [ + { + "matches": ["http://*/*", "https://*/*"], + "exclude_matches": ["https://translate.google.com/*"], + "run_at": "document_idle", + "js": [ + "dist/page/page.js" + ] + } + ], + "icons": { + "16": "images/coach16.png", + "32": "images/coach32.png", + "48": "images/coach48.png", + "128": "images/coach128.png" + }, + "manifest_version": 3 +} diff --git a/package-lock.json b/package-lock.json index 94f7d18..0025c1c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,286 +1,315 @@ { "name": "reckue-lang", - "version": "0.5.7", + "version": "0.6.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "reckue-lang", - "version": "0.5.7", + "version": "0.6.0", "license": "ISC", "devDependencies": { "apply-loader": "^2.0.0", - "pug": "^2.0.4", + "copy-webpack-plugin": "^13.0.0", + "pug": "3.0.3", "pug-loader": "^2.4.0", "ts-loader": "^9.5.1", "typescript": "^5.3.3", - "webpack": "^5.70.0", + "webpack": "5.94.0", "webpack-cli": "^4.9.2" } }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=10.0.0" + "node": ">=6.9.0" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz", + "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@babel/types": "^7.28.0" + }, + "bin": { + "parser": "bin/babel-parser.js" }, "engines": { "node": ">=6.0.0" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "node_modules/@babel/types": { + "version": "7.28.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", + "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", "dev": true, "engines": { - "node": ">=6.0.0" + "node": ">=10.0.0" } }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.12", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", + "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", - "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "license": "MIT", + "engines": { + "node": ">=6.0.0" } }, - "node_modules/@types/babel-types": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-7.0.15.tgz", - "integrity": "sha512-JUgfZHUOMbtjopxiOQaaF+Uovk5wpDqpXR+XLWiOivCWSy1FccO30lvNNpCt8geFwq8VmGT2y9OMkOpA0g5O5g==", - "dev": true - }, - "node_modules/@types/babylon": { - "version": "6.16.9", - "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.9.tgz", - "integrity": "sha512-sEKyxMVEowhcr8WLfN0jJYe4gS4Z9KC2DGz0vqfC7+MXFbmvOF7jSjALC77thvAO2TLgFUPa9vDeOak+AcUrZA==", + "node_modules/@jridgewell/source-map": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.10.tgz", + "integrity": "sha512-0pPkgz9dY+bijgistcTTJ5mR+ocqRXLuhXHYdzoMmmoJ2C9S46RCm2GMUbatPEUK9Yjy26IrAy8D/M00lLkv+Q==", "dev": true, + "license": "MIT", "dependencies": { - "@types/babel-types": "*" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, - "node_modules/@types/eslint": { - "version": "8.44.2", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.2.tgz", - "integrity": "sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg==", + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", + "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", "dev": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } + "license": "MIT" }, - "node_modules/@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.29", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", + "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", "dev": true, + "license": "MIT", "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@types/estree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", - "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", - "dev": true + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" }, "node_modules/@types/json-schema": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", - "dev": true + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" }, "node_modules/@types/node": { - "version": "20.5.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.7.tgz", - "integrity": "sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA==", - "dev": true + "version": "24.1.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.1.0.tgz", + "integrity": "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.8.0" + } }, "node_modules/@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "dev": true + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "dev": true + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", - "dev": true + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "dev": true + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", "dev": true, + "license": "MIT", "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "dev": true + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" } }, @@ -324,19 +353,22 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha512-fu2ygVGuMmlzG8ZeRJ0bvR41nsAkxxhbyk8bZ1SS521Z7vmgJFTQQlfz/Mp/nJexGBz+v8sC9bM6+lNgskt4Ug==", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -344,20 +376,12 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-globals": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz", - "integrity": "sha512-uWttZCk96+7itPxK8xCzY86PnxKTMrReKDqrHzv42VQY0K30PUO8WY13WMOuI+cOdX4EIdzdvQ8k6jkuGRFMYw==", - "dev": true, - "dependencies": { - "acorn": "^4.0.4" - } - }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -369,39 +393,56 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, "peerDependencies": { - "ajv": "^6.9.1" + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, - "node_modules/align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha512-GrTZLRpmp6wIC2ztrWW9MjjTgSKccffgFagbNDOX95/dcjEcYZibYTeaOntySQLcdw1ztBoFkviiUvTMbb9MYg==", + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, + "license": "MIT", "dependencies": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/align-text/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" + "license": "MIT" + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" } }, "node_modules/ansi-styles": { @@ -432,37 +473,27 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "dev": true - }, - "node_modules/babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", "dev": true, - "dependencies": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } + "license": "MIT" }, - "node_modules/babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha512-zhe3V/26rCWsEZK8kZN+HaQj5yQ1CilTObixFzKW1UWjqG7618Twz6YEsCnjfg5gBcJh02DrpCkS9h98ZqDY+g==", + "node_modules/assert-never": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/assert-never/-/assert-never-1.4.0.tgz", + "integrity": "sha512-5oJg84os6NMQNl27T9LnZkvvqzvAnHu03ShCnoj6bsJwS7L8AO4lf+C/XjK/nvzEqQB744moC6V128RucQd1jA==", "dev": true, - "dependencies": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - } + "license": "MIT" }, - "node_modules/babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "node_modules/babel-walk": { + "version": "3.0.0-canary-5", + "resolved": "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0-canary-5.tgz", + "integrity": "sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==", "dev": true, - "bin": { - "babylon": "bin/babylon.js" + "license": "MIT", + "dependencies": { + "@babel/types": "^7.9.6" + }, + "engines": { + "node": ">= 10.0.0" } }, "node_modules/big.js": { @@ -522,29 +553,38 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true + "dev": true, + "license": "MIT" }, - "node_modules/call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "dev": true, + "license": "MIT", "dependencies": { - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 0.4" } }, - "node_modules/camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha512-wzLkDa4K/mzI1OSITC+DUyjgIl/ETNHE9QvYgy6J6Jvqyyz4C0Xfd+lQhb19sX2jMpZV4IssUn0VDVmglV+s4g==", + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/caniuse-lite": { @@ -567,19 +607,6 @@ } ] }, - "node_modules/center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha512-Baz3aNe2gd2LP2qk5U+sDk/m4oSuwSDcBfayTCTBoWpfIGO5XFxPmjILQII4NGiZjD6DoDI6kf7gKaxkf7s3VQ==", - "dev": true, - "dependencies": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -613,6 +640,7 @@ "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz", "integrity": "sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==", "dev": true, + "license": "MIT", "dependencies": { "is-regex": "^1.0.3" } @@ -626,29 +654,6 @@ "node": ">=6.0" } }, - "node_modules/clean-css": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz", - "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", - "dev": true, - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha512-GIOYRizG+TGoc7Wgc1LiOTLare95R3mzKgoln+Q/lE4ceiYH19gUpl0l0Ffq4lJDEf3FxujMe6IBfOCs7pfqNA==", - "dev": true, - "dependencies": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - } - }, "node_modules/clone-deep": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", @@ -691,27 +696,100 @@ "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/constantinople": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.1.2.tgz", - "integrity": "sha512-yePcBqEFhLOqSBtwYOGGS1exHo/s1xjekXiinh4itpNQGCu4KA1euPh1fg07N2wMITZXQkBz75Ntdt1ctGZouw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-4.0.1.tgz", + "integrity": "sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==", "dev": true, + "license": "MIT", "dependencies": { - "@types/babel-types": "^7.0.0", - "@types/babylon": "^6.16.2", - "babel-types": "^6.26.0", - "babylon": "^6.18.0" + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.1" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-13.0.0.tgz", + "integrity": "sha512-FgR/h5a6hzJqATDGd9YG41SeDViH+0bkHn6WNXCi5zKAZkeESeSxLySSsFLHqLEVCh0E+rITmCf0dusXWYukeQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob-parent": "^6.0.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.2.0", + "serialize-javascript": "^6.0.2", + "tinyglobby": "^0.2.12" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" } }, - "node_modules/core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", + "node_modules/copy-webpack-plugin/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, - "hasInstallScript": true + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/copy-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/copy-webpack-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/copy-webpack-plugin/node_modules/schema-utils": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", + "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } }, "node_modules/cross-spawn": { "version": "7.0.3", @@ -727,35 +805,28 @@ "node": ">= 8" } }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "node_modules/doctypes": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", + "integrity": "sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==", "dev": true, - "engines": { - "node": ">=0.10.0" - } + "license": "MIT" }, - "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "dev": true, + "license": "MIT", "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" }, "engines": { "node": ">= 0.4" } }, - "node_modules/doctypes": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", - "integrity": "sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==", - "dev": true - }, "node_modules/electron-to-chromium": { "version": "1.4.503", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.503.tgz", @@ -772,10 +843,11 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "version": "5.18.2", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.2.tgz", + "integrity": "sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -796,12 +868,45 @@ "node": ">=4" } }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-module-lexer": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", "dev": true }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -854,15 +959,6 @@ "node": ">=4.0" } }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", @@ -876,13 +972,32 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" }, "node_modules/fastest-levenshtein": { "version": "1.0.16", @@ -893,6 +1008,21 @@ "node": ">= 4.9.1" } }, + "node_modules/fdir": { + "version": "6.4.6", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", + "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -928,33 +1058,72 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dev": true, + "license": "MIT", "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" + "license": "MIT", + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -987,35 +1156,12 @@ "node": ">=8" } }, - "node_modules/has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -1024,12 +1170,13 @@ } }, "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, + "license": "MIT", "dependencies": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -1039,10 +1186,11 @@ } }, "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -1078,12 +1226,6 @@ "node": ">= 0.10" } }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, "node_modules/is-core-module": { "version": "2.13.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", @@ -1097,13 +1239,37 @@ } }, "node_modules/is-expression": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-3.0.0.tgz", - "integrity": "sha512-vyMeQMq+AiH5uUnoBfMTwf18tO3bM6k1QXBE9D6ueAAquEfCZe3AJPtud9g6qS0+4X8xA7ndpZiDyeb2l2qOBw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-4.0.0.tgz", + "integrity": "sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^7.1.1", + "object-assign": "^4.1.1" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", "dependencies": { - "acorn": "~4.0.2", - "object-assign": "^4.0.1" + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" } }, "node_modules/is-number": { @@ -1131,16 +1297,20 @@ "version": "2.2.2", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -1169,6 +1339,7 @@ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -1182,7 +1353,8 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", "integrity": "sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", @@ -1194,7 +1366,8 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json5": { "version": "1.0.2", @@ -1213,6 +1386,7 @@ "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", "integrity": "sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A==", "dev": true, + "license": "MIT", "dependencies": { "is-promise": "^2.0.0", "promise": "^7.0.1" @@ -1227,15 +1401,6 @@ "node": ">=0.10.0" } }, - "node_modules/lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", @@ -1271,21 +1436,6 @@ "node": ">=8" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha512-k+yt5n3l48JU4k8ftnKG6V7u32wyH2NfKzeMto9F/QRE0amxy/LayxwlvjjkZEIzqR+19IrtFO8p5kB9QaYUFg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -1298,11 +1448,22 @@ "node": ">=10" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/micromatch": { "version": "4.0.5", @@ -1359,11 +1520,22 @@ "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", "dev": true }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -1463,105 +1635,133 @@ "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", "dev": true, + "license": "MIT", "dependencies": { "asap": "~2.0.3" } }, "node_modules/pug": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pug/-/pug-2.0.4.tgz", - "integrity": "sha512-XhoaDlvi6NIzL49nu094R2NA6P37ijtgMDuWE+ofekDChvfKnzFal60bhSdiy8y2PBO6fmz3oMEIcfpBVRUdvw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pug/-/pug-3.0.3.tgz", + "integrity": "sha512-uBi6kmc9f3SZ3PXxqcHiUZLmIXgfgWooKWXcwSGwQd2Zi5Rb0bT14+8CJjJgI8AB+nndLaNgHGrcc6bPIB665g==", "dev": true, + "license": "MIT", "dependencies": { - "pug-code-gen": "^2.0.2", - "pug-filters": "^3.1.1", - "pug-lexer": "^4.1.0", - "pug-linker": "^3.0.6", - "pug-load": "^2.0.12", - "pug-parser": "^5.0.1", - "pug-runtime": "^2.0.5", - "pug-strip-comments": "^1.0.4" + "pug-code-gen": "^3.0.3", + "pug-filters": "^4.0.0", + "pug-lexer": "^5.0.1", + "pug-linker": "^4.0.0", + "pug-load": "^3.0.0", + "pug-parser": "^6.0.0", + "pug-runtime": "^3.0.1", + "pug-strip-comments": "^2.0.0" } }, "node_modules/pug-attrs": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-2.0.4.tgz", - "integrity": "sha512-TaZ4Z2TWUPDJcV3wjU3RtUXMrd3kM4Wzjbe3EWnSsZPsJ3LDI0F3yCnf2/W7PPFF+edUFQ0HgDL1IoxSz5K8EQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-3.0.0.tgz", + "integrity": "sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==", "dev": true, + "license": "MIT", "dependencies": { - "constantinople": "^3.0.1", - "js-stringify": "^1.0.1", - "pug-runtime": "^2.0.5" + "constantinople": "^4.0.1", + "js-stringify": "^1.0.2", + "pug-runtime": "^3.0.0" } }, "node_modules/pug-code-gen": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-2.0.3.tgz", - "integrity": "sha512-r9sezXdDuZJfW9J91TN/2LFbiqDhmltTFmGpHTsGdrNGp3p4SxAjjXEfnuK2e4ywYsRIVP0NeLbSAMHUcaX1EA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-3.0.3.tgz", + "integrity": "sha512-cYQg0JW0w32Ux+XTeZnBEeuWrAY7/HNE6TWnhiHGnnRYlCgyAUPoyh9KzCMa9WhcJlJ1AtQqpEYHc+vbCzA+Aw==", "dev": true, + "license": "MIT", "dependencies": { - "constantinople": "^3.1.2", + "constantinople": "^4.0.1", "doctypes": "^1.1.0", - "js-stringify": "^1.0.1", - "pug-attrs": "^2.0.4", - "pug-error": "^1.3.3", - "pug-runtime": "^2.0.5", - "void-elements": "^2.0.1", - "with": "^5.0.0" + "js-stringify": "^1.0.2", + "pug-attrs": "^3.0.0", + "pug-error": "^2.1.0", + "pug-runtime": "^3.0.1", + "void-elements": "^3.1.0", + "with": "^7.0.0" } }, "node_modules/pug-error": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-1.3.3.tgz", - "integrity": "sha512-qE3YhESP2mRAWMFJgKdtT5D7ckThRScXRwkfo+Erqga7dyJdY3ZquspprMCj/9sJ2ijm5hXFWQE/A3l4poMWiQ==", - "dev": true + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-2.1.0.tgz", + "integrity": "sha512-lv7sU9e5Jk8IeUheHata6/UThZ7RK2jnaaNztxfPYUY+VxZyk/ePVaNZ/vwmH8WqGvDz3LrNYt/+gA55NDg6Pg==", + "dev": true, + "license": "MIT" }, "node_modules/pug-filters": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-3.1.1.tgz", - "integrity": "sha512-lFfjNyGEyVWC4BwX0WyvkoWLapI5xHSM3xZJFUhx4JM4XyyRdO8Aucc6pCygnqV2uSgJFaJWW3Ft1wCWSoQkQg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-4.0.0.tgz", + "integrity": "sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==", "dev": true, + "license": "MIT", "dependencies": { - "clean-css": "^4.1.11", - "constantinople": "^3.0.1", + "constantinople": "^4.0.1", "jstransformer": "1.0.0", - "pug-error": "^1.3.3", - "pug-walk": "^1.1.8", - "resolve": "^1.1.6", - "uglify-js": "^2.6.1" + "pug-error": "^2.0.0", + "pug-walk": "^2.0.0", + "resolve": "^1.15.1" } }, + "node_modules/pug-filters/node_modules/pug-walk": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-2.0.0.tgz", + "integrity": "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==", + "dev": true, + "license": "MIT" + }, "node_modules/pug-lexer": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-4.1.0.tgz", - "integrity": "sha512-i55yzEBtjm0mlplW4LoANq7k3S8gDdfC6+LThGEvsK4FuobcKfDAwt6V4jKPH9RtiE3a2Akfg5UpafZ1OksaPA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-5.0.1.tgz", + "integrity": "sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==", "dev": true, + "license": "MIT", "dependencies": { - "character-parser": "^2.1.1", - "is-expression": "^3.0.0", - "pug-error": "^1.3.3" + "character-parser": "^2.2.0", + "is-expression": "^4.0.0", + "pug-error": "^2.0.0" } }, "node_modules/pug-linker": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-3.0.6.tgz", - "integrity": "sha512-bagfuHttfQOpANGy1Y6NJ+0mNb7dD2MswFG2ZKj22s8g0wVsojpRlqveEQHmgXXcfROB2RT6oqbPYr9EN2ZWzg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-4.0.0.tgz", + "integrity": "sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==", "dev": true, + "license": "MIT", "dependencies": { - "pug-error": "^1.3.3", - "pug-walk": "^1.1.8" + "pug-error": "^2.0.0", + "pug-walk": "^2.0.0" } }, + "node_modules/pug-linker/node_modules/pug-walk": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-2.0.0.tgz", + "integrity": "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==", + "dev": true, + "license": "MIT" + }, "node_modules/pug-load": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-2.0.12.tgz", - "integrity": "sha512-UqpgGpyyXRYgJs/X60sE6SIf8UBsmcHYKNaOccyVLEuT6OPBIMo6xMPhoJnqtB3Q3BbO4Z3Bjz5qDsUWh4rXsg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-3.0.0.tgz", + "integrity": "sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==", "dev": true, + "license": "MIT", "dependencies": { - "object-assign": "^4.1.0", - "pug-walk": "^1.1.8" + "object-assign": "^4.1.1", + "pug-walk": "^2.0.0" } }, + "node_modules/pug-load/node_modules/pug-walk": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-2.0.0.tgz", + "integrity": "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==", + "dev": true, + "license": "MIT" + }, "node_modules/pug-loader": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/pug-loader/-/pug-loader-2.4.0.tgz", @@ -1577,28 +1777,31 @@ } }, "node_modules/pug-parser": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-5.0.1.tgz", - "integrity": "sha512-nGHqK+w07p5/PsPIyzkTQfzlYfuqoiGjaoqHv1LjOv2ZLXmGX1O+4Vcvps+P4LhxZ3drYSljjq4b+Naid126wA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-6.0.0.tgz", + "integrity": "sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==", "dev": true, + "license": "MIT", "dependencies": { - "pug-error": "^1.3.3", - "token-stream": "0.0.1" + "pug-error": "^2.0.0", + "token-stream": "1.0.0" } }, "node_modules/pug-runtime": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-2.0.5.tgz", - "integrity": "sha512-P+rXKn9un4fQY77wtpcuFyvFaBww7/91f3jHa154qU26qFAnOe6SW1CbIDcxiG5lLK9HazYrMCCuDvNgDQNptw==", - "dev": true + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-3.0.1.tgz", + "integrity": "sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg==", + "dev": true, + "license": "MIT" }, "node_modules/pug-strip-comments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-1.0.4.tgz", - "integrity": "sha512-i5j/9CS4yFhSxHp5iKPHwigaig/VV9g+FgReLJWWHEHbvKsbqL0oP/K5ubuLco6Wu3Kan5p7u7qk8A4oLLh6vw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz", + "integrity": "sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==", "dev": true, + "license": "MIT", "dependencies": { - "pug-error": "^1.3.3" + "pug-error": "^2.0.0" } }, "node_modules/pug-walk": { @@ -1608,10 +1811,11 @@ "dev": true }, "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -1621,6 +1825,7 @@ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "^5.1.0" } @@ -1637,19 +1842,14 @@ "node": ">= 0.10" } }, - "node_modules/regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10" + "node": ">=0.10.0" } }, "node_modules/resolve": { @@ -1690,18 +1890,6 @@ "node": ">=8" } }, - "node_modules/right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha512-yqINtL/G7vs2v+dFIZmFUDbnVyFUJFKd6gK22Kgo6R4jfJGFtisKyncWDDULgjfqf4ASQuIQyjJ7XZ+3aWpsAg==", - "dev": true, - "dependencies": { - "align-text": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -1720,13 +1908,15 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/schema-utils": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -1756,30 +1946,15 @@ } }, "node_modules/serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" } }, - "node_modules/set-function-length": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz", - "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==", - "dev": true, - "dependencies": { - "define-data-property": "^1.1.1", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.2", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/shallow-clone": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", @@ -1818,6 +1993,7 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -1827,6 +2003,7 @@ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -1837,6 +2014,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -1869,13 +2047,14 @@ } }, "node_modules/terser": { - "version": "5.19.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz", - "integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==", + "version": "5.43.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz", + "integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", + "acorn": "^8.14.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -1887,16 +2066,17 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.9", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", - "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "version": "5.3.14", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", + "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.17", + "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.16.8" + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" }, "engines": { "node": ">= 10.13.0" @@ -1920,11 +2100,69 @@ } } }, + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", + "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/terser/node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -1932,13 +2170,34 @@ "node": ">=0.4.0" } }, - "node_modules/to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha512-lxrWP8ejsq+7E3nNjwYmUBMAgjMTZoTI+sdBOpvNyijeDLa29LUn9QaoXAHv4+Z578hbmHHJKZknzxVtvo77og==", + "node_modules/tinyglobby": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/to-regex-range": { @@ -1954,10 +2213,11 @@ } }, "node_modules/token-stream": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-0.0.1.tgz", - "integrity": "sha512-nfjOAu/zAWmX9tgwi5NRp7O7zTDUD1miHiB40klUnAh9qnL1iXdgzcz/i5dMaL5jahcBAaSfmNOBBJBLJW8TEg==", - "dev": true + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-1.0.0.tgz", + "integrity": "sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==", + "dev": true, + "license": "MIT" }, "node_modules/ts-loader": { "version": "9.5.1", @@ -2001,40 +2261,12 @@ "node": ">=14.17" } }, - "node_modules/uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha512-qLq/4y2pjcU3vhlhseXGGJ7VbFO4pBANu0kwl8VCa9KEI0V8VfZIx2Fy3w01iSTA/pGwKZSmu/+I4etLNDdt5w==", - "dev": true, - "dependencies": { - "source-map": "~0.5.1", - "yargs": "~3.10.0" - }, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - }, - "optionalDependencies": { - "uglify-to-browserify": "~1.0.0" - } - }, - "node_modules/uglify-js/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha512-vb2s1lYx2xBtUgy+ta+b2J/GLVUR+wmpINwHePmPRhOsIVCG2wDzKJ0n14GslH1BifsqVzSOwQhRaCAsZ/nI4Q==", + "node_modules/undici-types": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz", + "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==", "dev": true, - "optional": true + "license": "MIT" }, "node_modules/update-browserslist-db": { "version": "1.0.11", @@ -2071,24 +2303,27 @@ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } }, "node_modules/void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", - "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", + "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", + "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", "dev": true, + "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -2098,34 +2333,34 @@ } }, "node_modules/webpack": { - "version": "5.88.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", - "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", + "version": "5.94.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", + "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", "dev": true, + "license": "MIT", "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.14.5", + "acorn-import-attributes": "^1.9.5", + "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", + "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", - "watchpack": "^2.4.0", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, "bin": { @@ -2223,10 +2458,11 @@ } }, "node_modules/webpack/node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -2234,11 +2470,12 @@ "node": ">=0.4.0" } }, - "node_modules/webpack/node_modules/acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "node_modules/webpack/node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", "dev": true, + "license": "MIT", "peerDependencies": { "acorn": "^8" } @@ -2264,44 +2501,20 @@ "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", "dev": true }, - "node_modules/window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha512-1pTPQDKTdd61ozlKGNCjhNRd+KPmgLSGa3mZTHoOliaGcESD8G1PXhh7c1fgiPjVbNVfgy2Faw4BI8/m0cC8Mg==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/with": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/with/-/with-5.1.1.tgz", - "integrity": "sha512-uAnSsFGfSpF6DNhBXStvlZILfHJfJu4eUkfbRGk94kGO1Ta7bg6FwfvoOhhyHAJuFbCw+0xk4uJ3u57jLvlCJg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/with/-/with-7.0.2.tgz", + "integrity": "sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==", "dev": true, + "license": "MIT", "dependencies": { - "acorn": "^3.1.0", - "acorn-globals": "^3.0.0" - } - }, - "node_modules/with/node_modules/acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha512-OLUyIIZ7mF5oaAUT1w0TFqQS81q3saT46x8t7ukpPjMNk+nbs4ZHhs7ToV8EWnLYLepjETXd4XaCE4uxkMeqUw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" + "@babel/parser": "^7.9.6", + "@babel/types": "^7.9.6", + "assert-never": "^1.2.1", + "babel-walk": "3.0.0-canary-5" }, "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha512-xSBsCeh+g+dinoBv3GAOWM4LcVVO68wLXRanibtBSdUvkGWQRGeE9P7IwU9EmDDi4jA6L44lz15CGMwdw9N5+Q==", - "dev": true, - "engines": { - "node": ">=0.4.0" + "node": ">= 10.0.0" } }, "node_modules/yallist": { @@ -2309,21 +2522,40 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true - }, - "node_modules/yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha512-QFzUah88GAGy9lyDKGBqZdkYApt63rCXYBGYnEP4xDJPXNqXXnBDACnbrXnViV6jRSqAePwrATi2i8mfYm4L1A==", - "dev": true, - "dependencies": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - } } }, "dependencies": { + "@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "dev": true + }, + "@babel/parser": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz", + "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==", + "dev": true, + "requires": { + "@babel/types": "^7.28.0" + } + }, + "@babel/types": { + "version": "7.28.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", + "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + } + }, "@discoveryjs/json-ext": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", @@ -2331,250 +2563,211 @@ "dev": true }, "@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.12", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", + "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", "dev": true, "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" } }, "@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true }, "@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.10.tgz", + "integrity": "sha512-0pPkgz9dY+bijgistcTTJ5mR+ocqRXLuhXHYdzoMmmoJ2C9S46RCm2GMUbatPEUK9Yjy26IrAy8D/M00lLkv+Q==", "dev": true, "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, "@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", + "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", "dev": true }, "@jridgewell/trace-mapping": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", - "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "version": "0.3.29", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", + "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", "dev": true, "requires": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "@types/babel-types": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-7.0.15.tgz", - "integrity": "sha512-JUgfZHUOMbtjopxiOQaaF+Uovk5wpDqpXR+XLWiOivCWSy1FccO30lvNNpCt8geFwq8VmGT2y9OMkOpA0g5O5g==", - "dev": true - }, - "@types/babylon": { - "version": "6.16.9", - "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.9.tgz", - "integrity": "sha512-sEKyxMVEowhcr8WLfN0jJYe4gS4Z9KC2DGz0vqfC7+MXFbmvOF7jSjALC77thvAO2TLgFUPa9vDeOak+AcUrZA==", - "dev": true, - "requires": { - "@types/babel-types": "*" - } - }, - "@types/eslint": { - "version": "8.44.2", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.2.tgz", - "integrity": "sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg==", - "dev": true, - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "dev": true, - "requires": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, "@types/estree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", - "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true }, "@types/json-schema": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, "@types/node": { - "version": "20.5.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.7.tgz", - "integrity": "sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA==", - "dev": true + "version": "24.1.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.1.0.tgz", + "integrity": "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w==", + "dev": true, + "requires": { + "undici-types": "~7.8.0" + } }, "@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "dev": true, "requires": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", "dev": true }, "@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", "dev": true }, "@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", "dev": true }, "@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "dev": true, "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", "@xtuc/long": "4.2.2" } }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", "dev": true }, "@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" } }, "@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", "dev": true, "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", "dev": true, "requires": { "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", "dev": true }, "@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" } }, "@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" } }, "@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" } }, @@ -2582,8 +2775,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", - "dev": true, - "requires": {} + "dev": true }, "@webpack-cli/info": { "version": "1.5.0", @@ -2598,8 +2790,7 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", - "dev": true, - "requires": {} + "dev": true }, "@xtuc/ieee754": { "version": "1.2.0", @@ -2614,20 +2805,11 @@ "dev": true }, "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha512-fu2ygVGuMmlzG8ZeRJ0bvR41nsAkxxhbyk8bZ1SS521Z7vmgJFTQQlfz/Mp/nJexGBz+v8sC9bM6+lNgskt4Ug==", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true }, - "acorn-globals": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz", - "integrity": "sha512-uWttZCk96+7itPxK8xCzY86PnxKTMrReKDqrHzv42VQY0K30PUO8WY13WMOuI+cOdX4EIdzdvQ8k6jkuGRFMYw==", - "dev": true, - "requires": { - "acorn": "^4.0.4" - } - }, "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -2640,35 +2822,41 @@ "uri-js": "^4.2.2" } }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} - }, - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha512-GrTZLRpmp6wIC2ztrWW9MjjTgSKccffgFagbNDOX95/dcjEcYZibYTeaOntySQLcdw1ztBoFkviiUvTMbb9MYg==", + "ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dev": true, "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" + "ajv": "^8.0.0" }, "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true } } }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true + }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -2693,34 +2881,21 @@ "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "dev": true }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } + "assert-never": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/assert-never/-/assert-never-1.4.0.tgz", + "integrity": "sha512-5oJg84os6NMQNl27T9LnZkvvqzvAnHu03ShCnoj6bsJwS7L8AO4lf+C/XjK/nvzEqQB744moC6V128RucQd1jA==", + "dev": true }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha512-zhe3V/26rCWsEZK8kZN+HaQj5yQ1CilTObixFzKW1UWjqG7618Twz6YEsCnjfg5gBcJh02DrpCkS9h98ZqDY+g==", + "babel-walk": { + "version": "3.0.0-canary-5", + "resolved": "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0-canary-5.tgz", + "integrity": "sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==", "dev": true, "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" + "@babel/types": "^7.9.6" } }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true - }, "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -2754,22 +2929,25 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, - "call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "dev": true, "requires": { - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" } }, - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha512-wzLkDa4K/mzI1OSITC+DUyjgIl/ETNHE9QvYgy6J6Jvqyyz4C0Xfd+lQhb19sX2jMpZV4IssUn0VDVmglV+s4g==", - "dev": true + "call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "requires": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + } }, "caniuse-lite": { "version": "1.0.30001524", @@ -2777,16 +2955,6 @@ "integrity": "sha512-Jj917pJtYg9HSJBF95HVX3Cdr89JUyLT4IZ8SvM5aDRni95swKgYi3TgYLH5hnGfPE/U1dg6IfZ50UsIlLkwSA==", "dev": true }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha512-Baz3aNe2gd2LP2qk5U+sDk/m4oSuwSDcBfayTCTBoWpfIGO5XFxPmjILQII4NGiZjD6DoDI6kf7gKaxkf7s3VQ==", - "dev": true, - "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - } - }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -2823,26 +2991,6 @@ "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", "dev": true }, - "clean-css": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz", - "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", - "dev": true, - "requires": { - "source-map": "~0.6.0" - } - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha512-GIOYRizG+TGoc7Wgc1LiOTLare95R3mzKgoln+Q/lE4ceiYH19gUpl0l0Ffq4lJDEf3FxujMe6IBfOCs7pfqNA==", - "dev": true, - "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - } - }, "clone-deep": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", @@ -2882,22 +3030,68 @@ "dev": true }, "constantinople": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.1.2.tgz", - "integrity": "sha512-yePcBqEFhLOqSBtwYOGGS1exHo/s1xjekXiinh4itpNQGCu4KA1euPh1fg07N2wMITZXQkBz75Ntdt1ctGZouw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-4.0.1.tgz", + "integrity": "sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==", "dev": true, "requires": { - "@types/babel-types": "^7.0.0", - "@types/babylon": "^6.16.2", - "babel-types": "^6.26.0", - "babylon": "^6.18.0" + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.1" } }, - "core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "dev": true + "copy-webpack-plugin": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-13.0.0.tgz", + "integrity": "sha512-FgR/h5a6hzJqATDGd9YG41SeDViH+0bkHn6WNXCi5zKAZkeESeSxLySSsFLHqLEVCh0E+rITmCf0dusXWYukeQ==", + "dev": true, + "requires": { + "glob-parent": "^6.0.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.2.0", + "serialize-javascript": "^6.0.2", + "tinyglobby": "^0.2.12" + }, + "dependencies": { + "ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "schema-utils": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", + "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + } + } + } }, "cross-spawn": { "version": "7.0.3", @@ -2910,29 +3104,23 @@ "which": "^2.0.1" } }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true - }, - "define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", - "dev": true, - "requires": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - } - }, "doctypes": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", "integrity": "sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==", "dev": true }, + "dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "requires": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + } + }, "electron-to-chromium": { "version": "1.4.503", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.503.tgz", @@ -2946,9 +3134,9 @@ "dev": true }, "enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "version": "5.18.2", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.2.tgz", + "integrity": "sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==", "dev": true, "requires": { "graceful-fs": "^4.2.4", @@ -2961,12 +3149,33 @@ "integrity": "sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw==", "dev": true }, + "es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true + }, + "es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true + }, "es-module-lexer": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", "dev": true }, + "es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "requires": { + "es-errors": "^1.3.0" + } + }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -3006,12 +3215,6 @@ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, "events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", @@ -3030,12 +3233,24 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, + "fast-uri": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "dev": true + }, "fastest-levenshtein": { "version": "1.0.16", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", "dev": true }, + "fdir": { + "version": "6.4.6", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", + "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", + "dev": true + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -3062,15 +3277,40 @@ "dev": true }, "get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dev": true, "requires": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + } + }, + "get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "requires": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + } + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" } }, "glob-to-regexp": { @@ -3080,13 +3320,10 @@ "dev": true }, "gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.3" - } + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true }, "graceful-fs": { "version": "4.2.11", @@ -3109,40 +3346,25 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", - "dev": true, - "requires": { - "get-intrinsic": "^1.2.2" - } - }, - "has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true - }, "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true }, "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "requires": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" } }, "hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, "requires": { "function-bind": "^1.1.2" @@ -3164,12 +3386,6 @@ "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", "dev": true }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, "is-core-module": { "version": "2.13.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", @@ -3180,13 +3396,28 @@ } }, "is-expression": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-3.0.0.tgz", - "integrity": "sha512-vyMeQMq+AiH5uUnoBfMTwf18tO3bM6k1QXBE9D6ueAAquEfCZe3AJPtud9g6qS0+4X8xA7ndpZiDyeb2l2qOBw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-4.0.0.tgz", + "integrity": "sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "object-assign": "^4.1.1" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "requires": { - "acorn": "~4.0.2", - "object-assign": "^4.0.1" + "is-extglob": "^2.1.1" } }, "is-number": { @@ -3211,13 +3442,15 @@ "dev": true }, "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" } }, "isexe": { @@ -3286,12 +3519,6 @@ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==", - "dev": true - }, "loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", @@ -3318,18 +3545,6 @@ "p-locate": "^4.1.0" } }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha512-k+yt5n3l48JU4k8ftnKG6V7u32wyH2NfKzeMto9F/QRE0amxy/LayxwlvjjkZEIzqR+19IrtFO8p5kB9QaYUFg==", - "dev": true - }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -3339,6 +3554,12 @@ "yallist": "^4.0.0" } }, + "math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true + }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -3388,6 +3609,12 @@ "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", "dev": true }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -3467,98 +3694,120 @@ } }, "pug": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pug/-/pug-2.0.4.tgz", - "integrity": "sha512-XhoaDlvi6NIzL49nu094R2NA6P37ijtgMDuWE+ofekDChvfKnzFal60bhSdiy8y2PBO6fmz3oMEIcfpBVRUdvw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pug/-/pug-3.0.3.tgz", + "integrity": "sha512-uBi6kmc9f3SZ3PXxqcHiUZLmIXgfgWooKWXcwSGwQd2Zi5Rb0bT14+8CJjJgI8AB+nndLaNgHGrcc6bPIB665g==", "dev": true, "requires": { - "pug-code-gen": "^2.0.2", - "pug-filters": "^3.1.1", - "pug-lexer": "^4.1.0", - "pug-linker": "^3.0.6", - "pug-load": "^2.0.12", - "pug-parser": "^5.0.1", - "pug-runtime": "^2.0.5", - "pug-strip-comments": "^1.0.4" + "pug-code-gen": "^3.0.3", + "pug-filters": "^4.0.0", + "pug-lexer": "^5.0.1", + "pug-linker": "^4.0.0", + "pug-load": "^3.0.0", + "pug-parser": "^6.0.0", + "pug-runtime": "^3.0.1", + "pug-strip-comments": "^2.0.0" } }, "pug-attrs": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-2.0.4.tgz", - "integrity": "sha512-TaZ4Z2TWUPDJcV3wjU3RtUXMrd3kM4Wzjbe3EWnSsZPsJ3LDI0F3yCnf2/W7PPFF+edUFQ0HgDL1IoxSz5K8EQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-3.0.0.tgz", + "integrity": "sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==", "dev": true, "requires": { - "constantinople": "^3.0.1", - "js-stringify": "^1.0.1", - "pug-runtime": "^2.0.5" + "constantinople": "^4.0.1", + "js-stringify": "^1.0.2", + "pug-runtime": "^3.0.0" } }, "pug-code-gen": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-2.0.3.tgz", - "integrity": "sha512-r9sezXdDuZJfW9J91TN/2LFbiqDhmltTFmGpHTsGdrNGp3p4SxAjjXEfnuK2e4ywYsRIVP0NeLbSAMHUcaX1EA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-3.0.3.tgz", + "integrity": "sha512-cYQg0JW0w32Ux+XTeZnBEeuWrAY7/HNE6TWnhiHGnnRYlCgyAUPoyh9KzCMa9WhcJlJ1AtQqpEYHc+vbCzA+Aw==", "dev": true, "requires": { - "constantinople": "^3.1.2", + "constantinople": "^4.0.1", "doctypes": "^1.1.0", - "js-stringify": "^1.0.1", - "pug-attrs": "^2.0.4", - "pug-error": "^1.3.3", - "pug-runtime": "^2.0.5", - "void-elements": "^2.0.1", - "with": "^5.0.0" + "js-stringify": "^1.0.2", + "pug-attrs": "^3.0.0", + "pug-error": "^2.1.0", + "pug-runtime": "^3.0.1", + "void-elements": "^3.1.0", + "with": "^7.0.0" } }, "pug-error": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-1.3.3.tgz", - "integrity": "sha512-qE3YhESP2mRAWMFJgKdtT5D7ckThRScXRwkfo+Erqga7dyJdY3ZquspprMCj/9sJ2ijm5hXFWQE/A3l4poMWiQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-2.1.0.tgz", + "integrity": "sha512-lv7sU9e5Jk8IeUheHata6/UThZ7RK2jnaaNztxfPYUY+VxZyk/ePVaNZ/vwmH8WqGvDz3LrNYt/+gA55NDg6Pg==", "dev": true }, "pug-filters": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-3.1.1.tgz", - "integrity": "sha512-lFfjNyGEyVWC4BwX0WyvkoWLapI5xHSM3xZJFUhx4JM4XyyRdO8Aucc6pCygnqV2uSgJFaJWW3Ft1wCWSoQkQg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-4.0.0.tgz", + "integrity": "sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==", "dev": true, "requires": { - "clean-css": "^4.1.11", - "constantinople": "^3.0.1", + "constantinople": "^4.0.1", "jstransformer": "1.0.0", - "pug-error": "^1.3.3", - "pug-walk": "^1.1.8", - "resolve": "^1.1.6", - "uglify-js": "^2.6.1" + "pug-error": "^2.0.0", + "pug-walk": "^2.0.0", + "resolve": "^1.15.1" + }, + "dependencies": { + "pug-walk": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-2.0.0.tgz", + "integrity": "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==", + "dev": true + } } }, "pug-lexer": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-4.1.0.tgz", - "integrity": "sha512-i55yzEBtjm0mlplW4LoANq7k3S8gDdfC6+LThGEvsK4FuobcKfDAwt6V4jKPH9RtiE3a2Akfg5UpafZ1OksaPA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-5.0.1.tgz", + "integrity": "sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==", "dev": true, "requires": { - "character-parser": "^2.1.1", - "is-expression": "^3.0.0", - "pug-error": "^1.3.3" + "character-parser": "^2.2.0", + "is-expression": "^4.0.0", + "pug-error": "^2.0.0" } }, "pug-linker": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-3.0.6.tgz", - "integrity": "sha512-bagfuHttfQOpANGy1Y6NJ+0mNb7dD2MswFG2ZKj22s8g0wVsojpRlqveEQHmgXXcfROB2RT6oqbPYr9EN2ZWzg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-4.0.0.tgz", + "integrity": "sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==", "dev": true, "requires": { - "pug-error": "^1.3.3", - "pug-walk": "^1.1.8" + "pug-error": "^2.0.0", + "pug-walk": "^2.0.0" + }, + "dependencies": { + "pug-walk": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-2.0.0.tgz", + "integrity": "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==", + "dev": true + } } }, "pug-load": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-2.0.12.tgz", - "integrity": "sha512-UqpgGpyyXRYgJs/X60sE6SIf8UBsmcHYKNaOccyVLEuT6OPBIMo6xMPhoJnqtB3Q3BbO4Z3Bjz5qDsUWh4rXsg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-3.0.0.tgz", + "integrity": "sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==", "dev": true, "requires": { - "object-assign": "^4.1.0", - "pug-walk": "^1.1.8" + "object-assign": "^4.1.1", + "pug-walk": "^2.0.0" + }, + "dependencies": { + "pug-walk": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-2.0.0.tgz", + "integrity": "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==", + "dev": true + } } }, "pug-loader": { @@ -3573,28 +3822,28 @@ } }, "pug-parser": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-5.0.1.tgz", - "integrity": "sha512-nGHqK+w07p5/PsPIyzkTQfzlYfuqoiGjaoqHv1LjOv2ZLXmGX1O+4Vcvps+P4LhxZ3drYSljjq4b+Naid126wA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-6.0.0.tgz", + "integrity": "sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==", "dev": true, "requires": { - "pug-error": "^1.3.3", - "token-stream": "0.0.1" + "pug-error": "^2.0.0", + "token-stream": "1.0.0" } }, "pug-runtime": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-2.0.5.tgz", - "integrity": "sha512-P+rXKn9un4fQY77wtpcuFyvFaBww7/91f3jHa154qU26qFAnOe6SW1CbIDcxiG5lLK9HazYrMCCuDvNgDQNptw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-3.0.1.tgz", + "integrity": "sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg==", "dev": true }, "pug-strip-comments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-1.0.4.tgz", - "integrity": "sha512-i5j/9CS4yFhSxHp5iKPHwigaig/VV9g+FgReLJWWHEHbvKsbqL0oP/K5ubuLco6Wu3Kan5p7u7qk8A4oLLh6vw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz", + "integrity": "sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==", "dev": true, "requires": { - "pug-error": "^1.3.3" + "pug-error": "^2.0.0" } }, "pug-walk": { @@ -3604,9 +3853,9 @@ "dev": true }, "punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true }, "randombytes": { @@ -3627,16 +3876,10 @@ "resolve": "^1.9.0" } }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true }, "resolve": { @@ -3665,15 +3908,6 @@ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha512-yqINtL/G7vs2v+dFIZmFUDbnVyFUJFKd6gK22Kgo6R4jfJGFtisKyncWDDULgjfqf4ASQuIQyjJ7XZ+3aWpsAg==", - "dev": true, - "requires": { - "align-text": "^0.1.1" - } - }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -3701,27 +3935,14 @@ } }, "serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, "requires": { "randombytes": "^2.1.0" } }, - "set-function-length": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz", - "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==", - "dev": true, - "requires": { - "define-data-property": "^1.1.1", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.2", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.1" - } - }, "shallow-clone": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", @@ -3784,43 +4005,96 @@ "dev": true }, "terser": { - "version": "5.19.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz", - "integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==", + "version": "5.43.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz", + "integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==", "dev": true, "requires": { "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", + "acorn": "^8.14.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "dependencies": { "acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true } } }, "terser-webpack-plugin": { - "version": "5.3.9", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", - "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "version": "5.3.14", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", + "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", "dev": true, "requires": { - "@jridgewell/trace-mapping": "^0.3.17", + "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.16.8" + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" + }, + "dependencies": { + "ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "schema-utils": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", + "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + } + } } }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha512-lxrWP8ejsq+7E3nNjwYmUBMAgjMTZoTI+sdBOpvNyijeDLa29LUn9QaoXAHv4+Z578hbmHHJKZknzxVtvo77og==", - "dev": true + "tinyglobby": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "dev": true, + "requires": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "dependencies": { + "picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true + } + } }, "to-regex-range": { "version": "5.0.1", @@ -3832,9 +4106,9 @@ } }, "token-stream": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-0.0.1.tgz", - "integrity": "sha512-nfjOAu/zAWmX9tgwi5NRp7O7zTDUD1miHiB40klUnAh9qnL1iXdgzcz/i5dMaL5jahcBAaSfmNOBBJBLJW8TEg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-1.0.0.tgz", + "integrity": "sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==", "dev": true }, "ts-loader": { @@ -3864,31 +4138,11 @@ "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", "dev": true }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha512-qLq/4y2pjcU3vhlhseXGGJ7VbFO4pBANu0kwl8VCa9KEI0V8VfZIx2Fy3w01iSTA/pGwKZSmu/+I4etLNDdt5w==", - "dev": true, - "requires": { - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true - } - } - }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha512-vb2s1lYx2xBtUgy+ta+b2J/GLVUR+wmpINwHePmPRhOsIVCG2wDzKJ0n14GslH1BifsqVzSOwQhRaCAsZ/nI4Q==", - "dev": true, - "optional": true + "undici-types": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz", + "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==", + "dev": true }, "update-browserslist-db": { "version": "1.0.11", @@ -3910,15 +4164,15 @@ } }, "void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", - "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", + "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", "dev": true }, "watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", + "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", "dev": true, "requires": { "glob-to-regexp": "^0.4.1", @@ -3926,49 +4180,47 @@ } }, "webpack": { - "version": "5.88.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", - "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", + "version": "5.94.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", + "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", "dev": true, "requires": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.14.5", + "acorn-import-attributes": "^1.9.5", + "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", + "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", - "watchpack": "^2.4.0", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, "dependencies": { "acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true }, - "acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "dev": true, - "requires": {} + "acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "dev": true } } }, @@ -4031,53 +4283,23 @@ "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", "dev": true }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha512-1pTPQDKTdd61ozlKGNCjhNRd+KPmgLSGa3mZTHoOliaGcESD8G1PXhh7c1fgiPjVbNVfgy2Faw4BI8/m0cC8Mg==", - "dev": true - }, "with": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/with/-/with-5.1.1.tgz", - "integrity": "sha512-uAnSsFGfSpF6DNhBXStvlZILfHJfJu4eUkfbRGk94kGO1Ta7bg6FwfvoOhhyHAJuFbCw+0xk4uJ3u57jLvlCJg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/with/-/with-7.0.2.tgz", + "integrity": "sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==", "dev": true, "requires": { - "acorn": "^3.1.0", - "acorn-globals": "^3.0.0" - }, - "dependencies": { - "acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha512-OLUyIIZ7mF5oaAUT1w0TFqQS81q3saT46x8t7ukpPjMNk+nbs4ZHhs7ToV8EWnLYLepjETXd4XaCE4uxkMeqUw==", - "dev": true - } + "@babel/parser": "^7.9.6", + "@babel/types": "^7.9.6", + "assert-never": "^1.2.1", + "babel-walk": "3.0.0-canary-5" } }, - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha512-xSBsCeh+g+dinoBv3GAOWM4LcVVO68wLXRanibtBSdUvkGWQRGeE9P7IwU9EmDDi4jA6L44lz15CGMwdw9N5+Q==", - "dev": true - }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha512-QFzUah88GAGy9lyDKGBqZdkYApt63rCXYBGYnEP4xDJPXNqXXnBDACnbrXnViV6jRSqAePwrATi2i8mfYm4L1A==", - "dev": true, - "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - } } } } diff --git a/package.json b/package.json index a9d5c3e..12697ef 100644 --- a/package.json +++ b/package.json @@ -1,10 +1,12 @@ { "name": "reckue-lang", - "version": "0.5.7", + "version": "0.6.0", "description": "Vacabulary Assistant helps you effortlessly build and organize your vocabulary while browsing the web.", "main": "index.js", "scripts": { - "build": "webpack --config webpack.config.js" + "build": "webpack --config webpack.config.js", + "dev": "webpack --config webpack.dev.config.js", + "build:prod": "webpack --config webpack.config.js --mode production" }, "repository": { "type": "git", @@ -18,6 +20,7 @@ "homepage": "https://github.com/Reckue/terms-plugin#readme", "devDependencies": { "apply-loader": "^2.0.0", + "copy-webpack-plugin": "^13.0.0", "pug": "3.0.3", "pug-loader": "^2.4.0", "ts-loader": "^9.5.1", diff --git a/src/api-page.ts b/src/api-page.ts new file mode 100644 index 0000000..9351575 --- /dev/null +++ b/src/api-page.ts @@ -0,0 +1,6 @@ +import {ApiApp} from "./core/ApiApp"; +import {ApiPageService} from "./page/ApiPageService"; + +const service = new ApiPageService(); +const app = new ApiApp(service); +app.start(); \ No newline at end of file diff --git a/src/api-popup.ts b/src/api-popup.ts new file mode 100644 index 0000000..f261134 --- /dev/null +++ b/src/api-popup.ts @@ -0,0 +1,6 @@ +import {ApiApp} from "./core/ApiApp.js"; +import {ApiPopupService} from "./popup/ApiPopupService.js"; + +const service = new ApiPopupService(); +const app = new ApiApp(service); +app.start(); \ No newline at end of file diff --git a/src/core/ApiApp.js b/src/core/ApiApp.js new file mode 100644 index 0000000..1138345 --- /dev/null +++ b/src/core/ApiApp.js @@ -0,0 +1,33 @@ +import {ApiWordbookService} from "./words/ApiWordbookService.js"; +import {Context} from "./Context"; + +export class ApiApp { + + #context; + #wordbookService; + #logicService; + + constructor(logicService) { + this.#context = new Context(); + this.#logicService = logicService; + this.#wordbookService = new ApiWordbookService(); + } + + start = async () => { + // Инициализируем API сервис + const isInitialized = await this.#wordbookService.initialize(); + + if (isInitialized) { + this.#wordbookService.executeAfter(this.#runService); + await this.#wordbookService.loadWords(); + } else { + // Если API недоступен, запускаем логику без инициализации + this.#runService(); + } + } + + #runService = () => { + Context.add("wordbook", this.#wordbookService); + this.#logicService.run(); + } +} \ No newline at end of file diff --git a/src/core/ApiStore.js b/src/core/ApiStore.js new file mode 100644 index 0000000..4373b8b --- /dev/null +++ b/src/core/ApiStore.js @@ -0,0 +1,62 @@ +import {Context} from "./Context"; +import {ApiService} from "./api/ApiService"; + +export class ApiStore { + + #apiService; + + constructor() { + this.#apiService = new ApiService(); + } + + appParams = () => { + return new Promise(async (resolve) => { + try { + // Проверяем авторизацию + const isAuth = await this.#apiService.ensureAuth(); + + // Загружаем настройки из localStorage (для совместимости) + chrome.storage.local.get(['enable', "russian", "english", "china", "korean"], (app) => { + Context.add("settings", app); + resolve(app.enable); + }); + } catch (error) { + // В случае ошибки API, используем локальные настройки + chrome.storage.local.get(['enable', "russian", "english", "china", "korean"], (app) => { + Context.add("settings", app); + resolve(app.enable); + }); + } + }); + } + + saveWordbooks = (wordbooks) => { + // Для совместимости сохраняем в localStorage + chrome.storage.local.set(wordbooks); + } + + getByName = (name) => { + return new Promise(resolve => chrome.storage.local.get([name], (app) => resolve(app[name]))); + } + + /** + * Получает API сервис + */ + getApiService = () => { + return this.#apiService; + } + + /** + * Проверяет авторизацию + */ + ensureAuth = async () => { + return await this.#apiService.ensureAuth(); + } + + /** + * Получает текущего пользователя + */ + getCurrentUser = async () => { + return await this.#apiService.getCurrentUser(); + } +} \ No newline at end of file diff --git a/src/core/api/ApiService.js b/src/core/api/ApiService.js new file mode 100644 index 0000000..266720e --- /dev/null +++ b/src/core/api/ApiService.js @@ -0,0 +1,263 @@ +import {Logger} from "../Logger"; + +export class ApiService { + #baseUrl = 'https://api.reckue.com/api/1'; + #tempToken = null; + #logger = new Logger(); + + constructor() { + this.#loadTempToken(); + } + + /** + * Загружает временный токен из localStorage + */ + #loadTempToken = () => { + this.#tempToken = localStorage.getItem('reckue_temp_token'); + } + + /** + * Сохраняет временный токен в localStorage + */ + #saveTempToken = (token) => { + this.#tempToken = token; + localStorage.setItem('reckue_temp_token', token); + } + + /** + * Выполняет HTTP запрос с авторизацией + */ + #request = async (endpoint, options = {}) => { + const url = `${this.#baseUrl}${endpoint}`; + const headers = { + 'Content-Type': 'application/json', + ...options.headers + }; + + if (this.#tempToken) { + headers['Authorization'] = `Bearer ${this.#tempToken}`; + } + + try { + const response = await fetch(url, { + ...options, + headers + }); + + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + + return await response.json(); + } catch (error) { + this.#logger.log(`API request failed: ${error.message}`); + throw error; + } + } + + /** + * Авторизация через temp-in + */ + tempAuth = async () => { + try { + const response = await this.#request('/auth/tempin', { + method: 'POST', + body: JSON.stringify({}) + }); + + if (response.token) { + this.#saveTempToken(response.token); + this.#logger.log('Temporary authentication successful'); + return true; + } + return false; + } catch (error) { + this.#logger.log('Temporary authentication failed'); + return false; + } + } + + /** + * Получение информации о текущем пользователе + */ + getCurrentUser = async () => { + try { + return await this.#request('/auth/whoami'); + } catch (error) { + this.#logger.log('Failed to get current user'); + return null; + } + } + + /** + * Получение всех словарей пользователя + */ + getWordbooks = async () => { + try { + return await this.#request('/wordbooks'); + } catch (error) { + this.#logger.log('Failed to get wordbooks'); + return []; + } + } + + /** + * Получение основного словаря + */ + getMainWordbook = async () => { + try { + return await this.#request('/wordbooks/main'); + } catch (error) { + this.#logger.log('Failed to get main wordbook'); + return null; + } + } + + /** + * Получение слов из словаря с пагинацией + */ + getWords = async (wordbookId, page = 0, size = 50, filter = '') => { + try { + const body = { + page: page, + size: size + }; + + if (filter) { + body.filter = filter; + } + + return await this.#request(`/wordbook/words/${wordbookId}`, { + method: 'POST', + body: JSON.stringify(body) + }); + } catch (error) { + this.#logger.log('Failed to get words'); + return { content: [], totalElements: 0 }; + } + } + + /** + * Добавление слова в словарь + */ + addWord = async (wordbookId, word, level = 1) => { + try { + return await this.#request('/wordbook/words', { + method: 'POST', + body: JSON.stringify({ + wordbookId: wordbookId, + word: word, + level: level + }) + }); + } catch (error) { + this.#logger.log('Failed to add word'); + return null; + } + } + + /** + * Добавление списка слов + */ + addWordsList = async (wordbookId, words) => { + try { + const wordsList = words.map(word => ({ + wordbookId: wordbookId, + word: word.word || word, + level: word.level || 1 + })); + + return await this.#request('/wordbook/words/list', { + method: 'POST', + body: JSON.stringify(wordsList) + }); + } catch (error) { + this.#logger.log('Failed to add words list'); + return null; + } + } + + /** + * Обновление уровня слова + */ + updateWordLevel = async (wordbookId, wordId, level) => { + try { + return await this.#request('/wordbook/words/levels', { + method: 'POST', + body: JSON.stringify({ + wordbookId: wordbookId, + wordId: wordId, + level: level + }) + }); + } catch (error) { + this.#logger.log('Failed to update word level'); + return null; + } + } + + /** + * Удаление слова + */ + deleteWord = async (wordbookId, wordId) => { + try { + return await this.#request('/wordbook/words', { + method: 'DELETE', + body: JSON.stringify({ + wordbookId: wordbookId, + wordId: wordId + }) + }); + } catch (error) { + this.#logger.log('Failed to delete word'); + return null; + } + } + + /** + * Создание нового словаря + */ + createWordbook = async (language) => { + try { + return await this.#request('/wordbooks', { + method: 'POST', + body: JSON.stringify({ + language: language + }) + }); + } catch (error) { + this.#logger.log('Failed to create wordbook'); + return null; + } + } + + /** + * Получение словарей по языку + */ + getWordbooksByLanguage = async (language) => { + try { + return await this.#request(`/wordbooks/language/${language}`); + } catch (error) { + this.#logger.log('Failed to get wordbooks by language'); + return []; + } + } + + /** + * Проверка авторизации и автоматическая авторизация при необходимости + */ + ensureAuth = async () => { + if (!this.#tempToken) { + return await this.tempAuth(); + } + + // Проверяем, что токен еще действителен + try { + await this.getCurrentUser(); + return true; + } catch (error) { + // Токен истек, получаем новый + return await this.tempAuth(); + } + } +} \ No newline at end of file diff --git a/src/core/words/ApiWordbookService.js b/src/core/words/ApiWordbookService.js new file mode 100644 index 0000000..e07e483 --- /dev/null +++ b/src/core/words/ApiWordbookService.js @@ -0,0 +1,280 @@ +import {Logger} from "../Logger"; +import {ApiService} from "../api/ApiService"; +import {Wordbook} from "./Wordbook"; + +export class ApiWordbookService { + + #apiService; + #logger; + #wordbook; + #currentWordbookId; + #executeAfter; + + executeAfter = (after) => { + this.#executeAfter = after; + } + + constructor() { + this.#apiService = new ApiService(); + this.#logger = new Logger(); + this.#wordbook = new Wordbook(); + } + + /** + * Инициализация сервиса с авторизацией + */ + initialize = async () => { + try { + const isAuth = await this.#apiService.ensureAuth(); + if (!isAuth) { + this.#logger.log('Failed to authenticate with API'); + return false; + } + + // Получаем основной словарь + const mainWordbook = await this.#apiService.getMainWordbook(); + if (mainWordbook) { + this.#currentWordbookId = mainWordbook.id; + this.#logger.log(`Using main wordbook: ${this.#currentWordbookId}`); + } else { + // Если основного словаря нет, создаем его + const newWordbook = await this.#apiService.createWordbook('ENGLISH'); + if (newWordbook) { + this.#currentWordbookId = newWordbook.id; + this.#logger.log(`Created new wordbook: ${this.#currentWordbookId}`); + } + } + + return true; + } catch (error) { + this.#logger.log('Failed to initialize API wordbook service'); + return false; + } + } + + /** + * Загружает слова из API + */ + loadWords = async () => { + if (!this.#currentWordbookId) { + this.#logger.log('No wordbook ID available'); + if (this.#executeAfter) { + this.#executeAfter(); + } + return; + } + + try { + let page = 0; + const allWords = []; + + while (true) { + const response = await this.#apiService.getWords(this.#currentWordbookId, page, 50); + + if (!response.content || response.content.length === 0) { + break; + } + + // Преобразуем формат слов для совместимости с Wordbook + const words = response.content.map(word => ({ + word: word.word, + level: word.level || 1 + })); + + allWords.push(...words); + + if (response.content.length < 50) { + break; + } + + page++; + } + + this.set(allWords); + this.#logger.log(`Loaded ${allWords.length} words from API`); + + if (this.#executeAfter) { + this.#executeAfter(); + } + } catch (error) { + this.#logger.log('Failed to load words from API'); + if (this.#executeAfter) { + this.#executeAfter(); + } + } + } + + /** + * Устанавливает слова в wordbook + */ + set = (words) => { + this.#wordbook.set(words); + } + + /** + * Добавляет слово в API и локальный wordbook + */ + addWord = async (word, level = 1) => { + if (!this.#currentWordbookId) { + this.#logger.log('No wordbook ID available for adding word'); + return false; + } + + try { + const result = await this.#apiService.addWord(this.#currentWordbookId, word, level); + if (result) { + // Добавляем в локальный wordbook + this.#wordbook.set([{word, level}]); + this.#logger.log(`Added word to API: ${word}`); + return true; + } + return false; + } catch (error) { + this.#logger.log(`Failed to add word to API: ${word}`); + return false; + } + } + + /** + * Добавляет список слов в API + */ + addWordsList = async (words) => { + if (!this.#currentWordbookId) { + this.#logger.log('No wordbook ID available for adding words list'); + return false; + } + + try { + const result = await this.#apiService.addWordsList(this.#currentWordbookId, words); + if (result) { + // Добавляем в локальный wordbook + this.#wordbook.set(words); + this.#logger.log(`Added ${words.length} words to API`); + return true; + } + return false; + } catch (error) { + this.#logger.log('Failed to add words list to API'); + return false; + } + } + + /** + * Удаляет слово из API и локального wordbook + */ + remove = async (word) => { + if (!this.#currentWordbookId) { + this.#logger.log('No wordbook ID available for removing word'); + return false; + } + + try { + // Находим wordId для удаления + const words = await this.#apiService.getWords(this.#currentWordbookId, 0, 1000, word); + const wordToDelete = words.content.find(w => w.word === word); + + if (wordToDelete) { + const result = await this.#apiService.deleteWord(this.#currentWordbookId, wordToDelete.id); + if (result) { + this.#wordbook.remove(word); + this.#logger.log(`Removed word from API: ${word}`); + return true; + } + } + return false; + } catch (error) { + this.#logger.log(`Failed to remove word from API: ${word}`); + return false; + } + } + + /** + * Обновляет уровень слова в API + */ + updateWordLevel = async (word, level) => { + if (!this.#currentWordbookId) { + this.#logger.log('No wordbook ID available for updating word level'); + return false; + } + + try { + // Находим wordId для обновления + const words = await this.#apiService.getWords(this.#currentWordbookId, 0, 1000, word); + const wordToUpdate = words.content.find(w => w.word === word); + + if (wordToUpdate) { + const result = await this.#apiService.updateWordLevel(this.#currentWordbookId, wordToUpdate.id, level); + if (result) { + // Обновляем в локальном wordbook + this.#wordbook.remove(word); + this.#wordbook.set([{word, level}]); + this.#logger.log(`Updated word level in API: ${word} -> ${level}`); + return true; + } + } + return false; + } catch (error) { + this.#logger.log(`Failed to update word level in API: ${word}`); + return false; + } + } + + /** + * Получает wordbook + */ + getWordbook = () => { + return this.#wordbook; + } + + /** + * Получает отфильтрованный wordbook + */ + getFilteredWordbook = (filter) => { + const filtered = []; + this.#wordbook.get().forEach((level, word) => word && word.includes(filter) && filtered.push({word, level})); + const wordbook = new Wordbook(); + wordbook.set(filtered); + return wordbook; + } + + /** + * Получает кэш wordbook + */ + getWordbookCache = () => { + return this.#wordbook.get(); + } + + /** + * Загружает словари (совместимость со старым API) + */ + loadWordbooks = async () => { + await this.loadWords(); + } + + /** + * Получает текущий ID словаря + */ + getCurrentWordbookId = () => { + return this.#currentWordbookId; + } + + /** + * Устанавливает текущий словарь + */ + setCurrentWordbook = async (wordbookId) => { + this.#currentWordbookId = wordbookId; + await this.loadWords(); + } + + /** + * Получает все словари пользователя + */ + getUserWordbooks = async () => { + try { + return await this.#apiService.getWordbooks(); + } catch (error) { + this.#logger.log('Failed to get user wordbooks'); + return []; + } + } +} \ No newline at end of file diff --git a/src/page.ts b/src/page.ts.backup similarity index 100% rename from src/page.ts rename to src/page.ts.backup diff --git a/src/page/ApiPageService.ts b/src/page/ApiPageService.ts new file mode 100644 index 0000000..660515e --- /dev/null +++ b/src/page/ApiPageService.ts @@ -0,0 +1,61 @@ +import {ApiStore} from "../core/ApiStore"; +import {Styles} from "./render/styles/Styles"; +import {Context} from "../core/Context"; +import {QueueProcessor} from "./queue/QueueProcessor"; +import {PopupController} from "./block/popup/controllers/PopupController"; +import {PageManager} from "./block/PageManager"; + +export class ApiPageService { + + #styles: Styles; + #storage: ApiStore; + #manager: PageManager; + + constructor() { + this.#storage = new ApiStore(); + this.#styles = new Styles(); + Context.add("menu", new PopupController()); + this.#manager = new PageManager(); + } + + run = async () => { + try { + // Проверяем авторизацию в API + const isAuth = await this.#storage.ensureAuth(); + + this.#storage.appParams().then(enable => { + this.#joinPoint(enable, isAuth); + }); + } catch (error) { + // В случае ошибки API, запускаем в локальном режиме + this.#storage.appParams().then(enable => { + this.#joinPoint(enable, false); + }); + } + } + + /** + * Добавляется в тег head новые css-стили. + * Если доступен парсинг на сервере, делаем на сервере, иначе на локальной машине + */ + #joinPoint = (enable: boolean, isApiAvailable: boolean) => { + if (enable) { + this.#styles.append(); + this.#manager.run(); + + // Добавляем информацию о доступности API в контекст + Context.add("apiAvailable", isApiAvailable); + } + } + + /** + * Устанавливаются настройки языка + * Запускается бесконечный процесс парсинга и рендеринга страницы локально + */ + #old = () => { + Context.add("language", {sl: "en", tl: "ru"}); + const processor = new QueueProcessor(); + processor.runInfinityParsing(); + processor.runInfinityRender(); + } +} \ No newline at end of file diff --git a/src/page/block/NodeManager.ts b/src/page/block/NodeManager.ts index a225bc2..3e0a3ad 100644 --- a/src/page/block/NodeManager.ts +++ b/src/page/block/NodeManager.ts @@ -31,10 +31,13 @@ export class NodeManager { return childNodes; } - getTextNodes = (element: any): Array => { + getTextNodes = (element: any): Array => { const ELEMENT_NODE = 1; const TEXT_NODE = 3; const childNodes = this.getChildNodes(element); + + // Очищаем массив перед новым поиском + this.resultArray = []; for (const elememt of childNodes) { if (elememt.nodeType === TEXT_NODE) { diff --git a/src/page/block/PageManager.ts b/src/page/block/PageManager.ts index b01adbf..e2349fa 100644 --- a/src/page/block/PageManager.ts +++ b/src/page/block/PageManager.ts @@ -36,14 +36,21 @@ export class PageManager { run = () => { const body = document.querySelector('body'); - const textNodeArray: Array = this.nodeManager.getTextNodes(body); + const textNodeArray: Array = this.nodeManager.getTextNodes(body); console.log(textNodeArray) - const cloneArray: Array = textNodeArray.map((el) => { - const {width, height} = el.getBoundingClientRect(); - return this.cloneBlockService.getSize(el, el.textContent, new SizeModel(width, height)); - }); + const cloneArray: Array = textNodeArray.map((node) => { + // Для текстовых узлов нужно получить родительский элемент + const parentElement = node.parentElement; + if (!parentElement) { + console.warn('Parent element not found for text node:', node); + return null; + } + + const {width, height} = parentElement.getBoundingClientRect(); + return this.cloneBlockService.getSize(parentElement, node.textContent, new SizeModel(width, height)); + }).filter(Boolean); // Убираем null значения console.log(cloneArray.length); diff --git a/src/popup.ts b/src/popup.ts.backup similarity index 100% rename from src/popup.ts rename to src/popup.ts.backup diff --git a/src/popup/ApiPopupService.js b/src/popup/ApiPopupService.js new file mode 100644 index 0000000..4339a61 --- /dev/null +++ b/src/popup/ApiPopupService.js @@ -0,0 +1,61 @@ +import {SettingsService} from "./settings/SettingsService"; +import {NavbarBuilder} from "./navbar/NavbarBuilder"; +import {WordbookScroll} from "./scroll/WordbookScroll"; +import {Context} from "../core/Context"; +import {SettingsBuilder} from "./settings/SettingsBuilder"; +import {NavButtons} from "./navbar/NavButtons"; +import {ScrollBuilder} from "./scroll/ScrollBuilder"; +import {InfoBarBuilder} from "./info/InfoBarBuilder"; +import {ApiStore} from "../core/ApiStore"; + +export class ApiPopupService { + + #navbarBuilder; + #settingsBuilder; + #scrollBuilder; + #infoBarBuilder; + #apiStore; + + constructor() { + this.#settingsBuilder = new SettingsBuilder(); + this.#navbarBuilder = new NavbarBuilder(); + this.#scrollBuilder = new ScrollBuilder(); + this.#infoBarBuilder = new InfoBarBuilder(); + this.#apiStore = new ApiStore(); + } + + run = async () => { + try { + // Проверяем авторизацию в API + const isAuth = await this.#apiStore.ensureAuth(); + Context.add("apiAvailable", isAuth); + + if (isAuth) { + // Получаем информацию о пользователе + const user = await this.#apiStore.getCurrentUser(); + Context.add("currentUser", user); + } + } catch (error) { + Context.add("apiAvailable", false); + } + + this.#buildPopupDOM(); + const settings = new SettingsService(); + settings.fillSettings(); + const scroll = new WordbookScroll(); + scroll.fillScroll(0); + this.#setupNavButtons(); + } + + #buildPopupDOM = () => { + this.#navbarBuilder.buildButtons(); + this.#settingsBuilder.buildSettingsContentStructure(); + this.#scrollBuilder.build(); + } + + #setupNavButtons = () => { + const navButtons = new NavButtons(); + navButtons.onClickNavButtons(); + navButtons.checkButtonsAndSetContentVisibility(); + } +} \ No newline at end of file diff --git a/test-api.html b/test-api.html new file mode 100644 index 0000000..53134c4 --- /dev/null +++ b/test-api.html @@ -0,0 +1,90 @@ + + + + + + API Test + + +

Reckue API Test

+
Проверка подключения к API...
+
+
+ + + + \ No newline at end of file diff --git a/webpack.config.js b/webpack.config.js index 6299487..e59a358 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,10 +1,12 @@ const path = require("path"); +const CopyWebpackPlugin = require("copy-webpack-plugin"); module.exports = { - mode: "production", + mode: "development", + devtool: "source-map", entry: { - page: "./src/page.ts", - popup: "./src/popup.ts" + page: "./src/api-page.ts", + popup: "./src/api-popup.ts" }, module: { rules: [ @@ -21,6 +23,15 @@ module.exports = { output: { path: path.resolve(__dirname), filename: "dist/[name]/[name].js" - } -}; - + }, + plugins: [ + new CopyWebpackPlugin({ + patterns: [ + { + from: "dist/popup/popup.html", + to: "dist/popup/popup.html" + } + ] + }) + ] +}; \ No newline at end of file diff --git a/webpack.config.js.backup b/webpack.config.js.backup new file mode 100644 index 0000000..6299487 --- /dev/null +++ b/webpack.config.js.backup @@ -0,0 +1,26 @@ +const path = require("path"); + +module.exports = { + mode: "production", + entry: { + page: "./src/page.ts", + popup: "./src/popup.ts" + }, + module: { + rules: [ + { + test: /\.tsx?$/, + use: 'ts-loader', + exclude: /node_modules/, + }, + ], + }, + resolve: { + extensions: ['.tsx', '.ts', '.js'], + }, + output: { + path: path.resolve(__dirname), + filename: "dist/[name]/[name].js" + } +}; + diff --git a/webpack.dev.config.js b/webpack.dev.config.js new file mode 100644 index 0000000..2d8ac2a --- /dev/null +++ b/webpack.dev.config.js @@ -0,0 +1,37 @@ +const path = require("path"); +const CopyWebpackPlugin = require("copy-webpack-plugin"); + +module.exports = { + mode: "development", + devtool: "source-map", + entry: { + page: "./src/api-page.ts", + popup: "./src/api-popup.ts" + }, + module: { + rules: [ + { + test: /\.tsx?$/, + use: 'ts-loader', + exclude: /node_modules/, + }, + ], + }, + resolve: { + extensions: ['.tsx', '.ts', '.js'], + }, + output: { + path: path.resolve(__dirname), + filename: "dist/[name]/[name].js" + }, + plugins: [ + new CopyWebpackPlugin({ + patterns: [ + { + from: "dist/popup/popup.html", + to: "dist/popup/popup.html" + } + ] + }) + ] +}; \ No newline at end of file