diff --git a/README.md b/README.md new file mode 100644 index 0000000..7f223e6 --- /dev/null +++ b/README.md @@ -0,0 +1,4 @@ +### Build +``` +npm run build +``` \ No newline at end of file diff --git a/auto_cart.html b/auto_cart.html new file mode 100644 index 0000000..f612b09 --- /dev/null +++ b/auto_cart.html @@ -0,0 +1 @@ +Автокорзина

Автокорзина

Собираем продукты под ваши настройки

Ваша корзина на -
84 товара • 12 020 ₽
    Показать ещё - товаров

    Настройте корзину под себя

    Чем больше вы расскажете, тем точнее будет подбор

    📅
    На сколько дней собираем корзину?
    👤
    Кто будет есть?
    2 человека
    Добавить человека +
    ❤️
    Предпочтения
    Категории продуктов

    Выберите группы продуктов, которые хотите видеть в корзине

    \ No newline at end of file diff --git a/autocart.js b/autocart.js new file mode 100644 index 0000000..599f812 --- /dev/null +++ b/autocart.js @@ -0,0 +1 @@ +const _0x53b88d=_0x5445;(function(_0x417d9c,_0x32e292){const _0x58c073=_0x5445,_0x4dea6b=_0x417d9c();while(!![]){try{const _0x565155=parseInt(_0x58c073(0x146))/0x1*(parseInt(_0x58c073(0xe6))/0x2)+-parseInt(_0x58c073(0x183))/0x3*(parseInt(_0x58c073(0x10a))/0x4)+-parseInt(_0x58c073(0xee))/0x5*(parseInt(_0x58c073(0x16e))/0x6)+parseInt(_0x58c073(0x16f))/0x7+-parseInt(_0x58c073(0xf3))/0x8+parseInt(_0x58c073(0x16b))/0x9+-parseInt(_0x58c073(0x118))/0xa;if(_0x565155===_0x32e292)break;else _0x4dea6b['push'](_0x4dea6b['shift']());}catch(_0xe98ec4){_0x4dea6b['push'](_0x4dea6b['shift']());}}}(_0x50d2,0xbc9ee));function _0x50d2(){const _0x4cc02a=['forEach','.cart-footer','\x22>×\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','textContent','/api/guest/init_cookie?utm_source=hvatilo_promo','round','.tag','https://hvatilo.ru','\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','include','slice','{SIZE}','дней','.days-options\x20.day-btn',',\x20точность\x20','findIndex','Пожалуйста,\x20введите\x20имя.','#personModal\x20.autocomplete-list[data-type=\x22','hidden','/api/promo/get_initial_data','need_refresh','товаров','push','#personModal\x20.pref-input','log','.accordion-header','человека','currency','className','querySelectorAll','avoid','clear','payload','offsetHeight','setItem','inputName','cookie-popup','#personModal\x20.tags-wrap','classList','index','Возраст\x20должен\x20быть\x20от\x207\x20лет.','active','total-price','cart','maxHeight','resize','scroll-wrapper','application/json','show','replace','flex','from','Редактировать\x20человека','48338QSThBR','\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','reject','cookie_accepted','true','modalTitle','.day-btn','url','65KDsKpI','has','json','дня','catch','1224232bfKnVz','.show-more','cookie-accept','input','click','value','trim','reduce','RUB','\x22\x20alt=\x22\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','.cart-summary','flat','.subtitle','open','createElement','#personModal\x20.tags-wrap[data-target=\x22avoid\x22]','inputWeight','chunk','.reorder-btn','.menu-replace','style','precision','error_message','588HEXSyH','товар','closest','name','.menu-remove','family-list','type','/api/promo/set_option','DOMContentLoaded','stopPropagation','auto','\x22>⋮\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20
      \x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Заменить\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Удалить\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20
    \x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','now','waiting','6641040pcKdVR','.gender-btn[data-gender=\x22m\x22]','dataset','category','cart-item','total_price','500px','users','.menu-btn-wrapper','.menu-btn','closeModalBtn','display','.gender-btn','excess','.col-left','remove','initial_groups','\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','stringify','.gender-btn.active','toLowerCase','.cart-item','/api/guest/clear_cookie','overflowY','height','weight','top','splice','map','unit','товара','/api/promo/delete_item','.menu-dropdown.active','collapsed','getBoundingClientRect','family-desc','gender','\x20×\x20','innerHeight','apply','children','toggle','image','none','leading','category-btn\x20','5iszkJH','expand-categories','add','status','.family-member','filter','inputAge','show-more-btn','#personModal\x20.tags-wrap[data-target=\x22','categories','family-member','button','querySelector','appendChild','.summary-days','personModal','isArray','addMemberBtn','\x20шт','inputHeight','65,fit','день','location','div','then','cart-list','человек','\x20₽\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20_0x44a65a){_0x485841&&(clearTimeout(_0x485841),_0x485841=null);_0x5d8398=_0x3aab1d,_0x19021f=_0x5ef192['apply'](_0x484d0b,_0xeda83b);if(!_0x485841)_0x484d0b=_0xeda83b=null;}else!_0x485841&&_0x136433[_0x2b7ad3(0x176)]!==![]&&(_0x485841=setTimeout(_0x538ccb,_0x5d63a7));return _0x19021f;};}function refreshToken(){const _0x2f6223=_0x53b88d;return fetch(host+_0x2f6223(0x164),{'method':_0x2f6223(0x16a),'credentials':_0x2f6223(0x185)})['then'](_0x14bc15=>{const _0x2631e9=_0x2f6223;return _0x14bc15[_0x2631e9(0xf0)]();});}function initToken(){const _0x5a1461=_0x53b88d;return fetch(host+_0x5a1461(0x17e),{'method':'POST','credentials':_0x5a1461(0x185)})['then'](_0x3712ae=>{const _0x1c909d=_0x5a1461;return _0x3712ae[_0x1c909d(0xf0)]();});}const requestWithRefresh=async function(_0x1d59c6,_0x553b50){const _0x150df0=_0x53b88d;return fetch(_0x1d59c6,{..._0x553b50,'credentials':'include'})['then'](async _0xc528a3=>_0xc528a3[_0x150df0(0xf0)]())[_0x150df0(0x15e)](async _0x4c6b55=>{const _0x54115a=_0x150df0;if(_0x4c6b55[_0x54115a(0x109)]===_0x54115a(0x190))return refreshToken()[_0x54115a(0x15e)](_0x47ddec=>{const _0x56df48=_0x54115a;return console[_0x56df48(0x194)](_0x56df48(0xed),_0x1d59c6),fetch(_0x1d59c6,{..._0x553b50,'credentials':'include'})[_0x56df48(0x15e)](_0x2a618b=>_0x2a618b['json']());});return _0x4c6b55;});},replaceProduct=async function(_0x1dee29){const _0x4d44bd=_0x53b88d;return requestWithRefresh(host+_0x4d44bd(0x172),{'method':'POST','headers':{'Content-Type':_0x4d44bd(0xe0)},'body':JSON[_0x4d44bd(0x12a)]({'product_name':_0x1dee29})})[_0x4d44bd(0x15e)](async()=>{updateCart();});},deleteProduct=async function(_0x127542){const _0x527fcd=_0x53b88d;return requestWithRefresh(host+_0x527fcd(0x137),{'method':_0x527fcd(0x16a),'headers':{'Content-Type':_0x527fcd(0xe0)},'body':JSON[_0x527fcd(0x12a)]({'product_name':_0x127542})});},updateCart=throttle(async function(){const _0x463520=_0x53b88d;return requestWithRefresh(host+'/api/promo/get_updates',{'headers':{'Content-Type':_0x463520(0xe0)}})[_0x463520(0x15e)](_0x1dc21e=>{const _0x4e9f63=_0x463520;_0x1dc21e[_0x4e9f63(0x149)]!=='complete'&&(initialData_g[_0x4e9f63(0x125)]=_0x1dc21e['payload'][_0x4e9f63(0x125)],initialData_g[_0x4e9f63(0x108)]=_0x1dc21e[_0x4e9f63(0x19c)][_0x4e9f63(0x108)],_0x1dc21e[_0x4e9f63(0x149)]===_0x4e9f63(0x19b)&&(allProducts=[],visibleProducts=[],renderProducts(),allProducts=_0x1dc21e[_0x4e9f63(0x19c)]['chunk'],visibleProducts=_0x1dc21e['payload'][_0x4e9f63(0x104)]),_0x1dc21e[_0x4e9f63(0x149)]==='data'&&_0x1dc21e[_0x4e9f63(0x19c)]['chunk']['forEach'](_0x413e2f=>{const _0x3e3d2b=_0x4e9f63;let _0x526c01=allProducts[_0x3e3d2b(0x18b)](_0x242c2b=>_0x242c2b[_0x3e3d2b(0x10d)]===_0x413e2f['name']);_0x526c01===-0x1?(allProducts['push']({..._0x413e2f,'image':_0x413e2f['image']?.[_0x3e3d2b(0xe2)](_0x3e3d2b(0x187),'65,fit')}),visibleProducts['length']===allProducts[_0x3e3d2b(0x168)]-0x1&&(visibleProducts=allProducts)):(allProducts[_0x526c01]['n']+=_0x413e2f['n'],_0x526c01{updateCart();});},0xbb8),setOption=(_0x261ebb,_0x3fc9ae)=>{const _0x3f7690=_0x53b88d;return requestWithRefresh(host+_0x3f7690(0x111),{'method':_0x3f7690(0x16a),'headers':{'Content-Type':_0x3f7690(0xe0)},'body':JSON[_0x3f7690(0x12a)]({[_0x261ebb]:_0x3fc9ae})})[_0x3f7690(0x15e)](async _0x57714f=>{wholeRender(await loadInitData()),updateCart();});},loadInitData=async function(){const _0x5e3288=_0x53b88d;return fetch(host+_0x5e3288(0x18f),{'credentials':'include'})[_0x5e3288(0x15e)](async _0x31d0b4=>{const _0x4953b0=_0x5e3288,_0x29d5c5=await _0x31d0b4[_0x4953b0(0xf0)]();if(_0x31d0b4[_0x4953b0(0x149)]===0x191&&_0x29d5c5[_0x4953b0(0x109)]!==_0x4953b0(0x190))return await initToken()[_0x4953b0(0x15e)](_0x27148f=>{const _0x46edd3=_0x4953b0;return fetch(host+_0x46edd3(0x18f),{'credentials':'include'})[_0x46edd3(0x15e)](_0x100198=>_0x100198[_0x46edd3(0xf0)]());});if(_0x31d0b4['status']===0x193||_0x29d5c5[_0x4953b0(0x109)]===_0x4953b0(0x190))return await refreshToken()[_0x4953b0(0x15e)](_0x1f261e=>{const _0x2642aa=_0x4953b0;return fetch(host+_0x2642aa(0x18f),{'credentials':_0x2642aa(0x185)})[_0x2642aa(0x15e)](_0x4819a1=>_0x4819a1[_0x2642aa(0xf0)]());});return _0x29d5c5;})['then'](_0x54479d=>{return updateCart(),_0x54479d;})[_0x5e3288(0xf2)](_0x5c42d2=>{const _0x582d1d=_0x5e3288;return console['log'](_0x5c42d2),Promise[_0x582d1d(0xe8)]();});};function debounce(_0x127e9a,_0x1cd271){let _0x506e16;return function(..._0x5dde1d){clearTimeout(_0x506e16),_0x506e16=setTimeout(()=>{_0x127e9a['apply'](this,_0x5dde1d);},_0x1cd271);};}let allProducts,visibleProducts;function renderProduct(_0x4a3765,_0xb9a3c){const _0x497acc=_0x53b88d,_0x22d113=document[_0x497acc(0x101)]('li');_0x22d113[_0x497acc(0x198)]=_0x497acc(0x11c);const _0x32e4cd=_0x4a3765[_0x497acc(0x135)]==='g'?_0x4a3765['n']+'\x20г':_0x4a3765['n']+_0x497acc(0x158);return _0x22d113[_0x497acc(0x177)]=_0x497acc(0x182)+_0x4a3765[_0x497acc(0x142)]+_0x497acc(0xfc)+_0x4a3765[_0x497acc(0x10d)]+_0x497acc(0xe7)+_0x32e4cd+_0x497acc(0x13d)+Math[_0x497acc(0x17f)](_0x4a3765[_0x497acc(0x171)]*0x64)/0x64+_0x497acc(0x161)+_0xb9a3c+_0x497acc(0x115),_0x22d113;}let cartList,scrollWrapper,showMoreBtn,remainingSpan,initialData_g;function renderProducts(){const _0x236d11=_0x53b88d;cartList[_0x236d11(0x177)]='',visibleProducts[_0x236d11(0x17a)]((_0x812e5e,_0x4da2ef)=>{const _0x1fa53e=_0x236d11;cartList[_0x1fa53e(0x153)](renderProduct(_0x812e5e,_0x4da2ef));});const _0x25967f=allProducts[_0x236d11(0x168)]-visibleProducts[_0x236d11(0x168)];_0x25967f>0x0?(showMoreBtn[_0x236d11(0xd7)][_0x236d11(0x127)](_0x236d11(0x18e)),remainingSpan[_0x236d11(0x17d)]=_0x25967f):showMoreBtn['classList']['add'](_0x236d11(0x18e)),updateSummaryCount(),calculateListHeight();}function updateSummaryCount(){const _0x43200c=_0x53b88d,_0x3889f5=new Intl['NumberFormat']('ru-RU',{'style':_0x43200c(0x197),'currency':_0x43200c(0xfb)})['format'](Math[_0x43200c(0x17f)](allProducts[_0x43200c(0xfa)]((_0x3f618f,_0x317ee8)=>_0x3f618f+_0x317ee8[_0x43200c(0x11d)],0x0)*0x64)/0x64),_0x147fab=Math['round'](initialData_g['days']*initialData_g[_0x43200c(0x125)]+initialData_g[_0x43200c(0x166)]);document[_0x43200c(0x178)]('summary-details')[_0x43200c(0x177)]=allProducts[_0x43200c(0x168)]+'\x20'+declension(allProducts['length'],[_0x43200c(0x10b),_0x43200c(0x136),_0x43200c(0x191)])+_0x43200c(0x162)+_0x3889f5+'\x20~\x20с\x20запасами\x20на\x20'+_0x147fab+'\x20'+declension(_0x147fab,[_0x43200c(0x15b),_0x43200c(0xf1),_0x43200c(0x188)])+_0x43200c(0x18a)+Math[_0x43200c(0x17f)](initialData_g[_0x43200c(0x108)]*0x64)/0x64+'%',document[_0x43200c(0x178)](_0x43200c(0xdb))[_0x43200c(0x177)]=''+_0x3889f5,allProducts[_0x43200c(0x168)]===0x0&&(document[_0x43200c(0x178)]('summary-details')['innerHTML']='0\x20товаров\x20•\x20'+_0x3889f5+'\x20₽');}function calculateListHeight(){const _0x1d3128=_0x53b88d,_0x3c8b34=document[_0x1d3128(0x152)](_0x1d3128(0x126));if(!_0x3c8b34)return;const _0x4cdc56=_0x3c8b34[_0x1d3128(0x152)]('h1'),_0x344a54=_0x3c8b34[_0x1d3128(0x152)](_0x1d3128(0xff)),_0x902a27=_0x3c8b34[_0x1d3128(0x152)](_0x1d3128(0xfd)),_0x178d86=_0x3c8b34[_0x1d3128(0x152)](_0x1d3128(0x17b)),_0x33adef=_0x3c8b34['querySelector'](_0x1d3128(0xf4));let _0x55a696=0x0;if(_0x4cdc56)_0x55a696+=_0x4cdc56[_0x1d3128(0x19d)]+0x6;if(_0x344a54)_0x55a696+=_0x344a54[_0x1d3128(0x19d)]+0x1c;if(_0x902a27)_0x55a696+=_0x902a27[_0x1d3128(0x19d)]+0x18;if(_0x33adef&&!_0x33adef[_0x1d3128(0xd7)][_0x1d3128(0x173)](_0x1d3128(0x18e)))_0x55a696+=_0x33adef[_0x1d3128(0x19d)];if(_0x178d86)_0x55a696+=_0x178d86['offsetHeight']+0x14;const _0x4d449d=0x3c,_0x49c1fa=_0x3c8b34[_0x1d3128(0x13a)](),_0x23d766=window[_0x1d3128(0x13e)]-_0x49c1fa[_0x1d3128(0x132)]-_0x4d449d-0x14,_0xc89eb9=_0x23d766-_0x55a696;_0xc89eb9>0x64&&(scrollWrapper[_0x1d3128(0x107)][_0x1d3128(0xdd)]=_0xc89eb9+'px',scrollWrapper[_0x1d3128(0x107)][_0x1d3128(0x12f)]=_0x1d3128(0x114));}function _0x5445(_0x1e96c4,_0x38b738){_0x1e96c4=_0x1e96c4-0xd7;const _0x50d2d0=_0x50d2();let _0x544563=_0x50d2d0[_0x1e96c4];return _0x544563;}function declension(_0x462ba4,_0x4ee280){const _0x3621de=[0x2,0x0,0x1,0x1,0x1,0x2],_0x2f8c46=_0x462ba4%0x64>0x4&&_0x462ba4%0x64<0x14?0x2:_0x3621de[Math['min'](_0x462ba4%0xa,0x5)];return _0x4ee280[_0x2f8c46];}function wholeRender(_0x34004c){const _0x182213=_0x53b88d;initialData_g=_0x34004c,document['querySelector'](_0x182213(0x154))['textContent']=initialData_g[_0x182213(0x166)]+'\x20'+declension(initialData_g[_0x182213(0x166)],[_0x182213(0x15b),_0x182213(0xf1),_0x182213(0x188)]),allProducts=(Array[_0x182213(0x156)](initialData_g[_0x182213(0xdc)])?initialData_g[_0x182213(0xdc)]:[]??[])[_0x182213(0xfe)]()[_0x182213(0x134)](_0x1237b2=>{const _0x5ce7cc=_0x182213;return{..._0x1237b2,'image':_0x1237b2['image']?.[_0x5ce7cc(0xe2)]('{SIZE}',_0x5ce7cc(0x15a))};}),visibleProducts=allProducts[_0x182213(0x186)](0x0,visibleProducts?visibleProducts[_0x182213(0x168)]:0x5),document[_0x182213(0x199)](_0x182213(0x189))[_0x182213(0x17a)](_0x28ad05=>{const _0x31dc2b=_0x182213;_0x28ad05['innerText'][_0x31dc2b(0xf9)]()===''+initialData_g['days']&&_0x28ad05[_0x31dc2b(0xd7)][_0x31dc2b(0x148)](_0x31dc2b(0xda));}),console['log'](initialData_g);let _0x30e5d3=initialData_g[_0x182213(0x11f)];cartList=document[_0x182213(0x178)](_0x182213(0x15f)),scrollWrapper=document[_0x182213(0x178)](_0x182213(0xdf)),showMoreBtn=document[_0x182213(0x178)](_0x182213(0x14d)),remainingSpan=document[_0x182213(0x178)](_0x182213(0x179)),renderProducts(),document[_0x182213(0x170)]('click',function(_0x57df2f){const _0x48c714=_0x182213,_0x5d2272=_0x57df2f['target'][_0x48c714(0x10c)](_0x48c714(0x121)),_0x3f85ce=_0x57df2f['target'][_0x48c714(0x10c)]('.menu-dropdown'),_0x507d43=_0x57df2f['target']['closest'](_0x48c714(0x106)),_0xbfee57=_0x57df2f[_0x48c714(0x167)][_0x48c714(0x10c)](_0x48c714(0x10e)),_0x29814b=_0x57df2f[_0x48c714(0x167)]['closest'](_0x48c714(0x105));if(_0x5d2272){const _0x50bd03=_0x5d2272[_0x48c714(0x175)],_0x153e7a=_0x50bd03[_0x48c714(0xd7)][_0x48c714(0x173)](_0x48c714(0xda));document[_0x48c714(0x199)](_0x48c714(0x138))[_0x48c714(0x17a)](_0x5609d4=>_0x5609d4['classList'][_0x48c714(0x127)]('active')),!_0x153e7a&&_0x50bd03['classList'][_0x48c714(0x148)](_0x48c714(0xda)),_0x57df2f[_0x48c714(0x113)]();}else!_0x3f85ce&&document[_0x48c714(0x199)](_0x48c714(0x138))[_0x48c714(0x17a)](_0x1806a3=>_0x1806a3[_0x48c714(0xd7)][_0x48c714(0x127)](_0x48c714(0xda)));if(_0x507d43){const _0x2b6101=_0x507d43[_0x48c714(0x10c)](_0x48c714(0x120)),_0x531c2e=_0x2b6101['closest'](_0x48c714(0x12d));_0x531c2e['classList'][_0x48c714(0x148)]('replacing');const _0x44b767=Array[_0x48c714(0xe4)](cartList[_0x48c714(0x140)])['indexOf'](_0x531c2e);replaceProduct(allProducts[_0x44b767][_0x48c714(0x10d)])[_0x48c714(0x15e)](()=>{const _0x31e0b0=_0x48c714;_0x531c2e[_0x31e0b0(0x127)](),document[_0x31e0b0(0x199)]('.menu-dropdown.active')['forEach'](_0x5b2558=>_0x5b2558[_0x31e0b0(0xd7)]['remove'](_0x31e0b0(0xda))),visibleProducts[_0x31e0b0(0x133)](_0x44b767,0x1),allProducts['splice'](_0x44b767,0x1),visibleProducts[_0x31e0b0(0x168)]{const _0x541508=_0x48c714;_0x1b80e5[_0x541508(0x127)](),document[_0x541508(0x199)](_0x541508(0x138))[_0x541508(0x17a)](_0x407228=>_0x407228[_0x541508(0xd7)][_0x541508(0x127)](_0x541508(0xda))),visibleProducts[_0x541508(0x133)](_0x23b4bd,0x1),allProducts['splice'](_0x23b4bd,0x1),visibleProducts[_0x541508(0x168)]{const _0x588e53=_0x48c714;document[_0x588e53(0x15c)]['reload']();});}),showMoreBtn[_0x182213(0x170)](_0x182213(0xf7),()=>{const _0x576fe7=_0x182213;while(visibleProducts[_0x576fe7(0x168)]{const _0x10ecb5=_0x182213;_0x366825['addEventListener'](_0x10ecb5(0xf7),function(){const _0xf13f51=_0x10ecb5,_0x39d864=this[_0xf13f51(0x10c)](_0xf13f51(0x169)),_0x54e316=_0x39d864[_0xf13f51(0xd7)]['contains'](_0xf13f51(0x100));document[_0xf13f51(0x199)](_0xf13f51(0x169))[_0xf13f51(0x17a)](_0x4711dc=>_0x4711dc[_0xf13f51(0xd7)]['remove'](_0xf13f51(0x100))),!_0x54e316&&_0x39d864[_0xf13f51(0xd7)]['add'](_0xf13f51(0x100));});}),document['querySelectorAll'](_0x182213(0xec))[_0x182213(0x17a)](_0x5b5e92=>{const _0x3995ff=_0x182213;_0x5b5e92[_0x3995ff(0x170)](_0x3995ff(0xf7),function(){const _0x2f146a=_0x3995ff,_0x595281=this[_0x2f146a(0x10c)]('.days-options');_0x595281[_0x2f146a(0x199)](_0x2f146a(0xec))[_0x2f146a(0x17a)](_0x293171=>_0x293171['classList'][_0x2f146a(0x127)](_0x2f146a(0xda))),this[_0x2f146a(0xd7)][_0x2f146a(0x148)](_0x2f146a(0xda)),setOption(_0x2f146a(0x166),this[_0x2f146a(0x11a)]['days']),document[_0x2f146a(0x152)](_0x2f146a(0x154))[_0x2f146a(0x17d)]=this[_0x2f146a(0x11a)][_0x2f146a(0x166)]+'\x20'+declension(this[_0x2f146a(0x11a)][_0x2f146a(0x166)],[_0x2f146a(0x15b),'дня',_0x2f146a(0x188)]);});});const _0x5c48a2=document[_0x182213(0x178)](_0x182213(0x10f)),_0x1aeeed=document[_0x182213(0x178)](_0x182213(0x13b));let _0x29e63f=null;function _0x12277f(){const _0x435183=_0x182213;_0x5c48a2[_0x435183(0x177)]='',_0x30e5d3[_0x435183(0x17a)]((_0x15c642,_0x3eb824)=>{const _0x67e3a6=_0x435183,_0x1ae701='🥦',_0xe03c44=document[_0x67e3a6(0x101)]('div');_0xe03c44['className']=_0x67e3a6(0x150),_0xe03c44[_0x67e3a6(0x11a)][_0x67e3a6(0xd8)]=_0x3eb824,_0xe03c44[_0x67e3a6(0x177)]=_0x67e3a6(0x129)+_0x1ae701+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+_0x15c642[_0x67e3a6(0x10d)]+_0x67e3a6(0x184)+_0x15c642['age']+'\x20лет\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{const _0x1ab37b=_0x435183;_0x29630b[_0x1ab37b(0x170)](_0x1ab37b(0xf7),function(_0x519b59){const _0x4b2fdf=_0x1ab37b;_0x519b59[_0x4b2fdf(0x113)]();const _0x3dc638=parseInt(this[_0x4b2fdf(0x11a)][_0x4b2fdf(0xd8)]);_0x30e5d3[_0x4b2fdf(0x133)](_0x3dc638,0x1),_0x12277f(),setOption(_0x4b2fdf(0x11f),_0x30e5d3);});});}_0x12277f(),_0x5c48a2[_0x182213(0x170)](_0x182213(0xf7),function(_0x47c938){const _0x33dd20=_0x182213,_0x4613a9=_0x47c938['target'][_0x33dd20(0x10c)](_0x33dd20(0x14a));if(!_0x4613a9)return;if(_0x47c938[_0x33dd20(0x167)][_0x33dd20(0x10c)](_0x33dd20(0x174)))return;const _0x3d19ac=parseInt(_0x4613a9[_0x33dd20(0x11a)][_0x33dd20(0xd8)]);_0x4bfdef(_0x3d19ac);});const _0x10f1a6=document[_0x182213(0x178)](_0x182213(0x155)),_0x4b1fd6=document['getElementById'](_0x182213(0x157)),_0x124487=document[_0x182213(0x178)](_0x182213(0x122)),_0x3b46cc=document[_0x182213(0x178)]('savePersonBtn'),_0x56b0e8=document[_0x182213(0x178)](_0x182213(0xeb)),_0x17e497=document['querySelectorAll'](_0x182213(0x124)),_0x5f26ef=initialData_g['available_groups'];function _0x4bfdef(_0x56b7a5=null){const _0x3fd7aa=_0x182213;_0x29e63f=_0x56b7a5,document[_0x3fd7aa(0x199)](_0x3fd7aa(0x1a1))[_0x3fd7aa(0x17a)](_0x534e76=>_0x534e76['innerHTML']='');if(_0x29e63f!==null){_0x56b0e8[_0x3fd7aa(0x17d)]=_0x3fd7aa(0xe5);const _0xfd7778=_0x30e5d3[_0x29e63f];document[_0x3fd7aa(0x178)](_0x3fd7aa(0x19f))[_0x3fd7aa(0xf8)]=_0xfd7778[_0x3fd7aa(0x10d)],document[_0x3fd7aa(0x178)]('inputAge')[_0x3fd7aa(0xf8)]=_0xfd7778['age'],document[_0x3fd7aa(0x178)](_0x3fd7aa(0x103))[_0x3fd7aa(0xf8)]=_0xfd7778[_0x3fd7aa(0x131)],document[_0x3fd7aa(0x178)]('inputHeight')[_0x3fd7aa(0xf8)]=_0xfd7778[_0x3fd7aa(0x130)],_0x17e497[_0x3fd7aa(0x17a)](_0x23b365=>{const _0x2ce4c7=_0x3fd7aa;_0x23b365[_0x2ce4c7(0xd7)][_0x2ce4c7(0x141)]('active',_0x23b365[_0x2ce4c7(0x11a)][_0x2ce4c7(0x13c)]===_0xfd7778[_0x2ce4c7(0x13c)]);});if(_0xfd7778[_0x3fd7aa(0x19a)])_0xfd7778['avoid']['forEach'](_0xdc3180=>_0x5ede89(_0xdc3180,'avoid',![]));if(_0xfd7778[_0x3fd7aa(0x165)])_0xfd7778[_0x3fd7aa(0x165)][_0x3fd7aa(0x17a)](_0x5a5334=>_0x5ede89(_0x5a5334,_0x3fd7aa(0x165),![]));}else _0x56b0e8['textContent']='Добавить\x20человека',document[_0x3fd7aa(0x178)](_0x3fd7aa(0x19f))[_0x3fd7aa(0xf8)]='',document[_0x3fd7aa(0x178)](_0x3fd7aa(0x14c))[_0x3fd7aa(0xf8)]='',document[_0x3fd7aa(0x178)](_0x3fd7aa(0x103))[_0x3fd7aa(0xf8)]='',document[_0x3fd7aa(0x178)]('inputHeight')[_0x3fd7aa(0xf8)]='',_0x17e497['forEach'](_0x40c29d=>_0x40c29d[_0x3fd7aa(0xd7)][_0x3fd7aa(0x127)](_0x3fd7aa(0xda))),document[_0x3fd7aa(0x152)](_0x3fd7aa(0x119))[_0x3fd7aa(0xd7)][_0x3fd7aa(0x148)](_0x3fd7aa(0xda));_0x10f1a6['style'][_0x3fd7aa(0x123)]=_0x3fd7aa(0xe3),calculateListHeight();}_0x4b1fd6[_0x182213(0x170)](_0x182213(0xf7),()=>_0x4bfdef(null));function _0x31663d(){const _0x3ee059=_0x182213;_0x10f1a6[_0x3ee059(0x107)][_0x3ee059(0x123)]=_0x3ee059(0x143);}_0x124487['addEventListener'](_0x182213(0xf7),_0x31663d),_0x10f1a6[_0x182213(0x170)](_0x182213(0xf7),function(_0x30d786){const _0xf9b20b=_0x182213;if(_0x30d786[_0xf9b20b(0x167)]===this)_0x31663d();}),_0x17e497[_0x182213(0x17a)](_0x24e3b6=>{const _0x235294=_0x182213;_0x24e3b6[_0x235294(0x170)]('click',function(){const _0x17f443=_0x235294;_0x17e497['forEach'](_0x62e817=>_0x62e817['classList'][_0x17f443(0x127)](_0x17f443(0xda))),this[_0x17f443(0xd7)][_0x17f443(0x148)](_0x17f443(0xda));});});function _0x5ede89(_0x1db471,_0x5465a7,_0x8dd209=!![]){const _0x37fcda=_0x182213,_0x552017=document[_0x37fcda(0x152)](_0x37fcda(0x14e)+_0x5465a7+'\x22]'),_0x4ca932=_0x552017[_0x37fcda(0x199)](_0x37fcda(0x180));for(let _0x568f63 of _0x4ca932){if(_0x568f63['textContent'][_0x37fcda(0xf9)]()[_0x37fcda(0xe2)]('×','')[_0x37fcda(0xf9)]()===_0x1db471)return;}const _0x55d687=_0x5465a7===_0x37fcda(0x19a)?_0x37fcda(0x165):'avoid',_0x6a38e6=document[_0x37fcda(0x152)](_0x37fcda(0x14e)+_0x55d687+'\x22]'),_0x486cfa=_0x6a38e6[_0x37fcda(0x199)]('.tag');for(let _0x181943 of _0x486cfa){if(_0x181943[_0x37fcda(0x17d)][_0x37fcda(0xf9)]()['replace']('×','')[_0x37fcda(0xf9)]()===_0x1db471){_0x181943[_0x37fcda(0x127)]();break;}}const _0x2657f6=document['createElement'](_0x37fcda(0x15d));_0x2657f6[_0x37fcda(0x198)]='tag\x20'+(_0x5465a7===_0x37fcda(0x19a)?_0x37fcda(0x16d):'tag-green'),_0x2657f6[_0x37fcda(0x177)]=_0x1db471+'\x20×',_0x2657f6[_0x37fcda(0x152)]('.tag-close')[_0x37fcda(0x170)](_0x37fcda(0xf7),function(){_0x2657f6['remove']();}),_0x552017[_0x37fcda(0x153)](_0x2657f6);}document[_0x182213(0x199)](_0x182213(0x193))[_0x182213(0x17a)](_0x339f7d=>{const _0x26325d=_0x182213,_0x23aba1=_0x339f7d[_0x26325d(0x11a)][_0x26325d(0x110)],_0x1bfffe=document['querySelector'](_0x26325d(0x18d)+_0x23aba1+'\x22]'),_0x29c84c=document[_0x26325d(0x152)](_0x26325d(0x14e)+_0x23aba1+'\x22]');_0x339f7d[_0x26325d(0x170)](_0x26325d(0xf6),function(){const _0x29975c=_0x26325d,_0x57627b=this[_0x29975c(0xf8)][_0x29975c(0x12c)]();_0x1bfffe[_0x29975c(0x177)]='';const _0x4f8d82=new Set();document[_0x29975c(0x199)]('#personModal\x20.tags-wrap\x20.tag')[_0x29975c(0x17a)](_0x24d903=>{const _0x249d2a=_0x29975c,_0x108de2=_0x24d903[_0x249d2a(0x17d)]['trim']()[_0x249d2a(0xe2)]('×','')['trim']();if(_0x108de2)_0x4f8d82['add'](_0x108de2);});if(_0x57627b[_0x29975c(0x168)]>0x0){const _0x2150fc=_0x5f26ef[_0x29975c(0x14b)](_0x2401d1=>_0x2401d1[_0x29975c(0x12c)]()[_0x29975c(0x163)](_0x57627b)&&!_0x4f8d82[_0x29975c(0xef)](_0x2401d1));_0x2150fc['length']>0x0?(_0x1bfffe[_0x29975c(0xd7)]['add'](_0x29975c(0xda)),_0x2150fc[_0x29975c(0x17a)](_0x350711=>{const _0x10b548=_0x29975c,_0x41a2e9=document['createElement']('div');_0x41a2e9[_0x10b548(0x17d)]=_0x350711,_0x41a2e9[_0x10b548(0x170)](_0x10b548(0xf7),function(){const _0x3d5631=_0x10b548;_0x5ede89(_0x350711,_0x23aba1),_0x339f7d[_0x3d5631(0xf8)]='',_0x1bfffe[_0x3d5631(0xd7)][_0x3d5631(0x127)]('active');}),_0x1bfffe['appendChild'](_0x41a2e9);})):_0x1bfffe['classList'][_0x29975c(0x127)](_0x29975c(0xda));}else _0x1bfffe[_0x29975c(0xd7)][_0x29975c(0x127)](_0x29975c(0xda));}),document[_0x26325d(0x170)](_0x26325d(0xf7),function(_0x50ddda){const _0xa0a527=_0x26325d;!_0x339f7d['contains'](_0x50ddda['target'])&&!_0x1bfffe[_0xa0a527(0x173)](_0x50ddda[_0xa0a527(0x167)])&&_0x1bfffe[_0xa0a527(0xd7)][_0xa0a527(0x127)](_0xa0a527(0xda));});}),_0x3b46cc[_0x182213(0x170)]('click',()=>{const _0x5e28ee=_0x182213,_0x1cbcf7=document['getElementById'](_0x5e28ee(0x19f))[_0x5e28ee(0xf8)][_0x5e28ee(0xf9)](),_0x319448=document[_0x5e28ee(0x178)](_0x5e28ee(0x14c))['value'][_0x5e28ee(0xf9)](),_0x5139ba=document['getElementById']('inputWeight')[_0x5e28ee(0xf8)][_0x5e28ee(0xf9)](),_0x4dc005=document[_0x5e28ee(0x178)](_0x5e28ee(0x159))['value']['trim'](),_0x1b6ba1=document[_0x5e28ee(0x152)](_0x5e28ee(0x12b))[_0x5e28ee(0x11a)][_0x5e28ee(0x13c)];if(!_0x1cbcf7){alert(_0x5e28ee(0x18c));return;}if(!_0x319448||parseInt(_0x319448)<0x7){alert(_0x5e28ee(0xd9));return;}const _0x34e107=[];document['querySelector'](_0x5e28ee(0x102))[_0x5e28ee(0x199)](_0x5e28ee(0x180))[_0x5e28ee(0x17a)](_0xb201c5=>{const _0x2294a1=_0x5e28ee;_0x34e107[_0x2294a1(0x192)](_0xb201c5[_0x2294a1(0x17d)][_0x2294a1(0xf9)]()[_0x2294a1(0xe2)]('×','')[_0x2294a1(0xf9)]());});const _0x3b13e3=[];document[_0x5e28ee(0x152)]('#personModal\x20.tags-wrap[data-target=\x22favorite\x22]')[_0x5e28ee(0x199)](_0x5e28ee(0x180))[_0x5e28ee(0x17a)](_0x3e84ea=>{const _0x5b8992=_0x5e28ee;_0x3b13e3['push'](_0x3e84ea[_0x5b8992(0x17d)]['trim']()[_0x5b8992(0xe2)]('×','')[_0x5b8992(0xf9)]());});const _0x9381b6={'name':_0x1cbcf7,'age':_0x319448,'weight':_0x5139ba,'height':_0x4dc005,'gender':_0x1b6ba1,'avoid':_0x34e107,'favorite':_0x3b13e3};_0x29e63f!==null?(_0x30e5d3[_0x29e63f]=_0x9381b6,_0x29e63f=null):_0x30e5d3[_0x5e28ee(0x192)](_0x9381b6),_0x12277f(),setOption(_0x5e28ee(0x11f),_0x30e5d3),_0x31663d();});const _0x15e597=initialData_g['available_groups'],_0x464b67=initialData_g[_0x182213(0x128)];let _0x3de9b1=[..._0x464b67],_0x5f3618=![];const _0x49c8d7=0x9,_0x4deb72=debounce(async()=>{const _0x7940a2=_0x182213;return setOption(_0x7940a2(0x14f),_0x3de9b1);},0x5dc),_0x5d3f6f=document[_0x182213(0x178)]('categories-grid'),_0x2b2679=document[_0x182213(0x178)](_0x182213(0x147));function _0x14cddd(){const _0x2101d7=_0x182213;_0x5d3f6f[_0x2101d7(0x177)]='';const _0x406cb8=_0x5f3618?_0x15e597:_0x15e597[_0x2101d7(0x186)](0x0,_0x49c8d7);_0x406cb8[_0x2101d7(0x17a)](_0x2a6a2b=>{const _0x1824e3=_0x2101d7,_0x57d8c4=document['createElement'](_0x1824e3(0x151));_0x57d8c4[_0x1824e3(0x198)]=_0x1824e3(0x145)+(_0x3de9b1[_0x1824e3(0x163)](_0x2a6a2b)?_0x1824e3(0xda):_0x1824e3(0x16c)),_0x57d8c4[_0x1824e3(0x17d)]=_0x2a6a2b,_0x57d8c4[_0x1824e3(0x11a)]['category']=_0x2a6a2b,_0x57d8c4[_0x1824e3(0x170)](_0x1824e3(0xf7),function(){const _0xf414de=_0x1824e3,_0x182a0e=this[_0xf414de(0x11a)][_0xf414de(0x11b)];_0x3de9b1[_0xf414de(0x163)](_0x182a0e)?_0x3de9b1=_0x3de9b1[_0xf414de(0x14b)](_0x572807=>_0x572807!==_0x182a0e):_0x3de9b1[_0xf414de(0x192)](_0x182a0e),_0x14cddd(),_0x4deb72();}),_0x5d3f6f['appendChild'](_0x57d8c4);}),_0x5f3618?_0x2b2679[_0x2101d7(0xd7)][_0x2101d7(0x127)]('collapsed'):_0x2b2679[_0x2101d7(0xd7)][_0x2101d7(0x148)](_0x2101d7(0x139));}_0x2b2679[_0x182213(0x170)](_0x182213(0xf7),function(){_0x5f3618=!_0x5f3618,_0x14cddd();}),_0x14cddd();}document[_0x53b88d(0x170)](_0x53b88d(0x112),async()=>{wholeRender(await loadInitData());}),document[_0x53b88d(0x170)](_0x53b88d(0x112),function(){const _0x7298de=_0x53b88d,_0x2dcfdd=document['getElementById'](_0x7298de(0x1a0)),_0x5ef1a3=document[_0x7298de(0x178)](_0x7298de(0xf5));!localStorage['getItem'](_0x7298de(0xe9))&&setTimeout(()=>{const _0x573c17=_0x7298de;_0x2dcfdd[_0x573c17(0xd7)][_0x573c17(0x148)](_0x573c17(0xe1));},0x1f4),_0x5ef1a3[_0x7298de(0x170)]('click',function(){const _0x45c9db=_0x7298de;localStorage[_0x45c9db(0x19e)](_0x45c9db(0xe9),_0x45c9db(0xea)),_0x2dcfdd[_0x45c9db(0xd7)][_0x45c9db(0x127)](_0x45c9db(0xe1)),_0x2dcfdd[_0x45c9db(0xd7)][_0x45c9db(0x148)]('hide'),setTimeout(()=>{const _0x1c1690=_0x45c9db;_0x2dcfdd['style'][_0x1c1690(0x123)]='none';},0x190);});}); \ No newline at end of file diff --git a/build.js b/build.js new file mode 100755 index 0000000..2941bb8 --- /dev/null +++ b/build.js @@ -0,0 +1,16 @@ +#!/usr/bin/env node + +import lib from "@minify-html/node"; +import fs from "fs"; +import JavascriptObfuscator from "javascript-obfuscator"; + +const cfg = { + minify_css: true, + minify_js: true, + keep_comments: false, + keep_ssi_comments: false, +}; + +fs.writeFileSync('autocart.js', JavascriptObfuscator.obfuscate(fs.readFileSync('src/autocart.js').toString()).getObfuscatedCode()); +fs.writeFileSync('index.html', lib.minify(fs.readFileSync('src/index.html'), cfg)); +fs.writeFileSync('auto_cart.html', lib.minify(fs.readFileSync('src/auto_cart.html'), cfg)); diff --git a/dev-server.js b/dev-server.js index b25cbdf..f0aa075 100644 --- a/dev-server.js +++ b/dev-server.js @@ -1,8 +1,9 @@ /** @file site/dev-server.js */ -const http = require('http'); +const http = require('https'); const fs = require('fs'); const path = require('path'); const WebSocket = require('ws'); +import { createHttpsDevServer } from 'easy-https'; const HTTP_PORT = 9876; const WEBSOCKET_PORT = 9878; @@ -60,7 +61,7 @@ function serveStaticPageIfExists(route, res) { * @param {req} req * @param {res} res */ -const requestHandler = function (req, res) { +const requestHandler = async function (req, res) { const method = req.method.toLowerCase(); if (method === 'get') { // No need to ensure the route can't access other local files, @@ -74,5 +75,19 @@ const requestHandler = function (req, res) { res.end(); }; -const server = http.createServer(requestHandler); -server.listen(HTTP_PORT); \ No newline at end of file +// const server = http.createServer(requestHandler); +// server.listen(HTTP_PORT); + +async function start() { + const server = await createHttpsDevServer( + requestHandler, + { + domain: 'local.hvatilo.ru', + port: HTTP_PORT, + subdomains: ['test'], // will add support for test.my-app.dev + openBrowser: true, + }, + ); +} + +start(); \ No newline at end of file diff --git a/index.html b/index.html index 9f1b0ed..af81c6c 100644 --- a/index.html +++ b/index.html @@ -1,3 +1 @@ -Хватило.ру - персональный помощник по питанию

    Хватит

    Персональный помощник
    по питанию: баланс,
    энергия,
    порядок
    в холодильнике -
    для всей семьи

    гадать

    Автокорзина

    Вы выбираете, сколько человек в семье, указываете, на сколько дней нужны продукты — и приложение мгновенно
    собирает корзину с учётом порций.
    На выходе — чёткий список покупок,
    разбитый по отделам магазина

    Никаких сомнений

    Забудьте про мучительные вопросы
    «А хватит ли?», «А что купить ещё?»

    Контроль в телефоне

    Список всегда под рукой, можно вычёркивать по пути

    Всё схвачено

    Мы уже учли, что есть в магазине

    План питания

    Добавляете любимые рецепты и указываете
    возможные замены для продуктов. Из готовых
    рецептов собираете план на день/неделю, планом
    можно делиться с другими пользователями!

    Баланс

    Вы сами выбираете блюда

    Экономия

    Замена без потери вкуса

    Персонализация

    Общий план — муж/ребёнок/соседка по комнате знают, что готовить, без ваших
    объяснений

    Как это работает



    Вы выбираете, что хотите приготовить —
    Hvatilo помогает собрать остальное

    Открываете сегодняшний
    день
    в плане питания

    Заменить ужин — пара кликов,
    и рецепт встаёт в план
    с новым
    списком покупок

    Из списка продуктов можно
    сформировать автокорзину
    на недостающие

    • Отсутствие продукта в магазине
      не сломает приём пищи:

      автокорзина подстроится
      под наличие
    •   В холодильнике только
      те продукты, которые вы успеете
      съесть, в помойку отправится
      только упаковка
    \ No newline at end of file +Хватило.ру - персональный помощник по питанию

    Хватит

    Персональный помощник
    по питанию: баланс,
    энергия,
    порядок
    в холодильнике -
    для всей семьи

    гадать

    Автокорзина

    Вы выбираете, сколько человек в семье, указываете, на сколько дней нужны продукты — и приложение мгновенно
    собирает корзину с учётом порций.
    На выходе — чёткий список покупок,
    разбитый по отделам магазина

    Никаких сомнений

    Забудьте про мучительные вопросы
    «А хватит ли?», «А что купить ещё?»

    Контроль в телефоне

    Список всегда под рукой, можно вычёркивать по пути

    Всё схвачено

    Мы уже учли, что есть в магазине

    План питания

    Добавляете любимые рецепты и указываете
    возможные замены для продуктов. Из готовых
    рецептов собираете план на день/неделю, планом
    можно делиться с другими пользователями!

    Баланс

    Вы сами выбираете блюда

    Экономия

    Замена без потери вкуса

    Персонализация

    Общий план — муж/ребёнок/соседка по комнате знают, что готовить, без ваших
    объяснений

    Как это работает



    Вы выбираете, что хотите приготовить —
    Hvatilo помогает собрать остальное

    Открываете сегодняшний
    день
    в плане питания

    Заменить ужин — пара кликов,
    и рецепт встаёт в план
    с новым
    списком покупок

    Из списка продуктов можно
    сформировать автокорзину
    на недостающие

    • Отсутствие продукта в магазине
      не сломает приём пищи:

      автокорзина подстроится
      под наличие
    •   В холодильнике только
      те продукты, которые вы успеете
      съесть, в помойку отправится
      только упаковка
    \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 855ca67..ccf73af 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,9 +9,102 @@ }, "devDependencies": { "@minify-html/node": "^0.18.1", + "easy-https": "^1.0.1", + "javascript-obfuscator": "^5.5.0", "ws": "^8.20.1" } }, + "node_modules/@inversifyjs/common": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@inversifyjs/common/-/common-1.5.2.tgz", + "integrity": "sha512-WlzR9xGadABS9gtgZQ+luoZ8V6qm4Ii6RQfcfC9Ho2SOlE6ZuemFo7PKJvKI0ikm8cmKbU8hw5UK6E4qovH21w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@inversifyjs/container": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@inversifyjs/container/-/container-1.15.0.tgz", + "integrity": "sha512-U2xYsPrJTz5za2TExi5lg8qOWf8TEVBpN+pQM7B8BVA2rajtbRE9A66SLRHk8c1eGXmg+0K4Hdki6tWAsSQBUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inversifyjs/common": "1.5.2", + "@inversifyjs/core": "9.2.0", + "@inversifyjs/plugin": "0.2.0", + "@inversifyjs/reflect-metadata-utils": "1.4.1" + }, + "peerDependencies": { + "reflect-metadata": "~0.2.2" + } + }, + "node_modules/@inversifyjs/core": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/@inversifyjs/core/-/core-9.2.0.tgz", + "integrity": "sha512-Nm7BR6KmpgshIHpVQWuEDehqRVb6GBm8LFEuhc2s4kSZWrArZ15RmXQzROLk4m+hkj4kMXgvMm5Qbopot/D6Sg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inversifyjs/common": "1.5.2", + "@inversifyjs/prototype-utils": "0.1.3", + "@inversifyjs/reflect-metadata-utils": "1.4.1" + } + }, + "node_modules/@inversifyjs/plugin": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@inversifyjs/plugin/-/plugin-0.2.0.tgz", + "integrity": "sha512-R/JAdkTSD819pV1zi0HP54mWHyX+H2m8SxldXRgPQarS3ySV4KPyRdosWcfB8Se0JJZWZLHYiUNiS6JvMWSPjw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@inversifyjs/prototype-utils": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@inversifyjs/prototype-utils/-/prototype-utils-0.1.3.tgz", + "integrity": "sha512-EzRamZzNgE9Sn3QtZ8NncNa2lpPMZfspqbK6BWFguWnOpK8ymp2TUuH46ruFHZhrHKnknPd7fG22ZV7iF517TQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inversifyjs/common": "1.5.2" + } + }, + "node_modules/@inversifyjs/reflect-metadata-utils": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@inversifyjs/reflect-metadata-utils/-/reflect-metadata-utils-1.4.1.tgz", + "integrity": "sha512-Cp77C4d2wLaHXiUB7iH6Cxb7i1lD/YDuTIHLTDzKINqGSz0DCSoL/Dg2wVkW/6Qx03r/yQMLJ+32Agl32N2X8g==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "reflect-metadata": "~0.2.2" + } + }, + "node_modules/@javascript-obfuscator/escodegen": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@javascript-obfuscator/escodegen/-/escodegen-2.4.2.tgz", + "integrity": "sha512-3N7EUdYxuldwvtOtZIlAxNwPW1qTUFwWt3PxNkik6hB1uSSXLXj9JMlSyUbTCXK3Osjn0Nu0s/aa4mbvkGouXQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@javascript-obfuscator/estraverse": "^5.3.0", + "esprima": "^4.0.1", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/@javascript-obfuscator/estraverse": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@javascript-obfuscator/estraverse/-/estraverse-5.4.0.tgz", + "integrity": "sha512-CZFX7UZVN9VopGbjTx4UXaXsi9ewoM1buL0kY7j1ftYdSs7p2spv9opxFjHlQ/QGTgh4UqufYqJJ0WKLml7b6w==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, "node_modules/@minify-html/node": { "version": "0.18.1", "resolved": "https://registry.npmjs.org/@minify-html/node/-/node-0.18.1.tgz", @@ -97,6 +190,100 @@ "win32" ] }, + "node_modules/@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/validator": { + "version": "13.15.10", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.15.10.tgz", + "integrity": "sha512-T8L6i7wCuyoK8A/ZeLYt1+q0ty3Zb9+qbSSvrIVitzT3YjZqkTZ40IbRsPanlB4h1QB3JVL1SYCdR6ngtFYcuA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vercel/blob": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@vercel/blob/-/blob-2.8.0.tgz", + "integrity": "sha512-Nu+HWKpkgovCh/ezlG7wCVwF7RErTzLzZMbGKFBdGBCbTKyK+s5VXPLl+0+TpNEQPH8AVaGzOpIsXUOtkqylCQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@vercel/oidc": "^3.6.1", + "async-retry": "^1.3.3", + "is-buffer": "^2.0.5", + "is-node-process": "^1.2.0", + "throttleit": "^2.1.0", + "undici": "^6.23.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@vercel/cli-config": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@vercel/cli-config/-/cli-config-0.2.4.tgz", + "integrity": "sha512-kZ5SojbrV06GHoU6QIWGwDXLov+s9rWZ7QqdqKfJfBGCNUieGfgaCjeeenNy8Y+QC0bwC0dZ2B4l5Hvdmrgpdw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "xdg-app-paths": "5", + "zod": "4.1.11" + } + }, + "node_modules/@vercel/cli-exec": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@vercel/cli-exec/-/cli-exec-1.0.1.tgz", + "integrity": "sha512-g9XerViJ/paZujufXYcu5XYI2vU2rtB4sgdpjUHde5RnOkdmpu0ngH46LCFGHoPXO/C+qDPSczIHIRN+8Q2YKQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "execa": "5.1.1" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@vercel/oidc": { + "version": "3.8.5", + "resolved": "https://registry.npmjs.org/@vercel/oidc/-/oidc-3.8.5.tgz", + "integrity": "sha512-RwXYtnt6za+5UO4IaLywN/6B95AlLqynPRUWRJxeJ/qufwkcLUbZNUxYtzT0uMpuraWhlNcGqPNGkTnZr4BGBw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@vercel/cli-config": "0.2.4", + "@vercel/cli-exec": "1.0.1", + "jose": "^5.9.6" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/acorn": { + "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" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "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" + } + }, "node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -112,12 +299,89 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/array-differ": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", + "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/assert": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", + "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "is-nan": "^1.3.2", + "object-is": "^1.1.5", + "object.assign": "^4.1.4", + "util": "^0.12.5" + } + }, "node_modules/async": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", "license": "MIT" }, + "node_modules/async-retry": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", + "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "retry": "0.13.1" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/basic-auth": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", @@ -130,6 +394,36 @@ "node": ">= 0.8" } }, + "node_modules/brace-expansion": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/call-bind": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "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", @@ -175,6 +469,45 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/chance": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/chance/-/chance-1.1.13.tgz", + "integrity": "sha512-V6lQCljcLznE7tUYUM9EOAnnKXbctE6j/rdQkYOHIWbfGQbrzTsAXNW9CdU5XCo4ArXQCj/rb6HgxPlmGJcaUg==", + "dev": true, + "license": "MIT" + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": "*" + } + }, + "node_modules/class-validator": { + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.14.3.tgz", + "integrity": "sha512-rXXekcjofVN1LTOSw+u4u9WXVEUvNBVjORW154q/IdmYWy1nMbOU9aNtZB0t8m+FJQ9q91jlr2f9CwwUFdFMRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/validator": "^13.15.3", + "libphonenumber-js": "^1.11.1", + "validator": "^13.15.20" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -193,6 +526,23 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, + "node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, "node_modules/corser": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", @@ -202,6 +552,31 @@ "node": ">= 0.4.0" } }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": "*" + } + }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -219,6 +594,49 @@ } } }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -233,6 +651,31 @@ "node": ">= 0.4" } }, + "node_modules/easy-https": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/easy-https/-/easy-https-1.0.1.tgz", + "integrity": "sha512-EPFMWVTYKhXKfz8ocs/r+eLMdmMdR+QljXNOsW3juxM/phMeMqsNCoUmPCCSzogDbw2vmtyYRR6xVb5TNncy5Q==", + "dev": true, + "dependencies": { + "rimraf": "^3.0.2" + } + }, + "node_modules/env-paths": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-4.0.0.tgz", + "integrity": "sha512-pxP8eL2SwwaTRi/KHYwLYXinDs7gL3jxFcBYmEdYfZmZXbaVDvdppd0XBU8qVz03rDfKZMXg1omHCbsJjZrMsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-safe-filename": "^0.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -263,12 +706,127 @@ "node": ">= 0.4" } }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "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, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", "license": "MIT" }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/fast-deep-equal": { + "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, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, "node_modules/follow-redirects": { "version": "1.16.0", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", @@ -289,6 +847,29 @@ } } }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -298,6 +879,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", @@ -335,6 +926,41 @@ "node": ">= 0.4" } }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -356,6 +982,19 @@ "node": ">=8" } }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-symbols": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", @@ -368,6 +1007,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-tostringtag": { + "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.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/hasown": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", @@ -442,6 +1097,16 @@ "node": ">=12" } }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, "node_modules/iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", @@ -454,6 +1119,282 @@ "node": ">=0.10.0" } }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/inversify": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/inversify/-/inversify-7.11.0.tgz", + "integrity": "sha512-yZDprSSr8TyVeMGI/AOV4ws6gwjX22hj9Z8/oHAVpJORY6WRFTcUzhnZtibBUHEw2U8ArvHcR+i863DplQ3Cwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inversifyjs/common": "1.5.2", + "@inversifyjs/container": "1.15.0", + "@inversifyjs/core": "9.2.0" + } + }, + "node_modules/is-arguments": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-node-process": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz", + "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-regex": { + "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-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-safe-filename": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-safe-filename/-/is-safe-filename-0.1.1.tgz", + "integrity": "sha512-4SrR7AdnY11LHfDKTZY1u6Ga3RuxZdl3YKWWShO5iyuG5h8QS4GD2tOb04peBJ5I7pXbR+CGBNEhTcwK+FzN3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/javascript-obfuscator": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/javascript-obfuscator/-/javascript-obfuscator-5.5.0.tgz", + "integrity": "sha512-YBkZLadMb0ynLQKKMj8urk+NPsglWa4Upwm/kd6x65gyY6YkNkCJi40OOdGDQa1bVGixgRAmVINwODkLnmiJNw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@javascript-obfuscator/escodegen": "2.4.2", + "@javascript-obfuscator/estraverse": "5.4.0", + "@vercel/blob": ">=0.23.0", + "acorn": "8.15.0", + "acorn-import-attributes": "^1.9.5", + "assert": "2.1.0", + "chalk": "4.1.2", + "chance": "1.1.13", + "class-validator": "0.14.3", + "commander": "12.1.0", + "env-paths": "4.0.0", + "eslint-scope": "8.4.0", + "eslint-visitor-keys": "4.2.1", + "fast-deep-equal": "3.1.3", + "inversify": "7.11.0", + "js-string-escape": "1.0.1", + "md5": "2.3.0", + "multimatch": "5.0.0", + "process": "0.11.10", + "reflect-metadata": "0.2.2", + "string-template": "1.0.0", + "stringz": "2.1.0", + "tslib": "2.8.1" + }, + "bin": { + "javascript-obfuscator": "bin/javascript-obfuscator" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/jose": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/jose/-/jose-5.10.0.tgz", + "integrity": "sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/js-string-escape": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", + "integrity": "sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/libphonenumber-js": { + "version": "1.13.11", + "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.13.11.tgz", + "integrity": "sha512-ETER2kMaIFTI/Nh1a8Gk03dUF/SL0VZqtI+CcVHZxp5WIHYwNS7S+uiYZDYCvLy3lOR4/DAD5jf0h5WkePPpqg==", + "dev": true, + "license": "MIT" + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -463,6 +1404,32 @@ "node": ">= 0.4" } }, + "node_modules/md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, + "node_modules/md5/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, + "license": "MIT" + }, + "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, + "license": "MIT" + }, "node_modules/mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", @@ -475,6 +1442,29 @@ "node": ">=4" } }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/minimist": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", @@ -490,6 +1480,39 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, + "node_modules/multimatch": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz", + "integrity": "sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/minimatch": "^3.0.3", + "array-differ": "^3.0.0", + "array-union": "^2.1.0", + "arrify": "^2.0.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/object-inspect": { "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", @@ -502,6 +1525,80 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/opener": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", @@ -511,6 +1608,54 @@ "opener": "bin/opener-bin.js" } }, + "node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/os-paths": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/os-paths/-/os-paths-4.4.0.tgz", + "integrity": "sha512-wrAwOeXp1RRMFfQY8Sy7VaGVmPocaLwSFOYCGKSyo8qmJ+/yaafCl5BCA1IQZWqFSRBrKDYFeR9d/VyQzfH/jg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6.0" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/portfinder": { "version": "1.0.38", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.38.tgz", @@ -524,6 +1669,35 @@ "node": ">= 10.12" } }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, "node_modules/qs": { "version": "6.15.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.2.tgz", @@ -539,18 +1713,70 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/reflect-metadata": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "license": "MIT" }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "license": "MIT" }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -563,6 +1789,47 @@ "integrity": "sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==", "license": "MIT" }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/side-channel": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", @@ -635,6 +1902,51 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-template": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string-template/-/string-template-1.0.0.tgz", + "integrity": "sha512-SLqR3GBUXuoPP5MmYtD7ompvXiG87QjT6lzOszyXjTM86Uu7At7vNnt2xgyTLq5o9T4IxTYFyGxcULqpsmsfdg==", + "dev": true, + "license": "MIT" + }, + "node_modules/stringz": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/stringz/-/stringz-2.1.0.tgz", + "integrity": "sha512-KlywLT+MZ+v0IRepfMxRtnSvDCMc3nR1qqCs3m/qIbSOWkNZYT8XHQA31rS3TnKp0c5xjZu3M4GY/2aRKSi/6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -647,6 +1959,49 @@ "node": ">=8" } }, + "node_modules/throttleit": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-2.1.0.tgz", + "integrity": "sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/undici": { + "version": "6.28.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.28.0.tgz", + "integrity": "sha512-LIY910g9TI13YS95lrMFrs8Rm/u/irgHeTWoKCoteeJ04CUJ92eEfj0rVn+7VKMPBpUPiUoBKfhNyLI23EE/KA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.17" + } + }, "node_modules/union": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz", @@ -664,6 +2019,30 @@ "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", "license": "MIT" }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/validator": { + "version": "13.15.35", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.35.tgz", + "integrity": "sha512-TQ5pAGhd5whStmqWvYF4OjQROlmv9SMFVt37qoCBdqRffuuklWYQlCNnEs2ZaIBD1kZRNnikiZOS1eqgkar0iw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/whatwg-encoding": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", @@ -677,6 +2056,61 @@ "node": ">=12" } }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.22", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.22.tgz", + "integrity": "sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, "node_modules/ws": { "version": "8.20.1", "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.1.tgz", @@ -698,6 +2132,43 @@ "optional": true } } + }, + "node_modules/xdg-app-paths": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/xdg-app-paths/-/xdg-app-paths-5.5.1.tgz", + "integrity": "sha512-hI3flOB4PLZIy5prbtTpirobtPE2ZtZ52szO+2mM9Efp6ErM398La+C1lIpNWDfNoQk+6Lsi6nMcCwVB7pxeMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "os-paths": "^4.0.1", + "xdg-portable": "^7.2.0" + }, + "engines": { + "node": ">= 6.0" + } + }, + "node_modules/xdg-portable": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/xdg-portable/-/xdg-portable-7.3.0.tgz", + "integrity": "sha512-sqMMuL1rc0FmMBOzCpd0yuy9trqF2yTTVe+E9ogwCSWQCdDEtQUwrZPT6AxqtsFGRNxycgncbP/xmOOSPw5ZUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "os-paths": "^4.0.1" + }, + "engines": { + "node": ">= 6.0" + } + }, + "node_modules/zod": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.11.tgz", + "integrity": "sha512-WPsqwxITS2tzx1bzhIKsEs19ABD5vmCVa4xBo2tq/SrV4RNZtfws1EnCWQXM6yh8bD08a1idvkB5MZSBiZsjwg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } } } } diff --git a/package.json b/package.json index 30e7016..b2715c6 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,15 @@ { "scripts": { - "start": "./node_modules/http-server/bin/http-server -p 9876 ." + "start": "./node_modules/http-server/bin/http-server -p 9876 -S -C local.hvatilo.ru.pem -K local.hvatilo.ru-key.pem -o .", + "build": "./build.js" }, "dependencies": { "http-server": "^14.1.1" }, "devDependencies": { "@minify-html/node": "^0.18.1", + "easy-https": "^1.0.1", + "javascript-obfuscator": "^5.5.0", "ws": "^8.20.1" } } diff --git a/src/auto_cart.html b/src/auto_cart.html new file mode 100644 index 0000000..52c4067 --- /dev/null +++ b/src/auto_cart.html @@ -0,0 +1,536 @@ + + + + + + Автокорзина + + + + +
    + +
    +

    Автокорзина

    +

    Собираем продукты под ваши настройки

    + +
    +
    +
    Ваша корзина на -
    +
    84 товара • 12 020 ₽
    +
    + +
    + +
    +
      +
      + +
      + Показать ещё - товаров + +
      + + +
      + + +
      +

      Настройте корзину под себя

      +

      Чем больше вы расскажете, тем точнее будет подбор

      + +
      + +
      +
      +
      +
      📅
      + На сколько дней собираем корзину? +
      +
      + +
      +
      +
      +
      + + + +
      +
      +
      + +
      +
      +
      +
      👤
      +
      +
      Кто будет есть?
      +
      2 человека
      +
      +
      +
      + +
      +
      +
      +
      + +
      +
      + Добавить человека + +
      +
      +
      + + +
      +
      +
      +
      ❤️
      +
      +
      Предпочтения
      +
      Категории продуктов
      +
      +
      +
      + +
      +
      +
      +
      +
      +

      Выберите группы продуктов, которые хотите видеть в корзине

      +
      +
      +
      + +
      +
      +
      +
      +
      +
      +
      + + + + + + + \ No newline at end of file diff --git a/src/autocart.js b/src/autocart.js new file mode 100644 index 0000000..b31b0f0 --- /dev/null +++ b/src/autocart.js @@ -0,0 +1,703 @@ +const host = 'https://hvatilo.ru'; +// const host = 'https://local.hvatilo.ru:8055'; + +// Returns a function, that, when invoked, will only be triggered at most once +// during a given window of time. Normally, the throttled function will run +// as much as it can, without ever going more than once per `wait` duration; +// but if you'd like to disable the execution on the leading edge, pass +// `{leading: false}`. To disable execution on the trailing edge, ditto. +function throttle(func, wait, options) { + var context, args, result; + var timeout = null; + var previous = 0; + if (!options) options = {}; + var later = function() { + previous = options.leading === false ? 0 : Date.now(); + timeout = null; + result = func.apply(context, args); + if (!timeout) context = args = null; + }; + return function() { + var now = Date.now(); + if (!previous && options.leading === false) previous = now; + var remaining = wait - (now - previous); + context = this; + args = arguments; + if (remaining <= 0 || remaining > wait) { + if (timeout) { + clearTimeout(timeout); + timeout = null; + } + previous = now; + result = func.apply(context, args); + if (!timeout) context = args = null; + } else if (!timeout && options.trailing !== false) { + timeout = setTimeout(later, remaining); + } + return result; + }; +} + +function refreshToken() { + return fetch(host + '/api/guest/refresh_cookie', {method: 'POST', credentials: 'include'}).then(response => { + return response.json(); + }) +} +function initToken() { + return fetch(host + '/api/guest/init_cookie?utm_source=hvatilo_promo', {method: 'POST', credentials: 'include'}).then(response => { + return response.json(); + }); +} + +const requestWithRefresh = async function(url, options) { + return fetch(url, {...options, credentials: 'include'}) + .then(async response => response.json()) + .then(async data => { + if (data.error_message === 'need_refresh') { + return refreshToken() + .then((r) => { + console.log('url', url); + return fetch(url, {...options, credentials: 'include'}).then(response => response.json()); + }); + } + + return data; + }) +} + +const replaceProduct = (async function(product_name) { + return requestWithRefresh(host + '/api/promo/replace_item', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({product_name}) + }) + .then(async () => { + updateCart(); + }) +}) +const deleteProduct = (async function(product_name) { + return requestWithRefresh(host + '/api/promo/delete_item', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({product_name}) + }) +}) +const updateCart = throttle(async function() { + return requestWithRefresh(host + '/api/promo/get_updates', {headers: { + 'Content-Type': 'application/json' + }}).then(d => { + if (d.status !== 'complete') { + initialData_g.excess = d.payload.excess; + initialData_g.precision = d.payload.precision; + if (d.status === 'clear') { + allProducts = []; + visibleProducts = []; + + renderProducts(); + + allProducts = d.payload.chunk; + visibleProducts = d.payload.chunk; + } + if (d.status === 'data') { + d.payload.chunk.forEach(addedProduct => { + let idx = allProducts.findIndex(p => p.name === addedProduct.name) + if (idx === -1) { + allProducts.push({...addedProduct, image: addedProduct.image?.replace('{SIZE}', '65,fit')}); + if (visibleProducts.length === allProducts.length - 1) { + visibleProducts = allProducts; + } + } else { + allProducts[idx].n += addedProduct.n; + if (idx < visibleProducts.length) { + visibleProducts[idx] = allProducts[idx]; + } + } + }) + } + console.log(allProducts.length, visibleProducts.length); + if (d.status !== 'waiting') { + renderProducts(); + } + updateCart(); + } + }) + .catch(() => { + updateCart(); + }) +}, 3000); + +const setOption = (key, value) => { + return requestWithRefresh(host + '/api/promo/set_option', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({[key]: value}) + }) + .then(async d => { + wholeRender(await loadInitData()); + updateCart(); + }) +} + +const loadInitData = (async function() { + return fetch(host + '/api/promo/get_initial_data', {credentials: 'include'}) + .then(async response => { + const data = await response.json(); + + if (response.status === 401 && data.error_message !== 'need_refresh') { + return await initToken() + .then((r) => { + return fetch(host + '/api/promo/get_initial_data', {credentials: 'include'}) + .then(r => r.json()); + }); + } + if (response.status === 403 || data.error_message === 'need_refresh') { + return await refreshToken() + .then((r) => { + return fetch(host + '/api/promo/get_initial_data', {credentials: 'include'}) + .then(r => r.json()); + }); + } + return data; + }) + .then((data) => { + updateCart(); + return data; + }) + .catch(error => { + console.log(error); + return Promise.reject(); + }) +}); + +function debounce(func, delay) { + let timeoutId; + + return function (...args) { + clearTimeout(timeoutId); + timeoutId = setTimeout(() => { + func.apply(this, args); + }, delay); + }; +} + +let allProducts; +let visibleProducts; + +function renderProduct(item, index) { + const li = document.createElement('li'); + li.className = 'cart-item'; + const amount = item.unit === 'g' ? item.n + ' г' : item.n + ' шт'; + li.innerHTML = ` +
      +
      +
      ${item.name}
      +
      ${amount} × ${Math.round(item.price * 100) / 100} ₽
      +
      + + `; + return li; +} + + +let cartList; +let scrollWrapper; +let showMoreBtn; +let remainingSpan; +let initialData_g; + +function renderProducts() { + cartList.innerHTML = ''; + visibleProducts.forEach((item, index) => { + cartList.appendChild(renderProduct(item, index)); + }); + + const remaining = allProducts.length - visibleProducts.length; + if(remaining > 0) { + showMoreBtn.classList.remove('hidden'); + remainingSpan.textContent = remaining; + } else { + showMoreBtn.classList.add('hidden'); + } + updateSummaryCount(); + calculateListHeight(); +} +function updateSummaryCount() { + const totalPrice = new Intl.NumberFormat("ru-RU", { style: "currency", currency: "RUB" }).format( + Math.round(allProducts.reduce((sum, item) => sum + item.total_price, 0) * 100) / 100, + ); + const x = Math.round(initialData_g.days * initialData_g.excess + initialData_g.days); + document.getElementById('summary-details').innerHTML = `${allProducts.length} ${declension(allProducts.length, ['товар', 'товара', 'товаров'])} • ${totalPrice} ~ с запасами на ${x} ${declension(x, ['день', 'дня', 'дней'])}, точность ${Math.round(initialData_g.precision * 100)/100}%`; + document.getElementById('total-price').innerHTML = `${totalPrice}`; + if(allProducts.length === 0) { + document.getElementById('summary-details').innerHTML = `0 товаров • ${totalPrice} ₽`; + } +} +function calculateListHeight() { + const leftCol = document.querySelector('.col-left'); + if (!leftCol) return; + const title = leftCol.querySelector('h1'); + const subtitle = leftCol.querySelector('.subtitle'); + const summary = leftCol.querySelector('.cart-summary'); + const footer = leftCol.querySelector('.cart-footer'); + const showMore = leftCol.querySelector('.show-more'); + + let fixedHeight = 0; + if(title) fixedHeight += title.offsetHeight + 6; + if(subtitle) fixedHeight += subtitle.offsetHeight + 28; + if(summary) fixedHeight += summary.offsetHeight + 24; + if(showMore && !showMore.classList.contains('hidden')) fixedHeight += showMore.offsetHeight; + if(footer) fixedHeight += footer.offsetHeight + 20; + + const paddingY = 60; + const rect = leftCol.getBoundingClientRect(); + const availHeight = window.innerHeight - rect.top - paddingY - 20; + + const listHeight = availHeight - fixedHeight; + if(listHeight > 100) { + scrollWrapper.style.maxHeight = `${listHeight}px`; + scrollWrapper.style.overflowY = 'auto'; + } +} +function declension(number, titles) { + const cases = [2, 0, 1, 1, 1, 2]; + const idx = (number % 100 > 4 && number % 100 < 20) + ? 2 + : cases[Math.min(number % 10, 5)]; + return titles[idx]; +} + +function wholeRender(initialData) { + initialData_g = initialData; + document.querySelector('.summary-days').textContent = `${initialData_g.days} ${declension(initialData_g.days, ['день', 'дня', 'дней'])}`; + allProducts = (Array.isArray(initialData_g.cart) ? initialData_g.cart : [] ?? []).flat().map(item => { + return {...item, image: item.image?.replace('{SIZE}', '65,fit')} + }); + visibleProducts = allProducts.slice(0, visibleProducts ? visibleProducts.length : 5); + + document.querySelectorAll('.days-options .day-btn').forEach(btn => { + if (btn.innerText.trim() === `${initialData_g.days}`) { + btn.classList.add('active'); + } + }); + + // Массив людей теперь содержит поля запрещенных и любимых продуктов + console.log(initialData_g); + let people = initialData_g.users; + + // --- 1. Рендеринг списка продуктов (Левая часть) --- + cartList = document.getElementById('cart-list'); + scrollWrapper = document.getElementById('scroll-wrapper'); + showMoreBtn = document.getElementById('show-more-btn'); + remainingSpan = document.getElementById('remaining-count'); + + renderProducts(); + + // --- 2. Меню (Заменить и Удалить) --- + document.addEventListener('click', function(e) { + const menuBtn = e.target.closest('.menu-btn'); + const menuDropdown = e.target.closest('.menu-dropdown'); + const isReplace = e.target.closest('.menu-replace'); + const isRemove = e.target.closest('.menu-remove'); + const isClearAll = e.target.closest('.reorder-btn'); + + if(menuBtn) { + const dropdown = menuBtn.nextElementSibling; + const isOpen = dropdown.classList.contains('active'); + document.querySelectorAll('.menu-dropdown.active').forEach(el => el.classList.remove('active')); + if(!isOpen) { + dropdown.classList.add('active'); + } + e.stopPropagation(); + } else if(!menuDropdown) { + document.querySelectorAll('.menu-dropdown.active').forEach(el => el.classList.remove('active')); + } + + if(isReplace) { + const wrapper = isReplace.closest('.menu-btn-wrapper'); + const li = wrapper.closest('.cart-item'); + li.classList.add('replacing'); + const index = Array.from(cartList.children).indexOf(li); + replaceProduct(allProducts[index].name).then(() => { + li.remove(); + document.querySelectorAll('.menu-dropdown.active').forEach(el => el.classList.remove('active')); + visibleProducts.splice(index, 1); + allProducts.splice(index, 1); + + if(visibleProducts.length < allProducts.length) { + visibleProducts.push(allProducts[visibleProducts.length]); + } + renderProducts(); + calculateListHeight(); + }); + } + + if(isRemove) { + const wrapper = isRemove.closest('.menu-btn-wrapper'); + const li = wrapper.closest('.cart-item'); + li.classList.add('replacing'); + const index = Array.from(cartList.children).indexOf(li); + deleteProduct(allProducts[index].name).then(() => { + li.remove(); + document.querySelectorAll('.menu-dropdown.active').forEach(el => el.classList.remove('active')); + visibleProducts.splice(index, 1); + allProducts.splice(index, 1); + + if(visibleProducts.length < allProducts.length) { + visibleProducts.push(allProducts[visibleProducts.length]); + } + renderProducts(); + calculateListHeight(); + }) + } + + if (isClearAll) { + requestWithRefresh(host + '/api/guest/clear_cookie', {method: 'POST'}) + .then(r => {document.location.reload()}); + } + }); + + showMoreBtn.addEventListener('click', () => { + while(visibleProducts.length < allProducts.length) { + visibleProducts.push(allProducts[visibleProducts.length]); + } + renderProducts(); + scrollWrapper.style.maxHeight = '500px'; + calculateListHeight(); + }); + + // --- 3. Фиксированная высота --- + window.addEventListener('resize', calculateListHeight); + calculateListHeight(); + + // --- 4. Аккордеон (активна только одна вкладка) --- + document.querySelectorAll('.accordion-header').forEach(header => { + header.addEventListener('click', function() { + const item = this.closest('.accordion-item'); + const isOpen = item.classList.contains('open'); + document.querySelectorAll('.accordion-item').forEach(el => el.classList.remove('open')); + if(!isOpen) { + item.classList.add('open'); + } + }); + }); + + // --- 5. Дни --- + document.querySelectorAll('.day-btn').forEach(btn => { + btn.addEventListener('click', function() { + const parent = this.closest('.days-options'); + parent.querySelectorAll('.day-btn').forEach(b => b.classList.remove('active')); + this.classList.add('active'); + setOption('days', this.dataset.days); + document.querySelector('.summary-days').textContent = `${this.dataset.days} ${declension(this.dataset.days, ['день', 'дня', 'дней'])}`; + }); + }); + + // --- 6. Семья с возможностью редактирования --- + const familyList = document.getElementById('family-list'); + const familyDesc = document.getElementById('family-desc'); + let editingIndex = null; + + function renderPeople() { + familyList.innerHTML = ''; + people.forEach((person, index) => { + const avatar = '🥦'; + const div = document.createElement('div'); + div.className = 'family-member'; + div.dataset.index = index; + div.innerHTML = ` +
      ${avatar}
      +
      +
      ${person.name}
      +
      ${person.age} лет
      +
      +
      ×
      + `; + familyList.appendChild(div); + }); + + const count = people.length; + familyDesc.textContent = `${count} ${declension(count, ['человек', 'человека', 'человек'])}`; + if(count === 0) familyDesc.textContent = 'Не указаны'; + + document.querySelectorAll('.delete-member').forEach(btn => { + btn.addEventListener('click', function(e) { + e.stopPropagation(); + const idx = parseInt(this.dataset.index); + people.splice(idx, 1); + renderPeople(); + setOption('users', people); + }); + }); + } + renderPeople(); + + familyList.addEventListener('click', function(e) { + const member = e.target.closest('.family-member'); + if (!member) return; + if (e.target.closest('.delete-member')) return; + const idx = parseInt(member.dataset.index); + openEditModal(idx); + }); + + // --- 7. Попап (Добавление и Редактирование) + Логика Тегов --- + const modal = document.getElementById('personModal'); + const addBtn = document.getElementById('addMemberBtn'); + const closeBtn = document.getElementById('closeModalBtn'); + const saveBtn = document.getElementById('savePersonBtn'); + const modalTitle = document.getElementById('modalTitle'); + const genderBtns = document.querySelectorAll('.gender-btn'); + + const availableTags = initialData_g.available_groups; + + function openEditModal(index = null) { + editingIndex = index; + + // Очистка тегов внутри попапа + document.querySelectorAll('#personModal .tags-wrap').forEach(el => el.innerHTML = ''); + + if (editingIndex !== null) { + modalTitle.textContent = 'Редактировать человека'; + const p = people[editingIndex]; + document.getElementById('inputName').value = p.name; + document.getElementById('inputAge').value = p.age; + document.getElementById('inputWeight').value = p.weight; + document.getElementById('inputHeight').value = p.height; + genderBtns.forEach(b => { + b.classList.toggle('active', b.dataset.gender === p.gender); + }); + + // Рендерим сохраненные теги + if(p.avoid) p.avoid.forEach(tag => addTagToModal(tag, 'avoid', false)); + if(p.favorite) p.favorite.forEach(tag => addTagToModal(tag, 'favorite', false)); + } else { + modalTitle.textContent = 'Добавить человека'; + document.getElementById('inputName').value = ''; + document.getElementById('inputAge').value = ''; + document.getElementById('inputWeight').value = ''; + document.getElementById('inputHeight').value = ''; + genderBtns.forEach(b => b.classList.remove('active')); + document.querySelector('.gender-btn[data-gender="m"]').classList.add('active'); + } + modal.style.display = 'flex'; + calculateListHeight(); + } + + addBtn.addEventListener('click', () => openEditModal(null)); + + function closeModal() { modal.style.display = 'none'; } + closeBtn.addEventListener('click', closeModal); + modal.addEventListener('click', function(e) { + if (e.target === this) closeModal(); + }); + + genderBtns.forEach(btn => { + btn.addEventListener('click', function() { + genderBtns.forEach(b => b.classList.remove('active')); + this.classList.add('active'); + }); + }); + + // Логика добавления тега в попап + function addTagToModal(text, type, saveToPeople = true) { + const tagsWrap = document.querySelector(`#personModal .tags-wrap[data-target="${type}"]`); + + // Проверка дубликата в своей группе + const existingInGroup = tagsWrap.querySelectorAll('.tag'); + for(let t of existingInGroup) { + if(t.textContent.trim().replace('×','').trim() === text) return; + } + + // Взаимоисключение: если тег есть в противоположной группе - удалить его оттуда + const oppositeType = type === 'avoid' ? 'favorite' : 'avoid'; + const oppositeWrap = document.querySelector(`#personModal .tags-wrap[data-target="${oppositeType}"]`); + const oppositeTags = oppositeWrap.querySelectorAll('.tag'); + for(let t of oppositeTags) { + if(t.textContent.trim().replace('×','').trim() === text) { + t.remove(); + break; + } + } + + const tag = document.createElement('div'); + tag.className = `tag ${type === 'avoid' ? 'tag-red' : 'tag-green'}`; + tag.innerHTML = `${text} ×`; + tag.querySelector('.tag-close').addEventListener('click', function() { + tag.remove(); + }); + tagsWrap.appendChild(tag); + } + + // Автокомплит для полей в попапе + document.querySelectorAll('#personModal .pref-input').forEach(input => { + const type = input.dataset.type; + const listEl = document.querySelector(`#personModal .autocomplete-list[data-type="${type}"]`); + const tagsWrap = document.querySelector(`#personModal .tags-wrap[data-target="${type}"]`); + + input.addEventListener('input', function() { + const val = this.value.toLowerCase(); + listEl.innerHTML = ''; + + // Ищем все уже выбранные теги в обеих группах внутри попапа + const allSelectedTags = new Set(); + document.querySelectorAll('#personModal .tags-wrap .tag').forEach(tagEl => { + const tagText = tagEl.textContent.trim().replace('×', '').trim(); + if(tagText) allSelectedTags.add(tagText); + }); + + if(val.length > 0) { + const matches = availableTags.filter(tag => + tag.toLowerCase().includes(val) && !allSelectedTags.has(tag) + ); + + if(matches.length > 0) { + listEl.classList.add('active'); + matches.forEach(match => { + const div = document.createElement('div'); + div.textContent = match; + div.addEventListener('click', function() { + addTagToModal(match, type); + input.value = ''; + listEl.classList.remove('active'); + }); + listEl.appendChild(div); + }); + } else { + listEl.classList.remove('active'); + } + } else { + listEl.classList.remove('active'); + } + }); + + document.addEventListener('click', function(e) { + if(!input.contains(e.target) && !listEl.contains(e.target)) { + listEl.classList.remove('active'); + } + }); + }); + + // Сохранение пользователя (сбор тегов из DOM попапа) + saveBtn.addEventListener('click', () => { + const name = document.getElementById('inputName').value.trim(); + const age = document.getElementById('inputAge').value.trim(); + const weight = document.getElementById('inputWeight').value.trim(); + const height = document.getElementById('inputHeight').value.trim(); + const gender = document.querySelector('.gender-btn.active').dataset.gender; + + if(!name) { alert('Пожалуйста, введите имя.'); return; } + if(!age || parseInt(age) < 7) { alert('Возраст должен быть от 7 лет.'); return; } + + // Сбор тегов + const forbTags = []; + document.querySelector('#personModal .tags-wrap[data-target="avoid"]').querySelectorAll('.tag').forEach(el => { + forbTags.push(el.textContent.trim().replace('×', '').trim()); + }); + const favTags = []; + document.querySelector('#personModal .tags-wrap[data-target="favorite"]').querySelectorAll('.tag').forEach(el => { + favTags.push(el.textContent.trim().replace('×', '').trim()); + }); + + const personData = { name, age, weight, height, gender, avoid: forbTags, favorite: favTags }; + if (editingIndex !== null) { + people[editingIndex] = personData; + editingIndex = null; + } else { + people.push(personData); + } + renderPeople(); + setOption('users', people); + closeModal(); + }); + + // --- 8. Блок: Категории --- + const categories = initialData_g.available_groups; + const initialSelected = initialData_g.initial_groups; + let selectedCategories = [...initialSelected]; + let isCategoriesExpanded = false; + const maxVisibleCategories = 9; + const sendUpdatedCategories = debounce(async () => { + return setOption('categories', selectedCategories); + }, 1500); + + const categoriesGrid = document.getElementById('categories-grid'); + const toggleBtn = document.getElementById('expand-categories'); + + function renderCategories() { + categoriesGrid.innerHTML = ''; + const dataToShow = isCategoriesExpanded ? categories : categories.slice(0, maxVisibleCategories); + + dataToShow.forEach(cat => { + const btn = document.createElement('button'); + btn.className = `category-btn ${selectedCategories.includes(cat) ? 'active' : 'inactive'}`; + btn.textContent = cat; + btn.dataset.category = cat; + btn.addEventListener('click', function() { + const catName = this.dataset.category; + if (selectedCategories.includes(catName)) { + selectedCategories = selectedCategories.filter(c => c !== catName); + } else { + selectedCategories.push(catName); + } + renderCategories(); + sendUpdatedCategories(); + }); + categoriesGrid.appendChild(btn); + }); + + if (isCategoriesExpanded) { + toggleBtn.classList.remove('collapsed'); + } else { + toggleBtn.classList.add('collapsed'); + } + } + + toggleBtn.addEventListener('click', function() { + isCategoriesExpanded = !isCategoriesExpanded; + renderCategories(); + }); + renderCategories(); +} +document.addEventListener('DOMContentLoaded', async () => { + wholeRender(await loadInitData()); +}); +document.addEventListener('DOMContentLoaded', function() { + const popup = document.getElementById('cookie-popup'); + const acceptBtn = document.getElementById('cookie-accept'); + + // Проверяем, согласился ли пользователь ранее + if (!localStorage.getItem('cookie_accepted')) { + // Небольшая задержка для красоты появления + setTimeout(() => { + popup.classList.add('show'); + }, 500); + } + + // Обработчик нажатия на кнопку "Хорошо" + acceptBtn.addEventListener('click', function() { + // Сохраняем согласие в браузер + localStorage.setItem('cookie_accepted', 'true'); + + // Запускаем анимацию исчезновения + popup.classList.remove('show'); + popup.classList.add('hide'); + + // Полностью удаляем из DOM после завершения анимации + setTimeout(() => { + popup.style.display = 'none'; + }, 400); + }); +}); \ No newline at end of file diff --git a/src/cookies_and_recommendations.html b/src/cookies_and_recommendations.html new file mode 100644 index 0000000..45e7e4e --- /dev/null +++ b/src/cookies_and_recommendations.html @@ -0,0 +1,13 @@ + + + + + + + Рекомендательные технологии и куки + + + + + \ No newline at end of file diff --git a/index.src.html b/src/index.html similarity index 99% rename from index.src.html rename to src/index.html index f69fb47..c05a3de 100644 --- a/index.src.html +++ b/src/index.html @@ -232,9 +232,10 @@ #page_autobasket_images div {gap: 8px;} #page_autobasket_images div div {gap: 2px;} #page_autobasket_images div img {max-width: 100% !important;} + #page_autobasket_content_description {max-width: 1500px;} + p.description_large {font-size: 16px;} #page_autobasket_content_description h2 {padding-bottom: 24px;} #page_autobasket_content_description p {font-size: 16px;margin: 0;} - p.description_large {font-size: 16px;} #page_how_it_works_info {height: auto;} #page_how_it_works_steps {font-size: 14px;padding:0;align-items: initial;margin-top: 20px;} #page_how_it_works_steps p {display: flex;align-content: center;align-items: center;width: 100%;justify-content: center;}