\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\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 @@
-
Хватило.ру - персональный помощник по питанию
\ No newline at end of file
+
Хватило.ру - персональный помощник по питанию
\ 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 ₽
+
+
Начать заново
+
+
+
+
+
+ Показать ещё
- товаров
+
+
+
+
+
+
+
+
+
Настройте корзину под себя
+
Чем больше вы расскажете, тем точнее будет подбор
+
+
+
+
+
+
+
+
+
+
+
+
+ Добавить человека +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Имя
+
+
+
+
+
+
+
+
+
+
+
Сохранить
+
+
+
+
+
+
+
\ 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;}